@herbertgao/pi-extensions 2026.8.11 → 2026.8.13
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 +23 -10
- package/{node_modules/@herbertgao/pi-mermaid-open/LICENSE → THIRD_PARTY_NOTICES.md} +19 -1
- package/node_modules/@czottmann/pi-automode/CHANGELOG.md +15 -0
- package/node_modules/@czottmann/pi-automode/README.md +5 -3
- package/node_modules/@czottmann/pi-automode/docs/adr/ADR-001-permission-precedence-and-trust-boundaries.md +2 -0
- package/node_modules/@czottmann/pi-automode/docs/adr/ADR-002-global-config-in-extension-data-directory.md +60 -0
- package/node_modules/@czottmann/pi-automode/docs/adr/INDEX.md +1 -0
- package/node_modules/@czottmann/pi-automode/docs/automode-classifier-flow.md +4 -4
- package/node_modules/@czottmann/pi-automode/docs/configuration.md +20 -4
- package/node_modules/@czottmann/pi-automode/docs/observability-logging.md +1 -1
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/bash.ts +692 -0
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/config.ts +181 -3
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/constants.ts +4 -1
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/extension.ts +143 -36
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/hard-deny.ts +103 -148
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/paths.ts +32 -6
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/permissions.ts +344 -22
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode.ts +1 -0
- package/node_modules/@czottmann/pi-automode/package.json +4 -1
- package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +2 -1
- package/node_modules/@herbertgao/pi-cc-extensions/README.md +2 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +4 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +21 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/agent-summary/core.ts +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +19 -19
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +4 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +2 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +10 -2
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
- package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +10 -0
- package/node_modules/@herbertgao/pi-subagents/README.md +21 -15
- package/node_modules/@herbertgao/pi-subagents/package.json +3 -3
- package/node_modules/@herbertgao/pi-subagents/src/agent-file-toggle.ts +11 -8
- package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +184 -106
- package/node_modules/@herbertgao/pi-subagents/src/cross-extension-rpc.ts +31 -11
- package/node_modules/@herbertgao/pi-subagents/src/custom-agents.ts +9 -1
- package/node_modules/@herbertgao/pi-subagents/src/index.ts +156 -31
- package/node_modules/@herbertgao/pi-subagents/src/invocation-config.ts +17 -0
- package/node_modules/@herbertgao/pi-subagents/src/model-resolver.ts +14 -0
- package/node_modules/@herbertgao/pi-subagents/src/schedule.ts +8 -0
- package/node_modules/@herbertgao/pi-subagents/src/settings.ts +32 -1
- package/node_modules/@herbertgao/pi-subagents/src/types.ts +17 -2
- package/node_modules/@herbertgao/pi-subagents/src/ui/agent-widget.ts +23 -2
- package/node_modules/@herbertgao/pi-subagents/src/ui/conversation-viewer.ts +259 -24
- package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +2 -2
- package/node_modules/@luxusai/pi-hindsight/CHANGELOG.md +376 -0
- package/node_modules/@luxusai/pi-hindsight/README.md +92 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/001-memory-lifecycle-and-scope.md +56 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/002-explicit-routing-strategy-seam.md +169 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/003-tui-memory-mode-vocabulary.md +107 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/004-lifeos-dual-bank-design.md +89 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/005-domain-banks-and-agent-first-surface.md +189 -0
- package/node_modules/@luxusai/pi-hindsight/docs/assets/logos/pi-hindsight-logo-dark.webp +0 -0
- package/node_modules/@luxusai/pi-hindsight/docs/assets/logos/pi-hindsight-logo-dark@2x.webp +0 -0
- package/node_modules/@luxusai/pi-hindsight/docs/coding-memory-evaluation.md +54 -0
- package/node_modules/@luxusai/pi-hindsight/docs/compatibility.md +75 -0
- package/node_modules/@luxusai/pi-hindsight/docs/hindsight-core-functions.md +300 -0
- package/node_modules/@luxusai/pi-hindsight/docs/mission-and-mental-model-quality.md +158 -0
- package/node_modules/@luxusai/pi-hindsight/docs/next-opt-out-design.md +164 -0
- package/node_modules/@luxusai/pi-hindsight/docs/risky-memory-modes.md +139 -0
- package/node_modules/@luxusai/pi-hindsight/docs/starter-mental-model-suggestions.md +74 -0
- package/node_modules/@luxusai/pi-hindsight/docs/surface-reference.md +261 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-operations.ts +151 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-selection.ts +18 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-settings-presenter.ts +46 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-templates.ts +383 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/banking.ts +240 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/knowledge-page-seed.ts +176 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/retain-strategies.ts +178 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/client/client-retry.ts +41 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/client/client.ts +386 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/client/fetch-compat.ts +39 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/client/timeout.ts +34 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-defaults.ts +140 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-editing-model.ts +61 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-editing-registry.ts +925 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-field-paths.ts +247 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-normalize.ts +547 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-writer.ts +480 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config.ts +182 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/setup-gate.ts +86 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-execute.ts +1010 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-parse.ts +175 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-plan.ts +425 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-presentation.ts +210 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-sessions.ts +817 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/index.ts +25 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/git-seed.ts +319 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-recall.ts +196 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-retain.ts +189 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-runtime.ts +65 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle.ts +260 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/mental-models.ts +244 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/observation-scopes.ts +59 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall-cleanup.ts +82 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall-visibility.ts +45 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall.ts +331 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-cursor.ts +354 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-job-builder.ts +66 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-receipts.ts +132 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain.ts +228 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-bank-template-operations.ts +74 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-config-operations.ts +16 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-control-operations.ts +648 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-diagnostics-operations.ts +105 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-identity.ts +68 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-operation-service.ts +71 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-operation-types.ts +13 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-recall-operations.ts +162 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-retain-operations.ts +131 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-scope.ts +104 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-session-operations.ts +37 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/operation-catalog.ts +893 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/reflect-presenter.ts +35 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/scope-migrate.ts +177 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/tools.ts +7 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/flush-presenter.ts +21 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/jsonl-queue-store.ts +112 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-delivery.ts +111 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-lock.ts +214 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-operations.ts +70 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue.ts +392 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/bank-template-presentation.ts +45 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/commands.ts +9 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/guided-setup.ts +860 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/prefill-input.ts +105 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-flow.ts +189 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-server-probe.ts +299 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-actions.ts +201 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-facts.ts +47 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-render.ts +239 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-types.ts +50 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui.ts +259 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/tool-presenters.ts +77 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/types.ts +534 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/diagnostics.ts +319 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/messages.ts +325 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/sanitize.ts +42 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/session-memory-meta.ts +244 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/session-operations.ts +56 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/session.ts +50 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/status-fields.ts +167 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/status-health.ts +207 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/status.ts +120 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/version.ts +8 -0
- package/node_modules/@luxusai/pi-hindsight/package.json +118 -0
- package/node_modules/@luxusai/pi-hindsight/skills/hindsight-memory-doctor/SKILL.md +75 -0
- package/node_modules/@narumitw/pi-btw/dist/index.ts +143 -46
- package/node_modules/@narumitw/pi-btw/dist/index.ts.map +3 -3
- package/node_modules/@narumitw/pi-btw/package.json +6 -6
- package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +136 -22
- package/node_modules/{@herbertgao → @tifan}/pi-copy-response/README.md +2 -4
- package/node_modules/{@herbertgao → @tifan}/pi-copy-response/package.json +5 -15
- package/node_modules/{@herbertgao → @tifan}/pi-handoff/README.md +4 -6
- package/node_modules/@tifan/pi-handoff/package.json +43 -0
- package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/index.ts +1 -1
- package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/README.md +2 -4
- package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/package.json +5 -15
- package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/README.md +5 -7
- package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/package.json +5 -19
- package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/README.md +4 -6
- package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/package.json +6 -16
- package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/src/index.ts +1 -6
- package/node_modules/{@herbertgao → @tifan}/pi-recap/README.md +4 -6
- package/node_modules/@tifan/pi-recap/package.json +42 -0
- package/node_modules/{@herbertgao → @tifan}/pi-recap/src/models.ts +1 -6
- package/node_modules/{@herbertgao → @tifan}/pi-rename/README.md +13 -8
- package/node_modules/@tifan/pi-rename/package.json +47 -0
- package/node_modules/@tifan/pi-rename/src/herdr-label.ts +4 -0
- package/node_modules/{@herbertgao → @tifan}/pi-rename/src/index.ts +4 -16
- package/node_modules/{@herbertgao → @tifan}/pi-rename/src/models.ts +1 -6
- package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/README.md +2 -4
- package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/package.json +5 -15
- package/node_modules/pi-lens/CHANGELOG.md +96 -1
- package/node_modules/pi-lens/dist/clients/actionable-warnings-logger.js +2 -1
- package/node_modules/pi-lens/dist/clients/actionable-warnings.js +14 -5
- package/node_modules/pi-lens/dist/clients/advisory-provenance.js +48 -18
- package/node_modules/pi-lens/dist/clients/ast-grep-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/atomic-write-staging.js +16 -4
- package/node_modules/pi-lens/dist/clients/bash-file-access.js +3 -1
- package/node_modules/pi-lens/dist/clients/biome-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/blocker-freshness.js +21 -8
- package/node_modules/pi-lens/dist/clients/bounded-cache.js +24 -8
- package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +4 -3
- package/node_modules/pi-lens/dist/clients/cache-manager.js +6 -7
- package/node_modules/pi-lens/dist/clients/cache-observability.js +461 -66
- package/node_modules/pi-lens/dist/clients/call-graph.js +238 -63
- package/node_modules/pi-lens/dist/clients/codebase-model.js +13 -5
- package/node_modules/pi-lens/dist/clients/complexity-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/dead-code-client.js +19 -8
- package/node_modules/pi-lens/dist/clients/dead-code-logger.js +1 -2
- package/node_modules/pi-lens/dist/clients/deadline-utils.js +3 -1
- package/node_modules/pi-lens/dist/clients/debug-heap.js +8 -1
- package/node_modules/pi-lens/dist/clients/degradation-ledger.js +1 -1
- package/node_modules/pi-lens/dist/clients/dependency-checker.js +11 -7
- package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +39 -2
- package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +5 -1
- package/node_modules/pi-lens/dist/clients/dispatch/auxiliary-lsp.js +2 -3
- package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +13 -1
- package/node_modules/pi-lens/dist/clients/dispatch/facts/function-facts.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/facts/import-facts.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/integration.js +9 -4
- package/node_modules/pi-lens/dist/clients/dispatch/rules/error-swallowing.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +6 -2
- package/node_modules/pi-lens/dist/clients/dispatch/rules/unsafe-boundary.js +31 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/actionlint.js +5 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +10 -14
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +5 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/dotnet-build.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +25 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/fish-indent.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/gleam-check.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/golangci-lint.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +13 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +4 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +25 -10
- package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ktlint.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +28 -4
- package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +6 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +212 -11
- package/node_modules/pi-lens/dist/clients/dispatch/runners/php-lint.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +8 -4
- package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +10 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +23 -14
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +7 -9
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +5 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +7 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +6 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +13 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +13 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tree-sitter.js +17 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +7 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +24 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +35 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +1 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +6 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/suppress-writer.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/types.js +6 -1
- package/node_modules/pi-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +6 -2
- package/node_modules/pi-lens/dist/clients/extension-log.js +5 -3
- package/node_modules/pi-lens/dist/clients/feature-hints.js +8 -1
- package/node_modules/pi-lens/dist/clients/file-kinds.js +34 -129
- package/node_modules/pi-lens/dist/clients/file-utils.js +17 -1
- package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +57 -2
- package/node_modules/pi-lens/dist/clients/formatters.js +144 -27
- package/node_modules/pi-lens/dist/clients/freshness.js +38 -0
- package/node_modules/pi-lens/dist/clients/git-guard.js +43 -13
- package/node_modules/pi-lens/dist/clients/go-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/grammar-source.js +1 -1
- package/node_modules/pi-lens/dist/clients/gzip-stage-write.js +30 -4
- package/node_modules/pi-lens/dist/clients/host-edit-normalize.js +1 -3
- package/node_modules/pi-lens/dist/clients/install-diagnostics.js +4 -2
- package/node_modules/pi-lens/dist/clients/installer/index.js +86 -77
- package/node_modules/pi-lens/dist/clients/instance-reaper.js +5 -2
- package/node_modules/pi-lens/dist/clients/instance-registry.js +4 -2
- package/node_modules/pi-lens/dist/clients/jscpd-client.js +6 -1
- package/node_modules/pi-lens/dist/clients/knip-client.js +29 -15
- package/node_modules/pi-lens/dist/clients/language-profile.js +4 -1
- package/node_modules/pi-lens/dist/clients/latency-logger.js +13 -2
- package/node_modules/pi-lens/dist/clients/lens-config.js +1 -1
- package/node_modules/pi-lens/dist/clients/lens-map.js +8 -3
- package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +1 -1
- package/node_modules/pi-lens/dist/clients/lsp/config.js +4 -6
- package/node_modules/pi-lens/dist/clients/lsp/edits.js +119 -32
- package/node_modules/pi-lens/dist/clients/lsp/index.js +94 -35
- package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +2 -1
- package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +4 -1
- package/node_modules/pi-lens/dist/clients/lsp/launch.js +11 -3
- package/node_modules/pi-lens/dist/clients/lsp/pending-aux-coverage.js +152 -0
- package/node_modules/pi-lens/dist/clients/lsp/server.js +19 -7
- package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +10 -2
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +9 -4
- package/node_modules/pi-lens/dist/clients/lsp-document-symbols.js +1 -3
- package/node_modules/pi-lens/dist/clients/lsp-mutation.js +10 -20
- package/node_modules/pi-lens/dist/clients/mcp/host-shim.js +1 -1
- package/node_modules/pi-lens/dist/clients/memory-sampler.js +73 -7
- package/node_modules/pi-lens/dist/clients/metrics-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/middle-man-analysis.js +8 -3
- package/node_modules/pi-lens/dist/clients/module-report-lsp.js +7 -1
- package/node_modules/pi-lens/dist/clients/module-report.js +14 -17
- package/node_modules/pi-lens/dist/clients/ndjson-logger.js +3 -5
- package/node_modules/pi-lens/dist/clients/opaque-mutation-scan.js +220 -0
- package/node_modules/pi-lens/dist/clients/package-manager.js +6 -1
- package/node_modules/pi-lens/dist/clients/pipeline.js +57 -9
- package/node_modules/pi-lens/dist/clients/project-conventions.js +2 -8
- package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +10 -7
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +2 -1
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +3 -1
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +13 -9
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +3 -1
- package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +5 -2
- package/node_modules/pi-lens/dist/clients/project-lens-config.js +12 -5
- package/node_modules/pi-lens/dist/clients/project-snapshot-fingerprint.js +48 -0
- package/node_modules/pi-lens/dist/clients/project-snapshot-persist-worker.js +15 -1
- package/node_modules/pi-lens/dist/clients/project-snapshot.js +472 -66
- package/node_modules/pi-lens/dist/clients/read-expansion.js +12 -2
- package/node_modules/pi-lens/dist/clients/read-guard-logger.js +5 -4
- package/node_modules/pi-lens/dist/clients/read-guard-tool-lines.js +5 -2
- package/node_modules/pi-lens/dist/clients/read-guard.js +1 -1
- package/node_modules/pi-lens/dist/clients/resource-sampler.js +1 -1
- package/node_modules/pi-lens/dist/clients/reverse-deps.js +6 -5
- package/node_modules/pi-lens/dist/clients/review-graph/builder.js +42 -17
- package/node_modules/pi-lens/dist/clients/review-graph/git-identity.js +8 -2
- package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +10 -1
- package/node_modules/pi-lens/dist/clients/review-graph/query.js +2 -1
- package/node_modules/pi-lens/dist/clients/review-graph/tsconfig-paths.js +4 -2
- package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +2 -2
- package/node_modules/pi-lens/dist/clients/ruff-client.js +6 -5
- package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +63 -31
- package/node_modules/pi-lens/dist/clients/runtime-context.js +12 -4
- package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +83 -4
- package/node_modules/pi-lens/dist/clients/runtime-session.js +14 -0
- package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +59 -3
- package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +148 -34
- package/node_modules/pi-lens/dist/clients/runtime-turn.js +147 -6
- package/node_modules/pi-lens/dist/clients/rust-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/safe-spawn.js +150 -11
- package/node_modules/pi-lens/dist/clients/security-scan-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/session-summary.js +3 -1
- package/node_modules/pi-lens/dist/clients/sg-runner.js +1 -3
- package/node_modules/pi-lens/dist/clients/source-filter.js +10 -6
- package/node_modules/pi-lens/dist/clients/source-walker.js +1 -1
- package/node_modules/pi-lens/dist/clients/spawn-timeout-cooldown.js +96 -0
- package/node_modules/pi-lens/dist/clients/startup-scan.js +4 -1
- package/node_modules/pi-lens/dist/clients/tool-definition.js +7 -0
- package/node_modules/pi-lens/dist/clients/tool-policy.js +26 -11
- package/node_modules/pi-lens/dist/clients/tool-render.js +2 -1
- package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +10 -4
- package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +2 -2
- package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +12 -5
- package/node_modules/pi-lens/dist/clients/warm-attach.js +12 -5
- package/node_modules/pi-lens/dist/clients/widget-state.js +27 -11
- package/node_modules/pi-lens/dist/clients/word-index.js +3 -1
- package/node_modules/pi-lens/dist/clients/workspace-topology.js +8 -2
- package/node_modules/pi-lens/dist/clients/zizmor-config.js +9 -1
- package/node_modules/pi-lens/dist/i18n.js +13 -5
- package/node_modules/pi-lens/dist/index.js +10797 -8627
- package/node_modules/pi-lens/dist/mcp/server.js +3 -1
- package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +68 -12
- package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +21 -7
- package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +164 -35
- package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +24 -7
- package/node_modules/pi-lens/dist/tools/lsp-navigation.js +3 -1
- package/node_modules/pi-lens/dist/tools/module-report.js +1 -1
- package/node_modules/pi-lens/dist/tools/project-report.js +1 -1
- package/node_modules/pi-lens/dist/tools/symbol-search.js +5 -2
- package/node_modules/pi-lens/docs/durable-store-audit-1202.md +1 -1
- package/node_modules/pi-lens/docs/servercapabilities.md +1 -1
- package/node_modules/pi-lens/package.json +160 -156
- package/node_modules/pi-lens/rules/typos/_typos.toml +2 -2
- package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +31 -13
- package/node_modules/pi-lens/scripts/download-grammars.js +9 -3
- package/node_modules/pi-lens/scripts/rpc-load-check.mjs +30 -9
- package/node_modules/pi-mcp-adapter/CHANGELOG.md +47 -0
- package/node_modules/pi-mcp-adapter/README.md +42 -13
- package/node_modules/pi-mcp-adapter/commands.ts +4 -2
- package/node_modules/pi-mcp-adapter/config.ts +45 -5
- package/node_modules/pi-mcp-adapter/direct-tools.ts +103 -92
- package/node_modules/pi-mcp-adapter/dist/agent-dir.d.ts +10 -0
- package/node_modules/pi-mcp-adapter/dist/agent-dir.js +63 -0
- package/node_modules/pi-mcp-adapter/dist/agent-dir.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.d.ts +8 -0
- package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.js +356 -0
- package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/config.d.ts +123 -0
- package/node_modules/pi-mcp-adapter/dist/config.js +1087 -0
- package/node_modules/pi-mcp-adapter/dist/config.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/metadata-cache.d.ts +19 -0
- package/node_modules/pi-mcp-adapter/dist/metadata-cache.js +319 -0
- package/node_modules/pi-mcp-adapter/dist/metadata-cache.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.d.ts +2 -0
- package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.js +156 -0
- package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/resource-tools.d.ts +1 -0
- package/node_modules/pi-mcp-adapter/dist/resource-tools.js +15 -0
- package/node_modules/pi-mcp-adapter/dist/resource-tools.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/types.d.ts +564 -0
- package/node_modules/pi-mcp-adapter/dist/types.js +287 -0
- package/node_modules/pi-mcp-adapter/dist/types.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.d.ts +6 -0
- package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.js +37 -0
- package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/ui-stream-types.d.ts +104 -0
- package/node_modules/pi-mcp-adapter/dist/ui-stream-types.js +59 -0
- package/node_modules/pi-mcp-adapter/dist/ui-stream-types.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.d.ts +4 -0
- package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.js +27 -0
- package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/utils.d.ts +32 -0
- package/node_modules/pi-mcp-adapter/dist/utils.js +338 -0
- package/node_modules/pi-mcp-adapter/dist/utils.js.map +1 -0
- package/node_modules/pi-mcp-adapter/failure-backoff.ts +23 -0
- package/node_modules/pi-mcp-adapter/index.ts +204 -82
- package/node_modules/pi-mcp-adapter/init.ts +41 -30
- package/node_modules/pi-mcp-adapter/lifecycle.ts +16 -8
- package/node_modules/pi-mcp-adapter/mcp-code.ts +2 -0
- package/node_modules/pi-mcp-adapter/mcp-oauth-provider.ts +66 -16
- package/node_modules/pi-mcp-adapter/mcp-output-guard.ts +95 -7
- package/node_modules/pi-mcp-adapter/mcp-probe.ts +18 -4
- package/node_modules/pi-mcp-adapter/mcp-references.ts +368 -0
- package/node_modules/pi-mcp-adapter/mcp-status.ts +8 -19
- package/node_modules/pi-mcp-adapter/metadata-cache.ts +20 -12
- package/node_modules/pi-mcp-adapter/namespace-tools.ts +276 -0
- package/node_modules/pi-mcp-adapter/package.json +24 -6
- package/node_modules/pi-mcp-adapter/proxy-modes.ts +66 -10
- package/node_modules/pi-mcp-adapter/search-ranking.ts +2 -0
- package/node_modules/pi-mcp-adapter/server-manager.ts +63 -12
- package/node_modules/pi-mcp-adapter/state.ts +1 -3
- package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +16 -2
- package/node_modules/pi-mcp-adapter/types.ts +48 -1
- package/node_modules/pi-mcp-adapter/ui-server.ts +3 -19
- package/node_modules/pi-mcp-adapter/ui-session.ts +2 -1
- package/node_modules/pi-mcp-adapter/utils.ts +21 -19
- package/node_modules/pi-web-access/CHANGELOG.md +26 -0
- package/node_modules/pi-web-access/README.md +71 -14
- package/node_modules/pi-web-access/chrome-cookies.ts +115 -35
- package/node_modules/pi-web-access/credential-source.ts +6 -2
- package/node_modules/pi-web-access/curator-page.ts +5 -3
- package/node_modules/pi-web-access/curator-server.ts +2 -1
- package/node_modules/pi-web-access/extract.ts +89 -9
- package/node_modules/pi-web-access/fetch-params.ts +13 -0
- package/node_modules/pi-web-access/gemini-adc.ts +298 -0
- package/node_modules/pi-web-access/gemini-api.ts +59 -15
- package/node_modules/pi-web-access/gemini-search.ts +58 -18
- package/node_modules/pi-web-access/gemini-url-context.ts +3 -2
- package/node_modules/pi-web-access/gemini-web-config.ts +57 -7
- package/node_modules/pi-web-access/gemini-web.ts +9 -3
- package/node_modules/pi-web-access/github-api.ts +5 -4
- package/node_modules/pi-web-access/github-issue-pr.ts +700 -0
- package/node_modules/pi-web-access/index.ts +403 -297
- package/node_modules/pi-web-access/kimi-search.ts +234 -0
- package/node_modules/pi-web-access/openai-search.ts +118 -21
- package/node_modules/pi-web-access/package.json +3 -2
- package/node_modules/pi-web-access/ssrf-protection.ts +4 -1
- package/node_modules/pi-web-access/utils.ts +307 -1
- package/node_modules/pi-web-access/youtube-extract.ts +2 -2
- package/package.json +46 -37
- package/node_modules/@herbertgao/pi-copy-response/CHANGELOG.md +0 -49
- package/node_modules/@herbertgao/pi-copy-response/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-handoff/CHANGELOG.md +0 -83
- package/node_modules/@herbertgao/pi-handoff/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-handoff/package.json +0 -60
- package/node_modules/@herbertgao/pi-inline-skills/CHANGELOG.md +0 -57
- package/node_modules/@herbertgao/pi-inline-skills/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-mermaid-open/CHANGELOG.md +0 -39
- package/node_modules/@herbertgao/pi-preferred-thinking/CHANGELOG.md +0 -63
- package/node_modules/@herbertgao/pi-preferred-thinking/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-recap/CHANGELOG.md +0 -101
- package/node_modules/@herbertgao/pi-recap/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-recap/package.json +0 -55
- package/node_modules/@herbertgao/pi-rename/CHANGELOG.md +0 -49
- package/node_modules/@herbertgao/pi-rename/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-rename/package.json +0 -63
- package/node_modules/@herbertgao/pi-titlebar-spinner/CHANGELOG.md +0 -25
- package/node_modules/@herbertgao/pi-titlebar-spinner/LICENSE +0 -22
- /package/node_modules/{@herbertgao → @tifan}/pi-copy-response/src/index.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/complete-text.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/session-query.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/src/index.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/herdr-plugin/herdr-plugin.toml +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/herdr-plugin/viewer.mjs +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/src/index.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/index.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/model-picker.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/sanitize.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/tui.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/model-picker.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/naming.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/sanitize.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/src/index.ts +0 -0
|
@@ -6,23 +6,32 @@ import { Type } from "typebox";
|
|
|
6
6
|
import type { TSchema } from "typebox";
|
|
7
7
|
import { showStatus, showTools, showPrompts, reconnectServer, reconnectServers, authenticateServer, logoutServer, manageBearerToken, openMcpAuthPanel, openMcpPanel, openMcpSetup } from "./commands.ts";
|
|
8
8
|
import { cloneMcpConfig, loadMcpConfig, writeProjectServerDisabledOverride } from "./config.ts";
|
|
9
|
-
import { buildProxyDescription, createDirectToolExecutor, getMissingConfiguredDirectToolServers, resolveDirectTools } from "./direct-tools.ts";
|
|
9
|
+
import { buildProxyDescription, createDirectToolExecutor, getMissingConfiguredDirectToolServers, prepareDirectToolArguments, resolveDirectTools } from "./direct-tools.ts";
|
|
10
10
|
import { flushMetadataCache, initializeMcp, updateStatusBar } from "./init.ts";
|
|
11
|
-
import {
|
|
11
|
+
import { isServerInActiveFailureBackoff } from "./failure-backoff.ts";
|
|
12
|
+
import { loadMetadataCache, parseDirectToolSelectors, type MetadataCache } from "./metadata-cache.ts";
|
|
12
13
|
import { createPromptCommand, resolveCachedPrompts } from "./prompts.ts";
|
|
13
14
|
import { logger } from "./logger.ts";
|
|
14
15
|
import { executeAuthComplete, executeAuthStart, executeCall, executeConnect, executeDescribe, executeInstructions, executeList, executeSearch, executeStatus, executeUiMessages } from "./proxy-modes.ts";
|
|
15
16
|
import { formatTerminalError, getConfigPathFromArgv, normalizeDirectToolInputSchema, truncateAtWord } from "./utils.ts";
|
|
16
17
|
import { createOAuthRuntime, shutdownOAuth } from "./mcp-auth-flow.ts";
|
|
17
|
-
import { createMcpDirectToolCallRenderer, createMcpProxyToolCallRenderer, createMcpToolResultRenderer, resolveMcpToolRenderOptions } from "./tool-result-renderer.ts";
|
|
18
|
+
import { createMcpDirectToolCallRenderer, createMcpProxyToolCallRenderer, createMcpScriptToolCallRenderer, createMcpToolResultRenderer, resolveMcpToolRenderOptions } from "./tool-result-renderer.ts";
|
|
18
19
|
import { toolErrorOverride } from "./error-signal.ts";
|
|
19
20
|
import { createMcpRuntimeOwner, createOwnedUi, isAbortError, type McpRuntimeOwner } from "./runtime-owner.ts";
|
|
20
21
|
import { publishMcpStatusShutdown } from "./mcp-status.ts";
|
|
21
22
|
import { runMcpScript } from "./mcp-code.ts";
|
|
22
23
|
import { cleanupMaterializedBinaryResources } from "./tool-registrar.ts";
|
|
24
|
+
import { syncNamespaceProxyTools } from "./namespace-tools.ts";
|
|
23
25
|
|
|
24
26
|
export type { McpAdapterOptions } from "./types.ts";
|
|
25
27
|
export type { ServerEntry } from "./types.ts";
|
|
28
|
+
export {
|
|
29
|
+
namespaceProxyName,
|
|
30
|
+
parseMcpReference,
|
|
31
|
+
resolveMcpToolReferences,
|
|
32
|
+
type McpReferenceResolution,
|
|
33
|
+
type ParsedMcpReference,
|
|
34
|
+
} from "./mcp-references.ts";
|
|
26
35
|
export {
|
|
27
36
|
MCP_STATUS_EVENT,
|
|
28
37
|
MCP_STATUS_SNAPSHOT_VERSION,
|
|
@@ -37,14 +46,28 @@ export {
|
|
|
37
46
|
} from "./types.ts";
|
|
38
47
|
|
|
39
48
|
const INIT_WAIT_TIMEOUT_MS = 30_000;
|
|
49
|
+
const INIT_FAILURE_MESSAGE_MAX_CHARS = 1_000;
|
|
40
50
|
const INIT_WAIT_TIMED_OUT: unique symbol = Symbol("init-wait-timed-out");
|
|
41
51
|
|
|
42
52
|
export interface McpServerRegistration {
|
|
43
53
|
dispose(): Promise<void>;
|
|
44
54
|
}
|
|
45
55
|
|
|
46
|
-
|
|
47
|
-
|
|
56
|
+
export const MCP_RUNTIME_REGISTER_EVENT = "pi-mcp-adapter:runtime-register:v1" as const;
|
|
57
|
+
export const MCP_RUNTIME_REGISTER_VERSION = 1 as const;
|
|
58
|
+
|
|
59
|
+
export type McpRuntimeRegistrationResult =
|
|
60
|
+
| { ok: true; registration: McpServerRegistration }
|
|
61
|
+
| { ok: false; error: Error };
|
|
62
|
+
|
|
63
|
+
export interface McpRuntimeRegistrationRequest {
|
|
64
|
+
version: typeof MCP_RUNTIME_REGISTER_VERSION;
|
|
65
|
+
name: string;
|
|
66
|
+
definition: ServerEntry;
|
|
67
|
+
result?: McpRuntimeRegistrationResult;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Fast path for callers that share the adapter's module and ExtensionAPI.
|
|
48
71
|
const runtimeRegistrars = new WeakMap<ExtensionAPI, (name: string, definition: ServerEntry) => McpServerRegistration>();
|
|
49
72
|
|
|
50
73
|
async function awaitWithTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T | typeof INIT_WAIT_TIMED_OUT> {
|
|
@@ -74,6 +97,18 @@ function optionalNumber(options: { minimum?: number; description: string }): TSc
|
|
|
74
97
|
: ({ type: "number", ...options } as unknown as TSchema);
|
|
75
98
|
}
|
|
76
99
|
|
|
100
|
+
function parseEnvDirectToolOverride(raw: string | undefined): string[] | undefined {
|
|
101
|
+
return raw?.split(",").map(s => s.trim()).filter(Boolean);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function resolveNamespaceEnvOverride(
|
|
105
|
+
raw: string | undefined,
|
|
106
|
+
selectors: string[] | undefined,
|
|
107
|
+
): ReturnType<typeof parseDirectToolSelectors> | null {
|
|
108
|
+
if (raw === "__none__") return { servers: new Set<string>(), tools: new Map<string, Set<string>>() };
|
|
109
|
+
return selectors ? parseDirectToolSelectors(selectors) : null;
|
|
110
|
+
}
|
|
111
|
+
|
|
77
112
|
function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
78
113
|
const sessionConfig = options.config !== undefined ? cloneMcpConfig(options.config) : undefined;
|
|
79
114
|
const programmaticConfig = sessionConfig !== undefined;
|
|
@@ -82,6 +117,41 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
82
117
|
let currentOwner: McpRuntimeOwner | null = null;
|
|
83
118
|
let currentOAuthRuntime: McpOAuthRuntime | null = null;
|
|
84
119
|
let lifecycleGeneration = 0;
|
|
120
|
+
let retainedInitFailure: string | null = null;
|
|
121
|
+
|
|
122
|
+
function retainInitFailure(error: unknown): string {
|
|
123
|
+
const message = truncateAtWord(formatTerminalError(error), INIT_FAILURE_MESSAGE_MAX_CHARS);
|
|
124
|
+
retainedInitFailure = message;
|
|
125
|
+
return message;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function clearRetainedInitFailure(): void {
|
|
129
|
+
retainedInitFailure = null;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function buildInitRetryInstruction(prefix: string, failure: string | null = retainedInitFailure): string {
|
|
133
|
+
const retry = "Fix the MCP server configuration or startup failure, then call mcp(...) again to retry initialization.";
|
|
134
|
+
return failure ? `${prefix}: ${failure}. ${retry}` : `${prefix}. ${retry}`;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function isOwnerAbortError(error: unknown, owner: McpRuntimeOwner): boolean {
|
|
138
|
+
if (!owner.signal.aborted) return isAbortError(error);
|
|
139
|
+
const reason = owner.signal.reason;
|
|
140
|
+
if (reason instanceof Error && reason.message === "MCP initialization failed" && error !== reason) {
|
|
141
|
+
return isAbortError(error);
|
|
142
|
+
}
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function startGatewayRetryInitialization(ctx: ExtensionContext): void {
|
|
147
|
+
const generation = ++lifecycleGeneration;
|
|
148
|
+
const owner = createMcpRuntimeOwner();
|
|
149
|
+
const oauthRuntime = createOAuthRuntime(owner.signal);
|
|
150
|
+
currentOwner = owner;
|
|
151
|
+
currentOAuthRuntime = oauthRuntime;
|
|
152
|
+
state = null;
|
|
153
|
+
startInitialization(ctx, owner, oauthRuntime, generation, "stale_gateway_retry_initialization");
|
|
154
|
+
}
|
|
85
155
|
|
|
86
156
|
async function shutdownState(currentState: McpExtensionState | null, reason: string): Promise<void> {
|
|
87
157
|
if (!currentState) {
|
|
@@ -130,8 +200,10 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
130
200
|
: loadMcpConfig(earlyConfigPath);
|
|
131
201
|
const earlyCache = loadMetadataCache();
|
|
132
202
|
const envRaw = process.env.MCP_DIRECT_TOOLS;
|
|
133
|
-
const envDirectToolOverride = envRaw
|
|
203
|
+
const envDirectToolOverride = parseEnvDirectToolOverride(envRaw);
|
|
204
|
+
const namespaceEnvOverride = resolveNamespaceEnvOverride(envRaw, envDirectToolOverride);
|
|
134
205
|
const registeredDirectTools = new Map<string, string>();
|
|
206
|
+
const registeredNamespaceProxyTools = new Set<string>();
|
|
135
207
|
const fallbackDeactivatedTools = new Set<string>();
|
|
136
208
|
const toolRenderOptions = resolveMcpToolRenderOptions(earlyConfig.settings);
|
|
137
209
|
const toolRenderShell = toolRenderOptions.resultRendering === "compact" ? "self" : "default";
|
|
@@ -175,13 +247,16 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
175
247
|
});
|
|
176
248
|
}
|
|
177
249
|
|
|
178
|
-
function registerDirectTool(spec: DirectToolSpec): void {
|
|
250
|
+
function registerDirectTool(spec: DirectToolSpec, config: McpConfig): void {
|
|
179
251
|
(pi.registerTool as (tool: unknown) => unknown)({
|
|
180
252
|
name: spec.prefixedName,
|
|
181
253
|
label: `MCP: ${spec.originalName}`,
|
|
182
254
|
description: spec.description || "(no description)",
|
|
183
255
|
promptSnippet: truncateAtWord(spec.description, 100) || `MCP tool from ${spec.serverName}`,
|
|
184
256
|
parameters: toToolParameters(normalizeDirectToolInputSchema(spec.inputSchema)),
|
|
257
|
+
...(config.settings?.strictDirectToolArguments === true
|
|
258
|
+
? { prepareArguments: (args: unknown) => prepareDirectToolArguments(spec.inputSchema, args) }
|
|
259
|
+
: {}),
|
|
185
260
|
execute: createDirectToolExecutor(() => state, () => initPromise, spec),
|
|
186
261
|
renderShell: toolRenderShell,
|
|
187
262
|
renderCall: createMcpDirectToolCallRenderer(spec.prefixedName, toolRenderOptions),
|
|
@@ -189,10 +264,16 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
189
264
|
});
|
|
190
265
|
}
|
|
191
266
|
|
|
192
|
-
function
|
|
267
|
+
function activeFailureServers(): Set<string> {
|
|
268
|
+
const currentState = state;
|
|
269
|
+
if (!currentState) return new Set();
|
|
270
|
+
return new Set(Object.keys(currentState.config.mcpServers).filter((serverName) => isServerInActiveFailureBackoff(currentState, serverName)));
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
function resolveCurrentDirectTools(config: McpConfig, cache: MetadataCache | null, reservedNames?: Set<string>): DirectToolSpec[] {
|
|
193
274
|
if (envRaw === "__none__") return [];
|
|
194
275
|
const prefix = config.settings?.toolPrefix ?? "server";
|
|
195
|
-
return resolveDirectTools(config, cache, prefix, envDirectToolOverride);
|
|
276
|
+
return resolveDirectTools(config, cache, prefix, envDirectToolOverride, activeFailureServers(), reservedNames);
|
|
196
277
|
}
|
|
197
278
|
|
|
198
279
|
function getActiveToolsIfReady(): string[] | undefined {
|
|
@@ -226,11 +307,14 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
226
307
|
|
|
227
308
|
function syncDirectTools(config: McpConfig, cache: MetadataCache | null): {
|
|
228
309
|
specs: DirectToolSpec[];
|
|
310
|
+
reservedDirectNames: Set<string>;
|
|
311
|
+
activeDirectNames: Set<string>;
|
|
229
312
|
added: string[];
|
|
230
313
|
updated: string[];
|
|
231
314
|
deactivated: string[];
|
|
232
315
|
} {
|
|
233
|
-
const
|
|
316
|
+
const reservedDirectNames = new Set<string>();
|
|
317
|
+
const specs = resolveCurrentDirectTools(config, cache, reservedDirectNames);
|
|
234
318
|
const nextNames = new Set(specs.map((spec) => spec.prefixedName));
|
|
235
319
|
const added: string[] = [];
|
|
236
320
|
const updated: string[] = [];
|
|
@@ -240,7 +324,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
240
324
|
const fingerprint = directToolFingerprint(spec);
|
|
241
325
|
const previous = registeredDirectTools.get(spec.prefixedName);
|
|
242
326
|
if (previous !== fingerprint) {
|
|
243
|
-
registerDirectTool(spec);
|
|
327
|
+
registerDirectTool(spec, config);
|
|
244
328
|
registeredDirectTools.set(spec.prefixedName, fingerprint);
|
|
245
329
|
if (fallbackDeactivatedTools.delete(spec.prefixedName)) {
|
|
246
330
|
const activeTools = getActiveToolsIfReady();
|
|
@@ -259,7 +343,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
259
343
|
}
|
|
260
344
|
|
|
261
345
|
deactivateTools(deactivated);
|
|
262
|
-
return { specs, added, updated, deactivated };
|
|
346
|
+
return { specs, reservedDirectNames, activeDirectNames: nextNames, added, updated, deactivated };
|
|
263
347
|
}
|
|
264
348
|
|
|
265
349
|
function applyDirectToolConfigChanges(changes: Map<string, true | string[] | false>): void {
|
|
@@ -276,6 +360,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
276
360
|
const cache = loadMetadataCache();
|
|
277
361
|
const result = syncDirectTools(config, cache);
|
|
278
362
|
syncProxyTool(config, cache, result.specs);
|
|
363
|
+
syncNamespaceTools(config, cache, result.reservedDirectNames, result.activeDirectNames);
|
|
279
364
|
const changed = result.added.length + result.updated.length + result.deactivated.length;
|
|
280
365
|
if (changed > 0 && ctx?.hasUI) {
|
|
281
366
|
ctx.ui.notify(
|
|
@@ -285,6 +370,32 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
285
370
|
}
|
|
286
371
|
}
|
|
287
372
|
|
|
373
|
+
function syncNamespaceTools(
|
|
374
|
+
config: McpConfig,
|
|
375
|
+
cache: MetadataCache | null,
|
|
376
|
+
reservedDirectNames: Set<string> = new Set(registeredDirectTools.keys()),
|
|
377
|
+
activeDirectNames: Set<string> = new Set(registeredDirectTools.keys()),
|
|
378
|
+
): void {
|
|
379
|
+
const result = syncNamespaceProxyTools({
|
|
380
|
+
config,
|
|
381
|
+
cache,
|
|
382
|
+
envOverride: namespaceEnvOverride,
|
|
383
|
+
existingDirectNames: reservedDirectNames,
|
|
384
|
+
activeDirectNames,
|
|
385
|
+
existingNamespaceNames: registeredNamespaceProxyTools,
|
|
386
|
+
unavailableServers: activeFailureServers(),
|
|
387
|
+
pi,
|
|
388
|
+
getState: () => state,
|
|
389
|
+
getInitPromise: () => initPromise,
|
|
390
|
+
getPiTools: () => pi.getAllTools(),
|
|
391
|
+
renderOptions: toolRenderOptions,
|
|
392
|
+
renderShell: toolRenderShell,
|
|
393
|
+
renderResult: renderMcpToolResult,
|
|
394
|
+
});
|
|
395
|
+
for (const name of result.added) registeredNamespaceProxyTools.add(name);
|
|
396
|
+
for (const name of result.deactivated) registeredNamespaceProxyTools.delete(name);
|
|
397
|
+
}
|
|
398
|
+
|
|
288
399
|
const registeredPromptCommands = new Set<string>();
|
|
289
400
|
|
|
290
401
|
function registerPromptCommands(specs: Iterable<PromptMetadata>): void {
|
|
@@ -304,7 +415,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
304
415
|
|
|
305
416
|
registerPromptCommands(resolveCachedPrompts(earlyConfig));
|
|
306
417
|
|
|
307
|
-
|
|
418
|
+
const registerRuntimeServer = (name: string, definition: ServerEntry): McpServerRegistration => {
|
|
308
419
|
if (typeof name !== "string" || name.trim() === "") {
|
|
309
420
|
throw new Error("MCP server name must be a non-empty string");
|
|
310
421
|
}
|
|
@@ -341,6 +452,21 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
341
452
|
updateStatusBar(currentState);
|
|
342
453
|
},
|
|
343
454
|
};
|
|
455
|
+
};
|
|
456
|
+
runtimeRegistrars.set(pi, registerRuntimeServer);
|
|
457
|
+
pi.events.on(MCP_RUNTIME_REGISTER_EVENT, (rawRequest: unknown) => {
|
|
458
|
+
if (typeof rawRequest !== "object" || rawRequest === null || Array.isArray(rawRequest)) return;
|
|
459
|
+
const request = rawRequest as McpRuntimeRegistrationRequest;
|
|
460
|
+
if (request.result !== undefined) return;
|
|
461
|
+
if (request.version !== MCP_RUNTIME_REGISTER_VERSION) {
|
|
462
|
+
request.result = { ok: false, error: new Error(`Unsupported MCP runtime registration version: ${String(request.version)}`) };
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
try {
|
|
466
|
+
request.result = { ok: true, registration: registerRuntimeServer(request.name, request.definition) };
|
|
467
|
+
} catch (error) {
|
|
468
|
+
request.result = { ok: false, error: error instanceof Error ? error : new Error(String(error)) };
|
|
469
|
+
}
|
|
344
470
|
});
|
|
345
471
|
|
|
346
472
|
const getPiTools = (): ToolInfo[] => pi.getAllTools();
|
|
@@ -374,6 +500,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
374
500
|
}
|
|
375
501
|
|
|
376
502
|
state = nextState;
|
|
503
|
+
clearRetainedInitFailure();
|
|
377
504
|
for (const [name, definition] of runtimeServers) {
|
|
378
505
|
if (Object.hasOwn(nextState.config.mcpServers, name)) {
|
|
379
506
|
console.error(`MCP: runtime-registered server "${name}" now collides with a configured server; keeping the configured server`);
|
|
@@ -409,7 +536,8 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
409
536
|
if (initPromise !== promise && initPromise !== null) {
|
|
410
537
|
return;
|
|
411
538
|
}
|
|
412
|
-
|
|
539
|
+
const message = retainInitFailure(err);
|
|
540
|
+
console.error(`MCP initialization failed: ${message}`);
|
|
413
541
|
initPromise = null;
|
|
414
542
|
if (state) return;
|
|
415
543
|
|
|
@@ -459,6 +587,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
459
587
|
currentOAuthRuntime = oauthRuntime;
|
|
460
588
|
state = null;
|
|
461
589
|
initPromise = null;
|
|
590
|
+
clearRetainedInitFailure();
|
|
462
591
|
|
|
463
592
|
// Abort synchronously before awaiting cleanup so old callbacks and startup
|
|
464
593
|
// work cannot resume into a stale ExtensionContext.
|
|
@@ -520,6 +649,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
520
649
|
currentOAuthRuntime = null;
|
|
521
650
|
state = null;
|
|
522
651
|
initPromise = null;
|
|
652
|
+
clearRetainedInitFailure();
|
|
523
653
|
|
|
524
654
|
// Abort before awaiting cleanup so delayed initialization cannot touch stale
|
|
525
655
|
// Pi context after session shutdown.
|
|
@@ -786,6 +916,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
786
916
|
code: Type.String({ description: "Trusted JavaScript MCP script. Use tools.<prefixedToolName>(args) and emit(value)." }),
|
|
787
917
|
timeoutMs: optionalNumber({ minimum: 1, description: "Execution timeout in milliseconds (default: 30000)" }),
|
|
788
918
|
}),
|
|
919
|
+
renderCall: createMcpScriptToolCallRenderer(toolRenderOptions),
|
|
789
920
|
renderResult: renderMcpToolResult,
|
|
790
921
|
async execute(_toolCallId: string, params: { code: string; timeoutMs?: number }, signal: AbortSignal | undefined) {
|
|
791
922
|
const executeOwner = currentOwner;
|
|
@@ -801,7 +932,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
801
932
|
executeOwner?.throwIfInactive();
|
|
802
933
|
state = initialized;
|
|
803
934
|
} catch (error) {
|
|
804
|
-
if (executeOwner &&
|
|
935
|
+
if (executeOwner && isOwnerAbortError(error, executeOwner)) throw error;
|
|
805
936
|
const message = error instanceof Error ? error.message : String(error);
|
|
806
937
|
return {
|
|
807
938
|
content: [{ type: "text" as const, text: `MCP initialization failed: ${message}` }],
|
|
@@ -811,8 +942,10 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
811
942
|
}
|
|
812
943
|
if (!state) {
|
|
813
944
|
return {
|
|
814
|
-
content: [{ type: "text" as const, text:
|
|
815
|
-
|
|
945
|
+
content: [{ type: "text" as const, text: retainedInitFailure
|
|
946
|
+
? buildInitRetryInstruction("MCP is not initialized after an earlier initialization failure")
|
|
947
|
+
: "MCP not initialized" }],
|
|
948
|
+
details: { mode: "script", error: "not_initialized", ...(retainedInitFailure ? { message: retainedInitFailure } : {}) },
|
|
816
949
|
};
|
|
817
950
|
}
|
|
818
951
|
executeOwner?.throwIfInactive();
|
|
@@ -864,7 +997,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
864
997
|
server?: string;
|
|
865
998
|
action?: string;
|
|
866
999
|
}, signal: AbortSignal | undefined, _onUpdate: AgentToolUpdateCallback<Record<string, unknown>> | undefined, _ctx: ExtensionContext) {
|
|
867
|
-
|
|
1000
|
+
let executeOwner = currentOwner;
|
|
868
1001
|
const parseArgs = (value: string | Record<string, unknown> | undefined): Record<string, unknown> | undefined => {
|
|
869
1002
|
if (value === undefined || value === "") return undefined;
|
|
870
1003
|
let args: unknown;
|
|
@@ -887,30 +1020,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
887
1020
|
}
|
|
888
1021
|
return args as Record<string, unknown>;
|
|
889
1022
|
};
|
|
890
|
-
const
|
|
891
|
-
for (const key of ["tool", "connect", "describe", "instructions", "search", "server", "action"] as const) {
|
|
892
|
-
if (value[key] !== undefined && typeof value[key] !== "string") {
|
|
893
|
-
throw new Error(`Invalid nested gateway param \`${key}\`: expected string, got ${Array.isArray(value[key]) ? "array" : typeof value[key]}`);
|
|
894
|
-
}
|
|
895
|
-
}
|
|
896
|
-
for (const key of ["regex", "includeSchemas"] as const) {
|
|
897
|
-
if (value[key] !== undefined && typeof value[key] !== "boolean") {
|
|
898
|
-
throw new Error(`Invalid nested gateway param \`${key}\`: expected boolean, got ${Array.isArray(value[key]) ? "array" : typeof value[key]}`);
|
|
899
|
-
}
|
|
900
|
-
}
|
|
901
|
-
for (const key of ["limit", "offset"] as const) {
|
|
902
|
-
if (value[key] !== undefined && typeof value[key] !== "number") {
|
|
903
|
-
throw new Error(`Invalid nested gateway param \`${key}\`: expected number, got ${Array.isArray(value[key]) ? "array" : typeof value[key]}`);
|
|
904
|
-
}
|
|
905
|
-
}
|
|
906
|
-
const args = value.args;
|
|
907
|
-
if (args !== undefined && typeof args !== "string" && (typeof args !== "object" || args === null || Array.isArray(args))) {
|
|
908
|
-
throw new Error(`Invalid nested gateway param \`args\`: expected JSON object or JSON string, got ${Array.isArray(args) ? "array" : args === null ? "null" : typeof args}`);
|
|
909
|
-
}
|
|
910
|
-
return value as typeof params;
|
|
911
|
-
};
|
|
912
|
-
let parsedArgs = parseArgs(params.args);
|
|
913
|
-
let dispatchParams = params;
|
|
1023
|
+
const parsedArgs = parseArgs(params.args);
|
|
914
1024
|
const hasGatewayMode = (value: typeof params): boolean =>
|
|
915
1025
|
value.tool !== undefined
|
|
916
1026
|
|| value.connect !== undefined
|
|
@@ -919,18 +1029,15 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
919
1029
|
|| value.search !== undefined
|
|
920
1030
|
|| value.server !== undefined
|
|
921
1031
|
|| value.action !== undefined;
|
|
922
|
-
if (!hasGatewayMode(params) &&
|
|
923
|
-
const nestedParams = validateNestedGatewayParams(parsedArgs);
|
|
924
|
-
if (hasGatewayMode(nestedParams)) {
|
|
925
|
-
dispatchParams = nestedParams;
|
|
926
|
-
parsedArgs = parseArgs(nestedParams.args);
|
|
927
|
-
} else {
|
|
928
|
-
throw new Error("Gateway params were nested inside `args`; pass them top-level (for example, mcp({ search: \"...\" }) or mcp({ tool: \"...\", args: {} })).");
|
|
929
|
-
}
|
|
930
|
-
} else if (!hasGatewayMode(params) && params.args !== undefined) {
|
|
1032
|
+
if (!hasGatewayMode(params) && params.args !== undefined) {
|
|
931
1033
|
throw new Error("Gateway params were nested inside `args`; pass them top-level (for example, mcp({ search: \"...\" }) or mcp({ tool: \"...\", args: {} })).");
|
|
932
1034
|
}
|
|
933
1035
|
|
|
1036
|
+
if (!state && !initPromise && retainedInitFailure) {
|
|
1037
|
+
startGatewayRetryInitialization(_ctx);
|
|
1038
|
+
executeOwner = currentOwner;
|
|
1039
|
+
}
|
|
1040
|
+
|
|
934
1041
|
if (!state && initPromise) {
|
|
935
1042
|
try {
|
|
936
1043
|
const initialized = await awaitWithTimeout(initPromise, INIT_WAIT_TIMEOUT_MS);
|
|
@@ -943,38 +1050,40 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
943
1050
|
executeOwner?.throwIfInactive();
|
|
944
1051
|
state = initialized;
|
|
945
1052
|
} catch (error) {
|
|
946
|
-
if (executeOwner &&
|
|
947
|
-
const message =
|
|
1053
|
+
if (executeOwner && isOwnerAbortError(error, executeOwner)) throw error;
|
|
1054
|
+
const message = retainInitFailure(error);
|
|
948
1055
|
return {
|
|
949
|
-
content: [{ type: "text" as const, text:
|
|
1056
|
+
content: [{ type: "text" as const, text: buildInitRetryInstruction("MCP initialization failed", message) }],
|
|
950
1057
|
details: { error: "init_failed", message },
|
|
951
1058
|
};
|
|
952
1059
|
}
|
|
953
1060
|
}
|
|
954
1061
|
if (!state) {
|
|
955
1062
|
return {
|
|
956
|
-
content: [{ type: "text" as const, text:
|
|
957
|
-
|
|
1063
|
+
content: [{ type: "text" as const, text: retainedInitFailure
|
|
1064
|
+
? buildInitRetryInstruction("MCP is not initialized after an earlier initialization failure")
|
|
1065
|
+
: "MCP not initialized" }],
|
|
1066
|
+
details: { error: "not_initialized", ...(retainedInitFailure ? { message: retainedInitFailure } : {}) },
|
|
958
1067
|
};
|
|
959
1068
|
}
|
|
960
1069
|
executeOwner?.throwIfInactive();
|
|
961
1070
|
|
|
962
|
-
if (
|
|
1071
|
+
if (params.action === "ui-messages") {
|
|
963
1072
|
return executeUiMessages(state);
|
|
964
1073
|
}
|
|
965
|
-
if (
|
|
966
|
-
if (!
|
|
1074
|
+
if (params.action === "auth-start") {
|
|
1075
|
+
if (!params.server) {
|
|
967
1076
|
return {
|
|
968
1077
|
content: [{ type: "text" as const, text: "auth-start requires `server`. Example: mcp({ action: \"auth-start\", server: \"linear-server\" })" }],
|
|
969
1078
|
details: { mode: "auth-start", error: "missing_server" },
|
|
970
1079
|
};
|
|
971
1080
|
}
|
|
972
1081
|
return signal
|
|
973
|
-
? executeAuthStart(state,
|
|
974
|
-
: executeAuthStart(state,
|
|
1082
|
+
? executeAuthStart(state, params.server, signal)
|
|
1083
|
+
: executeAuthStart(state, params.server);
|
|
975
1084
|
}
|
|
976
|
-
if (
|
|
977
|
-
if (!
|
|
1085
|
+
if (params.action === "auth-complete") {
|
|
1086
|
+
if (!params.server) {
|
|
978
1087
|
return {
|
|
979
1088
|
content: [{ type: "text" as const, text: "auth-complete requires `server`." }],
|
|
980
1089
|
details: { mode: "auth-complete", error: "missing_server" },
|
|
@@ -988,28 +1097,28 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
988
1097
|
};
|
|
989
1098
|
}
|
|
990
1099
|
return signal
|
|
991
|
-
? executeAuthComplete(state,
|
|
992
|
-
: executeAuthComplete(state,
|
|
1100
|
+
? executeAuthComplete(state, params.server, input, signal)
|
|
1101
|
+
: executeAuthComplete(state, params.server, input);
|
|
993
1102
|
}
|
|
994
|
-
if (
|
|
995
|
-
return executeCall(state,
|
|
1103
|
+
if (params.tool) {
|
|
1104
|
+
return executeCall(state, params.tool, parsedArgs, params.server, getPiTools, signal);
|
|
996
1105
|
}
|
|
997
|
-
if (
|
|
998
|
-
const result = await executeConnect(state,
|
|
1106
|
+
if (params.connect) {
|
|
1107
|
+
const result = await executeConnect(state, params.connect, signal);
|
|
999
1108
|
syncToolSurface(_ctx as ExtensionContext);
|
|
1000
1109
|
return result;
|
|
1001
1110
|
}
|
|
1002
|
-
if (
|
|
1003
|
-
return executeDescribe(state,
|
|
1111
|
+
if (params.describe) {
|
|
1112
|
+
return executeDescribe(state, params.describe);
|
|
1004
1113
|
}
|
|
1005
|
-
if (
|
|
1006
|
-
return executeInstructions(state,
|
|
1114
|
+
if (params.instructions) {
|
|
1115
|
+
return executeInstructions(state, params.instructions);
|
|
1007
1116
|
}
|
|
1008
|
-
if (
|
|
1009
|
-
return executeSearch(state,
|
|
1117
|
+
if (params.search !== undefined) {
|
|
1118
|
+
return executeSearch(state, params.search, params.regex, params.server, params.includeSchemas, params.limit, params.offset);
|
|
1010
1119
|
}
|
|
1011
|
-
if (
|
|
1012
|
-
return executeList(state,
|
|
1120
|
+
if (params.server) {
|
|
1121
|
+
return executeList(state, params.server);
|
|
1013
1122
|
}
|
|
1014
1123
|
return executeStatus(state);
|
|
1015
1124
|
},
|
|
@@ -1030,7 +1139,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
1030
1139
|
|| missingConfiguredDirectToolServers.length > 0;
|
|
1031
1140
|
|
|
1032
1141
|
if (shouldRegisterProxyTool) {
|
|
1033
|
-
const description = buildProxyDescription(config
|
|
1142
|
+
const description = buildProxyDescription(config);
|
|
1034
1143
|
if (!proxyToolRegistered || proxyToolDescription !== description) {
|
|
1035
1144
|
registerProxyTool(description);
|
|
1036
1145
|
return;
|
|
@@ -1051,8 +1160,13 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
1051
1160
|
}
|
|
1052
1161
|
}
|
|
1053
1162
|
|
|
1054
|
-
const
|
|
1055
|
-
syncProxyTool(earlyConfig, earlyCache,
|
|
1163
|
+
const initialDirectResult = syncDirectTools(earlyConfig, earlyCache);
|
|
1164
|
+
syncProxyTool(earlyConfig, earlyCache, initialDirectResult.specs);
|
|
1165
|
+
// Register namespace-proxy tools eagerly so tool-groups/slow-mode can validate
|
|
1166
|
+
// `mcp:<server>` references on the first session_start turn. Without this
|
|
1167
|
+
// eager call, the tool-groups expansion runs before MCP initialization
|
|
1168
|
+
// completes and emits false `[unknown-tool] mcp__<server>` diagnostics.
|
|
1169
|
+
syncNamespaceTools(earlyConfig, earlyCache, initialDirectResult.reservedDirectNames, initialDirectResult.activeDirectNames);
|
|
1056
1170
|
startLoadTimeInitialization();
|
|
1057
1171
|
}
|
|
1058
1172
|
|
|
@@ -1076,10 +1190,18 @@ export function createMcpAdapter(options: McpAdapterOptions = {}) {
|
|
|
1076
1190
|
export function registerMcpServer(options: { pi: ExtensionAPI; name: string; definition: ServerEntry }): McpServerRegistration {
|
|
1077
1191
|
const { pi, name, definition } = options;
|
|
1078
1192
|
const register = runtimeRegistrars.get(pi);
|
|
1079
|
-
if (
|
|
1193
|
+
if (register) return register(name, definition);
|
|
1194
|
+
const request: McpRuntimeRegistrationRequest = {
|
|
1195
|
+
version: MCP_RUNTIME_REGISTER_VERSION,
|
|
1196
|
+
name,
|
|
1197
|
+
definition,
|
|
1198
|
+
};
|
|
1199
|
+
pi.events.emit(MCP_RUNTIME_REGISTER_EVENT, request);
|
|
1200
|
+
if (!request.result) {
|
|
1080
1201
|
throw new Error("pi-mcp-adapter is not installed for this Pi instance");
|
|
1081
1202
|
}
|
|
1082
|
-
|
|
1203
|
+
if (!request.result.ok) throw request.result.error;
|
|
1204
|
+
return request.result.registration;
|
|
1083
1205
|
}
|
|
1084
1206
|
|
|
1085
1207
|
export default createMcpAdapter();
|