@herbertgao/pi-extensions 2026.8.1 → 2026.8.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 (403) hide show
  1. package/README.md +13 -3
  2. package/node_modules/@czottmann/pi-automode/README.md +16 -2
  3. package/node_modules/@czottmann/pi-automode/docs/GLOSSARY.md +35 -0
  4. package/node_modules/@czottmann/pi-automode/docs/automode-classifier-flow.md +18 -9
  5. package/node_modules/@czottmann/pi-automode/docs/defaults.md +6 -2
  6. package/node_modules/@czottmann/pi-automode/examples/automode.local.json +6 -0
  7. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/classifier.ts +11 -7
  8. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/config.ts +100 -0
  9. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/constants.ts +32 -0
  10. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/extension.ts +78 -3
  11. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/hard-deny.ts +16 -4
  12. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/paths.ts +23 -1
  13. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/permissions.ts +22 -1
  14. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/types.ts +18 -2
  15. package/node_modules/@czottmann/pi-automode/package.json +4 -4
  16. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-audit.md +5 -0
  17. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-debt.md +5 -0
  18. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-gain.md +5 -0
  19. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-help.md +5 -0
  20. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-review.md +5 -0
  21. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail.md +5 -0
  22. package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/ponytail-frontmatter.cjs +23 -0
  23. package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/ponytail.mjs +99 -0
  24. package/node_modules/@dietrichgebert/ponytail/.qoder/rules/ponytail.md +30 -0
  25. package/node_modules/@dietrichgebert/ponytail/.qoder-plugin/plugin.json +16 -0
  26. package/node_modules/@dietrichgebert/ponytail/AGENTS.md +32 -0
  27. package/node_modules/@dietrichgebert/ponytail/LICENSE +21 -0
  28. package/node_modules/@dietrichgebert/ponytail/README.es.md +298 -0
  29. package/node_modules/@dietrichgebert/ponytail/README.ko.md +315 -0
  30. package/node_modules/@dietrichgebert/ponytail/README.md +351 -0
  31. package/node_modules/@dietrichgebert/ponytail/assets/benchmark-3model.svg +21 -0
  32. package/node_modules/@dietrichgebert/ponytail/assets/benchmark-agentic.svg +62 -0
  33. package/node_modules/@dietrichgebert/ponytail/assets/logo-dark.png +0 -0
  34. package/node_modules/@dietrichgebert/ponytail/assets/logo-dark.svg +115 -0
  35. package/node_modules/@dietrichgebert/ponytail/assets/logo-greenpt-dark.svg +27 -0
  36. package/node_modules/@dietrichgebert/ponytail/assets/logo-greenpt.svg +27 -0
  37. package/node_modules/@dietrichgebert/ponytail/assets/logo.png +0 -0
  38. package/node_modules/@dietrichgebert/ponytail/assets/social-preview.png +0 -0
  39. package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner-es.png +0 -0
  40. package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner-ko.png +0 -0
  41. package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner.png +0 -0
  42. package/node_modules/@dietrichgebert/ponytail/hooks/claude-codex-hooks.json +44 -0
  43. package/node_modules/@dietrichgebert/ponytail/hooks/copilot-hooks.json +21 -0
  44. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-activate.js +96 -0
  45. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-config.js +169 -0
  46. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-instructions.js +98 -0
  47. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-mode-tracker.js +130 -0
  48. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-runtime.js +85 -0
  49. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-statusline.ps1 +24 -0
  50. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-statusline.sh +18 -0
  51. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-subagent.js +77 -0
  52. package/node_modules/@dietrichgebert/ponytail/hooks/qoder-hooks.json +26 -0
  53. package/node_modules/@dietrichgebert/ponytail/package.json +47 -0
  54. package/node_modules/@dietrichgebert/ponytail/pi-extension/index.js +211 -0
  55. package/node_modules/@dietrichgebert/ponytail/pi-extension/package.json +8 -0
  56. package/node_modules/@dietrichgebert/ponytail/scripts/uninstall.js +60 -0
  57. package/node_modules/@dietrichgebert/ponytail/skills/ponytail/SKILL.md +120 -0
  58. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-audit/SKILL.md +41 -0
  59. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-debt/SKILL.md +44 -0
  60. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-gain/SKILL.md +50 -0
  61. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-help/SKILL.md +71 -0
  62. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-review/SKILL.md +57 -0
  63. package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +6 -10
  64. package/node_modules/@herbertgao/pi-cc-extensions/README.md +5 -9
  65. package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/hero.en.svg +101 -0
  66. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +1 -17
  67. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +15 -9
  68. package/node_modules/@herbertgao/pi-cc-extensions/extensions/{utils/agent-summary.ts → feature/agent-summary/core.ts} +37 -35
  69. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{agent-summary.ts → agent-summary/index.ts} +3 -3
  70. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +24 -83
  71. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +1 -1
  72. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{session-reference.ts → reference/index.ts} +1 -1
  73. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{agent-autocomplete.ts → reference/subagent.ts} +19 -9
  74. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{pi-startup-header.ts → shell/startup-header.ts} +1 -1
  75. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{working-message.ts → shell/working-message.ts} +5 -2
  76. package/node_modules/@herbertgao/pi-cc-extensions/extensions/index.ts +32 -28
  77. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +452 -94
  78. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +727 -0
  79. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/index.ts +66 -776
  80. package/node_modules/@herbertgao/pi-cc-extensions/extensions/{feature → renderer}/markdown-enhance.ts +134 -11
  81. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/hover.ts +130 -0
  82. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{mouse-interaction.ts → mouse/interaction.ts} +90 -568
  83. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/layout.ts +144 -0
  84. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/packets.ts +143 -0
  85. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/scroll.ts +195 -0
  86. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/ansi-utils.ts +56 -1
  87. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/diff-renderer.ts +4 -4
  88. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/line-width-safety.ts +1 -1
  89. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-display-utils.ts +12 -0
  90. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/write-execution.ts +1 -2
  91. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-grouping.ts → tool/grouping.ts} +27 -10
  92. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-result.ts → tool/result.ts} +4 -13
  93. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/transcript-refresh.ts +91 -0
  94. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/fullscreen-detect.ts +0 -27
  95. package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
  96. package/node_modules/@herbertgao/pi-cc-extensions/themes/cc-dark.json +1 -0
  97. package/node_modules/@herbertgao/pi-cc-extensions/themes/cc-light.json +2 -2
  98. package/node_modules/@herbertgao/pi-stash/README.md +9 -9
  99. package/node_modules/@herbertgao/pi-stash/package.json +1 -1
  100. package/node_modules/@herbertgao/pi-stash/src/index.ts +2 -1
  101. package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +20 -0
  102. package/node_modules/@herbertgao/pi-subagents/README.md +6 -2
  103. package/node_modules/@herbertgao/pi-subagents/package.json +3 -3
  104. package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +1 -0
  105. package/node_modules/@herbertgao/pi-subagents/src/agent-runner.ts +3 -1
  106. package/node_modules/@herbertgao/pi-subagents/src/custom-agents.ts +85 -11
  107. package/node_modules/@herbertgao/pi-subagents/src/index.ts +61 -39
  108. package/node_modules/@herbertgao/pi-subagents/src/nested-tools.ts +26 -35
  109. package/node_modules/@herbertgao/pi-subagents/src/prompts.ts +15 -1
  110. package/node_modules/@herbertgao/pi-subagents/src/settings.ts +12 -0
  111. package/node_modules/@herbertgao/pi-subagents/src/types.ts +2 -0
  112. package/node_modules/@narumitw/pi-btw/LICENSE +21 -0
  113. package/node_modules/@narumitw/pi-btw/README.md +210 -0
  114. package/node_modules/@narumitw/pi-btw/package.json +53 -0
  115. package/node_modules/@narumitw/pi-btw/src/bring-to-main.ts +632 -0
  116. package/node_modules/@narumitw/pi-btw/src/btw.ts +996 -0
  117. package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +339 -0
  118. package/node_modules/@narumitw/pi-btw/src/index.ts +1 -0
  119. package/node_modules/@narumitw/pi-btw/src/menu.ts +296 -0
  120. package/node_modules/@narumitw/pi-btw/src/settings.ts +237 -0
  121. package/node_modules/@narumitw/pi-btw/src/side-thread.ts +238 -0
  122. package/node_modules/@narumitw/pi-btw/src/text.ts +10 -0
  123. package/node_modules/@narumitw/pi-btw/src/transcript-pager.ts +620 -0
  124. package/node_modules/@pi-plugins/fast-mode/LICENSE +21 -0
  125. package/node_modules/@pi-plugins/fast-mode/README.md +92 -0
  126. package/node_modules/@pi-plugins/fast-mode/dist/index.d.mts +6 -0
  127. package/node_modules/@pi-plugins/fast-mode/dist/index.d.mts.map +1 -0
  128. package/node_modules/@pi-plugins/fast-mode/dist/index.mjs +2026 -0
  129. package/node_modules/@pi-plugins/fast-mode/dist/index.mjs.map +1 -0
  130. package/node_modules/@pi-plugins/fast-mode/package.json +73 -0
  131. package/node_modules/pi-mcp-adapter/CHANGELOG.md +78 -0
  132. package/node_modules/pi-mcp-adapter/README.md +80 -16
  133. package/node_modules/pi-mcp-adapter/agent-dir.ts +40 -0
  134. package/node_modules/pi-mcp-adapter/agent-plugin-loader.ts +377 -0
  135. package/node_modules/pi-mcp-adapter/commands.ts +21 -9
  136. package/node_modules/pi-mcp-adapter/config.ts +110 -49
  137. package/node_modules/pi-mcp-adapter/direct-tools.ts +40 -27
  138. package/node_modules/pi-mcp-adapter/elicitation-handler.ts +37 -36
  139. package/node_modules/pi-mcp-adapter/errors.ts +21 -17
  140. package/node_modules/pi-mcp-adapter/host-html-template.ts +13 -7
  141. package/node_modules/pi-mcp-adapter/index.ts +52 -17
  142. package/node_modules/pi-mcp-adapter/init.ts +9 -7
  143. package/node_modules/pi-mcp-adapter/json-schema-validator.ts +2 -2
  144. package/node_modules/pi-mcp-adapter/lifecycle.ts +8 -8
  145. package/node_modules/pi-mcp-adapter/logger.ts +1 -1
  146. package/node_modules/pi-mcp-adapter/mcp-auth-flow.ts +122 -25
  147. package/node_modules/pi-mcp-adapter/mcp-auth.ts +120 -2
  148. package/node_modules/pi-mcp-adapter/mcp-callback-server.ts +138 -61
  149. package/node_modules/pi-mcp-adapter/mcp-code.ts +13 -11
  150. package/node_modules/pi-mcp-adapter/mcp-oauth-provider.ts +62 -17
  151. package/node_modules/pi-mcp-adapter/mcp-output-guard.ts +15 -11
  152. package/node_modules/pi-mcp-adapter/mcp-panel.ts +34 -15
  153. package/node_modules/pi-mcp-adapter/mcp-probe.ts +131 -34
  154. package/node_modules/pi-mcp-adapter/mcp-script-worker.mjs +2 -2
  155. package/node_modules/pi-mcp-adapter/mcp-setup-panel.ts +7 -4
  156. package/node_modules/pi-mcp-adapter/mcp-trace.ts +59 -64
  157. package/node_modules/pi-mcp-adapter/metadata-cache.ts +34 -26
  158. package/node_modules/pi-mcp-adapter/npx-resolver.ts +6 -4
  159. package/node_modules/pi-mcp-adapter/oauth-handler.ts +1 -1
  160. package/node_modules/pi-mcp-adapter/oauth.ts +48 -0
  161. package/node_modules/pi-mcp-adapter/onboarding-state.ts +19 -11
  162. package/node_modules/pi-mcp-adapter/package.json +20 -9
  163. package/node_modules/pi-mcp-adapter/panel-keys.ts +20 -4
  164. package/node_modules/pi-mcp-adapter/prompts.ts +2 -2
  165. package/node_modules/pi-mcp-adapter/proxy-modes.ts +56 -21
  166. package/node_modules/pi-mcp-adapter/sampling-handler.ts +22 -15
  167. package/node_modules/pi-mcp-adapter/search-ranking.ts +2 -1
  168. package/node_modules/pi-mcp-adapter/server-manager.ts +165 -113
  169. package/node_modules/pi-mcp-adapter/session-recovery.ts +11 -12
  170. package/node_modules/pi-mcp-adapter/skills/mcp-scripting/SKILL.md +3 -3
  171. package/node_modules/pi-mcp-adapter/state.ts +3 -1
  172. package/node_modules/pi-mcp-adapter/tool-approval.ts +67 -4
  173. package/node_modules/pi-mcp-adapter/tool-metadata.ts +6 -5
  174. package/node_modules/pi-mcp-adapter/tool-registrar.ts +187 -3
  175. package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +14 -2
  176. package/node_modules/pi-mcp-adapter/ts-shape.ts +9 -2
  177. package/node_modules/pi-mcp-adapter/types.ts +111 -22
  178. package/node_modules/pi-mcp-adapter/ui-app-bridge-helpers.ts +40 -0
  179. package/node_modules/pi-mcp-adapter/ui-resource-handler.ts +28 -19
  180. package/node_modules/pi-mcp-adapter/ui-server.ts +90 -58
  181. package/node_modules/pi-mcp-adapter/ui-session.ts +16 -14
  182. package/node_modules/pi-mcp-adapter/unix-socket-transport.ts +4 -4
  183. package/node_modules/pi-mcp-adapter/utils.ts +23 -9
  184. package/node_modules/pi-web-access/CHANGELOG.md +45 -0
  185. package/node_modules/pi-web-access/README.md +104 -29
  186. package/node_modules/pi-web-access/bocha.ts +221 -0
  187. package/node_modules/pi-web-access/curator-page.ts +113 -12
  188. package/node_modules/pi-web-access/curator-server.ts +56 -20
  189. package/node_modules/pi-web-access/datalab-pdf-extract.ts +568 -0
  190. package/node_modules/pi-web-access/duckduckgo.ts +123 -0
  191. package/node_modules/pi-web-access/extract.ts +288 -143
  192. package/node_modules/pi-web-access/feature-config.ts +29 -0
  193. package/node_modules/pi-web-access/gemini-api.ts +4 -0
  194. package/node_modules/pi-web-access/gemini-search.ts +45 -12
  195. package/node_modules/pi-web-access/gemini-web.ts +68 -3
  196. package/node_modules/pi-web-access/index.ts +160 -71
  197. package/node_modules/pi-web-access/jina-search.ts +284 -0
  198. package/node_modules/pi-web-access/kagi.ts +12 -12
  199. package/node_modules/pi-web-access/openai-search.ts +12 -2
  200. package/node_modules/pi-web-access/package.json +4 -3
  201. package/node_modules/pi-web-access/pdf-extract.ts +327 -228
  202. package/node_modules/pi-web-access/storage.ts +440 -2
  203. package/node_modules/pi-web-access/summary-model-scope.ts +1 -1
  204. package/node_modules/pi-web-access/summary-review.ts +4 -2
  205. package/node_modules/pi-web-access/video-extract.ts +10 -8
  206. package/node_modules/pi-web-access/xai-search.ts +12 -2
  207. package/node_modules/pi-web-access/youtube-extract.ts +2 -1
  208. package/node_modules/remote-pi/LICENSE +21 -0
  209. package/node_modules/remote-pi/README.md +675 -0
  210. package/node_modules/remote-pi/dist/actions/handlers.d.ts +122 -0
  211. package/node_modules/remote-pi/dist/actions/handlers.js +160 -0
  212. package/node_modules/remote-pi/dist/actions/handlers.js.map +1 -0
  213. package/node_modules/remote-pi/dist/actions/registry.d.ts +39 -0
  214. package/node_modules/remote-pi/dist/actions/registry.js +58 -0
  215. package/node_modules/remote-pi/dist/actions/registry.js.map +1 -0
  216. package/node_modules/remote-pi/dist/bin/supervisord.d.ts +2 -0
  217. package/node_modules/remote-pi/dist/bin/supervisord.js +86 -0
  218. package/node_modules/remote-pi/dist/bin/supervisord.js.map +1 -0
  219. package/node_modules/remote-pi/dist/commands/builtin_mirror.d.ts +58 -0
  220. package/node_modules/remote-pi/dist/commands/builtin_mirror.js +71 -0
  221. package/node_modules/remote-pi/dist/commands/builtin_mirror.js.map +1 -0
  222. package/node_modules/remote-pi/dist/commands/list_commands.d.ts +60 -0
  223. package/node_modules/remote-pi/dist/commands/list_commands.js +73 -0
  224. package/node_modules/remote-pi/dist/commands/list_commands.js.map +1 -0
  225. package/node_modules/remote-pi/dist/config.d.ts +62 -0
  226. package/node_modules/remote-pi/dist/config.js +115 -0
  227. package/node_modules/remote-pi/dist/config.js.map +1 -0
  228. package/node_modules/remote-pi/dist/daemon/client.d.ts +20 -0
  229. package/node_modules/remote-pi/dist/daemon/client.js +131 -0
  230. package/node_modules/remote-pi/dist/daemon/client.js.map +1 -0
  231. package/node_modules/remote-pi/dist/daemon/control_protocol.d.ts +176 -0
  232. package/node_modules/remote-pi/dist/daemon/control_protocol.js +63 -0
  233. package/node_modules/remote-pi/dist/daemon/control_protocol.js.map +1 -0
  234. package/node_modules/remote-pi/dist/daemon/cron_log.d.ts +45 -0
  235. package/node_modules/remote-pi/dist/daemon/cron_log.js +72 -0
  236. package/node_modules/remote-pi/dist/daemon/cron_log.js.map +1 -0
  237. package/node_modules/remote-pi/dist/daemon/cron_registry.d.ts +80 -0
  238. package/node_modules/remote-pi/dist/daemon/cron_registry.js +194 -0
  239. package/node_modules/remote-pi/dist/daemon/cron_registry.js.map +1 -0
  240. package/node_modules/remote-pi/dist/daemon/id.d.ts +24 -0
  241. package/node_modules/remote-pi/dist/daemon/id.js +36 -0
  242. package/node_modules/remote-pi/dist/daemon/id.js.map +1 -0
  243. package/node_modules/remote-pi/dist/daemon/install.d.ts +170 -0
  244. package/node_modules/remote-pi/dist/daemon/install.js +547 -0
  245. package/node_modules/remote-pi/dist/daemon/install.js.map +1 -0
  246. package/node_modules/remote-pi/dist/daemon/registry.d.ts +63 -0
  247. package/node_modules/remote-pi/dist/daemon/registry.js +153 -0
  248. package/node_modules/remote-pi/dist/daemon/registry.js.map +1 -0
  249. package/node_modules/remote-pi/dist/daemon/rpc_child.d.ts +194 -0
  250. package/node_modules/remote-pi/dist/daemon/rpc_child.js +389 -0
  251. package/node_modules/remote-pi/dist/daemon/rpc_child.js.map +1 -0
  252. package/node_modules/remote-pi/dist/daemon/supervisor.d.ts +93 -0
  253. package/node_modules/remote-pi/dist/daemon/supervisor.js +596 -0
  254. package/node_modules/remote-pi/dist/daemon/supervisor.js.map +1 -0
  255. package/node_modules/remote-pi/dist/extension_ui_bridge.d.ts +26 -0
  256. package/node_modules/remote-pi/dist/extension_ui_bridge.js +341 -0
  257. package/node_modules/remote-pi/dist/extension_ui_bridge.js.map +1 -0
  258. package/node_modules/remote-pi/dist/index.d.ts +213 -0
  259. package/node_modules/remote-pi/dist/index.js +4996 -0
  260. package/node_modules/remote-pi/dist/index.js.map +1 -0
  261. package/node_modules/remote-pi/dist/mcp/mesh_result.d.ts +10 -0
  262. package/node_modules/remote-pi/dist/mcp/mesh_result.js +42 -0
  263. package/node_modules/remote-pi/dist/mcp/mesh_result.js.map +1 -0
  264. package/node_modules/remote-pi/dist/mcp/mesh_server.d.ts +16 -0
  265. package/node_modules/remote-pi/dist/mcp/mesh_server.js +327 -0
  266. package/node_modules/remote-pi/dist/mcp/mesh_server.js.map +1 -0
  267. package/node_modules/remote-pi/dist/mesh/canonical.d.ts +30 -0
  268. package/node_modules/remote-pi/dist/mesh/canonical.js +61 -0
  269. package/node_modules/remote-pi/dist/mesh/canonical.js.map +1 -0
  270. package/node_modules/remote-pi/dist/mesh/client.d.ts +18 -0
  271. package/node_modules/remote-pi/dist/mesh/client.js +125 -0
  272. package/node_modules/remote-pi/dist/mesh/client.js.map +1 -0
  273. package/node_modules/remote-pi/dist/mesh/encoding.d.ts +38 -0
  274. package/node_modules/remote-pi/dist/mesh/encoding.js +216 -0
  275. package/node_modules/remote-pi/dist/mesh/encoding.js.map +1 -0
  276. package/node_modules/remote-pi/dist/mesh/self_revoke.d.ts +73 -0
  277. package/node_modules/remote-pi/dist/mesh/self_revoke.js +401 -0
  278. package/node_modules/remote-pi/dist/mesh/self_revoke.js.map +1 -0
  279. package/node_modules/remote-pi/dist/mesh/siblings.d.ts +49 -0
  280. package/node_modules/remote-pi/dist/mesh/siblings.js +159 -0
  281. package/node_modules/remote-pi/dist/mesh/siblings.js.map +1 -0
  282. package/node_modules/remote-pi/dist/mesh/types.d.ts +34 -0
  283. package/node_modules/remote-pi/dist/mesh/types.js +11 -0
  284. package/node_modules/remote-pi/dist/mesh/types.js.map +1 -0
  285. package/node_modules/remote-pi/dist/mesh/verify.d.ts +17 -0
  286. package/node_modules/remote-pi/dist/mesh/verify.js +86 -0
  287. package/node_modules/remote-pi/dist/mesh/verify.js.map +1 -0
  288. package/node_modules/remote-pi/dist/pairing/crypto.d.ts +8 -0
  289. package/node_modules/remote-pi/dist/pairing/crypto.js +22 -0
  290. package/node_modules/remote-pi/dist/pairing/crypto.js.map +1 -0
  291. package/node_modules/remote-pi/dist/pairing/handshake.d.ts +28 -0
  292. package/node_modules/remote-pi/dist/pairing/handshake.js +113 -0
  293. package/node_modules/remote-pi/dist/pairing/handshake.js.map +1 -0
  294. package/node_modules/remote-pi/dist/pairing/noise-sha256.d.ts +16 -0
  295. package/node_modules/remote-pi/dist/pairing/noise-sha256.js +103 -0
  296. package/node_modules/remote-pi/dist/pairing/noise-sha256.js.map +1 -0
  297. package/node_modules/remote-pi/dist/pairing/qr.d.ts +59 -0
  298. package/node_modules/remote-pi/dist/pairing/qr.js +125 -0
  299. package/node_modules/remote-pi/dist/pairing/qr.js.map +1 -0
  300. package/node_modules/remote-pi/dist/pairing/storage.d.ts +120 -0
  301. package/node_modules/remote-pi/dist/pairing/storage.js +604 -0
  302. package/node_modules/remote-pi/dist/pairing/storage.js.map +1 -0
  303. package/node_modules/remote-pi/dist/protocol/codec.d.ts +7 -0
  304. package/node_modules/remote-pi/dist/protocol/codec.js +49 -0
  305. package/node_modules/remote-pi/dist/protocol/codec.js.map +1 -0
  306. package/node_modules/remote-pi/dist/protocol/types.d.ts +393 -0
  307. package/node_modules/remote-pi/dist/protocol/types.js +2 -0
  308. package/node_modules/remote-pi/dist/protocol/types.js.map +1 -0
  309. package/node_modules/remote-pi/dist/rooms.d.ts +29 -0
  310. package/node_modules/remote-pi/dist/rooms.js +57 -0
  311. package/node_modules/remote-pi/dist/rooms.js.map +1 -0
  312. package/node_modules/remote-pi/dist/session/address.d.ts +49 -0
  313. package/node_modules/remote-pi/dist/session/address.js +58 -0
  314. package/node_modules/remote-pi/dist/session/address.js.map +1 -0
  315. package/node_modules/remote-pi/dist/session/agent_bridge.d.ts +55 -0
  316. package/node_modules/remote-pi/dist/session/agent_bridge.js +146 -0
  317. package/node_modules/remote-pi/dist/session/agent_bridge.js.map +1 -0
  318. package/node_modules/remote-pi/dist/session/bridge.d.ts +37 -0
  319. package/node_modules/remote-pi/dist/session/bridge.js +130 -0
  320. package/node_modules/remote-pi/dist/session/bridge.js.map +1 -0
  321. package/node_modules/remote-pi/dist/session/broker.d.ts +189 -0
  322. package/node_modules/remote-pi/dist/session/broker.js +507 -0
  323. package/node_modules/remote-pi/dist/session/broker.js.map +1 -0
  324. package/node_modules/remote-pi/dist/session/broker_remote.d.ts +74 -0
  325. package/node_modules/remote-pi/dist/session/broker_remote.js +583 -0
  326. package/node_modules/remote-pi/dist/session/broker_remote.js.map +1 -0
  327. package/node_modules/remote-pi/dist/session/cwd_lock.d.ts +33 -0
  328. package/node_modules/remote-pi/dist/session/cwd_lock.js +126 -0
  329. package/node_modules/remote-pi/dist/session/cwd_lock.js.map +1 -0
  330. package/node_modules/remote-pi/dist/session/envelope.d.ts +33 -0
  331. package/node_modules/remote-pi/dist/session/envelope.js +117 -0
  332. package/node_modules/remote-pi/dist/session/envelope.js.map +1 -0
  333. package/node_modules/remote-pi/dist/session/global_config.d.ts +33 -0
  334. package/node_modules/remote-pi/dist/session/global_config.js +73 -0
  335. package/node_modules/remote-pi/dist/session/global_config.js.map +1 -0
  336. package/node_modules/remote-pi/dist/session/ipc.d.ts +27 -0
  337. package/node_modules/remote-pi/dist/session/ipc.js +22 -0
  338. package/node_modules/remote-pi/dist/session/ipc.js.map +1 -0
  339. package/node_modules/remote-pi/dist/session/leader_election.d.ts +32 -0
  340. package/node_modules/remote-pi/dist/session/leader_election.js +106 -0
  341. package/node_modules/remote-pi/dist/session/leader_election.js.map +1 -0
  342. package/node_modules/remote-pi/dist/session/local_config.d.ts +55 -0
  343. package/node_modules/remote-pi/dist/session/local_config.js +157 -0
  344. package/node_modules/remote-pi/dist/session/local_config.js.map +1 -0
  345. package/node_modules/remote-pi/dist/session/mesh_message.d.ts +20 -0
  346. package/node_modules/remote-pi/dist/session/mesh_message.js +28 -0
  347. package/node_modules/remote-pi/dist/session/mesh_message.js.map +1 -0
  348. package/node_modules/remote-pi/dist/session/mesh_node.d.ts +116 -0
  349. package/node_modules/remote-pi/dist/session/mesh_node.js +573 -0
  350. package/node_modules/remote-pi/dist/session/mesh_node.js.map +1 -0
  351. package/node_modules/remote-pi/dist/session/peer.d.ts +139 -0
  352. package/node_modules/remote-pi/dist/session/peer.js +451 -0
  353. package/node_modules/remote-pi/dist/session/peer.js.map +1 -0
  354. package/node_modules/remote-pi/dist/session/peer_inventory.d.ts +13 -0
  355. package/node_modules/remote-pi/dist/session/peer_inventory.js +48 -0
  356. package/node_modules/remote-pi/dist/session/peer_inventory.js.map +1 -0
  357. package/node_modules/remote-pi/dist/session/peer_limits.d.ts +9 -0
  358. package/node_modules/remote-pi/dist/session/peer_limits.js +21 -0
  359. package/node_modules/remote-pi/dist/session/peer_limits.js.map +1 -0
  360. package/node_modules/remote-pi/dist/session/setup_wizard.d.ts +39 -0
  361. package/node_modules/remote-pi/dist/session/setup_wizard.js +63 -0
  362. package/node_modules/remote-pi/dist/session/setup_wizard.js.map +1 -0
  363. package/node_modules/remote-pi/dist/session/tool_gate.d.ts +5 -0
  364. package/node_modules/remote-pi/dist/session/tool_gate.js +11 -0
  365. package/node_modules/remote-pi/dist/session/tool_gate.js.map +1 -0
  366. package/node_modules/remote-pi/dist/session/tools.d.ts +24 -0
  367. package/node_modules/remote-pi/dist/session/tools.js +252 -0
  368. package/node_modules/remote-pi/dist/session/tools.js.map +1 -0
  369. package/node_modules/remote-pi/dist/session/wizard.d.ts +13 -0
  370. package/node_modules/remote-pi/dist/session/wizard.js +20 -0
  371. package/node_modules/remote-pi/dist/session/wizard.js.map +1 -0
  372. package/node_modules/remote-pi/dist/settings.d.ts +15 -0
  373. package/node_modules/remote-pi/dist/settings.js +52 -0
  374. package/node_modules/remote-pi/dist/settings.js.map +1 -0
  375. package/node_modules/remote-pi/dist/transport/peer_channel.d.ts +37 -0
  376. package/node_modules/remote-pi/dist/transport/peer_channel.js +98 -0
  377. package/node_modules/remote-pi/dist/transport/peer_channel.js.map +1 -0
  378. package/node_modules/remote-pi/dist/transport/pi_forward_client.d.ts +29 -0
  379. package/node_modules/remote-pi/dist/transport/pi_forward_client.js +62 -0
  380. package/node_modules/remote-pi/dist/transport/pi_forward_client.js.map +1 -0
  381. package/node_modules/remote-pi/dist/transport/relay_client.d.ts +91 -0
  382. package/node_modules/remote-pi/dist/transport/relay_client.js +206 -0
  383. package/node_modules/remote-pi/dist/transport/relay_client.js.map +1 -0
  384. package/node_modules/remote-pi/dist/ui/footer.d.ts +32 -0
  385. package/node_modules/remote-pi/dist/ui/footer.js +34 -0
  386. package/node_modules/remote-pi/dist/ui/footer.js.map +1 -0
  387. package/node_modules/remote-pi/docs/daemon.md +289 -0
  388. package/node_modules/remote-pi/package.json +88 -0
  389. package/node_modules/remote-pi/service-templates/launchd.plist.template +35 -0
  390. package/node_modules/remote-pi/service-templates/systemd.service.template +19 -0
  391. package/node_modules/remote-pi/service-templates/task-launcher.vbs.template +10 -0
  392. package/node_modules/remote-pi/service-templates/task-scheduler.xml.template +38 -0
  393. package/node_modules/remote-pi/skills/agent-network/SKILL.md +310 -0
  394. package/package.json +37 -12
  395. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool-diff/write-display-utils.ts +0 -29
  396. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{session-reference-core.ts → reference/session.ts} +0 -0
  397. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{pi-aliases.ts → shell/aliases.ts} +0 -0
  398. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/ATTRIBUTION.md +0 -0
  399. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/diff-presentation.ts +0 -0
  400. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/index.ts +0 -0
  401. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/render-utils.ts +0 -0
  402. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/shiki-highlight.ts +0 -0
  403. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/types.ts +0 -0
@@ -52,6 +52,7 @@ function rainbowProgress(filled: number, total: number): string {
52
52
  const dots: string[] = [];
53
53
  for (let i = 0; i < total; i++) {
54
54
  const color = RAINBOW_COLORS[i % RAINBOW_COLORS.length];
55
+ if (!color) continue;
55
56
  dots.push(fg(color, i < filled ? "●" : "○"));
56
57
  }
57
58
  return dots.join(" ");
@@ -220,7 +221,10 @@ class McpPanel {
220
221
  }
221
222
 
222
223
  const isDirect = toolFilter === true || (Array.isArray(toolFilter) && toolFilter.includes(baseName));
223
- const ct: CachedTool = { name: baseName, description: resource.description };
224
+ const ct: CachedTool = {
225
+ name: baseName,
226
+ ...(resource.description !== undefined ? { description: resource.description } : {}),
227
+ };
224
228
  tools.push({
225
229
  name: baseName,
226
230
  description: resource.description ?? `Read resource: ${resource.uri}`,
@@ -239,9 +243,9 @@ class McpPanel {
239
243
  name: serverName,
240
244
  expanded: false,
241
245
  source: prov?.kind ?? "user",
242
- importKind: prov?.importKind,
243
- includeTools: definition.includeTools,
244
- excludeTools: definition.excludeTools,
246
+ ...(prov?.importKind !== undefined ? { importKind: prov.importKind } : {}),
247
+ ...(definition.includeTools !== undefined ? { includeTools: definition.includeTools } : {}),
248
+ ...(definition.excludeTools !== undefined ? { excludeTools: definition.excludeTools } : {}),
245
249
  exposeResources: definition.exposeResources !== false,
246
250
  connectionStatus: status,
247
251
  failureMessage,
@@ -276,6 +280,7 @@ class McpPanel {
276
280
  this.visibleItems = [];
277
281
  for (let si = 0; si < this.servers.length; si++) {
278
282
  const server = this.servers[si];
283
+ if (!server) continue;
279
284
  if (query && this.authOnly) {
280
285
  const score = mode === "name" ? fuzzyScore(query, server.name) : 0;
281
286
  if (score > 0) {
@@ -288,6 +293,7 @@ class McpPanel {
288
293
  if (server.expanded || query) {
289
294
  for (let ti = 0; ti < server.tools.length; ti++) {
290
295
  const tool = server.tools[ti];
296
+ if (!tool) continue;
291
297
  if (query) {
292
298
  const score = mode === "name"
293
299
  ? Math.max(
@@ -352,7 +358,7 @@ class McpPanel {
352
358
  return;
353
359
  }
354
360
 
355
- if (matchesKey(data, "ctrl+s")) {
361
+ if (this.keys.save(data)) {
356
362
  this.cleanup();
357
363
  this.done(this.buildResult());
358
364
  return;
@@ -422,6 +428,7 @@ class McpPanel {
422
428
  const item = this.visibleItems[this.cursorIndex];
423
429
  if (!item) return;
424
430
  const server = this.servers[item.serverIndex];
431
+ if (!server) return;
425
432
  if (item.type === "server") {
426
433
  if (server.connectionStatus === "disabled") return;
427
434
  if (this.authOnly || server.connectionStatus === "needs-auth") {
@@ -433,6 +440,7 @@ class McpPanel {
433
440
  this.cursorIndex = Math.min(this.cursorIndex, Math.max(0, this.visibleItems.length - 1));
434
441
  } else if (item.toolIndex !== undefined) {
435
442
  const tool = server.tools[item.toolIndex];
443
+ if (!tool) return;
436
444
  tool.isDirect = !tool.isDirect;
437
445
  if (tool.isDirect && server.source === "import") {
438
446
  this.importNotice = `Imported from ${sanitizeDisplayText(server.importKind ?? "external")} — will copy to user config on save`;
@@ -451,7 +459,8 @@ class McpPanel {
451
459
  if (matchesKey(data, "ctrl+r")) {
452
460
  const item = this.visibleItems[this.cursorIndex];
453
461
  if (!item) return;
454
- this.reconnectServer(this.servers[item.serverIndex]);
462
+ const server = this.servers[item.serverIndex];
463
+ if (server) this.reconnectServer(server);
455
464
  return;
456
465
  }
457
466
 
@@ -459,7 +468,7 @@ class McpPanel {
459
468
  const item = this.visibleItems[this.cursorIndex];
460
469
  if (!item) return;
461
470
  const server = this.servers[item.serverIndex];
462
- if (server.connectionStatus !== "failed" || !server.failureMessage) return;
471
+ if (!server || server.connectionStatus !== "failed" || !server.failureMessage) return;
463
472
  const serverName = sanitizeDisplayText(server.name);
464
473
  const failureMessage = sanitizeDisplayText(server.failureMessage);
465
474
  copyToClipboard(failureMessage).then(() => {
@@ -502,7 +511,8 @@ class McpPanel {
502
511
  }
503
512
 
504
513
  private authenticateSelectedServer(item: VisibleItem): void {
505
- this.authenticateServer(this.servers[item.serverIndex]);
514
+ const server = this.servers[item.serverIndex];
515
+ if (server) this.authenticateServer(server);
506
516
  }
507
517
 
508
518
  private authenticateServer(server: ServerState): void {
@@ -574,6 +584,7 @@ class McpPanel {
574
584
  private toggleItem(item: VisibleItem): void {
575
585
  if (this.authOnly) return;
576
586
  const server = this.servers[item.serverIndex];
587
+ if (!server) return;
577
588
  if (item.type === "server") {
578
589
  const newState = !server.tools.every((t) => t.isDirect);
579
590
  if (server.source === "import" && newState) {
@@ -582,6 +593,7 @@ class McpPanel {
582
593
  for (const t of server.tools) t.isDirect = newState;
583
594
  } else if (item.toolIndex !== undefined) {
584
595
  const tool = server.tools[item.toolIndex];
596
+ if (!tool) return;
585
597
  tool.isDirect = !tool.isDirect;
586
598
  if (tool.isDirect && server.source === "import") {
587
599
  this.importNotice = `Imported from ${sanitizeDisplayText(server.importKind ?? "external")} — will copy to user config on save`;
@@ -654,7 +666,10 @@ class McpPanel {
654
666
 
655
667
  const prev = existingState.get(baseName);
656
668
  const isDirect = prev !== undefined ? prev : false;
657
- const ct: CachedTool = { name: baseName, description: resource.description };
669
+ const ct: CachedTool = {
670
+ name: baseName,
671
+ ...(resource.description !== undefined ? { description: resource.description } : {}),
672
+ };
658
673
  newTools.push({
659
674
  name: baseName,
660
675
  description: resource.description ?? `Read resource: ${resource.uri}`,
@@ -724,8 +739,10 @@ class McpPanel {
724
739
 
725
740
  for (let i = startIdx; i < endIdx; i++) {
726
741
  const item = this.visibleItems[i];
742
+ if (!item) continue;
727
743
  const isCursor = i === this.cursorIndex;
728
744
  const server = this.servers[item.serverIndex];
745
+ if (!server) continue;
729
746
 
730
747
  if (item.type === "server") {
731
748
  lines.push(row(this.renderServerRow(server, isCursor)));
@@ -735,7 +752,8 @@ class McpPanel {
735
752
  }
736
753
  }
737
754
  } else if (item.toolIndex !== undefined) {
738
- lines.push(row(this.renderToolRow(server.tools[item.toolIndex], isCursor, innerW)));
755
+ const tool = server.tools[item.toolIndex];
756
+ if (tool) lines.push(row(this.renderToolRow(tool, isCursor, innerW)));
739
757
  }
740
758
  }
741
759
 
@@ -784,6 +802,7 @@ class McpPanel {
784
802
  }
785
803
 
786
804
  lines.push(emptyRow());
805
+ const saveLabel = this.keys.saveLabel();
787
806
  const hints = this.authOnly
788
807
  ? [
789
808
  italic("↑↓") + " navigate",
@@ -800,7 +819,7 @@ class McpPanel {
800
819
  italic("ctrl+r") + " reconnect",
801
820
  ...(this.selectedServerHasFailureMessage() ? [italic("ctrl+y") + " copy error"] : []),
802
821
  italic("?") + " desc search",
803
- italic("ctrl+s") + " save",
822
+ ...(saveLabel ? [italic(saveLabel) + " save"] : []),
804
823
  italic("esc") + " clear/close",
805
824
  italic("ctrl+c") + " quit",
806
825
  ];
@@ -871,7 +890,7 @@ class McpPanel {
871
890
  const item = this.visibleItems[this.cursorIndex];
872
891
  if (!item) return false;
873
892
  const server = this.servers[item.serverIndex];
874
- return server.connectionStatus === "failed" && !!server.failureMessage;
893
+ return server?.connectionStatus === "failed" && !!server.failureMessage;
875
894
  }
876
895
 
877
896
  private wrapText(text: string, width: number): string[] {
@@ -884,11 +903,11 @@ class McpPanel {
884
903
  while (visibleWidth(rest) > max) {
885
904
  let take = "";
886
905
  let index = 0;
887
- while (index < rest.length && visibleWidth(take + rest[index]) <= max) {
888
- take += rest[index];
906
+ while (index < rest.length && visibleWidth(take + rest.charAt(index)) <= max) {
907
+ take += rest.charAt(index);
889
908
  index++;
890
909
  }
891
- if (!take) take = rest[0];
910
+ if (!take) take = rest.charAt(0);
892
911
  lines.push(take);
893
912
  rest = rest.slice(take.length);
894
913
  }
@@ -1,25 +1,102 @@
1
1
  const PROBE_TIMEOUT_MS = 5_000;
2
+ const MODERN_PROTOCOL_VERSION = "2026-07-28";
3
+ const LEGACY_PROTOCOL_VERSION = "2025-06-18";
4
+ const JSON_ACCEPT = "application/json, text/event-stream";
5
+ const SSE_ACCEPT = "text/event-stream";
6
+ const MODERN_FALLBACK_STATUSES = new Set([400, 401, 404, 405, 406, 415]);
7
+ const POST_ENDPOINT_MISMATCH_STATUSES = new Set([404, 405, 406, 415]);
2
8
 
3
9
  export interface McpProbeResult {
4
10
  isMcp: boolean;
5
11
  classification: string;
6
12
  }
7
13
 
14
+ const DISCOVER_REQUEST = {
15
+ jsonrpc: "2.0",
16
+ id: 1,
17
+ method: "server/discover",
18
+ params: {},
19
+ };
20
+
8
21
  const INITIALIZE_REQUEST = {
9
22
  jsonrpc: "2.0",
10
23
  id: 1,
11
24
  method: "initialize",
12
25
  params: {
13
- protocolVersion: "2025-06-18",
26
+ protocolVersion: LEGACY_PROTOCOL_VERSION,
14
27
  capabilities: {},
15
28
  clientInfo: { name: "pi-mcp-probe", version: "2.1.2" },
16
29
  },
17
30
  };
18
31
 
19
- function isJsonRpcEnvelope(value: unknown): boolean {
20
- return typeof value === "object" && value !== null &&
21
- (value as { jsonrpc?: unknown }).jsonrpc === "2.0" &&
22
- ("result" in value || "error" in value);
32
+ type ProbeStrategy =
33
+ | { kind: "modern"; request: RequestInit; allowJson: true }
34
+ | { kind: "legacy-post"; request: RequestInit; allowJson: true }
35
+ | { kind: "legacy-sse"; request: RequestInit; allowJson: false };
36
+
37
+ const MODERN_STRATEGY: ProbeStrategy = {
38
+ kind: "modern",
39
+ request: {
40
+ method: "POST",
41
+ headers: {
42
+ Accept: JSON_ACCEPT,
43
+ "Content-Type": "application/json",
44
+ "MCP-Protocol-Version": MODERN_PROTOCOL_VERSION,
45
+ "Mcp-Method": "server/discover",
46
+ },
47
+ body: JSON.stringify(DISCOVER_REQUEST),
48
+ },
49
+ allowJson: true,
50
+ };
51
+
52
+ const LEGACY_POST_STRATEGY: ProbeStrategy = {
53
+ kind: "legacy-post",
54
+ request: {
55
+ method: "POST",
56
+ headers: {
57
+ Accept: JSON_ACCEPT,
58
+ "Content-Type": "application/json",
59
+ },
60
+ body: JSON.stringify(INITIALIZE_REQUEST),
61
+ },
62
+ allowJson: true,
63
+ };
64
+
65
+ const LEGACY_SSE_STRATEGY: ProbeStrategy = {
66
+ kind: "legacy-sse",
67
+ request: { headers: { Accept: SSE_ACCEPT } },
68
+ allowJson: false,
69
+ };
70
+
71
+ type JsonRpcEnvelopeInfo =
72
+ | { kind: "result"; protocolVersion: unknown }
73
+ | { kind: "error" };
74
+
75
+ type ProbeOutcome =
76
+ | { kind: "mcp"; result: McpProbeResult }
77
+ | { kind: "unsupported-modern" }
78
+ | { kind: "unrecognized" };
79
+
80
+ interface ProbeResult {
81
+ response: Response;
82
+ outcome: ProbeOutcome;
83
+ }
84
+
85
+ function jsonRpcEnvelopeInfo(value: unknown): JsonRpcEnvelopeInfo | null {
86
+ if (typeof value !== "object" || value === null || (value as { jsonrpc?: unknown }).jsonrpc !== "2.0") {
87
+ return null;
88
+ }
89
+ if ("result" in value) {
90
+ const result = (value as { result?: unknown }).result;
91
+ return {
92
+ kind: "result",
93
+ protocolVersion: typeof result === "object" && result !== null
94
+ ? (result as { protocolVersion?: unknown }).protocolVersion
95
+ : undefined,
96
+ };
97
+ }
98
+ if ("error" in value) return { kind: "error" };
99
+ return null;
23
100
  }
24
101
 
25
102
  function isBearerChallenge(response: Response): boolean {
@@ -33,29 +110,56 @@ function responseKind(response: Response): string {
33
110
  return "an untyped response";
34
111
  }
35
112
 
36
- async function hasJsonRpcEnvelope(response: Response): Promise<boolean> {
113
+ async function getJsonRpcEnvelopeInfo(response: Response): Promise<JsonRpcEnvelopeInfo | null> {
37
114
  try {
38
- return isJsonRpcEnvelope(JSON.parse(await response.text()));
115
+ return jsonRpcEnvelopeInfo(JSON.parse(await response.text()));
39
116
  } catch {
40
- return false;
117
+ return null;
41
118
  }
42
119
  }
43
120
 
44
- async function classifyResponse(response: Response, allowJson: boolean): Promise<McpProbeResult | null> {
121
+ async function classifyResponse(response: Response, strategy: ProbeStrategy): Promise<ProbeOutcome> {
45
122
  const isSse = response.headers.get("content-type")?.toLowerCase().startsWith("text/event-stream");
46
123
  if (response.ok && isSse) {
47
- return { isMcp: true, classification: "endpoint responded with an MCP event stream" };
124
+ return { kind: "mcp", result: { isMcp: true, classification: "endpoint responded with an MCP event stream" } };
48
125
  }
49
126
 
50
- const isJsonRpc = (allowJson || response.status === 401) && await hasJsonRpcEnvelope(response);
51
- if (response.ok && allowJson && isJsonRpc) {
52
- return { isMcp: true, classification: "endpoint responded with a JSON-RPC 2.0 envelope" };
127
+ const envelope = (strategy.allowJson || response.status === 401) ? await getJsonRpcEnvelopeInfo(response) : null;
128
+ if (response.ok && strategy.allowJson && envelope) {
129
+ if (strategy.kind === "modern" && (envelope.kind === "error" || envelope.protocolVersion !== MODERN_PROTOCOL_VERSION)) {
130
+ return { kind: "unsupported-modern" };
131
+ }
132
+ return {
133
+ kind: "mcp",
134
+ result: {
135
+ isMcp: true,
136
+ classification: strategy.kind === "modern"
137
+ ? `endpoint supports stateless MCP ${MODERN_PROTOCOL_VERSION} server/discover`
138
+ : "endpoint responded with a JSON-RPC 2.0 envelope",
139
+ },
140
+ };
53
141
  }
54
- if (response.status === 401 && isBearerChallenge(response) && isJsonRpc) {
55
- return { isMcp: true, classification: "endpoint requires Bearer authentication and responded with a JSON-RPC 2.0 error" };
142
+ if (response.status === 401 && isBearerChallenge(response) && envelope) {
143
+ return {
144
+ kind: "mcp",
145
+ result: {
146
+ isMcp: true,
147
+ classification: strategy.kind === "modern"
148
+ ? `endpoint requires Bearer authentication during MCP ${MODERN_PROTOCOL_VERSION} server/discover probing`
149
+ : "endpoint requires Bearer authentication and responded with a JSON-RPC 2.0 error",
150
+ },
151
+ };
56
152
  }
57
153
 
58
- return null;
154
+ return { kind: "unrecognized" };
155
+ }
156
+
157
+ async function probe(url: string | URL, strategy: ProbeStrategy): Promise<ProbeResult> {
158
+ const response = await fetch(url, {
159
+ ...strategy.request,
160
+ signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),
161
+ });
162
+ return { response, outcome: await classifyResponse(response, strategy) };
59
163
  }
60
164
 
61
165
  function notMcp(response: Response): McpProbeResult {
@@ -67,24 +171,17 @@ function notMcp(response: Response): McpProbeResult {
67
171
 
68
172
  /** Makes one unauthenticated metadata-only request to identify an HTTP endpoint's protocol shape. */
69
173
  export async function probeMcpEndpoint(url: string | URL): Promise<McpProbeResult> {
70
- const postResponse = await fetch(url, {
71
- method: "POST",
72
- headers: {
73
- Accept: "application/json, text/event-stream",
74
- "Content-Type": "application/json",
75
- },
76
- body: JSON.stringify(INITIALIZE_REQUEST),
77
- signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),
78
- });
79
- const postClassification = await classifyResponse(postResponse, true);
80
- if (postClassification) return postClassification;
174
+ const { response: modernResponse, outcome: modernOutcome } = await probe(url, MODERN_STRATEGY);
175
+ if (modernOutcome.kind === "mcp") return modernOutcome.result;
81
176
 
82
- if (![404, 405, 406, 415].includes(postResponse.status)) return notMcp(postResponse);
177
+ if (modernOutcome.kind !== "unsupported-modern" && !MODERN_FALLBACK_STATUSES.has(modernResponse.status)) {
178
+ return notMcp(modernResponse);
179
+ }
83
180
 
84
- const getResponse = await fetch(url, {
85
- headers: { Accept: "text/event-stream" },
86
- signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),
87
- });
88
- const getClassification = await classifyResponse(getResponse, false);
89
- return getClassification ?? notMcp(getResponse);
181
+ const { response: postResponse, outcome: postOutcome } = await probe(url, LEGACY_POST_STRATEGY);
182
+ if (postOutcome.kind === "mcp") return postOutcome.result;
183
+ if (!POST_ENDPOINT_MISMATCH_STATUSES.has(postResponse.status)) return notMcp(postResponse);
184
+
185
+ const { response: getResponse, outcome: getOutcome } = await probe(url, LEGACY_SSE_STRATEGY);
186
+ return getOutcome.kind === "mcp" ? getOutcome.result : notMcp(getResponse);
90
187
  }
@@ -113,9 +113,9 @@ try {
113
113
  console: capturedConsole,
114
114
  }), {
115
115
  codeGeneration: { strings: false, wasm: false },
116
- name: "mcp_script",
116
+ name: "mcpScript",
117
117
  });
118
- const script = new vm.Script(`(async () => {\n${workerData.code}\n})()`, { filename: "mcp_script.js" });
118
+ const script = new vm.Script(`(async () => {\n${workerData.code}\n})()`, { filename: "mcpScript.js" });
119
119
  const returnValue = await Promise.resolve(script.runInContext(context));
120
120
  parentPort.postMessage(returnValue === undefined
121
121
  ? { type: "done" }
@@ -169,9 +169,9 @@ export class McpSetupPanel {
169
169
  return [...new Set(paths)];
170
170
  }
171
171
 
172
- private getSelectedAction(): Action | null {
172
+ private getSelectedAction(): Action | undefined {
173
173
  const actions = this.getActions();
174
- return actions[this.actionCursor] ?? null;
174
+ return actions[this.actionCursor];
175
175
  }
176
176
 
177
177
  handleInput(data: string): void {
@@ -414,6 +414,7 @@ export class McpSetupPanel {
414
414
  }
415
415
  for (let index = start; index < end; index++) {
416
416
  const action = actions[index];
417
+ if (!action) continue;
417
418
  if (action.id === "add-known-server" && (index === start || actions[index - 1]?.id !== "add-known-server")) {
418
419
  lines.push(this.padLine(fg(this.t.title, "Add a known server"), innerW));
419
420
  }
@@ -442,6 +443,7 @@ export class McpSetupPanel {
442
443
  lines.push(this.padLine("", innerW));
443
444
  for (let index = 0; index < this.discovery.imports.length; index++) {
444
445
  const entry = this.discovery.imports[index];
446
+ if (!entry) continue;
445
447
  const selected = this.selectedImports.has(entry.kind) ? "[x]" : "[ ]";
446
448
  const cursor = index === this.importCursor ? fg(this.t.selected, "›") : " ";
447
449
  lines.push(this.padLine(`${cursor} ${selected} ${entry.kind} ${entry.path}`, innerW));
@@ -462,7 +464,8 @@ export class McpSetupPanel {
462
464
  const paths = this.getDetectedPaths();
463
465
  for (let index = 0; index < paths.length; index++) {
464
466
  const cursor = index === this.pathCursor ? fg(this.t.selected, "›") : " ";
465
- lines.push(this.padLine(`${cursor} ${paths[index]}`, innerW));
467
+ const path = paths[index];
468
+ if (path !== undefined) lines.push(this.padLine(`${cursor} ${path}`, innerW));
466
469
  }
467
470
  return lines;
468
471
  }
@@ -537,7 +540,7 @@ export class McpSetupPanel {
537
540
  ' "mcpServers": {',
538
541
  ' "chrome-devtools": {',
539
542
  ' "command": "npx",',
540
- ' "args": ["-y", "chrome-devtools-mcp@latest"]',
543
+ ' "args": ["-y", "chrome-devtools-mcp@1.6.0"]',
541
544
  " }",
542
545
  " }",
543
546
  "}",
@@ -1,8 +1,8 @@
1
1
  import { appendFile, mkdir, writeFile } from "node:fs/promises";
2
2
  import { Buffer } from "node:buffer";
3
3
  import { dirname, isAbsolute, resolve } from "node:path";
4
- import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
5
- import type { JSONRPCMessage, MessageExtraInfo } from "@modelcontextprotocol/sdk/types.js";
4
+ import type { Transport } from "@modelcontextprotocol/client";
5
+ import type { JSONRPCMessage, MessageExtraInfo } from "@modelcontextprotocol/client";
6
6
 
7
7
  export const MCP_TRACE_SCHEMA_VERSION = 1;
8
8
  export const DEFAULT_MCP_TRACE_MAX_BYTES = 256 * 1024;
@@ -95,6 +95,7 @@ export function createMcpTraceEvent(
95
95
  options?: { relatedRequestId?: unknown; durationMs?: number },
96
96
  ): McpTraceEvent {
97
97
  const kind = messageKind(message);
98
+ const bytes = messageBytes(message);
98
99
  const event: McpTraceEvent = {
99
100
  version: MCP_TRACE_SCHEMA_VERSION,
100
101
  timestamp: new Date().toISOString(),
@@ -103,7 +104,7 @@ export function createMcpTraceEvent(
103
104
  transport,
104
105
  kind,
105
106
  status,
106
- bytes: messageBytes(message),
107
+ ...(bytes !== undefined ? { bytes } : {}),
107
108
  };
108
109
  if ("method" in message) event.method = redactTraceText(message.method, 120);
109
110
  if ("id" in message) event.id = traceId(message.id) ?? null;
@@ -210,8 +211,8 @@ export function createMcpTraceWriter(
210
211
  : resolve(sessionCwd ?? process.cwd(), ".pi", "mcp-traces", `mcp-${timestamp}-${randomSuffix}.jsonl`);
211
212
  return new McpTraceWriter({
212
213
  filePath,
213
- maxBytes: settings.maxBytes,
214
- maxEvents: settings.maxEvents,
214
+ ...(settings.maxBytes !== undefined ? { maxBytes: settings.maxBytes } : {}),
215
+ ...(settings.maxEvents !== undefined ? { maxEvents: settings.maxEvents } : {}),
215
216
  });
216
217
  }
217
218
 
@@ -227,17 +228,20 @@ export function isMcpTraceEnabled(
227
228
  }
228
229
 
229
230
  /**
230
- * Compose the SDK's transport callbacks instead of replacing them. Protocol
231
- * assigns `onmessage` during connect, so the setter must keep the observer in
232
- * front of whichever callback the SDK installs.
231
+ * Compose the SDK's transport callbacks in place instead of replacing the
232
+ * transport object. SDK v2 detects its base stdio transport before connect so
233
+ * it can run `server/discover` on a disposable sibling process; returning a
234
+ * wrapper hides that identity and makes tracing change negotiation behavior.
233
235
  */
234
- export function wrapTransportWithMcpTrace<T extends Transport>(
235
- transport: T,
236
+ export function wrapTransportWithMcpTrace(
237
+ transport: Transport,
236
238
  server: string,
237
239
  transportKind: McpTraceTransport,
238
240
  observer: McpTraceObserver,
239
- ): T {
240
- let messageHandler: Transport["onmessage"];
241
+ ): Transport {
242
+ let messageHandler = transport.onmessage;
243
+ let tracedMessageHandler: Transport["onmessage"];
244
+ const originalSend = transport.send;
241
245
  const record = (event: McpTraceEvent): void => {
242
246
  try {
243
247
  observer.record(event);
@@ -245,60 +249,51 @@ export function wrapTransportWithMcpTrace<T extends Transport>(
245
249
  // An observer failure must never alter SDK transport behavior.
246
250
  }
247
251
  };
248
- const traced: Transport = {
249
- start: () => transport.start(),
250
- send: async (message, options) => {
251
- const started = performance.now();
252
- const messages = Array.isArray(message) ? message : [message];
253
- try {
254
- await transport.send(message, options);
255
- for (const item of messages) {
256
- record(createMcpTraceEvent("outbound", server, transportKind, item, "sent", {
257
- durationMs: performance.now() - started,
258
- }));
259
- }
260
- } catch (error) {
261
- for (const item of messages) {
262
- record(createMcpTraceEvent("outbound", server, transportKind, item, "error", {
263
- durationMs: performance.now() - started,
264
- }));
265
- }
266
- throw error;
252
+
253
+ try {
254
+ Object.defineProperty(transport, "onmessage", {
255
+ configurable: true,
256
+ enumerable: true,
257
+ get() {
258
+ return tracedMessageHandler;
259
+ },
260
+ set(handler: Transport["onmessage"]) {
261
+ messageHandler = handler;
262
+ tracedMessageHandler = handler
263
+ ? ((message: JSONRPCMessage, extra?: MessageExtraInfo) => {
264
+ record(createMcpTraceEvent("inbound", server, transportKind, message, "received"));
265
+ handler(message, extra);
266
+ })
267
+ : undefined;
268
+ },
269
+ });
270
+ transport.onmessage = messageHandler;
271
+ } catch {
272
+ // Some future transport may make onmessage non-configurable. Keep tracing
273
+ // best-effort rather than changing connection behavior.
274
+ }
275
+
276
+ transport.send = async (message: JSONRPCMessage, options?: Parameters<Transport["send"]>[1]) => {
277
+ const started = performance.now();
278
+ const messages = Array.isArray(message) ? message : [message];
279
+ try {
280
+ await originalSend.call(transport, message, options);
281
+ for (const item of messages) {
282
+ record(createMcpTraceEvent("outbound", server, transportKind, item, "sent", {
283
+ durationMs: performance.now() - started,
284
+ }));
285
+ }
286
+ } catch (error) {
287
+ for (const item of messages) {
288
+ record(createMcpTraceEvent("outbound", server, transportKind, item, "error", {
289
+ durationMs: performance.now() - started,
290
+ }));
267
291
  }
268
- },
269
- close: () => transport.close(),
270
- get onclose() {
271
- return transport.onclose;
272
- },
273
- set onclose(handler) {
274
- transport.onclose = handler;
275
- },
276
- get onerror() {
277
- return transport.onerror;
278
- },
279
- set onerror(handler) {
280
- transport.onerror = handler;
281
- },
282
- get onmessage() {
283
- return messageHandler;
284
- },
285
- set onmessage(handler) {
286
- messageHandler = handler;
287
- transport.onmessage = handler
288
- ? ((message: JSONRPCMessage, extra?: MessageExtraInfo) => {
289
- record(createMcpTraceEvent("inbound", server, transportKind, message, "received"));
290
- handler(message, extra);
291
- }) as Transport["onmessage"]
292
- : undefined;
293
- },
294
- get sessionId() {
295
- return transport.sessionId;
296
- },
297
- setProtocolVersion: transport.setProtocolVersion
298
- ? version => transport.setProtocolVersion!(version)
299
- : undefined,
292
+ throw error;
293
+ }
300
294
  };
301
- return traced as T;
295
+
296
+ return transport;
302
297
  }
303
298
 
304
299
  export function traceTransportKind(definition: { command?: string; url?: string; socket?: string }, transport: Transport): McpTraceTransport {