@duckmind/dm-linux-x64 0.65.4 → 0.65.6
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 +0 -8
- package/dm +2 -2
- package/extensions/.dm-extensions.json +677 -44
- package/extensions/dm-lens/clients/actionable-warnings-logger.js +0 -6
- package/extensions/dm-lens/clients/actionable-warnings.js +42 -13
- package/extensions/dm-lens/clients/advisory-provenance.js +129 -41
- package/extensions/dm-lens/clients/agent-behavior-client.js +1 -0
- package/extensions/dm-lens/clients/analysed-root.js +0 -0
- package/extensions/dm-lens/clients/ast-grep-client.js +38 -3
- package/extensions/dm-lens/clients/ast-grep-rule-manager.js +37 -5
- package/extensions/dm-lens/clients/ast-grep-tool-logger.js +1 -7
- package/extensions/dm-lens/clients/bash-file-access.js +138 -1
- package/extensions/dm-lens/clients/biome-client.js +9 -2
- package/extensions/dm-lens/clients/blocker-freshness.js +171 -21
- package/extensions/dm-lens/clients/bootstrap.js +9 -5
- package/extensions/dm-lens/clients/bounded-pid-file-lock.js +1 -1
- package/extensions/dm-lens/clients/bounded-telemetry.js +1 -4
- package/extensions/dm-lens/clients/bundled-resource-health.js +43 -0
- package/extensions/dm-lens/clients/bus-events-logger.js +0 -6
- package/extensions/dm-lens/clients/cache/rule-cache.js +11 -3
- package/extensions/dm-lens/clients/cache-manager.js +29 -5
- package/extensions/dm-lens/clients/cache-observability.js +104 -4
- package/extensions/dm-lens/clients/cargo-manifest.js +6 -3
- package/extensions/dm-lens/clients/cascade-format.js +87 -5
- package/extensions/dm-lens/clients/cascade-logger.js +0 -6
- package/extensions/dm-lens/clients/child-unref.js +5 -9
- package/extensions/dm-lens/clients/code-quality-warnings.js +4 -2
- package/extensions/dm-lens/clients/complexity-client.js +5 -1
- package/extensions/dm-lens/clients/config-core/index.js +2 -68
- package/extensions/dm-lens/clients/config-core/process-spec.js +1 -1
- package/extensions/dm-lens/clients/config-core/provenance.js +1 -2
- package/extensions/dm-lens/clients/config-core/records.js +1 -1
- package/extensions/dm-lens/clients/config-core/schema.js +3 -6
- package/extensions/dm-lens/clients/config-diagnostic-codes.js +5 -3
- package/extensions/dm-lens/clients/config-locations.js +125 -5
- package/extensions/dm-lens/clients/config-resolve.js +12 -6
- package/extensions/dm-lens/clients/config-schema.js +56 -3
- package/extensions/dm-lens/clients/config-warn.js +3 -2
- package/extensions/dm-lens/clients/dead-code-client.js +4 -1
- package/extensions/dm-lens/clients/dead-code-logger.js +0 -3
- package/extensions/dm-lens/clients/degradation-ledger.js +29 -4
- package/extensions/dm-lens/clients/dependency-checker.js +29 -50
- package/extensions/dm-lens/clients/diagnostic-dispositions.js +23 -4
- package/extensions/dm-lens/clients/diagnostic-logger.js +1 -1
- package/extensions/dm-lens/clients/dispatch/ast-grep-catalog.js +19 -0
- package/extensions/dm-lens/clients/dispatch/auxiliary-lsp.js +9 -0
- package/extensions/dm-lens/clients/dispatch/collect-later-tier.js +0 -3
- package/extensions/dm-lens/clients/dispatch/dispatcher.js +30 -27
- package/extensions/dm-lens/clients/dispatch/facts/function-facts.js +1 -1
- package/extensions/dm-lens/clients/dispatch/facts/import-facts.js +4 -1
- package/extensions/dm-lens/clients/dispatch/finding-policy.js +163 -0
- package/extensions/dm-lens/clients/dispatch/indent-detect.js +213 -13
- package/extensions/dm-lens/clients/dispatch/inline-suppressions.js +20 -1
- package/extensions/dm-lens/clients/dispatch/integration.js +77 -13
- package/extensions/dm-lens/clients/dispatch/lazy.js +0 -3
- package/extensions/dm-lens/clients/dispatch/pending-runner-findings.js +1 -1
- package/extensions/dm-lens/clients/dispatch/plan.js +0 -3
- package/extensions/dm-lens/clients/dispatch/rule-ignores.js +21 -0
- package/extensions/dm-lens/clients/dispatch/rules/high-complexity.js +2 -2
- package/extensions/dm-lens/clients/dispatch/rules/high-fan-out.js +1 -1
- package/extensions/dm-lens/clients/dispatch/runners/actionlint.js +25 -29
- package/extensions/dm-lens/clients/dispatch/runners/ast-grep-napi.js +8 -32
- package/extensions/dm-lens/clients/dispatch/runners/biome-check.js +39 -23
- package/extensions/dm-lens/clients/dispatch/runners/cpp-check.js +29 -48
- package/extensions/dm-lens/clients/dispatch/runners/credo.js +17 -14
- package/extensions/dm-lens/clients/dispatch/runners/cue-vet.js +9 -7
- package/extensions/dm-lens/clients/dispatch/runners/dart-analyze.js +21 -43
- package/extensions/dm-lens/clients/dispatch/runners/detekt.js +11 -5
- package/extensions/dm-lens/clients/dispatch/runners/dotnet-build.js +27 -23
- package/extensions/dm-lens/clients/dispatch/runners/elixir-check.js +23 -38
- package/extensions/dm-lens/clients/dispatch/runners/eslint.js +22 -35
- package/extensions/dm-lens/clients/dispatch/runners/fish-indent.js +2 -1
- package/extensions/dm-lens/clients/dispatch/runners/gleam-check.js +35 -12
- package/extensions/dm-lens/clients/dispatch/runners/go-vet.js +5 -3
- package/extensions/dm-lens/clients/dispatch/runners/golangci-lint.js +21 -22
- package/extensions/dm-lens/clients/dispatch/runners/hadolint.js +26 -16
- package/extensions/dm-lens/clients/dispatch/runners/helm-lint.js +3 -1
- package/extensions/dm-lens/clients/dispatch/runners/helm-render.js +3 -2
- package/extensions/dm-lens/clients/dispatch/runners/htmlhint.js +18 -9
- package/extensions/dm-lens/clients/dispatch/runners/javac.js +24 -23
- package/extensions/dm-lens/clients/dispatch/runners/ktlint.js +23 -54
- package/extensions/dm-lens/clients/dispatch/runners/lsp.js +17 -7
- package/extensions/dm-lens/clients/dispatch/runners/markdownlint.js +12 -6
- package/extensions/dm-lens/clients/dispatch/runners/mypy.js +2 -1
- package/extensions/dm-lens/clients/dispatch/runners/oxlint.js +24 -7
- package/extensions/dm-lens/clients/dispatch/runners/php-lint.js +26 -17
- package/extensions/dm-lens/clients/dispatch/runners/phpstan.js +2 -1
- package/extensions/dm-lens/clients/dispatch/runners/prisma-validate.js +2 -1
- package/extensions/dm-lens/clients/dispatch/runners/psscriptanalyzer.js +10 -11
- package/extensions/dm-lens/clients/dispatch/runners/pyright.js +2 -1
- package/extensions/dm-lens/clients/dispatch/runners/rubocop.js +22 -18
- package/extensions/dm-lens/clients/dispatch/runners/ruff.js +17 -22
- package/extensions/dm-lens/clients/dispatch/runners/rust-clippy.js +8 -11
- package/extensions/dm-lens/clients/dispatch/runners/shellcheck.js +9 -4
- package/extensions/dm-lens/clients/dispatch/runners/shfmt.js +4 -13
- package/extensions/dm-lens/clients/dispatch/runners/spellcheck.js +15 -5
- package/extensions/dm-lens/clients/dispatch/runners/spotbugs.js +2 -1
- package/extensions/dm-lens/clients/dispatch/runners/sqlfluff.js +10 -4
- package/extensions/dm-lens/clients/dispatch/runners/stylelint.js +9 -4
- package/extensions/dm-lens/clients/dispatch/runners/swiftlint.js +11 -3
- package/extensions/dm-lens/clients/dispatch/runners/taplo.js +13 -7
- package/extensions/dm-lens/clients/dispatch/runners/terragrunt.js +2 -1
- package/extensions/dm-lens/clients/dispatch/runners/tflint.js +26 -16
- package/extensions/dm-lens/clients/dispatch/runners/tree-sitter.js +12 -13
- package/extensions/dm-lens/clients/dispatch/runners/trivy-config.js +9 -3
- package/extensions/dm-lens/clients/dispatch/runners/utils/availability-policy.js +5 -0
- package/extensions/dm-lens/clients/dispatch/runners/utils/candidate-probe.js +2 -2
- package/extensions/dm-lens/clients/dispatch/runners/utils/diagnostic-parsers.js +8 -52
- package/extensions/dm-lens/clients/dispatch/runners/utils/runner-helpers.js +35 -3
- package/extensions/dm-lens/clients/dispatch/runners/utils.js +0 -17
- package/extensions/dm-lens/clients/dispatch/runners/vale.js +12 -4
- package/extensions/dm-lens/clients/dispatch/runners/yaml-rule-parser.js +2 -20
- package/extensions/dm-lens/clients/dispatch/runners/yamllint.js +16 -4
- package/extensions/dm-lens/clients/dispatch/runners/zig-check.js +26 -38
- package/extensions/dm-lens/clients/dispatch/suppress-writer.js +13 -3
- package/extensions/dm-lens/clients/dispatch/types.js +4 -1
- package/extensions/dm-lens/clients/dispatch/utils/format-utils.js +2 -2
- package/extensions/dm-lens/clients/disposition-logger.js +0 -6
- package/extensions/dm-lens/clients/disposition-publish.js +2 -1
- package/extensions/dm-lens/clients/effective-config.js +14 -4
- package/extensions/dm-lens/clients/event-loop-hold.js +123 -0
- package/extensions/dm-lens/clients/event-loop-monitor.js +2 -2
- package/extensions/dm-lens/clients/extension-log.js +6 -1
- package/extensions/dm-lens/clients/feature-hints.js +2 -1
- package/extensions/dm-lens/clients/file-kinds.js +17 -21
- package/extensions/dm-lens/clients/file-role.js +11 -2
- package/extensions/dm-lens/clients/file-time.js +1 -1
- package/extensions/dm-lens/clients/file-utils.js +93 -6
- package/extensions/dm-lens/clients/finding-delivery-gate.js +22 -26
- package/extensions/dm-lens/clients/format-service.js +33 -16
- package/extensions/dm-lens/clients/formatters.js +129 -92
- package/extensions/dm-lens/clients/generated-artifacts.js +2 -2
- package/extensions/dm-lens/clients/generation-guard.js +4 -0
- package/extensions/dm-lens/clients/git-guard.js +80 -26
- package/extensions/dm-lens/clients/gitleaks-client.js +26 -0
- package/extensions/dm-lens/clients/govulncheck-client.js +34 -6
- package/extensions/dm-lens/clients/gradle-ktfmt-style.js +96 -13
- package/extensions/dm-lens/clients/grammar-source.js +3 -3
- package/extensions/dm-lens/clients/host-edit-normalize.js +1 -1
- package/extensions/dm-lens/clients/indent-retarget.js +35 -5
- package/extensions/dm-lens/clients/inline-blocker-dispositions.js +107 -0
- package/extensions/dm-lens/clients/install-diagnostics.js +8 -6
- package/extensions/dm-lens/clients/installer/index.js +695 -183
- package/extensions/dm-lens/clients/installer/managed-tool-refresh.js +85 -25
- package/extensions/dm-lens/clients/instance-reaper-state.js +3 -0
- package/extensions/dm-lens/clients/instance-reaper.js +23 -16
- package/extensions/dm-lens/clients/instance-registry.js +34 -2
- package/extensions/dm-lens/clients/jscpd-client.js +11 -1
- package/extensions/dm-lens/clients/knip-client.js +2 -1
- package/extensions/dm-lens/clients/language-profile.js +18 -12
- package/extensions/dm-lens/clients/language-registry.js +3 -1
- package/extensions/dm-lens/clients/latency-logger.js +14 -4
- package/extensions/dm-lens/clients/ledger-bounds.js +13 -1
- package/extensions/dm-lens/clients/lens-config.js +74 -7
- package/extensions/dm-lens/clients/lens-engine.js +9 -10
- package/extensions/dm-lens/clients/lens-events.js +1 -1
- package/extensions/dm-lens/clients/lens-flag-registry.js +47 -2
- package/extensions/dm-lens/clients/lens-map.js +1 -1
- package/extensions/dm-lens/clients/log-cleanup.js +0 -28
- package/extensions/dm-lens/clients/lsp/cascade-tier.js +2 -1
- package/extensions/dm-lens/clients/lsp/client.js +70 -30
- package/extensions/dm-lens/clients/lsp/config.js +41 -15
- package/extensions/dm-lens/clients/lsp/content-limits.js +21 -0
- package/extensions/dm-lens/clients/lsp/diagnostic-binding.js +8 -0
- package/extensions/dm-lens/clients/lsp/document-drift.js +72 -1
- package/extensions/dm-lens/clients/lsp/edits.js +3 -3
- package/extensions/dm-lens/clients/lsp/index.js +435 -62
- package/extensions/dm-lens/clients/lsp/inferred-project.js +1 -1
- package/extensions/dm-lens/clients/lsp/language.js +0 -3
- package/extensions/dm-lens/clients/lsp/launch.js +12 -5
- package/extensions/dm-lens/clients/lsp/path-utils.js +0 -2
- package/extensions/dm-lens/clients/lsp/pending-aux-coverage.js +0 -1
- package/extensions/dm-lens/clients/lsp/server.js +125 -60
- package/extensions/dm-lens/clients/lsp/session-roots.js +26 -5
- package/extensions/dm-lens/clients/lsp/sync-kind.js +14 -1
- package/extensions/dm-lens/clients/lsp/tsserver-sync.js +5 -7
- package/extensions/dm-lens/clients/lsp/wait-policy/classification.js +3 -0
- package/extensions/dm-lens/clients/lsp/wait-policy/strategies.js +31 -2
- package/extensions/dm-lens/clients/lsp/workspace-diagnostics-cache.js +26 -4
- package/extensions/dm-lens/clients/lsp-document-symbols.js +1 -1
- package/extensions/dm-lens/clients/map-with-concurrency.js +7 -3
- package/extensions/dm-lens/clients/mcp/analyze.js +1 -1
- package/extensions/dm-lens/clients/mcp/ipc.js +104 -40
- package/extensions/dm-lens/clients/mcp/review.js +39 -7
- package/extensions/dm-lens/clients/mcp/session.js +38 -4
- package/extensions/dm-lens/clients/metrics-history.js +19 -84
- package/extensions/dm-lens/clients/middle-man-analysis.js +2 -4
- package/extensions/dm-lens/clients/module-report.js +1 -1
- package/extensions/dm-lens/clients/mutating-tool.js +3 -3
- package/extensions/dm-lens/clients/mutation-attribution.js +3 -3
- package/extensions/dm-lens/clients/ndjson-logger.js +17 -9
- package/extensions/dm-lens/clients/observed-mutation.js +42 -11
- package/extensions/dm-lens/clients/opaque-mutation-scan.js +17 -7
- package/extensions/dm-lens/clients/opengrep-client.js +92 -10
- package/extensions/dm-lens/clients/opengrep-config.js +1 -1
- package/extensions/dm-lens/clients/package-manager.js +2 -1
- package/extensions/dm-lens/clients/path-utils.js +199 -3
- package/extensions/dm-lens/clients/performance-report.js +3 -3
- package/extensions/dm-lens/clients/persistent-reverify.js +167 -0
- package/extensions/dm-lens/clients/php-cs-fixer-config.js +9 -4
- package/extensions/dm-lens/clients/pipeline.js +124 -68
- package/extensions/dm-lens/clients/project-changes.js +1 -1
- package/extensions/dm-lens/clients/project-diagnostics/cache.js +19 -5
- package/extensions/dm-lens/clients/project-diagnostics/extractors.js +1 -1
- package/extensions/dm-lens/clients/project-diagnostics/fresh-fetch.js +150 -18
- package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/dead-code.js +4 -1
- package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/gitleaks.js +3 -3
- package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/jscpd.js +1 -1
- package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/knip.js +1 -1
- package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/madge.js +1 -1
- package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/opengrep.js +1 -1
- package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/runner-findings.js +19 -2
- package/extensions/dm-lens/clients/project-diagnostics/scanner.js +35 -4
- package/extensions/dm-lens/clients/project-lens-config.js +58 -4
- package/extensions/dm-lens/clients/project-scan-policy.js +0 -46
- package/extensions/dm-lens/clients/python-environment.js +80 -4
- package/extensions/dm-lens/clients/python-provenance.js +551 -0
- package/extensions/dm-lens/clients/read-guard-logger.js +3 -1
- package/extensions/dm-lens/clients/read-guard.js +29 -6
- package/extensions/dm-lens/clients/recent-touches.js +2 -2
- package/extensions/dm-lens/clients/resource-sampler.js +59 -9
- package/extensions/dm-lens/clients/review-graph/builder.js +39 -34
- package/extensions/dm-lens/clients/review-graph/git-identity.js +11 -7
- package/extensions/dm-lens/clients/review-graph/import-resolvers.js +1 -1
- package/extensions/dm-lens/clients/review-graph-logger.js +3 -1
- package/extensions/dm-lens/clients/ruff-client.js +11 -10
- package/extensions/dm-lens/clients/runtime-agent-end.js +41 -5
- package/extensions/dm-lens/clients/runtime-context.js +5 -2
- package/extensions/dm-lens/clients/runtime-coordinator.js +60 -6
- package/extensions/dm-lens/clients/runtime-session.js +52 -8
- package/extensions/dm-lens/clients/runtime-tool-call.js +27 -15
- package/extensions/dm-lens/clients/runtime-tool-result.js +279 -63
- package/extensions/dm-lens/clients/runtime-turn.js +453 -185
- package/extensions/dm-lens/clients/safe-spawn.js +248 -62
- package/extensions/dm-lens/clients/sanitize.js +0 -4
- package/extensions/dm-lens/clients/scan-utils.js +1 -39
- package/extensions/dm-lens/clients/scratch-tree-policy.js +2 -3
- package/extensions/dm-lens/clients/security-scan-client.js +2 -2
- package/extensions/dm-lens/clients/session-event-guard.js +59 -2
- package/extensions/dm-lens/clients/session-summary.js +0 -25
- package/extensions/dm-lens/clients/sg-runner.js +24 -12
- package/extensions/dm-lens/clients/sgconfig.js +58 -6
- package/extensions/dm-lens/clients/shared-checkout-guard.js +1 -1
- package/extensions/dm-lens/clients/situational-tool-telemetry.js +85 -0
- package/extensions/dm-lens/clients/skills-resolver.js +42 -0
- package/extensions/dm-lens/clients/smells-rollup.js +2 -2
- package/extensions/dm-lens/clients/spawn-output-cap.js +29 -0
- package/extensions/dm-lens/clients/startup-scan.js +1 -2
- package/extensions/dm-lens/clients/string-utils.js +3 -0
- package/extensions/dm-lens/clients/test-runner-client.js +118 -57
- package/extensions/dm-lens/clients/test-runner-delivery.js +118 -66
- package/extensions/dm-lens/clients/tool-agreement.js +403 -0
- package/extensions/dm-lens/clients/tool-config.js +218 -0
- package/extensions/dm-lens/clients/tool-cwd.js +248 -0
- package/extensions/dm-lens/clients/tool-definition.js +18 -1
- package/extensions/dm-lens/clients/tool-policy.js +138 -10
- package/extensions/dm-lens/clients/tool-probe.js +5 -0
- package/extensions/dm-lens/clients/tool-set-policy.js +35 -0
- package/extensions/dm-lens/clients/tree-sitter-client.js +201 -80
- package/extensions/dm-lens/clients/tree-sitter-query-loader.js +78 -130
- package/extensions/dm-lens/clients/trivy-client.js +8 -1
- package/extensions/dm-lens/clients/tui-fit.js +0 -3
- package/extensions/dm-lens/clients/turn-context.js +48 -0
- package/extensions/dm-lens/clients/turn-end/lane.js +0 -0
- package/extensions/dm-lens/clients/turn-end/lanes/govulncheck.js +54 -0
- package/extensions/dm-lens/clients/turn-end/lanes/secrets.js +140 -0
- package/extensions/dm-lens/clients/user-notify.js +0 -3
- package/extensions/dm-lens/clients/warm-attach.js +25 -0
- package/extensions/dm-lens/clients/widget-state.js +203 -13
- package/extensions/dm-lens/clients/word-index-logger.js +0 -6
- package/extensions/dm-lens/clients/word-index-store.js +1 -4
- package/extensions/dm-lens/clients/word-index.js +9 -5
- package/extensions/dm-lens/clients/workspace-topology.js +20 -3
- package/extensions/dm-lens/clients/write-ordering-guard.js +6 -0
- package/extensions/dm-lens/clients/zizmor-config.js +15 -11
- package/extensions/dm-lens/config/dependency-cruiser-eager-allowlist.json +8 -2
- package/extensions/dm-lens/dist/clients/actionable-warnings-logger.js +24 -0
- package/extensions/dm-lens/dist/clients/actionable-warnings.js +1014 -0
- package/extensions/dm-lens/dist/clients/advisory-provenance.js +385 -0
- package/extensions/dm-lens/dist/clients/agent-behavior-client.js +94 -0
- package/extensions/dm-lens/dist/clients/agent-nudge.js +151 -0
- package/extensions/dm-lens/dist/clients/analysed-root.js +1 -0
- package/extensions/dm-lens/dist/clients/ast-grep-client.js +576 -0
- package/extensions/dm-lens/dist/clients/ast-grep-rule-manager.js +114 -0
- package/extensions/dm-lens/dist/clients/ast-grep-tool-logger.js +85 -0
- package/extensions/dm-lens/dist/clients/ast-grep-types.js +1 -0
- package/extensions/dm-lens/dist/clients/ast-grep-yaml-synth.js +109 -0
- package/extensions/dm-lens/dist/clients/atomic-write-staging.js +66 -0
- package/extensions/dm-lens/dist/clients/atomic-write.js +37 -0
- package/extensions/dm-lens/dist/clients/availability-probe-flight.js +11 -0
- package/extensions/dm-lens/dist/clients/bash-file-access.js +830 -0
- package/extensions/dm-lens/dist/clients/biome-client.js +221 -0
- package/extensions/dm-lens/dist/clients/blocker-freshness.js +385 -0
- package/extensions/dm-lens/dist/clients/blocker-past-eof.js +49 -0
- package/extensions/dm-lens/dist/clients/bootstrap.js +246 -0
- package/extensions/dm-lens/dist/clients/bounded-cache.js +105 -0
- package/extensions/dm-lens/dist/clients/bounded-pid-file-lock.js +173 -0
- package/extensions/dm-lens/dist/clients/bounded-telemetry.js +104 -0
- package/extensions/dm-lens/dist/clients/build-identity.js +45 -0
- package/extensions/dm-lens/dist/clients/bundled-resource-health.js +41 -0
- package/extensions/dm-lens/dist/clients/bus-events-logger.js +48 -0
- package/extensions/dm-lens/dist/clients/bus-publish.js +117 -0
- package/extensions/dm-lens/dist/clients/cache/rule-cache.js +103 -0
- package/extensions/dm-lens/dist/clients/cache-manager.js +340 -0
- package/extensions/dm-lens/dist/clients/cache-observability.js +847 -0
- package/extensions/dm-lens/dist/clients/call-graph.js +628 -0
- package/extensions/dm-lens/dist/clients/cargo-manifest.js +151 -0
- package/extensions/dm-lens/dist/clients/cascade-budget.js +52 -0
- package/extensions/dm-lens/dist/clients/cascade-format.js +160 -0
- package/extensions/dm-lens/dist/clients/cascade-logger.js +22 -0
- package/extensions/dm-lens/dist/clients/cascade-types.js +1 -0
- package/extensions/dm-lens/dist/clients/child-unref.js +59 -0
- package/extensions/dm-lens/dist/clients/code-quality-warnings.js +192 -0
- package/extensions/dm-lens/dist/clients/codebase-model.js +110 -0
- package/extensions/dm-lens/dist/clients/collateral-test-role.js +8 -0
- package/extensions/dm-lens/dist/clients/complexity-client.js +398 -0
- package/extensions/dm-lens/dist/clients/config-core/deny.js +117 -0
- package/extensions/dm-lens/dist/clients/config-core/index.js +2 -0
- package/extensions/dm-lens/dist/clients/config-core/merge.js +228 -0
- package/extensions/dm-lens/dist/clients/config-core/normalize.js +217 -0
- package/extensions/dm-lens/dist/clients/config-core/process-spec.js +147 -0
- package/extensions/dm-lens/dist/clients/config-core/provenance.js +54 -0
- package/extensions/dm-lens/dist/clients/config-core/records.js +79 -0
- package/extensions/dm-lens/dist/clients/config-core/resolve.js +48 -0
- package/extensions/dm-lens/dist/clients/config-core/safe-object.js +22 -0
- package/extensions/dm-lens/dist/clients/config-core/schema.js +90 -0
- package/extensions/dm-lens/dist/clients/config-diagnostic-codes.js +90 -0
- package/extensions/dm-lens/dist/clients/config-locations.js +175 -0
- package/extensions/dm-lens/dist/clients/config-resolve.js +359 -0
- package/extensions/dm-lens/dist/clients/config-schema.js +128 -0
- package/extensions/dm-lens/dist/clients/config-warn.js +146 -0
- package/extensions/dm-lens/dist/clients/console-guard-install.js +4 -0
- package/extensions/dm-lens/dist/clients/cooperative-budget.js +36 -0
- package/extensions/dm-lens/dist/clients/dead-code-client.js +342 -0
- package/extensions/dm-lens/dist/clients/dead-code-logger.js +18 -0
- package/extensions/dm-lens/dist/clients/deadline-utils.js +117 -0
- package/extensions/dm-lens/dist/clients/debug-handles.js +121 -0
- package/extensions/dm-lens/dist/clients/debug-heap.js +80 -0
- package/extensions/dm-lens/dist/clients/deferred-lsp-work.js +33 -0
- package/extensions/dm-lens/dist/clients/degradation-ledger.js +272 -0
- package/extensions/dm-lens/dist/clients/demoted-finding-render.js +61 -0
- package/extensions/dm-lens/dist/clients/dependency-checker.js +525 -0
- package/extensions/dm-lens/dist/clients/deps/ast-grep-napi.js +17 -0
- package/extensions/dm-lens/dist/clients/deps/dm-host-deps.js +10 -0
- package/extensions/dm-lens/dist/clients/deps/dm-tui-compat.js +58 -0
- package/extensions/dm-lens/dist/clients/deps/js-yaml.js +7 -0
- package/extensions/dm-lens/dist/clients/deps/minimatch.js +6 -0
- package/extensions/dm-lens/dist/clients/deps/pidusage.js +5 -0
- package/extensions/dm-lens/dist/clients/deps/typebox.js +5 -0
- package/extensions/dm-lens/dist/clients/deps/vscode-jsonrpc.js +8 -0
- package/extensions/dm-lens/dist/clients/deps/web-tree-sitter.js +11 -0
- package/extensions/dm-lens/dist/clients/diagnostic-dispositions.js +318 -0
- package/extensions/dm-lens/dist/clients/diagnostic-line-freshness.js +144 -0
- package/extensions/dm-lens/dist/clients/diagnostic-logger.js +60 -0
- package/extensions/dm-lens/dist/clients/diagnostic-tracker.js +89 -0
- package/extensions/dm-lens/dist/clients/diagnostics-publish.js +134 -0
- package/extensions/dm-lens/dist/clients/dispatch/ast-grep-catalog.js +16 -0
- package/extensions/dm-lens/dist/clients/dispatch/auxiliary-lsp.js +158 -0
- package/extensions/dm-lens/dist/clients/dispatch/collect-later-tier.js +25 -0
- package/extensions/dm-lens/dist/clients/dispatch/diagnostic-taxonomy.js +58 -0
- package/extensions/dm-lens/dist/clients/dispatch/dispatcher.js +953 -0
- package/extensions/dm-lens/dist/clients/dispatch/fact-provider-types.js +1 -0
- package/extensions/dm-lens/dist/clients/dispatch/fact-rule-runner.js +17 -0
- package/extensions/dm-lens/dist/clients/dispatch/fact-runner.js +18 -0
- package/extensions/dm-lens/dist/clients/dispatch/fact-scheduler.js +52 -0
- package/extensions/dm-lens/dist/clients/dispatch/fact-store.js +199 -0
- package/extensions/dm-lens/dist/clients/dispatch/facts/comment-facts.js +20 -0
- package/extensions/dm-lens/dist/clients/dispatch/facts/file-content.js +18 -0
- package/extensions/dm-lens/dist/clients/dispatch/facts/function-facts.js +281 -0
- package/extensions/dm-lens/dist/clients/dispatch/facts/import-facts.js +169 -0
- package/extensions/dm-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +19 -0
- package/extensions/dm-lens/dist/clients/dispatch/facts/try-catch-facts.js +95 -0
- package/extensions/dm-lens/dist/clients/dispatch/finding-policy.js +159 -0
- package/extensions/dm-lens/dist/clients/dispatch/indent-detect.js +227 -0
- package/extensions/dm-lens/dist/clients/dispatch/inline-suppressions.js +52 -0
- package/extensions/dm-lens/dist/clients/dispatch/integration.js +1463 -0
- package/extensions/dm-lens/dist/clients/dispatch/lazy.js +8 -0
- package/extensions/dm-lens/dist/clients/dispatch/pending-runner-findings.js +75 -0
- package/extensions/dm-lens/dist/clients/dispatch/plan.js +278 -0
- package/extensions/dm-lens/dist/clients/dispatch/priorities.js +14 -0
- package/extensions/dm-lens/dist/clients/dispatch/rule-id-normalize.js +42 -0
- package/extensions/dm-lens/dist/clients/dispatch/rule-ignores.js +21 -0
- package/extensions/dm-lens/dist/clients/dispatch/rule-policy.js +73 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/async-noise.js +31 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +27 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/cors-wildcard.js +35 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/error-obscuring.js +29 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/error-swallowing.js +29 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/framework-call-noise.js +31 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/high-complexity.js +56 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/high-fan-out.js +45 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/high-import-coupling.js +31 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/missing-error-propagation.js +45 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/no-commented-credentials.js +46 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +38 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/placeholder-comments.js +40 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/unsafe-boundary.js +101 -0
- package/extensions/dm-lens/dist/clients/dispatch/runner-context.js +46 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/actionlint.js +98 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/ast-grep-napi.js +690 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/biome-check.js +202 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/cpp-check.js +190 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/credo.js +66 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/cue-vet.js +167 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/dart-analyze.js +151 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/detekt.js +157 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/dotnet-build.js +157 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/elixir-check.js +153 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/eslint.js +99 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/fact-rules.js +20 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/fish-indent.js +65 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/gleam-check.js +107 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/go-vet.js +51 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/golangci-lint.js +89 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/hadolint.js +83 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/helm-lint.js +144 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/helm-render.js +593 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/htmlhint.js +103 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/index.js +100 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/javac.js +82 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/ktlint.js +93 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/lsp.js +206 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/markdownlint.js +129 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/mypy.js +70 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/oxlint.js +305 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/php-lint.js +70 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/phpstan.js +90 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/prisma-validate.js +56 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +307 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/pyright.js +118 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/rubocop.js +79 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/ruff.js +69 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/rust-clippy.js +147 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/shellcheck.js +111 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/shfmt.js +81 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/spellcheck.js +74 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/spotbugs.js +208 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/sqlfluff.js +136 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/stylelint.js +118 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/swiftlint.js +143 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/taplo.js +97 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/terragrunt.js +110 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/tflint.js +104 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/tree-sitter.js +516 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/trivy-config.js +155 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/utils/availability-policy.js +285 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +61 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +61 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +130 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +1067 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +40 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/utils/tool-failure.js +117 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +88 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/utils.js +8 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/vale.js +106 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +163 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/yamllint.js +83 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/zig-check.js +72 -0
- package/extensions/dm-lens/dist/clients/dispatch/suppress-writer.js +57 -0
- package/extensions/dm-lens/dist/clients/dispatch/tool-profile.js +30 -0
- package/extensions/dm-lens/dist/clients/dispatch/types.js +7 -0
- package/extensions/dm-lens/dist/clients/dispatch/utils/format-utils.js +45 -0
- package/extensions/dm-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +31 -0
- package/extensions/dm-lens/dist/clients/disposition-logger.js +19 -0
- package/extensions/dm-lens/dist/clients/disposition-publish.js +88 -0
- package/extensions/dm-lens/dist/clients/durable-store.js +77 -0
- package/extensions/dm-lens/dist/clients/effective-config.js +160 -0
- package/extensions/dm-lens/dist/clients/env-utils.js +26 -0
- package/extensions/dm-lens/dist/clients/error-class.js +3 -0
- package/extensions/dm-lens/dist/clients/eval-timestamp.js +2 -0
- package/extensions/dm-lens/dist/clients/event-loop-hold.js +119 -0
- package/extensions/dm-lens/dist/clients/event-loop-monitor.js +84 -0
- package/extensions/dm-lens/dist/clients/extension-log.js +230 -0
- package/extensions/dm-lens/dist/clients/extension-mode.js +20 -0
- package/extensions/dm-lens/dist/clients/feature-hints.js +88 -0
- package/extensions/dm-lens/dist/clients/file-kinds.js +304 -0
- package/extensions/dm-lens/dist/clients/file-role.js +50 -0
- package/extensions/dm-lens/dist/clients/file-time.js +112 -0
- package/extensions/dm-lens/dist/clients/file-utils.js +630 -0
- package/extensions/dm-lens/dist/clients/finding-delivery-gate.js +129 -0
- package/extensions/dm-lens/dist/clients/finding-identity.js +23 -0
- package/extensions/dm-lens/dist/clients/fix-worklog.js +75 -0
- package/extensions/dm-lens/dist/clients/format-events-publish.js +230 -0
- package/extensions/dm-lens/dist/clients/format-service.js +154 -0
- package/extensions/dm-lens/dist/clients/formatters-lazy.js +8 -0
- package/extensions/dm-lens/dist/clients/formatters.js +1351 -0
- package/extensions/dm-lens/dist/clients/freshness-cadence.js +1 -0
- package/extensions/dm-lens/dist/clients/freshness.js +8 -0
- package/extensions/dm-lens/dist/clients/generated-artifacts.js +209 -0
- package/extensions/dm-lens/dist/clients/generation-guard.js +105 -0
- package/extensions/dm-lens/dist/clients/git-guard.js +770 -0
- package/extensions/dm-lens/dist/clients/git-tracked-ignore.js +120 -0
- package/extensions/dm-lens/dist/clients/gitleaks-client.js +282 -0
- package/extensions/dm-lens/dist/clients/go-client.js +47 -0
- package/extensions/dm-lens/dist/clients/govulncheck-client.js +411 -0
- package/extensions/dm-lens/dist/clients/gradle-ktfmt-style.js +177 -0
- package/extensions/dm-lens/dist/clients/grammar-source.js +224 -0
- package/extensions/dm-lens/dist/clients/gzip-stage-write.js +85 -0
- package/extensions/dm-lens/dist/clients/hashline-anchor.js +222 -0
- package/extensions/dm-lens/dist/clients/hook-budgets.js +16 -0
- package/extensions/dm-lens/dist/clients/host-edit-normalize.js +87 -0
- package/extensions/dm-lens/dist/clients/host-ports.js +35 -0
- package/extensions/dm-lens/dist/clients/indent-retarget.js +102 -0
- package/extensions/dm-lens/dist/clients/inline-blocker-dispositions.js +103 -0
- package/extensions/dm-lens/dist/clients/install-diagnostics.js +123 -0
- package/extensions/dm-lens/dist/clients/installer/index.js +3770 -0
- package/extensions/dm-lens/dist/clients/installer/managed-tool-refresh-session.js +17 -0
- package/extensions/dm-lens/dist/clients/installer/managed-tool-refresh.js +522 -0
- package/extensions/dm-lens/dist/clients/instance-reaper-state.js +3 -0
- package/extensions/dm-lens/dist/clients/instance-reaper.js +577 -0
- package/extensions/dm-lens/dist/clients/instance-registry-lock.js +131 -0
- package/extensions/dm-lens/dist/clients/instance-registry.js +452 -0
- package/extensions/dm-lens/dist/clients/jscpd-client.js +252 -0
- package/extensions/dm-lens/dist/clients/json-cache-read.js +25 -0
- package/extensions/dm-lens/dist/clients/knip-client.js +472 -0
- package/extensions/dm-lens/dist/clients/language-policy.js +242 -0
- package/extensions/dm-lens/dist/clients/language-profile.js +261 -0
- package/extensions/dm-lens/dist/clients/language-registry.js +424 -0
- package/extensions/dm-lens/dist/clients/latency-logger.js +192 -0
- package/extensions/dm-lens/dist/clients/lazy-import.js +14 -0
- package/extensions/dm-lens/dist/clients/ledger-bounds.js +21 -0
- package/extensions/dm-lens/dist/clients/lens-config.js +237 -0
- package/extensions/dm-lens/dist/clients/lens-engine.js +181 -0
- package/extensions/dm-lens/dist/clients/lens-events.js +105 -0
- package/extensions/dm-lens/dist/clients/lens-flag-registry.js +302 -0
- package/extensions/dm-lens/dist/clients/lens-map.js +980 -0
- package/extensions/dm-lens/dist/clients/live-bus-emitter.js +53 -0
- package/extensions/dm-lens/dist/clients/log-cleanup.js +138 -0
- package/extensions/dm-lens/dist/clients/lsp/aggregation.js +88 -0
- package/extensions/dm-lens/dist/clients/lsp/cascade-tier.js +203 -0
- package/extensions/dm-lens/dist/clients/lsp/client.js +2709 -0
- package/extensions/dm-lens/dist/clients/lsp/config.js +252 -0
- package/extensions/dm-lens/dist/clients/lsp/content-limits.js +21 -0
- package/extensions/dm-lens/dist/clients/lsp/diagnostic-binding.js +79 -0
- package/extensions/dm-lens/dist/clients/lsp/document-drift.js +312 -0
- package/extensions/dm-lens/dist/clients/lsp/edits.js +930 -0
- package/extensions/dm-lens/dist/clients/lsp/index.js +4448 -0
- package/extensions/dm-lens/dist/clients/lsp/inferred-project.js +121 -0
- package/extensions/dm-lens/dist/clients/lsp/jvm-runtime.js +194 -0
- package/extensions/dm-lens/dist/clients/lsp/language.js +23 -0
- package/extensions/dm-lens/dist/clients/lsp/launch.js +468 -0
- package/extensions/dm-lens/dist/clients/lsp/lombok.js +146 -0
- package/extensions/dm-lens/dist/clients/lsp/path-utils.js +1 -0
- package/extensions/dm-lens/dist/clients/lsp/pending-aux-coverage.js +90 -0
- package/extensions/dm-lens/dist/clients/lsp/position-encoding.js +28 -0
- package/extensions/dm-lens/dist/clients/lsp/ruby-drive-dirs.js +42 -0
- package/extensions/dm-lens/dist/clients/lsp/server.js +2422 -0
- package/extensions/dm-lens/dist/clients/lsp/session-roots.js +52 -0
- package/extensions/dm-lens/dist/clients/lsp/spawn-history.js +15 -0
- package/extensions/dm-lens/dist/clients/lsp/sync-kind.js +30 -0
- package/extensions/dm-lens/dist/clients/lsp/tsserver-sync.js +156 -0
- package/extensions/dm-lens/dist/clients/lsp/wait-policy/capability-snapshot.js +1 -0
- package/extensions/dm-lens/dist/clients/lsp/wait-policy/classification.js +36 -0
- package/extensions/dm-lens/dist/clients/lsp/wait-policy/index.js +3 -0
- package/extensions/dm-lens/dist/clients/lsp/wait-policy/strategies.js +175 -0
- package/extensions/dm-lens/dist/clients/lsp/watch-queue.js +40 -0
- package/extensions/dm-lens/dist/clients/lsp/workspace-diagnostics-cache.js +267 -0
- package/extensions/dm-lens/dist/clients/lsp/workspace-diagnostics-session.js +7 -0
- package/extensions/dm-lens/dist/clients/lsp/workspace-sweep-hold.js +93 -0
- package/extensions/dm-lens/dist/clients/lsp-budget.js +83 -0
- package/extensions/dm-lens/dist/clients/lsp-document-symbols.js +93 -0
- package/extensions/dm-lens/dist/clients/lsp-lazy.js +8 -0
- package/extensions/dm-lens/dist/clients/lsp-mutation.js +273 -0
- package/extensions/dm-lens/dist/clients/lsp-status.js +37 -0
- package/extensions/dm-lens/dist/clients/map-with-concurrency.js +20 -0
- package/extensions/dm-lens/dist/clients/mcp/analyze.js +251 -0
- package/extensions/dm-lens/dist/clients/mcp/host-shim.js +14 -0
- package/extensions/dm-lens/dist/clients/mcp/ipc.js +302 -0
- package/extensions/dm-lens/dist/clients/mcp/review.js +137 -0
- package/extensions/dm-lens/dist/clients/mcp/session.js +305 -0
- package/extensions/dm-lens/dist/clients/memory-sampler.js +107 -0
- package/extensions/dm-lens/dist/clients/message-end-attribution.js +18 -0
- package/extensions/dm-lens/dist/clients/metrics-client.js +80 -0
- package/extensions/dm-lens/dist/clients/metrics-history.js +255 -0
- package/extensions/dm-lens/dist/clients/middle-man-analysis.js +161 -0
- package/extensions/dm-lens/dist/clients/model-provider.js +31 -0
- package/extensions/dm-lens/dist/clients/module-report-lsp.js +140 -0
- package/extensions/dm-lens/dist/clients/module-report.js +1642 -0
- package/extensions/dm-lens/dist/clients/mutating-tool.js +377 -0
- package/extensions/dm-lens/dist/clients/mutation-attribution.js +168 -0
- package/extensions/dm-lens/dist/clients/mutation-bridge.js +102 -0
- package/extensions/dm-lens/dist/clients/ndjson-logger.js +471 -0
- package/extensions/dm-lens/dist/clients/observed-mutation-sources.js +43 -0
- package/extensions/dm-lens/dist/clients/observed-mutation.js +709 -0
- package/extensions/dm-lens/dist/clients/oldtext-autopatch.js +100 -0
- package/extensions/dm-lens/dist/clients/opaque-mutation-scan.js +313 -0
- package/extensions/dm-lens/dist/clients/opengrep-client.js +216 -0
- package/extensions/dm-lens/dist/clients/opengrep-config.js +52 -0
- package/extensions/dm-lens/dist/clients/package-manager.js +303 -0
- package/extensions/dm-lens/dist/clients/package-root.js +25 -0
- package/extensions/dm-lens/dist/clients/partial-edit-apply.js +337 -0
- package/extensions/dm-lens/dist/clients/path-attribution-telemetry.js +31 -0
- package/extensions/dm-lens/dist/clients/path-keyed-map.js +57 -0
- package/extensions/dm-lens/dist/clients/path-utils.js +476 -0
- package/extensions/dm-lens/dist/clients/performance-report.js +291 -0
- package/extensions/dm-lens/dist/clients/persist-debounce.js +37 -0
- package/extensions/dm-lens/dist/clients/persistent-reverify.js +165 -0
- package/extensions/dm-lens/dist/clients/php-cs-fixer-config.js +15 -0
- package/extensions/dm-lens/dist/clients/pipeline.js +1091 -0
- package/extensions/dm-lens/dist/clients/post-autofix-notice.js +19 -0
- package/extensions/dm-lens/dist/clients/print-mode.js +3 -0
- package/extensions/dm-lens/dist/clients/probe-home-state.js +62 -0
- package/extensions/dm-lens/dist/clients/process-bridge.js +20 -0
- package/extensions/dm-lens/dist/clients/process-singletons.js +69 -0
- package/extensions/dm-lens/dist/clients/process-snapshot.js +22 -0
- package/extensions/dm-lens/dist/clients/project-changes.js +112 -0
- package/extensions/dm-lens/dist/clients/project-conventions.js +152 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/cache.js +91 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/extractors.js +53 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/fresh-fetch.js +408 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +64 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/dead-code.js +38 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +21 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +23 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/jscpd.js +28 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/knip.js +45 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/madge.js +34 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/opengrep.js +32 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +79 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +41 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/scanner.js +349 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/types.js +1 -0
- package/extensions/dm-lens/dist/clients/project-lens-config.js +437 -0
- package/extensions/dm-lens/dist/clients/project-report.js +527 -0
- package/extensions/dm-lens/dist/clients/project-scale.js +60 -0
- package/extensions/dm-lens/dist/clients/project-scan-policy.js +4 -0
- package/extensions/dm-lens/dist/clients/project-snapshot-fingerprint.js +39 -0
- package/extensions/dm-lens/dist/clients/project-snapshot-persist-worker.js +14 -0
- package/extensions/dm-lens/dist/clients/project-snapshot.js +1178 -0
- package/extensions/dm-lens/dist/clients/project-trust.js +104 -0
- package/extensions/dm-lens/dist/clients/python-environment.js +120 -0
- package/extensions/dm-lens/dist/clients/python-provenance.js +551 -0
- package/extensions/dm-lens/dist/clients/quiet-window-config.js +16 -0
- package/extensions/dm-lens/dist/clients/quiet-window.js +126 -0
- package/extensions/dm-lens/dist/clients/read-bridge.js +46 -0
- package/extensions/dm-lens/dist/clients/read-expansion.js +218 -0
- package/extensions/dm-lens/dist/clients/read-guard-logger.js +178 -0
- package/extensions/dm-lens/dist/clients/read-guard-tool-lines.js +1042 -0
- package/extensions/dm-lens/dist/clients/read-guard.js +1096 -0
- package/extensions/dm-lens/dist/clients/recent-touches.js +126 -0
- package/extensions/dm-lens/dist/clients/redact/secrets.js +386 -0
- package/extensions/dm-lens/dist/clients/resource-sampler.js +344 -0
- package/extensions/dm-lens/dist/clients/reverse-deps.js +227 -0
- package/extensions/dm-lens/dist/clients/review-graph/builder.js +3635 -0
- package/extensions/dm-lens/dist/clients/review-graph/format.js +30 -0
- package/extensions/dm-lens/dist/clients/review-graph/git-identity.js +115 -0
- package/extensions/dm-lens/dist/clients/review-graph/import-resolvers.js +325 -0
- package/extensions/dm-lens/dist/clients/review-graph/persist-worker.js +8 -0
- package/extensions/dm-lens/dist/clients/review-graph/query.js +195 -0
- package/extensions/dm-lens/dist/clients/review-graph/revision-drift.js +3 -0
- package/extensions/dm-lens/dist/clients/review-graph/service.js +60 -0
- package/extensions/dm-lens/dist/clients/review-graph/shared-extraction-ir.js +54 -0
- package/extensions/dm-lens/dist/clients/review-graph/symbol-id.js +29 -0
- package/extensions/dm-lens/dist/clients/review-graph/tsconfig-paths.js +253 -0
- package/extensions/dm-lens/dist/clients/review-graph/types.js +1 -0
- package/extensions/dm-lens/dist/clients/review-graph/workspace-modules.js +374 -0
- package/extensions/dm-lens/dist/clients/review-graph-logger.js +51 -0
- package/extensions/dm-lens/dist/clients/ruff-client.js +109 -0
- package/extensions/dm-lens/dist/clients/rules-scanner.js +113 -0
- package/extensions/dm-lens/dist/clients/run-duration.js +9 -0
- package/extensions/dm-lens/dist/clients/runtime-agent-end.js +608 -0
- package/extensions/dm-lens/dist/clients/runtime-config.js +39 -0
- package/extensions/dm-lens/dist/clients/runtime-context.js +155 -0
- package/extensions/dm-lens/dist/clients/runtime-coordinator.js +817 -0
- package/extensions/dm-lens/dist/clients/runtime-session.js +1625 -0
- package/extensions/dm-lens/dist/clients/runtime-tool-call.js +868 -0
- package/extensions/dm-lens/dist/clients/runtime-tool-result.js +1317 -0
- package/extensions/dm-lens/dist/clients/runtime-turn.js +2333 -0
- package/extensions/dm-lens/dist/clients/rust-client.js +48 -0
- package/extensions/dm-lens/dist/clients/safe-spawn.js +1267 -0
- package/extensions/dm-lens/dist/clients/sanitize.js +174 -0
- package/extensions/dm-lens/dist/clients/scan-utils.js +7 -0
- package/extensions/dm-lens/dist/clients/scratch-tree-policy.js +57 -0
- package/extensions/dm-lens/dist/clients/search-read-registration.js +59 -0
- package/extensions/dm-lens/dist/clients/secret-findings.js +69 -0
- package/extensions/dm-lens/dist/clients/security-scan-client.js +208 -0
- package/extensions/dm-lens/dist/clients/session-event-guard.js +111 -0
- package/extensions/dm-lens/dist/clients/session-lifecycle.js +173 -0
- package/extensions/dm-lens/dist/clients/session-start-observability.js +47 -0
- package/extensions/dm-lens/dist/clients/session-state-store.js +63 -0
- package/extensions/dm-lens/dist/clients/session-summary.js +8 -0
- package/extensions/dm-lens/dist/clients/sessionstart-logger.js +22 -0
- package/extensions/dm-lens/dist/clients/sg-runner.js +627 -0
- package/extensions/dm-lens/dist/clients/sgconfig.js +280 -0
- package/extensions/dm-lens/dist/clients/shared-checkout-guard.js +177 -0
- package/extensions/dm-lens/dist/clients/single-flight.js +52 -0
- package/extensions/dm-lens/dist/clients/situational-tool-telemetry.js +85 -0
- package/extensions/dm-lens/dist/clients/skills-resolver.js +38 -0
- package/extensions/dm-lens/dist/clients/slow-fs.js +77 -0
- package/extensions/dm-lens/dist/clients/smells-rollup.js +118 -0
- package/extensions/dm-lens/dist/clients/source-filter.js +320 -0
- package/extensions/dm-lens/dist/clients/source-walker.js +96 -0
- package/extensions/dm-lens/dist/clients/spawn-output-cap.js +35 -0
- package/extensions/dm-lens/dist/clients/spawn-timeout-cooldown.js +51 -0
- package/extensions/dm-lens/dist/clients/stale-marker.js +1 -0
- package/extensions/dm-lens/dist/clients/startup-scan.js +222 -0
- package/extensions/dm-lens/dist/clients/startup-timing.js +67 -0
- package/extensions/dm-lens/dist/clients/string-utils.js +6 -0
- package/extensions/dm-lens/dist/clients/subagent-mode.js +40 -0
- package/extensions/dm-lens/dist/clients/symbol-containment.js +16 -0
- package/extensions/dm-lens/dist/clients/symbol-types.js +1 -0
- package/extensions/dm-lens/dist/clients/test-runner-client.js +1504 -0
- package/extensions/dm-lens/dist/clients/test-runner-delivery.js +260 -0
- package/extensions/dm-lens/dist/clients/todo-scanner.js +164 -0
- package/extensions/dm-lens/dist/clients/tool-agreement.js +377 -0
- package/extensions/dm-lens/dist/clients/tool-config.js +218 -0
- package/extensions/dm-lens/dist/clients/tool-cwd.js +235 -0
- package/extensions/dm-lens/dist/clients/tool-definition.js +22 -0
- package/extensions/dm-lens/dist/clients/tool-event.js +18 -0
- package/extensions/dm-lens/dist/clients/tool-policy.js +2393 -0
- package/extensions/dm-lens/dist/clients/tool-probe.js +5 -0
- package/extensions/dm-lens/dist/clients/tool-render.js +79 -0
- package/extensions/dm-lens/dist/clients/tool-set-policy.js +70 -0
- package/extensions/dm-lens/dist/clients/tree-sitter-cache.js +206 -0
- package/extensions/dm-lens/dist/clients/tree-sitter-client.js +2787 -0
- package/extensions/dm-lens/dist/clients/tree-sitter-logger.js +77 -0
- package/extensions/dm-lens/dist/clients/tree-sitter-navigator.js +198 -0
- package/extensions/dm-lens/dist/clients/tree-sitter-query-loader.js +318 -0
- package/extensions/dm-lens/dist/clients/tree-sitter-shared.js +87 -0
- package/extensions/dm-lens/dist/clients/tree-sitter-symbol-extractor.js +957 -0
- package/extensions/dm-lens/dist/clients/trivy-client.js +305 -0
- package/extensions/dm-lens/dist/clients/tui-fit.js +26 -0
- package/extensions/dm-lens/dist/clients/turn-context.js +48 -0
- package/extensions/dm-lens/dist/clients/turn-end/lane.js +1 -0
- package/extensions/dm-lens/dist/clients/turn-end/lanes/govulncheck.js +54 -0
- package/extensions/dm-lens/dist/clients/turn-end/lanes/secrets.js +131 -0
- package/extensions/dm-lens/dist/clients/turn-summary-render.js +56 -0
- package/extensions/dm-lens/dist/clients/turn-summary.js +84 -0
- package/extensions/dm-lens/dist/clients/typos-config.js +9 -0
- package/extensions/dm-lens/dist/clients/user-notify.js +15 -0
- package/extensions/dm-lens/dist/clients/vanished-instance-marker.js +18 -0
- package/extensions/dm-lens/dist/clients/warm-attach.js +210 -0
- package/extensions/dm-lens/dist/clients/widget-state.js +963 -0
- package/extensions/dm-lens/dist/clients/word-index-logger.js +21 -0
- package/extensions/dm-lens/dist/clients/word-index-store.js +222 -0
- package/extensions/dm-lens/dist/clients/word-index.js +1426 -0
- package/extensions/dm-lens/dist/clients/workspace-topology.js +261 -0
- package/extensions/dm-lens/dist/clients/write-ordering-guard.js +24 -0
- package/extensions/dm-lens/dist/clients/zizmor-config.js +160 -0
- package/extensions/dm-lens/dist/i18n.js +67 -0
- package/extensions/dm-lens/dist/index.js +1782 -0
- package/extensions/dm-lens/dist/mcp/analyze-cli.js +178 -0
- package/extensions/dm-lens/dist/mcp/build-staleness.js +55 -0
- package/extensions/dm-lens/dist/mcp/cli.js +78 -0
- package/extensions/dm-lens/dist/mcp/server.js +1208 -0
- package/extensions/dm-lens/dist/mcp/worker.js +33 -0
- package/extensions/dm-lens/dist/scripts/lib/process-scan.mjs +256 -0
- package/extensions/dm-lens/dist/scripts/lib/skills-predicate.mjs +53 -0
- package/extensions/dm-lens/dist/scripts/lib/web-tree-sitter-dir.mjs +45 -0
- package/extensions/dm-lens/dist/tools/activate-tools.js +61 -0
- package/extensions/dm-lens/dist/tools/ast-grep-outline.js +127 -0
- package/extensions/dm-lens/dist/tools/ast-grep-replace.js +226 -0
- package/extensions/dm-lens/dist/tools/ast-grep-search.js +687 -0
- package/extensions/dm-lens/dist/tools/effective-config.js +59 -0
- package/extensions/dm-lens/dist/tools/lens-diagnostic-mark.js +240 -0
- package/extensions/dm-lens/dist/tools/lens-diagnostics.js +1484 -0
- package/extensions/dm-lens/dist/tools/lsp-diagnostics.js +1088 -0
- package/extensions/dm-lens/dist/tools/lsp-navigation.js +1194 -0
- package/extensions/dm-lens/dist/tools/lsp-structured-output.js +277 -0
- package/extensions/dm-lens/dist/tools/module-report.js +332 -0
- package/extensions/dm-lens/dist/tools/project-report.js +72 -0
- package/extensions/dm-lens/dist/tools/render-compact.js +272 -0
- package/extensions/dm-lens/dist/tools/scan-progress.js +31 -0
- package/extensions/dm-lens/dist/tools/shared.js +26 -0
- package/extensions/dm-lens/dist/tools/symbol-search.js +133 -0
- package/extensions/dm-lens/index.js +278 -101
- package/extensions/dm-lens/mcp/analyze-cli.js +3 -2
- package/extensions/dm-lens/mcp/build-staleness.js +1 -1
- package/extensions/dm-lens/mcp/server.js +144 -73
- package/extensions/dm-lens/package.json +4 -4
- package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-assert-tuple-test.yml +13 -0
- package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-boolean-in-except-test.yml +26 -0
- package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-http-headers-bracket-access-test.yml +10 -0
- package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/unchecked-numeric-parse-python-test.yml +18 -0
- package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/unchecked-throwing-call-python-test.yml +4 -3
- package/extensions/dm-lens/rules/ast-grep-rules/rules/go-no-fmt-println.yml +2 -2
- package/extensions/dm-lens/rules/ast-grep-rules/rules/no-assert-tuple.yml +23 -13
- package/extensions/dm-lens/rules/ast-grep-rules/rules/no-boolean-in-except.yml +7 -3
- package/extensions/dm-lens/rules/ast-grep-rules/rules/no-console-except-error-js.yml +2 -2
- package/extensions/dm-lens/rules/ast-grep-rules/rules/no-console-except-error.yml +2 -2
- package/extensions/dm-lens/rules/ast-grep-rules/rules/no-http-headers-bracket-access.yml +12 -7
- package/extensions/dm-lens/rules/ast-grep-rules/rules/unchecked-numeric-parse-python.yml +44 -0
- package/extensions/dm-lens/rules/ast-grep-rules/rules/unchecked-throwing-call-python.yml +5 -3
- package/extensions/dm-lens/rules/tree-sitter-queries/python/python-cross-language-method.yml +3 -3
- package/extensions/dm-lens/rules/tree-sitter-queries/python/python-hallucinated-import.yml +2 -2
- package/extensions/dm-lens/rules/tree-sitter-queries/python/python-sql-injection.yml +12 -2
- package/extensions/dm-lens/rules/tree-sitter-queries/typescript/console-statement.yml +2 -2
- package/extensions/dm-lens/rules/tree-sitter-queries/typescript/sql-injection.yml +23 -7
- package/extensions/dm-lens/rules/typos/_typos.toml +4 -2
- package/extensions/dm-lens/scripts/lib/process-scan.mjs +1 -1
- package/extensions/dm-lens/scripts/lib/skills-predicate.mjs +53 -0
- package/extensions/dm-lens/scripts/lib/web-tree-sitter-dir.mjs +45 -0
- package/extensions/dm-lens/skills/pi-lens-ast-grep/SKILL.md +23 -6
- package/extensions/dm-lens/skills/pi-lens-lsp-navigation/SKILL.md +26 -9
- package/extensions/dm-lens/tools/activate-tools.js +10 -7
- package/extensions/dm-lens/tools/ast-grep-outline.js +2 -6
- package/extensions/dm-lens/tools/ast-grep-replace.js +5 -16
- package/extensions/dm-lens/tools/ast-grep-search.js +83 -38
- package/extensions/dm-lens/tools/effective-config.js +5 -4
- package/extensions/dm-lens/tools/lens-diagnostic-mark.js +5 -3
- package/extensions/dm-lens/tools/lens-diagnostics.js +478 -106
- package/extensions/dm-lens/tools/lsp-diagnostics.js +317 -172
- package/extensions/dm-lens/tools/lsp-navigation.js +26 -56
- package/extensions/dm-lens/tools/lsp-structured-output.js +3 -3
- package/extensions/dm-lens/tools/module-report.js +5 -5
- package/extensions/dm-lens/tools/project-report.js +9 -15
- package/extensions/dm-lens/tools/render-compact.js +220 -1
- package/extensions/dm-lens/tools/symbol-search.js +3 -5
- package/extensions/dm-mcp-adapter/OAUTH.md +368 -2
- package/extensions/dm-mcp-adapter/THIRD_PARTY_NOTICES.md +1 -1
- package/extensions/dm-mcp-adapter/agent-plugin-loader.js +73 -30
- package/extensions/dm-mcp-adapter/agent-plugin-provenance.js +26 -0
- package/extensions/dm-mcp-adapter/bearer-command-resolver.js +182 -0
- package/extensions/dm-mcp-adapter/claude-plugin-loader.js +350 -0
- package/extensions/dm-mcp-adapter/cli.js +82 -5
- package/extensions/dm-mcp-adapter/commands.js +89 -15
- package/extensions/dm-mcp-adapter/config.js +283 -33
- package/extensions/dm-mcp-adapter/consent-manager.js +32 -8
- package/extensions/dm-mcp-adapter/direct-tool-surface.js +223 -0
- package/extensions/dm-mcp-adapter/direct-tools.js +21 -216
- package/extensions/dm-mcp-adapter/dist/abort.js +35 -0
- package/extensions/dm-mcp-adapter/dist/agent-plugin-loader.js +73 -30
- package/extensions/dm-mcp-adapter/dist/agent-plugin-provenance.js +26 -0
- package/extensions/dm-mcp-adapter/dist/bearer-command-resolver.js +182 -0
- package/extensions/dm-mcp-adapter/dist/claude-plugin-loader.js +350 -0
- package/extensions/dm-mcp-adapter/dist/config.js +283 -33
- package/extensions/dm-mcp-adapter/dist/consent-manager.js +84 -0
- package/extensions/dm-mcp-adapter/dist/elicitation-handler.js +308 -0
- package/extensions/dm-mcp-adapter/dist/errors.js +225 -0
- package/extensions/dm-mcp-adapter/dist/http-ca.js +71 -0
- package/extensions/dm-mcp-adapter/dist/jev-client.js +359 -0
- package/extensions/dm-mcp-adapter/dist/jev-contracts.js +1 -0
- package/extensions/dm-mcp-adapter/dist/jev-key-store.js +176 -0
- package/extensions/dm-mcp-adapter/dist/json-schema-validator.js +70 -0
- package/extensions/dm-mcp-adapter/dist/lifecycle.js +387 -0
- package/extensions/dm-mcp-adapter/dist/logger.js +115 -0
- package/extensions/dm-mcp-adapter/dist/mcp-auth-fetch.js +86 -0
- package/extensions/dm-mcp-adapter/dist/mcp-auth-flow.js +949 -0
- package/extensions/dm-mcp-adapter/dist/mcp-auth.js +997 -0
- package/extensions/dm-mcp-adapter/dist/mcp-bearer-store.js +7 -136
- package/extensions/dm-mcp-adapter/dist/mcp-callback-server.js +381 -0
- package/extensions/dm-mcp-adapter/dist/mcp-oauth-provider.js +524 -0
- package/extensions/dm-mcp-adapter/dist/mcp-probe.js +151 -0
- package/extensions/dm-mcp-adapter/dist/mcp-tasks.js +300 -0
- package/extensions/dm-mcp-adapter/dist/mcp-trace.js +215 -0
- package/extensions/dm-mcp-adapter/dist/metadata-cache.js +10 -28
- package/extensions/dm-mcp-adapter/dist/npx-resolver.js +465 -0
- package/extensions/dm-mcp-adapter/dist/package-mcp-loader.js +5 -16
- package/extensions/dm-mcp-adapter/dist/request-headers-command.js +294 -0
- package/extensions/dm-mcp-adapter/dist/runtime-owner.js +94 -0
- package/extensions/dm-mcp-adapter/dist/sampling-handler.js +213 -0
- package/extensions/dm-mcp-adapter/dist/secure-keyring.js +191 -0
- package/extensions/dm-mcp-adapter/dist/server-manager.js +1514 -0
- package/extensions/dm-mcp-adapter/dist/session-approvals.js +127 -0
- package/extensions/dm-mcp-adapter/dist/session-recovery.js +82 -0
- package/extensions/dm-mcp-adapter/dist/state.js +1 -0
- package/extensions/dm-mcp-adapter/dist/types.js +39 -0
- package/extensions/dm-mcp-adapter/dist/ui-resource-handler.js +204 -0
- package/extensions/dm-mcp-adapter/dist/unix-socket-transport.js +83 -0
- package/extensions/dm-mcp-adapter/dist/utils.js +84 -9
- package/extensions/dm-mcp-adapter/elicitation-handler.js +27 -22
- package/extensions/dm-mcp-adapter/host-html-template.js +17 -18
- package/extensions/dm-mcp-adapter/http-ca.js +71 -0
- package/extensions/dm-mcp-adapter/index.js +904 -167
- package/extensions/dm-mcp-adapter/init.js +53 -42
- package/extensions/dm-mcp-adapter/jev-client.js +359 -0
- package/extensions/dm-mcp-adapter/jev-contracts.js +0 -0
- package/extensions/dm-mcp-adapter/jev-key-store.js +176 -0
- package/extensions/dm-mcp-adapter/json-schema-validator.js +19 -2
- package/extensions/dm-mcp-adapter/lazy-loader.js +7 -0
- package/extensions/dm-mcp-adapter/lifecycle.js +8 -3
- package/extensions/dm-mcp-adapter/mcp-auth-fetch.js +86 -0
- package/extensions/dm-mcp-adapter/mcp-auth-flow.js +228 -75
- package/extensions/dm-mcp-adapter/mcp-auth.js +312 -47
- package/extensions/dm-mcp-adapter/mcp-bearer-store.js +7 -136
- package/extensions/dm-mcp-adapter/mcp-code.js +151 -20
- package/extensions/dm-mcp-adapter/mcp-install.js +40 -0
- package/extensions/dm-mcp-adapter/mcp-oauth-provider.js +52 -8
- package/extensions/dm-mcp-adapter/mcp-output-guard.js +42 -43
- package/extensions/dm-mcp-adapter/mcp-panel-theme.js +79 -0
- package/extensions/dm-mcp-adapter/mcp-panel.js +294 -286
- package/extensions/dm-mcp-adapter/mcp-references.js +13 -18
- package/extensions/dm-mcp-adapter/mcp-script-worker.mjs +5 -1
- package/extensions/dm-mcp-adapter/mcp-setup-panel.js +317 -282
- package/extensions/dm-mcp-adapter/mcp-status.js +2 -0
- package/extensions/dm-mcp-adapter/mcp-tasks.js +309 -0
- package/extensions/dm-mcp-adapter/metadata-cache.js +11 -28
- package/extensions/dm-mcp-adapter/namespace-tools.js +43 -7
- package/extensions/dm-mcp-adapter/oauth.js +1 -1
- package/extensions/dm-mcp-adapter/package-mcp-loader.js +5 -16
- package/extensions/dm-mcp-adapter/package.json +4 -1
- package/extensions/dm-mcp-adapter/prompts.js +31 -4
- package/extensions/dm-mcp-adapter/proxy-modes.js +394 -199
- package/extensions/dm-mcp-adapter/request-headers-command.js +3 -2
- package/extensions/dm-mcp-adapter/runtime-owner.js +16 -1
- package/extensions/dm-mcp-adapter/sampling-handler.js +16 -25
- package/extensions/dm-mcp-adapter/sandbox-proxy-template.js +14 -90
- package/extensions/dm-mcp-adapter/search-ranking.js +31 -6
- package/extensions/dm-mcp-adapter/secure-keyring.js +191 -0
- package/extensions/dm-mcp-adapter/semantic-search.js +160 -0
- package/extensions/dm-mcp-adapter/server-manager.js +406 -117
- package/extensions/dm-mcp-adapter/session-approvals.js +127 -0
- package/extensions/dm-mcp-adapter/skills/mcp-scripting/SKILL.md +11 -1
- package/extensions/dm-mcp-adapter/test-runner.mjs +3 -4
- package/extensions/dm-mcp-adapter/tool-approval.js +32 -22
- package/extensions/dm-mcp-adapter/tool-metadata.js +18 -11
- package/extensions/dm-mcp-adapter/tool-registrar.js +7 -4
- package/extensions/dm-mcp-adapter/tool-result-renderer.js +4 -2
- package/extensions/dm-mcp-adapter/types.js +39 -0
- package/extensions/dm-mcp-adapter/ui-server.js +51 -36
- package/extensions/dm-mcp-adapter/ui-session.js +57 -25
- package/extensions/dm-mcp-adapter/utils.js +84 -9
- package/extensions/dm-ponytail/hooks/cursor-hooks.json +17 -0
- package/extensions/dm-ponytail/hooks/ponytail-activate.js +14 -2
- package/extensions/dm-ponytail/hooks/ponytail-mode-tracker.js +21 -2
- package/extensions/dm-ponytail/hooks/ponytail-runtime.js +23 -0
- package/extensions/dm-ponytail/package.json +1 -1
- package/extensions/dm-subagents/agents/claude-code-writer.md +1 -0
- package/extensions/dm-subagents/agents/codex-exec-writer.md +1 -0
- package/extensions/dm-subagents/agents/cursor-agent-writer.md +1 -0
- package/extensions/dm-subagents/agents/evidence-auditor.md +34 -0
- package/extensions/dm-subagents/agents/researcher.md +23 -13
- package/extensions/dm-subagents/agents/reviewer.md +6 -4
- package/extensions/dm-subagents/agents/scout.md +1 -1
- package/extensions/dm-subagents/agents/worker.md +3 -2
- package/extensions/dm-subagents/index.js +3 -2
- package/extensions/dm-subagents/inspector-runner.mjs +2 -2
- package/extensions/dm-subagents/install.mjs +1 -2
- package/extensions/dm-subagents/package.json +35 -1
- package/extensions/dm-subagents/prompts/council.md +6 -3
- package/extensions/dm-subagents/prompts/parallel-review.md +1 -1
- package/extensions/dm-subagents/runner-peer-loader.mjs +18 -0
- package/extensions/dm-subagents/runner-peer-preload.mjs +29 -0
- package/extensions/dm-subagents/skills/dm-subagents/SKILL.md +35 -22
- package/extensions/dm-subagents/skills/dm-subagents/references/constraints-and-recipes.md +9 -5
- package/extensions/dm-subagents/skills/dm-subagents/references/execution-controls.md +40 -19
- package/extensions/dm-subagents/skills/dm-subagents/references/management-authoring-rpc.md +6 -6
- package/extensions/dm-subagents/skills/dm-subagents/references/multi-lane-orchestration.md +11 -1
- package/extensions/dm-subagents/skills/dm-subagents/references/prompting-and-roles.md +35 -30
- package/extensions/dm-subagents/skills/dm-subagents/references/review-and-validation.md +3 -3
- package/extensions/dm-subagents/src/agents/advertised-agent-prompt.js +70 -0
- package/extensions/dm-subagents/src/agents/agent-management.js +276 -172
- package/extensions/dm-subagents/src/agents/agent-memory.js +92 -3
- package/extensions/dm-subagents/src/agents/agent-serializer.js +17 -8
- package/extensions/dm-subagents/src/agents/agents.js +389 -207
- package/extensions/dm-subagents/src/agents/builtin-names.js +1 -0
- package/extensions/dm-subagents/src/agents/chain-serializer.js +7 -0
- package/extensions/dm-subagents/src/agents/global-npm-root.js +47 -0
- package/extensions/dm-subagents/src/agents/proactive-skills.js +1 -1
- package/extensions/dm-subagents/src/agents/runtime-agent-registry.js +17 -13
- package/extensions/dm-subagents/src/agents/skills.js +36 -10
- package/extensions/dm-subagents/src/api/capability-ceiling.js +0 -1
- package/extensions/dm-subagents/src/api/child-tool-plan.js +3 -0
- package/extensions/dm-subagents/src/api/preflight.js +75 -64
- package/extensions/dm-subagents/src/api/required-child-extensions.js +3 -0
- package/extensions/dm-subagents/src/api/workflow-resources.js +1 -0
- package/extensions/dm-subagents/src/extension/config.js +27 -18
- package/extensions/dm-subagents/src/extension/doctor.js +10 -13
- package/extensions/dm-subagents/src/extension/fanout-child.js +91 -14
- package/extensions/dm-subagents/src/extension/herdr-dm-bridge.js +258 -0
- package/extensions/dm-subagents/src/extension/index.js +202 -66
- package/extensions/dm-subagents/src/extension/public-execution.js +55 -4
- package/extensions/dm-subagents/src/extension/rpc.js +18 -27
- package/extensions/dm-subagents/src/extension/schemas.js +99 -84
- package/extensions/dm-subagents/src/extension/subagent-guide.js +14 -3
- package/extensions/dm-subagents/src/extension/tool-activation.js +157 -0
- package/extensions/dm-subagents/src/extension/tool-description.js +30 -78
- package/extensions/dm-subagents/src/inspectors/actions.js +145 -0
- package/extensions/dm-subagents/src/inspectors/ghostty/actions.js +60 -0
- package/extensions/dm-subagents/src/inspectors/ghostty/plugin.js +17 -0
- package/extensions/dm-subagents/src/inspectors/herdr/actions.js +94 -179
- package/extensions/dm-subagents/src/inspectors/herdr/plugin.js +13 -0
- package/extensions/dm-subagents/src/inspectors/herdr/project-panes.js +1 -1
- package/extensions/dm-subagents/src/inspectors/{herdr/inspector-runner.js → inspector-runner.js} +31 -25
- package/extensions/dm-subagents/src/inspectors/plugins.js +5 -0
- package/extensions/dm-subagents/src/inspectors/{herdr/session-roots-codec.js → session-roots-codec.js} +1 -6
- package/extensions/dm-subagents/src/inspectors/types.js +1 -0
- package/extensions/dm-subagents/src/integrations/dm-web-session-liveness.js +50 -0
- package/extensions/dm-subagents/src/intercom/intercom-bridge.js +39 -5
- package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +256 -151
- package/extensions/dm-subagents/src/intercom/result-intercom.js +6 -0
- package/extensions/dm-subagents/src/intercom/supervisor-ui.js +199 -0
- package/extensions/dm-subagents/src/missions/workflow-state.js +30 -17
- package/extensions/dm-subagents/src/policy/authority.js +6 -2
- package/extensions/dm-subagents/src/profiles/profiles.js +10 -5
- package/extensions/dm-subagents/src/runs/background/active-async-capacity.js +28 -35
- package/extensions/dm-subagents/src/runs/background/active-run-index.js +17 -0
- package/extensions/dm-subagents/src/runs/background/async-execution.js +580 -389
- package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +71 -47
- package/extensions/dm-subagents/src/runs/background/async-resume.js +61 -26
- package/extensions/dm-subagents/src/runs/background/async-retention.js +8 -0
- package/extensions/dm-subagents/src/runs/background/async-status-snapshot.js +3 -4
- package/extensions/dm-subagents/src/runs/background/async-status.js +90 -13
- package/extensions/dm-subagents/src/runs/background/auto-drain.js +57 -33
- package/extensions/dm-subagents/src/runs/background/binary-bootstrap.js +54 -0
- package/extensions/dm-subagents/src/runs/background/chain-append.js +1 -1
- package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +11 -27
- package/extensions/dm-subagents/src/runs/background/control-channel.js +105 -256
- package/extensions/dm-subagents/src/runs/background/fleet-view.js +67 -10
- package/extensions/dm-subagents/src/runs/background/notify.js +252 -17
- package/extensions/dm-subagents/src/runs/background/owned-process-tree.js +33 -2
- package/extensions/dm-subagents/src/runs/background/process-terminal-candidate.js +88 -0
- package/extensions/dm-subagents/src/runs/background/process-terminal.js +29 -87
- package/extensions/dm-subagents/src/runs/background/result-files.js +8 -4
- package/extensions/dm-subagents/src/runs/background/result-watcher.js +15 -3
- package/extensions/dm-subagents/src/runs/background/retained-children.js +3 -2
- package/extensions/dm-subagents/src/runs/background/retained-nested-route-tracker.js +86 -0
- package/extensions/dm-subagents/src/runs/background/run-child-session.js +574 -0
- package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +9 -5
- package/extensions/dm-subagents/src/runs/background/run-status.js +114 -11
- package/extensions/dm-subagents/src/runs/background/runner-aliases.js +129 -0
- package/extensions/dm-subagents/src/runs/background/runner-child-launch.js +62 -0
- package/extensions/dm-subagents/src/runs/background/runner-child-sessions.js +16 -0
- package/extensions/dm-subagents/src/runs/background/runner-http-dispatcher.js +84 -0
- package/extensions/dm-subagents/src/runs/background/runner-startup-failure.js +43 -0
- package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +119 -20
- package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +33 -10
- package/extensions/dm-subagents/src/runs/background/steering.js +24 -3
- package/extensions/dm-subagents/src/runs/background/subagent-runner-bootstrap.js +238 -0
- package/extensions/dm-subagents/src/runs/background/subagent-runner.js +1008 -1344
- package/extensions/dm-subagents/src/runs/background/subagent-wait.js +156 -26
- package/extensions/dm-subagents/src/runs/background/wait-completions.js +91 -23
- package/extensions/dm-subagents/src/runs/background/wait-subscriptions.js +10 -3
- package/extensions/dm-subagents/src/runs/background/wait-tool.js +8 -12
- package/extensions/dm-subagents/src/runs/background/workflow-terminal-proof.js +60 -0
- package/extensions/dm-subagents/src/runs/foreground/async-steering-action.js +29 -26
- package/extensions/dm-subagents/src/runs/foreground/async-stop-action.js +94 -2
- package/extensions/dm-subagents/src/runs/foreground/execution.js +446 -648
- package/extensions/dm-subagents/src/runs/foreground/foreground-control.js +4 -0
- package/extensions/dm-subagents/src/runs/foreground/foreground-history.js +5 -2
- package/extensions/dm-subagents/src/runs/foreground/prompt-audit.js +8 -4
- package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +1337 -445
- package/extensions/dm-subagents/src/runs/foreground/workflow-detach-reconcile.js +10 -5
- package/extensions/dm-subagents/src/runs/foreground/workflow-foreground-steering.js +65 -90
- package/extensions/dm-subagents/src/runs/shared/acceptance.js +265 -68
- package/extensions/dm-subagents/src/runs/shared/agent-contract.js +1 -1
- package/extensions/dm-subagents/src/runs/shared/async-status-projection.js +133 -76
- package/extensions/dm-subagents/src/runs/shared/capability-ceiling.js +4 -2
- package/extensions/dm-subagents/src/runs/shared/child-hooks.js +166 -0
- package/extensions/dm-subagents/src/runs/shared/child-identity.js +10 -2
- package/extensions/dm-subagents/src/runs/shared/child-launch-plan.js +19 -2
- package/extensions/dm-subagents/src/runs/shared/child-launch.js +212 -0
- package/extensions/dm-subagents/src/runs/shared/child-lifecycle.js +22 -0
- package/extensions/dm-subagents/src/runs/shared/child-runtime-config.js +31 -0
- package/extensions/dm-subagents/src/runs/shared/child-session.js +378 -0
- package/extensions/dm-subagents/src/runs/shared/child-tool-plan.js +299 -0
- package/extensions/dm-subagents/src/runs/shared/claude-code-adapter.js +1 -1
- package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +148 -32
- package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +6 -4
- package/extensions/dm-subagents/src/runs/shared/effective-system-prompt.js +19 -0
- package/extensions/dm-subagents/src/runs/shared/external-cli-contract.js +6 -1
- package/extensions/dm-subagents/src/runs/shared/external-cli-preflight.js +14 -2
- package/extensions/dm-subagents/src/runs/shared/external-cli-runner.js +6 -7
- package/extensions/dm-subagents/src/runs/shared/external-job-bridge.js +60 -0
- package/extensions/dm-subagents/src/runs/shared/git-environment.js +25 -0
- package/extensions/dm-subagents/src/runs/shared/herdr-connection.js +341 -0
- package/extensions/dm-subagents/src/runs/shared/herdr-dm-protocol.js +60 -0
- package/extensions/dm-subagents/src/runs/shared/herdr-external-adapters.js +555 -0
- package/extensions/dm-subagents/src/runs/shared/herdr-machine.js +239 -0
- package/extensions/dm-subagents/src/runs/shared/herdr-placed-run.js +987 -0
- package/extensions/dm-subagents/src/runs/shared/host-step-status.js +2 -0
- package/extensions/dm-subagents/src/runs/shared/lane-metadata.js +23 -3
- package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +4 -3
- package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-grant.js +15 -5
- package/extensions/dm-subagents/src/runs/shared/model-resolution-diagnostic.js +43 -0
- package/extensions/dm-subagents/src/runs/shared/{model-fallback.js → model-resolution.js} +44 -128
- package/extensions/dm-subagents/src/runs/shared/nested-events.js +39 -49
- package/extensions/dm-subagents/src/runs/shared/nested-path.js +0 -13
- package/extensions/dm-subagents/src/runs/shared/orca-progress-tabs.js +22 -12
- package/extensions/dm-subagents/src/runs/shared/parallel-handoff.js +78 -2
- package/extensions/dm-subagents/src/runs/shared/permissions.js +1 -16
- package/extensions/dm-subagents/src/runs/shared/process-signal.js +3 -0
- package/extensions/dm-subagents/src/runs/shared/readonly-drain-observation.js +51 -0
- package/extensions/dm-subagents/src/runs/shared/run-fanout-budget.js +0 -13
- package/extensions/dm-subagents/src/runs/shared/runtime-acknowledged-extensions.js +0 -26
- package/extensions/dm-subagents/src/runs/shared/single-output.js +20 -2
- package/extensions/dm-subagents/src/runs/shared/structured-output.js +263 -10
- package/extensions/dm-subagents/src/runs/shared/subagent-control.js +6 -14
- package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +117 -370
- package/extensions/dm-subagents/src/runs/shared/tool-availability.js +12 -50
- package/extensions/dm-subagents/src/runs/shared/tool-budget.js +10 -13
- package/extensions/dm-subagents/src/runs/shared/tool-timeout.js +1 -1
- package/extensions/dm-subagents/src/runs/shared/usage-reconciliation.js +69 -0
- package/extensions/dm-subagents/src/runs/shared/workflow-async-child-guidance.js +11 -0
- package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-plan.js +30 -10
- package/extensions/dm-subagents/src/runs/shared/worktree-setup-command.js +195 -0
- package/extensions/dm-subagents/src/runs/shared/worktree.js +814 -141
- package/extensions/dm-subagents/src/shared/atomic-json.js +2 -1
- package/extensions/dm-subagents/src/shared/child-cache-retention.js +19 -0
- package/extensions/dm-subagents/src/shared/fork-context.js +40 -77
- package/extensions/dm-subagents/src/shared/fork-session-cwd.js +24 -0
- package/extensions/dm-subagents/src/shared/jsonl-writer.js +8 -0
- package/extensions/dm-subagents/src/shared/launch-contract.js +37 -6
- package/extensions/dm-subagents/src/shared/model-response-aliases.js +15 -0
- package/extensions/dm-subagents/src/shared/opencode-session-headers.js +15 -0
- package/extensions/dm-subagents/src/shared/pruned-fork.js +83 -76
- package/extensions/dm-subagents/src/shared/required-child-extensions.js +72 -0
- package/extensions/dm-subagents/src/shared/shortcuts.js +0 -2
- package/extensions/dm-subagents/src/shared/thinking-ceiling.js +0 -6
- package/extensions/dm-subagents/src/shared/types.js +16 -12
- package/extensions/dm-subagents/src/shared/utils.js +22 -7
- package/extensions/dm-subagents/src/shared/watch-strategy.js +2 -0
- package/extensions/dm-subagents/src/shared/workflow-child-permit.js +70 -0
- package/extensions/dm-subagents/src/slash/delegation-adapters.js +15 -1
- package/extensions/dm-subagents/src/slash/delegation-request.js +13 -0
- package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +28 -1
- package/extensions/dm-subagents/src/slash/prompt-workflows.js +15 -2
- package/extensions/dm-subagents/src/slash/slash-commands.js +12 -269
- package/extensions/dm-subagents/src/slash/subagent-cost.js +255 -0
- package/extensions/dm-subagents/src/slash/subagents-admin.js +49 -25
- package/extensions/dm-subagents/src/tui/fleet-status.js +224 -23
- package/extensions/dm-subagents/src/tui/fleet.js +38 -25
- package/extensions/dm-subagents/src/tui/render.js +636 -63
- package/extensions/dm-subagents/src/watchdog/child-status.js +42 -23
- package/extensions/dm-subagents/src/watchdog/diff-tool.js +86 -0
- package/extensions/dm-subagents/src/watchdog/emission-guard.js +4 -3
- package/extensions/dm-subagents/src/watchdog/guidance.js +19 -0
- package/extensions/dm-subagents/src/watchdog/lsp-diagnostics.js +1 -1
- package/extensions/dm-subagents/src/watchdog/model-selection.js +18 -1
- package/extensions/dm-subagents/src/watchdog/permission-arbiter.js +16 -10
- package/extensions/dm-subagents/src/watchdog/register-child.js +39 -26
- package/extensions/dm-subagents/src/watchdog/register-main.js +51 -43
- package/extensions/dm-subagents/src/watchdog/render.js +5 -7
- package/extensions/dm-subagents/src/watchdog/review.js +142 -67
- package/extensions/dm-subagents/src/watchdog/rules.js +55 -0
- package/extensions/dm-subagents/src/watchdog/runtime.js +167 -109
- package/extensions/dm-subagents/src/watchdog/scope.js +1 -9
- package/extensions/dm-subagents/src/watchdog/settings.js +55 -99
- package/extensions/dm-subagents/src/watchdog/tool-actions.js +11 -12
- package/extensions/dm-subagents/src/watchdog/turn-delta.js +30 -5
- package/extensions/dm-subagents/src/watchdog/types.js +2 -4
- package/extensions/dm-subagents/src/watchdog/warning-format.js +2 -3
- package/extensions/dm-subagents/src/workflows/chat-progress.js +4 -4
- package/extensions/dm-subagents/src/workflows/scripted-workflow.js +482 -36
- package/extensions/dm-subagents/src/workflows/workflow-checklist.js +303 -0
- package/extensions/dm-subagents/src/workflows/workflow-child-summary.js +57 -5
- package/extensions/dm-subagents/src/workflows/workflow-preflight.js +27 -1
- package/extensions/dm-subagents/src/workflows/workflow-receipt.js +51 -3
- package/extensions/dm-subagents/src/workflows/workflow-resources.js +226 -0
- package/extensions/dm-subagents/src/workflows/workflow-settlement.js +5 -0
- package/extensions/dm-web-access/abortable.js +19 -0
- package/extensions/dm-web-access/anysearch.js +4 -13
- package/extensions/dm-web-access/baizhi.js +123 -0
- package/extensions/dm-web-access/bocha.js +3 -24
- package/extensions/dm-web-access/brave.js +3 -23
- package/extensions/dm-web-access/brightdata.js +5 -30
- package/extensions/dm-web-access/content-find.js +181 -47
- package/extensions/dm-web-access/crawl4ai.js +166 -0
- package/extensions/dm-web-access/credential-source.js +1 -0
- package/extensions/dm-web-access/curator-page.js +27 -2
- package/extensions/dm-web-access/curator-run.js +36 -0
- package/extensions/dm-web-access/curator-server.js +11 -2
- package/extensions/dm-web-access/domain-filter-normalization.js +17 -0
- package/extensions/dm-web-access/duckduckgo.js +4 -24
- package/extensions/dm-web-access/extract.js +54 -12
- package/extensions/dm-web-access/fetch-params.js +1 -1
- package/extensions/dm-web-access/firecrawl.js +7 -45
- package/extensions/dm-web-access/gemini-search.js +101 -46
- package/extensions/dm-web-access/github-extract.js +2 -11
- package/extensions/dm-web-access/index.js +382 -247
- package/extensions/dm-web-access/jina-search.js +4 -13
- package/extensions/dm-web-access/kagi.js +4 -13
- package/extensions/dm-web-access/kimi-search.js +5 -30
- package/extensions/dm-web-access/mistral-search.js +251 -0
- package/extensions/dm-web-access/ollama.js +2 -7
- package/extensions/dm-web-access/openai-search.js +204 -46
- package/extensions/dm-web-access/opencode-session-headers.js +15 -0
- package/extensions/dm-web-access/package.json +1 -1
- package/extensions/dm-web-access/page-query.js +14 -4
- package/extensions/dm-web-access/parallel.js +1 -17
- package/extensions/dm-web-access/pdf-extract.js +1 -0
- package/extensions/dm-web-access/perplexity.js +10 -1
- package/extensions/dm-web-access/querit.js +5 -34
- package/extensions/dm-web-access/query-rewrite.js +6 -2
- package/extensions/dm-web-access/search-answer-formatting.js +6 -0
- package/extensions/dm-web-access/search-result-count-normalization.js +5 -0
- package/extensions/dm-web-access/search1api.js +5 -34
- package/extensions/dm-web-access/searchinfinity.js +5 -34
- package/extensions/dm-web-access/searxng.js +3 -23
- package/extensions/dm-web-access/serpapi.js +183 -0
- package/extensions/dm-web-access/serpbase.js +3 -24
- package/extensions/dm-web-access/serpdive.js +3 -23
- package/extensions/dm-web-access/serper.js +5 -30
- package/extensions/dm-web-access/serply.js +184 -0
- package/extensions/dm-web-access/source-check.js +10 -46
- package/extensions/dm-web-access/ssrf-protection.js +3 -1
- package/extensions/dm-web-access/storage.js +9 -0
- package/extensions/dm-web-access/summary-review.js +36 -25
- package/extensions/dm-web-access/tavily.js +3 -23
- package/extensions/dm-web-access/tinyfish.js +5 -34
- package/extensions/dm-web-access/tool-activation.js +112 -0
- package/extensions/dm-web-access/utils.js +27 -10
- package/extensions/dm-web-access/valyu.js +5 -30
- package/extensions/dm-web-access/xai-search.js +78 -42
- package/extensions/dm-web-access/xcrawl.js +5 -30
- package/package.json +7 -4
- package/extensions/dm-lens/tools/ast-dump.js +0 -101
- package/extensions/dm-subagents/src/api/dm-args.js +0 -3
- package/extensions/dm-subagents/src/runs/shared/child-protocol.js +0 -447
- package/extensions/dm-subagents/src/runs/shared/completion-evidence.js +0 -40
- package/extensions/dm-subagents/src/runs/shared/completion-guard.js +0 -173
- package/extensions/dm-subagents/src/runs/shared/dm-args.js +0 -581
- package/extensions/dm-subagents/src/runs/shared/llm-intent-arbiter.js +0 -190
- package/extensions/dm-subagents/src/runs/shared/model-exclusions.js +0 -207
- package/extensions/dm-subagents/src/runs/shared/subagent-startup-retry.js +0 -50
- package/extensions/dm-subagents/src/runs/shared/task-intent.js +0 -130
- package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.js +0 -68
- /package/extensions/dm-subagents/src/inspectors/{herdr/shell-command.js → shell-command.js} +0 -0
|
@@ -1,22 +1,23 @@
|
|
|
1
|
+
import { withFileMutationQueue } from "@duckmind/dm-coding-agent";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { isServerDisabled } from "./types.js";
|
|
1
6
|
import { Type } from "typebox";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { buildProxyDescription, createDirectToolExecutor, getMissingConfiguredDirectToolServers, prepareDirectToolArguments, resolveDirectTools } from "./direct-tools.js";
|
|
5
|
-
import { flushMetadataCache, initializeMcp, updateStatusBar } from "./init.js";
|
|
7
|
+
import { cloneMcpConfig, discoverConfiguredClaudePluginSkills, getPiGlobalConfigPath, getProjectConfigPath, loadMcpConfig, resolveConfiguredClaudePluginMcp, writeProjectServerDisabledOverride, writeSharedServerEntry } from "./config.js";
|
|
8
|
+
import { buildProxyDescription, getLargeDirectToolsAdvisory, getMissingConfiguredDirectToolServers, prepareDirectToolArguments, resolveDirectTools } from "./direct-tool-surface.js";
|
|
6
9
|
import { isServerInActiveFailureBackoff } from "./failure-backoff.js";
|
|
7
|
-
import { loadMetadataCache, parseDirectToolSelectors } from "./metadata-cache.js";
|
|
10
|
+
import { computeServerHash, isServerCacheValid, loadMetadataCache, parseDirectToolSelectors } from "./metadata-cache.js";
|
|
8
11
|
import { createPromptCommand, resolveCachedPrompts } from "./prompts.js";
|
|
9
12
|
import { logger } from "./logger.js";
|
|
10
|
-
import {
|
|
11
|
-
import { formatTerminalError, getConfigPathFromArgv, normalizeDirectToolInputSchema, truncateAtWord } from "./utils.js";
|
|
12
|
-
import { createOAuthRuntime, shutdownOAuth } from "./mcp-auth-flow.js";
|
|
13
|
+
import { formatMcpFooterStatus, formatTerminalError, getConfigPathFromArgv, normalizeDirectToolInputSchema, truncateAtWord } from "./utils.js";
|
|
13
14
|
import { createMcpDirectToolCallRenderer, createMcpProxyToolCallRenderer, createMcpScriptToolCallRenderer, createMcpToolResultRenderer, resolveMcpToolRenderOptions } from "./tool-result-renderer.js";
|
|
14
15
|
import { toolErrorOverride } from "./error-signal.js";
|
|
15
16
|
import { createMcpRuntimeOwner, createOwnedUi, isAbortError } from "./runtime-owner.js";
|
|
16
17
|
import { publishMcpStatusShutdown } from "./mcp-status.js";
|
|
17
|
-
import { runMcpScript } from "./mcp-code.js";
|
|
18
|
-
import { cleanupMaterializedBinaryResources } from "./tool-registrar.js";
|
|
19
18
|
import { syncNamespaceProxyTools } from "./namespace-tools.js";
|
|
19
|
+
import { restoreSessionApprovalState } from "./session-approvals.js";
|
|
20
|
+
import { createRetryableLoader } from "./lazy-loader.js";
|
|
20
21
|
export {
|
|
21
22
|
namespaceProxyName,
|
|
22
23
|
parseMcpReference,
|
|
@@ -27,15 +28,49 @@ export {
|
|
|
27
28
|
MCP_STATUS_SNAPSHOT_VERSION,
|
|
28
29
|
MCP_TOOL_APPROVAL_REQUEST_EVENT
|
|
29
30
|
} from "./types.js";
|
|
31
|
+
const loadCoreRuntime = createRetryableLoader(() => import("./init.js"));
|
|
32
|
+
const loadOAuthRuntime = createRetryableLoader(() => import("./mcp-auth-flow.js"));
|
|
33
|
+
const loadProxyModes = createRetryableLoader(() => import("./proxy-modes.js"));
|
|
34
|
+
const loadDirectExecution = createRetryableLoader(() => import("./direct-tools.js"));
|
|
35
|
+
const loadCommands = createRetryableLoader(() => import("./commands.js"));
|
|
36
|
+
const loadCodeMode = createRetryableLoader(() => import("./mcp-code.js"));
|
|
37
|
+
const loadInstallParsing = createRetryableLoader(() => import("./mcp-install.js"));
|
|
30
38
|
const INIT_WAIT_TIMEOUT_MS = 30000;
|
|
31
39
|
const INIT_FAILURE_MESSAGE_MAX_CHARS = 1000;
|
|
32
40
|
const INIT_WAIT_TIMED_OUT = Symbol("init-wait-timed-out");
|
|
41
|
+
function hasEnabledServerWithoutValidMetadata(config, cache, directSpecs = []) {
|
|
42
|
+
return Object.entries(config.mcpServers).some(([serverName, definition]) => {
|
|
43
|
+
if (isServerDisabled(definition) || directSpecs.some((spec) => spec.serverName === serverName))
|
|
44
|
+
return false;
|
|
45
|
+
const entry = cache?.servers[serverName];
|
|
46
|
+
return entry === undefined || !isServerCacheValid(entry, definition);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
33
49
|
export const MCP_RUNTIME_REGISTER_EVENT = "dm-mcp-adapter:runtime-register:v1";
|
|
34
50
|
export const MCP_RUNTIME_REGISTER_VERSION = 1;
|
|
35
51
|
export const MCP_RUNTIME_SNAPSHOT_EVENT = "dm-mcp-adapter:runtime-snapshot:v1";
|
|
36
52
|
export const MCP_RUNTIME_SNAPSHOT_VERSION = 1;
|
|
37
53
|
const runtimeRegistrars = new WeakMap;
|
|
38
54
|
const runtimeSnapshotters = new WeakMap;
|
|
55
|
+
function resolveProgrammaticClaudePluginPath(path, cwd) {
|
|
56
|
+
if (path === "~")
|
|
57
|
+
return resolve(process.env.HOME ?? "", ".");
|
|
58
|
+
if (path.startsWith("~/"))
|
|
59
|
+
return resolve(process.env.HOME ?? "", path.slice(2));
|
|
60
|
+
return resolve(cwd, path);
|
|
61
|
+
}
|
|
62
|
+
function normalizeProgrammaticConfig(config) {
|
|
63
|
+
if (!config.claudePlugins)
|
|
64
|
+
return config;
|
|
65
|
+
const cwd = process.cwd();
|
|
66
|
+
return {
|
|
67
|
+
...config,
|
|
68
|
+
claudePlugins: config.claudePlugins.map((plugin) => ({
|
|
69
|
+
...plugin,
|
|
70
|
+
path: resolveProgrammaticClaudePluginPath(plugin.path, cwd)
|
|
71
|
+
}))
|
|
72
|
+
};
|
|
73
|
+
}
|
|
39
74
|
async function awaitWithTimeout(promise, timeoutMs) {
|
|
40
75
|
let timer;
|
|
41
76
|
try {
|
|
@@ -67,10 +102,19 @@ function installMcpAdapter(pi, options) {
|
|
|
67
102
|
const programmaticConfig = sessionConfig !== undefined;
|
|
68
103
|
let state = null;
|
|
69
104
|
let initPromise = null;
|
|
105
|
+
let initStartedPromise = null;
|
|
70
106
|
let currentOwner = null;
|
|
71
107
|
let currentOAuthRuntime = null;
|
|
72
108
|
let lifecycleGeneration = 0;
|
|
73
109
|
let retainedInitFailure = null;
|
|
110
|
+
let finalizationGuard = null;
|
|
111
|
+
let finalizationRegistrations = null;
|
|
112
|
+
function callReentrant(callback) {
|
|
113
|
+
finalizationGuard?.();
|
|
114
|
+
const result = callback();
|
|
115
|
+
finalizationGuard?.();
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
74
118
|
function retainInitFailure(error) {
|
|
75
119
|
const message = truncateAtWord(formatTerminalError(error), INIT_FAILURE_MESSAGE_MAX_CHARS);
|
|
76
120
|
retainedInitFailure = message;
|
|
@@ -92,27 +136,59 @@ function installMcpAdapter(pi, options) {
|
|
|
92
136
|
}
|
|
93
137
|
return true;
|
|
94
138
|
}
|
|
139
|
+
function captureRuntimeGuard(expectedState = state) {
|
|
140
|
+
return { generation: lifecycleGeneration, owner: currentOwner, state: expectedState };
|
|
141
|
+
}
|
|
142
|
+
function assertRuntimeGuard(guard) {
|
|
143
|
+
guard.owner?.throwIfInactive();
|
|
144
|
+
if (lifecycleGeneration !== guard.generation || currentOwner !== guard.owner || state !== guard.state) {
|
|
145
|
+
throw guard.owner?.signal.reason ?? new Error("MCP operation belongs to a stale session");
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function isRuntimeGuardStale(guard) {
|
|
149
|
+
return guard.owner?.isActive() === false || lifecycleGeneration !== guard.generation || currentOwner !== guard.owner || state !== guard.state;
|
|
150
|
+
}
|
|
151
|
+
async function loadForRuntime(loader, guard) {
|
|
152
|
+
const loaded = await loader();
|
|
153
|
+
assertRuntimeGuard(guard);
|
|
154
|
+
return loaded;
|
|
155
|
+
}
|
|
156
|
+
function createCommandContext(ctx, owner) {
|
|
157
|
+
const commandCtx = Object.create(ctx);
|
|
158
|
+
const hasUI = ctx.hasUI;
|
|
159
|
+
Object.defineProperties(commandCtx, {
|
|
160
|
+
hasUI: { value: hasUI, enumerable: true },
|
|
161
|
+
ui: {
|
|
162
|
+
value: hasUI ? owner ? createOwnedUi(ctx.ui, owner) : ctx.ui : undefined,
|
|
163
|
+
enumerable: true
|
|
164
|
+
},
|
|
165
|
+
signal: { value: owner?.signal ?? ctx.signal, enumerable: true }
|
|
166
|
+
});
|
|
167
|
+
return commandCtx;
|
|
168
|
+
}
|
|
95
169
|
function startGatewayRetryInitialization(ctx) {
|
|
96
170
|
const generation = ++lifecycleGeneration;
|
|
97
171
|
const owner = createMcpRuntimeOwner();
|
|
98
|
-
const oauthRuntime = createOAuthRuntime(owner.signal);
|
|
99
172
|
currentOwner = owner;
|
|
100
|
-
currentOAuthRuntime =
|
|
173
|
+
currentOAuthRuntime = null;
|
|
101
174
|
state = null;
|
|
102
|
-
startInitialization(ctx, owner,
|
|
175
|
+
startInitialization(ctx, owner, generation, "stale_gateway_retry_initialization");
|
|
103
176
|
}
|
|
104
|
-
async function shutdownState(currentState, reason) {
|
|
177
|
+
async function shutdownState(currentState, reason, publishStatus = true) {
|
|
105
178
|
if (!currentState) {
|
|
106
|
-
|
|
179
|
+
if (publishStatus)
|
|
180
|
+
publishMcpStatusShutdown(pi.events);
|
|
107
181
|
return;
|
|
108
182
|
}
|
|
109
|
-
|
|
183
|
+
if (publishStatus)
|
|
184
|
+
publishMcpStatusShutdown(currentState.statusEvents);
|
|
110
185
|
if (currentState.uiServer) {
|
|
111
186
|
currentState.uiServer.close(reason);
|
|
112
187
|
currentState.uiServer = null;
|
|
113
188
|
}
|
|
114
189
|
let flushError;
|
|
115
190
|
try {
|
|
191
|
+
const { flushMetadataCache } = await loadCoreRuntime();
|
|
116
192
|
flushMetadataCache(currentState);
|
|
117
193
|
} catch (error) {
|
|
118
194
|
flushError = error;
|
|
@@ -134,21 +210,41 @@ function installMcpAdapter(pi, options) {
|
|
|
134
210
|
throw flushError;
|
|
135
211
|
}
|
|
136
212
|
}
|
|
213
|
+
function restoreCurrentSessionApprovals(targetState) {
|
|
214
|
+
const sessionManager = targetState.sessionManager;
|
|
215
|
+
if (!sessionManager)
|
|
216
|
+
return;
|
|
217
|
+
let branch = [];
|
|
218
|
+
try {
|
|
219
|
+
branch = sessionManager.getBranch();
|
|
220
|
+
} catch (error) {
|
|
221
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
222
|
+
logger.debug(`MCP: could not read the active session branch for approval restore: ${detail}`);
|
|
223
|
+
}
|
|
224
|
+
restoreSessionApprovalState(targetState, branch);
|
|
225
|
+
}
|
|
137
226
|
const earlyConfigPath = programmaticConfig ? undefined : options.configPath ?? getConfigPathFromArgv();
|
|
138
|
-
const earlyConfig = programmaticConfig ? cloneMcpConfig(sessionConfig) : loadMcpConfig(earlyConfigPath);
|
|
227
|
+
const earlyConfig = programmaticConfig ? resolveConfiguredClaudePluginMcp(cloneMcpConfig(sessionConfig), process.cwd()) : loadMcpConfig(earlyConfigPath);
|
|
139
228
|
const earlyCache = loadMetadataCache();
|
|
140
229
|
const envRaw = process.env.MCP_DIRECT_TOOLS;
|
|
141
230
|
const envDirectToolOverride = parseEnvDirectToolOverride(envRaw);
|
|
142
231
|
const namespaceEnvOverride = resolveNamespaceEnvOverride(envRaw, envDirectToolOverride);
|
|
232
|
+
const hasStartupServer = Object.values(earlyConfig.mcpServers).some((definition) => !isServerDisabled(definition) && (definition.lifecycle === "eager" || definition.lifecycle === "keep-alive"));
|
|
143
233
|
const registeredDirectTools = new Map;
|
|
234
|
+
const registeredDirectToolServers = new Map;
|
|
235
|
+
const registeredDirectToolVersions = new Map;
|
|
236
|
+
const reportedDirectToolNamesByServer = new Map;
|
|
144
237
|
const registeredNamespaceProxyTools = new Set;
|
|
145
238
|
const fallbackDeactivatedTools = new Set;
|
|
239
|
+
const lazyDirectTools = new Set;
|
|
240
|
+
const searchActivatedTools = new Set;
|
|
146
241
|
const toolRenderOptions = resolveMcpToolRenderOptions(earlyConfig.settings);
|
|
147
242
|
const toolRenderShell = toolRenderOptions.resultRendering === "compact" ? "self" : "default";
|
|
148
243
|
const renderMcpToolResult = createMcpToolResultRenderer(toolRenderOptions);
|
|
149
244
|
let proxyToolRegistered = false;
|
|
150
245
|
let proxyToolDescription = null;
|
|
151
246
|
let directToolsFrozen = false;
|
|
247
|
+
let largeDirectToolsAdvisoryDelivered = false;
|
|
152
248
|
const runtimeServers = new Map;
|
|
153
249
|
function attachRuntimeServerLifecycle(targetState, name, definition) {
|
|
154
250
|
const lifecycleMode = definition.lifecycle ?? "lazy";
|
|
@@ -168,22 +264,89 @@ function installMcpAdapter(pi, options) {
|
|
|
168
264
|
inputSchema: spec.inputSchema,
|
|
169
265
|
resourceUri: spec.resourceUri,
|
|
170
266
|
uiResourceUri: spec.uiResourceUri,
|
|
171
|
-
uiStreamMode: spec.uiStreamMode
|
|
267
|
+
uiStreamMode: spec.uiStreamMode,
|
|
268
|
+
lazy: spec.lazy === true
|
|
172
269
|
});
|
|
173
270
|
}
|
|
271
|
+
function forgetReportedDirectToolName(serverName, toolName) {
|
|
272
|
+
if (!serverName)
|
|
273
|
+
return;
|
|
274
|
+
const reportedNames = reportedDirectToolNamesByServer.get(serverName);
|
|
275
|
+
if (!reportedNames)
|
|
276
|
+
return;
|
|
277
|
+
reportedNames.delete(toolName);
|
|
278
|
+
if (reportedNames.size === 0)
|
|
279
|
+
reportedDirectToolNamesByServer.delete(serverName);
|
|
280
|
+
}
|
|
174
281
|
function registerDirectTool(spec, config) {
|
|
175
|
-
|
|
282
|
+
finalizationRegistrations?.add(spec.prefixedName);
|
|
283
|
+
callReentrant(() => pi.registerTool({
|
|
176
284
|
name: spec.prefixedName,
|
|
177
285
|
label: `MCP: ${spec.originalName}`,
|
|
178
286
|
description: spec.description || "(no description)",
|
|
179
287
|
promptSnippet: truncateAtWord(spec.description, 100) || `MCP tool from ${spec.serverName}`,
|
|
180
288
|
parameters: toToolParameters(normalizeDirectToolInputSchema(spec.inputSchema)),
|
|
181
289
|
...config.settings?.strictDirectToolArguments === true ? { prepareArguments: (args) => prepareDirectToolArguments(spec.inputSchema, args) } : {},
|
|
182
|
-
execute
|
|
290
|
+
async execute(toolCallId, params, signal, onUpdate, ctx) {
|
|
291
|
+
let executor;
|
|
292
|
+
let guard;
|
|
293
|
+
try {
|
|
294
|
+
const targetState = await ensureSessionRuntime(ctx);
|
|
295
|
+
if (!targetState)
|
|
296
|
+
throw new Error("MCP not initialized");
|
|
297
|
+
guard = captureRuntimeGuard(targetState);
|
|
298
|
+
const executionGuard = guard;
|
|
299
|
+
const { createDirectToolExecutor } = await loadForRuntime(loadDirectExecution, executionGuard);
|
|
300
|
+
executor = createDirectToolExecutor(() => executionGuard.state, () => initPromise, spec);
|
|
301
|
+
} catch (error) {
|
|
302
|
+
if (guard && (isRuntimeGuardStale(guard) || guard.owner && isOwnerAbortError(error, guard.owner)))
|
|
303
|
+
throw error;
|
|
304
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
305
|
+
return {
|
|
306
|
+
content: [{ type: "text", text: `MCP initialization failed for ${spec.serverName}: ${message}` }],
|
|
307
|
+
details: { error: "init_failed", server: spec.serverName, message }
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
if (!guard)
|
|
311
|
+
throw new Error("MCP runtime guard unavailable");
|
|
312
|
+
assertRuntimeGuard(guard);
|
|
313
|
+
return executor(toolCallId, params, signal, onUpdate, ctx);
|
|
314
|
+
},
|
|
183
315
|
renderShell: toolRenderShell,
|
|
184
316
|
renderCall: createMcpDirectToolCallRenderer(spec.prefixedName, toolRenderOptions),
|
|
185
317
|
renderResult: renderMcpToolResult
|
|
186
|
-
});
|
|
318
|
+
}));
|
|
319
|
+
}
|
|
320
|
+
function holdLazyToolsInactive() {
|
|
321
|
+
if (lazyDirectTools.size === 0)
|
|
322
|
+
return;
|
|
323
|
+
const activeTools = getActiveToolsIfReady();
|
|
324
|
+
if (!activeTools)
|
|
325
|
+
return;
|
|
326
|
+
const next = activeTools.filter((name) => !lazyDirectTools.has(name) || searchActivatedTools.has(name));
|
|
327
|
+
if (next.length !== activeTools.length)
|
|
328
|
+
pi.setActiveTools(next);
|
|
329
|
+
}
|
|
330
|
+
function activateSearchMatches(matches) {
|
|
331
|
+
const activeTools = getActiveToolsIfReady();
|
|
332
|
+
if (!activeTools)
|
|
333
|
+
return [];
|
|
334
|
+
const activeSet = new Set(activeTools);
|
|
335
|
+
const added = [];
|
|
336
|
+
for (const match of matches) {
|
|
337
|
+
const name = match.tool;
|
|
338
|
+
if (!lazyDirectTools.has(name) || registeredDirectToolServers.get(name) !== match.server)
|
|
339
|
+
continue;
|
|
340
|
+
if (activeSet.has(name) || added.includes(name))
|
|
341
|
+
continue;
|
|
342
|
+
added.push(name);
|
|
343
|
+
}
|
|
344
|
+
if (added.length > 0) {
|
|
345
|
+
pi.setActiveTools([...activeTools, ...added]);
|
|
346
|
+
for (const name of added)
|
|
347
|
+
searchActivatedTools.add(name);
|
|
348
|
+
}
|
|
349
|
+
return added;
|
|
187
350
|
}
|
|
188
351
|
function activeFailureServers() {
|
|
189
352
|
const currentState = state;
|
|
@@ -199,7 +362,7 @@ function installMcpAdapter(pi, options) {
|
|
|
199
362
|
}
|
|
200
363
|
function getActiveToolsIfReady() {
|
|
201
364
|
try {
|
|
202
|
-
return pi.getActiveTools?.();
|
|
365
|
+
return callReentrant(() => pi.getActiveTools?.());
|
|
203
366
|
} catch (error) {
|
|
204
367
|
if (error instanceof Error && error.message.includes("Action methods cannot be called during extension loading"))
|
|
205
368
|
return;
|
|
@@ -210,21 +373,19 @@ function installMcpAdapter(pi, options) {
|
|
|
210
373
|
if (toolNames.length === 0)
|
|
211
374
|
return [];
|
|
212
375
|
const unregisterTool = pi.unregisterTool;
|
|
213
|
-
const unregistered = toolNames.filter((toolName) => unregisterTool?.(toolName) === true);
|
|
376
|
+
const unregistered = toolNames.filter((toolName) => callReentrant(() => unregisterTool?.(toolName)) === true);
|
|
214
377
|
const fallbackNames = toolNames.filter((toolName) => !unregistered.includes(toolName));
|
|
215
|
-
const remove = new Set(toolNames);
|
|
216
378
|
const activeTools = getActiveToolsIfReady();
|
|
217
|
-
if (!activeTools
|
|
218
|
-
for (const toolName of fallbackNames)
|
|
219
|
-
fallbackDeactivatedTools.add(toolName);
|
|
379
|
+
if (!activeTools)
|
|
220
380
|
return unregistered;
|
|
221
|
-
|
|
381
|
+
const removedFallbackNames = fallbackNames.filter((name) => activeTools.includes(name));
|
|
382
|
+
if (removedFallbackNames.length === 0)
|
|
383
|
+
return unregistered;
|
|
384
|
+
const remove = new Set(removedFallbackNames);
|
|
222
385
|
const nextActiveTools = activeTools.filter((name) => !remove.has(name));
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
pi.setActiveTools(nextActiveTools);
|
|
227
|
-
}
|
|
386
|
+
callReentrant(() => pi.setActiveTools(nextActiveTools));
|
|
387
|
+
for (const toolName of removedFallbackNames)
|
|
388
|
+
fallbackDeactivatedTools.add(toolName);
|
|
228
389
|
return unregistered;
|
|
229
390
|
}
|
|
230
391
|
function syncDirectTools(config, cache) {
|
|
@@ -238,24 +399,45 @@ function installMcpAdapter(pi, options) {
|
|
|
238
399
|
const fingerprint = directToolFingerprint(spec);
|
|
239
400
|
const previous = registeredDirectTools.get(spec.prefixedName);
|
|
240
401
|
if (previous !== fingerprint) {
|
|
402
|
+
const previousServer = registeredDirectToolServers.get(spec.prefixedName);
|
|
241
403
|
registerDirectTool(spec, config);
|
|
404
|
+
finalizationGuard?.();
|
|
242
405
|
registeredDirectTools.set(spec.prefixedName, fingerprint);
|
|
243
|
-
|
|
406
|
+
registeredDirectToolServers.set(spec.prefixedName, spec.serverName);
|
|
407
|
+
registeredDirectToolVersions.set(spec.prefixedName, (registeredDirectToolVersions.get(spec.prefixedName) ?? 0) + 1);
|
|
408
|
+
if (previousServer !== spec.serverName) {
|
|
409
|
+
forgetReportedDirectToolName(previousServer, spec.prefixedName);
|
|
410
|
+
}
|
|
411
|
+
if (fallbackDeactivatedTools.delete(spec.prefixedName) && !spec.lazy) {
|
|
244
412
|
const activeTools = getActiveToolsIfReady();
|
|
245
413
|
if (activeTools && !activeTools.includes(spec.prefixedName)) {
|
|
246
|
-
pi.setActiveTools([...activeTools, spec.prefixedName]);
|
|
414
|
+
callReentrant(() => pi.setActiveTools([...activeTools, spec.prefixedName]));
|
|
247
415
|
}
|
|
248
416
|
}
|
|
249
417
|
(previous ? updated : added).push(spec.prefixedName);
|
|
250
418
|
}
|
|
419
|
+
if (spec.lazy) {
|
|
420
|
+
lazyDirectTools.add(spec.prefixedName);
|
|
421
|
+
} else if (lazyDirectTools.delete(spec.prefixedName)) {
|
|
422
|
+
searchActivatedTools.delete(spec.prefixedName);
|
|
423
|
+
const activeTools = getActiveToolsIfReady();
|
|
424
|
+
if (activeTools && !activeTools.includes(spec.prefixedName))
|
|
425
|
+
callReentrant(() => pi.setActiveTools([...activeTools, spec.prefixedName]));
|
|
426
|
+
}
|
|
251
427
|
}
|
|
252
428
|
for (const toolName of [...registeredDirectTools.keys()]) {
|
|
253
429
|
if (nextNames.has(toolName))
|
|
254
430
|
continue;
|
|
431
|
+
const serverName = registeredDirectToolServers.get(toolName);
|
|
255
432
|
registeredDirectTools.delete(toolName);
|
|
433
|
+
registeredDirectToolServers.delete(toolName);
|
|
434
|
+
forgetReportedDirectToolName(serverName, toolName);
|
|
435
|
+
if (lazyDirectTools.delete(toolName))
|
|
436
|
+
searchActivatedTools.delete(toolName);
|
|
256
437
|
deactivated.push(toolName);
|
|
257
438
|
}
|
|
258
439
|
deactivateTools(deactivated);
|
|
440
|
+
holdLazyToolsInactive();
|
|
259
441
|
return { specs, reservedDirectNames, activeDirectNames: nextNames, added, updated, deactivated };
|
|
260
442
|
}
|
|
261
443
|
function applyDirectToolConfigChanges(changes) {
|
|
@@ -268,17 +450,77 @@ function installMcpAdapter(pi, options) {
|
|
|
268
450
|
state.config.mcpServers[serverName] = { ...definition, directTools: value };
|
|
269
451
|
}
|
|
270
452
|
}
|
|
453
|
+
function loadToolSurfaceCache(config) {
|
|
454
|
+
const cache = loadMetadataCache();
|
|
455
|
+
const currentState = state;
|
|
456
|
+
if (!currentState || !cache)
|
|
457
|
+
return cache;
|
|
458
|
+
const servers = { ...cache.servers };
|
|
459
|
+
const connections = callReentrant(() => [...currentState.manager.getAllConnections()]);
|
|
460
|
+
for (const [serverName, connection] of connections) {
|
|
461
|
+
const definition = config.mcpServers[serverName];
|
|
462
|
+
const entry = servers[serverName];
|
|
463
|
+
if (connection.status !== "connected" || !entry || !definition || isServerDisabled(definition))
|
|
464
|
+
continue;
|
|
465
|
+
const configHash = computeServerHash(definition);
|
|
466
|
+
if (computeServerHash(connection.definition) !== configHash || entry.configHash !== configHash)
|
|
467
|
+
continue;
|
|
468
|
+
const { ttlMs: _liveTtl, ...liveEntry } = entry;
|
|
469
|
+
servers[serverName] = liveEntry;
|
|
470
|
+
}
|
|
471
|
+
return { ...cache, servers };
|
|
472
|
+
}
|
|
271
473
|
function syncToolSurface(ctx) {
|
|
474
|
+
const notificationGeneration = lifecycleGeneration;
|
|
475
|
+
const notificationOwner = currentOwner;
|
|
272
476
|
const config = state?.config ?? earlyConfig;
|
|
273
|
-
const cache =
|
|
477
|
+
const cache = loadToolSurfaceCache(config);
|
|
274
478
|
const result = syncDirectTools(config, cache);
|
|
479
|
+
if (state) {
|
|
480
|
+
const directToolCounts = state.directToolCounts ?? new Map;
|
|
481
|
+
directToolCounts.clear();
|
|
482
|
+
for (const spec of result.specs) {
|
|
483
|
+
directToolCounts.set(spec.serverName, (directToolCounts.get(spec.serverName) ?? 0) + 1);
|
|
484
|
+
}
|
|
485
|
+
state.directToolCounts = directToolCounts;
|
|
486
|
+
}
|
|
275
487
|
syncProxyTool(config, cache, result.specs);
|
|
276
488
|
syncNamespaceTools(config, cache, result.reservedDirectNames, result.activeDirectNames);
|
|
489
|
+
deliverLargeDirectToolsAdvisory(ctx, config, result.specs);
|
|
490
|
+
if (ctx && (notificationGeneration !== lifecycleGeneration || notificationOwner !== currentOwner || notificationOwner && !notificationOwner.isActive())) {
|
|
491
|
+
throw notificationOwner?.signal.reason ?? new Error("Stale MCP session after direct-tools advisory");
|
|
492
|
+
}
|
|
493
|
+
finalizationGuard?.();
|
|
277
494
|
const changed = result.added.length + result.updated.length + result.deactivated.length;
|
|
278
495
|
if (changed > 0 && ctx?.hasUI) {
|
|
279
|
-
ctx.ui.notify(`MCP: direct tools refreshed (+${result.added.length}, ~${result.updated.length}, -${result.deactivated.length})`, "info");
|
|
496
|
+
callReentrant(() => ctx.ui.notify(`MCP: direct tools refreshed (+${result.added.length}, ~${result.updated.length}, -${result.deactivated.length})`, "info"));
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
function deliverLargeDirectToolsAdvisory(ctx, config, specs) {
|
|
500
|
+
if (!ctx || largeDirectToolsAdvisoryDelivered)
|
|
501
|
+
return;
|
|
502
|
+
const message = getLargeDirectToolsAdvisory(config, specs);
|
|
503
|
+
if (!message)
|
|
504
|
+
return;
|
|
505
|
+
largeDirectToolsAdvisoryDelivered = true;
|
|
506
|
+
if (ctx.hasUI) {
|
|
507
|
+
callReentrant(() => ctx.ui.notify(message, "warning"));
|
|
508
|
+
} else {
|
|
509
|
+
console.warn(message);
|
|
280
510
|
}
|
|
281
511
|
}
|
|
512
|
+
function getDeferredSessionSnapshot(cwd) {
|
|
513
|
+
const config = programmaticConfig ? resolveConfiguredClaudePluginMcp(cloneMcpConfig(sessionConfig), cwd ?? process.cwd()) : loadMcpConfig(earlyConfigPath, cwd);
|
|
514
|
+
const cache = loadMetadataCache();
|
|
515
|
+
const enabledServers = Object.values(config.mcpServers).filter((definition) => !isServerDisabled(definition));
|
|
516
|
+
if (enabledServers.some((definition) => definition.lifecycle === "eager" || definition.lifecycle === "keep-alive"))
|
|
517
|
+
return;
|
|
518
|
+
if (envRaw !== undefined && envRaw !== "__none__" && getMissingConfiguredDirectToolServers(config, cache, envDirectToolOverride).length > 0)
|
|
519
|
+
return;
|
|
520
|
+
if (config.settings?.deferWithMissingMetadata !== true && (cache === null || hasEnabledServerWithoutValidMetadata(config, cache)))
|
|
521
|
+
return;
|
|
522
|
+
return { config, cache, enabledServerCount: enabledServers.length };
|
|
523
|
+
}
|
|
282
524
|
function syncNamespaceTools(config, cache, reservedDirectNames = new Set(registeredDirectTools.keys()), activeDirectNames = new Set(registeredDirectTools.keys())) {
|
|
283
525
|
const result = syncNamespaceProxyTools({
|
|
284
526
|
config,
|
|
@@ -291,11 +533,19 @@ function installMcpAdapter(pi, options) {
|
|
|
291
533
|
pi,
|
|
292
534
|
getState: () => state,
|
|
293
535
|
getInitPromise: () => initPromise,
|
|
536
|
+
ensureRuntime: (ctx) => ensureSessionRuntime(ctx),
|
|
537
|
+
executeCall: async (...args) => {
|
|
538
|
+
const guard = captureRuntimeGuard(args[0]);
|
|
539
|
+
return (await loadForRuntime(loadProxyModes, guard)).executeCall(...args);
|
|
540
|
+
},
|
|
294
541
|
getPiTools: () => pi.getAllTools(),
|
|
295
542
|
renderOptions: toolRenderOptions,
|
|
296
543
|
renderShell: toolRenderShell,
|
|
297
|
-
renderResult: renderMcpToolResult
|
|
544
|
+
renderResult: renderMcpToolResult,
|
|
545
|
+
guardReentrant: () => finalizationGuard?.(),
|
|
546
|
+
onToolRegistered: (name) => finalizationRegistrations?.add(name)
|
|
298
547
|
});
|
|
548
|
+
finalizationGuard?.();
|
|
299
549
|
for (const name of result.added)
|
|
300
550
|
registeredNamespaceProxyTools.add(name);
|
|
301
551
|
for (const name of result.deactivated)
|
|
@@ -308,14 +558,20 @@ function installMcpAdapter(pi, options) {
|
|
|
308
558
|
logger.debug(`MCP: prompt "${spec.originalName}" on ${spec.serverName} skipped; /${spec.commandName} is already registered`);
|
|
309
559
|
continue;
|
|
310
560
|
}
|
|
561
|
+
callReentrant(() => pi.registerCommand(spec.commandName, createPromptCommand(pi, () => state, spec, {
|
|
562
|
+
ensureState: (ctx) => ensureSessionRuntime(ctx),
|
|
563
|
+
lazyConnect: async (...args) => {
|
|
564
|
+
const guard = captureRuntimeGuard(args[0]);
|
|
565
|
+
return (await loadForRuntime(loadCoreRuntime, guard)).lazyConnect(...args);
|
|
566
|
+
},
|
|
567
|
+
isStateCurrent: (targetState) => state === targetState && currentOwner?.isActive() === true
|
|
568
|
+
})));
|
|
311
569
|
registeredPromptCommands.add(spec.commandName);
|
|
312
|
-
pi.registerCommand(spec.commandName, createPromptCommand(pi, () => state, spec));
|
|
313
570
|
}
|
|
314
571
|
}
|
|
315
572
|
function syncPromptCommands() {
|
|
316
|
-
registerPromptCommands([...state?.promptMetadata?.
|
|
573
|
+
registerPromptCommands([...state?.promptMetadata?.entries() ?? []].filter(([name]) => !state?.provisionalInstalls?.has(name)).flatMap(([, prompts]) => prompts));
|
|
317
574
|
}
|
|
318
|
-
registerPromptCommands(resolveCachedPrompts(earlyConfig));
|
|
319
575
|
const registerRuntimeServer = (name, definition) => {
|
|
320
576
|
if (typeof name !== "string" || name.trim() === "") {
|
|
321
577
|
throw new Error("MCP server name must be a non-empty string");
|
|
@@ -335,7 +591,12 @@ function installMcpAdapter(pi, options) {
|
|
|
335
591
|
registeredState.config.mcpServers[name] = entry;
|
|
336
592
|
attachRuntimeServerLifecycle(registeredState, name, entry);
|
|
337
593
|
syncToolSurface();
|
|
338
|
-
|
|
594
|
+
const guard = captureRuntimeGuard(registeredState);
|
|
595
|
+
loadForRuntime(loadCoreRuntime, guard).then(({ updateStatusBar }) => updateStatusBar(registeredState)).catch((error) => {
|
|
596
|
+
if (!isAbortError(error, guard.owner?.signal)) {
|
|
597
|
+
logger.debug(`MCP: could not update status after runtime registration: ${formatTerminalError(error)}`);
|
|
598
|
+
}
|
|
599
|
+
});
|
|
339
600
|
}
|
|
340
601
|
let disposed = false;
|
|
341
602
|
return {
|
|
@@ -349,9 +610,11 @@ function installMcpAdapter(pi, options) {
|
|
|
349
610
|
return;
|
|
350
611
|
delete currentState.config.mcpServers[name];
|
|
351
612
|
currentState.lifecycle.unregisterServer(name);
|
|
613
|
+
const guard = captureRuntimeGuard(currentState);
|
|
352
614
|
await currentState.manager.close(name);
|
|
615
|
+
assertRuntimeGuard(guard);
|
|
353
616
|
syncToolSurface();
|
|
354
|
-
updateStatusBar(currentState);
|
|
617
|
+
(await loadForRuntime(loadCoreRuntime, guard)).updateStatusBar(currentState);
|
|
355
618
|
}
|
|
356
619
|
};
|
|
357
620
|
};
|
|
@@ -420,82 +683,195 @@ function installMcpAdapter(pi, options) {
|
|
|
420
683
|
description: "Path to MCP config file",
|
|
421
684
|
type: "string"
|
|
422
685
|
});
|
|
423
|
-
function startInitialization(ctx, owner,
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
...sessionConfig !== undefined ? { config: sessionConfig } : {}
|
|
429
|
-
} : {},
|
|
430
|
-
oauthRuntime
|
|
686
|
+
function startInitialization(ctx, owner, generation, staleReason) {
|
|
687
|
+
let oauthRuntime = null;
|
|
688
|
+
let markStarted;
|
|
689
|
+
initStartedPromise = new Promise((resolve) => {
|
|
690
|
+
markStarted = resolve;
|
|
431
691
|
});
|
|
432
|
-
|
|
433
|
-
|
|
692
|
+
let coreRuntime = null;
|
|
693
|
+
const initializationPromise = (async () => {
|
|
694
|
+
const guard = captureRuntimeGuard(null);
|
|
695
|
+
const [core, oauth] = await Promise.all([
|
|
696
|
+
loadCoreRuntime(),
|
|
697
|
+
loadOAuthRuntime()
|
|
698
|
+
]);
|
|
699
|
+
assertRuntimeGuard(guard);
|
|
700
|
+
if (generation !== guard.generation || guard.owner !== owner) {
|
|
701
|
+
throw owner.signal.reason ?? new Error("Stale MCP initialization");
|
|
702
|
+
}
|
|
703
|
+
coreRuntime = core;
|
|
704
|
+
assertRuntimeGuard(guard);
|
|
705
|
+
oauthRuntime = oauth.createOAuthRuntime(owner.signal);
|
|
706
|
+
try {
|
|
707
|
+
assertRuntimeGuard(guard);
|
|
708
|
+
} catch (error) {
|
|
709
|
+
await oauth.shutdownOAuth(oauthRuntime);
|
|
710
|
+
throw error;
|
|
711
|
+
}
|
|
712
|
+
currentOAuthRuntime = oauthRuntime;
|
|
713
|
+
assertRuntimeGuard(guard);
|
|
714
|
+
owner.addCleanup(async () => {
|
|
715
|
+
const { cleanupMaterializedBinaryResources } = await import("./tool-registrar.js");
|
|
716
|
+
cleanupMaterializedBinaryResources(owner.signal);
|
|
717
|
+
});
|
|
718
|
+
assertRuntimeGuard(guard);
|
|
719
|
+
const initialization = core.initializeMcp(pi, ctx, owner, {
|
|
720
|
+
...programmaticConfig || options.configPath !== undefined ? {
|
|
721
|
+
...earlyConfigPath !== undefined ? { configPath: earlyConfigPath } : {},
|
|
722
|
+
...sessionConfig !== undefined ? { config: sessionConfig } : {}
|
|
723
|
+
} : {},
|
|
724
|
+
oauthRuntime
|
|
725
|
+
});
|
|
726
|
+
assertRuntimeGuard(guard);
|
|
727
|
+
markStarted();
|
|
728
|
+
return initialization;
|
|
729
|
+
})().catch((error) => {
|
|
730
|
+
markStarted();
|
|
731
|
+
throw error;
|
|
732
|
+
}).then((value) => value);
|
|
733
|
+
let promise;
|
|
734
|
+
promise = initializationPromise.then(async (nextState) => {
|
|
434
735
|
if (!owner.isActive() || generation !== lifecycleGeneration || initPromise !== promise) {
|
|
435
736
|
try {
|
|
436
|
-
await shutdownState(nextState, staleReason);
|
|
737
|
+
await shutdownState(nextState, staleReason, false);
|
|
437
738
|
} catch (error) {
|
|
438
739
|
console.error(`MCP: failed to clean stale initialization state: ${formatTerminalError(error)}`);
|
|
439
740
|
}
|
|
440
|
-
|
|
741
|
+
throw owner.signal.reason ?? new Error("Stale MCP initialization completed");
|
|
441
742
|
}
|
|
743
|
+
const guard = () => {
|
|
744
|
+
owner.throwIfInactive();
|
|
745
|
+
if (generation !== lifecycleGeneration || currentOwner !== owner || state !== nextState || initPromise !== promise) {
|
|
746
|
+
throw owner.signal.reason ?? new Error("Stale MCP initialization finalized");
|
|
747
|
+
}
|
|
748
|
+
};
|
|
749
|
+
const registeredDuringFinalization = new Set;
|
|
750
|
+
let statusPublicationAttempted = false;
|
|
442
751
|
state = nextState;
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
752
|
+
finalizationGuard = guard;
|
|
753
|
+
finalizationRegistrations = registeredDuringFinalization;
|
|
754
|
+
try {
|
|
755
|
+
guard();
|
|
756
|
+
callReentrant(() => restoreCurrentSessionApprovals(nextState));
|
|
757
|
+
for (const [name, { entry }] of runtimeServers) {
|
|
758
|
+
guard();
|
|
759
|
+
if (Object.hasOwn(nextState.config.mcpServers, name)) {
|
|
760
|
+
console.error(`MCP: runtime-registered server "${name}" now collides with a configured server; keeping the configured server`);
|
|
761
|
+
continue;
|
|
762
|
+
}
|
|
763
|
+
nextState.config.mcpServers[name] = entry;
|
|
764
|
+
guard();
|
|
765
|
+
callReentrant(() => attachRuntimeServerLifecycle(nextState, name, entry));
|
|
448
766
|
}
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
767
|
+
guard();
|
|
768
|
+
nextState.onToolMetadataUpdated = (_serverName, _reason) => {
|
|
769
|
+
if (state !== nextState || !owner.isActive())
|
|
770
|
+
return;
|
|
771
|
+
syncPromptCommands();
|
|
772
|
+
if (directToolsFrozen) {
|
|
773
|
+
logger.debug(`MCP: metadata update for ${_serverName} (${_reason}) skipped — directTools frozen`);
|
|
774
|
+
return;
|
|
775
|
+
}
|
|
776
|
+
syncToolSurface(ctx);
|
|
777
|
+
};
|
|
778
|
+
guard();
|
|
455
779
|
syncPromptCommands();
|
|
456
|
-
|
|
457
|
-
logger.debug(`MCP: metadata update for ${_serverName} (${_reason}) skipped — directTools frozen`);
|
|
458
|
-
return;
|
|
459
|
-
}
|
|
780
|
+
guard();
|
|
460
781
|
syncToolSurface(ctx);
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
782
|
+
guard();
|
|
783
|
+
nextState.statusEvents = pi.events;
|
|
784
|
+
guard();
|
|
785
|
+
if (!coreRuntime)
|
|
786
|
+
throw new Error("MCP core runtime was not loaded");
|
|
787
|
+
const loadedCoreRuntime = coreRuntime;
|
|
788
|
+
statusPublicationAttempted = true;
|
|
789
|
+
callReentrant(() => loadedCoreRuntime.updateStatusBar(nextState));
|
|
790
|
+
guard();
|
|
791
|
+
clearRetainedInitFailure();
|
|
792
|
+
guard();
|
|
793
|
+
if (earlyConfig.settings?.freezeDirectTools === true) {
|
|
794
|
+
directToolsFrozen = true;
|
|
795
|
+
logger.info("MCP: direct tools frozen after initial sync — metadata can refresh without rebuilding the active tool surface");
|
|
796
|
+
}
|
|
797
|
+
guard();
|
|
798
|
+
initPromise = null;
|
|
799
|
+
initStartedPromise = null;
|
|
800
|
+
return nextState;
|
|
801
|
+
} catch (error) {
|
|
802
|
+
if (state === nextState)
|
|
803
|
+
state = null;
|
|
804
|
+
finalizationGuard = null;
|
|
805
|
+
finalizationRegistrations = null;
|
|
806
|
+
if (registeredDuringFinalization.size > 0) {
|
|
807
|
+
deactivateTools([...registeredDuringFinalization]);
|
|
808
|
+
for (const name of registeredDuringFinalization) {
|
|
809
|
+
registeredDirectTools.delete(name);
|
|
810
|
+
registeredDirectToolServers.delete(name);
|
|
811
|
+
registeredDirectToolVersions.delete(name);
|
|
812
|
+
registeredNamespaceProxyTools.delete(name);
|
|
813
|
+
}
|
|
814
|
+
if (registeredDuringFinalization.has("mcp")) {
|
|
815
|
+
proxyToolRegistered = false;
|
|
816
|
+
proxyToolDescription = null;
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
if (statusPublicationAttempted && generation === lifecycleGeneration && currentOwner === owner) {
|
|
820
|
+
publishMcpStatusShutdown(nextState.statusEvents);
|
|
821
|
+
}
|
|
822
|
+
if (generation === lifecycleGeneration && currentOwner === owner) {
|
|
823
|
+
try {
|
|
824
|
+
await shutdownState(nextState, staleReason, false);
|
|
825
|
+
} catch (cleanupError) {
|
|
826
|
+
console.error(`MCP: failed to clean interrupted initialization state: ${formatTerminalError(cleanupError)}`);
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
throw error;
|
|
830
|
+
} finally {
|
|
831
|
+
if (finalizationGuard === guard)
|
|
832
|
+
finalizationGuard = null;
|
|
833
|
+
if (finalizationRegistrations === registeredDuringFinalization)
|
|
834
|
+
finalizationRegistrations = null;
|
|
470
835
|
}
|
|
836
|
+
});
|
|
837
|
+
initPromise = promise;
|
|
838
|
+
return promise.then(() => {
|
|
839
|
+
return;
|
|
471
840
|
}).catch(async (err) => {
|
|
472
841
|
if (!owner.isActive() || generation !== lifecycleGeneration) {
|
|
473
842
|
return;
|
|
474
843
|
}
|
|
475
|
-
if (initPromise !== promise
|
|
844
|
+
if (initPromise !== promise)
|
|
476
845
|
return;
|
|
477
|
-
}
|
|
478
846
|
const message = retainInitFailure(err);
|
|
479
847
|
console.error(`MCP initialization failed: ${message}`);
|
|
480
848
|
initPromise = null;
|
|
849
|
+
initStartedPromise = null;
|
|
481
850
|
if (state)
|
|
482
851
|
return;
|
|
483
852
|
try {
|
|
484
853
|
await Promise.all([
|
|
485
854
|
owner.stop("MCP initialization failed"),
|
|
486
|
-
shutdownOAuth(oauthRuntime)
|
|
855
|
+
oauthRuntime ? loadOAuthRuntime().then(({ shutdownOAuth }) => shutdownOAuth(oauthRuntime)) : Promise.resolve()
|
|
487
856
|
]);
|
|
488
857
|
} catch (error) {
|
|
489
858
|
console.error(`MCP: failed to clean rejected initialization: ${formatTerminalError(error)}`);
|
|
490
859
|
}
|
|
491
860
|
});
|
|
492
861
|
}
|
|
862
|
+
function ensureSessionRuntime(ctx) {
|
|
863
|
+
if (state)
|
|
864
|
+
return Promise.resolve(state);
|
|
865
|
+
if (initPromise)
|
|
866
|
+
return initPromise;
|
|
867
|
+
const owner = currentOwner?.isActive() ? currentOwner : createMcpRuntimeOwner();
|
|
868
|
+
if (owner !== currentOwner)
|
|
869
|
+
currentOwner = owner;
|
|
870
|
+
const generation = currentOwner === owner && lifecycleGeneration > 0 ? lifecycleGeneration : ++lifecycleGeneration;
|
|
871
|
+
startInitialization(ctx, owner, generation, "stale_first_operation_initialization");
|
|
872
|
+
return initPromise;
|
|
873
|
+
}
|
|
493
874
|
function startLoadTimeInitialization() {
|
|
494
|
-
const hasStartupServer = Object.values(earlyConfig.mcpServers).some((definition) => {
|
|
495
|
-
if (definition.disabled === true)
|
|
496
|
-
return false;
|
|
497
|
-
return definition.lifecycle === "eager" || definition.lifecycle === "keep-alive";
|
|
498
|
-
});
|
|
499
875
|
if (!hasStartupServer)
|
|
500
876
|
return;
|
|
501
877
|
setImmediate(() => {
|
|
@@ -503,9 +879,8 @@ function installMcpAdapter(pi, options) {
|
|
|
503
879
|
return;
|
|
504
880
|
const generation = ++lifecycleGeneration;
|
|
505
881
|
const owner = createMcpRuntimeOwner();
|
|
506
|
-
const oauthRuntime = createOAuthRuntime(owner.signal);
|
|
507
882
|
currentOwner = owner;
|
|
508
|
-
currentOAuthRuntime =
|
|
883
|
+
currentOAuthRuntime = null;
|
|
509
884
|
startInitialization({
|
|
510
885
|
mode: "print",
|
|
511
886
|
hasUI: false,
|
|
@@ -513,40 +888,101 @@ function installMcpAdapter(pi, options) {
|
|
|
513
888
|
model: undefined,
|
|
514
889
|
modelRegistry: undefined,
|
|
515
890
|
signal: undefined
|
|
516
|
-
}, owner,
|
|
891
|
+
}, owner, generation, "stale_load_time_initialization");
|
|
517
892
|
});
|
|
518
893
|
}
|
|
894
|
+
pi.on("resources_discover", (event) => {
|
|
895
|
+
const resourceConfig = programmaticConfig ? cloneMcpConfig(sessionConfig) : loadMcpConfig(earlyConfigPath, event.cwd);
|
|
896
|
+
const skillPaths = discoverConfiguredClaudePluginSkills(resourceConfig, event.cwd);
|
|
897
|
+
if (earlyConfig.settings?.scriptMode !== false) {
|
|
898
|
+
const scriptingSkillPath = fileURLToPath(new URL("./skills/mcp-scripting/SKILL.md", import.meta.url));
|
|
899
|
+
if (existsSync(scriptingSkillPath) && !skillPaths.includes(scriptingSkillPath)) {
|
|
900
|
+
skillPaths.push(scriptingSkillPath);
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
return skillPaths.length > 0 ? { skillPaths } : undefined;
|
|
904
|
+
});
|
|
519
905
|
pi.on("session_start", async (_event, ctx) => {
|
|
906
|
+
searchActivatedTools.clear();
|
|
907
|
+
holdLazyToolsInactive();
|
|
520
908
|
const generation = ++lifecycleGeneration;
|
|
909
|
+
largeDirectToolsAdvisoryDelivered = false;
|
|
521
910
|
const previousState = state;
|
|
522
911
|
const previousOwner = currentOwner;
|
|
523
912
|
const previousOAuthRuntime = currentOAuthRuntime;
|
|
524
913
|
const owner = createMcpRuntimeOwner();
|
|
525
|
-
const oauthRuntime = createOAuthRuntime(owner.signal);
|
|
526
914
|
currentOwner = owner;
|
|
527
|
-
currentOAuthRuntime =
|
|
915
|
+
currentOAuthRuntime = null;
|
|
528
916
|
state = null;
|
|
529
917
|
initPromise = null;
|
|
918
|
+
initStartedPromise = null;
|
|
530
919
|
clearRetainedInitFailure();
|
|
531
920
|
const stopPrevious = previousOwner?.stop("MCP extension session restarted") ?? Promise.resolve();
|
|
532
921
|
try {
|
|
533
922
|
await Promise.all([
|
|
534
923
|
stopPrevious,
|
|
535
924
|
shutdownState(previousState, "session_restart"),
|
|
536
|
-
previousOAuthRuntime ? shutdownOAuth(previousOAuthRuntime) : Promise.resolve()
|
|
925
|
+
previousOAuthRuntime ? loadOAuthRuntime().then(({ shutdownOAuth }) => shutdownOAuth(previousOAuthRuntime)) : Promise.resolve()
|
|
537
926
|
]);
|
|
538
927
|
} catch (error) {
|
|
539
928
|
console.error(`MCP: failed to shut down previous session state: ${formatTerminalError(error)}`);
|
|
540
929
|
}
|
|
541
930
|
if (generation !== lifecycleGeneration || !owner.isActive())
|
|
542
931
|
return;
|
|
543
|
-
|
|
932
|
+
if (state)
|
|
933
|
+
return;
|
|
934
|
+
if (!initPromise) {
|
|
935
|
+
const deferredSnapshot = getDeferredSessionSnapshot(ctx.cwd);
|
|
936
|
+
if (deferredSnapshot) {
|
|
937
|
+
const { config, cache, enabledServerCount } = deferredSnapshot;
|
|
938
|
+
const directResult = syncDirectTools(config, cache);
|
|
939
|
+
syncProxyTool(config, cache, directResult.specs);
|
|
940
|
+
syncNamespaceTools(config, cache, directResult.reservedDirectNames, directResult.activeDirectNames);
|
|
941
|
+
if (config.settings?.deferWithMissingMetadata !== true) {
|
|
942
|
+
registerPromptCommands(resolveCachedPrompts(config));
|
|
943
|
+
}
|
|
944
|
+
deliverLargeDirectToolsAdvisory(ctx, config, directResult.specs);
|
|
945
|
+
if (generation !== lifecycleGeneration || !owner.isActive() || currentOwner !== owner)
|
|
946
|
+
return;
|
|
947
|
+
const serverCount = Object.keys(config.mcpServers).length;
|
|
948
|
+
const formattedStatus = formatMcpFooterStatus(config, enabledServerCount, serverCount - enabledServerCount, 0);
|
|
949
|
+
const theme = ctx.ui?.theme;
|
|
950
|
+
const styledStatus = formattedStatus !== undefined && typeof theme?.fg === "function" ? theme.fg("accent", formattedStatus) : formattedStatus;
|
|
951
|
+
ctx.ui?.setStatus("mcp", styledStatus);
|
|
952
|
+
return;
|
|
953
|
+
}
|
|
954
|
+
startInitialization(ctx, owner, generation, "stale_session_start");
|
|
955
|
+
}
|
|
956
|
+
const initialization = initPromise;
|
|
957
|
+
const initializationStarted = initStartedPromise;
|
|
544
958
|
if (envRaw !== undefined && envRaw !== "__none__") {
|
|
545
959
|
const missingEnvDirectTools = getMissingConfiguredDirectToolServers(earlyConfig, loadMetadataCache(), envDirectToolOverride);
|
|
546
960
|
if (missingEnvDirectTools.length > 0) {
|
|
547
|
-
await initialization
|
|
961
|
+
await initialization?.then(() => {
|
|
962
|
+
return;
|
|
963
|
+
}, () => {
|
|
964
|
+
return;
|
|
965
|
+
});
|
|
966
|
+
return;
|
|
548
967
|
}
|
|
549
968
|
}
|
|
969
|
+
await initializationStarted;
|
|
970
|
+
});
|
|
971
|
+
pi.on("before_agent_start", holdLazyToolsInactive);
|
|
972
|
+
pi.on("session_tree", (_event, ctx) => {
|
|
973
|
+
const currentState = state;
|
|
974
|
+
const owner = currentOwner;
|
|
975
|
+
if (!currentState || !owner?.isActive() || !currentState.sessionManager)
|
|
976
|
+
return;
|
|
977
|
+
let sessionManager;
|
|
978
|
+
try {
|
|
979
|
+
sessionManager = ctx.sessionManager;
|
|
980
|
+
} catch {
|
|
981
|
+
return;
|
|
982
|
+
}
|
|
983
|
+
if (sessionManager !== currentState.sessionManager)
|
|
984
|
+
return;
|
|
985
|
+
restoreCurrentSessionApprovals(currentState);
|
|
550
986
|
});
|
|
551
987
|
pi.on("input", async () => {
|
|
552
988
|
const inputOwner = currentOwner;
|
|
@@ -579,13 +1015,14 @@ function installMcpAdapter(pi, options) {
|
|
|
579
1015
|
currentOAuthRuntime = null;
|
|
580
1016
|
state = null;
|
|
581
1017
|
initPromise = null;
|
|
1018
|
+
initStartedPromise = null;
|
|
582
1019
|
clearRetainedInitFailure();
|
|
583
1020
|
const stopOwner = owner?.stop("MCP extension session shutdown") ?? Promise.resolve();
|
|
584
1021
|
try {
|
|
585
1022
|
await Promise.all([
|
|
586
1023
|
stopOwner,
|
|
587
1024
|
shutdownState(currentState, "session_shutdown"),
|
|
588
|
-
oauthRuntime ? shutdownOAuth(oauthRuntime) : Promise.resolve()
|
|
1025
|
+
oauthRuntime ? loadOAuthRuntime().then(({ shutdownOAuth }) => shutdownOAuth(oauthRuntime)) : Promise.resolve()
|
|
589
1026
|
]);
|
|
590
1027
|
} catch (error) {
|
|
591
1028
|
console.error(`MCP: session shutdown cleanup failed: ${formatTerminalError(error)}`);
|
|
@@ -603,6 +1040,8 @@ function installMcpAdapter(pi, options) {
|
|
|
603
1040
|
{ value: "tools", label: "tools — List all tools" },
|
|
604
1041
|
{ value: "prompts", label: "prompts — List all MCP prompts" },
|
|
605
1042
|
{ value: "setup", label: "setup — Configure MCP servers" },
|
|
1043
|
+
{ value: "jev", label: "jev setup — Configure Jev semantic search" },
|
|
1044
|
+
{ value: "edit", label: "edit — Edit .mcp.json or the global config" },
|
|
606
1045
|
{ value: "logout", label: "logout — Clear server credentials" },
|
|
607
1046
|
{ value: "token", label: "token — Manage stored bearer tokens" },
|
|
608
1047
|
{ value: "disable", label: "disable — Disable a server" },
|
|
@@ -612,8 +1051,12 @@ function installMcpAdapter(pi, options) {
|
|
|
612
1051
|
return subcommands.length > 0 ? subcommands : null;
|
|
613
1052
|
}
|
|
614
1053
|
const [, subcommand, argumentPrefix] = argumentMatch;
|
|
615
|
-
if (subcommand
|
|
1054
|
+
if (subcommand === "jev") {
|
|
1055
|
+
return "setup".startsWith((argumentPrefix ?? "").trimStart()) ? [{ value: "jev setup", label: "setup — Configure Jev semantic search" }] : null;
|
|
1056
|
+
}
|
|
1057
|
+
if (subcommand !== "reconnect" && subcommand !== "logout" && subcommand !== "disable" && subcommand !== "enable" && subcommand !== "token" || argumentPrefix === undefined)
|
|
616
1058
|
return null;
|
|
1059
|
+
const completionConfig = state?.config ?? earlyConfig;
|
|
617
1060
|
if (subcommand === "token") {
|
|
618
1061
|
const tokenMatch = argumentPrefix.trimStart().match(/^(set|remove|status)\s+(.*)$/);
|
|
619
1062
|
if (!tokenMatch) {
|
|
@@ -622,28 +1065,22 @@ function installMcpAdapter(pi, options) {
|
|
|
622
1065
|
}
|
|
623
1066
|
const action = tokenMatch[1] ?? "";
|
|
624
1067
|
const serverPrefix = tokenMatch[2] ?? "";
|
|
625
|
-
const servers = Object.keys(
|
|
1068
|
+
const servers = Object.keys(completionConfig.mcpServers).filter((serverName) => serverName.startsWith(serverPrefix.trimStart())).map((serverName) => ({ value: `token ${action} ${serverName}`, label: serverName }));
|
|
626
1069
|
return servers.length > 0 ? servers : null;
|
|
627
1070
|
}
|
|
628
|
-
const servers = Object.keys(
|
|
1071
|
+
const servers = Object.keys(completionConfig.mcpServers).filter((serverName) => serverName.startsWith(argumentPrefix.trimStart())).map((serverName) => ({ value: `${subcommand} ${serverName}`, label: serverName }));
|
|
629
1072
|
return servers.length > 0 ? servers : null;
|
|
630
1073
|
},
|
|
631
1074
|
handler: async (args, ctx) => {
|
|
632
|
-
|
|
1075
|
+
let commandOwner = currentOwner;
|
|
633
1076
|
const commandReload = typeof ctx.reload === "function" ? ctx.reload.bind(ctx) : async () => {};
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
hasUI: commandHasUI,
|
|
637
|
-
ui: commandHasUI ? commandOwner ? createOwnedUi(ctx.ui, commandOwner) : ctx.ui : undefined,
|
|
638
|
-
cwd: ctx.cwd,
|
|
639
|
-
mode: ctx.mode,
|
|
640
|
-
signal: commandOwner?.signal ?? ctx.signal
|
|
641
|
-
};
|
|
642
|
-
if (!state && initPromise) {
|
|
1077
|
+
let commandCtx = createCommandContext(ctx, commandOwner);
|
|
1078
|
+
if (!state) {
|
|
643
1079
|
try {
|
|
644
|
-
|
|
1080
|
+
state = await ensureSessionRuntime(ctx);
|
|
1081
|
+
commandOwner = currentOwner;
|
|
1082
|
+
commandCtx = createCommandContext(ctx, commandOwner);
|
|
645
1083
|
commandOwner?.throwIfInactive();
|
|
646
|
-
state = initialized;
|
|
647
1084
|
} catch (error) {
|
|
648
1085
|
const message = error instanceof Error ? error.message : String(error);
|
|
649
1086
|
if (commandCtx.hasUI)
|
|
@@ -656,6 +1093,18 @@ function installMcpAdapter(pi, options) {
|
|
|
656
1093
|
commandCtx.ui?.notify("MCP not initialized", "error");
|
|
657
1094
|
return;
|
|
658
1095
|
}
|
|
1096
|
+
const commandGuard = captureRuntimeGuard(state);
|
|
1097
|
+
let commands;
|
|
1098
|
+
try {
|
|
1099
|
+
commands = await loadForRuntime(loadCommands, commandGuard);
|
|
1100
|
+
} catch (error) {
|
|
1101
|
+
if (commandGuard.owner && isOwnerAbortError(error, commandGuard.owner))
|
|
1102
|
+
return;
|
|
1103
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
1104
|
+
if (commandCtx.hasUI)
|
|
1105
|
+
commandCtx.ui?.notify(`MCP initialization failed: ${message}`, "error");
|
|
1106
|
+
return;
|
|
1107
|
+
}
|
|
659
1108
|
const parts = args?.trim()?.split(/\s+/) ?? [];
|
|
660
1109
|
const subcommand = parts[0] ?? "";
|
|
661
1110
|
const targetServer = parts[1];
|
|
@@ -663,13 +1112,13 @@ function installMcpAdapter(pi, options) {
|
|
|
663
1112
|
switch (subcommand) {
|
|
664
1113
|
case "reconnect":
|
|
665
1114
|
commandOwner?.throwIfInactive();
|
|
666
|
-
await reconnectServers(state, commandCtx, targetServer);
|
|
1115
|
+
await commands.reconnectServers(state, commandCtx, targetServer);
|
|
667
1116
|
break;
|
|
668
1117
|
case "tools":
|
|
669
|
-
await showTools(state, commandCtx);
|
|
1118
|
+
await commands.showTools(state, commandCtx);
|
|
670
1119
|
break;
|
|
671
1120
|
case "prompts":
|
|
672
|
-
await showPrompts(state, commandCtx);
|
|
1121
|
+
await commands.showPrompts(state, commandCtx);
|
|
673
1122
|
break;
|
|
674
1123
|
case "setup": {
|
|
675
1124
|
commandOwner?.throwIfInactive();
|
|
@@ -677,7 +1126,7 @@ function installMcpAdapter(pi, options) {
|
|
|
677
1126
|
commandCtx.ui?.notify("MCP setup is unavailable when config is supplied by createMcpAdapter().", "info");
|
|
678
1127
|
break;
|
|
679
1128
|
}
|
|
680
|
-
const result = await openMcpSetup(state, pi, commandCtx, earlyConfigPath, "setup");
|
|
1129
|
+
const result = await commands.openMcpSetup(state, pi, commandCtx, earlyConfigPath, "setup");
|
|
681
1130
|
if (result?.configChanged) {
|
|
682
1131
|
commandOwner?.throwIfInactive();
|
|
683
1132
|
await commandReload();
|
|
@@ -685,6 +1134,41 @@ function installMcpAdapter(pi, options) {
|
|
|
685
1134
|
}
|
|
686
1135
|
break;
|
|
687
1136
|
}
|
|
1137
|
+
case "jev": {
|
|
1138
|
+
if (parts[1] !== "setup" || parts.length !== 2) {
|
|
1139
|
+
commandCtx.ui?.notify("Usage: /mcp jev setup", "error");
|
|
1140
|
+
break;
|
|
1141
|
+
}
|
|
1142
|
+
if (programmaticConfig) {
|
|
1143
|
+
commandCtx.ui?.notify("Jev setup is unavailable when config is supplied by createMcpAdapter().", "info");
|
|
1144
|
+
break;
|
|
1145
|
+
}
|
|
1146
|
+
commandOwner?.throwIfInactive();
|
|
1147
|
+
if (await commands.setupJevSemanticSearch(state, commandCtx, earlyConfigPath)) {
|
|
1148
|
+
commandOwner?.throwIfInactive();
|
|
1149
|
+
await commandReload();
|
|
1150
|
+
return;
|
|
1151
|
+
}
|
|
1152
|
+
break;
|
|
1153
|
+
}
|
|
1154
|
+
case "edit": {
|
|
1155
|
+
if (programmaticConfig) {
|
|
1156
|
+
commandCtx.ui?.notify("MCP edit is unavailable when config is supplied by createMcpAdapter().", "info");
|
|
1157
|
+
break;
|
|
1158
|
+
}
|
|
1159
|
+
const target = parts[1] ?? "project";
|
|
1160
|
+
if (target !== "project" && target !== "global") {
|
|
1161
|
+
commandCtx.ui?.notify("Usage: /mcp edit [project|global]", "error");
|
|
1162
|
+
return;
|
|
1163
|
+
}
|
|
1164
|
+
commandOwner?.throwIfInactive();
|
|
1165
|
+
if (await commands.editSharedConfig(commandCtx, target)) {
|
|
1166
|
+
commandOwner?.throwIfInactive();
|
|
1167
|
+
await commandReload();
|
|
1168
|
+
return;
|
|
1169
|
+
}
|
|
1170
|
+
break;
|
|
1171
|
+
}
|
|
688
1172
|
case "logout": {
|
|
689
1173
|
const serverName = rest;
|
|
690
1174
|
if (!serverName) {
|
|
@@ -693,7 +1177,7 @@ function installMcpAdapter(pi, options) {
|
|
|
693
1177
|
return;
|
|
694
1178
|
}
|
|
695
1179
|
commandOwner?.throwIfInactive();
|
|
696
|
-
await logoutServer(serverName, state, commandCtx);
|
|
1180
|
+
await commands.logoutServer(serverName, state, commandCtx);
|
|
697
1181
|
break;
|
|
698
1182
|
}
|
|
699
1183
|
case "token": {
|
|
@@ -710,7 +1194,7 @@ function installMcpAdapter(pi, options) {
|
|
|
710
1194
|
return;
|
|
711
1195
|
}
|
|
712
1196
|
commandOwner?.throwIfInactive();
|
|
713
|
-
await manageBearerToken(action, serverName, state, commandCtx);
|
|
1197
|
+
await commands.manageBearerToken(action, serverName, state, commandCtx);
|
|
714
1198
|
break;
|
|
715
1199
|
}
|
|
716
1200
|
case "disable":
|
|
@@ -744,10 +1228,10 @@ function installMcpAdapter(pi, options) {
|
|
|
744
1228
|
commandOwner?.throwIfInactive();
|
|
745
1229
|
if (programmaticConfig) {
|
|
746
1230
|
commandCtx.ui?.notify("MCP status is shown from the in-memory SDK config; configuration discovery is unavailable.", "info");
|
|
747
|
-
await showStatus(state, commandCtx);
|
|
1231
|
+
await commands.showStatus(state, commandCtx);
|
|
748
1232
|
break;
|
|
749
1233
|
}
|
|
750
|
-
const result = await openMcpPanel(state, pi, commandCtx, earlyConfigPath, (changes) => {
|
|
1234
|
+
const result = await commands.openMcpPanel(state, pi, commandCtx, earlyConfigPath, (changes) => {
|
|
751
1235
|
applyDirectToolConfigChanges(changes);
|
|
752
1236
|
syncToolSurface(commandCtx);
|
|
753
1237
|
});
|
|
@@ -757,7 +1241,7 @@ function installMcpAdapter(pi, options) {
|
|
|
757
1241
|
return;
|
|
758
1242
|
}
|
|
759
1243
|
} else {
|
|
760
|
-
await showStatus(state, commandCtx);
|
|
1244
|
+
await commands.showStatus(state, commandCtx);
|
|
761
1245
|
}
|
|
762
1246
|
break;
|
|
763
1247
|
}
|
|
@@ -769,24 +1253,18 @@ function installMcpAdapter(pi, options) {
|
|
|
769
1253
|
pi.registerCommand("mcp-auth", {
|
|
770
1254
|
description: "Authenticate with an MCP server (OAuth)",
|
|
771
1255
|
handler: async (args, ctx) => {
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
const commandCtx = {
|
|
775
|
-
hasUI: commandHasUI,
|
|
776
|
-
ui: commandHasUI ? commandOwner ? createOwnedUi(ctx.ui, commandOwner) : ctx.ui : undefined,
|
|
777
|
-
cwd: ctx.cwd,
|
|
778
|
-
mode: ctx.mode,
|
|
779
|
-
signal: commandOwner?.signal ?? ctx.signal
|
|
780
|
-
};
|
|
1256
|
+
let commandOwner = currentOwner;
|
|
1257
|
+
let commandCtx = createCommandContext(ctx, commandOwner);
|
|
781
1258
|
const serverName = args?.trim();
|
|
782
1259
|
if (!serverName && !commandCtx.hasUI) {
|
|
783
1260
|
return;
|
|
784
1261
|
}
|
|
785
|
-
if (!state
|
|
1262
|
+
if (!state) {
|
|
786
1263
|
try {
|
|
787
|
-
|
|
1264
|
+
state = await ensureSessionRuntime(ctx);
|
|
1265
|
+
commandOwner = currentOwner;
|
|
1266
|
+
commandCtx = createCommandContext(ctx, commandOwner);
|
|
788
1267
|
commandOwner?.throwIfInactive();
|
|
789
|
-
state = initialized;
|
|
790
1268
|
} catch (error) {
|
|
791
1269
|
const message = error instanceof Error ? error.message : String(error);
|
|
792
1270
|
if (commandCtx.hasUI)
|
|
@@ -799,18 +1277,30 @@ function installMcpAdapter(pi, options) {
|
|
|
799
1277
|
commandCtx.ui?.notify("MCP not initialized", "error");
|
|
800
1278
|
return;
|
|
801
1279
|
}
|
|
1280
|
+
const commandGuard = captureRuntimeGuard(state);
|
|
1281
|
+
let commands;
|
|
1282
|
+
try {
|
|
1283
|
+
commands = await loadForRuntime(loadCommands, commandGuard);
|
|
1284
|
+
} catch (error) {
|
|
1285
|
+
if (commandGuard.owner && isOwnerAbortError(error, commandGuard.owner))
|
|
1286
|
+
return;
|
|
1287
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
1288
|
+
if (commandCtx.hasUI)
|
|
1289
|
+
commandCtx.ui?.notify(`MCP initialization failed: ${message}`, "error");
|
|
1290
|
+
return;
|
|
1291
|
+
}
|
|
802
1292
|
if (!serverName) {
|
|
803
1293
|
if (programmaticConfig) {
|
|
804
1294
|
commandCtx.ui?.notify("Use /mcp-auth <server> to authenticate a server from the in-memory SDK config.", "info");
|
|
805
1295
|
return;
|
|
806
1296
|
}
|
|
807
|
-
await openMcpAuthPanel(state, pi, commandCtx, earlyConfigPath);
|
|
1297
|
+
await commands.openMcpAuthPanel(state, pi, commandCtx, earlyConfigPath);
|
|
808
1298
|
return;
|
|
809
1299
|
}
|
|
810
|
-
const result = await authenticateServer(serverName, state.config, commandCtx, commandCtx.signal, state.oauthRuntime);
|
|
1300
|
+
const result = await commands.authenticateServer(serverName, state.config, commandCtx, commandCtx.signal, state.oauthRuntime);
|
|
811
1301
|
if (result.ok) {
|
|
812
1302
|
commandOwner?.throwIfInactive();
|
|
813
|
-
await reconnectServer(state, commandCtx, serverName);
|
|
1303
|
+
await commands.reconnectServer(state, commandCtx, serverName);
|
|
814
1304
|
}
|
|
815
1305
|
}
|
|
816
1306
|
});
|
|
@@ -818,7 +1308,7 @@ function installMcpAdapter(pi, options) {
|
|
|
818
1308
|
pi.registerTool({
|
|
819
1309
|
name: "mcpScript",
|
|
820
1310
|
label: "MCP Script",
|
|
821
|
-
description: "Run trusted JavaScript that makes multiple MCP tool calls in one request — loop, filter, chain, or fan out between calls. For a single MCP call, search, describe, status check, or auth action, use the mcp tool instead. Discover with await tools.search({ query }) — resolves to { items: [{ path, name, server, description? }], total, hasMore, nextOffset }, not an { ok, data } envelope. Inspect with await tools.describe({ path }) — resolves to the tool descriptor with inputTypeScript, or { path, error: { code, message, suggestions } }. Then call tools.call(path, args) — resolves to { ok: true, data } or { ok: false, error: { code, message } } — or use direct flat calls when the name is already known; use emit(value) for user-visible output.
|
|
1311
|
+
description: "Run trusted JavaScript that makes multiple MCP tool calls in one request — loop, filter, chain, or fan out between calls. For a single MCP call, search, describe, status check, or auth action, use the mcp tool instead. Discover with await tools.search({ query }) — resolves to { items: [{ path, name, server, description? }], total, hasMore, nextOffset }, not an { ok, data } envelope. Inspect with await tools.describe({ path }) — resolves to the tool descriptor with inputTypeScript, or { path, error: { code, message, suggestions } }. Then call tools.call(path, args) — resolves to { ok: true, data } or { ok: false, error: { code, message } } — or use direct flat calls when the name is already known; use emit(value) for user-visible output.",
|
|
822
1312
|
promptSnippet: "Batch multiple MCP tool calls in one JavaScript request (loop, filter, chain)",
|
|
823
1313
|
parameters: Type.Object({
|
|
824
1314
|
code: Type.String({ description: "Trusted JavaScript MCP script. Use tools.<prefixedToolName>(args) and emit(value)." }),
|
|
@@ -826,17 +1316,18 @@ function installMcpAdapter(pi, options) {
|
|
|
826
1316
|
}),
|
|
827
1317
|
renderCall: createMcpScriptToolCallRenderer(toolRenderOptions),
|
|
828
1318
|
renderResult: renderMcpToolResult,
|
|
829
|
-
async execute(_toolCallId, params, signal) {
|
|
830
|
-
|
|
831
|
-
if (!state
|
|
1319
|
+
async execute(_toolCallId, params, signal, _onUpdate, ctx) {
|
|
1320
|
+
let executeOwner = currentOwner;
|
|
1321
|
+
if (!state) {
|
|
832
1322
|
try {
|
|
833
|
-
const initialized = await awaitWithTimeout(
|
|
1323
|
+
const initialized = await awaitWithTimeout(ensureSessionRuntime(ctx), INIT_WAIT_TIMEOUT_MS);
|
|
834
1324
|
if (initialized === INIT_WAIT_TIMED_OUT) {
|
|
835
1325
|
return {
|
|
836
1326
|
content: [{ type: "text", text: "MCP initialization is still in progress. Try again shortly." }],
|
|
837
1327
|
details: { mode: "script", error: "init_timeout", timeoutMs: INIT_WAIT_TIMEOUT_MS }
|
|
838
1328
|
};
|
|
839
1329
|
}
|
|
1330
|
+
executeOwner = currentOwner;
|
|
840
1331
|
executeOwner?.throwIfInactive();
|
|
841
1332
|
state = initialized;
|
|
842
1333
|
} catch (error) {
|
|
@@ -856,16 +1347,231 @@ function installMcpAdapter(pi, options) {
|
|
|
856
1347
|
};
|
|
857
1348
|
}
|
|
858
1349
|
executeOwner?.throwIfInactive();
|
|
859
|
-
|
|
1350
|
+
const scriptState = state;
|
|
1351
|
+
const scriptGuard = captureRuntimeGuard(scriptState);
|
|
1352
|
+
const codeMode = await loadForRuntime(loadCodeMode, scriptGuard);
|
|
1353
|
+
return codeMode.runMcpScript(scriptState, params.code, params.timeoutMs, getPiTools, signal);
|
|
860
1354
|
}
|
|
861
1355
|
});
|
|
862
1356
|
}
|
|
1357
|
+
async function connectAndReport(targetState, serverName, signal, ctx) {
|
|
1358
|
+
const guard = captureRuntimeGuard(targetState);
|
|
1359
|
+
const directToolsBefore = new Map([...registeredDirectTools.keys()].map((name) => [name, registeredDirectToolVersions.get(name) ?? 0]));
|
|
1360
|
+
const proxyModes = await loadForRuntime(loadProxyModes, guard);
|
|
1361
|
+
const result = await proxyModes.executeConnect(targetState, serverName, signal);
|
|
1362
|
+
assertRuntimeGuard(guard);
|
|
1363
|
+
if (!directToolsFrozen)
|
|
1364
|
+
syncToolSurface(ctx);
|
|
1365
|
+
const reportedNames = reportedDirectToolNamesByServer.get(serverName) ?? new Set;
|
|
1366
|
+
const addedToolNames = [...registeredDirectTools.keys()].filter((name) => (!directToolsBefore.has(name) || (registeredDirectToolVersions.get(name) ?? 0) !== directToolsBefore.get(name)) && registeredDirectToolServers.get(name) === serverName && !reportedNames.has(name) && !lazyDirectTools.has(name));
|
|
1367
|
+
if (addedToolNames.length === 0)
|
|
1368
|
+
return result;
|
|
1369
|
+
for (const name of addedToolNames)
|
|
1370
|
+
reportedNames.add(name);
|
|
1371
|
+
reportedDirectToolNamesByServer.set(serverName, reportedNames);
|
|
1372
|
+
return { ...result, addedToolNames };
|
|
1373
|
+
}
|
|
1374
|
+
async function executeInstall(targetState, rawUrl, requestedName, target, cwd, signal) {
|
|
1375
|
+
const installOwner = currentOwner;
|
|
1376
|
+
signal?.throwIfAborted();
|
|
1377
|
+
installOwner?.throwIfInactive();
|
|
1378
|
+
if (programmaticConfig) {
|
|
1379
|
+
return {
|
|
1380
|
+
content: [{ type: "text", text: "MCP install is unavailable when the adapter uses programmatic configuration." }],
|
|
1381
|
+
details: { mode: "install", error: "programmatic_config" }
|
|
1382
|
+
};
|
|
1383
|
+
}
|
|
1384
|
+
if (targetState.config.settings?.allowInstall === false) {
|
|
1385
|
+
return {
|
|
1386
|
+
content: [{ type: "text", text: "MCP install is disabled by configuration." }],
|
|
1387
|
+
details: { mode: "install", error: "install_disabled" }
|
|
1388
|
+
};
|
|
1389
|
+
}
|
|
1390
|
+
if (target !== undefined && target !== "global" && target !== "project") {
|
|
1391
|
+
return {
|
|
1392
|
+
content: [{ type: "text", text: "MCP install target must be 'global' or 'project'." }],
|
|
1393
|
+
details: { mode: "install", error: "invalid_target" }
|
|
1394
|
+
};
|
|
1395
|
+
}
|
|
1396
|
+
const destination = target === "project" ? getProjectConfigPath(cwd) : getPiGlobalConfigPath(earlyConfigPath);
|
|
1397
|
+
if (target === "project" && process.env.PI_MCP_CONFIG_MODE?.trim().toLowerCase() === "exclusive" && resolve(destination) !== resolve(getPiGlobalConfigPath(earlyConfigPath))) {
|
|
1398
|
+
return {
|
|
1399
|
+
content: [{ type: "text", text: "Project installation is unavailable in exclusive config mode; use the global target." }],
|
|
1400
|
+
details: { mode: "install", error: "inactive_target" }
|
|
1401
|
+
};
|
|
1402
|
+
}
|
|
1403
|
+
const installGuard = captureRuntimeGuard(targetState);
|
|
1404
|
+
const installParsing = await loadForRuntime(loadInstallParsing, installGuard);
|
|
1405
|
+
let normalized;
|
|
1406
|
+
try {
|
|
1407
|
+
normalized = installParsing.normalizeMcpInstallRequest({
|
|
1408
|
+
url: rawUrl ?? "",
|
|
1409
|
+
...requestedName !== undefined ? { serverName: requestedName } : {}
|
|
1410
|
+
});
|
|
1411
|
+
} catch (error) {
|
|
1412
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
1413
|
+
return {
|
|
1414
|
+
content: [{ type: "text", text: `Failed to install MCP server: ${message}` }],
|
|
1415
|
+
details: { mode: "install", error: "invalid_request", message }
|
|
1416
|
+
};
|
|
1417
|
+
}
|
|
1418
|
+
const matchingUrl = Object.entries(targetState.config.mcpServers).find(([, definition]) => definition.url !== undefined && installParsing.canonicalMcpServerUrl(definition.url) === normalized.url);
|
|
1419
|
+
const serverName = requestedName?.trim() || matchingUrl?.[0] || normalized.serverName;
|
|
1420
|
+
const existing = targetState.config.mcpServers[serverName];
|
|
1421
|
+
if (existing && installParsing.canonicalMcpServerUrl(existing.url ?? "") !== normalized.url) {
|
|
1422
|
+
return {
|
|
1423
|
+
content: [{ type: "text", text: `MCP server name "${serverName}" is already configured with a different endpoint.` }],
|
|
1424
|
+
details: { mode: "install", error: "name_conflict", server: serverName, url: normalized.url }
|
|
1425
|
+
};
|
|
1426
|
+
}
|
|
1427
|
+
if (targetState.provisionalInstalls?.has(serverName)) {
|
|
1428
|
+
return {
|
|
1429
|
+
content: [{ type: "text", text: `MCP server "${serverName}" is still being installed. Retry after that installation finishes.` }],
|
|
1430
|
+
details: { mode: "install", error: "install_in_progress", server: serverName }
|
|
1431
|
+
};
|
|
1432
|
+
}
|
|
1433
|
+
if (runtimeServers.has(serverName)) {
|
|
1434
|
+
return {
|
|
1435
|
+
content: [{ type: "text", text: `Runtime MCP server "${serverName}" cannot be promoted by URL install. Save its full definition manually.` }],
|
|
1436
|
+
details: { mode: "install", error: "runtime_promotion_unsupported", server: serverName }
|
|
1437
|
+
};
|
|
1438
|
+
}
|
|
1439
|
+
const persistedEntry = { url: normalized.url };
|
|
1440
|
+
const runtimeEntry = existing ?? { ...persistedEntry, directTools: false };
|
|
1441
|
+
const provisional = existing === undefined;
|
|
1442
|
+
const restoreMetadata = [
|
|
1443
|
+
targetState.toolMetadata,
|
|
1444
|
+
targetState.promptMetadata,
|
|
1445
|
+
targetState.serverInstructions,
|
|
1446
|
+
targetState.resourceCounts,
|
|
1447
|
+
targetState.directToolCounts
|
|
1448
|
+
].map((map) => {
|
|
1449
|
+
const previous = map.get(serverName);
|
|
1450
|
+
return () => {
|
|
1451
|
+
if (previous === undefined)
|
|
1452
|
+
map.delete(serverName);
|
|
1453
|
+
else
|
|
1454
|
+
map.set(serverName, previous);
|
|
1455
|
+
};
|
|
1456
|
+
});
|
|
1457
|
+
const hadLivePrompts = targetState.promptMetadataLive.has(serverName);
|
|
1458
|
+
const rollback = async () => {
|
|
1459
|
+
if (!provisional || targetState.config.mcpServers[serverName] !== runtimeEntry)
|
|
1460
|
+
return;
|
|
1461
|
+
delete targetState.config.mcpServers[serverName];
|
|
1462
|
+
targetState.lifecycle.unregisterServer(serverName);
|
|
1463
|
+
try {
|
|
1464
|
+
await targetState.manager.close(serverName);
|
|
1465
|
+
} finally {
|
|
1466
|
+
targetState.provisionalInstalls?.delete(serverName);
|
|
1467
|
+
for (const restore of restoreMetadata)
|
|
1468
|
+
restore();
|
|
1469
|
+
if (!hadLivePrompts)
|
|
1470
|
+
targetState.promptMetadataLive.delete(serverName);
|
|
1471
|
+
const core = await loadForRuntime(loadCoreRuntime, installGuard);
|
|
1472
|
+
core.clearFailure(targetState, serverName, "install-rollback");
|
|
1473
|
+
syncToolSurface();
|
|
1474
|
+
core.updateStatusBar(targetState);
|
|
1475
|
+
}
|
|
1476
|
+
};
|
|
1477
|
+
let connectResult;
|
|
1478
|
+
try {
|
|
1479
|
+
if (provisional) {
|
|
1480
|
+
(targetState.provisionalInstalls ??= new Set).add(serverName);
|
|
1481
|
+
targetState.config.mcpServers[serverName] = runtimeEntry;
|
|
1482
|
+
attachRuntimeServerLifecycle(targetState, serverName, runtimeEntry);
|
|
1483
|
+
syncToolSurface();
|
|
1484
|
+
(await loadForRuntime(loadCoreRuntime, installGuard)).updateStatusBar(targetState);
|
|
1485
|
+
}
|
|
1486
|
+
connectResult = await connectAndReport(targetState, serverName, signal);
|
|
1487
|
+
signal?.throwIfAborted();
|
|
1488
|
+
installOwner?.throwIfInactive();
|
|
1489
|
+
} catch (error) {
|
|
1490
|
+
await rollback();
|
|
1491
|
+
throw error;
|
|
1492
|
+
}
|
|
1493
|
+
const connectError = connectResult.details?.error;
|
|
1494
|
+
const connectText = connectResult.content.find((content) => content.type === "text")?.text;
|
|
1495
|
+
if (connectError && connectError !== "auth_required") {
|
|
1496
|
+
await rollback();
|
|
1497
|
+
return {
|
|
1498
|
+
...connectResult,
|
|
1499
|
+
content: [{ type: "text", text: `MCP installation validation failed for "${serverName}". ${connectText ?? "Connection failed."}` }],
|
|
1500
|
+
details: { mode: "install", error: "validation_failed", server: serverName, url: normalized.url }
|
|
1501
|
+
};
|
|
1502
|
+
}
|
|
1503
|
+
if (provisional) {
|
|
1504
|
+
try {
|
|
1505
|
+
await withFileMutationQueue(destination, async () => {
|
|
1506
|
+
signal?.throwIfAborted();
|
|
1507
|
+
installOwner?.throwIfInactive();
|
|
1508
|
+
writeSharedServerEntry(destination, serverName, persistedEntry);
|
|
1509
|
+
});
|
|
1510
|
+
} catch (error) {
|
|
1511
|
+
await rollback();
|
|
1512
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
1513
|
+
return {
|
|
1514
|
+
content: [{ type: "text", text: `MCP server validation succeeded, but configuration could not be saved: ${message}` }],
|
|
1515
|
+
details: { mode: "install", error: "persistence_failed", server: serverName, url: normalized.url, message }
|
|
1516
|
+
};
|
|
1517
|
+
}
|
|
1518
|
+
targetState.provisionalInstalls?.delete(serverName);
|
|
1519
|
+
try {
|
|
1520
|
+
(await loadForRuntime(loadCoreRuntime, installGuard)).updateMetadataCache(targetState, serverName);
|
|
1521
|
+
assertRuntimeGuard(installGuard);
|
|
1522
|
+
} catch (error) {
|
|
1523
|
+
if (isRuntimeGuardStale(installGuard) || isAbortError(error, installGuard.owner?.signal))
|
|
1524
|
+
throw error;
|
|
1525
|
+
logger.warn(`MCP: installed "${serverName}" but could not cache metadata: ${error}`);
|
|
1526
|
+
}
|
|
1527
|
+
syncPromptCommands();
|
|
1528
|
+
}
|
|
1529
|
+
if (connectError === "auth_required") {
|
|
1530
|
+
const proxyModes = await loadForRuntime(loadProxyModes, installGuard);
|
|
1531
|
+
const authResult = await proxyModes.executeAuthStart(targetState, serverName, signal);
|
|
1532
|
+
const authError = authResult.details?.error;
|
|
1533
|
+
const authText = authResult.content.find((content) => content.type === "text")?.text;
|
|
1534
|
+
return {
|
|
1535
|
+
...connectResult,
|
|
1536
|
+
content: [{
|
|
1537
|
+
type: "text",
|
|
1538
|
+
text: `${provisional ? "Installed" : "Found"} MCP server "${serverName}" at ${normalized.url}.
|
|
1539
|
+
|
|
1540
|
+
${authText ?? "OAuth authorization is required."}`
|
|
1541
|
+
}],
|
|
1542
|
+
details: {
|
|
1543
|
+
mode: "install",
|
|
1544
|
+
status: authError ? "auth_start_failed" : "awaiting_auth",
|
|
1545
|
+
server: serverName,
|
|
1546
|
+
url: normalized.url,
|
|
1547
|
+
...provisional ? { path: destination } : {},
|
|
1548
|
+
...authError ? { error: authError } : {}
|
|
1549
|
+
}
|
|
1550
|
+
};
|
|
1551
|
+
}
|
|
1552
|
+
return {
|
|
1553
|
+
...connectResult,
|
|
1554
|
+
content: [{
|
|
1555
|
+
type: "text",
|
|
1556
|
+
text: `${provisional ? "Installed and connected" : "Already installed; connected"} MCP server "${serverName}" at ${normalized.url}.
|
|
1557
|
+
|
|
1558
|
+
${connectText ?? ""}`.trim()
|
|
1559
|
+
}],
|
|
1560
|
+
details: {
|
|
1561
|
+
mode: "install",
|
|
1562
|
+
status: "connected",
|
|
1563
|
+
server: serverName,
|
|
1564
|
+
url: normalized.url,
|
|
1565
|
+
...provisional ? { path: destination } : {}
|
|
1566
|
+
}
|
|
1567
|
+
};
|
|
1568
|
+
}
|
|
863
1569
|
function registerProxyTool(description) {
|
|
864
|
-
pi.registerTool({
|
|
1570
|
+
callReentrant(() => pi.registerTool({
|
|
865
1571
|
name: "mcp",
|
|
866
1572
|
label: "MCP",
|
|
867
1573
|
description,
|
|
868
|
-
promptSnippet: "MCP gateway — status, search, describe, auth, and single MCP tool calls",
|
|
1574
|
+
promptSnippet: "MCP gateway — install by URL, status, search, describe, auth, and single MCP tool calls",
|
|
869
1575
|
renderShell: toolRenderShell,
|
|
870
1576
|
renderCall: createMcpProxyToolCallRenderer(toolRenderOptions),
|
|
871
1577
|
parameters: Type.Object({
|
|
@@ -881,12 +1587,15 @@ function installMcpAdapter(pi, options) {
|
|
|
881
1587
|
describe: Type.Optional(Type.String({ description: "Tool name to describe (shows parameters)" })),
|
|
882
1588
|
instructions: Type.Optional(Type.String({ description: "Server name to show that server's usage instructions" })),
|
|
883
1589
|
search: Type.Optional(Type.String({ description: "Search tools by name/description" })),
|
|
1590
|
+
searchMode: Type.Optional(Type.String({ enum: ["lexical", "semantic"], description: "Search backend (default: lexical; semantic is available when a System One key is configured)" })),
|
|
884
1591
|
regex: Type.Optional(Type.Boolean({ description: "Treat search as regex (default: substring match)" })),
|
|
885
1592
|
includeSchemas: Type.Optional(Type.Boolean({ description: "Include parameter schemas in search results (default: true)" })),
|
|
886
1593
|
limit: optionalNumber({ minimum: 1, description: "Maximum search results to return (default: 12)" }),
|
|
887
1594
|
offset: optionalNumber({ minimum: 0, description: "Search result offset (default: 0)" }),
|
|
888
|
-
server: Type.Optional(Type.String({ description: "
|
|
889
|
-
action: Type.Optional(Type.String({ description: "Action: 'ui-messages', 'auth-start', or 'auth-complete'" }))
|
|
1595
|
+
server: Type.Optional(Type.String({ description: "Server name: filters searches, disambiguates calls and describe operations, and optionally names an install" })),
|
|
1596
|
+
action: Type.Optional(Type.String({ description: "Action: 'install', 'ui-messages', 'auth-start', or 'auth-complete'" })),
|
|
1597
|
+
url: Type.Optional(Type.String({ description: "MCP endpoint URL for action: 'install'" })),
|
|
1598
|
+
target: Type.Optional(Type.String({ description: "Install target: 'global' (default) or 'project'" }))
|
|
890
1599
|
}),
|
|
891
1600
|
renderResult: renderMcpToolResult,
|
|
892
1601
|
async execute(_toolCallId, params, signal, _onUpdate, _ctx) {
|
|
@@ -914,12 +1623,15 @@ function installMcpAdapter(pi, options) {
|
|
|
914
1623
|
return args;
|
|
915
1624
|
};
|
|
916
1625
|
const parsedArgs = parseArgs(params.args);
|
|
917
|
-
const hasGatewayMode = (value) => value.tool !== undefined || value.connect !== undefined || value.describe !== undefined || value.instructions !== undefined || value.search !== undefined || value.server !== undefined || value.action !== undefined;
|
|
1626
|
+
const hasGatewayMode = (value) => value.tool !== undefined || value.connect !== undefined || value.describe !== undefined || value.instructions !== undefined || value.search !== undefined || value.server !== undefined || value.action !== undefined || value.url !== undefined || value.target !== undefined;
|
|
918
1627
|
if (!hasGatewayMode(params) && params.args !== undefined) {
|
|
919
1628
|
throw new Error('Gateway params were nested inside `args`; pass them top-level (for example, mcp({ search: "..." }) or mcp({ tool: "...", args: {} })).');
|
|
920
1629
|
}
|
|
921
|
-
if (!state && !initPromise
|
|
922
|
-
|
|
1630
|
+
if (!state && !initPromise) {
|
|
1631
|
+
if (retainedInitFailure)
|
|
1632
|
+
startGatewayRetryInitialization(_ctx);
|
|
1633
|
+
else
|
|
1634
|
+
ensureSessionRuntime(_ctx);
|
|
923
1635
|
executeOwner = currentOwner;
|
|
924
1636
|
}
|
|
925
1637
|
if (!state && initPromise) {
|
|
@@ -950,8 +1662,14 @@ function installMcpAdapter(pi, options) {
|
|
|
950
1662
|
};
|
|
951
1663
|
}
|
|
952
1664
|
executeOwner?.throwIfInactive();
|
|
1665
|
+
const proxyState = state;
|
|
1666
|
+
const proxyGuard = captureRuntimeGuard(proxyState);
|
|
1667
|
+
const proxyModes = await loadForRuntime(loadProxyModes, proxyGuard);
|
|
1668
|
+
if (params.action === "install") {
|
|
1669
|
+
return executeInstall(proxyState, params.url, params.server, params.target, _ctx.cwd, signal);
|
|
1670
|
+
}
|
|
953
1671
|
if (params.action === "ui-messages") {
|
|
954
|
-
return executeUiMessages(
|
|
1672
|
+
return proxyModes.executeUiMessages(proxyState);
|
|
955
1673
|
}
|
|
956
1674
|
if (params.action === "auth-start") {
|
|
957
1675
|
if (!params.server) {
|
|
@@ -960,7 +1678,7 @@ function installMcpAdapter(pi, options) {
|
|
|
960
1678
|
details: { mode: "auth-start", error: "missing_server" }
|
|
961
1679
|
};
|
|
962
1680
|
}
|
|
963
|
-
return signal ? executeAuthStart(
|
|
1681
|
+
return signal ? proxyModes.executeAuthStart(proxyState, params.server, signal) : proxyModes.executeAuthStart(proxyState, params.server);
|
|
964
1682
|
}
|
|
965
1683
|
if (params.action === "auth-complete") {
|
|
966
1684
|
if (!params.server) {
|
|
@@ -976,47 +1694,66 @@ function installMcpAdapter(pi, options) {
|
|
|
976
1694
|
details: { mode: "auth-complete", error: "missing_input" }
|
|
977
1695
|
};
|
|
978
1696
|
}
|
|
979
|
-
return signal ? executeAuthComplete(
|
|
1697
|
+
return signal ? proxyModes.executeAuthComplete(proxyState, params.server, input, signal) : proxyModes.executeAuthComplete(proxyState, params.server, input);
|
|
980
1698
|
}
|
|
981
1699
|
if (params.tool) {
|
|
982
|
-
return executeCall(
|
|
1700
|
+
return proxyModes.executeCall(proxyState, params.tool, parsedArgs, params.server, getPiTools, signal);
|
|
983
1701
|
}
|
|
984
1702
|
if (params.connect) {
|
|
985
|
-
|
|
986
|
-
if (!directToolsFrozen)
|
|
987
|
-
syncToolSurface(_ctx);
|
|
988
|
-
return result;
|
|
1703
|
+
return connectAndReport(proxyState, params.connect, signal, _ctx);
|
|
989
1704
|
}
|
|
990
1705
|
if (params.describe) {
|
|
991
|
-
return executeDescribe(
|
|
1706
|
+
return proxyModes.executeDescribe(proxyState, params.describe, params.server);
|
|
992
1707
|
}
|
|
993
1708
|
if (params.instructions) {
|
|
994
|
-
return executeInstructions(
|
|
1709
|
+
return proxyModes.executeInstructions(proxyState, params.instructions);
|
|
995
1710
|
}
|
|
996
1711
|
if (params.search !== undefined) {
|
|
997
|
-
|
|
1712
|
+
const result = await proxyModes.executeSearch(proxyState, params.search, params.regex, params.server, params.includeSchemas, params.limit, params.offset, params.searchMode, signal);
|
|
1713
|
+
assertRuntimeGuard(proxyGuard);
|
|
1714
|
+
if (lazyDirectTools.size === 0)
|
|
1715
|
+
return result;
|
|
1716
|
+
holdLazyToolsInactive();
|
|
1717
|
+
const matches = result.details?.matches ?? [];
|
|
1718
|
+
const added = activateSearchMatches(matches);
|
|
1719
|
+
if (added.length === 0)
|
|
1720
|
+
return result;
|
|
1721
|
+
const text = result.content.map((block) => ("text" in block) ? block.text : "").join(`
|
|
1722
|
+
`);
|
|
1723
|
+
return {
|
|
1724
|
+
...result,
|
|
1725
|
+
content: [{ type: "text", text: `Activated as direct tools: ${added.join(", ")}.
|
|
1726
|
+
|
|
1727
|
+
${text}` }],
|
|
1728
|
+
details: { ...result.details ?? {}, activated: added },
|
|
1729
|
+
addedToolNames: added
|
|
1730
|
+
};
|
|
998
1731
|
}
|
|
999
1732
|
if (params.server) {
|
|
1000
|
-
return executeList(
|
|
1733
|
+
return proxyModes.executeList(proxyState, params.server);
|
|
1001
1734
|
}
|
|
1002
|
-
return executeStatus(
|
|
1735
|
+
return proxyModes.executeStatus(proxyState);
|
|
1003
1736
|
}
|
|
1004
|
-
});
|
|
1737
|
+
}));
|
|
1005
1738
|
proxyToolRegistered = true;
|
|
1006
1739
|
proxyToolDescription = description;
|
|
1007
1740
|
}
|
|
1008
1741
|
function syncProxyTool(config, cache, directSpecs) {
|
|
1009
1742
|
const missingConfiguredDirectToolServers = getMissingConfiguredDirectToolServers(config, cache, envRaw === undefined || envRaw === "__none__" ? undefined : envDirectToolOverride);
|
|
1010
|
-
const
|
|
1743
|
+
const hasSearchModeSpecs = directSpecs.some((spec) => spec.lazy === true);
|
|
1744
|
+
const shouldRegisterProxyTool = config.settings?.disableProxyTool !== true || directSpecs.length === 0 || hasSearchModeSpecs || missingConfiguredDirectToolServers.length > 0 || hasEnabledServerWithoutValidMetadata(config, cache, directSpecs);
|
|
1011
1745
|
if (shouldRegisterProxyTool) {
|
|
1012
1746
|
const description = buildProxyDescription(config);
|
|
1013
1747
|
if (!proxyToolRegistered || proxyToolDescription !== description) {
|
|
1748
|
+
finalizationRegistrations?.add("mcp");
|
|
1014
1749
|
registerProxyTool(description);
|
|
1015
|
-
|
|
1750
|
+
finalizationGuard?.();
|
|
1016
1751
|
}
|
|
1017
1752
|
const activeTools = getActiveToolsIfReady();
|
|
1018
|
-
if (activeTools
|
|
1019
|
-
|
|
1753
|
+
if (activeTools?.includes("mcp")) {
|
|
1754
|
+
fallbackDeactivatedTools.delete("mcp");
|
|
1755
|
+
} else if (activeTools && fallbackDeactivatedTools.delete("mcp")) {
|
|
1756
|
+
callReentrant(() => pi.setActiveTools([...activeTools, "mcp"]));
|
|
1020
1757
|
}
|
|
1021
1758
|
return;
|
|
1022
1759
|
}
|
|
@@ -1034,7 +1771,7 @@ function installMcpAdapter(pi, options) {
|
|
|
1034
1771
|
startLoadTimeInitialization();
|
|
1035
1772
|
}
|
|
1036
1773
|
export function createMcpAdapter(options = {}) {
|
|
1037
|
-
const factoryConfig = options.config !== undefined ? cloneMcpConfig(options.config) : undefined;
|
|
1774
|
+
const factoryConfig = options.config !== undefined ? normalizeProgrammaticConfig(cloneMcpConfig(options.config)) : undefined;
|
|
1038
1775
|
return function mcpAdapter(pi) {
|
|
1039
1776
|
installMcpAdapter(pi, {
|
|
1040
1777
|
...options.configPath !== undefined ? { configPath: options.configPath } : {},
|