@duckmind/dm-linux-x64 0.65.5 → 0.65.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -8
- package/dm +2 -2
- package/extensions/.dm-extensions.json +677 -44
- package/extensions/dm-lens/clients/actionable-warnings-logger.js +0 -6
- package/extensions/dm-lens/clients/actionable-warnings.js +42 -13
- package/extensions/dm-lens/clients/advisory-provenance.js +129 -41
- package/extensions/dm-lens/clients/agent-behavior-client.js +1 -0
- package/extensions/dm-lens/clients/analysed-root.js +0 -0
- package/extensions/dm-lens/clients/ast-grep-client.js +38 -3
- package/extensions/dm-lens/clients/ast-grep-rule-manager.js +37 -5
- package/extensions/dm-lens/clients/ast-grep-tool-logger.js +1 -7
- package/extensions/dm-lens/clients/bash-file-access.js +138 -1
- package/extensions/dm-lens/clients/biome-client.js +9 -2
- package/extensions/dm-lens/clients/blocker-freshness.js +171 -21
- package/extensions/dm-lens/clients/bootstrap.js +9 -5
- package/extensions/dm-lens/clients/bounded-pid-file-lock.js +1 -1
- package/extensions/dm-lens/clients/bounded-telemetry.js +1 -4
- package/extensions/dm-lens/clients/bundled-resource-health.js +43 -0
- package/extensions/dm-lens/clients/bus-events-logger.js +0 -6
- package/extensions/dm-lens/clients/cache/rule-cache.js +11 -3
- package/extensions/dm-lens/clients/cache-manager.js +29 -5
- package/extensions/dm-lens/clients/cache-observability.js +104 -4
- package/extensions/dm-lens/clients/cargo-manifest.js +6 -3
- package/extensions/dm-lens/clients/cascade-format.js +87 -5
- package/extensions/dm-lens/clients/cascade-logger.js +0 -6
- package/extensions/dm-lens/clients/child-unref.js +5 -9
- package/extensions/dm-lens/clients/code-quality-warnings.js +4 -2
- package/extensions/dm-lens/clients/complexity-client.js +5 -1
- package/extensions/dm-lens/clients/config-core/index.js +2 -68
- package/extensions/dm-lens/clients/config-core/process-spec.js +1 -1
- package/extensions/dm-lens/clients/config-core/provenance.js +1 -2
- package/extensions/dm-lens/clients/config-core/records.js +1 -1
- package/extensions/dm-lens/clients/config-core/schema.js +3 -6
- package/extensions/dm-lens/clients/config-diagnostic-codes.js +5 -3
- package/extensions/dm-lens/clients/config-locations.js +125 -5
- package/extensions/dm-lens/clients/config-resolve.js +12 -6
- package/extensions/dm-lens/clients/config-schema.js +56 -3
- package/extensions/dm-lens/clients/config-warn.js +3 -2
- package/extensions/dm-lens/clients/dead-code-client.js +4 -1
- package/extensions/dm-lens/clients/dead-code-logger.js +0 -3
- package/extensions/dm-lens/clients/degradation-ledger.js +29 -4
- package/extensions/dm-lens/clients/dependency-checker.js +29 -50
- package/extensions/dm-lens/clients/diagnostic-dispositions.js +23 -4
- package/extensions/dm-lens/clients/diagnostic-logger.js +1 -1
- package/extensions/dm-lens/clients/dispatch/ast-grep-catalog.js +19 -0
- package/extensions/dm-lens/clients/dispatch/auxiliary-lsp.js +9 -0
- package/extensions/dm-lens/clients/dispatch/collect-later-tier.js +0 -3
- package/extensions/dm-lens/clients/dispatch/dispatcher.js +30 -27
- package/extensions/dm-lens/clients/dispatch/facts/function-facts.js +1 -1
- package/extensions/dm-lens/clients/dispatch/facts/import-facts.js +4 -1
- package/extensions/dm-lens/clients/dispatch/finding-policy.js +163 -0
- package/extensions/dm-lens/clients/dispatch/indent-detect.js +213 -13
- package/extensions/dm-lens/clients/dispatch/inline-suppressions.js +20 -1
- package/extensions/dm-lens/clients/dispatch/integration.js +77 -13
- package/extensions/dm-lens/clients/dispatch/lazy.js +0 -3
- package/extensions/dm-lens/clients/dispatch/pending-runner-findings.js +1 -1
- package/extensions/dm-lens/clients/dispatch/plan.js +0 -3
- package/extensions/dm-lens/clients/dispatch/rule-ignores.js +21 -0
- package/extensions/dm-lens/clients/dispatch/rules/high-complexity.js +2 -2
- package/extensions/dm-lens/clients/dispatch/rules/high-fan-out.js +1 -1
- package/extensions/dm-lens/clients/dispatch/runners/actionlint.js +25 -29
- package/extensions/dm-lens/clients/dispatch/runners/ast-grep-napi.js +8 -32
- package/extensions/dm-lens/clients/dispatch/runners/biome-check.js +39 -23
- package/extensions/dm-lens/clients/dispatch/runners/cpp-check.js +29 -48
- package/extensions/dm-lens/clients/dispatch/runners/credo.js +17 -14
- package/extensions/dm-lens/clients/dispatch/runners/cue-vet.js +9 -7
- package/extensions/dm-lens/clients/dispatch/runners/dart-analyze.js +21 -43
- package/extensions/dm-lens/clients/dispatch/runners/detekt.js +11 -5
- package/extensions/dm-lens/clients/dispatch/runners/dotnet-build.js +27 -23
- package/extensions/dm-lens/clients/dispatch/runners/elixir-check.js +23 -38
- package/extensions/dm-lens/clients/dispatch/runners/eslint.js +22 -35
- package/extensions/dm-lens/clients/dispatch/runners/fish-indent.js +2 -1
- package/extensions/dm-lens/clients/dispatch/runners/gleam-check.js +35 -12
- package/extensions/dm-lens/clients/dispatch/runners/go-vet.js +5 -3
- package/extensions/dm-lens/clients/dispatch/runners/golangci-lint.js +21 -22
- package/extensions/dm-lens/clients/dispatch/runners/hadolint.js +26 -16
- package/extensions/dm-lens/clients/dispatch/runners/helm-lint.js +3 -1
- package/extensions/dm-lens/clients/dispatch/runners/helm-render.js +3 -2
- package/extensions/dm-lens/clients/dispatch/runners/htmlhint.js +18 -9
- package/extensions/dm-lens/clients/dispatch/runners/javac.js +24 -23
- package/extensions/dm-lens/clients/dispatch/runners/ktlint.js +23 -54
- package/extensions/dm-lens/clients/dispatch/runners/lsp.js +17 -7
- package/extensions/dm-lens/clients/dispatch/runners/markdownlint.js +12 -6
- package/extensions/dm-lens/clients/dispatch/runners/mypy.js +2 -1
- package/extensions/dm-lens/clients/dispatch/runners/oxlint.js +24 -7
- package/extensions/dm-lens/clients/dispatch/runners/php-lint.js +26 -17
- package/extensions/dm-lens/clients/dispatch/runners/phpstan.js +2 -1
- package/extensions/dm-lens/clients/dispatch/runners/prisma-validate.js +2 -1
- package/extensions/dm-lens/clients/dispatch/runners/psscriptanalyzer.js +10 -11
- package/extensions/dm-lens/clients/dispatch/runners/pyright.js +2 -1
- package/extensions/dm-lens/clients/dispatch/runners/rubocop.js +22 -18
- package/extensions/dm-lens/clients/dispatch/runners/ruff.js +17 -22
- package/extensions/dm-lens/clients/dispatch/runners/rust-clippy.js +8 -11
- package/extensions/dm-lens/clients/dispatch/runners/shellcheck.js +9 -4
- package/extensions/dm-lens/clients/dispatch/runners/shfmt.js +4 -13
- package/extensions/dm-lens/clients/dispatch/runners/spellcheck.js +15 -5
- package/extensions/dm-lens/clients/dispatch/runners/spotbugs.js +2 -1
- package/extensions/dm-lens/clients/dispatch/runners/sqlfluff.js +10 -4
- package/extensions/dm-lens/clients/dispatch/runners/stylelint.js +9 -4
- package/extensions/dm-lens/clients/dispatch/runners/swiftlint.js +11 -3
- package/extensions/dm-lens/clients/dispatch/runners/taplo.js +13 -7
- package/extensions/dm-lens/clients/dispatch/runners/terragrunt.js +2 -1
- package/extensions/dm-lens/clients/dispatch/runners/tflint.js +26 -16
- package/extensions/dm-lens/clients/dispatch/runners/tree-sitter.js +12 -13
- package/extensions/dm-lens/clients/dispatch/runners/trivy-config.js +9 -3
- package/extensions/dm-lens/clients/dispatch/runners/utils/availability-policy.js +5 -0
- package/extensions/dm-lens/clients/dispatch/runners/utils/candidate-probe.js +2 -2
- package/extensions/dm-lens/clients/dispatch/runners/utils/diagnostic-parsers.js +8 -52
- package/extensions/dm-lens/clients/dispatch/runners/utils/runner-helpers.js +35 -3
- package/extensions/dm-lens/clients/dispatch/runners/utils.js +0 -17
- package/extensions/dm-lens/clients/dispatch/runners/vale.js +12 -4
- package/extensions/dm-lens/clients/dispatch/runners/yaml-rule-parser.js +2 -20
- package/extensions/dm-lens/clients/dispatch/runners/yamllint.js +16 -4
- package/extensions/dm-lens/clients/dispatch/runners/zig-check.js +26 -38
- package/extensions/dm-lens/clients/dispatch/suppress-writer.js +13 -3
- package/extensions/dm-lens/clients/dispatch/types.js +4 -1
- package/extensions/dm-lens/clients/dispatch/utils/format-utils.js +2 -2
- package/extensions/dm-lens/clients/disposition-logger.js +0 -6
- package/extensions/dm-lens/clients/disposition-publish.js +2 -1
- package/extensions/dm-lens/clients/effective-config.js +14 -4
- package/extensions/dm-lens/clients/event-loop-hold.js +123 -0
- package/extensions/dm-lens/clients/event-loop-monitor.js +2 -2
- package/extensions/dm-lens/clients/extension-log.js +6 -1
- package/extensions/dm-lens/clients/feature-hints.js +2 -1
- package/extensions/dm-lens/clients/file-kinds.js +17 -21
- package/extensions/dm-lens/clients/file-role.js +11 -2
- package/extensions/dm-lens/clients/file-time.js +1 -1
- package/extensions/dm-lens/clients/file-utils.js +93 -6
- package/extensions/dm-lens/clients/finding-delivery-gate.js +22 -26
- package/extensions/dm-lens/clients/format-service.js +33 -16
- package/extensions/dm-lens/clients/formatters.js +129 -92
- package/extensions/dm-lens/clients/generated-artifacts.js +2 -2
- package/extensions/dm-lens/clients/generation-guard.js +4 -0
- package/extensions/dm-lens/clients/git-guard.js +80 -26
- package/extensions/dm-lens/clients/gitleaks-client.js +26 -0
- package/extensions/dm-lens/clients/govulncheck-client.js +34 -6
- package/extensions/dm-lens/clients/gradle-ktfmt-style.js +96 -13
- package/extensions/dm-lens/clients/grammar-source.js +3 -3
- package/extensions/dm-lens/clients/host-edit-normalize.js +1 -1
- package/extensions/dm-lens/clients/indent-retarget.js +35 -5
- package/extensions/dm-lens/clients/inline-blocker-dispositions.js +107 -0
- package/extensions/dm-lens/clients/install-diagnostics.js +8 -6
- package/extensions/dm-lens/clients/installer/index.js +695 -183
- package/extensions/dm-lens/clients/installer/managed-tool-refresh.js +85 -25
- package/extensions/dm-lens/clients/instance-reaper-state.js +3 -0
- package/extensions/dm-lens/clients/instance-reaper.js +23 -16
- package/extensions/dm-lens/clients/instance-registry.js +34 -2
- package/extensions/dm-lens/clients/jscpd-client.js +11 -1
- package/extensions/dm-lens/clients/knip-client.js +2 -1
- package/extensions/dm-lens/clients/language-profile.js +18 -12
- package/extensions/dm-lens/clients/language-registry.js +3 -1
- package/extensions/dm-lens/clients/latency-logger.js +14 -4
- package/extensions/dm-lens/clients/ledger-bounds.js +13 -1
- package/extensions/dm-lens/clients/lens-config.js +74 -7
- package/extensions/dm-lens/clients/lens-engine.js +9 -10
- package/extensions/dm-lens/clients/lens-events.js +1 -1
- package/extensions/dm-lens/clients/lens-flag-registry.js +47 -2
- package/extensions/dm-lens/clients/lens-map.js +1 -1
- package/extensions/dm-lens/clients/log-cleanup.js +0 -28
- package/extensions/dm-lens/clients/lsp/cascade-tier.js +2 -1
- package/extensions/dm-lens/clients/lsp/client.js +70 -30
- package/extensions/dm-lens/clients/lsp/config.js +41 -15
- package/extensions/dm-lens/clients/lsp/content-limits.js +21 -0
- package/extensions/dm-lens/clients/lsp/diagnostic-binding.js +8 -0
- package/extensions/dm-lens/clients/lsp/document-drift.js +72 -1
- package/extensions/dm-lens/clients/lsp/edits.js +3 -3
- package/extensions/dm-lens/clients/lsp/index.js +435 -62
- package/extensions/dm-lens/clients/lsp/inferred-project.js +1 -1
- package/extensions/dm-lens/clients/lsp/language.js +0 -3
- package/extensions/dm-lens/clients/lsp/launch.js +12 -5
- package/extensions/dm-lens/clients/lsp/path-utils.js +0 -2
- package/extensions/dm-lens/clients/lsp/pending-aux-coverage.js +0 -1
- package/extensions/dm-lens/clients/lsp/server.js +125 -60
- package/extensions/dm-lens/clients/lsp/session-roots.js +26 -5
- package/extensions/dm-lens/clients/lsp/sync-kind.js +14 -1
- package/extensions/dm-lens/clients/lsp/tsserver-sync.js +5 -7
- package/extensions/dm-lens/clients/lsp/wait-policy/classification.js +3 -0
- package/extensions/dm-lens/clients/lsp/wait-policy/strategies.js +31 -2
- package/extensions/dm-lens/clients/lsp/workspace-diagnostics-cache.js +26 -4
- package/extensions/dm-lens/clients/lsp-document-symbols.js +1 -1
- package/extensions/dm-lens/clients/map-with-concurrency.js +7 -3
- package/extensions/dm-lens/clients/mcp/analyze.js +1 -1
- package/extensions/dm-lens/clients/mcp/ipc.js +104 -40
- package/extensions/dm-lens/clients/mcp/review.js +39 -7
- package/extensions/dm-lens/clients/mcp/session.js +38 -4
- package/extensions/dm-lens/clients/metrics-history.js +19 -84
- package/extensions/dm-lens/clients/middle-man-analysis.js +2 -4
- package/extensions/dm-lens/clients/module-report.js +1 -1
- package/extensions/dm-lens/clients/mutating-tool.js +3 -3
- package/extensions/dm-lens/clients/mutation-attribution.js +3 -3
- package/extensions/dm-lens/clients/ndjson-logger.js +17 -9
- package/extensions/dm-lens/clients/observed-mutation.js +42 -11
- package/extensions/dm-lens/clients/opaque-mutation-scan.js +17 -7
- package/extensions/dm-lens/clients/opengrep-client.js +92 -10
- package/extensions/dm-lens/clients/opengrep-config.js +1 -1
- package/extensions/dm-lens/clients/package-manager.js +2 -1
- package/extensions/dm-lens/clients/path-utils.js +199 -3
- package/extensions/dm-lens/clients/performance-report.js +3 -3
- package/extensions/dm-lens/clients/persistent-reverify.js +167 -0
- package/extensions/dm-lens/clients/php-cs-fixer-config.js +9 -4
- package/extensions/dm-lens/clients/pipeline.js +124 -68
- package/extensions/dm-lens/clients/project-changes.js +1 -1
- package/extensions/dm-lens/clients/project-diagnostics/cache.js +19 -5
- package/extensions/dm-lens/clients/project-diagnostics/extractors.js +1 -1
- package/extensions/dm-lens/clients/project-diagnostics/fresh-fetch.js +150 -18
- package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/dead-code.js +4 -1
- package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/gitleaks.js +3 -3
- package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/jscpd.js +1 -1
- package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/knip.js +1 -1
- package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/madge.js +1 -1
- package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/opengrep.js +1 -1
- package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/runner-findings.js +19 -2
- package/extensions/dm-lens/clients/project-diagnostics/scanner.js +35 -4
- package/extensions/dm-lens/clients/project-lens-config.js +58 -4
- package/extensions/dm-lens/clients/project-scan-policy.js +0 -46
- package/extensions/dm-lens/clients/python-environment.js +80 -4
- package/extensions/dm-lens/clients/python-provenance.js +551 -0
- package/extensions/dm-lens/clients/read-guard-logger.js +3 -1
- package/extensions/dm-lens/clients/read-guard.js +29 -6
- package/extensions/dm-lens/clients/recent-touches.js +2 -2
- package/extensions/dm-lens/clients/resource-sampler.js +59 -9
- package/extensions/dm-lens/clients/review-graph/builder.js +39 -34
- package/extensions/dm-lens/clients/review-graph/git-identity.js +11 -7
- package/extensions/dm-lens/clients/review-graph/import-resolvers.js +1 -1
- package/extensions/dm-lens/clients/review-graph-logger.js +3 -1
- package/extensions/dm-lens/clients/ruff-client.js +11 -10
- package/extensions/dm-lens/clients/runtime-agent-end.js +41 -5
- package/extensions/dm-lens/clients/runtime-context.js +5 -2
- package/extensions/dm-lens/clients/runtime-coordinator.js +60 -6
- package/extensions/dm-lens/clients/runtime-session.js +52 -8
- package/extensions/dm-lens/clients/runtime-tool-call.js +27 -15
- package/extensions/dm-lens/clients/runtime-tool-result.js +279 -63
- package/extensions/dm-lens/clients/runtime-turn.js +453 -185
- package/extensions/dm-lens/clients/safe-spawn.js +248 -62
- package/extensions/dm-lens/clients/sanitize.js +0 -4
- package/extensions/dm-lens/clients/scan-utils.js +1 -39
- package/extensions/dm-lens/clients/scratch-tree-policy.js +2 -3
- package/extensions/dm-lens/clients/security-scan-client.js +2 -2
- package/extensions/dm-lens/clients/session-event-guard.js +59 -2
- package/extensions/dm-lens/clients/session-summary.js +0 -25
- package/extensions/dm-lens/clients/sg-runner.js +24 -12
- package/extensions/dm-lens/clients/sgconfig.js +58 -6
- package/extensions/dm-lens/clients/shared-checkout-guard.js +1 -1
- package/extensions/dm-lens/clients/situational-tool-telemetry.js +85 -0
- package/extensions/dm-lens/clients/skills-resolver.js +42 -0
- package/extensions/dm-lens/clients/smells-rollup.js +2 -2
- package/extensions/dm-lens/clients/spawn-output-cap.js +29 -0
- package/extensions/dm-lens/clients/startup-scan.js +1 -2
- package/extensions/dm-lens/clients/string-utils.js +3 -0
- package/extensions/dm-lens/clients/test-runner-client.js +118 -57
- package/extensions/dm-lens/clients/test-runner-delivery.js +118 -66
- package/extensions/dm-lens/clients/tool-agreement.js +403 -0
- package/extensions/dm-lens/clients/tool-config.js +218 -0
- package/extensions/dm-lens/clients/tool-cwd.js +248 -0
- package/extensions/dm-lens/clients/tool-definition.js +18 -1
- package/extensions/dm-lens/clients/tool-policy.js +138 -10
- package/extensions/dm-lens/clients/tool-probe.js +5 -0
- package/extensions/dm-lens/clients/tool-set-policy.js +35 -0
- package/extensions/dm-lens/clients/tree-sitter-client.js +201 -80
- package/extensions/dm-lens/clients/tree-sitter-query-loader.js +78 -130
- package/extensions/dm-lens/clients/trivy-client.js +8 -1
- package/extensions/dm-lens/clients/tui-fit.js +0 -3
- package/extensions/dm-lens/clients/turn-context.js +48 -0
- package/extensions/dm-lens/clients/turn-end/lane.js +0 -0
- package/extensions/dm-lens/clients/turn-end/lanes/govulncheck.js +54 -0
- package/extensions/dm-lens/clients/turn-end/lanes/secrets.js +140 -0
- package/extensions/dm-lens/clients/user-notify.js +0 -3
- package/extensions/dm-lens/clients/warm-attach.js +25 -0
- package/extensions/dm-lens/clients/widget-state.js +203 -13
- package/extensions/dm-lens/clients/word-index-logger.js +0 -6
- package/extensions/dm-lens/clients/word-index-store.js +1 -4
- package/extensions/dm-lens/clients/word-index.js +9 -5
- package/extensions/dm-lens/clients/workspace-topology.js +20 -3
- package/extensions/dm-lens/clients/write-ordering-guard.js +6 -0
- package/extensions/dm-lens/clients/zizmor-config.js +15 -11
- package/extensions/dm-lens/config/dependency-cruiser-eager-allowlist.json +8 -2
- package/extensions/dm-lens/dist/clients/actionable-warnings-logger.js +24 -0
- package/extensions/dm-lens/dist/clients/actionable-warnings.js +1014 -0
- package/extensions/dm-lens/dist/clients/advisory-provenance.js +385 -0
- package/extensions/dm-lens/dist/clients/agent-behavior-client.js +94 -0
- package/extensions/dm-lens/dist/clients/agent-nudge.js +151 -0
- package/extensions/dm-lens/dist/clients/analysed-root.js +1 -0
- package/extensions/dm-lens/dist/clients/ast-grep-client.js +576 -0
- package/extensions/dm-lens/dist/clients/ast-grep-rule-manager.js +114 -0
- package/extensions/dm-lens/dist/clients/ast-grep-tool-logger.js +85 -0
- package/extensions/dm-lens/dist/clients/ast-grep-types.js +1 -0
- package/extensions/dm-lens/dist/clients/ast-grep-yaml-synth.js +109 -0
- package/extensions/dm-lens/dist/clients/atomic-write-staging.js +66 -0
- package/extensions/dm-lens/dist/clients/atomic-write.js +37 -0
- package/extensions/dm-lens/dist/clients/availability-probe-flight.js +11 -0
- package/extensions/dm-lens/dist/clients/bash-file-access.js +830 -0
- package/extensions/dm-lens/dist/clients/biome-client.js +221 -0
- package/extensions/dm-lens/dist/clients/blocker-freshness.js +385 -0
- package/extensions/dm-lens/dist/clients/blocker-past-eof.js +49 -0
- package/extensions/dm-lens/dist/clients/bootstrap.js +246 -0
- package/extensions/dm-lens/dist/clients/bounded-cache.js +105 -0
- package/extensions/dm-lens/dist/clients/bounded-pid-file-lock.js +173 -0
- package/extensions/dm-lens/dist/clients/bounded-telemetry.js +104 -0
- package/extensions/dm-lens/dist/clients/build-identity.js +45 -0
- package/extensions/dm-lens/dist/clients/bundled-resource-health.js +41 -0
- package/extensions/dm-lens/dist/clients/bus-events-logger.js +48 -0
- package/extensions/dm-lens/dist/clients/bus-publish.js +117 -0
- package/extensions/dm-lens/dist/clients/cache/rule-cache.js +103 -0
- package/extensions/dm-lens/dist/clients/cache-manager.js +340 -0
- package/extensions/dm-lens/dist/clients/cache-observability.js +847 -0
- package/extensions/dm-lens/dist/clients/call-graph.js +628 -0
- package/extensions/dm-lens/dist/clients/cargo-manifest.js +151 -0
- package/extensions/dm-lens/dist/clients/cascade-budget.js +52 -0
- package/extensions/dm-lens/dist/clients/cascade-format.js +160 -0
- package/extensions/dm-lens/dist/clients/cascade-logger.js +22 -0
- package/extensions/dm-lens/dist/clients/cascade-types.js +1 -0
- package/extensions/dm-lens/dist/clients/child-unref.js +59 -0
- package/extensions/dm-lens/dist/clients/code-quality-warnings.js +192 -0
- package/extensions/dm-lens/dist/clients/codebase-model.js +110 -0
- package/extensions/dm-lens/dist/clients/collateral-test-role.js +8 -0
- package/extensions/dm-lens/dist/clients/complexity-client.js +398 -0
- package/extensions/dm-lens/dist/clients/config-core/deny.js +117 -0
- package/extensions/dm-lens/dist/clients/config-core/index.js +2 -0
- package/extensions/dm-lens/dist/clients/config-core/merge.js +228 -0
- package/extensions/dm-lens/dist/clients/config-core/normalize.js +217 -0
- package/extensions/dm-lens/dist/clients/config-core/process-spec.js +147 -0
- package/extensions/dm-lens/dist/clients/config-core/provenance.js +54 -0
- package/extensions/dm-lens/dist/clients/config-core/records.js +79 -0
- package/extensions/dm-lens/dist/clients/config-core/resolve.js +48 -0
- package/extensions/dm-lens/dist/clients/config-core/safe-object.js +22 -0
- package/extensions/dm-lens/dist/clients/config-core/schema.js +90 -0
- package/extensions/dm-lens/dist/clients/config-diagnostic-codes.js +90 -0
- package/extensions/dm-lens/dist/clients/config-locations.js +175 -0
- package/extensions/dm-lens/dist/clients/config-resolve.js +359 -0
- package/extensions/dm-lens/dist/clients/config-schema.js +128 -0
- package/extensions/dm-lens/dist/clients/config-warn.js +146 -0
- package/extensions/dm-lens/dist/clients/console-guard-install.js +4 -0
- package/extensions/dm-lens/dist/clients/cooperative-budget.js +36 -0
- package/extensions/dm-lens/dist/clients/dead-code-client.js +342 -0
- package/extensions/dm-lens/dist/clients/dead-code-logger.js +18 -0
- package/extensions/dm-lens/dist/clients/deadline-utils.js +117 -0
- package/extensions/dm-lens/dist/clients/debug-handles.js +121 -0
- package/extensions/dm-lens/dist/clients/debug-heap.js +80 -0
- package/extensions/dm-lens/dist/clients/deferred-lsp-work.js +33 -0
- package/extensions/dm-lens/dist/clients/degradation-ledger.js +272 -0
- package/extensions/dm-lens/dist/clients/demoted-finding-render.js +61 -0
- package/extensions/dm-lens/dist/clients/dependency-checker.js +525 -0
- package/extensions/dm-lens/dist/clients/deps/ast-grep-napi.js +17 -0
- package/extensions/dm-lens/dist/clients/deps/dm-host-deps.js +10 -0
- package/extensions/dm-lens/dist/clients/deps/dm-tui-compat.js +58 -0
- package/extensions/dm-lens/dist/clients/deps/js-yaml.js +7 -0
- package/extensions/dm-lens/dist/clients/deps/minimatch.js +6 -0
- package/extensions/dm-lens/dist/clients/deps/pidusage.js +5 -0
- package/extensions/dm-lens/dist/clients/deps/typebox.js +5 -0
- package/extensions/dm-lens/dist/clients/deps/vscode-jsonrpc.js +8 -0
- package/extensions/dm-lens/dist/clients/deps/web-tree-sitter.js +11 -0
- package/extensions/dm-lens/dist/clients/diagnostic-dispositions.js +318 -0
- package/extensions/dm-lens/dist/clients/diagnostic-line-freshness.js +144 -0
- package/extensions/dm-lens/dist/clients/diagnostic-logger.js +60 -0
- package/extensions/dm-lens/dist/clients/diagnostic-tracker.js +89 -0
- package/extensions/dm-lens/dist/clients/diagnostics-publish.js +134 -0
- package/extensions/dm-lens/dist/clients/dispatch/ast-grep-catalog.js +16 -0
- package/extensions/dm-lens/dist/clients/dispatch/auxiliary-lsp.js +158 -0
- package/extensions/dm-lens/dist/clients/dispatch/collect-later-tier.js +25 -0
- package/extensions/dm-lens/dist/clients/dispatch/diagnostic-taxonomy.js +58 -0
- package/extensions/dm-lens/dist/clients/dispatch/dispatcher.js +953 -0
- package/extensions/dm-lens/dist/clients/dispatch/fact-provider-types.js +1 -0
- package/extensions/dm-lens/dist/clients/dispatch/fact-rule-runner.js +17 -0
- package/extensions/dm-lens/dist/clients/dispatch/fact-runner.js +18 -0
- package/extensions/dm-lens/dist/clients/dispatch/fact-scheduler.js +52 -0
- package/extensions/dm-lens/dist/clients/dispatch/fact-store.js +199 -0
- package/extensions/dm-lens/dist/clients/dispatch/facts/comment-facts.js +20 -0
- package/extensions/dm-lens/dist/clients/dispatch/facts/file-content.js +18 -0
- package/extensions/dm-lens/dist/clients/dispatch/facts/function-facts.js +281 -0
- package/extensions/dm-lens/dist/clients/dispatch/facts/import-facts.js +169 -0
- package/extensions/dm-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +19 -0
- package/extensions/dm-lens/dist/clients/dispatch/facts/try-catch-facts.js +95 -0
- package/extensions/dm-lens/dist/clients/dispatch/finding-policy.js +159 -0
- package/extensions/dm-lens/dist/clients/dispatch/indent-detect.js +227 -0
- package/extensions/dm-lens/dist/clients/dispatch/inline-suppressions.js +52 -0
- package/extensions/dm-lens/dist/clients/dispatch/integration.js +1463 -0
- package/extensions/dm-lens/dist/clients/dispatch/lazy.js +8 -0
- package/extensions/dm-lens/dist/clients/dispatch/pending-runner-findings.js +75 -0
- package/extensions/dm-lens/dist/clients/dispatch/plan.js +278 -0
- package/extensions/dm-lens/dist/clients/dispatch/priorities.js +14 -0
- package/extensions/dm-lens/dist/clients/dispatch/rule-id-normalize.js +42 -0
- package/extensions/dm-lens/dist/clients/dispatch/rule-ignores.js +21 -0
- package/extensions/dm-lens/dist/clients/dispatch/rule-policy.js +73 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/async-noise.js +31 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +27 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/cors-wildcard.js +35 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/error-obscuring.js +29 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/error-swallowing.js +29 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/framework-call-noise.js +31 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/high-complexity.js +56 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/high-fan-out.js +45 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/high-import-coupling.js +31 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/missing-error-propagation.js +45 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/no-commented-credentials.js +46 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +38 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/placeholder-comments.js +40 -0
- package/extensions/dm-lens/dist/clients/dispatch/rules/unsafe-boundary.js +101 -0
- package/extensions/dm-lens/dist/clients/dispatch/runner-context.js +46 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/actionlint.js +98 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/ast-grep-napi.js +690 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/biome-check.js +202 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/cpp-check.js +190 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/credo.js +66 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/cue-vet.js +167 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/dart-analyze.js +151 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/detekt.js +157 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/dotnet-build.js +157 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/elixir-check.js +153 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/eslint.js +99 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/fact-rules.js +20 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/fish-indent.js +65 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/gleam-check.js +107 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/go-vet.js +51 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/golangci-lint.js +89 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/hadolint.js +83 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/helm-lint.js +144 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/helm-render.js +593 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/htmlhint.js +103 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/index.js +100 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/javac.js +82 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/ktlint.js +93 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/lsp.js +206 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/markdownlint.js +129 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/mypy.js +70 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/oxlint.js +305 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/php-lint.js +70 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/phpstan.js +90 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/prisma-validate.js +56 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +307 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/pyright.js +118 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/rubocop.js +79 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/ruff.js +69 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/rust-clippy.js +147 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/shellcheck.js +111 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/shfmt.js +81 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/spellcheck.js +74 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/spotbugs.js +208 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/sqlfluff.js +136 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/stylelint.js +118 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/swiftlint.js +143 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/taplo.js +97 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/terragrunt.js +110 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/tflint.js +104 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/tree-sitter.js +516 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/trivy-config.js +155 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/utils/availability-policy.js +285 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +61 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +61 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +130 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +1067 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +40 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/utils/tool-failure.js +117 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +88 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/utils.js +8 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/vale.js +106 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +163 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/yamllint.js +83 -0
- package/extensions/dm-lens/dist/clients/dispatch/runners/zig-check.js +72 -0
- package/extensions/dm-lens/dist/clients/dispatch/suppress-writer.js +57 -0
- package/extensions/dm-lens/dist/clients/dispatch/tool-profile.js +30 -0
- package/extensions/dm-lens/dist/clients/dispatch/types.js +7 -0
- package/extensions/dm-lens/dist/clients/dispatch/utils/format-utils.js +45 -0
- package/extensions/dm-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +31 -0
- package/extensions/dm-lens/dist/clients/disposition-logger.js +19 -0
- package/extensions/dm-lens/dist/clients/disposition-publish.js +88 -0
- package/extensions/dm-lens/dist/clients/durable-store.js +77 -0
- package/extensions/dm-lens/dist/clients/effective-config.js +160 -0
- package/extensions/dm-lens/dist/clients/env-utils.js +26 -0
- package/extensions/dm-lens/dist/clients/error-class.js +3 -0
- package/extensions/dm-lens/dist/clients/eval-timestamp.js +2 -0
- package/extensions/dm-lens/dist/clients/event-loop-hold.js +119 -0
- package/extensions/dm-lens/dist/clients/event-loop-monitor.js +84 -0
- package/extensions/dm-lens/dist/clients/extension-log.js +230 -0
- package/extensions/dm-lens/dist/clients/extension-mode.js +20 -0
- package/extensions/dm-lens/dist/clients/feature-hints.js +88 -0
- package/extensions/dm-lens/dist/clients/file-kinds.js +304 -0
- package/extensions/dm-lens/dist/clients/file-role.js +50 -0
- package/extensions/dm-lens/dist/clients/file-time.js +112 -0
- package/extensions/dm-lens/dist/clients/file-utils.js +630 -0
- package/extensions/dm-lens/dist/clients/finding-delivery-gate.js +129 -0
- package/extensions/dm-lens/dist/clients/finding-identity.js +23 -0
- package/extensions/dm-lens/dist/clients/fix-worklog.js +75 -0
- package/extensions/dm-lens/dist/clients/format-events-publish.js +230 -0
- package/extensions/dm-lens/dist/clients/format-service.js +154 -0
- package/extensions/dm-lens/dist/clients/formatters-lazy.js +8 -0
- package/extensions/dm-lens/dist/clients/formatters.js +1351 -0
- package/extensions/dm-lens/dist/clients/freshness-cadence.js +1 -0
- package/extensions/dm-lens/dist/clients/freshness.js +8 -0
- package/extensions/dm-lens/dist/clients/generated-artifacts.js +209 -0
- package/extensions/dm-lens/dist/clients/generation-guard.js +105 -0
- package/extensions/dm-lens/dist/clients/git-guard.js +770 -0
- package/extensions/dm-lens/dist/clients/git-tracked-ignore.js +120 -0
- package/extensions/dm-lens/dist/clients/gitleaks-client.js +282 -0
- package/extensions/dm-lens/dist/clients/go-client.js +47 -0
- package/extensions/dm-lens/dist/clients/govulncheck-client.js +411 -0
- package/extensions/dm-lens/dist/clients/gradle-ktfmt-style.js +177 -0
- package/extensions/dm-lens/dist/clients/grammar-source.js +224 -0
- package/extensions/dm-lens/dist/clients/gzip-stage-write.js +85 -0
- package/extensions/dm-lens/dist/clients/hashline-anchor.js +222 -0
- package/extensions/dm-lens/dist/clients/hook-budgets.js +16 -0
- package/extensions/dm-lens/dist/clients/host-edit-normalize.js +87 -0
- package/extensions/dm-lens/dist/clients/host-ports.js +35 -0
- package/extensions/dm-lens/dist/clients/indent-retarget.js +102 -0
- package/extensions/dm-lens/dist/clients/inline-blocker-dispositions.js +103 -0
- package/extensions/dm-lens/dist/clients/install-diagnostics.js +123 -0
- package/extensions/dm-lens/dist/clients/installer/index.js +3770 -0
- package/extensions/dm-lens/dist/clients/installer/managed-tool-refresh-session.js +17 -0
- package/extensions/dm-lens/dist/clients/installer/managed-tool-refresh.js +522 -0
- package/extensions/dm-lens/dist/clients/instance-reaper-state.js +3 -0
- package/extensions/dm-lens/dist/clients/instance-reaper.js +577 -0
- package/extensions/dm-lens/dist/clients/instance-registry-lock.js +131 -0
- package/extensions/dm-lens/dist/clients/instance-registry.js +452 -0
- package/extensions/dm-lens/dist/clients/jscpd-client.js +252 -0
- package/extensions/dm-lens/dist/clients/json-cache-read.js +25 -0
- package/extensions/dm-lens/dist/clients/knip-client.js +472 -0
- package/extensions/dm-lens/dist/clients/language-policy.js +242 -0
- package/extensions/dm-lens/dist/clients/language-profile.js +261 -0
- package/extensions/dm-lens/dist/clients/language-registry.js +424 -0
- package/extensions/dm-lens/dist/clients/latency-logger.js +192 -0
- package/extensions/dm-lens/dist/clients/lazy-import.js +14 -0
- package/extensions/dm-lens/dist/clients/ledger-bounds.js +21 -0
- package/extensions/dm-lens/dist/clients/lens-config.js +237 -0
- package/extensions/dm-lens/dist/clients/lens-engine.js +181 -0
- package/extensions/dm-lens/dist/clients/lens-events.js +105 -0
- package/extensions/dm-lens/dist/clients/lens-flag-registry.js +302 -0
- package/extensions/dm-lens/dist/clients/lens-map.js +980 -0
- package/extensions/dm-lens/dist/clients/live-bus-emitter.js +53 -0
- package/extensions/dm-lens/dist/clients/log-cleanup.js +138 -0
- package/extensions/dm-lens/dist/clients/lsp/aggregation.js +88 -0
- package/extensions/dm-lens/dist/clients/lsp/cascade-tier.js +203 -0
- package/extensions/dm-lens/dist/clients/lsp/client.js +2709 -0
- package/extensions/dm-lens/dist/clients/lsp/config.js +252 -0
- package/extensions/dm-lens/dist/clients/lsp/content-limits.js +21 -0
- package/extensions/dm-lens/dist/clients/lsp/diagnostic-binding.js +79 -0
- package/extensions/dm-lens/dist/clients/lsp/document-drift.js +312 -0
- package/extensions/dm-lens/dist/clients/lsp/edits.js +930 -0
- package/extensions/dm-lens/dist/clients/lsp/index.js +4448 -0
- package/extensions/dm-lens/dist/clients/lsp/inferred-project.js +121 -0
- package/extensions/dm-lens/dist/clients/lsp/jvm-runtime.js +194 -0
- package/extensions/dm-lens/dist/clients/lsp/language.js +23 -0
- package/extensions/dm-lens/dist/clients/lsp/launch.js +468 -0
- package/extensions/dm-lens/dist/clients/lsp/lombok.js +146 -0
- package/extensions/dm-lens/dist/clients/lsp/path-utils.js +1 -0
- package/extensions/dm-lens/dist/clients/lsp/pending-aux-coverage.js +90 -0
- package/extensions/dm-lens/dist/clients/lsp/position-encoding.js +28 -0
- package/extensions/dm-lens/dist/clients/lsp/ruby-drive-dirs.js +42 -0
- package/extensions/dm-lens/dist/clients/lsp/server.js +2422 -0
- package/extensions/dm-lens/dist/clients/lsp/session-roots.js +52 -0
- package/extensions/dm-lens/dist/clients/lsp/spawn-history.js +15 -0
- package/extensions/dm-lens/dist/clients/lsp/sync-kind.js +30 -0
- package/extensions/dm-lens/dist/clients/lsp/tsserver-sync.js +156 -0
- package/extensions/dm-lens/dist/clients/lsp/wait-policy/capability-snapshot.js +1 -0
- package/extensions/dm-lens/dist/clients/lsp/wait-policy/classification.js +36 -0
- package/extensions/dm-lens/dist/clients/lsp/wait-policy/index.js +3 -0
- package/extensions/dm-lens/dist/clients/lsp/wait-policy/strategies.js +175 -0
- package/extensions/dm-lens/dist/clients/lsp/watch-queue.js +40 -0
- package/extensions/dm-lens/dist/clients/lsp/workspace-diagnostics-cache.js +267 -0
- package/extensions/dm-lens/dist/clients/lsp/workspace-diagnostics-session.js +7 -0
- package/extensions/dm-lens/dist/clients/lsp/workspace-sweep-hold.js +93 -0
- package/extensions/dm-lens/dist/clients/lsp-budget.js +83 -0
- package/extensions/dm-lens/dist/clients/lsp-document-symbols.js +93 -0
- package/extensions/dm-lens/dist/clients/lsp-lazy.js +8 -0
- package/extensions/dm-lens/dist/clients/lsp-mutation.js +273 -0
- package/extensions/dm-lens/dist/clients/lsp-status.js +37 -0
- package/extensions/dm-lens/dist/clients/map-with-concurrency.js +20 -0
- package/extensions/dm-lens/dist/clients/mcp/analyze.js +251 -0
- package/extensions/dm-lens/dist/clients/mcp/host-shim.js +14 -0
- package/extensions/dm-lens/dist/clients/mcp/ipc.js +302 -0
- package/extensions/dm-lens/dist/clients/mcp/review.js +137 -0
- package/extensions/dm-lens/dist/clients/mcp/session.js +305 -0
- package/extensions/dm-lens/dist/clients/memory-sampler.js +107 -0
- package/extensions/dm-lens/dist/clients/message-end-attribution.js +18 -0
- package/extensions/dm-lens/dist/clients/metrics-client.js +80 -0
- package/extensions/dm-lens/dist/clients/metrics-history.js +255 -0
- package/extensions/dm-lens/dist/clients/middle-man-analysis.js +161 -0
- package/extensions/dm-lens/dist/clients/model-provider.js +31 -0
- package/extensions/dm-lens/dist/clients/module-report-lsp.js +140 -0
- package/extensions/dm-lens/dist/clients/module-report.js +1642 -0
- package/extensions/dm-lens/dist/clients/mutating-tool.js +377 -0
- package/extensions/dm-lens/dist/clients/mutation-attribution.js +168 -0
- package/extensions/dm-lens/dist/clients/mutation-bridge.js +102 -0
- package/extensions/dm-lens/dist/clients/ndjson-logger.js +471 -0
- package/extensions/dm-lens/dist/clients/observed-mutation-sources.js +43 -0
- package/extensions/dm-lens/dist/clients/observed-mutation.js +709 -0
- package/extensions/dm-lens/dist/clients/oldtext-autopatch.js +100 -0
- package/extensions/dm-lens/dist/clients/opaque-mutation-scan.js +313 -0
- package/extensions/dm-lens/dist/clients/opengrep-client.js +216 -0
- package/extensions/dm-lens/dist/clients/opengrep-config.js +52 -0
- package/extensions/dm-lens/dist/clients/package-manager.js +303 -0
- package/extensions/dm-lens/dist/clients/package-root.js +25 -0
- package/extensions/dm-lens/dist/clients/partial-edit-apply.js +337 -0
- package/extensions/dm-lens/dist/clients/path-attribution-telemetry.js +31 -0
- package/extensions/dm-lens/dist/clients/path-keyed-map.js +57 -0
- package/extensions/dm-lens/dist/clients/path-utils.js +476 -0
- package/extensions/dm-lens/dist/clients/performance-report.js +291 -0
- package/extensions/dm-lens/dist/clients/persist-debounce.js +37 -0
- package/extensions/dm-lens/dist/clients/persistent-reverify.js +165 -0
- package/extensions/dm-lens/dist/clients/php-cs-fixer-config.js +15 -0
- package/extensions/dm-lens/dist/clients/pipeline.js +1091 -0
- package/extensions/dm-lens/dist/clients/post-autofix-notice.js +19 -0
- package/extensions/dm-lens/dist/clients/print-mode.js +3 -0
- package/extensions/dm-lens/dist/clients/probe-home-state.js +62 -0
- package/extensions/dm-lens/dist/clients/process-bridge.js +20 -0
- package/extensions/dm-lens/dist/clients/process-singletons.js +69 -0
- package/extensions/dm-lens/dist/clients/process-snapshot.js +22 -0
- package/extensions/dm-lens/dist/clients/project-changes.js +112 -0
- package/extensions/dm-lens/dist/clients/project-conventions.js +152 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/cache.js +91 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/extractors.js +53 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/fresh-fetch.js +408 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +64 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/dead-code.js +38 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +21 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +23 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/jscpd.js +28 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/knip.js +45 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/madge.js +34 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/opengrep.js +32 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +79 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +41 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/scanner.js +349 -0
- package/extensions/dm-lens/dist/clients/project-diagnostics/types.js +1 -0
- package/extensions/dm-lens/dist/clients/project-lens-config.js +437 -0
- package/extensions/dm-lens/dist/clients/project-report.js +527 -0
- package/extensions/dm-lens/dist/clients/project-scale.js +60 -0
- package/extensions/dm-lens/dist/clients/project-scan-policy.js +4 -0
- package/extensions/dm-lens/dist/clients/project-snapshot-fingerprint.js +39 -0
- package/extensions/dm-lens/dist/clients/project-snapshot-persist-worker.js +14 -0
- package/extensions/dm-lens/dist/clients/project-snapshot.js +1178 -0
- package/extensions/dm-lens/dist/clients/project-trust.js +104 -0
- package/extensions/dm-lens/dist/clients/python-environment.js +120 -0
- package/extensions/dm-lens/dist/clients/python-provenance.js +551 -0
- package/extensions/dm-lens/dist/clients/quiet-window-config.js +16 -0
- package/extensions/dm-lens/dist/clients/quiet-window.js +126 -0
- package/extensions/dm-lens/dist/clients/read-bridge.js +46 -0
- package/extensions/dm-lens/dist/clients/read-expansion.js +218 -0
- package/extensions/dm-lens/dist/clients/read-guard-logger.js +178 -0
- package/extensions/dm-lens/dist/clients/read-guard-tool-lines.js +1042 -0
- package/extensions/dm-lens/dist/clients/read-guard.js +1096 -0
- package/extensions/dm-lens/dist/clients/recent-touches.js +126 -0
- package/extensions/dm-lens/dist/clients/redact/secrets.js +386 -0
- package/extensions/dm-lens/dist/clients/resource-sampler.js +344 -0
- package/extensions/dm-lens/dist/clients/reverse-deps.js +227 -0
- package/extensions/dm-lens/dist/clients/review-graph/builder.js +3635 -0
- package/extensions/dm-lens/dist/clients/review-graph/format.js +30 -0
- package/extensions/dm-lens/dist/clients/review-graph/git-identity.js +115 -0
- package/extensions/dm-lens/dist/clients/review-graph/import-resolvers.js +325 -0
- package/extensions/dm-lens/dist/clients/review-graph/persist-worker.js +8 -0
- package/extensions/dm-lens/dist/clients/review-graph/query.js +195 -0
- package/extensions/dm-lens/dist/clients/review-graph/revision-drift.js +3 -0
- package/extensions/dm-lens/dist/clients/review-graph/service.js +60 -0
- package/extensions/dm-lens/dist/clients/review-graph/shared-extraction-ir.js +54 -0
- package/extensions/dm-lens/dist/clients/review-graph/symbol-id.js +29 -0
- package/extensions/dm-lens/dist/clients/review-graph/tsconfig-paths.js +253 -0
- package/extensions/dm-lens/dist/clients/review-graph/types.js +1 -0
- package/extensions/dm-lens/dist/clients/review-graph/workspace-modules.js +374 -0
- package/extensions/dm-lens/dist/clients/review-graph-logger.js +51 -0
- package/extensions/dm-lens/dist/clients/ruff-client.js +109 -0
- package/extensions/dm-lens/dist/clients/rules-scanner.js +113 -0
- package/extensions/dm-lens/dist/clients/run-duration.js +9 -0
- package/extensions/dm-lens/dist/clients/runtime-agent-end.js +608 -0
- package/extensions/dm-lens/dist/clients/runtime-config.js +39 -0
- package/extensions/dm-lens/dist/clients/runtime-context.js +155 -0
- package/extensions/dm-lens/dist/clients/runtime-coordinator.js +817 -0
- package/extensions/dm-lens/dist/clients/runtime-session.js +1625 -0
- package/extensions/dm-lens/dist/clients/runtime-tool-call.js +868 -0
- package/extensions/dm-lens/dist/clients/runtime-tool-result.js +1317 -0
- package/extensions/dm-lens/dist/clients/runtime-turn.js +2333 -0
- package/extensions/dm-lens/dist/clients/rust-client.js +48 -0
- package/extensions/dm-lens/dist/clients/safe-spawn.js +1267 -0
- package/extensions/dm-lens/dist/clients/sanitize.js +174 -0
- package/extensions/dm-lens/dist/clients/scan-utils.js +7 -0
- package/extensions/dm-lens/dist/clients/scratch-tree-policy.js +57 -0
- package/extensions/dm-lens/dist/clients/search-read-registration.js +59 -0
- package/extensions/dm-lens/dist/clients/secret-findings.js +69 -0
- package/extensions/dm-lens/dist/clients/security-scan-client.js +208 -0
- package/extensions/dm-lens/dist/clients/session-event-guard.js +111 -0
- package/extensions/dm-lens/dist/clients/session-lifecycle.js +173 -0
- package/extensions/dm-lens/dist/clients/session-start-observability.js +47 -0
- package/extensions/dm-lens/dist/clients/session-state-store.js +63 -0
- package/extensions/dm-lens/dist/clients/session-summary.js +8 -0
- package/extensions/dm-lens/dist/clients/sessionstart-logger.js +22 -0
- package/extensions/dm-lens/dist/clients/sg-runner.js +627 -0
- package/extensions/dm-lens/dist/clients/sgconfig.js +280 -0
- package/extensions/dm-lens/dist/clients/shared-checkout-guard.js +177 -0
- package/extensions/dm-lens/dist/clients/single-flight.js +52 -0
- package/extensions/dm-lens/dist/clients/situational-tool-telemetry.js +85 -0
- package/extensions/dm-lens/dist/clients/skills-resolver.js +38 -0
- package/extensions/dm-lens/dist/clients/slow-fs.js +77 -0
- package/extensions/dm-lens/dist/clients/smells-rollup.js +118 -0
- package/extensions/dm-lens/dist/clients/source-filter.js +320 -0
- package/extensions/dm-lens/dist/clients/source-walker.js +96 -0
- package/extensions/dm-lens/dist/clients/spawn-output-cap.js +35 -0
- package/extensions/dm-lens/dist/clients/spawn-timeout-cooldown.js +51 -0
- package/extensions/dm-lens/dist/clients/stale-marker.js +1 -0
- package/extensions/dm-lens/dist/clients/startup-scan.js +222 -0
- package/extensions/dm-lens/dist/clients/startup-timing.js +67 -0
- package/extensions/dm-lens/dist/clients/string-utils.js +6 -0
- package/extensions/dm-lens/dist/clients/subagent-mode.js +40 -0
- package/extensions/dm-lens/dist/clients/symbol-containment.js +16 -0
- package/extensions/dm-lens/dist/clients/symbol-types.js +1 -0
- package/extensions/dm-lens/dist/clients/test-runner-client.js +1504 -0
- package/extensions/dm-lens/dist/clients/test-runner-delivery.js +260 -0
- package/extensions/dm-lens/dist/clients/todo-scanner.js +164 -0
- package/extensions/dm-lens/dist/clients/tool-agreement.js +377 -0
- package/extensions/dm-lens/dist/clients/tool-config.js +218 -0
- package/extensions/dm-lens/dist/clients/tool-cwd.js +235 -0
- package/extensions/dm-lens/dist/clients/tool-definition.js +22 -0
- package/extensions/dm-lens/dist/clients/tool-event.js +18 -0
- package/extensions/dm-lens/dist/clients/tool-policy.js +2393 -0
- package/extensions/dm-lens/dist/clients/tool-probe.js +5 -0
- package/extensions/dm-lens/dist/clients/tool-render.js +79 -0
- package/extensions/dm-lens/dist/clients/tool-set-policy.js +70 -0
- package/extensions/dm-lens/dist/clients/tree-sitter-cache.js +206 -0
- package/extensions/dm-lens/dist/clients/tree-sitter-client.js +2787 -0
- package/extensions/dm-lens/dist/clients/tree-sitter-logger.js +77 -0
- package/extensions/dm-lens/dist/clients/tree-sitter-navigator.js +198 -0
- package/extensions/dm-lens/dist/clients/tree-sitter-query-loader.js +318 -0
- package/extensions/dm-lens/dist/clients/tree-sitter-shared.js +87 -0
- package/extensions/dm-lens/dist/clients/tree-sitter-symbol-extractor.js +957 -0
- package/extensions/dm-lens/dist/clients/trivy-client.js +305 -0
- package/extensions/dm-lens/dist/clients/tui-fit.js +26 -0
- package/extensions/dm-lens/dist/clients/turn-context.js +48 -0
- package/extensions/dm-lens/dist/clients/turn-end/lane.js +1 -0
- package/extensions/dm-lens/dist/clients/turn-end/lanes/govulncheck.js +54 -0
- package/extensions/dm-lens/dist/clients/turn-end/lanes/secrets.js +131 -0
- package/extensions/dm-lens/dist/clients/turn-summary-render.js +56 -0
- package/extensions/dm-lens/dist/clients/turn-summary.js +84 -0
- package/extensions/dm-lens/dist/clients/typos-config.js +9 -0
- package/extensions/dm-lens/dist/clients/user-notify.js +15 -0
- package/extensions/dm-lens/dist/clients/vanished-instance-marker.js +18 -0
- package/extensions/dm-lens/dist/clients/warm-attach.js +210 -0
- package/extensions/dm-lens/dist/clients/widget-state.js +963 -0
- package/extensions/dm-lens/dist/clients/word-index-logger.js +21 -0
- package/extensions/dm-lens/dist/clients/word-index-store.js +222 -0
- package/extensions/dm-lens/dist/clients/word-index.js +1426 -0
- package/extensions/dm-lens/dist/clients/workspace-topology.js +261 -0
- package/extensions/dm-lens/dist/clients/write-ordering-guard.js +24 -0
- package/extensions/dm-lens/dist/clients/zizmor-config.js +160 -0
- package/extensions/dm-lens/dist/i18n.js +67 -0
- package/extensions/dm-lens/dist/index.js +1782 -0
- package/extensions/dm-lens/dist/mcp/analyze-cli.js +178 -0
- package/extensions/dm-lens/dist/mcp/build-staleness.js +55 -0
- package/extensions/dm-lens/dist/mcp/cli.js +78 -0
- package/extensions/dm-lens/dist/mcp/server.js +1208 -0
- package/extensions/dm-lens/dist/mcp/worker.js +33 -0
- package/extensions/dm-lens/dist/scripts/lib/process-scan.mjs +256 -0
- package/extensions/dm-lens/dist/scripts/lib/skills-predicate.mjs +53 -0
- package/extensions/dm-lens/dist/scripts/lib/web-tree-sitter-dir.mjs +45 -0
- package/extensions/dm-lens/dist/tools/activate-tools.js +61 -0
- package/extensions/dm-lens/dist/tools/ast-grep-outline.js +127 -0
- package/extensions/dm-lens/dist/tools/ast-grep-replace.js +226 -0
- package/extensions/dm-lens/dist/tools/ast-grep-search.js +687 -0
- package/extensions/dm-lens/dist/tools/effective-config.js +59 -0
- package/extensions/dm-lens/dist/tools/lens-diagnostic-mark.js +240 -0
- package/extensions/dm-lens/dist/tools/lens-diagnostics.js +1484 -0
- package/extensions/dm-lens/dist/tools/lsp-diagnostics.js +1088 -0
- package/extensions/dm-lens/dist/tools/lsp-navigation.js +1194 -0
- package/extensions/dm-lens/dist/tools/lsp-structured-output.js +277 -0
- package/extensions/dm-lens/dist/tools/module-report.js +332 -0
- package/extensions/dm-lens/dist/tools/project-report.js +72 -0
- package/extensions/dm-lens/dist/tools/render-compact.js +272 -0
- package/extensions/dm-lens/dist/tools/scan-progress.js +31 -0
- package/extensions/dm-lens/dist/tools/shared.js +26 -0
- package/extensions/dm-lens/dist/tools/symbol-search.js +133 -0
- package/extensions/dm-lens/index.js +278 -101
- package/extensions/dm-lens/mcp/analyze-cli.js +3 -2
- package/extensions/dm-lens/mcp/build-staleness.js +1 -1
- package/extensions/dm-lens/mcp/server.js +144 -73
- package/extensions/dm-lens/package.json +4 -4
- package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-assert-tuple-test.yml +13 -0
- package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-boolean-in-except-test.yml +26 -0
- package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-http-headers-bracket-access-test.yml +10 -0
- package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/unchecked-numeric-parse-python-test.yml +18 -0
- package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/unchecked-throwing-call-python-test.yml +4 -3
- package/extensions/dm-lens/rules/ast-grep-rules/rules/go-no-fmt-println.yml +2 -2
- package/extensions/dm-lens/rules/ast-grep-rules/rules/no-assert-tuple.yml +23 -13
- package/extensions/dm-lens/rules/ast-grep-rules/rules/no-boolean-in-except.yml +7 -3
- package/extensions/dm-lens/rules/ast-grep-rules/rules/no-console-except-error-js.yml +2 -2
- package/extensions/dm-lens/rules/ast-grep-rules/rules/no-console-except-error.yml +2 -2
- package/extensions/dm-lens/rules/ast-grep-rules/rules/no-http-headers-bracket-access.yml +12 -7
- package/extensions/dm-lens/rules/ast-grep-rules/rules/unchecked-numeric-parse-python.yml +44 -0
- package/extensions/dm-lens/rules/ast-grep-rules/rules/unchecked-throwing-call-python.yml +5 -3
- package/extensions/dm-lens/rules/tree-sitter-queries/python/python-cross-language-method.yml +3 -3
- package/extensions/dm-lens/rules/tree-sitter-queries/python/python-hallucinated-import.yml +2 -2
- package/extensions/dm-lens/rules/tree-sitter-queries/python/python-sql-injection.yml +12 -2
- package/extensions/dm-lens/rules/tree-sitter-queries/typescript/console-statement.yml +2 -2
- package/extensions/dm-lens/rules/tree-sitter-queries/typescript/sql-injection.yml +23 -7
- package/extensions/dm-lens/rules/typos/_typos.toml +4 -2
- package/extensions/dm-lens/scripts/lib/process-scan.mjs +1 -1
- package/extensions/dm-lens/scripts/lib/skills-predicate.mjs +53 -0
- package/extensions/dm-lens/scripts/lib/web-tree-sitter-dir.mjs +45 -0
- package/extensions/dm-lens/skills/pi-lens-ast-grep/SKILL.md +23 -6
- package/extensions/dm-lens/skills/pi-lens-lsp-navigation/SKILL.md +26 -9
- package/extensions/dm-lens/tools/activate-tools.js +10 -7
- package/extensions/dm-lens/tools/ast-grep-outline.js +2 -6
- package/extensions/dm-lens/tools/ast-grep-replace.js +5 -16
- package/extensions/dm-lens/tools/ast-grep-search.js +83 -38
- package/extensions/dm-lens/tools/effective-config.js +5 -4
- package/extensions/dm-lens/tools/lens-diagnostic-mark.js +5 -3
- package/extensions/dm-lens/tools/lens-diagnostics.js +478 -106
- package/extensions/dm-lens/tools/lsp-diagnostics.js +317 -172
- package/extensions/dm-lens/tools/lsp-navigation.js +26 -56
- package/extensions/dm-lens/tools/lsp-structured-output.js +3 -3
- package/extensions/dm-lens/tools/module-report.js +5 -5
- package/extensions/dm-lens/tools/project-report.js +9 -15
- package/extensions/dm-lens/tools/render-compact.js +220 -1
- package/extensions/dm-lens/tools/symbol-search.js +3 -5
- package/extensions/dm-mcp-adapter/OAUTH.md +368 -2
- package/extensions/dm-mcp-adapter/THIRD_PARTY_NOTICES.md +1 -1
- package/extensions/dm-mcp-adapter/agent-plugin-loader.js +73 -30
- package/extensions/dm-mcp-adapter/agent-plugin-provenance.js +26 -0
- package/extensions/dm-mcp-adapter/bearer-command-resolver.js +182 -0
- package/extensions/dm-mcp-adapter/claude-plugin-loader.js +350 -0
- package/extensions/dm-mcp-adapter/cli.js +82 -5
- package/extensions/dm-mcp-adapter/commands.js +89 -15
- package/extensions/dm-mcp-adapter/config.js +283 -33
- package/extensions/dm-mcp-adapter/consent-manager.js +32 -8
- package/extensions/dm-mcp-adapter/direct-tool-surface.js +223 -0
- package/extensions/dm-mcp-adapter/direct-tools.js +21 -216
- package/extensions/dm-mcp-adapter/dist/abort.js +35 -0
- package/extensions/dm-mcp-adapter/dist/agent-plugin-loader.js +73 -30
- package/extensions/dm-mcp-adapter/dist/agent-plugin-provenance.js +26 -0
- package/extensions/dm-mcp-adapter/dist/bearer-command-resolver.js +182 -0
- package/extensions/dm-mcp-adapter/dist/claude-plugin-loader.js +350 -0
- package/extensions/dm-mcp-adapter/dist/config.js +283 -33
- package/extensions/dm-mcp-adapter/dist/consent-manager.js +84 -0
- package/extensions/dm-mcp-adapter/dist/elicitation-handler.js +308 -0
- package/extensions/dm-mcp-adapter/dist/errors.js +225 -0
- package/extensions/dm-mcp-adapter/dist/http-ca.js +71 -0
- package/extensions/dm-mcp-adapter/dist/jev-client.js +359 -0
- package/extensions/dm-mcp-adapter/dist/jev-contracts.js +1 -0
- package/extensions/dm-mcp-adapter/dist/jev-key-store.js +176 -0
- package/extensions/dm-mcp-adapter/dist/json-schema-validator.js +70 -0
- package/extensions/dm-mcp-adapter/dist/lifecycle.js +387 -0
- package/extensions/dm-mcp-adapter/dist/logger.js +115 -0
- package/extensions/dm-mcp-adapter/dist/mcp-auth-fetch.js +86 -0
- package/extensions/dm-mcp-adapter/dist/mcp-auth-flow.js +949 -0
- package/extensions/dm-mcp-adapter/dist/mcp-auth.js +997 -0
- package/extensions/dm-mcp-adapter/dist/mcp-bearer-store.js +7 -136
- package/extensions/dm-mcp-adapter/dist/mcp-callback-server.js +381 -0
- package/extensions/dm-mcp-adapter/dist/mcp-oauth-provider.js +524 -0
- package/extensions/dm-mcp-adapter/dist/mcp-probe.js +151 -0
- package/extensions/dm-mcp-adapter/dist/mcp-tasks.js +300 -0
- package/extensions/dm-mcp-adapter/dist/mcp-trace.js +215 -0
- package/extensions/dm-mcp-adapter/dist/metadata-cache.js +10 -28
- package/extensions/dm-mcp-adapter/dist/npx-resolver.js +465 -0
- package/extensions/dm-mcp-adapter/dist/package-mcp-loader.js +5 -16
- package/extensions/dm-mcp-adapter/dist/request-headers-command.js +294 -0
- package/extensions/dm-mcp-adapter/dist/runtime-owner.js +94 -0
- package/extensions/dm-mcp-adapter/dist/sampling-handler.js +213 -0
- package/extensions/dm-mcp-adapter/dist/secure-keyring.js +191 -0
- package/extensions/dm-mcp-adapter/dist/server-manager.js +1514 -0
- package/extensions/dm-mcp-adapter/dist/session-approvals.js +127 -0
- package/extensions/dm-mcp-adapter/dist/session-recovery.js +82 -0
- package/extensions/dm-mcp-adapter/dist/state.js +1 -0
- package/extensions/dm-mcp-adapter/dist/types.js +39 -0
- package/extensions/dm-mcp-adapter/dist/ui-resource-handler.js +204 -0
- package/extensions/dm-mcp-adapter/dist/unix-socket-transport.js +83 -0
- package/extensions/dm-mcp-adapter/dist/utils.js +84 -9
- package/extensions/dm-mcp-adapter/elicitation-handler.js +27 -22
- package/extensions/dm-mcp-adapter/host-html-template.js +17 -18
- package/extensions/dm-mcp-adapter/http-ca.js +71 -0
- package/extensions/dm-mcp-adapter/index.js +904 -167
- package/extensions/dm-mcp-adapter/init.js +53 -42
- package/extensions/dm-mcp-adapter/jev-client.js +359 -0
- package/extensions/dm-mcp-adapter/jev-contracts.js +0 -0
- package/extensions/dm-mcp-adapter/jev-key-store.js +176 -0
- package/extensions/dm-mcp-adapter/json-schema-validator.js +19 -2
- package/extensions/dm-mcp-adapter/lazy-loader.js +7 -0
- package/extensions/dm-mcp-adapter/lifecycle.js +8 -3
- package/extensions/dm-mcp-adapter/mcp-auth-fetch.js +86 -0
- package/extensions/dm-mcp-adapter/mcp-auth-flow.js +228 -75
- package/extensions/dm-mcp-adapter/mcp-auth.js +312 -47
- package/extensions/dm-mcp-adapter/mcp-bearer-store.js +7 -136
- package/extensions/dm-mcp-adapter/mcp-code.js +151 -20
- package/extensions/dm-mcp-adapter/mcp-install.js +40 -0
- package/extensions/dm-mcp-adapter/mcp-oauth-provider.js +52 -8
- package/extensions/dm-mcp-adapter/mcp-output-guard.js +42 -43
- package/extensions/dm-mcp-adapter/mcp-panel-theme.js +79 -0
- package/extensions/dm-mcp-adapter/mcp-panel.js +294 -286
- package/extensions/dm-mcp-adapter/mcp-references.js +13 -18
- package/extensions/dm-mcp-adapter/mcp-script-worker.mjs +5 -1
- package/extensions/dm-mcp-adapter/mcp-setup-panel.js +317 -282
- package/extensions/dm-mcp-adapter/mcp-status.js +2 -0
- package/extensions/dm-mcp-adapter/mcp-tasks.js +309 -0
- package/extensions/dm-mcp-adapter/metadata-cache.js +11 -28
- package/extensions/dm-mcp-adapter/namespace-tools.js +43 -7
- package/extensions/dm-mcp-adapter/oauth.js +1 -1
- package/extensions/dm-mcp-adapter/package-mcp-loader.js +5 -16
- package/extensions/dm-mcp-adapter/package.json +4 -1
- package/extensions/dm-mcp-adapter/prompts.js +31 -4
- package/extensions/dm-mcp-adapter/proxy-modes.js +394 -199
- package/extensions/dm-mcp-adapter/request-headers-command.js +3 -2
- package/extensions/dm-mcp-adapter/runtime-owner.js +16 -1
- package/extensions/dm-mcp-adapter/sampling-handler.js +16 -25
- package/extensions/dm-mcp-adapter/sandbox-proxy-template.js +14 -90
- package/extensions/dm-mcp-adapter/search-ranking.js +31 -6
- package/extensions/dm-mcp-adapter/secure-keyring.js +191 -0
- package/extensions/dm-mcp-adapter/semantic-search.js +160 -0
- package/extensions/dm-mcp-adapter/server-manager.js +406 -117
- package/extensions/dm-mcp-adapter/session-approvals.js +127 -0
- package/extensions/dm-mcp-adapter/skills/mcp-scripting/SKILL.md +11 -1
- package/extensions/dm-mcp-adapter/test-runner.mjs +3 -4
- package/extensions/dm-mcp-adapter/tool-approval.js +32 -22
- package/extensions/dm-mcp-adapter/tool-metadata.js +18 -11
- package/extensions/dm-mcp-adapter/tool-registrar.js +7 -4
- package/extensions/dm-mcp-adapter/tool-result-renderer.js +4 -2
- package/extensions/dm-mcp-adapter/types.js +39 -0
- package/extensions/dm-mcp-adapter/ui-server.js +51 -36
- package/extensions/dm-mcp-adapter/ui-session.js +57 -25
- package/extensions/dm-mcp-adapter/utils.js +84 -9
- package/extensions/dm-ponytail/hooks/cursor-hooks.json +17 -0
- package/extensions/dm-ponytail/hooks/ponytail-activate.js +14 -2
- package/extensions/dm-ponytail/hooks/ponytail-mode-tracker.js +21 -2
- package/extensions/dm-ponytail/hooks/ponytail-runtime.js +23 -0
- package/extensions/dm-ponytail/package.json +1 -1
- package/extensions/dm-subagents/agents/claude-code-writer.md +1 -0
- package/extensions/dm-subagents/agents/codex-exec-writer.md +1 -0
- package/extensions/dm-subagents/agents/cursor-agent-writer.md +1 -0
- package/extensions/dm-subagents/agents/evidence-auditor.md +34 -0
- package/extensions/dm-subagents/agents/researcher.md +23 -13
- package/extensions/dm-subagents/agents/reviewer.md +6 -4
- package/extensions/dm-subagents/agents/scout.md +1 -1
- package/extensions/dm-subagents/agents/worker.md +3 -2
- package/extensions/dm-subagents/index.js +3 -2
- package/extensions/dm-subagents/inspector-runner.mjs +2 -2
- package/extensions/dm-subagents/install.mjs +1 -2
- package/extensions/dm-subagents/package.json +35 -1
- package/extensions/dm-subagents/prompts/council.md +6 -3
- package/extensions/dm-subagents/prompts/parallel-review.md +1 -1
- package/extensions/dm-subagents/runner-peer-loader.mjs +18 -0
- package/extensions/dm-subagents/runner-peer-preload.mjs +29 -0
- package/extensions/dm-subagents/skills/dm-subagents/SKILL.md +35 -22
- package/extensions/dm-subagents/skills/dm-subagents/references/constraints-and-recipes.md +9 -5
- package/extensions/dm-subagents/skills/dm-subagents/references/execution-controls.md +40 -19
- package/extensions/dm-subagents/skills/dm-subagents/references/management-authoring-rpc.md +6 -6
- package/extensions/dm-subagents/skills/dm-subagents/references/multi-lane-orchestration.md +11 -1
- package/extensions/dm-subagents/skills/dm-subagents/references/prompting-and-roles.md +35 -30
- package/extensions/dm-subagents/skills/dm-subagents/references/review-and-validation.md +3 -3
- package/extensions/dm-subagents/src/agents/advertised-agent-prompt.js +70 -0
- package/extensions/dm-subagents/src/agents/agent-management.js +276 -172
- package/extensions/dm-subagents/src/agents/agent-memory.js +92 -3
- package/extensions/dm-subagents/src/agents/agent-serializer.js +17 -8
- package/extensions/dm-subagents/src/agents/agents.js +389 -207
- package/extensions/dm-subagents/src/agents/builtin-names.js +1 -0
- package/extensions/dm-subagents/src/agents/chain-serializer.js +7 -0
- package/extensions/dm-subagents/src/agents/global-npm-root.js +47 -0
- package/extensions/dm-subagents/src/agents/proactive-skills.js +1 -1
- package/extensions/dm-subagents/src/agents/runtime-agent-registry.js +17 -13
- package/extensions/dm-subagents/src/agents/skills.js +36 -10
- package/extensions/dm-subagents/src/api/capability-ceiling.js +0 -1
- package/extensions/dm-subagents/src/api/child-tool-plan.js +3 -0
- package/extensions/dm-subagents/src/api/preflight.js +75 -64
- package/extensions/dm-subagents/src/api/required-child-extensions.js +3 -0
- package/extensions/dm-subagents/src/api/workflow-resources.js +1 -0
- package/extensions/dm-subagents/src/extension/config.js +27 -18
- package/extensions/dm-subagents/src/extension/doctor.js +10 -13
- package/extensions/dm-subagents/src/extension/fanout-child.js +91 -14
- package/extensions/dm-subagents/src/extension/herdr-dm-bridge.js +258 -0
- package/extensions/dm-subagents/src/extension/index.js +202 -66
- package/extensions/dm-subagents/src/extension/public-execution.js +55 -4
- package/extensions/dm-subagents/src/extension/rpc.js +18 -27
- package/extensions/dm-subagents/src/extension/schemas.js +99 -84
- package/extensions/dm-subagents/src/extension/subagent-guide.js +14 -3
- package/extensions/dm-subagents/src/extension/tool-activation.js +157 -0
- package/extensions/dm-subagents/src/extension/tool-description.js +30 -78
- package/extensions/dm-subagents/src/inspectors/actions.js +145 -0
- package/extensions/dm-subagents/src/inspectors/ghostty/actions.js +60 -0
- package/extensions/dm-subagents/src/inspectors/ghostty/plugin.js +17 -0
- package/extensions/dm-subagents/src/inspectors/herdr/actions.js +94 -179
- package/extensions/dm-subagents/src/inspectors/herdr/plugin.js +13 -0
- package/extensions/dm-subagents/src/inspectors/herdr/project-panes.js +1 -1
- package/extensions/dm-subagents/src/inspectors/{herdr/inspector-runner.js → inspector-runner.js} +31 -25
- package/extensions/dm-subagents/src/inspectors/plugins.js +5 -0
- package/extensions/dm-subagents/src/inspectors/{herdr/session-roots-codec.js → session-roots-codec.js} +1 -6
- package/extensions/dm-subagents/src/inspectors/types.js +1 -0
- package/extensions/dm-subagents/src/integrations/dm-web-session-liveness.js +50 -0
- package/extensions/dm-subagents/src/intercom/intercom-bridge.js +39 -5
- package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +256 -151
- package/extensions/dm-subagents/src/intercom/result-intercom.js +6 -0
- package/extensions/dm-subagents/src/intercom/supervisor-ui.js +199 -0
- package/extensions/dm-subagents/src/missions/workflow-state.js +30 -17
- package/extensions/dm-subagents/src/policy/authority.js +6 -2
- package/extensions/dm-subagents/src/profiles/profiles.js +10 -5
- package/extensions/dm-subagents/src/runs/background/active-async-capacity.js +28 -35
- package/extensions/dm-subagents/src/runs/background/active-run-index.js +17 -0
- package/extensions/dm-subagents/src/runs/background/async-execution.js +580 -389
- package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +71 -47
- package/extensions/dm-subagents/src/runs/background/async-resume.js +61 -26
- package/extensions/dm-subagents/src/runs/background/async-retention.js +8 -0
- package/extensions/dm-subagents/src/runs/background/async-status-snapshot.js +3 -4
- package/extensions/dm-subagents/src/runs/background/async-status.js +90 -13
- package/extensions/dm-subagents/src/runs/background/auto-drain.js +57 -33
- package/extensions/dm-subagents/src/runs/background/binary-bootstrap.js +54 -0
- package/extensions/dm-subagents/src/runs/background/chain-append.js +1 -1
- package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +11 -27
- package/extensions/dm-subagents/src/runs/background/control-channel.js +105 -256
- package/extensions/dm-subagents/src/runs/background/fleet-view.js +67 -10
- package/extensions/dm-subagents/src/runs/background/notify.js +252 -17
- package/extensions/dm-subagents/src/runs/background/owned-process-tree.js +33 -2
- package/extensions/dm-subagents/src/runs/background/process-terminal-candidate.js +88 -0
- package/extensions/dm-subagents/src/runs/background/process-terminal.js +29 -87
- package/extensions/dm-subagents/src/runs/background/result-files.js +8 -4
- package/extensions/dm-subagents/src/runs/background/result-watcher.js +15 -3
- package/extensions/dm-subagents/src/runs/background/retained-children.js +3 -2
- package/extensions/dm-subagents/src/runs/background/retained-nested-route-tracker.js +86 -0
- package/extensions/dm-subagents/src/runs/background/run-child-session.js +574 -0
- package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +9 -5
- package/extensions/dm-subagents/src/runs/background/run-status.js +114 -11
- package/extensions/dm-subagents/src/runs/background/runner-aliases.js +129 -0
- package/extensions/dm-subagents/src/runs/background/runner-child-launch.js +62 -0
- package/extensions/dm-subagents/src/runs/background/runner-child-sessions.js +16 -0
- package/extensions/dm-subagents/src/runs/background/runner-http-dispatcher.js +84 -0
- package/extensions/dm-subagents/src/runs/background/runner-startup-failure.js +43 -0
- package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +119 -20
- package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +33 -10
- package/extensions/dm-subagents/src/runs/background/steering.js +24 -3
- package/extensions/dm-subagents/src/runs/background/subagent-runner-bootstrap.js +238 -0
- package/extensions/dm-subagents/src/runs/background/subagent-runner.js +1008 -1344
- package/extensions/dm-subagents/src/runs/background/subagent-wait.js +156 -26
- package/extensions/dm-subagents/src/runs/background/wait-completions.js +91 -23
- package/extensions/dm-subagents/src/runs/background/wait-subscriptions.js +10 -3
- package/extensions/dm-subagents/src/runs/background/wait-tool.js +8 -12
- package/extensions/dm-subagents/src/runs/background/workflow-terminal-proof.js +60 -0
- package/extensions/dm-subagents/src/runs/foreground/async-steering-action.js +29 -26
- package/extensions/dm-subagents/src/runs/foreground/async-stop-action.js +94 -2
- package/extensions/dm-subagents/src/runs/foreground/execution.js +446 -648
- package/extensions/dm-subagents/src/runs/foreground/foreground-control.js +4 -0
- package/extensions/dm-subagents/src/runs/foreground/foreground-history.js +5 -2
- package/extensions/dm-subagents/src/runs/foreground/prompt-audit.js +8 -4
- package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +1337 -445
- package/extensions/dm-subagents/src/runs/foreground/workflow-detach-reconcile.js +10 -5
- package/extensions/dm-subagents/src/runs/foreground/workflow-foreground-steering.js +65 -90
- package/extensions/dm-subagents/src/runs/shared/acceptance.js +265 -68
- package/extensions/dm-subagents/src/runs/shared/agent-contract.js +1 -1
- package/extensions/dm-subagents/src/runs/shared/async-status-projection.js +133 -76
- package/extensions/dm-subagents/src/runs/shared/capability-ceiling.js +4 -2
- package/extensions/dm-subagents/src/runs/shared/child-hooks.js +166 -0
- package/extensions/dm-subagents/src/runs/shared/child-identity.js +10 -2
- package/extensions/dm-subagents/src/runs/shared/child-launch-plan.js +19 -2
- package/extensions/dm-subagents/src/runs/shared/child-launch.js +212 -0
- package/extensions/dm-subagents/src/runs/shared/child-lifecycle.js +22 -0
- package/extensions/dm-subagents/src/runs/shared/child-runtime-config.js +31 -0
- package/extensions/dm-subagents/src/runs/shared/child-session.js +378 -0
- package/extensions/dm-subagents/src/runs/shared/child-tool-plan.js +299 -0
- package/extensions/dm-subagents/src/runs/shared/claude-code-adapter.js +1 -1
- package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +148 -32
- package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +6 -4
- package/extensions/dm-subagents/src/runs/shared/effective-system-prompt.js +19 -0
- package/extensions/dm-subagents/src/runs/shared/external-cli-contract.js +6 -1
- package/extensions/dm-subagents/src/runs/shared/external-cli-preflight.js +14 -2
- package/extensions/dm-subagents/src/runs/shared/external-cli-runner.js +6 -7
- package/extensions/dm-subagents/src/runs/shared/external-job-bridge.js +60 -0
- package/extensions/dm-subagents/src/runs/shared/git-environment.js +25 -0
- package/extensions/dm-subagents/src/runs/shared/herdr-connection.js +341 -0
- package/extensions/dm-subagents/src/runs/shared/herdr-dm-protocol.js +60 -0
- package/extensions/dm-subagents/src/runs/shared/herdr-external-adapters.js +555 -0
- package/extensions/dm-subagents/src/runs/shared/herdr-machine.js +239 -0
- package/extensions/dm-subagents/src/runs/shared/herdr-placed-run.js +987 -0
- package/extensions/dm-subagents/src/runs/shared/host-step-status.js +2 -0
- package/extensions/dm-subagents/src/runs/shared/lane-metadata.js +23 -3
- package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +4 -3
- package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-grant.js +15 -5
- package/extensions/dm-subagents/src/runs/shared/model-resolution-diagnostic.js +43 -0
- package/extensions/dm-subagents/src/runs/shared/{model-fallback.js → model-resolution.js} +44 -128
- package/extensions/dm-subagents/src/runs/shared/nested-events.js +39 -49
- package/extensions/dm-subagents/src/runs/shared/nested-path.js +0 -13
- package/extensions/dm-subagents/src/runs/shared/orca-progress-tabs.js +22 -12
- package/extensions/dm-subagents/src/runs/shared/parallel-handoff.js +78 -2
- package/extensions/dm-subagents/src/runs/shared/permissions.js +1 -16
- package/extensions/dm-subagents/src/runs/shared/process-signal.js +3 -0
- package/extensions/dm-subagents/src/runs/shared/readonly-drain-observation.js +51 -0
- package/extensions/dm-subagents/src/runs/shared/run-fanout-budget.js +0 -13
- package/extensions/dm-subagents/src/runs/shared/runtime-acknowledged-extensions.js +0 -26
- package/extensions/dm-subagents/src/runs/shared/single-output.js +20 -2
- package/extensions/dm-subagents/src/runs/shared/structured-output.js +263 -10
- package/extensions/dm-subagents/src/runs/shared/subagent-control.js +6 -14
- package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +117 -370
- package/extensions/dm-subagents/src/runs/shared/tool-availability.js +12 -50
- package/extensions/dm-subagents/src/runs/shared/tool-budget.js +10 -13
- package/extensions/dm-subagents/src/runs/shared/tool-timeout.js +1 -1
- package/extensions/dm-subagents/src/runs/shared/usage-reconciliation.js +69 -0
- package/extensions/dm-subagents/src/runs/shared/workflow-async-child-guidance.js +11 -0
- package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-plan.js +30 -10
- package/extensions/dm-subagents/src/runs/shared/worktree-setup-command.js +195 -0
- package/extensions/dm-subagents/src/runs/shared/worktree.js +814 -141
- package/extensions/dm-subagents/src/shared/atomic-json.js +2 -1
- package/extensions/dm-subagents/src/shared/child-cache-retention.js +19 -0
- package/extensions/dm-subagents/src/shared/fork-context.js +40 -77
- package/extensions/dm-subagents/src/shared/fork-session-cwd.js +24 -0
- package/extensions/dm-subagents/src/shared/jsonl-writer.js +8 -0
- package/extensions/dm-subagents/src/shared/launch-contract.js +37 -6
- package/extensions/dm-subagents/src/shared/model-response-aliases.js +15 -0
- package/extensions/dm-subagents/src/shared/opencode-session-headers.js +15 -0
- package/extensions/dm-subagents/src/shared/pruned-fork.js +83 -76
- package/extensions/dm-subagents/src/shared/required-child-extensions.js +72 -0
- package/extensions/dm-subagents/src/shared/shortcuts.js +0 -2
- package/extensions/dm-subagents/src/shared/thinking-ceiling.js +0 -6
- package/extensions/dm-subagents/src/shared/types.js +16 -12
- package/extensions/dm-subagents/src/shared/utils.js +22 -7
- package/extensions/dm-subagents/src/shared/watch-strategy.js +2 -0
- package/extensions/dm-subagents/src/shared/workflow-child-permit.js +70 -0
- package/extensions/dm-subagents/src/slash/delegation-adapters.js +15 -1
- package/extensions/dm-subagents/src/slash/delegation-request.js +13 -0
- package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +28 -1
- package/extensions/dm-subagents/src/slash/prompt-workflows.js +15 -2
- package/extensions/dm-subagents/src/slash/slash-commands.js +12 -269
- package/extensions/dm-subagents/src/slash/subagent-cost.js +255 -0
- package/extensions/dm-subagents/src/slash/subagents-admin.js +49 -25
- package/extensions/dm-subagents/src/tui/fleet-status.js +224 -23
- package/extensions/dm-subagents/src/tui/fleet.js +38 -25
- package/extensions/dm-subagents/src/tui/render.js +636 -63
- package/extensions/dm-subagents/src/watchdog/child-status.js +42 -23
- package/extensions/dm-subagents/src/watchdog/diff-tool.js +86 -0
- package/extensions/dm-subagents/src/watchdog/emission-guard.js +4 -3
- package/extensions/dm-subagents/src/watchdog/guidance.js +19 -0
- package/extensions/dm-subagents/src/watchdog/lsp-diagnostics.js +1 -1
- package/extensions/dm-subagents/src/watchdog/model-selection.js +18 -1
- package/extensions/dm-subagents/src/watchdog/permission-arbiter.js +16 -10
- package/extensions/dm-subagents/src/watchdog/register-child.js +39 -26
- package/extensions/dm-subagents/src/watchdog/register-main.js +51 -43
- package/extensions/dm-subagents/src/watchdog/render.js +5 -7
- package/extensions/dm-subagents/src/watchdog/review.js +142 -67
- package/extensions/dm-subagents/src/watchdog/rules.js +55 -0
- package/extensions/dm-subagents/src/watchdog/runtime.js +167 -109
- package/extensions/dm-subagents/src/watchdog/scope.js +1 -9
- package/extensions/dm-subagents/src/watchdog/settings.js +55 -99
- package/extensions/dm-subagents/src/watchdog/tool-actions.js +11 -12
- package/extensions/dm-subagents/src/watchdog/turn-delta.js +30 -5
- package/extensions/dm-subagents/src/watchdog/types.js +2 -4
- package/extensions/dm-subagents/src/watchdog/warning-format.js +2 -3
- package/extensions/dm-subagents/src/workflows/chat-progress.js +4 -4
- package/extensions/dm-subagents/src/workflows/scripted-workflow.js +482 -36
- package/extensions/dm-subagents/src/workflows/workflow-checklist.js +303 -0
- package/extensions/dm-subagents/src/workflows/workflow-child-summary.js +57 -5
- package/extensions/dm-subagents/src/workflows/workflow-preflight.js +27 -1
- package/extensions/dm-subagents/src/workflows/workflow-receipt.js +51 -3
- package/extensions/dm-subagents/src/workflows/workflow-resources.js +226 -0
- package/extensions/dm-subagents/src/workflows/workflow-settlement.js +5 -0
- package/extensions/dm-web-access/abortable.js +19 -0
- package/extensions/dm-web-access/anysearch.js +4 -13
- package/extensions/dm-web-access/baizhi.js +123 -0
- package/extensions/dm-web-access/bocha.js +3 -24
- package/extensions/dm-web-access/brave.js +3 -23
- package/extensions/dm-web-access/brightdata.js +5 -30
- package/extensions/dm-web-access/content-find.js +181 -47
- package/extensions/dm-web-access/crawl4ai.js +166 -0
- package/extensions/dm-web-access/credential-source.js +1 -0
- package/extensions/dm-web-access/curator-page.js +27 -2
- package/extensions/dm-web-access/curator-run.js +36 -0
- package/extensions/dm-web-access/curator-server.js +11 -2
- package/extensions/dm-web-access/domain-filter-normalization.js +17 -0
- package/extensions/dm-web-access/duckduckgo.js +4 -24
- package/extensions/dm-web-access/extract.js +54 -12
- package/extensions/dm-web-access/fetch-params.js +1 -1
- package/extensions/dm-web-access/firecrawl.js +7 -45
- package/extensions/dm-web-access/gemini-search.js +101 -46
- package/extensions/dm-web-access/github-extract.js +2 -11
- package/extensions/dm-web-access/index.js +382 -247
- package/extensions/dm-web-access/jina-search.js +4 -13
- package/extensions/dm-web-access/kagi.js +4 -13
- package/extensions/dm-web-access/kimi-search.js +5 -30
- package/extensions/dm-web-access/mistral-search.js +251 -0
- package/extensions/dm-web-access/ollama.js +2 -7
- package/extensions/dm-web-access/openai-search.js +204 -46
- package/extensions/dm-web-access/opencode-session-headers.js +15 -0
- package/extensions/dm-web-access/package.json +1 -1
- package/extensions/dm-web-access/page-query.js +14 -4
- package/extensions/dm-web-access/parallel.js +1 -17
- package/extensions/dm-web-access/pdf-extract.js +1 -0
- package/extensions/dm-web-access/perplexity.js +10 -1
- package/extensions/dm-web-access/querit.js +5 -34
- package/extensions/dm-web-access/query-rewrite.js +6 -2
- package/extensions/dm-web-access/search-answer-formatting.js +6 -0
- package/extensions/dm-web-access/search-result-count-normalization.js +5 -0
- package/extensions/dm-web-access/search1api.js +5 -34
- package/extensions/dm-web-access/searchinfinity.js +5 -34
- package/extensions/dm-web-access/searxng.js +3 -23
- package/extensions/dm-web-access/serpapi.js +183 -0
- package/extensions/dm-web-access/serpbase.js +3 -24
- package/extensions/dm-web-access/serpdive.js +3 -23
- package/extensions/dm-web-access/serper.js +5 -30
- package/extensions/dm-web-access/serply.js +184 -0
- package/extensions/dm-web-access/source-check.js +10 -46
- package/extensions/dm-web-access/ssrf-protection.js +3 -1
- package/extensions/dm-web-access/storage.js +9 -0
- package/extensions/dm-web-access/summary-review.js +36 -25
- package/extensions/dm-web-access/tavily.js +3 -23
- package/extensions/dm-web-access/tinyfish.js +5 -34
- package/extensions/dm-web-access/tool-activation.js +112 -0
- package/extensions/dm-web-access/utils.js +27 -10
- package/extensions/dm-web-access/valyu.js +5 -30
- package/extensions/dm-web-access/xai-search.js +78 -42
- package/extensions/dm-web-access/xcrawl.js +5 -30
- package/package.json +7 -4
- package/extensions/dm-lens/tools/ast-dump.js +0 -101
- package/extensions/dm-subagents/src/api/dm-args.js +0 -3
- package/extensions/dm-subagents/src/runs/shared/child-protocol.js +0 -447
- package/extensions/dm-subagents/src/runs/shared/completion-evidence.js +0 -40
- package/extensions/dm-subagents/src/runs/shared/completion-guard.js +0 -173
- package/extensions/dm-subagents/src/runs/shared/dm-args.js +0 -581
- package/extensions/dm-subagents/src/runs/shared/llm-intent-arbiter.js +0 -190
- package/extensions/dm-subagents/src/runs/shared/model-exclusions.js +0 -207
- package/extensions/dm-subagents/src/runs/shared/subagent-startup-retry.js +0 -50
- package/extensions/dm-subagents/src/runs/shared/task-intent.js +0 -130
- package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.js +0 -68
- /package/extensions/dm-subagents/src/inspectors/{herdr/shell-command.js → shell-command.js} +0 -0
|
@@ -16,9 +16,14 @@ import {
|
|
|
16
16
|
const _installerRequire = createRequire(import.meta.url);
|
|
17
17
|
import { createGunzip } from "node:zlib";
|
|
18
18
|
import { TRANSIENT_MAX_COOLDOWN_MS } from "../dispatch/runners/utils/availability-policy.js";
|
|
19
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
getDegradationLedgerGeneration,
|
|
21
|
+
recordDegradationOnce
|
|
22
|
+
} from "../degradation-ledger.js";
|
|
20
23
|
import { commitDurableStoreAsync } from "../durable-store.js";
|
|
21
24
|
import { getGlobalDmLensDir } from "../file-utils.js";
|
|
25
|
+
import { createGenerationMap } from "../generation-guard.js";
|
|
26
|
+
import { resolveToolCwd } from "../tool-cwd.js";
|
|
22
27
|
import {
|
|
23
28
|
allAvailableGlobalBinDirs,
|
|
24
29
|
installArgs,
|
|
@@ -29,7 +34,13 @@ import {
|
|
|
29
34
|
resetSafeSpawnWindowsCommandCache,
|
|
30
35
|
safeSpawnAsync
|
|
31
36
|
} from "../safe-spawn.js";
|
|
37
|
+
import {
|
|
38
|
+
createBoundedOutputSink,
|
|
39
|
+
DEFAULT_MAX_OUTPUT_BYTES
|
|
40
|
+
} from "../spawn-output-cap.js";
|
|
41
|
+
import { probeToolAsync } from "../tool-probe.js";
|
|
32
42
|
import { logSessionStart } from "../sessionstart-logger.js";
|
|
43
|
+
import { resolveGitHubToken } from "../zizmor-config.js";
|
|
33
44
|
const TOOLS_DIR = path.join(getGlobalDmLensDir(), "tools");
|
|
34
45
|
const INSTALL_LOCK_PATH = path.join(TOOLS_DIR, ".install.lock");
|
|
35
46
|
const activeInstallLocks = new Set;
|
|
@@ -136,6 +147,131 @@ const OS_ARCH_ZIP_ASSETS = {
|
|
|
136
147
|
darwin: { x64: "darwin_amd64.zip", arm64: "darwin_arm64.zip" },
|
|
137
148
|
win32: { x64: "windows_amd64.zip", arm64: "windows_arm64.zip" }
|
|
138
149
|
};
|
|
150
|
+
function managedPackageFormatterTool(spec) {
|
|
151
|
+
return {
|
|
152
|
+
id: spec.id,
|
|
153
|
+
name: spec.name,
|
|
154
|
+
checkCommand: spec.id,
|
|
155
|
+
checkArgs: ["--version"],
|
|
156
|
+
installStrategy: spec.installStrategy,
|
|
157
|
+
packageName: spec.packageName,
|
|
158
|
+
binaryName: spec.id
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
const MANAGED_PACKAGE_FORMATTERS = [
|
|
162
|
+
{ id: "black", name: "Black", installStrategy: "pip", packageName: "black" },
|
|
163
|
+
{
|
|
164
|
+
id: "cmake-format",
|
|
165
|
+
name: "cmake-format",
|
|
166
|
+
installStrategy: "pip",
|
|
167
|
+
packageName: "cmakelang[yaml]"
|
|
168
|
+
},
|
|
169
|
+
{ id: "oxfmt", name: "oxfmt", installStrategy: "npm", packageName: "oxfmt" }
|
|
170
|
+
];
|
|
171
|
+
function managedGitHubFormatterTool(spec) {
|
|
172
|
+
return {
|
|
173
|
+
id: spec.id,
|
|
174
|
+
name: spec.name,
|
|
175
|
+
checkCommand: spec.id,
|
|
176
|
+
checkArgs: ["--version"],
|
|
177
|
+
installStrategy: "github",
|
|
178
|
+
binaryName: spec.id,
|
|
179
|
+
github: {
|
|
180
|
+
repo: `${spec.owner}/${spec.repo}`,
|
|
181
|
+
assetMatch: spec.assetPattern,
|
|
182
|
+
...spec.binaryInArchive && { binaryInArchive: spec.binaryInArchive },
|
|
183
|
+
...spec.kind === "phar" && { launcher: "php" },
|
|
184
|
+
...spec.kind === "jar" && { launcher: "java" }
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
const MANAGED_GITHUB_FORMATTERS = [
|
|
189
|
+
{
|
|
190
|
+
id: "typstyle",
|
|
191
|
+
name: "typstyle",
|
|
192
|
+
owner: "typstyle-rs",
|
|
193
|
+
repo: "typstyle",
|
|
194
|
+
assetPattern: archAssetMatch({
|
|
195
|
+
linux: {
|
|
196
|
+
x64: "typstyle-x86_64-unknown-linux-gnu",
|
|
197
|
+
arm64: "typstyle-aarch64-unknown-linux-gnu"
|
|
198
|
+
},
|
|
199
|
+
darwin: {
|
|
200
|
+
x64: "typstyle-x86_64-apple-darwin",
|
|
201
|
+
arm64: "typstyle-aarch64-apple-darwin"
|
|
202
|
+
},
|
|
203
|
+
win32: {
|
|
204
|
+
x64: "typstyle-x86_64-pc-windows-msvc.exe",
|
|
205
|
+
arm64: "typstyle-aarch64-pc-windows-msvc.exe"
|
|
206
|
+
}
|
|
207
|
+
}),
|
|
208
|
+
kind: "binary"
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
id: "stylua",
|
|
212
|
+
name: "StyLua",
|
|
213
|
+
owner: "JohnnyMorganz",
|
|
214
|
+
repo: "StyLua",
|
|
215
|
+
assetPattern: archAssetMatch({
|
|
216
|
+
linux: { x64: "linux-x86_64.zip", arm64: "linux-aarch64.zip" },
|
|
217
|
+
darwin: { x64: "macos-x86_64.zip", arm64: "macos-aarch64.zip" },
|
|
218
|
+
win32: { x64: "windows-x86_64.zip" }
|
|
219
|
+
}),
|
|
220
|
+
kind: "binary",
|
|
221
|
+
binaryInArchive: "stylua"
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
id: "php-cs-fixer",
|
|
225
|
+
name: "PHP CS Fixer",
|
|
226
|
+
owner: "PHP-CS-Fixer",
|
|
227
|
+
repo: "PHP-CS-Fixer",
|
|
228
|
+
assetPattern: (platform) => platform === "linux" || platform === "darwin" || platform === "win32" ? "php-cs-fixer.phar" : undefined,
|
|
229
|
+
kind: "phar"
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
id: "cljfmt",
|
|
233
|
+
name: "cljfmt",
|
|
234
|
+
owner: "weavejester",
|
|
235
|
+
repo: "cljfmt",
|
|
236
|
+
assetPattern: (platform, arch) => {
|
|
237
|
+
if (platform === "linux")
|
|
238
|
+
return arch === "arm64" ? "standalone.jar" : "linux-amd64-static.tar.gz";
|
|
239
|
+
if (platform === "darwin")
|
|
240
|
+
return "standalone.jar";
|
|
241
|
+
if (platform === "win32")
|
|
242
|
+
return "win-amd64.zip";
|
|
243
|
+
return;
|
|
244
|
+
},
|
|
245
|
+
kind: "jar",
|
|
246
|
+
binaryInArchive: "cljfmt"
|
|
247
|
+
}
|
|
248
|
+
];
|
|
249
|
+
const MANAGED_MAVEN_FORMATTERS = [
|
|
250
|
+
{
|
|
251
|
+
id: "google-java-format",
|
|
252
|
+
name: "google-java-format",
|
|
253
|
+
groupId: "com.google.googlejavaformat",
|
|
254
|
+
artifactId: "google-java-format",
|
|
255
|
+
version: "1.27.0",
|
|
256
|
+
classifier: "all-deps"
|
|
257
|
+
}
|
|
258
|
+
];
|
|
259
|
+
function managedMavenFormatterTool(spec) {
|
|
260
|
+
return {
|
|
261
|
+
id: spec.id,
|
|
262
|
+
name: spec.name,
|
|
263
|
+
checkCommand: spec.id,
|
|
264
|
+
checkArgs: ["--version"],
|
|
265
|
+
installStrategy: "maven",
|
|
266
|
+
binaryName: spec.id,
|
|
267
|
+
maven: {
|
|
268
|
+
groupId: spec.groupId,
|
|
269
|
+
artifactId: spec.artifactId,
|
|
270
|
+
version: spec.version,
|
|
271
|
+
classifier: spec.classifier
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
}
|
|
139
275
|
export const TOOLS = [
|
|
140
276
|
{
|
|
141
277
|
id: "typescript-language-server",
|
|
@@ -143,7 +279,7 @@ export const TOOLS = [
|
|
|
143
279
|
checkCommand: "typescript-language-server",
|
|
144
280
|
checkArgs: ["--version"],
|
|
145
281
|
installStrategy: "npm",
|
|
146
|
-
packageName: "typescript-language-server",
|
|
282
|
+
packageName: "typescript-language-server@5.3.0",
|
|
147
283
|
binaryName: "typescript-language-server"
|
|
148
284
|
},
|
|
149
285
|
{
|
|
@@ -173,6 +309,7 @@ export const TOOLS = [
|
|
|
173
309
|
packageName: "prettier",
|
|
174
310
|
binaryName: "prettier"
|
|
175
311
|
},
|
|
312
|
+
...MANAGED_PACKAGE_FORMATTERS.map(managedPackageFormatterTool),
|
|
176
313
|
{
|
|
177
314
|
id: "ruff",
|
|
178
315
|
name: "Ruff",
|
|
@@ -227,7 +364,7 @@ export const TOOLS = [
|
|
|
227
364
|
checkCommand: "jscpd",
|
|
228
365
|
checkArgs: ["--version"],
|
|
229
366
|
installStrategy: "npm",
|
|
230
|
-
packageName: "jscpd@5.0
|
|
367
|
+
packageName: "jscpd@5.3.0",
|
|
231
368
|
binaryName: "jscpd"
|
|
232
369
|
},
|
|
233
370
|
{
|
|
@@ -304,7 +441,8 @@ export const TOOLS = [
|
|
|
304
441
|
checkArgs: ["--version"],
|
|
305
442
|
installStrategy: "pip",
|
|
306
443
|
packageName: "cmake-language-server",
|
|
307
|
-
binaryName: "cmake-language-server"
|
|
444
|
+
binaryName: "cmake-language-server",
|
|
445
|
+
pipConstraints: ["pygls<2"]
|
|
308
446
|
},
|
|
309
447
|
{
|
|
310
448
|
id: "yaml-language-server",
|
|
@@ -331,7 +469,7 @@ export const TOOLS = [
|
|
|
331
469
|
checkCommand: "vscode-html-language-server",
|
|
332
470
|
checkArgs: ["--version"],
|
|
333
471
|
installStrategy: "npm",
|
|
334
|
-
packageName: "vscode-
|
|
472
|
+
packageName: "vscode-langservers-extracted",
|
|
335
473
|
binaryName: "vscode-html-language-server"
|
|
336
474
|
},
|
|
337
475
|
{
|
|
@@ -411,7 +549,7 @@ export const TOOLS = [
|
|
|
411
549
|
checkCommand: "vscode-css-language-server",
|
|
412
550
|
checkArgs: ["--version"],
|
|
413
551
|
installStrategy: "npm",
|
|
414
|
-
packageName: "vscode-
|
|
552
|
+
packageName: "vscode-langservers-extracted",
|
|
415
553
|
binaryName: "vscode-css-language-server"
|
|
416
554
|
},
|
|
417
555
|
{
|
|
@@ -428,6 +566,7 @@ export const TOOLS = [
|
|
|
428
566
|
name: "Intelephense",
|
|
429
567
|
checkCommand: "intelephense",
|
|
430
568
|
checkArgs: ["--version"],
|
|
569
|
+
verification: "package-entry",
|
|
431
570
|
installStrategy: "npm",
|
|
432
571
|
packageName: "intelephense",
|
|
433
572
|
binaryName: "intelephense"
|
|
@@ -548,6 +687,8 @@ export const TOOLS = [
|
|
|
548
687
|
}
|
|
549
688
|
}
|
|
550
689
|
},
|
|
690
|
+
...MANAGED_GITHUB_FORMATTERS.map(managedGitHubFormatterTool),
|
|
691
|
+
...MANAGED_MAVEN_FORMATTERS.map(managedMavenFormatterTool),
|
|
551
692
|
{
|
|
552
693
|
id: "rust-analyzer",
|
|
553
694
|
name: "rust-analyzer",
|
|
@@ -718,7 +859,7 @@ export const TOOLS = [
|
|
|
718
859
|
return arch === "arm64" ? undefined : `${base}/lua-language-server-${version}-win32-x64.zip`;
|
|
719
860
|
return;
|
|
720
861
|
},
|
|
721
|
-
kind: "zip",
|
|
862
|
+
kind: (platform) => platform === "win32" ? "zip" : "tgz",
|
|
722
863
|
stripComponents: 0,
|
|
723
864
|
treeMarker: "bin"
|
|
724
865
|
}
|
|
@@ -1017,6 +1158,32 @@ export const TOOLS = [
|
|
|
1017
1158
|
binaryInArchive: "gleam"
|
|
1018
1159
|
}
|
|
1019
1160
|
},
|
|
1161
|
+
{
|
|
1162
|
+
id: "tinymist",
|
|
1163
|
+
name: "Tinymist",
|
|
1164
|
+
checkCommand: "tinymist",
|
|
1165
|
+
checkArgs: ["--version"],
|
|
1166
|
+
installStrategy: "github",
|
|
1167
|
+
binaryName: "tinymist",
|
|
1168
|
+
github: {
|
|
1169
|
+
repo: "Myriad-Dreamin/tinymist",
|
|
1170
|
+
assetMatch: archAssetMatch({
|
|
1171
|
+
linux: {
|
|
1172
|
+
x64: "tinymist-x86_64-unknown-linux-gnu.tar.gz",
|
|
1173
|
+
arm64: "tinymist-aarch64-unknown-linux-gnu.tar.gz"
|
|
1174
|
+
},
|
|
1175
|
+
darwin: {
|
|
1176
|
+
x64: "tinymist-x86_64-apple-darwin.tar.gz",
|
|
1177
|
+
arm64: "tinymist-aarch64-apple-darwin.tar.gz"
|
|
1178
|
+
},
|
|
1179
|
+
win32: {
|
|
1180
|
+
x64: "tinymist-x86_64-pc-windows-msvc.zip",
|
|
1181
|
+
arm64: "tinymist-aarch64-pc-windows-msvc.zip"
|
|
1182
|
+
}
|
|
1183
|
+
}),
|
|
1184
|
+
binaryInArchive: "tinymist"
|
|
1185
|
+
}
|
|
1186
|
+
},
|
|
1020
1187
|
{
|
|
1021
1188
|
id: "marksman",
|
|
1022
1189
|
name: "Marksman",
|
|
@@ -1258,26 +1425,10 @@ function isAstGrepVersionOutput(output) {
|
|
|
1258
1425
|
return /\bast[- ]grep\b/i.test(output);
|
|
1259
1426
|
}
|
|
1260
1427
|
async function verifyAstGrepProbePath(binPath) {
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
try {
|
|
1264
|
-
proc = spawn(binPath, ["--version"], {
|
|
1265
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
1266
|
-
shell: process.platform === "win32" && /\.(cmd|bat)$/i.test(binPath),
|
|
1267
|
-
timeout: 5000
|
|
1268
|
-
});
|
|
1269
|
-
} catch {
|
|
1270
|
-
resolve(false);
|
|
1271
|
-
return;
|
|
1272
|
-
}
|
|
1273
|
-
let output = "";
|
|
1274
|
-
proc.stdout?.on("data", (data) => output += data);
|
|
1275
|
-
proc.stderr?.on("data", (data) => output += data);
|
|
1276
|
-
proc.on("exit", (code) => {
|
|
1277
|
-
resolve(code === 0 && isAstGrepVersionOutput(output));
|
|
1278
|
-
});
|
|
1279
|
-
proc.on("error", () => resolve(false));
|
|
1428
|
+
const result = await probeToolAsync(binPath, ["--version"], {
|
|
1429
|
+
timeout: 5000
|
|
1280
1430
|
});
|
|
1431
|
+
return !result.error && result.status === 0 && isAstGrepVersionOutput(`${result.stdout}${result.stderr}`);
|
|
1281
1432
|
}
|
|
1282
1433
|
export async function checkProbeCache(toolId) {
|
|
1283
1434
|
const cache = await readProbeCache();
|
|
@@ -1404,7 +1555,7 @@ export function isLspTransportRequiredError(output) {
|
|
|
1404
1555
|
return /Connection (?:input|output) stream is not set|Use arguments of createConnection/i.test(output);
|
|
1405
1556
|
}
|
|
1406
1557
|
const lspTransportRequiredMatcher = /Connection (?:input|output) stream is not set|Use arguments of createConnection/i;
|
|
1407
|
-
function parsePinnedVersion(packageName) {
|
|
1558
|
+
export function parsePinnedVersion(packageName) {
|
|
1408
1559
|
const at = packageName.lastIndexOf("@");
|
|
1409
1560
|
if (at <= 0)
|
|
1410
1561
|
return;
|
|
@@ -1414,7 +1565,54 @@ function extractVersionToken(output) {
|
|
|
1414
1565
|
return output.match(/\d+\.\d+\.\d+(?:[-+][\w.]+)?/)?.[0];
|
|
1415
1566
|
}
|
|
1416
1567
|
const lastManagedInstallVersion = new Map;
|
|
1417
|
-
export
|
|
1568
|
+
export function packageEntryVerification(tool) {
|
|
1569
|
+
return tool.verification === "package-entry" ? tool.packageName : undefined;
|
|
1570
|
+
}
|
|
1571
|
+
export async function verifyNpmPackageEntry(binPath, packageName) {
|
|
1572
|
+
const nodeModulesDir = path.dirname(path.dirname(binPath));
|
|
1573
|
+
const pinned = parsePinnedVersion(packageName);
|
|
1574
|
+
const bareName = pinned ? packageName.slice(0, -(pinned.length + 1)) : packageName;
|
|
1575
|
+
const packageDir = path.join(nodeModulesDir, ...bareName.split("/"));
|
|
1576
|
+
const shimName = path.basename(binPath).replace(/\.(cmd|exe|ps1|bat)$/i, "").toLowerCase();
|
|
1577
|
+
const fail = (reason) => {
|
|
1578
|
+
logSessionStart(`auto-install verify: failed for ${binPath} (check=package-entry, kind=${reason})`);
|
|
1579
|
+
return false;
|
|
1580
|
+
};
|
|
1581
|
+
try {
|
|
1582
|
+
const shim = statSync(binPath);
|
|
1583
|
+
if (!shim.isFile() || shim.size === 0)
|
|
1584
|
+
return fail("shim-not-a-file");
|
|
1585
|
+
} catch {
|
|
1586
|
+
return fail("shim-missing");
|
|
1587
|
+
}
|
|
1588
|
+
let manifest;
|
|
1589
|
+
try {
|
|
1590
|
+
manifest = JSON.parse(await fs.readFile(path.join(packageDir, "package.json"), "utf8"));
|
|
1591
|
+
} catch {
|
|
1592
|
+
return fail("package-json-unreadable");
|
|
1593
|
+
}
|
|
1594
|
+
if (typeof manifest.version !== "string" || !manifest.version) {
|
|
1595
|
+
return fail("package-json-no-version");
|
|
1596
|
+
}
|
|
1597
|
+
const bin = manifest.bin;
|
|
1598
|
+
const entry = typeof bin === "string" ? bin : bin && typeof bin === "object" ? Object.entries(bin).find(([name]) => name.toLowerCase() === shimName)?.[1] : undefined;
|
|
1599
|
+
if (typeof entry !== "string" || !entry) {
|
|
1600
|
+
return fail("package-json-no-entry");
|
|
1601
|
+
}
|
|
1602
|
+
try {
|
|
1603
|
+
const stat = statSync(path.join(packageDir, entry));
|
|
1604
|
+
if (!stat.isFile() || stat.size === 0)
|
|
1605
|
+
return fail("entry-not-a-file");
|
|
1606
|
+
} catch {
|
|
1607
|
+
return fail("entry-missing");
|
|
1608
|
+
}
|
|
1609
|
+
logSessionStart(`auto-install verify: succeeded for ${binPath} (check=package-entry, version=${manifest.version}, entry=${entry})`);
|
|
1610
|
+
return true;
|
|
1611
|
+
}
|
|
1612
|
+
export async function verifyToolBinary(binPath, onVersionOutput, onTransient, timeoutMs = 1e4, verificationArgs = ["--version"], packageEntryOf, onInconclusive) {
|
|
1613
|
+
if (packageEntryOf !== undefined) {
|
|
1614
|
+
return verifyNpmPackageEntry(binPath, packageEntryOf);
|
|
1615
|
+
}
|
|
1418
1616
|
const isWindows = installerPlatform() === "win32";
|
|
1419
1617
|
const hasKnownWindowsExt = /\.(cmd|exe|ps1)$/i.test(binPath);
|
|
1420
1618
|
let execPath = isWindows && !hasKnownWindowsExt ? `${binPath}.cmd` : binPath;
|
|
@@ -1452,6 +1650,14 @@ ${result.stderr}`;
|
|
|
1452
1650
|
}
|
|
1453
1651
|
if (result.signal !== undefined || result.spawnFailure)
|
|
1454
1652
|
onTransient?.();
|
|
1653
|
+
if (result.outputTruncated && result.signal === undefined && !result.spawnFailure) {
|
|
1654
|
+
onInconclusive?.();
|
|
1655
|
+
recordDegradationOnce({
|
|
1656
|
+
kind: "installer-verification-inconclusive",
|
|
1657
|
+
subject: binPath,
|
|
1658
|
+
reason: `transport-required marker unresolved in truncated output (${verificationArgs.join(" ")})`
|
|
1659
|
+
});
|
|
1660
|
+
}
|
|
1455
1661
|
const kind = result.spawnFailure?.kind ?? (result.signal ? `killed-signal=${result.signal}` : result.error ? "spawn-error" : "exit-nonzero");
|
|
1456
1662
|
logSessionStart(`auto-install verify: failed for ${binPath} (check=${verificationArgs.join(" ")}, kind=${kind}${result.status !== null ? `, exit=${result.status}` : ""})`);
|
|
1457
1663
|
return false;
|
|
@@ -1485,26 +1691,11 @@ export async function getAllToolStatuses() {
|
|
|
1485
1691
|
status.installed = true;
|
|
1486
1692
|
status.source = "global-path";
|
|
1487
1693
|
status.path = tool.checkCommand;
|
|
1488
|
-
const
|
|
1489
|
-
|
|
1490
|
-
try {
|
|
1491
|
-
proc = spawn(tool.checkCommand, ["--version"], {
|
|
1492
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
1493
|
-
shell: process.platform === "win32",
|
|
1494
|
-
timeout: 5000
|
|
1495
|
-
});
|
|
1496
|
-
} catch {
|
|
1497
|
-
resolve("");
|
|
1498
|
-
return;
|
|
1499
|
-
}
|
|
1500
|
-
let out = "";
|
|
1501
|
-
proc.stdout?.on("data", (d) => out += d);
|
|
1502
|
-
proc.stderr?.on("data", (d) => out += d);
|
|
1503
|
-
proc.on("exit", () => resolve(out.trim().split(`
|
|
1504
|
-
`)[0]?.slice(0, 30) || ""));
|
|
1505
|
-
proc.on("error", () => resolve(""));
|
|
1694
|
+
const probe = await probeToolAsync(tool.checkCommand, ["--version"], {
|
|
1695
|
+
timeout: 5000
|
|
1506
1696
|
});
|
|
1507
|
-
status.version =
|
|
1697
|
+
status.version = `${probe.stdout}${probe.stderr}`.trim().split(`
|
|
1698
|
+
`)[0]?.slice(0, 30) || undefined;
|
|
1508
1699
|
statuses.push(status);
|
|
1509
1700
|
continue;
|
|
1510
1701
|
}
|
|
@@ -1542,7 +1733,7 @@ export async function getAllToolStatuses() {
|
|
|
1542
1733
|
const localPath = installerPlatform() === "win32" ? `${localBase}.cmd` : localBase;
|
|
1543
1734
|
try {
|
|
1544
1735
|
await fs.access(localPath);
|
|
1545
|
-
if (await verifyToolBinary(localPath, undefined, undefined, getToolVerificationTimeout(tool), tool.checkArgs)) {
|
|
1736
|
+
if (await verifyToolBinary(localPath, undefined, undefined, getToolVerificationTimeout(tool), tool.checkArgs, packageEntryVerification(tool))) {
|
|
1546
1737
|
status.installed = true;
|
|
1547
1738
|
status.source = "dm-lens-auto";
|
|
1548
1739
|
status.path = localPath;
|
|
@@ -1635,7 +1826,7 @@ async function getToolPathResolved(toolId, onTransient) {
|
|
|
1635
1826
|
const cmdPath = `${localBase}.cmd`;
|
|
1636
1827
|
try {
|
|
1637
1828
|
await fs.access(cmdPath);
|
|
1638
|
-
if (await verifyToolBinary(cmdPath, recordVersion, onTransient, getToolVerificationTimeout(tool), tool.checkArgs)) {
|
|
1829
|
+
if (await verifyToolBinary(cmdPath, recordVersion, onTransient, getToolVerificationTimeout(tool), tool.checkArgs, packageEntryVerification(tool))) {
|
|
1639
1830
|
return cmdPath;
|
|
1640
1831
|
}
|
|
1641
1832
|
logSessionStart(`auto-install verify: ${cmdPath} exists but is broken, will reinstall`);
|
|
@@ -1643,7 +1834,7 @@ async function getToolPathResolved(toolId, onTransient) {
|
|
|
1643
1834
|
const exePath = `${localBase}.exe`;
|
|
1644
1835
|
try {
|
|
1645
1836
|
await fs.access(exePath);
|
|
1646
|
-
if (await verifyToolBinary(exePath, recordVersion, onTransient, getToolVerificationTimeout(tool), tool.checkArgs)) {
|
|
1837
|
+
if (await verifyToolBinary(exePath, recordVersion, onTransient, getToolVerificationTimeout(tool), tool.checkArgs, packageEntryVerification(tool))) {
|
|
1647
1838
|
return exePath;
|
|
1648
1839
|
}
|
|
1649
1840
|
logSessionStart(`auto-install verify: ${exePath} exists but is broken, will reinstall`);
|
|
@@ -1652,7 +1843,7 @@ async function getToolPathResolved(toolId, onTransient) {
|
|
|
1652
1843
|
if (installerPlatform() !== "win32") {
|
|
1653
1844
|
try {
|
|
1654
1845
|
await fs.access(localBase);
|
|
1655
|
-
if (await verifyToolBinary(localBase, recordVersion, onTransient, getToolVerificationTimeout(tool), tool.checkArgs)) {
|
|
1846
|
+
if (await verifyToolBinary(localBase, recordVersion, onTransient, getToolVerificationTimeout(tool), tool.checkArgs, packageEntryVerification(tool))) {
|
|
1656
1847
|
return localBase;
|
|
1657
1848
|
}
|
|
1658
1849
|
logSessionStart(`auto-install verify: ${localBase} exists but is broken, will reinstall`);
|
|
@@ -1671,8 +1862,24 @@ async function getToolPathResolved(toolId, onTransient) {
|
|
|
1671
1862
|
if (githubPath)
|
|
1672
1863
|
return githubPath;
|
|
1673
1864
|
}
|
|
1674
|
-
if (await isCommandAvailable(tool.checkCommand
|
|
1675
|
-
|
|
1865
|
+
if (await isCommandAvailable(tool.checkCommand)) {
|
|
1866
|
+
if (packageEntryVerification(tool) !== undefined)
|
|
1867
|
+
return tool.checkCommand;
|
|
1868
|
+
let probeStalled = false;
|
|
1869
|
+
const verified = await verifyToolBinary(tool.checkCommand, undefined, () => {
|
|
1870
|
+
probeStalled = true;
|
|
1871
|
+
onTransient();
|
|
1872
|
+
}, getToolVerificationTimeout(tool), tool.checkArgs, undefined, () => {
|
|
1873
|
+
probeStalled = true;
|
|
1874
|
+
});
|
|
1875
|
+
if (verified || probeStalled)
|
|
1876
|
+
return tool.checkCommand;
|
|
1877
|
+
recordDegradationOnce({
|
|
1878
|
+
kind: "installer-path-candidate-unrunnable",
|
|
1879
|
+
subject: toolId,
|
|
1880
|
+
reason: `${tool.checkCommand} on PATH failed its own check (${tool.checkArgs.join(" ")}); ignoring PATH for this tool`
|
|
1881
|
+
});
|
|
1882
|
+
logSessionStart(`auto-install ${toolId}: PATH candidate ${tool.checkCommand} failed ${tool.checkArgs.join(" ")} — ignoring PATH, trying managed install`);
|
|
1676
1883
|
}
|
|
1677
1884
|
if (tool.installStrategy === "npm") {
|
|
1678
1885
|
const npmPath = await findNpmGlobalToolPath(tool.binaryName || tool.id, onTransient, tool.checkArgs, getToolVerificationTimeout(tool));
|
|
@@ -1727,6 +1934,13 @@ function getGitHubInstalledBinaryName(binaryName, platform, assetName) {
|
|
|
1727
1934
|
return `${binaryName}.cmd`;
|
|
1728
1935
|
return `${binaryName}.exe`;
|
|
1729
1936
|
}
|
|
1937
|
+
function launcherForGitHubAsset(spec, assetName) {
|
|
1938
|
+
if (spec.launcher === "php" && assetName.endsWith(".phar"))
|
|
1939
|
+
return "php";
|
|
1940
|
+
if (spec.launcher === "java" && assetName.endsWith(".jar"))
|
|
1941
|
+
return "java";
|
|
1942
|
+
return;
|
|
1943
|
+
}
|
|
1730
1944
|
function getArchiveBinaryCandidates(binaryName, platform, assetName) {
|
|
1731
1945
|
if (platform !== "win32")
|
|
1732
1946
|
return [binaryName];
|
|
@@ -1787,12 +2001,14 @@ async function getNpmGlobalBinCandidates(onTransient) {
|
|
|
1787
2001
|
return dirs;
|
|
1788
2002
|
}
|
|
1789
2003
|
async function findPipUserToolPath(binaryName, onTransient, verificationArgs = ["--version"], verificationTimeoutMs = 1e4) {
|
|
1790
|
-
const isWindows =
|
|
1791
|
-
const userBaseCandidates =
|
|
2004
|
+
const isWindows = installerPlatform() === "win32";
|
|
2005
|
+
const userBaseCandidates = [
|
|
2006
|
+
path.join(getGlobalDmLensDir(), "pip-tools"),
|
|
2007
|
+
path.join(getGlobalDmLensDir(), "pip-user"),
|
|
2008
|
+
...await getPythonUserBaseCandidates()
|
|
2009
|
+
];
|
|
1792
2010
|
for (const userBase of userBaseCandidates) {
|
|
1793
|
-
const scriptDirs = [
|
|
1794
|
-
path.join(userBase, isWindows ? "Scripts" : "bin")
|
|
1795
|
-
];
|
|
2011
|
+
const scriptDirs = [pipScriptsDir(userBase, installerPlatform())];
|
|
1796
2012
|
if (isWindows) {
|
|
1797
2013
|
try {
|
|
1798
2014
|
const children = await fs.readdir(userBase, { withFileTypes: true });
|
|
@@ -1823,6 +2039,23 @@ async function findPipUserToolPath(binaryName, onTransient, verificationArgs = [
|
|
|
1823
2039
|
}
|
|
1824
2040
|
return;
|
|
1825
2041
|
}
|
|
2042
|
+
export function userBaseProbeResult(command, code, stdout) {
|
|
2043
|
+
if (stdout.truncated) {
|
|
2044
|
+
recordDegradationOnce({
|
|
2045
|
+
kind: "spawn-output-cap-truncated",
|
|
2046
|
+
subject: `user-base-probe:${command}`,
|
|
2047
|
+
reason: `\`${command} -m site --user-base\` reached the ${DEFAULT_MAX_OUTPUT_BYTES}-byte default cap after ${stdout.observedBytes} bytes; the probed user base is unusable`,
|
|
2048
|
+
metadata: {
|
|
2049
|
+
capBytes: DEFAULT_MAX_OUTPUT_BYTES,
|
|
2050
|
+
capSource: "default",
|
|
2051
|
+
observedBytes: stdout.observedBytes,
|
|
2052
|
+
killed: false
|
|
2053
|
+
}
|
|
2054
|
+
});
|
|
2055
|
+
return "";
|
|
2056
|
+
}
|
|
2057
|
+
return code === 0 ? stdout.text.trim() : "";
|
|
2058
|
+
}
|
|
1826
2059
|
async function getPythonUserBaseCandidates() {
|
|
1827
2060
|
const candidates = [];
|
|
1828
2061
|
const seen = new Set;
|
|
@@ -1861,19 +2094,49 @@ async function getPythonUserBaseCandidates() {
|
|
|
1861
2094
|
resolve("");
|
|
1862
2095
|
return;
|
|
1863
2096
|
}
|
|
1864
|
-
|
|
1865
|
-
proc.stdout?.on("data", (data) => stdout
|
|
1866
|
-
proc.on("exit", (code) => resolve(code
|
|
2097
|
+
const stdout = createBoundedOutputSink();
|
|
2098
|
+
proc.stdout?.on("data", (data) => stdout.append(data));
|
|
2099
|
+
proc.on("exit", (code) => resolve(userBaseProbeResult(probe.command, code, stdout)));
|
|
1867
2100
|
proc.on("error", () => resolve(""));
|
|
1868
2101
|
});
|
|
1869
2102
|
add(userBase);
|
|
1870
2103
|
}
|
|
1871
2104
|
return candidates;
|
|
1872
2105
|
}
|
|
1873
|
-
function githubApiAuthHeaders() {
|
|
1874
|
-
const token =
|
|
2106
|
+
async function githubApiAuthHeaders() {
|
|
2107
|
+
const token = await resolveGitHubToken();
|
|
1875
2108
|
return token ? { Authorization: `Bearer ${token}` } : {};
|
|
1876
2109
|
}
|
|
2110
|
+
|
|
2111
|
+
class HttpStatusError extends Error {
|
|
2112
|
+
statusCode;
|
|
2113
|
+
constructor(statusCode, url) {
|
|
2114
|
+
super(url ? `HTTP ${statusCode} for ${url}` : `HTTP ${statusCode}`);
|
|
2115
|
+
this.name = "HttpStatusError";
|
|
2116
|
+
this.statusCode = statusCode;
|
|
2117
|
+
}
|
|
2118
|
+
}
|
|
2119
|
+
|
|
2120
|
+
class GitHubHttpError extends HttpStatusError {
|
|
2121
|
+
anonymousRateLimitExhausted;
|
|
2122
|
+
constructor(statusCode, requestHeaders, responseHeaders) {
|
|
2123
|
+
super(statusCode);
|
|
2124
|
+
this.name = "GitHubHttpError";
|
|
2125
|
+
this.message = `GitHub API HTTP ${statusCode}`;
|
|
2126
|
+
this.anonymousRateLimitExhausted = statusCode === 403 && !Object.keys(requestHeaders).some((key) => key.toLowerCase() === "authorization") && readHeader(responseHeaders, "x-ratelimit-remaining") === "0";
|
|
2127
|
+
}
|
|
2128
|
+
}
|
|
2129
|
+
function readHeader(headers, name) {
|
|
2130
|
+
const entry = Object.entries(headers).find(([key]) => key.toLowerCase() === name.toLowerCase())?.[1];
|
|
2131
|
+
return Array.isArray(entry) ? entry[0]?.trim() : entry?.trim();
|
|
2132
|
+
}
|
|
2133
|
+
function isGitHubApiUrl(url) {
|
|
2134
|
+
try {
|
|
2135
|
+
return new URL(url).host.toLowerCase() === "api.github.com";
|
|
2136
|
+
} catch {
|
|
2137
|
+
return false;
|
|
2138
|
+
}
|
|
2139
|
+
}
|
|
1877
2140
|
function sameHost(a, b) {
|
|
1878
2141
|
try {
|
|
1879
2142
|
return new URL(a).host === new URL(b).host;
|
|
@@ -1901,7 +2164,7 @@ function httpsGetWithMeta(url, maxRedirects = 5, headers = {}) {
|
|
|
1901
2164
|
}
|
|
1902
2165
|
if (res.statusCode !== 200) {
|
|
1903
2166
|
res.resume();
|
|
1904
|
-
return reject(new
|
|
2167
|
+
return reject(isGitHubApiUrl(url) ? new GitHubHttpError(res.statusCode ?? 0, headers, res.headers) : new HttpStatusError(res.statusCode ?? 0, url));
|
|
1905
2168
|
}
|
|
1906
2169
|
const chunks = [];
|
|
1907
2170
|
res.on("data", (chunk) => chunks.push(chunk));
|
|
@@ -1952,10 +2215,18 @@ async function installGitHubTool(tool, prefetchedRelease) {
|
|
|
1952
2215
|
} else {
|
|
1953
2216
|
logSessionStart(`github-install ${tool.id}: fetching release metadata from ${spec.repo}`);
|
|
1954
2217
|
try {
|
|
1955
|
-
const body = await httpsGet(`https://api.github.com/repos/${spec.repo}/releases/latest`, 5, githubApiAuthHeaders());
|
|
2218
|
+
const body = await httpsGet(`https://api.github.com/repos/${spec.repo}/releases/latest`, 5, await githubApiAuthHeaders());
|
|
1956
2219
|
releaseJson = JSON.parse(body.toString("utf8"));
|
|
1957
2220
|
} catch (err) {
|
|
1958
|
-
|
|
2221
|
+
const reason = err instanceof GitHubHttpError && err.anonymousRateLimitExhausted ? "GitHub API rate limit exhausted; authenticate with `gh auth login` or set GITHUB_TOKEN/GH_TOKEN and retry" : `release fetch failed: ${err.message}`;
|
|
2222
|
+
if (err instanceof GitHubHttpError && err.anonymousRateLimitExhausted) {
|
|
2223
|
+
recordDegradationOnce({
|
|
2224
|
+
kind: "github-api-rate-limit",
|
|
2225
|
+
subject: tool.id,
|
|
2226
|
+
reason
|
|
2227
|
+
});
|
|
2228
|
+
}
|
|
2229
|
+
logSessionStart(`github-install ${tool.id}: ${reason}`);
|
|
1959
2230
|
return;
|
|
1960
2231
|
}
|
|
1961
2232
|
}
|
|
@@ -1986,10 +2257,33 @@ async function installGitHubTool(tool, prefetchedRelease) {
|
|
|
1986
2257
|
const binaryName = tool.binaryName ?? tool.id;
|
|
1987
2258
|
const isWindows = platform === "win32";
|
|
1988
2259
|
const finalBinaryName = getGitHubInstalledBinaryName(binaryName, platform, asset.name);
|
|
1989
|
-
|
|
2260
|
+
let destPath = path.join(GITHUB_BIN_DIR, finalBinaryName);
|
|
1990
2261
|
const assetName = asset.name;
|
|
2262
|
+
const launcherRuntime = launcherForGitHubAsset(spec, assetName);
|
|
2263
|
+
if (launcherRuntime && !await isCommandAvailable(launcherRuntime, ["--version"])) {
|
|
2264
|
+
logSessionStart(`github-install ${tool.id}: ${launcherRuntime} not found — asset requires a runtime launcher`);
|
|
2265
|
+
return;
|
|
2266
|
+
}
|
|
1991
2267
|
try {
|
|
1992
|
-
if (
|
|
2268
|
+
if (launcherRuntime) {
|
|
2269
|
+
const assetPath = path.join(GITHUB_BIN_DIR, `${tool.id}${assetName.endsWith(".phar") ? ".phar" : ".jar"}`);
|
|
2270
|
+
await writeFileAtomicAsync(assetPath, assetBuffer, {
|
|
2271
|
+
bestEffort: false,
|
|
2272
|
+
mode: 488
|
|
2273
|
+
});
|
|
2274
|
+
const launcherName = isWindows ? `${binaryName}.bat` : binaryName;
|
|
2275
|
+
destPath = path.join(GITHUB_BIN_DIR, launcherName);
|
|
2276
|
+
const runtimeTarget = assetName.endsWith(".phar") ? `${tool.id}.phar` : `${tool.id}.jar`;
|
|
2277
|
+
const command = isWindows ? `@echo off\r
|
|
2278
|
+
${launcherRuntime} "%~dp0${runtimeTarget}" %*\r
|
|
2279
|
+
` : `#!/bin/sh
|
|
2280
|
+
exec ${launcherRuntime} "$(dirname "$0")/${runtimeTarget}" "$@"
|
|
2281
|
+
`;
|
|
2282
|
+
await writeFileAtomicAsync(destPath, command, {
|
|
2283
|
+
bestEffort: false,
|
|
2284
|
+
mode: isWindows ? undefined : 488
|
|
2285
|
+
});
|
|
2286
|
+
} else if (assetName.endsWith(".gz") && !assetName.endsWith(".tar.gz")) {
|
|
1993
2287
|
const decompressed = await new Promise((resolve, reject) => {
|
|
1994
2288
|
const gunzip = createGunzip();
|
|
1995
2289
|
const chunks = [];
|
|
@@ -2107,11 +2401,17 @@ export function npmToolNeedsPostinstall(packageName) {
|
|
|
2107
2401
|
return NEEDS_POSTINSTALL.has(packageName);
|
|
2108
2402
|
}
|
|
2109
2403
|
export function getRefreshableManagedNpmTools() {
|
|
2404
|
+
const seenPackages = new Set;
|
|
2110
2405
|
return getRefreshableManagedTools().filter((candidate) => candidate.strategy === "npm").map((candidate) => ({
|
|
2111
2406
|
toolId: candidate.toolId,
|
|
2112
2407
|
packageName: candidate.packageName,
|
|
2113
2408
|
binaryName: candidate.binaryName
|
|
2114
|
-
}))
|
|
2409
|
+
})).filter((candidate) => {
|
|
2410
|
+
if (seenPackages.has(candidate.packageName))
|
|
2411
|
+
return false;
|
|
2412
|
+
seenPackages.add(candidate.packageName);
|
|
2413
|
+
return true;
|
|
2414
|
+
});
|
|
2115
2415
|
}
|
|
2116
2416
|
function mavenCoordinate(spec) {
|
|
2117
2417
|
return [
|
|
@@ -2139,7 +2439,8 @@ export function getRefreshableManagedTools() {
|
|
|
2139
2439
|
checkArgs: tool.checkArgs,
|
|
2140
2440
|
packageName: tool.packageName,
|
|
2141
2441
|
binaryName: tool.binaryName,
|
|
2142
|
-
verificationTimeoutMs: tool.verificationTimeoutMs
|
|
2442
|
+
verificationTimeoutMs: tool.verificationTimeoutMs,
|
|
2443
|
+
packageEntryOf: packageEntryVerification(tool)
|
|
2143
2444
|
});
|
|
2144
2445
|
break;
|
|
2145
2446
|
}
|
|
@@ -2228,7 +2529,7 @@ async function probeManagedToolVersion(tool) {
|
|
|
2228
2529
|
if (!cached?.path || !existsSync(cached.path))
|
|
2229
2530
|
return;
|
|
2230
2531
|
try {
|
|
2231
|
-
const result = await
|
|
2532
|
+
const result = await probeToolAsync(cached.path, tool.checkArgs, {
|
|
2232
2533
|
timeout: getToolVerificationTimeout(tool),
|
|
2233
2534
|
input: "",
|
|
2234
2535
|
ignoreAmbientSignal: true,
|
|
@@ -2306,14 +2607,22 @@ async function refreshGitHubManagedTool(tool, known) {
|
|
|
2306
2607
|
let response;
|
|
2307
2608
|
try {
|
|
2308
2609
|
response = await httpsGetWithMeta(`https://api.github.com/repos/${spec.repo}/releases/latest`, 5, {
|
|
2309
|
-
...githubApiAuthHeaders(),
|
|
2610
|
+
...await githubApiAuthHeaders(),
|
|
2310
2611
|
...known.etag ? { "If-None-Match": known.etag } : {}
|
|
2311
2612
|
});
|
|
2312
2613
|
} catch (err) {
|
|
2614
|
+
const reason = err instanceof GitHubHttpError && err.anonymousRateLimitExhausted ? "GitHub API rate limit exhausted; authenticate with `gh auth login` or set GITHUB_TOKEN/GH_TOKEN and retry" : `release query failed: ${err.message}`;
|
|
2615
|
+
if (err instanceof GitHubHttpError && err.anonymousRateLimitExhausted) {
|
|
2616
|
+
recordDegradationOnce({
|
|
2617
|
+
kind: "github-api-rate-limit",
|
|
2618
|
+
subject: tool.id,
|
|
2619
|
+
reason
|
|
2620
|
+
});
|
|
2621
|
+
}
|
|
2313
2622
|
return {
|
|
2314
2623
|
ok: false,
|
|
2315
2624
|
unchanged: true,
|
|
2316
|
-
reason
|
|
2625
|
+
reason
|
|
2317
2626
|
};
|
|
2318
2627
|
}
|
|
2319
2628
|
if (response.statusCode === 304) {
|
|
@@ -2397,7 +2706,9 @@ async function refreshPackageManagerManagedTool(tool) {
|
|
|
2397
2706
|
return { ok: false, unchanged: true, reason: "no package name" };
|
|
2398
2707
|
}
|
|
2399
2708
|
const previous = await probeManagedToolVersion(tool);
|
|
2400
|
-
const installed = tool.installStrategy === "pip" ? await installPipTool(tool.packageName,
|
|
2709
|
+
const installed = tool.installStrategy === "pip" ? await installPipTool(tool.id, tool.packageName, tool.binaryName ?? tool.id, {
|
|
2710
|
+
upgrade: true
|
|
2711
|
+
}) : await installGemTool(tool.id, tool.packageName);
|
|
2401
2712
|
if (!installed) {
|
|
2402
2713
|
return {
|
|
2403
2714
|
ok: false,
|
|
@@ -2523,9 +2834,32 @@ exec java -jar "$(dirname "$0")/${tool.id}.jar" "$@"
|
|
|
2523
2834
|
return;
|
|
2524
2835
|
}
|
|
2525
2836
|
}
|
|
2526
|
-
export function resolveArchiveUrl(spec, platform =
|
|
2837
|
+
export function resolveArchiveUrl(spec, platform = installerPlatform(), arch = process.arch) {
|
|
2527
2838
|
return typeof spec.url === "function" ? spec.url(platform, arch) : spec.url;
|
|
2528
2839
|
}
|
|
2840
|
+
export function resolveArchiveKind(spec, platform = installerPlatform(), arch = process.arch) {
|
|
2841
|
+
return typeof spec.kind === "function" ? spec.kind(platform, arch) : spec.kind;
|
|
2842
|
+
}
|
|
2843
|
+
function recordArchiveExtractionDegradation(toolId, format, reason) {
|
|
2844
|
+
recordDegradationOnce({
|
|
2845
|
+
kind: "managed-tool-install",
|
|
2846
|
+
subject: `${toolId}:${format}`,
|
|
2847
|
+
reason: `archive extraction ${reason}`
|
|
2848
|
+
});
|
|
2849
|
+
}
|
|
2850
|
+
async function stripExtractedArchiveRoot(dir, components) {
|
|
2851
|
+
for (let i = 0;i < components; i++) {
|
|
2852
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
2853
|
+
const [entry] = entries;
|
|
2854
|
+
if (entries.length !== 1 || !entry?.isDirectory())
|
|
2855
|
+
return false;
|
|
2856
|
+
const root = path.join(dir, entry.name);
|
|
2857
|
+
for (const child of await fs.readdir(root))
|
|
2858
|
+
await fs.rename(path.join(root, child), path.join(dir, child));
|
|
2859
|
+
await fs.rm(root, { recursive: true, force: true });
|
|
2860
|
+
}
|
|
2861
|
+
return true;
|
|
2862
|
+
}
|
|
2529
2863
|
export async function swapExtractedDir(toolId, tmpDir, finalDir) {
|
|
2530
2864
|
const backupDir = `${finalDir}.rollback`;
|
|
2531
2865
|
await fs.rm(backupDir, { recursive: true, force: true });
|
|
@@ -2563,8 +2897,10 @@ async function installArchiveTool(tool) {
|
|
|
2563
2897
|
if (!spec)
|
|
2564
2898
|
return;
|
|
2565
2899
|
const binaryName = tool.binaryName ?? tool.id;
|
|
2566
|
-
const
|
|
2567
|
-
const
|
|
2900
|
+
const platform = installerPlatform();
|
|
2901
|
+
const isWindows = platform === "win32";
|
|
2902
|
+
const archiveKind = resolveArchiveKind(spec, platform, process.arch);
|
|
2903
|
+
const url = resolveArchiveUrl(spec, platform, process.arch);
|
|
2568
2904
|
if (!url) {
|
|
2569
2905
|
logSessionStart(`archive-install ${tool.id}: no archive for ${process.platform}/${process.arch} — unsupported, skipping`);
|
|
2570
2906
|
return;
|
|
@@ -2580,7 +2916,7 @@ async function installArchiveTool(tool) {
|
|
|
2580
2916
|
}
|
|
2581
2917
|
const extractName = tool.id;
|
|
2582
2918
|
const tmpExtractName = `${extractName}.refresh-tmp`;
|
|
2583
|
-
const archiveName = `${tool.id}.download.${
|
|
2919
|
+
const archiveName = `${tool.id}.download.${archiveKind === "zip" ? "zip" : "tgz"}`;
|
|
2584
2920
|
const extractDir = path.join(TOOLS_DIR, extractName);
|
|
2585
2921
|
const tmpExtractDir = path.join(TOOLS_DIR, tmpExtractName);
|
|
2586
2922
|
const tmpArchive = path.join(TOOLS_DIR, archiveName);
|
|
@@ -2590,27 +2926,38 @@ async function installArchiveTool(tool) {
|
|
|
2590
2926
|
await fs.mkdir(tmpExtractDir, { recursive: true });
|
|
2591
2927
|
await fs.writeFile(tmpArchive, archiveBuffer);
|
|
2592
2928
|
const stripComponents = spec.stripComponents ?? 1;
|
|
2593
|
-
const
|
|
2594
|
-
|
|
2929
|
+
const extractionArgs = archiveKind === "zip" && isWindows ? [
|
|
2930
|
+
"-NoProfile",
|
|
2931
|
+
"-Command",
|
|
2932
|
+
`Expand-Archive -LiteralPath '${archiveName}' -DestinationPath '${tmpExtractName}' -Force`
|
|
2933
|
+
] : archiveKind === "zip" ? ["-q", "-o", archiveName, "-d", tmpExtractName] : [
|
|
2934
|
+
"-xzf",
|
|
2595
2935
|
archiveName,
|
|
2596
2936
|
"-C",
|
|
2597
2937
|
tmpExtractName,
|
|
2598
2938
|
...stripComponents > 0 ? [`--strip-components=${stripComponents}`] : []
|
|
2599
2939
|
];
|
|
2600
|
-
const
|
|
2601
|
-
const
|
|
2940
|
+
const extractor = archiveKind === "zip" && isWindows ? `${process.env.SystemRoot ?? "C:\\Windows"}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe` : archiveKind === "zip" ? "unzip" : isWindows ? `${process.env.SystemRoot ?? "C:\\Windows"}\\System32\\tar.exe` : "tar";
|
|
2941
|
+
const extractionResult = await safeSpawnAsync(extractor, extractionArgs, {
|
|
2602
2942
|
cwd: TOOLS_DIR,
|
|
2603
2943
|
timeout: 120000,
|
|
2604
2944
|
ignoreAmbientSignal: true,
|
|
2605
2945
|
lifetimeCoupled: true
|
|
2606
2946
|
});
|
|
2607
2947
|
const extracted = {
|
|
2608
|
-
ok:
|
|
2609
|
-
|
|
2948
|
+
ok: extractionResult.status === 0,
|
|
2949
|
+
reason: extractionResult.spawnFailure?.kind === "tool-not-found" ? "extractor-unavailable" : extractionResult.spawnFailure ? "extractor-error" : "extractor-exit"
|
|
2610
2950
|
};
|
|
2611
2951
|
await fs.rm(tmpArchive, { force: true });
|
|
2612
2952
|
if (!extracted.ok) {
|
|
2613
|
-
|
|
2953
|
+
recordArchiveExtractionDegradation(tool.id, archiveKind, extracted.reason);
|
|
2954
|
+
logSessionStart(`archive-install ${tool.id}: ${archiveKind} extraction failed (${extracted.reason}) — keeping installed version`);
|
|
2955
|
+
await fs.rm(tmpExtractDir, { recursive: true, force: true }).catch(() => {});
|
|
2956
|
+
return;
|
|
2957
|
+
}
|
|
2958
|
+
if (archiveKind === "zip" && !await stripExtractedArchiveRoot(tmpExtractDir, stripComponents)) {
|
|
2959
|
+
recordArchiveExtractionDegradation(tool.id, archiveKind, "layout-invalid");
|
|
2960
|
+
logSessionStart(`archive-install ${tool.id}: ${archiveKind} layout invalid — keeping installed version`);
|
|
2614
2961
|
await fs.rm(tmpExtractDir, { recursive: true, force: true }).catch(() => {});
|
|
2615
2962
|
return;
|
|
2616
2963
|
}
|
|
@@ -2619,7 +2966,8 @@ async function installArchiveTool(tool) {
|
|
|
2619
2966
|
try {
|
|
2620
2967
|
await fs.access(tmpMarker);
|
|
2621
2968
|
} catch {
|
|
2622
|
-
|
|
2969
|
+
recordArchiveExtractionDegradation(tool.id, archiveKind, "marker-missing");
|
|
2970
|
+
logSessionStart(`archive-install ${tool.id}: ${archiveKind} marker missing after extraction — keeping installed version`);
|
|
2623
2971
|
await fs.rm(tmpExtractDir, { recursive: true, force: true }).catch(() => {});
|
|
2624
2972
|
return;
|
|
2625
2973
|
}
|
|
@@ -2634,7 +2982,8 @@ async function installArchiveTool(tool) {
|
|
|
2634
2982
|
try {
|
|
2635
2983
|
await fs.access(tmpResolvedInner);
|
|
2636
2984
|
} catch {
|
|
2637
|
-
|
|
2985
|
+
recordArchiveExtractionDegradation(tool.id, archiveKind, "launcher-missing");
|
|
2986
|
+
logSessionStart(`archive-install ${tool.id}: ${archiveKind} launcher missing after extraction — keeping installed version`);
|
|
2638
2987
|
await fs.rm(tmpExtractDir, { recursive: true, force: true }).catch(() => {});
|
|
2639
2988
|
return;
|
|
2640
2989
|
}
|
|
@@ -2665,7 +3014,19 @@ exec "${resolvedInner}" "$@"
|
|
|
2665
3014
|
return;
|
|
2666
3015
|
}
|
|
2667
3016
|
}
|
|
2668
|
-
|
|
3017
|
+
function recordPackageManagerInstallException(toolId, strategyLabel, packageName, err) {
|
|
3018
|
+
const message = boundInstallError(err.message);
|
|
3019
|
+
logSessionStart(`auto-install ${strategyLabel} ${packageName}: exception: ${message}`);
|
|
3020
|
+
installFailureReasons.set(toolId, message);
|
|
3021
|
+
return;
|
|
3022
|
+
}
|
|
3023
|
+
const INSTALL_ERROR_LINE_LIMIT = 1000;
|
|
3024
|
+
const INSTALL_CANDIDATE_ERROR_LIMIT = 200;
|
|
3025
|
+
function boundInstallError(value, limit = INSTALL_ERROR_LINE_LIMIT) {
|
|
3026
|
+
const line = value.replace(/[\r\n]+/g, " ").trim();
|
|
3027
|
+
return line.length > limit ? `${line.slice(0, limit - 3)}...` : line;
|
|
3028
|
+
}
|
|
3029
|
+
async function installNpmTool(toolId, packageName, binaryName, verificationArgs = ["--version"], verificationTimeoutMs = 1e4, packageEntryOf) {
|
|
2669
3030
|
try {
|
|
2670
3031
|
await fs.mkdir(TOOLS_DIR, { recursive: true });
|
|
2671
3032
|
const packageJsonPath = path.join(TOOLS_DIR, "package.json");
|
|
@@ -2725,11 +3086,15 @@ async function installNpmTool(packageName, binaryName, verificationArgs = ["--ve
|
|
|
2725
3086
|
debugLog(`Verifying ${binaryName}...`);
|
|
2726
3087
|
let isValid = false;
|
|
2727
3088
|
let lastAttemptTransient = false;
|
|
3089
|
+
let lastAttemptInconclusive = false;
|
|
2728
3090
|
for (let attempt = 1;attempt <= 3; attempt++) {
|
|
2729
3091
|
lastAttemptTransient = false;
|
|
3092
|
+
lastAttemptInconclusive = false;
|
|
2730
3093
|
isValid = await verifyToolBinary(binPath, undefined, () => {
|
|
2731
3094
|
lastAttemptTransient = true;
|
|
2732
|
-
}, verificationTimeoutMs, verificationArgs)
|
|
3095
|
+
}, verificationTimeoutMs, verificationArgs, packageEntryOf, () => {
|
|
3096
|
+
lastAttemptInconclusive = true;
|
|
3097
|
+
});
|
|
2733
3098
|
if (isValid)
|
|
2734
3099
|
break;
|
|
2735
3100
|
if (attempt < 3) {
|
|
@@ -2737,6 +3102,13 @@ async function installNpmTool(packageName, binaryName, verificationArgs = ["--ve
|
|
|
2737
3102
|
await new Promise((r) => setTimeout(r, 1000 * attempt));
|
|
2738
3103
|
}
|
|
2739
3104
|
}
|
|
3105
|
+
if (!isValid && lastAttemptInconclusive) {
|
|
3106
|
+
if (await verifyNpmPackageEntry(binPath, packageName)) {
|
|
3107
|
+
logSessionStart(`auto-install ${packageName}: verification inconclusive (output truncated before the transport-required marker) but the installed tree is intact; keeping installation for re-probe`);
|
|
3108
|
+
return;
|
|
3109
|
+
}
|
|
3110
|
+
logSessionStart(`auto-install ${packageName}: verification inconclusive AND the installed tree is incomplete; cleaning up so the next install can repair it`);
|
|
3111
|
+
}
|
|
2740
3112
|
if (!isValid && lastAttemptTransient) {
|
|
2741
3113
|
logSessionStart(`auto-install ${packageName}: verification inconclusive (transient); keeping installation for re-probe`);
|
|
2742
3114
|
return;
|
|
@@ -2756,49 +3128,184 @@ async function installNpmTool(packageName, binaryName, verificationArgs = ["--ve
|
|
|
2756
3128
|
}
|
|
2757
3129
|
return binPath;
|
|
2758
3130
|
} catch (err) {
|
|
2759
|
-
|
|
2760
|
-
return;
|
|
3131
|
+
return recordPackageManagerInstallException(toolId, "npm", packageName, err);
|
|
2761
3132
|
}
|
|
2762
3133
|
}
|
|
2763
|
-
|
|
3134
|
+
export function pipCommandCandidates() {
|
|
3135
|
+
return process.platform === "win32" ? ["pip", "py", "python"] : ["pip3", "pip", "python3", "python"];
|
|
3136
|
+
}
|
|
3137
|
+
export function pipScriptsDir(base, platform = installerPlatform()) {
|
|
3138
|
+
return path.join(base, platform === "win32" ? "Scripts" : "bin");
|
|
3139
|
+
}
|
|
3140
|
+
const pipPep668LoggedRefusals = createGenerationMap("installer-pep668-log");
|
|
3141
|
+
async function pipConstraintEnvFor(toolId) {
|
|
3142
|
+
const constraints = TOOLS.find((t) => t.id === toolId)?.pipConstraints;
|
|
3143
|
+
if (!constraints || constraints.length === 0)
|
|
3144
|
+
return {};
|
|
3145
|
+
const directories = [
|
|
3146
|
+
path.join(getGlobalDmLensDir(), "pip-constraints"),
|
|
3147
|
+
path.join(os.tmpdir(), "dm-lens-pip-constraints")
|
|
3148
|
+
];
|
|
3149
|
+
const directory = directories.find((candidate) => !/\s/.test(candidate));
|
|
3150
|
+
if (!directory) {
|
|
3151
|
+
recordDegradationOnce({
|
|
3152
|
+
kind: "pip-constraint-path-unusable",
|
|
3153
|
+
subject: toolId,
|
|
3154
|
+
reason: `no whitespace-free directory for the constraints file (tried ${directories.join(", ")}); installing unconstrained`
|
|
3155
|
+
});
|
|
3156
|
+
return {};
|
|
3157
|
+
}
|
|
3158
|
+
const file = path.join(directory, `${toolId}.txt`);
|
|
2764
3159
|
try {
|
|
2765
|
-
|
|
2766
|
-
|
|
2767
|
-
|
|
2768
|
-
|
|
2769
|
-
|
|
2770
|
-
|
|
2771
|
-
|
|
2772
|
-
|
|
2773
|
-
|
|
2774
|
-
|
|
2775
|
-
|
|
2776
|
-
|
|
2777
|
-
|
|
2778
|
-
|
|
2779
|
-
|
|
2780
|
-
|
|
2781
|
-
|
|
2782
|
-
|
|
2783
|
-
|
|
2784
|
-
|
|
2785
|
-
|
|
2786
|
-
|
|
3160
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
3161
|
+
await writeFileAtomicAsync(file, `${constraints.join(`
|
|
3162
|
+
`)}
|
|
3163
|
+
`, {
|
|
3164
|
+
bestEffort: false
|
|
3165
|
+
});
|
|
3166
|
+
} catch (err) {
|
|
3167
|
+
recordDegradationOnce({
|
|
3168
|
+
kind: "pip-constraint-file-unwritable",
|
|
3169
|
+
subject: toolId,
|
|
3170
|
+
reason: `${file}: ${err instanceof Error ? err.message : String(err)}`
|
|
3171
|
+
});
|
|
3172
|
+
return {};
|
|
3173
|
+
}
|
|
3174
|
+
logSessionStart(`auto-install pip ${toolId}: constraining resolution with ${constraints.join(", ")} (${file})`);
|
|
3175
|
+
return { PIP_CONSTRAINT: file, UV_CONSTRAINT: file };
|
|
3176
|
+
}
|
|
3177
|
+
async function installPipTool(toolId, packageName, binaryName, options = {}) {
|
|
3178
|
+
try {
|
|
3179
|
+
const isWindows = installerPlatform() === "win32";
|
|
3180
|
+
const verb = options.upgrade ? ["install", "-U"] : ["install"];
|
|
3181
|
+
const pipConstraintEnv = await pipConstraintEnvFor(toolId);
|
|
3182
|
+
const pipCandidates = pipCommandCandidates().map((command) => ({
|
|
3183
|
+
command,
|
|
3184
|
+
args: command === "pip" || command === "pip3" ? [...verb, packageName] : ["-m", "pip", ...verb, packageName]
|
|
3185
|
+
}));
|
|
3186
|
+
const pep668 = /externally-managed-environment/i;
|
|
3187
|
+
const refuse = (strategy, reason) => {
|
|
3188
|
+
if (!pep668.test(reason))
|
|
3189
|
+
return;
|
|
3190
|
+
const subject = `${toolId}:${strategy}`;
|
|
3191
|
+
recordDegradationOnce({
|
|
3192
|
+
kind: "pip-pep668-strategy-refused",
|
|
3193
|
+
subject,
|
|
3194
|
+
reason
|
|
3195
|
+
});
|
|
3196
|
+
const logKey = `${getDegradationLedgerGeneration()}:${subject}`;
|
|
3197
|
+
if (pipPep668LoggedRefusals.current(logKey) === 0) {
|
|
3198
|
+
pipPep668LoggedRefusals.bump(logKey);
|
|
3199
|
+
logSessionStart(`auto-install pip ${packageName}: ${strategy} refused by PEP 668 (${boundInstallError(reason)})`);
|
|
2787
3200
|
}
|
|
2788
|
-
|
|
2789
|
-
|
|
2790
|
-
|
|
2791
|
-
|
|
3201
|
+
};
|
|
3202
|
+
const succeeded = (strategy, binaryPath) => {
|
|
3203
|
+
recordDegradationOnce({
|
|
3204
|
+
kind: "pip-install-strategy-succeeded",
|
|
3205
|
+
subject: `${toolId}:${strategy}`,
|
|
3206
|
+
reason: binaryPath
|
|
3207
|
+
});
|
|
3208
|
+
return binaryPath;
|
|
3209
|
+
};
|
|
3210
|
+
const run = (command, args, env) => {
|
|
3211
|
+
const spawnEnv = Object.keys(pipConstraintEnv).length > 0 ? { ...env ?? process.env, ...pipConstraintEnv } : env;
|
|
3212
|
+
return safeSpawnAsync(command, args, {
|
|
2792
3213
|
timeout: 120000,
|
|
2793
3214
|
ignoreAmbientSignal: true,
|
|
2794
|
-
lifetimeCoupled: true
|
|
3215
|
+
lifetimeCoupled: true,
|
|
3216
|
+
cwd: resolveToolCwd("runner", toolId, getGlobalDmLensDir(), {
|
|
3217
|
+
cwd: getGlobalDmLensDir(),
|
|
3218
|
+
suppressTelemetry: true
|
|
3219
|
+
}).cwd,
|
|
3220
|
+
...spawnEnv ? { env: spawnEnv } : {}
|
|
2795
3221
|
});
|
|
2796
|
-
|
|
2797
|
-
|
|
2798
|
-
|
|
2799
|
-
|
|
2800
|
-
|
|
2801
|
-
|
|
3222
|
+
};
|
|
3223
|
+
const addBinToPath = async (binDir) => {
|
|
3224
|
+
try {
|
|
3225
|
+
await fs.access(binDir);
|
|
3226
|
+
} catch {
|
|
3227
|
+
return;
|
|
3228
|
+
}
|
|
3229
|
+
const currentPath = process.env.PATH || process.env.Path || "";
|
|
3230
|
+
const separator = isWindows ? ";" : path.delimiter;
|
|
3231
|
+
if (!currentPath.toLowerCase().split(separator).includes(binDir.toLowerCase())) {
|
|
3232
|
+
const updatedPath = `${binDir}${separator}${currentPath}`;
|
|
3233
|
+
process.env.PATH = updatedPath;
|
|
3234
|
+
if (isWindows)
|
|
3235
|
+
process.env.Path = updatedPath;
|
|
3236
|
+
}
|
|
3237
|
+
const names = isWindows ? [`${binaryName}.exe`, `${binaryName}.cmd`, binaryName] : [binaryName];
|
|
3238
|
+
for (const name of names) {
|
|
3239
|
+
const candidate = path.join(binDir, name);
|
|
3240
|
+
try {
|
|
3241
|
+
await fs.access(candidate);
|
|
3242
|
+
return candidate;
|
|
3243
|
+
} catch {}
|
|
3244
|
+
}
|
|
3245
|
+
return;
|
|
3246
|
+
};
|
|
3247
|
+
if (await isCommandAvailable("pipx")) {
|
|
3248
|
+
const result = await run("pipx", options.upgrade ? ["upgrade", packageName] : ["install", "--force", packageName]);
|
|
3249
|
+
const error = (result.error?.message ?? result.stderr).trim();
|
|
3250
|
+
if (result.status === 0) {
|
|
3251
|
+
const location = await run("pipx", [
|
|
3252
|
+
"environment",
|
|
3253
|
+
"--value",
|
|
3254
|
+
"PIPX_BIN_DIR"
|
|
3255
|
+
]);
|
|
3256
|
+
const binDir = location.status === 0 && location.stdout.trim() ? location.stdout.trim() : path.join(os.homedir(), ".local", "bin");
|
|
3257
|
+
const binaryPath = await addBinToPath(binDir);
|
|
3258
|
+
if (binaryPath)
|
|
3259
|
+
return succeeded("pipx", binaryPath);
|
|
3260
|
+
throw new Error(`pipx installed ${packageName} but ${binaryName} is not resolvable`);
|
|
3261
|
+
}
|
|
3262
|
+
refuse("pipx", error);
|
|
3263
|
+
}
|
|
3264
|
+
const pythonCandidates = pipCandidates.filter(({ command }) => command === "python3" || command === "python" || command === "py");
|
|
3265
|
+
const pythonAvailability = await Promise.all(pythonCandidates.map(({ command }) => isCommandAvailable(command)));
|
|
3266
|
+
const availablePythonCandidates = pythonCandidates.filter((_, index) => pythonAvailability[index]);
|
|
3267
|
+
const venvRoot = path.join(getGlobalDmLensDir(), "pip-tools");
|
|
3268
|
+
for (const candidate of availablePythonCandidates) {
|
|
3269
|
+
const venvBin = pipScriptsDir(venvRoot, installerPlatform());
|
|
3270
|
+
let venvPip = path.join(venvBin, isWindows ? "pip.exe" : "pip");
|
|
3271
|
+
try {
|
|
3272
|
+
await fs.access(venvPip);
|
|
3273
|
+
} catch {
|
|
3274
|
+
const created = await run(candidate.command, ["-m", "venv", venvRoot]);
|
|
3275
|
+
const error = (created.error?.message ?? created.stderr).trim();
|
|
3276
|
+
if (created.status !== 0) {
|
|
3277
|
+
refuse("venv", error || "python venv module unavailable");
|
|
3278
|
+
continue;
|
|
3279
|
+
}
|
|
3280
|
+
}
|
|
3281
|
+
try {
|
|
3282
|
+
await fs.access(venvPip);
|
|
3283
|
+
} catch {
|
|
3284
|
+
venvPip = path.join(venvBin, isWindows ? "pip.cmd" : "pip3");
|
|
3285
|
+
try {
|
|
3286
|
+
await fs.access(venvPip);
|
|
3287
|
+
} catch {
|
|
3288
|
+
continue;
|
|
3289
|
+
}
|
|
3290
|
+
}
|
|
3291
|
+
const result = await run(venvPip, [...verb, packageName]);
|
|
3292
|
+
const error = (result.error?.message ?? result.stderr).trim();
|
|
3293
|
+
if (result.status === 0) {
|
|
3294
|
+
const binaryPath = await addBinToPath(venvBin);
|
|
3295
|
+
if (binaryPath)
|
|
3296
|
+
return succeeded("venv", binaryPath);
|
|
3297
|
+
throw new Error(`venv installed ${packageName} but ${binaryName} is not resolvable`);
|
|
3298
|
+
}
|
|
3299
|
+
refuse("venv", error);
|
|
3300
|
+
}
|
|
3301
|
+
const candidateErrors = [];
|
|
3302
|
+
let userRefused = false;
|
|
3303
|
+
for (const candidate of pipCandidates) {
|
|
3304
|
+
const args = candidate.command === "pip" || candidate.command === "pip3" ? [...verb, "--user", packageName] : ["-m", "pip", ...verb, "--user", packageName];
|
|
3305
|
+
const result = await run(candidate.command, args);
|
|
3306
|
+
const error = (result.error?.message ?? result.stderr).trim();
|
|
3307
|
+
if (result.status === 0) {
|
|
3308
|
+
const base = await new Promise((resolve) => {
|
|
2802
3309
|
let probe;
|
|
2803
3310
|
try {
|
|
2804
3311
|
probe = spawn(candidate.command, ["-m", "site", "--user-base"], {
|
|
@@ -2809,66 +3316,52 @@ async function installPipTool(packageName, options = {}) {
|
|
|
2809
3316
|
resolve("");
|
|
2810
3317
|
return;
|
|
2811
3318
|
}
|
|
2812
|
-
|
|
2813
|
-
probe.stdout?.on("data", (data) => stdout
|
|
2814
|
-
probe.on("exit", (code) =>
|
|
2815
|
-
if (code === 0)
|
|
2816
|
-
resolve(stdout.trim());
|
|
2817
|
-
else
|
|
2818
|
-
resolve("");
|
|
2819
|
-
});
|
|
3319
|
+
const stdout = createBoundedOutputSink();
|
|
3320
|
+
probe.stdout?.on("data", (data) => stdout.append(data));
|
|
3321
|
+
probe.on("exit", (code) => resolve(userBaseProbeResult(candidate.command, code, stdout)));
|
|
2820
3322
|
probe.on("error", () => resolve(""));
|
|
2821
3323
|
});
|
|
2822
|
-
|
|
2823
|
-
|
|
2824
|
-
|
|
2825
|
-
|
|
2826
|
-
|
|
2827
|
-
|
|
2828
|
-
|
|
2829
|
-
|
|
2830
|
-
});
|
|
2831
|
-
for (const entry of children) {
|
|
2832
|
-
if (!entry.isDirectory())
|
|
2833
|
-
continue;
|
|
2834
|
-
if (!/^python\d+$/i.test(entry.name))
|
|
2835
|
-
continue;
|
|
2836
|
-
candidateScriptDirs.push(path.join(userBaseResult, entry.name, "Scripts"));
|
|
2837
|
-
}
|
|
2838
|
-
} catch {}
|
|
2839
|
-
}
|
|
2840
|
-
const currentPath = process.env.PATH || process.env.Path || process.env.path || "";
|
|
2841
|
-
const separator = isWindows ? ";" : ":";
|
|
2842
|
-
const normalizedPath = currentPath.toLowerCase().split(separator).map((p) => p.trim());
|
|
2843
|
-
for (const scriptsDir of candidateScriptDirs) {
|
|
2844
|
-
try {
|
|
2845
|
-
await fs.access(scriptsDir);
|
|
2846
|
-
if (!normalizedPath.includes(scriptsDir.toLowerCase())) {
|
|
2847
|
-
const existingPath = process.env.PATH || process.env.Path || process.env.path || "";
|
|
2848
|
-
const updatedPath = `${scriptsDir}${separator}${existingPath}`;
|
|
2849
|
-
process.env.PATH = updatedPath;
|
|
2850
|
-
if (isWindows) {
|
|
2851
|
-
process.env.Path = updatedPath;
|
|
2852
|
-
}
|
|
2853
|
-
debugLog(`Added pip user scripts dir to PATH: ${scriptsDir}`);
|
|
2854
|
-
}
|
|
2855
|
-
} catch {
|
|
2856
|
-
debugLog(`pip user scripts dir not accessible: ${scriptsDir}`);
|
|
2857
|
-
}
|
|
2858
|
-
}
|
|
2859
|
-
}
|
|
2860
|
-
return packageName;
|
|
3324
|
+
const binaryPath = base ? await addBinToPath(pipScriptsDir(base, installerPlatform())) : undefined;
|
|
3325
|
+
return succeeded("user", binaryPath ?? packageName);
|
|
3326
|
+
}
|
|
3327
|
+
const candidateError = `${candidate.command} ${args.join(" ")}: ${boundInstallError(error, INSTALL_CANDIDATE_ERROR_LIMIT)}`;
|
|
3328
|
+
candidateErrors.push(candidateError);
|
|
3329
|
+
if (pep668.test(error)) {
|
|
3330
|
+
userRefused = true;
|
|
3331
|
+
refuse("user", error);
|
|
2861
3332
|
}
|
|
2862
|
-
lastError = `${candidate.command} ${candidate.args.join(" ")}: ${outcome.error}`;
|
|
2863
|
-
debugLog(`[pip-fallback] ${lastError}`);
|
|
2864
3333
|
}
|
|
2865
|
-
|
|
3334
|
+
if (!userRefused)
|
|
3335
|
+
throw new Error(`pip install failed: ${candidateErrors.join(" | ") || "unknown error"}`);
|
|
3336
|
+
const privateBase = path.join(getGlobalDmLensDir(), "pip-user");
|
|
3337
|
+
const privateEnv = { ...process.env, PYTHONUSERBASE: privateBase };
|
|
3338
|
+
for (const candidate of pipCandidates) {
|
|
3339
|
+
const args = candidate.command === "pip" || candidate.command === "pip3" ? [...verb, "--user", "--break-system-packages", packageName] : [
|
|
3340
|
+
"-m",
|
|
3341
|
+
"pip",
|
|
3342
|
+
...verb,
|
|
3343
|
+
"--user",
|
|
3344
|
+
"--break-system-packages",
|
|
3345
|
+
packageName
|
|
3346
|
+
];
|
|
3347
|
+
const result = await run(candidate.command, args, privateEnv);
|
|
3348
|
+
const error = (result.error?.message ?? result.stderr).trim();
|
|
3349
|
+
if (result.status !== 0) {
|
|
3350
|
+
const candidateError = `${candidate.command} ${args.join(" ")}: ${boundInstallError(error, INSTALL_CANDIDATE_ERROR_LIMIT)}`;
|
|
3351
|
+
candidateErrors.push(candidateError);
|
|
3352
|
+
continue;
|
|
3353
|
+
}
|
|
3354
|
+
const binaryPath = await addBinToPath(pipScriptsDir(privateBase, installerPlatform()));
|
|
3355
|
+
if (binaryPath)
|
|
3356
|
+
return succeeded("private-prefix", binaryPath);
|
|
3357
|
+
throw new Error(`private-prefix pip installed ${packageName} but ${binaryName} is not resolvable`);
|
|
3358
|
+
}
|
|
3359
|
+
throw new Error(`pip install failed: ${candidateErrors.join(" | ") || "unknown error"}`);
|
|
2866
3360
|
} catch (err) {
|
|
2867
|
-
|
|
2868
|
-
return;
|
|
3361
|
+
return recordPackageManagerInstallException(toolId, "pip", packageName, err);
|
|
2869
3362
|
}
|
|
2870
3363
|
}
|
|
2871
|
-
async function installGemTool(packageName) {
|
|
3364
|
+
async function installGemTool(toolId, packageName) {
|
|
2872
3365
|
try {
|
|
2873
3366
|
const gemResult = await safeSpawnAsync("gem", ["install", packageName, "--no-document"], {
|
|
2874
3367
|
timeout: 120000,
|
|
@@ -2884,8 +3377,7 @@ async function installGemTool(packageName) {
|
|
|
2884
3377
|
}
|
|
2885
3378
|
return packageName;
|
|
2886
3379
|
} catch (err) {
|
|
2887
|
-
|
|
2888
|
-
return;
|
|
3380
|
+
return recordPackageManagerInstallException(toolId, "gem", packageName, err);
|
|
2889
3381
|
}
|
|
2890
3382
|
}
|
|
2891
3383
|
async function stampInstallResolution(toolId) {
|
|
@@ -2934,7 +3426,7 @@ export async function installTool(toolId) {
|
|
|
2934
3426
|
case "npm": {
|
|
2935
3427
|
if (!tool.packageName || !tool.binaryName)
|
|
2936
3428
|
return false;
|
|
2937
|
-
const npmPath = await installNpmTool(tool.packageName, tool.binaryName, tool.checkArgs, getToolVerificationTimeout(tool));
|
|
3429
|
+
const npmPath = await installNpmTool(tool.id, tool.packageName, tool.binaryName, tool.checkArgs, getToolVerificationTimeout(tool), packageEntryVerification(tool));
|
|
2938
3430
|
if (npmPath !== undefined) {
|
|
2939
3431
|
await import("./managed-tool-refresh.js").then((m) => m.stampManagedToolInstalled(tool.id, tool.packageName)).catch(() => {});
|
|
2940
3432
|
}
|
|
@@ -2943,18 +3435,24 @@ export async function installTool(toolId) {
|
|
|
2943
3435
|
case "pip": {
|
|
2944
3436
|
if (!tool.packageName)
|
|
2945
3437
|
return false;
|
|
2946
|
-
const pipPath = await installPipTool(tool.packageName);
|
|
3438
|
+
const pipPath = await installPipTool(tool.id, tool.packageName, tool.binaryName ?? tool.id);
|
|
2947
3439
|
return finishInstallAttempt(tool.id, pipPath !== undefined, startedAt);
|
|
2948
3440
|
}
|
|
2949
3441
|
case "gem": {
|
|
2950
3442
|
if (!tool.packageName)
|
|
2951
3443
|
return false;
|
|
2952
|
-
const gemPath = await installGemTool(tool.packageName);
|
|
3444
|
+
const gemPath = await installGemTool(tool.id, tool.packageName);
|
|
2953
3445
|
return finishInstallAttempt(tool.id, gemPath !== undefined, startedAt);
|
|
2954
3446
|
}
|
|
2955
3447
|
case "github": {
|
|
2956
3448
|
if (!tool.github)
|
|
2957
3449
|
return false;
|
|
3450
|
+
if (!tool.github.assetMatch(process.platform, process.arch)) {
|
|
3451
|
+
const reason = `unsupported platform=${process.platform} arch=${process.arch}`;
|
|
3452
|
+
noteInstallAttempt(tool.id, "unavailable", reason);
|
|
3453
|
+
logSessionStart(`auto-install ${tool.id}: ${reason}`);
|
|
3454
|
+
return false;
|
|
3455
|
+
}
|
|
2958
3456
|
const ghPath = await installGitHubTool(tool);
|
|
2959
3457
|
return finishInstallAttempt(tool.id, ghPath !== undefined, startedAt);
|
|
2960
3458
|
}
|
|
@@ -2967,6 +3465,12 @@ export async function installTool(toolId) {
|
|
|
2967
3465
|
case "archive": {
|
|
2968
3466
|
if (!tool.archive)
|
|
2969
3467
|
return false;
|
|
3468
|
+
if (!resolveArchiveUrl(tool.archive)) {
|
|
3469
|
+
const reason = `unsupported platform=${process.platform} arch=${process.arch}`;
|
|
3470
|
+
noteInstallAttempt(tool.id, "unavailable", reason);
|
|
3471
|
+
logSessionStart(`auto-install ${tool.id}: ${reason}`);
|
|
3472
|
+
return false;
|
|
3473
|
+
}
|
|
2970
3474
|
const archivePath = await installArchiveTool(tool);
|
|
2971
3475
|
return finishInstallAttempt(tool.id, archivePath !== undefined, startedAt);
|
|
2972
3476
|
}
|
|
@@ -3191,6 +3695,8 @@ export function getToolInstallStrategy(toolId) {
|
|
|
3191
3695
|
return TOOLS.find((tool) => tool.id === toolId)?.installStrategy;
|
|
3192
3696
|
}
|
|
3193
3697
|
export const GITHUB_TOOLS = [
|
|
3698
|
+
"cljfmt",
|
|
3699
|
+
"php-cs-fixer",
|
|
3194
3700
|
"shellcheck",
|
|
3195
3701
|
"shfmt",
|
|
3196
3702
|
"rust-analyzer",
|
|
@@ -3213,6 +3719,8 @@ export const GITHUB_TOOLS = [
|
|
|
3213
3719
|
"clojure-lsp",
|
|
3214
3720
|
"cue",
|
|
3215
3721
|
"gleam",
|
|
3722
|
+
"typstyle",
|
|
3723
|
+
"tinymist",
|
|
3216
3724
|
"marksman",
|
|
3217
3725
|
"expert"
|
|
3218
3726
|
];
|
|
@@ -3220,6 +3728,10 @@ export function resolveGitHubAsset(toolId, platform, arch) {
|
|
|
3220
3728
|
const tool = TOOLS.find((t) => t.id === toolId);
|
|
3221
3729
|
return tool?.github?.assetMatch(platform, arch);
|
|
3222
3730
|
}
|
|
3731
|
+
export function resolveGitHubAssetLauncher(toolId, _platform, assetName) {
|
|
3732
|
+
const tool = TOOLS.find((t) => t.id === toolId);
|
|
3733
|
+
return tool?.github ? launcherForGitHubAsset(tool.github, assetName) : undefined;
|
|
3734
|
+
}
|
|
3223
3735
|
export function resolveGitHubInstalledBinaryName(toolId, platform, assetName) {
|
|
3224
3736
|
const tool = TOOLS.find((t) => t.id === toolId);
|
|
3225
3737
|
if (!tool)
|