@herbertgao/pi-extensions 2026.9.1 → 2026.9.3
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 +3 -2
- package/THIRD_PARTY_NOTICES.md +24 -0
- package/node_modules/@herbertgao/sol-pi/LICENSE +19 -0
- package/node_modules/@herbertgao/sol-pi/README.md +159 -0
- package/node_modules/@herbertgao/sol-pi/SECURITY.md +26 -0
- package/node_modules/@herbertgao/sol-pi/THIRD_PARTY_NOTICES.md +19 -0
- package/node_modules/@herbertgao/sol-pi/agents-install.md +150 -0
- package/node_modules/@herbertgao/sol-pi/assets/sol-pi-hero.png +0 -0
- package/node_modules/@herbertgao/sol-pi/docs/compatibility.md +69 -0
- package/node_modules/@herbertgao/sol-pi/docs/configuration.md +75 -0
- package/node_modules/@herbertgao/sol-pi/package.json +76 -0
- package/node_modules/@herbertgao/sol-pi/scripts/check-pi-compat.mjs +32 -0
- package/node_modules/@herbertgao/sol-pi/scripts/check-sol-pi-config.mjs +120 -0
- package/node_modules/@herbertgao/sol-pi/sol-pi.example.json +10 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/config.ts +135 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/file-queue.ts +74 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/index.ts +185 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/then-run.ts +128 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/evidence-preserving-reducer/archive.ts +53 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/evidence-preserving-reducer/candidate.ts +101 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/evidence-preserving-reducer/config.ts +71 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/evidence-preserving-reducer/index.ts +220 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/evidence-preserving-reducer/journal.ts +25 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/evidence-preserving-reducer/provider.ts +164 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/evidence-preserving-reducer/receipt.ts +177 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/observation-pack/index.ts +227 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/observation-pack/ledger.ts +20 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/observation-pack/observation.ts +252 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/economics.ts +237 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/extension.ts +455 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/index.ts +49 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/plan.ts +79 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/state.ts +208 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/tools.ts +100 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/index.ts +42 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/runtime-paths.ts +17 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/tui.ts +71 -0
- package/node_modules/@narumitw/pi-btw/README.md +57 -141
- package/node_modules/@narumitw/pi-btw/dist/index.ts +478 -43
- package/node_modules/@narumitw/pi-btw/dist/index.ts.map +4 -4
- package/node_modules/@narumitw/pi-btw/docs/workflows.md +74 -0
- package/node_modules/@narumitw/pi-btw/package.json +2 -1
- package/node_modules/@narumitw/pi-btw/src/btw.ts +28 -3
- package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +32 -2
- package/node_modules/@narumitw/pi-btw/src/keybindings.ts +330 -0
- package/node_modules/@narumitw/pi-btw/src/menu.ts +136 -19
- package/node_modules/@narumitw/pi-btw/src/settings.ts +32 -0
- package/node_modules/@narumitw/pi-btw/src/side-thread.ts +57 -5
- package/node_modules/@narumitw/pi-btw/src/transcript-pager.ts +52 -30
- package/node_modules/pi-lens/CHANGELOG.md +260 -0
- package/node_modules/pi-lens/README.md +13 -8
- package/node_modules/pi-lens/config/dependency-cruiser-eager-allowlist.json +3 -1
- package/node_modules/pi-lens/dist/clients/actionable-warnings-logger.js +0 -7
- package/node_modules/pi-lens/dist/clients/advisory-provenance.js +1 -1
- package/node_modules/pi-lens/dist/clients/analysed-root.js +1 -0
- package/node_modules/pi-lens/dist/clients/ast-grep-client.js +1 -1
- package/node_modules/pi-lens/dist/clients/ast-grep-tool-logger.js +1 -8
- package/node_modules/pi-lens/dist/clients/ast-grep-types.js +2 -0
- package/node_modules/pi-lens/dist/clients/bash-file-access.js +133 -1
- package/node_modules/pi-lens/dist/clients/biome-client.js +13 -2
- package/node_modules/pi-lens/dist/clients/blocker-freshness.js +0 -6
- package/node_modules/pi-lens/dist/clients/bootstrap.js +4 -4
- package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +1 -1
- package/node_modules/pi-lens/dist/clients/bounded-telemetry.js +2 -5
- package/node_modules/pi-lens/dist/clients/bus-events-logger.js +1 -9
- package/node_modules/pi-lens/dist/clients/cache-observability.js +122 -6
- package/node_modules/pi-lens/dist/clients/cargo-manifest.js +2 -2
- package/node_modules/pi-lens/dist/clients/cascade-logger.js +0 -7
- package/node_modules/pi-lens/dist/clients/child-unref.js +1 -19
- package/node_modules/pi-lens/dist/clients/complexity-client.js +5 -0
- package/node_modules/pi-lens/dist/clients/config-core/index.js +11 -8
- package/node_modules/pi-lens/dist/clients/config-core/process-spec.js +1 -1
- package/node_modules/pi-lens/dist/clients/config-core/provenance.js +2 -9
- package/node_modules/pi-lens/dist/clients/config-core/records.js +1 -1
- package/node_modules/pi-lens/dist/clients/config-core/schema.js +3 -5
- package/node_modules/pi-lens/dist/clients/config-diagnostic-codes.js +3 -1
- package/node_modules/pi-lens/dist/clients/config-resolve.js +10 -7
- package/node_modules/pi-lens/dist/clients/config-schema.js +56 -2
- package/node_modules/pi-lens/dist/clients/config-warn.js +2 -2
- package/node_modules/pi-lens/dist/clients/dead-code-client.js +8 -1
- package/node_modules/pi-lens/dist/clients/dead-code-logger.js +0 -4
- package/node_modules/pi-lens/dist/clients/dependency-checker.js +5 -1
- package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +1 -1
- package/node_modules/pi-lens/dist/clients/diagnostic-logger.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/collect-later-tier.js +0 -4
- package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +38 -41
- package/node_modules/pi-lens/dist/clients/dispatch/facts/function-facts.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/facts/import-facts.js +5 -1
- package/node_modules/pi-lens/dist/clients/dispatch/integration.js +18 -1
- package/node_modules/pi-lens/dist/clients/dispatch/lazy.js +0 -6
- package/node_modules/pi-lens/dist/clients/dispatch/pending-runner-findings.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/plan.js +0 -3
- package/node_modules/pi-lens/dist/clients/dispatch/rules/high-complexity.js +2 -2
- package/node_modules/pi-lens/dist/clients/dispatch/rules/high-fan-out.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/actionlint.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +2 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +7 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/credo.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cue-vet.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/dart-analyze.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/detekt.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/dotnet-build.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/fish-indent.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/gleam-check.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/go-vet.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/golangci-lint.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-render.js +3 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ktlint.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +19 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +3 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/php-lint.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/prisma-validate.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +15 -11
- package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rubocop.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ruff.js +3 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +12 -11
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +3 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/spellcheck.js +5 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/spotbugs.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +3 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +3 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/swiftlint.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/availability-policy.js +5 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +2 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +1 -64
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +8 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils.js +0 -21
- package/node_modules/pi-lens/dist/clients/dispatch/runners/vale.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +2 -20
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +5 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/utils/format-utils.js +2 -2
- package/node_modules/pi-lens/dist/clients/disposition-logger.js +0 -7
- package/node_modules/pi-lens/dist/clients/effective-config.js +12 -2
- package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +2 -2
- package/node_modules/pi-lens/dist/clients/extension-log.js +2 -0
- package/node_modules/pi-lens/dist/clients/file-kinds.js +1 -38
- package/node_modules/pi-lens/dist/clients/file-role.js +18 -1
- package/node_modules/pi-lens/dist/clients/file-time.js +1 -1
- package/node_modules/pi-lens/dist/clients/file-utils.js +5 -1
- package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +4 -0
- package/node_modules/pi-lens/dist/clients/format-service.js +0 -1
- package/node_modules/pi-lens/dist/clients/formatters.js +66 -93
- package/node_modules/pi-lens/dist/clients/generated-artifacts.js +3 -4
- package/node_modules/pi-lens/dist/clients/generation-guard.js +4 -0
- package/node_modules/pi-lens/dist/clients/git-guard.js +5 -0
- package/node_modules/pi-lens/dist/clients/gitleaks-client.js +42 -6
- package/node_modules/pi-lens/dist/clients/govulncheck-client.js +48 -7
- package/node_modules/pi-lens/dist/clients/grammar-source.js +3 -3
- package/node_modules/pi-lens/dist/clients/installer/index.js +416 -61
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh.js +84 -18
- package/node_modules/pi-lens/dist/clients/instance-reaper.js +6 -6
- package/node_modules/pi-lens/dist/clients/jscpd-client.js +9 -1
- package/node_modules/pi-lens/dist/clients/knip-client.js +9 -2
- package/node_modules/pi-lens/dist/clients/language-profile.js +12 -11
- package/node_modules/pi-lens/dist/clients/language-registry.js +5 -1
- package/node_modules/pi-lens/dist/clients/latency-logger.js +7 -7
- package/node_modules/pi-lens/dist/clients/ledger-bounds.js +21 -1
- package/node_modules/pi-lens/dist/clients/lens-config.js +23 -0
- package/node_modules/pi-lens/dist/clients/lens-engine.js +3 -4
- package/node_modules/pi-lens/dist/clients/lens-events.js +1 -1
- package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +18 -0
- package/node_modules/pi-lens/dist/clients/lens-map.js +1 -1
- package/node_modules/pi-lens/dist/clients/log-cleanup.js +0 -36
- package/node_modules/pi-lens/dist/clients/lsp/client.js +4 -3
- package/node_modules/pi-lens/dist/clients/lsp/config.js +37 -7
- package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +24 -1
- package/node_modules/pi-lens/dist/clients/lsp/document-drift.js +79 -1
- package/node_modules/pi-lens/dist/clients/lsp/edits.js +3 -3
- package/node_modules/pi-lens/dist/clients/lsp/index.js +491 -64
- package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +1 -1
- package/node_modules/pi-lens/dist/clients/lsp/language.js +0 -8
- package/node_modules/pi-lens/dist/clients/lsp/path-utils.js +1 -1
- package/node_modules/pi-lens/dist/clients/lsp/pending-aux-coverage.js +0 -2
- package/node_modules/pi-lens/dist/clients/lsp/server.js +62 -15
- package/node_modules/pi-lens/dist/clients/lsp/sync-kind.js +0 -1
- package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +5 -5
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/classification.js +6 -0
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/strategies.js +2 -1
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +37 -4
- package/node_modules/pi-lens/dist/clients/lsp-document-symbols.js +1 -1
- package/node_modules/pi-lens/dist/clients/mcp/analyze.js +3 -0
- package/node_modules/pi-lens/dist/clients/mcp/session.js +2 -0
- package/node_modules/pi-lens/dist/clients/metrics-history.js +28 -107
- package/node_modules/pi-lens/dist/clients/middle-man-analysis.js +1 -1
- package/node_modules/pi-lens/dist/clients/module-report.js +1 -1
- package/node_modules/pi-lens/dist/clients/mutating-tool.js +3 -3
- package/node_modules/pi-lens/dist/clients/mutation-attribution.js +3 -3
- package/node_modules/pi-lens/dist/clients/ndjson-logger.js +0 -4
- package/node_modules/pi-lens/dist/clients/observed-mutation.js +9 -9
- package/node_modules/pi-lens/dist/clients/opaque-mutation-scan.js +2 -6
- package/node_modules/pi-lens/dist/clients/opengrep-client.js +2 -0
- package/node_modules/pi-lens/dist/clients/opengrep-config.js +1 -1
- package/node_modules/pi-lens/dist/clients/package-manager.js +2 -1
- package/node_modules/pi-lens/dist/clients/path-utils.js +23 -2
- package/node_modules/pi-lens/dist/clients/performance-report.js +2 -2
- package/node_modules/pi-lens/dist/clients/php-cs-fixer-config.js +9 -4
- package/node_modules/pi-lens/dist/clients/pipeline.js +5 -4
- package/node_modules/pi-lens/dist/clients/project-changes.js +1 -1
- package/node_modules/pi-lens/dist/clients/project-diagnostics/extractors.js +1 -1
- package/node_modules/pi-lens/dist/clients/project-diagnostics/fresh-fetch.js +38 -10
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +10 -9
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/jscpd.js +1 -1
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/knip.js +1 -1
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/madge.js +1 -1
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/opengrep.js +1 -1
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +1 -1
- package/node_modules/pi-lens/dist/clients/project-lens-config.js +49 -1
- package/node_modules/pi-lens/dist/clients/project-scan-policy.js +3 -51
- package/node_modules/pi-lens/dist/clients/python-provenance.js +1 -1
- package/node_modules/pi-lens/dist/clients/read-guard-logger.js +3 -1
- package/node_modules/pi-lens/dist/clients/read-guard.js +5 -2
- package/node_modules/pi-lens/dist/clients/recent-touches.js +2 -2
- package/node_modules/pi-lens/dist/clients/review-graph/builder.js +3 -5
- package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +1 -1
- package/node_modules/pi-lens/dist/clients/review-graph-logger.js +2 -0
- package/node_modules/pi-lens/dist/clients/ruff-client.js +18 -9
- package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +10 -1
- package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +5 -0
- package/node_modules/pi-lens/dist/clients/runtime-session.js +58 -14
- package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +11 -1
- package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +4 -1
- package/node_modules/pi-lens/dist/clients/runtime-turn.js +48 -1
- package/node_modules/pi-lens/dist/clients/sanitize.js +0 -11
- package/node_modules/pi-lens/dist/clients/scan-utils.js +1 -56
- package/node_modules/pi-lens/dist/clients/security-scan-client.js +2 -2
- package/node_modules/pi-lens/dist/clients/session-event-guard.js +69 -1
- package/node_modules/pi-lens/dist/clients/session-summary.js +0 -24
- package/node_modules/pi-lens/dist/clients/sg-runner.js +2 -1
- package/node_modules/pi-lens/dist/clients/sgconfig.js +1 -5
- package/node_modules/pi-lens/dist/clients/shared-checkout-guard.js +1 -1
- package/node_modules/pi-lens/dist/clients/situational-tool-telemetry.js +108 -0
- package/node_modules/pi-lens/dist/clients/smells-rollup.js +2 -2
- package/node_modules/pi-lens/dist/clients/startup-scan.js +2 -10
- package/node_modules/pi-lens/dist/clients/test-runner-client.js +291 -76
- package/node_modules/pi-lens/dist/clients/test-runner-delivery.js +77 -72
- package/node_modules/pi-lens/dist/clients/tool-config.js +199 -0
- package/node_modules/pi-lens/dist/clients/tool-cwd.js +299 -0
- package/node_modules/pi-lens/dist/clients/tool-policy.js +1 -1
- package/node_modules/pi-lens/dist/clients/tool-probe.js +53 -0
- package/node_modules/pi-lens/dist/clients/tool-set-policy.js +42 -0
- package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +1 -52
- package/node_modules/pi-lens/dist/clients/trivy-client.js +9 -1
- package/node_modules/pi-lens/dist/clients/tui-fit.js +0 -4
- package/node_modules/pi-lens/dist/clients/turn-context.js +52 -0
- package/node_modules/pi-lens/dist/clients/user-notify.js +0 -4
- package/node_modules/pi-lens/dist/clients/widget-state.js +4 -3
- package/node_modules/pi-lens/dist/clients/word-index-logger.js +0 -7
- package/node_modules/pi-lens/dist/clients/word-index-store.js +3 -7
- package/node_modules/pi-lens/dist/clients/word-index.js +9 -16
- package/node_modules/pi-lens/dist/clients/zizmor-config.js +1 -1
- package/node_modules/pi-lens/dist/index.js +19969 -17481
- package/node_modules/pi-lens/dist/mcp/analyze-cli.js +3 -2
- package/node_modules/pi-lens/dist/mcp/build-staleness.js +1 -1
- package/node_modules/pi-lens/dist/mcp/server.js +135 -159
- package/node_modules/pi-lens/dist/scripts/lib/process-scan.mjs +1 -1
- package/node_modules/pi-lens/dist/scripts/lib/skills-predicate.mjs +1 -1
- package/node_modules/pi-lens/dist/tools/activate-tools.js +10 -7
- package/node_modules/pi-lens/dist/tools/ast-grep-outline.js +2 -13
- package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +8 -13
- package/node_modules/pi-lens/dist/tools/ast-grep-search.js +83 -39
- package/node_modules/pi-lens/dist/tools/effective-config.js +4 -3
- package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +1 -10
- package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +354 -86
- package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +54 -112
- package/node_modules/pi-lens/dist/tools/lsp-navigation.js +20 -44
- package/node_modules/pi-lens/dist/tools/lsp-structured-output.js +3 -3
- package/node_modules/pi-lens/dist/tools/module-report.js +5 -9
- package/node_modules/pi-lens/dist/tools/project-report.js +9 -17
- package/node_modules/pi-lens/dist/tools/render-compact.js +281 -2
- package/node_modules/pi-lens/dist/tools/symbol-search.js +3 -4
- package/node_modules/pi-lens/docs/agent-guide.md +3 -4
- package/node_modules/pi-lens/docs/agent-tools.md +46 -22
- package/node_modules/pi-lens/docs/configuration.md +9 -0
- package/node_modules/pi-lens/docs/environment-variables.md +0 -5
- package/node_modules/pi-lens/docs/features.md +5 -5
- package/node_modules/pi-lens/docs/globalconfig.md +31 -1
- package/node_modules/pi-lens/docs/lsp-capability-matrix.md +9 -1
- package/node_modules/pi-lens/docs/mcp.md +13 -1
- package/node_modules/pi-lens/docs/pi-lens-fixer.md +71 -0
- package/node_modules/pi-lens/docs/pi-lens-investigator.md +15 -0
- package/node_modules/pi-lens/docs/pi-lens-monitor.md +88 -0
- package/node_modules/pi-lens/docs/pi-lens-reviewer.md +41 -0
- package/node_modules/pi-lens/docs/pi-lens-subagent.md +21 -2
- package/node_modules/pi-lens/docs/public-api-stability.md +1 -0
- package/node_modules/pi-lens/docs/real-harness.md +46 -0
- package/node_modules/pi-lens/docs/release-qa-baseline.md +17 -5
- package/node_modules/pi-lens/docs/servercapabilities.md +2 -3
- package/node_modules/pi-lens/docs/settings.md +37 -2
- package/node_modules/pi-lens/docs/tools_improvement2.md +4 -4
- package/node_modules/pi-lens/docs/tree-sitter_rules_catalog.md +1 -1
- package/node_modules/pi-lens/docs/usage.md +13 -3
- package/node_modules/pi-lens/docs/word-index.md +1 -1
- package/node_modules/pi-lens/package.json +15 -15
- package/node_modules/pi-lens/rules/tree-sitter-queries/typescript/sql-injection.yml +7 -3
- package/node_modules/pi-lens/rules/typos/_typos.toml +4 -2
- package/node_modules/pi-lens/scripts/lib/skills-predicate.mjs +1 -1
- package/node_modules/pi-lens/scripts/lib/warm-loader-cache.mjs +1 -1
- package/node_modules/pi-lens/scripts/warm-loader-cache.mjs +4 -2
- package/node_modules/pi-lens/skills/pi-lens-ast-grep/SKILL.md +8 -6
- package/node_modules/pi-lens/skills/pi-lens-lsp-navigation/SKILL.md +19 -9
- package/node_modules/pi-web-access/CHANGELOG.md +29 -0
- package/node_modules/pi-web-access/README.md +33 -22
- package/node_modules/pi-web-access/abortable.ts +17 -0
- package/node_modules/pi-web-access/crawl4ai.ts +204 -0
- package/node_modules/pi-web-access/credential-source.ts +1 -0
- package/node_modules/pi-web-access/curator-page.ts +20 -2
- package/node_modules/pi-web-access/curator-run.ts +44 -0
- package/node_modules/pi-web-access/curator-server.ts +3 -1
- package/node_modules/pi-web-access/duckduckgo.ts +1 -1
- package/node_modules/pi-web-access/extract.ts +57 -12
- package/node_modules/pi-web-access/fetch-params.ts +1 -1
- package/node_modules/pi-web-access/gemini-search.ts +9 -5
- package/node_modules/pi-web-access/index.ts +25 -18
- package/node_modules/pi-web-access/openai-search.ts +35 -13
- package/node_modules/pi-web-access/package.json +2 -2
- package/node_modules/pi-web-access/page-query.ts +5 -2
- package/node_modules/pi-web-access/query-rewrite.ts +5 -2
- package/node_modules/pi-web-access/serpapi.ts +220 -0
- package/node_modules/pi-web-access/ssrf-protection.ts +5 -1
- package/node_modules/pi-web-access/storage.ts +10 -0
- package/node_modules/pi-web-access/summary-review.ts +34 -21
- package/node_modules/pi-web-access/utils.ts +6 -4
- package/package.json +7 -4
- package/node_modules/pi-lens/dist/tools/ast-dump.js +0 -103
|
@@ -1173,7 +1173,7 @@ export function resolveConfigurationSection(initialization, section) {
|
|
|
1173
1173
|
// Exported (only) so tests can invoke the publishDiagnostics notification
|
|
1174
1174
|
// handler directly against a mock LSPClientState/connection without spawning
|
|
1175
1175
|
// a real language server. Not part of the public client API surface.
|
|
1176
|
-
export function setupIncomingHandlers(state, initialization) {
|
|
1176
|
+
export function setupIncomingHandlers(state, initialization, onDiagnosticsPublished) {
|
|
1177
1177
|
state.connection.onNotification("textDocument/publishDiagnostics", (params) => {
|
|
1178
1178
|
// #1639: the settle operation's own clock for THIS publish. A
|
|
1179
1179
|
// "quiet-window" settle's durationMs below measures from here (when
|
|
@@ -1188,6 +1188,7 @@ export function setupIncomingHandlers(state, initialization) {
|
|
|
1188
1188
|
// that is no longer open on this client.
|
|
1189
1189
|
if (state.closedDocuments?.has(normalizedPath))
|
|
1190
1190
|
return;
|
|
1191
|
+
onDiagnosticsPublished?.(state.serverId);
|
|
1191
1192
|
const newDiags = normalizeLspDiagnostics(params.diagnostics || []);
|
|
1192
1193
|
const docVersion = params.version;
|
|
1193
1194
|
if (PUB_DEBUG) {
|
|
@@ -3498,7 +3499,7 @@ async function resolveCodeActionBestEffort(state, action) {
|
|
|
3498
3499
|
// --- Client Factory ---
|
|
3499
3500
|
export async function createLSPClient(options) {
|
|
3500
3501
|
installCrashGuard();
|
|
3501
|
-
const { serverId, process: lspProcess, root, sessionCwd, initialization, initializeTimeoutMs = INITIALIZE_TIMEOUT_MS, launchVariant, } = options;
|
|
3502
|
+
const { serverId, process: lspProcess, root, sessionCwd, initialization, initializeTimeoutMs = INITIALIZE_TIMEOUT_MS, launchVariant, onDiagnosticsPublished, } = options;
|
|
3502
3503
|
// #449/#472: register this LSP child in the cross-process instance registry
|
|
3503
3504
|
// as soon as we have a live pid — BEFORE `initialize` completes, not after.
|
|
3504
3505
|
// Registering early means a child that dies/hangs during initialize (the
|
|
@@ -3671,7 +3672,7 @@ export async function createLSPClient(options) {
|
|
|
3671
3672
|
return;
|
|
3672
3673
|
void safeSendNotification(state.connection, "workspace/didChangeWatchedFiles", { changes });
|
|
3673
3674
|
});
|
|
3674
|
-
setupIncomingHandlers(state, initialization);
|
|
3675
|
+
setupIncomingHandlers(state, initialization, onDiagnosticsPublished);
|
|
3675
3676
|
connection.listen();
|
|
3676
3677
|
setupConnectionLifecycle(state, recentStderr);
|
|
3677
3678
|
let initResult;
|
|
@@ -63,10 +63,11 @@ import { getGlobalPiLensDir } from "../file-utils.js";
|
|
|
63
63
|
import { claimPhaseOncePerSession, currentSessionRecordId, logLatency, releaseOncePerSessionPhase, releasePhaseClaim, } from "../latency-logger.js";
|
|
64
64
|
import { getPiLensGlobalConfigPath } from "../lens-config.js";
|
|
65
65
|
import { normalizeFilePath } from "../path-utils.js";
|
|
66
|
+
import { resolveToolCwd } from "../tool-cwd.js";
|
|
66
67
|
import { logSessionStart } from "../sessionstart-logger.js";
|
|
67
68
|
import { launchLSP } from "./launch.js";
|
|
68
69
|
import { registerSessionRoot, resetSessionRootsForTests, sessionRootConfigEntries, setSessionRootConfig, } from "./session-roots.js";
|
|
69
|
-
import {
|
|
70
|
+
import { LSP_SERVERS, resetLSPCaseSensitivityState, resolveLspServerCwd, } from "./server.js";
|
|
70
71
|
// --- Config Loading ---
|
|
71
72
|
/**
|
|
72
73
|
* For tests that need to force the warn-once cache to reset between cases —
|
|
@@ -336,10 +337,15 @@ export function createCustomServer(config, id) {
|
|
|
336
337
|
return {
|
|
337
338
|
id,
|
|
338
339
|
name: config.name,
|
|
340
|
+
custom: true,
|
|
339
341
|
extensions: config.extensions,
|
|
342
|
+
...(config.rootMarkers ? { rootMarkers: config.rootMarkers } : {}),
|
|
340
343
|
root: config.rootMarkers
|
|
341
|
-
?
|
|
342
|
-
|
|
344
|
+
? async (file) => resolveToolCwd("lsp", id, file, {
|
|
345
|
+
cwd: process.cwd(),
|
|
346
|
+
...(config.rootMarkers ? { rootMarkers: config.rootMarkers } : {}),
|
|
347
|
+
})
|
|
348
|
+
: async (file) => resolveToolCwd("lsp", id, file, { cwd: process.cwd() }),
|
|
343
349
|
async spawn(root) {
|
|
344
350
|
const proc = await launchLSP(config.command, config.args ?? ["--stdio"], {
|
|
345
351
|
cwd: root,
|
|
@@ -599,12 +605,21 @@ export function getServersForFileWithConfig(filePath) {
|
|
|
599
605
|
const base = path.basename(filePath).toLowerCase();
|
|
600
606
|
return registeredServers(config).filter((server) => selectionReason(server, config, filePath, ext, base) === "selected");
|
|
601
607
|
}
|
|
608
|
+
/**
|
|
609
|
+
* The primary language server ENTRY for a file — the one "first non-auxiliary
|
|
610
|
+
* server" predicate, shared by {@link primaryServerId} and
|
|
611
|
+
* {@link resolveLspCwdForFile} so the id-level and entry-level consumers
|
|
612
|
+
* cannot drift. `role` is only ever set to "auxiliary" on cross-cutting
|
|
613
|
+
* scanner entries (ast-grep, opengrep, zizmor, typos, marksman, ...) — see
|
|
614
|
+
* clients/lsp/server.ts; undefined here means a real language server.
|
|
615
|
+
*/
|
|
616
|
+
function primaryServerEntry(filePath) {
|
|
617
|
+
return getServersForFileWithConfig(filePath).find((s) => s.role !== "auxiliary");
|
|
618
|
+
}
|
|
602
619
|
/**
|
|
603
620
|
* The primary language server for a file (e.g. "typescript"), as opposed to a
|
|
604
621
|
* cross-cutting auxiliary scanner attached via clientScope "all"/
|
|
605
|
-
* "with-auxiliary" (ast-grep, opengrep, zizmor, typos, marksman, ...).
|
|
606
|
-
* is only ever set to "auxiliary" on those auxiliary entries (see
|
|
607
|
-
* clients/lsp/server.ts) — undefined means a real language server. Used to
|
|
622
|
+
* "with-auxiliary" (ast-grep, opengrep, zizmor, typos, marksman, ...). Used to
|
|
608
623
|
* split a file's diagnostics into "primary confirmation" vs "auxiliary
|
|
609
624
|
* findings" so a page of ast-grep/opengrep/marksman noise never buries
|
|
610
625
|
* whether the actual type checker/compiler confirmed the file clean.
|
|
@@ -615,7 +630,22 @@ export function getServersForFileWithConfig(filePath) {
|
|
|
615
630
|
* now report the same primary-vs-auxiliary split for the same file.
|
|
616
631
|
*/
|
|
617
632
|
export function primaryServerId(filePath) {
|
|
618
|
-
return
|
|
633
|
+
return primaryServerEntry(filePath)?.id;
|
|
634
|
+
}
|
|
635
|
+
/**
|
|
636
|
+
* #2777 O1: the one seam a tool uses to answer "which cwd did this file's
|
|
637
|
+
* primary LSP server resolve to". Folds the three-step lookup callers used to
|
|
638
|
+
* hand-roll (`primaryServerId` + `getServersForFileWithConfig` +
|
|
639
|
+
* `resolveLspServerCwd`) into one call that returns `undefined` for a file
|
|
640
|
+
* with no primary LSP server, so the caller must handle the absent case
|
|
641
|
+
* instead of rendering it (the N1 `cwd=undefined` row becomes structurally
|
|
642
|
+
* impossible).
|
|
643
|
+
*/
|
|
644
|
+
export async function resolveLspCwdForFile(filePath, sessionCwd) {
|
|
645
|
+
const primary = primaryServerEntry(filePath);
|
|
646
|
+
if (!primary)
|
|
647
|
+
return undefined;
|
|
648
|
+
return resolveLspServerCwd(primary, filePath, sessionCwd);
|
|
619
649
|
}
|
|
620
650
|
/**
|
|
621
651
|
* Look up an initializationOptions override for a built-in server.
|
|
@@ -73,6 +73,27 @@ export function touchCoverageGap(result) {
|
|
|
73
73
|
export function touchCompletedConfirmationPolicy(result) {
|
|
74
74
|
return result?.confirmation !== undefined;
|
|
75
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* #2878: one publication-evidence predicate for auxiliary coverage. A
|
|
78
|
+
* content-hash binding proves that the stored publication describes these
|
|
79
|
+
* bytes. For a version-less publisher, an advanced per-path publication stamp
|
|
80
|
+
* proves that the auxiliary published after this touch's pre-notify baseline;
|
|
81
|
+
* the stamp alone cannot prove that the bytes matched. The pre-notify boolean
|
|
82
|
+
* passed as `bindingMatchesContent` preserves a binding that the notify
|
|
83
|
+
* cleared, while the live stamp covers a publication that landed after the
|
|
84
|
+
* wait began. This predicate is the union. Four callers use it; only the
|
|
85
|
+
* demoted row's `publishedThisContent` takes the union — the sibling and
|
|
86
|
+
* aggregate rows compute that field from `auxCoversThisContent` directly
|
|
87
|
+
* (#2914), while their `outcome` field still reads the stamp through this
|
|
88
|
+
* predicate. Absent evidence fails closed.
|
|
89
|
+
*/
|
|
90
|
+
export function auxiliaryPublicationEvidence({ bindingMatchesContent, baseline, currentPathVersion, raced = true, }) {
|
|
91
|
+
return (bindingMatchesContent ||
|
|
92
|
+
(raced &&
|
|
93
|
+
Number.isFinite(baseline) &&
|
|
94
|
+
currentPathVersion !== undefined &&
|
|
95
|
+
currentPathVersion > baseline));
|
|
96
|
+
}
|
|
76
97
|
/**
|
|
77
98
|
* #1493: the single policy deciding which auxiliaries a touch carries NO
|
|
78
99
|
* evidence from. Both no-answer shapes belong here, because they are the same
|
|
@@ -106,7 +127,9 @@ export function touchCompletedConfirmationPolicy(result) {
|
|
|
106
127
|
* irrelevant once a verified publication for them exists. Exempting `silent` but
|
|
107
128
|
* not `cut_off` on identical evidence would report the same coverage two ways
|
|
108
129
|
* depending on which timer happened to win. This stays fail-closed — it
|
|
109
|
-
* un-narrows only against
|
|
130
|
+
* un-narrows only against publication evidence (content-hash match, or an
|
|
131
|
+
* advanced per-path publication stamp for version-less publishers), never
|
|
132
|
+
* against a timer.
|
|
110
133
|
*/
|
|
111
134
|
export function auxiliaryCoverageGap(evidence) {
|
|
112
135
|
return evidence
|
|
@@ -88,7 +88,7 @@ const SKIPPED = {
|
|
|
88
88
|
tracked: 0,
|
|
89
89
|
};
|
|
90
90
|
/** Documents stat'd per pass. Bounds the per-pass cost on a large workspace. */
|
|
91
|
-
|
|
91
|
+
const DRIFT_CHECK_BATCH = 64;
|
|
92
92
|
/** Resyncs issued per pass. Paces the heal so a bulk edit cannot burst. */
|
|
93
93
|
export const DRIFT_RESYNC_BATCH = 4;
|
|
94
94
|
/** Tracked-document ceiling. A workspace sweep can open far more than this. */
|
|
@@ -106,6 +106,8 @@ export function driftCheckIntervalMs() {
|
|
|
106
106
|
export class DocumentDriftTracker {
|
|
107
107
|
/** Insertion-ordered; the sweep cursor walks it round-robin. */
|
|
108
108
|
synced = new Map();
|
|
109
|
+
/** Git/external recovery targets waiting for the same paced resync budget. */
|
|
110
|
+
pendingResync = new Set();
|
|
109
111
|
lastSweepAt = 0;
|
|
110
112
|
cursor = 0;
|
|
111
113
|
/**
|
|
@@ -123,6 +125,15 @@ export class DocumentDriftTracker {
|
|
|
123
125
|
peek(filePath) {
|
|
124
126
|
return this.synced.get(normalizeMapKey(filePath));
|
|
125
127
|
}
|
|
128
|
+
/** Queue known-open targets for the next ordinary paced drift pass. */
|
|
129
|
+
enqueueResync(filePaths) {
|
|
130
|
+
for (const filePath of filePaths) {
|
|
131
|
+
this.pendingResync.add(normalizeMapKey(filePath));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
get pendingResyncCount() {
|
|
135
|
+
return this.pendingResync.size;
|
|
136
|
+
}
|
|
126
137
|
/**
|
|
127
138
|
* Record content that landed on EVERY server holding this document.
|
|
128
139
|
*
|
|
@@ -154,6 +165,7 @@ export class DocumentDriftTracker {
|
|
|
154
165
|
/** Drop every record. Used on shutdown/session reset, where the server's view dies with it. */
|
|
155
166
|
clear() {
|
|
156
167
|
this.synced.clear();
|
|
168
|
+
this.pendingResync.clear();
|
|
157
169
|
this.cursor = 0;
|
|
158
170
|
this.lastSweepAt = 0;
|
|
159
171
|
this.flight.clear();
|
|
@@ -270,11 +282,77 @@ export class DocumentDriftTracker {
|
|
|
270
282
|
mtimeMs: entry.stat.mtimeMs,
|
|
271
283
|
});
|
|
272
284
|
}
|
|
285
|
+
const queued = [...this.pendingResync];
|
|
286
|
+
for (const key of queued) {
|
|
287
|
+
if (deps.holdsDocument && !deps.holdsDocument(key)) {
|
|
288
|
+
this.pendingResync.delete(key);
|
|
289
|
+
unheld += 1;
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
273
293
|
let resynced = 0;
|
|
274
294
|
let failed = 0;
|
|
275
295
|
let unchanged = 0;
|
|
276
296
|
let deferred = 0;
|
|
297
|
+
const resyncedKeys = new Set();
|
|
298
|
+
for (const key of queued) {
|
|
299
|
+
if (!this.pendingResync.has(key))
|
|
300
|
+
continue;
|
|
301
|
+
if (resynced >= DRIFT_RESYNC_BATCH) {
|
|
302
|
+
deferred += 1;
|
|
303
|
+
deps.onDrift?.({
|
|
304
|
+
filePath: key,
|
|
305
|
+
driftAgeMs: 0,
|
|
306
|
+
disposition: "deferred",
|
|
307
|
+
syncedSize: this.synced.get(key)?.size ?? 0,
|
|
308
|
+
diskSize: -1,
|
|
309
|
+
});
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
let content;
|
|
313
|
+
try {
|
|
314
|
+
content = await read(key);
|
|
315
|
+
}
|
|
316
|
+
catch {
|
|
317
|
+
this.pendingResync.delete(key);
|
|
318
|
+
vanished += 1;
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
let landed = false;
|
|
322
|
+
try {
|
|
323
|
+
landed = await deps.resync(key, content, 0);
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
landed = false;
|
|
327
|
+
}
|
|
328
|
+
if (!landed) {
|
|
329
|
+
failed += 1;
|
|
330
|
+
deps.onDrift?.({
|
|
331
|
+
filePath: key,
|
|
332
|
+
driftAgeMs: 0,
|
|
333
|
+
disposition: "failed",
|
|
334
|
+
syncedSize: this.synced.get(key)?.size ?? 0,
|
|
335
|
+
diskSize: Buffer.byteLength(content, "utf8"),
|
|
336
|
+
});
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
this.pendingResync.delete(key);
|
|
340
|
+
resynced += 1;
|
|
341
|
+
resyncedKeys.add(key);
|
|
342
|
+
deps.onDrift?.({
|
|
343
|
+
filePath: key,
|
|
344
|
+
driftAgeMs: 0,
|
|
345
|
+
disposition: "resynced",
|
|
346
|
+
syncedSize: this.synced.get(key)?.size ?? 0,
|
|
347
|
+
diskSize: Buffer.byteLength(content, "utf8"),
|
|
348
|
+
});
|
|
349
|
+
}
|
|
277
350
|
for (const { key, record, mtimeMs } of drifted) {
|
|
351
|
+
// A Git recovery target and the ordinary stat backstop can identify the
|
|
352
|
+
// same file in one pass. One event gets one resync opportunity; otherwise
|
|
353
|
+
// folding Git recovery onto this scheduler double-counts the same write.
|
|
354
|
+
if (resyncedKeys.has(key))
|
|
355
|
+
continue;
|
|
278
356
|
const driftAgeMs = Math.max(0, now() - record.syncedAt);
|
|
279
357
|
if (resynced >= DRIFT_RESYNC_BATCH) {
|
|
280
358
|
// Paced, not dropped: the cursor already advanced past this file, but
|
|
@@ -131,7 +131,7 @@ function parseWorkspaceEdit(edit) {
|
|
|
131
131
|
function formatRange(range) {
|
|
132
132
|
return `${range.start.line + 1}:${range.start.character + 1}-${range.end.line + 1}:${range.end.character + 1}`;
|
|
133
133
|
}
|
|
134
|
-
|
|
134
|
+
function rangesOverlap(a, b) {
|
|
135
135
|
return (comparePosition(a.start, b.end) < 0 && comparePosition(b.start, a.end) < 0);
|
|
136
136
|
}
|
|
137
137
|
function positionsEqual(a, b) {
|
|
@@ -351,7 +351,7 @@ export async function normalizeWorkspaceEditToUtf16(edit, positionEncoding, cwd)
|
|
|
351
351
|
...(edit.documentChanges !== undefined ? { documentChanges } : {}),
|
|
352
352
|
};
|
|
353
353
|
}
|
|
354
|
-
|
|
354
|
+
function flattenWorkspaceTextEdits(edit) {
|
|
355
355
|
parseWorkspaceEdit(edit);
|
|
356
356
|
const buckets = new Map();
|
|
357
357
|
const push = (uri, edits) => {
|
|
@@ -786,7 +786,7 @@ async function createWorkspaceUriConfiner(cwd) {
|
|
|
786
786
|
filePath = uriToPath(uri);
|
|
787
787
|
}
|
|
788
788
|
catch (err) {
|
|
789
|
-
throw new Error(`invalid workspace edit URI ${uri}: ${err instanceof Error ? err.message : String(err)}
|
|
789
|
+
throw new Error(`invalid workspace edit URI ${uri}: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
|
|
790
790
|
}
|
|
791
791
|
if (!path.isAbsolute(filePath))
|
|
792
792
|
throw new Error(`workspace edit path escapes workspace: ${uri}`);
|