@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.
- package/README.md +13 -3
- package/node_modules/@czottmann/pi-automode/README.md +16 -2
- package/node_modules/@czottmann/pi-automode/docs/GLOSSARY.md +35 -0
- package/node_modules/@czottmann/pi-automode/docs/automode-classifier-flow.md +18 -9
- package/node_modules/@czottmann/pi-automode/docs/defaults.md +6 -2
- package/node_modules/@czottmann/pi-automode/examples/automode.local.json +6 -0
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/classifier.ts +11 -7
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/config.ts +100 -0
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/constants.ts +32 -0
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/extension.ts +78 -3
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/hard-deny.ts +16 -4
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/paths.ts +23 -1
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/permissions.ts +22 -1
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/types.ts +18 -2
- package/node_modules/@czottmann/pi-automode/package.json +4 -4
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-audit.md +5 -0
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-debt.md +5 -0
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-gain.md +5 -0
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-help.md +5 -0
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-review.md +5 -0
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail.md +5 -0
- package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/ponytail-frontmatter.cjs +23 -0
- package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/ponytail.mjs +99 -0
- package/node_modules/@dietrichgebert/ponytail/.qoder/rules/ponytail.md +30 -0
- package/node_modules/@dietrichgebert/ponytail/.qoder-plugin/plugin.json +16 -0
- package/node_modules/@dietrichgebert/ponytail/AGENTS.md +32 -0
- package/node_modules/@dietrichgebert/ponytail/LICENSE +21 -0
- package/node_modules/@dietrichgebert/ponytail/README.es.md +298 -0
- package/node_modules/@dietrichgebert/ponytail/README.ko.md +315 -0
- package/node_modules/@dietrichgebert/ponytail/README.md +351 -0
- package/node_modules/@dietrichgebert/ponytail/assets/benchmark-3model.svg +21 -0
- package/node_modules/@dietrichgebert/ponytail/assets/benchmark-agentic.svg +62 -0
- package/node_modules/@dietrichgebert/ponytail/assets/logo-dark.png +0 -0
- package/node_modules/@dietrichgebert/ponytail/assets/logo-dark.svg +115 -0
- package/node_modules/@dietrichgebert/ponytail/assets/logo-greenpt-dark.svg +27 -0
- package/node_modules/@dietrichgebert/ponytail/assets/logo-greenpt.svg +27 -0
- package/node_modules/@dietrichgebert/ponytail/assets/logo.png +0 -0
- package/node_modules/@dietrichgebert/ponytail/assets/social-preview.png +0 -0
- package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner-es.png +0 -0
- package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner-ko.png +0 -0
- package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner.png +0 -0
- package/node_modules/@dietrichgebert/ponytail/hooks/claude-codex-hooks.json +44 -0
- package/node_modules/@dietrichgebert/ponytail/hooks/copilot-hooks.json +21 -0
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-activate.js +96 -0
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-config.js +169 -0
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-instructions.js +98 -0
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-mode-tracker.js +130 -0
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-runtime.js +85 -0
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-statusline.ps1 +24 -0
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-statusline.sh +18 -0
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-subagent.js +77 -0
- package/node_modules/@dietrichgebert/ponytail/hooks/qoder-hooks.json +26 -0
- package/node_modules/@dietrichgebert/ponytail/package.json +47 -0
- package/node_modules/@dietrichgebert/ponytail/pi-extension/index.js +211 -0
- package/node_modules/@dietrichgebert/ponytail/pi-extension/package.json +8 -0
- package/node_modules/@dietrichgebert/ponytail/scripts/uninstall.js +60 -0
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail/SKILL.md +120 -0
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-audit/SKILL.md +41 -0
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-debt/SKILL.md +44 -0
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-gain/SKILL.md +50 -0
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-help/SKILL.md +71 -0
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-review/SKILL.md +57 -0
- package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +6 -10
- package/node_modules/@herbertgao/pi-cc-extensions/README.md +5 -9
- package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/hero.en.svg +101 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +1 -17
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +15 -9
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/{utils/agent-summary.ts → feature/agent-summary/core.ts} +37 -35
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{agent-summary.ts → agent-summary/index.ts} +3 -3
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +24 -83
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{session-reference.ts → reference/index.ts} +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{agent-autocomplete.ts → reference/subagent.ts} +19 -9
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{pi-startup-header.ts → shell/startup-header.ts} +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{working-message.ts → shell/working-message.ts} +5 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/index.ts +32 -28
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +452 -94
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +727 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/index.ts +66 -776
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/{feature → renderer}/markdown-enhance.ts +134 -11
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/hover.ts +130 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{mouse-interaction.ts → mouse/interaction.ts} +90 -568
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/layout.ts +144 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/packets.ts +143 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/scroll.ts +195 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/ansi-utils.ts +56 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/diff-renderer.ts +4 -4
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/line-width-safety.ts +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-display-utils.ts +12 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/write-execution.ts +1 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-grouping.ts → tool/grouping.ts} +27 -10
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-result.ts → tool/result.ts} +4 -13
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/transcript-refresh.ts +91 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/fullscreen-detect.ts +0 -27
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
- package/node_modules/@herbertgao/pi-cc-extensions/themes/cc-dark.json +1 -0
- package/node_modules/@herbertgao/pi-cc-extensions/themes/cc-light.json +2 -2
- package/node_modules/@herbertgao/pi-stash/README.md +9 -9
- package/node_modules/@herbertgao/pi-stash/package.json +1 -1
- package/node_modules/@herbertgao/pi-stash/src/index.ts +2 -1
- package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +20 -0
- package/node_modules/@herbertgao/pi-subagents/README.md +6 -2
- package/node_modules/@herbertgao/pi-subagents/package.json +3 -3
- package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +1 -0
- package/node_modules/@herbertgao/pi-subagents/src/agent-runner.ts +3 -1
- package/node_modules/@herbertgao/pi-subagents/src/custom-agents.ts +85 -11
- package/node_modules/@herbertgao/pi-subagents/src/index.ts +61 -39
- package/node_modules/@herbertgao/pi-subagents/src/nested-tools.ts +26 -35
- package/node_modules/@herbertgao/pi-subagents/src/prompts.ts +15 -1
- package/node_modules/@herbertgao/pi-subagents/src/settings.ts +12 -0
- package/node_modules/@herbertgao/pi-subagents/src/types.ts +2 -0
- package/node_modules/@narumitw/pi-btw/LICENSE +21 -0
- package/node_modules/@narumitw/pi-btw/README.md +210 -0
- package/node_modules/@narumitw/pi-btw/package.json +53 -0
- package/node_modules/@narumitw/pi-btw/src/bring-to-main.ts +632 -0
- package/node_modules/@narumitw/pi-btw/src/btw.ts +996 -0
- package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +339 -0
- package/node_modules/@narumitw/pi-btw/src/index.ts +1 -0
- package/node_modules/@narumitw/pi-btw/src/menu.ts +296 -0
- package/node_modules/@narumitw/pi-btw/src/settings.ts +237 -0
- package/node_modules/@narumitw/pi-btw/src/side-thread.ts +238 -0
- package/node_modules/@narumitw/pi-btw/src/text.ts +10 -0
- package/node_modules/@narumitw/pi-btw/src/transcript-pager.ts +620 -0
- package/node_modules/@pi-plugins/fast-mode/LICENSE +21 -0
- package/node_modules/@pi-plugins/fast-mode/README.md +92 -0
- package/node_modules/@pi-plugins/fast-mode/dist/index.d.mts +6 -0
- package/node_modules/@pi-plugins/fast-mode/dist/index.d.mts.map +1 -0
- package/node_modules/@pi-plugins/fast-mode/dist/index.mjs +2026 -0
- package/node_modules/@pi-plugins/fast-mode/dist/index.mjs.map +1 -0
- package/node_modules/@pi-plugins/fast-mode/package.json +73 -0
- package/node_modules/pi-mcp-adapter/CHANGELOG.md +78 -0
- package/node_modules/pi-mcp-adapter/README.md +80 -16
- package/node_modules/pi-mcp-adapter/agent-dir.ts +40 -0
- package/node_modules/pi-mcp-adapter/agent-plugin-loader.ts +377 -0
- package/node_modules/pi-mcp-adapter/commands.ts +21 -9
- package/node_modules/pi-mcp-adapter/config.ts +110 -49
- package/node_modules/pi-mcp-adapter/direct-tools.ts +40 -27
- package/node_modules/pi-mcp-adapter/elicitation-handler.ts +37 -36
- package/node_modules/pi-mcp-adapter/errors.ts +21 -17
- package/node_modules/pi-mcp-adapter/host-html-template.ts +13 -7
- package/node_modules/pi-mcp-adapter/index.ts +52 -17
- package/node_modules/pi-mcp-adapter/init.ts +9 -7
- package/node_modules/pi-mcp-adapter/json-schema-validator.ts +2 -2
- package/node_modules/pi-mcp-adapter/lifecycle.ts +8 -8
- package/node_modules/pi-mcp-adapter/logger.ts +1 -1
- package/node_modules/pi-mcp-adapter/mcp-auth-flow.ts +122 -25
- package/node_modules/pi-mcp-adapter/mcp-auth.ts +120 -2
- package/node_modules/pi-mcp-adapter/mcp-callback-server.ts +138 -61
- package/node_modules/pi-mcp-adapter/mcp-code.ts +13 -11
- package/node_modules/pi-mcp-adapter/mcp-oauth-provider.ts +62 -17
- package/node_modules/pi-mcp-adapter/mcp-output-guard.ts +15 -11
- package/node_modules/pi-mcp-adapter/mcp-panel.ts +34 -15
- package/node_modules/pi-mcp-adapter/mcp-probe.ts +131 -34
- package/node_modules/pi-mcp-adapter/mcp-script-worker.mjs +2 -2
- package/node_modules/pi-mcp-adapter/mcp-setup-panel.ts +7 -4
- package/node_modules/pi-mcp-adapter/mcp-trace.ts +59 -64
- package/node_modules/pi-mcp-adapter/metadata-cache.ts +34 -26
- package/node_modules/pi-mcp-adapter/npx-resolver.ts +6 -4
- package/node_modules/pi-mcp-adapter/oauth-handler.ts +1 -1
- package/node_modules/pi-mcp-adapter/oauth.ts +48 -0
- package/node_modules/pi-mcp-adapter/onboarding-state.ts +19 -11
- package/node_modules/pi-mcp-adapter/package.json +20 -9
- package/node_modules/pi-mcp-adapter/panel-keys.ts +20 -4
- package/node_modules/pi-mcp-adapter/prompts.ts +2 -2
- package/node_modules/pi-mcp-adapter/proxy-modes.ts +56 -21
- package/node_modules/pi-mcp-adapter/sampling-handler.ts +22 -15
- package/node_modules/pi-mcp-adapter/search-ranking.ts +2 -1
- package/node_modules/pi-mcp-adapter/server-manager.ts +165 -113
- package/node_modules/pi-mcp-adapter/session-recovery.ts +11 -12
- package/node_modules/pi-mcp-adapter/skills/mcp-scripting/SKILL.md +3 -3
- package/node_modules/pi-mcp-adapter/state.ts +3 -1
- package/node_modules/pi-mcp-adapter/tool-approval.ts +67 -4
- package/node_modules/pi-mcp-adapter/tool-metadata.ts +6 -5
- package/node_modules/pi-mcp-adapter/tool-registrar.ts +187 -3
- package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +14 -2
- package/node_modules/pi-mcp-adapter/ts-shape.ts +9 -2
- package/node_modules/pi-mcp-adapter/types.ts +111 -22
- package/node_modules/pi-mcp-adapter/ui-app-bridge-helpers.ts +40 -0
- package/node_modules/pi-mcp-adapter/ui-resource-handler.ts +28 -19
- package/node_modules/pi-mcp-adapter/ui-server.ts +90 -58
- package/node_modules/pi-mcp-adapter/ui-session.ts +16 -14
- package/node_modules/pi-mcp-adapter/unix-socket-transport.ts +4 -4
- package/node_modules/pi-mcp-adapter/utils.ts +23 -9
- package/node_modules/pi-web-access/CHANGELOG.md +45 -0
- package/node_modules/pi-web-access/README.md +104 -29
- package/node_modules/pi-web-access/bocha.ts +221 -0
- package/node_modules/pi-web-access/curator-page.ts +113 -12
- package/node_modules/pi-web-access/curator-server.ts +56 -20
- package/node_modules/pi-web-access/datalab-pdf-extract.ts +568 -0
- package/node_modules/pi-web-access/duckduckgo.ts +123 -0
- package/node_modules/pi-web-access/extract.ts +288 -143
- package/node_modules/pi-web-access/feature-config.ts +29 -0
- package/node_modules/pi-web-access/gemini-api.ts +4 -0
- package/node_modules/pi-web-access/gemini-search.ts +45 -12
- package/node_modules/pi-web-access/gemini-web.ts +68 -3
- package/node_modules/pi-web-access/index.ts +160 -71
- package/node_modules/pi-web-access/jina-search.ts +284 -0
- package/node_modules/pi-web-access/kagi.ts +12 -12
- package/node_modules/pi-web-access/openai-search.ts +12 -2
- package/node_modules/pi-web-access/package.json +4 -3
- package/node_modules/pi-web-access/pdf-extract.ts +327 -228
- package/node_modules/pi-web-access/storage.ts +440 -2
- package/node_modules/pi-web-access/summary-model-scope.ts +1 -1
- package/node_modules/pi-web-access/summary-review.ts +4 -2
- package/node_modules/pi-web-access/video-extract.ts +10 -8
- package/node_modules/pi-web-access/xai-search.ts +12 -2
- package/node_modules/pi-web-access/youtube-extract.ts +2 -1
- package/node_modules/remote-pi/LICENSE +21 -0
- package/node_modules/remote-pi/README.md +675 -0
- package/node_modules/remote-pi/dist/actions/handlers.d.ts +122 -0
- package/node_modules/remote-pi/dist/actions/handlers.js +160 -0
- package/node_modules/remote-pi/dist/actions/handlers.js.map +1 -0
- package/node_modules/remote-pi/dist/actions/registry.d.ts +39 -0
- package/node_modules/remote-pi/dist/actions/registry.js +58 -0
- package/node_modules/remote-pi/dist/actions/registry.js.map +1 -0
- package/node_modules/remote-pi/dist/bin/supervisord.d.ts +2 -0
- package/node_modules/remote-pi/dist/bin/supervisord.js +86 -0
- package/node_modules/remote-pi/dist/bin/supervisord.js.map +1 -0
- package/node_modules/remote-pi/dist/commands/builtin_mirror.d.ts +58 -0
- package/node_modules/remote-pi/dist/commands/builtin_mirror.js +71 -0
- package/node_modules/remote-pi/dist/commands/builtin_mirror.js.map +1 -0
- package/node_modules/remote-pi/dist/commands/list_commands.d.ts +60 -0
- package/node_modules/remote-pi/dist/commands/list_commands.js +73 -0
- package/node_modules/remote-pi/dist/commands/list_commands.js.map +1 -0
- package/node_modules/remote-pi/dist/config.d.ts +62 -0
- package/node_modules/remote-pi/dist/config.js +115 -0
- package/node_modules/remote-pi/dist/config.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/client.d.ts +20 -0
- package/node_modules/remote-pi/dist/daemon/client.js +131 -0
- package/node_modules/remote-pi/dist/daemon/client.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/control_protocol.d.ts +176 -0
- package/node_modules/remote-pi/dist/daemon/control_protocol.js +63 -0
- package/node_modules/remote-pi/dist/daemon/control_protocol.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/cron_log.d.ts +45 -0
- package/node_modules/remote-pi/dist/daemon/cron_log.js +72 -0
- package/node_modules/remote-pi/dist/daemon/cron_log.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/cron_registry.d.ts +80 -0
- package/node_modules/remote-pi/dist/daemon/cron_registry.js +194 -0
- package/node_modules/remote-pi/dist/daemon/cron_registry.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/id.d.ts +24 -0
- package/node_modules/remote-pi/dist/daemon/id.js +36 -0
- package/node_modules/remote-pi/dist/daemon/id.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/install.d.ts +170 -0
- package/node_modules/remote-pi/dist/daemon/install.js +547 -0
- package/node_modules/remote-pi/dist/daemon/install.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/registry.d.ts +63 -0
- package/node_modules/remote-pi/dist/daemon/registry.js +153 -0
- package/node_modules/remote-pi/dist/daemon/registry.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/rpc_child.d.ts +194 -0
- package/node_modules/remote-pi/dist/daemon/rpc_child.js +389 -0
- package/node_modules/remote-pi/dist/daemon/rpc_child.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/supervisor.d.ts +93 -0
- package/node_modules/remote-pi/dist/daemon/supervisor.js +596 -0
- package/node_modules/remote-pi/dist/daemon/supervisor.js.map +1 -0
- package/node_modules/remote-pi/dist/extension_ui_bridge.d.ts +26 -0
- package/node_modules/remote-pi/dist/extension_ui_bridge.js +341 -0
- package/node_modules/remote-pi/dist/extension_ui_bridge.js.map +1 -0
- package/node_modules/remote-pi/dist/index.d.ts +213 -0
- package/node_modules/remote-pi/dist/index.js +4996 -0
- package/node_modules/remote-pi/dist/index.js.map +1 -0
- package/node_modules/remote-pi/dist/mcp/mesh_result.d.ts +10 -0
- package/node_modules/remote-pi/dist/mcp/mesh_result.js +42 -0
- package/node_modules/remote-pi/dist/mcp/mesh_result.js.map +1 -0
- package/node_modules/remote-pi/dist/mcp/mesh_server.d.ts +16 -0
- package/node_modules/remote-pi/dist/mcp/mesh_server.js +327 -0
- package/node_modules/remote-pi/dist/mcp/mesh_server.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/canonical.d.ts +30 -0
- package/node_modules/remote-pi/dist/mesh/canonical.js +61 -0
- package/node_modules/remote-pi/dist/mesh/canonical.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/client.d.ts +18 -0
- package/node_modules/remote-pi/dist/mesh/client.js +125 -0
- package/node_modules/remote-pi/dist/mesh/client.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/encoding.d.ts +38 -0
- package/node_modules/remote-pi/dist/mesh/encoding.js +216 -0
- package/node_modules/remote-pi/dist/mesh/encoding.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/self_revoke.d.ts +73 -0
- package/node_modules/remote-pi/dist/mesh/self_revoke.js +401 -0
- package/node_modules/remote-pi/dist/mesh/self_revoke.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/siblings.d.ts +49 -0
- package/node_modules/remote-pi/dist/mesh/siblings.js +159 -0
- package/node_modules/remote-pi/dist/mesh/siblings.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/types.d.ts +34 -0
- package/node_modules/remote-pi/dist/mesh/types.js +11 -0
- package/node_modules/remote-pi/dist/mesh/types.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/verify.d.ts +17 -0
- package/node_modules/remote-pi/dist/mesh/verify.js +86 -0
- package/node_modules/remote-pi/dist/mesh/verify.js.map +1 -0
- package/node_modules/remote-pi/dist/pairing/crypto.d.ts +8 -0
- package/node_modules/remote-pi/dist/pairing/crypto.js +22 -0
- package/node_modules/remote-pi/dist/pairing/crypto.js.map +1 -0
- package/node_modules/remote-pi/dist/pairing/handshake.d.ts +28 -0
- package/node_modules/remote-pi/dist/pairing/handshake.js +113 -0
- package/node_modules/remote-pi/dist/pairing/handshake.js.map +1 -0
- package/node_modules/remote-pi/dist/pairing/noise-sha256.d.ts +16 -0
- package/node_modules/remote-pi/dist/pairing/noise-sha256.js +103 -0
- package/node_modules/remote-pi/dist/pairing/noise-sha256.js.map +1 -0
- package/node_modules/remote-pi/dist/pairing/qr.d.ts +59 -0
- package/node_modules/remote-pi/dist/pairing/qr.js +125 -0
- package/node_modules/remote-pi/dist/pairing/qr.js.map +1 -0
- package/node_modules/remote-pi/dist/pairing/storage.d.ts +120 -0
- package/node_modules/remote-pi/dist/pairing/storage.js +604 -0
- package/node_modules/remote-pi/dist/pairing/storage.js.map +1 -0
- package/node_modules/remote-pi/dist/protocol/codec.d.ts +7 -0
- package/node_modules/remote-pi/dist/protocol/codec.js +49 -0
- package/node_modules/remote-pi/dist/protocol/codec.js.map +1 -0
- package/node_modules/remote-pi/dist/protocol/types.d.ts +393 -0
- package/node_modules/remote-pi/dist/protocol/types.js +2 -0
- package/node_modules/remote-pi/dist/protocol/types.js.map +1 -0
- package/node_modules/remote-pi/dist/rooms.d.ts +29 -0
- package/node_modules/remote-pi/dist/rooms.js +57 -0
- package/node_modules/remote-pi/dist/rooms.js.map +1 -0
- package/node_modules/remote-pi/dist/session/address.d.ts +49 -0
- package/node_modules/remote-pi/dist/session/address.js +58 -0
- package/node_modules/remote-pi/dist/session/address.js.map +1 -0
- package/node_modules/remote-pi/dist/session/agent_bridge.d.ts +55 -0
- package/node_modules/remote-pi/dist/session/agent_bridge.js +146 -0
- package/node_modules/remote-pi/dist/session/agent_bridge.js.map +1 -0
- package/node_modules/remote-pi/dist/session/bridge.d.ts +37 -0
- package/node_modules/remote-pi/dist/session/bridge.js +130 -0
- package/node_modules/remote-pi/dist/session/bridge.js.map +1 -0
- package/node_modules/remote-pi/dist/session/broker.d.ts +189 -0
- package/node_modules/remote-pi/dist/session/broker.js +507 -0
- package/node_modules/remote-pi/dist/session/broker.js.map +1 -0
- package/node_modules/remote-pi/dist/session/broker_remote.d.ts +74 -0
- package/node_modules/remote-pi/dist/session/broker_remote.js +583 -0
- package/node_modules/remote-pi/dist/session/broker_remote.js.map +1 -0
- package/node_modules/remote-pi/dist/session/cwd_lock.d.ts +33 -0
- package/node_modules/remote-pi/dist/session/cwd_lock.js +126 -0
- package/node_modules/remote-pi/dist/session/cwd_lock.js.map +1 -0
- package/node_modules/remote-pi/dist/session/envelope.d.ts +33 -0
- package/node_modules/remote-pi/dist/session/envelope.js +117 -0
- package/node_modules/remote-pi/dist/session/envelope.js.map +1 -0
- package/node_modules/remote-pi/dist/session/global_config.d.ts +33 -0
- package/node_modules/remote-pi/dist/session/global_config.js +73 -0
- package/node_modules/remote-pi/dist/session/global_config.js.map +1 -0
- package/node_modules/remote-pi/dist/session/ipc.d.ts +27 -0
- package/node_modules/remote-pi/dist/session/ipc.js +22 -0
- package/node_modules/remote-pi/dist/session/ipc.js.map +1 -0
- package/node_modules/remote-pi/dist/session/leader_election.d.ts +32 -0
- package/node_modules/remote-pi/dist/session/leader_election.js +106 -0
- package/node_modules/remote-pi/dist/session/leader_election.js.map +1 -0
- package/node_modules/remote-pi/dist/session/local_config.d.ts +55 -0
- package/node_modules/remote-pi/dist/session/local_config.js +157 -0
- package/node_modules/remote-pi/dist/session/local_config.js.map +1 -0
- package/node_modules/remote-pi/dist/session/mesh_message.d.ts +20 -0
- package/node_modules/remote-pi/dist/session/mesh_message.js +28 -0
- package/node_modules/remote-pi/dist/session/mesh_message.js.map +1 -0
- package/node_modules/remote-pi/dist/session/mesh_node.d.ts +116 -0
- package/node_modules/remote-pi/dist/session/mesh_node.js +573 -0
- package/node_modules/remote-pi/dist/session/mesh_node.js.map +1 -0
- package/node_modules/remote-pi/dist/session/peer.d.ts +139 -0
- package/node_modules/remote-pi/dist/session/peer.js +451 -0
- package/node_modules/remote-pi/dist/session/peer.js.map +1 -0
- package/node_modules/remote-pi/dist/session/peer_inventory.d.ts +13 -0
- package/node_modules/remote-pi/dist/session/peer_inventory.js +48 -0
- package/node_modules/remote-pi/dist/session/peer_inventory.js.map +1 -0
- package/node_modules/remote-pi/dist/session/peer_limits.d.ts +9 -0
- package/node_modules/remote-pi/dist/session/peer_limits.js +21 -0
- package/node_modules/remote-pi/dist/session/peer_limits.js.map +1 -0
- package/node_modules/remote-pi/dist/session/setup_wizard.d.ts +39 -0
- package/node_modules/remote-pi/dist/session/setup_wizard.js +63 -0
- package/node_modules/remote-pi/dist/session/setup_wizard.js.map +1 -0
- package/node_modules/remote-pi/dist/session/tool_gate.d.ts +5 -0
- package/node_modules/remote-pi/dist/session/tool_gate.js +11 -0
- package/node_modules/remote-pi/dist/session/tool_gate.js.map +1 -0
- package/node_modules/remote-pi/dist/session/tools.d.ts +24 -0
- package/node_modules/remote-pi/dist/session/tools.js +252 -0
- package/node_modules/remote-pi/dist/session/tools.js.map +1 -0
- package/node_modules/remote-pi/dist/session/wizard.d.ts +13 -0
- package/node_modules/remote-pi/dist/session/wizard.js +20 -0
- package/node_modules/remote-pi/dist/session/wizard.js.map +1 -0
- package/node_modules/remote-pi/dist/settings.d.ts +15 -0
- package/node_modules/remote-pi/dist/settings.js +52 -0
- package/node_modules/remote-pi/dist/settings.js.map +1 -0
- package/node_modules/remote-pi/dist/transport/peer_channel.d.ts +37 -0
- package/node_modules/remote-pi/dist/transport/peer_channel.js +98 -0
- package/node_modules/remote-pi/dist/transport/peer_channel.js.map +1 -0
- package/node_modules/remote-pi/dist/transport/pi_forward_client.d.ts +29 -0
- package/node_modules/remote-pi/dist/transport/pi_forward_client.js +62 -0
- package/node_modules/remote-pi/dist/transport/pi_forward_client.js.map +1 -0
- package/node_modules/remote-pi/dist/transport/relay_client.d.ts +91 -0
- package/node_modules/remote-pi/dist/transport/relay_client.js +206 -0
- package/node_modules/remote-pi/dist/transport/relay_client.js.map +1 -0
- package/node_modules/remote-pi/dist/ui/footer.d.ts +32 -0
- package/node_modules/remote-pi/dist/ui/footer.js +34 -0
- package/node_modules/remote-pi/dist/ui/footer.js.map +1 -0
- package/node_modules/remote-pi/docs/daemon.md +289 -0
- package/node_modules/remote-pi/package.json +88 -0
- package/node_modules/remote-pi/service-templates/launchd.plist.template +35 -0
- package/node_modules/remote-pi/service-templates/systemd.service.template +19 -0
- package/node_modules/remote-pi/service-templates/task-launcher.vbs.template +10 -0
- package/node_modules/remote-pi/service-templates/task-scheduler.xml.template +38 -0
- package/node_modules/remote-pi/skills/agent-network/SKILL.md +310 -0
- package/package.json +37 -12
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool-diff/write-display-utils.ts +0 -29
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{session-reference-core.ts → reference/session.ts} +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{pi-aliases.ts → shell/aliases.ts} +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/ATTRIBUTION.md +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/diff-presentation.ts +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/index.ts +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/render-utils.ts +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/shiki-highlight.ts +0 -0
- /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 = {
|
|
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
|
|
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 (
|
|
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.
|
|
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.
|
|
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 = {
|
|
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
|
-
|
|
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(
|
|
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
|
|
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
|
|
888
|
-
take += rest
|
|
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
|
|
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:
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
|
113
|
+
async function getJsonRpcEnvelopeInfo(response: Response): Promise<JsonRpcEnvelopeInfo | null> {
|
|
37
114
|
try {
|
|
38
|
-
return
|
|
115
|
+
return jsonRpcEnvelopeInfo(JSON.parse(await response.text()));
|
|
39
116
|
} catch {
|
|
40
|
-
return
|
|
117
|
+
return null;
|
|
41
118
|
}
|
|
42
119
|
}
|
|
43
120
|
|
|
44
|
-
async function classifyResponse(response: Response,
|
|
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
|
|
51
|
-
if (response.ok && allowJson &&
|
|
52
|
-
|
|
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) &&
|
|
55
|
-
return {
|
|
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
|
|
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
|
|
71
|
-
|
|
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 (
|
|
177
|
+
if (modernOutcome.kind !== "unsupported-modern" && !MODERN_FALLBACK_STATUSES.has(modernResponse.status)) {
|
|
178
|
+
return notMcp(modernResponse);
|
|
179
|
+
}
|
|
83
180
|
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const
|
|
89
|
-
return
|
|
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: "
|
|
116
|
+
name: "mcpScript",
|
|
117
117
|
});
|
|
118
|
-
const script = new vm.Script(`(async () => {\n${workerData.code}\n})()`, { filename: "
|
|
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 |
|
|
172
|
+
private getSelectedAction(): Action | undefined {
|
|
173
173
|
const actions = this.getActions();
|
|
174
|
-
return actions[this.actionCursor]
|
|
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
|
-
|
|
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@
|
|
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/
|
|
5
|
-
import type { JSONRPCMessage, MessageExtraInfo } from "@modelcontextprotocol/
|
|
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:
|
|
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
|
|
231
|
-
*
|
|
232
|
-
*
|
|
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
|
|
235
|
-
transport:
|
|
236
|
+
export function wrapTransportWithMcpTrace(
|
|
237
|
+
transport: Transport,
|
|
236
238
|
server: string,
|
|
237
239
|
transportKind: McpTraceTransport,
|
|
238
240
|
observer: McpTraceObserver,
|
|
239
|
-
):
|
|
240
|
-
let messageHandler
|
|
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
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
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
|
-
|
|
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
|
-
|
|
295
|
+
|
|
296
|
+
return transport;
|
|
302
297
|
}
|
|
303
298
|
|
|
304
299
|
export function traceTransportKind(definition: { command?: string; url?: string; socket?: string }, transport: Transport): McpTraceTransport {
|