@explyt/ai-agent 0.1.0-rc.1 → 0.1.3

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 (1219) hide show
  1. package/README.md +14 -15
  2. package/THIRD-PARTY-NOTICES.md +153 -5
  3. package/agent-docs/README.md +43 -0
  4. package/agent-docs/mcp.md +111 -0
  5. package/agent-docs/rules.md +92 -0
  6. package/agent-docs/settings.md +54 -0
  7. package/agent-docs/skills.md +90 -0
  8. package/dist/app-bridge.bundle.js +67 -0
  9. package/dist/cli/engine.js +680 -135
  10. package/dist/cli/index.js +152 -194
  11. package/dist/extensions/bash.js +1 -0
  12. package/dist/extensions/custom-provider.js +1 -0
  13. package/dist/extensions/hello.js +1 -1
  14. package/dist/extensions/identity.js +1 -0
  15. package/dist/extensions/mcp.js +1 -0
  16. package/dist/extensions/misc-hacks.js +1 -0
  17. package/dist/extensions/policy.js +1 -1
  18. package/dist/extensions/rules.js +1 -0
  19. package/dist/extensions/skills.js +1 -0
  20. package/dist/mcp-adapter.js +602 -0
  21. package/dist/mcp-keyring-helper.cjs +89 -0
  22. package/dist/mcp-script-worker.mjs +130 -0
  23. package/node_modules/acorn/CHANGELOG.md +998 -0
  24. package/node_modules/acorn/LICENSE +21 -0
  25. package/node_modules/acorn/README.md +309 -0
  26. package/node_modules/acorn/bin/acorn +4 -0
  27. package/node_modules/acorn/dist/acorn.d.mts +897 -0
  28. package/node_modules/acorn/dist/acorn.d.ts +897 -0
  29. package/node_modules/acorn/dist/acorn.js +6342 -0
  30. package/node_modules/acorn/dist/acorn.mjs +6313 -0
  31. package/node_modules/acorn/dist/bin.js +90 -0
  32. package/node_modules/acorn/package.json +50 -0
  33. package/node_modules/default-browser/package.json +1 -1
  34. package/node_modules/default-browser/windows.js +3 -1
  35. package/node_modules/fast-uri/index.js +221 -49
  36. package/node_modules/fast-uri/lib/schemes.js +9 -4
  37. package/node_modules/fast-uri/lib/utils.js +396 -92
  38. package/node_modules/fast-uri/package.json +1 -1
  39. package/node_modules/fast-uri/test/component-safe-serialization.test.js +163 -0
  40. package/node_modules/fast-uri/test/equal.test.js +31 -3
  41. package/node_modules/fast-uri/test/fixtures/uri-js-parse.json +2 -0
  42. package/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
  43. package/node_modules/fast-uri/test/ipv6-validation.test.js +124 -0
  44. package/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
  45. package/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
  46. package/node_modules/fast-uri/test/parse.test.js +7 -3
  47. package/node_modules/fast-uri/test/query-fragment-normalization.test.js +33 -0
  48. package/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
  49. package/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
  50. package/node_modules/fast-uri/test/security-normalization.test.js +139 -0
  51. package/node_modules/fast-uri/test/security.test.js +75 -3
  52. package/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
  53. package/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
  54. package/node_modules/jose/dist/types/index.d.ts +1 -2
  55. package/node_modules/jose/dist/types/jwe/compact/decrypt.d.ts +12 -25
  56. package/node_modules/jose/dist/types/jwe/compact/encrypt.d.ts +18 -31
  57. package/node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts +12 -25
  58. package/node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts +24 -49
  59. package/node_modules/jose/dist/types/jwe/general/decrypt.d.ts +15 -30
  60. package/node_modules/jose/dist/types/jwe/general/encrypt.d.ts +29 -51
  61. package/node_modules/jose/dist/types/jwk/embedded.d.ts +5 -8
  62. package/node_modules/jose/dist/types/jwk/thumbprint.d.ts +7 -9
  63. package/node_modules/jose/dist/types/jwks/local.d.ts +10 -13
  64. package/node_modules/jose/dist/types/jwks/remote.d.ts +30 -42
  65. package/node_modules/jose/dist/types/jws/compact/sign.d.ts +8 -13
  66. package/node_modules/jose/dist/types/jws/compact/verify.d.ts +14 -26
  67. package/node_modules/jose/dist/types/jws/flattened/sign.d.ts +10 -19
  68. package/node_modules/jose/dist/types/jws/flattened/verify.d.ts +14 -26
  69. package/node_modules/jose/dist/types/jws/general/sign.d.ts +19 -33
  70. package/node_modules/jose/dist/types/jws/general/verify.d.ts +17 -32
  71. package/node_modules/jose/dist/types/jwt/decrypt.d.ts +20 -27
  72. package/node_modules/jose/dist/types/jwt/encrypt.d.ts +32 -42
  73. package/node_modules/jose/dist/types/jwt/sign.d.ts +10 -21
  74. package/node_modules/jose/dist/types/jwt/unsecured.d.ts +13 -28
  75. package/node_modules/jose/dist/types/jwt/verify.d.ts +19 -22
  76. package/node_modules/jose/dist/types/key/export.d.ts +10 -10
  77. package/node_modules/jose/dist/types/key/generate_key_pair.d.ts +15 -22
  78. package/node_modules/jose/dist/types/key/generate_secret.d.ts +12 -19
  79. package/node_modules/jose/dist/types/key/import.d.ts +25 -31
  80. package/node_modules/jose/dist/types/types.d.ts +186 -319
  81. package/node_modules/jose/dist/types/util/base64url.d.ts +7 -7
  82. package/node_modules/jose/dist/types/util/decode_jwt.d.ts +5 -7
  83. package/node_modules/jose/dist/types/util/decode_protected_header.d.ts +6 -5
  84. package/node_modules/jose/dist/types/util/errors.d.ts +50 -88
  85. package/node_modules/jose/dist/webapi/index.js +70 -32
  86. package/node_modules/jose/dist/webapi/jwe/compact/decrypt.js +6 -8
  87. package/node_modules/jose/dist/webapi/jwe/compact/encrypt.js +25 -26
  88. package/node_modules/jose/dist/webapi/jwe/flattened/decrypt.js +14 -10
  89. package/node_modules/jose/dist/webapi/jwe/flattened/encrypt.js +34 -71
  90. package/node_modules/jose/dist/webapi/jwe/general/decrypt.js +38 -49
  91. package/node_modules/jose/dist/webapi/jwe/general/encrypt.js +100 -161
  92. package/node_modules/jose/dist/webapi/jwk/embedded.js +29 -18
  93. package/node_modules/jose/dist/webapi/jwk/thumbprint.js +51 -64
  94. package/node_modules/jose/dist/webapi/jwks/local.js +55 -74
  95. package/node_modules/jose/dist/webapi/jwks/remote.js +91 -160
  96. package/node_modules/jose/dist/webapi/jws/compact/sign.js +19 -20
  97. package/node_modules/jose/dist/webapi/jws/compact/verify.js +7 -8
  98. package/node_modules/jose/dist/webapi/jws/flattened/sign.js +22 -30
  99. package/node_modules/jose/dist/webapi/jws/flattened/verify.js +11 -23
  100. package/node_modules/jose/dist/webapi/jws/general/sign.js +55 -71
  101. package/node_modules/jose/dist/webapi/jws/general/verify.js +45 -41
  102. package/node_modules/jose/dist/webapi/jwt/decrypt.js +12 -22
  103. package/node_modules/jose/dist/webapi/jwt/encrypt.js +44 -100
  104. package/node_modules/jose/dist/webapi/jwt/sign.js +18 -50
  105. package/node_modules/jose/dist/webapi/jwt/unsecured.js +33 -63
  106. package/node_modules/jose/dist/webapi/jwt/verify.js +12 -14
  107. package/node_modules/jose/dist/webapi/key/export.js +32 -41
  108. package/node_modules/jose/dist/webapi/key/generate_key_pair.js +32 -45
  109. package/node_modules/jose/dist/webapi/key/generate_secret.js +35 -39
  110. package/node_modules/jose/dist/webapi/key/import.js +48 -52
  111. package/node_modules/jose/dist/webapi/lib/asn1.js +128 -164
  112. package/node_modules/jose/dist/webapi/lib/buffer_utils.js +72 -41
  113. package/node_modules/jose/dist/webapi/lib/content_encryption.js +75 -127
  114. package/node_modules/jose/dist/webapi/lib/deflate.js +36 -40
  115. package/node_modules/jose/dist/webapi/lib/jwe_algorithms.js +102 -93
  116. package/node_modules/jose/dist/webapi/lib/jwe_decrypt.js +178 -177
  117. package/node_modules/jose/dist/webapi/lib/jwe_encrypt.js +72 -107
  118. package/node_modules/jose/dist/webapi/lib/jws_algorithms.js +62 -61
  119. package/node_modules/jose/dist/webapi/lib/jws_sign.js +44 -72
  120. package/node_modules/jose/dist/webapi/lib/jws_verify.js +82 -103
  121. package/node_modules/jose/dist/webapi/lib/jwt_claims_set.js +134 -185
  122. package/node_modules/jose/dist/webapi/lib/key.js +147 -124
  123. package/node_modules/jose/dist/webapi/lib/key_algorithm.js +13 -8
  124. package/node_modules/jose/dist/webapi/lib/key_descriptor.js +8 -6
  125. package/node_modules/jose/dist/webapi/lib/key_management.js +169 -229
  126. package/node_modules/jose/dist/webapi/lib/validate.js +122 -0
  127. package/node_modules/jose/dist/webapi/util/base64url.js +14 -37
  128. package/node_modules/jose/dist/webapi/util/decode_jwt.js +32 -31
  129. package/node_modules/jose/dist/webapi/util/decode_protected_header.js +18 -23
  130. package/node_modules/jose/dist/webapi/util/errors.js +94 -84
  131. package/node_modules/jose/package.json +17 -81
  132. package/node_modules/pi-mcp-adapter/CHANGELOG.md +156 -0
  133. package/node_modules/pi-mcp-adapter/README.md +121 -13
  134. package/node_modules/pi-mcp-adapter/agent-dir.ts +12 -4
  135. package/node_modules/pi-mcp-adapter/agent-plugin-loader.ts +1 -1
  136. package/node_modules/pi-mcp-adapter/cli.js +188 -5
  137. package/node_modules/pi-mcp-adapter/commands.ts +136 -20
  138. package/node_modules/pi-mcp-adapter/config.ts +74 -15
  139. package/node_modules/pi-mcp-adapter/direct-tools.ts +134 -72
  140. package/node_modules/pi-mcp-adapter/dist/agent-dir.d.ts +10 -0
  141. package/node_modules/pi-mcp-adapter/dist/agent-dir.js +63 -0
  142. package/node_modules/pi-mcp-adapter/dist/agent-dir.js.map +1 -0
  143. package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.d.ts +8 -0
  144. package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.js +356 -0
  145. package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.js.map +1 -0
  146. package/node_modules/pi-mcp-adapter/dist/config.d.ts +123 -0
  147. package/node_modules/pi-mcp-adapter/dist/config.js +1088 -0
  148. package/node_modules/pi-mcp-adapter/dist/config.js.map +1 -0
  149. package/node_modules/pi-mcp-adapter/dist/mcp-bearer-store.d.ts +24 -0
  150. package/node_modules/pi-mcp-adapter/dist/mcp-bearer-store.js +336 -0
  151. package/node_modules/pi-mcp-adapter/dist/mcp-bearer-store.js.map +1 -0
  152. package/node_modules/pi-mcp-adapter/dist/metadata-cache.d.ts +19 -0
  153. package/node_modules/pi-mcp-adapter/dist/metadata-cache.js +319 -0
  154. package/node_modules/pi-mcp-adapter/dist/metadata-cache.js.map +1 -0
  155. package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.d.ts +2 -0
  156. package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.js +156 -0
  157. package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.js.map +1 -0
  158. package/node_modules/pi-mcp-adapter/dist/resource-tools.d.ts +1 -0
  159. package/node_modules/pi-mcp-adapter/dist/resource-tools.js +15 -0
  160. package/node_modules/pi-mcp-adapter/dist/resource-tools.js.map +1 -0
  161. package/node_modules/pi-mcp-adapter/dist/types.d.ts +566 -0
  162. package/node_modules/pi-mcp-adapter/dist/types.js +287 -0
  163. package/node_modules/pi-mcp-adapter/dist/types.js.map +1 -0
  164. package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.d.ts +6 -0
  165. package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.js +37 -0
  166. package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.js.map +1 -0
  167. package/node_modules/pi-mcp-adapter/dist/ui-stream-types.d.ts +104 -0
  168. package/node_modules/pi-mcp-adapter/dist/ui-stream-types.js +59 -0
  169. package/node_modules/pi-mcp-adapter/dist/ui-stream-types.js.map +1 -0
  170. package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.d.ts +4 -0
  171. package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.js +27 -0
  172. package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.js.map +1 -0
  173. package/node_modules/pi-mcp-adapter/dist/utils.d.ts +32 -0
  174. package/node_modules/pi-mcp-adapter/dist/utils.js +338 -0
  175. package/node_modules/pi-mcp-adapter/dist/utils.js.map +1 -0
  176. package/node_modules/pi-mcp-adapter/failure-backoff.ts +23 -0
  177. package/node_modules/pi-mcp-adapter/host-html-template.ts +0 -8
  178. package/node_modules/pi-mcp-adapter/index.ts +434 -36
  179. package/node_modules/pi-mcp-adapter/init.ts +102 -35
  180. package/node_modules/pi-mcp-adapter/lifecycle.ts +323 -28
  181. package/node_modules/pi-mcp-adapter/mcp-auth-flow.ts +161 -37
  182. package/node_modules/pi-mcp-adapter/mcp-auth.ts +60 -2
  183. package/node_modules/pi-mcp-adapter/mcp-bearer-store.ts +385 -0
  184. package/node_modules/pi-mcp-adapter/mcp-callback-server.ts +27 -3
  185. package/node_modules/pi-mcp-adapter/mcp-code.ts +6 -0
  186. package/node_modules/pi-mcp-adapter/mcp-oauth-provider.ts +155 -16
  187. package/node_modules/pi-mcp-adapter/mcp-output-guard.ts +95 -7
  188. package/node_modules/pi-mcp-adapter/mcp-panel.ts +87 -22
  189. package/node_modules/pi-mcp-adapter/mcp-probe.ts +18 -4
  190. package/node_modules/pi-mcp-adapter/mcp-references.ts +376 -0
  191. package/node_modules/pi-mcp-adapter/mcp-script-worker.mjs +22 -20
  192. package/node_modules/pi-mcp-adapter/mcp-setup-panel.ts +2 -1
  193. package/node_modules/pi-mcp-adapter/mcp-status.ts +8 -19
  194. package/node_modules/pi-mcp-adapter/metadata-cache.ts +66 -14
  195. package/node_modules/pi-mcp-adapter/namespace-tools.ts +276 -0
  196. package/node_modules/pi-mcp-adapter/npx-resolver.ts +81 -26
  197. package/node_modules/pi-mcp-adapter/package-mcp-loader.ts +168 -0
  198. package/node_modules/pi-mcp-adapter/package.json +29 -8
  199. package/node_modules/pi-mcp-adapter/proxy-modes.ts +229 -50
  200. package/node_modules/pi-mcp-adapter/request-headers-command.ts +330 -0
  201. package/node_modules/pi-mcp-adapter/search-ranking.ts +167 -16
  202. package/node_modules/pi-mcp-adapter/server-manager.ts +243 -14
  203. package/node_modules/pi-mcp-adapter/session-recovery.ts +15 -2
  204. package/node_modules/pi-mcp-adapter/state.ts +1 -3
  205. package/node_modules/pi-mcp-adapter/tool-approval.ts +63 -9
  206. package/node_modules/pi-mcp-adapter/tool-metadata.ts +62 -4
  207. package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +195 -15
  208. package/node_modules/pi-mcp-adapter/types.ts +229 -29
  209. package/node_modules/pi-mcp-adapter/ui-server.ts +41 -36
  210. package/node_modules/pi-mcp-adapter/ui-session.ts +2 -1
  211. package/node_modules/pi-mcp-adapter/utils.ts +91 -19
  212. package/node_modules/pi-subagents/CHANGELOG.md +582 -0
  213. package/node_modules/pi-subagents/README.md +6 -0
  214. package/node_modules/pi-subagents/agents/claude-code-writer.md +15 -0
  215. package/node_modules/pi-subagents/agents/claude-code.md +15 -0
  216. package/node_modules/pi-subagents/agents/codex-exec-writer.md +15 -0
  217. package/node_modules/pi-subagents/agents/codex-exec.md +15 -0
  218. package/node_modules/pi-subagents/agents/cursor-agent-writer.md +14 -0
  219. package/node_modules/pi-subagents/agents/cursor-agent.md +14 -0
  220. package/node_modules/pi-subagents/agents/oracle.md +9 -5
  221. package/node_modules/pi-subagents/agents/researcher.md +1 -1
  222. package/node_modules/pi-subagents/agents/reviewer.md +15 -4
  223. package/node_modules/pi-subagents/agents/scout.md +3 -3
  224. package/node_modules/pi-subagents/agents/worker.md +3 -2
  225. package/node_modules/pi-subagents/async-retention-discovery-worker.mjs +180 -0
  226. package/node_modules/pi-subagents/docs/agents.md +164 -14
  227. package/node_modules/pi-subagents/docs/configuration.md +204 -24
  228. package/node_modules/pi-subagents/docs/extension-api.md +146 -11
  229. package/node_modules/pi-subagents/docs/missions.md +5 -3
  230. package/node_modules/pi-subagents/docs/models.md +74 -8
  231. package/node_modules/pi-subagents/docs/observability.md +100 -12
  232. package/node_modules/pi-subagents/docs/tool-reference.md +185 -46
  233. package/node_modules/pi-subagents/docs/workflows.md +317 -5
  234. package/node_modules/pi-subagents/index.ts +10 -1
  235. package/node_modules/pi-subagents/install.mjs +1 -1
  236. package/node_modules/pi-subagents/package.json +7 -2
  237. package/node_modules/pi-subagents/prompts/council.md +60 -0
  238. package/node_modules/pi-subagents/prompts/parallel-review.md +5 -1
  239. package/node_modules/pi-subagents/prompts/review-loop.md +11 -7
  240. package/node_modules/pi-subagents/skills/council-mode/SKILL.md +59 -0
  241. package/node_modules/pi-subagents/skills/council-mode/references/pass-contracts.md +150 -0
  242. package/node_modules/pi-subagents/skills/pi-subagents/SKILL.md +87 -25
  243. package/node_modules/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +40 -221
  244. package/node_modules/pi-subagents/skills/pi-subagents/references/execution-controls.md +136 -26
  245. package/node_modules/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +8 -8
  246. package/node_modules/pi-subagents/skills/pi-subagents/references/multi-lane-orchestration.md +51 -0
  247. package/node_modules/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +99 -46
  248. package/node_modules/pi-subagents/skills/pi-subagents/references/review-and-validation.md +73 -0
  249. package/node_modules/pi-subagents/src/agents/agent-management.ts +541 -442
  250. package/node_modules/pi-subagents/src/agents/agent-refinements.ts +4 -4
  251. package/node_modules/pi-subagents/src/agents/agent-serializer.ts +20 -4
  252. package/node_modules/pi-subagents/src/agents/agents.ts +1177 -267
  253. package/node_modules/pi-subagents/src/agents/builtin-names.ts +15 -0
  254. package/node_modules/pi-subagents/src/agents/runtime-agent-events.ts +70 -0
  255. package/node_modules/pi-subagents/src/agents/runtime-agent-registry.ts +429 -0
  256. package/node_modules/pi-subagents/src/agents/skills.ts +1 -1
  257. package/node_modules/pi-subagents/src/api/agents.ts +12 -0
  258. package/node_modules/pi-subagents/src/api/background-work.ts +12 -3
  259. package/node_modules/pi-subagents/src/api/delegation.ts +0 -7
  260. package/node_modules/pi-subagents/src/api/external-job-provider.ts +195 -0
  261. package/node_modules/pi-subagents/src/api/external-runs.ts +237 -84
  262. package/node_modules/pi-subagents/src/api/preflight.ts +140 -42
  263. package/node_modules/pi-subagents/src/api/project-panes.ts +2 -0
  264. package/node_modules/pi-subagents/src/api/shared-types.ts +5 -0
  265. package/node_modules/pi-subagents/src/extension/config.ts +134 -2
  266. package/node_modules/pi-subagents/src/extension/doctor.ts +54 -6
  267. package/node_modules/pi-subagents/src/extension/fanout-child.ts +9 -6
  268. package/node_modules/pi-subagents/src/extension/index.ts +361 -118
  269. package/node_modules/pi-subagents/src/extension/public-execution.ts +149 -10
  270. package/node_modules/pi-subagents/src/extension/rpc.ts +229 -23
  271. package/node_modules/pi-subagents/src/extension/schemas.ts +81 -58
  272. package/node_modules/pi-subagents/src/extension/tool-description.ts +70 -31
  273. package/node_modules/pi-subagents/src/extension/tool-result.ts +19 -0
  274. package/node_modules/pi-subagents/src/inspectors/herdr/actions.ts +16 -10
  275. package/node_modules/pi-subagents/src/inspectors/herdr/client.ts +3 -3
  276. package/node_modules/pi-subagents/src/inspectors/herdr/focus.ts +55 -0
  277. package/node_modules/pi-subagents/src/inspectors/herdr/inspector-runner.ts +10 -4
  278. package/node_modules/pi-subagents/src/inspectors/herdr/project-panes.ts +230 -50
  279. package/node_modules/pi-subagents/src/inspectors/herdr/session-roots-codec.ts +42 -0
  280. package/node_modules/pi-subagents/src/inspectors/herdr/shell-command.ts +16 -0
  281. package/node_modules/pi-subagents/src/integrations/herdr-status.ts +75 -5
  282. package/node_modules/pi-subagents/src/intercom/intercom-bridge.ts +9 -5
  283. package/node_modules/pi-subagents/src/intercom/native-supervisor-channel.ts +51 -52
  284. package/node_modules/pi-subagents/src/intercom/result-intercom.ts +2 -0
  285. package/node_modules/pi-subagents/src/missions/goal-driver.ts +3 -1
  286. package/node_modules/pi-subagents/src/missions/lifecycle.ts +10 -8
  287. package/node_modules/pi-subagents/src/missions/store.ts +16 -16
  288. package/node_modules/pi-subagents/src/missions/workflow-state.ts +8 -4
  289. package/node_modules/pi-subagents/src/profiles/profiles.ts +8 -7
  290. package/node_modules/pi-subagents/src/runs/background/active-async-capacity.ts +517 -0
  291. package/node_modules/pi-subagents/src/runs/background/active-run-index.ts +100 -3
  292. package/node_modules/pi-subagents/src/runs/background/async-execution.ts +630 -184
  293. package/node_modules/pi-subagents/src/runs/background/async-job-tracker.ts +143 -33
  294. package/node_modules/pi-subagents/src/runs/background/async-resume.ts +117 -44
  295. package/node_modules/pi-subagents/src/runs/background/async-retention.ts +903 -0
  296. package/node_modules/pi-subagents/src/runs/background/async-status-snapshot.ts +48 -0
  297. package/node_modules/pi-subagents/src/runs/background/async-status.ts +235 -69
  298. package/node_modules/pi-subagents/src/runs/background/auto-drain.ts +2 -1
  299. package/node_modules/pi-subagents/src/runs/background/chain-append.ts +44 -51
  300. package/node_modules/pi-subagents/src/runs/background/chain-root-attachment.ts +79 -8
  301. package/node_modules/pi-subagents/src/runs/background/completion-dedupe.ts +5 -1
  302. package/node_modules/pi-subagents/src/runs/background/completion-replay.ts +33 -13
  303. package/node_modules/pi-subagents/src/runs/background/control-channel.ts +108 -73
  304. package/node_modules/pi-subagents/src/runs/background/fleet-view.ts +125 -45
  305. package/node_modules/pi-subagents/src/runs/background/index-segment.ts +59 -0
  306. package/node_modules/pi-subagents/src/runs/background/inspect-rpc.ts +443 -0
  307. package/node_modules/pi-subagents/src/runs/background/notify.ts +272 -10
  308. package/node_modules/pi-subagents/src/runs/background/owned-process-tree.ts +104 -0
  309. package/node_modules/pi-subagents/src/runs/background/process-terminal.ts +33 -3
  310. package/node_modules/pi-subagents/src/runs/background/result-delivery-ownership.ts +45 -0
  311. package/node_modules/pi-subagents/src/runs/background/result-files.ts +519 -0
  312. package/node_modules/pi-subagents/src/runs/background/result-watcher.ts +329 -54
  313. package/node_modules/pi-subagents/src/runs/background/resume-guidance.ts +35 -12
  314. package/node_modules/pi-subagents/src/runs/background/retained-children.ts +85 -18
  315. package/node_modules/pi-subagents/src/runs/background/run-id-query.ts +7 -0
  316. package/node_modules/pi-subagents/src/runs/background/run-id-resolver.ts +37 -29
  317. package/node_modules/pi-subagents/src/runs/background/run-status.ts +204 -32
  318. package/node_modules/pi-subagents/src/runs/background/scheduled-runs.ts +228 -40
  319. package/node_modules/pi-subagents/src/runs/background/stale-run-reconciler.ts +42 -16
  320. package/node_modules/pi-subagents/src/runs/background/steering.ts +18 -15
  321. package/node_modules/pi-subagents/src/runs/background/subagent-runner.ts +1419 -546
  322. package/node_modules/pi-subagents/src/runs/background/subagent-wait.ts +105 -44
  323. package/node_modules/pi-subagents/src/runs/background/terminal-run-index.ts +138 -0
  324. package/node_modules/pi-subagents/src/runs/background/wait-completions.ts +54 -4
  325. package/node_modules/pi-subagents/src/runs/background/wait-config.ts +23 -9
  326. package/node_modules/pi-subagents/src/runs/background/wait-subscriptions.ts +81 -2
  327. package/node_modules/pi-subagents/src/runs/background/wait-tool.ts +28 -19
  328. package/node_modules/pi-subagents/src/runs/foreground/async-dismiss-action.ts +2 -1
  329. package/node_modules/pi-subagents/src/runs/foreground/async-steering-action.ts +23 -16
  330. package/node_modules/pi-subagents/src/runs/foreground/async-stop-action.ts +23 -2
  331. package/node_modules/pi-subagents/src/runs/foreground/execution.ts +730 -168
  332. package/node_modules/pi-subagents/src/runs/foreground/foreground-control.ts +21 -0
  333. package/node_modules/pi-subagents/src/runs/foreground/foreground-history.ts +26 -3
  334. package/node_modules/pi-subagents/src/runs/foreground/prompt-audit.ts +172 -0
  335. package/node_modules/pi-subagents/src/runs/foreground/subagent-executor.ts +2705 -1726
  336. package/node_modules/pi-subagents/src/runs/foreground/workflow-detach-reconcile.ts +299 -0
  337. package/node_modules/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +6 -5
  338. package/node_modules/pi-subagents/src/runs/shared/abort-recovery.ts +119 -0
  339. package/node_modules/pi-subagents/src/runs/shared/acceptance.ts +183 -39
  340. package/node_modules/pi-subagents/src/runs/shared/agent-contract.ts +1 -1
  341. package/node_modules/pi-subagents/src/runs/shared/async-status-projection.ts +597 -0
  342. package/node_modules/pi-subagents/src/runs/shared/background-process-options.ts +9 -0
  343. package/node_modules/pi-subagents/src/runs/shared/capability-ceiling.ts +1 -0
  344. package/node_modules/pi-subagents/src/runs/shared/chain-outputs.ts +1 -3
  345. package/node_modules/pi-subagents/src/runs/shared/child-identity.ts +51 -0
  346. package/node_modules/pi-subagents/src/runs/shared/child-launch-plan.ts +151 -0
  347. package/node_modules/pi-subagents/src/runs/shared/child-protocol.ts +21 -7
  348. package/node_modules/pi-subagents/src/runs/shared/claude-code-adapter.ts +129 -0
  349. package/node_modules/pi-subagents/src/runs/shared/codex-exec-adapter.ts +129 -0
  350. package/node_modules/pi-subagents/src/runs/shared/completion-evidence.ts +89 -0
  351. package/node_modules/pi-subagents/src/runs/shared/completion-guard.ts +163 -6
  352. package/node_modules/pi-subagents/src/runs/shared/cursor-agent-adapter.ts +114 -0
  353. package/node_modules/pi-subagents/src/runs/shared/dynamic-fanout.ts +4 -4
  354. package/node_modules/pi-subagents/src/runs/shared/extension-bindings.ts +78 -0
  355. package/node_modules/pi-subagents/src/runs/shared/external-cli-contract.ts +167 -0
  356. package/node_modules/pi-subagents/src/runs/shared/external-cli-preflight.ts +122 -0
  357. package/node_modules/pi-subagents/src/runs/shared/external-cli-runner.ts +353 -54
  358. package/node_modules/pi-subagents/src/runs/shared/external-job-bridge.ts +460 -0
  359. package/node_modules/pi-subagents/src/runs/shared/external-job-runner.ts +389 -0
  360. package/node_modules/pi-subagents/src/runs/shared/fast-mode-extension.ts +10 -0
  361. package/node_modules/pi-subagents/src/runs/shared/host-step-status.ts +231 -0
  362. package/node_modules/pi-subagents/src/runs/shared/lane-metadata.ts +105 -0
  363. package/node_modules/pi-subagents/src/runs/shared/launch-cwd.ts +16 -0
  364. package/node_modules/pi-subagents/src/runs/shared/llm-intent-arbiter.ts +302 -0
  365. package/node_modules/pi-subagents/src/runs/shared/long-running-guard.ts +2 -1
  366. package/node_modules/pi-subagents/src/runs/shared/mcp-config-sources.ts +422 -0
  367. package/node_modules/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +230 -153
  368. package/node_modules/pi-subagents/src/runs/shared/mcp-direct-tool-grant.ts +194 -0
  369. package/node_modules/pi-subagents/src/runs/shared/model-exclusions.ts +305 -0
  370. package/node_modules/pi-subagents/src/runs/shared/model-fallback.ts +300 -62
  371. package/node_modules/pi-subagents/src/runs/shared/model-scope.ts +106 -39
  372. package/node_modules/pi-subagents/src/runs/shared/mutation-evidence.ts +199 -0
  373. package/node_modules/pi-subagents/src/runs/shared/nested-events.ts +75 -65
  374. package/node_modules/pi-subagents/src/runs/shared/nested-render.ts +9 -5
  375. package/node_modules/pi-subagents/src/runs/shared/orca-progress-tabs.ts +499 -0
  376. package/node_modules/pi-subagents/src/runs/shared/parallel-handoff.ts +464 -10
  377. package/node_modules/pi-subagents/src/runs/shared/parallel-utils.ts +38 -20
  378. package/node_modules/pi-subagents/src/runs/shared/permissions.ts +6 -2
  379. package/node_modules/pi-subagents/src/runs/shared/pi-args.ts +279 -21
  380. package/node_modules/pi-subagents/src/runs/shared/pi-spawn.ts +69 -35
  381. package/node_modules/pi-subagents/src/runs/shared/process-signal.ts +13 -0
  382. package/node_modules/pi-subagents/src/runs/shared/run-fanout-budget.ts +280 -0
  383. package/node_modules/pi-subagents/src/runs/shared/run-history.ts +21 -1
  384. package/node_modules/pi-subagents/src/runs/shared/session-lease.ts +0 -6
  385. package/node_modules/pi-subagents/src/runs/shared/single-output.ts +93 -24
  386. package/node_modules/pi-subagents/src/runs/shared/structured-output.ts +46 -5
  387. package/node_modules/pi-subagents/src/runs/shared/subagent-control.ts +66 -7
  388. package/node_modules/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +195 -44
  389. package/node_modules/pi-subagents/src/runs/shared/subagent-startup-retry.ts +12 -0
  390. package/node_modules/pi-subagents/src/runs/shared/task-intent.ts +36 -9
  391. package/node_modules/pi-subagents/src/runs/shared/tool-availability.ts +1 -3
  392. package/node_modules/pi-subagents/src/runs/shared/tool-timeout.ts +93 -0
  393. package/node_modules/pi-subagents/src/runs/shared/workflow-graph.ts +17 -23
  394. package/node_modules/pi-subagents/src/runs/shared/worktree-cleanup-plan.ts +847 -0
  395. package/node_modules/pi-subagents/src/runs/shared/worktree.ts +49 -7
  396. package/node_modules/pi-subagents/src/shared/agent-stream-options.ts +5 -0
  397. package/node_modules/pi-subagents/src/shared/artifacts.ts +2 -6
  398. package/node_modules/pi-subagents/src/shared/atomic-json.ts +24 -2
  399. package/node_modules/pi-subagents/src/shared/capacity-resilient-json.ts +102 -0
  400. package/node_modules/pi-subagents/src/shared/child-session-name.ts +46 -0
  401. package/node_modules/pi-subagents/src/shared/completion-owner.ts +14 -0
  402. package/node_modules/pi-subagents/src/shared/display-text.ts +50 -0
  403. package/node_modules/pi-subagents/src/shared/extension-context.ts +24 -0
  404. package/node_modules/pi-subagents/src/shared/file-system-retry.ts +49 -1
  405. package/node_modules/pi-subagents/src/shared/fork-context.ts +80 -13
  406. package/node_modules/pi-subagents/src/shared/fork-session-cwd.ts +27 -0
  407. package/node_modules/pi-subagents/src/shared/formatters.ts +18 -3
  408. package/node_modules/pi-subagents/src/shared/launch-contract.ts +20 -6
  409. package/node_modules/pi-subagents/src/shared/model-info.ts +20 -0
  410. package/node_modules/pi-subagents/src/shared/node-executable.ts +21 -0
  411. package/node_modules/pi-subagents/src/shared/prompt-resources.ts +0 -40
  412. package/node_modules/pi-subagents/src/shared/pruned-fork.ts +450 -0
  413. package/node_modules/pi-subagents/src/shared/session-file-trust.ts +19 -0
  414. package/node_modules/pi-subagents/src/shared/session-tokens.ts +14 -3
  415. package/node_modules/pi-subagents/src/shared/settings.ts +25 -130
  416. package/node_modules/pi-subagents/src/shared/shortcuts.ts +17 -0
  417. package/node_modules/pi-subagents/src/shared/thinking-ceiling.ts +52 -0
  418. package/node_modules/pi-subagents/src/shared/types.ts +788 -64
  419. package/node_modules/pi-subagents/src/shared/utils.ts +52 -85
  420. package/node_modules/pi-subagents/src/shared/watch-strategy.ts +10 -0
  421. package/node_modules/pi-subagents/src/shared/workflow-child-permit.ts +207 -0
  422. package/node_modules/pi-subagents/src/slash/delegation-adapters.ts +1 -9
  423. package/node_modules/pi-subagents/src/slash/delegation-request.ts +0 -4
  424. package/node_modules/pi-subagents/src/slash/prompt-template-bridge.ts +37 -1
  425. package/node_modules/pi-subagents/src/slash/slash-commands.ts +457 -135
  426. package/node_modules/pi-subagents/src/slash/slash-live-state.ts +28 -14
  427. package/node_modules/pi-subagents/src/slash/subagents-admin.ts +5 -0
  428. package/node_modules/pi-subagents/src/tui/fleet-status.ts +402 -71
  429. package/node_modules/pi-subagents/src/tui/fleet-transcript.ts +12 -53
  430. package/node_modules/pi-subagents/src/tui/fleet.ts +500 -53
  431. package/node_modules/pi-subagents/src/tui/render-helpers.ts +31 -0
  432. package/node_modules/pi-subagents/src/tui/render.ts +1192 -192
  433. package/node_modules/pi-subagents/src/watchdog/change-signature.ts +41 -2
  434. package/node_modules/pi-subagents/src/watchdog/lsp-diagnostics.ts +1 -0
  435. package/node_modules/pi-subagents/src/watchdog/permission-arbiter.ts +60 -51
  436. package/node_modules/pi-subagents/src/watchdog/review.ts +4 -3
  437. package/node_modules/pi-subagents/src/watchdog/turn-delta.ts +1 -1
  438. package/node_modules/pi-subagents/src/workflows/chat-progress.ts +17 -6
  439. package/node_modules/pi-subagents/src/workflows/host-command.ts +235 -0
  440. package/node_modules/pi-subagents/src/workflows/scripted-workflow.ts +1654 -174
  441. package/node_modules/pi-subagents/src/workflows/workflow-child-summary.ts +121 -0
  442. package/node_modules/pi-subagents/src/workflows/workflow-preflight.ts +270 -0
  443. package/node_modules/pi-subagents/src/workflows/workflow-receipt.ts +366 -0
  444. package/node_modules/pi-subagents/src/workflows/workflow-resources.ts +150 -0
  445. package/node_modules/pi-subagents/src/workflows/workflow-settlement.ts +246 -0
  446. package/node_modules/zod/README.md +29 -2
  447. package/node_modules/zod/compile.cjs +96 -0
  448. package/node_modules/zod/compile.d.cts +1 -0
  449. package/node_modules/zod/compile.d.ts +1 -0
  450. package/node_modules/zod/compile.js +52 -0
  451. package/node_modules/zod/index.cjs +21 -2
  452. package/node_modules/zod/index.d.cts +1 -2
  453. package/node_modules/zod/index.d.ts +1 -2
  454. package/node_modules/zod/index.js +5 -2
  455. package/node_modules/zod/locales/index.cjs +19 -0
  456. package/node_modules/zod/mini/index.cjs +19 -0
  457. package/node_modules/zod/package.json +20 -8
  458. package/node_modules/zod/src/compile.ts +56 -0
  459. package/node_modules/zod/src/index.ts +5 -2
  460. package/node_modules/zod/src/v3/ZodError.ts +22 -12
  461. package/node_modules/zod/src/v3/helpers/errorUtil.ts +1 -1
  462. package/node_modules/zod/src/v3/tests/error.test.ts +35 -0
  463. package/node_modules/zod/src/v3/tests/intersection.test.ts +18 -0
  464. package/node_modules/zod/src/v3/tests/language-server.test.ts +1 -2
  465. package/node_modules/zod/src/v3/tests/object.test.ts +3 -6
  466. package/node_modules/zod/src/v3/tests/readonly.test.ts +0 -80
  467. package/node_modules/zod/src/v3/tests/string.test.ts +6 -0
  468. package/node_modules/zod/src/v3/types.ts +5 -5
  469. package/node_modules/zod/src/v4/classic/checks.ts +1 -0
  470. package/node_modules/zod/src/v4/classic/compat.ts +26 -18
  471. package/node_modules/zod/src/v4/classic/deep-partial.ts +76 -0
  472. package/node_modules/zod/src/v4/classic/errors.ts +59 -44
  473. package/node_modules/zod/src/v4/classic/external.ts +14 -9
  474. package/node_modules/zod/src/v4/classic/from-json-schema.ts +363 -78
  475. package/node_modules/zod/src/v4/classic/in-out.ts +45 -0
  476. package/node_modules/zod/src/v4/classic/index.ts +2 -2
  477. package/node_modules/zod/src/v4/classic/iso.ts +2 -72
  478. package/node_modules/zod/src/v4/classic/parse.ts +10 -4
  479. package/node_modules/zod/src/v4/classic/schemas.ts +640 -375
  480. package/node_modules/zod/src/v4/classic/tests/apply.test.ts +27 -0
  481. package/node_modules/zod/src/v4/classic/tests/array.test.ts +2 -2
  482. package/node_modules/zod/src/v4/classic/tests/assignability.test.ts +186 -0
  483. package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +36 -1
  484. package/node_modules/zod/src/v4/classic/tests/catch.test.ts +278 -0
  485. package/node_modules/zod/src/v4/classic/tests/codec-examples.test.ts +1 -2
  486. package/node_modules/zod/src/v4/classic/tests/codec.test.ts +2 -1
  487. package/node_modules/zod/src/v4/classic/tests/continuability.test.ts +3 -3
  488. package/node_modules/zod/src/v4/classic/tests/credit-card.test.ts +76 -0
  489. package/node_modules/zod/src/v4/classic/tests/cyclic-data.test.ts +985 -0
  490. package/node_modules/zod/src/v4/classic/tests/date.test.ts +30 -0
  491. package/node_modules/zod/src/v4/classic/tests/datetime.test.ts +32 -18
  492. package/node_modules/zod/src/v4/classic/tests/deep-partial.test.ts +380 -0
  493. package/node_modules/zod/src/v4/classic/tests/default-locale.test.ts +32 -0
  494. package/node_modules/zod/src/v4/classic/tests/default.test.ts +46 -0
  495. package/node_modules/zod/src/v4/classic/tests/detached-methods.test.ts +31 -7
  496. package/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +261 -13
  497. package/node_modules/zod/src/v4/classic/tests/enum.test.ts +20 -0
  498. package/node_modules/zod/src/v4/classic/tests/error-utils.test.ts +112 -2
  499. package/node_modules/zod/src/v4/classic/tests/error.test.ts +403 -6
  500. package/node_modules/zod/src/v4/classic/tests/from-json-schema.test.ts +582 -10
  501. package/node_modules/zod/src/v4/classic/tests/function.test.ts +31 -0
  502. package/node_modules/zod/src/v4/classic/tests/global-config.test.ts +2 -9
  503. package/node_modules/zod/src/v4/classic/tests/hash.test.ts +1 -2
  504. package/node_modules/zod/src/v4/classic/tests/iban.test.ts +81 -0
  505. package/node_modules/zod/src/v4/classic/tests/in-out.test.ts +159 -0
  506. package/node_modules/zod/src/v4/classic/tests/index.test.ts +21 -2
  507. package/node_modules/zod/src/v4/classic/tests/instance-footprint.test.ts +319 -0
  508. package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +67 -0
  509. package/node_modules/zod/src/v4/classic/tests/intersection.test.ts +136 -0
  510. package/node_modules/zod/src/v4/classic/tests/issue-schema.test.ts +215 -0
  511. package/node_modules/zod/src/v4/classic/tests/jitless-allows-eval.test.ts +3 -10
  512. package/node_modules/zod/src/v4/classic/tests/lazy.test.ts +36 -1
  513. package/node_modules/zod/src/v4/classic/tests/literal.test.ts +12 -1
  514. package/node_modules/zod/src/v4/classic/tests/map.test.ts +12 -0
  515. package/node_modules/zod/src/v4/classic/tests/number.test.ts +85 -9
  516. package/node_modules/zod/src/v4/classic/tests/object.test.ts +301 -12
  517. package/node_modules/zod/src/v4/classic/tests/optin-ladder.test.ts +235 -0
  518. package/node_modules/zod/src/v4/classic/tests/optional.test.ts +49 -16
  519. package/node_modules/zod/src/v4/classic/tests/partial.test.ts +51 -4
  520. package/node_modules/zod/src/v4/classic/tests/prefault.test.ts +70 -0
  521. package/node_modules/zod/src/v4/classic/tests/preprocess-types.test.ts +20 -2
  522. package/node_modules/zod/src/v4/classic/tests/properties.test.ts +141 -0
  523. package/node_modules/zod/src/v4/classic/tests/readonly.test.ts +0 -68
  524. package/node_modules/zod/src/v4/classic/tests/record.test.ts +186 -18
  525. package/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +79 -3
  526. package/node_modules/zod/src/v4/classic/tests/redos.test.ts +68 -0
  527. package/node_modules/zod/src/v4/classic/tests/refine.test.ts +60 -0
  528. package/node_modules/zod/src/v4/classic/tests/set.test.ts +9 -0
  529. package/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +19 -0
  530. package/node_modules/zod/src/v4/classic/tests/string.test.ts +222 -6
  531. package/node_modules/zod/src/v4/classic/tests/stringbool.test.ts +18 -0
  532. package/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +44 -3
  533. package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +1812 -204
  534. package/node_modules/zod/src/v4/classic/tests/tuple.test.ts +45 -30
  535. package/node_modules/zod/src/v4/classic/tests/union.test.ts +39 -2
  536. package/node_modules/zod/src/v4/classic/tests/validate.test.ts +645 -0
  537. package/node_modules/zod/src/v4/classic/tests/validations.test.ts +2 -2
  538. package/node_modules/zod/src/v4/core/api.ts +87 -35
  539. package/node_modules/zod/src/v4/core/checks.ts +119 -146
  540. package/node_modules/zod/src/v4/core/compile.ts +2313 -0
  541. package/node_modules/zod/src/v4/core/core.ts +99 -22
  542. package/node_modules/zod/src/v4/core/doc.ts +17 -9
  543. package/node_modules/zod/src/v4/core/errors.ts +113 -25
  544. package/node_modules/zod/src/v4/core/index.ts +3 -0
  545. package/node_modules/zod/src/v4/core/json-schema-generator.ts +8 -3
  546. package/node_modules/zod/src/v4/core/json-schema-processors.ts +424 -156
  547. package/node_modules/zod/src/v4/core/json-schema.ts +2 -1
  548. package/node_modules/zod/src/v4/core/memoizer.ts +331 -0
  549. package/node_modules/zod/src/v4/core/parse.ts +164 -50
  550. package/node_modules/zod/src/v4/core/regexes.ts +42 -15
  551. package/node_modules/zod/src/v4/core/registries.ts +2 -2
  552. package/node_modules/zod/src/v4/core/schemas.ts +1000 -538
  553. package/node_modules/zod/src/v4/core/tests/cached.test.ts +54 -0
  554. package/node_modules/zod/src/v4/core/tests/compile-differential.test.ts +1004 -0
  555. package/node_modules/zod/src/v4/core/tests/compile-generative.test.ts +445 -0
  556. package/node_modules/zod/src/v4/core/tests/compile-global.test.ts +89 -0
  557. package/node_modules/zod/src/v4/core/tests/compile-off-by-default.test.ts +26 -0
  558. package/node_modules/zod/src/v4/core/tests/compile-stats.test.ts +34 -0
  559. package/node_modules/zod/src/v4/core/tests/compile.test.ts +2036 -0
  560. package/node_modules/zod/src/v4/core/tests/email-regex.test.ts +140 -0
  561. package/node_modules/zod/src/v4/core/tests/locales/el.test.ts +1 -2
  562. package/node_modules/zod/src/v4/core/tests/locales/es.test.ts +1 -2
  563. package/node_modules/zod/src/v4/core/tests/locales/fr.test.ts +3 -3
  564. package/node_modules/zod/src/v4/core/tests/locales/parity.test.ts +42 -0
  565. package/node_modules/zod/src/v4/core/tests/locales/tg.test.ts +85 -0
  566. package/node_modules/zod/src/v4/core/tests/locales/tk.test.ts +69 -0
  567. package/node_modules/zod/src/v4/core/tests/polyfill-collision.test.ts +46 -0
  568. package/node_modules/zod/src/v4/core/tests/treeshake.test.ts +51 -0
  569. package/node_modules/zod/src/v4/core/tests/url-no-canparse.test.ts +133 -0
  570. package/node_modules/zod/src/v4/core/to-json-schema.ts +283 -48
  571. package/node_modules/zod/src/v4/core/util.ts +454 -157
  572. package/node_modules/zod/src/v4/core/versions.ts +2 -2
  573. package/node_modules/zod/src/v4/core/visit.ts +193 -0
  574. package/node_modules/zod/src/v4/index.ts +3 -3
  575. package/node_modules/zod/src/v4/locales/ar.ts +5 -0
  576. package/node_modules/zod/src/v4/locales/az.ts +5 -0
  577. package/node_modules/zod/src/v4/locales/be.ts +12 -0
  578. package/node_modules/zod/src/v4/locales/bg.ts +5 -0
  579. package/node_modules/zod/src/v4/locales/bn.ts +123 -0
  580. package/node_modules/zod/src/v4/locales/ca.ts +5 -0
  581. package/node_modules/zod/src/v4/locales/ckb.ts +140 -0
  582. package/node_modules/zod/src/v4/locales/cs.ts +5 -0
  583. package/node_modules/zod/src/v4/locales/da.ts +7 -2
  584. package/node_modules/zod/src/v4/locales/de.ts +5 -0
  585. package/node_modules/zod/src/v4/locales/el.ts +3 -0
  586. package/node_modules/zod/src/v4/locales/en.ts +17 -4
  587. package/node_modules/zod/src/v4/locales/eo.ts +5 -0
  588. package/node_modules/zod/src/v4/locales/es.ts +4 -0
  589. package/node_modules/zod/src/v4/locales/fa.ts +5 -0
  590. package/node_modules/zod/src/v4/locales/fi.ts +5 -0
  591. package/node_modules/zod/src/v4/locales/fr-CA.ts +5 -0
  592. package/node_modules/zod/src/v4/locales/fr.ts +21 -14
  593. package/node_modules/zod/src/v4/locales/gu.ts +123 -0
  594. package/node_modules/zod/src/v4/locales/he.ts +8 -1
  595. package/node_modules/zod/src/v4/locales/hi.ts +126 -0
  596. package/node_modules/zod/src/v4/locales/hr.ts +4 -0
  597. package/node_modules/zod/src/v4/locales/hu.ts +5 -0
  598. package/node_modules/zod/src/v4/locales/hy.ts +11 -0
  599. package/node_modules/zod/src/v4/locales/id.ts +5 -0
  600. package/node_modules/zod/src/v4/locales/index.ts +11 -0
  601. package/node_modules/zod/src/v4/locales/is.ts +5 -0
  602. package/node_modules/zod/src/v4/locales/it.ts +5 -0
  603. package/node_modules/zod/src/v4/locales/ja.ts +5 -0
  604. package/node_modules/zod/src/v4/locales/ka.ts +5 -0
  605. package/node_modules/zod/src/v4/locales/km.ts +5 -0
  606. package/node_modules/zod/src/v4/locales/kn.ts +126 -0
  607. package/node_modules/zod/src/v4/locales/ko.ts +5 -0
  608. package/node_modules/zod/src/v4/locales/lt.ts +4 -0
  609. package/node_modules/zod/src/v4/locales/mk.ts +5 -0
  610. package/node_modules/zod/src/v4/locales/ms.ts +5 -0
  611. package/node_modules/zod/src/v4/locales/ne.ts +128 -0
  612. package/node_modules/zod/src/v4/locales/nl.ts +5 -0
  613. package/node_modules/zod/src/v4/locales/nn.ts +121 -0
  614. package/node_modules/zod/src/v4/locales/no.ts +7 -2
  615. package/node_modules/zod/src/v4/locales/ota.ts +5 -0
  616. package/node_modules/zod/src/v4/locales/pl.ts +5 -0
  617. package/node_modules/zod/src/v4/locales/ps.ts +5 -0
  618. package/node_modules/zod/src/v4/locales/pt-BR.ts +161 -0
  619. package/node_modules/zod/src/v4/locales/pt.ts +101 -58
  620. package/node_modules/zod/src/v4/locales/ro.ts +3 -0
  621. package/node_modules/zod/src/v4/locales/ru.ts +12 -0
  622. package/node_modules/zod/src/v4/locales/sk.ts +123 -0
  623. package/node_modules/zod/src/v4/locales/sl.ts +5 -0
  624. package/node_modules/zod/src/v4/locales/sv.ts +7 -2
  625. package/node_modules/zod/src/v4/locales/ta.ts +5 -0
  626. package/node_modules/zod/src/v4/locales/tg.ts +135 -0
  627. package/node_modules/zod/src/v4/locales/th.ts +5 -0
  628. package/node_modules/zod/src/v4/locales/tk.ts +113 -0
  629. package/node_modules/zod/src/v4/locales/tr.ts +5 -0
  630. package/node_modules/zod/src/v4/locales/uk.ts +5 -0
  631. package/node_modules/zod/src/v4/locales/ur.ts +5 -0
  632. package/node_modules/zod/src/v4/locales/uz.ts +3 -0
  633. package/node_modules/zod/src/v4/locales/vi.ts +5 -0
  634. package/node_modules/zod/src/v4/locales/yo.ts +5 -0
  635. package/node_modules/zod/src/v4/locales/zh-CN.ts +5 -0
  636. package/node_modules/zod/src/v4/locales/zh-TW.ts +5 -0
  637. package/node_modules/zod/src/v4/mini/checks.ts +1 -0
  638. package/node_modules/zod/src/v4/mini/deep-partial.ts +73 -0
  639. package/node_modules/zod/src/v4/mini/external.ts +12 -1
  640. package/node_modules/zod/src/v4/mini/in-out.ts +45 -0
  641. package/node_modules/zod/src/v4/mini/parse.ts +2 -0
  642. package/node_modules/zod/src/v4/mini/schemas.ts +167 -63
  643. package/node_modules/zod/src/v4/mini/tests/apply.test.ts +33 -0
  644. package/node_modules/zod/src/v4/mini/tests/assignability.test.ts +62 -1
  645. package/node_modules/zod/src/v4/mini/tests/checks.test.ts +14 -0
  646. package/node_modules/zod/src/v4/mini/tests/codec.test.ts +35 -1
  647. package/node_modules/zod/src/v4/mini/tests/computed.test.ts +11 -17
  648. package/node_modules/zod/src/v4/mini/tests/cyclic-data.test.ts +84 -0
  649. package/node_modules/zod/src/v4/mini/tests/deep-partial.test.ts +54 -0
  650. package/node_modules/zod/src/v4/mini/tests/error.test.ts +23 -4
  651. package/node_modules/zod/src/v4/mini/tests/functions.test.ts +9 -0
  652. package/node_modules/zod/src/v4/mini/tests/index.test.ts +158 -5
  653. package/node_modules/zod/src/v4/mini/tests/number.test.ts +14 -0
  654. package/node_modules/zod/src/v4/mini/tests/object.test.ts +65 -0
  655. package/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +16 -0
  656. package/node_modules/zod/src/v4/mini/tests/string.test.ts +44 -0
  657. package/node_modules/zod/v3/ZodError.cjs +41 -12
  658. package/node_modules/zod/v3/ZodError.d.cts +1 -1
  659. package/node_modules/zod/v3/ZodError.d.ts +1 -1
  660. package/node_modules/zod/v3/ZodError.js +22 -12
  661. package/node_modules/zod/v3/errors.cjs +19 -0
  662. package/node_modules/zod/v3/external.cjs +19 -0
  663. package/node_modules/zod/v3/helpers/enumUtil.cjs +19 -0
  664. package/node_modules/zod/v3/helpers/errorUtil.cjs +20 -1
  665. package/node_modules/zod/v3/helpers/errorUtil.js +1 -1
  666. package/node_modules/zod/v3/helpers/parseUtil.cjs +19 -0
  667. package/node_modules/zod/v3/helpers/partialUtil.cjs +19 -0
  668. package/node_modules/zod/v3/helpers/typeAliases.cjs +19 -0
  669. package/node_modules/zod/v3/helpers/util.cjs +19 -0
  670. package/node_modules/zod/v3/index.cjs +19 -0
  671. package/node_modules/zod/v3/standard-schema.cjs +19 -0
  672. package/node_modules/zod/v3/types.cjs +26 -5
  673. package/node_modules/zod/v3/types.js +7 -5
  674. package/node_modules/zod/v4/classic/checks.cjs +21 -1
  675. package/node_modules/zod/v4/classic/checks.d.cts +1 -1
  676. package/node_modules/zod/v4/classic/checks.d.ts +1 -1
  677. package/node_modules/zod/v4/classic/checks.js +1 -1
  678. package/node_modules/zod/v4/classic/coerce.cjs +19 -0
  679. package/node_modules/zod/v4/classic/compat.cjs +19 -0
  680. package/node_modules/zod/v4/classic/compat.d.cts +9 -11
  681. package/node_modules/zod/v4/classic/compat.d.ts +9 -11
  682. package/node_modules/zod/v4/classic/deep-partial.cjs +58 -0
  683. package/node_modules/zod/v4/classic/deep-partial.d.cts +14 -0
  684. package/node_modules/zod/v4/classic/deep-partial.d.ts +14 -0
  685. package/node_modules/zod/v4/classic/deep-partial.js +13 -0
  686. package/node_modules/zod/v4/classic/errors.cjs +62 -34
  687. package/node_modules/zod/v4/classic/errors.d.cts +3 -4
  688. package/node_modules/zod/v4/classic/errors.d.ts +3 -4
  689. package/node_modules/zod/v4/classic/errors.js +43 -34
  690. package/node_modules/zod/v4/classic/external.cjs +51 -27
  691. package/node_modules/zod/v4/classic/external.d.cts +5 -2
  692. package/node_modules/zod/v4/classic/external.d.ts +5 -2
  693. package/node_modules/zod/v4/classic/external.js +5 -8
  694. package/node_modules/zod/v4/classic/from-json-schema.cjs +376 -75
  695. package/node_modules/zod/v4/classic/from-json-schema.js +357 -75
  696. package/node_modules/zod/v4/classic/in-out.cjs +82 -0
  697. package/node_modules/zod/v4/classic/in-out.d.cts +8 -0
  698. package/node_modules/zod/v4/classic/in-out.d.ts +8 -0
  699. package/node_modules/zod/v4/classic/in-out.js +36 -0
  700. package/node_modules/zod/v4/classic/index.cjs +21 -2
  701. package/node_modules/zod/v4/classic/index.d.cts +1 -2
  702. package/node_modules/zod/v4/classic/index.d.ts +1 -2
  703. package/node_modules/zod/v4/classic/index.js +2 -2
  704. package/node_modules/zod/v4/classic/iso.cjs +30 -22
  705. package/node_modules/zod/v4/classic/iso.d.cts +2 -17
  706. package/node_modules/zod/v4/classic/iso.d.ts +2 -17
  707. package/node_modules/zod/v4/classic/iso.js +2 -17
  708. package/node_modules/zod/v4/classic/parse.cjs +23 -1
  709. package/node_modules/zod/v4/classic/parse.d.cts +17 -4
  710. package/node_modules/zod/v4/classic/parse.d.ts +17 -4
  711. package/node_modules/zod/v4/classic/parse.js +1 -0
  712. package/node_modules/zod/v4/classic/schemas.cjs +591 -426
  713. package/node_modules/zod/v4/classic/schemas.d.cts +68 -19
  714. package/node_modules/zod/v4/classic/schemas.d.ts +68 -19
  715. package/node_modules/zod/v4/classic/schemas.js +564 -424
  716. package/node_modules/zod/v4/core/api.cjs +66 -24
  717. package/node_modules/zod/v4/core/api.d.cts +22 -12
  718. package/node_modules/zod/v4/core/api.d.ts +22 -12
  719. package/node_modules/zod/v4/core/api.js +44 -24
  720. package/node_modules/zod/v4/core/checks.cjs +88 -128
  721. package/node_modules/zod/v4/core/checks.d.cts +29 -13
  722. package/node_modules/zod/v4/core/checks.d.ts +29 -13
  723. package/node_modules/zod/v4/core/checks.js +68 -127
  724. package/node_modules/zod/v4/core/compile.cjs +1908 -0
  725. package/node_modules/zod/v4/core/compile.d.cts +65 -0
  726. package/node_modules/zod/v4/core/compile.d.ts +65 -0
  727. package/node_modules/zod/v4/core/compile.js +1858 -0
  728. package/node_modules/zod/v4/core/core.cjs +101 -19
  729. package/node_modules/zod/v4/core/core.d.cts +16 -4
  730. package/node_modules/zod/v4/core/core.d.ts +16 -4
  731. package/node_modules/zod/v4/core/core.js +83 -20
  732. package/node_modules/zod/v4/core/doc.cjs +31 -9
  733. package/node_modules/zod/v4/core/doc.d.cts +3 -1
  734. package/node_modules/zod/v4/core/doc.d.ts +3 -1
  735. package/node_modules/zod/v4/core/doc.js +12 -9
  736. package/node_modules/zod/v4/core/errors.cjs +126 -25
  737. package/node_modules/zod/v4/core/errors.d.cts +4 -0
  738. package/node_modules/zod/v4/core/errors.d.ts +4 -0
  739. package/node_modules/zod/v4/core/errors.js +107 -25
  740. package/node_modules/zod/v4/core/index.cjs +24 -1
  741. package/node_modules/zod/v4/core/index.d.cts +3 -0
  742. package/node_modules/zod/v4/core/index.d.ts +3 -0
  743. package/node_modules/zod/v4/core/index.js +3 -0
  744. package/node_modules/zod/v4/core/json-schema-generator.cjs +24 -1
  745. package/node_modules/zod/v4/core/json-schema-generator.d.cts +2 -2
  746. package/node_modules/zod/v4/core/json-schema-generator.d.ts +2 -2
  747. package/node_modules/zod/v4/core/json-schema-generator.js +6 -2
  748. package/node_modules/zod/v4/core/json-schema-processors.cjs +441 -156
  749. package/node_modules/zod/v4/core/json-schema-processors.d.cts +16 -0
  750. package/node_modules/zod/v4/core/json-schema-processors.d.ts +16 -0
  751. package/node_modules/zod/v4/core/json-schema-processors.js +400 -158
  752. package/node_modules/zod/v4/core/json-schema.cjs +19 -0
  753. package/node_modules/zod/v4/core/json-schema.d.cts +2 -1
  754. package/node_modules/zod/v4/core/json-schema.d.ts +2 -1
  755. package/node_modules/zod/v4/core/memoizer.cjs +360 -0
  756. package/node_modules/zod/v4/core/memoizer.d.cts +15 -0
  757. package/node_modules/zod/v4/core/memoizer.d.ts +15 -0
  758. package/node_modules/zod/v4/core/memoizer.js +311 -0
  759. package/node_modules/zod/v4/core/parse.cjs +148 -46
  760. package/node_modules/zod/v4/core/parse.d.cts +14 -11
  761. package/node_modules/zod/v4/core/parse.d.ts +14 -11
  762. package/node_modules/zod/v4/core/parse.js +127 -45
  763. package/node_modules/zod/v4/core/regexes.cjs +54 -17
  764. package/node_modules/zod/v4/core/regexes.d.cts +5 -0
  765. package/node_modules/zod/v4/core/regexes.d.ts +5 -0
  766. package/node_modules/zod/v4/core/regexes.js +32 -15
  767. package/node_modules/zod/v4/core/registries.cjs +19 -0
  768. package/node_modules/zod/v4/core/registries.js +2 -2
  769. package/node_modules/zod/v4/core/schemas.cjs +785 -386
  770. package/node_modules/zod/v4/core/schemas.d.cts +123 -34
  771. package/node_modules/zod/v4/core/schemas.d.ts +123 -34
  772. package/node_modules/zod/v4/core/schemas.js +753 -386
  773. package/node_modules/zod/v4/core/standard-schema.cjs +19 -0
  774. package/node_modules/zod/v4/core/to-json-schema.cjs +269 -45
  775. package/node_modules/zod/v4/core/to-json-schema.d.cts +45 -5
  776. package/node_modules/zod/v4/core/to-json-schema.d.ts +45 -5
  777. package/node_modules/zod/v4/core/to-json-schema.js +247 -44
  778. package/node_modules/zod/v4/core/util.cjs +372 -157
  779. package/node_modules/zod/v4/core/util.d.cts +79 -1
  780. package/node_modules/zod/v4/core/util.d.ts +79 -1
  781. package/node_modules/zod/v4/core/util.js +341 -156
  782. package/node_modules/zod/v4/core/versions.cjs +21 -2
  783. package/node_modules/zod/v4/core/versions.d.cts +1 -1
  784. package/node_modules/zod/v4/core/versions.d.ts +1 -1
  785. package/node_modules/zod/v4/core/versions.js +2 -2
  786. package/node_modules/zod/v4/core/visit.cjs +214 -0
  787. package/node_modules/zod/v4/core/visit.d.cts +30 -0
  788. package/node_modules/zod/v4/core/visit.d.ts +30 -0
  789. package/node_modules/zod/v4/core/visit.js +169 -0
  790. package/node_modules/zod/v4/index.cjs +34 -5
  791. package/node_modules/zod/v4/index.d.cts +2 -2
  792. package/node_modules/zod/v4/index.d.ts +2 -2
  793. package/node_modules/zod/v4/index.js +3 -2
  794. package/node_modules/zod/v4/locales/ar.cjs +5 -0
  795. package/node_modules/zod/v4/locales/ar.js +5 -0
  796. package/node_modules/zod/v4/locales/az.cjs +5 -0
  797. package/node_modules/zod/v4/locales/az.js +5 -0
  798. package/node_modules/zod/v4/locales/be.cjs +12 -0
  799. package/node_modules/zod/v4/locales/be.js +12 -0
  800. package/node_modules/zod/v4/locales/bg.cjs +5 -0
  801. package/node_modules/zod/v4/locales/bg.js +5 -0
  802. package/node_modules/zod/v4/locales/bn.cjs +140 -0
  803. package/node_modules/zod/v4/locales/bn.d.cts +5 -0
  804. package/node_modules/zod/v4/locales/bn.d.ts +4 -0
  805. package/node_modules/zod/v4/locales/bn.js +113 -0
  806. package/node_modules/zod/v4/locales/ca.cjs +5 -0
  807. package/node_modules/zod/v4/locales/ca.js +5 -0
  808. package/node_modules/zod/v4/locales/ckb.cjs +160 -0
  809. package/node_modules/zod/v4/locales/ckb.d.cts +5 -0
  810. package/node_modules/zod/v4/locales/ckb.d.ts +4 -0
  811. package/node_modules/zod/v4/locales/ckb.js +133 -0
  812. package/node_modules/zod/v4/locales/cs.cjs +5 -0
  813. package/node_modules/zod/v4/locales/cs.js +5 -0
  814. package/node_modules/zod/v4/locales/da.cjs +7 -2
  815. package/node_modules/zod/v4/locales/da.js +7 -2
  816. package/node_modules/zod/v4/locales/de.cjs +5 -0
  817. package/node_modules/zod/v4/locales/de.js +5 -0
  818. package/node_modules/zod/v4/locales/el.cjs +3 -0
  819. package/node_modules/zod/v4/locales/el.js +3 -0
  820. package/node_modules/zod/v4/locales/en.cjs +16 -4
  821. package/node_modules/zod/v4/locales/en.js +16 -4
  822. package/node_modules/zod/v4/locales/eo.cjs +5 -0
  823. package/node_modules/zod/v4/locales/eo.js +5 -0
  824. package/node_modules/zod/v4/locales/es.cjs +4 -0
  825. package/node_modules/zod/v4/locales/es.js +4 -0
  826. package/node_modules/zod/v4/locales/fa.cjs +5 -0
  827. package/node_modules/zod/v4/locales/fa.js +5 -0
  828. package/node_modules/zod/v4/locales/fi.cjs +5 -0
  829. package/node_modules/zod/v4/locales/fi.js +5 -0
  830. package/node_modules/zod/v4/locales/fr-CA.cjs +5 -0
  831. package/node_modules/zod/v4/locales/fr-CA.js +5 -0
  832. package/node_modules/zod/v4/locales/fr.cjs +18 -14
  833. package/node_modules/zod/v4/locales/fr.js +18 -14
  834. package/node_modules/zod/v4/locales/gu.cjs +140 -0
  835. package/node_modules/zod/v4/locales/gu.d.cts +5 -0
  836. package/node_modules/zod/v4/locales/gu.d.ts +4 -0
  837. package/node_modules/zod/v4/locales/gu.js +113 -0
  838. package/node_modules/zod/v4/locales/he.cjs +7 -0
  839. package/node_modules/zod/v4/locales/he.js +7 -0
  840. package/node_modules/zod/v4/locales/hi.cjs +138 -0
  841. package/node_modules/zod/v4/locales/hi.d.cts +5 -0
  842. package/node_modules/zod/v4/locales/hi.d.ts +4 -0
  843. package/node_modules/zod/v4/locales/hi.js +111 -0
  844. package/node_modules/zod/v4/locales/hr.cjs +4 -0
  845. package/node_modules/zod/v4/locales/hr.js +4 -0
  846. package/node_modules/zod/v4/locales/hu.cjs +5 -0
  847. package/node_modules/zod/v4/locales/hu.js +5 -0
  848. package/node_modules/zod/v4/locales/hy.cjs +11 -0
  849. package/node_modules/zod/v4/locales/hy.js +11 -0
  850. package/node_modules/zod/v4/locales/id.cjs +5 -0
  851. package/node_modules/zod/v4/locales/id.js +5 -0
  852. package/node_modules/zod/v4/locales/index.cjs +43 -2
  853. package/node_modules/zod/v4/locales/index.d.cts +11 -0
  854. package/node_modules/zod/v4/locales/index.d.ts +11 -0
  855. package/node_modules/zod/v4/locales/index.js +11 -0
  856. package/node_modules/zod/v4/locales/is.cjs +5 -0
  857. package/node_modules/zod/v4/locales/is.js +5 -0
  858. package/node_modules/zod/v4/locales/it.cjs +5 -0
  859. package/node_modules/zod/v4/locales/it.js +5 -0
  860. package/node_modules/zod/v4/locales/ja.cjs +5 -0
  861. package/node_modules/zod/v4/locales/ja.js +5 -0
  862. package/node_modules/zod/v4/locales/ka.cjs +5 -0
  863. package/node_modules/zod/v4/locales/ka.js +5 -0
  864. package/node_modules/zod/v4/locales/km.cjs +5 -0
  865. package/node_modules/zod/v4/locales/km.js +5 -0
  866. package/node_modules/zod/v4/locales/kn.cjs +143 -0
  867. package/node_modules/zod/v4/locales/kn.d.cts +5 -0
  868. package/node_modules/zod/v4/locales/kn.d.ts +4 -0
  869. package/node_modules/zod/v4/locales/kn.js +116 -0
  870. package/node_modules/zod/v4/locales/ko.cjs +5 -0
  871. package/node_modules/zod/v4/locales/ko.js +5 -0
  872. package/node_modules/zod/v4/locales/lt.cjs +4 -0
  873. package/node_modules/zod/v4/locales/lt.js +4 -0
  874. package/node_modules/zod/v4/locales/mk.cjs +5 -0
  875. package/node_modules/zod/v4/locales/mk.js +5 -0
  876. package/node_modules/zod/v4/locales/ms.cjs +5 -0
  877. package/node_modules/zod/v4/locales/ms.js +5 -0
  878. package/node_modules/zod/v4/locales/ne.cjs +138 -0
  879. package/node_modules/zod/v4/locales/ne.d.cts +5 -0
  880. package/node_modules/zod/v4/locales/ne.d.ts +4 -0
  881. package/node_modules/zod/v4/locales/ne.js +111 -0
  882. package/node_modules/zod/v4/locales/nl.cjs +5 -0
  883. package/node_modules/zod/v4/locales/nl.js +5 -0
  884. package/node_modules/zod/v4/locales/nn.cjs +140 -0
  885. package/node_modules/zod/v4/locales/nn.d.cts +5 -0
  886. package/node_modules/zod/v4/locales/nn.d.ts +4 -0
  887. package/node_modules/zod/v4/locales/nn.js +113 -0
  888. package/node_modules/zod/v4/locales/no.cjs +7 -2
  889. package/node_modules/zod/v4/locales/no.js +7 -2
  890. package/node_modules/zod/v4/locales/ota.cjs +5 -0
  891. package/node_modules/zod/v4/locales/ota.js +5 -0
  892. package/node_modules/zod/v4/locales/pl.cjs +5 -0
  893. package/node_modules/zod/v4/locales/pl.js +5 -0
  894. package/node_modules/zod/v4/locales/ps.cjs +5 -0
  895. package/node_modules/zod/v4/locales/ps.js +5 -0
  896. package/node_modules/zod/v4/locales/pt-BR.cjs +170 -0
  897. package/node_modules/zod/v4/locales/pt-BR.d.cts +5 -0
  898. package/node_modules/zod/v4/locales/pt-BR.d.ts +4 -0
  899. package/node_modules/zod/v4/locales/pt-BR.js +143 -0
  900. package/node_modules/zod/v4/locales/pt.cjs +89 -55
  901. package/node_modules/zod/v4/locales/pt.js +89 -55
  902. package/node_modules/zod/v4/locales/ro.cjs +3 -0
  903. package/node_modules/zod/v4/locales/ro.js +3 -0
  904. package/node_modules/zod/v4/locales/ru.cjs +12 -0
  905. package/node_modules/zod/v4/locales/ru.js +12 -0
  906. package/node_modules/zod/v4/locales/sk.cjs +143 -0
  907. package/node_modules/zod/v4/locales/sk.d.cts +5 -0
  908. package/node_modules/zod/v4/locales/sk.d.ts +4 -0
  909. package/node_modules/zod/v4/locales/sk.js +116 -0
  910. package/node_modules/zod/v4/locales/sl.cjs +5 -0
  911. package/node_modules/zod/v4/locales/sl.js +5 -0
  912. package/node_modules/zod/v4/locales/sv.cjs +7 -2
  913. package/node_modules/zod/v4/locales/sv.js +7 -2
  914. package/node_modules/zod/v4/locales/ta.cjs +5 -0
  915. package/node_modules/zod/v4/locales/ta.js +5 -0
  916. package/node_modules/zod/v4/locales/tg.cjs +144 -0
  917. package/node_modules/zod/v4/locales/tg.d.cts +5 -0
  918. package/node_modules/zod/v4/locales/tg.d.ts +4 -0
  919. package/node_modules/zod/v4/locales/tg.js +117 -0
  920. package/node_modules/zod/v4/locales/th.cjs +5 -0
  921. package/node_modules/zod/v4/locales/th.js +5 -0
  922. package/node_modules/zod/v4/locales/tk.cjs +134 -0
  923. package/node_modules/zod/v4/locales/tk.d.cts +5 -0
  924. package/node_modules/zod/v4/locales/tk.d.ts +4 -0
  925. package/node_modules/zod/v4/locales/tk.js +107 -0
  926. package/node_modules/zod/v4/locales/tr.cjs +5 -0
  927. package/node_modules/zod/v4/locales/tr.js +5 -0
  928. package/node_modules/zod/v4/locales/uk.cjs +5 -0
  929. package/node_modules/zod/v4/locales/uk.js +5 -0
  930. package/node_modules/zod/v4/locales/ur.cjs +5 -0
  931. package/node_modules/zod/v4/locales/ur.js +5 -0
  932. package/node_modules/zod/v4/locales/uz.cjs +3 -0
  933. package/node_modules/zod/v4/locales/uz.js +3 -0
  934. package/node_modules/zod/v4/locales/vi.cjs +5 -0
  935. package/node_modules/zod/v4/locales/vi.js +5 -0
  936. package/node_modules/zod/v4/locales/yo.cjs +5 -0
  937. package/node_modules/zod/v4/locales/yo.js +5 -0
  938. package/node_modules/zod/v4/locales/zh-CN.cjs +5 -0
  939. package/node_modules/zod/v4/locales/zh-CN.js +5 -0
  940. package/node_modules/zod/v4/locales/zh-TW.cjs +5 -0
  941. package/node_modules/zod/v4/locales/zh-TW.js +5 -0
  942. package/node_modules/zod/v4/mini/checks.cjs +21 -1
  943. package/node_modules/zod/v4/mini/checks.d.cts +1 -1
  944. package/node_modules/zod/v4/mini/checks.d.ts +1 -1
  945. package/node_modules/zod/v4/mini/checks.js +1 -1
  946. package/node_modules/zod/v4/mini/coerce.cjs +19 -0
  947. package/node_modules/zod/v4/mini/deep-partial.cjs +58 -0
  948. package/node_modules/zod/v4/mini/deep-partial.d.cts +14 -0
  949. package/node_modules/zod/v4/mini/deep-partial.d.ts +14 -0
  950. package/node_modules/zod/v4/mini/deep-partial.js +13 -0
  951. package/node_modules/zod/v4/mini/external.cjs +33 -1
  952. package/node_modules/zod/v4/mini/external.d.cts +5 -2
  953. package/node_modules/zod/v4/mini/external.d.ts +5 -2
  954. package/node_modules/zod/v4/mini/external.js +3 -1
  955. package/node_modules/zod/v4/mini/in-out.cjs +82 -0
  956. package/node_modules/zod/v4/mini/in-out.d.cts +8 -0
  957. package/node_modules/zod/v4/mini/in-out.d.ts +8 -0
  958. package/node_modules/zod/v4/mini/in-out.js +36 -0
  959. package/node_modules/zod/v4/mini/index.cjs +19 -0
  960. package/node_modules/zod/v4/mini/iso.cjs +19 -0
  961. package/node_modules/zod/v4/mini/parse.cjs +22 -1
  962. package/node_modules/zod/v4/mini/parse.d.cts +1 -1
  963. package/node_modules/zod/v4/mini/parse.d.ts +1 -1
  964. package/node_modules/zod/v4/mini/parse.js +1 -1
  965. package/node_modules/zod/v4/mini/schemas.cjs +117 -53
  966. package/node_modules/zod/v4/mini/schemas.d.cts +49 -14
  967. package/node_modules/zod/v4/mini/schemas.d.ts +49 -14
  968. package/node_modules/zod/v4/mini/schemas.js +92 -51
  969. package/node_modules/zod/v4-mini/index.cjs +19 -0
  970. package/package.json +172 -11
  971. package/dist/acp/index.js +0 -62
  972. package/dist/extensions/tool-gradle.js +0 -1
  973. package/dist/extensions/usage.js +0 -1
  974. package/node_modules/jose/dist/webapi/lib/base64.js +0 -22
  975. package/node_modules/jose/dist/webapi/lib/crypto_key.js +0 -28
  976. package/node_modules/jose/dist/webapi/lib/helpers.js +0 -42
  977. package/node_modules/jose/dist/webapi/lib/invalid_key_input.js +0 -26
  978. package/node_modules/jose/dist/webapi/lib/is_key_like.js +0 -17
  979. package/node_modules/jose/dist/webapi/lib/jwk_to_key.js +0 -17
  980. package/node_modules/jose/dist/webapi/lib/options.js +0 -48
  981. package/node_modules/jose/dist/webapi/lib/signing.js +0 -26
  982. package/node_modules/jose/dist/webapi/lib/type_checks.js +0 -35
  983. package/node_modules/pi-subagents/src/runs/foreground/chain-clarify.ts +0 -1354
  984. package/node_modules/pi-subagents/src/runs/foreground/chain-execution.ts +0 -1530
  985. package/node_modules/pi-subagents/src/runs/shared/turn-budget.ts +0 -98
  986. package/node_modules/zod/src/v4/core/config.ts +0 -15
  987. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/LICENSE +0 -0
  988. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/README.md +0 -0
  989. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/bin.mjs +0 -0
  990. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/compose/compose-collection.js +0 -0
  991. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/compose/compose-doc.js +0 -0
  992. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/compose/compose-node.js +0 -0
  993. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/compose/compose-scalar.js +0 -0
  994. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/compose/composer.js +0 -0
  995. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/compose/resolve-block-map.js +0 -0
  996. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/compose/resolve-block-scalar.js +0 -0
  997. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/compose/resolve-block-seq.js +0 -0
  998. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/compose/resolve-end.js +0 -0
  999. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/compose/resolve-flow-collection.js +0 -0
  1000. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/compose/resolve-flow-scalar.js +0 -0
  1001. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/compose/resolve-props.js +0 -0
  1002. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/compose/util-contains-newline.js +0 -0
  1003. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/compose/util-empty-scalar-position.js +0 -0
  1004. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/compose/util-flow-indent-check.js +0 -0
  1005. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/compose/util-map-includes.js +0 -0
  1006. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/doc/Document.js +0 -0
  1007. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/doc/anchors.js +0 -0
  1008. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/doc/applyReviver.js +0 -0
  1009. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/doc/createNode.js +0 -0
  1010. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/doc/directives.js +0 -0
  1011. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/errors.js +0 -0
  1012. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/index.js +0 -0
  1013. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/log.js +0 -0
  1014. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/nodes/Alias.js +0 -0
  1015. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/nodes/Collection.js +0 -0
  1016. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/nodes/Node.js +0 -0
  1017. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/nodes/Pair.js +0 -0
  1018. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/nodes/Scalar.js +0 -0
  1019. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/nodes/YAMLMap.js +0 -0
  1020. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/nodes/YAMLSeq.js +0 -0
  1021. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/nodes/addPairToJSMap.js +0 -0
  1022. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/nodes/identity.js +0 -0
  1023. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/nodes/toJS.js +0 -0
  1024. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/parse/cst-scalar.js +0 -0
  1025. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/parse/cst-stringify.js +0 -0
  1026. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/parse/cst-visit.js +0 -0
  1027. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/parse/cst.js +0 -0
  1028. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/parse/lexer.js +0 -0
  1029. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/parse/line-counter.js +0 -0
  1030. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/parse/parser.js +0 -0
  1031. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/public-api.js +0 -0
  1032. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/Schema.js +0 -0
  1033. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/common/map.js +0 -0
  1034. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/common/null.js +0 -0
  1035. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/common/seq.js +0 -0
  1036. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/common/string.js +0 -0
  1037. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/core/bool.js +0 -0
  1038. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/core/float.js +0 -0
  1039. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/core/int.js +0 -0
  1040. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/core/schema.js +0 -0
  1041. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/json/schema.js +0 -0
  1042. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/tags.js +0 -0
  1043. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/yaml-1.1/binary.js +0 -0
  1044. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/yaml-1.1/bool.js +0 -0
  1045. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/yaml-1.1/float.js +0 -0
  1046. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/yaml-1.1/int.js +0 -0
  1047. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/yaml-1.1/merge.js +0 -0
  1048. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/yaml-1.1/omap.js +0 -0
  1049. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/yaml-1.1/pairs.js +0 -0
  1050. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/yaml-1.1/schema.js +0 -0
  1051. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/yaml-1.1/set.js +0 -0
  1052. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/schema/yaml-1.1/timestamp.js +0 -0
  1053. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/stringify/foldFlowLines.js +0 -0
  1054. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/stringify/stringify.js +0 -0
  1055. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/stringify/stringifyCollection.js +0 -0
  1056. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/stringify/stringifyComment.js +0 -0
  1057. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/stringify/stringifyDocument.js +0 -0
  1058. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/stringify/stringifyNumber.js +0 -0
  1059. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/stringify/stringifyPair.js +0 -0
  1060. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/stringify/stringifyString.js +0 -0
  1061. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/util.js +0 -0
  1062. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/dist/visit.js +0 -0
  1063. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/index.js +0 -0
  1064. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/browser/package.json +0 -0
  1065. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/cli.d.ts +0 -0
  1066. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/cli.mjs +0 -0
  1067. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/compose-collection.d.ts +0 -0
  1068. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/compose-collection.js +0 -0
  1069. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/compose-doc.d.ts +0 -0
  1070. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/compose-doc.js +0 -0
  1071. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/compose-node.d.ts +0 -0
  1072. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/compose-node.js +0 -0
  1073. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/compose-scalar.d.ts +0 -0
  1074. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/compose-scalar.js +0 -0
  1075. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/composer.d.ts +0 -0
  1076. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/composer.js +0 -0
  1077. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/resolve-block-map.d.ts +0 -0
  1078. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/resolve-block-map.js +0 -0
  1079. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/resolve-block-scalar.d.ts +0 -0
  1080. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/resolve-block-scalar.js +0 -0
  1081. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/resolve-block-seq.d.ts +0 -0
  1082. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/resolve-block-seq.js +0 -0
  1083. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/resolve-end.d.ts +0 -0
  1084. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/resolve-end.js +0 -0
  1085. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/resolve-flow-collection.d.ts +0 -0
  1086. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/resolve-flow-collection.js +0 -0
  1087. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/resolve-flow-scalar.d.ts +0 -0
  1088. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/resolve-flow-scalar.js +0 -0
  1089. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/resolve-props.d.ts +0 -0
  1090. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/resolve-props.js +0 -0
  1091. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/util-contains-newline.d.ts +0 -0
  1092. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/util-contains-newline.js +0 -0
  1093. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/util-empty-scalar-position.d.ts +0 -0
  1094. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/util-empty-scalar-position.js +0 -0
  1095. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/util-flow-indent-check.d.ts +0 -0
  1096. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/util-flow-indent-check.js +0 -0
  1097. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/util-map-includes.d.ts +0 -0
  1098. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/compose/util-map-includes.js +0 -0
  1099. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/doc/Document.d.ts +0 -0
  1100. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/doc/Document.js +0 -0
  1101. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/doc/anchors.d.ts +0 -0
  1102. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/doc/anchors.js +0 -0
  1103. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/doc/applyReviver.d.ts +0 -0
  1104. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/doc/applyReviver.js +0 -0
  1105. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/doc/createNode.d.ts +0 -0
  1106. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/doc/createNode.js +0 -0
  1107. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/doc/directives.d.ts +0 -0
  1108. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/doc/directives.js +0 -0
  1109. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/errors.d.ts +0 -0
  1110. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/errors.js +0 -0
  1111. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/index.d.ts +0 -0
  1112. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/index.js +0 -0
  1113. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/log.d.ts +0 -0
  1114. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/log.js +0 -0
  1115. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/Alias.d.ts +0 -0
  1116. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/Alias.js +0 -0
  1117. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/Collection.d.ts +0 -0
  1118. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/Collection.js +0 -0
  1119. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/Node.d.ts +0 -0
  1120. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/Node.js +0 -0
  1121. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/Pair.d.ts +0 -0
  1122. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/Pair.js +0 -0
  1123. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/Scalar.d.ts +0 -0
  1124. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/Scalar.js +0 -0
  1125. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/YAMLMap.d.ts +0 -0
  1126. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/YAMLMap.js +0 -0
  1127. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/YAMLSeq.d.ts +0 -0
  1128. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/YAMLSeq.js +0 -0
  1129. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/addPairToJSMap.d.ts +0 -0
  1130. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/addPairToJSMap.js +0 -0
  1131. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/identity.d.ts +0 -0
  1132. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/identity.js +0 -0
  1133. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/toJS.d.ts +0 -0
  1134. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/nodes/toJS.js +0 -0
  1135. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/options.d.ts +0 -0
  1136. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/parse/cst-scalar.d.ts +0 -0
  1137. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/parse/cst-scalar.js +0 -0
  1138. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/parse/cst-stringify.d.ts +0 -0
  1139. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/parse/cst-stringify.js +0 -0
  1140. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/parse/cst-visit.d.ts +0 -0
  1141. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/parse/cst-visit.js +0 -0
  1142. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/parse/cst.d.ts +0 -0
  1143. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/parse/cst.js +0 -0
  1144. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/parse/lexer.d.ts +0 -0
  1145. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/parse/lexer.js +0 -0
  1146. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/parse/line-counter.d.ts +0 -0
  1147. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/parse/line-counter.js +0 -0
  1148. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/parse/parser.d.ts +0 -0
  1149. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/parse/parser.js +0 -0
  1150. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/public-api.d.ts +0 -0
  1151. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/public-api.js +0 -0
  1152. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/Schema.d.ts +0 -0
  1153. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/Schema.js +0 -0
  1154. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/common/map.d.ts +0 -0
  1155. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/common/map.js +0 -0
  1156. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/common/null.d.ts +0 -0
  1157. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/common/null.js +0 -0
  1158. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/common/seq.d.ts +0 -0
  1159. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/common/seq.js +0 -0
  1160. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/common/string.d.ts +0 -0
  1161. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/common/string.js +0 -0
  1162. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/core/bool.d.ts +0 -0
  1163. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/core/bool.js +0 -0
  1164. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/core/float.d.ts +0 -0
  1165. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/core/float.js +0 -0
  1166. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/core/int.d.ts +0 -0
  1167. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/core/int.js +0 -0
  1168. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/core/schema.d.ts +0 -0
  1169. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/core/schema.js +0 -0
  1170. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/json/schema.d.ts +0 -0
  1171. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/json/schema.js +0 -0
  1172. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/json-schema.d.ts +0 -0
  1173. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/tags.d.ts +0 -0
  1174. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/tags.js +0 -0
  1175. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/types.d.ts +0 -0
  1176. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/binary.d.ts +0 -0
  1177. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/binary.js +0 -0
  1178. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/bool.d.ts +0 -0
  1179. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/bool.js +0 -0
  1180. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/float.d.ts +0 -0
  1181. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/float.js +0 -0
  1182. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/int.d.ts +0 -0
  1183. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/int.js +0 -0
  1184. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/merge.d.ts +0 -0
  1185. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/merge.js +0 -0
  1186. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/omap.d.ts +0 -0
  1187. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/omap.js +0 -0
  1188. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/pairs.d.ts +0 -0
  1189. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/pairs.js +0 -0
  1190. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/schema.d.ts +0 -0
  1191. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/schema.js +0 -0
  1192. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/set.d.ts +0 -0
  1193. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/set.js +0 -0
  1194. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/timestamp.d.ts +0 -0
  1195. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/schema/yaml-1.1/timestamp.js +0 -0
  1196. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/stringify/foldFlowLines.d.ts +0 -0
  1197. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/stringify/foldFlowLines.js +0 -0
  1198. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/stringify/stringify.d.ts +0 -0
  1199. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/stringify/stringify.js +0 -0
  1200. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/stringify/stringifyCollection.d.ts +0 -0
  1201. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/stringify/stringifyCollection.js +0 -0
  1202. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/stringify/stringifyComment.d.ts +0 -0
  1203. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/stringify/stringifyComment.js +0 -0
  1204. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/stringify/stringifyDocument.d.ts +0 -0
  1205. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/stringify/stringifyDocument.js +0 -0
  1206. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/stringify/stringifyNumber.d.ts +0 -0
  1207. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/stringify/stringifyNumber.js +0 -0
  1208. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/stringify/stringifyPair.d.ts +0 -0
  1209. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/stringify/stringifyPair.js +0 -0
  1210. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/stringify/stringifyString.d.ts +0 -0
  1211. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/stringify/stringifyString.js +0 -0
  1212. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/test-events.d.ts +0 -0
  1213. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/test-events.js +0 -0
  1214. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/util.d.ts +0 -0
  1215. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/util.js +0 -0
  1216. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/visit.d.ts +0 -0
  1217. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/dist/visit.js +0 -0
  1218. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/package.json +0 -0
  1219. /package/node_modules/{yaml → pi-subagents/node_modules/yaml}/util.js +0 -0
@@ -0,0 +1,602 @@
1
+ var Cf=Object.defineProperty;var je=(t,e,n)=>()=>{if(n)throw n[0];try{return t&&(e=t(t=0)),e}catch(r){throw n=[r],r}};var Ea=(t,e)=>{for(var n in e)Cf(t,n,{get:e[n],enumerable:!0})};import{z as ae}from"zod";function yi(t){if(!t||typeof t!="object"||Array.isArray(t))return;let e=t[or],n=Ua.safeParse(e);return n.success?n.data:void 0}var gi,zr,ka,qr,or,Oa,$a,Ia,_a,Fr,xf,Mf,Ua,mi,Tf,hi,Da=je(()=>{gi="pi-mcp-adapter/stream",zr="pi-mcp-adapter/stream-token",ka="notifications/pi-mcp-adapter/ui-result-patch",qr="notifications/pi-mcp-adapter/result-patch",or="pi-mcp-adapter/stream",Oa=ae.enum(["eager","stream-first"]),$a=ae.enum(["shell","narrative","structure","detail","settled"]),Ia=ae.enum(["patch","checkpoint","final"]),_a=ae.enum(["ok","error"]),Fr=ae.record(ae.string(),ae.unknown()),xf=ae.array(ae.unknown()),Mf=ae.object({mode:Oa,streamId:ae.string().min(1),intermediateResultPatches:ae.boolean(),partialInput:ae.boolean()}),Ua=ae.object({streamId:ae.string().min(1),sequence:ae.number().int().nonnegative(),frameType:Ia,phase:$a,status:_a,message:ae.string().optional(),spec:Fr.optional(),checkpoint:Fr.optional()}),mi=ae.object({content:xf.optional(),structuredContent:Fr.optional(),isError:ae.boolean().optional(),_meta:Fr.optional()}).passthrough(),Tf=ae.object({method:ae.literal(ka),params:mi}),hi=ae.object({method:ae.literal(qr),params:ae.object({streamToken:ae.string().min(1),result:mi})})});function Kr(t){if(t.type==="prompt"||t.prompt)return(t.prompt??String(t.message??""))||void 0;if(t.role==="user"&&Array.isArray(t.content))return t.content.map(n=>n&&typeof n=="object"&&"text"in n?String(n.text??""):"").filter(Boolean).join(`
2
+
3
+ `)||void 0}function vi(t){let e=t.indexOf(`
4
+ `);if(e<=0)return;let n=t.slice(0,e).trim(),r=t.slice(e+1).trim();if(!(!n||!r)&&/^[A-Za-z][A-Za-z0-9_-]*$/.test(n))try{let o=JSON.parse(r);return!o||typeof o!="object"||Array.isArray(o)?void 0:{intent:n,params:o,raw:t}}catch{return}}function Jr(t,e=12e3){let n=Object.fromEntries(Object.entries(t).filter(([,o])=>o!==void 0));if(Object.keys(n).length===0)return;let r=JSON.stringify(n);return r.length<=e?{payload:n,summary:r,truncated:!1}:{summary:`${r.slice(0,Math.max(0,e-1))}\u2026`,truncated:!0}}function U(t){return t?.disabled===!0}function Nt(t,e=!0){let n=e?/^[A-Za-z0-9_-]$/:/^[A-Za-z0-9]$/;return Array.from(t,r=>n.test(r)?r:`_${r.codePointAt(0).toString(16)}_`).join("")}function gn(t,e){if(e==="none")return"";if(e==="short"){let n=Nt(t.replace(/-?mcp$/i,""));return n||(n="mcp"),n}return e==="mcp"?`mcp__${Nt(t)}`:Nt(t)}function se(t,e,n){let r=gn(e,n),o=t.replace(/\./g,"_");return r?`${r}_${o}`:o}function pe(t,e){return t?.toolPrefix??e??"server"}function Af(t){let e=t.replace(/[^A-Za-z0-9_-]+/g,"_").replace(/^[_-]+|[_-]+$/g,"");return e?/^[0-9]/.test(e)?`_${e}`:e:"prompt"}function wi(t,e,n){return`mcp__${gn(e,n)||Nt(e)||"server"}__${Af(t)}`}function Pf(t,e){return e==="none"?"":e==="short"?Nt(t.replace(/-?mcp$/i,""),!1)||"mcp":e==="mcp"?`mcp__${Nt(t,!1)}`:Nt(t,!1)}function Vr(t,e,n){let r=Pf(e,n),o=t.replace(/[.-]/g,"_");return r?`${r}_${o}`:o}function ce(t,e,n,r=!0){let o=new Set([t,se(t,e,n),se(t,e,"server"),se(t,e,"short"),se(t,e,"mcp")]);if(r){let i=t.replace(/-/g,"_");o.add(i),o.add(se(i,e,n)),o.add(se(i,e,"server")),o.add(se(i,e,"short")),o.add(se(i,e,"mcp")),o.add(Vr(t,e,n)),o.add(Vr(t,e,"server")),o.add(Vr(t,e,"short")),o.add(Vr(t,e,"mcp")),o.add(se(t,e,n).replace(/-/g,"_")),o.add(se(t,e,"server").replace(/-/g,"_")),o.add(se(t,e,"short").replace(/-/g,"_")),o.add(se(t,e,"mcp").replace(/-/g,"_"))}return o}function Na(t){let e=t.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*").replace(/\?/g,".");return new RegExp(`^${e}$`)}function mn(t,e){return{allCurrentCandidates:t,matchingCountByPattern:new Map,matcherByPattern:new Map,...e?{additionalCurrentCandidatesByToolName:e}:{}}}function Be(t,e){if(!Array.isArray(e)||e.length===0)return!1;for(let n of e)if(typeof n=="string"&&(!n.includes("*")&&!n.includes("?")&&t.has(n)||(n.includes("*")||n.includes("?"))&&[...t].some(r=>Na(n).test(r))))return!0;return!1}function Rf(t,e,n,r){let o=t.additionalCurrentCandidatesByToolName?.get(e),i=l=>t.allCurrentCandidates.has(l)||o?.has(l)===!0;if(!(r.includes("*")||r.includes("?")))return i(r)&&!n.has(r);let a=t.matcherByPattern.get(r);a||(a=Na(r),t.matcherByPattern.set(r,a));let c=t.matchingCountByPattern.get(r);if(c===void 0){c=0;for(let l of t.allCurrentCandidates)a.test(l)&&c++;t.matchingCountByPattern.set(r,c)}let u=c;if(o)for(let l of o)!t.allCurrentCandidates.has(l)&&a.test(l)&&u++;if(u===0)return!1;let d=0;for(let l of n)i(l)&&a.test(l)&&d++;return u>d}function La(t,e,n,r,o){if(!Array.isArray(r)||r.length===0)return!1;let i=ce(t,e,n,!1);if(Be(i,r))return!0;if(!o)return Be(ce(t,e,n),r);let s=ce(t,e,n);for(let a of i)s.delete(a);return r.some(a=>typeof a!="string"||!Be(s,[a])?!1:!(o instanceof Set?Be(o,[a]):Rf(o,t,i,a)))}function Ef(t,e,n,r,o){return!Array.isArray(r)||r.length===0?!0:La(t,e,n,r,o)}function kf(t,e,n,r,o){return La(t,e,n,r,o)}function Ee(t,e,n,r,o,i){return Ef(t,e,n,r,i)&&!kf(t,e,n,o,i)}var ir,sr,Si,ue=je(()=>{Da();ir="pi-mcp-adapter/status/v1",sr=1;Si="pi-mcp-adapter:tool-approval-request"});import{readFileSync as Of}from"node:fs";import{homedir as bi}from"node:os";import{join as xi,resolve as Ci}from"node:path";function bt(){let t=Gr()?.configDir;return typeof t=="string"&&t.trim()?t.trim():".pi"}function Wr(){let e=Gr()?.name,n=typeof e=="string"&&e.trim()?e.trim():"pi",r=process.env[`${n.toUpperCase()}_CODING_AGENT_DIR`]?.trim();return r?r==="~"?bi():r.startsWith("~/")?Ci(bi(),r.slice(2)):Ci(r):xi(bi(),bt(),"agent")}function Qe(...t){return xi(Wr(),...t)}function Gr(){let t=process.env.PI_PACKAGE_DIR?.trim();if(t)try{return JSON.parse(Of(xi(Ci(t),"package.json"),"utf8")).piConfig}catch{return}}function Lt(){let t=Gr()?.name;return typeof t=="string"&&t.trim()?t.trim():"pi"}function ja(){let t=Gr()?.clientUri;return typeof t=="string"&&t.trim()?t.trim():void 0}var tt=je(()=>{});import{existsSync as Ha,readFileSync as Fa,statSync as za}from"node:fs";import{isAbsolute as qa,relative as $f,resolve as jt,sep as If}from"node:path";function Va(t,e=process.cwd()){let n={};for(let r of Ja(t)){let o=Wa(r,e);if(o)for(let[i,s]of Object.entries(o.mcpServers)){if(n[i]){console.warn(`Agent Plugin at ${Mi(r,e)} skips duplicate normalized MCP server ${i}`);continue}n[i]=s}}return{mcpServers:n}}function Ka(t,e=process.cwd()){return Ja(t).map(n=>{let r=Mi(n,e),o=Wa(n,e),i=o?Ga(r,!1):null;return{path:r,...i?.name?{name:i.name}:{},serverCount:o?Object.keys(o.mcpServers).length:0}})}function Ja(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"):[]}function Wa(t,e){let n=Mi(t,e),r=Ga(n,!0);if(!r)return null;let o=jt(n,"mcp.json");if(!Ha(o))return{mcpServers:{}};if(!za(o).isFile())return console.warn(`Agent Plugin ${r.name} has invalid MCP config: mcp.json is not a regular file`),{mcpServers:{}};let i;try{i=JSON.parse(Fa(o,"utf8"))}catch(s){return console.warn(`Agent Plugin ${r.name} has invalid MCP config: failed to parse mcp.json`,s),{mcpServers:{}}}return Hf(i,r,n)}function Ga(t,e){let n=jt(t,"plugin.json");if(!Ha(n))return e&&console.warn(`Agent Plugin at ${t} is invalid: missing plugin.json`),null;if(!za(n).isFile())return e&&console.warn(`Agent Plugin at ${t} is invalid: plugin.json is not a regular file`),null;let r;try{r=JSON.parse(Fa(n,"utf8"))}catch(i){return e&&console.warn(`Agent Plugin at ${t} is invalid: failed to parse plugin.json`,i),null}if(!r||typeof r!="object"||Array.isArray(r))return e&&console.warn(`Agent Plugin at ${t} is invalid: plugin.json must be an object`),null;let o=r;for(let i of Object.keys(o))!Nf.has(i)&&e&&console.warn(`Agent Plugin at ${t} ignores unknown plugin.json field: ${i}`);return o.$schema!==_f?(e&&console.warn(`Agent Plugin at ${t} is invalid: unsupported plugin.json $schema`),null):typeof o.name!="string"||o.name.length<1||o.name.length>64||!Df.test(o.name)?(e&&console.warn(`Agent Plugin at ${t} is invalid: plugin.json name is invalid`),null):(o.extensions!==void 0&&(!o.extensions||typeof o.extensions!="object"||Array.isArray(o.extensions))&&e&&console.warn(`Agent Plugin ${o.name} ignores non-object plugin.json extensions`),{name:o.name})}function Hf(t,e,n){if(!t||typeof t!="object"||Array.isArray(t))return console.warn(`Agent Plugin ${e.name} has invalid MCP config: mcp.json must be an object`),{mcpServers:{}};let r=t;for(let i of Object.keys(r))if(!Lf.has(i))return console.warn(`Agent Plugin ${e.name} has invalid MCP config: unknown top-level field ${i}`),{mcpServers:{}};if(r.$schema!==Uf)return console.warn(`Agent Plugin ${e.name} has invalid MCP config: unsupported mcp.json $schema`),{mcpServers:{}};if(!r.mcpServers||typeof r.mcpServers!="object"||Array.isArray(r.mcpServers))return console.warn(`Agent Plugin ${e.name} has invalid MCP config: mcpServers must be an object`),{mcpServers:{}};let o={};for(let[i,s]of Object.entries(r.mcpServers)){let a=Ff(e,n,i,s);if(!a)continue;let c=Vf(e.name,i);if(o[c]){console.warn(`Agent Plugin ${e.name} skips invalid MCP server ${i}: normalized server name ${c} already exists`);continue}o[c]=a}return{mcpServers:o}}function Ff(t,e,n,r){if(!r||typeof r!="object"||Array.isArray(r))return console.warn(`Agent Plugin ${t.name} skips invalid MCP server ${n}: entry must be an object`),null;let o=r;return o.type==="stdio"?zf(t,e,n,o):o.type==="streamable-http"||o.type==="sse"?qf(t,n,o,o.type):(console.warn(`Agent Plugin ${t.name} skips invalid MCP server ${n}: unsupported type`),null)}function zf(t,e,n,r){for(let u of Object.keys(r))if(!jf.has(u))return Ct(t,n,`unknown field ${u}`);if(typeof r.command!="string"||r.command.length===0)return Ct(t,n,"command must be a non-empty string");if(!Gf(r.command)&&!r.command.startsWith("./"))return Ct(t,n,"command must be bare or plugin-relative");let o=Kf(r.args,t,n,"args");if(o===null)return null;let i=Jf(r.env,t,n);if(i===null)return null;let s=r.command.startsWith("./")?Yr(e,r.command,e):r.command;if(s===null)return Ct(t,n,"command must stay inside the plugin directory");let a=Qe("agent-plugin-data",t.name),c=Yf(r.cwd,e,a);return c===null?Ct(t,n,"cwd must be plugin-relative, PLUGIN_ROOT-rooted, or PLUGIN_DATA-rooted"):{command:s,args:o.map(u=>Ba(u,e,a)),env:{...Object.fromEntries(Object.entries(i).map(([u,d])=>[u,Ba(d,e,a)])),PLUGIN_ROOT:e,PLUGIN_DATA:a},cwd:c,pluginDataDir:a,literalEnv:!0}}function qf(t,e,n,r){for(let i of Object.keys(n))if(!Bf.has(i))return Ct(t,e,`unknown field ${i}`);if(typeof n.url!="string"||n.url.length===0)return Ct(t,e,"url must be a non-empty string");if(!Xf(n.url))return Ct(t,e,"url must be an allowed absolute HTTP(S) URL");let o=Wf(n.headers,t,e);return o===null?null:{url:n.url,httpTransport:r,...o?{headers:o}:{}}}function Vf(t,e){let n=t.replace(/[^A-Za-z0-9_-]+/g,"_").replace(/^[_-]+|[_-]+$/g,"")||"plugin",r=e.replace(/[^A-Za-z0-9_-]+/g,"_").replace(/^[_-]+|[_-]+$/g,"")||"server";return`${n}__${r}`}function Ct(t,e,n){return console.warn(`Agent Plugin ${t.name} skips invalid MCP server ${e}: ${n}`),null}function Kf(t,e,n,r){return t===void 0?[]:!Array.isArray(t)||t.some(o=>typeof o!="string")?(console.warn(`Agent Plugin ${e.name} skips invalid MCP server ${n}: ${r} must be an array of strings`),null):t}function Jf(t,e,n){if(t===void 0)return{};if(!t||typeof t!="object"||Array.isArray(t))return console.warn(`Agent Plugin ${e.name} skips invalid MCP server ${n}: env must be an object of strings`),null;let r={};for(let[o,i]of Object.entries(t)){if(o==="PLUGIN_ROOT"||o==="PLUGIN_DATA")return console.warn(`Agent Plugin ${e.name} skips invalid MCP server ${n}: env must not define ${o}`),null;if(typeof i!="string")return console.warn(`Agent Plugin ${e.name} skips invalid MCP server ${n}: env values must be strings`),null;r[o]=i}return r}function Wf(t,e,n){if(t===void 0)return;if(!t||typeof t!="object"||Array.isArray(t))return console.warn(`Agent Plugin ${e.name} skips invalid MCP server ${n}: headers must be an object of strings`),null;let r={},o=new Set;for(let[i,s]of Object.entries(t)){if(typeof s!="string")return console.warn(`Agent Plugin ${e.name} skips invalid MCP server ${n}: header values must be strings`),null;let a=i.toLowerCase();if(o.has(a))return console.warn(`Agent Plugin ${e.name} skips invalid MCP server ${n}: duplicate header ${i}`),null;o.add(a),r[i]=s}try{new Headers(r)}catch{return console.warn(`Agent Plugin ${e.name} skips invalid MCP server ${n}: headers are not valid HTTP fields`),null}return Object.keys(r).length>0?r:void 0}function Mi(t,e){return t==="~"?jt(process.env.HOME??"","."):t.startsWith("~/")?jt(process.env.HOME??"",t.slice(2)):qa(t)?jt(t):jt(e,t)}function Gf(t){return!t.includes("/")&&!t.includes("\\")&&!t.includes("${PLUGIN_ROOT}")&&!t.includes("${PLUGIN_DATA}")}function Yf(t,e,n){return t===void 0?e:typeof t!="string"?null:t.startsWith("./")?Yr(e,t,e):t==="${PLUGIN_ROOT}"||t.startsWith("${PLUGIN_ROOT}/")?Yr(e,t.replace("${PLUGIN_ROOT}","."),e):t==="${PLUGIN_DATA}"||t.startsWith("${PLUGIN_DATA}/")?Yr(n,t.replace("${PLUGIN_DATA}","."),n):null}function Yr(t,e,n){let r=jt(t,e),o=$f(n,r);return o===""||!o.startsWith("..")&&!o.startsWith(If)&&!qa(o)?r:null}function Ba(t,e,n){return t.replaceAll("${PLUGIN_ROOT}",e).replaceAll("${PLUGIN_DATA}",n)}function Xf(t){if(t.includes("${")||t.includes("$env:")||t.includes("{env:"))return!1;let e;try{e=new URL(t)}catch{return!1}return e.protocol!=="http:"&&e.protocol!=="https:"||e.username||e.password||e.hash?!1:e.protocol==="https:"?!0:Qf(e.hostname)}function Qf(t){let e=t.toLowerCase();return!!(e==="localhost"||e==="127.0.0.1"||e==="::1"||e==="[::1]"||/^127(?:\.\d{1,3}){3}$/.test(e))}var _f,Uf,Df,Nf,Lf,jf,Bf,Ya=je(()=>{tt();_f="https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",Uf="https://agent-plugins.org/schemas/1.0.0/mcp.schema.json",Df=/^(?!.*(?:--|\.\.))[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$/,Nf=new Set(["$schema","name","version","description","author","homepage","repository","license","keywords","extensions"]),Lf=new Set(["$schema","mcpServers"]),jf=new Set(["type","command","args","env","cwd"]),Bf=new Set(["type","url","headers"])});import{existsSync as Qa,readFileSync as Zf,realpathSync as Xa,statSync as ep}from"node:fs";import{isAbsolute as Za,join as hn,relative as tp,resolve as Ti,sep as np}from"node:path";import rp from"strip-json-comments";function ec(t=process.cwd()){let e={},n=new Set;for(let r of op(t)){let o=sp(r);if(!o||typeof o.name!="string"||!o.name)continue;let i=ap(o.pi?.mcp,o.name);if(!i)continue;let s=lp(o.name),a=new Set;for(let c of i){let u=up(r,c);if(!u){console.warn(`Pi package ${o.name} skips MCP config ${c}: file must stay inside the package`);continue}let d=cp(u,o.name);if(d)for(let[l,f]of Object.entries(d.mcpServers)){let p=`${s}__${dp(l)}`;if(a.has(p)||n.has(p)){console.warn(`Pi package ${o.name} skips duplicate normalized MCP server ${p}`);continue}a.add(p),n.add(p),e[p]=f}}}return{mcpServers:e}}function op(t){let e=[];for(let[n,r]of[[hn(t,bt(),"settings.json"),"project"],[hn(Wr(),"settings.json"),"user"]]){let o=nc(n,`${r} Pi settings`);if(o===void 0)continue;if(typeof o!="object"||o===null||Array.isArray(o))throw new Error(`${r} Pi settings ${n} must be a JSON object`);let i=o.packages;if(i!==void 0){if(!Array.isArray(i))throw new Error(`${r} Pi settings ${n} packages must be an array`);for(let s of i){let a=typeof s=="string"?s:s&&typeof s=="object"&&!Array.isArray(s)&&typeof s.source=="string"?s.source:void 0;if(!a)throw new Error(`${r} Pi settings ${n} package entries must be strings or objects with a string source`);let c=ip(a,r,t);c&&!e.includes(c)&&e.push(c)}}}return e}function ip(t,e,n){let r=e==="user"?Wr():hn(n,bt());if(t.startsWith("npm:")){let i=t.slice(4).trim().match(/^(@?[^@]+(?:\/[^@]+)?)/)?.[1];return i?Xr(hn(r,"npm","node_modules"),i):null}let o=t.startsWith("git:")?t.slice(4).trim():/^(?:(?:https?|ssh):\/\/|git@[^:]+:)/.test(t)?t:null;if(o){let s=o.replace(/^ssh:\/\/git@/,"").replace(/^git@([^:]+):/,"$1/").replace(/^[a-z]+:\/\//i,"").replace(/@[^/]+$/,"").replace(/\.git$/,"");return s&&!s.startsWith("/")?Xr(hn(r,"git"),s):null}return Za(t)?Ti(t):Ti(r,t)}function sp(t){let e=nc(hn(t,"package.json"),`Pi package manifest ${t}`);return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function ap(t,e){let n=typeof t=="string"?[t]:Array.isArray(t)&&t.every(r=>typeof r=="string")?t:null;return t!==void 0&&!n&&console.warn(`Pi package ${e} ignores invalid pi.mcp manifest entry`),n}function cp(t,e){let n=tc(t,`Pi package ${e} MCP config`);if(!n||typeof n!="object"||Array.isArray(n))throw new Error(`Pi package ${e} MCP config ${t} must be a JSON object`);let r=n.mcpServers;if(!r||typeof r!="object"||Array.isArray(r))throw new Error(`Pi package ${e} MCP config ${t} must contain a JSON object mcpServers field`);let o={};for(let[i,s]of Object.entries(r)){if(!s||typeof s!="object"||Array.isArray(s))throw new Error(`Pi package ${e} MCP config ${t} server ${i} must be a JSON object`);o[i]=s}return{mcpServers:o}}function tc(t,e){try{return JSON.parse(rp(Zf(t,"utf8"),{trailingCommas:!0}))}catch(n){throw new Error(`${e} ${t} contains invalid JSON: ${n instanceof Error?n.message:String(n)}`,{cause:n})}}function nc(t,e){if(Qa(t))return tc(t,e)}function Xr(t,e){let n=Ti(t,e),r=tp(t,n);return r===""||!r.startsWith("..")&&!r.startsWith(np)&&!Za(r)?n:null}function up(t,e){let n=Xr(t,e);if(!n||!Qa(n)||!ep(n).isFile())return null;try{let r=Xa(t),o=Xa(n);return Xr(r,o)}catch{return null}}function lp(t){return t.replace(/[^A-Za-z0-9_-]+/g,"_").replace(/^[_-]+|[_-]+$/g,"")||"package"}function dp(t){return t.replace(/[^A-Za-z0-9_-]+/g,"_").replace(/^[_-]+|[_-]+$/g,"")||"server"}var rc=je(()=>{tt()});import{spawnSync as fp}from"node:child_process";import{homedir as oc,platform as pp}from"node:os";import{extname as gp,isAbsolute as mp,join as hp}from"node:path";async function ic(t,e,n,r){let o=pp();return o==="darwin"?n?mp(n)&&gp(n).toLowerCase()!==".app"?t.exec(n,[e],r?{signal:r}:{}):t.exec("open",["-a",n,e],r?{signal:r}:{}):t.exec("open",[e],r?{signal:r}:{}):o==="win32"?n?t.exec("cmd",["/c","start","",n,e],r?{signal:r}:{}):t.exec("cmd",["/c","start","",e],r?{signal:r}:{}):n?t.exec(n,[e],r?{signal:r}:{}):t.exec("xdg-open",[e],r?{signal:r}:{})}async function sc(t,e,n,r){let o=await ic(t,e,n,r);if(o.code!==0)throw new Error(o.stderr||`Failed to open browser (exit code ${o.code})`)}async function ac(t,e){let n=await ic(t,e);if(n.code!==0)throw new Error(n.stderr||`Failed to open path (exit code ${n.code})`)}async function ar(t,e,n){let r=[],o=t.entries();async function i(){for(;;){let a=o.next();if(a.done)return;let[c,u]=a.value;r[c]=await n(u)}}let s=Array(Math.min(e,t.length)).fill(null).map(()=>i());return await Promise.all(s),r}function cc(){let t=process.argv.indexOf("--mcp-config");if(t>=0&&t+1<process.argv.length)return process.argv[t+1]}function le(t,e=process.env){return t.replace(/\$\{(\w+)\}/g,(n,r)=>e[r]??"").replace(/\$env:(\w+)/g,(n,r)=>e[r]??"").replace(/\{env:(\w+)\}/g,(n,r)=>e[r]??"")}function yp(t,e){let n=new Set;for(let r of t.matchAll(/\$\{(\w+)\}|\$env:(\w+)|\{env:(\w+)\}/g)){let o=r[1]??r[2]??r[3];o&&e[o]===void 0&&n.add(o)}return[...n]}function Pi(t){if(!t||typeof t!="object"||Array.isArray(t))return;let e={};for(let[n,r]of Object.entries(t))typeof r=="string"&&(e[n]=r);return Object.keys(e).length>0?e:void 0}function uc(t,e){return t.startsWith("!!")?le(t.slice(1),e):t.startsWith("!")?t:le(t,e)}function yn(t,e=process.env){if(t)return Object.fromEntries(Object.entries(t).map(([n,r])=>[n,uc(r,e)]))}function cr(t,e){if(t===void 0)return;if(t.startsWith("!!"))return le(t.slice(1));if(!t.startsWith("!"))return le(t);let n=fp(t.slice(1),{shell:!0,encoding:"utf8",timeout:vp,maxBuffer:Sp,stdio:["ignore","pipe","ignore"],windowsHide:!0});if(n.error){let o=n.error.code,i=o==="ETIMEDOUT"?"command timed out after 10 seconds":o==="ENOBUFS"?"command output exceeded 1 MiB":"command failed to start";throw new Error(`Failed to resolve ${e}: ${i}`)}if(n.status!==0)throw new Error(`Failed to resolve ${e}: command exited with code ${n.status??"unknown"}`);let r=n.stdout.trim();if(!r)throw new Error(`Failed to resolve ${e}: command returned empty output`);return r}function Ri(t,e){if(t)return Object.fromEntries(Object.entries(t).map(([n,r])=>[n,cr(r,e(n))]))}function He(t,e=process.env){if(t.url==null)return;if(typeof t.url!="string")throw new Error("MCP server URL must be a string");let n=yp(t.url,e);if(n.length>0)throw new Error(`Missing environment variable${n.length===1?"":"s"} in MCP server URL: ${n.join(", ")}`);let r=le(t.url,e);try{new URL(r)}catch(o){throw new Error(`Invalid MCP server URL after environment interpolation: ${r}`,{cause:o})}return r}function vn(t,e=process.env){if(t===void 0)return;let n=le(t,e);return n==="~"?oc():n.startsWith("~/")||n.startsWith("~\\")?hp(oc(),n.slice(2)):n}function Qr(t,e=process.env){return t.bearerToken!==void 0?uc(t.bearerToken,e):t.bearerTokenEnv?e[t.bearerTokenEnv]:void 0}function Ei(t){let e="",n=0;for(;n<t.length;){let r=t.charCodeAt(n)===27&&t[n+1]==="]",o=t.charCodeAt(n)===157;if(!r&&!o){e+=t[n++];continue}for(n+=r?2:1;n<t.length;){let i=t.charCodeAt(n++);if(i===7||i===156)break;if(i===27&&t[n]==="\\"){n++;break}}}return e}function de(t){return Ei(t).replace(/(?:\x1b\[[0-?]*[ -/]*[@-~]|\x1b[@-Z\\-_])/g,"").replace(/[\u0000-\u001f\u007f-\u009f]+/g," ").replace(/\s+/g," ").trim()}function _e(t){let e=[],n=new Set,r=o=>{if(!n.has(o)){if((typeof o=="object"&&o!==null||typeof o=="function")&&n.add(o),o instanceof AggregateError){let i=e.length;for(let s of o.errors)r(s);o.cause!==void 0&&r(o.cause),e.length===i&&o.message&&e.push(o.message);return}if(o instanceof Error){o.message&&e.push(o.message),o.cause!==void 0&&r(o.cause);return}e.push(String(o))}};return r(t),de([...new Set(e)].join(": "))}function Ve(t,e){if(!t||t.length<=e)return t;let n=t.slice(0,e),r=n.lastIndexOf(" ");return r>e*.6?n.slice(0,r)+"...":n+"..."}function lc(t){let e=t&&typeof t=="object"&&!Array.isArray(t)?t:{type:"object",properties:{}},{$schema:n,additionalProperties:r,...o}=e;return o}function Sn(t,e="tool arguments"){if(t==null||t==="")return{};if(typeof t=="string"){let n=t.trim();if(n==="")return{};let r;try{r=JSON.parse(n)}catch(o){throw new Error(`${e}: invalid args JSON (${o instanceof SyntaxError?o.message:String(o)}); pass args as a JSON object, or as a valid JSON string encoding one`,{cause:o})}if(typeof r!="object"||r===null||Array.isArray(r))throw new Error(`${e}: expected a JSON object, got ${Array.isArray(r)?"array":typeof r}`);return r}if(typeof t!="object"||Array.isArray(t))throw new Error(`${e}: expected a JSON object, got ${Array.isArray(t)?"array":typeof t}`);Ai(t,e);try{return JSON.parse(JSON.stringify(t))}catch(n){throw new Error(`${e}: value is not JSON-serializable: ${n instanceof Error?n.message:String(n)}`,{cause:n})}}function Ai(t,e,n=""){if(t!==null&&!(typeof t=="string"||typeof t=="boolean")){if(typeof t=="number"){if(!Number.isFinite(t))throw new Error(`${e}: value at ${n||"root"} is not a finite number`);return}if(Array.isArray(t)){for(let[r,o]of t.entries())Ai(o,e,`${n}[${r}]`);return}if(typeof t=="object"){if(Object.getPrototypeOf(t)!==Object.prototype&&Object.getPrototypeOf(t)!==null)throw new Error(`${e}: value at ${n||"root"} is not a plain JSON object`);if(Object.getOwnPropertySymbols(t).length>0)throw new Error(`${e}: value at ${n||"root"} has symbol keys`);for(let[r,o]of Object.entries(t))Ai(o,e,n?`${n}.${r}`:r);return}throw new Error(`${e}: value at ${n||"root"} is not JSON-serializable`)}}function wn(t,e,n){let r=t.settings?.authRequiredMessage;return r?r.replaceAll("${server}",e):n}function Bt(t,e){if(t.settings?.mcpFooterStatus!=="off")return`${t.settings?.showStatusIcon===!1?"MCP: ":"\u{1F50C} MCP: "}${e}`}function Zr(t){let e=t?.ui;if(!e||typeof e!="object")return;let n=e["pi-mcp-adapter.streamMode"];if(n==="eager"||n==="stream-first")return n}var vp,Sp,be=je(()=>{vp=1e4,Sp=1024*1024});import{existsSync as Fe,readFileSync as no,writeFileSync as wp,mkdirSync as bp,renameSync as Cp}from"node:fs";import{homedir as Ke}from"node:os";import{dirname as to,join as ye,resolve as Ft}from"node:path";import{parse as xp}from"smol-toml";import Mp from"strip-json-comments";function ro(t){return t?Ft(t):Qe("mcp.json")}function Cn(t=process.cwd()){return Ft(t,Oi)}function mc(t=process.cwd()){return Ft(t,bt(),Ap)}function hc(t){return t.map(e=>{let n=xt(e.readPath,`MCP config from ${e.readPath}`);return{id:e.id,label:e.label,path:e.readPath,exists:Fe(e.readPath),scope:e.scope,kind:e.shared?"shared":"pi",serverCount:n?Object.keys(n.mcpServers).length:0}})}function yc(t,e=process.cwd()){let n=hc(xn(t,e));return{sources:n,hasSharedServers:n.some(r=>r.kind==="shared"&&r.serverCount>0),fingerprint:JSON.stringify({sources:n.map(r=>[r.id,r.exists,r.serverCount])})}}function oo(t,e=process.cwd(),n={}){let r=xn(t,e),o=hc(r),i=n.includeHostConfigs!==!1,s=Ht()?xt(Sc(t),"MCP exclusive config")?.imports??[]:Object.keys(ur),a=i?s.map(m=>{let S=zt(m,e,`Failed to inspect imported MCP config from ${m}:`);return S?{kind:m,path:S.path,serverCount:Object.keys(qt(S.value,m)).length}:null}).filter(m=>m!==null):[],c=Ht()?"off":$i(t,e),u=a.map(m=>({...m,active:c==="on"})),d=vc(t,e),l=Ht()?[]:Ka(d?.agentPluginPaths,e),f=o.reduce((m,S)=>m+S.serverCount,0)+l.reduce((m,S)=>m+S.serverCount,0),p=o.some(m=>m.kind==="shared"&&m.serverCount>0)||l.some(m=>m.serverCount>0),g=o.some(m=>m.kind==="pi"&&m.serverCount>0),y=o.some(m=>m.exists)||a.length>0||l.length>0,w=f>0||a.some(m=>m.serverCount>0)||y,b={sources:o,imports:a,hostConfigs:u,hostConfigDiscovery:c,agentPlugins:l,conflicts:Ep(r,a,e),hasAnyConfig:w,hasAnyDetectedPaths:y,hasSharedServers:p,hasPiOwnedServers:g,totalServerCount:f},v=JSON.stringify({sources:o.map(m=>[m.id,m.exists,m.serverCount]),imports:a.map(m=>[m.kind,m.path,m.serverCount]),agentPlugins:l.map(m=>[m.path,m.name,m.serverCount]),hostConfigDiscovery:c,conflicts:b.conflicts});return{...b,fingerprint:v,repoPrompt:Bp(b,e)}}function Vt(t){return structuredClone(t)}function io(t,e=process.cwd()){let n=xn(t,e),r=$i(t,e),o=!Ht()&&r==="on"?Rp(e):{mcpServers:{}};for(let c of n){let u=xt(c.readPath,`MCP config from ${c.readPath}`);u&&(o=bn(o,ki(u,e)))}if(Ht())return o;let i=ec(e),s=Va(o.settings?.agentPluginPaths,e),a=Object.fromEntries(Object.entries(i.mcpServers).filter(([c])=>!Object.hasOwn(s.mcpServers,c)));return bn({mcpServers:a},bn(s,o))}function vc(t,e=process.cwd()){let n;for(let r of xn(t,e)){let o=xt(r.readPath,`MCP config from ${r.readPath}`);o?.settings&&(n={...n,...o.settings})}return n}function $i(t,e=process.cwd()){let n="off",o=vc(t,e)?.hostConfigDiscovery;return(o==="off"||o==="prompt"||o==="on")&&(n=o),n}function Rp(t){let e={mcpServers:{}};for(let n of Object.keys(ur)){let r=zt(n,t,`Failed to discover imported MCP config from ${n}:`);r&&(e=bn(e,{mcpServers:qt(r.value,n)}))}return e}function Ep(t,e,n){let r=new Map,o=(i,s)=>{let a=r.get(i)??[];a.some(c=>c.kind===s.kind&&c.path===s.path)||a.push(s),r.set(i,a)};for(let i of e){let s=zt(i.kind,n,`Failed to inspect imported MCP config from ${i.kind}:`);if(s)for(let a of Object.keys(qt(s.value,i.kind)))o(a,{kind:"host",path:s.path})}for(let i of t){let s=xt(i.readPath,`MCP config from ${i.readPath}`);if(s){if(s.imports?.length)for(let a of s.imports){let c=zt(a,n,`Failed to inspect imported MCP config from ${a}:`);if(c)for(let u of Object.keys(qt(c.value,a)))o(u,{kind:"host",path:c.path})}for(let a of Object.keys(s.mcpServers))o(a,{kind:i.shared?"shared":"pi",path:i.readPath})}}return[...r.entries()].filter(([,i])=>i.length>1).map(([i,s])=>({serverName:i,sources:s,winner:s[s.length-1]})).sort((i,s)=>i.serverName.localeCompare(s.serverName))}function xn(t,e=process.cwd()){let n=Sc(t),r=Cn(e),o=mc(e),i=[];if(Ht())return[{id:"pi-global",label:"Pi exclusive config",readPath:n,writePath:n,kind:"user",shared:!1,scope:"global"}];eo!==n&&i.push({id:"shared-global",label:"user-global standard MCP",readPath:eo,writePath:n,kind:"import",importKind:"global MCP config",shared:!0,scope:"global"});for(let[s,a]of Tp.entries())a===n||a===eo||i.push({id:s===0?"agents-global":"agents-nested-global",label:s===0?"user-global .agents MCP":"user-global .agents nested MCP",readPath:a,writePath:n,kind:"import",importKind:s===0?".agents MCP config":".agents/mcp MCP config",shared:!0,scope:"global"});return i.push({id:"pi-global",label:"Pi global override",readPath:n,writePath:n,kind:"user",shared:!1,scope:"global"}),r!==n&&i.push({id:"shared-project",label:"project standard MCP",readPath:r,writePath:r,kind:"project",shared:!0,scope:"project"}),o!==n&&o!==r&&i.push({id:"pi-project",label:"project Pi override",readPath:o,writePath:o,kind:"project",shared:!1,scope:"project"}),i}function Ht(){return process.env.PI_MCP_CONFIG_MODE?.trim().toLowerCase()==="exclusive"}function Sc(t){return ro(Ht()?void 0:t)}function bn(t,e){let n=Op(t.imports,e.imports),r=e.settings?{...t.settings,...e.settings}:t.settings;return{mcpServers:wc(t.mcpServers,e.mcpServers),...n!==void 0?{imports:n}:{},...r!==void 0?{settings:r}:{}}}function wc(t,e){let n={...t};for(let[r,o]of Object.entries(e)){let i=n[r],s=i??{};if(i&&typeof o.command=="string"){s={...i};for(let a of["url","headers","requestHeadersCommand","auth","bearerToken","bearerTokenEnv","oauth","httpTransport","socket"])delete s[a]}else if(i&&typeof o.url=="string"){s={...i};for(let a of["command","args","env","cwd","pluginDataDir","literalEnv","socket"])delete s[a]}else if(i&&typeof o.socket=="string"){s={...i};for(let a of["command","args","env","cwd","pluginDataDir","literalEnv","url","headers","requestHeadersCommand","auth","bearerToken","bearerTokenEnv","oauth","httpTransport"])delete s[a]}if(i&&typeof o.url=="string"&&o.url!==i.url){s===i&&(s={...i});for(let a of kp)delete s[a];s.oauth!==!1&&delete s.oauth}n[r]={...s,...o}}return n}function Op(t,e){let n=[...t??[],...e??[]];if(n.length!==0)return[...new Set(n)]}function ki(t,e=process.cwd()){if(!t.imports?.length)return t;let n={};for(let r of t.imports){let o=zt(r,e,`Failed to import MCP config from ${r}:`);if(!o)continue;let i=qt(o.value,r);for(let[s,a]of Object.entries(i))n[s]||(n[s]=a)}return{imports:t.imports,...t.settings!==void 0?{settings:t.settings}:{},mcpServers:wc(n,t.mcpServers)}}function dc(t,e){return(ur[t]??[]).map(n=>{if(t==="opencode"&&n==="./opencode.json"){let r=Ft(e),o,i=r;for(;;){if(Fe(ye(i,".git"))){o=i;break}let s=to(i);if(s===i)break;i=s}if(!o)return ye(r,"opencode.json");for(i=r;;){let s=ye(i,"opencode.json");if(Fe(s)||i===o)return s;i=to(i)}}return n.startsWith(".")?Ft(e,n):n})}function so(t){return JSON.parse(Mp(t,{trailingCommas:!0}))}function fc(t){let e=no(t,"utf-8");return t.endsWith(".toml")?xp(e):so(e)}function zt(t,e,n){if(t==="opencode"){let r={},o;for(let i of dc(t,e))if(Fe(i))try{let s=fc(i);s&&typeof s=="object"&&!Array.isArray(s)&&(r=Up(r,s),o=i)}catch(s){console.warn(n,s)}return o?{path:o,value:r}:null}for(let r of dc(t,e))if(Fe(r))try{return{path:r,value:fc(r)}}catch(o){console.warn(n,o)}return null}function xt(t,e){if(!Fe(t))return null;try{return $p(so(no(t,"utf-8")))}catch(n){return console.warn(`Failed to load ${e}:`,n),null}}function $p(t){return ao(t)?{mcpServers:Ip(t.mcpServers??t["mcp-servers"]),...Array.isArray(t.imports)?{imports:t.imports}:{},...t.settings!==void 0?{settings:t.settings}:{}}:{mcpServers:{}}}function Ip(t){if(!ao(t))return{};let e={};for(let[n,r]of Object.entries(t))_p(r)&&(e[n]=r);return e}function _p(t){return ao(t)}function ao(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Up(t,e){let n=t.mcp,r=e.mcp,o={...n&&typeof n=="object"&&!Array.isArray(n)?n:{}};if(r&&typeof r=="object"&&!Array.isArray(r))for(let[i,s]of Object.entries(r)){let a=o[i];if(a&&typeof a=="object"&&!Array.isArray(a)&&s&&typeof s=="object"&&!Array.isArray(s)){let c={...a},u=s;if(typeof u.type=="string"&&u.type!==c.type)for(let l of["command","environment","cwd","url","headers","oauth"])delete c[l];if(typeof u.url=="string"&&u.url!==c.url&&(delete c.headers,delete c.oauth),Array.isArray(u.command)){let l=c.command;(!Array.isArray(l)||u.command.length!==l.length||u.command.some((p,g)=>p!==l[g]))&&(delete c.environment,delete c.cwd)}let d={...c,...u};for(let l of["environment","headers","oauth"]){let f=c[l],p=u[l];f&&typeof f=="object"&&!Array.isArray(f)&&p&&typeof p=="object"&&!Array.isArray(p)&&(d[l]={...f,...p})}o[i]=d}else o[i]=s}return{...t,...e,mcp:o}}function qt(t,e){if(!t||typeof t!="object")return{};let n=t,r;switch(e){case"claude-desktop":case"claude-code":r=n.mcpServers;break;case"codex":r=n.mcp_servers??n.mcpServers;break;case"cursor":case"windsurf":case"vscode":r=n.mcpServers??n["mcp-servers"];break;case"opencode":r=n.mcp;break;default:return{}}if(!r||typeof r!="object"||Array.isArray(r))return{};let o={};for(let[i,s]of Object.entries(r)){if(e==="opencode"){if(!s||typeof s!="object"||Array.isArray(s))continue;let l=s;if(l.enabled===!1)continue;if(l.type==="local"&&Array.isArray(l.command)&&l.command.length>0&&l.command.every(f=>typeof f=="string")){let f=Pi(l.environment),p=l.command[0];if(p===void 0)continue;let g={command:p,args:l.command.slice(1),...f?{env:f}:{},...typeof l.cwd=="string"?{cwd:l.cwd}:{}};o[i]=g;continue}if(l.type==="remote"&&typeof l.url=="string"){let f=Pi(l.headers),p={url:l.url,...f?{headers:f}:{}};if(l.oauth===!1)p.oauth=!1;else if(l.oauth&&typeof l.oauth=="object"&&!Array.isArray(l.oauth)){let g=l.oauth;p.auth="oauth",p.oauth={...typeof g.clientId=="string"?{clientId:g.clientId}:{},...typeof g.clientSecret=="string"?{clientSecret:g.clientSecret}:{},...typeof g.scope=="string"?{scope:g.scope}:{},...typeof g.authServerMetadataUrl=="string"?{authServerMetadataUrl:g.authServerMetadataUrl}:{},...typeof g.skipIssuerMetadataValidation=="boolean"?{skipIssuerMetadataValidation:g.skipIssuerMetadataValidation}:{}}}o[i]=p}continue}if(!ao(s))continue;if(e!=="codex"){o[i]=s;continue}let a={...s},c=a.bearer_token_env_var,u=a.http_headers,d=a.env_http_headers;if(typeof c=="string"&&(a.bearerTokenEnv=c,a.auth===void 0&&(a.auth="bearer")),u&&typeof u=="object"&&!Array.isArray(u)&&(a.headers={...a.headers,...u}),d&&typeof d=="object"&&!Array.isArray(d)){let l={...a.headers};for(let[f,p]of Object.entries(d))typeof p=="string"&&l[f]===void 0&&(l[f]=`$env:${p}`);a.headers=l}delete a.bearer_token_env_var,delete a.http_headers,delete a.env_http_headers,o[i]=a}return o}function pc(t){return`${JSON.stringify(t,null,2)}
5
+ `}function Dp(t,e){if(t===e)return"(no changes)";let n=t.split(`
6
+ `),r=e.split(`
7
+ `),o=n.length,i=r.length,s=Array.from({length:o+1},()=>Array(i+1).fill(0));for(let d=o-1;d>=0;d--)for(let l=i-1;l>=0;l--){let f=s[d],p=s[d+1];!f||!p||(f[l]=n[d]===r[l]?(p[l+1]??0)+1:Math.max(p[l]??0,f[l+1]??0))}let a=["--- before","+++ after"],c=0,u=0;for(;c<o||u<i;){if(c<o&&u<i&&n[c]===r[u]){a.push(` ${n[c]}`),c++,u++;continue}if(u<i&&(c===o||(s[c]?.[u+1]??0)>=(s[c+1]?.[u]??0))){a.push(`+ ${r[u]}`),u++;continue}c<o&&(a.push(`- ${n[c]}`),c++)}return a.join(`
8
+ `)}function Ii(t,e){let n=Fe(t),r=Mn(t),o=n?pc(r):"",i=pc(e);return{path:t,existed:n,changed:o!==i,beforeText:o,afterText:i,diffText:Dp(o,i)}}function Mn(t){if(!Fe(t))return{};try{let e=so(no(t,"utf-8"));return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}function lr(t,e){bp(to(t),{recursive:!0});let n=`${t}.${process.pid}.tmp`;wp(n,`${JSON.stringify(e,null,2)}
9
+ `,"utf-8"),Cp(n,t)}function dr(t){let e=t.mcpServers??t["mcp-servers"]??{};return!e||typeof e!="object"||Array.isArray(e)?{}:e}function fr(t,e){delete t["mcp-servers"],t.mcpServers=e}function bc(t,e,n,r){let o=mc(e),i={};if(Fe(o))try{let f=so(no(o,"utf-8"));if(!f||typeof f!="object"||Array.isArray(f))throw new Error("root value must be an object");i=f}catch(f){throw new Error(`Failed to read project MCP override at ${o}: ${f instanceof Error?f.message:String(f)}`,{cause:f})}let s=i.mcpServers!==void 0?"mcpServers":i["mcp-servers"]!==void 0?"mcp-servers":"mcpServers",a=i[s];if(a!==void 0&&(!a||typeof a!="object"||Array.isArray(a)))throw new Error(`Failed to update project MCP override at ${o}: ${s} must be an object`);let c=a??{},u=c[n];if(u!==void 0&&(!u||typeof u!="object"||Array.isArray(u)))throw new Error(`Failed to update project MCP override at ${o}: server "${n}" must be an object`);let d=u,l;if(r)l={...d,disabled:!0};else{l=Object.fromEntries(Object.entries(d??{}).filter(([p])=>p!=="disabled"));let f={mcpServers:{}};for(let p of xn(t,e)){if(p.readPath===o)continue;let g=xt(p.readPath,`MCP config from ${p.readPath}`);g&&(f=bn(f,ki(g,e)))}if(i.imports!==void 0){if(!Array.isArray(i.imports)||i.imports.some(p=>typeof p!="string"||!Object.hasOwn(ur,p)))throw new Error(`Failed to update project MCP override at ${o}: imports contains an unsupported config kind`);f=bn(f,ki({mcpServers:{},imports:i.imports},e))}U(f.mcpServers[n])&&(l.disabled=!1)}return!d&&Object.keys(l).length===0||JSON.stringify(d)===JSON.stringify(l)?{path:o,changed:!1}:(Object.keys(l).length===0?delete c[n]:c[n]=l,i[s]=c,lr(o,i),{path:o,changed:!0})}function Np(t,e){let n=t.toLowerCase();if(n.includes("repoprompt")||n==="rp")return!0;let r=e.command?.toLowerCase()??"";return r.includes("repoprompt")||r.includes("rp-mcp")||r.endsWith("repoprompt_cli")?!0:(e.args??[]).some(o=>typeof o=="string"&&o.toLowerCase().includes("repoprompt"))}function Lp(t=process.cwd()){let e=Ft(t);for(;;){if(Fe(ye(e,".git"))||Fe(ye(e,"package.json"))||Fe(ye(e,Oi))||Fe(ye(e,".pi")))return e;let n=to(e);if(n===e)return null;e=n}}function jp(t){return{command:t,args:[],lifecycle:"lazy"}}function Bp(t,e=process.cwd()){for(let i of t.sources){if(i.kind!=="shared"||i.serverCount===0)continue;let s=xt(i.path,`MCP config from ${i.path}`);if(s){for(let[a,c]of Object.entries(s.mcpServers))if(Np(a,c))return{configured:!0,configuredPath:i.path}}}let n=Pp.find(i=>Fe(i));if(!n)return{configured:!1};let r=Lp(e),o=r?ye(r,Oi):eo;return{configured:!1,executablePath:n,targetPath:o,serverName:"repoprompt",entry:jp(n)}}function Cc(t,e){let n=ro(e),r=Mn(n),o=Array.isArray(r.imports)?r.imports.filter(a=>typeof a=="string"):[],i=[...new Set([...o,...t])],s={...r,imports:i};return fr(s,dr(s)),Ii(n,s)}function xc(t,e){let n=ro(e),r=Mn(n),o=Array.isArray(r.imports)?r.imports.filter(c=>typeof c=="string"):[],i=[...new Set([...o,...t])],s=i.filter(c=>!o.includes(c));if(s.length===0)return{path:n,added:[]};r.imports=i;let a=dr(r);return fr(r,a),lr(n,r),{path:n,added:s}}function Mc(){return{mcpServers:{}}}function Tc(t=process.cwd()){let e=Cn(t),n={mcpServers:Mc().mcpServers};return Ii(e,n)}function Ac(t=process.cwd()){let e=Cn(t),n={mcpServers:Mc().mcpServers};return lr(e,n),e}function _i(t,e,n){let o={...Mn(t)},i=dr(o);return i[e]=n,fr(o,i),Ii(t,o)}function Ui(t,e,n){let r=Mn(t),o=dr(r);return o[e]=n,fr(r,o),lr(t,r),t}function Di(t,e=process.cwd()){let n=new Map,r=ro(t);if($i(t,e)==="on")for(let o of Object.keys(ur)){let i=zt(o,e,`Failed to inspect imported MCP config from ${o}:`);if(i)for(let s of Object.keys(qt(i.value,o)))n.set(s,{path:r,kind:"import",importKind:o})}for(let o of xn(t,e)){let i=xt(o.readPath,`MCP config from ${o.readPath}`);if(i){if(i.imports?.length)for(let s of i.imports){let a=zt(s,e,`Failed to inspect imported MCP config from ${s}:`);if(!a)continue;let c=qt(a.value,s);for(let u of Object.keys(c))n.has(u)||n.set(u,{path:r,kind:"import",importKind:s})}for(let s of Object.keys(i.mcpServers))n.set(s,{path:o.writePath,kind:o.kind,...o.importKind!==void 0?{importKind:o.importKind}:{}})}}return n}function Pc(t,e,n){let r=new Map;for(let[o,i]of t){let s=e.get(o);if(!s)continue;let a=s.path;r.has(a)||r.set(a,[]),r.get(a).push({name:o,value:i,prov:s})}for(let[o,i]of r){let s=Mn(o),a=dr(s);for(let{name:c,value:u,prov:d}of i)if(d.kind==="import"){let l=n.mcpServers[c];l&&(a[c]={...l,directTools:u})}else a[c]&&(a[c]={...a[c],directTools:u});fr(s,a),lr(o,s)}}function Rc(t,e=process.cwd()){if(t==null)return;if(typeof t!="string")throw new Error("settings.oauthDir must be a string");let n=t.trim();if(n)return Ft(e,n)}var eo,Tp,Oi,Ap,Pp,gc,ur,kp,Tn=je(()=>{tt();Ya();rc();ue();be();eo=ye(Ke(),".config","mcp","mcp.json"),Tp=[ye(Ke(),".agents","mcp.json"),ye(Ke(),".agents","mcp","mcp.json")],Oi=".mcp.json",Ap="mcp.json",Pp=[ye(Ke(),"RepoPrompt","repoprompt_cli"),"/Applications/Repo Prompt.app/Contents/MacOS/repoprompt-mcp"],gc=[{id:"deepwiki",name:"DeepWiki",summary:"Ask questions about public GitHub repositories.",entry:{url:"https://mcp.deepwiki.com/mcp",protocolVersion:"auto"}},{id:"context7",name:"Context7",summary:"Look up current library documentation and examples.",entry:{url:"https://mcp.context7.com/mcp",protocolVersion:"auto"}},{id:"parallel-search",name:"Parallel Search",summary:"Search the web and fetch pages without an API key.",entry:{url:"https://search.parallel.ai/mcp",protocolVersion:"auto",directTools:!0}},{id:"notion",name:"Notion",summary:"Search and work with your Notion workspace.",entry:{url:"https://mcp.notion.com/mcp",auth:"oauth",protocolVersion:"auto"}},{id:"github",name:"GitHub",summary:"Work with GitHub through your Copilot account.",entry:{url:"https://api.githubcopilot.com/mcp",auth:"oauth",protocolVersion:"auto"}},{id:"chrome-devtools",name:"Chrome DevTools",summary:"Inspect and automate a local Chrome browser.",entry:{command:"npx",args:["-y","chrome-devtools-mcp@1.6.0"]}}],ur={cursor:[ye(Ke(),".cursor","mcp.json")],"claude-code":[ye(Ke(),".claude","mcp.json"),ye(Ke(),".claude.json"),ye(Ke(),".claude","claude_desktop_config.json")],"claude-desktop":[ye(Ke(),"Library","Application Support","Claude","claude_desktop_config.json")],codex:[ye(Ke(),".codex","config.toml"),ye(Ke(),".codex","config.json")],opencode:[ye(Ke(),".config","opencode","opencode.json"),"./opencode.json"],windsurf:[ye(Ke(),".windsurf","mcp.json")],vscode:[".vscode/mcp.json"]};kp=["headers","bearerToken","bearerTokenEnv","bearerTokenStore","requestHeadersCommand"]});function ho(t){let e=t._meta,n=Fg(e);if(n===void 0&&(n=e?.[Hg]),typeof n=="string"&&n.startsWith("ui://"))return n;if(n!==void 0)throw new Error(`Invalid UI resource URI: ${JSON.stringify(n)}`)}function Kc(t){if(!t)return"";let e=[];return t.camera&&e.push("camera"),t.microphone&&e.push("microphone"),t.geolocation&&e.push("geolocation"),t.clipboardWrite&&e.push("clipboard-write"),e.join("; ")}function Fg(t){let e=t?.ui;if(!(!e||typeof e!="object"))return e.resourceUri}var Pn,Hg,Rn=je(()=>{Pn="text/html;profile=mcp-app",Hg="ui/resourceUri"});function Ce(t){let e=t.replace(/[^a-zA-Z0-9]/g,"_").replace(/_+/g,"_").replace(/^_+/,"").replace(/_+$/,"").toLowerCase();return(!e||/^\d/.test(e))&&(e="resource"+(e?"_"+e:"")),e}var It=je(()=>{});function Zt(t){if(!t||typeof t!="object")return;let e=t.ui;if(!e||typeof e!="object"||Array.isArray(e))return;let n=e.visibility;if(n===void 0)return;if(!Array.isArray(n))return[];let r=[];for(let o of n){if(o!=="model"&&o!=="app")return[];r.includes(o)||r.push(o)}return r}function ke(t){return t===void 0||t.includes("model")}function Us(t){return t===void 0||t.includes("app")}var en=je(()=>{});import{existsSync as gl,readFileSync as ml,writeFileSync as Ty,renameSync as Ay,mkdirSync as Py}from"node:fs";import{dirname as Ry}from"node:path";import{createHash as Ey}from"node:crypto";function No(){return Qe("mcp-cache.json")}function ze(){let t=No();if(!gl(t))return null;try{let e=JSON.parse(ml(t,"utf-8"));return!e||typeof e!="object"||e.version!==Do||!e.servers||typeof e.servers!="object"?null:e}catch{return null}}function Lo(t){let e=No(),n=Ry(e);Py(n,{recursive:!0});let r={version:Do,servers:{}};try{if(gl(e)){let i=JSON.parse(ml(e,"utf-8"));i&&i.version===Do&&i.servers&&(r.servers={...i.servers})}}catch{}r.version=Do,r.servers={...r.servers,...t.servers};let o=`${e}.${process.pid}.tmp`;Ty(o,JSON.stringify(r),"utf-8"),Ay(o,e)}function Ns(t,e=process.env){let n={command:t.command,args:t.args,socket:vn(t.socket,e),env:yn(t.env,e),cwd:vn(t.cwd,e),url:He(t,e),headers:yn(t.headers,e),requestHeadersCommand:t.requestHeadersCommand?{command:le(t.requestHeadersCommand.command,e),args:t.requestHeadersCommand.args?.map(o=>le(o,e)),env:yn(t.requestHeadersCommand.env,e),timeoutMs:t.requestHeadersCommand.timeoutMs}:void 0,auth:t.auth,protocolVersion:t.protocolVersion,bearerToken:Qr(t,e),bearerTokenEnv:t.bearerTokenEnv,exposeResources:t.exposeResources,includeTools:t.includeTools,excludeTools:t.excludeTools},r=Ds(n);return Ey("sha256").update(r).digest("hex")}function $e(t,e,n=ky,r=process.env){let o;try{o=Ns(e,r)}catch{return!1}if(!t||t.configHash!==o||!t.cachedAt||typeof t.cachedAt!="number")return!1;let i=t.ttlMs;if(typeof i=="number"&&Number.isSafeInteger(i)&&i>=0){if(i===0)return!1;let s=Date.now()-t.cachedAt,a=n>0?Math.min(n,i):i;return s<a}return!(n>0&&Date.now()-t.cachedAt>n)}function tn(t){let e=new Set,n=new Map;for(let r of t)if(r=r.replace(/\/+$/,""),r.includes("/")){let[o,i]=r.split("/",2);if(o&&i){let s=n.get(o)??new Set;s.add(i),n.set(o,s)}else o&&e.add(o)}else r&&e.add(r);return{servers:e,tools:n}}function Fn(t,e,n){let r=[],o=t.settings?.directTools,i=n?tn(n):null;for(let[s,a]of Object.entries(t.mcpServers)){if(U(a)||!(i?i.servers.has(s)||i.tools.has(s):a.directTools!==void 0?!!a.directTools:!!o))continue;let u=e?.servers?.[s];(!u||!$e(u,a))&&r.push(s)}return r}function hl(t,e,n,r,o,i,s){let a=[],c=new Set,u=pe(r,n),l=Array.isArray(r.includeTools)&&r.includeTools.length>0||Array.isArray(r.excludeTools)&&r.excludeTools.length>0?s??(o&&i?Tr(o,i,n):void 0):void 0;for(let f of e.tools??[]){if(!f?.name||!ke(f.uiVisibility)||!Ee(f.name,t,u,r.includeTools,r.excludeTools,l))continue;let p=se(f.name,t,u);c.has(p)||(c.add(p),a.push({name:p,originalName:f.name,description:f.description??"",...f.inputSchema!==void 0?{inputSchema:f.inputSchema}:{},...f.uiResourceUri!==void 0?{uiResourceUri:f.uiResourceUri}:{},...f.uiVisibility!==void 0?{uiVisibility:f.uiVisibility}:{},...f.uiStreamMode!==void 0?{uiStreamMode:f.uiStreamMode}:{}}))}if(r.exposeResources!==!1)for(let f of e.resources??[]){if(!f?.name||!f?.uri)continue;let p=`read_${Ce(f.name)}`;if(!Ee(p,t,u,r.includeTools,r.excludeTools,l))continue;let g=se(p,t,u);c.has(g)||(c.add(g),a.push({name:g,originalName:p,description:f.description??`Read resource: ${f.uri}`,resourceUri:f.uri}))}return a}function Tr(t,e,n){let r=new Set;for(let[o,i]of Object.entries(t)){let s=e.servers[o];if(!s||!$e(s,i)||U(i))continue;let a=pe(i,n);for(let c of s.tools??[])if(ke(c.uiVisibility))for(let u of ce(c.name,o,a,!1))r.add(u);if(i.exposeResources!==!1)for(let c of s.resources??[]){let u=`read_${Ce(c.name)}`;for(let d of ce(u,o,a,!1))r.add(d)}}return mn(r)}function yl(t){return t.filter(e=>e?.name).map(e=>{let n=Oy(e),r=Zt(e._meta),o=Zr(e._meta);return{name:e.name,...e.description!==void 0?{description:e.description}:{},...e.inputSchema!==void 0?{inputSchema:e.inputSchema}:{},...n!==void 0?{uiResourceUri:n}:{},...r!==void 0?{uiVisibility:r}:{},...o!==void 0?{uiStreamMode:o}:{}}})}function vl(t){return t.filter(e=>e?.name&&e?.uri).map(e=>({uri:e.uri,name:e.name,...e.description!==void 0?{description:e.description}:{}}))}function Sl(t){return(t??[]).filter(e=>e?.name).map(e=>({name:e.name,...e.title!==void 0?{title:e.title}:{},...e.description!==void 0?{description:e.description}:{},...Array.isArray(e.arguments)?{arguments:e.arguments.filter(n=>n?.name).map(n=>({name:n.name,...n.description!==void 0?{description:n.description}:{},...n.required!==void 0?{required:n.required}:{}}))}:{}}))}function ut(t,e,n,r){let o=pe(r,n);return(e??[]).filter(i=>i?.name).map(i=>{let s=Array.isArray(i.arguments)?i.arguments.filter(a=>a?.name).map(a=>({name:a.name,...a.description!==void 0?{description:a.description}:{},...a.required!==void 0?{required:a.required}:{}})):[];return{serverName:t,originalName:i.name,commandName:wi(i.name,t,o),...i.title!==void 0?{title:i.title}:{},description:i.description??"",arguments:s}})}function Ds(t){if(t==null||typeof t!="object"){let r=JSON.stringify(t);return r===void 0?"undefined":r}if(Array.isArray(t))return`[${t.map(r=>Ds(r)).join(",")}]`;let e=t;return`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Ds(e[r])}`).join(",")}}`}function Oy(t){try{return ho({_meta:t._meta})}catch{return}}var Do,ky,nt=je(()=>{tt();Rn();ue();It();be();en();Do=1,ky=10080*60*1e3});import{matchesKey as qn}from"@earendil-works/pi-tui";function Yy(t){let e=t?.getUserBindings?.()["mcp.panel.save"];return e!==void 0?{keys:Array.isArray(e)?e:[e],configured:!0}:{keys:[],configured:!1}}function Fo(t){let e=Yy(t);return t?{selectUp:n=>t.matches(n,"tui.select.up"),selectDown:n=>t.matches(n,"tui.select.down"),selectConfirm:n=>t.matches(n,"tui.select.confirm"),save:n=>e.keys.length>0?e.keys.some(r=>qn(n,r)):!e.configured&&qn(n,"ctrl+s"),saveLabel:()=>e.keys[0]??(e.configured?null:"ctrl+s")}:{selectUp:n=>qn(n,"up"),selectDown:n=>qn(n,"down"),selectConfirm:n=>qn(n,"return"),save:n=>qn(n,"ctrl+s"),saveLabel:()=>"ctrl+s"}}var Js=je(()=>{});var _l={};Ea(_l,{McpSetupPanel:()=>Vo,createMcpSetupPanel:()=>ev});import{matchesKey as Ws,truncateToWidth as $l,visibleWidth as Il}from"@earendil-works/pi-tui";function qe(t,e){return t?`\x1B[${t}m${e}\x1B[0m`:e}function vt(t,e){if(e<=8)return[t];let n=t.split(/\s+/).filter(Boolean),r=[],o="";for(let i of n){let s=o?`${o} ${i}`:i;if(Il(s)<=e){o=s;continue}o&&r.push(o),o=i}return o&&r.push(o),r.length>0?r:[""]}function ev(t,e,n,r,o){return new Vo(t,e,n,r,o)}var Xy,Qy,Zy,zo,qo,Vo,Ul=je(()=>{Js();tt();Tn();Xy={border:"2",title:"36",selected:"32",hint:"2",success:"32",warning:"33",muted:"2;3"},Qy=24,Zy=60,zo=7,qo=74;Vo=class t{constructor(e,n,r,o,i){this.discovery=e;this.callbacks=n;this.options=r;this.done=i;this.tui=o,this.keys=Fo(r.keybindings),this.screen=r.mode;for(let s of e.imports)this.selectedImports.add(s.kind);this.resetInactivityTimeout()}discovery;callbacks;options;done;screen;actionCursor=0;importCursor=0;pathCursor=0;selectedImports=new Set;busy=!1;notice=null;tui;t=Xy;keys;inactivityTimeout=null;static INACTIVITY_MS=6e4;resetInactivityTimeout(){this.inactivityTimeout&&clearTimeout(this.inactivityTimeout),this.inactivityTimeout=setTimeout(()=>{this.cleanup(),this.done()},t.INACTIVITY_MS)}cleanup(){this.inactivityTimeout&&(clearTimeout(this.inactivityTimeout),this.inactivityTimeout=null)}getActions(){let e=[];this.screen==="empty"&&e.push({id:"run-setup",label:"Run setup",description:"Inspect detected configs, adopt imports, and scaffold a minimal `.mcp.json`."}),this.discovery.imports.length>0&&e.push({id:"adopt-imports",label:"Adopt detected compatibility imports",description:`Choose which host-specific MCP configs Pi should import into its own override file. ${this.discovery.imports.length} source${this.discovery.imports.length===1?"":"s"} found.`}),e.push({id:"view-example",label:"View example `.mcp.json`",description:"Preview a working shared MCP config you can paste or adapt."}),this.discovery.sources.some(n=>n.id==="shared-project"&&n.exists)||e.push({id:"scaffold-project",label:"Scaffold project `.mcp.json`",description:"Write a minimal project config using the standard shared MCP file path, then reload Pi."}),e.push({id:"show-precedence",label:"Explain config precedence",description:"Show the read order and where Pi writes compatibility settings."}),this.getDetectedPaths().length>0&&e.push({id:"open-paths",label:"Open detected config paths",description:"Browse the actual config files that Pi discovered on this machine."});for(let n of gc)e.push({id:"add-known-server",label:n.name,description:n.summary,preset:n});return!this.discovery.repoPrompt.configured&&this.discovery.repoPrompt.executablePath&&this.discovery.repoPrompt.targetPath&&this.discovery.repoPrompt.entry&&this.discovery.repoPrompt.serverName&&e.push({id:"add-repoprompt",label:"Add RepoPrompt to shared MCP config",description:"Write a standard MCP entry for RepoPrompt to the recommended shared target, then reload MCP in-session."}),e.push({id:"close",label:"Close",description:"Exit the onboarding flow."}),e}getDetectedPaths(){let e=[...this.discovery.sources.filter(n=>n.exists).map(n=>n.path),...this.discovery.imports.map(n=>n.path)];return[...new Set(e)]}getSelectedAction(){return this.getActions()[this.actionCursor]}handleInput(e){if(this.resetInactivityTimeout(),this.busy||(this.notice=null),Ws(e,"ctrl+c")){this.cleanup(),this.done();return}if(Ws(e,"escape")){if(this.screen==="imports"||this.screen==="paths"){this.screen=this.discovery.hasAnyConfig?"setup":"empty",this.tui.requestRender();return}this.cleanup(),this.done();return}if(this.busy)return;if(this.screen==="imports"){this.handleImportsInput(e);return}if(this.screen==="paths"){this.handlePathsInput(e);return}let n=this.getActions();if(this.keys.selectUp(e)){this.actionCursor=Math.max(0,this.actionCursor-1),this.tui.requestRender();return}if(this.keys.selectDown(e)){this.actionCursor=Math.min(n.length-1,this.actionCursor+1),this.tui.requestRender();return}if(this.keys.selectConfirm(e)){let r=this.getSelectedAction();r&&this.runAction(r)}}handleImportsInput(e){let n=this.discovery.imports;if(this.keys.selectUp(e)){this.importCursor=Math.max(0,this.importCursor-1),this.tui.requestRender();return}if(this.keys.selectDown(e)){this.importCursor=Math.min(n.length-1,this.importCursor+1),this.tui.requestRender();return}if(Ws(e,"space")){let r=n[this.importCursor];if(!r)return;this.selectedImports.has(r.kind)?this.selectedImports.delete(r.kind):this.selectedImports.add(r.kind),this.tui.requestRender();return}this.keys.selectConfirm(e)&&this.applySelectedImports()}handlePathsInput(e){let n=this.getDetectedPaths();if(this.keys.selectUp(e)){this.pathCursor=Math.max(0,this.pathCursor-1),this.tui.requestRender();return}if(this.keys.selectDown(e)){this.pathCursor=Math.min(n.length-1,this.pathCursor+1),this.tui.requestRender();return}if(this.keys.selectConfirm(e)){let r=n[this.pathCursor];if(!r)return;this.runBusy(async()=>{await this.callbacks.openPath(r),this.notice={text:`Opened ${r}`,tone:"success"}})}}async runAction(e){if(e.id==="run-setup"){this.screen="setup",this.actionCursor=0,this.tui.requestRender();return}if(e.id==="adopt-imports"){this.screen="imports",this.importCursor=0,this.tui.requestRender();return}if(e.id==="open-paths"){this.screen="paths",this.pathCursor=0,this.tui.requestRender();return}if(e.id==="scaffold-project"){await this.runBusy(async()=>{let n=await this.callbacks.scaffoldProjectConfig();this.callbacks.markSetupCompleted(),this.notice={text:`Wrote starter config to ${n.path}. Pi will reload after this panel closes.`,tone:"success"}});return}if(e.id==="add-repoprompt"){await this.runBusy(async()=>{let n=await this.callbacks.addRepoPrompt();this.callbacks.markSetupCompleted(),this.notice={text:`Added ${n.serverName} to ${n.path}. Pi will reload after this panel closes.`,tone:"success"}});return}if(e.id==="add-known-server"&&e.preset){let n=e.preset;await this.runBusy(async()=>{let r=await this.callbacks.addKnownServer(n);this.callbacks.markSetupCompleted(),this.notice={text:`Added ${r.serverName} to ${r.path}. Pi will reload after this panel closes.`,tone:"success"}});return}if(e.id==="close"){this.cleanup(),this.done();return}this.notice={text:"Review the details below. Press Enter on an action with a side effect to apply it.",tone:"muted"},this.tui.requestRender()}async applySelectedImports(){let e=this.discovery.imports.filter(n=>this.selectedImports.has(n.kind)).map(n=>n.kind);if(e.length===0){this.notice={text:"Select at least one compatibility import first.",tone:"warning"},this.tui.requestRender();return}await this.runBusy(async()=>{let n=await this.callbacks.adoptImports(e);this.callbacks.markSetupCompleted(),this.notice=n.added.length>0?{text:`Added ${n.added.join(", ")} to ${n.path}. Pi will reload after this panel closes.`,tone:"success"}:{text:`No changes needed in ${n.path}.`,tone:"muted"},this.screen=this.discovery.hasAnyConfig?"setup":"empty",this.actionCursor=0})}async runBusy(e){this.busy=!0,this.notice={text:"Working...",tone:"muted"},this.tui.requestRender();try{await e()}catch(n){this.notice={text:n instanceof Error?n.message:String(n),tone:"warning"}}finally{this.busy=!1,this.tui.requestRender()}}render(e){let r=Math.max(Qy,e)-2,o=this.contentWidth(r),i=[],s=qe(this.t.border,"\u2500".repeat(r));i.push(`\u250C${s}\u2510`),i.push(this.padLine(qe(this.t.title,"MCP setup"),r));for(let a of vt(this.discoverySummaryLine(),o))i.push(this.padLine(a,r));for(let a of vt(this.secondarySummaryLine(),o))i.push(this.padLine(qe(this.t.muted,a),r));if(i.push(this.padLine("",r)),this.notice){let a=this.notice.tone==="success"?this.t.success:this.notice.tone==="warning"?this.t.warning:this.t.hint;for(let c of vt(this.notice.text,o))i.push(this.padLine(qe(a,c),r));i.push(this.padLine("",r))}return i.push(`\u251C${s}\u2524`),this.screen==="imports"?i.push(...this.renderImports(r)):this.screen==="paths"?i.push(...this.renderPaths(r)):i.push(...this.renderActions(r)),i.push(`\u2514${s}\u2518`),i}renderActions(e){let n=[],r=this.getActions(),o=e<Zy,{start:i,end:s}=o?this.visibleActionRange(r.length):{start:0,end:r.length};i>0&&n.push(this.padLine(qe(this.t.muted,`\u2026 ${i} more above`),e));for(let u=i;u<s;u++){let d=r[u];if(!d)continue;d.id==="add-known-server"&&(u===i||r[u-1]?.id!=="add-known-server")&&n.push(this.padLine(qe(this.t.title,"Add a known server"),e));let f=u===this.actionCursor?qe(this.t.selected,"\u203A"):" ";n.push(this.padLine(`${f} ${$l(d.label,this.contentWidth(e)-2)}`,e))}s<r.length&&n.push(this.padLine(qe(this.t.muted,`\u2026 ${r.length-s} more below`),e)),n.push(this.padLine("",e));let a=this.getActionPreview(this.getSelectedAction(),this.previewWidth(e));for(let u of a)n.push(this.padLine(u,e));n.push(this.padLine("",e));let c=o?"Enter select \xB7 Esc back":"Enter selects, Esc goes back, Ctrl+C closes.";return n.push(this.padLine(qe(this.t.muted,c),e)),n}renderImports(e){let n=[];n.push(this.padLine("Select compatibility imports. Space toggles, Enter saves, Esc goes back.",e)),n.push(this.padLine("",e));for(let i=0;i<this.discovery.imports.length;i++){let s=this.discovery.imports[i];if(!s)continue;let a=this.selectedImports.has(s.kind)?"[x]":"[ ]",c=i===this.importCursor?qe(this.t.selected,"\u203A"):" ";n.push(this.padLine(`${c} ${a} ${s.kind} ${s.path}`,e))}n.push(this.padLine("",e));let r=this.discovery.imports.filter(i=>this.selectedImports.has(i.kind)).map(i=>i.kind),o=this.callbacks.previewImports(r);for(let i of this.formatWritePreview("Compatibility import write preview",o,[],this.previewWidth(e)))n.push(this.padLine(i,e));return n}renderPaths(e){let n=[];n.push(this.padLine("Select a detected config path to open. Enter opens it, Esc goes back.",e)),n.push(this.padLine("",e));let r=this.getDetectedPaths();for(let o=0;o<r.length;o++){let i=o===this.pathCursor?qe(this.t.selected,"\u203A"):" ",s=r[o];s!==void 0&&n.push(this.padLine(`${i} ${s}`,e))}return n}discoverySummaryLine(){if(!this.discovery.hasAnyConfig)return qe(this.t.warning,this.options.onboardingState.setupCompleted?"No MCP servers are active right now.":"No MCP config is active yet.");if(this.discovery.totalServerCount===0&&(this.discovery.imports.length>0||this.discovery.repoPrompt.executablePath))return qe(this.t.warning,"Pi found MCP-related setup options, but none are active in Pi yet.");let e=this.discovery.sources.filter(r=>r.kind==="shared"&&r.serverCount>0).length,n=this.discovery.sources.filter(r=>r.kind==="pi"&&r.serverCount>0).length;return qe(this.t.hint,`Detected ${this.discovery.totalServerCount} configured servers across ${e} shared and ${n} Pi-owned source${e+n===1?"":"s"}.`)}secondarySummaryLine(){let e=this.discovery.hostConfigs.length>0?` Host discovery is ${this.discovery.hostConfigDiscovery}; ${this.discovery.hostConfigs.length} host source${this.discovery.hostConfigs.length===1?"":"s"} detected.`:"",n=this.discovery.conflicts.length>0?` ${this.discovery.conflicts.length} same-name conflict${this.discovery.conflicts.length===1?"":"s"} reported.`:"";return this.discovery.hasAnyConfig?this.discovery.totalServerCount===0&&this.discovery.imports.length>0?`Detected ${this.discovery.imports.length} compatibility import source${this.discovery.imports.length===1?"":"s"}. Adopt them into Pi or inspect the underlying files.${e}${n}`:`Shared MCP files are preferred. Pi-owned files are only for compatibility imports and adapter-specific overrides.${e}${n}`:`Create a shared .mcp.json, adopt host imports, or quick-add RepoPrompt from this screen.${e}${n}`}visibleActionRange(e){if(e<=zo)return{start:0,end:e};let n=Math.floor(zo/2),r=Math.min(Math.max(0,this.actionCursor-n),Math.max(0,e-zo));return{start:r,end:Math.min(e,r+zo)}}contentWidth(e){return Math.max(8,e-4)}previewWidth(e){return Math.max(12,Math.min(qo,this.contentWidth(e)))}getActionPreview(e,n=qo){switch(e?.id){case"run-setup":return this.formatPreview(["Run setup to adopt host-specific imports, inspect detected paths, and scaffold a minimal `.mcp.json` if needed."],n);case"adopt-imports":return this.formatWritePreview("Compatibility import write preview",this.callbacks.previewImports(this.discovery.imports.filter(r=>this.selectedImports.has(r.kind)).map(r=>r.kind)),[`Detected imports: ${this.discovery.imports.map(r=>`${r.kind} (${r.serverCount} servers)`).join(", ")}`,"Selected imports are written into the Pi agent dir config as Pi-owned compatibility state."],n);case"view-example":return this.formatPreview(["Example shared `.mcp.json`:","{",' "mcpServers": {',' "chrome-devtools": {',' "command": "npx",',' "args": ["-y", "chrome-devtools-mcp@1.6.0"]'," }"," }","}","","Use Scaffold project `.mcp.json` when you want a safe empty shell instead of a live example server."],n);case"show-precedence":return this.formatPreview(["Read order (later entries win):","0. detected host configs (opt-in lowest-precedence fallback)","1. ~/.config/mcp/mcp.json","2. ~/.agents/mcp.json","3. ~/.agents/mcp/mcp.json","4. <Pi agent dir>/mcp.json","5. .mcp.json",`6. ${bt()}/mcp.json`,`Host discovery: ${this.discovery.hostConfigDiscovery}. Conflicts reported: ${this.discovery.conflicts.length}.`,...this.discovery.conflicts.slice(0,8).map(r=>`${r.serverName}: ${r.sources.map(o=>o.path).join(" -> ")} (winner: ${r.winner.path})`),"Pi writes compatibility imports and adapter-only overrides to Pi-owned files."],n);case"open-paths":return this.formatPreview(this.getDetectedPaths().length>0?["Detected paths:",...this.getDetectedPaths()]:["No config paths were detected."],n);case"add-repoprompt":{let r=this.discovery.repoPrompt,o=this.callbacks.previewRepoPrompt();return o?this.formatWritePreview("RepoPrompt write preview",o,[`Executable: ${r.executablePath??"not found"}`,`Target: ${r.targetPath??"n/a"}`,`Server name: ${r.serverName??"repoprompt"}`],n):this.formatPreview(["RepoPrompt is not available to add from this setup screen."],n)}case"add-known-server":{let r=e.preset;return r?this.formatWritePreview(`${r.name} write preview`,this.callbacks.previewKnownServer(r),[r.summary],n):this.formatPreview(["Known server preset is unavailable."],n)}case"scaffold-project":return this.formatWritePreview("Starter project `.mcp.json` write preview",this.callbacks.previewStarterProject(),["This writes a minimal `.mcp.json` in the current project using the shared MCP layout.","It intentionally avoids adding a fake placeholder server that would fail on first reload."],n);default:return this.formatPreview(["Close the setup flow."],n)}}formatPreview(e,n=qo){let r=[];for(let o of e)r.push(...vt(o,n));return r}formatWritePreview(e,n,r=[],o=qo){let i=[];for(let u of r)i.push(...vt(u,o));r.length>0&&i.push(""),i.push(...vt(`${e}: ${n.path}`,o)),i.push(...vt(n.existed?"Existing file detected. Showing exact before/after diff.":"New file will be created. Showing exact content diff.",o)),i.push("");let s=n.diffText.split(`
10
+ `),a=18,c=s.slice(0,a);for(let u of c)i.push(...vt(u,o));return s.length>a&&i.push(...vt(`\u2026 ${s.length-a} more diff line${s.length-a===1?"":"s"}`,o)),i}padLine(e,n){let o=Math.max(0,n-4),i=$l(e,o,"\u2026",!0),s=Il(i),a=Math.max(0,o-s);return`\u2502${" ".repeat(2)}${i}${" ".repeat(a)}${" ".repeat(2)}\u2502`}invalidate(){}dispose(){this.cleanup()}}});var Ys={};Ea(Ys,{createMcpPanel:()=>iv});import{matchesKey as De,truncateToWidth as Dl,visibleWidth as Vn}from"@earendil-works/pi-tui";import{copyToClipboard as tv}from"@earendil-works/pi-coding-agent";function K(t,e){return t?`\x1B[${t}m${e}\x1B[0m`:e}function rv(t,e){let n=[];for(let r=0;r<e;r++){let o=Nl[r%Nl.length];o&&n.push(K(o,r<t?"\u25CF":"\u25CB"))}return n.join(" ")}function Ko(t,e){let n=t.toLowerCase(),r=e.toLowerCase();if(r.includes(n))return 100+n.length/r.length*50;let o=0,i=0,s=0;for(let a=0;a<r.length&&i<n.length;a++)r[a]===n[i]?(o+=10+s,s+=5,i++):s=0;return i===n.length?o:0}function Pe(t){return de(t??"")}function ov(t){let e=Ei(t),n="",r=!1;for(let o=0;o<e.length;o++){let s=e.slice(o).match(/^(?:\x1b\[[0-?]*[ -/]*[@-~]|\x1b[@-Z\\-_])/);if(s){n+=s[0],o+=s[0].length-1;continue}let a=e.charCodeAt(o);if(a<=31||a===127||a>=128&&a<=159){r=!0;continue}r&&n&&!n.endsWith(" ")&&(n+=" "),r=!1,n+=e[o]}return n}function Jo(t){let e=JSON.stringify(t.inputSchema??{}).length,n=t.description?.length??0;return Math.ceil((t.name.length+n+e)/4)+10}function iv(t,e,n,r,o,i,s){return new Gs(t,e,n,r,o,i,s??{})}var nv,Nl,Gs,Xs=je(()=>{Js();ue();It();be();nt();en();nv={border:"2",title:"2",selected:"36",direct:"32",needsAuth:"33",placeholder:"2;3",description:"2",hint:"2",confirm:"32",cancel:"31"};Nl=["38;2;178;129;214","38;2;215;135;175","38;2;254;188;56","38;2;228;192;15","38;2;137;210;129","38;2;0;175;175","38;2;23;143;185"];Gs=class t{constructor(e,n,r,o,i,s,a={}){this.config=e;this.cache=n;this.callbacks=o;this.done=s;this.tui=i,this.noticeLines=a.noticeLines??[],this.authOnly=a.authOnly===!0,this.keys=Fo(a.keybindings),this.prefix=e.settings?.toolPrefix??"server";for(let[c,u]of Object.entries(e.mcpServers)){if(this.authOnly&&!o.canAuthenticate(c))continue;let d=r.get(c),l=this.cache?.servers?.[c],f=l&&$e(l,u)?l:void 0,p=e.settings?.directTools,g=!1;u.directTools!==void 0?g=u.directTools:p&&(g=p);let y=[];if(f&&!this.authOnly&&!U(u)){for(let S of f.tools??[]){if(!ke(S.uiVisibility)||!Ee(S.name,c,this.prefix,u.includeTools,u.excludeTools,this.getOtherCurrentCandidates(c,u,f,S.name)))continue;let R=g===!0||Array.isArray(g)&&g.includes(S.name);y.push({name:S.name,description:S.description??"",isDirect:R,wasDirect:R,estimatedTokens:Jo(S)})}if(u.exposeResources!==!1)for(let S of f.resources??[]){let R=`read_${Ce(S.name)}`;if(!Ee(R,c,this.prefix,u.includeTools,u.excludeTools,this.getOtherCurrentCandidates(c,u,f,R)))continue;let h=g===!0||Array.isArray(g)&&g.includes(R),M={name:R,...S.description!==void 0?{description:S.description}:{}};y.push({name:R,description:S.description??`Read resource: ${S.uri}`,isDirect:h,wasDirect:h,estimatedTokens:Jo(M)})}}let w=o.getConnectionStatus(c),b=o.getFailureMessage?.(c)??null,v=0,m=0;for(let S of y)S.isDirect&&(v++,m+=S.estimatedTokens);this.servers.push({name:c,expanded:!1,source:d?.kind??"user",...d?.importKind!==void 0?{importKind:d.importKind}:{},...u.includeTools!==void 0?{includeTools:u.includeTools}:{},...u.excludeTools!==void 0?{excludeTools:u.excludeTools}:{},exposeResources:u.exposeResources!==!1,connectionStatus:w,failureMessage:b,tools:y,directCount:v,directTokens:m,hasCachedData:!!f})}this.rebuildVisibleItems(),this.resetInactivityTimeout()}config;cache;callbacks;done;noticeLines;prefix;servers=[];cursorIndex=0;nameQuery="";descSearchActive=!1;descQuery="";dirty=!1;confirmingDiscard=!1;discardSelected=1;importNotice=null;authNotice=null;authInFlight=null;inactivityTimeout=null;visibleItems=[];tui;t=nv;authOnly;keys;static MAX_VISIBLE=12;static INACTIVITY_MS=6e4;resetInactivityTimeout(){this.inactivityTimeout&&clearTimeout(this.inactivityTimeout),this.inactivityTimeout=setTimeout(()=>{this.cleanup(),this.done({cancelled:!0,changes:new Map})},t.INACTIVITY_MS)}cleanup(){this.inactivityTimeout&&(clearTimeout(this.inactivityTimeout),this.inactivityTimeout=null)}rebuildVisibleItems(){let e=this.descSearchActive?this.descQuery:this.nameQuery,n=this.descSearchActive?"desc":"name";this.visibleItems=[];for(let r=0;r<this.servers.length;r++){let o=this.servers[r];if(o){if(e&&this.authOnly){(n==="name"?Ko(e,o.name):0)>0&&this.visibleItems.push({type:"server",serverIndex:r});continue}if(this.visibleItems.push({type:"server",serverIndex:r}),o.expanded||e)for(let i=0;i<o.tools.length;i++){let s=o.tools[i];s&&(e&&(n==="name"?Math.max(Ko(e,s.name),Ko(e,o.name)*.6):Ko(e,s.description))===0||this.visibleItems.push({type:"tool",serverIndex:r,toolIndex:i}))}}}e&&!this.authOnly&&(this.visibleItems=this.visibleItems.filter(r=>r.type==="server"?this.visibleItems.some(o=>o.type==="tool"&&o.serverIndex===r.serverIndex):!0))}updateDirty(){this.dirty=this.servers.some(e=>e.tools.some(n=>n.isDirect!==n.wasDirect))}buildResult(){let e=new Map;for(let n of this.servers){if(!n.tools.some(i=>i.isDirect!==i.wasDirect))continue;let o=n.tools.filter(i=>i.isDirect);o.length===n.tools.length&&n.tools.length>0?e.set(n.name,!0):o.length===0?e.set(n.name,!1):e.set(n.name,o.map(i=>i.name))}return{changes:e,cancelled:!1}}handleInput(e){if(this.resetInactivityTimeout(),this.importNotice=null,this.authInFlight||(this.authNotice=null),this.confirmingDiscard){this.handleDiscardInput(e);return}if(De(e,"ctrl+c")){this.cleanup(),this.done({cancelled:!0,changes:new Map});return}if(this.keys.save(e)){this.cleanup(),this.done(this.buildResult());return}if(this.descSearchActive){if(De(e,"escape")||this.keys.selectConfirm(e)){this.descSearchActive=!1,this.descQuery="",this.rebuildVisibleItems(),this.cursorIndex=Math.min(this.cursorIndex,Math.max(0,this.visibleItems.length-1));return}if(De(e,"backspace")){this.descQuery.length>0&&(this.descQuery=this.descQuery.slice(0,-1),this.rebuildVisibleItems(),this.cursorIndex=Math.min(this.cursorIndex,Math.max(0,this.visibleItems.length-1)));return}if(this.keys.selectUp(e)){this.moveCursor(-1);return}if(this.keys.selectDown(e)){this.moveCursor(1);return}if(De(e,"space")){let n=this.visibleItems[this.cursorIndex];n&&this.toggleItem(n);return}if(e.length===1&&e.charCodeAt(0)>=32){this.descQuery+=e,this.rebuildVisibleItems(),this.cursorIndex=Math.min(this.cursorIndex,Math.max(0,this.visibleItems.length-1));return}return}if(De(e,"escape")){if(this.nameQuery){this.nameQuery="",this.rebuildVisibleItems(),this.cursorIndex=Math.min(this.cursorIndex,Math.max(0,this.visibleItems.length-1));return}if(this.dirty){this.confirmingDiscard=!0,this.discardSelected=1;return}this.cleanup(),this.done({cancelled:!0,changes:new Map});return}if(this.keys.selectUp(e)){this.moveCursor(-1);return}if(this.keys.selectDown(e)){this.moveCursor(1);return}if(De(e,"space")){let n=this.visibleItems[this.cursorIndex];n&&!this.authOnly&&this.toggleItem(n);return}if(this.keys.selectConfirm(e)){let n=this.visibleItems[this.cursorIndex];if(!n)return;let r=this.servers[n.serverIndex];if(!r)return;if(n.type==="server"){if(r.connectionStatus==="disabled")return;if(this.authOnly||r.connectionStatus==="needs-auth"){this.authenticateServer(r);return}r.expanded=!r.expanded,this.rebuildVisibleItems(),this.cursorIndex=Math.min(this.cursorIndex,Math.max(0,this.visibleItems.length-1))}else if(n.toolIndex!==void 0){let o=r.tools[n.toolIndex];if(!o)return;this.toggleToolDirect(r,o),o.isDirect&&r.source==="import"&&(this.importNotice=`Imported from ${Pe(r.importKind??"external")} \u2014 will copy to user config on save`),this.updateDirty()}return}if(De(e,"ctrl+a")){let n=this.visibleItems[this.cursorIndex];n&&this.authenticateSelectedServer(n);return}if(De(e,"ctrl+r")){let n=this.visibleItems[this.cursorIndex];if(!n)return;let r=this.servers[n.serverIndex];r&&this.reconnectServer(r);return}if(De(e,"ctrl+y")){let n=this.visibleItems[this.cursorIndex];if(!n)return;let r=this.servers[n.serverIndex];if(!r||r.connectionStatus!=="failed"||!r.failureMessage)return;let o=Pe(r.name),i=Pe(r.failureMessage);tv(i).then(()=>{this.authNotice=`Copied error for ${o} to clipboard`,this.tui.requestRender()}).catch(s=>{let a=Pe(s instanceof Error?s.message:String(s));this.authNotice=`Failed to copy error for ${o}: ${a}`,this.tui.requestRender()});return}if(e==="?"){if(this.authOnly)return;this.descSearchActive=!0,this.descQuery="",this.rebuildVisibleItems(),this.cursorIndex=Math.min(this.cursorIndex,Math.max(0,this.visibleItems.length-1));return}if(De(e,"backspace")){this.nameQuery.length>0&&(this.nameQuery=this.nameQuery.slice(0,-1),this.rebuildVisibleItems(),this.cursorIndex=Math.min(this.cursorIndex,Math.max(0,this.visibleItems.length-1)));return}if(e.length===1&&e.charCodeAt(0)>=32){this.nameQuery+=e,this.rebuildVisibleItems(),this.cursorIndex=Math.min(this.cursorIndex,Math.max(0,this.visibleItems.length-1));return}}authenticateSelectedServer(e){let n=this.servers[e.serverIndex];n&&this.authenticateServer(n)}authenticateServer(e){if(this.authInFlight||e.connectionStatus==="connecting"||e.connectionStatus==="disabled")return;let n=Pe(e.name);if(!this.callbacks.canAuthenticate(e.name)){this.authNotice=`${n} does not use OAuth authentication.`;return}this.authInFlight=e.name,this.authNotice=`Authenticating ${n}...`,this.tui.requestRender(),this.callbacks.authenticate(e.name).then(r=>{if(e.connectionStatus=this.callbacks.getConnectionStatus(e.name),r.ok){this.authNotice=`OAuth finished for ${n}. Reconnecting...`,this.authInFlight=null,this.tui.requestRender(),this.reconnectServer(e,{afterAuth:!0});return}let o=Pe(r.message);this.authNotice=`OAuth failed for ${n}${o?`: ${o}`:". Check the notification for details."}`,this.authInFlight=null,this.tui.requestRender()}).catch(r=>{let o=Pe(r instanceof Error?r.message:String(r));e.connectionStatus=this.callbacks.getConnectionStatus(e.name),this.authNotice=`OAuth failed for ${n}: ${o}`,this.authInFlight=null,this.tui.requestRender()})}reconnectServer(e,n={}){if(e.connectionStatus==="connecting"||e.connectionStatus==="disabled")return;let r=Pe(e.name);e.connectionStatus="connecting",this.tui.requestRender(),this.callbacks.reconnect(e.name).then(o=>{if(e.connectionStatus=this.callbacks.getConnectionStatus(e.name),e.failureMessage=this.callbacks.getFailureMessage?.(e.name)??null,e.connectionStatus==="connected"){let i=this.callbacks.refreshCacheAfterReconnect(e.name);i&&(this.cache??={version:1,servers:{}},this.cache.servers[e.name]=i,this.rebuildServerTools(e,i)),e.hasCachedData=!0}n.afterAuth&&(this.authNotice=o&&e.connectionStatus==="connected"?`OAuth finished for ${r}. Reconnected.`:`OAuth finished for ${r}, but reconnect did not complete. Press ctrl+r to retry.`),this.tui.requestRender()}).catch(o=>{e.connectionStatus="failed";let i=Pe(o instanceof Error?o.message:String(o));this.authNotice=`Reconnect failed for ${r}: ${i}`,this.tui.requestRender()})}toggleItem(e){if(this.authOnly)return;let n=this.servers[e.serverIndex];if(n){if(e.type==="server"){let r=!n.tools.every(i=>i.isDirect);n.source==="import"&&r&&(this.importNotice=`Imported from ${Pe(n.importKind??"external")} \u2014 will copy to user config on save`);let o=0;for(let i of n.tools)i.isDirect=r,r&&(o+=i.estimatedTokens);n.directCount=r?n.tools.length:0,n.directTokens=o}else if(e.toolIndex!==void 0){let r=n.tools[e.toolIndex];if(!r)return;this.toggleToolDirect(n,r),r.isDirect&&n.source==="import"&&(this.importNotice=`Imported from ${Pe(n.importKind??"external")} \u2014 will copy to user config on save`)}this.updateDirty()}}toggleToolDirect(e,n){n.isDirect=!n.isDirect,e.directCount+=n.isDirect?1:-1,e.directTokens+=n.isDirect?n.estimatedTokens:-n.estimatedTokens}handleDiscardInput(e){if(De(e,"ctrl+c")){this.cleanup(),this.done({cancelled:!0,changes:new Map});return}if(De(e,"escape")||e==="n"||e==="N"){this.confirmingDiscard=!1;return}if(this.keys.selectConfirm(e)){this.cleanup(),this.discardSelected===0?this.done({cancelled:!0,changes:new Map}):this.done(this.buildResult());return}if(e==="y"||e==="Y"){this.cleanup(),this.done({cancelled:!0,changes:new Map});return}(De(e,"left")||De(e,"right")||De(e,"tab"))&&(this.discardSelected=this.discardSelected===0?1:0)}moveCursor(e){this.visibleItems.length!==0&&(this.cursorIndex=Math.max(0,Math.min(this.visibleItems.length-1,this.cursorIndex+e)))}getOtherCurrentCandidates(e,n,r,o){let i=new Set;for(let[s,a]of Object.entries(this.config.mcpServers)){if(U(a))continue;let c=this.cache?.servers?.[s],u=s===e?r:c&&$e(c,a)?c:void 0;if(!u)continue;let d=pe(a,this.prefix);for(let l of u.tools??[])if(ke(l.uiVisibility))for(let f of ce(l.name,s,d,!1))i.add(f);if(a.exposeResources!==!1)for(let l of u.resources??[]){let f=`read_${Ce(l.name)}`;for(let p of ce(f,s,d,!1))i.add(p)}}for(let s of ce(o,e,pe(n,this.prefix),!1))i.delete(s);return i}rebuildServerTools(e,n){let r=new Map;for(let i of e.tools)r.set(i.name,i.isDirect);let o=[];for(let i of n.tools??[]){if(!ke(i.uiVisibility)||!Ee(i.name,e.name,this.prefix,e.includeTools,e.excludeTools,this.getOtherCurrentCandidates(e.name,e,n,i.name)))continue;let s=r.get(i.name),a=s!==void 0?s:!1;o.push({name:i.name,description:i.description??"",isDirect:a,wasDirect:s!==void 0?e.tools.find(c=>c.name===i.name)?.wasDirect??!1:!1,estimatedTokens:Jo(i)})}if(e.exposeResources)for(let i of n.resources??[]){let s=`read_${Ce(i.name)}`;if(!Ee(s,e.name,this.prefix,e.includeTools,e.excludeTools,this.getOtherCurrentCandidates(e.name,e,n,s)))continue;let a=r.get(s),c=a!==void 0?a:!1,u={name:s,...i.description!==void 0?{description:i.description}:{}};o.push({name:s,description:i.description??`Read resource: ${i.uri}`,isDirect:c,wasDirect:a!==void 0?e.tools.find(d=>d.name===s)?.wasDirect??!1:!1,estimatedTokens:Jo(u)})}e.tools=o,e.directCount=0,e.directTokens=0;for(let i of o)i.isDirect&&(e.directCount++,e.directTokens+=i.estimatedTokens);this.rebuildVisibleItems(),this.updateDirty()}render(e){let n=e-2,r=[],o=this.t,i=P=>`\x1B[1m${P}\x1B[22m`,s=P=>`\x1B[3m${P}\x1B[23m`,a=P=>`\x1B[7m${P}\x1B[27m`,c=P=>K(o.border,"\u2502")+Dl(" "+ov(P),n,"\u2026",!0)+K(o.border,"\u2502"),u=()=>K(o.border,"\u2502")+" ".repeat(n)+K(o.border,"\u2502"),d=()=>K(o.border,"\u251C"+"\u2500".repeat(n)+"\u2524"),l=this.authOnly?" MCP OAuth ":" MCP Servers ",f=n-Vn(l),p=Math.floor(f/2),g=f-p;r.push(K(o.border,"\u256D"+"\u2500".repeat(p))+K(o.title,l)+K(o.border,"\u2500".repeat(g)+"\u256E")),r.push(u());let y=K(o.selected,"\u2502"),w=K(o.border,"\u25CE");if(this.descSearchActive?r.push(c(`${w} ${K(o.needsAuth,"desc:")} ${this.descQuery}${y}`)):this.nameQuery?r.push(c(`${w} ${this.nameQuery}${y}`)):r.push(c(`${w} ${K(o.placeholder,s("search..."))}`)),r.push(u()),this.noticeLines.length>0){for(let P of this.noticeLines)r.push(c(K(o.hint,s(Pe(P)))));r.push(u())}if(r.push(d()),this.servers.length===0)r.push(u()),r.push(c(K(o.hint,s(this.authOnly?"No OAuth-capable MCP servers configured.":"No MCP servers configured.")))),r.push(u());else{let P=t.MAX_VISIBLE,C=this.visibleItems.length,E=Math.max(0,Math.min(this.cursorIndex-Math.floor(P/2),C-P)),L=Math.min(E+P,C);r.push(u());for(let H=E;H<L;H++){let $=this.visibleItems[H];if(!$)continue;let O=H===this.cursorIndex,T=this.servers[$.serverIndex];if(T){if($.type==="server"){if(r.push(c(this.renderServerRow(T,O))),O&&T.connectionStatus==="failed"&&T.failureMessage)for(let G of this.wrapText(Pe(T.failureMessage),n-6))r.push(c(` ${K(o.cancel,G)}`))}else if($.toolIndex!==void 0){let G=T.tools[$.toolIndex];G&&r.push(c(this.renderToolRow(G,O,n)))}}}if(r.push(u()),C>P){let H=Math.round((this.cursorIndex+1)/C*10);r.push(c(`${rv(H,10)} ${K(o.hint,`${this.cursorIndex+1}/${C}`)}`)),r.push(u())}this.importNotice&&(r.push(c(K(o.needsAuth,s(Pe(this.importNotice))))),r.push(u())),this.authNotice&&(r.push(c(K(o.needsAuth,s(Pe(this.authNotice))))),r.push(u()))}if(r.push(d()),r.push(u()),this.confirmingDiscard){let P=this.discardSelected===0?a(i(K(o.cancel," Discard "))):K(o.hint," Discard "),C=this.discardSelected===1?a(i(K(o.confirm," Keep & Close "))):K(o.hint," Keep & Close ");r.push(c(`Discard unsaved changes? ${P} ${C}`))}else if(this.authOnly)r.push(c(K(o.description,"select a server to authenticate")));else{let P=0,C=0;for(let L of this.servers)P+=L.directCount,C+=L.directTokens;let E=P>0?`${P} direct ~${C.toLocaleString()} tokens`:"no direct tools";r.push(c(K(o.description,E+(this.dirty?K(o.needsAuth," (unsaved)"):""))))}r.push(u());let b=this.keys.saveLabel(),v=this.authOnly?[s("\u2191\u2193")+" navigate",s("\u23CE")+" auth",s("ctrl+a")+" auth",s("esc")+" clear/close",s("ctrl+c")+" quit"]:[s("\u2191\u2193")+" navigate",s("space")+" toggle",s("\u23CE")+" expand/auth",s("ctrl+a")+" auth",s("ctrl+r")+" reconnect",...this.selectedServerHasFailureMessage()?[s("ctrl+y")+" copy error"]:[],s("?")+" desc search",...b?[s(b)+" save"]:[],s("esc")+" clear/close",s("ctrl+c")+" quit"],m=" ",S=2,R=n-2,h="",M=0;for(let P of v){let C=Vn(P),E=M===0?C:S+C;M>0&&M+E>R?(r.push(c(K(o.hint,h))),h=P,M=C):(h+=(M>0?m:"")+P,M+=E)}return h&&r.push(c(K(o.hint,h))),r.push(K(o.border,"\u2570"+"\u2500".repeat(n)+"\u256F")),r}renderServerRow(e,n){let r=this.t,o=w=>`\x1B[1m${w}\x1B[22m`,i=e.expanded?"\u25BE":"\u25B8",s=n?K(r.selected,i):K(r.border,e.expanded?i:"\xB7"),a=Pe(e.name),c=Pe(e.importKind??"import"),u=n?o(K(r.selected,a)):a,d=e.source==="import"?K(r.description,` (${c})`):"",l=this.renderConnectionStatus(e);if(!e.hasCachedData&&!this.authOnly)return`${s} ${u}${d} ${K(r.description,"(not cached)")}${l}`;let f=e.directCount,p=e.tools.length,g=K(r.description,"\u25CB");f===p&&p>0?g=K(r.direct,"\u25CF"):f>0&&(g=K(r.needsAuth,"\u25D0"));let y="";return p>0&&(y=`${f}/${p}`,f>0&&(y+=` ~${e.directTokens.toLocaleString()}`),y=K(r.description,y)),`${s} ${g} ${u}${d} ${y}${l}`}selectedServerHasFailureMessage(){let e=this.visibleItems[this.cursorIndex];if(!e)return!1;let n=this.servers[e.serverIndex];return n?.connectionStatus==="failed"&&!!n.failureMessage}wrapText(e,n){let r=Math.max(8,n),o=e.split(/\s+/).filter(Boolean),i=[],s="",a=c=>{let u=c;for(;Vn(u)>r;){let d="",l=0;for(;l<u.length&&Vn(d+u.charAt(l))<=r;)d+=u.charAt(l),l++;d||(d=u.charAt(0)),i.push(d),u=u.slice(d.length)}return u};for(let c of o){let u=s?`${s} ${c}`:c;Vn(u)<=r?s=u:(s&&i.push(s),s=a(c))}return s&&i.push(s),i.length>0?i:[e]}renderConnectionStatus(e){let n=this.t;return this.authInFlight===e.name?` ${K(n.needsAuth,"authenticating")}`:e.connectionStatus==="disabled"?` ${K(n.description,"disabled")}`:e.connectionStatus==="needs-auth"?` ${K(n.needsAuth,"needs auth")}`:e.connectionStatus==="connecting"?` ${K(n.needsAuth,"connecting")}`:e.connectionStatus==="failed"?` ${K(n.cancel,"failed")}`:this.authOnly&&e.connectionStatus==="connected"?` ${K(n.direct,"connected")}`:this.authOnly?` ${K(n.description,"idle")}`:""}renderToolRow(e,n,r){let o=this.t,i=g=>`\x1B[1m${g}\x1B[22m`,s=e.isDirect?K(o.direct,"\u25CF"):K(o.description,"\u25CB"),a=n?K(o.selected,"\u25B8"):" ",c=Pe(e.name),u=Pe(e.description),d=n?i(K(o.selected,c)):c,l=7+Vn(c),f=Math.max(0,r-l-8),p=f>5&&u?K(o.description,"\u2014 "+Dl(u,f,"\u2026")):"";return` ${a} ${s} ${d} ${p}`}invalidate(){}dispose(){this.cleanup()}}});import{Type as oe}from"typebox";ue();Tn();ue();Tn();import{existsSync as By}from"node:fs";var pt=class extends Error{code;context;recoveryHint;cause;constructor(e,n){super(e),this.name="McpUiError",this.code=n.code,this.context=n.context??{},this.recoveryHint=n.recoveryHint,this.cause=n.cause,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,code:this.code,message:this.message,context:this.context,recoveryHint:this.recoveryHint,stack:this.stack}}},co=class extends pt{constructor(e,n,r){super(`Failed to fetch UI resource "${e}": ${n}`,{code:"RESOURCE_FETCH_ERROR",context:{uri:e,...r?.server!==void 0?{server:r.server}:{}},recoveryHint:"Check that the MCP server is connected and the resource URI is valid.",...r?.cause!==void 0?{cause:r.cause}:{}}),this.name="ResourceFetchError"}},An=class extends pt{constructor(e,n,r){super(`Invalid UI resource "${e}": ${n}`,{code:"RESOURCE_PARSE_ERROR",context:{uri:e,...r?.server!==void 0?{server:r.server}:{},...r?.mimeType!==void 0?{mimeType:r.mimeType}:{}},recoveryHint:"Ensure the resource returns valid HTML with the correct MIME type."}),this.name="ResourceParseError"}};var pr=class extends pt{denied;constructor(e,n){let r=n.denied?`Tool calls for "${e}" were denied for this session`:`Tool call approval required for "${e}"`;super(r,{code:n.denied?"CONSENT_DENIED":"CONSENT_REQUIRED",context:{server:e},recoveryHint:n.denied?"The user denied tool access. Start a new session to try again.":"Prompt the user for consent before calling tools."}),this.name="ConsentError",this.denied=n.denied??!1}};var gr=class extends pt{constructor(e,n){super(`UI server error: ${e}`,{code:"SERVER_ERROR",context:n?.port!==void 0?{port:n.port}:{},recoveryHint:"Check if the port is available. Another process may be using it.",...n?.cause!==void 0?{cause:n.cause}:{}}),this.name="ServerError"}};function Ec(t,e){if(t instanceof pt)return new pt(t.message,{code:t.code,context:{...t.context,...e},...t.recoveryHint!==void 0?{recoveryHint:t.recoveryHint}:{},...t.cause!==void 0?{cause:t.cause}:{}});let n=t instanceof Error?t:void 0,r=t instanceof Error?t.message:String(t);return new pt(r,{code:"UNKNOWN_ERROR",...e!==void 0?{context:e}:{},...n!==void 0?{cause:n}:{}})}var kc={debug:0,info:1,warn:2,error:3},Hp={debug:"[MCP-UI:DEBUG]",info:"[MCP-UI]",warn:"[MCP-UI:WARN]",error:"[MCP-UI:ERROR]"},Ni=class{minLevel="info";handlers=[];defaultContext={};setLevel(e){this.minLevel=e}setDefaultContext(e){this.defaultContext=e}addHandler(e){this.handlers.push(e)}clearHandlers(){this.handlers=[]}shouldLog(e){return kc[e]>=kc[this.minLevel]}emit(e,n,r,o){if(!this.shouldLog(e))return;let i={level:e,message:n,context:{...this.defaultContext,...r},...o!==void 0?{error:o}:{},timestamp:new Date},s=Hp[e],a=Fp(i.context),c=a?`${s} ${n} ${a}`:`${s} ${n}`;e==="error"?console.error(c,o??""):e==="warn"?console.warn(c):e==="debug"?console.debug(c):console.log(c);for(let u of this.handlers)try{u(i)}catch{}}debug(e,n){this.emit("debug",e,n)}info(e,n){this.emit("info",e,n)}warn(e,n){this.emit("warn",e,n)}error(e,n,r){this.emit("error",e,r,n)}child(e){return new Li(this,e)}},Li=class t{constructor(e,n){this.parent=e;this.context=n}parent;context;debug(e,n){this.parent.debug(e,{...this.context,...n})}info(e,n){this.parent.info(e,{...this.context,...n})}warn(e,n){this.parent.warn(e,{...this.context,...n})}error(e,n,r){this.parent.error(e,n,{...this.context,...r})}child(e){return new t(this.parent,{...this.context,...e})}};function Fp(t){if(!t||Object.keys(t).length===0)return"";let e=[];for(let[n,r]of Object.entries(t))r!=null&&e.push(`${n}=${typeof r=="string"?r:JSON.stringify(r)}`);return e.length>0?`(${e.join(", ")})`:""}var X=new Ni;(process.env.MCP_UI_DEBUG==="1"||process.env.MCP_UI_DEBUG==="true")&&X.setLevel("debug");var uo=class{constructor(e="once-per-server"){this.mode=e;this.log.debug("Initialized",{mode:e})}mode;approvedServers=new Set;deniedServers=new Set;log=X.child({component:"ConsentManager"});requiresPrompt(e){return this.mode==="never"?!1:this.deniedServers.has(e)||this.mode==="always"?!0:!this.approvedServers.has(e)}shouldCacheConsent(){return this.mode!=="always"}registerDecision(e,n){if(this.deniedServers.delete(e),this.approvedServers.delete(e),n){this.approvedServers.add(e),this.log.debug("Consent granted",{server:e});return}this.deniedServers.add(e),this.log.debug("Consent denied",{server:e})}ensureApproved(e){if(this.mode!=="never"){if(this.deniedServers.has(e))throw new pr(e,{denied:!0});if(!this.approvedServers.has(e))throw new pr(e,{requiresApproval:!0});this.mode==="always"&&this.approvedServers.delete(e)}}clear(e){if(e){this.approvedServers.delete(e),this.deniedServers.delete(e),this.log.debug("Cleared consent for server",{server:e});return}this.approvedServers.clear(),this.deniedServers.clear(),this.log.debug("Cleared all consent records")}};ue();import{SdkError as wy,SdkErrorCode as pl}from"@modelcontextprotocol/client";import{mkdirSync as ey,statSync as ty}from"node:fs";import{isDeepStrictEqual as ul}from"node:util";import{Client as ny,SdkError as ry,SdkErrorCode as oy,SdkHttpError as Is,SSEClientTransport as iy,StreamableHTTPClientTransport as sy,UnauthorizedError as ay}from"@modelcontextprotocol/client";import{StdioClientTransport as cy}from"@modelcontextprotocol/client/stdio";import{createConnection as zp}from"node:net";import{ReadBuffer as qp,serializeMessage as Vp}from"@modelcontextprotocol/client";var lo=class{constructor(e){this.socketPath=e}socketPath;socket;readBuffer=new qp;onclose;onerror;onmessage;async start(){if(this.socket)throw new Error("UnixSocketClientTransport already started");await new Promise((e,n)=>{let r=zp(this.socketPath);this.socket=r;let o=!1;r.once("connect",()=>{o=!0,e()}),r.on("data",i=>{try{for(this.readBuffer.append(i);;){let s=this.readBuffer.readMessage();if(s===null)break;this.onmessage?.(s)}}catch(s){let a=s instanceof Error?s:new Error(String(s));this.onerror?.(a),this.close()}}),r.on("error",i=>{o||n(i),this.onerror?.(i)}),r.on("close",()=>{this.socket===r&&(this.socket=void 0),this.readBuffer.clear(),this.onclose?.()})})}async close(){let e=this.socket;this.socket=void 0,this.readBuffer.clear(),!(!e||e.destroyed)&&await new Promise(n=>{let r=setTimeout(()=>e.destroy(),2e3);r.unref(),e.once("close",()=>{clearTimeout(r),n()}),e.end()})}async send(e){let n=this.socket;if(!n||n.destroyed)throw new Error("Unix socket is not connected");await new Promise((r,o)=>{n.write(Vp(e),i=>{i?o(i):r()})})}};var po="2026-07-28",Kp="2025-06-18",Oc="application/json, text/event-stream",Jp="text/event-stream",Wp=new Set([400,401,404,405,406,415]),Gp=new Set([404,405,406,415]),Yp=new Set([202,401,503]),Xp={jsonrpc:"2.0",id:1,method:"server/discover",params:{}},Qp={jsonrpc:"2.0",id:1,method:"initialize",params:{protocolVersion:Kp,capabilities:{},clientInfo:{name:"pi-mcp-probe",version:"2.1.2"}}},Zp={kind:"modern",request:{method:"POST",headers:{Accept:Oc,"Content-Type":"application/json","MCP-Protocol-Version":po,"Mcp-Method":"server/discover"},body:JSON.stringify(Xp)},allowJson:!0},eg={kind:"legacy-post",request:{method:"POST",headers:{Accept:Oc,"Content-Type":"application/json"},body:JSON.stringify(Qp)},allowJson:!0},tg={kind:"legacy-sse",request:{headers:{Accept:Jp}},allowJson:!1};function ng(t){if(typeof t!="object"||t===null||t.jsonrpc!=="2.0")return null;if("result"in t){let e=t.result;return{kind:"result",protocolVersion:typeof e=="object"&&e!==null?e.protocolVersion:void 0}}return"error"in t?{kind:"error"}:null}function rg(t){return/(?:^|,)\s*Bearer\b/i.test(t.headers.get("www-authenticate")??"")}function og(t){let e=t.headers.get("content-type")?.split(";",1)[0]?.trim().toLowerCase();return e==="text/html"?"HTML":e||"an untyped response"}async function ig(t){try{return ng(JSON.parse(await t.text()))}catch{return null}}async function sg(t,e){let n=t.headers.get("content-type")?.toLowerCase().startsWith("text/event-stream");if(t.ok&&n)return{kind:"mcp",result:{isMcp:!0,classification:"endpoint responded with an MCP event stream"}};let r=e.allowJson||t.status===401?await ig(t):null;return t.ok&&e.allowJson&&r?e.kind==="modern"&&(r.kind==="error"||r.protocolVersion!==po)?{kind:"unsupported-modern"}:{kind:"mcp",result:{isMcp:!0,classification:e.kind==="modern"?`endpoint supports stateless MCP ${po} server/discover`:"endpoint responded with a JSON-RPC 2.0 envelope"}}:t.status===401&&rg(t)&&r?{kind:"mcp",result:{isMcp:!0,classification:e.kind==="modern"?`endpoint requires Bearer authentication during MCP ${po} server/discover probing`:"endpoint requires Bearer authentication and responded with a JSON-RPC 2.0 error"}}:{kind:"unrecognized"}}async function ji(t,e){let n=await fetch(t,{...e.request,signal:AbortSignal.timeout(5e3)});return{response:n,outcome:await sg(n,e)}}function go(t){let e=`endpoint returned ${og(t)} (${t.status})`;return{isMcp:!1,classification:t.status===503?`${e} \u2014 server is temporarily unavailable; MCP endpoint shape could not be determined`:t.status===202?`${e} \u2014 MCP endpoint shape could not be determined`:t.status===401?`${e} \u2014 authentication may be required; MCP endpoint shape could not be determined`:`${e} \u2014 this URL does not appear to speak MCP`}}function fo(t){return Yp.has(t.status)?go(t):void 0}async function $c(t){let{response:e,outcome:n}=await ji(t,Zp);if(n.kind==="mcp")return n.result;let r=fo(e);if(n.kind!=="unsupported-modern"&&!Wp.has(e.status))return r??go(e);let{response:o,outcome:i}=await ji(t,eg);if(i.kind==="mcp")return i.result;if(r??=fo(o),!Gp.has(o.status))return fo(o)??r??go(o);let{response:s,outcome:a}=await ji(t,tg);return a.kind==="mcp"?a.result:fo(s)??r??go(s)}ue();tt();import{existsSync as Jt,readFileSync as Hi,realpathSync as ag,readdirSync as cg,statSync as ug,writeFileSync as Dc,renameSync as lg,mkdirSync as dg,openSync as fg,readSync as pg,closeSync as gg,unlinkSync as mg}from"node:fs";import{join as Kt,dirname as hg,extname as yg,resolve as vg,sep as Ic}from"node:path";function D(t){if(t?.aborted)throw t.reason instanceof Error?t.reason:new Error(String(t.reason??"MCP request aborted"))}async function ve(t,e){return e?(D(e),await new Promise((n,r)=>{let o=!1,i=()=>e.removeEventListener("abort",s),s=()=>{o||(o=!0,i(),r(e.reason instanceof Error?e.reason:new Error(String(e.reason??"MCP request aborted"))))};e.addEventListener("abort",s,{once:!0}),t.then(a=>{o||(o=!0,i(),n(a))},a=>{o||(o=!0,i(),r(a))})})):t}import Nc from"cross-spawn";var Bi=2,Sg=1440*60*1e3,wg=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z][0-9A-Za-z.-]*)?(?:\+[0-9A-Za-z][0-9A-Za-z.-]*)?$/;async function Lc(t,e,n){D(n);let r=t==="npx"?bg(e):t==="npm"?Cg(e):null;if(!r)return null;let o=jc(r.packageSpec),i=JSON.stringify([t,r.packageSpec,r.binName??""]),a=$g()?.entries?.[i];if(a&&Date.now()-a.resolvedAt<Sg&&Jt(a.resolvedBin)&&(!o?.exactVersion||a.packageVersion===o.exactVersion))return{binPath:a.resolvedBin,extraArgs:r.extraArgs,isJs:a.isJs};let c=_c(r.packageSpec,r.binName);if(c)return Uc(i,c),{binPath:c.resolvedBin,extraArgs:r.extraArgs,isJs:c.isJs};await Mg(r.packageSpec,n);let u=_c(r.packageSpec,r.binName);return u?(Uc(i,u),{binPath:u.resolvedBin,extraArgs:r.extraArgs,isJs:u.isJs}):null}function bg(t){let e=t.indexOf("--"),n=e>=0?t.slice(0,e):t,r=e>=0?t.slice(e+1):[],o=[],i,s=!1,a=!1;for(let l=0;l<n.length;l++){let f=n[l];if(f===void 0)return null;if(a){o.push(f);continue}if(!(f==="-y"||f==="--yes")){if(f==="-p"||f==="--package"){let p=n[l+1];if(!p||p.startsWith("-"))return null;i||(i=p),s=!0,l++;continue}if(f.startsWith("--package=")){let p=f.slice(10);if(!p)return null;i||(i=p),s=!0;continue}if(f.startsWith("-"))return null;o.push(f),a=!0}}let c=e>=0&&r.length>0?["--",...r]:r;if(s){let l=o[0];if(!i||!l)return null;let f=o.slice(1).concat(c);return{packageSpec:i,binName:l,extraArgs:f}}let u=o[0];if(!u)return null;let d=o.slice(1).concat(c);return{packageSpec:u,extraArgs:d}}function Cg(t){if(t[0]!=="exec")return null;let e=t.slice(1),n=e.indexOf("--");if(n<0)return null;let r=e.slice(0,n),o=e.slice(n+1),i;for(let c=0;c<r.length;c++){let u=r[c];if(u===void 0)return null;if(!(u==="-y"||u==="--yes")){if(u==="--package"){let d=r[c+1];if(!d||d.startsWith("-"))return null;i||(i=d),c++;continue}if(u.startsWith("--package=")){let d=u.slice(10);if(!d)return null;i||(i=d);continue}if(u.startsWith("-"))return null}}let s=o[0];if(!i||!s)return null;let a=o.slice(1);return{packageSpec:i,binName:s,extraArgs:a}}function _c(t,e){let n=kg();if(!n)return null;let r=jc(t);if(!r)return null;let{packageName:o,exactVersion:i}=r,s=Pg(n,o,i);if(!s)return null;let a=Kt(s,"package.json");if(!Jt(a))return null;let c=null;try{c=JSON.parse(Hi(a,"utf-8"))}catch{return null}let u=c?.bin;if(!u)return null;let d=Tg(o,e),l,f;if(typeof u=="string")l=Ag(o),f=u;else{for(let b of d)if(u[b]){l=b,f=u[b];break}if(!f){let b=Object.entries(u)[0];b&&(l=b[0],f=b[1])}}if(!f)return null;let p=Rg(s),g=l?Kt(p,".bin",l):null,y=g&&Jt(g)?Ig(g):"";if(!y&&(y=vg(s,f),!Jt(y)))return null;let w=Eg(y);return{resolvedBin:y,resolvedAt:Date.now(),...c?.version!==void 0?{packageVersion:c.version}:{},isJs:w}}var xg=3e4;async function Mg(t,e){D(e);try{await new Promise((n,r)=>{let o=Nc("npm",["exec","--yes","--package",t,"--","node","-e","1"],{stdio:"ignore"}),i=setTimeout(()=>{o.kill(),r(new Error("timeout"))},xg),s=()=>{o.kill(),r(e?.reason instanceof Error?e.reason:new Error("MCP request aborted"))};e?.addEventListener("abort",s,{once:!0}),i.unref(),o.on("close",()=>{clearTimeout(i),e?.removeEventListener("abort",s),n()}),o.on("error",a=>{clearTimeout(i),e?.removeEventListener("abort",s),r(a)})})}catch{e?.aborted&&D(e)}D(e)}function Tg(t,e){let n=[];if(e&&n.push(e),t.startsWith("@")){let r=t.split("/")[1]??"",o=t.split("/")[0]?.replace("@","")??"";r&&n.push(r),o&&r&&n.push(`${o}-${r}`)}else n.push(t);return[...new Set(n.filter(Boolean))]}function jc(t){let e=t.trim();if(!e)return null;let n,r;if(e.startsWith("@")){let i=e.indexOf("/");if(i<0)return null;let s=e.lastIndexOf("@");s>i?(n=e.slice(0,s),r=e.slice(s+1)):n=e}else{let i=e.indexOf("@");i>=0?(n=e.slice(0,i),r=e.slice(i+1)):n=e}if(!n)return null;let o=r?.replace(/^=/,"").replace(/^v/i,"");return{packageName:n,...o&&wg.test(o)?{exactVersion:o}:{}}}function Ag(t){return t.startsWith("@")?t.split("/")[1]??t.replace("@","").replace("/","-"):t}function Pg(t,e,n){let r=Kt(t,"_npx");if(!Jt(r))return null;let o=e.startsWith("@")?e.split("/"):[e],i=cg(r,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>{let a=Kt(r,s.name),c=_g(a);return{name:s.name,mtime:c}}).sort((s,a)=>a.mtime-s.mtime);for(let s of i){let a=Kt(r,s.name,"node_modules",...o),c=Kt(a,"package.json");if(Jt(c)){if(n)try{if(JSON.parse(Hi(c,"utf-8")).version!==n)continue}catch{continue}return a}}return null}function Rg(t){let e=t.split(Ic),n=e.lastIndexOf("node_modules");return n>=0?e.slice(0,n+1).join(Ic):Kt(t,"..")}function Eg(t){let e=yg(t).toLowerCase();if(e===".js"||e===".mjs"||e===".cjs")return!0;try{let n=fg(t,"r");try{let r=Buffer.alloc(256);pg(n,r,0,256,0);let o=r.toString("utf-8").split(`
11
+ `)[0]??"";return o.startsWith("#!")&&o.includes("node")}finally{gg(n)}}catch{return!1}}var Mt;function kg(){if(Mt!==void 0)return Mt;if(process.env.NPM_CONFIG_CACHE)return Mt=process.env.NPM_CONFIG_CACHE,Mt;try{let t=Nc.sync("npm",["config","get","cache"],{encoding:"utf-8"});if(t.status===0)return Mt=String(t.stdout).trim()||null,Mt}catch{return Mt=null,null}return Mt=null,null}function Fi(){return Qe("mcp-npx-cache.json")}function zi(t){if(!Jt(t))return null;try{return JSON.parse(Hi(t,"utf-8"))}catch{return null}}function mo(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)?t:null}function Bc(){return Object.create(null)}function Og(t){let e=mo(t);return!e||typeof e.resolvedBin!="string"||typeof e.resolvedAt!="number"||!Number.isFinite(e.resolvedAt)||typeof e.isJs!="boolean"||e.packageVersion!==void 0&&typeof e.packageVersion!="string"?null:{resolvedBin:e.resolvedBin,resolvedAt:e.resolvedAt,...e.packageVersion!==void 0?{packageVersion:e.packageVersion}:{},isJs:e.isJs}}function Hc(t){let e=mo(t);if(!e||e.version!==Bi)return null;let n=mo(e.entries);if(!n)return null;let r=Bc();for(let[o,i]of Object.entries(n)){let s=Og(i);s&&(r[o]=s)}return{version:Bi,entries:r}}function Fc(){let t=Fi();if(mo(zi(t))?.version!==1)return!1;try{mg(t)}catch{try{Dc(t,"","utf-8")}catch{}}return!0}Fc();function $g(){return Fc()?null:Hc(zi(Fi()))}function Uc(t,e){try{let n=Fi(),r=hg(n);dg(r,{recursive:!0});let o=Hc(zi(n)),i=Bc();o&&Object.assign(i,o.entries);let s={version:Bi,entries:i};s.entries[t]=e;let a=`${n}.${process.pid}.tmp`;Dc(a,JSON.stringify(s,null,2),"utf-8"),lg(a,n)}catch{}}function Ig(t){try{return ag(t)}catch{return""}}function _g(t){try{return ug(t).mtimeMs}catch{return 0}}import{Ajv as Ug}from"ajv";import Dg from"ajv/dist/2020.js";import Ng from"ajv-formats";import{AjvJsonSchemaValidator as zc}from"@modelcontextprotocol/client/validators/ajv";var qc=Ng,Lg=new Set(["http://json-schema.org/draft-07/schema","https://json-schema.org/draft-07/schema"]),jg=new Set(["https://json-schema.org/draft/2020-12/schema"]);function Bg(t){return!("$schema"in t)||typeof t.$schema!="string"?{status:"unstamped"}:{status:"stamped",uri:t.$schema.endsWith("#")?t.$schema.slice(0,-1):t.$schema}}function Vc(){let t,e;return{getValidator(n){let r=Bg(n);if(r.status==="unstamped"||jg.has(r.uri))return e??=(()=>{let o=Dg,i=new o({strict:!1,allErrors:!0});return qc(i),new zc(i)})(),e.getValidator(n);if(!Lg.has(r.uri))throw new Error(`Unsupported JSON Schema dialect: ${r.uri}`);return t??=(()=>{let o=new Ug({strict:!1,validateFormats:!0,validateSchema:!1,allErrors:!0});return qc(o),new zc(o)})(),t.getValidator(n)}}}Rn();import{UnauthorizedError as mu}from"@modelcontextprotocol/client";tt();Tn();import{spawnSync as zg}from"child_process";import{createHash as Zc}from"crypto";import{createRequire as qg}from"module";import{readFileSync as Vg,existsSync as eu,rmSync as Jc}from"fs";import{dirname as Kg,join as Yi}from"path";import{fileURLToPath as Jg}from"url";var Wg=qg(import.meta.url),tu="pi-mcp-adapter.oauth",yo="PI_MCP_ADAPTER_TEST_AUTH_STORE",vo=1e3,Wc=1280,Gg="PI_MCP_ADAPTER_DISABLE_KEYRING_RECOVERY",Yg="PI_MCP_ADAPTER_KEYRING_RECOVERY_KEYCTL",Xg="PI_MCP_ADAPTER_KEYRING_RECOVERY_NODE",Qg="PI_MCP_ADAPTER_KEYRING_RECOVERY_HELPER",Zg="PI_MCP_ADAPTER_TEST_LINUX_KEYRING_RECOVERY",em="PI_MCP_ADAPTER_DISABLE_AUTH_CACHE",tm=1e4,nu="__piMcpAdapterOAuthChunked",At=class extends Error{constructor(n,r,o){super(n,{cause:o});this.operation=r;this.name="OAuthCredentialStoreError"}operation;code="OAUTH_CREDENTIAL_STORE_UNAVAILABLE"};function ru(t,e){let n=new Set,r=t;for(;(typeof r=="object"&&r!==null||typeof r=="function")&&!n.has(r);){n.add(r);let o=r;if([o.name,o.message,o.code].some(i=>typeof i=="string"&&e.test(i)))return!0;r=o.cause}return!1}function nm(t){return process.platform==="linux"&&ru(t,/key\s*(?:has been\s*)?revoked|keyrevoked/i)?"OAuth credential store unavailable: the Linux session keyring may be revoked. Start Pi from a fresh login/keyring session and retry.":"OAuth credential store unavailable. Configure or unlock the OS credential store and retry."}var Gc,En=new Map,wo=0,Wt=new Map;function ou(){return process.env[em]!=="1"}function Ji(t){return t===void 0?void 0:structuredClone(t)}var rm={read(t){return wo++,En.get(t)},write(t,e){En.set(t,e)},remove(t){En.delete(t)}},om={read(t){return Vi(t).getPassword()??void 0},write(t,e){Vi(t).setPassword(e)},remove(t){Vi(t).deleteCredential()}},im={read(t){return wo++,En.get(t)},write(t,e){if(e.length>Wc)throw new Error(`Value of 'password encoded as UTF-16' is longer than the platform limit of ${Wc*2} chars`);En.set(t,e)},remove(t){En.delete(t)}},sm={read(){throw wo++,new Error("simulated secure credential store unavailable")},write(){throw new Error("simulated secure credential store unavailable")},remove(){throw new Error("simulated secure credential store unavailable")}};function qi(){return new Error("Couldn't access platform storage: KeyRevoked",{cause:new Error("KeyRevoked")})}var am={read(){throw wo++,qi()},write(){throw qi()},remove(){throw qi()}};function Xi(){return process.env[yo]==="memory"?rm:process.env[yo]==="sizelimited"?im:process.env[yo]==="unavailable"?sm:process.env[yo]==="keyrevoked"?am:om}function Vi(t){try{return Gc??=cm(),new Gc(tu,t)}catch(e){throw new Error("OAuth secure credential storage is unavailable. Configure the OS credential store and retry authentication.",{cause:e})}}function cm(t=Wg,e=process.platform,n=process.arch){try{return t("@napi-rs/keyring").Entry}catch(r){try{return um(t,e,n).Entry}catch(o){throw new Error(`Failed to load @napi-rs/keyring; absolute-path native binding fallback also failed: ${fm(o)}`,{cause:r})}}}function um(t,e,n){let r=lm(e,n);if(r.length===0)throw new Error(`Unsupported @napi-rs/keyring native binding target: ${e}-${n}`);let o;for(let i of r)try{let s=t.resolve(`${i.packageName}/package.json`);return t(Yi(Kg(s),i.bindingFile))}catch(s){o=s}throw o instanceof Error?o:new Error(String(o))}function lm(t,e){return dm(t,e).map(n=>({packageName:`@napi-rs/keyring-${n}`,bindingFile:`keyring.${n}.node`}))}function dm(t,e){if(t==="darwin"){if(e==="arm64")return["darwin-arm64"];if(e==="x64")return["darwin-x64"]}if(t==="win32"){if(e==="arm64")return["win32-arm64-msvc"];if(e==="x64")return["win32-x64-msvc"];if(e==="ia32")return["win32-ia32-msvc"]}if(t==="linux"){if(e==="arm64")return["linux-arm64-gnu","linux-arm64-musl"];if(e==="arm")return["linux-arm-gnueabihf"];if(e==="riscv64")return["linux-riscv64-gnu"];if(e==="x64")return["linux-x64-gnu","linux-x64-musl"]}return t==="freebsd"&&e==="x64"?["freebsd-x64"]:[]}function fm(t){return t instanceof Error?t.message:String(t)}function pm(){return process.env[Gg]==="1"?!1:process.platform==="linux"||process.env[Zg]==="1"}function Qi(t){return pm()&&ru(t,/key\s*(?:has been\s*)?revoked|keyrevoked/i)}function Ki(t,e,n){let r=process.env[Yg]?.trim()||"keyctl",o=process.env[Xg]?.trim()||"node",i=process.env[Qg]?.trim()||Jg(new URL("./mcp-keyring-helper.cjs",import.meta.url)),s=JSON.stringify({operation:t,service:tu,account:e,payload:n}),a=zg(r,["session","-",o,i],{input:`${s}
12
+ `,encoding:"utf8",maxBuffer:1024*1024,timeout:tm,windowsHide:!0});if(a.error)throw new Error(`Linux keyring recovery helper could not start: ${a.error.message}`,{cause:a.error});if(a.status!==0)throw new Error(`Linux keyring recovery helper failed with exit code ${a.status??"unknown"}`);let c;try{c=JSON.parse(a.stdout.trim())}catch(d){throw new Error("Linux keyring recovery helper returned invalid JSON",{cause:d})}if(typeof c!="object"||c===null||typeof c.ok!="boolean")throw new Error("Linux keyring recovery helper returned an invalid response");let u=c;if(u.ok===!1)throw new Error(u.error||"Linux keyring recovery helper failed");if(t==="read"&&u.found===!0&&typeof u.value!="string")throw new Error("Linux keyring recovery helper returned an invalid read response");return u}var Zi={read(t){let e=Ki("read",t);return e.ok&&e.found===!0?e.value:void 0},write(t,e){Ki("write",t,e)},remove(t){Ki("remove",t)}};function bo(t,e=process.cwd()){let n=Rc(t,e);return n?{baseDir:n}:{}}function Co(t={}){let e=process.env.MCP_OAUTH_DIR?.trim();return e||(t.baseDir??Qe("mcp-oauth"))}function iu(t,e){if(typeof t!="string")throw new Error(`Invalid MCP server name: ${JSON.stringify(t)}`);let n=xo(t);return Yi(Co(e),n)}function xo(t){if(typeof t!="string")throw new Error(`Invalid MCP server name: ${JSON.stringify(t)}`);return`sha256-${Zc("sha256").update(t,"utf8").digest("hex")}`}function su(t,e){return Yi(iu(t,e),"tokens.json")}function au(t,e,n){try{return JSON.parse(e)}catch(r){throw new Error(`Failed to parse OAuth credentials for ${t} from ${n}`,{cause:r})}}function es(t,e,n){let r=au(t,e,n),o=cu(r);if(!o)throw new Error(`Failed to parse OAuth credentials for ${t} from ${n}: invalid credential shape`);return o}function cu(t){let e=ts(t);if(!e)return;let n=Tt(e.codeVerifier),r=Tt(e.oauthState),o=Tt(e.serverUrl);if(n===null||r===null||o===null)return;let i=e.tokens===void 0?void 0:gm(e.tokens),s=e.clientInfo===void 0?void 0:mm(e.clientInfo);if(e.tokens!==void 0&&!i||e.clientInfo!==void 0&&!s)return;let a={};return i&&(a.tokens=i),s&&(a.clientInfo=s),n!==void 0&&(a.codeVerifier=n),r!==void 0&&(a.oauthState=r),o!==void 0&&(a.serverUrl=o),a}function gm(t){let e=ts(t);if(!e||typeof e.accessToken!="string")return;let n=Tt(e.refreshToken),r=Tt(e.scope),o=Tt(e.issuer),i=Wi(e.expiresAt);if(n===null||r===null||o===null||i===null)return;let s={accessToken:e.accessToken};return n!==void 0&&(s.refreshToken=n),i!==void 0&&(s.expiresAt=i),r!==void 0&&(s.scope=r),o!==void 0&&(s.issuer=o),s}function mm(t){let e=ts(t);if(!e||typeof e.clientId!="string")return;let n=Tt(e.clientSecret),r=Tt(e.issuer),o=Wi(e.clientIdIssuedAt),i=Wi(e.clientSecretExpiresAt),s=hm(e.configPreRegistered);if(n===null||r===null||o===null||i===null||s===null)return;let a={clientId:e.clientId},c=ym(e.redirectUris);return n!==void 0&&(a.clientSecret=n),o!==void 0&&(a.clientIdIssuedAt=o),i!==void 0&&(a.clientSecretExpiresAt=i),c!==void 0&&(a.redirectUris=c),r!==void 0&&(a.issuer=r),s!==void 0&&(a.configPreRegistered=s),a}function ts(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)?t:void 0}function Tt(t){if(t!==void 0)return typeof t=="string"?t:null}function Wi(t){if(t!==void 0)return typeof t=="number"?t:null}function hm(t){if(t!==void 0)return typeof t=="boolean"?t:null}function ym(t){return Array.isArray(t)&&t.every(e=>typeof e=="string")?t:void 0}function vm(t){if(typeof t!="object"||t===null)return!1;let e=t;return e[nu]===1&&typeof e.chunkCount=="number"&&Number.isInteger(e.chunkCount)&&e.chunkCount>0&&typeof e.chunkDigest=="string"&&/^[a-f0-9]{16}$/.test(e.chunkDigest)}function uu(t,e,n){return`${t}.chunk.${e.chunkDigest}.${n}`}function lu(t,e){return Array.from({length:e.chunkCount},(n,r)=>uu(t,e,r))}function ns(t,e,n){let r=au(t,e,n);return vm(r)?r:void 0}function Sm(t,e,n){try{let r=t.read(n);return r===void 0?void 0:ns(e,r,"OS secure credential store")}catch{return}}function du(t,e,n){for(let r of lu(e,n))t.remove(r)}function Yc(t,e,n){if(n)try{du(t,e,n)}catch{}}function wm(t){return{[nu]:1,chunkCount:Math.ceil(t.length/vo),chunkDigest:Zc("sha256").update(t,"utf8").digest("hex").slice(0,16)}}function bm(t,e,n,r){let o=lu(n,r).map(i=>{try{let s=t.read(i);if(s===void 0)throw new Error(`Missing OAuth credential chunk ${i} for ${e}`);return s}catch(s){throw new At(`Failed to read OAuth credentials for ${e} from the OS secure credential store`,"read",s)}});return es(e,o.join(""),"OS secure credential store chunks")}function Cm(t,e){let n=su(t,e);if(!eu(n))return;let r=Vg(n,"utf-8");return es(t,r,n)}function So(t,e){let n=su(t,e);if(!eu(n))return;try{Jc(n,{force:!0})}catch(o){throw new Error(`Failed to remove legacy plaintext OAuth credentials for ${t} at ${n}`,{cause:o})}let r=iu(t,e);try{Jc(r,{recursive:!0})}catch{}}function Gi(t,e,n){let r=xo(e),o=JSON.stringify(n),i=Sm(t,e,r),s=o.length>vo?wm(o):void 0;try{if(s){for(let a=0;a<s.chunkCount;a++){let c=o.slice(a*vo,(a+1)*vo);t.write(uu(r,s,a),c)}t.write(r,JSON.stringify(s))}else t.write(r,o);i?.chunkDigest!==s?.chunkDigest&&Yc(t,r,i)}catch(a){throw Yc(t,r,s),new At(`Failed to write OAuth credentials for ${e} to the OS secure credential store`,"write",a)}xm(e,o)}function xm(t,e){if(!ou())return;let n=cu(JSON.parse(e));if(!n){Wt.delete(t);return}Wt.set(t,Ji(n))}function Mm(t,e){try{Gi(Xi(),t,e)}catch(n){if(!Qi(n))throw n;Gi(Zi,t,e)}}function Xc(t,e,n,r={}){let o=xo(e),i;try{i=t.read(o)}catch(a){throw new At(`Failed to read OAuth credentials for ${e} from the OS secure credential store`,"read",a)}if(i!==void 0){let a=ns(e,i,"OS secure credential store"),c=a?bm(t,e,o,a):es(e,i,"OS secure credential store");return So(e,n),c}let s=Cm(e,n);if(s)return r.migrateLegacy===!1||(Gi(t,e,s),So(e,n)),s}function fu(t,e,n={}){let r=n.migrateLegacy!==!1&&ou();if(r&&Wt.has(t))return Ji(Wt.get(t));let o;try{o=Xc(Xi(),t,e,n)}catch(i){if(!Qi(i))throw i;o=Xc(Zi,t,e,n)}return r&&Wt.set(t,Ji(o)),o}function Pt(t,e){return fu(t,e)}function kn(t,e,n){let r=Pt(t,n);if(r&&r.serverUrl&&r.serverUrl===e)return r}function pu(t,e,n){try{let r=fu(t,n,{migrateLegacy:!1});return!r?.serverUrl||r.serverUrl!==e?{status:"absent"}:{status:"present",entry:r}}catch(r){if(!(r instanceof At))throw r;return{status:"unavailable",message:nm(r)}}}function On(t,e,n,r){n&&(e.serverUrl=n),Mm(t,e),So(t,r)}function Qc(t,e){let n=xo(e);try{let r=t.read(n),o=r===void 0?void 0:ns(e,r,"OS secure credential store");o&&du(t,n,o),t.remove(n)}catch(r){throw new At(`Failed to remove OAuth credentials for ${e} from the OS secure credential store`,"remove",r)}}function Tm(t,e){try{Qc(Xi(),t)}catch(n){if(!Qi(n))throw n;Qc(Zi,t)}Wt.delete(t),So(t,e)}function at(t){Wt.delete(t)}function rs(t,e,n,r){let o=Pt(t,r)??{};n&&o.serverUrl!==n&&(delete o.clientInfo,delete o.codeVerifier,delete o.oauthState),o.tokens=e,On(t,o,n,r)}function mr(t,e,n,r){let o=Pt(t,r)??{};n&&o.serverUrl!==n&&(delete o.tokens,delete o.codeVerifier,delete o.oauthState),o.clientInfo=e,On(t,o,n,r)}function $n(t,e){let n=Pt(t,e);n&&(delete n.codeVerifier,On(t,n,void 0,e))}function os(t,e){return Pt(t,e)?.oauthState}function Rt(t,e){let n=Pt(t,e);n&&(delete n.oauthState,On(t,n,void 0,e))}function Mo(t,e){Tm(t,e)}function To(t,e){let n=Pt(t,e);n&&(delete n.clientInfo,On(t,n,void 0,e))}function gu(t,e){let n=Pt(t,e);n&&(delete n.tokens,On(t,n,void 0,e))}be();tt();import{OAuthMetadataSchema as Am,OpenIdProviderDiscoveryMetadataSchema as Pm}from"@modelcontextprotocol/core";function hu(){let t=Lt();return t==="pi"?"Pi Coding Agent":t}function Rm(){let t=ja();return t||(Lt()==="pi"?"https://github.com/nicobailon/pi-mcp-adapter":void 0)}function Ao(t,e){return t===e||t.endsWith("/")&&t.slice(0,-1)===e||e.endsWith("/")&&e.slice(0,-1)===t}function Em(t){let e={access_token:t.accessToken,token_type:"Bearer"};return t.refreshToken!==void 0&&(e.refresh_token=t.refreshToken),t.expiresAt!==void 0&&(e.expires_in=Math.max(0,Math.floor(t.expiresAt-Date.now()/1e3))),t.scope!==void 0&&(e.scope=t.scope),t.issuer!==void 0&&(e.issuer=t.issuer),e}var km=19876,Po="/callback",is=km;if(process.env.MCP_OAUTH_CALLBACK_PORT){let t=Number.parseInt(process.env.MCP_OAUTH_CALLBACK_PORT,10);Number.isInteger(t)&&t>0&&t<=65535&&(is=t)}var yu=is,vu=Po;function ss(){return is}function Ro(){return yu}function Eo(t){yu=t}function hr(){return vu}function ko(t){vu=t.startsWith("/")?t:`/${t}`}var Om=new Set(["client_id","code_challenge","code_challenge_method","redirect_uri","resource","response_type","scope","state"]);function $m(t,e){if(!e)return t;let n=new URL(t.toString());for(let[r,o]of Object.entries(e)){if(Om.has(r)||n.searchParams.has(r))throw new Error(`OAuth authorizationParams.${r} cannot override an authorization flow parameter`);n.searchParams.set(r,o)}return n}function Im(t){let e=new URL(t),n=e.pathname.replace(/\/+$/,"")||"/",r="/.well-known/oauth-authorization-server";if(n===r||n.startsWith(`${r}/`)){let i=n.slice(r.length)||"/";return new URL(i,e.origin).toString()}let o="/.well-known/openid-configuration";if(n===o||n.startsWith(`${o}/`)){let i=n.slice(o.length)||"/";return new URL(i,e.origin).toString()}if(n.endsWith(o)){let i=n.slice(0,-o.length)||"/";return new URL(i,e.origin).toString()}}function _m(t,e,n){let r;try{r=new URL(e)}catch(i){throw new Error("OAuth authorization-server metadata issuer must be an absolute URL",{cause:i})}if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error("OAuth authorization-server metadata issuer must use http:// or https://");let o=Im(t);if(!n){if(o!==void 0&&!Ao(o,e))throw new Error(`OAuth authorization-server metadata issuer does not match authServerMetadataUrl: expected ${o}`);if(o===void 0&&!Ao(new URL(t).origin,e))throw new Error(`OAuth authorization-server metadata issuer does not match authServerMetadataUrl origin: expected ${new URL(t).origin}`)}}async function Um(t,e,n,r){let o=await fetch(t,{headers:{accept:"application/json"},...r!==void 0?{signal:r}:{}});if(!o.ok)throw await o.text().catch(()=>{}),new Error(`OAuth authServerMetadataUrl request failed with HTTP ${o.status}`);let i=await o.json(),s=Am.safeParse(i),a=s.success?s.data:Pm.parse(i);_m(t,a.issuer,n);let c=new URL(e);return c.hash="",{authorizationServerUrl:a.issuer,authorizationServerMetadata:a,resourceMetadata:{resource:c.toString()}}}var Gt=class{constructor(e,n,r,o,i={},s,a){this.serverName=e;this.serverUrl=n;this.config=r;this.callbacks=o;this.storageOptions=i;this.runtimeSignal=s;this.flowState=a,this.redirectUrlSnapshot=r.grantType==="client_credentials"?void 0:r.redirectUri??`http://localhost:${Ro()}${hr()}`}serverName;serverUrl;config;callbacks;storageOptions;runtimeSignal;redirectUrlSnapshot;active=!0;flowClientInfo;flowCodeVerifier;flowDiscoveryState;flowIssuerMismatch=!1;flowState;invalidatedAccessToken;invalidatedClientId;lastObservedClientId;lastSavedAccessToken;pendingAuthAccessToken;get usesClientCredentials(){return this.config.grantType==="client_credentials"}get discoveredIssuer(){return this.flowDiscoveryState?.authorizationServerMetadata?.issuer??this.flowDiscoveryState?.authorizationServerUrl}deactivate(){this.active=!1,this.invalidatedAccessToken=void 0,this.invalidatedClientId=void 0,this.lastObservedClientId=void 0,this.lastSavedAccessToken=void 0,this.pendingAuthAccessToken=void 0}assertStoredIssuerBindings(e,n){if(this.flowIssuerMismatch)throw new Error(`OAuth authorization server issuer changed for ${this.serverName}; clear credentials before authenticating again`);if(!e||!n)return;if([e.clientInfo?.issuer,e.tokens?.issuer].filter(o=>o!==void 0).some(o=>!Ao(o,n)))throw this.flowIssuerMismatch=!0,new Error(`OAuth authorization server issuer changed for ${this.serverName}; clear credentials before authenticating again`)}throwIfInactive(){if(!this.active)throw new Error("OAuth flow is no longer active");this.runtimeSignal?.throwIfAborted()}get redirectUrl(){return this.redirectUrlSnapshot}get clientUri(){return this.config.clientUri??Rm()}get clientMetadata(){if(this.usesClientCredentials)return{client_name:this.config.clientName??hu(),...this.clientUri!==void 0?{client_uri:this.clientUri}:{},...this.config.logoUri!==void 0?{logo_uri:this.config.logoUri}:{},redirect_uris:[],grant_types:["client_credentials"],token_endpoint_auth_method:this.config.clientSecret?"client_secret_post":"none"};let e=this.redirectUrl;if(!e)throw new Error("redirectUrl is required for authorization_code flow");return{redirect_uris:[e],client_name:this.config.clientName??hu(),...this.clientUri!==void 0?{client_uri:this.clientUri}:{},...this.config.logoUri!==void 0?{logo_uri:this.config.logoUri}:{},grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:this.config.clientSecret?"client_secret_post":"none",...this.config.scope!==void 0?{scope:this.config.scope}:{}}}async clientInformation(){this.invalidatedClientId!==void 0&&at(this.serverName);let e=this.discoveredIssuer,n=await kn(this.serverName,this.serverUrl,this.storageOptions);if(this.assertStoredIssuerBindings(n,e),this.config.clientId){let o=n?.clientInfo?.clientId===this.config.clientId?n.clientInfo:void 0;e&&(o?.issuer!==e||o.configPreRegistered!==!0)&&mr(this.serverName,{clientId:this.config.clientId,issuer:e,configPreRegistered:!0},this.serverUrl,this.storageOptions);let i=this.config.clientSecret?.startsWith("!")?cr(this.config.clientSecret,`MCP server "${this.serverName}" OAuth clientSecret`):this.config.clientSecret;return{client_id:this.config.clientId,client_secret:i,...e!==void 0?{issuer:e}:{}}}let r=this.flowClientInfo??n?.clientInfo;if(r?.clientId!==this.invalidatedClientId&&r)return this.invalidatedClientId=void 0,r.configPreRegistered===!0||r.clientSecret===void 0&&r.clientIdIssuedAt===void 0&&r.clientSecretExpiresAt===void 0&&r.redirectUris===void 0||r.clientSecretExpiresAt&&r.clientSecretExpiresAt<Date.now()/1e3||e&&r.issuer&&!Ao(r.issuer,e)?void 0:(e&&r.issuer===void 0&&(r.issuer=e,this.flowClientInfo=r,mr(this.serverName,r,this.serverUrl,this.storageOptions)),this.lastObservedClientId=r.clientId,{client_id:r.clientId,client_secret:r.clientSecret,...r.clientIdIssuedAt!==void 0?{client_id_issued_at:r.clientIdIssuedAt}:{},...r.clientSecretExpiresAt!==void 0?{client_secret_expires_at:r.clientSecretExpiresAt}:{},...r.redirectUris!==void 0?{redirect_uris:r.redirectUris}:{},...r.issuer!==void 0?{issuer:r.issuer}:{}})}async saveClientInformation(e){this.throwIfInactive();let n=this.discoveredIssuer??e.issuer;if(this.config.clientId&&e.client_id===this.config.clientId){mr(this.serverName,{clientId:e.client_id,...n!==void 0?{issuer:n}:{},configPreRegistered:!0},this.serverUrl,this.storageOptions);return}let r=("redirect_uris"in e?e.redirect_uris:void 0)??(this.redirectUrl?[this.redirectUrl]:void 0),o={clientId:e.client_id,...e.client_secret!==void 0?{clientSecret:e.client_secret}:{},...e.client_id_issued_at!==void 0?{clientIdIssuedAt:e.client_id_issued_at}:{},...e.client_secret_expires_at!==void 0?{clientSecretExpiresAt:e.client_secret_expires_at}:{},...r!==void 0?{redirectUris:r}:{},...n!==void 0?{issuer:n}:{}};this.flowClientInfo=o,this.invalidatedClientId=void 0,this.lastObservedClientId=o.clientId,mr(this.serverName,o,this.serverUrl,this.storageOptions)}async tokens(e){this.invalidatedAccessToken!==void 0&&at(this.serverName);let n=await kn(this.serverName,this.serverUrl,this.storageOptions);if(!n?.tokens||n.tokens.accessToken===this.invalidatedAccessToken)return;this.invalidatedAccessToken=void 0;let r=this.discoveredIssuer;return this.assertStoredIssuerBindings(n,r),r&&n.tokens.issuer===void 0&&(n.tokens.issuer=r,rs(this.serverName,n.tokens,this.serverUrl,this.storageOptions)),e!==void 0&&(this.pendingAuthAccessToken=n.tokens.accessToken),Em(n.tokens)}async saveTokens(e){let n=this.discoveredIssuer??e.issuer,r={accessToken:e.access_token,...e.refresh_token!==void 0?{refreshToken:e.refresh_token}:{},...e.expires_in!==void 0?{expiresAt:Date.now()/1e3+e.expires_in}:{},...e.scope!==void 0?{scope:e.scope}:{},...n!==void 0?{issuer:n}:{}};this.throwIfInactive(),rs(this.serverName,r,this.serverUrl,this.storageOptions),this.invalidatedAccessToken=void 0,this.lastSavedAccessToken=r.accessToken,this.flowDiscoveryState=void 0}async redirectToAuthorization(e){if(this.usesClientCredentials)throw new Error("redirectToAuthorization is not used for client_credentials flow");if(this.throwIfInactive(),!this.flowState)throw new mu(`Re-authentication required for MCP server: ${this.serverName}`);await this.callbacks.onRedirect($m(e,this.config.authorizationParams))}async saveCodeVerifier(e){this.throwIfInactive(),this.flowCodeVerifier=e}async codeVerifier(){if(this.usesClientCredentials)throw new Error("codeVerifier is not used for client_credentials flow");if(this.throwIfInactive(),!this.flowCodeVerifier)throw new Error(`No code verifier saved for MCP server: ${this.serverName}`);return this.flowCodeVerifier}async saveDiscoveryState(e){this.throwIfInactive(),this.flowDiscoveryState=structuredClone(e)}async discoveryState(){return this.throwIfInactive(),!this.flowDiscoveryState&&this.config.authServerMetadataUrl!==void 0&&(this.flowDiscoveryState=await Um(this.config.authServerMetadataUrl,this.serverUrl,this.config.skipIssuerMetadataValidation===!0,this.runtimeSignal)),this.flowDiscoveryState?structuredClone(this.flowDiscoveryState):void 0}async saveState(e){this.throwIfInactive(),this.flowState=e}async state(){if(this.usesClientCredentials)throw new Error("state is not used for client_credentials flow");if(this.throwIfInactive(),!this.flowState)throw new mu(`Re-authentication required for MCP server: ${this.serverName}`);return this.flowState}async invalidateCredentials(e){switch(this.throwIfInactive(),e){case"all":this.flowClientInfo=void 0,this.flowCodeVerifier=void 0,this.flowDiscoveryState=void 0,this.flowIssuerMismatch=!1,this.flowState=void 0,this.invalidatedAccessToken=void 0,this.invalidatedClientId=void 0,this.lastObservedClientId=void 0,this.lastSavedAccessToken=void 0,this.pendingAuthAccessToken=void 0,Mo(this.serverName,this.storageOptions);break;case"client":this.invalidatedClientId=this.lastObservedClientId,this.lastObservedClientId=void 0,this.flowClientInfo=void 0,at(this.serverName);break;case"tokens":this.invalidatedAccessToken=this.pendingAuthAccessToken??this.lastSavedAccessToken,this.lastSavedAccessToken=void 0,this.pendingAuthAccessToken=void 0,at(this.serverName);break;case"verifier":$n(this.serverName,this.storageOptions);break;case"discovery":this.flowDiscoveryState=void 0;break}}addClientAuthentication=async(e,n,r,o)=>{this.throwIfInactive(),n.get("grant_type")==="authorization_code"&&!n.has("scope")&&this.config.scope&&n.set("scope",this.config.scope);let i=await this.clientInformation();if(this.throwIfInactive(),!i)return;let s=o?.token_endpoint_auth_methods_supported??[],a=i.client_secret!==void 0,c;if(s.length===0?c=a?"client_secret_post":"none":a&&s.includes("client_secret_basic")?c="client_secret_basic":a&&s.includes("client_secret_post")?c="client_secret_post":s.includes("none")?c="none":c=a?"client_secret_post":"none",c==="client_secret_basic"){if(!i.client_secret)throw new Error("client_secret_basic authentication requires a client_secret");e.set("Authorization",`Basic ${Buffer.from(`${i.client_id}:${i.client_secret}`).toString("base64")}`);return}n.has("client_id")||n.set("client_id",i.client_id),c==="client_secret_post"&&i.client_secret&&!n.has("client_secret")&&n.set("client_secret",i.client_secret)};prepareTokenRequest(e){if(!this.usesClientCredentials)return;let n=new URLSearchParams({grant_type:"client_credentials"}),r=e??this.config.scope;return r&&n.set("scope",r),n}};import{auth as fs,extractWWWAuthenticateParams as qm,LATEST_PROTOCOL_VERSION as Vm,UnauthorizedError as ps}from"@modelcontextprotocol/client";import Km from"open";tt();import{createServer as Dm}from"http";var Nm=`
13
+ :root { color-scheme: light dark; }
14
+ * { box-sizing: border-box; }
15
+ body {
16
+ margin: 0;
17
+ min-height: 100vh;
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: center;
21
+ padding: 24px;
22
+ font: 15px/1.55 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
23
+ background: #0f1117;
24
+ color: #e6e8ee;
25
+ }
26
+ .card {
27
+ width: 100%;
28
+ max-width: 26rem;
29
+ padding: 2.5rem 2rem;
30
+ text-align: center;
31
+ background: #161922;
32
+ border: 1px solid #242938;
33
+ border-radius: 14px;
34
+ box-shadow: 0 1px 2px rgba(0,0,0,.3), 0 12px 32px rgba(0,0,0,.25);
35
+ }
36
+ .badge {
37
+ width: 3rem; height: 3rem;
38
+ margin: 0 auto 1.25rem;
39
+ display: grid; place-items: center;
40
+ border-radius: 50%;
41
+ }
42
+ .badge svg { width: 1.5rem; height: 1.5rem; display: block; }
43
+ .ok { background: rgba(74,222,128,.12); color: #4ade80; }
44
+ .bad { background: rgba(248,113,113,.12); color: #f87171; }
45
+ h1 { margin: 0 0 .5rem; font-size: 1.15rem; font-weight: 600; letter-spacing: -0.01em; }
46
+ p { margin: 0; color: #9aa1b1; }
47
+ .app { color: #e6e8ee; font-weight: 500; }
48
+ .hint { margin-top: 1.25rem; font-size: .8125rem; color: #6b7280; }
49
+ code {
50
+ display: block;
51
+ margin-top: 1.25rem;
52
+ padding: .75rem .875rem;
53
+ text-align: left;
54
+ font: 12px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace;
55
+ color: #fca5a5;
56
+ background: rgba(248,113,113,.08);
57
+ border: 1px solid rgba(248,113,113,.2);
58
+ border-radius: 8px;
59
+ overflow-wrap: anywhere;
60
+ }
61
+ @media (prefers-color-scheme: light) {
62
+ body { background: #f6f7f9; color: #121620; }
63
+ .card { background: #fff; border-color: #e4e7ee; }
64
+ p { color: #5b6474; }
65
+ .app { color: #121620; }
66
+ .hint { color: #8b93a3; }
67
+ }`,Su='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg>',Lm='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M18 6 6 18M6 6l12 12"/></svg>';function as(t){return`<!DOCTYPE html>
68
+ <html lang="en">
69
+ <head>
70
+ <meta charset="utf-8">
71
+ <meta name="viewport" content="width=device-width, initial-scale=1">
72
+ <title>${t.title}</title>
73
+ <style>${Nm}
74
+ </style>
75
+ </head>
76
+ <body>
77
+ <main class="card">
78
+ <div class="badge ${t.tone}">${t.icon}</div>
79
+ <h1>${t.heading}</h1>
80
+ <p>${t.body}</p>
81
+ ${t.extra??""}
82
+ </main>
83
+ ${t.autoClose?` <script>setTimeout(() => window.close(), 2000);</script>
84
+ `:""}</body>
85
+ </html>`}function $o(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function jm(){let t=$o(Lt());return as({title:`${t} \u2014 Authorization Successful`,heading:"Authorization Successful",body:`You can close this window and return to <span class="app">${t}</span>.`,icon:Su,tone:"ok",autoClose:!0})}function Bm(){let t=$o(Lt());return as({title:`${t} \u2014 Authorization Received`,heading:"Authorization Received",body:`Copy the full callback URL from your browser address bar and paste it back into <span class="app">${t}</span> with auth-complete.`,icon:Su,tone:"ok"})}function yr(t){let e=$o(Lt());return as({title:`${e} \u2014 Authorization Failed`,heading:"Authorization Failed",body:`Something went wrong during authorization. You can close this window and try again from <span class="app">${e}</span>.`,icon:Lm,tone:"bad",extra:`<code>${$o(t)}</code>`})}var Yt,Et,kt,_n,In=0,Je=new Map,Ze=new Set,Hm=300*1e3,cs="localhost",Oo=cs;function Fm(t,e){let n=new URL(t.url||"/",`http://${t.headers.host}`);if(n.pathname!==hr()){e.writeHead(404,{"Content-Type":"text/plain"}),e.end("Not found");return}let r=n.searchParams.get("code"),o=n.searchParams.get("iss"),i=n.searchParams.get("state"),s=n.searchParams.get("error"),a=n.searchParams.get("error_description");if(!i){let d="Missing required state parameter - potential CSRF attack";e.writeHead(400,{"Content-Type":"text/html"}),e.end(yr(d));return}let c=Je.get(i),u=Ze.has(i);if(s){if(!c&&!u){let l="Invalid or expired state parameter - potential CSRF attack";e.writeHead(400,{"Content-Type":"text/html"}),e.end(yr(l));return}let d=a||s;e.writeHead(200,{"Content-Type":"text/html"}),e.end(yr(d)),c&&(Ze.delete(i),clearTimeout(c.timeout),Je.delete(i),setTimeout(()=>c.reject(new Error(d)),0));return}if(!c&&!u){let d="Invalid or expired state parameter - potential CSRF attack";e.writeHead(400,{"Content-Type":"text/html"}),e.end(yr(d));return}if(!r){e.writeHead(400,{"Content-Type":"text/html"}),e.end(yr("No authorization code provided"));return}if(!c){e.writeHead(200,{"Content-Type":"text/html"}),e.end(Bm());return}clearTimeout(c.timeout),Je.delete(i),c.resolve({code:r,...o!==null?{iss:o}:{}}),e.writeHead(200,{"Content-Type":"text/html"}),e.end(jm())}async function wu(t={}){let e=In;if(kt){if(!_n)throw new Error("OAuth callback server stopped");if(await _n,e!==In)throw new Error("OAuth callback server stopped")}for(;Et;)if(await Et,e!==In)throw new Error("OAuth callback server stopped");if(e!==In)throw new Error("OAuth callback server stopped");let n=zm(t);Et=n;try{await n}finally{Et===n&&(Et=void 0)}}async function zm(t={}){let e=t.port??ss(),n=t.strictPort===!0,r=t.callbackHost??cs,o=t.callbackPath??Po,i=o.startsWith("/")?o:`/${o}`;if(t.reserveState&&!t.oauthState)throw new Error("OAuth callback reservation requires an oauthState");let s,a=Yt,c=!!(a&&n&&Ro()!==e),u=!!(a&&Oo!==r),d=!!(a&&hr()!==i);if(a){if(!c&&!u){if(d){if(Je.size>0||Ze.size>0)throw new Error(`OAuth callback server is using path ${hr()}, but callback path ${i} is required and cannot be switched while authorizations are pending`);ko(i)}t.reserveState&&t.oauthState&&(Ze.add(t.oauthState),s=t.oauthState);return}if(Je.size>0||Ze.size>0)throw new Error(`OAuth callback server is running on ${Oo}:${Ro()}, but strict callback endpoint ${r}:${e} is required and cannot be switched while authorizations are pending`)}let l=Dm(Fm),f=n?e:0;try{if(await new Promise((p,g)=>{l.once("error",y=>{g(y)}),l.listen(f,r,()=>{p()})}),n)Eo(e);else{let p=l.address();if(!p||typeof p=="string"||typeof p.port!="number")throw new Error("OAuth callback server did not report an assigned port");Eo(p.port)}a&&(c||u)&&await new Promise(p=>{a.close(()=>p())}),Oo=r,ko(i),Yt=l,t.reserveState&&t.oauthState&&(Ze.add(t.oauthState),s=t.oauthState),Yt.unref()}catch(p){s&&Ze.delete(s);let g=p;throw await new Promise(y=>{l.close(()=>y())}),n&&g.code==="EADDRINUSE"?new Error(`OAuth callback port ${e} is already in use. Pre-registered OAuth clients require an exact redirect URI; set MCP_OAUTH_CALLBACK_PORT to your registered port or free port ${e}`,{cause:p}):p}}function us(t){Ze.delete(t)}function bu(t){return Ze.delete(t),new Promise((e,n)=>{let r=setTimeout(()=>{Je.has(t)&&(Je.delete(t),n(new Error("OAuth callback timeout - authorization took too long")))},Hm);Je.set(t,{resolve:e,reject:n,timeout:r})})}function Un(t){Ze.delete(t);let e=Je.get(t);e&&(clearTimeout(e.timeout),Je.delete(t),e.reject(new Error("Authorization cancelled")))}function ls(){if(kt)return _n=void 0,In+=1,kt;In+=1;let e=(async()=>{for(;Et;)await Et.catch(()=>{});Yt&&(await new Promise(r=>{Yt.close(()=>{r()})}),Yt=void 0),Eo(ss()),Oo=cs,ko(Po);let n=Array.from(Je.entries());Je.clear(),Ze.clear(),setTimeout(()=>{for(let[,r]of n)clearTimeout(r.timeout),r.reject(new Error("OAuth callback server stopped"))},0)})().finally(()=>{kt===e&&(kt=void 0)});return kt=e,e}function ds(){if(kt)return kt;if(Et||!Yt||Je.size>0||Ze.size>0)return Promise.resolve();let t=ls().finally(()=>{_n===t&&(_n=void 0)});return _n=t,t}ue();be();be();function Dn(){let t=new AbortController,e=[],n,r=(o,i)=>{console.error(`MCP: ${i?"late ":""}runtime cleanup failed: ${_e(o)}`)};return{signal:t.signal,isActive:()=>!t.signal.aborted,addCleanup:o=>{if(t.signal.aborted){Promise.resolve().then(o).catch(i=>r(i,!0));return}e.push(o)},stop:(o="MCP extension runtime stopped")=>{if(n)return n;t.abort(new Error(o));let i=e.splice(0).reverse().map(s=>Promise.resolve().then(s));return n=Promise.allSettled(i).then(s=>{let a=s.flatMap(c=>c.status==="rejected"?[c.reason]:[]);if(a.length>0){let c=new AggregateError(a,"MCP runtime cleanup failed");throw console.error(`MCP: runtime cleanup failed: ${_e(c)}`),c}}),n},throwIfInactive:()=>t.signal.throwIfAborted()}}function te(...t){let e=t.filter(n=>n!==void 0);if(e.length!==0)return e.length===1?e[0]:AbortSignal.any(e)}function vr(t,e){let n=new WeakMap,r=o=>{if((typeof o!="object"||o===null)&&typeof o!="function")return o;let i=o,s=n.get(i);if(s)return s;let a=new Proxy(i,{get(c,u,d){if(!e.isActive())return;let l=Reflect.get(c,u,d);return typeof l=="function"?(...f)=>{if(e.isActive())return Reflect.apply(l,c,f)}:e.isActive()?r(l):void 0}});return n.set(i,a),a};return r(t)}function ie(t,e){return e?.aborted?!0:t instanceof Error&&(t.name==="AbortError"||t.message==="MCP extension runtime stopped")}function Cu(t,e){return{...t,...e.scope!==void 0?{scope:e.scope}:{},...e.skipIssuerMetadataValidation===!0?{skipIssuerMetadataValidation:!0}:{}}}var Mu=new WeakMap,Nn=new Set;function $t(t){let e=new AbortController,n={signal:te(t,e.signal)};return Mu.set(n,{controller:e,generation:0,pendingAuths:new Map,pendingAuthStates:new Map,pendingAuthCleanupTimers:new Map,pendingAuthentications:new Map}),Nn.add(n),n}var Xt=$t();Nn.delete(Xt);function Sr(t){return t?.runtime?(t.runtime.signal.throwIfAborted(),Nn.add(t.runtime),t.runtime):(Xt.signal.aborted&&(Xt=$t()),Nn.add(Xt),Xt)}function gt(t){let e=Mu.get(t);if(!e)throw new Error("Unknown OAuth runtime");return e}function Ot(t,e){return`${t}|${Co(e)}`}function Io(t,e,n){let r=gt(n??Xt);return e?r.pendingAuths.has(Ot(t,e)):Array.from(r.pendingAuths.values()).some(o=>o.serverName===t)}var Jm=300*1e3;function Wm(){return Array.from(crypto.getRandomValues(new Uint8Array(32))).map(t=>t.toString(16).padStart(2,"0")).join("")}function gs(t){if(t.oauth===!1)return{};let e={};if(t.oauth?.grantType!==void 0&&(e.grantType=t.oauth.grantType),t.oauth?.clientId!==void 0){if(typeof t.oauth.clientId!="string")throw new Error("OAuth clientId must be a string");e.clientId=le(t.oauth.clientId)}if(t.oauth?.clientSecret!==void 0){if(typeof t.oauth.clientSecret!="string")throw new Error("OAuth clientSecret must be a string");e.clientSecret=t.oauth.clientSecret.startsWith("!")?t.oauth.clientSecret:le(t.oauth.clientSecret)}if(t.oauth?.scope!==void 0){if(typeof t.oauth.scope!="string")throw new Error("OAuth scope must be a string");e.scope=le(t.oauth.scope)}if(t.oauth?.authorizationParams!==void 0){let n=t.oauth.authorizationParams;if(!n||typeof n!="object"||Array.isArray(n))throw new Error("OAuth authorizationParams must be an object");e.authorizationParams={};for(let[r,o]of Object.entries(n)){if(!r)throw new Error("OAuth authorizationParams keys must not be empty");if(typeof o!="string")throw new Error(`OAuth authorizationParams.${r} must be a string`);e.authorizationParams[r]=le(o)}}if(t.oauth?.redirectUri!==void 0){if(typeof t.oauth.redirectUri!="string")throw new Error("OAuth redirectUri must be a string");let n=le(t.oauth.redirectUri).trim();if(!n)throw new Error("OAuth redirectUri must not be empty");e.redirectUri=n}if(t.oauth?.clientName!==void 0){if(typeof t.oauth.clientName!="string")throw new Error("OAuth clientName must be a string");let n=le(t.oauth.clientName).trim();if(!n)throw new Error("OAuth clientName must not be empty");e.clientName=n}if(t.oauth?.clientUri!==void 0){if(typeof t.oauth.clientUri!="string")throw new Error("OAuth clientUri must be a string");let n=le(t.oauth.clientUri).trim();if(!n)throw new Error("OAuth clientUri must not be empty");e.clientUri=n}if(t.oauth?.logoUri!==void 0){if(typeof t.oauth.logoUri!="string")throw new Error("OAuth logoUri must be a string");let n=le(t.oauth.logoUri).trim();if(!n)throw new Error("OAuth logoUri must not be empty");let r;try{r=new URL(n)}catch{throw new Error("OAuth logoUri must be an absolute http(s) URL")}if(r.protocol!=="https:"&&r.protocol!=="http:")throw new Error("OAuth logoUri must be an absolute http(s) URL");e.logoUri=n}if(t.oauth?.authServerMetadataUrl!==void 0){if(typeof t.oauth.authServerMetadataUrl!="string")throw new Error("OAuth authServerMetadataUrl must be a string");let n=le(t.oauth.authServerMetadataUrl).trim();if(!n)throw new Error("OAuth authServerMetadataUrl must not be empty");let r;try{r=new URL(n)}catch{throw new Error("OAuth authServerMetadataUrl must be an absolute https:// URL")}if(r.protocol!=="https:")throw new Error("OAuth authServerMetadataUrl must be an absolute https:// URL");e.authServerMetadataUrl=n}if(t.oauth?.skipIssuerMetadataValidation!==void 0){if(typeof t.oauth.skipIssuerMetadataValidation!="boolean")throw new Error("OAuth skipIssuerMetadataValidation must be a boolean");e.skipIssuerMetadataValidation=t.oauth.skipIssuerMetadataValidation}return e}async function xu(t,e,n){let r=e?.headers?Object.fromEntries(Object.entries(e.headers).filter(([,c])=>!c.startsWith("!")||c.startsWith("!!"))):void 0,o=new Headers(yn(r));o.set("content-type","application/json");let i=new AbortController,s=te(n,i.signal),a=setTimeout(()=>i.abort(),5e3);try{o.set("accept","application/json, text/event-stream");let c=await fetch(new URL(t),{method:"POST",headers:o,body:JSON.stringify({jsonrpc:"2.0",id:0,method:"initialize",params:{protocolVersion:Vm,capabilities:{},clientInfo:{name:"pi-mcp-adapter",version:"2.11.0"}}}),...s?{signal:s}:{}}),{resourceMetadataUrl:u,scope:d}=qm(c);return await c.body?.cancel().catch(()=>{}),{...u?{resourceMetadataUrl:u}:{},...d?{scope:d}:{}}}catch{return n?.aborted&&D(n),{}}finally{clearTimeout(a)}}function Gm(t){let e;try{e=new URL(t)}catch(s){throw new Error(`Invalid OAuth redirectUri: ${t}`,{cause:s})}if(e.username||e.password)throw new Error("OAuth redirectUri must not include username or password");if(e.hash)throw new Error("OAuth redirectUri must not include a fragment");let n=e.hostname.toLowerCase(),r=n==="localhost"||n==="127.0.0.1"||n==="[::1]"||n==="::1";if(e.port){let s=Number.parseInt(e.port,10);if(!Number.isInteger(s)||s<=0||s>65535)throw new Error("OAuth redirectUri port must be a positive numeric port")}if(e.protocol==="https:"&&!r)return{mode:"manual"};if(e.protocol!=="http:"||!r)throw new Error("OAuth redirectUri must be an https:// URI or an http:// localhost or loopback URI");if(!e.port)throw new Error("OAuth localhost redirectUri must include an explicit numeric port");let o=Number.parseInt(e.port,10);if(!Number.isInteger(o)||o<=0||o>65535)throw new Error("OAuth localhost redirectUri must include an explicit numeric port");return{mode:"local",port:o,callbackHost:n==="[::1]"?"::1":n,callbackPath:e.pathname}}async function Ln(t,e,n,r={}){if(U(n))throw new Error(`MCP server "${t}" is disabled`);let o=Sr(r),i=gt(o),s=n?gs(n):{},a=r.authStorageOptions??{},c=te(o.signal,r.signal),u=i.generation;if(D(c),s.grantType==="client_credentials"){let w=await kn(t,e,a);w?.clientInfo&&!w.tokens&&!s.clientId&&(To(t,a),$n(t,a),await Rt(t,a));let b=new Gt(t,e,s,{onRedirect:async()=>{throw new Error("Browser redirect is not used for client_credentials flow")}},a,o.signal);try{let v=Cu(await xu(e,n,c),s);D(c);let m=await ve(fs(b,{serverUrl:e,...v}),c);if(D(c),m!=="AUTHORIZED")throw new ps("Failed to authorize");return{authorizationUrl:""}}finally{b.deactivate()}}let d=i.pendingAuths.get(Ot(t,a));if(d?.serverUrl===e)return{authorizationUrl:d.authorizationUrl};let l=s.redirectUri!==void 0?Gm(s.redirectUri):void 0,f=l?.mode==="manual",p=Wm();if(!f)try{await wu({strictPort:!!s.clientId||s.redirectUri!==void 0,oauthState:p,reserveState:!0,...l?.mode==="local"?{port:l.port,callbackHost:l.callbackHost,callbackPath:l.callbackPath}:{}}),D(c)}catch(w){us(p);try{await Tu(()=>Rt(t,a))}catch(b){throw new AggregateError([w,b],"OAuth startup cleanup failed")}throw w}let g,y=new Gt(t,e,s,{onRedirect:async w=>{g=w}},a,o.signal,p);try{let w=await kn(t,e,a);if(w?.clientInfo&&!s.clientId)if(!w.tokens)To(t,a),$n(t,a),await Rt(t,a);else{let m=w.clientInfo.redirectUris;(!Array.isArray(m)||!m.includes(y.redirectUrl??""))&&(To(t,a),gu(t,a),$n(t,a),await Rt(t,a))}D(c);let b=Cu(await xu(e,n,c),s);D(c);let v=await ve(fs(y,{serverUrl:e,...b}),c);if(D(c),v==="AUTHORIZED")return y.deactivate(),us(p),await Rt(t,a),await ds(),{authorizationUrl:""};if(!g)throw new ps("OAuth authorization URL was not provided");return await Ym(o,t,{serverName:t,authProvider:y,serverUrl:e,authorizationUrl:g.toString(),manualRedirect:f,...f?{manualCompletionController:new AbortController}:{},discovery:b,authStorageOptions:a},p,c,u),{authorizationUrl:g.toString()}}catch(w){y.deactivate();try{await wr(o,t,p,a)}catch(b){throw new AggregateError([w,b],"OAuth startup cleanup failed")}throw w}}async function Ym(t,e,n,r,o,i=gt(t).generation){let s=gt(t),a=Ot(e,n.authStorageOptions);if(await ms(t,e,void 0,n.authStorageOptions),D(o),i!==s.generation)throw new Error("OAuth runtime stopped");s.pendingAuths.set(a,n),s.pendingAuthStates.set(a,r);let c=setTimeout(()=>{wr(t,e,r,n.authStorageOptions,new Error("OAuth authorization timeout - authorization took too long")).catch(u=>{console.error(`MCP Auth: Timed-out flow cleanup failed: ${_e(u)}`)})},Jm);c.unref?.(),s.pendingAuthCleanupTimers.set(a,c)}async function ms(t,e,n,r={},o=new Error("Authorization cancelled")){let i=gt(t),s=Ot(e,r),a=i.pendingAuths.get(s),c=a?.authStorageOptions??r,u=i.pendingAuthStates.get(s);if(n&&u&&u!==n)return;let d=i.pendingAuthCleanupTimers.get(s);d&&(clearTimeout(d),i.pendingAuthCleanupTimers.delete(s)),a?.manualCompletionController?.abort(o),a?.authProvider.deactivate(),i.pendingAuths.delete(s),i.pendingAuthStates.delete(s);let l=u??n;l&&(Un(l),await os(e,c)===l&&await Rt(e,c))}async function wr(t,e,n,r={},o){await Tu(()=>ms(t,e,n,r,o))}async function Tu(t){let e;try{await t()}catch(n){e={error:n}}try{await ds()}catch(n){throw e?new AggregateError([e.error,n],"OAuth callback cleanup failed"):n}if(e)throw e.error}function hs(t){try{let e=new URL(t),n=new URLSearchParams(e.search);if(e.hash){let r=e.hash.startsWith("#")?e.hash.slice(1):e.hash,o=new URLSearchParams(r);for(let[i,s]of o)n.has(i)||n.set(i,s)}return n}catch{let e=t.includes("?")?t.slice(t.indexOf("?")+1):t,n=new URLSearchParams(e.startsWith("#")?e.slice(1):e);return n.has("code")||n.has("state")||n.has("error")?n:void 0}}function Au(t,e){let n=t.trim();if(!n)throw new Error("Authorization code or redirect URL is required");let r=hs(n);if(r){let o=r.get("error");if(o){let a=r.get("error_description");throw new Error(a?`${o}: ${a}`:o)}let i=r.get("state");if(e&&!i)throw new Error("OAuth state missing from redirect URL");if(e&&i!==e)throw new Error("OAuth state mismatch - potential CSRF attack");let s=r.get("code");if(s){let a=r.get("iss");return{code:s,...a!==null?{iss:a}:{}}}}if(/^[A-Za-z0-9._~+/=-]+$/.test(n))return{code:n};throw new Error("Could not find an OAuth authorization code in the provided input")}function Xm(t){return new Promise((e,n)=>{let r=()=>{n(t.reason instanceof Error?t.reason:new Error("Authorization cancelled"))};if(t.aborted){r();return}t.addEventListener("abort",r,{once:!0})})}async function Qm(t,e,n,r,o){if(!r)return{input:await ve(t,o),source:"callback"};let i=new AbortController;try{let s=await ve(Promise.race([t.then(a=>({input:a,source:"callback"})),r(e,i.signal).then(a=>({input:a,source:"manual"}))]),o);if(s.source==="callback")return s;if(!s.input?.trim())throw new Error("OAuth authentication cancelled");if(!hs(s.input.trim()))throw new Error("Paste the full OAuth callback URL, including its code and state parameters");return{input:Au(s.input,n),source:"manual"}}finally{i.abort()}}async function br(t,e,n={}){let r=Sr(n),o=gt(r),i=n.authStorageOptions??{},s=te(r.signal,n.signal);D(s);let a=Ot(t,i),c=o.pendingAuthStates.get(a),u=o.pendingAuths.get(a);if(D(s),u?.manualRedirect&&!hs(e.trim()))throw new Error("Paste the full OAuth callback URL, including its code and state parameters");let d=Au(e,c);return Pu(t,d,n)}async function Pu(t,e,n={}){let r=Sr(n),o=gt(r),{code:i,iss:s}=typeof e=="string"?{code:e,iss:void 0}:e,a=n.authStorageOptions??{},c=te(r.signal,n.signal);D(c);let u=Ot(t,a),d=o.pendingAuths.get(u),l=d?.authStorageOptions??a;if(!d)throw new Error(`No pending OAuth flow for server: ${t}`);let f=o.pendingAuthStates.get(u);D(c);let p=!1,g;try{let y=await d.authProvider.discoveryState(),w=y?.authorizationServerMetadata,b=w?.issuer??y?.authorizationServerUrl,v=w?.authorization_response_iss_parameter_supported===!0;if(b!==void 0&&s===void 0&&v)throw p=!0,new Error(`The authorization server for ${t} requires the RFC 9207 "iss" parameter. Paste the full redirect URL from the browser address bar (not just the authorization code).`);if(b!==void 0&&s!==void 0&&s!==b)throw new Error(`The OAuth authorization response issuer does not match the discovered issuer for ${t}.`);let m=await ve(fs(d.authProvider,{serverUrl:d.serverUrl,authorizationCode:i,...s!==void 0?{iss:s}:{},...d.discovery}),c);if(D(c),m!=="AUTHORIZED")throw new ps("Failed to authorize");return"authenticated"}catch(y){throw g=y,y}finally{if(!p)try{await wr(r,t,f,l)}catch(y){throw g!==void 0?new AggregateError([g,y],"OAuth completion cleanup failed"):y}}}async function mt(t,e,n,r={}){if(U(n))throw new Error(`MCP server "${t}" is disabled`);let o=Sr(r),i=gt(o),s=r.authStorageOptions??{},a=te(o.signal,r.signal);D(a);let c=`${t}|${e}|${Co(s)}`,u=i.pendingAuthentications.get(c);if(u)return u;let d=(async()=>{let{authorizationUrl:l}=await Ln(t,e,n,{...r,...a?{signal:a}:{},runtime:o});if(!l)return"authenticated";let f;try{if(f=i.pendingAuthStates.get(Ot(t,s)),D(a),!f)throw new Error("OAuth state not found - this should not happen");let p=i.pendingAuths.get(Ot(t,s));if(!p)throw new Error(`No pending OAuth flow for server: ${t}`);if(p.manualRedirect&&!r.onAuthorizationInput)throw new Error(`OAuth for ${t} uses a remote redirect URI. Complete it with auth-start/auth-complete or /mcp-auth.`);let g=p.manualRedirect?Xm(p.manualCompletionController.signal):bu(f);g.catch(()=>{}),r.onAuthorizationUrl?await ve(Promise.resolve(r.onAuthorizationUrl(l)),a):console.log(`MCP Auth: Open this URL to authenticate ${t}:
86
+ ${l}`);try{await ve(Km(l),a)}catch(w){if(ie(w,a))throw w;console.warn(`MCP Auth: Failed to open browser for ${t}; waiting for manual callback`,{error:w})}let y=await Qm(g,l,f,r.onAuthorizationInput,a);return y.source==="manual"&&Un(f),D(a),await Pu(t,y.input,{...r,...a?{signal:a}:{},runtime:o})}catch(p){f&&Un(f);try{await wr(o,t,f,s)}catch(g){throw new AggregateError([p,g],"OAuth cancellation cleanup failed")}throw p}})();i.pendingAuthentications.set(c,d);try{return await d}finally{i.pendingAuthentications.get(c)===d&&i.pendingAuthentications.delete(c)}}async function Ru(t,e={}){let n=Sr(e),r=te(n.signal,e.signal);D(r);let o=e.authStorageOptions??{},i=await os(t,o);D(r),i&&Un(i),await wr(n,t,i,o),D(r),Mo(t,o),await Rt(t,o),D(r),console.log(`MCP Auth: Removed credentials for ${t}`)}function Ue(t){return!t.url||t.auth===!1||t.oauth===!1?!1:t.auth==="oauth"?!0:t.headers&&Object.keys(t.headers).length>0?!1:t.auth===void 0}async function jn(t=Xt){let e=gt(t);if(!e.controller.signal.aborted){e.generation+=1,e.controller.abort(new Error("OAuth runtime stopped"));for(let n of Array.from(e.pendingAuthStates.values()))Un(n);for(let n of Array.from(e.pendingAuths.values()))await ms(t,n.serverName,void 0,n.authStorageOptions);e.pendingAuthentications.clear(),Nn.delete(t),Nn.size===0&&await ls()}}import{createHash as Zm}from"node:crypto";import{createRequire as eh}from"node:module";import{dirname as th,join as nh}from"node:path";var rh=eh(import.meta.url),oh="pi-mcp-adapter.bearer",ys="PI_MCP_ADAPTER_TEST_AUTH_STORE";var Eu=1280,ku,Bn=new Map,Ss=0,Hn=class extends Error{code="BEARER_CREDENTIAL_STORE_UNAVAILABLE";operation;constructor(e,n,r){super(e,{cause:r}),this.name="BearerCredentialStoreError",this.operation=n}},ih={read(t){return Ss++,Bn.get(t)},write(t,e){Bn.set(t,e)},remove(t){Bn.delete(t)}},sh={read(t){return Ss++,Bn.get(t)},write(t,e){if(e.length>Eu)throw new Error(`Value of 'password encoded as UTF-16' is longer than the platform limit of ${Eu*2} chars`);Bn.set(t,e)},remove(t){Bn.delete(t)}},ah={read(){throw Ss++,new Error("simulated secure credential store unavailable")},write(){throw new Error("simulated secure credential store unavailable")},remove(){throw new Error("simulated secure credential store unavailable")}},ch={read(t){return vs(t).getPassword()??void 0},write(t,e){vs(t).setPassword(e)},remove(t){vs(t).deleteCredential()}};function ws(){return process.env[ys]==="memory"?ih:process.env[ys]==="sizelimited"?sh:process.env[ys]==="unavailable"?ah:ch}function vs(t){try{return ku??=uh(),new ku(oh,t)}catch(e){throw new Error("Bearer token secure credential storage is unavailable. Configure the OS credential store and retry.",{cause:e})}}function uh(t=rh,e=process.platform,n=process.arch){try{return t("@napi-rs/keyring").Entry}catch(r){try{return lh(t,e,n).Entry}catch(o){let i=o instanceof Error?o.message:String(o);throw new Error(`Failed to load @napi-rs/keyring; absolute-path native binding fallback also failed: ${i}`,{cause:r})}}}function lh(t,e,n){let r=dh(e,n).map(i=>({packageName:`@napi-rs/keyring-${i}`,bindingFile:`keyring.${i}.node`})),o;for(let i of r)try{let s=t.resolve(`${i.packageName}/package.json`);return t(nh(th(s),i.bindingFile))}catch(s){o=s}throw o instanceof Error?o:new Error(String(o))}function dh(t,e){if(t==="darwin"){if(e==="arm64")return["darwin-arm64"];if(e==="x64")return["darwin-x64"]}if(t==="win32"){if(e==="arm64")return["win32-arm64-msvc"];if(e==="x64")return["win32-x64-msvc"];if(e==="ia32")return["win32-ia32-msvc"]}if(t==="linux"){if(e==="arm64")return["linux-arm64-gnu","linux-arm64-musl"];if(e==="arm")return["linux-arm-gnueabihf"];if(e==="riscv64")return["linux-riscv64-gnu"];if(e==="x64")return["linux-x64-gnu","linux-x64-musl"]}return t==="freebsd"&&e==="x64"?["freebsd-x64"]:[]}function Ou(t){if(typeof t!="string")throw new Error(`Invalid MCP server name: ${JSON.stringify(t)}`);return`sha256-${Zm("sha256").update(t,"utf8").digest("hex")}`}function fh(t,e){let n=$u(t,e);if(typeof n!="object"||n===null||Array.isArray(n))throw new Error(`Stored bearer token record for ${t} has invalid shape`);let r=n;if(typeof r.token!="string"||typeof r.serverUrl!="string")throw new Error(`Stored bearer token record for ${t} has invalid shape`);return{token:r.token,serverUrl:r.serverUrl}}function $u(t,e){try{return JSON.parse(e)}catch{throw new Error(`Failed to parse stored bearer token record for ${t}`)}}function ph(t){if(typeof t!="object"||t===null)return!1;let e=t;return e.__piMcpAdapterBearerChunked===1&&typeof e.chunkCount=="number"&&Number.isInteger(e.chunkCount)&&e.chunkCount>0&&typeof e.chunkDigest=="string"&&/^[a-f0-9]{16}$/.test(e.chunkDigest)}function Iu(t,e){let n=$u(t,e);return ph(n)?n:void 0}function gh(t,e,n){return`${t}.chunk.${e.chunkDigest}.${n}`}function _u(t,e){return Array.from({length:e.chunkCount},(n,r)=>gh(t,e,r))}function mh(t,e,n){if(n)for(let r of _u(e,n))t.remove(r)}function Uu(t,e){let n=Ou(e),r;try{r=t.read(n)}catch(o){throw new Hn(`Failed to read bearer token for ${e} from the OS secure credential store`,"read",o)}if(r!==void 0)try{let o=Iu(e,r),i=o?_u(n,o).map(s=>{let a=t.read(s);if(a===void 0)throw new Error(`Missing bearer token chunk for ${e}`);return a}).join(""):r;return fh(e,i)}catch(o){throw new Hn(`Failed to read bearer token for ${e} from the OS secure credential store`,"read",o)}}function hh(t,e){let n=Ou(e);try{let r=t.read(n),o=r===void 0?void 0:Iu(e,r);mh(t,n,o),t.remove(n)}catch(r){throw new Hn(`Failed to remove bearer token for ${e} from the OS secure credential store`,"remove",r)}}function Du(t,e){let n=Uu(ws(),t);if(n)return n.serverUrl===e?n.token:void 0}function Nu(t){hh(ws(),t)}function Lu(t,e){try{let n=Uu(ws(),t);return n?n.serverUrl!==e?{status:"url-mismatch"}:{status:"present"}:{status:"missing"}}catch(n){if(!(n instanceof Hn))throw n;return{status:"unavailable",message:"Bearer token secure credential store unavailable. Configure or unlock the OS credential store and retry."}}}be();import{complete as yh}from"@earendil-works/pi-ai/compat";function Bu(t,e){t.setRequestHandler("sampling/createMessage",n=>vh(e,n))}async function vh(t,e){let n=e.params,r=t.getSignal();if(D(r),"task"in n&&n.task)throw new Error("MCP sampling tasks are not supported");if(n.includeContext&&n.includeContext!=="none")throw new Error("MCP sampling context inclusion is not supported");if(n.tools?.length)throw new Error("MCP sampling tool use is not supported");if(n.toolChoice)throw new Error("MCP sampling tool choice is not supported");if(n.stopSequences?.length)throw new Error("MCP sampling stop sequences are not supported");let o=n.messages.map(xh),{model:i,apiKey:s,headers:a}=await Ch(t,n.modelPreferences);D(r),await ju(t,"Approve MCP sampling request",Sh(t.serverName,`${i.provider}/${i.id}`,n.systemPrompt,o)),D(r);let c=await yh(i,{...n.systemPrompt!==void 0?{systemPrompt:n.systemPrompt}:{},messages:o},{...s!==void 0?{apiKey:s}:{},...a!==void 0?{headers:a}:{},maxTokens:n.maxTokens,...n.temperature!==void 0?{temperature:n.temperature}:{},...n.metadata!==void 0?{metadata:n.metadata}:{},...r?{signal:r}:{}}),u=Ah(c);return D(r),await ju(t,"Return MCP sampling response",wh(t.serverName,u)),u}function Sh(t,e,n,r){let o=[`${t} wants to sample ${r.length} message${r.length===1?"":"s"} with ${e}.`];n&&o.push(`System: ${Ve(n,400)}`);for(let[i,s]of r.entries())o.push(`${i+1}. ${s.role}: ${Ve(bh(s),400)}`);return o.join(`
87
+
88
+ `)}function wh(t,e){let n=e.content.type==="text"?e.content.text:`[${e.content.type} content]`;return`${t} will receive this response from ${e.model}:
89
+
90
+ ${Ve(n,1e3)}`}function bh(t){return typeof t.content=="string"?t.content:t.content.map(e=>e.type==="text"?e.text:e.type==="image"?`[image: ${e.mimeType}]`:e.type==="thinking"?"[thinking]":e.type==="toolCall"?`[tool call: ${e.name}]`:"[content]").join(`
91
+ `)}async function Ch(t,e){let n=[],r=t.modelRegistry.getAvailable();for(let a of e?.hints??[]){let c=a.name?.trim().toLowerCase();if(c)for(let u of r)[`${u.provider}/${u.id}`,u.id,u.name].some(l=>l.toLowerCase().includes(c))&&bs(n,u)}let o=t.getCurrentModel();o&&bs(n,o);for(let a of r)bs(n,a);let i=[],s=t.getSignal();for(let a of n){D(s);let c=await t.modelRegistry.getApiKeyAndHeaders(a);if(D(s),c.ok===!1){i.push(`${a.provider}/${a.id}: ${c.error}`);continue}return{model:a,...c.apiKey!==void 0?{apiKey:c.apiKey}:{},...c.headers!==void 0?{headers:c.headers}:{}}}throw i.length>0?new Error(`No configured auth for MCP sampling model. ${i.join("; ")}`):new Error("No Pi model is available for MCP sampling")}function bs(t,e){t.some(n=>n.provider===e.provider&&n.id===e.id)||t.push(e)}async function ju(t,e,n){if(t.autoApprove)return;if(!t.ui)throw new Error("MCP sampling requires interactive approval. Set settings.samplingAutoApprove to true to allow it without UI.");if(!await t.ui.confirm(e,n))throw new Error("MCP sampling request was declined")}function xh(t){let e=Array.isArray(t.content)?t.content:[t.content];return t.role==="user"?{role:"user",content:e.map(Mh),timestamp:Date.now()}:{role:"assistant",content:e.map(Th),api:"mcp-sampling",provider:"mcp",model:"sampling-request",usage:Rh(),stopReason:"stop",timestamp:Date.now()}}function Mh(t){if(t.type==="text")return{type:"text",text:t.text};throw new Error(`MCP sampling ${t.type} content is not supported`)}function Th(t){if(t.type==="text")return{type:"text",text:t.text};throw new Error(`MCP sampling assistant ${t.type} content is not supported`)}function Ah(t){if(t.stopReason==="error")throw new Error(t.errorMessage??"MCP sampling model call failed");if(t.stopReason==="aborted")throw new Error(t.errorMessage??"MCP sampling model call was aborted");let e=t.content.map(n=>{if(n.type==="text")return n.text;if(n.type!=="thinking")throw new Error(`MCP sampling result ${n.type} content is not supported`)}).filter(n=>n!==void 0).join(`
92
+
93
+ `).trim();if(!e)throw new Error("MCP sampling result did not contain text content");return{role:"assistant",content:{type:"text",text:e},model:`${t.provider}/${t.model}`,stopReason:Ph(t.stopReason)}}function Ph(t){return t==="stop"?"endTurn":t==="length"?"maxTokens":t==="toolUse"?"toolUse":t}function Rh(){return{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}}}import{ProtocolError as Cs,ProtocolErrorCode as xs}from"@modelcontextprotocol/client";import{AjvJsonSchemaValidator as Eh}from"@modelcontextprotocol/client/validators/ajv";import kh from"open";function zu(t,e){t.setRequestHandler("elicitation/create",n=>Oh(e,n))}async function Oh(t,e){return e.params.mode==="url"?As(t,e.params):$h(t,e.params)}async function $h(t,e){let n=Object.entries(e.requestedSchema.properties),r=await t.ui.select(`MCP Input Request
94
+ Server: ${t.serverName}
95
+
96
+ ${e.message}`,["Continue","Decline"]);if(r===void 0)return{action:"cancel"};if(r==="Decline")return{action:"decline"};if(n.length===0)return{action:"accept",content:{}};let o={};for(let[i,s]of n){let a=await Hu(t.ui,e,i,s);if(a.status==="cancelled")return{action:"cancel"};o[i]=a.value}for(;;){let i=qu(e,o),s=await t.ui.select(_h(t.serverName,n,i),["Submit","Edit","Decline"]);if(s===void 0)return{action:"cancel"};if(s==="Decline")return{action:"decline"};if(s==="Submit")return{action:"accept",content:i};let a=n.map(([p,g])=>`${g.title??Ps(p)} (${p})`),c=await t.ui.select("Choose a field to edit",a);if(c===void 0)return{action:"cancel"};let u=n[a.indexOf(c)];if(!u)continue;let[d,l]=u,f=await Hu(t.ui,e,d,l,o[d]);if(f.status==="cancelled")return{action:"cancel"};o[d]=f.value}}async function Hu(t,e,n,r,o){let i=e.requestedSchema.required?.includes(n)===!0;for(;;){let s=await Ih(t,e,n,r,o);if(s.status==="cancelled")return s;try{return qu({...e,requestedSchema:{type:"object",properties:{[n]:r},...i?{required:[n]}:{}}},{[n]:s.value}),s}catch(a){t.notify(a instanceof Error?a.message:String(a),"error"),o=s.value}}}async function Ih(t,e,n,r,o){let i=e.requestedSchema.required?.includes(n)===!0,s=[r.title??Ps(n),i?"(required)":"",r.description].filter(Boolean).join(" ");if(r.type==="string"&&("enum"in r||"oneOf"in r)){let d="oneOf"in r?r.oneOf.map(w=>({value:w.const,display:Ts(w.const,w.title)})):r.enum.map((w,b)=>({value:w,display:Ts(w,"enumNames"in r?r.enumNames?.[b]:void 0)})),l=Fu(d.map(w=>w.display)),f=[...l],p=r.default===void 0?void 0:Ms("Use default",f);p&&f.push(p);let g=i?void 0:Ms("Omit",f);g&&f.push(g);let y=await t.select(s,f);return y===void 0?{status:"cancelled"}:y===p?{status:"collected",value:r.default}:y===g?{status:"collected",value:void 0}:{status:"collected",value:d[l.indexOf(y)]?.value}}if(r.type==="boolean"){let d=["Yes","No"];r.default!==void 0&&d.push("Use default"),i||d.push("Omit");let l=await t.select(s,d);return l===void 0?{status:"cancelled"}:l==="Use default"?{status:"collected",value:r.default}:l==="Omit"?{status:"collected",value:void 0}:{status:"collected",value:l==="Yes"}}if(r.type==="array"){let d=["Choose values"];r.default!==void 0&&d.push("Use default"),i||d.push("Omit");let l=await t.select(s,d);if(l===void 0)return{status:"cancelled"};if(l==="Use default")return{status:"collected",value:r.default};if(l==="Omit")return{status:"collected",value:void 0};let f=Vu(r),p=new Set(Array.isArray(o)?o:[]);for(;;){let g=Fu(f.map(v=>p.has(v.value)?`\u2713 ${v.display}`:v.display)),y=Ms("Done",g),w=await t.select(s,[...g,y]);if(w===void 0)return{status:"cancelled"};if(w===y)return{status:"collected",value:[...p]};let b=f[g.indexOf(w)];b&&(p.has(b.value)?p.delete(b.value):p.add(b.value))}}let a=["Enter value"];r.default!==void 0&&a.push("Use default"),i||a.push("Omit");let c=await t.select(s,a);if(c===void 0)return{status:"cancelled"};if(c==="Use default")return{status:"collected",value:r.default};if(c==="Omit")return{status:"collected",value:void 0};let u=await t.input(s,o===void 0?void 0:String(o));return u===void 0?{status:"cancelled"}:{status:"collected",value:u}}function qu(t,e){let n={},r=new Set(t.requestedSchema.required??[]);for(let[i,s]of Object.entries(t.requestedSchema.properties)){let a=e[i];if(a===void 0){if(r.has(i))throw new Error(`Missing required elicitation field: ${i}`);continue}if(s.type==="string"){let c=String(a),u=s;if(u.minLength!==void 0&&c.length<u.minLength)throw new Error(`Elicitation field ${i} is shorter than minimum length ${u.minLength}`);if(u.maxLength!==void 0&&c.length>u.maxLength)throw new Error(`Elicitation field ${i} is longer than maximum length ${u.maxLength}`);if("enum"in s&&!s.enum.includes(c))throw new Error(`Elicitation field ${i} is not an allowed value`);if("oneOf"in s&&!s.oneOf.some(d=>d.const===c))throw new Error(`Elicitation field ${i} is not an allowed value`);n[i]=c;continue}if(s.type==="number"||s.type==="integer"){if(typeof a=="string"&&a.trim()==="")throw new Error(`Elicitation field ${i} must be a number`);let c=typeof a=="number"?a:Number(a);if(!Number.isFinite(c))throw new Error(`Elicitation field ${i} must be a number`);if(s.type==="integer"&&!Number.isInteger(c))throw new Error(`Elicitation field ${i} must be an integer`);if(s.minimum!==void 0&&c<s.minimum)throw new Error(`Elicitation field ${i} is below minimum ${s.minimum}`);if(s.maximum!==void 0&&c>s.maximum)throw new Error(`Elicitation field ${i} is above maximum ${s.maximum}`);n[i]=c;continue}if(s.type==="boolean"){n[i]=typeof a=="boolean"?a:a==="true";continue}if(s.type==="array"){if(!Array.isArray(a))throw new Error(`Elicitation field ${i} must be a list`);let c=new Set(Vu(s).map(d=>d.value)),u=a.map(String);if(s.minItems!==void 0&&u.length<s.minItems)throw new Error(`Elicitation field ${i} has fewer than ${s.minItems} selections`);if(s.maxItems!==void 0&&u.length>s.maxItems)throw new Error(`Elicitation field ${i} has more than ${s.maxItems} selections`);if(u.some(d=>!c.has(d)))throw new Error(`Elicitation field ${i} contains an invalid selection`);n[i]=u}}let o=new Eh().getValidator(t.requestedSchema)(n);if(!o.valid)throw new Error(`Invalid elicitation response: ${o.errorMessage}`);return n}function Ts(t,e){return e&&e!==t?`${e} (${t})`:t}function Fu(t){let e=new Set;return t.map(n=>{let r=n;for(;e.has(r);)r+="\u2026";return e.add(r),r})}function Ms(t,e){let n=t;for(;e.includes(n);)n+="\u2026";return n}function Vu(t){let e=t.items;return e.anyOf?e.anyOf.map(n=>({value:n.const,display:Ts(n.const,n.title)})):(e.enum??[]).map(n=>({value:n,display:n}))}function _h(t,e,n){let r=e.map(([o,i])=>`${i.title??Ps(o)}: ${n[o]===void 0?"(omitted)":String(n[o])}`);return[`Review input for ${t}`,"",...r].join(`
97
+ `)}async function As(t,e){if(!t.allowUrl)throw new Cs(xs.InvalidParams,"URL elicitation is not supported");let n;try{n=new URL(e.url)}catch{throw new Cs(xs.InvalidParams,"URL elicitation supplied an invalid URL")}if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Cs(xs.InvalidParams,"URL elicitation only supports HTTP and HTTPS URLs");let r=await t.ui.select(["MCP Browser Request",`Server: ${t.serverName}`,"",e.message,"",`Host: ${n.host}`,`Full URL: ${e.url}`,"","Open this URL in your browser?"].join(`
98
+ `),["Open","Decline"]);if(r===void 0)return{action:"cancel"};if(r==="Decline")return{action:"decline"};try{await kh(e.url)}catch(o){return t.ui.notify(`Could not open MCP elicitation URL: ${o instanceof Error?o.message:String(o)}`,"error"),{action:"cancel"}}return t.onUrlAccepted?.(e.elicitationId),t.ui.notify("Opened browser for MCP elicitation.","info"),{action:"accept"}}function Ps(t){return t.replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/^./,e=>e.toUpperCase())}be();import{appendFile as Uh,mkdir as Dh,writeFile as Nh}from"node:fs/promises";import{Buffer as Yu}from"node:buffer";import{dirname as Lh,isAbsolute as jh,resolve as Ku}from"node:path";var Bh=1,Hh=256*1024,Fh=1e4;function Ju(t,e){return!Number.isFinite(t)||t===void 0||t<=0?e:Math.floor(t)}function Wu(t,e=160){if(/\b(?:token|secret|password|passwd|api[_-]?key|authorization|cookie)\b/i.test(t))return"[REDACTED]";let n=t.replace(/\b[a-z][a-z\d+.-]*:\/\/[^\s"'<>]+/gi,"[REDACTED_URL]").replace(/\b(?:bearer|basic)\s+[A-Za-z0-9._~+/=-]+/gi,"[REDACTED_AUTH]").replace(/\b(?:token|secret|password|passwd|api[_-]?key|authorization|cookie)\s*[:=]\s*[^\s,;]+/gi,"$1=[REDACTED]");return n.length>e&&(n=`${n.slice(0,e-1)}\u2026`),n}function zh(t){return"method"in t?"id"in t?"request":"notification":"response"}function Gu(t){if(t===null)return null;if(typeof t=="number"&&Number.isFinite(t))return t;if(typeof t=="string")return"[REDACTED_ID]"}function qh(t){try{return Yu.byteLength(JSON.stringify(t),"utf8")}catch{return}}function Rs(t,e,n,r,o,i){let s=zh(r),a=qh(r),c={version:Bh,timestamp:new Date().toISOString(),direction:t,server:Wu(e,120),transport:n,kind:s,status:o,...a!==void 0?{bytes:a}:{}};"method"in r&&(c.method=Wu(r.method,120)),"id"in r&&(c.id=Gu(r.id)??null);let u=Gu(i?.relatedRequestId);return u!=null&&(c.relatedRequestId=u),"error"in r&&r.error&&typeof r.error.code=="number"&&(c.errorCode=r.error.code),i?.durationMs!==void 0&&Number.isFinite(i.durationMs)&&(c.durationMs=Math.max(0,Math.round(i.durationMs*100)/100)),c}var Es=class{constructor(e){this.options=e;this.maxBytes=Ju(e.maxBytes,Hh),this.maxEvents=Ju(e.maxEvents,Fh),this.append=e.appendFile??(async(n,r,o)=>{await Uh(n,r,o)}),this.resetFile=e.writeFile??(async(n,r,o)=>{await Nh(n,r,o)}),this.makeDirectory=e.mkdir??(async n=>{await Dh(n,{recursive:!0})}),this.fileReady=this.makeDirectory(Lh(this.options.filePath),{recursive:!0}).then(()=>this.resetFile(this.options.filePath,"",{encoding:"utf8"})).catch(()=>{this.initializationFailed=!0,this.disabled=!0})}options;maxBytes;maxEvents;append;resetFile;makeDirectory;bytesWritten=0;eventsWritten=0;queue=Promise.resolve();disabled=!1;initializationFailed=!1;fileReady;get filePath(){return this.options.filePath}get isDisabled(){return this.disabled}get stats(){return{bytes:this.bytesWritten,events:this.eventsWritten}}write(e){if(this.disabled||this.eventsWritten>=this.maxEvents)return;let n;try{n=`${JSON.stringify(e)}
99
+ `}catch{this.disabled=!0;return}let r=Yu.byteLength(n,"utf8");if(r>this.maxBytes-this.bytesWritten){this.disabled=!0;return}this.bytesWritten+=r,this.eventsWritten+=1,this.queue=this.queue.then(async()=>{await this.fileReady,!this.initializationFailed&&await this.append(this.options.filePath,n,{encoding:"utf8"})}).catch(()=>{this.disabled=!0})}async flush(){await this.fileReady,await this.queue}};function Xu(t,e={},n=Math.random().toString(36).slice(2,10)){let r=new Date().toISOString().replace(/[:.]/g,"-"),o=e.file,i=o?jh(o)?o:Ku(t??process.cwd(),o):Ku(t??process.cwd(),".pi","mcp-traces",`mcp-${r}-${n}.jsonl`);return new Es({filePath:i,...e.maxBytes!==void 0?{maxBytes:e.maxBytes}:{},...e.maxEvents!==void 0?{maxEvents:e.maxEvents}:{}})}function Qu(t,e){return t.trace??e?.enabled===!0}function ks(t,e,n,r){let o=t.onmessage,i,s=t.send,a=c=>{try{r.record(c)}catch{}};try{Object.defineProperty(t,"onmessage",{configurable:!0,enumerable:!0,get(){return i},set(c){o=c,i=c?((u,d)=>{a(Rs("inbound",e,n,u,"received")),c(u,d)}):void 0}}),t.onmessage=o}catch{}return t.send=async(c,u)=>{let d=performance.now(),l=Array.isArray(c)?c:[c];try{await s.call(t,c,u);for(let f of l)a(Rs("outbound",e,n,f,"sent",{durationMs:performance.now()-d}))}catch(f){for(let p of l)a(Rs("outbound",e,n,p,"error",{durationMs:performance.now()-d}));throw f}},t}function Zu(t,e){if(t.command)return"stdio";if(t.socket)return"unix-socket";let n=e.constructor?.name.toLowerCase()??"";return n.includes("sse")?"sse":n.includes("streamable")||t.url?"streamable-http":"unknown"}be();import{spawn as Vh,spawnSync as tl}from"node:child_process";import{randomUUID as Kh}from"node:crypto";var Jh=1e4,Wh=64*1024,Cr=process.platform!=="win32",nl="PI_MCP_REQUEST_HEADERS_CLEANUP_TOKEN",Gh=8*1024*1024;function rl(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="ESRCH"}function ol(t){if(process.env.PI_MCP_ADAPTER_TEST_FAIL_PS==="1")return{status:1,signal:null,stdout:""};let e=tl("ps",t,{encoding:"utf8",maxBuffer:Gh});return{status:e.status,signal:e.signal,stdout:e.stdout}}function il(t){return t.status===null?`ps was killed by signal ${t.signal??"unknown"}`:`ps exited with code ${t.status}`}function sl(t,e){let n=ol(["axeww","-o","pid=,ppid=,command="]);if(n.status!==0)throw new Error(`HTTP request headers command cleanup failed: ${il(n)}`);let r=new Map,o=new Set,i=e?`${nl}=${e}`:void 0;for(let a of n.stdout.split(`
100
+ `)){let c=/^\s*(\d+)\s+(\d+)(?:\s+(.*))?$/.exec(a);if(!c)continue;let u=Number(c[1]),d=Number(c[2]);if(!Number.isInteger(u)||!Number.isInteger(d))continue;let l=r.get(d);l?l.push(u):r.set(d,[u]),i&&u!==process.pid&&c[3]?.includes(i)&&o.add(u)}let s=[...r.get(t)??[]];for(;s.length>0;){let a=s.pop();o.add(a),s.push(...r.get(a)??[])}return[...o]}function Yh(){let t=ol(["axeww","-o","pid=,ppid=,command="]);if(t.status!==0)throw new Error(`HTTP request headers command cleanup failed: ${il(t)}`)}function Xh(t){return`${t.stdout??""}
101
+ ${t.stderr??""}`.toLowerCase().includes("not found")}function Os(t,e){try{process.kill(t,e)}catch(n){if(!rl(n))throw n}}function el(t,e){try{process.kill(-t,e)}catch(n){if(!rl(n))throw n}}function Qh(t,e=new Set,n){if(process.platform==="win32"&&t.pid!==void 0){let r=tl("taskkill",["/pid",String(t.pid),"/T","/F"],{encoding:"utf8",windowsHide:!0});if(r.status===0||r.status===128||Xh(r))return;throw new Error(`HTTP request headers command cleanup failed: taskkill exited with code ${r.status??"unknown"}`)}if(Cr&&t.pid!==void 0){let r=new Set,o;try{el(t.pid,"SIGSTOP");for(let s of e)Os(s,"SIGSTOP"),r.add(s);let i=0;for(let s=0;s<16;s++){let c=sl(t.pid,n).filter(u=>!r.has(u));if(c.length===0){if(i++,i>=2)return;continue}i=0;for(let u of c)Os(u,"SIGSTOP"),r.add(u)}o=new Error("HTTP request headers command cleanup failed: descendant process tree did not stabilize")}catch(i){o=i instanceof Error?i:new Error(String(i))}finally{el(t.pid,"SIGKILL");for(let i of r)Os(i,"SIGKILL")}if(o)throw o;return}t.kill("SIGKILL")}function al(t){if(!t||typeof t!="object"||Array.isArray(t))throw new Error("HTTP request headers command must be an object");if(typeof t.command!="string"||t.command.trim()==="")throw new Error("HTTP request headers command requires a non-empty command");if(t.args!==void 0&&(!Array.isArray(t.args)||t.args.some(n=>typeof n!="string")))throw new Error("HTTP request headers command args must be strings");if(t.env!==void 0&&(typeof t.env!="object"||Array.isArray(t.env)||Object.values(t.env).some(n=>typeof n!="string")))throw new Error("HTTP request headers command env values must be strings");let e=t.timeoutMs??Jh;if(!Number.isInteger(e)||e<=0||e>6e4)throw new Error("HTTP request headers command timeoutMs must be an integer between 1 and 60000");return{command:le(t.command),args:(t.args??[]).map(le),env:{...process.env,...Object.fromEntries(Object.entries(t.env??{}).map(([n,r])=>[n,le(r)]))},timeoutMs:e}}async function Zh(t,e,n){let r=al(t);return Cr&&Yh(),new Promise((o,i)=>{let s=Buffer.alloc(0),a=!1,c=Kh(),u=Vh(r.command,r.args,{env:{...r.env,[nl]:c},stdio:["pipe","pipe","ignore"],windowsHide:!0,detached:Cr}),d=new Set,l,p=Cr?setInterval(()=>{if(!(!Cr||u.pid===void 0||a||l))try{for(let m of sl(u.pid,c))d.add(m)}catch(m){l=m instanceof Error?m:new Error(String(m))}},50):void 0;p?.unref();let g=m=>{a||(a=!0,clearTimeout(v),p&&clearInterval(p),n.removeEventListener("abort",b),m.status==="error"?i(m.error):o(m.headers))},y=m=>{try{Qh(u,d,c),g(m)}catch(S){g({status:"error",error:S instanceof Error?S:new Error(String(S))})}},w=m=>{y({status:"error",error:l??new Error(m)})},b=()=>{w("HTTP request headers command aborted")},v=setTimeout(()=>{w(`HTTP request headers command timed out after ${r.timeoutMs}ms`)},r.timeoutMs);if(n.addEventListener("abort",b,{once:!0}),n.aborted){b();return}u.on("error",()=>g({status:"error",error:new Error("HTTP request headers command failed to start")})),u.stdout.on("data",m=>{a||(s=Buffer.concat([s,Buffer.from(m)]),s.byteLength>Wh&&w("HTTP request headers command output exceeded 64 KiB"))}),u.on("close",m=>{if(a)return;if(l){w(l.message);return}if(m!==0){w(`HTTP request headers command exited with code ${m??"unknown"}`);return}let S;try{S=JSON.parse(s.toString("utf8"))}catch{y({status:"error",error:new Error("HTTP request headers command returned invalid JSON")});return}if(!S||typeof S!="object"||Array.isArray(S)){y({status:"error",error:new Error("HTTP request headers command must return a JSON object")});return}let R=Object.entries(S);if(R.some(([,h])=>typeof h!="string")){y({status:"error",error:new Error("HTTP request headers command values must be strings")});return}try{y({status:"success",headers:new Headers(R)})}catch{y({status:"error",error:new Error("HTTP request headers command returned an invalid header")})}}),u.stdin.on("error",()=>{}),u.stdin.end(JSON.stringify(e))})}function cl(t,e=globalThis.fetch){return al(t),async(n,r)=>{let o=new Request(n,r),i=Buffer.from(await o.clone().arrayBuffer()),s=await Zh(t,{version:1,method:o.method.toUpperCase(),url:o.url,bodyBase64:i.toString("base64")},o.signal),a=new Headers(o.headers);return s.forEach((c,u)=>a.set(u,c)),e(new URL(o.url),{method:o.method,headers:a,...o.method==="GET"||o.method==="HEAD"?{}:{body:i},signal:o.signal,cache:o.cache,credentials:o.credentials,integrity:o.integrity,keepalive:o.keepalive,mode:o.mode,redirect:o.redirect,referrer:o.referrer,referrerPolicy:o.referrerPolicy})}}var Qt=8*1024,uy=3,$s=new WeakMap;function xr(t){return t instanceof ay||t instanceof Is&&t.status===401}function ly(t,e){return e.protocolVersion==="2026-07-28"?!1:t instanceof Is&&[404,405,406,415].includes(t.status)}function dy(t){switch(t.protocolVersion){case void 0:case"legacy":return;case"auto":return{mode:"auto"};case"2026-07-28":return{mode:{pin:"2026-07-28"}};default:throw new Error(`Invalid MCP protocolVersion: ${String(t.protocolVersion)}`)}}function fy(t){if(Buffer.isBuffer(t)){let r=Math.max(0,t.byteLength-Qt);return Buffer.from(t.subarray(r))}let e=t.length>Qt?t.slice(-Qt):t,n=Buffer.from(e,"utf8");return n.byteLength>Qt?Buffer.from(n.subarray(n.byteLength-Qt)):n}function py(t,e){let n=fy(e);if(n.length===0)return t;if(t.length===0)return n;let r=Buffer.concat([t,n]);return r.length>Qt?Buffer.from(r.subarray(r.length-Qt)):r}var ll=5e3;function Mr(t){let e=t;for(;e instanceof Error;){if(e instanceof Is&&e.status===503)return!0;e=e.cause}return!1}var _o=class{constructor(e){this.defaultCwd=e}defaultCwd;connections=new Map;connectPromises=new Map;reconnectPromises=new Map;uiStreamListeners=new Map;samplingConfig;metadataListChangedListener;pendingMetadataPublications=new Map;elicitationConfig;authStorageOptions={};oauthRuntime;acceptedUrlElicitations=new Map;defaultRequestTimeoutMs;runtimeSignal;closePromises=new Map;closeGenerations=new Map;connectAttempts=new Map;traceSettings;traceWriter;stopped=!1;setSamplingConfig(e){this.samplingConfig=e}setMetadataListChangedListener(e){this.metadataListChangedListener=e}publishMetadataChanged(e,n,r){let o=this.connections.get(e);if(o!==n||o.status!=="connected")return!1;try{return this.metadataListChangedListener?.(e,r),this.pendingMetadataPublications.delete(e),!0}catch(i){this.pendingMetadataPublications.set(e,{connection:n,reason:r});let s=i instanceof Error?i.message:String(i);return X.debug(`MCP: metadata publication failed for ${e}; queued for retry: ${s}`),!1}}setElicitationConfig(e){this.elicitationConfig=e}setRuntimeSignal(e){this.runtimeSignal=e}setDefaultRequestTimeoutMs(e){this.defaultRequestTimeoutMs=dl(e)}setTraceConfig(e){this.traceSettings=e}setAuthStorageOptions(e){this.authStorageOptions=e}setOAuthRuntime(e){this.oauthRuntime=e}getRequestOptions(e,n){let r=this.connections.get(e);return this.buildRequestOptions(r?.definition,n)}getResolvedRequestTimeoutMs(e){return e?.requestTimeoutMs!==void 0?dl(e.requestTimeoutMs):this.defaultRequestTimeoutMs}buildRequestOptions(e,n){let r=this.getResolvedRequestTimeoutMs(e),o=te(this.runtimeSignal,n);if(!(!o&&r===void 0))return{...o?{signal:o}:{},...r!==void 0?{timeout:r}:{}}}async connect(e,n,r){if(U(n))throw new Error(`MCP server "${e}" is disabled`);if(this.stopped)throw new Error("MCP server manager is closed");let o=te(this.runtimeSignal,r);D(o);let i=this.closePromises.get(e);if(i&&await ve(i,o),D(o),this.connectPromises.has(e))return ve(this.connectPromises.get(e),o);let s=this.connections.get(e);if(s?.status==="connected")return s.lastUsedAt=Date.now(),s;let a=s?.status==="needs-auth"&&s.credentialsInvalidated===!0,c=this.closeGenerations.get(e)??0,u=new AbortController,d=te(o,u.signal),l=this.createConnection(e,n,d,o,a),f=n.url?l.catch(async p=>{throw await this.enrichHttpConnectionError(n,p)}):l;this.connectPromises.set(e,f),this.connectAttempts.set(e,u);try{let p=await f;if(u.signal.aborted||(this.closeGenerations.get(e)??0)!==c)throw await this.disposeConnection(p),D(d),new Error(`MCP connection for ${e} was closed while connecting`);return this.connections.set(e,p),p}finally{this.connectPromises.get(e)===f&&this.connectPromises.delete(e),this.connectAttempts.get(e)===u&&this.connectAttempts.delete(e)}}async reconnect(e,n,r,o){if(U(n))throw new Error(`MCP server "${e}" is disabled`);if(this.stopped)throw new Error("MCP server manager is closed");let i=te(this.runtimeSignal,o);D(i);let s=this.reconnectPromises.get(e);if(s)return ve(s,i);let a=this.doReconnect(e,n,r,i).finally(()=>{this.reconnectPromises.get(e)===a&&this.reconnectPromises.delete(e)});return this.reconnectPromises.set(e,a),ve(a,i)}async refreshTools(e,n,r){if(this.stopped)throw new Error("MCP server manager is closed");let o=te(this.runtimeSignal,r);D(o);let i=this.connections.get(e);if(i!==n||i.status!=="connected")return"superseded";let s=this.buildRequestOptions(n.definition,r),a=Math.min(s?.timeout??ll,ll),c={...s,timeout:a};if(!n.client.getServerCapabilities?.()?.tools)return await n.client.ping(c),D(o),this.connections.get(e)!==n||n.status!=="connected"?"superseded":(this.retryPendingMetadataPublication(e,n),"unchanged");let u=n.toolsRevision??0,d=te(c.signal,AbortSignal.timeout(a)),l;try{l=await this.fetchAllTools(n.client,{...c,...d?{signal:d}:{},cacheMode:"refresh"})}catch(g){if(D(o),this.connections.get(e)!==n||n.status!=="connected")return"superseded";if(g instanceof ry&&g.code===oy.RequestTimeout)return"refresh-timeout";throw g}if(D(o),this.connections.get(e)!==n||n.status!=="connected"||(n.toolsRevision??0)!==u)return"superseded";if(ul(n.tools,l.tools)&&ul(n.toolListHints,l.hints))return this.retryPendingMetadataPublication(e,n),"unchanged";let f=n.tools,p=n.toolListHints;n.tools=l.tools,n.toolListHints=l.hints,n.toolsRevision=u+1;try{await this.metadataListChangedListener?.(e,"keep-alive-refresh"),this.pendingMetadataPublications.delete(e)}catch(g){throw this.connections.get(e)===n&&n.tools===l.tools&&n.toolListHints===l.hints&&(n.tools=f,n.toolListHints=p,n.toolsRevision=u),g}return"updated"}retryPendingMetadataPublication(e,n){let r=this.pendingMetadataPublications.get(e);r?.connection===n&&(this.metadataListChangedListener?.(e,r.reason),this.pendingMetadataPublications.get(e)===r&&this.pendingMetadataPublications.delete(e))}async doReconnect(e,n,r,o){D(o);let i=this.connections.get(e);if(i!==r)return i??this.connect(e,n,o);let s=r.inFlight;await this.close(e);let a=await this.connect(e,n,o);return a.inFlight=Math.max(a.inFlight,s),a}async createConnection(e,n,r,o,i=!1){D(r);let a=Qu(n,this.traceSettings)?this.traceWriter??=Xu(this.defaultCwd,this.traceSettings??{}):void 0,c=a?{record:b=>a.write(b)}:void 0,u,d,l=!1,f=i,p=!1,g=Buffer.alloc(0);if([n.command,n.url,n.socket].filter(b=>typeof b=="string"&&b.length>0).length!==1)throw new Error(`Server ${e} must configure exactly one of command, url, or socket`);let w=this.buildRequestOptions(n,o);if(n.command){u=this.createClient(e,n);let b=n.command,v=(n.args??[]).map(R=>le(R)),m=vn(n.cwd)??this.defaultCwd;if(m!==void 0){let R=ty(m,{throwIfNoEntry:!1});if(!R)throw new Error(`MCP server "${e}" configured cwd does not exist: "${m}"`);if(!R.isDirectory())throw new Error(`MCP server "${e}" configured cwd is not a directory: "${m}"`)}if(b==="npx"||b==="npm"){let R=await Lc(b,v,r);R&&(b=R.isJs?"node":R.binPath,v=R.isJs?[R.binPath,...R.extraArgs]:R.extraArgs,X.debug(`${e} resolved to ${R.binPath} (skipping npm parent)`))}D(r),n.pluginDataDir&&ey(n.pluginDataDir,{recursive:!0});let S=new cy({command:b,args:v,env:gy(n.env,e,n.literalEnv===!0),...m!==void 0?{cwd:m}:{},stderr:n.debug?"inherit":"pipe"});S.stderr&&S.stderr.on("data",R=>{g=py(g,R)}),d=S}else if(n.url){let b=await this.connectHttpClient(n,e,w,r,c,f);if(u=b.client,d=b.transport,f=b.credentialsInvalidated,b.status==="needs-auth")return{client:u,transport:d,definition:n,tools:[],resources:[],prompts:[],lastUsedAt:Date.now(),inFlight:0,status:"needs-auth",credentialsInvalidated:f};l=!0,p=c!==void 0}else u=this.createClient(e,n),d=new lo(vn(n.socket));if(c&&!p){let b=Zu(n,d);d=ks(d,e,b,c)}try{D(r),l||await this.connectClientWithAbort(u,d,w,r),this.attachAdapterNotificationHandlers(e,u);let b=u.getInstructions?.(),v={client:u,transport:d,definition:n,tools:[],toolsRevision:0,resources:[],prompts:[],...b!==void 0?{instructions:b}:{},lastUsedAt:Date.now(),inFlight:0,status:"connected"};u.onclose=()=>{this.connections.get(e)===v&&(v.status="closed")};let[m,S,R]=await Promise.all([this.fetchAllTools(u,w),this.fetchAllResources(u,w),this.fetchAllPrompts(u,w)]);return v.tools=m.tools,v.toolListHints=m.hints,v.resources=S,v.prompts=R.prompts,v.promptDiscoveryFailed=R.failed,v}catch(b){let v=$s.get(d),R=(b instanceof AggregateError&&b.message==="MCP connection abort cleanup failed"?[]:await Promise.allSettled([v??Promise.resolve().then(()=>u.close())])).flatMap(M=>M.status==="rejected"?[M.reason]:[]),h=b;if(R.length>0&&(h=new AggregateError([b,...R],"MCP connection setup failed")),xr(b)&&Ue(n)&&R.length===0)return f||(at(e),f=!0),{client:u,transport:d,definition:n,tools:[],resources:[],prompts:[],lastUsedAt:Date.now(),inFlight:0,status:"needs-auth",credentialsInvalidated:f};if(g.length>0){let P=g.toString("utf8").trim().split(/\r?\n/).map(C=>C.trim()).filter(Boolean);if(P.length>0){let C=h instanceof Error?h.message:String(h),E=P.slice(-uy).join(" \u2014 ");throw new Error(`${C} (${E})`,{cause:h})}}throw h}}async enrichHttpConnectionError(e,n){let r=n instanceof Error?n.message:String(n);if(Mr(n))return new Error(`${r} \u2014 endpoint is temporarily unavailable (HTTP 503)`,{cause:n});try{let o=await $c(He(e));return new Error(`${r} \u2014 probe: ${o.classification}`,{cause:n})}catch{return n instanceof Error?n:new Error(r)}}async connectClientWithAbort(e,n,r,o){D(o);let i,s=()=>{i=Promise.resolve().then(()=>n.close()),$s.set(n,i)};o?.addEventListener("abort",s,{once:!0});try{await ve(e.connect(n,r),o),await i}catch(a){if(i)try{await i}catch(c){throw new AggregateError([a,c],"MCP connection abort cleanup failed")}throw a}finally{o?.removeEventListener("abort",s)}}buildClientCapabilities(){return{extensions:{"io.modelcontextprotocol/ui":{mimeTypes:[Pn]}},...this.samplingConfig?{sampling:{}}:{},...this.elicitationConfig?{elicitation:{form:{},...this.elicitationConfig.allowUrl?{url:{}}:{}}}:{}}}createClient(e,n){let r=this.buildClientCapabilities(),o=dy(n),i;return i=new ny({name:`pi-mcp-${e}`,version:"1.0.0"},{jsonSchemaValidator:Vc(),...o?{versionNegotiation:o}:{},...Object.keys(r).length>0?{capabilities:r}:{},listChanged:{tools:{onChanged:(s,a)=>{this.handleToolsListChanged(e,i,s,a)}},resources:{onChanged:(s,a)=>{this.handleResourcesListChanged(e,i,s,a)}},prompts:{onChanged:(s,a)=>{this.handlePromptsListChanged(e,i,s,a)}}}}),this.samplingConfig&&Bu(i,{...this.samplingConfig,serverName:e}),this.elicitationConfig&&(zu(i,{...this.elicitationConfig,serverName:e,onUrlAccepted:s=>this.rememberUrlElicitation(e,s)}),this.elicitationConfig.allowUrl&&i.setNotificationHandler("notifications/elicitation/complete",s=>{this.runtimeSignal?.aborted||!this.acceptedUrlElicitations.get(e)?.delete(s.params.elicitationId)||this.elicitationConfig?.ui.notify(`MCP browser interaction for ${e} completed. You can retry the tool now.`,"info")})),i}handleToolsListChanged(e,n,r,o){if(r){X.debug(`MCP: tools/list_changed refresh failed for ${e}: ${r.message}`);return}if(!o)return;let i=this.connections.get(e);!i||i.client!==n||i.status!=="connected"||(i.tools=o,i.toolsRevision=(i.toolsRevision??0)+1,this.metadataListChangedListener?.(e,"tools-list-changed"),this.pendingMetadataPublications.delete(e))}handlePromptsListChanged(e,n,r,o){if(r){X.debug(`MCP: prompts/list_changed refresh failed for ${e}: ${r.message}`);return}if(!o)return;let i=this.connections.get(e);!i||i.client!==n||i.status!=="connected"||(i.prompts=o,i.promptDiscoveryFailed=!1,this.metadataListChangedListener?.(e,"prompts-list-changed"),this.pendingMetadataPublications.delete(e))}handleResourcesListChanged(e,n,r,o){if(r){X.debug(`MCP: resources/list_changed refresh failed for ${e}: ${r.message}`);return}if(!o)return;let i=this.connections.get(e);!i||i.client!==n||i.status!=="connected"||(i.resources=o,this.metadataListChangedListener?.(e,"resources-list-changed"),this.pendingMetadataPublications.delete(e))}async handleUrlElicitationRequired(e,n){if(this.runtimeSignal?.aborted||!this.elicitationConfig?.allowUrl)return"cancel";for(let r of n.elicitations){let o=await As({...this.elicitationConfig,serverName:e,onUrlAccepted:i=>this.rememberUrlElicitation(e,i)},r);if(o.action!=="accept")return o.action}return"accept"}rememberUrlElicitation(e,n){if(this.runtimeSignal?.aborted)return;let r=this.acceptedUrlElicitations.get(e);r||(r=new Set,this.acceptedUrlElicitations.set(e,r)),r.add(n)}async connectHttpClient(e,n,r,o,i,s=!1){D(o);let a=He(e),c=new URL(a),u=Object.values(e.headers??{}).some(m=>m.startsWith("!")&&!m.startsWith("!!")),d=Ri(e.headers,m=>`MCP server "${n}" HTTP header "${m}"`)??{},l=e.bearerToken?.startsWith("!")&&!e.bearerToken.startsWith("!!")?e.bearerToken:void 0;if(e.auth==="bearer"){let m=l?cr(l,`MCP server "${n}" HTTP bearer token`):Qr(e)??(e.bearerToken===void 0&&e.bearerTokenEnv===void 0&&e.bearerTokenStore===!0?Du(n,a):void 0);m&&(d.Authorization=`Bearer ${m}`)}if(u||l)try{new Headers(d)}catch{throw new Error(`Failed to resolve MCP server "${n}" HTTP command secret: command returned an invalid header value`)}let f=Object.keys(d).length>0?{headers:d}:void 0,p=e.requestHeadersCommand?cl(e.requestHeadersCommand):void 0,g=()=>new Gt(n,a,gs(e),{onRedirect:async()=>{}},this.authStorageOptions,this.oauthRuntime?.signal),y=Ue(e)?e.auth===void 0?{status:"implicit-deferred"}:{status:"explicit",provider:g()}:{status:"disabled"},w=async m=>{let S="provider"in y?y.provider:void 0,R={...f!==void 0?{requestInit:f}:{},...p!==void 0?{fetch:p}:{},...S!==void 0?{authProvider:S}:{},...S!==void 0&&e.oauth!==!1&&e.oauth?.skipIssuerMetadataValidation===!0?{skipIssuerMetadataValidation:!0}:{}},h=m==="streamable-http"?new sy(c,R):new iy(c,R),M=i?ks(h,n,m,i):h,P=this.createClient(n,e);try{return await this.connectClientWithAbort(P,M,r,o),{status:"connected",client:P,transport:M}}catch(C){if(!(C instanceof AggregateError&&C.message==="MCP connection abort cleanup failed"))try{await($s.get(M)??P.close())}catch(L){throw new AggregateError([C,L],"MCP HTTP connection cleanup failed")}return{status:"failed",client:P,transport:M,error:C}}},b=e.httpTransport??"streamable-http",v=s;for(;;){let m=await w(b);if(m.status==="connected")return{...m,credentialsInvalidated:v};if(m.error instanceof AggregateError&&m.error.message==="MCP connection abort cleanup failed")throw m.error;if(o?.aborted&&D(o),y.status==="implicit-deferred"&&xr(m.error)){y={status:"implicit-challenged",provider:g()};continue}if(xr(m.error)){if(Ue(e))return v||(at(n),v=!0),{client:m.client,transport:m.transport,status:"needs-auth",credentialsInvalidated:v};throw m.error}if(e.httpTransport===void 0&&b==="streamable-http"&&ly(m.error,e)){b="sse";continue}throw m.error}}async fetchAllTools(e,n){let r=[],o,i,s=!0;do{let a=await e.listTools(o?{cursor:o}:void 0,n);if(s){let c=typeof a.ttlMs=="number"&&Number.isSafeInteger(a.ttlMs)&&a.ttlMs>=0?a.ttlMs:void 0,u=a.cacheScope==="public"||a.cacheScope==="private"?a.cacheScope:void 0;(c!==void 0||u!==void 0)&&(i={...c!==void 0?{ttlMs:c}:{},...u!==void 0?{cacheScope:u}:{}}),s=!1}r.push(...a.tools??[]),o=a.nextCursor}while(o);return{tools:r,...i!==void 0?{hints:i}:{}}}async fetchAllPrompts(e,n){if(!e.getServerCapabilities?.()?.prompts)return{prompts:[],failed:!1};try{let o=[],i;do{let s=await e.listPrompts(i?{cursor:i}:void 0,n);o.push(...s.prompts??[]),i=s.nextCursor}while(i);return{prompts:o,failed:!1}}catch(o){if(n?.signal?.aborted&&D(n.signal),xr(o))throw o;let i=o instanceof Error?o.message:String(o);return X.debug(`MCP: prompts/list failed: ${i}`),{prompts:[],failed:!0}}}async fetchAllResources(e,n){if(!e.getServerCapabilities?.()?.resources)return[];try{let o=[],i;do{let s=await e.listResources(i?{cursor:i}:void 0,n);o.push(...s.resources??[]),i=s.nextCursor}while(i);return o}catch(o){if(n?.signal?.aborted&&D(n.signal),xr(o))throw o;return[]}}attachAdapterNotificationHandlers(e,n){n.setNotificationHandler(qr,{params:hi.shape.params},r=>{let o=this.uiStreamListeners.get(r.streamToken);o&&o(e,r)})}registerUiStreamListener(e,n){this.uiStreamListeners.set(e,n)}removeUiStreamListener(e){this.uiStreamListeners.delete(e)}async getPrompt(e,n,r,o){let i=this.connections.get(e);if(!i||i.status!=="connected")throw new Error(`Server "${e}" is not connected`);try{return this.touch(e),this.incrementInFlight(e),await i.client.getPrompt({name:n,...r?{arguments:r}:{}},this.getRequestOptions(e,o))}finally{this.decrementInFlight(e),this.touch(e)}}async readResource(e,n,r){if(U(this.connections.get(e)?.definition))throw new Error(`MCP server "${e}" is disabled`);let o=this.connections.get(e);if(!o||o.status!=="connected")throw new Error(`Server "${e}" is not connected`);try{return this.touch(e),this.incrementInFlight(e),await o.client.readResource({uri:n},this.getRequestOptions(e,r))}finally{this.decrementInFlight(e),this.touch(e)}}async close(e){this.closeGenerations.set(e,(this.closeGenerations.get(e)??0)+1),this.connectAttempts.get(e)?.abort(new Error(`MCP connection ${e} was closed`)),this.pendingMetadataPublications.delete(e);let n=this.connections.get(e);if(!n){let o=this.closePromises.get(e);if(o){await o;return}let i=this.connectPromises.get(e);if(i)try{await i}catch(s){if(this.containsCleanupFailure(s))throw s}return}n.status="closed",this.connections.delete(e),this.acceptedUrlElicitations.delete(e);let r=this.disposeConnection(n).finally(()=>{this.closePromises.get(e)===r&&this.closePromises.delete(e)});return this.closePromises.set(e,r),r}async disposeConnection(e){let r=(await Promise.allSettled([Promise.resolve().then(()=>e.client.close()),this.traceWriter?.flush()??Promise.resolve()])).flatMap(o=>o.status==="rejected"?[o.reason]:[]);if(r.length>0)throw new AggregateError(r,"MCP connection cleanup failed")}async closeAll(){this.stopped=!0;let e=new Set([...this.connections.keys(),...this.connectPromises.keys()]);for(let u of e)this.closeGenerations.set(u,(this.closeGenerations.get(u)??0)+1),this.connectAttempts.get(u)?.abort(new Error(`MCP connection ${u} was closed`));let n=[...this.connectPromises.values()],r=[...this.connections.keys()],o=await Promise.allSettled(n),i=await Promise.allSettled(r.map(u=>this.close(u))),s=[...this.connections.keys()],a=await Promise.allSettled(s.map(u=>this.close(u))),c=[...o,...i,...a].flatMap(u=>u.status==="rejected"?[u.reason]:[]).filter(u=>this.containsCleanupFailure(u));if(this.uiStreamListeners.clear(),this.acceptedUrlElicitations.clear(),this.pendingMetadataPublications.clear(),this.samplingConfig=void 0,this.elicitationConfig=void 0,await this.traceWriter?.flush(),c.length>0)throw new AggregateError(c,"MCP manager cleanup failed")}containsCleanupFailure(e){let n=[e],r=new Set;for(;n.length>0;){let o=n.pop();if(!(!(o instanceof Error)||r.has(o))){if(r.add(o),o instanceof AggregateError){if(/cleanup failed|setup failed/.test(o.message))return!0;n.push(...o.errors)}o.cause!==void 0&&n.push(o.cause)}}return!1}isConnecting(e){return this.connectPromises.has(e)}getConnection(e){return this.connections.get(e)}getAllConnections(){return new Map(this.connections)}touch(e){let n=this.connections.get(e);n&&(n.lastUsedAt=Date.now())}incrementInFlight(e){let n=this.connections.get(e);n&&(n.inFlight=(n.inFlight??0)+1)}decrementInFlight(e){let n=this.connections.get(e);n&&n.inFlight&&n.inFlight--}isIdle(e,n){let r=this.connections.get(e);return!r||r.status!=="connected"||r.inFlight>0?!1:Date.now()-r.lastUsedAt>n}};function gy(t,e,n=!1){let r={};for(let[i,s]of Object.entries(process.env))s!==void 0&&(r[i]=s);if(n)return t?{...r,...t}:r;let o=Ri(t,i=>`MCP server "${e}" stdio env "${i}"`);return o?{...r,...o}:r}function dl(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}be();import{ProtocolError as my,SdkHttpError as fl,UnauthorizedError as hy}from"@modelcontextprotocol/client";ue();var yy=-32e3,vy=new Set(["Server not initialized","Bad Request: Server not initialized"]);function _s(t,e){return e?t instanceof fl?t.status===404||t.status===400&&/"code"\s*:\s*-32000/.test(t.message)&&/"message"\s*:\s*"Bad Request: Server not initialized"/.test(t.message):t instanceof my&&t.code===yy&&vy.has(t.message):!1}function Sy(t){return t.transport?.sessionId!=null}var We=class extends Error{constructor(n,r){super(r??`MCP server "${n}" requires OAuth authentication after reconnect.`);this.serverName=n;this.authMessage=r;this.name="SessionRecoveryAuthRequiredError"}serverName;authMessage};async function ct(t,e,n){if(U(t.config.mcpServers[e]))throw new Error(`MCP server "${e}" is disabled`);let r=t.manager.getConnection(e);if(!r)throw new Error(`Server "${e}" is not connected`);let o=Sy(r);try{return await n(r)}catch(i){let s=t.config.mcpServers[e];if(s&&Ue(s)&&(i instanceof hy||i instanceof fl&&i.status===401)&&at(e),!_s(i,o)||!s)throw i;D(t.signal),X.debug(`MCP session for "${e}" expired; reconnecting`,{server:e});let a=t.signal?await t.manager.reconnect(e,s,r,t.signal):await t.manager.reconnect(e,s,r);if(D(t.signal),a.status==="needs-auth"&&(a=await t.onNeedsAuth?.(e)??a,D(t.signal)),a.status==="needs-auth")throw new We(e);if(a.status!=="connected")throw i;try{t.manager.publishMetadataChanged(e,a,"session-reconnect")}catch(c){let u=c instanceof Error?c.message:String(c);X.debug(`MCP metadata publication after reconnect failed for "${e}": ${u}`)}return D(t.signal),n(a)}}var by=3e4,Cy=5*6e4,xy=10,Uo=class{constructor(e,n=Io){this.manager=e;this.hasPendingAuthForServer=n}manager;hasPendingAuthForServer;keepAliveServers=new Map;allServers=new Map;serverSettings=new Map;globalIdleTimeout=600*1e3;healthCheckInterval;onReconnect;onReconnectFailure;onHealthRestored;onAuthRequired;onIdleShutdown;activeHealthCheck;activeConvergence;shutdownPromise;retryStates=new Map;pendingMetadataPublications=new Set;stopped=!1;removeHealthAbortListener;setReconnectCallback(e){this.onReconnect=e}setReconnectFailureCallback(e){this.onReconnectFailure=e}setHealthRestoredCallback(e){this.onHealthRestored=e}setAuthRequiredCallback(e){this.onAuthRequired=e}markKeepAlive(e,n){U(n)||this.keepAliveServers.set(e,n)}registerServer(e,n,r){U(n)||(this.allServers.set(e,n),r?.idleTimeout!==void 0&&this.serverSettings.set(e,r))}unregisterServer(e){this.allServers.delete(e),this.keepAliveServers.delete(e),this.serverSettings.delete(e),this.retryStates.delete(e),this.pendingMetadataPublications.delete(e)}setGlobalIdleTimeout(e){this.globalIdleTimeout=e*60*1e3}setIdleShutdownCallback(e){this.onIdleShutdown=e}startHealthChecks(e,n=3e4){let r=typeof e=="number"?void 0:e,o=typeof e=="number"?e:n;if(this.stopped=!1,r?.aborted){this.stopped=!0;return}let i=()=>{this.stopped=!0,this.healthCheckInterval&&clearInterval(this.healthCheckInterval),this.healthCheckInterval=void 0};r?.addEventListener("abort",i,{once:!0}),this.removeHealthAbortListener=()=>r?.removeEventListener("abort",i),this.healthCheckInterval=setInterval(()=>{if(this.stopped||r?.aborted||this.activeHealthCheck)return;let s=this.checkConnections(r).catch(a=>{console.error(`MCP: Health check failed: ${_e(a)}`)}).finally(()=>{this.activeHealthCheck===s&&(this.activeHealthCheck=void 0)});this.activeHealthCheck=s},o),this.healthCheckInterval.unref()}async ensureConverged(e){if(this.stopped||e?.aborted)return;if(this.activeConvergence)return this.activeConvergence;let n=this.checkKeepAliveConnections(e);this.activeConvergence=n;try{await n}finally{this.activeConvergence===n&&(this.activeConvergence=void 0)}}async checkConnections(e){if(!(this.stopped||e?.aborted)&&(await this.ensureConverged(e),!(this.stopped||e?.aborted)))for(let[n]of this.allServers){if(this.keepAliveServers.has(n))continue;let r=this.getIdleTimeout(n);if(r>0&&this.manager.isIdle(n,r)){if(await this.manager.close(n),this.stopped||e?.aborted)return;this.onIdleShutdown?.(n)}}}async checkKeepAliveConnections(e){this.stopped||e?.aborted||await ar([...this.keepAliveServers],xy,([n,r])=>this.checkKeepAliveConnection(n,r,e))}async checkKeepAliveConnection(e,n,r,o=!0){if(U(n)||this.stopped||r?.aborted||this.keepAliveServers.get(e)!==n)return;let i=this.manager.getConnection(e);if(i?.status==="needs-auth"){this.pendingMetadataPublications.delete(e);return}if(!this.shouldAttemptConnection(e,i))return;if(!i||i.status!=="connected"){if(this.hasPendingAuthForServer(e)){X.debug(`Skipping reconnect for ${e} while OAuth authorization is pending`);return}let c;try{c=await this.manager.connect(e,n,r)}catch(u){if(this.stopped||r?.aborted)return;this.reportConnectionFailure(e,n,u,"reconnect",this.manager.getConnection(e));return}if(this.stopped||r?.aborted)return;if(c.status==="needs-auth"){await this.notifyAuthRequired(e,n,c);return}if(c.status!=="connected"){this.reportConnectionFailure(e,n,new Error(`MCP server ${e} did not return a connected session`),"reconnect",c);return}X.debug(`Reconnected to ${e}`),await this.publishConnectedMetadata(e,n,c);return}if(this.pendingMetadataPublications.has(e)){await this.publishConnectedMetadata(e,n,i);return}if(!n.url)return;let s=i.transport?.sessionId!=null,a;try{a=await this.manager.refreshTools(e,i,r)}catch(c){if(this.stopped||r?.aborted)return;if(this.manager.getConnection(e)!==i||i.status!=="connected"){await this.handleSupersededConnection(e,n,i,r,o);return}if(!My(c,s)){this.reportConnectionFailure(e,n,c,"refresh",i);return}if(this.hasPendingAuthForServer(e)){X.debug(`Skipping reconnect for ${e} while OAuth authorization is pending`);return}let d;try{d=await this.manager.reconnect(e,n,i,r)}catch(l){if(this.stopped||r?.aborted)return;this.reportConnectionFailure(e,n,l,"reconnect",this.manager.getConnection(e));return}if(this.stopped||r?.aborted)return;if(d.status==="needs-auth"){await this.notifyAuthRequired(e,n,d);return}if(d.status!=="connected"){this.reportConnectionFailure(e,n,new Error(`MCP server ${e} did not return a connected session`),"reconnect",d);return}X.debug(`Reconnected stale MCP session for ${e}`),await this.publishConnectedMetadata(e,n,d);return}if(a==="superseded"){await this.handleSupersededConnection(e,n,i,r,o);return}if(a==="refresh-timeout"){this.deferRefreshTimeout(e,n,i);return}this.keepAliveServers.get(e)===n&&this.retryStates.delete(e)&&await this.onHealthRestored?.(e)}async handleSupersededConnection(e,n,r,o,i){let s=this.manager.getConnection(e);if(this.keepAliveServers.get(e)===n){if(s===r&&s.status==="connected"){this.retryStates.delete(e)&&await this.onHealthRestored?.(e);return}if(s?.status==="connected"){await this.publishConnectedMetadata(e,n,s);return}if(s?.status==="needs-auth"){await this.notifyAuthRequired(e,n,s);return}i&&await this.checkKeepAliveConnection(e,n,o,!1)}}async publishConnectedMetadata(e,n,r){if(this.keepAliveServers.get(e)!==n){this.manager.getConnection(e)===r&&await this.manager.close(e);return}this.pendingMetadataPublications.add(e);try{await this.onReconnect?.(e),this.pendingMetadataPublications.delete(e),this.retryStates.delete(e)}catch(o){if(this.stopped)return;this.reportConnectionFailure(e,n,o,"publish",r)}}async notifyAuthRequired(e,n,r){if(this.keepAliveServers.get(e)!==n){this.manager.getConnection(e)===r&&await this.manager.close(e);return}this.pendingMetadataPublications.delete(e),this.retryStates.delete(e);try{await this.onAuthRequired?.(e)}catch(o){let i=o instanceof Error?o.message:String(o);X.debug(`MCP: auth-required callback failed for ${e}: ${de(i)}`)}}shouldAttemptConnection(e,n){let r=this.retryStates.get(e);return r?r.connection!==n||r.status!==n?.status?(this.retryStates.delete(e),!0):Date.now()>=r.nextAttemptAt:!0}connectionFailureTarget(e,n){return e==="reconnect"?`reconnect to ${n}`:e==="publish"?`publish metadata for ${n}`:`refresh ${n}`}reportConnectionFailure(e,n,r,o,i){if(!this.recordRetry(e,n,i)||(this.onReconnectFailure?.(e,r),Mr(r)))return;let s=this.retryStates.get(e);if(s?.warningReported)return;s&&(s.warningReported=!0);let a=r instanceof Error?r.message:String(r);console.error(`MCP: Failed to ${this.connectionFailureTarget(o,e)}: ${de(a)}`)}deferRefreshTimeout(e,n,r){this.recordRetry(e,n,r)&&X.debug(`MCP: keep-alive tools/list refresh timed out for ${e}; retrying after backoff`)}recordRetry(e,n,r){if(this.keepAliveServers.get(e)!==n)return!1;let o=this.retryStates.get(e),i=(o?.attempts??0)+1,s=Math.min(by*2**Math.min(i-1,10),Cy);return this.retryStates.set(e,{attempts:i,nextAttemptAt:Date.now()+s,connection:r,status:r?.status,warningReported:o?.warningReported??!1}),!0}getIdleTimeout(e){let n=this.serverSettings.get(e)?.idleTimeout;return n!==void 0?n*60*1e3:this.globalIdleTimeout}async gracefulShutdown(){return this.shutdownPromise?this.shutdownPromise:(this.shutdownPromise=this.shutdownOnce(),this.shutdownPromise)}async shutdownOnce(){this.stopped=!0,this.healthCheckInterval&&clearInterval(this.healthCheckInterval),this.healthCheckInterval=void 0,this.removeHealthAbortListener?.(),this.removeHealthAbortListener=void 0,await this.activeHealthCheck,this.activeHealthCheck=void 0,await this.activeConvergence,this.activeConvergence=void 0,this.onReconnect=void 0,this.onReconnectFailure=void 0,this.onHealthRestored=void 0,this.onAuthRequired=void 0,this.onIdleShutdown=void 0,this.retryStates.clear(),this.pendingMetadataPublications.clear(),typeof this.manager.closeAll=="function"&&await this.manager.closeAll()}};function My(t,e){return _s(t,e)?!0:t instanceof wy&&(t.code===pl.NotConnected||t.code===pl.ConnectionClosed)}nt();Rn();ue();It();be();en();function nn(t,e,n,r,o,i,s,a=!1){let c=[],u=[],d=new Set,l=pe(n,o),p=(Array.isArray(n.includeTools)&&n.includeTools.length>0||Array.isArray(n.excludeTools)&&n.excludeTools.length>0)&&i?(()=>{let g=new Set,y=new Map,w=new Set,b=(v,m,S,R)=>{for(let h of ce(m,S,R,!1))v.add(h)};for(let v of t)v?.name&&(w.add(v.name),b(g,v.name,r,l));if(n.exposeResources!==!1)for(let v of e){let m=`read_${Ce(v.name)}`;w.add(m),v?.name&&v?.uri&&b(g,m,r,l)}for(let[v,m]of Object.entries(i)){if(v===r)continue;let S=pe(m,o),R=s?.get(v);if(R)for(let h of R)g.add(h.name),b(g,h.originalName,v,S);else if(!s||a)for(let h of w){let M=y.get(h);if(M||(M=new Set,y.set(h,M)),b(M,h,v,S),a)for(let P of ce(h,v,S,!1))M.add(P.replace(/-/g,"_"))}}return mn(g,y)})():void 0;for(let g of t){if(!g?.name){u.push("(unnamed)");continue}if(!Ee(g.name,r,l,n.includeTools,n.excludeTools,p))continue;let y=se(g.name,r,l);if(d.has(y))continue;let w=Zt(g._meta);if(!ke(w))continue;d.add(y);let b;try{b=ho({_meta:g._meta})}catch{u.push(g.name)}let v=Zr(g._meta);c.push({name:y,originalName:g.name,description:g.description??"",...g.inputSchema!==void 0?{inputSchema:g.inputSchema}:{},...b!==void 0?{uiResourceUri:b}:{},...w!==void 0?{uiVisibility:w}:{},...v!==void 0?{uiStreamMode:v}:{}})}if(n.exposeResources!==!1)for(let g of e){let y=`read_${Ce(g.name)}`;if(!Ee(y,r,l,n.includeTools,n.excludeTools,p))continue;let w=se(y,r,l);d.has(w)||(d.add(w),c.push({name:w,originalName:y,description:g.description??`Read resource: ${g.uri}`,resourceUri:g.uri}))}return{metadata:c,failedTools:u}}function js(t,e){return t.toolMetadata.get(e)?.map(n=>n.name)??[]}function bl(t){let e=0;for(let n of t.toolMetadata.values())e+=n.length;return e}function Ar(t,e){if(!t)return;let n=t.find(o=>o.name===e);if(n)return n;let r=e.replace(/-/g,"_");return t.find(o=>o.name.replace(/-/g,"_")===r)}function rt(t,e=" "){if(!t||typeof t!="object"||Array.isArray(t))return`${e}(no schema)`;let n=t;if(n.type==="object"&&n.properties&&typeof n.properties=="object"&&!Array.isArray(n.properties)){let i=n.properties,s=Array.isArray(n.required)?n.required.filter(c=>typeof c=="string"):[];if(Object.keys(i).length===0)return`${e}(no parameters)`;let a=[];for(let[c,u]of Object.entries(i))a.push(...Ls(c,u,s.includes(c),e));return a.join(`
102
+ `)}let r=Bs(n,e);if(r.length>0)return r.join(`
103
+ `);let o=Hs(n);return o?`${e}(${o})`:`${e}(complex schema)`}function Ls(t,e,n,r){if(!e||typeof e!="object"||Array.isArray(e))return[`${r}${t}${n?" *required*":""}`];let o=e,i=[`${r}${t}`],s=Hs(o);return s&&i.push(`(${s})`),n&&i.push("*required*"),Cl(i,o),[i.join(" "),...Bs(o,`${r} `)]}function Bs(t,e){let n=[];if(Array.isArray(t.anyOf)&&n.push(...wl("anyOf",t.anyOf,e)),Array.isArray(t.oneOf)&&n.push(...wl("oneOf",t.oneOf,e)),t.items!==void 0&&n.push(...Ls("items",t.items,!1,e)),t.properties&&typeof t.properties=="object"&&!Array.isArray(t.properties)){let r=Array.isArray(t.required)?t.required.filter(o=>typeof o=="string"):[];for(let[o,i]of Object.entries(t.properties))n.push(...Ls(o,i,r.includes(o),e))}return n}function wl(t,e,n){let r=[`${n}${t}:`];for(let o of e){if(!o||typeof o!="object"||Array.isArray(o)){r.push(`${n} - ${JSON.stringify(o)}`);continue}let i=o,s=Hs(i)||"schema",a=[`${n} - ${s}`];Cl(a,i),r.push(a.join(" ")),r.push(...Bs(i,`${n} `))}return r}function Hs(t){return Object.hasOwn(t,"const")?`const ${JSON.stringify(t.const)}`:Array.isArray(t.enum)?`enum: ${t.enum.map(e=>JSON.stringify(e)).join(", ")}`:Array.isArray(t.type)?t.type.map(e=>String(e)).join(" | "):t.type?String(t.type):t.properties&&typeof t.properties=="object"&&!Array.isArray(t.properties)?"object":t.items!==void 0?"array":""}function Cl(t,e){e.description&&typeof e.description=="string"&&t.push(`- ${e.description}`);for(let n of["minLength","maxLength","minimum","maximum","minItems","maxItems","format","pattern"])e[n]!==void 0&&t.push(`[${n}: ${JSON.stringify(e[n])}]`);e.default!==void 0&&t.push(`[default: ${JSON.stringify(e.default)}]`)}It();Rn();import{UrlElicitationRequiredError as $y}from"@modelcontextprotocol/client";ue();var jo=class{constructor(e,n=void 0){this.manager=e;this.config=n}manager;config;log=X.child({component:"UiResourceHandler"});async readUiResource(e,n,r={}){let o=this.log.child({server:e,uri:n});if(!n.startsWith("ui://"))throw new An(n,"URI must start with ui://",{server:e});o.debug("Fetching UI resource");let i;try{let l=r.config??this.config;if(l&&U(l.mcpServers[e]))throw new Error(`MCP server "${e}" is disabled`);if(l){this.manager.touch(e),this.manager.incrementInFlight(e);try{i=await ct({manager:this.manager,config:l,...r.signal?{signal:r.signal}:{},...r.onNeedsAuth?{onNeedsAuth:r.onNeedsAuth}:{}},e,f=>f.client.readResource({uri:n},this.manager.getRequestOptions(e,r.signal)))}finally{this.manager.decrementInFlight(e),this.manager.touch(e)}}else i=await this.manager.readResource(e,n,r.signal)}catch(l){if(l instanceof $y||l instanceof We)throw l;let f=l instanceof Error?l.message:String(l);throw o.error("Failed to read resource",l instanceof Error?l:void 0),new co(n,f,{server:e,...l instanceof Error?{cause:l}:{}})}let s=Iy(i,n),a=s.mimeType;if(a&&!Ml(a))throw o.warn("Unsupported MIME type",{mimeType:a}),new An(n,`unsupported MIME type "${a}" (expected text/html or ${Pn})`,{server:e,mimeType:a});let c=_y(s);if(!c.trim())throw o.warn("Resource content is empty"),new An(n,"content is empty",{server:e});let u=xl(s._meta),d=xl(this.getListResourceMeta(e,n));return o.debug("Resource loaded successfully",{contentLength:c.length,hasCsp:!!u.csp||!!d.csp}),{uri:s.uri??n,html:c,mimeType:a??Pn,meta:{...(u.csp??d.csp)!==void 0?{csp:u.csp??d.csp}:{},...(u.permissions??d.permissions)!==void 0?{permissions:u.permissions??d.permissions}:{},...(u.domain??d.domain)!==void 0?{domain:u.domain??d.domain}:{},...(u.prefersBorder??d.prefersBorder)!==void 0?{prefersBorder:u.prefersBorder??d.prefersBorder}:{}}}}getListResourceMeta(e,n){let r=this.manager.getConnection(e);if(!r?.resources?.length)return;let o=r.resources.find(i=>i.uri===n);if(!(!o||!o._meta||typeof o._meta!="object"))return o._meta}};function Iy(t,e){let n=t.contents??[];if(n.length===0)throw new Error(`No contents returned for UI resource: ${e}`);let r=n.find(s=>s.uri===e);if(r)return r;let o=n.find(s=>s.mimeType&&Ml(s.mimeType));if(o)return o;let i=n[0];if(!i)throw new Error(`No contents returned for UI resource: ${e}`);return i}function Ml(t){let e=t.toLowerCase();return e.startsWith("text/html")||e===Pn.toLowerCase()}function _y(t){if(typeof t.text=="string")return t.text;if(typeof t.blob=="string")return Buffer.from(t.blob,"base64").toString("utf-8");throw new Error(`UI resource ${t.uri??"(unknown)"} did not include text or blob content`)}var Tl=[["resource_domains","resourceDomains"],["connect_domains","connectDomains"],["frame_domains","frameDomains"]],Uy=["resourceDomains","connectDomains","frameDomains","baseUriDomains"];function xl(t){if(!t||typeof t!="object")return{};let e=zn(t.ui)?t.ui:void 0,n={},r=Object.hasOwn(t,"openai/widgetCSP")?Ny(t["openai/widgetCSP"]):void 0,o=!!e&&Object.hasOwn(e,"csp"),i=o?e.csp:void 0;if(o&&!zn(i))n.csp={};else{let s=o?Dy(i):void 0;if((r||s)&&(n.csp={...r,...s},zn(i)))for(let[,a]of Tl)Object.hasOwn(i,a)&&!Fs(i[a])&&delete n.csp[a]}return e&&zn(e.permissions)&&(n.permissions=e.permissions),e&&typeof e.domain=="string"&&(n.domain=e.domain),e&&typeof e.prefersBorder=="boolean"&&(n.prefersBorder=e.prefersBorder),n}function Dy(t){if(!zn(t))return{};let e={};for(let n of Uy){let r=Fs(t[n]);r&&(e[n]=r)}return e}function Ny(t){if(!zn(t))return{};let e={};for(let[n,r]of Tl){let o=Fs(t[n]);o&&(e[r]=o)}return e}function Fs(t){return Array.isArray(t)&&t.every(e=>typeof e=="string")?[...t]:void 0}function zn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}be();ue();function Me(t,e){let n=t.failureTracker.get(e);if(!n)return null;let r=Date.now()-n;return r>6e4?null:Math.round(r/1e3)}function Bo(t,e){return Me(t,e)===null?null:t.failureMessages?.get(e)??null}function Te(t,e){let n=t.manager.getConnection(e);return n?.status!=="connected"&&n?.status!=="needs-auth"&&Me(t,e)!==null}ue();function Ly(t){let e=[],n=0,r=0,o=0,i=0;for(let s of Object.keys(t.config.mcpServers)){let c=t.config.mcpServers[s]?.disabled===!0,u=c?void 0:t.manager.getConnection(s),d=c?null:Me(t,s),l=!c&&Te(t,s),f=c||l?void 0:t.toolMetadata.get(s),p=f?.length??(u?.status==="connected"?u.tools.length:0),g=c||l?void 0:t.resourceCounts?.get(s)??(u?.status==="connected"?u.resources.length:void 0),y="not-connected";c?(y="disabled",i++):u?.status==="connected"?(y="connected",o++):u?.status==="needs-auth"?y="needs-auth":l?y="failed":f!==void 0&&(y="cached"),n+=c?0:p,!c&&g!==void 0&&(r+=g),e.push({name:s,status:y,toolCount:p,...g!==void 0?{resourceCount:g}:{},...y==="failed"&&d!==null?{failedAgoSeconds:d}:{},disabled:c})}return{version:sr,servers:e,totalTools:n,totalResources:r,connectedCount:o,disabledCount:i}}function rn(t,e){let n=t.statusEvents;if(n)try{n.emit(ir,e??Ly(t))}catch{}}function zs(t){if(t)try{t.emit(ir,{version:sr,servers:[],totalTools:0,totalResources:0,connectedCount:0,disabledCount:0})}catch{}}var Hy=8*1024,Vs=new WeakMap;function qs(t){let e=Vs.get(t);return e||(e=new Map,Vs.set(t,e)),e}function Ae(t,e,n){let r=Me(t,e)!==null;t.failureTracker.delete(e),t.failureMessages?.delete(e);let o=Vs.get(t),i=o?.get(e);return i&&clearTimeout(i),o?.delete(e),n&&r&&(Ge(t,e,n),rn(t)),r}function ht(t,e,n){Ae(t,e);let r=Date.now();t.failureTracker.set(e,r),t.failureMessages?.set(e,n.slice(0,Hy));let o=setTimeout(()=>{if(!t.owner.isActive()){qs(t).delete(e);return}t.failureTracker.get(e)===r&&(t.failureTracker.delete(e),t.failureMessages?.delete(e),Ge(t,e,"failure-backoff-expired"),rn(t)),qs(t).delete(e)},6e4);o.unref?.(),qs(t).set(e,o),Ge(t,e,"failure-backoff-started"),rn(t)}async function Al(t,e,n=Dn(),r={}){let o=r.config!==void 0?void 0:r.configPath??t.getFlag("mcp-config"),i=e.cwd,s=e.hasUI,a=e.mode,c=s?e.ui:void 0,u=e.modelRegistry,d=e.signal,l=c?vr(c,n):void 0,f=te(n.signal,d),p=r.config!==void 0?Vt(r.config):io(o,i),g=bo(p.settings?.oauthDir,i),y=r.oauthRuntime===void 0,w=r.oauthRuntime??$t(n.signal),b=new _o(i);b.setRuntimeSignal?.(n.signal),b.setOAuthRuntime?.(w),b.setDefaultRequestTimeoutMs(p.settings?.requestTimeoutMs),b.setTraceConfig?.(p.settings?.trace),b.setAuthStorageOptions(g);let v=p.settings?.samplingAutoApprove===!0;p.settings?.sampling!==!1&&(s||v)&&b.setSamplingConfig({autoApprove:v,...l!==void 0?{ui:l}:{},modelRegistry:u,getCurrentModel:()=>n.isActive()?e.model:void 0,getSignal:()=>n.isActive()?te(n.signal,e.signal):n.signal}),p.settings?.elicitation!==!1&&s&&l&&b.setElicitationConfig({ui:l,allowUrl:a==="tui"});let S=new Uo(b,I=>Io(I,void 0,w)),R=new Map,h=new Map,M=new Map,P=new Set,C=new Map,E=new Map,L=new Map,H=new Map,$=new jo(b,p),O=new uo("once-per-server"),T={owner:n,manager:b,lifecycle:S,toolMetadata:R,resourceCounts:h,promptMetadata:M,promptMetadataLive:P,serverInstructions:C,config:p,programmaticConfig:r.config!==void 0,oauthRuntime:w,authStorageOptions:g,failureTracker:E,failureMessages:L,approvedToolCalls:H,approvalEvents:t.events,uiResourceHandler:$,consentManager:O,uiServer:null,completedUiSessions:[],openBrowser:async I=>{n.throwIfInactive(),await sc(t,I,process.env.BROWSER,n.signal),n.throwIfInactive()},...l!==void 0?{ui:l}:{},sendMessage:(I,q)=>{let ee=()=>{n.isActive()&&t.sendMessage(I,q)};if(!q?.triggerTurn){ee();return}S.ensureConverged(n.signal).then(ee,me=>{if(!n.isActive()||ie(me,n.signal))return;let Ie=me instanceof Error?me.message:String(me);X.debug(`MCP: pre-turn keep-alive convergence failed: ${de(Ie)}`),ee()})},...r.statusEvents!==void 0?{statusEvents:r.statusEvents}:{}};y&&n.addCleanup(()=>jn(w)),b.setMetadataListChangedListener?.((I,q)=>{n.isActive()&&(on(T,I),ot(T,I,{preserveEmptyResources:!1}),Ge(T,I,q),ge(T))}),n.addCleanup(()=>S.gracefulShutdown()),n.addCleanup(()=>{T.uiServer&&(T.uiServer.close("runtime_owner_stopped"),T.uiServer=null)});let G=Object.entries(p.mcpServers),F=G.filter(([,I])=>!U(I));if(F.length===0)return G.length>0&&s&&l?.notify(`MCP: All ${G.length} server(s) are disabled`,"info"),rn(T),T;let Oe=typeof p.settings?.idleTimeout=="number"?p.settings.idleTimeout:10;S.setGlobalIdleTimeout(Oe);let fe=No(),j=By(fe),Q=ze(),ne=!1;j?Q||(Q={version:1,servers:{}},Lo(Q)):(ne=!0,Lo({version:1,servers:{}}));let Se=p.settings?.toolPrefix??"server",Xe;for(let[I,q]of F){let ee=q.lifecycle??"lazy",me=ee==="eager"||ee==="lazy-keep-alive",Ie=q.idleTimeout??(me?0:void 0);S.registerServer(I,q,Ie!==void 0?{idleTimeout:Ie}:void 0),ee==="keep-alive"&&S.markKeepAlive(I,q);let J=Q?.servers?.[I];if(J&&$e(J,q)){(Array.isArray(q.includeTools)&&q.includeTools.length>0||Array.isArray(q.excludeTools)&&q.excludeTools.length>0)&&!Xe&&Q&&(Xe=Tr(p.mcpServers,Q,Se));let et=hl(I,J,Se,q,p.mcpServers,Q??void 0,Xe);R.set(I,et),Array.isArray(J.resources)&&h.set(I,J.resources.length),J.prompts?.length&&M.set(I,ut(I,J.prompts??[],Se,q)),J.instructions&&C.set(I,J.instructions)}}let dt=ne?F:F.filter(([,I])=>{let q=I.lifecycle??"lazy";return q==="keep-alive"||q==="eager"});if(l&&dt.length>0){let I=Bt(T.config,`connecting to ${dt.length} servers...`);l.setStatus("mcp",I)}let Re=await ar(dt,10,async([I,q])=>{try{let ee=await b.connect(I,q,f);return ee.status==="needs-auth"?{name:I,definition:q,connection:null,error:`OAuth authentication required. Run /mcp-auth ${I}.`,transient:!1}:{name:I,definition:q,connection:ee,error:null,transient:!1}}catch(ee){if(ie(ee,f)){if(n.signal.aborted)throw ee;return{name:I,definition:q,connection:null,error:null,transient:!1}}let me=Mr(ee),Ie=ee instanceof Error?ee.message:String(ee);return{name:I,definition:q,connection:null,error:Ie,transient:me}}});if(d?.aborted)return T;n.throwIfInactive();let St=new Map;for(let{name:I,definition:q,connection:ee}of Re){if(!ee)continue;let me=pe(q,Se),Ie=[...ee.tools.filter(J=>J?.name).map(J=>({name:se(J.name,I,me),originalName:J.name,description:J.description??""})),...q.exposeResources!==!1?ee.resources.filter(J=>J?.name&&J?.uri).map(J=>{let we=`read_${Ce(J.name)}`;return{name:se(we,I,me),originalName:we,description:J.description??`Read resource: ${J.uri}`,resourceUri:J.uri}}):[]];St.set(I,Ie)}for(let{name:I,definition:q,connection:ee,error:me,transient:Ie}of Re){if(n.throwIfInactive(),me||!ee){if(d?.aborted)continue;if(me&&ht(T,I,me),Ie){let Dt=`MCP: ${I} temporarily unavailable (HTTP 503); retry later`;X.debug(`MCP: startup connect hit transient upstream outage for ${I}; will retry`),l?l.notify(Dt,"warning"):console.error(Dt);continue}let et=de(me??"Unknown connection failure");l&&l.notify(`MCP: Failed to connect to ${I}: ${et}`,"error"),console.error(`MCP: Failed to connect to ${I}: ${et}`);continue}let{metadata:J,failedTools:we}=nn(ee.tools,ee.resources,q,I,Se,p.mcpServers,St,!0);R.set(I,J),h.set(I,ee.resources.length),ee.promptDiscoveryFailed||(M.set(I,ut(I,ee.prompts??[],Se,q)),P.add(I)),ee.instructions?C.set(I,ee.instructions):C.delete(I),ot(T,I),Ge(T,I,"startup"),yt(T,I),we.length>0&&l&&l.notify(`MCP: ${I} - ${we.length} tools skipped`,"warning")}let st=Re.filter(I=>I.connection).length,pn=Re.filter(I=>I.error).length;if(l&&st>0&&p.settings?.notifyOnStartupConnect!==!1){let I=bl(T),q=pn>0?`MCP: ${st}/${dt.length} servers connected (${I} tools)`:`MCP: ${st} servers connected (${I} tools)`;l.notify(q,"info")}let wt=process.env.MCP_DIRECT_TOOLS;if(wt!=="__none__"){let I=ze(),q=wt?.split(",").map(me=>me.trim()).filter(Boolean),ee=Fn(p,I,q);if(ee.length>0){let Ie=(await ar(ee.filter(J=>!Re.some(we=>we.name===J&&we.connection)),10,async J=>{try{let we=p.mcpServers[J];if(!we)throw new Error(`MCP server "${J}" is not configured`);return(await b.connect(J,we,f)).status==="needs-auth"?{name:J,ok:!1}:(on(T,J),ot(T,J),Ae(T,J,"direct-tools-bootstrap")||Ge(T,J,"direct-tools-bootstrap"),yt(T,J),{name:J,ok:!0})}catch(we){if(ie(we,f)){if(n.signal.aborted)throw we;return{name:J,ok:!1}}let et=we instanceof Error?we.message:String(we);return ht(T,J,et),X.debug(`MCP: direct-tools bootstrap failed for ${J}: ${de(et)}`),{name:J,ok:!1}}})).filter(J=>J.ok).map(J=>J.name);n.throwIfInactive(),Ie.length>0&&l&&l.notify(`MCP: direct tools for ${Ie.join(", ")} will be available after restart`,"info")}}return S.setReconnectCallback(I=>{if(!n.isActive())return;on(T,I),ot(T,I),Ae(T,I,"lifecycle-reconnect")||Ge(T,I,"lifecycle-reconnect"),ge(T)}),S.setReconnectFailureCallback((I,q)=>{if(!n.isActive())return;let ee=q instanceof Error?q.message:String(q);ht(T,I,ee),ge(T)}),S.setHealthRestoredCallback(I=>{n.isActive()&&(Ae(T,I,"health-restored"),ge(T))}),S.setAuthRequiredCallback(I=>{n.isActive()&&(Ae(T,I,"auth-required"),ge(T))}),S.setIdleShutdownCallback(I=>{if(!n.isActive())return;let q=Fy(T,I);X.debug(`${I} shut down (idle ${q}m)`),ge(T)}),n.throwIfInactive(),S.startHealthChecks(f),p.settings?.mcpFooterStatus==="off"&&l?.setStatus("mcp",void 0),rn(T),T}function yt(t,e){let n=t.config.mcpServers[e];!n||U(n)||(n.lifecycle??"lazy")==="lazy-keep-alive"&&t.lifecycle.markKeepAlive(e,n)}function on(t,e){let n=t.manager.getConnection(e);if(!n||n.status!=="connected")return;let r=t.config.mcpServers[e];if(!r)return;if(U(r)){t.toolMetadata.delete(e),t.resourceCounts?.delete(e),t.promptMetadata?.delete(e),t.promptMetadataLive?.delete(e),t.serverInstructions.delete(e);return}let o=t.config.settings?.toolPrefix??"server",{metadata:i}=nn(n.tools,n.resources,r,e,o,t.config.mcpServers,t.toolMetadata);t.toolMetadata.set(e,i),t.resourceCounts?.set(e,n.resources.length),n.promptDiscoveryFailed||(t.promptMetadata?.set(e,ut(e,n.prompts??[],o,r)),t.promptMetadataLive?.add(e)),n.instructions?t.serverInstructions?.set(e,n.instructions):t.serverInstructions?.delete(e)}function ot(t,e,n={}){let r=t.manager.getConnection(e);if(!r||r.status!=="connected")return;let o=t.config.mcpServers[e];if(!o||U(o))return;let i=Ns(o),a=ze()?.servers?.[e],c=yl(r.tools),u=o.exposeResources===!1?[]:vl(r.resources),d=r.promptDiscoveryFailed?a?.configHash===i?a.prompts:void 0:Sl(r.prompts??[]);o.exposeResources!==!1&&u.length===0&&a?.resources?.length&&a.configHash===i&&n.preserveEmptyResources!==!1&&(u=a.resources);let l={configHash:i,tools:c,resources:u,...d!==void 0?{prompts:d}:{},...r.instructions!==void 0?{instructions:r.instructions}:{},...r.toolListHints?.ttlMs!==void 0?{ttlMs:r.toolListHints.ttlMs}:{},...r.toolListHints?.cacheScope!==void 0?{cacheScope:r.toolListHints.cacheScope}:{},cachedAt:Date.now()};Lo({version:1,servers:{[e]:l}})}function Ge(t,e,n){try{let r=t.onToolMetadataUpdated?.(e,n);r&&typeof r.catch=="function"&&r.catch(o=>{let i=o instanceof Error?o.message:String(o);X.debug(`MCP: metadata update hook failed for ${e}: ${i}`)})}catch(r){let o=r instanceof Error?r.message:String(r);X.debug(`MCP: metadata update hook failed for ${e}: ${o}`)}}function Pl(t){for(let[e,n]of t.manager.getAllConnections())n.status==="connected"&&ot(t,e)}function ge(t){rn(t);let e=t.ui;if(!e)return;let n=Object.entries(t.config.mcpServers),r=n.filter(([,l])=>U(l)).length,o=n.length-r;if(n.length===0){e.setStatus("mcp",void 0);return}let i=[...t.manager.getAllConnections()].filter(([l,f])=>{let p=t.config.mcpServers[l];return f.status==="connected"&&p!==void 0&&!U(p)}).length,s=t.config.settings?.mcpFooterStatus??"full";if(s==="off"){e.setStatus("mcp",void 0);return}let a=s==="compact"?`MCP ${i}/${o}`:`${o} ${o===1?"server":"servers"} enabled`;s==="full"&&(i>0&&(a+=` (${i} connected)`),r>0&&(a+=` (${r} disabled)`));let c=s==="compact"?a:Bt(t.config,a);if(c===void 0){e.setStatus("mcp",void 0);return}let u=e.theme,d=typeof u?.fg=="function"?u.fg("accent",c):c;e.setStatus("mcp",d)}async function it(t,e,n){let r=te(t.owner?.signal,n);D(r);let o=t.manager.getConnection(e);if(o?.status==="needs-auth")return!1;if(o?.status==="connected")return on(t,e),yt(t,e),!0;if(Me(t,e)!==null)return!1;let s=t.config.mcpServers[e];if(!s||U(s))return!1;try{if(t.ui){let u=Bt(t.config,`connecting to ${e}...`);t.ui.setStatus("mcp",u)}return(await t.manager.connect(e,s,r)).status==="needs-auth"?!1:(on(t,e),ot(t,e),Ae(t,e,"lazy-connect")||Ge(t,e,"lazy-connect"),yt(t,e),ge(t),!0)}catch(a){ie(a,r)&&D(r);let c=a instanceof Error?a.message:String(a);return ht(t,e,c),X.debug(`MCP: lazy connect failed for ${e}: ${de(c)}`),ge(t),!1}}function Fy(t,e){let n=t.config.mcpServers[e];if(!n)return typeof t.config.settings?.idleTimeout=="number"?t.config.settings.idleTimeout:10;if(typeof n.idleTimeout=="number")return n.idleTimeout;let r=n.lifecycle??"lazy";return r==="eager"||r==="lazy-keep-alive"?0:typeof t.config.settings?.idleTimeout=="number"?t.config.settings.idleTimeout:10}nt();tt();import{existsSync as zy,mkdirSync as qy,readFileSync as Vy,writeFileSync as Ky,renameSync as Jy}from"node:fs";import{dirname as Wy}from"node:path";var Ks={version:1,sharedConfigHintShown:!1,setupCompleted:!1};function Rl(){return Qe("mcp-onboarding.json")}function Ho(){let t=Rl();if(!zy(t))return{...Ks};try{let e=JSON.parse(Vy(t,"utf-8"));return!e||typeof e!="object"?{...Ks}:{version:1,sharedConfigHintShown:e.sharedConfigHintShown===!0,setupCompleted:e.setupCompleted===!0,...typeof e.lastDiscoveryFingerprint=="string"?{lastDiscoveryFingerprint:e.lastDiscoveryFingerprint}:{}}}catch{return{...Ks}}}function Gy(t){let e=Rl();qy(Wy(e),{recursive:!0});let n=`${e}.${process.pid}.tmp`;Ky(n,`${JSON.stringify(t,null,2)}
104
+ `,"utf-8"),Jy(n,e)}function El(t){let e=t(Ho());return Gy(e),e}function kl(t){return El(e=>{let n=t??e.lastDiscoveryFingerprint;return{...e,sharedConfigHintShown:!0,...n!==void 0?{lastDiscoveryFingerprint:n}:{}}})}function Ol(t){return El(e=>{let n=t??e.lastDiscoveryFingerprint;return{...e,setupCompleted:!0,...n!==void 0?{lastDiscoveryFingerprint:n}:{}}})}be();function sv(t,e){return`\x1B]8;;${de(e)}\x1B\\${de(t)}\x1B]8;;\x1B\\`}function Qs(t){return t.hasUI&&t.mode==="tui"}async function Pr(t,e){if(!e.hasUI)return;let n=["MCP Server Status:",""];for(let r of Object.keys(t.config.mcpServers)){let o=t.config.mcpServers[r];if(U(o)){n.push(`\u2298 ${r}: disabled (run /mcp enable ${r}, then /reload)`);continue}let i=t.manager.getConnection(r),s=t.toolMetadata.get(r),a=s?.length??0,c=Me(t,r),u="not connected",d="\u25CB",l=!1;if(i?.status==="connected")u="connected",d="\u2713";else if(i?.status==="needs-auth")u="needs auth",d="\u26A0";else if(c!==null){let p=de(Bo(t,r)??"");u=p?`failed ${c}s ago \u2014 ${p}`:`failed ${c}s ago`,d="\u2717",l=!0}else s!==void 0&&(u="cached");let f=l?"":` (${a} tools${u==="cached"?", cached":""})`;n.push(`${d} ${r}: ${u}${f}`)}Object.keys(t.config.mcpServers).length===0&&(n.push("No MCP servers configured"),n.push("Run /mcp setup to adopt imports or scaffold a starter .mcp.json")),e.ui.notify(n.join(`
105
+ `),"info")}async function Ll(t,e){if(!e.hasUI)return;let n=[...t.promptMetadata?.values()??[]].flat(),r=[...t.manager.getAllConnections?.()??[]].filter(([,s])=>s.status==="connected"&&s.promptDiscoveryFailed).map(([s])=>s).sort();if(n.length===0){let s=r.length>0?` Prompt discovery failed for: ${r.join(", ")}.`:"";e.ui.notify(`No MCP prompts available. Prompts are discovered when servers with the \`prompts\` capability connect.${s}`,"info");return}let o=["MCP Prompts:",""],i=new Map;for(let s of n){let a=i.get(s.serverName)??[];a.push(s),i.set(s.serverName,a)}for(let[s,a]of[...i.entries()].sort(([c],[u])=>c.localeCompare(u))){o.push(`${s}:`);for(let c of a.sort((u,d)=>u.commandName.localeCompare(d.commandName))){let u=c.arguments.map(d=>d.required?`<${d.name}>`:`[${d.name}]`).join(" ");o.push(` /${c.commandName}${u?` ${u}`:""}`),c.description&&o.push(` ${c.description}`)}o.push("")}o.push(`Total: ${n.length} prompt${n.length===1?"":"s"}`),r.length>0&&o.push(`Prompt discovery failed for: ${r.join(", ")}. Cached prompt metadata may be stale.`),e.ui.notify(o.join(`
106
+ `),"info")}async function jl(t,e){if(!e.hasUI)return;let n=[...t.toolMetadata.entries()].filter(([o])=>!U(t.config.mcpServers[o])).filter(([o])=>!Te(t,o)).flatMap(([,o])=>o.map(i=>i.name));if(n.length===0){e.ui.notify("No MCP tools available","info");return}let r=["MCP Tools:","",...n.map(o=>` ${o}`),"",`Total: ${n.length} tools`];e.ui.notify(r.join(`
107
+ `),"info")}async function Wo(t,e,n){let r=t.config.mcpServers[n],o=e.hasUI?e.ui:void 0,i=t.owner?.signal;if(!r)return o&&o.notify(`Server "${n}" not found in config`,"error"),!1;if(U(r))return o&&o.notify(`MCP: ${n} is disabled. Run /mcp enable ${n}, then /reload.`,"warning"),!1;try{await t.manager.close(n),t.owner?.throwIfInactive();let s=i?await t.manager.connect(n,r,i):await t.manager.connect(n,r);if(t.owner?.throwIfInactive(),s.status==="needs-auth")return o&&o.notify(`MCP: ${n} requires OAuth. Run /mcp-auth ${n} first.`,"warning"),ge(t),!1;let a=t.config.settings?.toolPrefix??"server",{metadata:c,failedTools:u}=nn(s.tools,s.resources,r,n,a,t.config.mcpServers,t.toolMetadata);return t.toolMetadata.set(n,c),s.promptDiscoveryFailed||(t.promptMetadata?.set(n,ut(n,s.prompts??[],a,r)),t.promptMetadataLive?.add(n)),s.instructions?t.serverInstructions.set(n,s.instructions):t.serverInstructions.delete(n),ot(t,n),Ae(t,n,"command-reconnect")||Ge(t,n,"command-reconnect"),yt(t,n),o&&(o.notify(`MCP: Reconnected to ${n} (${s.tools.length} tools, ${s.resources.length} resources)`,"info"),u.length>0&&o.notify(`MCP: ${n} - ${u.length} tools skipped`,"warning")),ge(t),!0}catch(s){let a=s instanceof Error?s.message:String(s);if(ie(s,i))throw s;return ht(t,n,a),o&&o.notify(`MCP: Failed to reconnect to ${n}: ${de(a)}`,"error"),ge(t),!1}}async function Bl(t,e,n){if(n&&!t.config.mcpServers[n]){e.hasUI&&e.ui.notify(`Server "${n}" not found in config`,"error");return}let r=n?[n]:Object.keys(t.config.mcpServers);for(let o of r)await Wo(t,e,o);ge(t)}async function Zs(t,e,n,r,o){let i=n.hasUI?n.ui:void 0,s=n.cwd;if(r??=n.signal,!i)return{ok:!1,message:"OAuth authentication requires an interactive session."};let a=e.mcpServers[t];if(!a){let c=`Server "${t}" not found in config`;return i.notify(c,"error"),{ok:!1,message:c}}if(U(a)){let c=`Server "${t}" is disabled. Run /mcp enable ${t}, then /reload.`;return i.notify(c,"warning"),{ok:!1,message:c}}if(!Ue(a)){let c=`Server "${t}" does not use OAuth authentication. Set "auth": "oauth" or omit auth for auto-detection.`;return i.notify(`Server "${t}" does not use OAuth authentication.
108
+ Set "auth": "oauth" or omit auth for auto-detection.`,"error"),{ok:!1,message:c}}try{let c=He(a);if(!c){let f=`Server "${t}" has no URL configured (OAuth requires HTTP transport)`;return i.notify(f,"error"),{ok:!1,message:f}}i.setStatus("mcp-auth",`Authenticating ${t}...`);let u=bo(e.settings?.oauthDir,s),d=await mt(t,c,a,{...u.baseDir?{authStorageOptions:u}:{},onAuthorizationUrl:()=>{},onAuthorizationInput:async(f,p)=>{if(!p.aborted)return i.input(`Complete ${t} OAuth
109
+
110
+ ${sv("Open authorization page",f)}
111
+ ${f}
112
+
113
+ Approve access, then paste the full callback URL from the browser address bar below.`,void 0,{signal:p})},...r?{signal:r}:{},...o?{runtime:o}:{}});if(r?.aborted&&r.throwIfAborted(),d==="authenticated"){let f=`OAuth authentication successful for "${t}".`;return i.notify(f,"info"),{ok:!0,message:f}}let l=`OAuth authentication failed for "${t}".`;return i.notify(l,"error"),{ok:!1,message:l}}catch(c){if(r?.aborted)throw c;let u=c instanceof Error?c.message:String(c);return i.notify(`Failed to authenticate "${t}": ${u}`,"error"),{ok:!1,message:u}}finally{r?.aborted||i.setStatus("mcp-auth",void 0)}}async function Hl(t,e,n){let r=e.config.mcpServers[t],o=n.hasUI?n.ui:void 0;if(!r){let a=`Server "${t}" not found in config`;return o&&o.notify(a,"error"),{ok:!1,message:a}}let i=e.owner?.signal;try{await Ru(t,{authStorageOptions:e.authStorageOptions,signal:i,runtime:e.oauthRuntime})}catch(a){if(ie(a,i))throw a;let c=a instanceof Error?a.message:String(a);return o&&o.notify(`Failed to clear OAuth credentials for "${t}": ${de(c)}`,"error"),{ok:!1,message:c}}e.owner?.throwIfInactive();try{await e.manager.close(t)}catch(a){if(ie(a,i))throw a;let c=a instanceof Error?a.message:String(a);return o&&o.notify(`OAuth credentials were cleared for "${t}", but its connection could not be closed: ${de(c)}`,"error"),{ok:!1,message:c}}e.owner?.throwIfInactive(),ge(e);let s=`OAuth credentials cleared for "${t}". Run /mcp-auth ${t} to authenticate again.`;return o&&o.notify(s,"info"),{ok:!0,message:s}}function av(t,e){let n=de(t),r=e.config.mcpServers[t];if(!r)return{ok:!1,message:`Server "${n}" not found in config`,type:"error"};if(U(r))return{ok:!1,message:`Server "${n}" is disabled. Run /mcp enable ${n}, then /reload.`,type:"warning"};if(r.auth!=="bearer"||r.bearerTokenStore!==!0)return{ok:!1,message:`Server "${n}" is not configured for bearerTokenStore.`,type:"error"};let o;try{o=He(r)}catch{return{ok:!1,message:`Server "${n}" has an invalid or unresolvable URL.`,type:"error"}}return o?{ok:!0,serverUrl:o}:{ok:!1,message:`Server "${n}" has no URL configured.`,type:"error"}}async function Fl(t,e,n,r){let o=r.hasUI?r.ui:void 0,i=de(e),s=av(e,n);if(!s.ok)return o&&o.notify(s.message,s.type),{ok:!1,message:s.message};if(t==="set"){let c=`Cannot store bearer token here: Pi extension UI has no masked secret input primitive. Run \`pi-mcp-adapter token set ${i}\` in a terminal; it reads the token from stdin only.`;return o&&o.notify(c,"error"),{ok:!1,message:c}}if(t==="status"){let c=Lu(e,s.serverUrl),u=c.status==="present"?`Bearer token is stored for "${i}".`:c.status==="url-mismatch"?`Bearer token is stored for "${i}", but its URL does not match the current server URL.`:c.status==="unavailable"?c.message:`No bearer token is stored for "${i}".`;return o&&o.notify(u,c.status==="unavailable"?"error":"info"),{ok:c.status!=="unavailable",message:u}}try{Nu(e)}catch(c){let u=c instanceof Error?c.message:String(c);return o&&o.notify(`Failed to remove bearer token for "${i}": ${de(u)}`,"error"),{ok:!1,message:u}}let a=`Bearer token removed for "${i}".`;return o&&o.notify(a,"info"),{ok:!0,message:a}}function cv(t,e){let n=yc(t,e),r=Ho();return!n.hasSharedServers||r.sharedConfigHintShown?{lines:[],fingerprint:null}:{lines:[`Using standard MCP config from ${n.sources.filter(s=>s.kind==="shared"&&s.serverCount>0).map(s=>s.path).join(", ")}.`,"Pi only writes compatibility imports and adapter-specific overrides into Pi-owned files when needed."],fingerprint:n.fingerprint}}async function ea(t,e,n,r,o="setup",i={}){if(!n.hasUI)return{configChanged:!1};if(!Qs(n))return n.ui.notify(`The interactive MCP setup panel is only available in the terminal UI (current mode: ${n.mode}). Edit .mcp.json directly, or run /mcp status to review servers.`,"info"),{configChanged:!1};if(t.programmaticConfig)return n.ui.notify("MCP setup is unavailable when config is supplied by createMcpAdapter().","info"),{configChanged:!1};let s=oo(r,n.cwd,i),a=Ho(),{createMcpSetupPanel:c}=await Promise.resolve().then(()=>(Ul(),_l)),u=!1,d={previewImports:l=>Cc(l,r),previewStarterProject:()=>Tc(n.cwd),previewRepoPrompt:()=>{let l=oo(r,n.cwd,i).repoPrompt;return!l.entry||!l.targetPath||!l.serverName?null:_i(l.targetPath,l.serverName,l.entry)},previewKnownServer:l=>_i(Cn(n.cwd),l.id,l.entry),adoptImports:async l=>{let f=xc(l,r);return f.added.length>0&&(u=!0),f},scaffoldProjectConfig:async()=>{let l=Ac(n.cwd);return u=!0,{path:l}},addRepoPrompt:async()=>{let l=oo(r,n.cwd,i).repoPrompt;if(!l.entry||!l.targetPath||!l.serverName)throw new Error("RepoPrompt is not available to add from this setup screen.");let f=Ui(l.targetPath,l.serverName,l.entry);return u=!0,{path:f,serverName:l.serverName}},addKnownServer:async l=>{let f=Ui(Cn(n.cwd),l.id,l.entry);return u=!0,{path:f,serverName:l.name}},openPath:async l=>{await ac(e,l)},markSetupCompleted:()=>{Ol(s.fingerprint)}};return new Promise(l=>{n.ui.custom((f,p,g,y)=>c(s,d,{mode:o,onboardingState:a,keybindings:g},f,()=>{y(void 0),l({configChanged:u})}),{overlay:!0,overlayOptions:{anchor:"center",width:92}})})}function zl(t,e,n,r){let o=new Map;return{reconnect:i=>Wo(t,n,i),canAuthenticate:i=>{let s=e.mcpServers[i];return s?!U(s)&&Ue(s):!1},authenticate:async i=>{let s=r?.();s?.setHidden(!0);try{return await Zs(i,e,n,t.owner?.signal,t.oauthRuntime)}finally{s?.setHidden(!1),s?.focus()}},getConnectionStatus:i=>{o.delete(i);let s=e.mcpServers[i];if(U(s))return"disabled";let a=t.manager.getConnection(i),c;try{c=s?He(s):void 0}catch{return"failed"}if(s?.auth==="oauth"&&c&&s.oauth!==!1&&s.oauth?.grantType!=="client_credentials"){let u=pu(i,c,t.authStorageOptions);if(u.status==="unavailable")return o.set(i,u.message),"failed";if(u.status==="absent"||!u.entry.tokens)return"needs-auth"}return a?.status==="needs-auth"?"needs-auth":a?.status==="connected"?"connected":Me(t,i)!==null?"failed":"idle"},getFailureMessage:i=>o.get(i)??Bo(t,i),refreshCacheAfterReconnect:i=>ze()?.servers?.[i]??null}}async function ql(t,e,n,r,o){if(t.programmaticConfig)return n.hasUI&&(n.ui.notify("MCP status is shown from the in-memory SDK config; configuration discovery is unavailable.","info"),await Pr(t,n)),{configChanged:!1};if(!Qs(n))return await Pr(t,n),{configChanged:!1};if(Object.keys(t.config.mcpServers).length===0)return ea(t,e,n,r,"empty",{includeHostConfigs:!1});let i=t.config,s=ze(),a=e.getFlag("mcp-config")??r,c=Di(a,n.cwd),{lines:u,fingerprint:d}=cv(a,n.cwd),l,f=zl(t,i,n,()=>l),{createMcpPanel:p}=await Promise.resolve().then(()=>(Xs(),Ys)),g=!1;return await new Promise(y=>{n.ui.custom((w,b,v,m)=>p(i,s,c,f,w,S=>{(async()=>{!S.cancelled&&S.changes.size>0&&(Pc(S.changes,c,i),await o?.(S.changes),n.ui.notify("Direct tools updated for this session.","info")),m(void 0),y()})().catch(R=>{let h=R instanceof Error?R.message:String(R);n.ui.notify(`Direct tools updated, but live refresh failed: ${h}`,"error"),g=!0,m(void 0),y()})},{noticeLines:u,keybindings:v}),{overlay:!0,overlayOptions:{anchor:"center",width:82},onHandle:w=>{l=w}})}),u.length>0&&d&&kl(d),{configChanged:g}}async function Vl(t,e,n,r){if(!n.hasUI)return{configChanged:!1};if(!Qs(n))return n.ui.notify(`The interactive MCP auth panel is only available in the terminal UI (current mode: ${n.mode}). Use /mcp-auth <server> to authenticate a specific server.`,"info"),{configChanged:!1};if(t.programmaticConfig)return n.ui.notify("Use /mcp-auth <server> to authenticate a server from the in-memory SDK config.","info"),{configChanged:!1};let o=t.config;if(Object.entries(o.mcpServers).filter(([,f])=>!U(f)&&Ue(f)).length===0)return n.ui.notify("No OAuth-capable MCP servers are configured.","warning"),{configChanged:!1};let s=ze(),a=e.getFlag("mcp-config")??r,c=Di(a,n.cwd),u,d=zl(t,o,n,()=>u),{createMcpPanel:l}=await Promise.resolve().then(()=>(Xs(),Ys));return await new Promise(f=>{n.ui.custom((p,g,y,w)=>l(o,s,c,d,p,()=>{w(void 0),f()},{authOnly:!0,keybindings:y,noticeLines:["Select an OAuth MCP server and press Enter or ctrl+a to authenticate."]}),{overlay:!0,overlayOptions:{anchor:"center",width:82},onHandle:p=>{u=p}})}),{configChanged:!1}}Tn();import{UrlElicitationRequiredError as bS}from"@modelcontextprotocol/client";nt();nt();import{mkdtempSync as uv,rmSync as Jl,writeFileSync as lv}from"node:fs";import{tmpdir as dv}from"node:os";import{join as Kl}from"node:path";var fv=10*1024*1024,pv=100*1024*1024,gv=1e4,mv=3e4,Wl=3;function Gl(){return{directory:void 0,bytes:0,files:0,sequence:0}}var Yl=Gl(),Go=new WeakMap,Kn=new Set,Yo=new Map,Jn;function hv(t){return!!t&&"aborted"in t&&t.aborted===!0}function yv(t){if(hv(t))return;if(!t)return Yl;let e=Go.get(t);return e||(e=Gl(),Go.set(t,e)),e}function vv(){for(let t of Kn)if((Yo.get(t)??0)<Wl)return!0;return!1}function Sv(){if(!(Jn||!vv())){for(let t of Kn){let e=Yo.get(t)??0;e<Wl&&Yo.set(t,e+1)}Jn=setTimeout(()=>{Jn=void 0;try{Xl()}catch{}},mv)}}function Xl(){let t=[];for(let e of Array.from(Kn))try{Jl(e,{recursive:!0,force:!0}),Kn.delete(e),Yo.delete(e)}catch(n){t.push(n)}if(Kn.size===0&&Jn&&(clearTimeout(Jn),Jn=void 0),t.length>0)throw Sv(),new AggregateError(t,"Failed to clean materialized MCP resources")}function Ql(t){let e=t?Go.get(t):Yl;e?.directory&&Kn.add(e.directory),e&&(e.directory=void 0,e.bytes=0,e.files=0,e.sequence=0,t&&Go.delete(t)),Xl()}function Zl(t,e){return delete t.blob,t.text=e,e}function Rr(t,e){return Zl(t,[`[Resource: ${t.uri??"(no URI)"}]`,`Binary content omitted: ${e}`,`MIME type: ${t.mimeType??"application/octet-stream"}`].join(`
114
+ `))}function ed(t,e){let n=yv(e);if(!n)return Rr(t,"runtime stopped");let r=Buffer.byteLength(t.blob,"base64");if(r>fv)return Rr(t,"decoded size exceeds 10 MiB");if(n.bytes+r>pv||n.files>=gv)return Rr(t,"session resource limit reached");try{n.directory??=uv(Kl(dv(),"pi-mcp-resource-"))}catch{return Rr(t,"could not be saved")}let o=Kl(n.directory,`resource-${++n.sequence}.bin`);n.bytes+=r,n.files+=1;try{lv(o,Buffer.from(t.blob,"base64"),{flag:"wx",mode:384})}catch{try{Jl(o,{force:!0}),n.bytes-=r,n.files-=1}catch{}return Rr(t,"could not be saved")}return Zl(t,[`[Resource: ${t.uri??"(no URI)"}]`,`Binary content saved to ${o}`,`MIME type: ${t.mimeType??"application/octet-stream"}`].join(`
115
+ `))}function Xo(t,e){return t.map(n=>typeof n.text=="string"?{type:"text",text:n.text}:typeof n.blob=="string"?{type:"text",text:ed(n,e)}:{type:"text",text:JSON.stringify(n)})}function Wn(t,e){return t.map(n=>{if(n.type==="text")return{type:"text",text:n.text??""};if(n.type==="image")return{type:"image",data:n.data??"",mimeType:n.mimeType??"image/png"};if(n.type==="resource"){let r=n.resource?.uri??"(no URI)";if(n.resource&&"blob"in n.resource&&typeof n.resource.blob=="string"){let i=n.resource;return{type:"text",text:ed(i,e)}}let o=n.resource?.text??(n.resource?JSON.stringify(n.resource):"(no content)");return{type:"text",text:`[Resource: ${r}]
116
+ ${o}`}}if(n.type==="resource_link"){let r=n.name??n.uri??"unknown",o=n.uri??"(no URI)";return{type:"text",text:`[Resource Link: ${r}]
117
+ URI: ${o}`}}return n.type==="audio"?{type:"text",text:`[Audio content: ${n.mimeType??"audio/*"}]`}:{type:"text",text:JSON.stringify(n)}})}function Er(t,e){let n=Wn(Array.isArray(t.content)?t.content:[],e);return n.length>0?n:t.structuredContent!==void 0&&t.structuredContent!==null?[{type:"text",text:wv(t.structuredContent)}]:[]}function wv(t){try{return JSON.stringify(t,null,2)??String(t)}catch{return String(t)}}import{randomBytes as bv}from"node:crypto";import{mkdtemp as Cv,rm as xv,writeFile as Mv}from"node:fs/promises";import{tmpdir as Tv}from"node:os";import{dirname as Av,join as td}from"node:path";var rd=50*1024,od=2e3,id=16*1024,ta=20,kr=20,ra=120,Pv=4*1024,Rv=512;function Yn(t){let e=t?.outputGuard,n=typeof e=="object"&&e!==null?e:void 0;return{enabled:Hv("MCP_OUTPUT_GUARD")??e!==!1,maxBytes:na(n?.maxBytes)??rd,maxLines:na(n?.maxLines)??od,detailsMaxBytes:na(n?.detailsMaxBytes)??id}}function Ne(t){return{...t.mcpResult!==void 0?{mcpResult:t.mcpResult}:{},...t.outputGuard?{outputGuard:t.outputGuard}:{}}}async function Le(t,e={}){let n=e.maxBytes??rd,r=e.maxLines??od,o=e.detailsMaxBytes??id,i=e.prefix??"",s=e.suffix??"",a=kv(t.length>0?Ev(t):[{type:"text",text:e.emptyTextFallback??"(empty result)"}],e.emptyTextFallback);if(e.enabled===!1)return{content:nd(a,i,s),...e.rawMcpResult!==void 0?{mcpResult:e.rawMcpResult}:{}};let c=a.filter(y=>y.type==="image"),u=a.filter(y=>y.type==="text").map(y=>y.text).join(`
118
+ `),d=`${i}${u}${s}`,l=Or(d),f=nd(a,i,s),p;if(l.bytes>n||l.lines>r){let{path:y,error:w}=await cd("output",d),b=Iv(l,y,w),v=Ov(n,r,b),S=`${$v(d,v.maxBytes,v.maxLines).content}
119
+
120
+ ${b}`,R=Or(S);f=[{type:"text",text:S},...c],p={truncated:!0,originalBytes:l.bytes,returnedBytes:R.bytes,originalLines:l.lines,returnedLines:R.lines,...c.length>0?{imageBlocksPassedThrough:c.length}:{},...y!==void 0?{fullOutputPath:y}:{},...w!==void 0?{writeError:w}:{}}}let g=e.rawMcpResult===void 0?void 0:await _v(e.rawMcpResult,o);return{content:f,...p?{outputGuard:p}:{},...g!==void 0?{mcpResult:g}:{}}}function Ev(t){return t.map(e=>{if(e.type!=="image")return e;let n=typeof e.mimeType=="string"&&e.mimeType.trim()?e.mimeType.trim().slice(0,100):"image/png";return{...e,mimeType:n}})}function kv(t,e){return!e||t.filter(r=>r.type==="text").map(r=>r.text).join(`
121
+ `)?t:[{type:"text",text:e},...t.filter(r=>r.type==="image")]}function nd(t,e,n){if(!e&&!n)return t;let r=[...t];if(e){let o=r.findIndex(s=>s.type==="text"),i=r[o];i?.type==="text"?r[o]={...i,text:`${e}${i.text}`}:r.unshift({type:"text",text:e})}if(n){let o=-1;for(let s=r.length-1;s>=0;s--)if(r[s]?.type==="text"){o=s;break}let i=r[o];i?.type==="text"?r[o]={...i,text:`${i.text}${n}`}:r.push({type:"text",text:n})}return r}function Ov(t,e,n){let r=Or(`
122
+
123
+ ${n}`);return{maxBytes:Math.max(0,t-r.bytes),maxLines:Math.max(0,e-r.lines)}}function $v(t,e,n){let r=t.split(`
124
+ `),o=[],i=0;for(let c of r){if(o.length>=n)break;let u=o.length>0?1:0,d=xe(c);if(i+u+d>e){let l=e-i-u;l>0&&o.push(ia(c,l));break}o.push(c),i+=u+d}let s=o.join(`
125
+ `),a=Or(s);return{content:s,bytes:a.bytes,lines:a.lines}}function ia(t,e){if(xe(t)<=e)return t;let n=Buffer.from(t,"utf8"),r=Number.isFinite(e)?Math.max(0,Math.floor(e)):0;for(;r>0&&(n.readUInt8(r)&192)===128;)r--;return n.subarray(0,r).toString("utf8")}function Iv(t,e,n){let r=`[MCP text output truncated: original ${t.lines.toLocaleString()} lines / ${Fv(t.bytes)}.`;return e?`${r} Full text saved to: ${e} \u2014 use read with offset/limit or grep to inspect.]`:`${r} Full output could not be saved: ${n??"unknown error"}]`}async function _v(t,e){let n=_t(t),r=xe(n);if(r<=e)return t;let o={omitted:!0};if(xe(_t(o))>e)return;let i=await Dv(t,n,r);return xe(_t(i))<=e?i:Uv(i,o,e)}async function Uv(t,e,n){if(t.fullResultPath){let o={...e,rawResultBytes:t.rawResultBytes,fullResultPath:t.fullResultPath};if(xe(_t(o))<=n)return o;let i={...e,fullResultPath:t.fullResultPath};if(xe(_t(i))<=n)return i;await Bv(t.fullResultPath)}let r={...e,rawResultBytes:t.rawResultBytes};return xe(_t(r))<=n?r:e}async function Dv(t,e,n){let{path:r,error:o}=await cd("mcp-result",e),i=$r(t),s=Array.isArray(i?.content)?i.content:[],a={omitted:!0,reason:"Raw MCP result exceeded the details size limit and was replaced with this summary to keep session context bounded.",isError:i?.isError===!0,contentBlocks:s.length,contentSummary:Nv(s),rawResultBytes:n,...r!==void 0?{fullResultPath:r}:{},...o!==void 0?{resultWriteError:o}:{}};if(i&&"structuredContent"in i&&(a.structuredContent=Lv(i.structuredContent)),i&&"_meta"in i&&(a.meta=oa(i._meta)),i){let c=new Set(["content","isError","structuredContent","_meta"]),u=Object.keys(i).filter(d=>!c.has(d)).slice(0,kr).map(d=>({key:sd(d),type:typeof i[d],estimatedBytes:Gn(i[d]),omitted:!0}));u.length>0&&(a.extraFields=u)}return a}function Nv(t){let e=t.slice(0,ta).map(n=>{let r=$r(n);if(!r)return{type:typeof n,omitted:!0};if(r.type==="text"){let o=typeof r.text=="string"?r.text:"";return{type:"text",bytes:xe(o),lines:Or(o).lines,textOmitted:!0}}if(r.type==="image"){let o=typeof r.data=="string"?r.data:"";return{type:"image",mimeType:typeof r.mimeType=="string"?r.mimeType:void 0,dataBytes:xe(o),dataOmitted:!0}}return{type:typeof r.type=="string"?r.type:"unknown",estimatedBytes:Gn(r),omitted:!0}});return t.length>ta&&e.push({type:"omitted",count:t.length-ta}),e}function oa(t){let e=$r(t);if(!e)return{type:t===null?"null":typeof t,estimatedBytes:Gn(t),omitted:!0};let n=Object.keys(e);return{type:Array.isArray(t)?"array":"object",estimatedBytes:Gn(t),keyCount:n.length,keysPreview:ad(n.slice(0,kr)),omitted:!0}}function Lv(t){let e=$r(t);if(!e||Array.isArray(t))return oa(t);let n=Object.keys(e),r=Object.entries(e).slice(0,kr),o=ad(r.map(([a])=>a)),i={},s=xe("{}");for(let[a,c]of r){let d=xe(_t(c))<=Rv?c:oa(c),l=jv(a,d,Object.keys(i).length>0);s+l>Pv||(i[a]=d,s+=l)}return{preservedFields:i,summary:{type:"object",estimatedBytes:Gn(t),keyCount:n.length,keysPreview:o,omitted:!0}}}function Gn(t,e=0){if(t==null)return 0;if(typeof t=="string")return xe(t);if(typeof t=="number"||typeof t=="boolean"||typeof t=="bigint")return xe(String(t));let n=$r(t);return!n||e>=2?0:(Array.isArray(t)?t.slice(0,kr):Object.values(n).slice(0,kr)).reduce((o,i)=>o+Gn(i,e+1),0)}function sd(t){if(xe(t)<=ra)return t;let e="\u2026";return`${ia(t,ra-xe(e))}${e}`}function ad(t){let e=new Set;return t.map(n=>{let r=sd(n),o=2;for(;e.has(r);){let i=`~${o}`;r=`${ia(n,ra-xe(i))}${i}`,o+=1}return e.add(r),r})}function jv(t,e,n){let r=_t({[t]:e});return Math.max(0,xe(r)-xe("{}"))+(n?1:0)}async function cd(t,e){try{let n=await Cv(td(Tv(),"pi-mcp-output-")),r=td(n,`${t}-${bv(4).toString("hex")}.txt`);return await Mv(r,e,{encoding:"utf8",mode:384}),{path:r}}catch(n){return{error:n instanceof Error?n.message:String(n)}}}async function Bv(t){try{await xv(Av(t),{recursive:!0,force:!0})}catch{}}function $r(t){return typeof t=="object"&&t!==null?t:void 0}function _t(t){try{return JSON.stringify(t)}catch{return String(t)}}function Or(t){return{bytes:xe(t),lines:t.length===0?0:t.split(`
126
+ `).length}}function xe(t){return Buffer.byteLength(t,"utf8")}function na(t){if(typeof t!="number"||!Number.isFinite(t))return;let e=Math.floor(t);return e>0?e:void 0}function Hv(t){let e=process.env[t]?.trim().toLowerCase();if(e){if(["0","false","no","off"].includes(e))return!1;if(["1","true","yes","on"].includes(e))return!0}}function Fv(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KiB`:`${(t/(1024*1024)).toFixed(1)} MiB`}ue();import{execFile as pS}from"node:child_process";import{randomUUID as ti}from"node:crypto";import gS from"node:net";import{UrlElicitationRequiredError as mS}from"@modelcontextprotocol/client";Rn();import Wv from"node:http";import Gv from"node:fs/promises";import Yv from"node:path";import{randomUUID as pd}from"node:crypto";import{ContentBlockSchema as Xv}from"@modelcontextprotocol/core";be();var zv="/app-bridge.bundle.js",ld="allow-scripts allow-forms allow-modals allow-popups allow-downloads";function dd(t){let e=t.hostContext??{},n=lt(t.sessionToken),r=lt(t.uiResourceToken),o=lt(t.toolArgs),i=lt(t.serverName),s=lt(t.toolName),a=lt(e),c=lt(t.allowAttribute),u=lt(t.requireToolConsent),d=lt(t.cacheToolConsent),l=lt(t.appBridgeModuleUrl??zv);return`<!doctype html>
127
+ <html lang="en">
128
+ <head>
129
+ <meta charset="utf-8" />
130
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
131
+ <title>MCP UI - ${ud(t.serverName)} / ${ud(t.toolName)}</title>
132
+ <style>
133
+ :root {
134
+ color-scheme: light dark;
135
+ --bg: #0f1115;
136
+ --surface: #181c22;
137
+ --text: #ecf0f5;
138
+ --muted: #a9b2bf;
139
+ --accent: #43c0ff;
140
+ --border: rgba(255, 255, 255, 0.12);
141
+ --good: #34d399;
142
+ --warn: #fbbf24;
143
+ --bad: #f87171;
144
+ }
145
+ @media (prefers-color-scheme: light) {
146
+ :root {
147
+ --bg: #f6f7fb;
148
+ --surface: #ffffff;
149
+ --text: #1d2939;
150
+ --muted: #667085;
151
+ --accent: #0ea5e9;
152
+ --border: rgba(15, 23, 42, 0.14);
153
+ --good: #059669;
154
+ --warn: #b45309;
155
+ --bad: #b91c1c;
156
+ }
157
+ }
158
+ * { box-sizing: border-box; }
159
+ html, body { margin: 0; padding: 0; height: 100%; font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--bg); color: var(--text); }
160
+ body { display: flex; flex-direction: column; min-height: 100vh; min-height: 100dvh; }
161
+ header { background: var(--surface); border-bottom: 1px solid var(--border); padding: calc(10px + env(safe-area-inset-top, 0px)) calc(14px + env(safe-area-inset-right, 0px)) 10px calc(14px + env(safe-area-inset-left, 0px)); display: flex; align-items: center; justify-content: space-between; gap: 10px; }
162
+ .title { display: flex; gap: 8px; align-items: baseline; min-width: 0; }
163
+ .server { font-size: 12px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.08em; white-space: nowrap; }
164
+ .tool { font-size: 14px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
165
+ .badge { border: 1px solid var(--border); border-radius: 999px; padding: 2px 8px; font-size: 11px; color: var(--muted); white-space: nowrap; }
166
+ .controls { display: flex; gap: 8px; align-items: center; }
167
+ .status { font-size: 12px; color: var(--muted); white-space: nowrap; }
168
+ button { border: 1px solid var(--border); background: transparent; color: var(--text); border-radius: 8px; padding: 6px 10px; cursor: pointer; font-size: 12px; }
169
+ button.primary { border-color: color-mix(in srgb, var(--good) 40%, var(--border) 60%); color: var(--good); }
170
+ button.danger { border-color: color-mix(in srgb, var(--bad) 40%, var(--border) 60%); color: var(--bad); }
171
+ button:hover { background: color-mix(in srgb, var(--surface) 75%, var(--accent) 25%); }
172
+ main { flex: 1; min-height: 0; padding: 10px; padding-inline: calc(10px + env(safe-area-inset-left, 0px)) calc(10px + env(safe-area-inset-right, 0px)); padding-bottom: calc(10px + env(safe-area-inset-bottom, 0px)); display: flex; }
173
+ iframe { width: 100%; height: 100%; border: 1px solid var(--border); border-radius: 10px; background: white; }
174
+ .overlay { position: fixed; inset: 0; background: color-mix(in srgb, var(--bg) 90%, black 10%); display: none; align-items: center; justify-content: center; z-index: 2; padding: 16px; }
175
+ .overlay.visible { display: flex; }
176
+ .panel { width: min(680px, calc(100vw - 40px)); background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 18px; }
177
+ .panel h2 { margin: 0 0 8px; font-size: 16px; }
178
+ .panel p { margin: 0; color: var(--muted); line-height: 1.4; font-size: 14px; white-space: pre-wrap; }
179
+ @media (max-width: 640px) {
180
+ header { align-items: stretch; flex-direction: column; gap: 8px; }
181
+ .title { flex-wrap: wrap; row-gap: 4px; }
182
+ .server { flex-basis: 100%; }
183
+ .controls { width: 100%; }
184
+ .status { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
185
+ button { min-height: 44px; padding: 10px 14px; }
186
+ main { padding: 6px; padding-inline: calc(6px + env(safe-area-inset-left, 0px)) calc(6px + env(safe-area-inset-right, 0px)); padding-bottom: calc(6px + env(safe-area-inset-bottom, 0px)); }
187
+ iframe { border-radius: 6px; }
188
+ .panel { width: 100%; }
189
+ }
190
+ </style>
191
+ </head>
192
+ <body>
193
+ <header>
194
+ <div class="title">
195
+ <span class="server">MCP \xB7 <span id="server-name"></span></span>
196
+ <span class="tool" id="tool-name"></span>
197
+ <span class="badge">Sandboxed</span>
198
+ </div>
199
+ <div class="controls">
200
+ <span class="status" id="status">Loading UI...</span>
201
+ <button class="primary" id="done-btn" title="Cmd/Ctrl+Enter">Done</button>
202
+ <button class="danger" id="cancel-btn" title="Escape">Cancel</button>
203
+ </div>
204
+ </header>
205
+ <main>
206
+ <iframe id="mcp-app" sandbox="${ld}" referrerpolicy="no-referrer"></iframe>
207
+ </main>
208
+ <div class="overlay" id="error-overlay">
209
+ <div class="panel">
210
+ <h2>UI Error</h2>
211
+ <p id="error-message"></p>
212
+ </div>
213
+ </div>
214
+ <div class="overlay" id="completion-overlay">
215
+ <div class="panel">
216
+ <h2>Done</h2>
217
+ <p>MCP UI session finished. You can close this page and return to Pi.</p>
218
+ </div>
219
+ </div>
220
+ <script type="module">
221
+ import { AppBridge, PostMessageTransport } from ${l};
222
+
223
+ const SESSION_TOKEN = ${n};
224
+ const UI_RESOURCE_TOKEN = ${r};
225
+ const SERVER_NAME = ${i};
226
+ const TOOL_NAME = ${s};
227
+ const TOOL_ARGS = ${o};
228
+ const HOST_CONTEXT = ${a};
229
+ const ALLOW_ATTRIBUTE = ${c};
230
+ const REQUIRE_TOOL_CONSENT = ${u};
231
+ const CACHE_TOOL_CONSENT = ${d};
232
+ const STREAM_CONTEXT_KEY = "pi-mcp-adapter/stream";
233
+ const STREAM_PATCH_METHOD = "notifications/pi-mcp-adapter/ui-result-patch";
234
+
235
+ const iframe = document.getElementById("mcp-app");
236
+ const statusNode = document.getElementById("status");
237
+ const doneBtn = document.getElementById("done-btn");
238
+ const cancelBtn = document.getElementById("cancel-btn");
239
+ const errorOverlay = document.getElementById("error-overlay");
240
+ const completionOverlay = document.getElementById("completion-overlay");
241
+ const errorMessage = document.getElementById("error-message");
242
+
243
+ document.getElementById("server-name").textContent = SERVER_NAME;
244
+ document.getElementById("tool-name").textContent = TOOL_NAME;
245
+
246
+ const setStatus = (text, isError = false) => {
247
+ statusNode.textContent = text;
248
+ statusNode.style.color = isError ? "var(--bad)" : "var(--muted)";
249
+ };
250
+
251
+ const showError = (message) => {
252
+ errorMessage.textContent = message;
253
+ errorOverlay.classList.add("visible");
254
+ setStatus("Error", true);
255
+ };
256
+
257
+ let completionPending = false;
258
+ const showCompletion = () => {
259
+ completionOverlay.classList.add("visible");
260
+ setStatus("Complete");
261
+ };
262
+ const closeOrShowDone = () => {
263
+ completionPending = true;
264
+ window.close();
265
+ setTimeout(() => {
266
+ if (!document.hidden) {
267
+ showCompletion();
268
+ }
269
+ }, 1000);
270
+ };
271
+ document.addEventListener("visibilitychange", () => {
272
+ if (completionPending && !document.hidden) {
273
+ showCompletion();
274
+ }
275
+ });
276
+
277
+ const post = async (endpoint, params) => {
278
+ const response = await fetch(endpoint, {
279
+ method: "POST",
280
+ headers: { "Content-Type": "application/json" },
281
+ body: JSON.stringify({ token: SESSION_TOKEN, params }),
282
+ });
283
+
284
+ const body = await response.json().catch(() => ({ ok: false, error: "Invalid JSON response" }));
285
+ if (!response.ok || !body.ok) {
286
+ const message = body.error || ("HTTP " + response.status);
287
+ throw new Error(message);
288
+ }
289
+ return body.result ?? {};
290
+ };
291
+
292
+ let consentGranted = !REQUIRE_TOOL_CONSENT;
293
+ const initialStreamContext = HOST_CONTEXT?.[STREAM_CONTEXT_KEY];
294
+ const streamMode = initialStreamContext?.mode === "stream-first" ? "stream-first" : "eager";
295
+
296
+ const bridge = new AppBridge(
297
+ null,
298
+ { name: "pi", version: "1.0.0" },
299
+ { serverTools: {}, openLinks: {}, logging: {}, updateModelContext: {}, message: {} },
300
+ { hostContext: HOST_CONTEXT }
301
+ );
302
+
303
+ bridge.oncalltool = async (params) => {
304
+ if (!consentGranted) {
305
+ const accepted = window.confirm("Allow this UI to call server tools for this session?");
306
+ if (!accepted) {
307
+ await post("/proxy/ui/consent", { approved: false }).catch(() => {});
308
+ return {
309
+ isError: true,
310
+ content: [{ type: "text", text: "Tool call denied by user." }],
311
+ };
312
+ }
313
+ await post("/proxy/ui/consent", { approved: true });
314
+ if (CACHE_TOOL_CONSENT) {
315
+ consentGranted = true;
316
+ }
317
+ }
318
+ const result = await post("/proxy/tools/call", params);
319
+ // Notify agent about the tool call
320
+ await post("/proxy/ui/generated-tool-call-intent", {
321
+ tool: params.name,
322
+ arguments: params.arguments,
323
+ isError: result.isError
324
+ }).catch(() => {});
325
+ return result;
326
+ };
327
+
328
+ bridge.onmessage = async (params) => post("/proxy/ui/message", params);
329
+ bridge.onupdatemodelcontext = async (params) => post("/proxy/ui/context", params);
330
+
331
+ // Also listen for raw postMessage events with custom types (notify, prompt, intent, etc.)
332
+ // These bypass the AppBridge protocol but are used by some MCP UI implementations
333
+ window.addEventListener("message", async (event) => {
334
+ if (event.source !== iframe.contentWindow) return;
335
+ const data = event.data;
336
+ if (!data || typeof data !== "object") return;
337
+
338
+ // Skip AppBridge protocol messages (handled by bridge)
339
+ if (data.jsonrpc || (typeof data.method === "string" && (data.method.startsWith("app/") || data.method.startsWith("host/")))) return;
340
+
341
+ // Handle raw UI action messages
342
+ const msgType = data.type;
343
+ if (typeof msgType !== "string") return;
344
+
345
+ if (msgType === "notify" || msgType === "prompt" || msgType === "intent" || msgType === "message") {
346
+ // Standard MCP-UI types - preserve their semantics
347
+ // Support both { type, payload: {...} } and { type, field: value } formats
348
+ const { type: _, payload, ...directFields } = data;
349
+ await post("/proxy/ui/message", { type: msgType, ...directFields, ...(payload || {}) }).catch(() => {});
350
+ } else if (!msgType.startsWith("ui-lifecycle-") && !msgType.startsWith("ui-message-")) {
351
+ // Any other custom type - forward as intent with type as intent name
352
+ // (Skip internal lifecycle/ack messages)
353
+ const payload = data.payload || {};
354
+ await post("/proxy/ui/message", {
355
+ type: "intent",
356
+ intent: msgType,
357
+ params: payload,
358
+ }).catch(() => {});
359
+ }
360
+ });
361
+ bridge.ondownloadfile = async (params) => post("/proxy/ui/download-file", params);
362
+ bridge.onrequestdisplaymode = async (params) => post("/proxy/ui/request-display-mode", params);
363
+ bridge.onopenlink = async (params) => {
364
+ const result = await post("/proxy/ui/open-link", params);
365
+ if (!result.isError) {
366
+ window.open(params.url, "_blank", "noopener,noreferrer");
367
+ // Notify agent about the link open
368
+ await post("/proxy/ui/message", {
369
+ type: "intent",
370
+ intent: "open_link",
371
+ params: { url: params.url }
372
+ }).catch(() => {});
373
+ }
374
+ return result;
375
+ };
376
+
377
+ bridge.oninitialized = () => {
378
+ if (streamMode !== "stream-first") {
379
+ bridge.sendToolInput({ arguments: TOOL_ARGS });
380
+ }
381
+ setStatus(streamMode === "stream-first" ? "Streaming\u2026" : "Connected");
382
+ };
383
+
384
+ bridge.onsizechange = ({ width, height }) => {
385
+ if (typeof width === "number" && width > 0) {
386
+ iframe.style.minWidth = Math.min(width, window.innerWidth - 24) + "px";
387
+ }
388
+ if (typeof height === "number" && height > 0) {
389
+ iframe.style.height = Math.max(height, 320) + "px";
390
+ }
391
+ };
392
+
393
+ if (ALLOW_ATTRIBUTE) {
394
+ iframe.setAttribute("allow", ALLOW_ATTRIBUTE);
395
+ }
396
+
397
+ // Connect bridge BEFORE loading iframe to ensure we're listening when the app sends ui/initialize
398
+ try {
399
+ const transport = new PostMessageTransport(iframe.contentWindow, iframe.contentWindow);
400
+ await bridge.connect(transport);
401
+ } catch (error) {
402
+ console.error("[host] Bridge connection failed:", error);
403
+ showError("Failed to initialize AppBridge: " + String(error));
404
+ }
405
+
406
+ const iframeLoaded = new Promise((resolve) => {
407
+ iframe.onload = resolve;
408
+ });
409
+ iframe.src = "/ui-app?resource=" + encodeURIComponent(UI_RESOURCE_TOKEN);
410
+ await iframeLoaded;
411
+
412
+ const eventSource = new EventSource("/events?session=" + encodeURIComponent(SESSION_TOKEN));
413
+ eventSource.addEventListener("tool-input", (event) => {
414
+ try {
415
+ bridge.sendToolInput(JSON.parse(event.data));
416
+ } catch (error) {
417
+ showError("Failed to forward tool input: " + String(error));
418
+ }
419
+ });
420
+ eventSource.addEventListener("tool-result", (event) => {
421
+ try {
422
+ bridge.sendToolResult(JSON.parse(event.data));
423
+ } catch (error) {
424
+ showError("Failed to forward tool result: " + String(error));
425
+ }
426
+ });
427
+ eventSource.addEventListener("tool-cancelled", (event) => {
428
+ try {
429
+ bridge.sendToolCancelled(JSON.parse(event.data));
430
+ } catch (error) {
431
+ showError("Failed to forward cancellation: " + String(error));
432
+ }
433
+ });
434
+ eventSource.addEventListener("result-patch", async (event) => {
435
+ try {
436
+ await bridge.notification({
437
+ method: STREAM_PATCH_METHOD,
438
+ params: JSON.parse(event.data),
439
+ });
440
+ } catch (error) {
441
+ showError("Failed to forward stream patch: " + String(error));
442
+ }
443
+ });
444
+ eventSource.addEventListener("host-context", (event) => {
445
+ try {
446
+ bridge.setHostContext(JSON.parse(event.data));
447
+ } catch {}
448
+ });
449
+ eventSource.addEventListener("session-complete", async () => {
450
+ await bridge.teardownResource({}).catch(() => {});
451
+ eventSource.close();
452
+ closeOrShowDone();
453
+ });
454
+ eventSource.onerror = () => {
455
+ setStatus("Connection lost", true);
456
+ };
457
+
458
+ const heartbeat = setInterval(() => {
459
+ post("/proxy/ui/heartbeat", {}).catch(() => {});
460
+ }, 10000);
461
+
462
+ const complete = async (reason) => {
463
+ try {
464
+ await post("/proxy/ui/complete", { reason });
465
+ } catch {}
466
+ try {
467
+ await bridge.teardownResource({});
468
+ } catch {}
469
+ clearInterval(heartbeat);
470
+ eventSource.close();
471
+ closeOrShowDone();
472
+ };
473
+
474
+ doneBtn.addEventListener("click", () => complete("done"));
475
+ cancelBtn.addEventListener("click", () => complete("cancel"));
476
+ window.addEventListener("keydown", (event) => {
477
+ if (event.key === "Escape") {
478
+ event.preventDefault();
479
+ complete("cancel");
480
+ } else if ((event.metaKey || event.ctrlKey) && event.key === "Enter") {
481
+ event.preventDefault();
482
+ complete("done");
483
+ }
484
+ });
485
+ </script>
486
+ </body>
487
+ </html>`}function fd(t){let e=Qo(t?.resourceDomains),n=Qo(t?.connectDomains),r=Qo(t?.frameDomains),o=Qo(t?.baseUriDomains);return["default-src 'none'",`sandbox ${ld}`,Ir("script-src",["'self'","'unsafe-inline'"],e),Ir("style-src",["'self'","'unsafe-inline'"],e),Ir("font-src",["'self'"],e),Ir("img-src",["'self'","data:"],e),Ir("media-src",["'self'","data:"],e),n.length>0?`connect-src ${n.join(" ")}`:"connect-src 'none'",r.length>0?`frame-src ${r.join(" ")}`:"frame-src 'none'","worker-src 'none'","object-src 'none'",o.length>0?`base-uri ${o.join(" ")}`:"base-uri 'self'"].join("; ")}function Ir(t,e,n){return`${t} ${[...new Set([...e,...n])].join(" ")}`}function Qo(t){return Array.isArray(t)?[...new Set(t.filter(e=>typeof e=="string"&&e.length>0&&/^[\x21-\x7E]+$/.test(e)&&!/[;'"]/.test(e)))]:[]}function lt(t){return JSON.stringify(t).replace(/</g,"\\u003c").replace(/>/g,"\\u003e").replace(/&/g,"\\u0026").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}function ud(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}import{createHash as qv,randomUUID as Vv}from"node:crypto";ue();be();function sa(t){if(t==null||typeof t!="object"){let n=JSON.stringify(t);return n===void 0?"undefined":n}if(Array.isArray(t))return`[${t.map(n=>sa(n)).join(",")}]`;let e=t;return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${sa(e[n])}`).join(",")}}`}function Xn(t,e,n,r){let o=t.mcpServers[e],i=o?.approveTools,s=i!==void 0?i:t.settings?.approveTools;if(s===!0)return!0;if(!Array.isArray(s)||s.length===0)return!1;let a=pe(o,t.settings?.toolPrefix),c=ce(n.originalName,e,a,!1);if(i!==void 0){if(Be(c,s))return!0;if(!r)return Be(ce(n.originalName,e,a),s);let f=ce(n.originalName,e,a),p=[...c].find(y=>y!==n.originalName)?.replace(/-/g,"_");p&&f.add(p);for(let y of c)f.delete(y);let g=new Set;for(let y of r.get(e)??[])for(let w of ce(y.originalName,e,a,!1))g.add(w);for(let y of c)g.delete(y);return s.some(y=>Be(f,[y])&&!Be(g,[y]))}if(Be(c,s))return!0;if(!r)return!1;let u=ce(n.originalName,e,a),d=[...c].find(f=>f!==n.originalName)?.replace(/-/g,"_");d&&u.add(d);for(let f of c)u.delete(f);let l=new Set;for(let[f,p]of r){let g=pe(t.mcpServers[f],t.settings?.toolPrefix);for(let y of p)for(let w of ce(y.originalName,f,g,!1))l.add(w)}for(let f of c)l.delete(f);return s.some(f=>Be(u,[f])&&!Be(l,[f]))}function Kv(t){return t==="allow_once"||t==="allow_for_session"||t==="deny"||t==="abstain"}async function Jv(t,e,n,r,o,i){if(!t.approvalEvents)return"abstain";let s=!0,a,c={requestId:Vv(),serverName:e,originalToolName:n.originalName,prefixedToolName:n.name,args:r??{},origin:o,...i!==void 0?{signal:i}:{},claim(u){return!s||a?!1:(a=u,!0)}};if(t.approvalEvents.emit(Si,c),s=!1,!a)return"abstain";try{let u=await ve(Promise.resolve().then(a),i);return Kv(u)?u:"deny"}catch(u){if(i?.aborted)throw u;return"deny"}}async function Qn(t,e,n,r,o,i=n.resourceUri?"resource":"proxy",s){let a=qv("sha256").update(sa(r??{})).digest("hex"),c=`${e}\0${n.originalName}\0${a}`,u=t.approvedToolCalls??=new Map;if(u.has(c))return{ok:!0};let d=await Jv(t,e,n,r,i,o);if(d==="allow_once")return{ok:!0};if(d==="allow_for_session")return u.set(c,!0),{ok:!0};if(d==="deny")return{ok:!1,reason:"denied"};if(!Xn(t.config,e,n,s??t.toolMetadata))return{ok:!0};if(!t.ui)return{ok:!1,reason:"approval_required_headless"};let l=JSON.stringify(r??{},null,2),f=de(l),p=f.length>500?`${f.slice(0,500)}...`:f,g=`MCP: ${de(e)} wants to run ${de(n.originalName)}`,y=te(t.owner?.signal,o),w=await ve(t.ui.select(`${g}
488
+
489
+ Arguments:
490
+ ${p}`,["Allow once","Allow for session","Deny"]),y);return w==="Allow once"?{ok:!0}:w==="Allow for session"?(u.set(c,!0),{ok:!0}):{ok:!1,reason:"denied"}}en();It();ue();var Qv=2*1024*1024,Zv=6e4,eS=5e3,aa=128,tS=20,Zn=8377,ca=8396,gd=Zn;async function md(t){let e=t.sessionToken??pd(),n=pd(),r=X.child({component:"UiServer",server:t.serverName,tool:t.toolName,session:e.slice(0,8)});r.debug("Starting UI server");let o=new Set,i=!1,s=Date.now(),a=null,c=t.hostContext?.displayMode??"inline",u=1,d=[],l,f,p={prompts:[],notifications:[],intents:[],contexts:[]},g={displayMode:c,availableDisplayModes:["inline","fullscreen","pip"],platform:"desktop",...t.hostContext},y=g["pi-mcp-adapter/stream"];if(y&&typeof y=="object"){let $=y.streamId,O=y.mode;typeof $=="string"&&(O==="eager"||O==="stream-first")&&(f={streamId:$,mode:O,frames:0,phases:[]})}let w=$=>{let O=t.manager.getConnection(t.serverName)?.tools?.find(G=>G.name===$);if(!O)return!1;let T=Zt(O._meta);return Us(T)&&!ke(T)},b=async $=>{let O=Kr($);if(O)p.prompts.push(O),r.debug("UI prompt received",{prompt:O.slice(0,100)});else if($.type==="intent"||$.intent){let T=$.intent??"";T&&(p.intents.push({intent:T,...$.params!==void 0?{params:$.params}:{}}),r.debug("UI intent received",{intent:T}))}else if($.type==="notify"||$.message){let T=$.message??"";T&&(p.notifications.push(T),r.debug("UI notification",{message:T.slice(0,100)}))}await t.onMessage?.($)},v=()=>{s=Date.now()},m=($,O)=>{let T=yi(O?.structuredContent);T&&((T.frameType==="checkpoint"||T.frameType==="final")&&(l=$),f||(f={streamId:T.streamId,mode:"eager",frames:0,phases:[]}),f.frames+=1,f.phases.includes(T.phase)||f.phases.push(T.phase),f.finalStatus=T.status,T.message!==void 0?f.lastMessage=T.message:delete f.lastMessage)},S=($,O,T)=>`id: ${$}
491
+ event: ${O}
492
+ data: ${JSON.stringify(T)}
493
+
494
+ `,R=()=>{let $=d[0]?.id;return l===void 0||$===void 0||l<$?-1:l-$},h=()=>{if(d.length<=aa)return;let $=R();$>0&&d.splice(0,$),d.length>aa&&d.splice(0,d.length-aa)},M=($,O)=>{if(i)return;let T=u++;d.push({id:T,name:$,payload:O}),m(T,O),h();let G=S(T,$,O);for(let F of o)try{F.write(G)}catch{o.delete(F)}},P=($,O)=>{let T=O?Number(O):Number.NaN,G=Number.isFinite(T)?d.filter(F=>F.id>T):(()=>{let F=R();return F>=0?d.slice(F):d})();for(let F of G)try{$.write(S(F.id,F.name,F.payload))}catch{o.delete($);return}},C=()=>{for(let $ of o)try{$.end()}catch{}o.clear()},E=()=>{a&&(clearInterval(a),a=null)},L=$=>{i||(r.debug("Session completed",{reason:$}),M("session-complete",{reason:$}),i=!0,E(),t.onComplete?.($))},H=Wv.createServer(async($,O)=>{try{let T=$.method||"GET",G=$.headers.host,F=new URL($.url||"/",`http://${G||"127.0.0.1"}`);if(G!==void 0&&!sS(F.hostname)){cS(O,403,"Invalid host");return}if(T==="HEAD"&&F.pathname==="/"){O.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),O.end();return}if(T==="GET"&&F.pathname==="/"){if(!F.searchParams.has("session")){O.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store"}),O.end('<!doctype html><html><head><meta charset="utf-8"><title>MCP UI</title></head><body><p>Open the authenticated MCP UI URL shown by Pi.</p></body></html>');return}if(!Zo(F,e,O))return;v();let j=dd({sessionToken:e,uiResourceToken:n,serverName:t.serverName,toolName:t.toolName,toolArgs:t.toolArgs,resource:t.resource,allowAttribute:Kc(t.resource.meta.permissions),requireToolConsent:t.consentManager.requiresPrompt(t.serverName),cacheToolConsent:t.consentManager.shouldCacheConsent(),hostContext:g});O.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store"}),O.end(j);return}if(T==="GET"&&F.pathname==="/events"){if(!Zo(F,e,O))return;v(),r.debug("SSE client connected",{clientCount:o.size+1}),O.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive","X-Accel-Buffering":"no"}),O.write(`: connected
495
+
496
+ `),o.add(O),P(O,$.headers["last-event-id"]?String($.headers["last-event-id"]):null),$.on("close",()=>{o.delete(O)});return}if(T==="GET"&&F.pathname==="/health"){if(!Zo(F,e,O))return;re(O,200,{ok:!0,result:{healthy:!0}});return}if(T==="GET"&&F.pathname==="/ui-app"){if(!Zo(F,n,O,"resource"))return;v();let j=fd(t.resource.meta.csp);O.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store","Content-Security-Policy":j}),O.end(t.resource.html);return}if(T==="GET"&&F.pathname==="/app-bridge.bundle.js"){let j=Yv.join(import.meta.dirname,"app-bridge.bundle.js");try{let Q=await Gv.readFile(j,"utf-8");O.writeHead(200,{"Content-Type":"application/javascript","Cache-Control":"public, max-age=31536000"}),O.end(Q)}catch{re(O,500,{ok:!1,error:"Bundle not found"})}return}if(T!=="POST"){re(O,404,{ok:!1,error:"Not found"});return}let Oe=await nS($,O);if(!Oe||!aS(Oe,e,O))return;let fe=Oe.params??{};if(v(),F.pathname==="/proxy/tools/call"){t.consentManager.ensureApproved(t.serverName);let j=fe;if(!j||typeof j.name!="string"||!j.name.trim()){re(O,400,{ok:!1,error:"Invalid tools/call params"});return}let Q=t.manager.getConnection(t.serverName);if(!Q||Q.status!=="connected"){re(O,503,{ok:!1,error:`Server "${t.serverName}" is not connected`});return}if(U(t.config?.mcpServers[t.serverName])||U(Q.definition)){re(O,503,{ok:!1,error:`Server "${t.serverName}" is disabled`});return}let Se=(Array.isArray(Q.tools)?Q.tools:[]).find(I=>I.name===j.name);if(!Se){re(O,403,{ok:!1,error:`MCP tool "${j.name}" is not callable by apps`});return}let Xe=Zt(Se._meta);if(!Us(Xe)){re(O,403,{ok:!1,error:`MCP tool "${j.name}" is not callable by apps`});return}let dt;try{dt=Sn(j.arguments,`tool "${j.name}" arguments`)}catch(I){re(O,400,{ok:!1,error:I instanceof Error?I.message:String(I)});return}let Re={name:j.name,arguments:dt},St={name:j.name,originalName:j.name,description:Se?.description??"",...Se?.inputSchema!==void 0?{inputSchema:Se.inputSchema}:{},...Xe!==void 0?{uiVisibility:Xe}:{}},st=new Map(t.state?.toolMetadata),pn=t.config?.mcpServers[t.serverName]??t.state?.config.mcpServers[t.serverName];st.set(t.serverName,[...Q.tools.map(I=>({name:I.name,originalName:I.name,description:I.description??""})),...pn?.exposeResources!==!1?(Q.resources??[]).map(I=>{let q=`read_${Ce(I.name)}`;return{name:q,originalName:q,description:I.description??`Read resource: ${I.uri}`}}):[]]);let wt=t.state?await Qn(t.state,t.serverName,St,Re.arguments,t.state.owner?.signal,"iframe",st):t.config&&Xn(t.config,t.serverName,St,st)?{ok:!1,reason:"approval_required_headless"}:{ok:!0};if(wt.ok===!1){let I=wt.reason==="denied",q=I?`The user declined approval to run MCP tool "${j.name}" on server "${t.serverName}".`:`MCP tool "${j.name}" on server "${t.serverName}" is approval-gated and requires an interactive session.`;re(O,200,{ok:!0,result:{content:[{type:"text",text:q}],details:{error:I?"approval_denied":"approval_required",server:t.serverName,tool:j.name}}});return}try{t.manager.touch(t.serverName),t.manager.incrementInFlight(t.serverName);let I=t.config?await ct({manager:t.manager,config:t.config,...t.onNeedsAuth?{onNeedsAuth:t.onNeedsAuth}:{}},t.serverName,q=>q.client.callTool(Re,t.manager.getRequestOptions?.(t.serverName))):await Q.client.callTool(Re,t.manager.getRequestOptions?.(t.serverName));re(O,200,{ok:!0,result:I})}finally{t.manager.decrementInFlight(t.serverName),t.manager.touch(t.serverName)}return}if(F.pathname==="/proxy/ui/consent"){let j=!!fe.approved;t.consentManager.registerDecision(t.serverName,j),re(O,200,{ok:!0,result:{approved:j}});return}if(F.pathname==="/proxy/ui/generated-tool-call-intent"){let j=typeof fe.tool=="string"?fe.tool:void 0;j&&w(j)?r.debug("Ignored generated app-only tool call intent",{tool:j}):await b({type:"intent",intent:"call_tool",params:{...j!==void 0?{tool:j}:{},...fe.arguments!==void 0?{arguments:fe.arguments}:{},...fe.isError!==void 0?{isError:fe.isError}:{}}}),re(O,200,{ok:!0,result:{}});return}if(F.pathname==="/proxy/ui/message"){await b(fe),re(O,200,{ok:!0,result:{}});return}if(F.pathname==="/proxy/ui/context"){let j=fe.content,Q=fe.structuredContent;if(j!==void 0&&(!Array.isArray(j)||j.some(Xe=>!Xv.safeParse(Xe).success))||Q!==void 0&&(!Q||typeof Q!="object"||Array.isArray(Q))){re(O,400,{ok:!1,error:"Invalid update-model-context params"});return}let ne={...j!==void 0?{content:j}:{},...Q!==void 0?{structuredContent:Q}:{}},Se=Jr(ne);if(Se)for(p.contexts.push(Se);p.contexts.length>tS;)p.contexts.shift();r.debug("UI context update",{hasContent:!!ne.content,hasUpdate:!!Se}),await t.onContextUpdate?.(ne),re(O,200,{ok:!0,result:{}});return}if(F.pathname==="/proxy/ui/open-link"){let j=fe;if(!j?.url||typeof j.url!="string"){re(O,400,{ok:!1,error:"Invalid open-link params"});return}let Q={};try{new URL(j.url)}catch{Q={isError:!0}}re(O,200,{ok:!0,result:Q});return}if(F.pathname==="/proxy/ui/download-file"){re(O,200,{ok:!0,result:{isError:!0}});return}if(F.pathname==="/proxy/ui/request-display-mode"){let Q=fe?.mode,ne=g.availableDisplayModes??["inline"];Q&&ne.includes(Q)&&(c=Q),g.displayMode=c,M("host-context",{displayMode:c}),re(O,200,{ok:!0,result:{mode:c}});return}if(F.pathname==="/proxy/ui/heartbeat"){re(O,200,{ok:!0,result:{}});return}if(F.pathname==="/proxy/ui/complete"){let j=typeof fe.reason=="string"?fe.reason:"done";L(j),re(O,200,{ok:!0,result:{}}),setTimeout(()=>{try{H.close()}catch{}C()},20).unref();return}re(O,404,{ok:!1,error:"Not found"})}catch(T){if(T instanceof We){let Oe=`Server "${t.serverName}" requires OAuth authentication. Run mcp({ action: "auth-start", server: "${t.serverName}" }) to get a browser URL, or /mcp-auth ${t.serverName} in an interactive local session.`,fe=T.authMessage??(t.config?wn(t.config,t.serverName,Oe):Oe);re(O,401,{ok:!1,error:fe});return}let G=Ec(T,{server:t.serverName,tool:t.toolName}),F=/approval required|denied/i.test(G.message)?403:500;F===500&&r.error("Request handler error",T instanceof Error?T:void 0),re(O,F,{ok:!1,error:G.message})}});return t.initialResultPromise&&t.initialResultPromise.then($=>M("tool-result",$),$=>{let O=$ instanceof Error?$.message:String($);M("tool-cancelled",{reason:O})}),a=setInterval(()=>{if(!i&&!(Date.now()-s<=Zv)){L("stale");try{H.close()}catch{}C()}},eS),a.unref(),new Promise(($,O)=>{let T=oS(t.port),G=0,F=()=>{H.once("error",Oe),H.listen(T[G],"127.0.0.1",fe)},Oe=j=>{if(H.off("listening",fe),j.code==="EADDRINUSE"&&G<T.length-1){G+=1,F();return}r.error("Failed to start server",j);let Q=T[G];O(new gr(j.message,{...Q!==void 0?{port:Q}:{},cause:j}))},fe=()=>{H.off("error",Oe);let j=H.address();if(!j||typeof j=="string"){let ne=new gr("invalid address");r.error("Invalid server address",ne),O(ne);return}r.debug("Server started",{port:j.port}),iS(j.port);let Q={url:`http://localhost:${j.port}/?session=${e}`,port:j.port,sessionToken:e,serverName:t.serverName,toolName:t.toolName,close:ne=>{L(ne??"closed");try{H.close()}catch{}C()},sendToolInput:ne=>{M("tool-input",{arguments:ne})},sendToolResult:ne=>{M("tool-result",ne)},sendResultPatch:ne=>{M("result-patch",ne)},sendToolCancelled:ne=>{M("tool-cancelled",{reason:ne})},sendHostContext:ne=>{Object.assign(g,ne),M("host-context",ne)},getSessionMessages:()=>({...p}),getStreamSummary:()=>f?{...f,phases:[...f.phases]}:void 0};$(Q)};F()})}async function nS(t,e){try{let n=await rS(t);return!n||typeof n!="object"?(re(e,400,{ok:!1,error:"Invalid request body"}),null):n}catch(n){return re(e,400,{ok:!1,error:n instanceof Error?n.message:"Invalid body"}),null}}function rS(t){return new Promise((e,n)=>{let r=0,o=[];t.on("data",i=>{if(r+=i.length,r>Qv){t.destroy(),n(new Error("Request body too large"));return}o.push(i)}),t.on("end",()=>{try{e(JSON.parse(Buffer.concat(o).toString("utf-8")))}catch(i){n(i)}}),t.on("error",n)})}function oS(t){if(t!==void 0)return[t];let e=[],n=ca-Zn+1;for(let r=0;r<n;r+=1){let o=Zn+(gd-Zn+r)%n;e.push(o)}return e.push(0),e}function iS(t){t<Zn||t>ca||(gd=t>=ca?Zn:t+1)}function sS(t){return t==="localhost"||t==="127.0.0.1"||t==="[::1]"}function Zo(t,e,n,r="session"){return t.searchParams.get(r)!==e?(re(n,403,{ok:!1,error:"Invalid session"}),!1):!0}function aS(t,e,n){return t.token!==e?(re(n,403,{ok:!1,error:"Invalid session"}),!1):!0}function re(t,e,n){t.writeHead(e,{"Content-Type":"application/json; charset=utf-8","Cache-Control":"no-store"}),t.end(JSON.stringify(n))}function cS(t,e,n){t.writeHead(e,{"Content-Type":"text/plain; charset=utf-8","Cache-Control":"no-store"}),t.end(n)}import{existsSync as ua}from"node:fs";import{execFileSync as uS}from"node:child_process";import{join as la,dirname as hd}from"node:path";import{platform as lS}from"node:os";import{createRequire as dS}from"node:module";var _r=null,ei=null;function yd(){return _r!==null?_r:lS()!=="darwin"?(_r=!1,!1):(ei=fS(),_r=ei!==null,_r)}function fS(){if(process.env.GLIMPSE_BINARY&&ua(process.env.GLIMPSE_BINARY))return process.env.GLIMPSE_BINARY;try{let e=dS(import.meta.url).resolve("glimpseui"),n=la(hd(e),"glimpse");if(ua(n))return n}catch{}try{let t=uS("npm",["root","-g"],{encoding:"utf-8"}).trim(),e=la(t,"glimpseui","src","glimpse");if(ua(e))return e}catch{}return null}async function vd(t,e){let r=await import(ei?la(hd(ei),"glimpse.mjs"):"glimpseui"),o=!0,i=r.open(t,{width:e.width??900,height:e.height??700,title:e.title});return i.on("closed",()=>{o&&(o=!1,e.onClosed())}),{close:()=>{o&&(o=!1,i.close())}}}var sn=null;function ni(t){return t?t.windowOpen?{message:t.reused?"Updated the open UI.":"Interactive UI is open. I'll respond to your prompts and intents as you interact with it.",uiOpen:!0,uiViewer:t.viewer,uiUrl:t.url}:{message:`${t.reused?"Updated the suppressed MCP UI session.":"MCP UI window was suppressed."} Open manually: ${t.url}`,uiOpen:!1,uiViewer:t.viewer,uiUrl:t.url}:{message:"Interactive UI was unavailable; returning the tool result inline.",uiOpen:!1}}var hS=10;function an(t,e,n){if(!e)return t;let r=t.structuredContent&&typeof t.structuredContent=="object"&&!Array.isArray(t.structuredContent)?{...t.structuredContent}:{},o=r[or],i=o&&typeof o=="object"&&!Array.isArray(o)?{...o}:{frameType:"final",phase:"settled",status:t.isError?"error":"ok"};return r[or]={...i,streamId:e,sequence:n},{...t,structuredContent:r}}async function Sd(t,e,n){D(n);try{return await t.openBrowser(e),D(n),null}catch(r){if(ie(r,n))throw r;let o=r instanceof Error?r.message:String(r);return t.owner?.isActive()===!1?null:(t.ui?.notify(`MCP UI browser open failed: ${o}`,"warning"),o)}}function yS(){return!!(process.env.SSH_CONNECTION||process.env.SSH_TTY)}function vS(){return new Promise(t=>{pS("who",{encoding:"utf8",timeout:2e3},(e,n)=>{if(e){t(!1);return}t(/\(.+\)\s*$/m.test(n))})})}function SS(){return new Promise(t=>{let e=gS.connect({host:"127.0.0.1",port:24543}),n=r=>{e.destroy(),t(r)};e.setTimeout(300),e.once("connect",()=>n(!0)),e.once("timeout",()=>n(!1)),e.once("error",()=>n(!1))})}function wS(t){let e=[t.openError!==null?"Couldn't open MCP UI here. Open it from your own device:":t.openedOnHost?"MCP UI opened on this host. If you're controlling this session remotely, open it from your own device:":"This looks like a remote session - if no MCP UI appeared, open it from your own device:",` ${t.url}`];return t.openError!==null&&e.push(`Browser launch failed: ${t.openError}`),t.moshi&&e.push("Moshi: tap the preview button in the terminal title bar and pick this MCP UI server."),e.push(`SSH: run \`ssh -L ${t.port}:127.0.0.1:${t.port} <this-host>\` on your local machine, then open the URL above.`,"mosh can't forward ports - run that ssh command in a separate terminal."),e.join(`
497
+ `)}async function ri(t,e){let n=X.child({component:"UiSession",server:e.serverName,tool:e.toolName}),r=te(t.owner?.signal,e.signal)??new AbortController().signal;try{if(D(r),t.uiServer&&t.uiServer.serverName===e.serverName&&t.uiServer.toolName===e.toolName){let v=t.uiServer,m=e.streamMode,S=m?ti():void 0,R=m?ti():void 0,h=!0,M=0,P=()=>{R&&t.manager.removeUiStreamListener(R)};return v.sendToolInput(e.toolArgs),R&&t.manager.registerUiStreamListener(R,(C,E)=>{!h||t.uiServer!==v||C===e.serverName&&(M+=1,v.sendResultPatch(an(E.result,S,M)))}),{serverName:e.serverName,toolName:e.toolName,reused:!0,...S!==void 0?{streamId:S}:{},...R!==void 0?{streamToken:R}:{},...m!==void 0?{streamMode:m}:{},...R?{requestMeta:{[zr]:R}}:{},url:v.url,viewer:v.viewer??"browser",windowOpen:v.windowOpen??!0,isActive:()=>h&&t.uiServer===v,sendToolResult:C=>{!h||t.uiServer!==v||(M+=1,v.sendToolResult(an(C,S,M)))},sendResultPatch:C=>{!h||t.uiServer!==v||(M+=1,v.sendResultPatch(an(C,S,M)))},sendToolCancelled:C=>{!h||t.uiServer!==v||(M+=1,v.sendToolResult(an({isError:!0,content:[{type:"text",text:C}]},S,M)))},close:()=>{h=!1,P()}}}let o=await t.uiResourceHandler.readUiResource(e.serverName,e.uiResourceUri,{config:t.config,signal:r,onNeedsAuth:e.onNeedsAuth});D(r),t.uiServer&&(t.uiServer.close("replaced"),t.uiServer=null),sn&&(sn.close(),sn=null);let i=e.streamMode,s=i?ti():void 0,a=i?ti():void 0,c=i&&s?{[gi]:{mode:i,streamId:s,intermediateResultPatches:i==="stream-first",partialInput:!1}}:void 0,u=!0,d=0,l,f=()=>{a&&t.manager.removeUiStreamListener(a)};if(l=await md({serverName:e.serverName,toolName:e.toolName,toolArgs:i==="stream-first"?{}:e.toolArgs,resource:o,manager:t.manager,config:t.config,state:t,...e.onNeedsAuth?{onNeedsAuth:e.onNeedsAuth}:{},consentManager:t.consentManager,...c!==void 0?{hostContext:c}:{},onMessage:v=>{let m=Kr(v);if(m)t.sendMessage&&(t.sendMessage({customType:"mcp-ui-prompt",content:[{type:"text",text:`User sent prompt from ${e.serverName} UI: "${m}"`}],display:`\u{1F4AC} UI Prompt: ${m}`,details:{server:e.serverName,tool:e.toolName,prompt:m}},{triggerTurn:!0}),n.debug("Triggered agent turn for UI prompt",{prompt:m.slice(0,50)}));else if(v.type==="intent"||v.intent){let S=v.intent??"",R=v.params;if(S&&t.sendMessage){let h=R?` ${JSON.stringify(R)}`:"";t.sendMessage({customType:"mcp-ui-intent",content:[{type:"text",text:`User triggered intent from ${e.serverName} UI: ${S}${h}`}],display:`\u{1F3AF} UI Intent: ${S}`,details:{server:e.serverName,tool:e.toolName,intent:S,params:R}},{triggerTurn:!0}),n.debug("Triggered agent turn for UI intent",{intent:S})}}else if(v.type==="notify"||v.message){let S=v.message??"";S&&t.ui&&t.ui.notify(`[${e.serverName}] ${S}`,"info")}},onContextUpdate:v=>{let m=Jr(v);n.debug("Model context update from UI",{hasContent:!!v.content,hasStructured:!!v.structuredContent,hasUpdate:!!m}),m&&t.sendMessage&&t.sendMessage({customType:"mcp-ui-context",content:[{type:"text",text:`User submitted model context from ${e.serverName} UI:
498
+ ${m.summary}`}],display:"UI Context submitted",details:{server:e.serverName,tool:e.toolName,context:m}},{triggerTurn:!0})},onComplete:v=>{if(u=!1,f(),t.uiServer===l){let m=l.getSessionMessages(),S=l.getStreamSummary();if(m.prompts.length>0||m.intents.length>0||m.notifications.length>0||m.contexts.length>0||!!S){for(t.completedUiSessions.push({serverName:l.serverName,toolName:l.toolName,completedAt:new Date,reason:v,messages:m,...S!==void 0?{stream:S}:{}});t.completedUiSessions.length>hS;)t.completedUiSessions.shift();n.debug("Session completed",{reason:v,prompts:m.prompts.length,intents:m.intents.length,notifications:m.notifications.length,contexts:m.contexts.length,streamFrames:S?.frames??0})}t.uiServer=null,sn&&(sn.close(),sn=null)}}}),t.owner?.isActive()===!1||r.aborted)throw l.close("runtime_owner_stopped"),D(r),new Error("MCP UI session became stale before registration");a&&t.manager.registerUiStreamListener(a,(v,m)=>{!u||t.uiServer!==l||v===e.serverName&&(d+=1,l.sendResultPatch(an(m.result,s,d)))}),t.uiServer=l;let p=process.env.MCP_UI_VIEWER?.toLowerCase(),g=p==="none"||p==="off"||p==="disabled",y="browser",w=!0,b=yS();if(g)y="suppressed",w=!1,t.ui?.notify(`MCP UI window suppressed (MCP_UI_VIEWER=${p}). Open manually: ${l.url}`,"info"),n.info("Suppressing MCP UI window (MCP_UI_VIEWER="+p+")",{url:l.url});else{let v=b||await vS(),m=async(h,M=!1)=>{t.ui?.notify(wS({url:l.url,port:l.port,moshi:await SS(),openError:h,openedOnHost:M}),h===null?"info":"warning")},S=!b&&yd();if(!b&&(p==="glimpse"||p!=="browser"&&S))try{let h=`<!DOCTYPE html><html><head><meta charset="utf-8"><style>body{margin:0;padding:0;width:100vw;height:100vh;overflow:hidden}iframe{width:100%;height:100%;border:none}</style></head><body><iframe src="${l.url}"></iframe></body></html>`,M=await vd(h,{title:`MCP \xB7 ${e.serverName} \xB7 ${e.toolName}`,width:1e3,height:800,onClosed:()=>{u&&l.close("glimpse-closed")}});if(t.owner?.isActive()===!1||r.aborted)throw M.close(),D(r),new Error("MCP Glimpse window became stale before registration");sn=M,y="glimpse",v&&await m(null,!0)}catch(h){n.debug("Glimpse unavailable, using browser",{error:h instanceof Error?h.message:String(h)});let M=await Sd(t,l.url,r);(M!==null||v)&&await m(M),y="browser"}else{let h=await Sd(t,l.url,r);(h!==null||v)&&await m(h)}}return D(r),l.viewer=y,l.windowOpen=w,{serverName:e.serverName,toolName:e.toolName,reused:!1,...s!==void 0?{streamId:s}:{},...a!==void 0?{streamToken:a}:{},...i!==void 0?{streamMode:i}:{},...a?{requestMeta:{[zr]:a}}:{},url:l.url,viewer:y,windowOpen:w,isActive:()=>u&&t.uiServer===l,sendToolResult:v=>{!u||t.uiServer!==l||(d+=1,l.sendToolResult(an(v,s,d)))},sendResultPatch:v=>{!u||t.uiServer!==l||(d+=1,l.sendResultPatch(an(v,s,d)))},sendToolCancelled:v=>{!u||t.uiServer!==l||l.sendToolCancelled(v)},close:v=>{u=!1,f(),l.close(v)}}}catch(o){if(o instanceof mS||ie(o,r))throw o;let i=o instanceof Error?o.message:String(o);return n.error("Failed to start UI session",o instanceof Error?o:void 0),t.ui?.notify(`MCP UI unavailable for ${e.toolName} (${e.serverName}): ${i}`,"warning"),null}}ue();en();It();be();import{Check as CS,Errors as xS}from"typebox/value";var wd=new Set(["read","bash","edit","write","grep","find","ls","mcp"]),MS=75;function xd(t,e){if(!t||typeof t!="object"||Array.isArray(t))return e;let n=t;if(n.type!=="object")return e;let r=e&&typeof e=="object"&&!Array.isArray(e)?e:null,o=n.properties,i;if(r&&o&&typeof o=="object"&&!Array.isArray(o))for(let[a,c]of Object.entries(o)){if(!Object.hasOwn(r,a)||typeof r[a]!="string"||!c||typeof c!="object"||Array.isArray(c))continue;let u=c.type;if(!(u!=="object"&&u!=="array"))try{let d=JSON.parse(r[a]);(u==="array"?Array.isArray(d):d!==null&&typeof d=="object"&&!Array.isArray(d))&&(i??={...r},i[a]=d)}catch{}}let s=i??e;if(!CS(t,s)){let a=xS(t,s),c=a.slice(0,8).map(u=>({instancePath:u.instancePath||"/",keyword:u.keyword,message:u.message}));throw new TypeError(`MCP direct tool arguments do not match the advertised input schema: ${JSON.stringify({issues:c,total:a.length,truncated:a.length>c.length})}`)}return s}function oi(t,e,n=`MCP server "${e}" requires OAuth authentication. Run mcp({ action: "auth-start", server: "${e}" }) to get a browser URL, or /mcp-auth ${e} in an interactive local session.`){return wn(t.config,e,n)}function bd(t,e,n){return t.config.settings?.authRequiredMessage?`OAuth authentication failed for "${e}": ${n}. ${oi(t,e)}`:`OAuth authentication failed for "${e}": ${n}. Run mcp({ action: "auth-start", server: "${e}" }) to get a browser URL, or /mcp-auth ${e} in an interactive local session.`}async function Cd(t,e,n){if(t.config.settings?.autoAuth!==!0)return{status:"skipped"};let r=t.config.mcpServers[e];if(!r||U(r)||!Ue(r))return{status:"skipped"};let o;try{o=He(r)}catch(s){let a=s instanceof Error?s.message:String(s);return{status:"failed",message:bd(t,e,a)}}if(!o)return{status:"skipped"};let i=r.oauth?r.oauth.grantType??"authorization_code":"authorization_code";if(!t.ui&&i!=="client_credentials")return{status:"failed",message:oi(t,e,`MCP server "${e}" requires OAuth authentication. Run mcp({ action: "auth-start", server: "${e}" }) to get a browser URL, or /mcp-auth ${e} in an interactive local session.`)};try{return t.authStorageOptions?await mt(e,o,r,n?{authStorageOptions:t.authStorageOptions,signal:n,runtime:t.oauthRuntime}:{authStorageOptions:t.authStorageOptions,runtime:t.oauthRuntime}):await mt(e,o,r,{...n?{signal:n}:{},runtime:t.oauthRuntime}),{status:"success"}}catch(s){if(ie(s,n))throw s;let a=s instanceof Error?s.message:String(s);return{status:"failed",message:bd(t,e,a)}}}function Md(t,e,n,r,o=new Set,i){let s=[];if(!e)return s;let a=new Set,c=r?tn(r):null,u=t.settings?.directTools;for(let[l,f]of Object.entries(t.mcpServers)){if(U(f))continue;let p=e.servers[l];if(!p||!$e(p,f))continue;let g=!1;if(c?c.servers.has(l)?g=!0:c.tools.has(l)&&(g=[...c.tools.get(l)]):f.directTools!==void 0?g=f.directTools:u&&(g=u),!g)continue;let y=pe(f,n),b=Array.isArray(f.includeTools)&&f.includeTools.length>0||Array.isArray(f.excludeTools)&&f.excludeTools.length>0?(()=>{let v=new Set;for(let[m,S]of Object.entries(t.mcpServers)){let R=e.servers[m];if(!R||!$e(R,S)||U(S))continue;let h=pe(S,n);for(let M of R.tools??[])if(ke(M.uiVisibility))for(let P of ce(M.name,m,h,!1))v.add(P);if(S.exposeResources!==!1)for(let M of R.resources??[]){let P=`read_${Ce(M.name)}`;for(let C of ce(P,m,h,!1))v.add(C)}}return mn(v)})():void 0;for(let v of p.tools??[]){if(!ke(v.uiVisibility)||g!==!0&&!g.includes(v.name)||!Ee(v.name,l,y,f.includeTools,f.excludeTools,b))continue;let m=se(v.name,l,y);if(wd.has(m)){console.warn(`MCP: skipping direct tool "${m}" (collides with builtin)`);continue}if(a.has(m)){console.warn(`MCP: skipping duplicate direct tool "${m}" from "${l}"`);continue}a.add(m),s.push({serverName:l,originalName:v.name,prefixedName:m,description:v.description??"",...v.inputSchema!==void 0?{inputSchema:v.inputSchema}:{},...v.uiResourceUri!==void 0?{uiResourceUri:v.uiResourceUri}:{},...v.uiStreamMode!==void 0?{uiStreamMode:v.uiStreamMode}:{}})}if(f.exposeResources!==!1)for(let v of p.resources??[]){let m=`read_${Ce(v.name)}`;if(g!==!0&&!g.includes(m)||!Ee(m,l,y,f.includeTools,f.excludeTools,b))continue;let S=se(m,l,y);if(wd.has(S)){console.warn(`MCP: skipping direct resource tool "${S}" (collides with builtin)`);continue}if(a.has(S)){console.warn(`MCP: skipping duplicate direct resource tool "${S}" from "${l}"`);continue}a.add(S),s.push({serverName:l,originalName:m,prefixedName:S,description:v.description??`Read resource: ${v.uri}`,resourceUri:v.uri})}}for(let l of s)i?.add(l.prefixedName);let d=o.size===0?s:s.filter(l=>!o.has(l.serverName));return t.settings?.warnOnLargeDirectTools!==!1&&d.length>=MS&&console.warn(`MCP: ${d.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. Set settings.warnOnLargeDirectTools to false to hide this advisory.`),d}function Td(t){let e=`MCP gateway \u2014 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 Pi tools should be called directly, not through mcp.
499
+ `,n=Object.keys(t.mcpServers).filter(o=>!U(t.mcpServers[o]));n.length>0&&(e+=`
500
+ Servers: ${n.join(", ")}
501
+ `);let r=Object.entries(t.mcpServers).filter(([,o])=>U(o)).map(([o])=>o);return r.length>0&&(e+=`
502
+ Disabled servers (enable with /mcp enable <server> and /reload): ${r.join(", ")}
503
+ `),e+=`
504
+ Usage:
505
+ `,e+=` mcp({ }) \u2192 Show server status and tool counts
506
+ `,e+=` mcp({ server: "name" }) \u2192 List tools from server
507
+ `,e+=` mcp({ search: "query" }) \u2192 Search MCP tools by name/description
508
+ `,e+=` mcp({ describe: "tool_name" }) \u2192 Show tool details and parameters
509
+ `,e+=` mcp({ instructions: "name" }) \u2192 Show full server usage instructions
510
+ `,e+=` mcp({ connect: "server-name" }) \u2192 Connect to a server and refresh metadata
511
+ `,e+=` mcp({ tool: "name", args: { key: "value" } }) \u2192 Call a tool (object args; JSON string also accepted)
512
+ `,e+=` mcp({ action: "ui-messages" }) \u2192 Retrieve accumulated messages from completed UI sessions
513
+ `,e+=` mcp({ action: "auth-start", server: "name" }) \u2192 Start manual OAuth and get a browser URL
514
+ `,e+=` mcp({ action: "auth-complete", server: "name", args: { redirectUrl: "..." } }) \u2192 Complete manual OAuth
515
+ `,e+=`
516
+ Mode: action > tool (call) > connect > describe > instructions > search > server (list) > nothing (status)`,e}function Ad(t,e,n){return async function(o,i,s){D(s);let a=t(),c=e();if(!a&&c)try{a=await c}catch(S){let R=S instanceof Error?S.message:String(S);return{content:[{type:"text",text:`MCP initialization failed: ${R}`}],details:{error:"init_failed",message:R}}}if(!a)return{content:[{type:"text",text:"MCP not initialized"}],details:{error:"not_initialized"}};let u=a.config.mcpServers[n.serverName];if(U(u)){let S=`MCP server "${n.serverName}" is disabled. Run /mcp enable ${n.serverName} and /reload to enable it.`;return{content:[{type:"text",text:S}],details:{error:"server_disabled",server:n.serverName,message:S}}}let d=te(a.owner?.signal,s);D(d);let l=await it(a,n.serverName,d),f=!1;if(!l&&a.manager.getConnection(n.serverName)?.status==="needs-auth"){f=!0;let S=await Cd(a,n.serverName,d);if(S.status==="failed")return{content:[{type:"text",text:S.message}],details:{error:"auth_required",server:n.serverName,message:S.message}};S.status==="success"&&(await a.manager.close(n.serverName),Ae(a,n.serverName),l=await it(a,n.serverName,d))}if(!l){if(a.manager.getConnection(n.serverName)?.status==="needs-auth"){let h=oi(a,n.serverName);return{content:[{type:"text",text:h}],details:{error:"auth_required",server:n.serverName,message:h,autoAuthAttempted:f}}}let R=Me(a,n.serverName);return{content:[{type:"text",text:`MCP server "${n.serverName}" not available${R!==null?` (failed ${R}s ago)`:""}`}],details:{error:"server_unavailable",server:n.serverName}}}let p=a.manager.getConnection(n.serverName);if(!p||p.status!=="connected")return{content:[{type:"text",text:`MCP server "${n.serverName}" not connected`}],details:{error:"not_connected",server:n.serverName}};let g=n.resourceUri?i:Sn(i),y=await Qn(a,n.serverName,{name:n.prefixedName,originalName:n.originalName,description:n.description,...n.inputSchema!==void 0?{inputSchema:n.inputSchema}:{},...n.resourceUri!==void 0?{resourceUri:n.resourceUri}:{},...n.uiResourceUri!==void 0?{uiResourceUri:n.uiResourceUri}:{},...n.uiStreamMode!==void 0?{uiStreamMode:n.uiStreamMode}:{}},g,d,n.resourceUri?"resource":"direct");if(y.ok===!1){let S=y.reason==="denied";return{content:[{type:"text",text:S?`The user declined approval to run MCP tool "${n.originalName}" on server "${n.serverName}".`:`MCP tool "${n.originalName}" on server "${n.serverName}" is approval-gated and requires an interactive session.`}],details:{error:S?"approval_denied":"approval_required",server:n.serverName,tool:n.originalName}}}let w=null,b=a.manager.getRequestOptions?.(n.serverName,d)??(d?{signal:d}:void 0),v=Yn(a.config.settings),m=async()=>{let S=a.manager.getConnection(n.serverName);if(S?.status==="connected")return S;if(!f){f=!0;let R=await Cd(a,n.serverName,d);if(R.status==="failed")throw new We(n.serverName,R.message);if(R.status==="success"){let h=a.manager.getConnection(n.serverName);return h?.status==="connected"?h:(h?.status==="needs-auth"&&await a.manager.close(n.serverName),Ae(a,n.serverName),await it(a,n.serverName,d)?a.manager.getConnection(n.serverName):void 0)}}return a.manager.getConnection(n.serverName)};try{if(a.manager.touch(n.serverName),a.manager.incrementInFlight(n.serverName),n.resourceUri){let C=await ct({manager:a.manager,config:a.config,...d?{signal:d}:{},onNeedsAuth:m},n.serverName,H=>H.client.readResource({uri:n.resourceUri},b)),E=Xo(C.contents??[],a.owner?.signal),L=await Le(E.length>0?E:[{type:"text",text:"(empty resource)"}],{...v,...a.config.settings?.directToolResultDetails==="bounded"?{rawMcpResult:C}:{}});return{content:L.content,details:{server:n.serverName,resourceUri:n.resourceUri,...Ne(L)}}}let S=!!n.uiResourceUri;w=S?await ri(a,{serverName:n.serverName,toolName:n.originalName,toolArgs:g,uiResourceUri:n.uiResourceUri,...n.uiStreamMode!==void 0?{streamMode:n.uiStreamMode}:{},...s?{signal:s}:{},onNeedsAuth:m}):null;let R=await ct({manager:a.manager,config:a.config,...d?{signal:d}:{},onNeedsAuth:m},n.serverName,C=>ve(C.client.callTool({name:n.originalName,arguments:g,_meta:w?.requestMeta},b),d));if(w?.sendToolResult(R),R.isError){let C=R.content??[],E=Wn(C,a.owner?.signal),L=E.length>0?E:[{type:"text",text:"(empty result)"}],H=n.inputSchema?`
517
+
518
+ Expected parameters:
519
+ ${rt(n.inputSchema)}`:"",$=await Le(L,{...v,prefix:"Error: ",suffix:H,emptyTextFallback:"Tool execution failed",...a.config.settings?.directToolResultDetails==="bounded"?{rawMcpResult:R}:{}});return{content:$.content,details:{error:"tool_error",server:n.serverName,...Ne($)}}}let h=Er(R,a.owner?.signal),M=h.length>0?h:[{type:"text",text:"(empty result)"}];if(S){let C=ni(w),E=await Le(M,{...v,suffix:`
520
+
521
+ ${C.message}`,...a.config.settings?.directToolResultDetails==="bounded"?{rawMcpResult:R}:{}});return{content:E.content,details:{server:n.serverName,tool:n.originalName,uiOpen:C.uiOpen,uiViewer:C.uiViewer,uiUrl:C.uiUrl,...Ne(E)}}}let P=await Le(M,{...v,...a.config.settings?.directToolResultDetails==="bounded"?{rawMcpResult:R}:{}});return{content:P.content,details:{server:n.serverName,tool:n.originalName,...Ne(P)}}}catch(S){if(S instanceof We){let C=S.authMessage??oi(a,n.serverName);return w?.sendToolCancelled(C),{content:[{type:"text",text:C}],details:{error:"auth_required",server:n.serverName,message:C,autoAuthAttempted:f}}}if(S instanceof bS){let C=await a.manager.handleUrlElicitationRequired(n.serverName,S),E=C==="accept"?"The original MCP tool did not run. Complete the opened browser interaction, then retry the tool.":`The URL interaction was ${C==="decline"?"declined":"cancelled"}.`;return w?.sendToolCancelled(E),{content:[{type:"text",text:E}],details:{error:"url_elicitation_required",server:n.serverName,action:C}}}let R=S instanceof Error?S.message:String(S),h=ie(S,d);h||await a.manager.close(n.serverName).catch(()=>{}),w?.sendToolCancelled(R);let M=n.inputSchema?`
522
+
523
+ Expected parameters:
524
+ ${rt(n.inputSchema)}`:"",P=await Le([{type:"text",text:R}],{...v,prefix:"Failed to call tool: ",suffix:M});return{content:P.content,details:{error:h?"aborted":"call_failed",server:n.serverName,...Ne(P)}}}finally{w?.reused&&w.close(),a.manager.decrementInFlight(n.serverName),a.manager.touch(n.serverName)}}}nt();ue();ue();nt();be();function Ed(t){let e=ze();if(!e?.servers)return[];let n=t.settings?.toolPrefix??"server",r=[];for(let[o,i]of Object.entries(e.servers)){let s=t.mcpServers[o];!s||U(s)||!i?.prompts?.length||!$e(i,s)||r.push(...ut(o,i.prompts,n,s))}return r}function TS(t){let e=[],n={},r=AS(t);for(let o of r){let i=PS(o);if(i>0){let s=o.slice(0,i).trim(),a=Pd(o.slice(i+1).trim());if(s){n[s]=a;continue}}e.push(Pd(o))}return{positional:e,named:n}}function AS(t){let e=[],n="",r=null,o=!1;for(let i of t){if(o){n+=i,o=!1;continue}if(i==="\\"&&r!=="'"){o=!0;continue}if(r){n+=i,i===r&&(r=null);continue}if(i==='"'||i==="'"){r=i,n+=i;continue}if(/\s/.test(i)){n.length>0&&(e.push(n),n="");continue}n+=i}return n.length>0&&e.push(n),e}function PS(t){let e=null;for(let n=0;n<t.length;n++){let r=t[n];if(e){r===e&&(e=null);continue}if(r==='"'||r==="'")e=r;else if(r==="=")return n}return-1}function Pd(t){return t.length>=2&&(t.startsWith('"')||t.startsWith("'"))&&t.endsWith(t.charAt(0))?t.slice(1,-1):t}function RS(t,e){let n={},r=t.arguments,o=0;for(let s of r){let a=e.named[s.name]??e.positional[o++];a!==void 0&&a!==""&&(n[s.name]=a)}for(let[s,a]of Object.entries(e.named))s in n||(n[s]=a);let i=r.filter(s=>s.required&&(n[s.name]===void 0||n[s.name]===""));return i.length>0?{ok:!1,error:ES(t,i)}:{ok:!0,args:n}}function ES(t,e){let n=t.arguments.map(o=>o.required?`<${o.name}>`:`[${o.name}]`).join(" "),r=e.map(o=>o.name).join(", ");return`Missing required argument${e.length>1?"s":""}: ${r}.
525
+ Usage: /${t.commandName} ${n}`.trim()}function kS(t){let e=[];for(let n of t.messages){let r=OS(n);r&&(n.role==="user"&&t.messages.length===1?e.push(r):e.push(`[${n.role}] ${r}`))}return e.join(`
526
+
527
+ `).trim()}function OS(t){let e=t.content;if(!e||typeof e!="object")return"";switch(e.type){case"text":return e.text??"";case"resource":{let n=e.resource;return n?"text"in n&&typeof n.text=="string"?`[resource ${n.uri}]
528
+ ${n.text}`:`[resource ${n.uri}]`:""}case"resource_link":return`[resource_link ${e.uri??""}${e.name?` \u2014 ${e.name}`:""}]`;case"image":return`[image ${e.mimeType??"unknown"}${e.data?" (embedded)":""}]`;case"audio":return`[audio ${e.mimeType??"unknown"}]`;default:return""}}function kd(t,e,n){return{description:$S(n),handler:async(o,i)=>{let s=e();if(!s){i.hasUI&&i.ui.notify("MCP not initialized","error");return}let a=Rd(s,n.serverName,n.originalName);if(s.promptMetadataLive?.has(n.serverName)&&!a){i.hasUI&&i.ui.notify(`MCP prompt "${n.originalName}" is no longer advertised by server "${n.serverName}". Run /mcp reconnect to refresh.`,"error");return}let c=a??n,u=TS(o??""),d=RS(c,u);if(!d.ok){i.hasUI&&i.ui.notify(d.error??"Invalid prompt arguments","error");return}let l=d.args??{};if(!s.config.mcpServers[n.serverName]){i.hasUI&&i.ui.notify(`MCP prompt "${c.originalName}" is no longer configured. Run /mcp reconnect to refresh.`,"error");return}if(!await it(s,n.serverName,i.signal)){if(i.hasUI){let v=s.manager.getConnection(n.serverName)?.status==="needs-auth"?`MCP server "${n.serverName}" needs authentication. Run /mcp-auth ${n.serverName}.`:`MCP server "${n.serverName}" is not available. Run /mcp reconnect ${n.serverName}.`;i.ui.notify(v,"error")}return}let p=Rd(s,n.serverName,n.originalName);if(s.promptMetadataLive?.has(n.serverName)&&!p){i.hasUI&&i.ui.notify(`MCP prompt "${n.originalName}" is no longer advertised by server "${n.serverName}". Run /mcp reconnect to refresh.`,"error");return}let g=p??c,y;try{y=await s.manager.getPrompt(n.serverName,g.originalName,Object.keys(l).length>0?l:void 0,i.signal)}catch(b){let v=b instanceof Error?b.message:String(b);X.debug(`MCP prompt "${c.originalName}" on ${n.serverName} failed: ${v}`),i.hasUI&&i.ui.notify(`MCP prompt "${c.originalName}" failed: ${v}`,"error");return}let w=kS(y);if(!w){i.hasUI&&i.ui.notify(`MCP prompt "${c.originalName}" returned no text content.`,"warning");return}t.sendUserMessage(w)}}}function Rd(t,e,n){return t.promptMetadata?.get(e)?.find(r=>r.originalName===n)}function $S(t){let e=t.description||t.title||`MCP prompt from ${t.serverName}`;return Ve(`MCP: ${e}`,120)||`MCP prompt from ${t.serverName}`}ue();import{UrlElicitationRequiredError as BS}from"@modelcontextprotocol/client";import{createRequire as HS}from"node:module";var IS=["if","then","else","allOf","not","patternProperties","additionalProperties"];function Dr(t){try{if(!Ur(t))return null;let e=new Map;for(let u of["$defs","definitions"]){let d=t[u];if(d!==void 0){if(!Ur(d))return null;for(let[l,f]of Object.entries(d)){if(!Ur(f))return null;e.set(`${u}/${Od(l)}`,f)}}}let n=new Map,r=new Set,o=0,i=u=>{let d=n.get(u);if(d)return d;let l=u.slice(u.indexOf("/")+1);for(d=/^[A-Za-z_$][\w$]*$/.test(l)&&!r.has(l)?l:`Definition${++o}`;r.has(d);)d=`Definition${++o}`;return n.set(u,d),r.add(d),d},s=u=>{if(!Ur(u)||_S(u))return null;if("$ref"in u){if(typeof u.$ref!="string")return null;let d=u.$ref.match(/^#\/(\$defs|definitions)\/([^/]+)$/);if(!d)return null;let l=d[1],f=d[2];if(l===void 0||f===void 0)return null;let p=`${l}/${Od(f)}`;return e.has(p)?i(p):null}if(Array.isArray(u.enum)){let d=u.enum.map(Id);return d.every(l=>l!==null)?d.join(" | "):null}if(Object.hasOwn(u,"const"))return Id(u.const);if(Array.isArray(u.anyOf)||Array.isArray(u.oneOf)){let d=u.anyOf??u.oneOf;if(d.length===0)return null;let l=d.map(s);return l.every(f=>f!==null)?l.join(" | "):null}if(u.type==="object"||u.properties!==void 0){if(u.properties===void 0)return"{}";if(!Ur(u.properties))return null;let d=new Set(Array.isArray(u.required)?u.required.filter(f=>typeof f=="string"):[]),l=[];for(let[f,p]of Object.entries(u.properties)){let g=s(p);if(g===null)return null;l.push(`${US(f)}${d.has(f)?"":"?"}: ${g};`)}return l.length===0?"{}":`{ ${l.join(" ")} }`}if(u.type==="array"){if(u.items===void 0)return"unknown[]";let d=s(u.items);return d===null?null:`${DS(d)?`(${d})`:d}[]`}if(Array.isArray(u.type)){let d=u.type.map($d);return d.every(l=>l!==null)?d.join(" | "):null}return typeof u.type=="string"?$d(u.type):"unknown"},a=s(t);if(a===null)return null;let c=[];for(let[u,d]of n){let l=e.get(u);if(!l)return null;let f=s(l);if(f===null)return null;c.push(`type ${d} = ${f};`)}return c.length>0?`${c.join(`
529
+ `)}
530
+
531
+ ${a}`:a}catch{return null}}function Ur(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function _S(t){return IS.some(e=>Object.hasOwn(t,e)?e!=="additionalProperties"||t.additionalProperties!==!1:!1)}function Od(t){return t.replace(/~1/g,"/").replace(/~0/g,"~")}function $d(t){switch(t){case"string":return"string";case"number":case"integer":return"number";case"boolean":return"boolean";case"null":return"null";case"object":return"{}";case"array":return"unknown[]";default:return null}}function Id(t){return t===null||typeof t=="string"||typeof t=="boolean"?JSON.stringify(t):typeof t=="number"&&Number.isFinite(t)?String(t):null}function US(t){return/^[A-Za-z_$][\w$]*$/.test(t)?t:JSON.stringify(t)}function DS(t){return t.includes(" | ")}nt();be();ue();var _d=4,Ud={name:12,originalName:10,server:8,description:5,keywords:5},Dd=new WeakMap;function fa(t,e,n,r){let o=t?.searchKeywords;if(!o||typeof o!="object"||Array.isArray(o))return[];let i=ce(e,n,pe(t,r)),s=[],a=new Set;for(let[c,u]of Object.entries(o))if(Array.isArray(u)&&Be(i,[c]))for(let d of u){if(typeof d!="string")continue;let l=d.trim();!l||a.has(l)||(a.add(l),s.push(l))}return s}function cn(t){return t.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_./:-]+/g," ").toLowerCase()}function da(t){return cn(t).split(/[^a-z0-9]+/).filter(Boolean)}function NS(t,e,n){let r={name:cn(t.name),originalName:cn(t.originalName),server:cn(e),description:cn(t.description)},o=Object.entries(r).map(([s,a])=>[s,a,da(a)]),i=n?.map(s=>cn(s).trim()).filter(Boolean)??[];return{tool:t,fields:o,nameTokens:o[0][2],keywordPhrases:i,keywordTokens:i.flatMap(da)}}function LS(t,e,n){let r=0,o=!1,i=!1,s=new Set;for(let[u,d,l]of t.fields){let f=Ud[u];d===e?(r+=f*14,o=!0,i=!0):d.startsWith(e)?(r+=f*9,o=!0):d.includes(e)&&(r+=f*6,o=!0);for(let p of n)l.includes(p)?(r+=f*4,s.add(p)):l.some(g=>g.startsWith(p)||g.length>=_d&&p.startsWith(g))?(r+=f*2,s.add(p)):d.includes(p)&&(r+=f,s.add(p))}if(t.keywordPhrases.length>0){let u=Ud.keywords,d=0;for(let l of t.keywordPhrases)l===e?(d=Math.max(d,u*14),o=!0,i=!0):l.startsWith(e)?(d=Math.max(d,u*9),o=!0):l.includes(e)&&(d=Math.max(d,u*6),o=!0);r+=d;for(let l of n)t.keywordTokens.includes(l)?(r+=u*4,s.add(l)):t.keywordTokens.some(f=>f.startsWith(l)||f.length>=_d&&l.startsWith(f))?(r+=u*2,s.add(l)):t.keywordPhrases.some(f=>f.includes(l))&&(r+=u,s.add(l))}let a=s.size/n.length;if(!o&&(n.length<=2?a!==1:a<.6))return null;r+=a===1?25:Math.round(a*10);let c=n[0];return c!==void 0&&t.nameTokens.includes(c)&&(r+=8),i&&(r+=20),r}function jS(t,e,n,r,o,i){let s=Dd.get(t);s||(s=new Map,Dd.set(t,s));let a=pe(r,o),c=s.get(e);(c?.metadata!==n||c.searchKeywords!==r?.searchKeywords||c.toolPrefix!==a)&&(c={metadata:n,searchKeywords:r?.searchKeywords,toolPrefix:a},s.set(e,c));let u=i?"withKeywords":"withoutKeywords",d=c[u];return d||(d=n.map(l=>NS(l,e,i&&r?.searchKeywords!==void 0?fa(r,l.originalName,e,o):void 0)),c[u]=d),d}function Nr(t,e,n,r=!0){let o=[],i=cn(e).trim(),s=da(e);if(s.length===0)return o;let a=t.config.settings?.toolPrefix??"server";for(let[c,u]of t.toolMetadata.entries()){if(n&&c!==n)continue;let d=t.config.mcpServers[c];if(!U(d)&&!Te(t,c))for(let l of jS(t,c,u,d,a,r)){let f=LS(l,i,s);f!==null&&o.push({server:c,tool:l.tool,score:f})}}return o.sort((c,u)=>u.score-c.score||c.tool.name.localeCompare(u.tool.name))}function ii(t,e,n){let r=Number.isFinite(e)?Math.max(0,Math.trunc(e)):0,o=Number.isFinite(n)?Math.max(1,Math.trunc(n)):1,i=t.length,s=t.slice(r,r+o),a=r+s.length;return{items:s,total:i,hasMore:a<i,nextOffset:a<i?a:null}}function un(t,e,n){let o=Object.keys(t.config.mcpServers).flatMap(i=>["server","short","mcp"].map(s=>gn(i,s))).filter(i=>!!i&&e.startsWith(`${i}_`)).sort((i,s)=>s.length-i.length).map(i=>e.slice(i.length+1))[0]??e;return Nr(t,o,void 0,!1).slice(0,n).map(i=>i.tool.name)}var FS=HS(import.meta.url),pa=256,zS=300,qS={attackTimeout:50,incubationTimeout:50,timeout:250},VS=1;function KS(t,e,n,r){if(!e)return t;let o=`MCP ${n}/${r}#${VS++}`;return{...t,onprogress:i=>{let s=`${i.progress}${i.total===void 0?"":`/${i.total}`}`;e.notify(i.message?`${o}: ${i.message} (${s})`:`${o}: ${s}`,"info")}}}function Lr(t,e,n){if(!t)return[];if(n)return t.filter(o=>o.name===e);let r=e.replace(/-/g,"_");return t.filter(o=>o.name.replace(/-/g,"_")===r)}function ai(t,e,n){let r=[];for(let[o,i]of t.toolMetadata)if(!U(t.config.mcpServers[o]))for(let s of Lr(i,e,n))r.push({server:o,tool:s});return r}function ci(t,e,n){let r=Me(t,n)??0;return{content:[{type:"text",text:`Server "${n}" not available (last failed ${r}s ago)`}],details:{mode:e,error:"server_backoff",server:n}}}function Nd(t,e){let n=Lr(t,e,!0),r=n.length>0?n:Lr(t,e,!1);return r.length>1?"ambiguous":r[0]}function si(t,e){if(!t)return;let n=e.replace(/-/g,"_"),r=[t.filter(o=>o.name===e),t.filter(o=>o.originalName===e),t.filter(o=>o.name.replace(/-/g,"_")===n),t.filter(o=>o.originalName.replace(/-/g,"_")===n)];for(let[o,i]of r.entries()){if(i.length>1)return"ambiguous";if(i.length===1)return{tool:i[0],precedence:o}}}function Ye(t,e){let n=`Tool "${e}" matches multiple servers. Specify a server.`;return{content:[{type:"text",text:n}],details:{mode:t,error:"ambiguous_tool",requestedTool:e,message:n}}}function dn(t,e){let n=`Server "${e}" is disabled. Run /mcp enable ${e} and /reload to enable it.`;return{content:[{type:"text",text:n}],details:{mode:t,error:"server_disabled",server:e,message:n}}}function ln(t,e,n=`Server "${e}" requires OAuth authentication. Run mcp({ action: "auth-start", server: "${e}" }) to get a browser URL, or /mcp-auth ${e} in an interactive local session.`){return wn(t.config,e,n)}function Ld(t,e,n){return t.config.settings?.authRequiredMessage?`OAuth authentication failed for "${e}": ${n}. ${ln(t,e)}`:`OAuth authentication failed for "${e}": ${n}. Run mcp({ action: "auth-start", server: "${e}" }) to get a browser URL, or /mcp-auth ${e} in an interactive local session.`}function JS(t){try{let e=new URL(t).searchParams.get("redirect_uri");if(!e)return{remote:!1};let n=new URL(e),r=n.hostname.toLowerCase(),o=r==="localhost"||r==="127.0.0.1"||r==="[::1]"||r==="::1",i=Number.parseInt(n.port,10);return{...Number.isInteger(i)?{port:i}:{},remote:!o}}catch{return{remote:!1}}}function WS(t,e){let n=JS(e),r=n.remote?"The provider uses a pre-registered HTTPS callback. Copy its full URL from the browser address bar, even if the destination page reports an error.":n.port?`The redirect URL will use local port ${n.port}. On a remote server it is expected for that localhost page to fail locally; copy the address bar URL anyway.`:"";return[`MCP OAuth required for "${t}".`,"","Open this URL in your local browser:","",e,"","After approving, copy the full callback URL from your browser address bar and send it back with:",`mcp({ action: "auth-complete", server: "${t}", args: { redirectUrl: "PASTE_REDIRECT_URL_HERE" } })`,"",n.remote?"Remote HTTPS callbacks must include the full callback URL so the OAuth state can be checked. JSON-string args remain supported.":'You can also pass just the `code` query parameter as `args: { code: "PASTE_CODE_HERE" }`. JSON-string args remain supported.',r].filter(Boolean).join(`
532
+ `)}async function er(t,e,n){if(t.config.settings?.autoAuth!==!0)return{status:"skipped"};let r=t.config.mcpServers[e];if(!r||U(r)||!Ue(r))return{status:"skipped"};let o;try{o=He(r)}catch(s){let a=s instanceof Error?s.message:String(s);return{status:"failed",message:Ld(t,e,a)}}if(!o)return{status:"skipped"};let i=r.oauth?r.oauth.grantType??"authorization_code":"authorization_code";if(!t.ui&&i!=="client_credentials")return{status:"failed",message:ln(t,e,`Server "${e}" requires OAuth authentication. Run mcp({ action: "auth-start", server: "${e}" }) to get a browser URL, or /mcp-auth ${e} in an interactive local session.`)};try{return t.authStorageOptions?await mt(e,o,r,n?{authStorageOptions:t.authStorageOptions,signal:n,runtime:t.oauthRuntime}:{authStorageOptions:t.authStorageOptions,runtime:t.oauthRuntime}):n?await mt(e,o,r,{signal:n,runtime:t.oauthRuntime}):await mt(e,o,r,{runtime:t.oauthRuntime}),{status:"success"}}catch(s){if(ie(s,n))throw s;let a=s instanceof Error?s.message:String(s);return{status:"failed",message:Ld(t,e,a)}}}function jd(t){let e=t.completedUiSessions;if(e.length===0)return{content:[{type:"text",text:"No UI session messages available."}],details:{sessions:0}};let n=[];n.push(`UI Session Messages (${e.length} session${e.length>1?"s":""}):
533
+ `);let r=[],o=e.flatMap(c=>c.messages.intents),i=e.flatMap(c=>c.messages.contexts),s=[];for(let c of e){let u=c.completedAt.toLocaleTimeString();n.push(`
534
+ ## ${c.serverName} / ${c.toolName} (${u}, ${c.reason})`);let d=[];for(let p of c.messages.prompts){r.push(p);let g=vi(p);g?s.push(g):d.push(p)}if(d.length>0){n.push(`
535
+ ### Prompts:`);for(let p of d)n.push(`- ${p}`)}let l=[...c.messages.intents,...c.messages.prompts.map(p=>vi(p)).filter(p=>!!p).map(p=>({intent:p.intent,params:p.params}))];if(l.length>0){n.push(`
536
+ ### Intents:`);for(let p of l){let g=p.params?` (${JSON.stringify(p.params)})`:"";n.push(`- ${p.intent}${g}`)}}let f=c.messages.contexts;if(f.length>0){n.push(`
537
+ ### Context updates:`);for(let p of f)n.push(`- ${p.summary}${p.truncated?" (truncated)":""}`)}if(c.messages.notifications.length>0){n.push(`
538
+ ### Notifications:`);for(let p of c.messages.notifications)n.push(`- ${p}`)}}let a=e.length;return t.completedUiSessions=[],{content:[{type:"text",text:n.join(`
539
+ `)}],details:{sessions:a,prompts:r,intents:[...o,...s.map(({intent:c,params:u})=>({intent:c,params:u}))],contexts:i,handoffs:s,cleared:!0}}}function Bd(t){let e=[];for(let a of Object.keys(t.config.mcpServers)){let c=t.config.mcpServers[a],u=U(c),d=u?void 0:t.manager.getConnection(a),l=u?void 0:t.toolMetadata.get(a),f=u?null:Me(t,a),p=u?"disabled":"not connected";!u&&d?.status==="connected"?p="connected":!u&&d?.status==="needs-auth"?p="needs-auth":!u&&f!==null?p="failed":!u&&l!==void 0&&(p="cached");let g=p==="failed"?0:l?.length??0;e.push({name:a,status:p,toolCount:g,failedAgo:f,...u?{disabled:!0}:{}})}let n=e.filter(a=>a.disabled).length,r=e.filter(a=>!a.disabled),o=r.reduce((a,c)=>a+c.toolCount,0),i=r.filter(a=>a.status==="connected").length,s=`MCP: ${i}/${r.length} servers, ${o} tools`;n>0&&(s+=` (${n} disabled)`),s+=`
540
+
541
+ `;for(let a of e){if(a.disabled){s+=`\u2298 ${a.name} (disabled)
542
+ `;continue}if(a.status==="connected"){s+=`\u2713 ${a.name} (${a.toolCount} tools)
543
+ `;continue}if(a.status==="needs-auth"){s+=`\u26A0 ${a.name} (needs auth)
544
+ `;continue}if(a.status==="cached"){s+=`\u25CB ${a.name} (${a.toolCount} tools, cached)
545
+ `;continue}if(a.status==="failed"){s+=`\u2717 ${a.name} (failed ${a.failedAgo??0}s ago)
546
+ `;continue}s+=`\u25CB ${a.name} (not connected)
547
+ `}return e.length>0&&(s+=`
548
+ mcp({ server: "name" }) to list tools, mcp({ search: "..." }) to search`),{content:[{type:"text",text:s.trim()}],details:{mode:"status",servers:e,totalTools:o,connectedCount:i,disabledCount:n}}}async function ga(t,e,n){let r=te(t.owner?.signal,n);D(r);let o=t.config.mcpServers[e];if(!o)return{content:[{type:"text",text:`Server "${e}" not found. Use mcp({}) to see available servers.`}],details:{mode:"auth-start",error:"not_found",server:e}};if(U(o))return dn("auth-start",e);try{let i=He(o);if(!i||!Ue(o))return{content:[{type:"text",text:`Server "${e}" is not configured for OAuth over HTTP.`}],details:{mode:"auth-start",error:"oauth_not_supported",server:e}};let{authorizationUrl:s}=t.authStorageOptions?r?await Ln(e,i,o,{authStorageOptions:t.authStorageOptions,signal:r,runtime:t.oauthRuntime}):await Ln(e,i,o,{authStorageOptions:t.authStorageOptions,runtime:t.oauthRuntime}):r?await Ln(e,i,o,{signal:r,runtime:t.oauthRuntime}):await Ln(e,i,o,{runtime:t.oauthRuntime});return s?{content:[{type:"text",text:WS(e,s)}],details:{mode:"auth-start",server:e,authorizationUrl:s}}:{content:[{type:"text",text:`OAuth authentication successful for "${e}".`}],details:{mode:"auth-start",server:e,authenticated:!0}}}catch(i){let s=i instanceof Error?i.message:String(i);return{content:[{type:"text",text:`Failed to start OAuth for "${e}": ${s}`}],details:{mode:"auth-start",error:"auth_start_failed",server:e,message:s}}}}async function ma(t,e,n,r){let o=te(t.owner?.signal,r);D(o);let i=t.config.mcpServers[e];if(!i)return{content:[{type:"text",text:`Server "${e}" not found. Use mcp({}) to see available servers.`}],details:{mode:"auth-complete",error:"not_found",server:e}};if(U(i))return dn("auth-complete",e);try{let s=t.authStorageOptions?o?await br(e,n,{authStorageOptions:t.authStorageOptions,signal:o,runtime:t.oauthRuntime}):await br(e,n,{authStorageOptions:t.authStorageOptions,runtime:t.oauthRuntime}):o?await br(e,n,{signal:o,runtime:t.oauthRuntime}):await br(e,n,{runtime:t.oauthRuntime});return s!=="authenticated"?{content:[{type:"text",text:`OAuth authentication did not complete for "${e}".`}],details:{mode:"auth-complete",error:"not_authenticated",server:e,status:s}}:(await t.manager.close(e),Ae(t,e,"auth-complete"),ge(t),{content:[{type:"text",text:`OAuth authentication successful for "${e}". Run mcp({ connect: "${e}" }) to connect with the new token.`}],details:{mode:"auth-complete",server:e,authenticated:!0}})}catch(s){let a=s instanceof Error?s.message:String(s);return{content:[{type:"text",text:`Failed to complete OAuth for "${e}": ${a}`}],details:{mode:"auth-complete",error:"auth_complete_failed",server:e,message:a}}}}function Hd(t,e){let n=ai(t,e,!0).filter(u=>!Te(t,u.server));if(n.length>1||n.length===0&&ai(t,e,!1).filter(u=>!Te(t,u.server)).length>1)return Ye("describe",e);let r=n[0]?.server,o=n[0]?.tool,i,s;if(!o)for(let[u,d]of t.toolMetadata.entries()){let l=Ar(d,e);if(l){if(U(t.config.mcpServers[u])){i??=u;continue}if(Te(t,u)){s??=u;continue}r=u,o=l;break}}if(!r||!o){if(i)return dn("describe",i);if(s)return ci(t,"describe",s);let u=un(t,e,5),d=u.length>0?` Did you mean: ${u.join(", ")}`:"";return{content:[{type:"text",text:`Tool "${e}" not found. Use mcp({ search: "..." }) to search.${d}`}],details:{mode:"describe",error:"tool_not_found",requestedTool:e,suggestions:u}}}let a=Xn(t.config,r,o,t.toolMetadata)?" (requires approval)":"",c=`${o.name}${a}
549
+ `;if(c+=`Server: ${r}
550
+ `,o.resourceUri&&(c+=`Type: Resource (reads from ${o.resourceUri})
551
+ `),c+=`
552
+ ${o.description||"(no description)"}
553
+ `,o.inputSchema&&!o.resourceUri){let u=Dr(o.inputSchema);c+=u===null?`
554
+ Parameters:
555
+ ${rt(o.inputSchema)}`:`
556
+ Shape:
557
+ ${u}`}else o.resourceUri?c+=`
558
+ No parameters required (resource tool).`:c+=`
559
+ No parameters defined.`;return{content:[{type:"text",text:c.trim()}],details:{mode:"describe",tool:o,server:r}}}function Fd(t,e,n,r,o,i=12,s=0){let a=o!==!1;if(r&&U(t.config.mcpServers[r]))return dn("search",r);if(r&&Te(t,r))return ci(t,"search",r);let c;if(n){let l;try{if(e.length>pa)return{content:[{type:"text",text:`Regex query is too long; maximum length is ${pa} characters.`}],details:{mode:"search",error:"query_too_long",query:e,maxLength:pa}};l=new RegExp(e,"i");let p;try{let{checkSync:g}=FS("recheck");p=g(e,"i",qS)}catch(g){let y=g instanceof Error?g.message:String(g);return{content:[{type:"text",text:"Regex query rejected because safety analysis failed."}],details:{mode:"search",error:"unsafe_pattern",query:e,reason:y}}}if(p.status!=="safe")return{content:[{type:"text",text:`Regex query rejected as unsafe (${p.status}).`}],details:{mode:"search",error:"unsafe_pattern",query:e,safetyStatus:p.status}}}catch{return{content:[{type:"text",text:`Invalid regex: ${e}`}],details:{mode:"search",error:"invalid_pattern",query:e}}}c=[];let f=t.config.settings?.toolPrefix??"server";for(let[p,g]of t.toolMetadata.entries()){let y=t.config.mcpServers[p];if(!U(y)&&!Te(t,p)&&!(r&&p!==r))for(let w of g)(l.test(w.name)||l.test(w.description)||fa(y,w.originalName,p,f).some(v=>l.test(v)))&&c.push({server:p,tool:w,score:0})}}else if(e.trim().length===0){if(!r)return{content:[{type:"text",text:"Search query cannot be empty"}],details:{mode:"search",error:"empty_query"}};c=(t.toolMetadata.get(r)??[]).map(l=>({server:r,tool:l,score:0})).sort((l,f)=>l.tool.name.localeCompare(f.tool.name))}else c=Nr(t,e,r);let u=ii(c,s,i);if(u.total===0){let l=r?t.config.mcpServers[r]&&t.manager.isConnecting(r)?[r]:[]:Object.keys(t.config.mcpServers).filter(g=>!U(t.config.mcpServers[g])&&t.manager.isConnecting(g)).sort((g,y)=>g.localeCompare(y)),f=r?`No tools matching "${e}" in "${r}"`:`No tools matching "${e}"`,p=l.length===1?` Server "${l[0]}" is still connecting; retry in a moment.`:l.length>1?` Servers ${l.map(g=>`"${g}"`).join(", ")} are still connecting; retry in a moment.`:"";return{content:[{type:"text",text:`${f}${p}`}],details:{mode:"search",matches:[],count:0,hasMore:!1,nextOffset:null,query:e,...l.length>0?{connectingServers:l}:{}}}}let d=`Found ${u.total} tool${u.total===1?"":"s"} matching "${e}":
560
+
561
+ `;for(let l of u.items){let f=Xn(t.config,l.server,l.tool,t.toolMetadata)?" (requires approval)":"";if(a){if(d+=`${l.tool.name}${f}
562
+ `,d+=` ${l.tool.description||"(no description)"}
563
+ `,l.tool.inputSchema&&!l.tool.resourceUri){let p=Dr(l.tool.inputSchema);d+=p===null?`
564
+ Parameters:
565
+ ${rt(l.tool.inputSchema," ")}
566
+ `:`
567
+ Shape:
568
+ ${p.split(`
569
+ `).map(g=>` ${g}`).join(`
570
+ `)}
571
+ `}else l.tool.resourceUri&&(d+=` No parameters (resource tool).
572
+ `);d+=`
573
+ `}else d+=`- ${l.tool.name}${f}`,l.tool.description&&(d+=` - ${Ve(l.tool.description,50)}`),d+=`
574
+ `}return u.hasMore&&(d+=`
575
+ ${u.items.length} of ${u.total} \u2014 offset: ${u.nextOffset} for more
576
+ `),{content:[{type:"text",text:d.trim()}],details:{mode:"search",matches:u.items.map(l=>({server:l.server,tool:l.tool.name,score:l.score})),count:u.total,hasMore:u.hasMore,nextOffset:u.nextOffset,query:e}}}function ha(t,e){let n=t.config.mcpServers[e];if(!n)return{content:[{type:"text",text:`Server "${e}" not found. Use mcp({}) to see available servers.`}],details:{mode:"list",server:e,tools:[],count:0,error:"not_found"}};if(U(n))return dn("list",e);let r=t.toolMetadata.get(e),o=r?.map(l=>l.name)??[],i=t.manager.getConnection(e);if(Te(t,e))return{...ci(t,"list",e),details:{mode:"list",server:e,tools:[],count:0,error:"server_backoff"}};let s=t.serverInstructions.get(e),a="";if(s){let l=Ve(s,zS);a=`
577
+
578
+ Server instructions:
579
+ ${l}`,l!==s&&(a+=`
580
+ Use mcp({ instructions: "${e}" }) for the full text.`)}if(o.length===0)return i?.status==="connected"?{content:[{type:"text",text:`Server "${e}" has no tools.${a}`}],details:{mode:"list",server:e,tools:[],count:0,hasInstructions:!!s}}:r!==void 0?{content:[{type:"text",text:`Server "${e}" has no cached tools (not connected).${a}`}],details:{mode:"list",server:e,tools:[],count:0,cached:!0,hasInstructions:!!s}}:{content:[{type:"text",text:`Server "${e}" is configured but not connected. Use mcp({ connect: "${e}" }) or /mcp reconnect ${e} to retry.${a}`}],details:{mode:"list",server:e,tools:[],count:0,error:"not_connected",hasInstructions:!!s}};let c=i?.status==="connected"?"":" (not connected, cached)",u=`${e} (${o.length} tools${c}):
581
+
582
+ `,d=new Map;if(r)for(let l of r)d.set(l.name,l.description);for(let l of o){let f=d.get(l)??"",p=Ve(f,50);u+=`- ${l}`,p&&(u+=` - ${p}`),u+=`
583
+ `}return u+=a,{content:[{type:"text",text:u.trim()}],details:{mode:"list",server:e,tools:o,count:o.length,hasInstructions:!!s}}}function zd(t,e){let n=t.config.mcpServers[e];if(!n)return{content:[{type:"text",text:`Server "${e}" not found. Use mcp({}) to see available servers.`}],details:{mode:"instructions",server:e,error:"not_found"}};if(U(n))return dn("instructions",e);if(Te(t,e))return ci(t,"instructions",e);let r=t.serverInstructions.get(e);return r?{content:[{type:"text",text:`${e} instructions:
584
+
585
+ ${r}`}],details:{mode:"instructions",server:e,length:r.length}}:t.manager.getConnection(e)?.status==="connected"?{content:[{type:"text",text:`Server "${e}" does not provide instructions.`}],details:{mode:"instructions",server:e,error:"no_instructions"}}:{content:[{type:"text",text:`No instructions cached for "${e}". Use mcp({ connect: "${e}" }) to connect and refresh.`}],details:{mode:"instructions",server:e,error:"not_connected"}}}async function qd(t,e,n){let r=te(t.owner?.signal,n);D(r);let o=t.config.mcpServers[e];if(!o)return{content:[{type:"text",text:`Server "${e}" not found. Use mcp({}) to see available servers.`}],details:{mode:"connect",error:"not_found",server:e}};if(U(o))return dn("connect",e);try{t.ui&&t.ui.setStatus("mcp",Bt(t.config,`connecting to ${e}...`));let i=t.manager.getConnection(e),s=i?.status==="connected"?await t.manager.reconnect(e,o,i,r):await t.manager.connect(e,o,r);if(s.status==="needs-auth"){let d=await er(t,e,r);if(d.status==="failed")return{content:[{type:"text",text:d.message}],details:{mode:"connect",error:"auth_required",server:e,message:d.message}};if(d.status==="success"&&(await t.manager.close(e),D(r),s=r?await t.manager.connect(e,o,r):await t.manager.connect(e,o)),s.status==="needs-auth"){let l=ln(t,e);return{content:[{type:"text",text:l}],details:{mode:"connect",error:"auth_required",server:e,message:l}}}}let a=t.config.settings?.toolPrefix??"server",{metadata:c}=nn(s.tools,s.resources,o,e,a,t.config.mcpServers,t.toolMetadata);return t.toolMetadata.set(e,c),s.promptDiscoveryFailed||(t.promptMetadata?.set(e,ut(e,s.prompts??[],a,o)),t.promptMetadataLive?.add(e)),s.instructions?t.serverInstructions.set(e,s.instructions):t.serverInstructions.delete(e),ot(t,e),Ae(t,e,"proxy-connect")||Ge(t,e,"proxy-connect"),yt(t,e),ge(t),ha(t,e)}catch(i){let s=i instanceof Error?i.message:String(i);return ie(i,r)||ht(t,e,s),ge(t),{content:[{type:"text",text:`Failed to connect to "${e}": ${s}`}],details:{mode:"connect",error:ie(i,r)?"aborted":"connect_failed",server:e,message:s}}}}async function tr(t,e,n,r,o,i,s){let a=te(t.owner?.signal,i);D(a);let c=r,u,d=!1,l=t.config.settings?.toolPrefix??"server",f=(h,M)=>{if(!M){let E=`Server "${h}" is disabled. Run /mcp enable ${h} and /reload to enable it.`;return{content:[{type:"text",text:E}],details:{mode:"call",error:"server_disabled",server:h,requestedTool:e,message:E}}}let P=`Server "${h}" is disabled. Run /mcp enable ${h} and /reload to enable it.`,C=M.resourceUri?{server:h,resourceUri:M.resourceUri}:{server:h,tool:M.originalName};return{content:[{type:"text",text:P}],details:{mode:"call",error:"server_disabled",...C,message:P}}};if(c&&!t.config.mcpServers[c])return{content:[{type:"text",text:`Server "${c}" not found. Use mcp({}) to see available servers.`}],details:{mode:"call",error:"server_not_found",server:c,requestedTool:e}};if(c){let h=si(t.toolMetadata.get(c),e);if(h==="ambiguous")return Ye("call",e);if(u=h?.tool,U(t.config.mcpServers[c]))return f(c,u)}else{let h=ai(t,e,!0);if(h.length>1||h.length===0&&ai(t,e,!1).length>1)return Ye("call",e);let M;for(let[P,C]of t.toolMetadata.entries()){let E=C.find(L=>L.name===e);if(E){if(U(t.config.mcpServers[P])){M??={serverName:P,toolMeta:E};continue}c=P,u=E;break}}if(!u&&!M)for(let[P,C]of t.toolMetadata.entries()){let E=Ar(C,e);if(E){if(U(t.config.mcpServers[P])){M??={serverName:P,toolMeta:E};continue}c=P,u=E;break}}if(!u&&M)return f(M.serverName,M.toolMeta)}if(c&&!u)if(await it(t,c,a))if(r){let M=si(t.toolMetadata.get(c),e);if(M==="ambiguous")return Ye("call",e);u=M?.tool}else{let M=Nd(t.toolMetadata.get(c),e);if(M==="ambiguous")return Ye("call",e);u=M}else{if(t.manager.getConnection(c)?.status==="needs-auth"){if(!d){d=!0;let P=await er(t,c,a);if(P.status==="failed")return{content:[{type:"text",text:P.message}],details:{mode:"call",error:"auth_required",server:c,requestedTool:e,message:P.message}};if(P.status==="success"&&(await t.manager.close(c),Ae(t,c),await it(t,c,a))){let E=si(t.toolMetadata.get(c),e);if(E==="ambiguous")return Ye("call",e);if(u=E?.tool,!u){let L=un(t,e,5),H=L.length>0?` Did you mean: ${L.join(", ")}`:"";return{content:[{type:"text",text:`Tool "${e}" not found on "${c}" after reconnect.${H}`}],details:{mode:"call",error:"tool_not_found_after_reconnect",server:c,requestedTool:e,suggestions:L}}}}}if(!u&&t.manager.getConnection(c)?.status==="needs-auth"){let P=ln(t,c);return{content:[{type:"text",text:P}],details:{mode:"call",error:"auth_required",server:c,requestedTool:e,message:P}}}}if(!u){let P=Me(t,c);if(P!==null)return{content:[{type:"text",text:`Server "${c}" not available (last failed ${P}s ago)`}],details:{mode:"call",error:"server_backoff",server:c,requestedTool:e}}}}let p;if(!c&&!u&&l!=="none"){let h=[],M=[],P=Object.keys(t.config.mcpServers).filter(E=>!U(t.config.mcpServers[E])).map(E=>({name:E,prefix:gn(E,l)})).filter(E=>E.prefix&&e.startsWith(E.prefix+"_")).sort((E,L)=>L.prefix.length-E.prefix.length);for(let{name:E}of P){let L=t.manager.getConnection(E);if(Me(t,E)!==null&&L?.status!=="needs-auth")continue;let $=await it(t,E,a);if(!$&&t.manager.getConnection(E)?.status==="needs-auth"&&!d){d=!0;let F=await er(t,E,a);if(F.status==="failed")return{content:[{type:"text",text:F.message}],details:{mode:"call",error:"auth_required",server:E,requestedTool:e,message:F.message}};F.status==="success"&&(await t.manager.close(E),Ae(t,E),$=await it(t,E,a))}if(!$)continue;p||(p=E);let O=t.toolMetadata.get(E),T=Lr(O,e,!0);if(T.length>1)return Ye("call",e);if(T.length===1){h.push({serverName:E,toolMeta:T[0]});continue}let G=Lr(O,e,!1);if(G.length>1)return Ye("call",e);G.length===1&&M.push({serverName:E,toolMeta:G[0]})}let C=h.length>0?h:M;if(C.length>1)return Ye("call",e);C.length===1&&(c=C[0].serverName,u=C[0].toolMeta)}if(!c||!u){if(r?void 0:o?.().find(L=>L.name===e&&L.name!=="mcp"))return{content:[{type:"text",text:`"${e}" is a native Pi tool. Call ${e} directly instead of using mcp({ tool: "${e}" }).`}],details:{mode:"call",error:"native_tool",requestedTool:e}};let M=c??p,P=M?js(t,M):[],C=`Tool "${e}" not found.`;P.length>0?C+=` Server "${M}" has: ${P.join(", ")}`:C+=' Use mcp({ search: "..." }) to search.';let E=un(t,e,5);return E.length>0&&(C+=` Did you mean: ${E.join(", ")}`),{content:[{type:"text",text:C}],details:{mode:"call",error:"tool_not_found",requestedTool:e,hintServer:M,suggestions:E}}}let g=u.resourceUri?{server:c,resourceUri:u.resourceUri}:{server:c,tool:u.originalName},y=t.manager.getConnection(c);if(y?.status==="needs-auth"){if(!d){d=!0;let h=await er(t,c,a);if(h.status==="failed")return{content:[{type:"text",text:h.message}],details:{mode:"call",error:"auth_required",...g,message:h.message}};h.status==="success"&&(await t.manager.close(c),Ae(t,c),y=t.manager.getConnection(c))}if(y?.status==="needs-auth"){let h=ln(t,c);return{content:[{type:"text",text:h}],details:{mode:"call",error:"auth_required",...g,message:h}}}}if(!y||y.status!=="connected"){let h=Me(t,c);if(h!==null)return{content:[{type:"text",text:`Server "${c}" not available (last failed ${h}s ago)`}],details:{mode:"call",error:"server_backoff",...g}};let M=t.config.mcpServers[c];if(!M)return{content:[{type:"text",text:`Server "${c}" not connected`}],details:{mode:"call",error:"server_not_connected",...g}};try{if(t.ui&&t.ui.setStatus("mcp",Bt(t.config,`connecting to ${c}...`)),y=await t.manager.connect(c,M,a),y.status==="needs-auth"){if(!d){d=!0;let C=await er(t,c,a);if(C.status==="failed")return{content:[{type:"text",text:C.message}],details:{mode:"call",error:"auth_required",...g,message:C.message}};C.status==="success"&&(await t.manager.close(c),y=await t.manager.connect(c,M,a))}if(y.status==="needs-auth"){let C=ln(t,c);return{content:[{type:"text",text:C}],details:{mode:"call",error:"auth_required",...g,message:C}}}}if(on(t,c),ot(t,c),Ae(t,c,"proxy-call-reconnect")||Ge(t,c,"proxy-call-reconnect"),yt(t,c),ge(t),r){let C=si(t.toolMetadata.get(c),e);if(C==="ambiguous")return Ye("call",e);u=C?.tool}else{let C=Nd(t.toolMetadata.get(c),e);if(C==="ambiguous")return Ye("call",e);u=C}if(!u){let C=js(t,c),E=C.length>0?`Available tools on "${c}": ${C.join(", ")}`:`Server "${c}" has no tools.`,L=un(t,e,5),H=L.length>0?` Did you mean: ${L.join(", ")}`:"";return{content:[{type:"text",text:`Tool "${e}" not found on "${c}" after reconnect. ${E}${H}`}],details:{mode:"call",error:"tool_not_found_after_reconnect",server:c,requestedTool:e,suggestions:L}}}}catch(P){let C=P instanceof Error?P.message:String(P);return ie(P,a)||ht(t,c,C),ge(t),{content:[{type:"text",text:`Failed to connect to "${c}": ${C}`}],details:{mode:"call",error:ie(P,a)?"aborted":"connect_failed",...g,message:C}}}}if(U(t.config.mcpServers[c]))return f(c,u);let w=u.resourceUri?n??{}:Sn(n),b=await Qn(t,c,u,w,a,s??(u.resourceUri?"resource":"proxy"));if(b.ok===!1){let h=b.reason==="denied";return{content:[{type:"text",text:h?`The user declined approval to run MCP tool "${u.originalName}" on server "${c}".`:`MCP tool "${u.originalName}" on server "${c}" is approval-gated and requires an interactive session.`}],details:{mode:"call",error:h?"approval_denied":"approval_required",server:c,tool:u.originalName}}}let v=null,m=KS(t.manager.getRequestOptions?.(c,a)??(a?{signal:a}:void 0),t.ui,c,u.originalName),S=Yn(t.config.settings),R=async()=>{let h=t.manager.getConnection(c);if(h?.status==="connected")return h;if(!d){d=!0;let M=await er(t,c,a);if(M.status==="failed")throw new We(c,M.message);if(M.status==="success"){let P=t.config.mcpServers[c];if(!P)return;let C=t.manager.getConnection(c);return C?.status==="connected"?C:(C?.status==="needs-auth"&&await t.manager.close(c),Ae(t,c),y=await t.manager.connect(c,P,a),y)}}return t.manager.getConnection(c)};try{if(t.manager.touch(c),t.manager.incrementInFlight(c),u.resourceUri){let E=await ct({manager:t.manager,config:t.config,...a?{signal:a}:{},onNeedsAuth:R},c,$=>$.client.readResource({uri:u.resourceUri},m)),L=Xo(E.contents??[],t.owner?.signal),H=await Le(L.length>0?L:[{type:"text",text:"(empty resource)"}],S);return{content:H.content,details:{mode:"call",...g,...Ne(H)}}}v=u.uiResourceUri?await ri(t,{serverName:c,toolName:u.originalName,toolArgs:w,uiResourceUri:u.uiResourceUri,...u.uiStreamMode!==void 0?{streamMode:u.uiStreamMode}:{},...i?{signal:i}:{},onNeedsAuth:R}):null;let h=await ct({manager:t.manager,config:t.config,...a?{signal:a}:{},onNeedsAuth:R},c,E=>ve(E.client.callTool({name:u.originalName,arguments:w,_meta:v?.requestMeta},m),a));if(u.uiResourceUri){if(v?.sendToolResult(h),h.isError){let O=h.content??[],T=Wn(O,t.owner?.signal),G=T.length>0?T:[{type:"text",text:"(empty result)"}],F=u.inputSchema?`
586
+
587
+ Expected parameters:
588
+ ${rt(u.inputSchema)}`:"",Oe=await Le(G,{...S,prefix:"Error: ",suffix:F,emptyTextFallback:"Tool execution failed",rawMcpResult:h});return{content:Oe.content,details:{mode:"call",error:"tool_error",...g,...Ne(Oe)}}}let E=Er(h,t.owner?.signal),L=E.length>0?E:[{type:"text",text:"(empty result)"}],H=ni(v),$=await Le(L,{...S,suffix:`
589
+
590
+ ${H.message}`,rawMcpResult:h});return{content:$.content,details:{mode:"call",...Ne($),...g,uiOpen:H.uiOpen,uiViewer:H.uiViewer,uiUrl:H.uiUrl}}}if(h.isError){let E=h.content??[],L=Wn(E,t.owner?.signal),H=L.length>0?L:[{type:"text",text:"(empty result)"}],$=u.inputSchema?`
591
+
592
+ Expected parameters:
593
+ ${rt(u.inputSchema)}`:"",O=await Le(H,{...S,prefix:"Error: ",suffix:$,emptyTextFallback:"Tool execution failed",rawMcpResult:h});return{content:O.content,details:{mode:"call",error:"tool_error",...g,...Ne(O)}}}let M=Er(h,t.owner?.signal),P=M.length>0?M:[{type:"text",text:"(empty result)"}],C=await Le(P,{...S,rawMcpResult:h});return{content:C.content,details:{mode:"call",...Ne(C),...g}}}catch(h){if(h instanceof We){let E=h.authMessage??ln(t,c);return v?.sendToolCancelled(E),{content:[{type:"text",text:E}],details:{mode:"call",error:"auth_required",...g,message:E,autoAuthAttempted:d}}}if(h instanceof BS){let E=await t.manager.handleUrlElicitationRequired(c,h),L=E==="accept"?"The original MCP tool did not run. Complete the opened browser interaction, then retry the tool.":`The URL interaction was ${E==="decline"?"declined":"cancelled"}.`;return v?.sendToolCancelled(L),{content:[{type:"text",text:L}],details:{mode:"call",error:"url_elicitation_required",...g,action:E}}}let M=h instanceof Error?h.message:String(h);v?.sendToolCancelled(M);let P=u.inputSchema?`
594
+
595
+ Expected parameters:
596
+ ${rt(u.inputSchema)}`:"",C=await Le([{type:"text",text:M}],{...S,prefix:"Failed to call tool: ",suffix:P});return{content:C.content,details:{mode:"call",error:ie(h,a)?"aborted":"call_failed",...g,message:C.outputGuard?"output truncated; see outputGuard.fullOutputPath":M,...Ne(C)}}}finally{v?.reused&&v.close(),t.manager.decrementInFlight(c),t.manager.touch(c)}}be();import{Text as jr,truncateToWidth as nr,visibleWidth as Vd}from"@earendil-works/pi-tui";var Wd={fg:(t,e)=>e},Sa=1500,GS=240,Gd=3,YS=1,XS=8e3,QS=8,ui=class{render(){return[]}invalidate(){}},ya=class{constructor(e,n,r,o){this.title=e;this.inputPreview=n;this.display=r;this.theme=o}title;inputPreview;display;theme;rendered=null;render(e){let n=Math.max(1,Math.floor(e));if(this.rendered?.width===n)return this.rendered.lines;let r=this.display.lines.filter((c,u,d)=>!(this.display.truncated&&u===d.length-1&&c==="\u2026")),i=(r.length>0?r:[""]).map((c,u)=>`${u===0?this.renderPrefix(n):""}${this.theme.fg("toolOutput",c)}`),s=this.display.truncated||i.some(c=>Vd(c)>n),a=i.map((c,u)=>{let d=s&&u===i.length-1?" \u2026 (Ctrl+O to expand)":"";if(!d)return nr(c,n,"\u2026");if(n>=d.length+20)return`${nr(c,n-d.length,"\u2026")}${this.theme.fg("muted",d)}`;let l=" (Ctrl+O)";return n>=l.length+5?`${nr(c,n-l.length,"\u2026")}${this.theme.fg("muted",l)}`:nr(this.theme.fg("muted",l.trim()),n,"\u2026")});return this.rendered={width:n,lines:a},a}invalidate(){this.rendered=null}renderPrefix(e){if(!this.title)return"";let n=" \u2192 ";if(!this.inputPreview)return`${this.theme.fg("toolTitle",this.title)}${n}`;let r=Math.max(12,Math.floor(e*.55)),o=Vd(this.title),i=Math.max(0,r-o-1);if(i<=3)return`${this.theme.fg("toolTitle",nr(this.title,r,"\u2026"))}${n}`;let s=nr(this.inputPreview,i,"\u2026");return`${this.theme.fg("toolTitle",this.title)} ${this.theme.fg("muted",s)}${n}`}},va=class{constructor(e,n,r,o,i,s=!1){this.text=e;this.expanded=n;this.maxCollapsedLines=r;this.preTruncated=s;this.fullText=new jr(e,0,0),this.footerText=new jr(`${o}
597
+ ${i}`,0,0)}text;expanded;maxCollapsedLines;preTruncated;fullText;footerText;collapsedText=null;collapsedRender=null;render(e){if(this.expanded)return this.fullText.render(e);let r=Math.max(1,Math.floor(e))*(this.maxCollapsedLines+1)*QS;if(!this.collapsedText||this.collapsedText.charBudget!==r){let s=this.text.length>r?this.text.slice(0,r):this.text;this.collapsedText={charBudget:r,fullyIncluded:s===this.text,text:new jr(s,0,0)},this.collapsedRender=null}let o=this.collapsedText.text.render(e);if(!this.preTruncated&&this.collapsedText.fullyIncluded&&o.length<=this.maxCollapsedLines)return o;if(this.collapsedRender?.width===e&&this.collapsedRender.charBudget===r)return this.collapsedRender.lines;let i=[...o.slice(0,this.maxCollapsedLines),...this.footerText.render(e)];return this.collapsedRender={width:e,charBudget:r,lines:i},i}invalidate(){this.fullText.invalidate(),this.footerText.invalidate(),this.collapsedText?.text.invalidate(),this.collapsedRender=null}};function rr(t,e){return t.length<=e?t:`${t.slice(0,Math.max(0,e-1))}\u2026`}function Yd(t,e){if(typeof t=="string")try{return rr(JSON.stringify(JSON.parse(t),null,2),e)}catch{return rr(t,e)}try{return rr(JSON.stringify(t,null,2),e)}catch{return rr(String(t),e)}}function ZS(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)&&Object.keys(t).length>0}function ew(t,e=Sa){if(t.action==="ui-messages")return[`mcp ${t.action}`];if(t.tool){let r=[`mcp call ${t.server?`${t.tool} @ ${t.server}`:t.tool}`];return t.args&&r.push(Yd(t.args,e)),r}if(t.connect)return[`mcp connect ${t.connect}`];if(t.describe)return[`mcp describe ${t.describe}`];if(t.search){let n=`mcp search ${t.search}`;return t.server&&(n+=` @ ${t.server}`),t.regex===!0&&(n+=" (regex)"),t.includeSchemas===!1&&(n+=" (schemas hidden)"),[n]}return t.server?[`mcp list ${t.server}`]:t.action?[`mcp ${t.action}`]:["mcp status"]}function tw(t,e,n=Sa){return ZS(e)?[t,Yd(e,n)]:[t]}function nw(t,e=Sa){return["mcpScript",rr(t.code,e)]}function Xd(t,e){let n=e??Wd,[r="mcp",...o]=t,i=n.fg("toolTitle",n.bold?n.bold(r):r),s=o.map(a=>n.fg("muted",a));return new jr([i,...s].join(`
598
+ `),0,0)}function rw(t,e=GS){return rr(t.slice(1).join(" ").replace(/\s+/g," ").trim(),e)}function fn(t){let e=t?.toolResultRendering==="boxed"?"boxed":"compact",n=t?.collapsedResultLines;return{resultRendering:e,collapsedResultLines:n===1||n===2||n===3?n:e==="boxed"?Gd:YS}}function Qd(t,e){return t.resultRendering==="compact"&&e!==void 0&&e.isPartial===!1&&e.expanded!==!0&&e.isError!==!0}function Zd(t,e,n,r){return n?.state&&(n.state.compactTitle=t[0]??"mcp",n.state.compactInputPreview=rw(t)),Qd(r,n)?new ui:Xd(t,e)}function li(t){return(e,n,r)=>Zd(ew(e),n,r,t)}function ef(t,e=fn()){return(n,r,o)=>Zd(tw(t,n),r,o,e)}function tf(t=fn()){return(e,n,r)=>Qd(t,r)?new ui:Xd(nw(e),n)}function ow(t){return t.type==="text"?t.text.split(`
599
+ `):[`[image: ${t.mimeType}]`]}function iw(t,e,n){if(t.length===0)return{lines:["(empty result)"],truncated:!1};let r=[],o=n,i=!1,s=a=>{if(r.length===0){let c=Math.min(a.length,o);if(a.slice(0,c).trim()==="")return a.length>=o?(i=!0,o=0,!1):(o-=a.length+1,!0)}return r.length>=e||o<=0?(i=!0,!1):a.length>o?(r.push(a.slice(0,o)),i=!0,o=0,!1):(r.push(a),o-=a.length+1,!0)};for(let a of t){if(a.type!=="text"){if(!s(`[image: ${a.mimeType}]`))break;continue}let c=0;for(;c<=a.text.length;){let u=a.text.indexOf(`
600
+ `,c),d=u===-1?a.text.slice(c):a.text.slice(c,u);if(!s(d)||u===-1)break;c=u+1}if(i)break}return r.length===0&&r.push(i?"(leading blank output omitted)":""),i&&r.length>=e&&r.push("\u2026"),{lines:r,truncated:i}}function Kd(t){if(t?.mode!=="call")return null;let e=typeof t.server=="string"?t.server:typeof t.hintServer=="string"?t.hintServer:null;return e?typeof t.tool=="string"?`MCP ${e}/${t.tool}`:typeof t.resourceUri=="string"?`MCP ${e} resource ${t.resourceUri}`:typeof t.requestedTool=="string"?`MCP ${e}/${t.requestedTool}`:null:null}function Jd(t,e,n=Gd,r=XS){if(!e)return iw(t.content,n,r);let o=t.content.flatMap(ow);return{lines:o.length>0?o:["(empty result)"],truncated:!1}}function sw(t,e,n,r,o=fn()){let i=n??Wd;if(e.isPartial)return new jr(i.fg("warning","Running MCP tool..."),0,0);let s=!!t.details.error,a=e.expanded||r?.isError===!0||s;if(!a&&o.resultRendering==="compact"){let l=Jd(t,!1,o.collapsedResultLines),f=r?.state?.compactTitle??Kd(t.details)??"",p=r?.state?.compactInputPreview??"";return new ya(f,p,l,i)}let c=Jd(t,a,o.collapsedResultLines),u=Kd(t.details),d=[...u?[i.fg("muted",u)]:[],...c.lines.map(l=>i.fg("toolOutput",l))].join(`
601
+ `);return new va(d,a,o.collapsedResultLines+(u?1:0),i.fg("muted","\u2026"),i.fg("muted","(Ctrl+O to expand)"),c.truncated)}function di(t){return(e,n,r,o)=>sw(e,n,r,o,t)}function nf(t){if(t&&typeof t=="object"&&"error"in t){let e=t.error;if(e==="tool_error"||e==="call_failed")return{isError:!0}}}import{formatWithOptions as aw}from"node:util";import{Worker as cw}from"node:worker_threads";var rf=3e4,fi=class extends Error{constructor(e){super(`mcpScript timed out after ${e}ms`),this.name="McpScriptTimeoutError"}};function cf(t,e=new WeakSet){if(t===void 0||typeof t=="bigint"||typeof t=="function"||typeof t=="symbol")return!0;if(typeof t!="object"||t===null)return!1;if(e.has(t)||t instanceof Map||t instanceof Set||t instanceof WeakMap||t instanceof WeakSet)return!0;e.add(t);try{return Object.values(t).some(n=>cf(n,e))}finally{e.delete(t)}}function uw(t){if(typeof t=="string")return t;try{if(!cf(t)){let e=JSON.stringify(t,null,2);if(e!==void 0)return e}return aw({colors:!1,depth:6},t)}catch{return"[unserializable value]"}}function of(t){if(typeof t=="object"&&t!==null){let e=t;if(e.type==="text"&&typeof e.text=="string")return{type:"text",text:e.text};if(e.type==="image"&&typeof e.data=="string"&&typeof e.mimeType=="string")return{type:"image",data:e.data,mimeType:e.mimeType}}return{type:"text",text:uw(t)}}function sf(t){return t.filter(e=>e.type==="text").map(e=>e.text).join(`
602
+ `)}function af(t){return t instanceof Error?t:new Error(String(t??"MCP request aborted"))}function lw(t){if(typeof t!="object"||t===null)return null;let e=t;return e.type==="emit"&&"block"in e?{type:"emit",block:e.block}:e.type==="call"&&typeof e.id=="number"&&typeof e.path=="string"?"args"in e?{type:"call",id:e.id,path:e.path,args:e.args}:{type:"call",id:e.id,path:e.path}:(e.type==="search"||e.type==="describe")&&typeof e.id=="number"?"input"in e?{type:e.type,id:e.id,input:e.input}:{type:e.type,id:e.id}:e.type==="done"?"returnBlock"in e?{type:"done",returnBlock:e.returnBlock}:{type:"done"}:e.type==="error"&&typeof e.message=="string"?{type:"error",message:e.message}:null}async function uf(t,e,n=rf,r,o){let i=Number.isFinite(n)&&n>0?Math.floor(n):rf,s=[],a=te(t.owner?.signal,o),c=new AbortController,u=te(a,c.signal),d=[],l=()=>d.map(({startedAt:h,...M})=>({...M,durationMs:"error"in M&&M.error==="incomplete"?Math.max(0,Date.now()-h):M.durationMs})),f,p=async(h,M)=>{let P=Date.now(),C=d.push({operation:"call",path:h,ok:!1,error:"incomplete",durationMs:0,startedAt:P})-1,E=await tr(t,h,M,void 0,r,u,"script"),L=E.details;if(L.error!==void 0){let H=String(L.error),$=Array.isArray(L.suggestions)?L.suggestions.filter(T=>typeof T=="string"):[],O=H==="tool_not_found"?`Tool "${h}" not found. Use await tools.search({ query: "..." }) inside mcpScript.${$.length>0?` Did you mean: ${$.join(", ")}`:""}`:typeof L.message=="string"?L.message:sf(E.content);return d[C]={operation:"call",path:h,ok:!1,error:H,durationMs:Date.now()-P,startedAt:P},{ok:!1,error:{code:H,message:O}}}return d[C]={operation:"call",path:h,ok:!0,durationMs:Date.now()-P,startedAt:P},{ok:!0,data:L.mcpResult!==void 0?L.mcpResult:sf(E.content)}},g=h=>{let M=Date.now(),P=typeof h?.query=="string"?h.query:"",C;try{if(P.trim()==="")return{items:[],total:0,hasMore:!1,nextOffset:null};let E=typeof h?.server=="string"?h.server:void 0,L=typeof h?.limit=="number"?h.limit:12,H=typeof h?.offset=="number"?h.offset:0,$=ii(Nr(t,P,E),H,L);return{...$,items:$.items.map(({server:O,tool:T,score:G})=>({path:T.name,name:T.originalName,server:O,...T.description?{description:T.description}:{},score:G}))}}catch(E){throw C=E,E}finally{d.push(C===void 0?{operation:"search",query:P,ok:!0,durationMs:Date.now()-M,startedAt:M}:{operation:"search",query:P,ok:!1,error:C instanceof Error?C.message:String(C),durationMs:Date.now()-M,startedAt:M})}},y=h=>{let M=Date.now(),P=typeof h?.path=="string"?h.path:"",C;try{for(let[L,H]of t.toolMetadata){if(Te(t,L))continue;let $=Ar(H,P);if(!$)continue;let O=$.inputSchema?Dr($.inputSchema)??rt($.inputSchema):null;return{path:$.name,name:$.originalName,server:L,...$.description?{description:$.description}:{},...O?{inputTypeScript:O}:{}}}let E=P?un(t,P,5):[];return C="tool_not_found",{path:P,error:{code:"tool_not_found",message:`Tool not found: ${P}`,suggestions:E}}}catch(E){throw C=E,E}finally{d.push(C===void 0?{operation:"describe",path:P,ok:!0,durationMs:Date.now()-M,startedAt:M}:{operation:"describe",path:P,ok:!1,error:C instanceof Error?C.message:String(C),durationMs:Date.now()-M,startedAt:M})}},w,b,v=()=>{},m,S;try{if(a?.aborted)throw af(a.reason);w=new cw(new URL("./mcp-script-worker.mjs",import.meta.url),{workerData:{code:e},env:{},trackUnmanagedFds:!1});let h=w,M=new Promise((L,H)=>{let $=!1;h.on("message",O=>{let T=lw(O);if(!(!T||$)){if(T.type==="emit"){s.push(of(T.block));return}if(T.type==="done"){$=!0,"returnBlock"in T&&s.push(of(T.returnBlock)),L();return}if(T.type==="error"){$=!0,H(new Error(T.message));return}(async()=>{let G;T.type==="call"?G=await p(T.path,T.args):T.type==="search"?G=g(T.input):G=y(T.input);let F={type:"result",id:T.id,envelope:G};h.postMessage(F)})().catch(H)}}),h.once("error",H),h.once("exit",O=>{!$&&O!==0&&H(new Error(`mcpScript worker exited with code ${O}`))})}),P=new fi(i),C=new Promise((L,H)=>{b=setTimeout(()=>{f=l(),c.abort(P),h.terminate(),H(P)},i)}),E=a?new Promise((L,H)=>{let $=()=>{f=l(),h.terminate(),H(af(a.reason))};a.addEventListener("abort",$,{once:!0}),v=()=>a.removeEventListener("abort",$)}):new Promise(()=>{});await Promise.race([M,C,E])}catch(h){h instanceof fi?(m="timeout",S=`mcpScript timed out after ${i}ms`):a?.aborted?(m="aborted",S=h instanceof Error?h.message:String(h)):(m="script_error",S=h instanceof Error?h.message:String(h)),s.push({type:"text",text:S})}finally{clearTimeout(b),v(),f??=l(),c.abort(new Error("mcpScript finished")),await w?.terminate()}let R=await Le(s.length>0?[...s]:[{type:"text",text:"(no output)"}],Yn(t.config.settings));return{content:R.content,details:{mode:"script",...m?{error:m,message:S}:{},timeoutMs:i,...f.length>0?{calls:f}:{},...Ne(R)}}}ue();nt();import{Type as pi}from"typebox";en();It();nt();ue();var dw=new Set(["read","bash","edit","write","grep","find","ls","mcp"]),lf="_mcpns_";function fw(t){let e=t.replace(/-/g,"_");if(e===""||/^[A-Za-z0-9_]+$/.test(e)&&!e.startsWith(lf))return e;let n=Array.from(e,r=>r.codePointAt(0).toString(16)).join("_");return`${lf}${n}`}function Ut(t){return`mcp__${fw(t)}`}function df(t){if(!t.startsWith("mcp:"))return{raw:t};let e=t.slice(4).trim();if(!e)return{raw:t};let n=e.indexOf("/");if(n===-1)return{raw:t,server:e};let r=e.slice(0,n).trim(),o=e.slice(n+1).trim();return{raw:t,...r?{server:r}:{},...o?{tool:o}:{}}}function wa(t,e,n,r){if(r){if(r.servers.has(n))return!0;let o=r.tools.get(n);return o?[...o]:!1}return e.directTools!==void 0?e.directTools:t.settings?.directTools===!0}function ba(t,e,n,r){return r?r.servers.has(n):t?.directTools!==void 0?t.directTools===!0||Array.isArray(t.directTools)&&t.directTools.length>0:e?.directTools===!0}function Ca(t,e){return t.tools.length>0||e.exposeResources!==!1&&(t.resources?.length??0)>0}function xa(t,e,n,r,o,i){let s=t.mcpServers[i];if(!s||U(s)||ba(s,t.settings,i,n))return!1;let a=Ut(i);if(r.has(a)||o.has(a))return!1;let c=Ma(s,e,i);return!!c&&Ca(c,s)}function Ma(t,e,n){let r=e?.servers[n];if(!(!t||!r||!$e(r,t)))return r}function ff(t,e){let n=[];if(!e)return n;for(let[r,o]of Object.entries(t.mcpServers)){if(U(o))continue;let i=Ma(o,e,r);i&&n.push({serverName:r,definition:o,entry:i,prefix:pe(o,t.settings?.toolPrefix)})}return n}function pw(t,e,n,r){let o=new Map;if(!e)return new Set;for(let i of Object.keys(t.mcpServers)){if(!xa(t,e,n,new Set,r,i))continue;let s=Ut(i);o.set(s,(o.get(s)??0)+1)}return new Set([...o].filter(([,i])=>i>1).map(([i])=>i))}function gw(t,e,n,r){let o=new Map;for(let{serverName:i,definition:s,entry:a,prefix:c}of ff(t,e)){let u=wa(t,s,i,n);for(let{name:d,originalName:l}of Ta(a,i,s,c,u,r))o.has(d)||o.set(d,{serverName:i,originalName:l})}return o}function mw(t,e){if(e)return Tr(t.mcpServers,e,t.settings?.toolPrefix??"server")}function hw(t,e,n,r,o){if(Ee(t,e,r,n.includeTools,n.excludeTools,o))return se(t,e,r)}function Ta(t,e,n,r,o,i,s){if(!o)return[];let a=[],c=u=>{if(o!==!0&&!o.includes(u))return;let d=hw(u,e,n,r,i);d&&(dw.has(d)||s!==void 0&&u!==s&&d!==s||a.push({name:d,originalName:u}))};for(let u of t.tools)ke(u.uiVisibility)&&c(u.name);if(n.exposeResources!==!1)for(let u of t.resources??[])c(`read_${Ce(u.name)}`);return a}function pf(t,e,n){return t.filter(({name:r,originalName:o})=>{let i=n.get(r);return i?.serverName===e&&i.originalName===o}).map(({name:r})=>r)}function gf(t,e,n,r,o,i){if(i===void 0)return!0;let s=a=>Ee(a,e,r,n.includeTools,n.excludeTools,o)?i===se(a,e,r):!1;return t.tools.some(a=>ke(a.uiVisibility)&&s(a.name))?!0:n.exposeResources===!1?!1:(t.resources??[]).some(a=>{let c=`read_${Ce(a.name)}`;return s(c)})}function Br(t,e,n){e.has(n)||(e.add(n),t.push(n))}function yw(t,e,n,r,o,i,s,a,c,u,d){let l=t.server,f=e.mcpServers[l];if(!f||U(f)){d.push(`MCP reference "${t.raw}" refers to disabled or unknown server "${l}"`);return}let p=Ma(f,n,l);if(!p){d.push(`MCP reference "${t.raw}" cannot be resolved: no valid cached metadata for server "${l}"`);return}let g=pe(f,e.settings?.toolPrefix),y=wa(e,f,l,r),w=pf(Ta(p,l,f,g,y,a,t.tool),l,s);if(w.length>0){for(let b of w)Br(c,u,b);return}if(xa(e,n,r,o,i,l)){if(gf(p,l,f,g,a,t.tool)){Br(c,u,Ut(l));return}d.push(`MCP reference "${t.raw}" refers to unknown or hidden tool "${t.tool}" on server "${l}"`);return}d.push(`MCP reference "${t.raw}" resolves to no registered tool`)}function vw(t,e,n,r,o,i,s,a,c,u,d,l){let f=!1;for(let{serverName:p,definition:g,entry:y,prefix:w}of ff(n,r)){let b=wa(n,g,p,o),v=pf(Ta(y,p,g,w,b,c,e),p,a);for(let m of v)Br(u,d,m),f=!0;xa(n,r,o,i,s,p)&&gf(y,p,g,w,c,e)&&(Br(u,d,Ut(p)),f=!0)}f||l.push(`MCP reference "${t}" does not match a configured server or cached tool`)}function Sw(t,e,n,r){let o=[],i=[],s=new Set;if(!e)return{names:t.filter(f=>!f.startsWith("mcp:")),diagnostics:t.filter(f=>f.startsWith("mcp:")).map(f=>`MCP reference "${f}" cannot be resolved: no MCP config`)};let a=r?tn(r):null,c=mw(e,n),u=gw(e,n,a,c),d=new Set(u.keys()),l=pw(e,n,a,d);for(let f of t){if(!f.startsWith("mcp:")){Br(o,s,f);continue}let p=df(f);if(!p.server){i.push(`MCP reference "${f}" is empty after the "mcp:" prefix`);continue}e.mcpServers[p.server]?yw(p,e,n,a,l,d,u,c,o,s,i):p.tool===void 0?vw(f,p.server,e,n,a,l,d,u,c,o,s,i):i.push(`MCP reference "${f}" refers to unknown server "${p.server}"`)}return{names:o,diagnostics:i}}function ww(t,e,n,r,o){let i=t.mcpServers[o];if(!i||U(i)||ba(i,t.settings,o,n))return null;let s=e.servers?.[o];if(!s||!$e(s,i)||!Ca(s,i))return null;let a=Ut(o);return r.has(a)?null:{serverName:o,toolName:a,description:`Namespace-proxy for MCP server "${o}". Forwards \`{tool, args}\` through the adapter's executeCall, so it inherits the same auth / lifecycle / output-guard rules as the \`mcp\` proxy.`}}function bw(t){let e=new Map;for(let n of t){let r=e.get(n.toolName)??[];r.push(n),e.set(n.toolName,r)}return t.filter(n=>{let r=e.get(n.toolName);return r.length===1?!0:(r[0]===n&&console.warn(`MCP: skipping namespace proxy "${n.toolName}" because servers ${r.map(({serverName:o})=>`"${o}"`).sort().join(", ")} normalize to the same name`),!1)})}function Cw(t,e,n,r,o){return!t||!e?[]:bw(Object.keys(t.mcpServers).map(i=>ww(t,e,n,r,i)).filter(i=>i!==null)).filter(i=>!o.has(i.serverName))}function xw(t,e,n,r){return async(o,i,s)=>{if(typeof i.tool!="string"||i.tool.length===0)return{content:[{type:"text",text:`mcp__${n} requires a \`tool\` parameter naming the underlying MCP tool.`}],details:{error:"missing_tool",server:n}};let a=t();if(!a){let c=e();if(c)try{a=await c}catch(u){let d=u instanceof Error?u.message:String(u);return{content:[{type:"text",text:`MCP initialization failed for ${n}: ${d}`}],details:{error:"init_failed",server:n,message:d}}}}return a?tr(a,i.tool,i.args??{},n,r,s,"proxy"):{content:[{type:"text",text:`MCP not initialized for ${n}.`}],details:{error:"not_initialized",server:n}}}}var Mw=pi.Object({tool:pi.String({description:"Underlying MCP tool name to call on this server."}),args:pi.Optional(pi.Object({},{additionalProperties:!0,description:"Arguments for the underlying tool. The exact shape depends on the tool being called; use mcp({ describe: 'server/tool' }) to inspect."}))});function Tw(t,e){let n=li(t);return(r,o,i)=>n({...r.tool!==void 0?{tool:r.tool}:{},...r.args!==void 0?{args:r.args}:{},server:e},o,i)}function Aw(t,e,n,r,o){t.pi.registerTool({name:e.toolName,label:`MCP: ${e.serverName}`,description:e.description,promptSnippet:`MCP namespace proxy for ${e.serverName}`,parameters:Mw,renderShell:r,renderCall:Tw(n,e.serverName),renderResult:o,execute:xw(t.getState,t.getInitPromise,e.serverName,t.getPiTools)})}function Pw(t,e){if(e.length!==0)try{return t.getActiveTools?.()}catch(n){if(n instanceof Error&&n.message.includes("Action methods cannot be called during extension loading"))return;throw n}}function Rw(t,e){let n=t.activeDirectNames??new Set,r=[...t.existingNamespaceNames].filter(u=>!e.has(u)&&!n.has(u)),o=[],i=t.pi.unregisterTool;for(let u of r)i?.(u)&&o.push(u);let s=Pw(t.pi,r);if(!s)return o;let a=new Set(r),c=s.filter(u=>!a.has(u));if(c.length===s.length)return o;t.pi.setActiveTools(c);for(let u of r)o.includes(u)||o.push(u);return o}function mf(t){let e=Cw(t.config,t.cache,t.envOverride,t.existingDirectNames,t.unavailableServers??new Set),n=new Set(e.map(a=>a.toolName)),r={specs:e,added:[],updated:[],deactivated:[]},o=t.renderOptions??fn(),i=t.renderShell??(o.resultRendering==="compact"?"self":"default"),s=t.renderResult??di(o);for(let a of e)Aw(t,a,o,i,s),(t.existingNamespaceNames.has(a.toolName)?r.updated:r.added).push(a.toolName);return r.deactivated.push(...Rw(t,n)),r}ue();var Hr=3e4,Ew=1e3,Ra=Symbol("init-wait-timed-out"),hf="pi-mcp-adapter:runtime-register:v1",yf=1,vf="pi-mcp-adapter:runtime-snapshot:v1",Sf=1,wf=new WeakMap,bf=new WeakMap;async function Aa(t,e){let n;try{return await Promise.race([t,new Promise(r=>{n=setTimeout(()=>r(Ra),e),n.unref?.()})])}finally{clearTimeout(n)}}function Pa(t){let e=oe.Number;return typeof e=="function"?oe.Optional(e(t)):{type:"number",...t}}function kw(t){return t?.split(",").map(e=>e.trim()).filter(Boolean)}function Ow(t,e){return t==="__none__"?{servers:new Set,tools:new Map}:e?tn(e):null}function $w(t,e){let n=e.config!==void 0?Vt(e.config):void 0,r=n!==void 0,o=null,i=null,s=null,a=null,c=0,u=null;function d(x){let k=Ve(_e(x),Ew);return u=k,k}function l(){u=null}function f(x,k=u){let A="Fix the MCP server configuration or startup failure, then call mcp(...) again to retry initialization.";return k?`${x}: ${k}. ${A}`:`${x}. ${A}`}function p(x,k){if(!k.signal.aborted)return ie(x);let A=k.signal.reason;return A instanceof Error&&A.message==="MCP initialization failed"&&x!==A?ie(x):!0}function g(x){let k=++c,A=Dn(),_=$t(A.signal);s=A,a=_,o=null,me(x,A,_,k,"stale_gateway_retry_initialization")}async function y(x,k){if(!x){zs(t.events);return}zs(x.statusEvents),x.uiServer&&(x.uiServer.close(k),x.uiServer=null);let A;try{Pl(x)}catch(_){A=_}try{x.owner?await x.owner.stop(k):await x.lifecycle.gracefulShutdown()}catch(_){if(A)console.error(`MCP: graceful shutdown failed after metadata flush error: ${_e(_)}`);else throw _}if(A)throw A}let w=r?void 0:e.configPath??cc(),b=r?Vt(n):io(w),v=ze(),m=process.env.MCP_DIRECT_TOOLS,S=kw(m),R=Ow(m,S),h=new Map,M=new Set,P=new Set,C=fn(b.settings),E=C.resultRendering==="compact"?"self":"default",L=di(C),H=!1,$=null,O=!1,T=new Map;function G(x,k,A){let _=A.lifecycle??"lazy",z=_==="eager"||_==="lazy-keep-alive",V=A.idleTimeout??(z?0:void 0);x.lifecycle.registerServer(k,A,V!==void 0?{idleTimeout:V}:void 0),_==="keep-alive"&&x.lifecycle.markKeepAlive(k,A)}let F=x=>typeof oe.Unsafe=="function"?oe.Unsafe(x):x;function Oe(x){return JSON.stringify({serverName:x.serverName,originalName:x.originalName,prefixedName:x.prefixedName,description:x.description,inputSchema:x.inputSchema,resourceUri:x.resourceUri,uiResourceUri:x.uiResourceUri,uiStreamMode:x.uiStreamMode})}function fe(x,k){t.registerTool({name:x.prefixedName,label:`MCP: ${x.originalName}`,description:x.description||"(no description)",promptSnippet:Ve(x.description,100)||`MCP tool from ${x.serverName}`,parameters:F(lc(x.inputSchema)),...k.settings?.strictDirectToolArguments===!0?{prepareArguments:A=>xd(x.inputSchema,A)}:{},execute:Ad(()=>o,()=>i,x),renderShell:E,renderCall:ef(x.prefixedName,C),renderResult:L})}function j(){let x=o;return x?new Set(Object.keys(x.config.mcpServers).filter(k=>Te(x,k))):new Set}function Q(x,k,A){if(m==="__none__")return[];let _=x.settings?.toolPrefix??"server";return Md(x,k,_,S,j(),A)}function ne(){try{return t.getActiveTools?.()}catch(x){if(x instanceof Error&&x.message.includes("Action methods cannot be called during extension loading"))return;throw x}}function Se(x){if(x.length===0)return[];let k=t.unregisterTool,A=x.filter(B=>k?.(B)===!0),_=x.filter(B=>!A.includes(B)),z=new Set(x),V=ne();if(!V||V.length===0){for(let B of _)P.add(B);return A}let N=V.filter(B=>!z.has(B));if(N.length!==V.length){for(let B of _)P.add(B);t.setActiveTools(N)}return A}function Xe(x,k){let A=new Set,_=Q(x,k,A),z=new Set(_.map(Y=>Y.prefixedName)),V=[],N=[],B=[];for(let Y of _){let ft=Oe(Y),Z=h.get(Y.prefixedName);if(Z!==ft){if(fe(Y,x),h.set(Y.prefixedName,ft),P.delete(Y.prefixedName)){let W=ne();W&&!W.includes(Y.prefixedName)&&t.setActiveTools([...W,Y.prefixedName])}(Z?N:V).push(Y.prefixedName)}}for(let Y of[...h.keys()])z.has(Y)||(h.delete(Y),B.push(Y));return Se(B),{specs:_,reservedDirectNames:A,activeDirectNames:z,added:V,updated:N,deactivated:B}}function dt(x){if(o)for(let[k,A]of x){let _=o.config.mcpServers[k];_&&(o.config.mcpServers[k]={..._,directTools:A})}}function Re(x){let k=o?.config??b,A=ze(),_=Xe(k,A);et(k,A,_.specs),St(k,A,_.reservedDirectNames,_.activeDirectNames),_.added.length+_.updated.length+_.deactivated.length>0&&x?.hasUI&&x.ui.notify(`MCP: direct tools refreshed (+${_.added.length}, ~${_.updated.length}, -${_.deactivated.length})`,"info")}function St(x,k,A=new Set(h.keys()),_=new Set(h.keys())){let z=mf({config:x,cache:k,envOverride:R,existingDirectNames:A,activeDirectNames:_,existingNamespaceNames:M,unavailableServers:j(),pi:t,getState:()=>o,getInitPromise:()=>i,getPiTools:()=>t.getAllTools(),renderOptions:C,renderShell:E,renderResult:L});for(let V of z.added)M.add(V);for(let V of z.deactivated)M.delete(V)}let st=new Set;function pn(x){for(let k of x){if(st.has(k.commandName)){X.debug(`MCP: prompt "${k.originalName}" on ${k.serverName} skipped; /${k.commandName} is already registered`);continue}st.add(k.commandName),t.registerCommand(k.commandName,kd(t,()=>o,k))}}function wt(){pn([...o?.promptMetadata?.values()??[]].flat())}pn(Ed(b));let I=(x,k)=>{if(typeof x!="string"||x.trim()==="")throw new Error("MCP server name must be a non-empty string");if(typeof k!="object"||k===null||Array.isArray(k))throw new Error(`MCP server definition for "${x}" must be an object`);let A=o?.config??b;if(T.has(x)||Object.hasOwn(A.mcpServers,x))throw new Error(`MCP server "${x}" is already registered`);let _=structuredClone(k),z={...structuredClone(_),directTools:!1};T.set(x,{definition:_,entry:z});let V=o;V&&(V.config.mcpServers[x]=z,G(V,x,z),Re(),ge(V));let N=!1;return{dispose:async()=>{if(N)return;N=!0,T.delete(x);let B=o;!B||B.config.mcpServers[x]!==z||(delete B.config.mcpServers[x],B.lifecycle.unregisterServer(x),await B.manager.close(x),Re(),ge(B))}}},q=x=>{if(typeof x!="string"||x.trim()==="")throw new Error("MCP runtime server name must be a non-empty string");let k=T.get(x);if(!k)throw new Error(`MCP runtime server "${x}" is not registered or has been disposed`);let A=o;if(!A)throw new Error(`MCP runtime server "${x}" is unavailable because the adapter has no active state`);let _=A.config.mcpServers[x];if(Object.hasOwn(A.config.mcpServers,x)&&_!==k.entry)throw new Error(`MCP runtime server "${x}" is shadowed by a configured server`);if(_!==k.entry)throw new Error(`MCP runtime server "${x}" is unavailable in the active adapter state`);return{name:x,definition:structuredClone(k.definition),runtime:!0,persisted:!1}};wf.set(t,I),bf.set(t,q),t.events.on(hf,x=>{if(typeof x!="object"||x===null||Array.isArray(x))return;let k=x;if(k.result===void 0){if(k.version!==yf){k.result={ok:!1,error:new Error(`Unsupported MCP runtime registration version: ${String(k.version)}`)};return}try{k.result={ok:!0,registration:I(k.name,k.definition)}}catch(A){k.result={ok:!1,error:A instanceof Error?A:new Error(String(A))}}}}),t.events.on(vf,x=>{if(typeof x!="object"||x===null||Array.isArray(x))return;let k=x;if(k.result===void 0){if(k.version!==Sf){k.result={ok:!1,error:new Error(`Unsupported MCP runtime snapshot version: ${String(k.version)}`)};return}try{k.result={ok:!0,snapshot:q(k.name)}}catch(A){k.result={ok:!1,error:A instanceof Error?A:new Error(String(A))}}}});let ee=()=>t.getAllTools();t.registerFlag("mcp-config",{description:"Path to MCP config file",type:"string"});function me(x,k,A,_,z){k.addCleanup(()=>Ql(k.signal));let V=Al(t,x,k,{...r||e.configPath!==void 0?{...w!==void 0?{configPath:w}:{},...n!==void 0?{config:n}:{}}:{},oauthRuntime:A});return i=V,V.then(async N=>{if(!k.isActive()||_!==c||i!==V){try{await y(N,z)}catch(B){console.error(`MCP: failed to clean stale initialization state: ${_e(B)}`)}return}o=N,l();for(let[B,{entry:Y}]of T){if(Object.hasOwn(N.config.mcpServers,B)){console.error(`MCP: runtime-registered server "${B}" now collides with a configured server; keeping the configured server`);continue}N.config.mcpServers[B]=Y,G(N,B,Y)}N.onToolMetadataUpdated=(B,Y)=>{if(!(o!==N||!k.isActive())){if(wt(),O){X.debug(`MCP: metadata update for ${B} (${Y}) skipped \u2014 directTools frozen`);return}Re(x)}},wt(),Re(x),N.statusEvents=t.events,ge(N),i=null,b.settings?.freezeDirectTools===!0&&(O=!0,X.info(`MCP: direct tools frozen after initial sync \u2014 reconnects won't rebuild the system prompt; use mcp({ connect: "server" }) to rediscover`))}).catch(async N=>{if(!k.isActive()||_!==c||i!==V&&i!==null)return;let B=d(N);if(console.error(`MCP initialization failed: ${B}`),i=null,!o)try{await Promise.all([k.stop("MCP initialization failed"),jn(A)])}catch(Y){console.error(`MCP: failed to clean rejected initialization: ${_e(Y)}`)}})}function Ie(){Object.values(b.mcpServers).some(k=>k.disabled===!0?!1:k.lifecycle==="eager"||k.lifecycle==="keep-alive")&&setImmediate(()=>{if(c!==0||o||i)return;let k=++c,A=Dn(),_=$t(A.signal);s=A,a=_,me({mode:"print",hasUI:!1,cwd:process.cwd(),model:void 0,modelRegistry:void 0,signal:void 0},A,_,k,"stale_load_time_initialization")})}t.on("session_start",async(x,k)=>{let A=++c,_=o,z=s,V=a,N=Dn(),B=$t(N.signal);s=N,a=B,o=null,i=null,l();let Y=z?.stop("MCP extension session restarted")??Promise.resolve();try{await Promise.all([Y,y(_,"session_restart"),V?jn(V):Promise.resolve()])}catch(Z){console.error(`MCP: failed to shut down previous session state: ${_e(Z)}`)}if(A!==c||!N.isActive())return;let ft=me(k,N,B,A,"stale_session_start");m!==void 0&&m!=="__none__"&&Fn(b,ze(),S).length>0&&await ft}),t.on("input",async()=>{let x=s;if(!x?.isActive())return;if(!o&&i)try{await Aa(i,Hr)}catch{return}let k=o;if(!(!k||!x.isActive()))try{await k.lifecycle.ensureConverged(x.signal)}catch(A){ie(A,x.signal)||X.debug(`MCP: keep-alive convergence failed before input: ${_e(A)}`)}}),t.on("session_shutdown",async()=>{++c;let x=o,k=s,A=a;s=null,a=null,o=null,i=null,l();let _=k?.stop("MCP extension session shutdown")??Promise.resolve();try{await Promise.all([_,y(x,"session_shutdown"),A?jn(A):Promise.resolve()])}catch(z){console.error(`MCP: session shutdown cleanup failed: ${_e(z)}`)}}),t.on("tool_result",x=>nf(x.details));let J=x=>t.registerCommand(x,{description:"Show MCP server status",getArgumentCompletions:k=>{let A=k.trimStart(),_=A.match(/^(\S+)\s+(.*)$/);if(!_){let B=[{value:"reconnect",label:"reconnect \u2014 Reconnect servers"},{value:"tools",label:"tools \u2014 List all tools"},{value:"prompts",label:"prompts \u2014 List all MCP prompts"},{value:"setup",label:"setup \u2014 Configure MCP servers"},{value:"logout",label:"logout \u2014 Clear server credentials"},{value:"token",label:"token \u2014 Manage stored bearer tokens"},{value:"disable",label:"disable \u2014 Disable a server"},{value:"enable",label:"enable \u2014 Enable a server"},{value:"status",label:"status \u2014 Show server status"}].filter(({value:Y})=>Y.startsWith(A));return B.length>0?B:null}let[,z,V]=_;if(z!=="reconnect"&&z!=="logout"&&z!=="disable"&&z!=="enable"&&z!=="token"||V===void 0||!o)return null;if(z==="token"){let B=V.trimStart().match(/^(set|remove|status)\s+(.*)$/);if(!B){let W=["set","remove","status"].filter(he=>he.startsWith(V.trimStart())).map(he=>({value:`token ${he} `,label:`${he} \u2014 Bearer token ${he}`}));return W.length>0?W:null}let Y=B[1]??"",ft=B[2]??"",Z=Object.keys(o.config.mcpServers).filter(W=>W.startsWith(ft.trimStart())).map(W=>({value:`token ${Y} ${W}`,label:W}));return Z.length>0?Z:null}let N=Object.keys(o.config.mcpServers).filter(B=>B.startsWith(V.trimStart())).map(B=>({value:`${z} ${B}`,label:B}));return N.length>0?N:null},handler:async(k,A)=>{let _=s,z=typeof A.reload=="function"?A.reload.bind(A):async()=>{},V=A.hasUI,N={hasUI:V,ui:V?_?vr(A.ui,_):A.ui:void 0,cwd:A.cwd,mode:A.mode,signal:_?.signal??A.signal};if(!o&&i)try{let W=await i;_?.throwIfInactive(),o=W}catch(W){let he=W instanceof Error?W.message:String(W);N.hasUI&&N.ui?.notify(`MCP initialization failed: ${he}`,"error");return}if(!o){N.hasUI&&N.ui?.notify("MCP not initialized","error");return}let B=k?.trim()?.split(/\s+/)??[],Y=B[0]??"",ft=B[1],Z=B.slice(1).join(" ");switch(Y){case"reconnect":_?.throwIfInactive(),await Bl(o,N,ft),O&&Re(N);break;case"tools":await jl(o,N);break;case"prompts":await Ll(o,N);break;case"setup":{if(_?.throwIfInactive(),r){N.ui?.notify("MCP setup is unavailable when config is supplied by createMcpAdapter().","info");break}if((await ea(o,t,N,w,"setup"))?.configChanged){_?.throwIfInactive(),await z();return}break}case"logout":{let W=Z;if(!W){N.hasUI&&N.ui?.notify("Usage: /mcp logout <server>","error");return}_?.throwIfInactive(),await Hl(W,o,N);break}case"token":{let W=B[1],he=B.slice(2).join(" ");if(W!=="set"&&W!=="remove"&&W!=="status"){N.hasUI&&N.ui?.notify("Usage: /mcp token set|remove|status <server>","error");return}if(!he){N.hasUI&&N.ui?.notify("Usage: /mcp token set|remove|status <server>","error");return}_?.throwIfInactive(),await Fl(W,he,o,N);break}case"disable":case"enable":{let W=Z;if(r){N.ui?.notify(`/mcp ${Y} is unavailable when config is supplied by createMcpAdapter().`,"info");break}if(!W){N.ui?.notify(`Usage: /mcp ${Y} <server>`,"error");break}if(!o.config.mcpServers[W]){N.ui?.notify(`Server "${W}" not found in effective config`,"error");break}_?.throwIfInactive();let he=bc(w,N.cwd,W,Y==="disable");he.changed?N.ui?.notify(`${Y==="disable"?"Disabled":"Enabled"} server "${W}" in ${he.path} \u2014 run /reload to apply`,"info"):N.ui?.notify(`Server "${W}" is already ${Y==="disable"?"disabled":"enabled"}`,"info");break}default:if(N.hasUI){if(_?.throwIfInactive(),r){N.ui?.notify("MCP status is shown from the in-memory SDK config; configuration discovery is unavailable.","info"),await Pr(o,N);break}if((await ql(o,t,N,w,he=>{dt(he),Re(N)}))?.configChanged){_?.throwIfInactive(),await z();return}}else await Pr(o,N);break}}});J("mcp"),J("pi-mcp"),t.registerCommand("mcp-auth",{description:"Authenticate with an MCP server (OAuth)",handler:async(x,k)=>{let A=s,_=k.hasUI,z={hasUI:_,ui:_?A?vr(k.ui,A):k.ui:void 0,cwd:k.cwd,mode:k.mode,signal:A?.signal??k.signal},V=x?.trim();if(!V&&!z.hasUI)return;if(!o&&i)try{let B=await i;A?.throwIfInactive(),o=B}catch(B){let Y=B instanceof Error?B.message:String(B);z.hasUI&&z.ui?.notify(`MCP initialization failed: ${Y}`,"error");return}if(!o){z.hasUI&&z.ui?.notify("MCP not initialized","error");return}if(!V){if(r){z.ui?.notify("Use /mcp-auth <server> to authenticate a server from the in-memory SDK config.","info");return}await Vl(o,t,z,w);return}(await Zs(V,o.config,z,z.signal,o.oauthRuntime)).ok&&(A?.throwIfInactive(),await Wo(o,z,V))}}),b.settings?.scriptMode!==!1&&t.registerTool({name:"mcpScript",label:"MCP Script",description:"Run trusted JavaScript that makes multiple MCP tool calls in one request \u2014 loop, filter, chain, or fan out between calls. For a single MCP call, search, describe, status check, or auth action, use the mcp tool instead. Discover with await tools.search({ query }) \u2014 resolves to { items: [{ path, name, server, description? }], total, hasMore, nextOffset }, not an { ok, data } envelope. Inspect with await tools.describe({ path }) \u2014 resolves to the tool descriptor with inputTypeScript, or { path, error: { code, message, suggestions } }. Then call tools.call(path, args) \u2014 resolves to { ok: true, data } or { ok: false, error: { code, message } } \u2014 or use direct flat calls when the name is already known; use emit(value) for user-visible output. Load the mcp-scripting skill for the full workflow guide.",promptSnippet:"Batch multiple MCP tool calls in one JavaScript request (loop, filter, chain)",parameters:oe.Object({code:oe.String({description:"Trusted JavaScript MCP script. Use tools.<prefixedToolName>(args) and emit(value)."}),timeoutMs:Pa({minimum:1,description:"Execution timeout in milliseconds (default: 30000)"})}),renderCall:tf(C),renderResult:L,async execute(x,k,A){let _=s;if(!o&&i)try{let z=await Aa(i,Hr);if(z===Ra)return{content:[{type:"text",text:"MCP initialization is still in progress. Try again shortly."}],details:{mode:"script",error:"init_timeout",timeoutMs:Hr}};_?.throwIfInactive(),o=z}catch(z){if(_&&p(z,_))throw z;let V=z instanceof Error?z.message:String(z);return{content:[{type:"text",text:`MCP initialization failed: ${V}`}],details:{mode:"script",error:"init_failed",message:V}}}return o?(_?.throwIfInactive(),uf(o,k.code,k.timeoutMs,ee,A)):{content:[{type:"text",text:u?f("MCP is not initialized after an earlier initialization failure"):"MCP not initialized"}],details:{mode:"script",error:"not_initialized",...u?{message:u}:{}}}}});function we(x){t.registerTool({name:"mcp",label:"MCP",description:x,promptSnippet:"MCP gateway \u2014 status, search, describe, auth, and single MCP tool calls",renderShell:E,renderCall:li(C),parameters:oe.Object({tool:oe.Optional(oe.String({description:"Tool name to call (e.g., 'xcodebuild_list_sims')"})),args:oe.Optional(oe.Union([oe.String({description:`Arguments as a JSON string (e.g., '{"key": "value"}')`}),oe.Object({},{additionalProperties:!0,description:'Arguments as a JSON object (e.g., { "key": "value" })'})],{description:"Tool arguments as a JSON object, or as a JSON string encoding one"})),connect:oe.Optional(oe.String({description:"Server name to connect (lazy connect + metadata refresh)"})),describe:oe.Optional(oe.String({description:"Tool name to describe (shows parameters)"})),instructions:oe.Optional(oe.String({description:"Server name to show that server's usage instructions"})),search:oe.Optional(oe.String({description:"Search tools by name/description"})),regex:oe.Optional(oe.Boolean({description:"Treat search as regex (default: substring match)"})),includeSchemas:oe.Optional(oe.Boolean({description:"Include parameter schemas in search results (default: true)"})),limit:Pa({minimum:1,description:"Maximum search results to return (default: 12)"}),offset:Pa({minimum:0,description:"Search result offset (default: 0)"}),server:oe.Optional(oe.String({description:"Filter to specific server (also disambiguates tool calls)"})),action:oe.Optional(oe.String({description:"Action: 'ui-messages', 'auth-start', or 'auth-complete'"}))}),renderResult:L,async execute(k,A,_,z,V){let N=s,Y=(Z=>{if(Z===void 0||Z==="")return;let W;if(typeof Z=="string")try{W=JSON.parse(Z)}catch(he){throw he instanceof SyntaxError?new Error(`Invalid args JSON: ${he.message}`,{cause:he}):he}else W=Z;if(typeof W!="object"||W===null||Array.isArray(W)){let he=Array.isArray(W)?"array":W===null?"null":typeof W;throw new Error(`Invalid args: expected a JSON object, got ${he}`)}return W})(A.args);if(!(Z=>Z.tool!==void 0||Z.connect!==void 0||Z.describe!==void 0||Z.instructions!==void 0||Z.search!==void 0||Z.server!==void 0||Z.action!==void 0)(A)&&A.args!==void 0)throw new Error('Gateway params were nested inside `args`; pass them top-level (for example, mcp({ search: "..." }) or mcp({ tool: "...", args: {} })).');if(!o&&!i&&u&&(g(V),N=s),!o&&i)try{let Z=await Aa(i,Hr);if(Z===Ra)return{content:[{type:"text",text:"MCP initialization is still in progress. Try again shortly."}],details:{error:"init_timeout",timeoutMs:Hr}};N?.throwIfInactive(),o=Z}catch(Z){if(N&&p(Z,N))throw Z;let W=d(Z);return{content:[{type:"text",text:f("MCP initialization failed",W)}],details:{error:"init_failed",message:W}}}if(!o)return{content:[{type:"text",text:u?f("MCP is not initialized after an earlier initialization failure"):"MCP not initialized"}],details:{error:"not_initialized",...u?{message:u}:{}}};if(N?.throwIfInactive(),A.action==="ui-messages")return jd(o);if(A.action==="auth-start")return A.server?_?ga(o,A.server,_):ga(o,A.server):{content:[{type:"text",text:'auth-start requires `server`. Example: mcp({ action: "auth-start", server: "linear-server" })'}],details:{mode:"auth-start",error:"missing_server"}};if(A.action==="auth-complete"){if(!A.server)return{content:[{type:"text",text:"auth-complete requires `server`."}],details:{mode:"auth-complete",error:"missing_server"}};let Z=Y?.redirectUrl??Y?.code??Y?.input;return typeof Z!="string"||Z.trim().length===0?{content:[{type:"text",text:"auth-complete requires args with `redirectUrl`, `code`, or `input`."}],details:{mode:"auth-complete",error:"missing_input"}}:_?ma(o,A.server,Z,_):ma(o,A.server,Z)}if(A.tool)return tr(o,A.tool,Y,A.server,ee,_);if(A.connect){let Z=await qd(o,A.connect,_);return Re(V),Z}return A.describe?Hd(o,A.describe):A.instructions?zd(o,A.instructions):A.search!==void 0?Fd(o,A.search,A.regex,A.server,A.includeSchemas,A.limit,A.offset):A.server?ha(o,A.server):Bd(o)}}),H=!0,$=x}function et(x,k,A){let _=Fn(x,k,m===void 0||m==="__none__"?void 0:S);if(x.settings?.disableProxyTool!==!0||A.length===0||_.length>0){let V=Td(x);if(!H||$!==V){we(V);return}let N=ne();N&&!N.includes("mcp")&&t.setActiveTools([...N,"mcp"]);return}H&&Se(["mcp"]).includes("mcp")&&(H=!1,$=null)}let Dt=Xe(b,v);et(b,v,Dt.specs),St(b,v,Dt.reservedDirectNames,Dt.activeDirectNames),Ie()}function Iw(t={}){let e=t.config!==void 0?Vt(t.config):void 0;return function(r){$w(r,{...t.configPath!==void 0?{configPath:t.configPath}:{},...e!==void 0?{config:Vt(e)}:{}})}}function RP(t){let{pi:e,name:n,definition:r}=t,o=wf.get(e);if(o)return o(n,r);let i={version:yf,name:n,definition:r};if(e.events.emit(hf,i),!i.result)throw new Error("pi-mcp-adapter is not installed for this Pi instance");if(!i.result.ok)throw i.result.error;return i.result.registration}function EP(t){let{pi:e,name:n}=t,r=bf.get(e);if(r)return r(n);let o={version:Sf,name:n};if(e.events.emit(vf,o),!o.result)throw new Error("pi-mcp-adapter is not installed for this Pi instance");if(!o.result.ok)throw o.result.error;return o.result.snapshot}var kP=Iw();export{hf as MCP_RUNTIME_REGISTER_EVENT,yf as MCP_RUNTIME_REGISTER_VERSION,vf as MCP_RUNTIME_SNAPSHOT_EVENT,Sf as MCP_RUNTIME_SNAPSHOT_VERSION,ir as MCP_STATUS_EVENT,sr as MCP_STATUS_SNAPSHOT_VERSION,Si as MCP_TOOL_APPROVAL_REQUEST_EVENT,Iw as createMcpAdapter,kP as default,EP as getRuntimeMcpServerSnapshot,Ut as namespaceProxyName,df as parseMcpReference,RP as registerMcpServer,Sw as resolveMcpToolReferences};