@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
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { createServer, type Server, type IncomingMessage, type ServerResponse } from "http"
|
|
9
|
+
import { getAppName } from "./agent-dir.ts"
|
|
9
10
|
import {
|
|
10
11
|
DEFAULT_OAUTH_CALLBACK_PATH,
|
|
11
12
|
getConfiguredOAuthCallbackPort,
|
|
@@ -15,45 +16,106 @@ import {
|
|
|
15
16
|
setOAuthCallbackPort,
|
|
16
17
|
} from "./mcp-oauth-provider.ts"
|
|
17
18
|
|
|
18
|
-
// HTML templates for callback responses
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
19
|
+
// HTML templates for callback responses.
|
|
20
|
+
//
|
|
21
|
+
// These pages are served from localhost during OAuth and are the last thing a
|
|
22
|
+
// user sees before returning to their terminal, so they are self-contained: no
|
|
23
|
+
// webfonts, no external assets, nothing that needs the network. They also name
|
|
24
|
+
// the host rather than hardcoding "Pi", so a distribution that rebrands pi
|
|
25
|
+
// (arc, tau, …) does not send its users back to an app they are not running.
|
|
26
|
+
|
|
27
|
+
/** Shared chrome: system fonts, a centred card, and light/dark support. */
|
|
28
|
+
const PAGE_STYLE = `
|
|
29
|
+
:root { color-scheme: light dark; }
|
|
30
|
+
* { box-sizing: border-box; }
|
|
31
|
+
body {
|
|
32
|
+
margin: 0;
|
|
33
|
+
min-height: 100vh;
|
|
34
|
+
display: flex;
|
|
35
|
+
align-items: center;
|
|
36
|
+
justify-content: center;
|
|
37
|
+
padding: 24px;
|
|
38
|
+
font: 15px/1.55 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
|
|
39
|
+
background: #0f1117;
|
|
40
|
+
color: #e6e8ee;
|
|
41
|
+
}
|
|
42
|
+
.card {
|
|
43
|
+
width: 100%;
|
|
44
|
+
max-width: 26rem;
|
|
45
|
+
padding: 2.5rem 2rem;
|
|
46
|
+
text-align: center;
|
|
47
|
+
background: #161922;
|
|
48
|
+
border: 1px solid #242938;
|
|
49
|
+
border-radius: 14px;
|
|
50
|
+
box-shadow: 0 1px 2px rgba(0,0,0,.3), 0 12px 32px rgba(0,0,0,.25);
|
|
51
|
+
}
|
|
52
|
+
.badge {
|
|
53
|
+
width: 3rem; height: 3rem;
|
|
54
|
+
margin: 0 auto 1.25rem;
|
|
55
|
+
display: grid; place-items: center;
|
|
56
|
+
border-radius: 50%;
|
|
57
|
+
}
|
|
58
|
+
.badge svg { width: 1.5rem; height: 1.5rem; display: block; }
|
|
59
|
+
.ok { background: rgba(74,222,128,.12); color: #4ade80; }
|
|
60
|
+
.bad { background: rgba(248,113,113,.12); color: #f87171; }
|
|
61
|
+
h1 { margin: 0 0 .5rem; font-size: 1.15rem; font-weight: 600; letter-spacing: -0.01em; }
|
|
62
|
+
p { margin: 0; color: #9aa1b1; }
|
|
63
|
+
.app { color: #e6e8ee; font-weight: 500; }
|
|
64
|
+
.hint { margin-top: 1.25rem; font-size: .8125rem; color: #6b7280; }
|
|
65
|
+
code {
|
|
66
|
+
display: block;
|
|
67
|
+
margin-top: 1.25rem;
|
|
68
|
+
padding: .75rem .875rem;
|
|
69
|
+
text-align: left;
|
|
70
|
+
font: 12px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
71
|
+
color: #fca5a5;
|
|
72
|
+
background: rgba(248,113,113,.08);
|
|
73
|
+
border: 1px solid rgba(248,113,113,.2);
|
|
74
|
+
border-radius: 8px;
|
|
75
|
+
overflow-wrap: anywhere;
|
|
76
|
+
}
|
|
77
|
+
@media (prefers-color-scheme: light) {
|
|
78
|
+
body { background: #f6f7f9; color: #121620; }
|
|
79
|
+
.card { background: #fff; border-color: #e4e7ee; }
|
|
80
|
+
p { color: #5b6474; }
|
|
81
|
+
.app { color: #121620; }
|
|
82
|
+
.hint { color: #8b93a3; }
|
|
83
|
+
}`
|
|
84
|
+
|
|
85
|
+
const CHECK_ICON =
|
|
86
|
+
'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg>'
|
|
87
|
+
|
|
88
|
+
const CROSS_ICON =
|
|
89
|
+
'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M18 6 6 18M6 6l12 12"/></svg>'
|
|
90
|
+
|
|
91
|
+
function page(options: {
|
|
92
|
+
title: string
|
|
93
|
+
heading: string
|
|
94
|
+
body: string
|
|
95
|
+
icon: string
|
|
96
|
+
tone: "ok" | "bad"
|
|
97
|
+
extra?: string
|
|
98
|
+
autoClose?: boolean
|
|
99
|
+
}): string {
|
|
100
|
+
return `<!DOCTYPE html>
|
|
101
|
+
<html lang="en">
|
|
41
102
|
<head>
|
|
42
|
-
<
|
|
43
|
-
<
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
h1 { color: #4ade80; margin-bottom: 1rem; }
|
|
47
|
-
p { color: #aaa; }
|
|
103
|
+
<meta charset="utf-8">
|
|
104
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
105
|
+
<title>${options.title}</title>
|
|
106
|
+
<style>${PAGE_STYLE}
|
|
48
107
|
</style>
|
|
49
108
|
</head>
|
|
50
109
|
<body>
|
|
51
|
-
<
|
|
52
|
-
<
|
|
53
|
-
<
|
|
54
|
-
|
|
55
|
-
|
|
110
|
+
<main class="card">
|
|
111
|
+
<div class="badge ${options.tone}">${options.icon}</div>
|
|
112
|
+
<h1>${options.heading}</h1>
|
|
113
|
+
<p>${options.body}</p>
|
|
114
|
+
${options.extra ?? ""}
|
|
115
|
+
</main>
|
|
116
|
+
${options.autoClose ? " <script>setTimeout(() => window.close(), 2000);</script>\n" : ""}</body>
|
|
56
117
|
</html>`
|
|
118
|
+
}
|
|
57
119
|
|
|
58
120
|
function escapeHtml(value: string): string {
|
|
59
121
|
return value
|
|
@@ -64,26 +126,41 @@ function escapeHtml(value: string): string {
|
|
|
64
126
|
.replace(/'/g, "'")
|
|
65
127
|
}
|
|
66
128
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
</
|
|
86
|
-
|
|
129
|
+
/** Built per request so a host that sets PI_PACKAGE_DIR late is still named right. */
|
|
130
|
+
function htmlSuccess(): string {
|
|
131
|
+
const app = escapeHtml(getAppName())
|
|
132
|
+
return page({
|
|
133
|
+
title: `${app} — Authorization Successful`,
|
|
134
|
+
heading: "Authorization Successful",
|
|
135
|
+
body: `You can close this window and return to <span class="app">${app}</span>.`,
|
|
136
|
+
icon: CHECK_ICON,
|
|
137
|
+
tone: "ok",
|
|
138
|
+
autoClose: true,
|
|
139
|
+
})
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function htmlManualSuccess(): string {
|
|
143
|
+
const app = escapeHtml(getAppName())
|
|
144
|
+
return page({
|
|
145
|
+
title: `${app} — Authorization Received`,
|
|
146
|
+
heading: "Authorization Received",
|
|
147
|
+
body: `Copy the full callback URL from your browser address bar and paste it back into <span class="app">${app}</span> with auth-complete.`,
|
|
148
|
+
icon: CHECK_ICON,
|
|
149
|
+
tone: "ok",
|
|
150
|
+
})
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function htmlError(error: string): string {
|
|
154
|
+
const app = escapeHtml(getAppName())
|
|
155
|
+
return page({
|
|
156
|
+
title: `${app} — Authorization Failed`,
|
|
157
|
+
heading: "Authorization Failed",
|
|
158
|
+
body: `Something went wrong during authorization. You can close this window and try again from <span class="app">${app}</span>.`,
|
|
159
|
+
icon: CROSS_ICON,
|
|
160
|
+
tone: "bad",
|
|
161
|
+
extra: `<code>${escapeHtml(error)}</code>`,
|
|
162
|
+
})
|
|
163
|
+
}
|
|
87
164
|
|
|
88
165
|
/** Result of a successful OAuth callback */
|
|
89
166
|
export interface OAuthCallbackResult {
|
|
@@ -145,7 +222,7 @@ function handleRequest(req: IncomingMessage, res: ServerResponse): void {
|
|
|
145
222
|
if (!state) {
|
|
146
223
|
const errorMsg = "Missing required state parameter - potential CSRF attack"
|
|
147
224
|
res.writeHead(400, { "Content-Type": "text/html" })
|
|
148
|
-
res.end(
|
|
225
|
+
res.end(htmlError(errorMsg))
|
|
149
226
|
return
|
|
150
227
|
}
|
|
151
228
|
|
|
@@ -157,14 +234,14 @@ function handleRequest(req: IncomingMessage, res: ServerResponse): void {
|
|
|
157
234
|
if (!pending && !isReserved) {
|
|
158
235
|
const errorMsg = "Invalid or expired state parameter - potential CSRF attack"
|
|
159
236
|
res.writeHead(400, { "Content-Type": "text/html" })
|
|
160
|
-
res.end(
|
|
237
|
+
res.end(htmlError(errorMsg))
|
|
161
238
|
return
|
|
162
239
|
}
|
|
163
240
|
|
|
164
241
|
const errorMsg = errorDescription || error
|
|
165
242
|
// Send HTTP response first before rejecting promise
|
|
166
243
|
res.writeHead(200, { "Content-Type": "text/html" })
|
|
167
|
-
res.end(
|
|
244
|
+
res.end(htmlError(errorMsg))
|
|
168
245
|
// Reject promise after response is sent (defer to allow test to attach handler)
|
|
169
246
|
if (pending) {
|
|
170
247
|
reservedAuthStates.delete(state)
|
|
@@ -179,20 +256,20 @@ function handleRequest(req: IncomingMessage, res: ServerResponse): void {
|
|
|
179
256
|
if (!pending && !isReserved) {
|
|
180
257
|
const errorMsg = "Invalid or expired state parameter - potential CSRF attack"
|
|
181
258
|
res.writeHead(400, { "Content-Type": "text/html" })
|
|
182
|
-
res.end(
|
|
259
|
+
res.end(htmlError(errorMsg))
|
|
183
260
|
return
|
|
184
261
|
}
|
|
185
262
|
|
|
186
263
|
// Require authorization code
|
|
187
264
|
if (!code) {
|
|
188
265
|
res.writeHead(400, { "Content-Type": "text/html" })
|
|
189
|
-
res.end(
|
|
266
|
+
res.end(htmlError("No authorization code provided"))
|
|
190
267
|
return
|
|
191
268
|
}
|
|
192
269
|
|
|
193
270
|
if (!pending) {
|
|
194
271
|
res.writeHead(200, { "Content-Type": "text/html" })
|
|
195
|
-
res.end(
|
|
272
|
+
res.end(htmlManualSuccess())
|
|
196
273
|
return
|
|
197
274
|
}
|
|
198
275
|
|
|
@@ -202,7 +279,7 @@ function handleRequest(req: IncomingMessage, res: ServerResponse): void {
|
|
|
202
279
|
pending.resolve({ code, ...(iss !== null ? { iss } : {}) })
|
|
203
280
|
|
|
204
281
|
res.writeHead(200, { "Content-Type": "text/html" })
|
|
205
|
-
res.end(
|
|
282
|
+
res.end(htmlSuccess())
|
|
206
283
|
}
|
|
207
284
|
|
|
208
285
|
/**
|
|
@@ -6,7 +6,7 @@ import { executeCall } from "./proxy-modes.ts";
|
|
|
6
6
|
import { combineAbortSignals } from "./runtime-owner.ts";
|
|
7
7
|
import { paginate, rankSuggestions, rankToolMatches } from "./search-ranking.ts";
|
|
8
8
|
import type { McpExtensionState } from "./state.ts";
|
|
9
|
-
import { findToolByName } from "./tool-metadata.ts";
|
|
9
|
+
import { findToolByName, formatSchema } from "./tool-metadata.ts";
|
|
10
10
|
import { renderTsShape } from "./ts-shape.ts";
|
|
11
11
|
import type { ContentBlock } from "./types.ts";
|
|
12
12
|
|
|
@@ -14,7 +14,7 @@ export const DEFAULT_MCP_SCRIPT_TIMEOUT_MS = 30_000;
|
|
|
14
14
|
|
|
15
15
|
class McpScriptTimeoutError extends Error {
|
|
16
16
|
constructor(timeoutMs: number) {
|
|
17
|
-
super(`
|
|
17
|
+
super(`mcpScript timed out after ${timeoutMs}ms`);
|
|
18
18
|
this.name = "McpScriptTimeoutError";
|
|
19
19
|
}
|
|
20
20
|
}
|
|
@@ -139,7 +139,7 @@ export async function runMcpScript(
|
|
|
139
139
|
// Record before dispatch so calls still in flight at timeout/abort appear in the trace.
|
|
140
140
|
const startedAt = Date.now();
|
|
141
141
|
const index = calls.push({ operation: "call", path, ok: false, error: "incomplete", durationMs: 0, startedAt }) - 1;
|
|
142
|
-
const result = await executeCall(state, path, args, undefined, getPiTools, callSignal);
|
|
142
|
+
const result = await executeCall(state, path, args, undefined, getPiTools, callSignal, "script");
|
|
143
143
|
const details = result.details;
|
|
144
144
|
if (details.error !== undefined) {
|
|
145
145
|
const errorCode = String(details.error);
|
|
@@ -147,7 +147,7 @@ export async function runMcpScript(
|
|
|
147
147
|
? details.suggestions.filter((suggestion): suggestion is string => typeof suggestion === "string")
|
|
148
148
|
: [];
|
|
149
149
|
const message = errorCode === "tool_not_found"
|
|
150
|
-
? `Tool "${path}" not found. Use await tools.search({ query: "..." }) inside
|
|
150
|
+
? `Tool "${path}" not found. Use await tools.search({ query: "..." }) inside mcpScript.${suggestions.length > 0 ? ` Did you mean: ${suggestions.join(", ")}` : ""}`
|
|
151
151
|
: typeof details.message === "string"
|
|
152
152
|
? details.message
|
|
153
153
|
: textFromContent(result.content);
|
|
@@ -172,9 +172,9 @@ export async function runMcpScript(
|
|
|
172
172
|
if (query.trim() === "") {
|
|
173
173
|
return { items: [], total: 0, hasMore: false, nextOffset: null };
|
|
174
174
|
}
|
|
175
|
-
const server = typeof input
|
|
176
|
-
const limit = typeof input
|
|
177
|
-
const offset = typeof input
|
|
175
|
+
const server = typeof input?.server === "string" ? input.server : undefined;
|
|
176
|
+
const limit = typeof input?.limit === "number" ? input.limit : 12;
|
|
177
|
+
const offset = typeof input?.offset === "number" ? input.offset : 0;
|
|
178
178
|
const page = paginate(rankToolMatches(state, query, server), offset, limit);
|
|
179
179
|
return {
|
|
180
180
|
...page,
|
|
@@ -204,7 +204,9 @@ export async function runMcpScript(
|
|
|
204
204
|
for (const [server, metadata] of state.toolMetadata) {
|
|
205
205
|
const tool = findToolByName(metadata, path);
|
|
206
206
|
if (!tool) continue;
|
|
207
|
-
const inputTypeScript = tool.inputSchema
|
|
207
|
+
const inputTypeScript = tool.inputSchema
|
|
208
|
+
? renderTsShape(tool.inputSchema) ?? formatSchema(tool.inputSchema)
|
|
209
|
+
: null;
|
|
208
210
|
return {
|
|
209
211
|
path: tool.name,
|
|
210
212
|
name: tool.originalName,
|
|
@@ -285,7 +287,7 @@ export async function runMcpScript(
|
|
|
285
287
|
});
|
|
286
288
|
activeWorker.once("error", reject);
|
|
287
289
|
activeWorker.once("exit", (code) => {
|
|
288
|
-
if (!completed && code !== 0) reject(new Error(`
|
|
290
|
+
if (!completed && code !== 0) reject(new Error(`mcpScript worker exited with code ${code}`));
|
|
289
291
|
});
|
|
290
292
|
});
|
|
291
293
|
const timeoutError = new McpScriptTimeoutError(resolvedTimeoutMs);
|
|
@@ -313,7 +315,7 @@ export async function runMcpScript(
|
|
|
313
315
|
} catch (error) {
|
|
314
316
|
if (error instanceof McpScriptTimeoutError) {
|
|
315
317
|
errorCode = "timeout";
|
|
316
|
-
errorMessage = `
|
|
318
|
+
errorMessage = `mcpScript timed out after ${resolvedTimeoutMs}ms`;
|
|
317
319
|
} else if (externalSignal?.aborted) {
|
|
318
320
|
errorCode = "aborted";
|
|
319
321
|
errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -330,7 +332,7 @@ export async function runMcpScript(
|
|
|
330
332
|
callsSnapshot ??= snapshotCalls();
|
|
331
333
|
// A script may finish without awaiting every call; abort leftovers so
|
|
332
334
|
// parent-side dispatches do not outlive the script.
|
|
333
|
-
timeoutController.abort(new Error("
|
|
335
|
+
timeoutController.abort(new Error("mcpScript finished"));
|
|
334
336
|
await worker?.terminate();
|
|
335
337
|
}
|
|
336
338
|
|
|
@@ -10,12 +10,12 @@ import {
|
|
|
10
10
|
type AddClientAuthentication,
|
|
11
11
|
type OAuthClientProvider,
|
|
12
12
|
type OAuthDiscoveryState,
|
|
13
|
-
} from "@modelcontextprotocol/
|
|
13
|
+
} from "@modelcontextprotocol/client"
|
|
14
14
|
import type {
|
|
15
15
|
OAuthClientInformationMixed,
|
|
16
16
|
OAuthClientMetadata,
|
|
17
17
|
OAuthTokens,
|
|
18
|
-
} from "@modelcontextprotocol/
|
|
18
|
+
} from "@modelcontextprotocol/client"
|
|
19
19
|
import {
|
|
20
20
|
getAuthForUrl,
|
|
21
21
|
updateTokens,
|
|
@@ -30,6 +30,37 @@ import {
|
|
|
30
30
|
type StoredClientInfo,
|
|
31
31
|
} from "./mcp-auth.ts"
|
|
32
32
|
import { resolveCommandSecret } from "./utils.ts"
|
|
33
|
+
import { getAppClientUri, getAppName } from "./agent-dir.ts"
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Client name advertised during Dynamic Client Registration.
|
|
37
|
+
*
|
|
38
|
+
* A distribution that rebrands pi (arc, tau, …) should register under its own
|
|
39
|
+
* name — otherwise every consent screen its users see asks them to authorize
|
|
40
|
+
* an app they have never run. Stock pi keeps the long-standing
|
|
41
|
+
* "Pi Coding Agent" so existing registrations are unaffected.
|
|
42
|
+
*/
|
|
43
|
+
function defaultClientName(): string {
|
|
44
|
+
const app = getAppName()
|
|
45
|
+
return app === "pi" ? "Pi Coding Agent" : app
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Client homepage advertised during Dynamic Client Registration.
|
|
50
|
+
*
|
|
51
|
+
* RFC 7591 defines client_uri as the home page *of the client*. Under a
|
|
52
|
+
* rebranded pi the client is that distribution, not this adapter, so pointing
|
|
53
|
+
* at the adapter's repository misidentifies it on the consent screen. There is
|
|
54
|
+
* no way to guess the right URL and a wrong one is worse than none, so the
|
|
55
|
+
* field is omitted unless a server config supplies oauth.clientUri.
|
|
56
|
+
*
|
|
57
|
+
* Stock pi keeps the historical value.
|
|
58
|
+
*/
|
|
59
|
+
function defaultClientUri(): string | undefined {
|
|
60
|
+
const declared = getAppClientUri()
|
|
61
|
+
if (declared) return declared
|
|
62
|
+
return getAppName() === "pi" ? "https://github.com/nicobailon/pi-mcp-adapter" : undefined
|
|
63
|
+
}
|
|
33
64
|
|
|
34
65
|
type IssuerBoundClientInformation = OAuthClientInformationMixed & { issuer?: string }
|
|
35
66
|
type IssuerBoundTokens = OAuthTokens & { issuer?: string }
|
|
@@ -86,6 +117,8 @@ export interface McpOAuthConfig {
|
|
|
86
117
|
redirectUri?: string
|
|
87
118
|
clientName?: string
|
|
88
119
|
clientUri?: string
|
|
120
|
+
logoUri?: string
|
|
121
|
+
skipIssuerMetadataValidation?: boolean
|
|
89
122
|
}
|
|
90
123
|
|
|
91
124
|
const reservedAuthorizationParams = new Set([
|
|
@@ -188,6 +221,11 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
188
221
|
return this.redirectUrlSnapshot
|
|
189
222
|
}
|
|
190
223
|
|
|
224
|
+
/** Configured homepage, else the historical default on stock pi, else nothing. */
|
|
225
|
+
private get clientUri(): string | undefined {
|
|
226
|
+
return this.config.clientUri ?? defaultClientUri()
|
|
227
|
+
}
|
|
228
|
+
|
|
191
229
|
/**
|
|
192
230
|
* Client metadata for dynamic registration.
|
|
193
231
|
* Describes this client to the OAuth authorization server.
|
|
@@ -195,8 +233,9 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
195
233
|
get clientMetadata(): OAuthClientMetadata {
|
|
196
234
|
if (this.usesClientCredentials) {
|
|
197
235
|
return {
|
|
198
|
-
client_name: this.config.clientName ??
|
|
199
|
-
client_uri: this.
|
|
236
|
+
client_name: this.config.clientName ?? defaultClientName(),
|
|
237
|
+
...(this.clientUri !== undefined ? { client_uri: this.clientUri } : {}),
|
|
238
|
+
...(this.config.logoUri !== undefined ? { logo_uri: this.config.logoUri } : {}),
|
|
200
239
|
redirect_uris: [],
|
|
201
240
|
grant_types: ["client_credentials"],
|
|
202
241
|
token_endpoint_auth_method: this.config.clientSecret ? "client_secret_post" : "none",
|
|
@@ -210,8 +249,9 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
210
249
|
|
|
211
250
|
return {
|
|
212
251
|
redirect_uris: [redirectUrl],
|
|
213
|
-
client_name: this.config.clientName ??
|
|
214
|
-
client_uri: this.
|
|
252
|
+
client_name: this.config.clientName ?? defaultClientName(),
|
|
253
|
+
...(this.clientUri !== undefined ? { client_uri: this.clientUri } : {}),
|
|
254
|
+
...(this.config.logoUri !== undefined ? { logo_uri: this.config.logoUri } : {}),
|
|
215
255
|
grant_types: ["authorization_code", "refresh_token"],
|
|
216
256
|
response_types: ["code"],
|
|
217
257
|
token_endpoint_auth_method: this.config.clientSecret ? "client_secret_post" : "none",
|
|
@@ -288,7 +328,7 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
288
328
|
updateClientInfo(this.serverName, clientInfo, this.serverUrl, this.storageOptions)
|
|
289
329
|
}
|
|
290
330
|
// Return all registration metadata and the local issuer extension.
|
|
291
|
-
// This keeps the SDK
|
|
331
|
+
// This keeps the SDK OAuth view and the stored issuer binding consistent.
|
|
292
332
|
return {
|
|
293
333
|
client_id: clientInfo.clientId,
|
|
294
334
|
client_secret: clientInfo.clientSecret,
|
|
@@ -318,7 +358,11 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
318
358
|
if (this.config.clientId && info.client_id === this.config.clientId) {
|
|
319
359
|
updateClientInfo(
|
|
320
360
|
this.serverName,
|
|
321
|
-
{
|
|
361
|
+
{
|
|
362
|
+
clientId: info.client_id,
|
|
363
|
+
...(issuer !== undefined ? { issuer } : {}),
|
|
364
|
+
configPreRegistered: true,
|
|
365
|
+
},
|
|
322
366
|
this.serverUrl,
|
|
323
367
|
this.storageOptions,
|
|
324
368
|
)
|
|
@@ -329,11 +373,11 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
329
373
|
?? (this.redirectUrl ? [this.redirectUrl] : undefined)
|
|
330
374
|
const clientInfo: StoredClientInfo = {
|
|
331
375
|
clientId: info.client_id,
|
|
332
|
-
clientSecret: info.client_secret,
|
|
333
|
-
clientIdIssuedAt: info.client_id_issued_at,
|
|
334
|
-
clientSecretExpiresAt: info.client_secret_expires_at,
|
|
335
|
-
redirectUris,
|
|
336
|
-
issuer,
|
|
376
|
+
...(info.client_secret !== undefined ? { clientSecret: info.client_secret } : {}),
|
|
377
|
+
...(info.client_id_issued_at !== undefined ? { clientIdIssuedAt: info.client_id_issued_at } : {}),
|
|
378
|
+
...(info.client_secret_expires_at !== undefined ? { clientSecretExpiresAt: info.client_secret_expires_at } : {}),
|
|
379
|
+
...(redirectUris !== undefined ? { redirectUris } : {}),
|
|
380
|
+
...(issuer !== undefined ? { issuer } : {}),
|
|
337
381
|
}
|
|
338
382
|
this.flowClientInfo = clientInfo
|
|
339
383
|
updateClientInfo(this.serverName, clientInfo, this.serverUrl, this.storageOptions)
|
|
@@ -370,15 +414,16 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
370
414
|
* Save OAuth tokens.
|
|
371
415
|
*/
|
|
372
416
|
async saveTokens(tokens: OAuthTokens): Promise<void> {
|
|
417
|
+
const issuer = this.discoveredIssuer ?? (tokens as IssuerBoundTokens).issuer
|
|
373
418
|
const storedTokens: StoredTokens = {
|
|
374
419
|
accessToken: tokens.access_token,
|
|
375
|
-
refreshToken: tokens.refresh_token,
|
|
420
|
+
...(tokens.refresh_token !== undefined ? { refreshToken: tokens.refresh_token } : {}),
|
|
376
421
|
// Preserve expiry even when expires_in is 0 (e.g. the SDK re-saving an
|
|
377
422
|
// already-expired token) so expired tokens stay expired instead of
|
|
378
423
|
// being persisted as never-expiring.
|
|
379
|
-
|
|
380
|
-
scope: tokens.scope,
|
|
381
|
-
issuer
|
|
424
|
+
...(tokens.expires_in !== undefined ? { expiresAt: Date.now() / 1000 + tokens.expires_in } : {}),
|
|
425
|
+
...(tokens.scope !== undefined ? { scope: tokens.scope } : {}),
|
|
426
|
+
...(issuer !== undefined ? { issuer } : {}),
|
|
382
427
|
}
|
|
383
428
|
this.throwIfInactive()
|
|
384
429
|
updateTokens(this.serverName, storedTokens, this.serverUrl, this.storageOptions)
|
|
@@ -107,7 +107,7 @@ export async function guardMcpOutput(
|
|
|
107
107
|
if (options.enabled === false) {
|
|
108
108
|
return {
|
|
109
109
|
content: addAffixes(normalizedContent, prefix, suffix),
|
|
110
|
-
mcpResult: options.rawMcpResult,
|
|
110
|
+
...(options.rawMcpResult !== undefined ? { mcpResult: options.rawMcpResult } : {}),
|
|
111
111
|
};
|
|
112
112
|
}
|
|
113
113
|
|
|
@@ -138,8 +138,8 @@ export async function guardMcpOutput(
|
|
|
138
138
|
originalLines: stats.lines,
|
|
139
139
|
returnedLines: finalStats.lines,
|
|
140
140
|
...(imageBlocks.length > 0 ? { imageBlocksPassedThrough: imageBlocks.length } : {}),
|
|
141
|
-
fullOutputPath,
|
|
142
|
-
writeError,
|
|
141
|
+
...(fullOutputPath !== undefined ? { fullOutputPath } : {}),
|
|
142
|
+
...(writeError !== undefined ? { writeError } : {}),
|
|
143
143
|
};
|
|
144
144
|
}
|
|
145
145
|
|
|
@@ -147,7 +147,11 @@ export async function guardMcpOutput(
|
|
|
147
147
|
? undefined
|
|
148
148
|
: await boundMcpResult(options.rawMcpResult, detailsMaxBytes);
|
|
149
149
|
|
|
150
|
-
return {
|
|
150
|
+
return {
|
|
151
|
+
content: guardedContent,
|
|
152
|
+
...(outputGuard ? { outputGuard } : {}),
|
|
153
|
+
...(mcpResult !== undefined ? { mcpResult } : {}),
|
|
154
|
+
};
|
|
151
155
|
}
|
|
152
156
|
|
|
153
157
|
function sanitizeContent(content: ContentBlock[]): ContentBlock[] {
|
|
@@ -177,7 +181,7 @@ function addAffixes(content: ContentBlock[], prefix: string, suffix: string): Co
|
|
|
177
181
|
if (prefix) {
|
|
178
182
|
const index = next.findIndex((block) => block.type === "text");
|
|
179
183
|
const block = next[index];
|
|
180
|
-
if (
|
|
184
|
+
if (block?.type === "text") {
|
|
181
185
|
next[index] = { ...block, text: `${prefix}${block.text}` };
|
|
182
186
|
} else {
|
|
183
187
|
next.unshift({ type: "text", text: prefix });
|
|
@@ -187,13 +191,13 @@ function addAffixes(content: ContentBlock[], prefix: string, suffix: string): Co
|
|
|
187
191
|
if (suffix) {
|
|
188
192
|
let index = -1;
|
|
189
193
|
for (let i = next.length - 1; i >= 0; i--) {
|
|
190
|
-
if (next[i]
|
|
194
|
+
if (next[i]?.type === "text") {
|
|
191
195
|
index = i;
|
|
192
196
|
break;
|
|
193
197
|
}
|
|
194
198
|
}
|
|
195
199
|
const block = next[index];
|
|
196
|
-
if (
|
|
200
|
+
if (block?.type === "text") {
|
|
197
201
|
next[index] = { ...block, text: `${block.text}${suffix}` };
|
|
198
202
|
} else {
|
|
199
203
|
next.push({ type: "text", text: suffix });
|
|
@@ -239,8 +243,8 @@ function truncateHead(text: string, maxBytes: number, maxLines: number): { conte
|
|
|
239
243
|
function truncateStringToBytes(value: string, maxBytes: number): string {
|
|
240
244
|
if (byteLength(value) <= maxBytes) return value;
|
|
241
245
|
const buffer = Buffer.from(value, "utf8");
|
|
242
|
-
let end = Math.max(0, maxBytes);
|
|
243
|
-
while (end > 0 && (buffer
|
|
246
|
+
let end = Number.isFinite(maxBytes) ? Math.max(0, Math.floor(maxBytes)) : 0;
|
|
247
|
+
while (end > 0 && (buffer.readUInt8(end) & 0xc0) === 0x80) end--;
|
|
244
248
|
return buffer.subarray(0, end).toString("utf8");
|
|
245
249
|
}
|
|
246
250
|
|
|
@@ -280,8 +284,8 @@ async function summarizeMcpResult(result: unknown, raw: string, rawBytes: number
|
|
|
280
284
|
contentBlocks: content.length,
|
|
281
285
|
contentSummary: summarizeContent(content),
|
|
282
286
|
rawResultBytes: rawBytes,
|
|
283
|
-
fullResultPath,
|
|
284
|
-
resultWriteError,
|
|
287
|
+
...(fullResultPath !== undefined ? { fullResultPath } : {}),
|
|
288
|
+
...(resultWriteError !== undefined ? { resultWriteError } : {}),
|
|
285
289
|
};
|
|
286
290
|
|
|
287
291
|
if (record && "structuredContent" in record) {
|