@herbertgao/pi-extensions 2026.9.0 → 2026.9.2
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/node_modules/@czottmann/pi-automode/CHANGELOG.md +13 -1
- package/node_modules/@czottmann/pi-automode/README.md +20 -0
- package/node_modules/@czottmann/pi-automode/docs/GLOSSARY.md +1 -1
- package/node_modules/@czottmann/pi-automode/docs/automode-classifier-flow.md +2 -1
- package/node_modules/@czottmann/pi-automode/docs/defaults.md +3 -2
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/classifier.ts +38 -2
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/constants.ts +5 -3
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/extension.ts +11 -3
- package/node_modules/@czottmann/pi-automode/package.json +1 -1
- package/node_modules/@narumitw/pi-btw/README.md +57 -141
- package/node_modules/@narumitw/pi-btw/dist/index.ts +466 -41
- 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 +15 -1
- 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-plugins/fast-mode/README.md +5 -3
- package/node_modules/@pi-plugins/fast-mode/dist/index.d.mts.map +1 -1
- package/node_modules/@pi-plugins/fast-mode/dist/index.mjs +20 -55
- package/node_modules/@pi-plugins/fast-mode/dist/index.mjs.map +1 -1
- package/node_modules/@pi-plugins/fast-mode/package.json +1 -1
- package/node_modules/pi-lens/CHANGELOG.md +1072 -0
- package/node_modules/pi-lens/README.md +3 -0
- package/node_modules/pi-lens/config/biome/core.jsonc +11 -2
- package/node_modules/pi-lens/config/dependency-cruiser-eager-allowlist.json +13 -1
- package/node_modules/pi-lens/dist/clients/actionable-warnings-logger.js +2 -9
- package/node_modules/pi-lens/dist/clients/actionable-warnings.js +927 -80
- package/node_modules/pi-lens/dist/clients/advisory-provenance.js +1 -1
- package/node_modules/pi-lens/dist/clients/agent-behavior-client.js +13 -4
- package/node_modules/pi-lens/dist/clients/ast-grep-client.js +123 -3
- package/node_modules/pi-lens/dist/clients/ast-grep-rule-manager.js +60 -5
- package/node_modules/pi-lens/dist/clients/ast-grep-tool-logger.js +2 -9
- 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 -3
- package/node_modules/pi-lens/dist/clients/biome-client.js +9 -2
- package/node_modules/pi-lens/dist/clients/blocker-freshness.js +14 -6
- package/node_modules/pi-lens/dist/clients/bootstrap.js +509 -73
- package/node_modules/pi-lens/dist/clients/bounded-cache.js +152 -12
- package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +1 -1
- package/node_modules/pi-lens/dist/clients/bounded-telemetry.js +59 -9
- package/node_modules/pi-lens/dist/clients/bundled-resource-health.js +113 -0
- package/node_modules/pi-lens/dist/clients/bus-events-logger.js +3 -11
- package/node_modules/pi-lens/dist/clients/cache/rule-cache.js +31 -4
- package/node_modules/pi-lens/dist/clients/cache-manager.js +105 -6
- package/node_modules/pi-lens/dist/clients/cache-observability.js +40 -19
- package/node_modules/pi-lens/dist/clients/cargo-manifest.js +422 -0
- package/node_modules/pi-lens/dist/clients/cascade-logger.js +2 -9
- package/node_modules/pi-lens/dist/clients/child-unref.js +1 -19
- package/node_modules/pi-lens/dist/clients/code-quality-warnings.js +13 -3
- package/node_modules/pi-lens/dist/clients/complexity-client.js +16 -5
- package/node_modules/pi-lens/dist/clients/config-core/deny.js +221 -0
- package/node_modules/pi-lens/dist/clients/config-core/index.js +50 -0
- package/node_modules/pi-lens/dist/clients/config-core/merge.js +357 -0
- package/node_modules/pi-lens/dist/clients/config-core/normalize.js +340 -0
- package/node_modules/pi-lens/dist/clients/config-core/process-spec.js +248 -0
- package/node_modules/pi-lens/dist/clients/config-core/provenance.js +164 -0
- package/node_modules/pi-lens/dist/clients/config-core/records.js +218 -0
- package/node_modules/pi-lens/dist/clients/config-core/resolve.js +125 -0
- package/node_modules/pi-lens/dist/clients/config-core/safe-object.js +78 -0
- package/node_modules/pi-lens/dist/clients/config-core/schema.js +165 -0
- package/node_modules/pi-lens/dist/clients/config-diagnostic-codes.js +281 -0
- package/node_modules/pi-lens/dist/clients/config-locations.js +160 -0
- package/node_modules/pi-lens/dist/clients/config-resolve.js +789 -0
- package/node_modules/pi-lens/dist/clients/config-schema.js +234 -0
- package/node_modules/pi-lens/dist/clients/config-warn.js +407 -0
- package/node_modules/pi-lens/dist/clients/dead-code-client.js +19 -14
- package/node_modules/pi-lens/dist/clients/dead-code-logger.js +2 -6
- package/node_modules/pi-lens/dist/clients/deadline-utils.js +178 -0
- package/node_modules/pi-lens/dist/clients/debug-handles.js +2 -2
- package/node_modules/pi-lens/dist/clients/debug-heap.js +3 -3
- package/node_modules/pi-lens/dist/clients/deferred-lsp-work.js +106 -0
- package/node_modules/pi-lens/dist/clients/degradation-ledger.js +113 -7
- package/node_modules/pi-lens/dist/clients/dependency-checker.js +8 -19
- package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +1 -1
- package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +12 -9
- package/node_modules/pi-lens/dist/clients/diagnostic-logger.js +15 -5
- package/node_modules/pi-lens/dist/clients/dispatch/collect-later-tier.js +0 -4
- package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +162 -44
- package/node_modules/pi-lens/dist/clients/dispatch/fact-store.js +97 -0
- package/node_modules/pi-lens/dist/clients/dispatch/integration.js +27 -8
- 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 +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +383 -27
- package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +4 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/credo.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cue-vet.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/dart-analyze.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/detekt.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/dotnet-build.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/fact-rules.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/fish-indent.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/gleam-check.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/go-vet.js +1 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/golangci-lint.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-render.js +1 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ktlint.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +14 -18
- package/node_modules/pi-lens/dist/clients/dispatch/runners/php-lint.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/prisma-validate.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +6 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +7 -4
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rubocop.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ruff.js +1 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +1 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +1 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/spellcheck.js +4 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/spotbugs.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/swiftlint.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tree-sitter.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/availability-policy.js +3 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +3 -67
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +194 -80
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +84 -15
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils.js +0 -21
- package/node_modules/pi-lens/dist/clients/dispatch/runners/vale.js +0 -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 +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +0 -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 +3 -10
- package/node_modules/pi-lens/dist/clients/effective-config.js +403 -0
- package/node_modules/pi-lens/dist/clients/error-class.js +23 -0
- package/node_modules/pi-lens/dist/clients/event-loop-hold.js +274 -0
- package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +2 -2
- package/node_modules/pi-lens/dist/clients/extension-log.js +2 -2
- package/node_modules/pi-lens/dist/clients/feature-hints.js +2 -1
- package/node_modules/pi-lens/dist/clients/file-kinds.js +1 -38
- package/node_modules/pi-lens/dist/clients/file-time.js +7 -2
- package/node_modules/pi-lens/dist/clients/file-utils.js +117 -10
- package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +50 -13
- package/node_modules/pi-lens/dist/clients/format-service.js +6 -2
- package/node_modules/pi-lens/dist/clients/formatters.js +385 -104
- package/node_modules/pi-lens/dist/clients/freshness-cadence.js +17 -0
- package/node_modules/pi-lens/dist/clients/generated-artifacts.js +116 -22
- package/node_modules/pi-lens/dist/clients/generation-guard.js +4 -9
- package/node_modules/pi-lens/dist/clients/git-guard.js +6 -1
- package/node_modules/pi-lens/dist/clients/go-client.js +39 -0
- package/node_modules/pi-lens/dist/clients/gradle-ktfmt-style.js +252 -0
- package/node_modules/pi-lens/dist/clients/grammar-source.js +3 -3
- package/node_modules/pi-lens/dist/clients/hashline-anchor.js +424 -0
- package/node_modules/pi-lens/dist/clients/hook-budgets.js +76 -0
- package/node_modules/pi-lens/dist/clients/host-edit-normalize.js +5 -2
- package/node_modules/pi-lens/dist/clients/host-ports.js +1 -1
- package/node_modules/pi-lens/dist/clients/installer/index.js +289 -59
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh.js +84 -18
- package/node_modules/pi-lens/dist/clients/instance-reaper.js +110 -236
- package/node_modules/pi-lens/dist/clients/instance-registry.js +6 -3
- package/node_modules/pi-lens/dist/clients/language-profile.js +0 -9
- package/node_modules/pi-lens/dist/clients/language-registry.js +599 -0
- package/node_modules/pi-lens/dist/clients/latency-logger.js +165 -9
- package/node_modules/pi-lens/dist/clients/ledger-bounds.js +34 -1
- package/node_modules/pi-lens/dist/clients/lens-config.js +160 -30
- package/node_modules/pi-lens/dist/clients/lens-engine.js +33 -41
- package/node_modules/pi-lens/dist/clients/lens-events.js +1 -1
- package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +77 -6
- package/node_modules/pi-lens/dist/clients/lens-map.js +1 -1
- package/node_modules/pi-lens/dist/clients/log-cleanup.js +2 -38
- package/node_modules/pi-lens/dist/clients/lsp/aggregation.js +3 -1
- package/node_modules/pi-lens/dist/clients/lsp/client.js +172 -33
- package/node_modules/pi-lens/dist/clients/lsp/config.js +484 -158
- package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +1 -1
- package/node_modules/pi-lens/dist/clients/lsp/document-drift.js +1 -1
- package/node_modules/pi-lens/dist/clients/lsp/edits.js +18 -5
- package/node_modules/pi-lens/dist/clients/lsp/index.js +892 -96
- package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +1 -1
- package/node_modules/pi-lens/dist/clients/lsp/language.js +18 -177
- package/node_modules/pi-lens/dist/clients/lsp/launch.js +2 -1
- 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 +5 -18
- package/node_modules/pi-lens/dist/clients/lsp/server.js +284 -147
- package/node_modules/pi-lens/dist/clients/lsp/session-roots.js +116 -23
- package/node_modules/pi-lens/dist/clients/lsp/spawn-history.js +2 -7
- package/node_modules/pi-lens/dist/clients/lsp/sync-kind.js +0 -1
- package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +14 -7
- 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 +1 -1
- package/node_modules/pi-lens/dist/clients/lsp-document-symbols.js +1 -1
- package/node_modules/pi-lens/dist/clients/lsp-mutation.js +163 -21
- package/node_modules/pi-lens/dist/clients/map-with-concurrency.js +36 -0
- package/node_modules/pi-lens/dist/clients/mcp/analyze.js +33 -4
- package/node_modules/pi-lens/dist/clients/mcp/session.js +5 -16
- package/node_modules/pi-lens/dist/clients/memory-sampler.js +8 -3
- package/node_modules/pi-lens/dist/clients/metrics-history.js +28 -107
- package/node_modules/pi-lens/dist/clients/middle-man-analysis.js +3 -5
- package/node_modules/pi-lens/dist/clients/module-report.js +21 -46
- package/node_modules/pi-lens/dist/clients/mutating-tool.js +651 -0
- package/node_modules/pi-lens/dist/clients/mutation-attribution.js +368 -0
- package/node_modules/pi-lens/dist/clients/mutation-bridge.js +240 -0
- package/node_modules/pi-lens/dist/clients/ndjson-logger.js +247 -24
- package/node_modules/pi-lens/dist/clients/observed-mutation-sources.js +101 -0
- package/node_modules/pi-lens/dist/clients/observed-mutation.js +1215 -0
- package/node_modules/pi-lens/dist/clients/opaque-mutation-scan.js +70 -28
- package/node_modules/pi-lens/dist/clients/opengrep-config.js +5 -1
- package/node_modules/pi-lens/dist/clients/package-manager.js +195 -26
- package/node_modules/pi-lens/dist/clients/partial-edit-apply.js +359 -80
- package/node_modules/pi-lens/dist/clients/path-attribution-telemetry.js +23 -7
- package/node_modules/pi-lens/dist/clients/path-keyed-map.js +21 -2
- package/node_modules/pi-lens/dist/clients/path-utils.js +451 -15
- package/node_modules/pi-lens/dist/clients/performance-report.js +2 -2
- package/node_modules/pi-lens/dist/clients/persist-debounce.js +8 -1
- package/node_modules/pi-lens/dist/clients/php-cs-fixer-config.js +114 -0
- package/node_modules/pi-lens/dist/clients/pipeline.js +79 -18
- package/node_modules/pi-lens/dist/clients/probe-home-state.js +228 -0
- package/node_modules/pi-lens/dist/clients/process-bridge.js +66 -0
- package/node_modules/pi-lens/dist/clients/process-snapshot.js +68 -0
- 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 +4 -3
- 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 +28 -4
- package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +51 -20
- package/node_modules/pi-lens/dist/clients/project-lens-config.js +438 -122
- package/node_modules/pi-lens/dist/clients/project-scan-policy.js +3 -51
- package/node_modules/pi-lens/dist/clients/project-snapshot.js +52 -24
- package/node_modules/pi-lens/dist/clients/python-environment.js +217 -0
- package/node_modules/pi-lens/dist/clients/python-provenance.js +639 -0
- package/node_modules/pi-lens/dist/clients/quiet-window.js +6 -1
- package/node_modules/pi-lens/dist/clients/read-bridge.js +13 -21
- package/node_modules/pi-lens/dist/clients/read-expansion.js +9 -46
- package/node_modules/pi-lens/dist/clients/read-guard-logger.js +16 -5
- package/node_modules/pi-lens/dist/clients/read-guard-tool-lines.js +364 -212
- package/node_modules/pi-lens/dist/clients/read-guard.js +26 -2
- package/node_modules/pi-lens/dist/clients/recent-touches.js +2 -2
- package/node_modules/pi-lens/dist/clients/resource-sampler.js +195 -96
- package/node_modules/pi-lens/dist/clients/review-graph/builder.js +155 -114
- package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +1 -1
- package/node_modules/pi-lens/dist/clients/review-graph/service.js +55 -3
- package/node_modules/pi-lens/dist/clients/review-graph/shared-extraction-ir.js +7 -15
- package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +10 -74
- package/node_modules/pi-lens/dist/clients/review-graph-logger.js +9 -3
- package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +19 -3
- package/node_modules/pi-lens/dist/clients/runtime-context.js +49 -16
- package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +25 -6
- package/node_modules/pi-lens/dist/clients/runtime-session.js +184 -32
- package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +179 -36
- package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +797 -243
- package/node_modules/pi-lens/dist/clients/runtime-turn.js +1028 -53
- package/node_modules/pi-lens/dist/clients/rust-client.js +31 -0
- package/node_modules/pi-lens/dist/clients/safe-spawn.js +33 -10
- package/node_modules/pi-lens/dist/clients/sanitize.js +7 -12
- package/node_modules/pi-lens/dist/clients/scan-utils.js +1 -56
- package/node_modules/pi-lens/dist/clients/scratch-tree-policy.js +1 -3
- package/node_modules/pi-lens/dist/clients/security-scan-client.js +3 -0
- package/node_modules/pi-lens/dist/clients/session-lifecycle.js +1 -1
- package/node_modules/pi-lens/dist/clients/session-start-observability.js +79 -0
- package/node_modules/pi-lens/dist/clients/session-summary.js +0 -24
- package/node_modules/pi-lens/dist/clients/sessionstart-logger.js +12 -3
- package/node_modules/pi-lens/dist/clients/sgconfig.js +7 -6
- package/node_modules/pi-lens/dist/clients/shared-checkout-guard.js +1 -1
- package/node_modules/pi-lens/dist/clients/skills-resolver.js +105 -0
- package/node_modules/pi-lens/dist/clients/smells-rollup.js +4 -4
- package/node_modules/pi-lens/dist/clients/startup-scan.js +2 -10
- package/node_modules/pi-lens/dist/clients/string-utils.js +13 -0
- package/node_modules/pi-lens/dist/clients/subagent-mode.js +17 -4
- package/node_modules/pi-lens/dist/clients/test-runner-client.js +176 -39
- package/node_modules/pi-lens/dist/clients/test-runner-delivery.js +244 -0
- package/node_modules/pi-lens/dist/clients/tool-definition.js +41 -1
- package/node_modules/pi-lens/dist/clients/tool-policy.js +92 -22
- package/node_modules/pi-lens/dist/clients/tree-sitter-cache.js +40 -40
- package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +87 -100
- package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +2 -2
- package/node_modules/pi-lens/dist/clients/tree-sitter-query-loader.js +81 -1
- package/node_modules/pi-lens/dist/clients/tree-sitter-shared.js +51 -46
- package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +28 -0
- package/node_modules/pi-lens/dist/clients/tui-fit.js +0 -4
- package/node_modules/pi-lens/dist/clients/typos-config.js +5 -0
- package/node_modules/pi-lens/dist/clients/user-notify.js +6 -6
- package/node_modules/pi-lens/dist/clients/widget-state.js +191 -26
- package/node_modules/pi-lens/dist/clients/word-index-logger.js +2 -9
- package/node_modules/pi-lens/dist/clients/word-index-store.js +23 -12
- package/node_modules/pi-lens/dist/clients/word-index.js +252 -47
- package/node_modules/pi-lens/dist/clients/workspace-topology.js +8 -1
- package/node_modules/pi-lens/dist/clients/zizmor-config.js +4 -1
- package/node_modules/pi-lens/dist/index.js +65899 -55340
- package/node_modules/pi-lens/dist/mcp/analyze-cli.js +3 -1
- package/node_modules/pi-lens/dist/mcp/build-staleness.js +1 -1
- package/node_modules/pi-lens/dist/mcp/server.js +127 -5
- package/node_modules/pi-lens/dist/scripts/lib/process-scan.mjs +583 -0
- package/node_modules/pi-lens/dist/scripts/lib/skills-predicate.mjs +129 -0
- package/node_modules/pi-lens/dist/tools/effective-config.js +89 -0
- package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +96 -25
- package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +104 -86
- package/node_modules/pi-lens/dist/tools/lsp-navigation.js +37 -16
- package/node_modules/pi-lens/dist/tools/lsp-structured-output.js +3 -3
- package/node_modules/pi-lens/dist/tools/render-compact.js +1 -1
- package/node_modules/pi-lens/dist/tools/shared.js +0 -1
- package/node_modules/pi-lens/dist/tools/symbol-search.js +1 -2
- package/node_modules/pi-lens/docs/agent-guide.md +64 -1
- package/node_modules/pi-lens/docs/configuration.md +222 -0
- package/node_modules/pi-lens/docs/dependencies.md +3 -3
- package/node_modules/pi-lens/docs/features.md +44 -5
- package/node_modules/pi-lens/docs/globalconfig.md +20 -0
- package/node_modules/pi-lens/docs/language-coverage.md +2 -2
- package/node_modules/pi-lens/docs/lsp-capability-matrix.md +9 -1
- package/node_modules/pi-lens/docs/pi-lens-fixer.md +25 -0
- package/node_modules/pi-lens/docs/pi-lens-investigator.md +25 -0
- package/node_modules/pi-lens/docs/pi-lens-reviewer.md +33 -0
- package/node_modules/pi-lens/docs/pi-lens-subagent.md +49 -0
- package/node_modules/pi-lens/docs/pi-lens-warden.md +55 -0
- package/node_modules/pi-lens/docs/public-api-stability.md +359 -0
- package/node_modules/pi-lens/docs/release-qa-baseline.md +190 -0
- package/node_modules/pi-lens/docs/servercapabilities.md +7 -3
- package/node_modules/pi-lens/docs/subagent-compat.md +110 -30
- package/node_modules/pi-lens/docs/tree-sitter_rules_catalog.md +2 -2
- package/node_modules/pi-lens/docs/word-index.md +1 -1
- package/node_modules/pi-lens/package.json +18 -35
- package/node_modules/pi-lens/rules/tree-sitter-queries/python/python-cross-language-method.yml +3 -3
- package/node_modules/pi-lens/rules/tree-sitter-queries/python/python-hallucinated-import.yml +2 -2
- package/node_modules/pi-lens/rules/tree-sitter-queries/python/python-sql-injection.yml +12 -2
- package/node_modules/pi-lens/rules/typos/_typos.toml +4 -2
- package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +192 -1
- package/node_modules/pi-lens/scripts/install-selftest.mjs +58 -2
- package/node_modules/pi-lens/scripts/lib/skills-predicate.mjs +129 -0
- package/node_modules/pi-lens/scripts/lib/warm-loader-cache.mjs +1 -1
- package/node_modules/pi-lens/scripts/rpc-load-check.mjs +3 -1
- package/node_modules/pi-lens/scripts/warm-loader-cache.mjs +4 -2
- package/node_modules/pi-web-access/CHANGELOG.md +28 -0
- package/node_modules/pi-web-access/README.md +62 -15
- package/node_modules/pi-web-access/curator-page.ts +3 -1
- package/node_modules/pi-web-access/curator-server.ts +5 -1
- package/node_modules/pi-web-access/gemini-search.ts +8 -4
- package/node_modules/pi-web-access/github-extract.ts +242 -1
- package/node_modules/pi-web-access/index.ts +118 -64
- package/node_modules/pi-web-access/mistral-search.ts +281 -0
- package/node_modules/pi-web-access/package.json +2 -2
- package/node_modules/pi-web-access/perplexity.ts +14 -1
- package/node_modules/pi-web-access/utils.ts +23 -6
- package/node_modules/pi-web-access/xai-search.ts +96 -33
- package/package.json +6 -6
|
@@ -3,10 +3,14 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Manages persistent cache for scanner results and turn state.
|
|
5
5
|
* Provides read/write/freshness checks for:
|
|
6
|
-
* - Scanner cache:
|
|
7
|
-
* - Turn state:
|
|
6
|
+
* - Scanner cache: <project-data-dir>/cache/{scanner}.json
|
|
7
|
+
* - Turn state: <project-data-dir>/turn-state.json
|
|
8
8
|
*
|
|
9
|
-
*
|
|
9
|
+
* `<project-data-dir>` is `getProjectDataDir(cwd)` (clients/file-utils.ts) --
|
|
10
|
+
* `<cwd>/.pi-lens` only when that legacy directory already exists, otherwise
|
|
11
|
+
* `~/.pi-lens/projects/<slug>` or a `PILENS_DATA_DIR` location. Never assume
|
|
12
|
+
* the legacy spelling, and never show it to an agent: build a displayed path
|
|
13
|
+
* with `displayProjectDataPath` (#2521).
|
|
10
14
|
*/
|
|
11
15
|
import { createSubsystemLogger } from "./extension-log.js";
|
|
12
16
|
import * as fs from "node:fs";
|
|
@@ -14,7 +18,7 @@ import * as path from "node:path";
|
|
|
14
18
|
import { getProjectDataDir } from "./file-utils.js";
|
|
15
19
|
import { writeFileAtomic } from "./atomic-write.js";
|
|
16
20
|
import { readJsonCache } from "./json-cache-read.js";
|
|
17
|
-
import { normalizeMapKey } from "./path-utils.js";
|
|
21
|
+
import { isUnderDir, normalizeMapKey } from "./path-utils.js";
|
|
18
22
|
// --- Defaults ---
|
|
19
23
|
const DEFAULT_MAX_AGE_MS = 30 * 60 * 1000; // 30 minutes
|
|
20
24
|
const DEFAULT_TURN_STATE = {
|
|
@@ -58,6 +62,31 @@ export class CacheManager {
|
|
|
58
62
|
/**
|
|
59
63
|
* Get turn-state entry for a file path using normalized lookup.
|
|
60
64
|
*/
|
|
65
|
+
/**
|
|
66
|
+
* #2504: is this path inside the PROJECT the worklist belongs to?
|
|
67
|
+
*
|
|
68
|
+
* Routed through `isUnderDir` (which normalises via `normalizeFilePath`) so
|
|
69
|
+
* the answer is separator- and case-form independent, the same key rule
|
|
70
|
+
* every other turn-state map obeys.
|
|
71
|
+
*
|
|
72
|
+
* The root is the PROJECT root, not the caller's `cwd` (#2504 review round
|
|
73
|
+
* 2, F1). The two coincide for every producer whose `cwd` IS the session
|
|
74
|
+
* root, but not for `clients/lsp-mutation.ts`: `tools/lsp-navigation.ts`
|
|
75
|
+
* threads a `cwd`-scoped context for a call issued from a sub-package
|
|
76
|
+
* directory, so a monorepo-wide server's edit on a SIBLING package is
|
|
77
|
+
* inside the project and outside that `cwd`. Judging it against `cwd`
|
|
78
|
+
* dropped exactly the server-initiated edits #2450/#2479 exist to record.
|
|
79
|
+
* This is the same root `isRecordableProjectPath` (clients/file-utils.ts)
|
|
80
|
+
* is given at that call site — one predicate root, taken from
|
|
81
|
+
* `runtime.projectRoot`, not two that can disagree.
|
|
82
|
+
*/
|
|
83
|
+
isTurnStatePathWithinRoot(filePath, projectRoot) {
|
|
84
|
+
const root = path.resolve(projectRoot);
|
|
85
|
+
const abs = path.resolve(root, filePath);
|
|
86
|
+
if (normalizeMapKey(abs) === normalizeMapKey(root))
|
|
87
|
+
return false;
|
|
88
|
+
return isUnderDir(abs, root);
|
|
89
|
+
}
|
|
61
90
|
getTurnFileState(filePath, cwd) {
|
|
62
91
|
const state = this.readTurnState(cwd);
|
|
63
92
|
const key = this.toTurnStateKey(filePath, cwd);
|
|
@@ -217,9 +246,22 @@ export class CacheManager {
|
|
|
217
246
|
/** Return whether a writer may read/write this workspace worklist. */
|
|
218
247
|
getTurnStateAccess(cwd, owner) {
|
|
219
248
|
const state = this.readTurnState(cwd);
|
|
249
|
+
const hasFiles = Object.keys(state.files ?? {}).length > 0;
|
|
220
250
|
if (!state.owner) {
|
|
221
|
-
if (!state.sessionId || state.sessionId === owner.id)
|
|
251
|
+
if (!state.sessionId || state.sessionId === owner.id) {
|
|
252
|
+
// #2504: an OWNERLESS state was unconditionally "owned" here, and
|
|
253
|
+
// ownerless was the resting shape (pre-#2504 `clearTurnState`
|
|
254
|
+
// dropped the owner and `addModifiedRange` only stamps one when a
|
|
255
|
+
// sessionId is supplied). A worklist persisted by a session that
|
|
256
|
+
// has since exited was therefore adopted wholesale by the next
|
|
257
|
+
// session — 154 historical paths reported as "modified this turn"
|
|
258
|
+
// on a turn that made no tool calls at all. A worklist whose last
|
|
259
|
+
// write predates this session's start is not this session's work.
|
|
260
|
+
if (hasFiles && this.turnStatePredatesSession(state, owner)) {
|
|
261
|
+
return "available";
|
|
262
|
+
}
|
|
222
263
|
return "owned";
|
|
264
|
+
}
|
|
223
265
|
// Pre-owner files have no liveness information. Preserve the existing
|
|
224
266
|
// stale-session eviction behavior for this legacy shape.
|
|
225
267
|
return "available";
|
|
@@ -227,10 +269,35 @@ export class CacheManager {
|
|
|
227
269
|
if (state.owner.kind === owner.kind && state.owner.id === owner.id) {
|
|
228
270
|
return "owned";
|
|
229
271
|
}
|
|
272
|
+
// #2504: an EMPTY worklist carries nothing to protect, so it never
|
|
273
|
+
// latches a foreign writer out. This keeps the new `clearTurnState`
|
|
274
|
+
// owner stamp from turning a cleared worklist into a cross-process lock:
|
|
275
|
+
// an MCP writer in another process must still be able to register work
|
|
276
|
+
// against a worklist a pi session just cleared, exactly as it could when
|
|
277
|
+
// clearing left the state ownerless.
|
|
278
|
+
if (!hasFiles)
|
|
279
|
+
return "owned";
|
|
230
280
|
return this.isTurnStateOwnerStale(state.owner)
|
|
231
281
|
? "available"
|
|
232
282
|
: "foreign-live";
|
|
233
283
|
}
|
|
284
|
+
/**
|
|
285
|
+
* #2504: true when this worklist was last written before the asking
|
|
286
|
+
* session began. `lastUpdated` is restamped by `writeTurnState` on EVERY
|
|
287
|
+
* write (add/clear/cycle), so a live session's own worklist is always
|
|
288
|
+
* newer than its start; only a carried-over file can be older. An
|
|
289
|
+
* unparseable stamp is treated as stale — a worklist we cannot date is
|
|
290
|
+
* exactly the legacy shape this gate exists to evict.
|
|
291
|
+
*/
|
|
292
|
+
turnStatePredatesSession(state, owner) {
|
|
293
|
+
const startedAt = owner.sessionStartedAt;
|
|
294
|
+
if (startedAt === undefined || !Number.isFinite(startedAt))
|
|
295
|
+
return false;
|
|
296
|
+
const lastUpdated = Date.parse(state.lastUpdated ?? "");
|
|
297
|
+
if (!Number.isFinite(lastUpdated))
|
|
298
|
+
return true;
|
|
299
|
+
return lastUpdated < startedAt;
|
|
300
|
+
}
|
|
234
301
|
isTurnStateOwnerStale(owner) {
|
|
235
302
|
if (owner.pid > 0 && owner.pid !== process.pid) {
|
|
236
303
|
try {
|
|
@@ -250,7 +317,24 @@ export class CacheManager {
|
|
|
250
317
|
* current owner; callers must provide an explicit owner id to claim a stale
|
|
251
318
|
* worklist.
|
|
252
319
|
*/
|
|
253
|
-
addModifiedRange(filePath, range, importsChanged, cwd, sessionId, ownerKind = "pi") {
|
|
320
|
+
addModifiedRange(filePath, range, importsChanged, cwd, sessionId, ownerKind = "pi", projectRoot) {
|
|
321
|
+
// #2504: the worklist is a PROJECT worklist. A path outside the project
|
|
322
|
+
// was accepted and keyed by its absolute path, so a prior session's
|
|
323
|
+
// scratchpad, `~/.claude/plans/*.md` and `~/.plegma/work/.../TASK.md`
|
|
324
|
+
// all became "modified files" that turn_end then fed to the test runner
|
|
325
|
+
// and opened in an LSP client. Reject before the owner stamp below, so
|
|
326
|
+
// an out-of-project write cannot claim the worklist either.
|
|
327
|
+
//
|
|
328
|
+
// `projectRoot` defaults to `cwd` — true for every producer whose cwd
|
|
329
|
+
// IS the session root. A caller whose `cwd` is NARROWER than the
|
|
330
|
+
// project (an LSP call issued from a sub-package directory) passes the
|
|
331
|
+
// real root explicitly; `cwd` still selects which `turn-state.json`
|
|
332
|
+
// the entry lands in, exactly as before (#2504 review round 2, F1).
|
|
333
|
+
const containmentRoot = projectRoot ?? cwd;
|
|
334
|
+
if (!this.isTurnStatePathWithinRoot(filePath, containmentRoot)) {
|
|
335
|
+
this.log(`turn-state: rejected out-of-project path ${filePath} (project root ${containmentRoot})`);
|
|
336
|
+
return this.readTurnState(cwd);
|
|
337
|
+
}
|
|
254
338
|
const state = this.readTurnState(cwd);
|
|
255
339
|
if (sessionId) {
|
|
256
340
|
const owner = {
|
|
@@ -293,10 +377,25 @@ export class CacheManager {
|
|
|
293
377
|
const isCurrentOwner = this.getTurnStateAccess(cwd, owner) !== "foreign-live";
|
|
294
378
|
if (!isCurrentOwner && process.pid !== currentState.owner?.pid)
|
|
295
379
|
return false;
|
|
380
|
+
// #2504: stamp the CLEARING owner. Dropping `owner`/`sessionId` here made
|
|
381
|
+
// ownerless the resting shape of turn-state.json, which is what let the
|
|
382
|
+
// next session read a carried-over worklist as its own. A cleared state
|
|
383
|
+
// now says who cleared it and when, so `getTurnStateAccess` can judge it
|
|
384
|
+
// by liveness like any other owned state — and, since the worklist is
|
|
385
|
+
// empty, the stamp never latches another writer out (see the
|
|
386
|
+
// empty-worklist branch there).
|
|
296
387
|
const state = {
|
|
297
388
|
...DEFAULT_TURN_STATE,
|
|
298
389
|
files: {}, // fresh object — DEFAULT_TURN_STATE.files can be polluted by addModifiedRange
|
|
299
390
|
lastUpdated: new Date().toISOString(),
|
|
391
|
+
sessionId: owner.id,
|
|
392
|
+
owner: {
|
|
393
|
+
kind: owner.kind,
|
|
394
|
+
id: owner.id,
|
|
395
|
+
pid: process.pid,
|
|
396
|
+
lastSeen: new Date().toISOString(),
|
|
397
|
+
sessionStartedAt: owner.sessionStartedAt,
|
|
398
|
+
},
|
|
300
399
|
};
|
|
301
400
|
this.writeTurnState(state, cwd);
|
|
302
401
|
return true;
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
* event handlers.
|
|
49
49
|
*/
|
|
50
50
|
import { createHash } from "node:crypto";
|
|
51
|
+
import { BoundedFifoMap, BoundedLruCache } from "./bounded-cache.js";
|
|
51
52
|
import { lazyEnvNumber } from "./env-utils.js";
|
|
52
53
|
import { logLatency } from "./latency-logger.js";
|
|
53
54
|
import { compareOrdinal } from "./string-utils.js";
|
|
@@ -90,7 +91,7 @@ const CHARS_PER_ESTIMATED_TOKEN = 4;
|
|
|
90
91
|
*/
|
|
91
92
|
export const DEFAULT_PROVIDER_CACHE_TTL_MS = 60_000;
|
|
92
93
|
const _providerCacheTtl = lazyEnvNumber("PI_LENS_PROVIDER_CACHE_TTL_MS", DEFAULT_PROVIDER_CACHE_TTL_MS);
|
|
93
|
-
|
|
94
|
+
const getProviderCacheTtlMs = _providerCacheTtl.get;
|
|
94
95
|
export const _resetProviderCacheTtlForTests = _providerCacheTtl._resetForTests;
|
|
95
96
|
/**
|
|
96
97
|
* A turn counts as "anomalously low" when it reads back less than half of what
|
|
@@ -161,7 +162,11 @@ function newCacheUsageSummary() {
|
|
|
161
162
|
unknownEvidenceReasons: emptyUnknownEvidenceReasons(),
|
|
162
163
|
};
|
|
163
164
|
}
|
|
164
|
-
|
|
165
|
+
// Shared cap for every per-session bounded map in this module (also used by
|
|
166
|
+
// `prefixHashBySession` below) — a long-lived process cycling through many
|
|
167
|
+
// sessions cannot grow any of them without limit.
|
|
168
|
+
export const MAX_TRACKED_SESSIONS = 32;
|
|
169
|
+
const attributionBySession = new BoundedLruCache(MAX_TRACKED_SESSIONS);
|
|
165
170
|
function newAttributionState() {
|
|
166
171
|
return {
|
|
167
172
|
prefixBrokeSinceLastUsage: false,
|
|
@@ -183,14 +188,9 @@ function newAttributionState() {
|
|
|
183
188
|
function attributionFor(key) {
|
|
184
189
|
const existing = attributionBySession.get(key);
|
|
185
190
|
const state = existing ?? newAttributionState();
|
|
186
|
-
|
|
191
|
+
// `get` above already moved an existing entry to MRU; `set` below also
|
|
192
|
+
// refreshes recency on a create, so every fetch counts as a touch.
|
|
187
193
|
attributionBySession.set(key, state);
|
|
188
|
-
while (attributionBySession.size > MAX_TRACKED_SESSIONS) {
|
|
189
|
-
const oldest = attributionBySession.keys().next().value;
|
|
190
|
-
if (oldest === undefined)
|
|
191
|
-
break;
|
|
192
|
-
attributionBySession.delete(oldest);
|
|
193
|
-
}
|
|
194
194
|
return state;
|
|
195
195
|
}
|
|
196
196
|
/**
|
|
@@ -999,11 +999,13 @@ function hashFirstMessage(first) {
|
|
|
999
999
|
* session state (read guard #1041, widget #190) which IS rehydrated from the
|
|
1000
1000
|
* sidecar.
|
|
1001
1001
|
*
|
|
1002
|
-
* Bounded as
|
|
1003
|
-
*
|
|
1002
|
+
* Bounded as insertion-ordered FIFO (evict oldest-inserted past the cap,
|
|
1003
|
+
* refreshed on every WRITE by {@link recordSessionHash}'s delete+set — a
|
|
1004
|
+
* plain read never reorders) so a long-lived process cycling through many
|
|
1005
|
+
* sessions can't grow this unbounded. Shares {@link MAX_TRACKED_SESSIONS}
|
|
1006
|
+
* with `attributionBySession` above.
|
|
1004
1007
|
*/
|
|
1005
|
-
const
|
|
1006
|
-
const prefixHashBySession = new Map();
|
|
1008
|
+
const prefixHashBySession = new BoundedFifoMap(MAX_TRACKED_SESSIONS);
|
|
1007
1009
|
/**
|
|
1008
1010
|
* Reported key used when no session id is available (undefined/empty). Internal
|
|
1009
1011
|
* attribution additionally separates primary and concurrent-secondary roles;
|
|
@@ -1019,12 +1021,6 @@ const NO_SESSION_KEY = "<no-session>";
|
|
|
1019
1021
|
function recordSessionHash(key, hash) {
|
|
1020
1022
|
prefixHashBySession.delete(key);
|
|
1021
1023
|
prefixHashBySession.set(key, hash);
|
|
1022
|
-
while (prefixHashBySession.size > MAX_TRACKED_SESSIONS) {
|
|
1023
|
-
const oldest = prefixHashBySession.keys().next().value;
|
|
1024
|
-
if (oldest === undefined)
|
|
1025
|
-
break;
|
|
1026
|
-
prefixHashBySession.delete(oldest);
|
|
1027
|
-
}
|
|
1028
1024
|
}
|
|
1029
1025
|
/**
|
|
1030
1026
|
* Part 2 — observe `messages[0]` stability turn-over-turn, keyed by session id.
|
|
@@ -1169,3 +1165,28 @@ export function resetCachePrefixObservation() {
|
|
|
1169
1165
|
prefixHashBySession.clear();
|
|
1170
1166
|
attributionBySession.clear();
|
|
1171
1167
|
}
|
|
1168
|
+
export function _attributionBySessionHasForTests(key) {
|
|
1169
|
+
return attributionBySession.has(key);
|
|
1170
|
+
}
|
|
1171
|
+
export function _prefixHashBySessionHasForTests(key) {
|
|
1172
|
+
return prefixHashBySession.has(key);
|
|
1173
|
+
}
|
|
1174
|
+
/** #2442 test-only: drive attributionFor's fetch-or-create touch directly
|
|
1175
|
+
* (every call refreshes LRU recency, matching production — see
|
|
1176
|
+
* attributionFor's own doc comment). */
|
|
1177
|
+
export function _touchAttributionForTests(key) {
|
|
1178
|
+
attributionFor(key);
|
|
1179
|
+
}
|
|
1180
|
+
/** #2442 test-only: drive recordSessionHash's write-refresh directly. */
|
|
1181
|
+
export function _recordSessionHashForTests(key, hash) {
|
|
1182
|
+
recordSessionHash(key, hash);
|
|
1183
|
+
}
|
|
1184
|
+
/**
|
|
1185
|
+
* #2442 test-only: the exact `prefixHashBySession.get(key)` that
|
|
1186
|
+
* `observeCachePrefix` performs to fetch a session's previous hash. A
|
|
1187
|
+
* `.has()` reorders nothing on either bounded class, so only a real `get`
|
|
1188
|
+
* can pin FIFO-vs-LRU behavior (#2442 review F4).
|
|
1189
|
+
*/
|
|
1190
|
+
export function _prefixHashBySessionGetForTests(key) {
|
|
1191
|
+
return prefixHashBySession.get(key);
|
|
1192
|
+
}
|