@duckmind/dm-darwin-x64 0.66.5 → 0.66.7
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 +541 -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 +1143 -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,86 @@ 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
|
+
function migrateLegacyMcpConfig(source, target) {
|
|
155
|
+
if (!existsSync(source) || existsSync(target))
|
|
156
|
+
return;
|
|
157
|
+
try {
|
|
158
|
+
const sourceStat = lstatSync(source);
|
|
159
|
+
if (!sourceStat.isFile())
|
|
160
|
+
return;
|
|
161
|
+
const raw = readFileSync(source, "utf-8");
|
|
162
|
+
const parsed = parseJsonWithComments(raw);
|
|
163
|
+
if (!isRecord(parsed))
|
|
164
|
+
return;
|
|
165
|
+
mkdirSync(dirname(target), { recursive: true, mode: 448 });
|
|
166
|
+
const temporary = `${target}.tmp-${process.pid}-${Date.now()}`;
|
|
167
|
+
writeFileSync(temporary, raw, { encoding: "utf-8", mode: sourceStat.mode & 511 });
|
|
168
|
+
renameSync(temporary, target);
|
|
169
|
+
rmSync(source);
|
|
170
|
+
return `Migrated ${source} to ${target}.`;
|
|
171
|
+
} catch {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
export function getLegacyMcpMigrationNotices(cwd = process.cwd(), overridePath) {
|
|
176
|
+
if (piMcpConfigEnabled) {
|
|
177
|
+
return getConfigSources(overridePath, cwd).flatMap((source) => {
|
|
178
|
+
const file = isPiMcpSource(source.id) ? readPiMcpConfig(source.readPath) : null;
|
|
179
|
+
if (!file)
|
|
180
|
+
return [];
|
|
181
|
+
const parts = [];
|
|
182
|
+
if (file.adapterKeys.length > 0) {
|
|
183
|
+
const serversHint = file.adapterKeys.includes("mcp-servers") ? `, with "mcp-servers" entries under its "mcpServers" key` : "";
|
|
184
|
+
parts.push(`dm-mcp-adapter does not read ${file.adapterKeys.join(", ")} in this file; move them into ${source.writePath}${serversHint}.`);
|
|
185
|
+
}
|
|
186
|
+
if (file.skipped.length > 0)
|
|
187
|
+
parts.push(`Skipped ${file.skipped.join("; ")}.`);
|
|
188
|
+
if (file.ignoredSettings.size > 0) {
|
|
189
|
+
const ignored = [...file.ignoredSettings].map(([name, settings]) => `"${name}": ${settings.join(", ")}`);
|
|
190
|
+
parts.push(`Ignored settings (details in /mcp-adapter): ${ignored.join("; ")}.`);
|
|
191
|
+
}
|
|
192
|
+
return parts.length > 0 ? [`${source.readPath}: ${parts.join(" ")}`] : [];
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
const explicitPath = overridePath ? resolve(overridePath) : undefined;
|
|
196
|
+
const candidates = [
|
|
197
|
+
[getPiMcpGlobalConfigPath(), getPiGlobalConfigPath()],
|
|
198
|
+
[getProjectPiMcpConfigPath(cwd), getProjectPiConfigPath(cwd)]
|
|
199
|
+
];
|
|
200
|
+
return candidates.flatMap(([source, target]) => {
|
|
201
|
+
if (resolve(source) === explicitPath || !legacyMcpConfigHasContent(source))
|
|
202
|
+
return [];
|
|
203
|
+
const migrated = migrateLegacyMcpConfig(source, target);
|
|
204
|
+
if (migrated)
|
|
205
|
+
return [migrated];
|
|
206
|
+
const fix = existsSync(target) ? `Merge ${source} into ${target}, then remove ${source}.` : `Move it with: mv ${JSON.stringify(source)} ${JSON.stringify(target)}`;
|
|
207
|
+
return [`dm-mcp-adapter no longer reads ${source}. ${fix}`];
|
|
208
|
+
});
|
|
97
209
|
}
|
|
98
210
|
export function getSharedConfigPath(target, cwd = process.cwd()) {
|
|
99
211
|
return target === "project" ? getProjectConfigPath(cwd) : getGenericGlobalConfigPath();
|
|
@@ -119,7 +231,7 @@ export function findAvailableImportConfigs(cwd = process.cwd()) {
|
|
|
119
231
|
}
|
|
120
232
|
function getConfigSourceSummaries(sourceSpecs) {
|
|
121
233
|
return sourceSpecs.map((source) => {
|
|
122
|
-
const loaded =
|
|
234
|
+
const loaded = readSourceConfig(source.id, source.readPath);
|
|
123
235
|
return {
|
|
124
236
|
id: source.id,
|
|
125
237
|
label: source.label,
|
|
@@ -186,7 +298,8 @@ export function getMcpDiscoverySummary(overridePath, cwd = process.cwd(), option
|
|
|
186
298
|
return {
|
|
187
299
|
...summaryWithoutRepoPrompt,
|
|
188
300
|
fingerprint,
|
|
189
|
-
repoPrompt: detectRepoPrompt(summaryWithoutRepoPrompt, cwd)
|
|
301
|
+
repoPrompt: detectRepoPrompt(summaryWithoutRepoPrompt, cwd),
|
|
302
|
+
knownServerPresets: KNOWN_SERVER_PRESETS.filter(({ desktopApp }) => !desktopApp || desktopApp.paths.some((path) => existsSync(path)))
|
|
190
303
|
};
|
|
191
304
|
}
|
|
192
305
|
export function cloneMcpConfig(config) {
|
|
@@ -198,23 +311,103 @@ export function cloneMcpConfig(config) {
|
|
|
198
311
|
}
|
|
199
312
|
return cloned;
|
|
200
313
|
}
|
|
314
|
+
export const MCP_CONFIG_SOURCE_METADATA = Symbol.for("dm-mcp-adapter/config-source-metadata");
|
|
201
315
|
export function loadMcpConfig(overridePath, cwd = process.cwd()) {
|
|
316
|
+
const loaded = loadMcpConfigWithSources(overridePath, cwd);
|
|
317
|
+
Object.defineProperty(loaded.config, MCP_CONFIG_SOURCE_METADATA, {
|
|
318
|
+
value: { projectServers: loaded.projectServers, projectServerPolicy: loaded.projectServerPolicy },
|
|
319
|
+
enumerable: false
|
|
320
|
+
});
|
|
321
|
+
return loaded.config;
|
|
322
|
+
}
|
|
323
|
+
export function loadMcpConfigWithSources(overridePath, cwd = process.cwd()) {
|
|
202
324
|
const sourceSpecs = getConfigSources(overridePath, cwd);
|
|
203
325
|
const hostConfigDiscovery = getConfiguredHostConfigDiscovery(overridePath, cwd);
|
|
204
|
-
|
|
326
|
+
const projectServers = new Map;
|
|
327
|
+
let projectServerPolicy = "ask";
|
|
328
|
+
let projectAgentPluginSource;
|
|
329
|
+
let projectClaudePluginSource;
|
|
330
|
+
const discoveredHost = !isExclusiveConfigMode() && hostConfigDiscovery === "on" ? loadDiscoveredHostConfigs(cwd) : { config: { mcpServers: {} }, serverSources: new Map };
|
|
331
|
+
let config = discoveredHost.config;
|
|
332
|
+
for (const [name, source] of discoveredHost.serverSources) {
|
|
333
|
+
if (source.scope === "project")
|
|
334
|
+
projectServers.set(name, { path: source.path });
|
|
335
|
+
}
|
|
336
|
+
const piProjectSource = sourceSpecs.find((source) => source.id === "pi-mcp-project");
|
|
337
|
+
const piProjectNames = Object.keys((piProjectSource && readPiMcpConfig(piProjectSource.readPath))?.mcpServers ?? {});
|
|
205
338
|
for (const source of sourceSpecs) {
|
|
206
|
-
const loaded =
|
|
339
|
+
const loaded = readSourceConfig(source.id, source.readPath);
|
|
207
340
|
if (!loaded)
|
|
208
341
|
continue;
|
|
209
|
-
|
|
342
|
+
if (source.id === "pi-mcp-global") {
|
|
343
|
+
for (const name of piProjectNames)
|
|
344
|
+
delete loaded.mcpServers[name];
|
|
345
|
+
}
|
|
346
|
+
const expandedImport = expandImports(loaded, cwd);
|
|
347
|
+
const expanded = expandedImport.config;
|
|
348
|
+
const sourceRef = { path: source.readPath };
|
|
349
|
+
if (Object.hasOwn(expanded.settings ?? {}, "agentPluginPaths")) {
|
|
350
|
+
projectAgentPluginSource = source.scope === "project" ? sourceRef : undefined;
|
|
351
|
+
}
|
|
352
|
+
if (expanded.claudePlugins !== undefined) {
|
|
353
|
+
projectClaudePluginSource = source.scope === "project" ? sourceRef : undefined;
|
|
354
|
+
}
|
|
355
|
+
if (source.scope === "project") {
|
|
356
|
+
for (const name of Object.keys(expanded.mcpServers))
|
|
357
|
+
projectServers.set(name, sourceRef);
|
|
358
|
+
if (expanded.settings?.projectServers !== undefined) {
|
|
359
|
+
console.warn(`Ignoring settings.projectServers in project config ${source.readPath}; set it in the user-global MCP config instead`);
|
|
360
|
+
const { projectServers: _ignored, ...settings } = expanded.settings;
|
|
361
|
+
expanded.settings = settings;
|
|
362
|
+
}
|
|
363
|
+
} else if (expanded.settings?.projectServers === "allow" || expanded.settings?.projectServers === "ask") {
|
|
364
|
+
projectServerPolicy = expanded.settings.projectServers;
|
|
365
|
+
}
|
|
366
|
+
for (const [name, importedSource] of expandedImport.serverSources) {
|
|
367
|
+
if (importedSource.scope === "project")
|
|
368
|
+
projectServers.set(name, { path: importedSource.path });
|
|
369
|
+
}
|
|
370
|
+
config = mergeConfigs(config, expanded);
|
|
371
|
+
}
|
|
372
|
+
if (isExclusiveConfigMode()) {
|
|
373
|
+
return { config: stripProjectProviderAuth(resolveConfiguredClaudePluginMcp(config, cwd), projectServers), projectServers, projectServerPolicy };
|
|
210
374
|
}
|
|
211
|
-
if (isExclusiveConfigMode())
|
|
212
|
-
return resolveConfiguredClaudePluginMcp(config, cwd);
|
|
213
375
|
const packageConfig = loadPackageMcpConfigs(cwd);
|
|
214
376
|
const pluginConfig = loadAgentPluginConfigs(config.settings?.agentPluginPaths, cwd);
|
|
377
|
+
if (projectAgentPluginSource) {
|
|
378
|
+
for (const name of Object.keys(pluginConfig.mcpServers))
|
|
379
|
+
projectServers.set(name, projectAgentPluginSource);
|
|
380
|
+
}
|
|
215
381
|
const packageServers = Object.fromEntries(Object.entries(packageConfig.mcpServers).filter(([name]) => !Object.hasOwn(pluginConfig.mcpServers, name)));
|
|
382
|
+
for (const name of Object.keys(packageServers)) {
|
|
383
|
+
const source = packageConfig.serverSources.get(name);
|
|
384
|
+
if (source?.scope === "project")
|
|
385
|
+
projectServers.set(name, { path: source.settingsPath });
|
|
386
|
+
}
|
|
216
387
|
const higherPrecedenceConfig = mergeConfigs({ mcpServers: packageServers }, mergeConfigs(pluginConfig, config));
|
|
217
|
-
|
|
388
|
+
const claudePluginServers = new Set;
|
|
389
|
+
const mergedConfig = mergeClaudePluginMcpDefaults(config.claudePlugins, higherPrecedenceConfig, cwd, claudePluginServers);
|
|
390
|
+
if (projectClaudePluginSource) {
|
|
391
|
+
for (const name of claudePluginServers)
|
|
392
|
+
projectServers.set(name, projectClaudePluginSource);
|
|
393
|
+
}
|
|
394
|
+
return {
|
|
395
|
+
config: stripProjectProviderAuth(mergedConfig, projectServers),
|
|
396
|
+
projectServers,
|
|
397
|
+
projectServerPolicy
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
function stripProjectProviderAuth(config, projectServers) {
|
|
401
|
+
const stripped = [...projectServers.keys()].filter((name) => typeof config.mcpServers[name]?.auth === "object");
|
|
402
|
+
if (stripped.length === 0)
|
|
403
|
+
return config;
|
|
404
|
+
const mcpServers = { ...config.mcpServers };
|
|
405
|
+
for (const name of stripped) {
|
|
406
|
+
delete mcpServers[name];
|
|
407
|
+
projectServers.delete(name);
|
|
408
|
+
}
|
|
409
|
+
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`);
|
|
410
|
+
return { ...config, mcpServers };
|
|
218
411
|
}
|
|
219
412
|
export function resolveConfiguredClaudePluginMcp(config, cwd = process.cwd()) {
|
|
220
413
|
return mergeClaudePluginMcpDefaults(config.claudePlugins, config, cwd);
|
|
@@ -222,7 +415,7 @@ export function resolveConfiguredClaudePluginMcp(config, cwd = process.cwd()) {
|
|
|
222
415
|
export function discoverConfiguredClaudePluginSkills(config, cwd = process.cwd()) {
|
|
223
416
|
return loadClaudePluginBundles(config.claudePlugins, cwd, validateConfig, { mcp: false, skills: true }).skillPaths;
|
|
224
417
|
}
|
|
225
|
-
function mergeClaudePluginMcpDefaults(plugins, higherPrecedenceConfig, cwd) {
|
|
418
|
+
function mergeClaudePluginMcpDefaults(plugins, higherPrecedenceConfig, cwd, loadedServerNames) {
|
|
226
419
|
const pluginServers = loadClaudePluginBundles(plugins, cwd, validateConfig, { mcp: true, skills: false }).mcpServers;
|
|
227
420
|
const higherNamesByNamespace = new Map(Object.keys(higherPrecedenceConfig.mcpServers).map((name) => [formatServerNamespace(name), name]));
|
|
228
421
|
const defaults = Object.fromEntries(Object.entries(pluginServers).filter(([name]) => {
|
|
@@ -232,6 +425,8 @@ function mergeClaudePluginMcpDefaults(plugins, higherPrecedenceConfig, cwd) {
|
|
|
232
425
|
console.warn(`Claude plugin MCP server "${name}" is shadowed by higher-precedence server "${higherName}" because both normalize to the same namespace`);
|
|
233
426
|
return false;
|
|
234
427
|
}));
|
|
428
|
+
for (const name of Object.keys(defaults))
|
|
429
|
+
loadedServerNames?.add(name);
|
|
235
430
|
return applySettingDefaults(mergeConfigs({ mcpServers: defaults }, higherPrecedenceConfig));
|
|
236
431
|
}
|
|
237
432
|
function applySettingDefaults(config) {
|
|
@@ -244,7 +439,7 @@ function applySettingDefaults(config) {
|
|
|
244
439
|
function getMergedSettings(overridePath, cwd = process.cwd()) {
|
|
245
440
|
let settings;
|
|
246
441
|
for (const source of getConfigSources(overridePath, cwd)) {
|
|
247
|
-
const loaded =
|
|
442
|
+
const loaded = readSourceConfig(source.id, source.readPath);
|
|
248
443
|
if (loaded?.settings)
|
|
249
444
|
settings = { ...settings, ...loaded.settings };
|
|
250
445
|
}
|
|
@@ -260,15 +455,22 @@ function getConfiguredHostConfigDiscovery(overridePath, cwd = process.cwd()) {
|
|
|
260
455
|
}
|
|
261
456
|
function loadDiscoveredHostConfigs(cwd) {
|
|
262
457
|
let config = { mcpServers: {} };
|
|
458
|
+
const serverSources = new Map;
|
|
263
459
|
for (const importKind of Object.keys(IMPORT_PATHS)) {
|
|
264
460
|
const imported = loadImportedConfig(importKind, cwd, `Failed to discover imported MCP config from ${importKind}:`);
|
|
265
461
|
if (!imported)
|
|
266
462
|
continue;
|
|
463
|
+
const servers = extractServers(imported.value, importKind);
|
|
267
464
|
config = mergeConfigs(config, {
|
|
268
|
-
mcpServers:
|
|
465
|
+
mcpServers: servers
|
|
269
466
|
});
|
|
467
|
+
for (const name of Object.keys(servers)) {
|
|
468
|
+
const source = imported.serverSources.get(name);
|
|
469
|
+
if (source?.scope === "project" || !serverSources.has(name))
|
|
470
|
+
serverSources.set(name, source ?? imported.source);
|
|
471
|
+
}
|
|
270
472
|
}
|
|
271
|
-
return config;
|
|
473
|
+
return { config, serverSources };
|
|
272
474
|
}
|
|
273
475
|
function getConfigConflicts(sourceSpecs, imports, cwd) {
|
|
274
476
|
const seen = new Map;
|
|
@@ -287,7 +489,7 @@ function getConfigConflicts(sourceSpecs, imports, cwd) {
|
|
|
287
489
|
}
|
|
288
490
|
}
|
|
289
491
|
for (const source of sourceSpecs) {
|
|
290
|
-
const loaded =
|
|
492
|
+
const loaded = readSourceConfig(source.id, source.readPath);
|
|
291
493
|
if (!loaded)
|
|
292
494
|
continue;
|
|
293
495
|
if (loaded.imports?.length) {
|
|
@@ -351,24 +553,39 @@ function getConfigSources(overridePath, cwd = process.cwd()) {
|
|
|
351
553
|
scope: "global"
|
|
352
554
|
});
|
|
353
555
|
}
|
|
556
|
+
const piMcpGlobalPath = getPiMcpGlobalConfigPath();
|
|
557
|
+
if (piMcpConfigEnabled && piMcpGlobalPath !== userPath && !sources.some((source) => source.readPath === piMcpGlobalPath)) {
|
|
558
|
+
sources.push({
|
|
559
|
+
id: "pi-mcp-global",
|
|
560
|
+
label: "user-global DM MCP",
|
|
561
|
+
readPath: piMcpGlobalPath,
|
|
562
|
+
writePath: userPath,
|
|
563
|
+
kind: "import",
|
|
564
|
+
importKind: "DM mcp.json",
|
|
565
|
+
shared: true,
|
|
566
|
+
scope: "global"
|
|
567
|
+
});
|
|
568
|
+
}
|
|
354
569
|
sources.push({
|
|
355
570
|
id: "pi-global",
|
|
356
|
-
label: "
|
|
571
|
+
label: "MCP adapter global override",
|
|
357
572
|
readPath: userPath,
|
|
358
573
|
writePath: userPath,
|
|
359
574
|
kind: "user",
|
|
360
575
|
shared: false,
|
|
361
576
|
scope: "global"
|
|
362
577
|
});
|
|
578
|
+
const projectPiMcpPath = getProjectPiMcpConfigPath(cwd);
|
|
363
579
|
const reservedPaths = new Set([
|
|
364
580
|
...sources.map((source) => getConfigPathIdentity(source.readPath)),
|
|
365
581
|
getConfigPathIdentity(projectPath),
|
|
366
|
-
getConfigPathIdentity(projectPiPath)
|
|
582
|
+
getConfigPathIdentity(projectPiPath),
|
|
583
|
+
...piMcpConfigEnabled ? [getConfigPathIdentity(projectPiMcpPath)] : []
|
|
367
584
|
]);
|
|
368
585
|
const ancestorSources = new Map;
|
|
369
586
|
const descriptors = [
|
|
370
587
|
{ id: "shared-project-ancestor", label: "ancestor standard MCP", path: getProjectConfigPath, shared: true },
|
|
371
|
-
{ id: "pi-project-ancestor", label: "ancestor
|
|
588
|
+
{ id: "pi-project-ancestor", label: "ancestor MCP adapter override", path: getProjectPiConfigPath, shared: false }
|
|
372
589
|
];
|
|
373
590
|
const ancestorRoot = getConfiguredAncestorRoot(sources, cwd);
|
|
374
591
|
if (ancestorRoot) {
|
|
@@ -403,10 +620,22 @@ function getConfigSources(overridePath, cwd = process.cwd()) {
|
|
|
403
620
|
scope: "project"
|
|
404
621
|
});
|
|
405
622
|
}
|
|
623
|
+
if (piMcpConfigEnabled && projectPiMcpPath !== userPath && projectPiMcpPath !== piMcpGlobalPath) {
|
|
624
|
+
sources.push({
|
|
625
|
+
id: "pi-mcp-project",
|
|
626
|
+
label: "project DM MCP",
|
|
627
|
+
readPath: projectPiMcpPath,
|
|
628
|
+
writePath: projectPiPath,
|
|
629
|
+
kind: "import",
|
|
630
|
+
importKind: "DM project mcp.json",
|
|
631
|
+
shared: true,
|
|
632
|
+
scope: "project"
|
|
633
|
+
});
|
|
634
|
+
}
|
|
406
635
|
if (projectPiPath !== userPath && projectPiPath !== projectPath) {
|
|
407
636
|
sources.push({
|
|
408
637
|
id: "pi-project",
|
|
409
|
-
label: "project
|
|
638
|
+
label: "project MCP adapter override",
|
|
410
639
|
readPath: projectPiPath,
|
|
411
640
|
writePath: projectPiPath,
|
|
412
641
|
kind: "project",
|
|
@@ -430,7 +659,7 @@ function isWithin(base, target) {
|
|
|
430
659
|
function getConfiguredAncestorRoot(globalSources, cwd) {
|
|
431
660
|
let configured;
|
|
432
661
|
for (const source of globalSources) {
|
|
433
|
-
const roots =
|
|
662
|
+
const roots = readSourceConfig(source.id, source.readPath)?.settings?.ancestorConfigRoots;
|
|
434
663
|
if (roots !== undefined)
|
|
435
664
|
configured = roots;
|
|
436
665
|
}
|
|
@@ -451,11 +680,12 @@ function getConfiguredAncestorRoot(globalSources, cwd) {
|
|
|
451
680
|
}
|
|
452
681
|
try {
|
|
453
682
|
const root = realpathSync(expanded);
|
|
454
|
-
if (!statSync(root).isDirectory() || !isWithin(home, root)
|
|
683
|
+
if (!statSync(root).isDirectory() || !isWithin(home, root))
|
|
455
684
|
throw new Error;
|
|
456
|
-
|
|
685
|
+
if (isWithin(root, canonicalCwd))
|
|
686
|
+
valid.push(root);
|
|
457
687
|
} catch {
|
|
458
|
-
console.warn(`Invalid settings.ancestorConfigRoots entry ${JSON.stringify(entry)}: expected an existing directory under HOME
|
|
688
|
+
console.warn(`Invalid settings.ancestorConfigRoots entry ${JSON.stringify(entry)}: expected an existing directory under HOME`);
|
|
459
689
|
}
|
|
460
690
|
}
|
|
461
691
|
return valid.sort((left, right) => right.length - left.length)[0];
|
|
@@ -556,6 +786,8 @@ function mergeServerMaps(base, next) {
|
|
|
556
786
|
for (const field of URL_BOUND_AUTH_FIELDS) {
|
|
557
787
|
delete baseEntry[field];
|
|
558
788
|
}
|
|
789
|
+
if (typeof baseEntry.auth === "object")
|
|
790
|
+
delete baseEntry.auth;
|
|
559
791
|
if (baseEntry.oauth !== false) {
|
|
560
792
|
delete baseEntry.oauth;
|
|
561
793
|
}
|
|
@@ -577,8 +809,9 @@ function mergeImports(left, right) {
|
|
|
577
809
|
}
|
|
578
810
|
function expandImports(config, cwd = process.cwd()) {
|
|
579
811
|
if (!config.imports?.length)
|
|
580
|
-
return config;
|
|
812
|
+
return { config, serverSources: new Map };
|
|
581
813
|
const importedServers = {};
|
|
814
|
+
const serverSources = new Map;
|
|
582
815
|
for (const importKind of config.imports) {
|
|
583
816
|
const imported = loadImportedConfig(importKind, cwd, `Failed to import MCP config from ${importKind}:`);
|
|
584
817
|
if (!imported)
|
|
@@ -587,18 +820,23 @@ function expandImports(config, cwd = process.cwd()) {
|
|
|
587
820
|
for (const [name, definition] of Object.entries(servers)) {
|
|
588
821
|
if (!importedServers[name]) {
|
|
589
822
|
importedServers[name] = definition;
|
|
823
|
+
serverSources.set(name, imported.serverSources.get(name) ?? imported.source);
|
|
590
824
|
}
|
|
591
825
|
}
|
|
592
826
|
}
|
|
593
827
|
return {
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
828
|
+
config: {
|
|
829
|
+
imports: config.imports,
|
|
830
|
+
...config.settings !== undefined ? { settings: config.settings } : {},
|
|
831
|
+
...config.claudePlugins !== undefined ? { claudePlugins: config.claudePlugins } : {},
|
|
832
|
+
mcpServers: mergeServerMaps(importedServers, config.mcpServers)
|
|
833
|
+
},
|
|
834
|
+
serverSources
|
|
598
835
|
};
|
|
599
836
|
}
|
|
600
837
|
function resolveImportCandidates(importKind, cwd) {
|
|
601
838
|
return (IMPORT_PATHS[importKind] ?? []).map((candidate) => {
|
|
839
|
+
const scope = candidate.startsWith(".") ? "project" : "user";
|
|
602
840
|
if (importKind === "opencode" && candidate === "./opencode.json") {
|
|
603
841
|
const start = resolve(cwd);
|
|
604
842
|
let gitRoot;
|
|
@@ -614,27 +852,29 @@ function resolveImportCandidates(importKind, cwd) {
|
|
|
614
852
|
current = parent;
|
|
615
853
|
}
|
|
616
854
|
if (!gitRoot)
|
|
617
|
-
return join(start, "opencode.json");
|
|
855
|
+
return { path: join(start, "opencode.json"), scope };
|
|
618
856
|
current = start;
|
|
619
857
|
while (true) {
|
|
620
858
|
const projectConfig = join(current, "opencode.json");
|
|
621
859
|
if (existsSync(projectConfig) || current === gitRoot)
|
|
622
|
-
return projectConfig;
|
|
860
|
+
return { path: projectConfig, scope };
|
|
623
861
|
current = dirname(current);
|
|
624
862
|
}
|
|
625
863
|
}
|
|
626
|
-
return candidate.startsWith(".") ? resolve(cwd, candidate) : candidate;
|
|
864
|
+
return { path: candidate.startsWith(".") ? resolve(cwd, candidate) : candidate, scope };
|
|
627
865
|
});
|
|
628
866
|
}
|
|
629
867
|
function readImportedConfig(path) {
|
|
630
868
|
const raw = readFileSync(path, "utf-8");
|
|
631
|
-
return path.endsWith(".toml") ? parseToml(raw) : parseJsonWithComments(raw);
|
|
869
|
+
return path.endsWith(".toml") ? parseToml(stripUtf8Bom(raw)) : parseJsonWithComments(raw);
|
|
632
870
|
}
|
|
633
871
|
function loadImportedConfig(importKind, cwd, warningPrefix) {
|
|
634
872
|
if (importKind === "opencode") {
|
|
635
873
|
let merged = {};
|
|
636
|
-
let
|
|
637
|
-
|
|
874
|
+
let highestPrecedenceSource;
|
|
875
|
+
const serverSources = new Map;
|
|
876
|
+
for (const source of resolveImportCandidates(importKind, cwd)) {
|
|
877
|
+
const { path } = source;
|
|
638
878
|
if (!existsSync(path))
|
|
639
879
|
continue;
|
|
640
880
|
try {
|
|
@@ -658,19 +898,40 @@ function loadImportedConfig(importKind, cwd, warningPrefix) {
|
|
|
658
898
|
}];
|
|
659
899
|
}));
|
|
660
900
|
merged = mergeOpenCodeConfigs(merged, { ...imported, mcp: normalized });
|
|
661
|
-
|
|
901
|
+
for (const name of Object.keys(normalized))
|
|
902
|
+
serverSources.set(name, source);
|
|
903
|
+
highestPrecedenceSource = source;
|
|
662
904
|
}
|
|
663
905
|
} catch (error) {
|
|
664
906
|
console.warn(warningPrefix, error);
|
|
665
907
|
}
|
|
666
908
|
}
|
|
667
|
-
|
|
909
|
+
if (!highestPrecedenceSource)
|
|
910
|
+
return null;
|
|
911
|
+
const finalNames = new Set(Object.keys(extractServers(merged, importKind)));
|
|
912
|
+
for (const name of serverSources.keys()) {
|
|
913
|
+
if (!finalNames.has(name))
|
|
914
|
+
serverSources.delete(name);
|
|
915
|
+
}
|
|
916
|
+
return {
|
|
917
|
+
path: highestPrecedenceSource.path,
|
|
918
|
+
value: merged,
|
|
919
|
+
source: highestPrecedenceSource,
|
|
920
|
+
serverSources
|
|
921
|
+
};
|
|
668
922
|
}
|
|
669
|
-
for (const
|
|
923
|
+
for (const source of resolveImportCandidates(importKind, cwd)) {
|
|
924
|
+
const { path } = source;
|
|
670
925
|
if (!existsSync(path))
|
|
671
926
|
continue;
|
|
672
927
|
try {
|
|
673
|
-
|
|
928
|
+
const value = readImportedConfig(path);
|
|
929
|
+
return {
|
|
930
|
+
path,
|
|
931
|
+
value,
|
|
932
|
+
source,
|
|
933
|
+
serverSources: new Map(Object.keys(extractServers(value, importKind)).map((name) => [name, source]))
|
|
934
|
+
};
|
|
674
935
|
} catch (error) {
|
|
675
936
|
console.warn(warningPrefix, error);
|
|
676
937
|
}
|
|
@@ -693,6 +954,166 @@ function readValidatedConfig(path, label) {
|
|
|
693
954
|
return null;
|
|
694
955
|
}
|
|
695
956
|
}
|
|
957
|
+
function isPiMcpSource(id) {
|
|
958
|
+
return id === "pi-mcp-global" || id === "pi-mcp-project";
|
|
959
|
+
}
|
|
960
|
+
function readSourceConfig(id, path) {
|
|
961
|
+
return isPiMcpSource(id) ? readPiMcpConfig(path) : readValidatedConfig(path, `MCP config from ${path}`);
|
|
962
|
+
}
|
|
963
|
+
const PI_MCP_EXPOSURES = ["codemode", "codemode-deferred", "deferred", "direct", "hidden"];
|
|
964
|
+
function readPiMcpConfig(path) {
|
|
965
|
+
if (!existsSync(path))
|
|
966
|
+
return null;
|
|
967
|
+
let raw;
|
|
968
|
+
try {
|
|
969
|
+
const text = readFileSync(path, "utf-8");
|
|
970
|
+
if (stripJsonComments(text, { trailingCommas: true }).trim() === "")
|
|
971
|
+
return null;
|
|
972
|
+
const parsed = parseJsonWithComments(text);
|
|
973
|
+
if (!isRecord(parsed) || parsed.mcpServers !== undefined && !isRecord(parsed.mcpServers)) {
|
|
974
|
+
throw new Error('expected an object with an "mcpServers" object');
|
|
975
|
+
}
|
|
976
|
+
raw = parsed;
|
|
977
|
+
} catch (error) {
|
|
978
|
+
console.warn(`Failed to load DM MCP config from ${path}:`, error);
|
|
979
|
+
return null;
|
|
980
|
+
}
|
|
981
|
+
const file = {
|
|
982
|
+
mcpServers: {},
|
|
983
|
+
adapterKeys: ["settings", "imports", "claudePlugins", "mcp-servers"].filter((key) => raw[key] !== undefined),
|
|
984
|
+
skipped: [],
|
|
985
|
+
ignoredSettings: new Map
|
|
986
|
+
};
|
|
987
|
+
for (const [name, value] of Object.entries(raw.mcpServers ?? {})) {
|
|
988
|
+
const translated = translatePiMcpServer(name, value);
|
|
989
|
+
if (typeof translated === "string") {
|
|
990
|
+
file.skipped.push(`"${name}" (${translated})`);
|
|
991
|
+
continue;
|
|
992
|
+
}
|
|
993
|
+
file.mcpServers[name] = translated.entry;
|
|
994
|
+
if (translated.ignored.length > 0)
|
|
995
|
+
file.ignoredSettings.set(name, translated.ignored);
|
|
996
|
+
}
|
|
997
|
+
return file;
|
|
998
|
+
}
|
|
999
|
+
export function translatePiMcpServer(name, value) {
|
|
1000
|
+
if (!/^[A-Za-z0-9_-]+$/.test(name))
|
|
1001
|
+
return 'invalid server name (use letters, digits, "_" and "-")';
|
|
1002
|
+
if (!isRecord(value))
|
|
1003
|
+
return "must be an object";
|
|
1004
|
+
const { type, command, args, env, cwd, url, headers, oauth, exposure, toolExposure, enabled, timeout, auth, description, ...unknown } = value;
|
|
1005
|
+
const isExposure = (candidate) => typeof candidate === "string" && PI_MCP_EXPOSURES.includes(candidate);
|
|
1006
|
+
if (exposure !== undefined && !isExposure(exposure))
|
|
1007
|
+
return `exposure must be one of ${PI_MCP_EXPOSURES.join(", ")}`;
|
|
1008
|
+
if (toolExposure !== undefined && (!isRecord(toolExposure) || !Object.values(toolExposure).every(isExposure))) {
|
|
1009
|
+
return `toolExposure must map tool names to one of ${PI_MCP_EXPOSURES.join(", ")}`;
|
|
1010
|
+
}
|
|
1011
|
+
if (enabled !== undefined && typeof enabled !== "boolean")
|
|
1012
|
+
return "enabled must be a boolean";
|
|
1013
|
+
if (timeout !== undefined && (typeof timeout !== "number" || !(timeout > 0)))
|
|
1014
|
+
return "timeout must be a positive number of seconds";
|
|
1015
|
+
if (description !== undefined && typeof description !== "string")
|
|
1016
|
+
return "description must be a string";
|
|
1017
|
+
if (type === "sse")
|
|
1018
|
+
return "legacy SSE transport is not supported; use the streamable HTTP URL";
|
|
1019
|
+
const ignored = Object.keys(unknown);
|
|
1020
|
+
let entry;
|
|
1021
|
+
let otherTransportKeys;
|
|
1022
|
+
if (typeof url === "string" && (type === undefined || type === "http" || type === "streamable-http")) {
|
|
1023
|
+
if (!URL.canParse(url) || !/^https?:$/.test(new URL(url).protocol))
|
|
1024
|
+
return "url must be an http or https URL";
|
|
1025
|
+
if (headers !== undefined && !isStringRecord(headers))
|
|
1026
|
+
return "headers must map names to strings";
|
|
1027
|
+
const translatedOAuth = oauth === undefined ? undefined : translatePiOAuth(oauth);
|
|
1028
|
+
if (typeof translatedOAuth === "string")
|
|
1029
|
+
return translatedOAuth;
|
|
1030
|
+
entry = { url, ...headers !== undefined ? { headers } : {}, ...translatedOAuth ? { oauth: translatedOAuth.oauth } : {} };
|
|
1031
|
+
if (auth !== undefined) {
|
|
1032
|
+
if (!isRecord(auth) || typeof auth.provider !== "string" || !auth.provider)
|
|
1033
|
+
return "auth.provider must be a provider name";
|
|
1034
|
+
const urlError = providerAuthUrlError(url);
|
|
1035
|
+
if (urlError)
|
|
1036
|
+
return urlError;
|
|
1037
|
+
entry.auth = { provider: auth.provider };
|
|
1038
|
+
}
|
|
1039
|
+
ignored.push(...translatedOAuth?.ignored ?? []);
|
|
1040
|
+
otherTransportKeys = ["command", "args", "env", "cwd"];
|
|
1041
|
+
} else if (typeof command === "string" && (type === undefined || type === "stdio")) {
|
|
1042
|
+
if (args !== undefined && !(Array.isArray(args) && args.every((arg) => typeof arg === "string")))
|
|
1043
|
+
return "args must be an array of strings";
|
|
1044
|
+
if (env !== undefined && !isStringRecord(env))
|
|
1045
|
+
return "env must map names to strings";
|
|
1046
|
+
if (cwd !== undefined && typeof cwd !== "string")
|
|
1047
|
+
return "cwd must be a string";
|
|
1048
|
+
entry = {
|
|
1049
|
+
command,
|
|
1050
|
+
...args !== undefined ? { args } : {},
|
|
1051
|
+
...env !== undefined ? { env } : {},
|
|
1052
|
+
...cwd !== undefined ? { cwd } : {}
|
|
1053
|
+
};
|
|
1054
|
+
otherTransportKeys = ["url", "headers", "oauth", "auth"];
|
|
1055
|
+
} else {
|
|
1056
|
+
return 'needs either "command" (stdio) or "url" (streamable HTTP)';
|
|
1057
|
+
}
|
|
1058
|
+
ignored.push(...otherTransportKeys.filter((key) => value[key] !== undefined));
|
|
1059
|
+
if (description !== undefined)
|
|
1060
|
+
entry.description = description;
|
|
1061
|
+
const serverExposure = exposure === undefined || exposure === "codemode-deferred" ? "codemode" : exposure;
|
|
1062
|
+
if (enabled === false || serverExposure === "hidden")
|
|
1063
|
+
entry.disabled = true;
|
|
1064
|
+
if (serverExposure === "direct")
|
|
1065
|
+
entry.directTools = true;
|
|
1066
|
+
if (serverExposure === "deferred")
|
|
1067
|
+
entry.directTools = "search";
|
|
1068
|
+
if (timeout !== undefined)
|
|
1069
|
+
entry.requestTimeoutMs = Math.round(timeout * 1000);
|
|
1070
|
+
const directTools = [];
|
|
1071
|
+
const excludeTools = [];
|
|
1072
|
+
for (const [tool, rawValue] of Object.entries(toolExposure ?? {})) {
|
|
1073
|
+
const toolValue = rawValue === "codemode-deferred" ? "codemode" : rawValue;
|
|
1074
|
+
if (toolValue === serverExposure)
|
|
1075
|
+
continue;
|
|
1076
|
+
if (toolValue === "hidden")
|
|
1077
|
+
excludeTools.push(tool);
|
|
1078
|
+
else if (toolValue === "direct" && !tool.includes("*") && serverExposure === "codemode")
|
|
1079
|
+
directTools.push(tool);
|
|
1080
|
+
else
|
|
1081
|
+
ignored.push(`toolExposure ${JSON.stringify(tool)}: ${toolValue}`);
|
|
1082
|
+
}
|
|
1083
|
+
if (directTools.length > 0)
|
|
1084
|
+
entry.directTools = directTools;
|
|
1085
|
+
if (excludeTools.length > 0)
|
|
1086
|
+
entry.excludeTools = excludeTools;
|
|
1087
|
+
return { entry, ignored };
|
|
1088
|
+
}
|
|
1089
|
+
function translatePiOAuth(oauth) {
|
|
1090
|
+
if (!isRecord(oauth))
|
|
1091
|
+
return "oauth must be an object";
|
|
1092
|
+
const { clientId, clientSecret, scope, clientName, callbackPort, callbackUrl, ...unknown } = oauth;
|
|
1093
|
+
const copied = { clientId, clientSecret, scope, clientName };
|
|
1094
|
+
for (const [key, field] of Object.entries(copied)) {
|
|
1095
|
+
if (field !== undefined && (typeof field !== "string" || key === "clientName" && !field.trim())) {
|
|
1096
|
+
return `oauth.${key} must be a ${key === "clientName" ? "non-empty " : ""}string`;
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
1099
|
+
if (callbackPort !== undefined && (typeof callbackPort !== "number" || !Number.isInteger(callbackPort) || callbackPort < 1 || callbackPort > 65535)) {
|
|
1100
|
+
return "oauth.callbackPort must be a port number";
|
|
1101
|
+
}
|
|
1102
|
+
const result = Object.fromEntries(Object.entries(copied).filter(([, field]) => field !== undefined));
|
|
1103
|
+
if (callbackUrl !== undefined) {
|
|
1104
|
+
const parsed = typeof callbackUrl === "string" && URL.canParse(callbackUrl) ? new URL(callbackUrl) : undefined;
|
|
1105
|
+
if (!parsed || parsed.protocol !== "http:" || !["localhost", "127.0.0.1", "[::1]"].includes(parsed.hostname) || parsed.search !== "" || parsed.hash !== "") {
|
|
1106
|
+
return "oauth.callbackUrl must be an http URI on localhost, 127.0.0.1, or [::1] without query or fragment";
|
|
1107
|
+
}
|
|
1108
|
+
if (parsed.port && callbackPort !== undefined && Number(parsed.port) !== callbackPort) {
|
|
1109
|
+
return "oauth.callbackUrl and oauth.callbackPort name different ports";
|
|
1110
|
+
}
|
|
1111
|
+
result.redirectUri = parsed.port ? callbackUrl : `http://${parsed.hostname}:${callbackPort ?? "{port}"}${parsed.pathname}`;
|
|
1112
|
+
} else if (callbackPort !== undefined) {
|
|
1113
|
+
result.redirectUri = `http://127.0.0.1:${callbackPort}/callback`;
|
|
1114
|
+
}
|
|
1115
|
+
return { oauth: result, ignored: Object.keys(unknown).map((key) => `oauth.${key}`) };
|
|
1116
|
+
}
|
|
696
1117
|
function validateConfig(raw) {
|
|
697
1118
|
if (!isRecord(raw)) {
|
|
698
1119
|
return { mcpServers: {} };
|
|
@@ -746,8 +1167,24 @@ function toServerEntries(servers) {
|
|
|
746
1167
|
return {};
|
|
747
1168
|
const entries = {};
|
|
748
1169
|
for (const [name, entry] of Object.entries(servers)) {
|
|
749
|
-
if (isServerEntry(entry))
|
|
750
|
-
|
|
1170
|
+
if (!isServerEntry(entry))
|
|
1171
|
+
continue;
|
|
1172
|
+
const auth = entry.auth;
|
|
1173
|
+
if (typeof auth === "object") {
|
|
1174
|
+
const provider = isRecord(auth) ? auth.provider : undefined;
|
|
1175
|
+
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);
|
|
1176
|
+
if (error) {
|
|
1177
|
+
console.warn(`Ignoring MCP server "${name}": ${error}`);
|
|
1178
|
+
continue;
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
if (entry.description !== undefined && typeof entry.description !== "string") {
|
|
1182
|
+
console.warn(`Ignoring invalid description for MCP server "${name}": expected a string`);
|
|
1183
|
+
const { description: _description, ...rest } = entry;
|
|
1184
|
+
entries[name] = rest;
|
|
1185
|
+
continue;
|
|
1186
|
+
}
|
|
1187
|
+
entries[name] = entry;
|
|
751
1188
|
}
|
|
752
1189
|
return entries;
|
|
753
1190
|
}
|
|
@@ -757,6 +1194,9 @@ function isServerEntry(value) {
|
|
|
757
1194
|
function isRecord(value) {
|
|
758
1195
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
759
1196
|
}
|
|
1197
|
+
function isStringRecord(value) {
|
|
1198
|
+
return isRecord(value) && Object.values(value).every((entry) => typeof entry === "string");
|
|
1199
|
+
}
|
|
760
1200
|
function mergeOpenCodeConfigs(base, next) {
|
|
761
1201
|
const baseMcp = base.mcp;
|
|
762
1202
|
const nextMcp = next.mcp;
|
|
@@ -908,7 +1348,7 @@ function extractServers(config, kind) {
|
|
|
908
1348
|
delete mapped.env_http_headers;
|
|
909
1349
|
mappedServers[name] = mapped;
|
|
910
1350
|
}
|
|
911
|
-
return mappedServers;
|
|
1351
|
+
return toServerEntries(mappedServers);
|
|
912
1352
|
}
|
|
913
1353
|
function serializeRawConfig(raw) {
|
|
914
1354
|
return `${JSON.stringify(raw, null, 2)}
|
|
@@ -971,21 +1411,31 @@ function buildConfigWritePreview(filePath, nextRaw) {
|
|
|
971
1411
|
};
|
|
972
1412
|
}
|
|
973
1413
|
function readRawConfigObject(filePath) {
|
|
974
|
-
if (!
|
|
1414
|
+
if (!lstatSync(filePath, { throwIfNoEntry: false }))
|
|
975
1415
|
return {};
|
|
976
1416
|
try {
|
|
977
|
-
const
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
1417
|
+
const text = readFileSync(filePath, "utf-8");
|
|
1418
|
+
if (text.trim() === "")
|
|
1419
|
+
return {};
|
|
1420
|
+
const raw = parseJsonWithComments(text);
|
|
1421
|
+
if (!isRecord(raw))
|
|
1422
|
+
throw new Error("top-level value must be an object");
|
|
1423
|
+
return raw;
|
|
1424
|
+
} catch (error) {
|
|
1425
|
+
throw new Error(`Failed to read MCP config at ${filePath}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
981
1426
|
}
|
|
982
1427
|
}
|
|
983
1428
|
function writeConfigText(writePath, text) {
|
|
1429
|
+
const originalPath = writePath;
|
|
984
1430
|
let mode;
|
|
985
1431
|
try {
|
|
986
1432
|
writePath = realpathSync(writePath);
|
|
987
1433
|
mode = statSync(writePath).mode & 511;
|
|
988
|
-
} catch {
|
|
1434
|
+
} catch (error) {
|
|
1435
|
+
if (lstatSync(originalPath, { throwIfNoEntry: false })?.isSymbolicLink()) {
|
|
1436
|
+
throw new Error(`Cannot write MCP config at ${originalPath}: symbolic link target is unavailable`, { cause: error });
|
|
1437
|
+
}
|
|
1438
|
+
}
|
|
989
1439
|
mkdirSync(dirname(writePath), { recursive: true });
|
|
990
1440
|
const tmpPath = `${writePath}.${process.pid}.tmp`;
|
|
991
1441
|
rmSync(tmpPath, { force: true });
|
|
@@ -1012,17 +1462,7 @@ export function writeSharedConfigText(filePath, text) {
|
|
|
1012
1462
|
}
|
|
1013
1463
|
export function writeJevSemanticSearchConfig(overridePath, cwd, allowedServers, effectiveJev) {
|
|
1014
1464
|
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
|
-
}
|
|
1465
|
+
const raw = readRawConfigObject(filePath);
|
|
1026
1466
|
if (raw.settings !== undefined && !isRecord(raw.settings)) {
|
|
1027
1467
|
throw new Error(`Failed to update Jev settings at ${filePath}: settings must be an object`);
|
|
1028
1468
|
}
|
|
@@ -1041,12 +1481,21 @@ export function writeJevSemanticSearchConfig(overridePath, cwd, allowedServers,
|
|
|
1041
1481
|
writeRawConfigObject(filePath, raw);
|
|
1042
1482
|
return { path: filePath, changed: true };
|
|
1043
1483
|
}
|
|
1044
|
-
function getServersObject(raw) {
|
|
1045
|
-
const
|
|
1046
|
-
|
|
1047
|
-
|
|
1484
|
+
function getServersObject(raw, filePath) {
|
|
1485
|
+
for (const key of ["mcpServers", "mcp-servers"]) {
|
|
1486
|
+
if (Object.hasOwn(raw, key) && !isRecord(raw[key])) {
|
|
1487
|
+
throw new Error(`Failed to update MCP config at ${filePath}: ${key} must be an object`);
|
|
1488
|
+
}
|
|
1048
1489
|
}
|
|
1049
|
-
return
|
|
1490
|
+
return raw.mcpServers ?? raw["mcp-servers"] ?? {};
|
|
1491
|
+
}
|
|
1492
|
+
function getConfigImports(raw, filePath) {
|
|
1493
|
+
if (raw.imports === undefined)
|
|
1494
|
+
return [];
|
|
1495
|
+
if (!Array.isArray(raw.imports) || raw.imports.some((value) => typeof value !== "string")) {
|
|
1496
|
+
throw new Error(`Failed to update MCP config at ${filePath}: imports must be an array of strings`);
|
|
1497
|
+
}
|
|
1498
|
+
return raw.imports;
|
|
1050
1499
|
}
|
|
1051
1500
|
function setServersObject(raw, servers) {
|
|
1052
1501
|
delete raw["mcp-servers"];
|
|
@@ -1054,18 +1503,7 @@ function setServersObject(raw, servers) {
|
|
|
1054
1503
|
}
|
|
1055
1504
|
export function writeProjectServerDisabledOverride(overridePath, cwd, serverName, disabled) {
|
|
1056
1505
|
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
|
-
}
|
|
1506
|
+
const raw = readRawConfigObject(filePath);
|
|
1069
1507
|
const serverKey = raw.mcpServers !== undefined ? "mcpServers" : raw["mcp-servers"] !== undefined ? "mcp-servers" : "mcpServers";
|
|
1070
1508
|
const rawServers = raw[serverKey];
|
|
1071
1509
|
if (rawServers !== undefined && (!rawServers || typeof rawServers !== "object" || Array.isArray(rawServers))) {
|
|
@@ -1086,15 +1524,15 @@ export function writeProjectServerDisabledOverride(overridePath, cwd, serverName
|
|
|
1086
1524
|
for (const source of getConfigSources(overridePath, cwd)) {
|
|
1087
1525
|
if (source.readPath === filePath)
|
|
1088
1526
|
continue;
|
|
1089
|
-
const loaded =
|
|
1527
|
+
const loaded = readSourceConfig(source.id, source.readPath);
|
|
1090
1528
|
if (loaded)
|
|
1091
|
-
lowerConfig = mergeConfigs(lowerConfig, expandImports(loaded, cwd));
|
|
1529
|
+
lowerConfig = mergeConfigs(lowerConfig, expandImports(loaded, cwd).config);
|
|
1092
1530
|
}
|
|
1093
1531
|
if (raw.imports !== undefined) {
|
|
1094
1532
|
if (!Array.isArray(raw.imports) || raw.imports.some((kind) => typeof kind !== "string" || !Object.hasOwn(IMPORT_PATHS, kind))) {
|
|
1095
1533
|
throw new Error(`Failed to update project MCP override at ${filePath}: imports contains an unsupported config kind`);
|
|
1096
1534
|
}
|
|
1097
|
-
lowerConfig = mergeConfigs(lowerConfig, expandImports({ mcpServers: {}, imports: raw.imports }, cwd));
|
|
1535
|
+
lowerConfig = mergeConfigs(lowerConfig, expandImports({ mcpServers: {}, imports: raw.imports }, cwd).config);
|
|
1098
1536
|
}
|
|
1099
1537
|
if (isServerDisabled(lowerConfig.mcpServers[serverName]))
|
|
1100
1538
|
next.disabled = false;
|
|
@@ -1144,7 +1582,7 @@ function detectRepoPrompt(summary, cwd = process.cwd()) {
|
|
|
1144
1582
|
for (const source of summary.sources) {
|
|
1145
1583
|
if (source.kind !== "shared" || source.serverCount === 0)
|
|
1146
1584
|
continue;
|
|
1147
|
-
const config =
|
|
1585
|
+
const config = readSourceConfig(source.id, source.path);
|
|
1148
1586
|
if (!config)
|
|
1149
1587
|
continue;
|
|
1150
1588
|
for (const [name, entry] of Object.entries(config.mcpServers)) {
|
|
@@ -1170,23 +1608,23 @@ function detectRepoPrompt(summary, cwd = process.cwd()) {
|
|
|
1170
1608
|
export function previewCompatibilityImports(importKinds, overridePath) {
|
|
1171
1609
|
const targetPath = getPiGlobalConfigPath(overridePath);
|
|
1172
1610
|
const raw = readRawConfigObject(targetPath);
|
|
1173
|
-
const currentImports =
|
|
1611
|
+
const currentImports = getConfigImports(raw, targetPath);
|
|
1174
1612
|
const merged = [...new Set([...currentImports, ...importKinds])];
|
|
1175
1613
|
const nextRaw = { ...raw, imports: merged };
|
|
1176
|
-
setServersObject(nextRaw, getServersObject(nextRaw));
|
|
1614
|
+
setServersObject(nextRaw, getServersObject(nextRaw, targetPath));
|
|
1177
1615
|
return buildConfigWritePreview(targetPath, nextRaw);
|
|
1178
1616
|
}
|
|
1179
1617
|
export function ensureCompatibilityImports(importKinds, overridePath) {
|
|
1180
1618
|
const targetPath = getPiGlobalConfigPath(overridePath);
|
|
1181
1619
|
const raw = readRawConfigObject(targetPath);
|
|
1182
|
-
const currentImports =
|
|
1620
|
+
const currentImports = getConfigImports(raw, targetPath);
|
|
1183
1621
|
const merged = [...new Set([...currentImports, ...importKinds])];
|
|
1184
1622
|
const added = merged.filter((kind) => !currentImports.includes(kind));
|
|
1185
1623
|
if (added.length === 0) {
|
|
1186
1624
|
return { path: targetPath, added: [] };
|
|
1187
1625
|
}
|
|
1188
1626
|
raw.imports = merged;
|
|
1189
|
-
const servers = getServersObject(raw);
|
|
1627
|
+
const servers = getServersObject(raw, targetPath);
|
|
1190
1628
|
setServersObject(raw, servers);
|
|
1191
1629
|
writeRawConfigObject(targetPath, raw);
|
|
1192
1630
|
return { path: targetPath, added };
|
|
@@ -1196,13 +1634,19 @@ export function buildStarterProjectConfig() {
|
|
|
1196
1634
|
mcpServers: {}
|
|
1197
1635
|
};
|
|
1198
1636
|
}
|
|
1637
|
+
function assertScaffoldTargetAbsent(filePath) {
|
|
1638
|
+
if (lstatSync(filePath, { throwIfNoEntry: false }))
|
|
1639
|
+
throw new Error(`Cannot scaffold MCP config at ${filePath}: file already exists`);
|
|
1640
|
+
}
|
|
1199
1641
|
export function previewStarterSharedConfig(target, cwd = process.cwd()) {
|
|
1200
1642
|
const targetPath = getSharedConfigPath(target, cwd);
|
|
1643
|
+
assertScaffoldTargetAbsent(targetPath);
|
|
1201
1644
|
const nextRaw = { mcpServers: buildStarterProjectConfig().mcpServers };
|
|
1202
1645
|
return buildConfigWritePreview(targetPath, nextRaw);
|
|
1203
1646
|
}
|
|
1204
1647
|
export function writeStarterSharedConfig(target, cwd = process.cwd()) {
|
|
1205
1648
|
const targetPath = getSharedConfigPath(target, cwd);
|
|
1649
|
+
assertScaffoldTargetAbsent(targetPath);
|
|
1206
1650
|
const raw = { mcpServers: buildStarterProjectConfig().mcpServers };
|
|
1207
1651
|
writeRawConfigObject(targetPath, raw);
|
|
1208
1652
|
return targetPath;
|
|
@@ -1216,14 +1660,14 @@ export function writeStarterProjectConfig(cwd = process.cwd()) {
|
|
|
1216
1660
|
export function previewSharedServerEntry(filePath, serverName, entry) {
|
|
1217
1661
|
const raw = readRawConfigObject(filePath);
|
|
1218
1662
|
const nextRaw = { ...raw };
|
|
1219
|
-
const servers = getServersObject(nextRaw);
|
|
1663
|
+
const servers = getServersObject(nextRaw, filePath);
|
|
1220
1664
|
servers[serverName] = entry;
|
|
1221
1665
|
setServersObject(nextRaw, servers);
|
|
1222
1666
|
return buildConfigWritePreview(filePath, nextRaw);
|
|
1223
1667
|
}
|
|
1224
1668
|
export function writeSharedServerEntry(filePath, serverName, entry) {
|
|
1225
1669
|
const raw = readRawConfigObject(filePath);
|
|
1226
|
-
const servers = getServersObject(raw);
|
|
1670
|
+
const servers = getServersObject(raw, filePath);
|
|
1227
1671
|
servers[serverName] = entry;
|
|
1228
1672
|
setServersObject(raw, servers);
|
|
1229
1673
|
writeRawConfigObject(filePath, raw);
|
|
@@ -1243,7 +1687,7 @@ export function getServerProvenance(overridePath, cwd = process.cwd()) {
|
|
|
1243
1687
|
}
|
|
1244
1688
|
}
|
|
1245
1689
|
for (const source of getConfigSources(overridePath, cwd)) {
|
|
1246
|
-
const loaded =
|
|
1690
|
+
const loaded = readSourceConfig(source.id, source.readPath);
|
|
1247
1691
|
if (!loaded)
|
|
1248
1692
|
continue;
|
|
1249
1693
|
if (loaded.imports?.length) {
|
|
@@ -1260,16 +1704,18 @@ export function getServerProvenance(overridePath, cwd = process.cwd()) {
|
|
|
1260
1704
|
}
|
|
1261
1705
|
}
|
|
1262
1706
|
for (const name of Object.keys(loaded.mcpServers)) {
|
|
1707
|
+
const ignoredSettings = loaded.ignoredSettings ? loaded.ignoredSettings.get(name) : provenance.get(name)?.ignoredSettings;
|
|
1263
1708
|
provenance.set(name, {
|
|
1264
1709
|
path: source.writePath,
|
|
1265
1710
|
kind: source.kind,
|
|
1266
|
-
...source.importKind !== undefined ? { importKind: source.importKind } : {}
|
|
1711
|
+
...source.importKind !== undefined ? { importKind: source.importKind } : {},
|
|
1712
|
+
...ignoredSettings !== undefined ? { ignoredSettings } : {}
|
|
1267
1713
|
});
|
|
1268
1714
|
}
|
|
1269
1715
|
}
|
|
1270
1716
|
return provenance;
|
|
1271
1717
|
}
|
|
1272
|
-
export function writeDirectToolsConfig(changes, provenance, fullConfig) {
|
|
1718
|
+
export function writeDirectToolsConfig(changes, provenance, fullConfig, onFileWritten) {
|
|
1273
1719
|
const byPath = new Map;
|
|
1274
1720
|
for (const [serverName, value] of changes) {
|
|
1275
1721
|
const prov = provenance.get(serverName);
|
|
@@ -1280,9 +1726,11 @@ export function writeDirectToolsConfig(changes, provenance, fullConfig) {
|
|
|
1280
1726
|
byPath.set(targetPath, []);
|
|
1281
1727
|
byPath.get(targetPath).push({ name: serverName, value, prov });
|
|
1282
1728
|
}
|
|
1729
|
+
for (const filePath of byPath.keys())
|
|
1730
|
+
getServersObject(readRawConfigObject(filePath), filePath);
|
|
1283
1731
|
for (const [filePath, entries] of byPath) {
|
|
1284
1732
|
const raw = readRawConfigObject(filePath);
|
|
1285
|
-
const servers = getServersObject(raw);
|
|
1733
|
+
const servers = getServersObject(raw, filePath);
|
|
1286
1734
|
for (const { name, value, prov } of entries) {
|
|
1287
1735
|
if (prov.kind === "import") {
|
|
1288
1736
|
const fullDef = fullConfig.mcpServers[name];
|
|
@@ -1295,6 +1743,7 @@ export function writeDirectToolsConfig(changes, provenance, fullConfig) {
|
|
|
1295
1743
|
}
|
|
1296
1744
|
setServersObject(raw, servers);
|
|
1297
1745
|
writeRawConfigObject(filePath, raw);
|
|
1746
|
+
onFileWritten?.();
|
|
1298
1747
|
}
|
|
1299
1748
|
}
|
|
1300
1749
|
export function resolveConfiguredOAuthDir(raw, cwd = process.cwd()) {
|