pi-lens 4.3.0 → 4.4.0
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/CHANGELOG.md +1064 -0
- package/README.md +115 -25
- package/config/dependency-cruiser-eager-allowlist.json +6 -2
- package/dist/chunk-22AVIGXS.js +560 -0
- package/dist/chunk-27BBHSZC.js +106 -0
- package/dist/chunk-2BEMIWEW.js +51 -0
- package/dist/chunk-2EECBNC5.js +89 -0
- package/dist/chunk-34U7PLGE.js +23 -0
- package/dist/chunk-3I5QFT3N.js +181 -0
- package/dist/chunk-3MED75HT.js +37 -0
- package/dist/chunk-47D2BO4S.js +87 -0
- package/dist/chunk-4RERDEXR.js +348 -0
- package/dist/chunk-4W2PLC4J.js +27 -0
- package/dist/chunk-52H5B5TC.js +202 -0
- package/dist/chunk-54B42YRX.js +27 -0
- package/dist/chunk-5RXBNSW2.js +266 -0
- package/dist/chunk-5THXD6X5.js +201 -0
- package/dist/chunk-5W3R6LFT.js +24 -0
- package/dist/chunk-5ZEJHV35.js +341 -0
- package/dist/chunk-6P62QVEA.js +118 -0
- package/dist/chunk-6QIUX4EP.js +459 -0
- package/dist/chunk-6VCD4VKZ.js +78 -0
- package/dist/chunk-7F72PXY2.js +326 -0
- package/dist/chunk-7FBF7NPR.js +998 -0
- package/dist/chunk-7U2IDNXN.js +37 -0
- package/dist/chunk-ABBOA7UD.js +157 -0
- package/dist/chunk-AHDW3GPE.js +50 -0
- package/dist/chunk-AJ3QXTRQ.js +756 -0
- package/dist/chunk-AJVLWNFN.js +1610 -0
- package/dist/chunk-AJXODZY6.js +112 -0
- package/dist/chunk-ARFCXG7S.js +84 -0
- package/dist/chunk-AS44CFQ4.js +708 -0
- package/dist/chunk-AWE5TMPO.js +38 -0
- package/dist/chunk-B3I2UUT4.js +4692 -0
- package/dist/chunk-BRJKOBZP.js +331 -0
- package/dist/chunk-BW5KFIQC.js +59 -0
- package/dist/chunk-C2AUYXQH.js +149 -0
- package/dist/chunk-CGGAIP7J.js +29 -0
- package/dist/chunk-D6QS3U6M.js +30 -0
- package/dist/chunk-DFVMIKMQ.js +349 -0
- package/dist/chunk-DIULIWKU.js +169 -0
- package/dist/chunk-DQ2NZ7C4.js +2317 -0
- package/dist/chunk-E2WFBRHM.js +213 -0
- package/dist/chunk-E4MAEDPM.js +50 -0
- package/dist/chunk-EOKRQ3SA.js +30 -0
- package/dist/chunk-F3AU2TMM.js +2626 -0
- package/dist/chunk-F3P7VQ7H.js +170 -0
- package/dist/chunk-FC4RP4I2.js +12 -0
- package/dist/chunk-FJNKANOS.js +32 -0
- package/dist/chunk-GUOGVTCQ.js +146 -0
- package/dist/chunk-GVXA6CCE.js +18 -0
- package/dist/chunk-HHYAELLJ.js +2334 -0
- package/dist/chunk-HMFXILPV.js +83 -0
- package/dist/chunk-HVUZXSWK.js +421 -0
- package/dist/chunk-HWBZIGMJ.js +62 -0
- package/dist/chunk-I3R7GKDR.js +17 -0
- package/dist/chunk-I7SPGOWI.js +55 -0
- package/dist/chunk-IIXOAGHR.js +38 -0
- package/dist/chunk-IVP5KAB7.js +2250 -0
- package/dist/chunk-IXEBJSUE.js +22 -0
- package/dist/chunk-JOLITGCC.js +27 -0
- package/dist/chunk-K6VYLB2U.js +145 -0
- package/dist/chunk-LJDODBBZ.js +78 -0
- package/dist/chunk-LNAKEO63.js +78 -0
- package/dist/chunk-LSMJ6KBE.js +4139 -0
- package/dist/chunk-LW6XKDZQ.js +5565 -0
- package/dist/chunk-N3YQJI6O.js +899 -0
- package/dist/chunk-NABLC7W3.js +148 -0
- package/dist/chunk-NKOUFPQF.js +659 -0
- package/dist/chunk-NL5GLMFI.js +211 -0
- package/dist/chunk-NMABWBZN.js +327 -0
- package/dist/chunk-NTHH2J74.js +27 -0
- package/dist/chunk-NTUJEGDZ.js +59 -0
- package/dist/chunk-NXL4FFQQ.js +47 -0
- package/dist/chunk-NXPS2L6U.js +466 -0
- package/dist/chunk-O5WILGMI.js +42 -0
- package/dist/chunk-O6TQT6RI.js +48 -0
- package/dist/chunk-OAXNDZJ7.js +323 -0
- package/dist/chunk-ODEEOXPH.js +44 -0
- package/dist/chunk-OQGFCZJ4.js +4533 -0
- package/dist/chunk-ORTMY4Q4.js +282 -0
- package/dist/chunk-OS32RNR2.js +442 -0
- package/dist/chunk-PAK6IDME.js +189 -0
- package/dist/chunk-PWFHBTSF.js +406 -0
- package/dist/chunk-Q5U6FMDI.js +2352 -0
- package/dist/chunk-QOZXJ4NA.js +3364 -0
- package/dist/chunk-QYF5S6P6.js +45 -0
- package/dist/chunk-RIISMHKN.js +36 -0
- package/dist/chunk-RPD4ZSB7.js +25 -0
- package/dist/chunk-RPD5K5NC.js +79 -0
- package/dist/chunk-RUOG5D2C.js +262 -0
- package/dist/chunk-T4ERT73Y.js +599 -0
- package/dist/chunk-T6D4Q4AQ.js +54 -0
- package/dist/chunk-TGPXLY2J.js +391 -0
- package/dist/chunk-TLGFBM3F.js +12116 -0
- package/dist/chunk-TO6WL3GM.js +88 -0
- package/dist/chunk-TT22N74J.js +517 -0
- package/dist/chunk-TVN5N6GY.js +21216 -0
- package/dist/chunk-U3VGR4VU.js +308 -0
- package/dist/chunk-UK3CMEAL.js +1250 -0
- package/dist/chunk-UOPVJQ4N.js +103 -0
- package/dist/chunk-UXVNL3D7.js +23 -0
- package/dist/chunk-UY752QSN.js +45 -0
- package/dist/chunk-V5PXFSZK.js +188 -0
- package/dist/chunk-V7R425XG.js +398 -0
- package/dist/chunk-VCSRSYLF.js +81 -0
- package/dist/chunk-VD4JQCQC.js +162 -0
- package/dist/chunk-VDBPVIKD.js +62 -0
- package/dist/chunk-VHQLPIRJ.js +114 -0
- package/dist/chunk-VN2AXLEX.js +5414 -0
- package/dist/chunk-VNMT7C64.js +478 -0
- package/dist/chunk-WONERJTP.js +309 -0
- package/dist/chunk-XECLWQZN.js +85 -0
- package/dist/chunk-XIMYZ3JA.js +27 -0
- package/dist/chunk-XK4CIILI.js +144 -0
- package/dist/chunk-Y4T27COV.js +562 -0
- package/dist/chunk-YGVYKNSN.js +1860 -0
- package/dist/chunk-YLF3PPT5.js +308 -0
- package/dist/chunk-YSNFMJKN.js +14 -0
- package/dist/chunk-Z3CCVDUB.js +76 -0
- package/dist/chunk-Z54ZSOBZ.js +61 -0
- package/dist/chunk-ZAWW3AF6.js +97 -0
- package/dist/chunk-ZMOL6RQC.js +167 -0
- package/dist/index.js +16456 -8335
- package/dist/mcp/analyze-cli.js +186 -232
- package/dist/mcp/cli.js +137 -98
- package/dist/mcp/server.js +22589 -1573
- package/dist/mcp/worker.js +97 -38
- package/dist/probes/installer.js +135 -0
- package/dist/workers/project-snapshot-persist-worker.js +22 -0
- package/dist/workers/review-graph-persist-worker.js +15 -0
- package/docs/agent-guide.md +13 -4
- package/docs/agent-tools.md +42 -0
- package/docs/ast-grep_rules_catalog.md +3 -2
- package/docs/configuration.md +20 -1
- package/docs/environment-variables.md +52 -2
- package/docs/features.md +8 -4
- package/docs/globalconfig.md +1 -0
- package/docs/io-bridge-v2-migration.md +94 -0
- package/docs/lsp-capability-matrix.md +36 -4
- package/docs/lsp-idle-eviction.md +124 -0
- package/docs/mcp.md +21 -5
- package/docs/merge-queue-rollout.md +77 -0
- package/docs/pi-lens-fixer.md +156 -88
- package/docs/pi-lens-investigator.md +74 -26
- package/docs/pi-lens-merge-policy.md +694 -0
- package/docs/pi-lens-monitor.md +73 -7
- package/docs/pi-lens-retro.md +6 -4
- package/docs/pi-lens-reviewer.md +188 -48
- package/docs/pi-lens-subagent.md +246 -45
- package/docs/pi-lens-warden.md +18 -7
- package/docs/public-api-stability.md +55 -0
- package/docs/release-qa-baseline.md +84 -17
- package/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
- package/docs/servercapabilities.md +53 -49
- package/docs/settings.md +1 -0
- package/docs/usage.md +5 -1
- package/grammars/tree-sitter-bash.wasm +0 -0
- package/grammars/tree-sitter-bash.wasm.json +3 -3
- package/package.json +19 -7
- package/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
- package/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
- package/scripts/analyze-pi-lens-logs.mjs +1275 -62
- package/scripts/download-grammars.js +5 -0
- package/scripts/grammars.lock.json +6 -1
- package/scripts/install-selftest.mjs +33 -34
- package/scripts/lib/host-provided-deps.mjs +13 -4
- package/scripts/lib/web-tree-sitter-dir.mjs +18 -0
- package/dist/clients/actionable-warnings-logger.js +0 -35
- package/dist/clients/actionable-warnings.js +0 -1610
- package/dist/clients/advisory-provenance.js +0 -593
- package/dist/clients/agent-behavior-client.js +0 -147
- package/dist/clients/agent-nudge.js +0 -325
- package/dist/clients/analysed-root.js +0 -1
- package/dist/clients/ast-grep-client.js +0 -731
- package/dist/clients/ast-grep-rule-manager.js +0 -146
- package/dist/clients/ast-grep-tool-logger.js +0 -118
- package/dist/clients/ast-grep-types.js +0 -10
- package/dist/clients/ast-grep-yaml-synth.js +0 -154
- package/dist/clients/atomic-write-staging.js +0 -75
- package/dist/clients/atomic-write.js +0 -189
- package/dist/clients/availability-probe-flight.js +0 -12
- package/dist/clients/bash-file-access.js +0 -1056
- package/dist/clients/biome-client.js +0 -357
- package/dist/clients/blocker-freshness.js +0 -837
- package/dist/clients/blocker-past-eof.js +0 -129
- package/dist/clients/bootstrap.js +0 -569
- package/dist/clients/bounded-cache.js +0 -190
- package/dist/clients/bounded-pid-file-lock.js +0 -202
- package/dist/clients/bounded-telemetry.js +0 -295
- package/dist/clients/build-identity.js +0 -95
- package/dist/clients/bundled-resource-health.js +0 -113
- package/dist/clients/bus-events-logger.js +0 -105
- package/dist/clients/bus-publish.js +0 -171
- package/dist/clients/cache/rule-cache.js +0 -190
- package/dist/clients/cache-manager.js +0 -524
- package/dist/clients/cache-observability.js +0 -1313
- package/dist/clients/call-graph.js +0 -852
- package/dist/clients/cargo-manifest.js +0 -422
- package/dist/clients/cascade-budget.js +0 -196
- package/dist/clients/cascade-format.js +0 -315
- package/dist/clients/cascade-logger.js +0 -31
- package/dist/clients/cascade-types.js +0 -9
- package/dist/clients/child-unref.js +0 -124
- package/dist/clients/code-quality-warnings.js +0 -286
- package/dist/clients/codebase-model.js +0 -173
- package/dist/clients/collateral-test-role.js +0 -40
- package/dist/clients/complexity-client.js +0 -462
- package/dist/clients/config-core/deny.js +0 -221
- package/dist/clients/config-core/index.js +0 -50
- package/dist/clients/config-core/merge.js +0 -357
- package/dist/clients/config-core/normalize.js +0 -340
- package/dist/clients/config-core/process-spec.js +0 -248
- package/dist/clients/config-core/provenance.js +0 -164
- package/dist/clients/config-core/records.js +0 -218
- package/dist/clients/config-core/resolve.js +0 -125
- package/dist/clients/config-core/safe-object.js +0 -78
- package/dist/clients/config-core/schema.js +0 -165
- package/dist/clients/config-diagnostic-codes.js +0 -285
- package/dist/clients/config-locations.js +0 -388
- package/dist/clients/config-resolve.js +0 -798
- package/dist/clients/config-schema.js +0 -251
- package/dist/clients/config-warn.js +0 -407
- package/dist/clients/console-guard-install.js +0 -26
- package/dist/clients/cooperative-budget.js +0 -42
- package/dist/clients/dead-code-client.js +0 -510
- package/dist/clients/dead-code-logger.js +0 -30
- package/dist/clients/deadline-utils.js +0 -280
- package/dist/clients/debug-handles.js +0 -211
- package/dist/clients/debug-heap.js +0 -174
- package/dist/clients/deferred-lsp-work.js +0 -106
- package/dist/clients/degradation-ledger.js +0 -426
- package/dist/clients/demoted-finding-render.js +0 -169
- package/dist/clients/dependency-checker.js +0 -885
- package/dist/clients/deps/ast-grep-napi.js +0 -22
- package/dist/clients/deps/js-yaml.js +0 -9
- package/dist/clients/deps/minimatch.js +0 -4
- package/dist/clients/deps/pi-tui.js +0 -14
- package/dist/clients/deps/typebox.js +0 -14
- package/dist/clients/deps/vscode-jsonrpc.js +0 -1
- package/dist/clients/deps/web-tree-sitter.js +0 -24
- package/dist/clients/diagnostic-dispositions.js +0 -630
- package/dist/clients/diagnostic-line-freshness.js +0 -305
- package/dist/clients/diagnostic-logger.js +0 -73
- package/dist/clients/diagnostic-tracker.js +0 -105
- package/dist/clients/diagnostics-publish.js +0 -230
- package/dist/clients/dispatch/ast-grep-catalog.js +0 -65
- package/dist/clients/dispatch/auxiliary-lsp.js +0 -343
- package/dist/clients/dispatch/collect-later-tier.js +0 -35
- package/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
- package/dist/clients/dispatch/dispatcher.js +0 -1269
- package/dist/clients/dispatch/fact-provider-types.js +0 -1
- package/dist/clients/dispatch/fact-rule-runner.js +0 -17
- package/dist/clients/dispatch/fact-runner.js +0 -30
- package/dist/clients/dispatch/fact-scheduler.js +0 -68
- package/dist/clients/dispatch/fact-store.js +0 -377
- package/dist/clients/dispatch/facts/comment-facts.js +0 -22
- package/dist/clients/dispatch/facts/file-content.js +0 -19
- package/dist/clients/dispatch/facts/function-facts.js +0 -348
- package/dist/clients/dispatch/facts/import-facts.js +0 -204
- package/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
- package/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
- package/dist/clients/dispatch/finding-policy.js +0 -339
- package/dist/clients/dispatch/indent-detect.js +0 -417
- package/dist/clients/dispatch/inline-suppressions.js +0 -89
- package/dist/clients/dispatch/integration.js +0 -2377
- package/dist/clients/dispatch/lazy.js +0 -11
- package/dist/clients/dispatch/pending-runner-findings.js +0 -87
- package/dist/clients/dispatch/plan.js +0 -278
- package/dist/clients/dispatch/priorities.js +0 -20
- package/dist/clients/dispatch/rule-id-normalize.js +0 -50
- package/dist/clients/dispatch/rule-ignores.js +0 -69
- package/dist/clients/dispatch/rule-policy.js +0 -135
- package/dist/clients/dispatch/rules/async-noise.js +0 -40
- package/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
- package/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
- package/dist/clients/dispatch/rules/error-obscuring.js +0 -32
- package/dist/clients/dispatch/rules/error-swallowing.js +0 -31
- package/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
- package/dist/clients/dispatch/rules/high-complexity.js +0 -72
- package/dist/clients/dispatch/rules/high-fan-out.js +0 -74
- package/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
- package/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
- package/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
- package/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
- package/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
- package/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
- package/dist/clients/dispatch/runner-context.js +0 -52
- package/dist/clients/dispatch/runners/actionlint.js +0 -111
- package/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
- package/dist/clients/dispatch/runners/biome-check.js +0 -296
- package/dist/clients/dispatch/runners/cpp-check.js +0 -219
- package/dist/clients/dispatch/runners/credo.js +0 -82
- package/dist/clients/dispatch/runners/cue-vet.js +0 -416
- package/dist/clients/dispatch/runners/dart-analyze.js +0 -183
- package/dist/clients/dispatch/runners/detekt.js +0 -176
- package/dist/clients/dispatch/runners/dotnet-build.js +0 -164
- package/dist/clients/dispatch/runners/elixir-check.js +0 -195
- package/dist/clients/dispatch/runners/eslint.js +0 -137
- package/dist/clients/dispatch/runners/fact-rules.js +0 -29
- package/dist/clients/dispatch/runners/fish-indent.js +0 -69
- package/dist/clients/dispatch/runners/gleam-check.js +0 -167
- package/dist/clients/dispatch/runners/go-vet.js +0 -104
- package/dist/clients/dispatch/runners/golangci-lint.js +0 -135
- package/dist/clients/dispatch/runners/hadolint.js +0 -91
- package/dist/clients/dispatch/runners/helm-lint.js +0 -171
- package/dist/clients/dispatch/runners/helm-render.js +0 -940
- package/dist/clients/dispatch/runners/htmlhint.js +0 -117
- package/dist/clients/dispatch/runners/index.js +0 -108
- package/dist/clients/dispatch/runners/javac.js +0 -99
- package/dist/clients/dispatch/runners/ktlint.js +0 -110
- package/dist/clients/dispatch/runners/lsp.js +0 -379
- package/dist/clients/dispatch/runners/markdownlint.js +0 -167
- package/dist/clients/dispatch/runners/mypy.js +0 -102
- package/dist/clients/dispatch/runners/oxlint.js +0 -414
- package/dist/clients/dispatch/runners/php-lint.js +0 -85
- package/dist/clients/dispatch/runners/phpstan.js +0 -120
- package/dist/clients/dispatch/runners/prisma-validate.js +0 -62
- package/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
- package/dist/clients/dispatch/runners/pyright.js +0 -169
- package/dist/clients/dispatch/runners/rubocop.js +0 -99
- package/dist/clients/dispatch/runners/ruff.js +0 -88
- package/dist/clients/dispatch/runners/rust-clippy.js +0 -256
- package/dist/clients/dispatch/runners/shellcheck.js +0 -173
- package/dist/clients/dispatch/runners/shfmt.js +0 -102
- package/dist/clients/dispatch/runners/spellcheck.js +0 -128
- package/dist/clients/dispatch/runners/spotbugs.js +0 -259
- package/dist/clients/dispatch/runners/sqlfluff.js +0 -183
- package/dist/clients/dispatch/runners/stylelint.js +0 -166
- package/dist/clients/dispatch/runners/swiftlint.js +0 -163
- package/dist/clients/dispatch/runners/taplo.js +0 -174
- package/dist/clients/dispatch/runners/terragrunt.js +0 -168
- package/dist/clients/dispatch/runners/tflint.js +0 -125
- package/dist/clients/dispatch/runners/tree-sitter.js +0 -643
- package/dist/clients/dispatch/runners/trivy-config.js +0 -253
- package/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
- package/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
- package/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -95
- package/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
- package/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
- package/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
- package/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
- package/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
- package/dist/clients/dispatch/runners/utils.js +0 -15
- package/dist/clients/dispatch/runners/vale.js +0 -128
- package/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
- package/dist/clients/dispatch/runners/yamllint.js +0 -95
- package/dist/clients/dispatch/runners/zig-check.js +0 -79
- package/dist/clients/dispatch/suppress-writer.js +0 -79
- package/dist/clients/dispatch/tool-profile.js +0 -30
- package/dist/clients/dispatch/types.js +0 -21
- package/dist/clients/dispatch/utils/format-utils.js +0 -45
- package/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
- package/dist/clients/disposition-logger.js +0 -32
- package/dist/clients/disposition-publish.js +0 -124
- package/dist/clients/durable-store.js +0 -97
- package/dist/clients/effective-config.js +0 -415
- package/dist/clients/env-utils.js +0 -83
- package/dist/clients/error-class.js +0 -23
- package/dist/clients/eval-timestamp.js +0 -17
- package/dist/clients/event-loop-hold.js +0 -274
- package/dist/clients/event-loop-monitor.js +0 -250
- package/dist/clients/extension-log.js +0 -504
- package/dist/clients/extension-mode.js +0 -73
- package/dist/clients/feature-hints.js +0 -103
- package/dist/clients/file-kinds.js +0 -412
- package/dist/clients/file-role.js +0 -134
- package/dist/clients/file-time.js +0 -160
- package/dist/clients/file-utils.js +0 -1032
- package/dist/clients/finding-delivery-gate.js +0 -494
- package/dist/clients/finding-identity.js +0 -88
- package/dist/clients/fix-worklog.js +0 -103
- package/dist/clients/format-events-publish.js +0 -343
- package/dist/clients/format-service.js +0 -222
- package/dist/clients/formatters-lazy.js +0 -9
- package/dist/clients/formatters.js +0 -2032
- package/dist/clients/freshness-cadence.js +0 -17
- package/dist/clients/freshness.js +0 -38
- package/dist/clients/generated-artifacts.js +0 -394
- package/dist/clients/generation-guard.js +0 -215
- package/dist/clients/git-guard.js +0 -1136
- package/dist/clients/git-tracked-ignore.js +0 -243
- package/dist/clients/gitleaks-client.js +0 -509
- package/dist/clients/go-client.js +0 -104
- package/dist/clients/govulncheck-client.js +0 -605
- package/dist/clients/gradle-ktfmt-style.js +0 -348
- package/dist/clients/grammar-source.js +0 -465
- package/dist/clients/gzip-stage-write.js +0 -135
- package/dist/clients/hashline-anchor.js +0 -424
- package/dist/clients/hook-budgets.js +0 -76
- package/dist/clients/host-edit-normalize.js +0 -140
- package/dist/clients/host-ports.js +0 -39
- package/dist/clients/indent-retarget.js +0 -154
- package/dist/clients/inline-blocker-dispositions.js +0 -186
- package/dist/clients/install-diagnostics.js +0 -156
- package/dist/clients/installer/index.js +0 -5416
- package/dist/clients/installer/managed-tool-refresh-session.js +0 -58
- package/dist/clients/installer/managed-tool-refresh.js +0 -783
- package/dist/clients/instance-reaper-state.js +0 -7
- package/dist/clients/instance-reaper.js +0 -1137
- package/dist/clients/instance-registry-lock.js +0 -145
- package/dist/clients/instance-registry.js +0 -773
- package/dist/clients/jscpd-client.js +0 -378
- package/dist/clients/json-cache-read.js +0 -65
- package/dist/clients/knip-client.js +0 -788
- package/dist/clients/language-policy.js +0 -252
- package/dist/clients/language-profile.js +0 -361
- package/dist/clients/language-registry.js +0 -603
- package/dist/clients/latency-logger.js +0 -727
- package/dist/clients/lazy-import.js +0 -21
- package/dist/clients/ledger-bounds.js +0 -54
- package/dist/clients/lens-config.js +0 -404
- package/dist/clients/lens-engine.js +0 -358
- package/dist/clients/lens-events.js +0 -125
- package/dist/clients/lens-flag-registry.js +0 -467
- package/dist/clients/lens-map.js +0 -1156
- package/dist/clients/live-bus-emitter.js +0 -74
- package/dist/clients/log-cleanup.js +0 -222
- package/dist/clients/lsp/aggregation.js +0 -178
- package/dist/clients/lsp/cascade-tier.js +0 -421
- package/dist/clients/lsp/client.js +0 -4593
- package/dist/clients/lsp/config.js +0 -691
- package/dist/clients/lsp/content-limits.js +0 -41
- package/dist/clients/lsp/diagnostic-binding.js +0 -225
- package/dist/clients/lsp/document-drift.js +0 -467
- package/dist/clients/lsp/edits.js +0 -1219
- package/dist/clients/lsp/index.js +0 -8305
- package/dist/clients/lsp/inferred-project.js +0 -216
- package/dist/clients/lsp/jvm-runtime.js +0 -298
- package/dist/clients/lsp/language.js +0 -63
- package/dist/clients/lsp/launch.js +0 -746
- package/dist/clients/lsp/lombok.js +0 -158
- package/dist/clients/lsp/path-utils.js +0 -5
- package/dist/clients/lsp/pending-aux-coverage.js +0 -251
- package/dist/clients/lsp/position-encoding.js +0 -61
- package/dist/clients/lsp/ruby-drive-dirs.js +0 -83
- package/dist/clients/lsp/server.js +0 -3290
- package/dist/clients/lsp/session-roots.js +0 -192
- package/dist/clients/lsp/spawn-history.js +0 -17
- package/dist/clients/lsp/sync-kind.js +0 -56
- package/dist/clients/lsp/tsserver-sync.js +0 -332
- package/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
- package/dist/clients/lsp/wait-policy/classification.js +0 -85
- package/dist/clients/lsp/wait-policy/index.js +0 -10
- package/dist/clients/lsp/wait-policy/strategies.js +0 -392
- package/dist/clients/lsp/watch-queue.js +0 -61
- package/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
- package/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
- package/dist/clients/lsp/workspace-sweep-hold.js +0 -184
- package/dist/clients/lsp-budget.js +0 -186
- package/dist/clients/lsp-document-symbols.js +0 -110
- package/dist/clients/lsp-lazy.js +0 -9
- package/dist/clients/lsp-mutation.js +0 -396
- package/dist/clients/lsp-status.js +0 -59
- package/dist/clients/map-with-concurrency.js +0 -40
- package/dist/clients/mcp/analyze.js +0 -420
- package/dist/clients/mcp/host-shim.js +0 -31
- package/dist/clients/mcp/ipc.js +0 -523
- package/dist/clients/mcp/review.js +0 -197
- package/dist/clients/mcp/session.js +0 -412
- package/dist/clients/memory-sampler.js +0 -208
- package/dist/clients/message-end-attribution.js +0 -30
- package/dist/clients/metrics-client.js +0 -107
- package/dist/clients/metrics-history.js +0 -327
- package/dist/clients/middle-man-analysis.js +0 -263
- package/dist/clients/model-provider.js +0 -53
- package/dist/clients/module-report-lsp.js +0 -189
- package/dist/clients/module-report.js +0 -2150
- package/dist/clients/mutating-tool.js +0 -651
- package/dist/clients/mutation-attribution.js +0 -368
- package/dist/clients/mutation-bridge.js +0 -240
- package/dist/clients/ndjson-logger.js +0 -734
- package/dist/clients/observed-mutation-sources.js +0 -101
- package/dist/clients/observed-mutation.js +0 -1253
- package/dist/clients/oldtext-autopatch.js +0 -128
- package/dist/clients/opaque-mutation-scan.js +0 -496
- package/dist/clients/opengrep-client.js +0 -333
- package/dist/clients/opengrep-config.js +0 -76
- package/dist/clients/package-manager.js +0 -607
- package/dist/clients/package-root.js +0 -38
- package/dist/clients/partial-edit-apply.js +0 -439
- package/dist/clients/path-attribution-telemetry.js +0 -43
- package/dist/clients/path-keyed-map.js +0 -108
- package/dist/clients/path-utils.js +0 -1244
- package/dist/clients/performance-report.js +0 -331
- package/dist/clients/persist-debounce.js +0 -70
- package/dist/clients/persistent-reverify.js +0 -271
- package/dist/clients/php-cs-fixer-config.js +0 -119
- package/dist/clients/pipeline.js +0 -1480
- package/dist/clients/post-autofix-notice.js +0 -37
- package/dist/clients/print-mode.js +0 -21
- package/dist/clients/probe-home-state.js +0 -228
- package/dist/clients/process-bridge.js +0 -66
- package/dist/clients/process-singletons.js +0 -210
- package/dist/clients/process-snapshot.js +0 -68
- package/dist/clients/project-changes.js +0 -181
- package/dist/clients/project-conventions.js +0 -171
- package/dist/clients/project-diagnostics/cache.js +0 -137
- package/dist/clients/project-diagnostics/extractors.js +0 -109
- package/dist/clients/project-diagnostics/fresh-fetch.js +0 -668
- package/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
- package/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
- package/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
- package/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
- package/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
- package/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
- package/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
- package/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
- package/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
- package/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
- package/dist/clients/project-diagnostics/scanner.js +0 -520
- package/dist/clients/project-diagnostics/types.js +0 -1
- package/dist/clients/project-lens-config.js +0 -807
- package/dist/clients/project-report.js +0 -701
- package/dist/clients/project-scale.js +0 -237
- package/dist/clients/project-scan-policy.js +0 -11
- package/dist/clients/project-snapshot-fingerprint.js +0 -48
- package/dist/clients/project-snapshot-persist-worker.js +0 -20
- package/dist/clients/project-snapshot.js +0 -1653
- package/dist/clients/project-trust.js +0 -181
- package/dist/clients/python-environment.js +0 -217
- package/dist/clients/python-provenance.js +0 -639
- package/dist/clients/quiet-window-config.js +0 -47
- package/dist/clients/quiet-window.js +0 -236
- package/dist/clients/read-bridge.js +0 -139
- package/dist/clients/read-expansion.js +0 -266
- package/dist/clients/read-guard-logger.js +0 -251
- package/dist/clients/read-guard-tool-lines.js +0 -1306
- package/dist/clients/read-guard.js +0 -1561
- package/dist/clients/recent-touches.js +0 -240
- package/dist/clients/redact/secrets.js +0 -449
- package/dist/clients/resource-sampler.js +0 -628
- package/dist/clients/reverse-deps.js +0 -270
- package/dist/clients/review-graph/builder.js +0 -5126
- package/dist/clients/review-graph/format.js +0 -33
- package/dist/clients/review-graph/git-identity.js +0 -163
- package/dist/clients/review-graph/import-resolvers.js +0 -481
- package/dist/clients/review-graph/persist-worker.js +0 -10
- package/dist/clients/review-graph/query.js +0 -244
- package/dist/clients/review-graph/revision-drift.js +0 -21
- package/dist/clients/review-graph/service.js +0 -96
- package/dist/clients/review-graph/shared-extraction-ir.js +0 -82
- package/dist/clients/review-graph/symbol-id.js +0 -103
- package/dist/clients/review-graph/tsconfig-paths.js +0 -299
- package/dist/clients/review-graph/types.js +0 -1
- package/dist/clients/review-graph/workspace-modules.js +0 -449
- package/dist/clients/review-graph-logger.js +0 -81
- package/dist/clients/ruff-client.js +0 -179
- package/dist/clients/rules-scanner.js +0 -131
- package/dist/clients/run-duration.js +0 -55
- package/dist/clients/runtime-agent-end.js +0 -746
- package/dist/clients/runtime-config.js +0 -77
- package/dist/clients/runtime-context.js +0 -211
- package/dist/clients/runtime-coordinator.js +0 -1324
- package/dist/clients/runtime-session.js +0 -2485
- package/dist/clients/runtime-tool-call.js +0 -1295
- package/dist/clients/runtime-tool-result.js +0 -2049
- package/dist/clients/runtime-turn.js +0 -3767
- package/dist/clients/rust-client.js +0 -97
- package/dist/clients/safe-spawn.js +0 -2357
- package/dist/clients/sanitize.js +0 -286
- package/dist/clients/scan-utils.js +0 -25
- package/dist/clients/scratch-tree-policy.js +0 -165
- package/dist/clients/search-read-registration.js +0 -94
- package/dist/clients/secret-findings.js +0 -114
- package/dist/clients/security-scan-client.js +0 -352
- package/dist/clients/session-event-guard.js +0 -297
- package/dist/clients/session-lifecycle.js +0 -484
- package/dist/clients/session-start-observability.js +0 -94
- package/dist/clients/session-state-store.js +0 -101
- package/dist/clients/session-summary.js +0 -15
- package/dist/clients/sessionstart-logger.js +0 -27
- package/dist/clients/sg-runner.js +0 -876
- package/dist/clients/sgconfig.js +0 -347
- package/dist/clients/shared-checkout-guard.js +0 -338
- package/dist/clients/single-flight.js +0 -158
- package/dist/clients/situational-tool-telemetry.js +0 -108
- package/dist/clients/skills-resolver.js +0 -141
- package/dist/clients/slow-fs.js +0 -138
- package/dist/clients/smells-rollup.js +0 -231
- package/dist/clients/source-filter.js +0 -596
- package/dist/clients/source-walker.js +0 -211
- package/dist/clients/spawn-output-cap.js +0 -120
- package/dist/clients/spawn-timeout-cooldown.js +0 -110
- package/dist/clients/stale-marker.js +0 -17
- package/dist/clients/startup-scan.js +0 -400
- package/dist/clients/startup-timing.js +0 -130
- package/dist/clients/string-utils.js +0 -33
- package/dist/clients/subagent-mode.js +0 -111
- package/dist/clients/symbol-containment.js +0 -24
- package/dist/clients/symbol-types.js +0 -5
- package/dist/clients/test-runner-client.js +0 -2507
- package/dist/clients/test-runner-delivery.js +0 -287
- package/dist/clients/todo-scanner.js +0 -229
- package/dist/clients/tool-agreement.js +0 -423
- package/dist/clients/tool-config.js +0 -249
- package/dist/clients/tool-cwd.js +0 -270
- package/dist/clients/tool-definition.js +0 -47
- package/dist/clients/tool-event.js +0 -105
- package/dist/clients/tool-policy.js +0 -2755
- package/dist/clients/tool-probe.js +0 -53
- package/dist/clients/tool-render.js +0 -156
- package/dist/clients/tool-set-policy.js +0 -118
- package/dist/clients/tree-sitter-cache.js +0 -364
- package/dist/clients/tree-sitter-client.js +0 -4195
- package/dist/clients/tree-sitter-logger.js +0 -100
- package/dist/clients/tree-sitter-navigator.js +0 -269
- package/dist/clients/tree-sitter-query-loader.js +0 -569
- package/dist/clients/tree-sitter-shared.js +0 -158
- package/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
- package/dist/clients/trivy-client.js +0 -467
- package/dist/clients/tui-fit.js +0 -50
- package/dist/clients/turn-context.js +0 -52
- package/dist/clients/turn-end/lane.js +0 -51
- package/dist/clients/turn-end/lanes/govulncheck.js +0 -112
- package/dist/clients/turn-end/lanes/secrets.js +0 -204
- package/dist/clients/turn-summary-render.js +0 -72
- package/dist/clients/turn-summary.js +0 -132
- package/dist/clients/typos-config.js +0 -29
- package/dist/clients/user-notify.js +0 -51
- package/dist/clients/vanished-instance-marker.js +0 -57
- package/dist/clients/warm-attach.js +0 -305
- package/dist/clients/widget-state.js +0 -1808
- package/dist/clients/word-index-logger.js +0 -49
- package/dist/clients/word-index-store.js +0 -459
- package/dist/clients/word-index.js +0 -2080
- package/dist/clients/workspace-topology.js +0 -443
- package/dist/clients/write-ordering-guard.js +0 -65
- package/dist/clients/zizmor-config.js +0 -340
- package/dist/i18n.js +0 -69
- package/dist/mcp/build-staleness.js +0 -124
- package/dist/scripts/lib/process-scan.mjs +0 -583
- package/dist/scripts/lib/skills-predicate.mjs +0 -129
- package/dist/scripts/lib/web-tree-sitter-dir.mjs +0 -123
- package/dist/tools/activate-tools.js +0 -87
- package/dist/tools/ast-grep-outline.js +0 -137
- package/dist/tools/ast-grep-replace.js +0 -244
- package/dist/tools/ast-grep-search.js +0 -762
- package/dist/tools/effective-config.js +0 -90
- package/dist/tools/lens-diagnostic-mark.js +0 -375
- package/dist/tools/lens-diagnostics.js +0 -2571
- package/dist/tools/lsp-diagnostics.js +0 -1745
- package/dist/tools/lsp-navigation.js +0 -1367
- package/dist/tools/lsp-structured-output.js +0 -294
- package/dist/tools/module-report.js +0 -382
- package/dist/tools/project-report.js +0 -86
- package/dist/tools/render-compact.js +0 -374
- package/dist/tools/scan-progress.js +0 -53
- package/dist/tools/shared.js +0 -29
- package/dist/tools/symbol-search.js +0 -155
|
@@ -1,364 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tree-sitter Tree Cache
|
|
3
|
-
*
|
|
4
|
-
* Caches parsed ASTs so a file written once is parsed once and reused by every
|
|
5
|
-
* subsystem that inspects it in the same process (#675).
|
|
6
|
-
*
|
|
7
|
-
* Freshness is hash-authoritative when the caller supplies content: identical
|
|
8
|
-
* bytes parse to an identical tree, so a hash match is a hit even if the file's
|
|
9
|
-
* mtime moved (an agent re-saving unchanged bytes must not force a reparse,
|
|
10
|
-
* #890). Eviction is true LRU — hits re-insert their entry, so set() dropping
|
|
11
|
-
* the Map's first key removes the least-recently-used file, not merely the
|
|
12
|
-
* oldest insertion, and hot per-edit files survive scan traffic (#890).
|
|
13
|
-
*/
|
|
14
|
-
import { logTreeSitterDiagnostic } from "./tree-sitter-logger.js";
|
|
15
|
-
import * as crypto from "node:crypto";
|
|
16
|
-
import * as fs from "node:fs";
|
|
17
|
-
import { BoundedFifoMap } from "./bounded-cache.js";
|
|
18
|
-
import { normalizeFilePath } from "./path-utils.js";
|
|
19
|
-
const TREE_RETIREMENT_GRACE_MICROTASKS = 4;
|
|
20
|
-
export const TREE_CACHE_COUNTER_KEYS = [
|
|
21
|
-
"lookups",
|
|
22
|
-
"hits",
|
|
23
|
-
"coldMisses",
|
|
24
|
-
"capacityMisses",
|
|
25
|
-
"contentChangedMisses",
|
|
26
|
-
"mtimeMisses",
|
|
27
|
-
"statFailedMisses",
|
|
28
|
-
"sets",
|
|
29
|
-
"replacements",
|
|
30
|
-
"evictions",
|
|
31
|
-
"clears",
|
|
32
|
-
"ghostHistoryDrops",
|
|
33
|
-
];
|
|
34
|
-
export function createTreeCacheCounters() {
|
|
35
|
-
// SAFETY: `Object.fromEntries` returns `Record<string, number>` — it cannot
|
|
36
|
-
// prove the key set. `TREE_CACHE_COUNTER_KEYS` is declared `as const
|
|
37
|
-
// satisfies readonly (keyof TreeCacheCounters)[]`, so the compiler already
|
|
38
|
-
// rejects a key that is not a counter; every counter is a `number` and
|
|
39
|
-
// every key gets 0, so the result has the full shape. The `satisfies`
|
|
40
|
-
// clause does NOT check the reverse direction: add a counter to
|
|
41
|
-
// `TreeCacheCounters` without adding its key here and this cast becomes a
|
|
42
|
-
// lie. `tests/clients/tree-sitter-cache.test.ts` closes that direction with
|
|
43
|
-
// a compile-time `[Exclude<keyof TreeCacheCounters, …>] extends [never]`
|
|
44
|
-
// assertion, so a missing key fails `tsc`, not just the suite.
|
|
45
|
-
return Object.fromEntries(TREE_CACHE_COUNTER_KEYS.map((key) => [key, 0]));
|
|
46
|
-
}
|
|
47
|
-
/** Interactive-editing default: safe LRU footprint for per-edit locality. */
|
|
48
|
-
export const TREE_CACHE_DEFAULT_MAX_SIZE = 50;
|
|
49
|
-
/**
|
|
50
|
-
* Hard ceiling on how far a full-project scan may grow the tree cache
|
|
51
|
-
* (#1715). Entry count is not the resource that matters — WASM heap is
|
|
52
|
-
* (#417/#418, the leak this cache was fixed for once already) — so growing
|
|
53
|
-
* capacity to fit a scan's working set must still cap the heap's worst case,
|
|
54
|
-
* not just stop counting entries.
|
|
55
|
-
*
|
|
56
|
-
* Measured empirically on a fresh process (`heap-measure.mjs`, dropped from
|
|
57
|
-
* this PR — see the PR body): parsing 800 synthetic ~3.6KB TypeScript files
|
|
58
|
-
* with all 800 trees held resident (no eviction) grows `process.memoryUsage()
|
|
59
|
-
* .external` by ~254MB over the same run with only 1 tree resident at a
|
|
60
|
-
* time — about 330KB of non-V8 (WASM-backed) heap per resident tree on that
|
|
61
|
-
* sample. At the interactive default of 50 entries that is a ~16MB
|
|
62
|
-
* worst case; at this 500-entry ceiling it is a ~165MB worst case — bounded
|
|
63
|
-
* and stated, not unbounded growth.
|
|
64
|
-
*/
|
|
65
|
-
export const TREE_CACHE_SCAN_CAPACITY_CEILING = 500;
|
|
66
|
-
/**
|
|
67
|
-
* Derive the capacity a full-project scan should grow the tree cache to
|
|
68
|
-
* (#1715): span the scan's file count so a second scan over the same files
|
|
69
|
-
* reuses every tree instead of re-parsing files the LRU evicted at the
|
|
70
|
-
* interactive default — bounded by `TREE_CACHE_SCAN_CAPACITY_CEILING` (or
|
|
71
|
-
* its `PI_LENS_TREE_SITTER_CACHE_SCAN_CAP` override) so the heap cost stated
|
|
72
|
-
* above stays a real ceiling. Never shrinks a capacity the cache already
|
|
73
|
-
* has — a later, smaller scan (or an unrelated caller) must not undo an
|
|
74
|
-
* earlier grow.
|
|
75
|
-
*/
|
|
76
|
-
export function deriveScanTreeCacheCapacity(fileCount, currentMaxSize) {
|
|
77
|
-
const envRaw = process.env.PI_LENS_TREE_SITTER_CACHE_SCAN_CAP;
|
|
78
|
-
const envValue = envRaw !== undefined ? Number.parseInt(envRaw, 10) : Number.NaN;
|
|
79
|
-
const ceiling = Number.isSafeInteger(envValue) && envValue > 0
|
|
80
|
-
? envValue
|
|
81
|
-
: TREE_CACHE_SCAN_CAPACITY_CEILING;
|
|
82
|
-
const target = Math.min(Math.max(fileCount, TREE_CACHE_DEFAULT_MAX_SIZE), ceiling);
|
|
83
|
-
return Math.max(currentMaxSize, target);
|
|
84
|
-
}
|
|
85
|
-
export class TreeCache {
|
|
86
|
-
// BoundedFifoMap, not BoundedLruCache, even though eviction here IS true
|
|
87
|
-
// LRU: recency is refreshed by this class's own explicit `delete`+`set`
|
|
88
|
-
// touch on a VALIDATED hit (see `get`), and only there. A `get` that
|
|
89
|
-
// promoted on every read would also promote entries `get` goes on to
|
|
90
|
-
// reject (content-hash mismatch returns null without removing), silently
|
|
91
|
-
// changing which entry eviction targets (#2442 review F7).
|
|
92
|
-
cache = new BoundedFifoMap(TREE_CACHE_DEFAULT_MAX_SIZE);
|
|
93
|
-
recentlyEvicted;
|
|
94
|
-
evictionHistoryMax;
|
|
95
|
-
debug;
|
|
96
|
-
counters = createTreeCacheCounters();
|
|
97
|
-
counterObserver;
|
|
98
|
-
treeErrorObserver;
|
|
99
|
-
constructor(maxSize = TREE_CACHE_DEFAULT_MAX_SIZE, debug = false, evictionHistoryMax = 4096, counterObserver, treeErrorObserver) {
|
|
100
|
-
this.cache.setMaxEntries(Math.max(1, Math.floor(maxSize)));
|
|
101
|
-
this.evictionHistoryMax = Math.max(1, Math.floor(evictionHistoryMax));
|
|
102
|
-
this.recentlyEvicted = new BoundedFifoMap(this.evictionHistoryMax);
|
|
103
|
-
this.counterObserver = counterObserver;
|
|
104
|
-
this.treeErrorObserver = treeErrorObserver;
|
|
105
|
-
this.debug = debug
|
|
106
|
-
? (msg) => logTreeSitterDiagnostic({
|
|
107
|
-
subsystem: "tree-cache",
|
|
108
|
-
level: "debug",
|
|
109
|
-
message: msg,
|
|
110
|
-
})
|
|
111
|
-
: () => { };
|
|
112
|
-
}
|
|
113
|
-
recordCounter(key, amount = 1) {
|
|
114
|
-
this.counters[key] += amount;
|
|
115
|
-
this.counterObserver?.(key, amount);
|
|
116
|
-
}
|
|
117
|
-
/** Current capacity ceiling (entry count, not bytes — see class docstring). */
|
|
118
|
-
getMaxSize() {
|
|
119
|
-
return this.cache.getMaxEntries();
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Resize the capacity ceiling (#1715). Growing only changes the bound —
|
|
123
|
-
* existing entries are untouched. Shrinking evicts the LRU tail down to
|
|
124
|
-
* the new size through the same `removeEntry` path eviction uses, so a
|
|
125
|
-
* shrink still frees every dropped tree's WASM heap (#417) instead of
|
|
126
|
-
* silently orphaning it. `n` is floored at 1: a cache that can hold zero
|
|
127
|
-
* entries can never record a hit.
|
|
128
|
-
*/
|
|
129
|
-
setMaxSize(n) {
|
|
130
|
-
this.retireEvicted(this.cache.setMaxEntries(Math.max(1, Math.floor(n))));
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Book-keep entries the bounded map dropped: ghost history, the eviction
|
|
134
|
-
* counter, and the WASM-heap tree retirement (#417/#890) that made this
|
|
135
|
-
* cache's eviction side-effect-coupled in the first place. One
|
|
136
|
-
* implementation, shared by the two paths that can overflow
|
|
137
|
-
* ({@link setMaxSize} and {@link set}) — the shape `BoundedFifoMap.set`'s
|
|
138
|
-
* `[key, value]` return exists to enable (#2442 review F7).
|
|
139
|
-
*/
|
|
140
|
-
retireEvicted(evicted) {
|
|
141
|
-
for (const [key, cached] of evicted) {
|
|
142
|
-
this.rememberEviction(key, cached);
|
|
143
|
-
this.recordCounter("evictions");
|
|
144
|
-
// The bounded map already removed the entry, so retire the tree
|
|
145
|
-
// directly rather than through removeEntry's re-lookup.
|
|
146
|
-
this.retireTree(cached.tree);
|
|
147
|
-
this.debug(`Evicted: ${key}`);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Free a tree-sitter Tree's WASM-heap allocation.
|
|
152
|
-
*
|
|
153
|
-
* web-tree-sitter Trees live in the WASM heap; JS GC reclaims only the wrapper,
|
|
154
|
-
* so the underlying memory leaks unless `tree.delete()` is called explicitly
|
|
155
|
-
* (no FinalizationRegistry auto-free in 0.25). Guarded — a tree may already be
|
|
156
|
-
* deleted, or `delete()` may throw on a corrupt/aborted runtime. Retirement is
|
|
157
|
-
* deferred so direct parse callers resume before deletion; consumers still
|
|
158
|
-
* traverse without another await, or use the cache-safe callback API (#417).
|
|
159
|
-
* The eviction target is the least-recently-used entry (get() re-inserts
|
|
160
|
-
* hits), never the just-parsed tree still in a caller's hand.
|
|
161
|
-
*/
|
|
162
|
-
// biome-ignore lint/suspicious/noExplicitAny: web-tree-sitter Tree
|
|
163
|
-
freeTree(tree) {
|
|
164
|
-
try {
|
|
165
|
-
if (tree && typeof tree.delete === "function")
|
|
166
|
-
tree.delete();
|
|
167
|
-
}
|
|
168
|
-
catch (error) {
|
|
169
|
-
this.treeErrorObserver?.(error);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
retireTree(tree) {
|
|
173
|
-
let remaining = TREE_RETIREMENT_GRACE_MICROTASKS;
|
|
174
|
-
const retire = () => {
|
|
175
|
-
if (remaining-- > 0) {
|
|
176
|
-
queueMicrotask(retire);
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
this.freeTree(tree);
|
|
180
|
-
};
|
|
181
|
-
queueMicrotask(retire);
|
|
182
|
-
}
|
|
183
|
-
/** Remove a cache entry and retire its WASM tree after current consumers run. */
|
|
184
|
-
removeEntry(key) {
|
|
185
|
-
const cached = this.cache.get(key);
|
|
186
|
-
if (cached)
|
|
187
|
-
this.retireTree(cached.tree);
|
|
188
|
-
this.cache.delete(key);
|
|
189
|
-
}
|
|
190
|
-
rememberEviction(key, cached) {
|
|
191
|
-
this.recentlyEvicted.delete(key);
|
|
192
|
-
const dropped = this.recentlyEvicted.set(key, cached.contentHash);
|
|
193
|
-
if (dropped.length > 0)
|
|
194
|
-
this.recordCounter("ghostHistoryDrops");
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* Generate hash for file content
|
|
198
|
-
*/
|
|
199
|
-
hashContent(content) {
|
|
200
|
-
return crypto
|
|
201
|
-
.createHash("sha256")
|
|
202
|
-
.update(content)
|
|
203
|
-
.digest("hex")
|
|
204
|
-
.slice(0, 16);
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Get cache key for a file
|
|
208
|
-
*/
|
|
209
|
-
getCacheKey(filePath, languageId) {
|
|
210
|
-
return `${languageId}:${normalizeFilePath(filePath)}`;
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Check if tree is cached and valid.
|
|
214
|
-
*
|
|
215
|
-
* When `content` is provided the content hash is AUTHORITATIVE: a hash match
|
|
216
|
-
* is a hit regardless of mtime, and the entry's stat metadata is refreshed
|
|
217
|
-
* so a save-without-change (same bytes, newer mtime) does not masquerade as
|
|
218
|
-
* a disk modification (#890). The mtime check remains the freshness signal
|
|
219
|
-
* only on the content-less path, where nothing else can prove the cached
|
|
220
|
-
* tree current (`mtimeMisses`). A stat failure invalidates on both paths —
|
|
221
|
-
* a deleted file's entry is dead weight and its WASM tree should be freed.
|
|
222
|
-
*
|
|
223
|
-
* Every hit re-inserts the entry (raw Map delete+set — NOT removeEntry,
|
|
224
|
-
* which would retire the live tree) so eviction is true LRU (#890).
|
|
225
|
-
*/
|
|
226
|
-
get(filePath, content, languageId) {
|
|
227
|
-
this.recordCounter("lookups");
|
|
228
|
-
const key = this.getCacheKey(filePath, languageId);
|
|
229
|
-
const cached = this.cache.get(key);
|
|
230
|
-
if (!cached) {
|
|
231
|
-
const evictedHash = this.recentlyEvicted.get(key);
|
|
232
|
-
if (evictedHash !== undefined &&
|
|
233
|
-
content !== undefined &&
|
|
234
|
-
evictedHash === this.hashContent(content)) {
|
|
235
|
-
this.recordCounter("capacityMisses");
|
|
236
|
-
}
|
|
237
|
-
else {
|
|
238
|
-
this.recordCounter("coldMisses");
|
|
239
|
-
}
|
|
240
|
-
this.debug(`Cache miss: ${filePath}`);
|
|
241
|
-
return null;
|
|
242
|
-
}
|
|
243
|
-
// (No language-mismatch check needed: the cache key is prefixed with
|
|
244
|
-
// languageId, so a key hit already implies the language matches.)
|
|
245
|
-
if (content !== undefined) {
|
|
246
|
-
// Check content hash — authoritative when content is provided.
|
|
247
|
-
const contentHash = this.hashContent(content);
|
|
248
|
-
if (cached.contentHash !== contentHash) {
|
|
249
|
-
this.recordCounter("contentChangedMisses");
|
|
250
|
-
this.debug(`Content changed: ${filePath} (${cached.lineCount} → ${content.split("\n").length} lines)`);
|
|
251
|
-
// Keep old tree for potential incremental update, but mark as stale
|
|
252
|
-
return null;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
try {
|
|
256
|
-
const stats = fs.statSync(filePath);
|
|
257
|
-
if (content !== undefined) {
|
|
258
|
-
// The hash already proved the tree current: an mtime delta is a
|
|
259
|
-
// save-without-change (or touch/clock drift). Refresh metadata
|
|
260
|
-
// instead of invalidating (#890). Caveat: this stamps the CURRENT
|
|
261
|
-
// disk mtime onto an entry validated against caller-supplied
|
|
262
|
-
// content — if that content lags a newer disk write, lastModified
|
|
263
|
-
// no longer vouches for the disk bytes. So lastModified means
|
|
264
|
-
// "mtime last observed on a hash-confirmed hit"; the content-less
|
|
265
|
-
// path below may only treat it as freshness proof while all
|
|
266
|
-
// callers pass content (today they all do — the undefined path is
|
|
267
|
-
// exercised only by tests).
|
|
268
|
-
if (stats.mtimeMs !== cached.lastModified) {
|
|
269
|
-
cached.lastModified = stats.mtimeMs;
|
|
270
|
-
this.debug(`Refreshed mtime on hash-matched entry: ${filePath}`);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
else if (stats.mtimeMs !== cached.lastModified) {
|
|
274
|
-
// No content to hash — mtime is the only freshness proof.
|
|
275
|
-
this.recordCounter("mtimeMisses");
|
|
276
|
-
this.debug(`File modified on disk: ${filePath}`);
|
|
277
|
-
this.removeEntry(key);
|
|
278
|
-
return null;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
catch {
|
|
282
|
-
// File might be deleted, invalidate cache
|
|
283
|
-
this.recordCounter("statFailedMisses");
|
|
284
|
-
this.removeEntry(key);
|
|
285
|
-
return null;
|
|
286
|
-
}
|
|
287
|
-
// LRU touch: re-insert so this entry becomes the newest. The SAME entry
|
|
288
|
-
// object is re-set — no tree replacement, so nothing is retired and a
|
|
289
|
-
// retired tree can never be resurrected (#890).
|
|
290
|
-
this.cache.delete(key);
|
|
291
|
-
this.cache.set(key, cached);
|
|
292
|
-
this.recordCounter("hits");
|
|
293
|
-
this.debug(`Cache hit: ${filePath} (${cached.lineCount} lines)`);
|
|
294
|
-
return cached.tree;
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* Store parsed tree in cache
|
|
298
|
-
*/
|
|
299
|
-
set(filePath, content, languageId, tree) {
|
|
300
|
-
this.recordCounter("sets");
|
|
301
|
-
const key = this.getCacheKey(filePath, languageId);
|
|
302
|
-
const contentHash = this.hashContent(content);
|
|
303
|
-
this.recentlyEvicted.delete(key);
|
|
304
|
-
// Free the tree we're about to replace at this key (re-parse of the same
|
|
305
|
-
// file) so it doesn't leak its WASM heap.
|
|
306
|
-
if (this.cache.has(key)) {
|
|
307
|
-
this.recordCounter("replacements");
|
|
308
|
-
this.removeEntry(key);
|
|
309
|
-
}
|
|
310
|
-
// Overflow eviction itself now happens on the `this.cache.set` below —
|
|
311
|
-
// the bounded map evicts the least-recently-used entry (this class's
|
|
312
|
-
// explicit delete+set touch on a validated hit makes insertion order
|
|
313
|
-
// recency order, #890) and hands back the dropped [key, tree] pair for
|
|
314
|
-
// `retireEvicted` to free.
|
|
315
|
-
let mtime = 0;
|
|
316
|
-
try {
|
|
317
|
-
mtime = fs.statSync(filePath).mtimeMs;
|
|
318
|
-
}
|
|
319
|
-
catch {
|
|
320
|
-
// File deleted between parse and cache — cache with mtime=0;
|
|
321
|
-
// next get() will miss on mtime check and re-parse
|
|
322
|
-
}
|
|
323
|
-
this.retireEvicted(this.cache.set(key, {
|
|
324
|
-
tree,
|
|
325
|
-
contentHash,
|
|
326
|
-
languageId,
|
|
327
|
-
fileSize: Buffer.byteLength(content, "utf8"),
|
|
328
|
-
lineCount: content.split("\n").length,
|
|
329
|
-
lastModified: mtime,
|
|
330
|
-
}));
|
|
331
|
-
this.debug(`Cached: ${filePath} (${content.split("\n").length} lines)`);
|
|
332
|
-
}
|
|
333
|
-
/**
|
|
334
|
-
* Clear entire cache
|
|
335
|
-
*/
|
|
336
|
-
clear() {
|
|
337
|
-
this.recordCounter("clears");
|
|
338
|
-
for (const entry of this.cache.values()) {
|
|
339
|
-
this.retireTree(entry.tree);
|
|
340
|
-
}
|
|
341
|
-
this.cache.clear();
|
|
342
|
-
this.recentlyEvicted.clear();
|
|
343
|
-
this.debug("Cache cleared");
|
|
344
|
-
}
|
|
345
|
-
/**
|
|
346
|
-
* Get cache statistics
|
|
347
|
-
*/
|
|
348
|
-
getStats() {
|
|
349
|
-
let totalLines = 0;
|
|
350
|
-
let totalBytes = 0;
|
|
351
|
-
for (const entry of this.cache.values()) {
|
|
352
|
-
totalLines += entry.lineCount;
|
|
353
|
-
totalBytes += entry.fileSize;
|
|
354
|
-
}
|
|
355
|
-
return {
|
|
356
|
-
...this.counters,
|
|
357
|
-
size: this.cache.size,
|
|
358
|
-
maxSize: this.cache.getMaxEntries(),
|
|
359
|
-
totalLines,
|
|
360
|
-
totalBytes,
|
|
361
|
-
misses: this.counters.lookups - this.counters.hits,
|
|
362
|
-
};
|
|
363
|
-
}
|
|
364
|
-
}
|