@duckmind/dm-darwin-x64 0.66.5 → 0.66.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 +4 -0
- package/dm +2 -2
- package/extensions/.dm-extensions.json +755 -37
- package/extensions/dm-lens/clients/actionable-warnings.js +63 -11
- package/extensions/dm-lens/clients/advisory-provenance.js +5 -3
- package/extensions/dm-lens/clients/agent-nudge.js +106 -2
- package/extensions/dm-lens/clients/analysis-root.js +103 -0
- package/extensions/dm-lens/clients/ast-grep-client.js +18 -7
- package/extensions/dm-lens/clients/ast-grep-rule-manager.js +35 -12
- package/extensions/dm-lens/clients/biome-client.js +18 -12
- package/extensions/dm-lens/clients/blocker-freshness.js +1 -9
- package/extensions/dm-lens/clients/bounded-pid-file-lock.js +141 -30
- package/extensions/dm-lens/clients/bounded-telemetry.js +3 -0
- package/extensions/dm-lens/clients/cache/rule-cache.js +2 -17
- package/extensions/dm-lens/clients/cache-manager.js +105 -17
- package/extensions/dm-lens/clients/cargo-manifest.js +23 -3
- package/extensions/dm-lens/clients/complexity-client.js +1 -1
- package/extensions/dm-lens/clients/config-core/normalize.js +9 -0
- package/extensions/dm-lens/clients/config-core/schema.js +3 -0
- package/extensions/dm-lens/clients/config-schema.js +105 -2
- package/extensions/dm-lens/clients/confirmed-delete.js +11 -0
- package/extensions/dm-lens/clients/custom-rule-locations.js +28 -0
- package/extensions/dm-lens/clients/dead-code-client.js +81 -12
- package/extensions/dm-lens/clients/deferred-runner-blockers.js +108 -0
- package/extensions/dm-lens/clients/deferred-test-targets.js +31 -0
- package/extensions/dm-lens/clients/degradation-ledger.js +21 -3
- package/extensions/dm-lens/clients/demoted-finding-render.js +5 -2
- package/extensions/dm-lens/clients/dependency-checker.js +13 -4
- package/extensions/dm-lens/clients/diagnostic-line-freshness.js +3 -5
- package/extensions/dm-lens/clients/dispatch/adopted-root-runners.js +22 -0
- package/extensions/dm-lens/clients/dispatch/dispatcher.js +105 -27
- package/extensions/dm-lens/clients/dispatch/facts/comment-facts.js +5 -2
- package/extensions/dm-lens/clients/dispatch/facts/function-facts.js +1 -1
- package/extensions/dm-lens/clients/dispatch/facts/import-facts.js +2 -2
- package/extensions/dm-lens/clients/dispatch/facts/tree-sitter-facts.js +2 -2
- package/extensions/dm-lens/clients/dispatch/facts/try-catch-facts.js +1 -1
- package/extensions/dm-lens/clients/dispatch/finding-policy.js +12 -4
- package/extensions/dm-lens/clients/dispatch/integration.js +60 -15
- package/extensions/dm-lens/clients/dispatch/known-runner-ids.js +13 -0
- package/extensions/dm-lens/clients/dispatch/pending-runner-findings.js +66 -11
- package/extensions/dm-lens/clients/dispatch/plan.js +6 -0
- package/extensions/dm-lens/clients/dispatch/rule-id-normalize.js +9 -2
- package/extensions/dm-lens/clients/dispatch/rule-policy.js +33 -4
- package/extensions/dm-lens/clients/dispatch/runners/ast-grep-napi.js +9 -5
- package/extensions/dm-lens/clients/dispatch/runners/biome-check.js +5 -2
- package/extensions/dm-lens/clients/dispatch/runners/cue-vet.js +7 -3
- package/extensions/dm-lens/clients/dispatch/runners/detekt.js +3 -3
- package/extensions/dm-lens/clients/dispatch/runners/fact-rules.js +3 -3
- package/extensions/dm-lens/clients/dispatch/runners/fish-indent.js +10 -6
- package/extensions/dm-lens/clients/dispatch/runners/gleam-check.js +8 -5
- package/extensions/dm-lens/clients/dispatch/runners/go-vet.js +2 -1
- package/extensions/dm-lens/clients/dispatch/runners/lsp.js +28 -8
- package/extensions/dm-lens/clients/dispatch/runners/oxlint.js +2 -2
- package/extensions/dm-lens/clients/dispatch/runners/php-lint.js +6 -7
- package/extensions/dm-lens/clients/dispatch/runners/prisma-validate.js +18 -8
- package/extensions/dm-lens/clients/dispatch/runners/psscriptanalyzer.js +3 -3
- package/extensions/dm-lens/clients/dispatch/runners/pyright.js +1 -1
- package/extensions/dm-lens/clients/dispatch/runners/rust-clippy.js +25 -6
- package/extensions/dm-lens/clients/dispatch/runners/shellcheck.js +71 -4
- package/extensions/dm-lens/clients/dispatch/runners/shfmt.js +5 -1
- package/extensions/dm-lens/clients/dispatch/runners/spellcheck.js +3 -3
- package/extensions/dm-lens/clients/dispatch/runners/swiftlint.js +3 -3
- package/extensions/dm-lens/clients/dispatch/runners/taplo.js +17 -5
- package/extensions/dm-lens/clients/dispatch/runners/tree-sitter.js +12 -5
- package/extensions/dm-lens/clients/dispatch/runners/trivy-config.js +3 -3
- package/extensions/dm-lens/clients/dispatch/runners/utils/runner-helpers.js +127 -46
- package/extensions/dm-lens/clients/dispatch/runners/utils/tool-failure.js +11 -6
- package/extensions/dm-lens/clients/dispatch/runners/vale.js +3 -3
- package/extensions/dm-lens/clients/dispatch/runners/yaml-rule-parser.js +8 -1
- package/extensions/dm-lens/clients/dispatch/types.js +21 -1
- package/extensions/dm-lens/clients/dispatch/utils/format-utils.js +13 -0
- package/extensions/dm-lens/clients/effective-config.js +14 -3
- package/extensions/dm-lens/clients/ephemeral-root.js +71 -0
- package/extensions/dm-lens/clients/file-kinds.js +9 -0
- package/extensions/dm-lens/clients/file-mutation-queue.js +95 -0
- package/extensions/dm-lens/clients/file-utils.js +87 -8
- package/extensions/dm-lens/clients/finding-delivery-gate.js +5 -2
- package/extensions/dm-lens/clients/fix-run-restore.js +416 -0
- package/extensions/dm-lens/clients/format-events-publish.js +82 -2
- package/extensions/dm-lens/clients/format-service.js +10 -5
- package/extensions/dm-lens/clients/formatters.js +29 -12
- package/extensions/dm-lens/clients/generation-guard.js +50 -8
- package/extensions/dm-lens/clients/generation-lock.js +184 -0
- package/extensions/dm-lens/clients/git-guard.js +19 -1
- package/extensions/dm-lens/clients/gitleaks-client.js +13 -4
- package/extensions/dm-lens/clients/grammar-source.js +5 -0
- package/extensions/dm-lens/clients/grammar-wasm-imports.js +48 -0
- package/extensions/dm-lens/clients/gzip-stage-write.js +15 -7
- package/extensions/dm-lens/clients/hard-failure-summary.js +28 -0
- package/extensions/dm-lens/clients/hook-budgets.js +1 -0
- package/extensions/dm-lens/clients/inline-blocker-fields.js +8 -0
- package/extensions/dm-lens/clients/install-diagnostics.js +31 -16
- package/extensions/dm-lens/clients/installer/index.js +238 -58
- package/extensions/dm-lens/clients/instance-reaper.js +164 -52
- package/extensions/dm-lens/clients/instance-registry-lock.js +117 -76
- package/extensions/dm-lens/clients/instance-registry-tail.js +17 -0
- package/extensions/dm-lens/clients/instance-registry.js +248 -91
- package/extensions/dm-lens/clients/io-bridge-contract.js +7 -0
- package/extensions/dm-lens/clients/io-bridge.js +372 -0
- package/extensions/dm-lens/clients/jscpd-client.js +83 -35
- package/extensions/dm-lens/clients/knip-client.js +75 -6
- package/extensions/dm-lens/clients/knip-scan-roots.js +29 -0
- package/extensions/dm-lens/clients/language-policy.js +2 -0
- package/extensions/dm-lens/clients/language-profile.js +4 -1
- package/extensions/dm-lens/clients/language-registry.js +4 -1
- package/extensions/dm-lens/clients/latency-logger.js +11 -1
- package/extensions/dm-lens/clients/lens-config.js +10 -1
- package/extensions/dm-lens/clients/lens-engine.js +1 -1
- package/extensions/dm-lens/clients/lens-flag-registry.js +14 -24
- package/extensions/dm-lens/clients/lsp/aggregation.js +9 -8
- package/extensions/dm-lens/clients/lsp/auxiliary-lifecycle.js +23 -0
- package/extensions/dm-lens/clients/lsp/capabilities.js +98 -0
- package/extensions/dm-lens/clients/lsp/cascade-tier.js +8 -3
- package/extensions/dm-lens/clients/lsp/client.js +282 -48
- package/extensions/dm-lens/clients/lsp/config.js +247 -15
- package/extensions/dm-lens/clients/lsp/document-drift.js +23 -11
- package/extensions/dm-lens/clients/lsp/edits.js +137 -85
- package/extensions/dm-lens/clients/lsp/grouping.js +38 -0
- package/extensions/dm-lens/clients/lsp/index.js +484 -275
- package/extensions/dm-lens/clients/lsp/launch.js +106 -6
- package/extensions/dm-lens/clients/lsp/pending-aux-coverage.js +37 -7
- package/extensions/dm-lens/clients/lsp/resolved-config.js +188 -0
- package/extensions/dm-lens/clients/lsp/server-covers.js +8 -0
- package/extensions/dm-lens/clients/lsp/server-traits.js +39 -0
- package/extensions/dm-lens/clients/lsp/server.js +259 -34
- package/extensions/dm-lens/clients/lsp/service-singleton.js +59 -0
- package/extensions/dm-lens/clients/lsp/session-roots.js +1 -1
- package/extensions/dm-lens/clients/lsp/wait-policy/classification.js +2 -1
- package/extensions/dm-lens/clients/lsp/wait-policy/strategies.js +25 -4
- package/extensions/dm-lens/clients/lsp/workspace-diagnostics-cache.js +6 -3
- package/extensions/dm-lens/clients/lsp-budget.js +9 -5
- package/extensions/dm-lens/clients/lsp-document-symbols.js +1 -1
- package/extensions/dm-lens/clients/lsp-lazy.js +1 -1
- package/extensions/dm-lens/clients/lsp-mutation.js +44 -8
- package/extensions/dm-lens/clients/lsp-status.js +5 -7
- package/extensions/dm-lens/clients/mcp/analyze.js +24 -11
- package/extensions/dm-lens/clients/mcp/ipc.js +26 -7
- package/extensions/dm-lens/clients/mcp/session.js +1 -1
- package/extensions/dm-lens/clients/memory-sampler.js +48 -3
- package/extensions/dm-lens/clients/module-report-lsp.js +1 -1
- package/extensions/dm-lens/clients/module-report.js +9 -3
- package/extensions/dm-lens/clients/mutating-tool.js +12 -3
- package/extensions/dm-lens/clients/mutation-attribution.js +8 -0
- package/extensions/dm-lens/clients/mutation-bridge.js +181 -48
- package/extensions/dm-lens/clients/ndjson-logger.js +33 -0
- package/extensions/dm-lens/clients/observed-mutation-sources.js +1 -1
- package/extensions/dm-lens/clients/observed-mutation.js +40 -20
- package/extensions/dm-lens/clients/opaque-mutation-scan.js +40 -13
- package/extensions/dm-lens/clients/opengrep-client.js +6 -3
- package/extensions/dm-lens/clients/package-manager.js +61 -6
- package/extensions/dm-lens/clients/path-utils.js +77 -18
- package/extensions/dm-lens/clients/performance-report.js +1 -1
- package/extensions/dm-lens/clients/persist-worker-stats.js +8 -0
- package/extensions/dm-lens/clients/persistent-reverify.js +5 -1
- package/extensions/dm-lens/clients/pipeline.js +310 -114
- package/extensions/dm-lens/clients/probe-home-state.js +6 -1
- package/extensions/dm-lens/clients/process-bridge.js +28 -0
- package/extensions/dm-lens/clients/process-snapshot.js +115 -2
- package/extensions/dm-lens/clients/project-changes.js +81 -19
- package/extensions/dm-lens/clients/project-diagnostics/fresh-fetch.js +18 -13
- package/extensions/dm-lens/clients/project-lens-config.js +32 -5
- package/extensions/dm-lens/clients/project-scale.js +1 -1
- package/extensions/dm-lens/clients/project-snapshot-fingerprint.js +17 -12
- package/extensions/dm-lens/clients/project-snapshot-persist-worker.js +2 -3
- package/extensions/dm-lens/clients/project-snapshot.js +229 -64
- package/extensions/dm-lens/clients/python-environment.js +44 -2
- package/extensions/dm-lens/clients/quiet-window.js +6 -3
- package/extensions/dm-lens/clients/read-bridge.js +28 -20
- package/extensions/dm-lens/clients/read-expansion.js +1 -1
- package/extensions/dm-lens/clients/read-guard-branch.js +129 -0
- package/extensions/dm-lens/clients/read-guard-logger.js +11 -3
- package/extensions/dm-lens/clients/read-guard-tool-lines.js +16 -8
- package/extensions/dm-lens/clients/read-guard.js +516 -176
- package/extensions/dm-lens/clients/review-graph/builder.js +132 -54
- package/extensions/dm-lens/clients/review-graph/git-identity.js +59 -1
- package/extensions/dm-lens/clients/review-graph/import-resolvers.js +6 -8
- package/extensions/dm-lens/clients/runtime-agent-end.js +271 -68
- package/extensions/dm-lens/clients/runtime-coordinator.js +386 -74
- package/extensions/dm-lens/clients/runtime-session.js +174 -31
- package/extensions/dm-lens/clients/runtime-tool-call.js +92 -17
- package/extensions/dm-lens/clients/runtime-tool-result.js +477 -137
- package/extensions/dm-lens/clients/runtime-turn.js +949 -355
- package/extensions/dm-lens/clients/safe-spawn.js +12 -4
- package/extensions/dm-lens/clients/scanner-temp-root.js +8 -0
- package/extensions/dm-lens/clients/scratch-tree-policy.js +9 -0
- package/extensions/dm-lens/clients/search-read-registration.js +2 -1
- package/extensions/dm-lens/clients/session-lifecycle.js +120 -18
- package/extensions/dm-lens/clients/session-scope.js +456 -0
- package/extensions/dm-lens/clients/session-state-store.js +23 -20
- package/extensions/dm-lens/clients/sg-runner.js +24 -6
- package/extensions/dm-lens/clients/sgconfig.js +35 -5
- package/extensions/dm-lens/clients/startup-scan.js +10 -2
- package/extensions/dm-lens/clients/test-runner-client.js +258 -48
- package/extensions/dm-lens/clients/test-runner-delivery.js +46 -9
- package/extensions/dm-lens/clients/test-target-roots.js +20 -0
- package/extensions/dm-lens/clients/tool-agreement.js +282 -19
- package/extensions/dm-lens/clients/tool-config.js +1 -0
- package/extensions/dm-lens/clients/tool-event.js +6 -0
- package/extensions/dm-lens/clients/tool-probe.js +8 -0
- package/extensions/dm-lens/clients/tool-set-policy.js +36 -26
- package/extensions/dm-lens/clients/tree-sitter-client.js +304 -34
- package/extensions/dm-lens/clients/tree-sitter-query-loader.js +76 -2
- package/extensions/dm-lens/clients/tree-sitter-shared.js +2 -2
- package/extensions/dm-lens/clients/tree-sitter-symbol-extractor.js +3 -1
- package/extensions/dm-lens/clients/trivy-client.js +40 -7
- package/extensions/dm-lens/clients/turn-end/delivery-holds.js +59 -0
- package/extensions/dm-lens/clients/widget-state.js +36 -2
- package/extensions/dm-lens/clients/word-index.js +73 -5
- package/extensions/dm-lens/clients/workspace-topology.js +11 -4
- package/extensions/dm-lens/clients/write-ordering-guard.js +4 -0
- package/extensions/dm-lens/config/dependency-cruiser-eager-allowlist.json +9 -3
- package/extensions/dm-lens/dist/clients/actionable-warnings-logger.js +24 -0
- package/extensions/dm-lens/dist/clients/actionable-warnings.js +1062 -0
- package/extensions/dm-lens/dist/clients/advisory-provenance.js +387 -0
- package/extensions/dm-lens/dist/clients/agent-behavior-client.js +94 -0
- package/extensions/dm-lens/dist/clients/agent-nudge.js +253 -0
- package/extensions/dm-lens/dist/clients/analysed-root.js +1 -0
- package/extensions/dm-lens/dist/clients/analysis-root.js +100 -0
- package/extensions/dm-lens/dist/clients/ast-grep-client.js +587 -0
- package/extensions/dm-lens/dist/clients/ast-grep-rule-manager.js +137 -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 +223 -0
- package/extensions/dm-lens/dist/clients/blocker-freshness.js +377 -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 +275 -0
- package/extensions/dm-lens/dist/clients/bounded-telemetry.js +107 -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 +87 -0
- package/extensions/dm-lens/dist/clients/cache-manager.js +428 -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 +171 -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 +226 -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 +93 -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 +230 -0
- package/extensions/dm-lens/dist/clients/config-warn.js +146 -0
- package/extensions/dm-lens/dist/clients/confirmed-delete.js +11 -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/custom-rule-locations.js +28 -0
- package/extensions/dm-lens/dist/clients/dead-code-client.js +408 -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/deferred-runner-blockers.js +106 -0
- package/extensions/dm-lens/dist/clients/deferred-test-targets.js +31 -0
- package/extensions/dm-lens/dist/clients/degradation-ledger.js +289 -0
- package/extensions/dm-lens/dist/clients/demoted-finding-render.js +64 -0
- package/extensions/dm-lens/dist/clients/dependency-checker.js +534 -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 +142 -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/adopted-root-runners.js +22 -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 +1017 -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 +23 -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 +164 -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 +1502 -0
- package/extensions/dm-lens/dist/clients/dispatch/known-runner-ids.js +13 -0
- package/extensions/dm-lens/dist/clients/dispatch/lazy.js +8 -0
- package/extensions/dm-lens/dist/clients/dispatch/pending-runner-findings.js +130 -0
- package/extensions/dm-lens/dist/clients/dispatch/plan.js +284 -0
- package/extensions/dm-lens/dist/clients/dispatch/priorities.js +14 -0
- package/extensions/dm-lens/dist/clients/dispatch/rule-id-normalize.js +49 -0
- package/extensions/dm-lens/dist/clients/dispatch/rule-ignores.js +21 -0
- package/extensions/dm-lens/dist/clients/dispatch/rule-policy.js +102 -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 +694 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/biome-check.js +205 -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 +171 -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 +66 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/gleam-check.js +110 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/go-vet.js +52 -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 +226 -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 +66 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/phpstan.js +90 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/prisma-validate.js +66 -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 +166 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/shellcheck.js +177 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/shfmt.js +85 -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 +108 -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 +521 -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 +1143 -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 +120 -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 +170 -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 +27 -0
- package/extensions/dm-lens/dist/clients/dispatch/utils/format-utils.js +58 -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 +170 -0
- package/extensions/dm-lens/dist/clients/env-utils.js +26 -0
- package/extensions/dm-lens/dist/clients/ephemeral-root.js +67 -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 +313 -0
- package/extensions/dm-lens/dist/clients/file-mutation-queue.js +95 -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 +706 -0
- package/extensions/dm-lens/dist/clients/finding-delivery-gate.js +132 -0
- package/extensions/dm-lens/dist/clients/finding-identity.js +23 -0
- package/extensions/dm-lens/dist/clients/fix-run-restore.js +413 -0
- package/extensions/dm-lens/dist/clients/fix-worklog.js +75 -0
- package/extensions/dm-lens/dist/clients/format-events-publish.js +310 -0
- package/extensions/dm-lens/dist/clients/format-service.js +159 -0
- package/extensions/dm-lens/dist/clients/formatters-lazy.js +8 -0
- package/extensions/dm-lens/dist/clients/formatters.js +1367 -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 +147 -0
- package/extensions/dm-lens/dist/clients/generation-lock.js +181 -0
- package/extensions/dm-lens/dist/clients/git-guard.js +786 -0
- package/extensions/dm-lens/dist/clients/git-tracked-ignore.js +120 -0
- package/extensions/dm-lens/dist/clients/gitleaks-client.js +290 -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 +229 -0
- package/extensions/dm-lens/dist/clients/grammar-wasm-imports.js +48 -0
- package/extensions/dm-lens/dist/clients/gzip-stage-write.js +93 -0
- package/extensions/dm-lens/dist/clients/hard-failure-summary.js +28 -0
- package/extensions/dm-lens/dist/clients/hashline-anchor.js +222 -0
- package/extensions/dm-lens/dist/clients/hook-budgets.js +17 -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/inline-blocker-fields.js +8 -0
- package/extensions/dm-lens/dist/clients/install-diagnostics.js +135 -0
- package/extensions/dm-lens/dist/clients/installer/index.js +3935 -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 +682 -0
- package/extensions/dm-lens/dist/clients/instance-registry-lock.js +166 -0
- package/extensions/dm-lens/dist/clients/instance-registry-tail.js +17 -0
- package/extensions/dm-lens/dist/clients/instance-registry.js +595 -0
- package/extensions/dm-lens/dist/clients/io-bridge-contract.js +7 -0
- package/extensions/dm-lens/dist/clients/io-bridge.js +357 -0
- package/extensions/dm-lens/dist/clients/jscpd-client.js +300 -0
- package/extensions/dm-lens/dist/clients/json-cache-read.js +25 -0
- package/extensions/dm-lens/dist/clients/knip-client.js +534 -0
- package/extensions/dm-lens/dist/clients/knip-scan-roots.js +26 -0
- package/extensions/dm-lens/dist/clients/language-policy.js +244 -0
- package/extensions/dm-lens/dist/clients/language-profile.js +263 -0
- package/extensions/dm-lens/dist/clients/language-registry.js +427 -0
- package/extensions/dm-lens/dist/clients/latency-logger.js +202 -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 +246 -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 +292 -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 +89 -0
- package/extensions/dm-lens/dist/clients/lsp/auxiliary-lifecycle.js +23 -0
- package/extensions/dm-lens/dist/clients/lsp/capabilities.js +94 -0
- package/extensions/dm-lens/dist/clients/lsp/cascade-tier.js +208 -0
- package/extensions/dm-lens/dist/clients/lsp/client.js +2943 -0
- package/extensions/dm-lens/dist/clients/lsp/config.js +471 -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 +324 -0
- package/extensions/dm-lens/dist/clients/lsp/edits.js +982 -0
- package/extensions/dm-lens/dist/clients/lsp/grouping.js +38 -0
- package/extensions/dm-lens/dist/clients/lsp/index.js +4639 -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 +564 -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 +120 -0
- package/extensions/dm-lens/dist/clients/lsp/position-encoding.js +28 -0
- package/extensions/dm-lens/dist/clients/lsp/resolved-config.js +183 -0
- package/extensions/dm-lens/dist/clients/lsp/ruby-drive-dirs.js +42 -0
- package/extensions/dm-lens/dist/clients/lsp/server-covers.js +8 -0
- package/extensions/dm-lens/dist/clients/lsp/server-traits.js +39 -0
- package/extensions/dm-lens/dist/clients/lsp/server.js +2640 -0
- package/extensions/dm-lens/dist/clients/lsp/service-singleton.js +59 -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 +37 -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 +196 -0
- package/extensions/dm-lens/dist/clients/lsp/watch-queue.js +40 -0
- package/extensions/dm-lens/dist/clients/lsp/workspace-diagnostics-cache.js +270 -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 +87 -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 +309 -0
- package/extensions/dm-lens/dist/clients/lsp-status.js +35 -0
- package/extensions/dm-lens/dist/clients/map-with-concurrency.js +20 -0
- package/extensions/dm-lens/dist/clients/mcp/analyze.js +265 -0
- package/extensions/dm-lens/dist/clients/mcp/host-shim.js +14 -0
- package/extensions/dm-lens/dist/clients/mcp/ipc.js +321 -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 +145 -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 +1648 -0
- package/extensions/dm-lens/dist/clients/mutating-tool.js +386 -0
- package/extensions/dm-lens/dist/clients/mutation-attribution.js +176 -0
- package/extensions/dm-lens/dist/clients/mutation-bridge.js +231 -0
- package/extensions/dm-lens/dist/clients/ndjson-logger.js +504 -0
- package/extensions/dm-lens/dist/clients/observed-mutation-sources.js +43 -0
- package/extensions/dm-lens/dist/clients/observed-mutation.js +729 -0
- package/extensions/dm-lens/dist/clients/oldtext-autopatch.js +100 -0
- package/extensions/dm-lens/dist/clients/opaque-mutation-scan.js +340 -0
- package/extensions/dm-lens/dist/clients/opengrep-client.js +219 -0
- package/extensions/dm-lens/dist/clients/opengrep-config.js +52 -0
- package/extensions/dm-lens/dist/clients/package-manager.js +358 -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 +535 -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/persist-worker-stats.js +8 -0
- package/extensions/dm-lens/dist/clients/persistent-reverify.js +166 -0
- package/extensions/dm-lens/dist/clients/php-cs-fixer-config.js +15 -0
- package/extensions/dm-lens/dist/clients/pipeline.js +1279 -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 +67 -0
- package/extensions/dm-lens/dist/clients/process-bridge.js +48 -0
- package/extensions/dm-lens/dist/clients/process-singletons.js +69 -0
- package/extensions/dm-lens/dist/clients/process-snapshot.js +130 -0
- package/extensions/dm-lens/dist/clients/project-changes.js +174 -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 +413 -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 +464 -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 +44 -0
- package/extensions/dm-lens/dist/clients/project-snapshot-persist-worker.js +13 -0
- package/extensions/dm-lens/dist/clients/project-snapshot.js +1333 -0
- package/extensions/dm-lens/dist/clients/project-trust.js +104 -0
- package/extensions/dm-lens/dist/clients/python-environment.js +162 -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 +129 -0
- package/extensions/dm-lens/dist/clients/read-bridge.js +53 -0
- package/extensions/dm-lens/dist/clients/read-expansion.js +218 -0
- package/extensions/dm-lens/dist/clients/read-guard-branch.js +126 -0
- package/extensions/dm-lens/dist/clients/read-guard-logger.js +186 -0
- package/extensions/dm-lens/dist/clients/read-guard-tool-lines.js +1050 -0
- package/extensions/dm-lens/dist/clients/read-guard.js +1429 -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 +3708 -0
- package/extensions/dm-lens/dist/clients/review-graph/format.js +30 -0
- package/extensions/dm-lens/dist/clients/review-graph/git-identity.js +168 -0
- package/extensions/dm-lens/dist/clients/review-graph/import-resolvers.js +323 -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 +800 -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 +1117 -0
- package/extensions/dm-lens/dist/clients/runtime-session.js +1768 -0
- package/extensions/dm-lens/dist/clients/runtime-tool-call.js +935 -0
- package/extensions/dm-lens/dist/clients/runtime-tool-result.js +1630 -0
- package/extensions/dm-lens/dist/clients/runtime-turn.js +2900 -0
- package/extensions/dm-lens/dist/clients/rust-client.js +48 -0
- package/extensions/dm-lens/dist/clients/safe-spawn.js +1275 -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/scanner-temp-root.js +8 -0
- package/extensions/dm-lens/dist/clients/scratch-tree-policy.js +63 -0
- package/extensions/dm-lens/dist/clients/search-read-registration.js +60 -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 +269 -0
- package/extensions/dm-lens/dist/clients/session-scope.js +451 -0
- package/extensions/dm-lens/dist/clients/session-start-observability.js +47 -0
- package/extensions/dm-lens/dist/clients/session-state-store.js +66 -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 +645 -0
- package/extensions/dm-lens/dist/clients/sgconfig.js +306 -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 +230 -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 +1697 -0
- package/extensions/dm-lens/dist/clients/test-runner-delivery.js +293 -0
- package/extensions/dm-lens/dist/clients/test-target-roots.js +17 -0
- package/extensions/dm-lens/dist/clients/todo-scanner.js +164 -0
- package/extensions/dm-lens/dist/clients/tool-agreement.js +640 -0
- package/extensions/dm-lens/dist/clients/tool-config.js +219 -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 +24 -0
- package/extensions/dm-lens/dist/clients/tool-policy.js +2393 -0
- package/extensions/dm-lens/dist/clients/tool-probe.js +13 -0
- package/extensions/dm-lens/dist/clients/tool-render.js +79 -0
- package/extensions/dm-lens/dist/clients/tool-set-policy.js +77 -0
- package/extensions/dm-lens/dist/clients/tree-sitter-cache.js +206 -0
- package/extensions/dm-lens/dist/clients/tree-sitter-client.js +3057 -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 +389 -0
- package/extensions/dm-lens/dist/clients/tree-sitter-shared.js +87 -0
- package/extensions/dm-lens/dist/clients/tree-sitter-symbol-extractor.js +959 -0
- package/extensions/dm-lens/dist/clients/trivy-client.js +335 -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/delivery-holds.js +59 -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 +997 -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 +1494 -0
- package/extensions/dm-lens/dist/clients/workspace-topology.js +268 -0
- package/extensions/dm-lens/dist/clients/write-ordering-guard.js +28 -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 +1973 -0
- package/extensions/dm-lens/dist/mcp/analyze-cli.js +205 -0
- package/extensions/dm-lens/dist/mcp/build-staleness.js +55 -0
- package/extensions/dm-lens/dist/mcp/cli.js +96 -0
- package/extensions/dm-lens/dist/mcp/server.js +1239 -0
- package/extensions/dm-lens/dist/mcp/tool-arguments.js +134 -0
- package/extensions/dm-lens/dist/mcp/worker.js +41 -0
- package/extensions/dm-lens/dist/scripts/lib/process-scan.mjs +375 -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 +51 -0
- package/extensions/dm-lens/dist/tools/activate-tools.js +62 -0
- package/extensions/dm-lens/dist/tools/ast-grep-outline.js +126 -0
- package/extensions/dm-lens/dist/tools/ast-grep-replace.js +227 -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 +251 -0
- package/extensions/dm-lens/dist/tools/lens-diagnostics.js +1518 -0
- package/extensions/dm-lens/dist/tools/lsp-diagnostics.js +1198 -0
- package/extensions/dm-lens/dist/tools/lsp-navigation.js +1249 -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 +32 -0
- package/extensions/dm-lens/dist/tools/symbol-search.js +133 -0
- package/extensions/dm-lens/i18n.js +3 -3
- package/extensions/dm-lens/index.js +431 -214
- package/extensions/dm-lens/mcp/analyze-cli.js +63 -36
- package/extensions/dm-lens/mcp/cli.js +20 -0
- package/extensions/dm-lens/mcp/server.js +40 -3
- package/extensions/dm-lens/mcp/tool-arguments.js +134 -0
- package/extensions/dm-lens/mcp/worker.js +8 -0
- package/extensions/dm-lens/package.json +1 -1
- package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
- package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-identity-operator-on-literals-test.yml +12 -2
- package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/throw-new-error-js-test.yml +2 -0
- package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/throw-new-error-test.yml +2 -0
- package/extensions/dm-lens/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
- package/extensions/dm-lens/rules/ast-grep-rules/rules/no-identity-operator-on-literals.yml +20 -12
- package/extensions/dm-lens/rules/ast-grep-rules/rules/throw-new-error-js.yml +2 -2
- package/extensions/dm-lens/rules/ast-grep-rules/rules/throw-new-error.yml +2 -2
- package/extensions/dm-lens/scripts/lib/process-scan.mjs +126 -7
- package/extensions/dm-lens/scripts/lib/web-tree-sitter-dir.mjs +6 -0
- package/extensions/dm-lens/tools/activate-tools.js +3 -2
- package/extensions/dm-lens/tools/ast-grep-outline.js +2 -3
- package/extensions/dm-lens/tools/ast-grep-replace.js +6 -5
- package/extensions/dm-lens/tools/ast-grep-search.js +2 -2
- package/extensions/dm-lens/tools/lens-diagnostic-mark.js +12 -1
- package/extensions/dm-lens/tools/lens-diagnostics.js +74 -37
- package/extensions/dm-lens/tools/lsp-diagnostics.js +140 -25
- package/extensions/dm-lens/tools/lsp-navigation.js +64 -7
- package/extensions/dm-lens/tools/module-report.js +6 -6
- package/extensions/dm-lens/tools/shared.js +6 -0
- package/extensions/dm-mcp-adapter/THIRD_PARTY_NOTICES.md +1 -1
- package/extensions/dm-mcp-adapter/cli.js +265 -23
- package/extensions/dm-mcp-adapter/commands.js +83 -17
- package/extensions/dm-mcp-adapter/config.js +517 -92
- package/extensions/dm-mcp-adapter/direct-tool-surface.js +10 -8
- package/extensions/dm-mcp-adapter/direct-tools.js +54 -36
- package/extensions/dm-mcp-adapter/dist/abort.js +35 -0
- package/extensions/dm-mcp-adapter/dist/agent-dir.js +45 -0
- package/extensions/dm-mcp-adapter/dist/agent-plugin-loader.js +392 -0
- 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 +1735 -0
- package/extensions/dm-mcp-adapter/dist/consent-manager.js +84 -0
- package/extensions/dm-mcp-adapter/dist/elicitation-handler.js +370 -0
- package/extensions/dm-mcp-adapter/dist/errors.js +225 -0
- package/extensions/dm-mcp-adapter/dist/http-ca.js +75 -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 +189 -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 +956 -0
- package/extensions/dm-mcp-adapter/dist/mcp-auth.js +998 -0
- package/extensions/dm-mcp-adapter/dist/mcp-bearer-store.js +182 -0
- package/extensions/dm-mcp-adapter/dist/mcp-callback-server.js +380 -0
- package/extensions/dm-mcp-adapter/dist/mcp-oauth-provider.js +525 -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 +220 -0
- package/extensions/dm-mcp-adapter/dist/metadata-cache.js +323 -0
- package/extensions/dm-mcp-adapter/dist/npx-resolver.js +465 -0
- package/extensions/dm-mcp-adapter/dist/output-shape.js +312 -0
- package/extensions/dm-mcp-adapter/dist/package-mcp-loader.js +144 -0
- package/extensions/dm-mcp-adapter/dist/project-server-trust.js +186 -0
- package/extensions/dm-mcp-adapter/dist/request-headers-command.js +294 -0
- package/extensions/dm-mcp-adapter/dist/resource-tools.js +7 -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 +1594 -0
- package/extensions/dm-mcp-adapter/dist/session-approvals.js +127 -0
- package/extensions/dm-mcp-adapter/dist/session-recovery.js +83 -0
- package/extensions/dm-mcp-adapter/dist/state.js +1 -0
- package/extensions/dm-mcp-adapter/dist/ts-shape.js +157 -0
- package/extensions/dm-mcp-adapter/dist/types.js +286 -0
- package/extensions/dm-mcp-adapter/dist/ui-app-bridge-helpers.js +36 -0
- package/extensions/dm-mcp-adapter/dist/ui-resource-handler.js +204 -0
- package/extensions/dm-mcp-adapter/dist/ui-stream-types.js +58 -0
- package/extensions/dm-mcp-adapter/dist/ui-tool-visibility.js +26 -0
- package/extensions/dm-mcp-adapter/dist/unix-socket-transport.js +83 -0
- package/extensions/dm-mcp-adapter/dist/utils.js +418 -0
- package/extensions/dm-mcp-adapter/elicitation-handler.js +67 -2
- package/extensions/dm-mcp-adapter/failure-backoff.js +9 -0
- package/extensions/dm-mcp-adapter/host-managed.js +400 -0
- package/extensions/dm-mcp-adapter/http-ca.js +4 -0
- package/extensions/dm-mcp-adapter/index.js +347 -57
- package/extensions/dm-mcp-adapter/init.js +92 -44
- package/extensions/dm-mcp-adapter/jev-client.js +5 -5
- package/extensions/dm-mcp-adapter/jev-key-store.js +15 -2
- package/extensions/dm-mcp-adapter/mcp-auth-flow.js +10 -2
- package/extensions/dm-mcp-adapter/mcp-auth.js +2 -1
- package/extensions/dm-mcp-adapter/mcp-callback-server.js +1 -1
- package/extensions/dm-mcp-adapter/mcp-code.js +174 -87
- package/extensions/dm-mcp-adapter/mcp-keyring-helper.cjs +1 -1
- package/extensions/dm-mcp-adapter/mcp-oauth-provider.js +3 -2
- package/extensions/dm-mcp-adapter/mcp-output-guard.js +19 -5
- package/extensions/dm-mcp-adapter/mcp-panel.js +59 -12
- package/extensions/dm-mcp-adapter/mcp-script-wasm.js +22 -0
- package/extensions/dm-mcp-adapter/mcp-script-worker.mjs +227 -111
- package/extensions/dm-mcp-adapter/mcp-setup-panel.js +500 -258
- package/extensions/dm-mcp-adapter/mcp-status.js +9 -2
- package/extensions/dm-mcp-adapter/mcp-trace.js +5 -0
- package/extensions/dm-mcp-adapter/metadata-cache.js +68 -11
- package/extensions/dm-mcp-adapter/namespace-tools.js +20 -5
- package/extensions/dm-mcp-adapter/onboarding-state.js +11 -1
- package/extensions/dm-mcp-adapter/output-shape.js +312 -0
- package/extensions/dm-mcp-adapter/package-mcp-loader.js +15 -6
- package/extensions/dm-mcp-adapter/package.json +6 -15
- package/extensions/dm-mcp-adapter/panel-keys.js +13 -0
- package/extensions/dm-mcp-adapter/pi-builtin-mcp.js +26 -0
- package/extensions/dm-mcp-adapter/pi-signin-import.js +121 -0
- package/extensions/dm-mcp-adapter/project-server-trust.js +186 -0
- package/extensions/dm-mcp-adapter/prompts.js +80 -7
- package/extensions/dm-mcp-adapter/proxy-modes.js +219 -158
- package/extensions/dm-mcp-adapter/runtime-protocol.js +342 -0
- package/extensions/dm-mcp-adapter/search-ranking.js +8 -6
- package/extensions/dm-mcp-adapter/semantic-search.js +5 -4
- package/extensions/dm-mcp-adapter/server-manager.js +108 -26
- package/extensions/dm-mcp-adapter/session-recovery.js +3 -2
- package/extensions/dm-mcp-adapter/skills/mcp-scripting/SKILL.md +24 -28
- package/extensions/dm-mcp-adapter/skills/mcp-scripting/references/jev.md +3 -0
- package/extensions/dm-mcp-adapter/test-runner.mjs +1 -1
- package/extensions/dm-mcp-adapter/tool-approval.js +17 -7
- package/extensions/dm-mcp-adapter/tool-metadata.js +4 -2
- package/extensions/dm-mcp-adapter/tool-parameters.js +4 -0
- package/extensions/dm-mcp-adapter/tool-result-renderer.js +68 -7
- package/extensions/dm-mcp-adapter/ts-shape.js +1 -1
- package/extensions/dm-mcp-adapter/ui-server.js +24 -20
- package/extensions/dm-mcp-adapter/unix-socket-transport.js +1 -1
- package/extensions/dm-mcp-adapter/utils.js +37 -1
- package/extensions/dm-ponytail/extensions/ponytail.mjs +37 -17
- package/extensions/dm-ponytail/hooks/claude-codex-hooks.json +3 -3
- package/extensions/dm-ponytail/hooks/copilot-hooks.json +4 -4
- package/extensions/dm-ponytail/hooks/ponytail-activate.js +46 -13
- package/extensions/dm-ponytail/hooks/ponytail-config.js +6 -5
- package/extensions/dm-ponytail/hooks/ponytail-instructions.js +29 -33
- package/extensions/dm-ponytail/hooks/ponytail-map.js +116 -0
- package/extensions/dm-ponytail/hooks/ponytail-mode-tracker.js +26 -13
- package/extensions/dm-ponytail/hooks/ponytail-runtime.js +23 -9
- package/extensions/dm-ponytail/hooks/ponytail-subagent.js +15 -3
- package/extensions/dm-ponytail/hooks/qoder-hooks.json +3 -3
- package/extensions/dm-ponytail/package.json +1 -1
- package/extensions/dm-ponytail/pi-extension/index.js +37 -17
- package/extensions/dm-ponytail/pi-extension/package.json +1 -1
- package/extensions/dm-ponytail/skills/plugin.json +5 -0
- package/extensions/dm-ponytail/skills/ponytail/SKILL.md +33 -101
- package/extensions/dm-ponytail/skills/ponytail-audit/SKILL.md +89 -27
- package/extensions/dm-ponytail/skills/ponytail-debt/SKILL.md +13 -12
- package/extensions/dm-ponytail/skills/ponytail-gain/SKILL.md +21 -18
- package/extensions/dm-ponytail/skills/ponytail-help/SKILL.md +13 -14
- package/extensions/dm-ponytail/skills/ponytail-review/SKILL.md +96 -52
- package/extensions/dm-subagents/agents/oracle.md +8 -19
- package/extensions/dm-subagents/agents/researcher.md +0 -3
- package/extensions/dm-subagents/agents/reviewer.md +17 -61
- package/extensions/dm-subagents/agents/scout.md +1 -4
- package/extensions/dm-subagents/agents/worker.md +8 -25
- package/extensions/dm-subagents/index.js +5 -0
- package/extensions/dm-subagents/install.mjs +47 -62
- package/extensions/dm-subagents/package.json +6 -5
- package/extensions/dm-subagents/prompts/council.md +1 -1
- package/extensions/dm-subagents/prompts/review-loop.md +1 -1
- package/extensions/dm-subagents/skills/council-mode/SKILL.md +1 -1
- package/extensions/dm-subagents/skills/dm-subagents/SKILL.md +13 -6
- package/extensions/dm-subagents/skills/dm-subagents/references/constraints-and-recipes.md +3 -3
- package/extensions/dm-subagents/skills/dm-subagents/references/execution-controls.md +79 -78
- package/extensions/dm-subagents/skills/dm-subagents/references/management-authoring-rpc.md +18 -14
- package/extensions/dm-subagents/skills/dm-subagents/references/multi-lane-orchestration.md +1 -1
- package/extensions/dm-subagents/skills/dm-subagents/references/prompting-and-roles.md +46 -49
- package/extensions/dm-subagents/src/agents/advertised-agent-prompt.js +18 -32
- package/extensions/dm-subagents/src/agents/agent-management.js +7 -2
- package/extensions/dm-subagents/src/agents/agent-memory.js +3 -3
- package/extensions/dm-subagents/src/agents/agent-scope.js +3 -0
- package/extensions/dm-subagents/src/agents/agent-serializer.js +12 -1
- package/extensions/dm-subagents/src/agents/agents.js +217 -120
- package/extensions/dm-subagents/src/api/inspectors.js +10 -0
- package/extensions/dm-subagents/src/api/preflight.js +43 -6
- package/extensions/dm-subagents/src/extension/config.js +35 -2
- package/extensions/dm-subagents/src/extension/control-notices.js +3 -7
- package/extensions/dm-subagents/src/extension/declaration-pinning.js +127 -0
- package/extensions/dm-subagents/src/extension/doctor.js +4 -7
- package/extensions/dm-subagents/src/extension/fanout-child.js +15 -7
- package/extensions/dm-subagents/src/extension/herdr-dm-bridge.js +2 -0
- package/extensions/dm-subagents/src/extension/index.js +231 -332
- package/extensions/dm-subagents/src/extension/public-execution.js +63 -33
- package/extensions/dm-subagents/src/extension/reply-workflow-script.js +65 -0
- package/extensions/dm-subagents/src/extension/rpc.js +42 -16
- package/extensions/dm-subagents/src/extension/schemas.js +73 -152
- package/extensions/dm-subagents/src/extension/subagent-guide.js +92 -7
- package/extensions/dm-subagents/src/extension/subagent-options.js +47 -0
- package/extensions/dm-subagents/src/extension/tool-activation.js +57 -89
- package/extensions/dm-subagents/src/extension/tool-description.js +56 -47
- package/extensions/dm-subagents/src/extension/upgrade-notice.js +36 -0
- package/extensions/dm-subagents/src/inspectors/actions.js +34 -11
- package/extensions/dm-subagents/src/inspectors/plugins.js +71 -2
- package/extensions/dm-subagents/src/inspectors/tmux/actions.js +173 -0
- package/extensions/dm-subagents/src/inspectors/tmux/client.js +63 -0
- package/extensions/dm-subagents/src/inspectors/tmux/plugin.js +14 -0
- package/extensions/dm-subagents/src/integrations/herdr-status.js +26 -49
- package/extensions/dm-subagents/src/integrations/program-status.js +179 -0
- package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +77 -4
- package/extensions/dm-subagents/src/intercom/result-intercom.js +3 -2
- package/extensions/dm-subagents/src/intercom/supervisor-ui.js +2 -152
- package/extensions/dm-subagents/src/missions/goal-driver.js +47 -34
- package/extensions/dm-subagents/src/missions/store.js +33 -4
- package/extensions/dm-subagents/src/profiles/profiles.js +22 -15
- package/extensions/dm-subagents/src/runs/background/active-async-capacity.js +49 -6
- package/extensions/dm-subagents/src/runs/background/async-execution.js +301 -139
- package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +65 -24
- package/extensions/dm-subagents/src/runs/background/async-resume.js +9 -3
- package/extensions/dm-subagents/src/runs/background/async-retention.js +40 -15
- package/extensions/dm-subagents/src/runs/background/await-async-run.js +68 -0
- package/extensions/dm-subagents/src/runs/background/binary-bootstrap.js +2 -1
- package/extensions/dm-subagents/src/runs/background/calendar-schedule.js +90 -0
- package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +11 -8
- package/extensions/dm-subagents/src/runs/background/control-channel.js +89 -5
- package/extensions/dm-subagents/src/runs/background/fleet-view.js +5 -5
- package/extensions/dm-subagents/src/runs/background/notify.js +170 -11
- package/extensions/dm-subagents/src/runs/background/pid-namespace.js +17 -0
- package/extensions/dm-subagents/src/runs/background/result-files.js +80 -6
- package/extensions/dm-subagents/src/runs/background/result-watcher.js +92 -65
- package/extensions/dm-subagents/src/runs/background/resume-guidance.js +2 -2
- package/extensions/dm-subagents/src/runs/background/run-child-session.js +34 -10
- package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +8 -6
- package/extensions/dm-subagents/src/runs/background/run-status.js +25 -15
- package/extensions/dm-subagents/src/runs/background/runner-aliases.js +4 -2
- package/extensions/dm-subagents/src/runs/background/runner-child-launch.js +3 -0
- package/extensions/dm-subagents/src/runs/background/runner-http-dispatcher.js +2 -1
- package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +270 -79
- package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +18 -3
- package/extensions/dm-subagents/src/runs/background/subagent-runner-bootstrap.js +4 -1
- package/extensions/dm-subagents/src/runs/background/subagent-runner.js +123 -33
- package/extensions/dm-subagents/src/runs/background/subagent-wait.js +33 -20
- package/extensions/dm-subagents/src/runs/background/terminal-run-index.js +42 -1
- package/extensions/dm-subagents/src/runs/background/wait-completions.js +1 -0
- package/extensions/dm-subagents/src/runs/background/wait-tool.js +36 -26
- package/extensions/dm-subagents/src/runs/background/workflow-terminal-proof.js +39 -26
- package/extensions/dm-subagents/src/runs/foreground/async-stop-action.js +58 -26
- package/extensions/dm-subagents/src/runs/foreground/command-action.js +37 -0
- package/extensions/dm-subagents/src/runs/foreground/execution.js +132 -32
- package/extensions/dm-subagents/src/runs/foreground/foreground-history.js +1 -0
- package/extensions/dm-subagents/src/runs/foreground/prompt-audit.js +5 -5
- package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +683 -325
- package/extensions/dm-subagents/src/runs/shared/async-status-projection.js +3 -0
- package/extensions/dm-subagents/src/runs/shared/child-commands.js +252 -0
- package/extensions/dm-subagents/src/runs/shared/child-hooks.js +6 -5
- package/extensions/dm-subagents/src/runs/shared/child-launch.js +13 -1
- package/extensions/dm-subagents/src/runs/shared/child-session.js +183 -34
- package/extensions/dm-subagents/src/runs/shared/child-tool-plan.js +17 -14
- package/extensions/dm-subagents/src/runs/shared/claude-code-adapter.js +87 -1
- package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +11 -85
- package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +3 -0
- package/extensions/dm-subagents/src/runs/shared/effective-system-prompt.js +1 -2
- package/extensions/dm-subagents/src/runs/shared/external-cli-preflight.js +57 -6
- package/extensions/dm-subagents/src/runs/shared/external-cli-runner.js +6 -3
- package/extensions/dm-subagents/src/runs/shared/herdr-placed-run.js +13 -6
- package/extensions/dm-subagents/src/runs/shared/mcp-config-sources.js +1 -1
- package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +66 -14
- package/extensions/dm-subagents/src/runs/shared/model-resolution-diagnostic.js +25 -5
- package/extensions/dm-subagents/src/runs/shared/model-resolution.js +55 -11
- package/extensions/dm-subagents/src/runs/shared/model-scope.js +23 -10
- package/extensions/dm-subagents/src/runs/shared/nested-events.js +3 -0
- package/extensions/dm-subagents/src/runs/shared/parallel-handoff.js +55 -7
- package/extensions/dm-subagents/src/runs/shared/partial-output.js +26 -0
- package/extensions/dm-subagents/src/runs/shared/run-history.js +41 -0
- package/extensions/dm-subagents/src/runs/shared/runner-launcher.js +21 -0
- package/extensions/dm-subagents/src/runs/shared/single-output.js +67 -26
- package/extensions/dm-subagents/src/runs/shared/structured-output.js +24 -7
- package/extensions/dm-subagents/src/runs/shared/subagent-control.js +32 -20
- package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +68 -29
- package/extensions/dm-subagents/src/runs/shared/tool-availability.js +1 -1
- package/extensions/dm-subagents/src/runs/shared/workflow-async-child-guidance.js +1 -1
- package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-apply.js +169 -0
- package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-plan.js +41 -20
- package/extensions/dm-subagents/src/runs/shared/worktree-lock.js +38 -0
- package/extensions/dm-subagents/src/runs/shared/worktree.js +10 -1
- package/extensions/dm-subagents/src/shared/atomic-json.js +2 -1
- package/extensions/dm-subagents/src/shared/disabled-features.js +101 -0
- package/extensions/dm-subagents/src/shared/dm-declarations.js +14 -0
- package/extensions/dm-subagents/src/shared/dm-safeguards.js +41 -0
- package/extensions/dm-subagents/src/shared/dm-settlement.js +48 -0
- package/extensions/dm-subagents/src/shared/edit-distance.js +23 -0
- package/extensions/dm-subagents/src/shared/extension-context.js +4 -0
- package/extensions/dm-subagents/src/shared/file-lease.js +89 -0
- package/extensions/dm-subagents/src/shared/fork-context.js +0 -1
- package/extensions/dm-subagents/src/shared/formatters.js +1 -6
- package/extensions/dm-subagents/src/shared/model-info.js +23 -0
- package/extensions/dm-subagents/src/shared/package-version.js +12 -0
- package/extensions/dm-subagents/src/shared/parent-wake.js +67 -0
- package/extensions/dm-subagents/src/shared/pruned-fork.js +6 -2
- package/extensions/dm-subagents/src/shared/required-child-extensions.js +35 -5
- package/extensions/dm-subagents/src/shared/runtime-module-path.js +9 -0
- package/extensions/dm-subagents/src/shared/settings-file-lease.js +31 -0
- package/extensions/dm-subagents/src/shared/types.js +3 -1
- package/extensions/dm-subagents/src/shared/utils.js +7 -7
- package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +2 -2
- package/extensions/dm-subagents/src/slash/slash-commands.js +25 -15
- package/extensions/dm-subagents/src/slash/subagent-cost.js +38 -7
- package/extensions/dm-subagents/src/slash/subagents-admin.js +1 -1
- package/extensions/dm-subagents/src/tui/dm-mouse-region.js +12 -0
- package/extensions/dm-subagents/src/tui/fleet-status.js +12 -6
- package/extensions/dm-subagents/src/tui/fleet-transcript.js +6 -2
- package/extensions/dm-subagents/src/tui/fleet.js +20 -6
- package/extensions/dm-subagents/src/tui/render.js +126 -72
- package/extensions/dm-subagents/src/tui/running-tone.js +20 -0
- package/extensions/dm-subagents/src/tui/subagent-messages.js +249 -0
- package/extensions/dm-subagents/src/watchdog/diff-tool.js +19 -11
- package/extensions/dm-subagents/src/watchdog/permission-arbiter.js +2 -2
- package/extensions/dm-subagents/src/watchdog/register-child.js +2 -2
- package/extensions/dm-subagents/src/watchdog/register-main.js +4 -24
- package/extensions/dm-subagents/src/watchdog/render.js +1 -19
- package/extensions/dm-subagents/src/watchdog/review.js +3 -3
- package/extensions/dm-subagents/src/watchdog/runtime.js +6 -2
- package/extensions/dm-subagents/src/watchdog/settings.js +22 -17
- package/extensions/dm-subagents/src/watchdog/tool-actions.js +2 -2
- package/extensions/dm-subagents/src/watchdog/turn-delta.js +1 -1
- package/extensions/dm-subagents/src/workflows/chat-progress.js +2 -2
- package/extensions/dm-subagents/src/workflows/scripted-workflow.js +116 -45
- package/extensions/dm-subagents/src/workflows/structured-workflow-scripts.js +154 -0
- package/extensions/dm-subagents/src/workflows/workflow-checklist.js +3 -0
- package/extensions/dm-subagents/src/workflows/workflow-receipt.js +7 -4
- package/extensions/dm-subagents/src/workflows/workflow-resources.js +52 -17
- package/extensions/dm-subagents/src/workflows/workflow-reuse.js +87 -0
- package/extensions/dm-subagents/src/workflows/workflow-revival.js +80 -0
- package/extensions/dm-tty/control.js +150 -0
- package/extensions/dm-tty/index.js +122 -0
- package/extensions/dm-tty/package.json +20 -0
- package/extensions/dm-tty/pty.js +213 -0
- package/extensions/dm-tty/pty_bridge.py +266 -0
- package/extensions/dm-tty/server.js +438 -0
- package/extensions/dm-tty/sessions.js +97 -0
- package/extensions/dm-tty/standalone.js +75 -0
- package/extensions/dm-tty/web/client.js +1141 -0
- package/extensions/dm-tty/web/index.html +117 -0
- package/extensions/dm-tty/web/style.css +73 -0
- package/extensions/dm-web-access/brave-rate-limit.js +160 -0
- package/extensions/dm-web-access/brave.js +62 -11
- package/extensions/dm-web-access/ceramic.js +197 -0
- package/extensions/dm-web-access/chrome-cookies.js +69 -21
- package/extensions/dm-web-access/curator-page.js +12 -2
- package/extensions/dm-web-access/curator-server.js +10 -0
- package/extensions/dm-web-access/declared-web-links.js +1 -1
- package/extensions/dm-web-access/degoog.js +288 -0
- package/extensions/dm-web-access/dist/index.js +28404 -0
- package/extensions/dm-web-access/dist/mcp-cli.js +28186 -0
- package/extensions/dm-web-access/duckduckgo.js +6 -3
- package/extensions/dm-web-access/endpoint-pdf-extract.js +210 -0
- package/extensions/dm-web-access/exa.js +17 -35
- package/extensions/dm-web-access/extract.js +63 -10
- package/extensions/dm-web-access/firecrawl.js +30 -4
- package/extensions/dm-web-access/gemini-search.js +117 -37
- package/extensions/dm-web-access/gemini-web.js +7 -7
- package/extensions/dm-web-access/github-extract.js +28 -2
- package/extensions/dm-web-access/github-issue-pr.js +88 -73
- package/extensions/dm-web-access/index.js +230 -1161
- package/extensions/dm-web-access/keenable.js +197 -0
- package/extensions/dm-web-access/mcp-cli.js +30 -0
- package/extensions/dm-web-access/mcp-server.js +51 -0
- package/extensions/dm-web-access/mcp-tool-definitions.js +93 -0
- package/extensions/dm-web-access/openai-search.js +70 -20
- package/extensions/dm-web-access/opencode-session-headers.js +1 -1
- package/extensions/dm-web-access/package.json +4 -1
- package/extensions/dm-web-access/page-query.js +5 -10
- package/extensions/dm-web-access/parallel-mcp.js +2 -1
- package/extensions/dm-web-access/pdf-extract.js +34 -1
- package/extensions/dm-web-access/perplexity.js +68 -51
- package/extensions/dm-web-access/query-rewrite.js +3 -4
- package/extensions/dm-web-access/scripts/build.js +8 -0
- package/extensions/dm-web-access/ssrf-protection.js +10 -8
- package/extensions/dm-web-access/storage.js +79 -76
- package/extensions/dm-web-access/summary-model-scope.js +5 -64
- package/extensions/dm-web-access/summary-review.js +35 -9
- package/extensions/dm-web-access/tavily.js +69 -22
- package/extensions/dm-web-access/tool-activation.js +44 -26
- package/extensions/dm-web-access/tool-arguments.js +21 -0
- package/extensions/dm-web-access/utils.js +17 -7
- package/extensions/dm-web-access/video-extract.js +1 -1
- package/extensions/dm-web-access/web-tool-contract.js +0 -0
- package/extensions/dm-web-access/web-tool-core.js +1312 -0
- package/extensions/dm-web-access/you.js +155 -0
- package/extensions/dm-web-access/youtube-extract.js +2 -2
- package/extensions/dm-web-access/zai.js +159 -0
- package/package.json +13 -9
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { chmodSync, existsSync, readFileSync, realpathSync, rmSync, statSync, writeFileSync, mkdirSync, renameSync } from "node:fs";
|
|
1
|
+
import { chmodSync, existsSync, lstatSync, readFileSync, realpathSync, rmSync, statSync, writeFileSync, mkdirSync, renameSync } from "node:fs";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
4
4
|
import { parse as parseToml } from "smol-toml";
|
|
@@ -10,14 +10,15 @@ import { loadClaudePluginBundles } from "./claude-plugin-loader.js";
|
|
|
10
10
|
import { loadPackageMcpConfigs } from "./package-mcp-loader.js";
|
|
11
11
|
import { validateJevSettings } from "./jev-client.js";
|
|
12
12
|
import { formatServerNamespace, isServerDisabled } from "./types.js";
|
|
13
|
-
import { parseJsonWithComments, toStringRecord } from "./utils.js";
|
|
13
|
+
import { getMissingEnvVars, parseJsonWithComments, providerAuthUrlError, stripUtf8Bom, toStringRecord } from "./utils.js";
|
|
14
14
|
const GENERIC_GLOBAL_CONFIG_PATH = join(homedir(), ".config", "mcp", "mcp.json");
|
|
15
15
|
const AGENTS_GLOBAL_CONFIG_PATHS = [
|
|
16
16
|
join(homedir(), ".agents", "mcp.json"),
|
|
17
17
|
join(homedir(), ".agents", "mcp", "mcp.json")
|
|
18
18
|
];
|
|
19
19
|
const PROJECT_CONFIG_NAME = ".mcp.json";
|
|
20
|
-
const
|
|
20
|
+
const PI_MCP_CONFIG_NAME = "mcp.json";
|
|
21
|
+
const ADAPTER_CONFIG_NAME = "mcp-adapter.json";
|
|
21
22
|
const REPOPROMPT_BINARY_CANDIDATES = [
|
|
22
23
|
join(homedir(), "RepoPrompt", "repoprompt_cli"),
|
|
23
24
|
"/Applications/Repo Prompt.app/Contents/MacOS/repoprompt-mcp"
|
|
@@ -41,10 +42,22 @@ export const KNOWN_SERVER_PRESETS = [
|
|
|
41
42
|
summary: "Search the web and fetch pages without an API key.",
|
|
42
43
|
entry: {
|
|
43
44
|
url: "https://search.parallel.ai/mcp",
|
|
45
|
+
headers: { "User-Agent": "dm-mcp-adapter" },
|
|
44
46
|
protocolVersion: "auto",
|
|
45
47
|
directTools: true
|
|
46
48
|
}
|
|
47
49
|
},
|
|
50
|
+
{
|
|
51
|
+
id: "tavily-search",
|
|
52
|
+
name: "Tavily Search",
|
|
53
|
+
summary: "Search the web and extract page content without an API key.",
|
|
54
|
+
entry: {
|
|
55
|
+
url: "https://mcp.tavily.com/mcp/",
|
|
56
|
+
headers: { "X-Tavily-Access-Mode": "keyless" },
|
|
57
|
+
protocolVersion: "auto",
|
|
58
|
+
directTools: ["tavily_search", "tavily_extract"]
|
|
59
|
+
}
|
|
60
|
+
},
|
|
48
61
|
{
|
|
49
62
|
id: "notion",
|
|
50
63
|
name: "Notion",
|
|
@@ -62,6 +75,20 @@ export const KNOWN_SERVER_PRESETS = [
|
|
|
62
75
|
name: "Chrome DevTools",
|
|
63
76
|
summary: "Inspect and automate a local Chrome browser.",
|
|
64
77
|
entry: { command: "npx", args: ["-y", "chrome-devtools-mcp@1.6.0"] }
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
id: "figma",
|
|
81
|
+
name: "Figma (desktop)",
|
|
82
|
+
summary: "Read designs through the Figma desktop app. Needs a Dev or Full seat on a paid Figma plan.",
|
|
83
|
+
entry: { url: "http://127.0.0.1:3845/mcp", protocolVersion: "auto" },
|
|
84
|
+
desktopApp: {
|
|
85
|
+
paths: [
|
|
86
|
+
"/Applications/Figma.app",
|
|
87
|
+
join(homedir(), "Applications", "Figma.app"),
|
|
88
|
+
join(homedir(), "AppData", "Local", "Figma", "Figma.exe")
|
|
89
|
+
],
|
|
90
|
+
enableSteps: "To enable it, open a Design file in Figma, switch to Dev Mode (Shift+D), and click 'Enable desktop MCP server' in the inspect panel."
|
|
91
|
+
}
|
|
65
92
|
}
|
|
66
93
|
];
|
|
67
94
|
const IMPORT_PATHS = {
|
|
@@ -84,7 +111,13 @@ const IMPORT_PATHS = {
|
|
|
84
111
|
vscode: [".vscode/mcp.json"]
|
|
85
112
|
};
|
|
86
113
|
export function getPiGlobalConfigPath(overridePath) {
|
|
87
|
-
return overridePath ? resolve(overridePath) : getAgentPath(
|
|
114
|
+
return overridePath ? resolve(overridePath) : getAgentPath(ADAPTER_CONFIG_NAME);
|
|
115
|
+
}
|
|
116
|
+
export function getPiMcpGlobalConfigPath() {
|
|
117
|
+
return getAgentPath(PI_MCP_CONFIG_NAME);
|
|
118
|
+
}
|
|
119
|
+
export function getPiMcpAuthPath() {
|
|
120
|
+
return getAgentPath("mcp-auth.json");
|
|
88
121
|
}
|
|
89
122
|
export function getGenericGlobalConfigPath() {
|
|
90
123
|
return GENERIC_GLOBAL_CONFIG_PATH;
|
|
@@ -93,7 +126,62 @@ export function getProjectConfigPath(cwd = process.cwd()) {
|
|
|
93
126
|
return resolve(cwd, PROJECT_CONFIG_NAME);
|
|
94
127
|
}
|
|
95
128
|
export function getProjectPiConfigPath(cwd = process.cwd()) {
|
|
96
|
-
return resolve(cwd, getConfigDirName(),
|
|
129
|
+
return resolve(cwd, getConfigDirName(), ADAPTER_CONFIG_NAME);
|
|
130
|
+
}
|
|
131
|
+
export function getProjectPiMcpConfigPath(cwd = process.cwd()) {
|
|
132
|
+
return resolve(cwd, getConfigDirName(), PI_MCP_CONFIG_NAME);
|
|
133
|
+
}
|
|
134
|
+
let piMcpConfigEnabled = false;
|
|
135
|
+
export function setPiMcpConfigEnabled(enabled) {
|
|
136
|
+
piMcpConfigEnabled = enabled;
|
|
137
|
+
}
|
|
138
|
+
export function isPiMcpConfigEnabled() {
|
|
139
|
+
return piMcpConfigEnabled;
|
|
140
|
+
}
|
|
141
|
+
function legacyMcpConfigHasContent(filePath) {
|
|
142
|
+
if (!existsSync(filePath))
|
|
143
|
+
return false;
|
|
144
|
+
try {
|
|
145
|
+
const raw = parseJsonWithComments(readFileSync(filePath, "utf-8"));
|
|
146
|
+
if (!isRecord(raw))
|
|
147
|
+
return false;
|
|
148
|
+
const hasServers = (value) => isRecord(value) && Object.keys(value).length > 0;
|
|
149
|
+
return hasServers(raw.mcpServers) || hasServers(raw["mcp-servers"]) || raw.settings !== undefined || raw.imports !== undefined || raw.claudePlugins !== undefined;
|
|
150
|
+
} catch {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
export function getLegacyMcpMigrationNotices(cwd = process.cwd(), overridePath) {
|
|
155
|
+
if (piMcpConfigEnabled) {
|
|
156
|
+
return getConfigSources(overridePath, cwd).flatMap((source) => {
|
|
157
|
+
const file = isPiMcpSource(source.id) ? readPiMcpConfig(source.readPath) : null;
|
|
158
|
+
if (!file)
|
|
159
|
+
return [];
|
|
160
|
+
const parts = [];
|
|
161
|
+
if (file.adapterKeys.length > 0) {
|
|
162
|
+
const serversHint = file.adapterKeys.includes("mcp-servers") ? `, with "mcp-servers" entries under its "mcpServers" key` : "";
|
|
163
|
+
parts.push(`dm-mcp-adapter does not read ${file.adapterKeys.join(", ")} in this file; move them into ${source.writePath}${serversHint}.`);
|
|
164
|
+
}
|
|
165
|
+
if (file.skipped.length > 0)
|
|
166
|
+
parts.push(`Skipped ${file.skipped.join("; ")}.`);
|
|
167
|
+
if (file.ignoredSettings.size > 0) {
|
|
168
|
+
const ignored = [...file.ignoredSettings].map(([name, settings]) => `"${name}": ${settings.join(", ")}`);
|
|
169
|
+
parts.push(`Ignored settings (details in /mcp-adapter): ${ignored.join("; ")}.`);
|
|
170
|
+
}
|
|
171
|
+
return parts.length > 0 ? [`${source.readPath}: ${parts.join(" ")}`] : [];
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
const explicitPath = overridePath ? resolve(overridePath) : undefined;
|
|
175
|
+
const candidates = [
|
|
176
|
+
[getPiMcpGlobalConfigPath(), getPiGlobalConfigPath()],
|
|
177
|
+
[getProjectPiMcpConfigPath(cwd), getProjectPiConfigPath(cwd)]
|
|
178
|
+
];
|
|
179
|
+
return candidates.flatMap(([source, target]) => {
|
|
180
|
+
if (resolve(source) === explicitPath || !legacyMcpConfigHasContent(source))
|
|
181
|
+
return [];
|
|
182
|
+
const fix = existsSync(target) ? `Merge ${source} into ${target}, then remove ${source}.` : `Move it with: mv ${JSON.stringify(source)} ${JSON.stringify(target)}`;
|
|
183
|
+
return [`dm-mcp-adapter no longer reads ${source}. ${fix}`];
|
|
184
|
+
});
|
|
97
185
|
}
|
|
98
186
|
export function getSharedConfigPath(target, cwd = process.cwd()) {
|
|
99
187
|
return target === "project" ? getProjectConfigPath(cwd) : getGenericGlobalConfigPath();
|
|
@@ -119,7 +207,7 @@ export function findAvailableImportConfigs(cwd = process.cwd()) {
|
|
|
119
207
|
}
|
|
120
208
|
function getConfigSourceSummaries(sourceSpecs) {
|
|
121
209
|
return sourceSpecs.map((source) => {
|
|
122
|
-
const loaded =
|
|
210
|
+
const loaded = readSourceConfig(source.id, source.readPath);
|
|
123
211
|
return {
|
|
124
212
|
id: source.id,
|
|
125
213
|
label: source.label,
|
|
@@ -186,7 +274,8 @@ export function getMcpDiscoverySummary(overridePath, cwd = process.cwd(), option
|
|
|
186
274
|
return {
|
|
187
275
|
...summaryWithoutRepoPrompt,
|
|
188
276
|
fingerprint,
|
|
189
|
-
repoPrompt: detectRepoPrompt(summaryWithoutRepoPrompt, cwd)
|
|
277
|
+
repoPrompt: detectRepoPrompt(summaryWithoutRepoPrompt, cwd),
|
|
278
|
+
knownServerPresets: KNOWN_SERVER_PRESETS.filter(({ desktopApp }) => !desktopApp || desktopApp.paths.some((path) => existsSync(path)))
|
|
190
279
|
};
|
|
191
280
|
}
|
|
192
281
|
export function cloneMcpConfig(config) {
|
|
@@ -198,23 +287,103 @@ export function cloneMcpConfig(config) {
|
|
|
198
287
|
}
|
|
199
288
|
return cloned;
|
|
200
289
|
}
|
|
290
|
+
export const MCP_CONFIG_SOURCE_METADATA = Symbol.for("dm-mcp-adapter/config-source-metadata");
|
|
201
291
|
export function loadMcpConfig(overridePath, cwd = process.cwd()) {
|
|
292
|
+
const loaded = loadMcpConfigWithSources(overridePath, cwd);
|
|
293
|
+
Object.defineProperty(loaded.config, MCP_CONFIG_SOURCE_METADATA, {
|
|
294
|
+
value: { projectServers: loaded.projectServers, projectServerPolicy: loaded.projectServerPolicy },
|
|
295
|
+
enumerable: false
|
|
296
|
+
});
|
|
297
|
+
return loaded.config;
|
|
298
|
+
}
|
|
299
|
+
export function loadMcpConfigWithSources(overridePath, cwd = process.cwd()) {
|
|
202
300
|
const sourceSpecs = getConfigSources(overridePath, cwd);
|
|
203
301
|
const hostConfigDiscovery = getConfiguredHostConfigDiscovery(overridePath, cwd);
|
|
204
|
-
|
|
302
|
+
const projectServers = new Map;
|
|
303
|
+
let projectServerPolicy = "ask";
|
|
304
|
+
let projectAgentPluginSource;
|
|
305
|
+
let projectClaudePluginSource;
|
|
306
|
+
const discoveredHost = !isExclusiveConfigMode() && hostConfigDiscovery === "on" ? loadDiscoveredHostConfigs(cwd) : { config: { mcpServers: {} }, serverSources: new Map };
|
|
307
|
+
let config = discoveredHost.config;
|
|
308
|
+
for (const [name, source] of discoveredHost.serverSources) {
|
|
309
|
+
if (source.scope === "project")
|
|
310
|
+
projectServers.set(name, { path: source.path });
|
|
311
|
+
}
|
|
312
|
+
const piProjectSource = sourceSpecs.find((source) => source.id === "pi-mcp-project");
|
|
313
|
+
const piProjectNames = Object.keys((piProjectSource && readPiMcpConfig(piProjectSource.readPath))?.mcpServers ?? {});
|
|
205
314
|
for (const source of sourceSpecs) {
|
|
206
|
-
const loaded =
|
|
315
|
+
const loaded = readSourceConfig(source.id, source.readPath);
|
|
207
316
|
if (!loaded)
|
|
208
317
|
continue;
|
|
209
|
-
|
|
318
|
+
if (source.id === "pi-mcp-global") {
|
|
319
|
+
for (const name of piProjectNames)
|
|
320
|
+
delete loaded.mcpServers[name];
|
|
321
|
+
}
|
|
322
|
+
const expandedImport = expandImports(loaded, cwd);
|
|
323
|
+
const expanded = expandedImport.config;
|
|
324
|
+
const sourceRef = { path: source.readPath };
|
|
325
|
+
if (Object.hasOwn(expanded.settings ?? {}, "agentPluginPaths")) {
|
|
326
|
+
projectAgentPluginSource = source.scope === "project" ? sourceRef : undefined;
|
|
327
|
+
}
|
|
328
|
+
if (expanded.claudePlugins !== undefined) {
|
|
329
|
+
projectClaudePluginSource = source.scope === "project" ? sourceRef : undefined;
|
|
330
|
+
}
|
|
331
|
+
if (source.scope === "project") {
|
|
332
|
+
for (const name of Object.keys(expanded.mcpServers))
|
|
333
|
+
projectServers.set(name, sourceRef);
|
|
334
|
+
if (expanded.settings?.projectServers !== undefined) {
|
|
335
|
+
console.warn(`Ignoring settings.projectServers in project config ${source.readPath}; set it in the user-global MCP config instead`);
|
|
336
|
+
const { projectServers: _ignored, ...settings } = expanded.settings;
|
|
337
|
+
expanded.settings = settings;
|
|
338
|
+
}
|
|
339
|
+
} else if (expanded.settings?.projectServers === "allow" || expanded.settings?.projectServers === "ask") {
|
|
340
|
+
projectServerPolicy = expanded.settings.projectServers;
|
|
341
|
+
}
|
|
342
|
+
for (const [name, importedSource] of expandedImport.serverSources) {
|
|
343
|
+
if (importedSource.scope === "project")
|
|
344
|
+
projectServers.set(name, { path: importedSource.path });
|
|
345
|
+
}
|
|
346
|
+
config = mergeConfigs(config, expanded);
|
|
347
|
+
}
|
|
348
|
+
if (isExclusiveConfigMode()) {
|
|
349
|
+
return { config: stripProjectProviderAuth(resolveConfiguredClaudePluginMcp(config, cwd), projectServers), projectServers, projectServerPolicy };
|
|
210
350
|
}
|
|
211
|
-
if (isExclusiveConfigMode())
|
|
212
|
-
return resolveConfiguredClaudePluginMcp(config, cwd);
|
|
213
351
|
const packageConfig = loadPackageMcpConfigs(cwd);
|
|
214
352
|
const pluginConfig = loadAgentPluginConfigs(config.settings?.agentPluginPaths, cwd);
|
|
353
|
+
if (projectAgentPluginSource) {
|
|
354
|
+
for (const name of Object.keys(pluginConfig.mcpServers))
|
|
355
|
+
projectServers.set(name, projectAgentPluginSource);
|
|
356
|
+
}
|
|
215
357
|
const packageServers = Object.fromEntries(Object.entries(packageConfig.mcpServers).filter(([name]) => !Object.hasOwn(pluginConfig.mcpServers, name)));
|
|
358
|
+
for (const name of Object.keys(packageServers)) {
|
|
359
|
+
const source = packageConfig.serverSources.get(name);
|
|
360
|
+
if (source?.scope === "project")
|
|
361
|
+
projectServers.set(name, { path: source.settingsPath });
|
|
362
|
+
}
|
|
216
363
|
const higherPrecedenceConfig = mergeConfigs({ mcpServers: packageServers }, mergeConfigs(pluginConfig, config));
|
|
217
|
-
|
|
364
|
+
const claudePluginServers = new Set;
|
|
365
|
+
const mergedConfig = mergeClaudePluginMcpDefaults(config.claudePlugins, higherPrecedenceConfig, cwd, claudePluginServers);
|
|
366
|
+
if (projectClaudePluginSource) {
|
|
367
|
+
for (const name of claudePluginServers)
|
|
368
|
+
projectServers.set(name, projectClaudePluginSource);
|
|
369
|
+
}
|
|
370
|
+
return {
|
|
371
|
+
config: stripProjectProviderAuth(mergedConfig, projectServers),
|
|
372
|
+
projectServers,
|
|
373
|
+
projectServerPolicy
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
function stripProjectProviderAuth(config, projectServers) {
|
|
377
|
+
const stripped = [...projectServers.keys()].filter((name) => typeof config.mcpServers[name]?.auth === "object");
|
|
378
|
+
if (stripped.length === 0)
|
|
379
|
+
return config;
|
|
380
|
+
const mcpServers = { ...config.mcpServers };
|
|
381
|
+
for (const name of stripped) {
|
|
382
|
+
delete mcpServers[name];
|
|
383
|
+
projectServers.delete(name);
|
|
384
|
+
}
|
|
385
|
+
console.warn(`Ignoring MCP servers ${stripped.map((name) => `"${name}"`).join(", ")}: auth.provider is only allowed in user-global config, and project config defines or overrides them`);
|
|
386
|
+
return { ...config, mcpServers };
|
|
218
387
|
}
|
|
219
388
|
export function resolveConfiguredClaudePluginMcp(config, cwd = process.cwd()) {
|
|
220
389
|
return mergeClaudePluginMcpDefaults(config.claudePlugins, config, cwd);
|
|
@@ -222,7 +391,7 @@ export function resolveConfiguredClaudePluginMcp(config, cwd = process.cwd()) {
|
|
|
222
391
|
export function discoverConfiguredClaudePluginSkills(config, cwd = process.cwd()) {
|
|
223
392
|
return loadClaudePluginBundles(config.claudePlugins, cwd, validateConfig, { mcp: false, skills: true }).skillPaths;
|
|
224
393
|
}
|
|
225
|
-
function mergeClaudePluginMcpDefaults(plugins, higherPrecedenceConfig, cwd) {
|
|
394
|
+
function mergeClaudePluginMcpDefaults(plugins, higherPrecedenceConfig, cwd, loadedServerNames) {
|
|
226
395
|
const pluginServers = loadClaudePluginBundles(plugins, cwd, validateConfig, { mcp: true, skills: false }).mcpServers;
|
|
227
396
|
const higherNamesByNamespace = new Map(Object.keys(higherPrecedenceConfig.mcpServers).map((name) => [formatServerNamespace(name), name]));
|
|
228
397
|
const defaults = Object.fromEntries(Object.entries(pluginServers).filter(([name]) => {
|
|
@@ -232,6 +401,8 @@ function mergeClaudePluginMcpDefaults(plugins, higherPrecedenceConfig, cwd) {
|
|
|
232
401
|
console.warn(`Claude plugin MCP server "${name}" is shadowed by higher-precedence server "${higherName}" because both normalize to the same namespace`);
|
|
233
402
|
return false;
|
|
234
403
|
}));
|
|
404
|
+
for (const name of Object.keys(defaults))
|
|
405
|
+
loadedServerNames?.add(name);
|
|
235
406
|
return applySettingDefaults(mergeConfigs({ mcpServers: defaults }, higherPrecedenceConfig));
|
|
236
407
|
}
|
|
237
408
|
function applySettingDefaults(config) {
|
|
@@ -244,7 +415,7 @@ function applySettingDefaults(config) {
|
|
|
244
415
|
function getMergedSettings(overridePath, cwd = process.cwd()) {
|
|
245
416
|
let settings;
|
|
246
417
|
for (const source of getConfigSources(overridePath, cwd)) {
|
|
247
|
-
const loaded =
|
|
418
|
+
const loaded = readSourceConfig(source.id, source.readPath);
|
|
248
419
|
if (loaded?.settings)
|
|
249
420
|
settings = { ...settings, ...loaded.settings };
|
|
250
421
|
}
|
|
@@ -260,15 +431,22 @@ function getConfiguredHostConfigDiscovery(overridePath, cwd = process.cwd()) {
|
|
|
260
431
|
}
|
|
261
432
|
function loadDiscoveredHostConfigs(cwd) {
|
|
262
433
|
let config = { mcpServers: {} };
|
|
434
|
+
const serverSources = new Map;
|
|
263
435
|
for (const importKind of Object.keys(IMPORT_PATHS)) {
|
|
264
436
|
const imported = loadImportedConfig(importKind, cwd, `Failed to discover imported MCP config from ${importKind}:`);
|
|
265
437
|
if (!imported)
|
|
266
438
|
continue;
|
|
439
|
+
const servers = extractServers(imported.value, importKind);
|
|
267
440
|
config = mergeConfigs(config, {
|
|
268
|
-
mcpServers:
|
|
441
|
+
mcpServers: servers
|
|
269
442
|
});
|
|
443
|
+
for (const name of Object.keys(servers)) {
|
|
444
|
+
const source = imported.serverSources.get(name);
|
|
445
|
+
if (source?.scope === "project" || !serverSources.has(name))
|
|
446
|
+
serverSources.set(name, source ?? imported.source);
|
|
447
|
+
}
|
|
270
448
|
}
|
|
271
|
-
return config;
|
|
449
|
+
return { config, serverSources };
|
|
272
450
|
}
|
|
273
451
|
function getConfigConflicts(sourceSpecs, imports, cwd) {
|
|
274
452
|
const seen = new Map;
|
|
@@ -287,7 +465,7 @@ function getConfigConflicts(sourceSpecs, imports, cwd) {
|
|
|
287
465
|
}
|
|
288
466
|
}
|
|
289
467
|
for (const source of sourceSpecs) {
|
|
290
|
-
const loaded =
|
|
468
|
+
const loaded = readSourceConfig(source.id, source.readPath);
|
|
291
469
|
if (!loaded)
|
|
292
470
|
continue;
|
|
293
471
|
if (loaded.imports?.length) {
|
|
@@ -351,24 +529,39 @@ function getConfigSources(overridePath, cwd = process.cwd()) {
|
|
|
351
529
|
scope: "global"
|
|
352
530
|
});
|
|
353
531
|
}
|
|
532
|
+
const piMcpGlobalPath = getPiMcpGlobalConfigPath();
|
|
533
|
+
if (piMcpConfigEnabled && piMcpGlobalPath !== userPath && !sources.some((source) => source.readPath === piMcpGlobalPath)) {
|
|
534
|
+
sources.push({
|
|
535
|
+
id: "pi-mcp-global",
|
|
536
|
+
label: "user-global DM MCP",
|
|
537
|
+
readPath: piMcpGlobalPath,
|
|
538
|
+
writePath: userPath,
|
|
539
|
+
kind: "import",
|
|
540
|
+
importKind: "DM mcp.json",
|
|
541
|
+
shared: true,
|
|
542
|
+
scope: "global"
|
|
543
|
+
});
|
|
544
|
+
}
|
|
354
545
|
sources.push({
|
|
355
546
|
id: "pi-global",
|
|
356
|
-
label: "
|
|
547
|
+
label: "MCP adapter global override",
|
|
357
548
|
readPath: userPath,
|
|
358
549
|
writePath: userPath,
|
|
359
550
|
kind: "user",
|
|
360
551
|
shared: false,
|
|
361
552
|
scope: "global"
|
|
362
553
|
});
|
|
554
|
+
const projectPiMcpPath = getProjectPiMcpConfigPath(cwd);
|
|
363
555
|
const reservedPaths = new Set([
|
|
364
556
|
...sources.map((source) => getConfigPathIdentity(source.readPath)),
|
|
365
557
|
getConfigPathIdentity(projectPath),
|
|
366
|
-
getConfigPathIdentity(projectPiPath)
|
|
558
|
+
getConfigPathIdentity(projectPiPath),
|
|
559
|
+
...piMcpConfigEnabled ? [getConfigPathIdentity(projectPiMcpPath)] : []
|
|
367
560
|
]);
|
|
368
561
|
const ancestorSources = new Map;
|
|
369
562
|
const descriptors = [
|
|
370
563
|
{ id: "shared-project-ancestor", label: "ancestor standard MCP", path: getProjectConfigPath, shared: true },
|
|
371
|
-
{ id: "pi-project-ancestor", label: "ancestor
|
|
564
|
+
{ id: "pi-project-ancestor", label: "ancestor MCP adapter override", path: getProjectPiConfigPath, shared: false }
|
|
372
565
|
];
|
|
373
566
|
const ancestorRoot = getConfiguredAncestorRoot(sources, cwd);
|
|
374
567
|
if (ancestorRoot) {
|
|
@@ -403,10 +596,22 @@ function getConfigSources(overridePath, cwd = process.cwd()) {
|
|
|
403
596
|
scope: "project"
|
|
404
597
|
});
|
|
405
598
|
}
|
|
599
|
+
if (piMcpConfigEnabled && projectPiMcpPath !== userPath && projectPiMcpPath !== piMcpGlobalPath) {
|
|
600
|
+
sources.push({
|
|
601
|
+
id: "pi-mcp-project",
|
|
602
|
+
label: "project DM MCP",
|
|
603
|
+
readPath: projectPiMcpPath,
|
|
604
|
+
writePath: projectPiPath,
|
|
605
|
+
kind: "import",
|
|
606
|
+
importKind: "DM project mcp.json",
|
|
607
|
+
shared: true,
|
|
608
|
+
scope: "project"
|
|
609
|
+
});
|
|
610
|
+
}
|
|
406
611
|
if (projectPiPath !== userPath && projectPiPath !== projectPath) {
|
|
407
612
|
sources.push({
|
|
408
613
|
id: "pi-project",
|
|
409
|
-
label: "project
|
|
614
|
+
label: "project MCP adapter override",
|
|
410
615
|
readPath: projectPiPath,
|
|
411
616
|
writePath: projectPiPath,
|
|
412
617
|
kind: "project",
|
|
@@ -430,7 +635,7 @@ function isWithin(base, target) {
|
|
|
430
635
|
function getConfiguredAncestorRoot(globalSources, cwd) {
|
|
431
636
|
let configured;
|
|
432
637
|
for (const source of globalSources) {
|
|
433
|
-
const roots =
|
|
638
|
+
const roots = readSourceConfig(source.id, source.readPath)?.settings?.ancestorConfigRoots;
|
|
434
639
|
if (roots !== undefined)
|
|
435
640
|
configured = roots;
|
|
436
641
|
}
|
|
@@ -451,11 +656,12 @@ function getConfiguredAncestorRoot(globalSources, cwd) {
|
|
|
451
656
|
}
|
|
452
657
|
try {
|
|
453
658
|
const root = realpathSync(expanded);
|
|
454
|
-
if (!statSync(root).isDirectory() || !isWithin(home, root)
|
|
659
|
+
if (!statSync(root).isDirectory() || !isWithin(home, root))
|
|
455
660
|
throw new Error;
|
|
456
|
-
|
|
661
|
+
if (isWithin(root, canonicalCwd))
|
|
662
|
+
valid.push(root);
|
|
457
663
|
} catch {
|
|
458
|
-
console.warn(`Invalid settings.ancestorConfigRoots entry ${JSON.stringify(entry)}: expected an existing directory under HOME
|
|
664
|
+
console.warn(`Invalid settings.ancestorConfigRoots entry ${JSON.stringify(entry)}: expected an existing directory under HOME`);
|
|
459
665
|
}
|
|
460
666
|
}
|
|
461
667
|
return valid.sort((left, right) => right.length - left.length)[0];
|
|
@@ -556,6 +762,8 @@ function mergeServerMaps(base, next) {
|
|
|
556
762
|
for (const field of URL_BOUND_AUTH_FIELDS) {
|
|
557
763
|
delete baseEntry[field];
|
|
558
764
|
}
|
|
765
|
+
if (typeof baseEntry.auth === "object")
|
|
766
|
+
delete baseEntry.auth;
|
|
559
767
|
if (baseEntry.oauth !== false) {
|
|
560
768
|
delete baseEntry.oauth;
|
|
561
769
|
}
|
|
@@ -577,8 +785,9 @@ function mergeImports(left, right) {
|
|
|
577
785
|
}
|
|
578
786
|
function expandImports(config, cwd = process.cwd()) {
|
|
579
787
|
if (!config.imports?.length)
|
|
580
|
-
return config;
|
|
788
|
+
return { config, serverSources: new Map };
|
|
581
789
|
const importedServers = {};
|
|
790
|
+
const serverSources = new Map;
|
|
582
791
|
for (const importKind of config.imports) {
|
|
583
792
|
const imported = loadImportedConfig(importKind, cwd, `Failed to import MCP config from ${importKind}:`);
|
|
584
793
|
if (!imported)
|
|
@@ -587,18 +796,23 @@ function expandImports(config, cwd = process.cwd()) {
|
|
|
587
796
|
for (const [name, definition] of Object.entries(servers)) {
|
|
588
797
|
if (!importedServers[name]) {
|
|
589
798
|
importedServers[name] = definition;
|
|
799
|
+
serverSources.set(name, imported.serverSources.get(name) ?? imported.source);
|
|
590
800
|
}
|
|
591
801
|
}
|
|
592
802
|
}
|
|
593
803
|
return {
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
804
|
+
config: {
|
|
805
|
+
imports: config.imports,
|
|
806
|
+
...config.settings !== undefined ? { settings: config.settings } : {},
|
|
807
|
+
...config.claudePlugins !== undefined ? { claudePlugins: config.claudePlugins } : {},
|
|
808
|
+
mcpServers: mergeServerMaps(importedServers, config.mcpServers)
|
|
809
|
+
},
|
|
810
|
+
serverSources
|
|
598
811
|
};
|
|
599
812
|
}
|
|
600
813
|
function resolveImportCandidates(importKind, cwd) {
|
|
601
814
|
return (IMPORT_PATHS[importKind] ?? []).map((candidate) => {
|
|
815
|
+
const scope = candidate.startsWith(".") ? "project" : "user";
|
|
602
816
|
if (importKind === "opencode" && candidate === "./opencode.json") {
|
|
603
817
|
const start = resolve(cwd);
|
|
604
818
|
let gitRoot;
|
|
@@ -614,27 +828,29 @@ function resolveImportCandidates(importKind, cwd) {
|
|
|
614
828
|
current = parent;
|
|
615
829
|
}
|
|
616
830
|
if (!gitRoot)
|
|
617
|
-
return join(start, "opencode.json");
|
|
831
|
+
return { path: join(start, "opencode.json"), scope };
|
|
618
832
|
current = start;
|
|
619
833
|
while (true) {
|
|
620
834
|
const projectConfig = join(current, "opencode.json");
|
|
621
835
|
if (existsSync(projectConfig) || current === gitRoot)
|
|
622
|
-
return projectConfig;
|
|
836
|
+
return { path: projectConfig, scope };
|
|
623
837
|
current = dirname(current);
|
|
624
838
|
}
|
|
625
839
|
}
|
|
626
|
-
return candidate.startsWith(".") ? resolve(cwd, candidate) : candidate;
|
|
840
|
+
return { path: candidate.startsWith(".") ? resolve(cwd, candidate) : candidate, scope };
|
|
627
841
|
});
|
|
628
842
|
}
|
|
629
843
|
function readImportedConfig(path) {
|
|
630
844
|
const raw = readFileSync(path, "utf-8");
|
|
631
|
-
return path.endsWith(".toml") ? parseToml(raw) : parseJsonWithComments(raw);
|
|
845
|
+
return path.endsWith(".toml") ? parseToml(stripUtf8Bom(raw)) : parseJsonWithComments(raw);
|
|
632
846
|
}
|
|
633
847
|
function loadImportedConfig(importKind, cwd, warningPrefix) {
|
|
634
848
|
if (importKind === "opencode") {
|
|
635
849
|
let merged = {};
|
|
636
|
-
let
|
|
637
|
-
|
|
850
|
+
let highestPrecedenceSource;
|
|
851
|
+
const serverSources = new Map;
|
|
852
|
+
for (const source of resolveImportCandidates(importKind, cwd)) {
|
|
853
|
+
const { path } = source;
|
|
638
854
|
if (!existsSync(path))
|
|
639
855
|
continue;
|
|
640
856
|
try {
|
|
@@ -658,19 +874,40 @@ function loadImportedConfig(importKind, cwd, warningPrefix) {
|
|
|
658
874
|
}];
|
|
659
875
|
}));
|
|
660
876
|
merged = mergeOpenCodeConfigs(merged, { ...imported, mcp: normalized });
|
|
661
|
-
|
|
877
|
+
for (const name of Object.keys(normalized))
|
|
878
|
+
serverSources.set(name, source);
|
|
879
|
+
highestPrecedenceSource = source;
|
|
662
880
|
}
|
|
663
881
|
} catch (error) {
|
|
664
882
|
console.warn(warningPrefix, error);
|
|
665
883
|
}
|
|
666
884
|
}
|
|
667
|
-
|
|
885
|
+
if (!highestPrecedenceSource)
|
|
886
|
+
return null;
|
|
887
|
+
const finalNames = new Set(Object.keys(extractServers(merged, importKind)));
|
|
888
|
+
for (const name of serverSources.keys()) {
|
|
889
|
+
if (!finalNames.has(name))
|
|
890
|
+
serverSources.delete(name);
|
|
891
|
+
}
|
|
892
|
+
return {
|
|
893
|
+
path: highestPrecedenceSource.path,
|
|
894
|
+
value: merged,
|
|
895
|
+
source: highestPrecedenceSource,
|
|
896
|
+
serverSources
|
|
897
|
+
};
|
|
668
898
|
}
|
|
669
|
-
for (const
|
|
899
|
+
for (const source of resolveImportCandidates(importKind, cwd)) {
|
|
900
|
+
const { path } = source;
|
|
670
901
|
if (!existsSync(path))
|
|
671
902
|
continue;
|
|
672
903
|
try {
|
|
673
|
-
|
|
904
|
+
const value = readImportedConfig(path);
|
|
905
|
+
return {
|
|
906
|
+
path,
|
|
907
|
+
value,
|
|
908
|
+
source,
|
|
909
|
+
serverSources: new Map(Object.keys(extractServers(value, importKind)).map((name) => [name, source]))
|
|
910
|
+
};
|
|
674
911
|
} catch (error) {
|
|
675
912
|
console.warn(warningPrefix, error);
|
|
676
913
|
}
|
|
@@ -693,6 +930,166 @@ function readValidatedConfig(path, label) {
|
|
|
693
930
|
return null;
|
|
694
931
|
}
|
|
695
932
|
}
|
|
933
|
+
function isPiMcpSource(id) {
|
|
934
|
+
return id === "pi-mcp-global" || id === "pi-mcp-project";
|
|
935
|
+
}
|
|
936
|
+
function readSourceConfig(id, path) {
|
|
937
|
+
return isPiMcpSource(id) ? readPiMcpConfig(path) : readValidatedConfig(path, `MCP config from ${path}`);
|
|
938
|
+
}
|
|
939
|
+
const PI_MCP_EXPOSURES = ["codemode", "codemode-deferred", "deferred", "direct", "hidden"];
|
|
940
|
+
function readPiMcpConfig(path) {
|
|
941
|
+
if (!existsSync(path))
|
|
942
|
+
return null;
|
|
943
|
+
let raw;
|
|
944
|
+
try {
|
|
945
|
+
const text = readFileSync(path, "utf-8");
|
|
946
|
+
if (stripJsonComments(text, { trailingCommas: true }).trim() === "")
|
|
947
|
+
return null;
|
|
948
|
+
const parsed = parseJsonWithComments(text);
|
|
949
|
+
if (!isRecord(parsed) || parsed.mcpServers !== undefined && !isRecord(parsed.mcpServers)) {
|
|
950
|
+
throw new Error('expected an object with an "mcpServers" object');
|
|
951
|
+
}
|
|
952
|
+
raw = parsed;
|
|
953
|
+
} catch (error) {
|
|
954
|
+
console.warn(`Failed to load DM MCP config from ${path}:`, error);
|
|
955
|
+
return null;
|
|
956
|
+
}
|
|
957
|
+
const file = {
|
|
958
|
+
mcpServers: {},
|
|
959
|
+
adapterKeys: ["settings", "imports", "claudePlugins", "mcp-servers"].filter((key) => raw[key] !== undefined),
|
|
960
|
+
skipped: [],
|
|
961
|
+
ignoredSettings: new Map
|
|
962
|
+
};
|
|
963
|
+
for (const [name, value] of Object.entries(raw.mcpServers ?? {})) {
|
|
964
|
+
const translated = translatePiMcpServer(name, value);
|
|
965
|
+
if (typeof translated === "string") {
|
|
966
|
+
file.skipped.push(`"${name}" (${translated})`);
|
|
967
|
+
continue;
|
|
968
|
+
}
|
|
969
|
+
file.mcpServers[name] = translated.entry;
|
|
970
|
+
if (translated.ignored.length > 0)
|
|
971
|
+
file.ignoredSettings.set(name, translated.ignored);
|
|
972
|
+
}
|
|
973
|
+
return file;
|
|
974
|
+
}
|
|
975
|
+
export function translatePiMcpServer(name, value) {
|
|
976
|
+
if (!/^[A-Za-z0-9_-]+$/.test(name))
|
|
977
|
+
return 'invalid server name (use letters, digits, "_" and "-")';
|
|
978
|
+
if (!isRecord(value))
|
|
979
|
+
return "must be an object";
|
|
980
|
+
const { type, command, args, env, cwd, url, headers, oauth, exposure, toolExposure, enabled, timeout, auth, description, ...unknown } = value;
|
|
981
|
+
const isExposure = (candidate) => typeof candidate === "string" && PI_MCP_EXPOSURES.includes(candidate);
|
|
982
|
+
if (exposure !== undefined && !isExposure(exposure))
|
|
983
|
+
return `exposure must be one of ${PI_MCP_EXPOSURES.join(", ")}`;
|
|
984
|
+
if (toolExposure !== undefined && (!isRecord(toolExposure) || !Object.values(toolExposure).every(isExposure))) {
|
|
985
|
+
return `toolExposure must map tool names to one of ${PI_MCP_EXPOSURES.join(", ")}`;
|
|
986
|
+
}
|
|
987
|
+
if (enabled !== undefined && typeof enabled !== "boolean")
|
|
988
|
+
return "enabled must be a boolean";
|
|
989
|
+
if (timeout !== undefined && (typeof timeout !== "number" || !(timeout > 0)))
|
|
990
|
+
return "timeout must be a positive number of seconds";
|
|
991
|
+
if (description !== undefined && typeof description !== "string")
|
|
992
|
+
return "description must be a string";
|
|
993
|
+
if (type === "sse")
|
|
994
|
+
return "legacy SSE transport is not supported; use the streamable HTTP URL";
|
|
995
|
+
const ignored = Object.keys(unknown);
|
|
996
|
+
let entry;
|
|
997
|
+
let otherTransportKeys;
|
|
998
|
+
if (typeof url === "string" && (type === undefined || type === "http" || type === "streamable-http")) {
|
|
999
|
+
if (!URL.canParse(url) || !/^https?:$/.test(new URL(url).protocol))
|
|
1000
|
+
return "url must be an http or https URL";
|
|
1001
|
+
if (headers !== undefined && !isStringRecord(headers))
|
|
1002
|
+
return "headers must map names to strings";
|
|
1003
|
+
const translatedOAuth = oauth === undefined ? undefined : translatePiOAuth(oauth);
|
|
1004
|
+
if (typeof translatedOAuth === "string")
|
|
1005
|
+
return translatedOAuth;
|
|
1006
|
+
entry = { url, ...headers !== undefined ? { headers } : {}, ...translatedOAuth ? { oauth: translatedOAuth.oauth } : {} };
|
|
1007
|
+
if (auth !== undefined) {
|
|
1008
|
+
if (!isRecord(auth) || typeof auth.provider !== "string" || !auth.provider)
|
|
1009
|
+
return "auth.provider must be a provider name";
|
|
1010
|
+
const urlError = providerAuthUrlError(url);
|
|
1011
|
+
if (urlError)
|
|
1012
|
+
return urlError;
|
|
1013
|
+
entry.auth = { provider: auth.provider };
|
|
1014
|
+
}
|
|
1015
|
+
ignored.push(...translatedOAuth?.ignored ?? []);
|
|
1016
|
+
otherTransportKeys = ["command", "args", "env", "cwd"];
|
|
1017
|
+
} else if (typeof command === "string" && (type === undefined || type === "stdio")) {
|
|
1018
|
+
if (args !== undefined && !(Array.isArray(args) && args.every((arg) => typeof arg === "string")))
|
|
1019
|
+
return "args must be an array of strings";
|
|
1020
|
+
if (env !== undefined && !isStringRecord(env))
|
|
1021
|
+
return "env must map names to strings";
|
|
1022
|
+
if (cwd !== undefined && typeof cwd !== "string")
|
|
1023
|
+
return "cwd must be a string";
|
|
1024
|
+
entry = {
|
|
1025
|
+
command,
|
|
1026
|
+
...args !== undefined ? { args } : {},
|
|
1027
|
+
...env !== undefined ? { env } : {},
|
|
1028
|
+
...cwd !== undefined ? { cwd } : {}
|
|
1029
|
+
};
|
|
1030
|
+
otherTransportKeys = ["url", "headers", "oauth", "auth"];
|
|
1031
|
+
} else {
|
|
1032
|
+
return 'needs either "command" (stdio) or "url" (streamable HTTP)';
|
|
1033
|
+
}
|
|
1034
|
+
ignored.push(...otherTransportKeys.filter((key) => value[key] !== undefined));
|
|
1035
|
+
if (description !== undefined)
|
|
1036
|
+
entry.description = description;
|
|
1037
|
+
const serverExposure = exposure === undefined || exposure === "codemode-deferred" ? "codemode" : exposure;
|
|
1038
|
+
if (enabled === false || serverExposure === "hidden")
|
|
1039
|
+
entry.disabled = true;
|
|
1040
|
+
if (serverExposure === "direct")
|
|
1041
|
+
entry.directTools = true;
|
|
1042
|
+
if (serverExposure === "deferred")
|
|
1043
|
+
entry.directTools = "search";
|
|
1044
|
+
if (timeout !== undefined)
|
|
1045
|
+
entry.requestTimeoutMs = Math.round(timeout * 1000);
|
|
1046
|
+
const directTools = [];
|
|
1047
|
+
const excludeTools = [];
|
|
1048
|
+
for (const [tool, rawValue] of Object.entries(toolExposure ?? {})) {
|
|
1049
|
+
const toolValue = rawValue === "codemode-deferred" ? "codemode" : rawValue;
|
|
1050
|
+
if (toolValue === serverExposure)
|
|
1051
|
+
continue;
|
|
1052
|
+
if (toolValue === "hidden")
|
|
1053
|
+
excludeTools.push(tool);
|
|
1054
|
+
else if (toolValue === "direct" && !tool.includes("*") && serverExposure === "codemode")
|
|
1055
|
+
directTools.push(tool);
|
|
1056
|
+
else
|
|
1057
|
+
ignored.push(`toolExposure ${JSON.stringify(tool)}: ${toolValue}`);
|
|
1058
|
+
}
|
|
1059
|
+
if (directTools.length > 0)
|
|
1060
|
+
entry.directTools = directTools;
|
|
1061
|
+
if (excludeTools.length > 0)
|
|
1062
|
+
entry.excludeTools = excludeTools;
|
|
1063
|
+
return { entry, ignored };
|
|
1064
|
+
}
|
|
1065
|
+
function translatePiOAuth(oauth) {
|
|
1066
|
+
if (!isRecord(oauth))
|
|
1067
|
+
return "oauth must be an object";
|
|
1068
|
+
const { clientId, clientSecret, scope, clientName, callbackPort, callbackUrl, ...unknown } = oauth;
|
|
1069
|
+
const copied = { clientId, clientSecret, scope, clientName };
|
|
1070
|
+
for (const [key, field] of Object.entries(copied)) {
|
|
1071
|
+
if (field !== undefined && (typeof field !== "string" || key === "clientName" && !field.trim())) {
|
|
1072
|
+
return `oauth.${key} must be a ${key === "clientName" ? "non-empty " : ""}string`;
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
if (callbackPort !== undefined && (typeof callbackPort !== "number" || !Number.isInteger(callbackPort) || callbackPort < 1 || callbackPort > 65535)) {
|
|
1076
|
+
return "oauth.callbackPort must be a port number";
|
|
1077
|
+
}
|
|
1078
|
+
const result = Object.fromEntries(Object.entries(copied).filter(([, field]) => field !== undefined));
|
|
1079
|
+
if (callbackUrl !== undefined) {
|
|
1080
|
+
const parsed = typeof callbackUrl === "string" && URL.canParse(callbackUrl) ? new URL(callbackUrl) : undefined;
|
|
1081
|
+
if (!parsed || parsed.protocol !== "http:" || !["localhost", "127.0.0.1", "[::1]"].includes(parsed.hostname) || parsed.search !== "" || parsed.hash !== "") {
|
|
1082
|
+
return "oauth.callbackUrl must be an http URI on localhost, 127.0.0.1, or [::1] without query or fragment";
|
|
1083
|
+
}
|
|
1084
|
+
if (parsed.port && callbackPort !== undefined && Number(parsed.port) !== callbackPort) {
|
|
1085
|
+
return "oauth.callbackUrl and oauth.callbackPort name different ports";
|
|
1086
|
+
}
|
|
1087
|
+
result.redirectUri = parsed.port ? callbackUrl : `http://${parsed.hostname}:${callbackPort ?? "{port}"}${parsed.pathname}`;
|
|
1088
|
+
} else if (callbackPort !== undefined) {
|
|
1089
|
+
result.redirectUri = `http://127.0.0.1:${callbackPort}/callback`;
|
|
1090
|
+
}
|
|
1091
|
+
return { oauth: result, ignored: Object.keys(unknown).map((key) => `oauth.${key}`) };
|
|
1092
|
+
}
|
|
696
1093
|
function validateConfig(raw) {
|
|
697
1094
|
if (!isRecord(raw)) {
|
|
698
1095
|
return { mcpServers: {} };
|
|
@@ -746,8 +1143,24 @@ function toServerEntries(servers) {
|
|
|
746
1143
|
return {};
|
|
747
1144
|
const entries = {};
|
|
748
1145
|
for (const [name, entry] of Object.entries(servers)) {
|
|
749
|
-
if (isServerEntry(entry))
|
|
750
|
-
|
|
1146
|
+
if (!isServerEntry(entry))
|
|
1147
|
+
continue;
|
|
1148
|
+
const auth = entry.auth;
|
|
1149
|
+
if (typeof auth === "object") {
|
|
1150
|
+
const provider = isRecord(auth) ? auth.provider : undefined;
|
|
1151
|
+
const error = typeof provider !== "string" || !provider ? "auth.provider must be a provider name" : typeof entry.url !== "string" ? "auth.provider requires a url" : getMissingEnvVars(entry.url, {}).length > 0 ? undefined : providerAuthUrlError(entry.url);
|
|
1152
|
+
if (error) {
|
|
1153
|
+
console.warn(`Ignoring MCP server "${name}": ${error}`);
|
|
1154
|
+
continue;
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
if (entry.description !== undefined && typeof entry.description !== "string") {
|
|
1158
|
+
console.warn(`Ignoring invalid description for MCP server "${name}": expected a string`);
|
|
1159
|
+
const { description: _description, ...rest } = entry;
|
|
1160
|
+
entries[name] = rest;
|
|
1161
|
+
continue;
|
|
1162
|
+
}
|
|
1163
|
+
entries[name] = entry;
|
|
751
1164
|
}
|
|
752
1165
|
return entries;
|
|
753
1166
|
}
|
|
@@ -757,6 +1170,9 @@ function isServerEntry(value) {
|
|
|
757
1170
|
function isRecord(value) {
|
|
758
1171
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
759
1172
|
}
|
|
1173
|
+
function isStringRecord(value) {
|
|
1174
|
+
return isRecord(value) && Object.values(value).every((entry) => typeof entry === "string");
|
|
1175
|
+
}
|
|
760
1176
|
function mergeOpenCodeConfigs(base, next) {
|
|
761
1177
|
const baseMcp = base.mcp;
|
|
762
1178
|
const nextMcp = next.mcp;
|
|
@@ -908,7 +1324,7 @@ function extractServers(config, kind) {
|
|
|
908
1324
|
delete mapped.env_http_headers;
|
|
909
1325
|
mappedServers[name] = mapped;
|
|
910
1326
|
}
|
|
911
|
-
return mappedServers;
|
|
1327
|
+
return toServerEntries(mappedServers);
|
|
912
1328
|
}
|
|
913
1329
|
function serializeRawConfig(raw) {
|
|
914
1330
|
return `${JSON.stringify(raw, null, 2)}
|
|
@@ -971,21 +1387,31 @@ function buildConfigWritePreview(filePath, nextRaw) {
|
|
|
971
1387
|
};
|
|
972
1388
|
}
|
|
973
1389
|
function readRawConfigObject(filePath) {
|
|
974
|
-
if (!
|
|
1390
|
+
if (!lstatSync(filePath, { throwIfNoEntry: false }))
|
|
975
1391
|
return {};
|
|
976
1392
|
try {
|
|
977
|
-
const
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
1393
|
+
const text = readFileSync(filePath, "utf-8");
|
|
1394
|
+
if (text.trim() === "")
|
|
1395
|
+
return {};
|
|
1396
|
+
const raw = parseJsonWithComments(text);
|
|
1397
|
+
if (!isRecord(raw))
|
|
1398
|
+
throw new Error("top-level value must be an object");
|
|
1399
|
+
return raw;
|
|
1400
|
+
} catch (error) {
|
|
1401
|
+
throw new Error(`Failed to read MCP config at ${filePath}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
981
1402
|
}
|
|
982
1403
|
}
|
|
983
1404
|
function writeConfigText(writePath, text) {
|
|
1405
|
+
const originalPath = writePath;
|
|
984
1406
|
let mode;
|
|
985
1407
|
try {
|
|
986
1408
|
writePath = realpathSync(writePath);
|
|
987
1409
|
mode = statSync(writePath).mode & 511;
|
|
988
|
-
} catch {
|
|
1410
|
+
} catch (error) {
|
|
1411
|
+
if (lstatSync(originalPath, { throwIfNoEntry: false })?.isSymbolicLink()) {
|
|
1412
|
+
throw new Error(`Cannot write MCP config at ${originalPath}: symbolic link target is unavailable`, { cause: error });
|
|
1413
|
+
}
|
|
1414
|
+
}
|
|
989
1415
|
mkdirSync(dirname(writePath), { recursive: true });
|
|
990
1416
|
const tmpPath = `${writePath}.${process.pid}.tmp`;
|
|
991
1417
|
rmSync(tmpPath, { force: true });
|
|
@@ -1012,17 +1438,7 @@ export function writeSharedConfigText(filePath, text) {
|
|
|
1012
1438
|
}
|
|
1013
1439
|
export function writeJevSemanticSearchConfig(overridePath, cwd, allowedServers, effectiveJev) {
|
|
1014
1440
|
const filePath = overridePath ? getPiGlobalConfigPath(overridePath) : getProjectPiConfigPath(cwd);
|
|
1015
|
-
|
|
1016
|
-
if (existsSync(filePath)) {
|
|
1017
|
-
try {
|
|
1018
|
-
const parsed = parseJsonWithComments(readFileSync(filePath, "utf8"));
|
|
1019
|
-
if (!isRecord(parsed))
|
|
1020
|
-
throw new Error("top-level value must be an object");
|
|
1021
|
-
raw = parsed;
|
|
1022
|
-
} catch (error) {
|
|
1023
|
-
throw new Error(`Failed to update Jev settings at ${filePath}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
1024
|
-
}
|
|
1025
|
-
}
|
|
1441
|
+
const raw = readRawConfigObject(filePath);
|
|
1026
1442
|
if (raw.settings !== undefined && !isRecord(raw.settings)) {
|
|
1027
1443
|
throw new Error(`Failed to update Jev settings at ${filePath}: settings must be an object`);
|
|
1028
1444
|
}
|
|
@@ -1041,12 +1457,21 @@ export function writeJevSemanticSearchConfig(overridePath, cwd, allowedServers,
|
|
|
1041
1457
|
writeRawConfigObject(filePath, raw);
|
|
1042
1458
|
return { path: filePath, changed: true };
|
|
1043
1459
|
}
|
|
1044
|
-
function getServersObject(raw) {
|
|
1045
|
-
const
|
|
1046
|
-
|
|
1047
|
-
|
|
1460
|
+
function getServersObject(raw, filePath) {
|
|
1461
|
+
for (const key of ["mcpServers", "mcp-servers"]) {
|
|
1462
|
+
if (Object.hasOwn(raw, key) && !isRecord(raw[key])) {
|
|
1463
|
+
throw new Error(`Failed to update MCP config at ${filePath}: ${key} must be an object`);
|
|
1464
|
+
}
|
|
1465
|
+
}
|
|
1466
|
+
return raw.mcpServers ?? raw["mcp-servers"] ?? {};
|
|
1467
|
+
}
|
|
1468
|
+
function getConfigImports(raw, filePath) {
|
|
1469
|
+
if (raw.imports === undefined)
|
|
1470
|
+
return [];
|
|
1471
|
+
if (!Array.isArray(raw.imports) || raw.imports.some((value) => typeof value !== "string")) {
|
|
1472
|
+
throw new Error(`Failed to update MCP config at ${filePath}: imports must be an array of strings`);
|
|
1048
1473
|
}
|
|
1049
|
-
return
|
|
1474
|
+
return raw.imports;
|
|
1050
1475
|
}
|
|
1051
1476
|
function setServersObject(raw, servers) {
|
|
1052
1477
|
delete raw["mcp-servers"];
|
|
@@ -1054,18 +1479,7 @@ function setServersObject(raw, servers) {
|
|
|
1054
1479
|
}
|
|
1055
1480
|
export function writeProjectServerDisabledOverride(overridePath, cwd, serverName, disabled) {
|
|
1056
1481
|
const filePath = getProjectPiConfigPath(cwd);
|
|
1057
|
-
|
|
1058
|
-
if (existsSync(filePath)) {
|
|
1059
|
-
try {
|
|
1060
|
-
const parsed = parseJsonWithComments(readFileSync(filePath, "utf-8"));
|
|
1061
|
-
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
1062
|
-
throw new Error("root value must be an object");
|
|
1063
|
-
}
|
|
1064
|
-
raw = parsed;
|
|
1065
|
-
} catch (error) {
|
|
1066
|
-
throw new Error(`Failed to read project MCP override at ${filePath}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
1067
|
-
}
|
|
1068
|
-
}
|
|
1482
|
+
const raw = readRawConfigObject(filePath);
|
|
1069
1483
|
const serverKey = raw.mcpServers !== undefined ? "mcpServers" : raw["mcp-servers"] !== undefined ? "mcp-servers" : "mcpServers";
|
|
1070
1484
|
const rawServers = raw[serverKey];
|
|
1071
1485
|
if (rawServers !== undefined && (!rawServers || typeof rawServers !== "object" || Array.isArray(rawServers))) {
|
|
@@ -1086,15 +1500,15 @@ export function writeProjectServerDisabledOverride(overridePath, cwd, serverName
|
|
|
1086
1500
|
for (const source of getConfigSources(overridePath, cwd)) {
|
|
1087
1501
|
if (source.readPath === filePath)
|
|
1088
1502
|
continue;
|
|
1089
|
-
const loaded =
|
|
1503
|
+
const loaded = readSourceConfig(source.id, source.readPath);
|
|
1090
1504
|
if (loaded)
|
|
1091
|
-
lowerConfig = mergeConfigs(lowerConfig, expandImports(loaded, cwd));
|
|
1505
|
+
lowerConfig = mergeConfigs(lowerConfig, expandImports(loaded, cwd).config);
|
|
1092
1506
|
}
|
|
1093
1507
|
if (raw.imports !== undefined) {
|
|
1094
1508
|
if (!Array.isArray(raw.imports) || raw.imports.some((kind) => typeof kind !== "string" || !Object.hasOwn(IMPORT_PATHS, kind))) {
|
|
1095
1509
|
throw new Error(`Failed to update project MCP override at ${filePath}: imports contains an unsupported config kind`);
|
|
1096
1510
|
}
|
|
1097
|
-
lowerConfig = mergeConfigs(lowerConfig, expandImports({ mcpServers: {}, imports: raw.imports }, cwd));
|
|
1511
|
+
lowerConfig = mergeConfigs(lowerConfig, expandImports({ mcpServers: {}, imports: raw.imports }, cwd).config);
|
|
1098
1512
|
}
|
|
1099
1513
|
if (isServerDisabled(lowerConfig.mcpServers[serverName]))
|
|
1100
1514
|
next.disabled = false;
|
|
@@ -1144,7 +1558,7 @@ function detectRepoPrompt(summary, cwd = process.cwd()) {
|
|
|
1144
1558
|
for (const source of summary.sources) {
|
|
1145
1559
|
if (source.kind !== "shared" || source.serverCount === 0)
|
|
1146
1560
|
continue;
|
|
1147
|
-
const config =
|
|
1561
|
+
const config = readSourceConfig(source.id, source.path);
|
|
1148
1562
|
if (!config)
|
|
1149
1563
|
continue;
|
|
1150
1564
|
for (const [name, entry] of Object.entries(config.mcpServers)) {
|
|
@@ -1170,23 +1584,23 @@ function detectRepoPrompt(summary, cwd = process.cwd()) {
|
|
|
1170
1584
|
export function previewCompatibilityImports(importKinds, overridePath) {
|
|
1171
1585
|
const targetPath = getPiGlobalConfigPath(overridePath);
|
|
1172
1586
|
const raw = readRawConfigObject(targetPath);
|
|
1173
|
-
const currentImports =
|
|
1587
|
+
const currentImports = getConfigImports(raw, targetPath);
|
|
1174
1588
|
const merged = [...new Set([...currentImports, ...importKinds])];
|
|
1175
1589
|
const nextRaw = { ...raw, imports: merged };
|
|
1176
|
-
setServersObject(nextRaw, getServersObject(nextRaw));
|
|
1590
|
+
setServersObject(nextRaw, getServersObject(nextRaw, targetPath));
|
|
1177
1591
|
return buildConfigWritePreview(targetPath, nextRaw);
|
|
1178
1592
|
}
|
|
1179
1593
|
export function ensureCompatibilityImports(importKinds, overridePath) {
|
|
1180
1594
|
const targetPath = getPiGlobalConfigPath(overridePath);
|
|
1181
1595
|
const raw = readRawConfigObject(targetPath);
|
|
1182
|
-
const currentImports =
|
|
1596
|
+
const currentImports = getConfigImports(raw, targetPath);
|
|
1183
1597
|
const merged = [...new Set([...currentImports, ...importKinds])];
|
|
1184
1598
|
const added = merged.filter((kind) => !currentImports.includes(kind));
|
|
1185
1599
|
if (added.length === 0) {
|
|
1186
1600
|
return { path: targetPath, added: [] };
|
|
1187
1601
|
}
|
|
1188
1602
|
raw.imports = merged;
|
|
1189
|
-
const servers = getServersObject(raw);
|
|
1603
|
+
const servers = getServersObject(raw, targetPath);
|
|
1190
1604
|
setServersObject(raw, servers);
|
|
1191
1605
|
writeRawConfigObject(targetPath, raw);
|
|
1192
1606
|
return { path: targetPath, added };
|
|
@@ -1196,13 +1610,19 @@ export function buildStarterProjectConfig() {
|
|
|
1196
1610
|
mcpServers: {}
|
|
1197
1611
|
};
|
|
1198
1612
|
}
|
|
1613
|
+
function assertScaffoldTargetAbsent(filePath) {
|
|
1614
|
+
if (lstatSync(filePath, { throwIfNoEntry: false }))
|
|
1615
|
+
throw new Error(`Cannot scaffold MCP config at ${filePath}: file already exists`);
|
|
1616
|
+
}
|
|
1199
1617
|
export function previewStarterSharedConfig(target, cwd = process.cwd()) {
|
|
1200
1618
|
const targetPath = getSharedConfigPath(target, cwd);
|
|
1619
|
+
assertScaffoldTargetAbsent(targetPath);
|
|
1201
1620
|
const nextRaw = { mcpServers: buildStarterProjectConfig().mcpServers };
|
|
1202
1621
|
return buildConfigWritePreview(targetPath, nextRaw);
|
|
1203
1622
|
}
|
|
1204
1623
|
export function writeStarterSharedConfig(target, cwd = process.cwd()) {
|
|
1205
1624
|
const targetPath = getSharedConfigPath(target, cwd);
|
|
1625
|
+
assertScaffoldTargetAbsent(targetPath);
|
|
1206
1626
|
const raw = { mcpServers: buildStarterProjectConfig().mcpServers };
|
|
1207
1627
|
writeRawConfigObject(targetPath, raw);
|
|
1208
1628
|
return targetPath;
|
|
@@ -1216,14 +1636,14 @@ export function writeStarterProjectConfig(cwd = process.cwd()) {
|
|
|
1216
1636
|
export function previewSharedServerEntry(filePath, serverName, entry) {
|
|
1217
1637
|
const raw = readRawConfigObject(filePath);
|
|
1218
1638
|
const nextRaw = { ...raw };
|
|
1219
|
-
const servers = getServersObject(nextRaw);
|
|
1639
|
+
const servers = getServersObject(nextRaw, filePath);
|
|
1220
1640
|
servers[serverName] = entry;
|
|
1221
1641
|
setServersObject(nextRaw, servers);
|
|
1222
1642
|
return buildConfigWritePreview(filePath, nextRaw);
|
|
1223
1643
|
}
|
|
1224
1644
|
export function writeSharedServerEntry(filePath, serverName, entry) {
|
|
1225
1645
|
const raw = readRawConfigObject(filePath);
|
|
1226
|
-
const servers = getServersObject(raw);
|
|
1646
|
+
const servers = getServersObject(raw, filePath);
|
|
1227
1647
|
servers[serverName] = entry;
|
|
1228
1648
|
setServersObject(raw, servers);
|
|
1229
1649
|
writeRawConfigObject(filePath, raw);
|
|
@@ -1243,7 +1663,7 @@ export function getServerProvenance(overridePath, cwd = process.cwd()) {
|
|
|
1243
1663
|
}
|
|
1244
1664
|
}
|
|
1245
1665
|
for (const source of getConfigSources(overridePath, cwd)) {
|
|
1246
|
-
const loaded =
|
|
1666
|
+
const loaded = readSourceConfig(source.id, source.readPath);
|
|
1247
1667
|
if (!loaded)
|
|
1248
1668
|
continue;
|
|
1249
1669
|
if (loaded.imports?.length) {
|
|
@@ -1260,16 +1680,18 @@ export function getServerProvenance(overridePath, cwd = process.cwd()) {
|
|
|
1260
1680
|
}
|
|
1261
1681
|
}
|
|
1262
1682
|
for (const name of Object.keys(loaded.mcpServers)) {
|
|
1683
|
+
const ignoredSettings = loaded.ignoredSettings ? loaded.ignoredSettings.get(name) : provenance.get(name)?.ignoredSettings;
|
|
1263
1684
|
provenance.set(name, {
|
|
1264
1685
|
path: source.writePath,
|
|
1265
1686
|
kind: source.kind,
|
|
1266
|
-
...source.importKind !== undefined ? { importKind: source.importKind } : {}
|
|
1687
|
+
...source.importKind !== undefined ? { importKind: source.importKind } : {},
|
|
1688
|
+
...ignoredSettings !== undefined ? { ignoredSettings } : {}
|
|
1267
1689
|
});
|
|
1268
1690
|
}
|
|
1269
1691
|
}
|
|
1270
1692
|
return provenance;
|
|
1271
1693
|
}
|
|
1272
|
-
export function writeDirectToolsConfig(changes, provenance, fullConfig) {
|
|
1694
|
+
export function writeDirectToolsConfig(changes, provenance, fullConfig, onFileWritten) {
|
|
1273
1695
|
const byPath = new Map;
|
|
1274
1696
|
for (const [serverName, value] of changes) {
|
|
1275
1697
|
const prov = provenance.get(serverName);
|
|
@@ -1280,9 +1702,11 @@ export function writeDirectToolsConfig(changes, provenance, fullConfig) {
|
|
|
1280
1702
|
byPath.set(targetPath, []);
|
|
1281
1703
|
byPath.get(targetPath).push({ name: serverName, value, prov });
|
|
1282
1704
|
}
|
|
1705
|
+
for (const filePath of byPath.keys())
|
|
1706
|
+
getServersObject(readRawConfigObject(filePath), filePath);
|
|
1283
1707
|
for (const [filePath, entries] of byPath) {
|
|
1284
1708
|
const raw = readRawConfigObject(filePath);
|
|
1285
|
-
const servers = getServersObject(raw);
|
|
1709
|
+
const servers = getServersObject(raw, filePath);
|
|
1286
1710
|
for (const { name, value, prov } of entries) {
|
|
1287
1711
|
if (prov.kind === "import") {
|
|
1288
1712
|
const fullDef = fullConfig.mcpServers[name];
|
|
@@ -1295,6 +1719,7 @@ export function writeDirectToolsConfig(changes, provenance, fullConfig) {
|
|
|
1295
1719
|
}
|
|
1296
1720
|
setServersObject(raw, servers);
|
|
1297
1721
|
writeRawConfigObject(filePath, raw);
|
|
1722
|
+
onFileWritten?.();
|
|
1298
1723
|
}
|
|
1299
1724
|
}
|
|
1300
1725
|
export function resolveConfiguredOAuthDir(raw, cwd = process.cwd()) {
|