@herbertgao/pi-extensions 2026.10.1 → 2026.10.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/README.md +13 -9
- package/THIRD_PARTY_NOTICES.md +2 -2
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-audit.md +2 -2
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-debt.md +2 -2
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-gain.md +1 -1
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-help.md +1 -1
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-review.md +2 -2
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail.md +1 -1
- package/node_modules/@dietrichgebert/ponytail/.qoder/rules/ponytail.md +21 -21
- package/node_modules/@dietrichgebert/ponytail/.qoder-plugin/plugin.json +1 -1
- package/node_modules/@dietrichgebert/ponytail/AGENTS.md +21 -21
- package/node_modules/@dietrichgebert/ponytail/README.md +68 -72
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-activate.js +7 -0
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-instructions.js +30 -30
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-map.js +103 -0
- package/node_modules/@dietrichgebert/ponytail/package.json +2 -2
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail/SKILL.md +33 -101
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-audit/SKILL.md +89 -32
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-debt/SKILL.md +13 -12
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-gain/SKILL.md +17 -16
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-help/SKILL.md +9 -10
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-review/SKILL.md +96 -57
- package/node_modules/@herbertgao/pi-agency/LICENSE +21 -0
- package/node_modules/@herbertgao/pi-agency/README.md +40 -0
- package/node_modules/@herbertgao/pi-agency/package.json +53 -0
- package/node_modules/@herbertgao/pi-agency/src/index.ts +441 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +12 -12
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +30 -6
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +15 -9
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +27 -9
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/codemode.ts +4 -1
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +2 -2
- package/node_modules/@narumitw/pi-caffeinate/package.json +3 -3
- package/node_modules/@tifan/pi-mermaid-open/package.json +5 -1
- package/node_modules/@tifan/pi-mermaid-open/src/index.ts +26 -9
- package/node_modules/@tifan/pi-recap/package.json +1 -1
- package/node_modules/@tifan/pi-recap/src/index.ts +104 -20
- package/node_modules/@tifan/pi-recap/src/models.ts +46 -4
- package/node_modules/pi-antigravity/README.md +23 -2
- package/node_modules/pi-antigravity/package.json +5 -3
- package/node_modules/pi-antigravity/src/diagnostics/diagnostics.ts +3 -2
- package/node_modules/pi-antigravity/src/features/generate-image.ts +72 -0
- package/node_modules/pi-antigravity/src/features/google-search.ts +71 -0
- package/node_modules/pi-antigravity/src/image/image.ts +86 -47
- package/node_modules/pi-antigravity/src/image/native.ts +69 -0
- package/node_modules/pi-antigravity/src/index.ts +52 -137
- package/node_modules/pi-antigravity/src/search/search.ts +130 -31
- package/node_modules/pi-antigravity/src/stream/stream.ts +162 -113
- package/node_modules/pi-antigravity/src/types/enums.ts +1 -0
- package/node_modules/pi-antigravity/src/types/types.ts +1 -1
- package/node_modules/pi-antigravity/src/utils/security.ts +47 -1
- package/node_modules/pi-antigravity/src/utils/util.ts +38 -6
- package/node_modules/pi-lens/CHANGELOG.md +1064 -0
- package/node_modules/pi-lens/README.md +115 -25
- package/node_modules/pi-lens/config/dependency-cruiser-eager-allowlist.json +6 -2
- package/node_modules/pi-lens/dist/chunk-22AVIGXS.js +560 -0
- package/node_modules/pi-lens/dist/chunk-27BBHSZC.js +106 -0
- package/node_modules/pi-lens/dist/chunk-2BEMIWEW.js +51 -0
- package/node_modules/pi-lens/dist/chunk-2EECBNC5.js +89 -0
- package/node_modules/pi-lens/dist/chunk-34U7PLGE.js +23 -0
- package/node_modules/pi-lens/dist/chunk-3I5QFT3N.js +181 -0
- package/node_modules/pi-lens/dist/chunk-3MED75HT.js +37 -0
- package/node_modules/pi-lens/dist/chunk-47D2BO4S.js +87 -0
- package/node_modules/pi-lens/dist/chunk-4RERDEXR.js +348 -0
- package/node_modules/pi-lens/dist/chunk-4W2PLC4J.js +27 -0
- package/node_modules/pi-lens/dist/chunk-52H5B5TC.js +202 -0
- package/node_modules/pi-lens/dist/chunk-54B42YRX.js +27 -0
- package/node_modules/pi-lens/dist/chunk-5RXBNSW2.js +266 -0
- package/node_modules/pi-lens/dist/chunk-5THXD6X5.js +201 -0
- package/node_modules/pi-lens/dist/chunk-5W3R6LFT.js +24 -0
- package/node_modules/pi-lens/dist/chunk-5ZEJHV35.js +341 -0
- package/node_modules/pi-lens/dist/chunk-6P62QVEA.js +118 -0
- package/node_modules/pi-lens/dist/chunk-6QIUX4EP.js +459 -0
- package/node_modules/pi-lens/dist/chunk-6VCD4VKZ.js +78 -0
- package/node_modules/pi-lens/dist/chunk-7F72PXY2.js +326 -0
- package/node_modules/pi-lens/dist/chunk-7FBF7NPR.js +998 -0
- package/node_modules/pi-lens/dist/chunk-7U2IDNXN.js +37 -0
- package/node_modules/pi-lens/dist/chunk-ABBOA7UD.js +157 -0
- package/node_modules/pi-lens/dist/chunk-AHDW3GPE.js +50 -0
- package/node_modules/pi-lens/dist/chunk-AJ3QXTRQ.js +756 -0
- package/node_modules/pi-lens/dist/chunk-AJVLWNFN.js +1610 -0
- package/node_modules/pi-lens/dist/chunk-AJXODZY6.js +112 -0
- package/node_modules/pi-lens/dist/chunk-ARFCXG7S.js +84 -0
- package/node_modules/pi-lens/dist/chunk-AS44CFQ4.js +708 -0
- package/node_modules/pi-lens/dist/chunk-AWE5TMPO.js +38 -0
- package/node_modules/pi-lens/dist/chunk-B3I2UUT4.js +4692 -0
- package/node_modules/pi-lens/dist/chunk-BRJKOBZP.js +331 -0
- package/node_modules/pi-lens/dist/chunk-BW5KFIQC.js +59 -0
- package/node_modules/pi-lens/dist/chunk-C2AUYXQH.js +149 -0
- package/node_modules/pi-lens/dist/chunk-CGGAIP7J.js +29 -0
- package/node_modules/pi-lens/dist/chunk-D6QS3U6M.js +30 -0
- package/node_modules/pi-lens/dist/chunk-DFVMIKMQ.js +349 -0
- package/node_modules/pi-lens/dist/chunk-DIULIWKU.js +169 -0
- package/node_modules/pi-lens/dist/chunk-DQ2NZ7C4.js +2317 -0
- package/node_modules/pi-lens/dist/chunk-E2WFBRHM.js +213 -0
- package/node_modules/pi-lens/dist/chunk-E4MAEDPM.js +50 -0
- package/node_modules/pi-lens/dist/chunk-EOKRQ3SA.js +30 -0
- package/node_modules/pi-lens/dist/chunk-F3AU2TMM.js +2626 -0
- package/node_modules/pi-lens/dist/chunk-F3P7VQ7H.js +170 -0
- package/node_modules/pi-lens/dist/chunk-FC4RP4I2.js +12 -0
- package/node_modules/pi-lens/dist/chunk-FJNKANOS.js +32 -0
- package/node_modules/pi-lens/dist/chunk-GUOGVTCQ.js +146 -0
- package/node_modules/pi-lens/dist/chunk-GVXA6CCE.js +18 -0
- package/node_modules/pi-lens/dist/chunk-HHYAELLJ.js +2334 -0
- package/node_modules/pi-lens/dist/chunk-HMFXILPV.js +83 -0
- package/node_modules/pi-lens/dist/chunk-HVUZXSWK.js +421 -0
- package/node_modules/pi-lens/dist/chunk-HWBZIGMJ.js +62 -0
- package/node_modules/pi-lens/dist/chunk-I3R7GKDR.js +17 -0
- package/node_modules/pi-lens/dist/chunk-I7SPGOWI.js +55 -0
- package/node_modules/pi-lens/dist/chunk-IIXOAGHR.js +38 -0
- package/node_modules/pi-lens/dist/chunk-IVP5KAB7.js +2250 -0
- package/node_modules/pi-lens/dist/chunk-IXEBJSUE.js +22 -0
- package/node_modules/pi-lens/dist/chunk-JOLITGCC.js +27 -0
- package/node_modules/pi-lens/dist/chunk-K6VYLB2U.js +145 -0
- package/node_modules/pi-lens/dist/chunk-LJDODBBZ.js +78 -0
- package/node_modules/pi-lens/dist/chunk-LNAKEO63.js +78 -0
- package/node_modules/pi-lens/dist/chunk-LSMJ6KBE.js +4139 -0
- package/node_modules/pi-lens/dist/chunk-LW6XKDZQ.js +5565 -0
- package/node_modules/pi-lens/dist/chunk-N3YQJI6O.js +899 -0
- package/node_modules/pi-lens/dist/chunk-NABLC7W3.js +148 -0
- package/node_modules/pi-lens/dist/chunk-NKOUFPQF.js +659 -0
- package/node_modules/pi-lens/dist/chunk-NL5GLMFI.js +211 -0
- package/node_modules/pi-lens/dist/chunk-NMABWBZN.js +327 -0
- package/node_modules/pi-lens/dist/chunk-NTHH2J74.js +27 -0
- package/node_modules/pi-lens/dist/chunk-NTUJEGDZ.js +59 -0
- package/node_modules/pi-lens/dist/chunk-NXL4FFQQ.js +47 -0
- package/node_modules/pi-lens/dist/chunk-NXPS2L6U.js +466 -0
- package/node_modules/pi-lens/dist/chunk-O5WILGMI.js +42 -0
- package/node_modules/pi-lens/dist/chunk-O6TQT6RI.js +48 -0
- package/node_modules/pi-lens/dist/chunk-OAXNDZJ7.js +323 -0
- package/node_modules/pi-lens/dist/chunk-ODEEOXPH.js +44 -0
- package/node_modules/pi-lens/dist/chunk-OQGFCZJ4.js +4533 -0
- package/node_modules/pi-lens/dist/chunk-ORTMY4Q4.js +282 -0
- package/node_modules/pi-lens/dist/chunk-OS32RNR2.js +442 -0
- package/node_modules/pi-lens/dist/chunk-PAK6IDME.js +189 -0
- package/node_modules/pi-lens/dist/chunk-PWFHBTSF.js +406 -0
- package/node_modules/pi-lens/dist/chunk-Q5U6FMDI.js +2352 -0
- package/node_modules/pi-lens/dist/chunk-QOZXJ4NA.js +3364 -0
- package/node_modules/pi-lens/dist/chunk-QYF5S6P6.js +45 -0
- package/node_modules/pi-lens/dist/chunk-RIISMHKN.js +36 -0
- package/node_modules/pi-lens/dist/chunk-RPD4ZSB7.js +25 -0
- package/node_modules/pi-lens/dist/chunk-RPD5K5NC.js +79 -0
- package/node_modules/pi-lens/dist/chunk-RUOG5D2C.js +262 -0
- package/node_modules/pi-lens/dist/chunk-T4ERT73Y.js +599 -0
- package/node_modules/pi-lens/dist/chunk-T6D4Q4AQ.js +54 -0
- package/node_modules/pi-lens/dist/chunk-TGPXLY2J.js +391 -0
- package/node_modules/pi-lens/dist/chunk-TLGFBM3F.js +12116 -0
- package/node_modules/pi-lens/dist/chunk-TO6WL3GM.js +88 -0
- package/node_modules/pi-lens/dist/chunk-TT22N74J.js +517 -0
- package/node_modules/pi-lens/dist/chunk-TVN5N6GY.js +21216 -0
- package/node_modules/pi-lens/dist/chunk-U3VGR4VU.js +308 -0
- package/node_modules/pi-lens/dist/chunk-UK3CMEAL.js +1250 -0
- package/node_modules/pi-lens/dist/chunk-UOPVJQ4N.js +103 -0
- package/node_modules/pi-lens/dist/chunk-UXVNL3D7.js +23 -0
- package/node_modules/pi-lens/dist/chunk-UY752QSN.js +45 -0
- package/node_modules/pi-lens/dist/chunk-V5PXFSZK.js +188 -0
- package/node_modules/pi-lens/dist/chunk-V7R425XG.js +398 -0
- package/node_modules/pi-lens/dist/chunk-VCSRSYLF.js +81 -0
- package/node_modules/pi-lens/dist/chunk-VD4JQCQC.js +162 -0
- package/node_modules/pi-lens/dist/chunk-VDBPVIKD.js +62 -0
- package/node_modules/pi-lens/dist/chunk-VHQLPIRJ.js +114 -0
- package/node_modules/pi-lens/dist/chunk-VN2AXLEX.js +5414 -0
- package/node_modules/pi-lens/dist/chunk-VNMT7C64.js +478 -0
- package/node_modules/pi-lens/dist/chunk-WONERJTP.js +309 -0
- package/node_modules/pi-lens/dist/chunk-XECLWQZN.js +85 -0
- package/node_modules/pi-lens/dist/chunk-XIMYZ3JA.js +27 -0
- package/node_modules/pi-lens/dist/chunk-XK4CIILI.js +144 -0
- package/node_modules/pi-lens/dist/chunk-Y4T27COV.js +562 -0
- package/node_modules/pi-lens/dist/chunk-YGVYKNSN.js +1860 -0
- package/node_modules/pi-lens/dist/chunk-YLF3PPT5.js +308 -0
- package/node_modules/pi-lens/dist/chunk-YSNFMJKN.js +14 -0
- package/node_modules/pi-lens/dist/chunk-Z3CCVDUB.js +76 -0
- package/node_modules/pi-lens/dist/chunk-Z54ZSOBZ.js +61 -0
- package/node_modules/pi-lens/dist/chunk-ZAWW3AF6.js +97 -0
- package/node_modules/pi-lens/dist/chunk-ZMOL6RQC.js +167 -0
- package/node_modules/pi-lens/dist/index.js +16456 -8335
- package/node_modules/pi-lens/dist/mcp/analyze-cli.js +186 -232
- package/node_modules/pi-lens/dist/mcp/cli.js +137 -98
- package/node_modules/pi-lens/dist/mcp/server.js +22589 -1573
- package/node_modules/pi-lens/dist/mcp/worker.js +97 -38
- package/node_modules/pi-lens/dist/probes/installer.js +135 -0
- package/node_modules/pi-lens/dist/workers/project-snapshot-persist-worker.js +22 -0
- package/node_modules/pi-lens/dist/workers/review-graph-persist-worker.js +15 -0
- package/node_modules/pi-lens/docs/agent-guide.md +13 -4
- package/node_modules/pi-lens/docs/agent-tools.md +42 -0
- package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +3 -2
- package/node_modules/pi-lens/docs/configuration.md +20 -1
- package/node_modules/pi-lens/docs/environment-variables.md +52 -2
- package/node_modules/pi-lens/docs/features.md +8 -4
- package/node_modules/pi-lens/docs/globalconfig.md +1 -0
- package/node_modules/pi-lens/docs/io-bridge-v2-migration.md +94 -0
- package/node_modules/pi-lens/docs/lsp-capability-matrix.md +36 -4
- package/node_modules/pi-lens/docs/lsp-idle-eviction.md +124 -0
- package/node_modules/pi-lens/docs/mcp.md +21 -5
- package/node_modules/pi-lens/docs/merge-queue-rollout.md +77 -0
- package/node_modules/pi-lens/docs/pi-lens-fixer.md +156 -88
- package/node_modules/pi-lens/docs/pi-lens-investigator.md +74 -26
- package/node_modules/pi-lens/docs/pi-lens-merge-policy.md +694 -0
- package/node_modules/pi-lens/docs/pi-lens-monitor.md +73 -7
- package/node_modules/pi-lens/docs/pi-lens-retro.md +6 -4
- package/node_modules/pi-lens/docs/pi-lens-reviewer.md +188 -48
- package/node_modules/pi-lens/docs/pi-lens-subagent.md +246 -45
- package/node_modules/pi-lens/docs/pi-lens-warden.md +18 -7
- package/node_modules/pi-lens/docs/public-api-stability.md +55 -0
- package/node_modules/pi-lens/docs/release-qa-baseline.md +84 -17
- package/node_modules/pi-lens/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
- package/node_modules/pi-lens/docs/servercapabilities.md +53 -49
- package/node_modules/pi-lens/docs/settings.md +1 -0
- package/node_modules/pi-lens/docs/usage.md +5 -1
- package/node_modules/pi-lens/grammars/tree-sitter-bash.wasm +0 -0
- package/node_modules/pi-lens/grammars/tree-sitter-bash.wasm.json +3 -3
- package/node_modules/pi-lens/package.json +18 -6
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
- package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +1275 -62
- package/node_modules/pi-lens/scripts/download-grammars.js +5 -0
- package/node_modules/pi-lens/scripts/grammars.lock.json +6 -1
- package/node_modules/pi-lens/scripts/install-selftest.mjs +33 -34
- package/node_modules/pi-lens/scripts/lib/host-provided-deps.mjs +13 -4
- package/node_modules/pi-lens/scripts/lib/web-tree-sitter-dir.mjs +18 -0
- package/package.json +15 -10
- package/node_modules/@dietrichgebert/ponytail/README.es.md +0 -212
- package/node_modules/@dietrichgebert/ponytail/README.ja.md +0 -212
- package/node_modules/@dietrichgebert/ponytail/README.ko.md +0 -212
- package/node_modules/@dietrichgebert/ponytail/README.zh-CN.md +0 -212
- package/node_modules/pi-lens/dist/clients/actionable-warnings-logger.js +0 -35
- package/node_modules/pi-lens/dist/clients/actionable-warnings.js +0 -1610
- package/node_modules/pi-lens/dist/clients/advisory-provenance.js +0 -593
- package/node_modules/pi-lens/dist/clients/agent-behavior-client.js +0 -147
- package/node_modules/pi-lens/dist/clients/agent-nudge.js +0 -325
- package/node_modules/pi-lens/dist/clients/analysed-root.js +0 -1
- package/node_modules/pi-lens/dist/clients/ast-grep-client.js +0 -731
- package/node_modules/pi-lens/dist/clients/ast-grep-rule-manager.js +0 -146
- package/node_modules/pi-lens/dist/clients/ast-grep-tool-logger.js +0 -118
- package/node_modules/pi-lens/dist/clients/ast-grep-types.js +0 -10
- package/node_modules/pi-lens/dist/clients/ast-grep-yaml-synth.js +0 -154
- package/node_modules/pi-lens/dist/clients/atomic-write-staging.js +0 -75
- package/node_modules/pi-lens/dist/clients/atomic-write.js +0 -189
- package/node_modules/pi-lens/dist/clients/availability-probe-flight.js +0 -12
- package/node_modules/pi-lens/dist/clients/bash-file-access.js +0 -1056
- package/node_modules/pi-lens/dist/clients/biome-client.js +0 -357
- package/node_modules/pi-lens/dist/clients/blocker-freshness.js +0 -837
- package/node_modules/pi-lens/dist/clients/blocker-past-eof.js +0 -129
- package/node_modules/pi-lens/dist/clients/bootstrap.js +0 -569
- package/node_modules/pi-lens/dist/clients/bounded-cache.js +0 -190
- package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +0 -202
- package/node_modules/pi-lens/dist/clients/bounded-telemetry.js +0 -295
- package/node_modules/pi-lens/dist/clients/build-identity.js +0 -95
- package/node_modules/pi-lens/dist/clients/bundled-resource-health.js +0 -113
- package/node_modules/pi-lens/dist/clients/bus-events-logger.js +0 -105
- package/node_modules/pi-lens/dist/clients/bus-publish.js +0 -171
- package/node_modules/pi-lens/dist/clients/cache/rule-cache.js +0 -190
- package/node_modules/pi-lens/dist/clients/cache-manager.js +0 -524
- package/node_modules/pi-lens/dist/clients/cache-observability.js +0 -1313
- package/node_modules/pi-lens/dist/clients/call-graph.js +0 -852
- package/node_modules/pi-lens/dist/clients/cargo-manifest.js +0 -422
- package/node_modules/pi-lens/dist/clients/cascade-budget.js +0 -196
- package/node_modules/pi-lens/dist/clients/cascade-format.js +0 -315
- package/node_modules/pi-lens/dist/clients/cascade-logger.js +0 -31
- package/node_modules/pi-lens/dist/clients/cascade-types.js +0 -9
- package/node_modules/pi-lens/dist/clients/child-unref.js +0 -124
- package/node_modules/pi-lens/dist/clients/code-quality-warnings.js +0 -286
- package/node_modules/pi-lens/dist/clients/codebase-model.js +0 -173
- package/node_modules/pi-lens/dist/clients/collateral-test-role.js +0 -40
- package/node_modules/pi-lens/dist/clients/complexity-client.js +0 -462
- package/node_modules/pi-lens/dist/clients/config-core/deny.js +0 -221
- package/node_modules/pi-lens/dist/clients/config-core/index.js +0 -50
- package/node_modules/pi-lens/dist/clients/config-core/merge.js +0 -357
- package/node_modules/pi-lens/dist/clients/config-core/normalize.js +0 -340
- package/node_modules/pi-lens/dist/clients/config-core/process-spec.js +0 -248
- package/node_modules/pi-lens/dist/clients/config-core/provenance.js +0 -164
- package/node_modules/pi-lens/dist/clients/config-core/records.js +0 -218
- package/node_modules/pi-lens/dist/clients/config-core/resolve.js +0 -125
- package/node_modules/pi-lens/dist/clients/config-core/safe-object.js +0 -78
- package/node_modules/pi-lens/dist/clients/config-core/schema.js +0 -165
- package/node_modules/pi-lens/dist/clients/config-diagnostic-codes.js +0 -285
- package/node_modules/pi-lens/dist/clients/config-locations.js +0 -388
- package/node_modules/pi-lens/dist/clients/config-resolve.js +0 -798
- package/node_modules/pi-lens/dist/clients/config-schema.js +0 -251
- package/node_modules/pi-lens/dist/clients/config-warn.js +0 -407
- package/node_modules/pi-lens/dist/clients/console-guard-install.js +0 -26
- package/node_modules/pi-lens/dist/clients/cooperative-budget.js +0 -42
- package/node_modules/pi-lens/dist/clients/dead-code-client.js +0 -510
- package/node_modules/pi-lens/dist/clients/dead-code-logger.js +0 -30
- package/node_modules/pi-lens/dist/clients/deadline-utils.js +0 -280
- package/node_modules/pi-lens/dist/clients/debug-handles.js +0 -211
- package/node_modules/pi-lens/dist/clients/debug-heap.js +0 -174
- package/node_modules/pi-lens/dist/clients/deferred-lsp-work.js +0 -106
- package/node_modules/pi-lens/dist/clients/degradation-ledger.js +0 -426
- package/node_modules/pi-lens/dist/clients/demoted-finding-render.js +0 -169
- package/node_modules/pi-lens/dist/clients/dependency-checker.js +0 -885
- package/node_modules/pi-lens/dist/clients/deps/ast-grep-napi.js +0 -22
- package/node_modules/pi-lens/dist/clients/deps/js-yaml.js +0 -9
- package/node_modules/pi-lens/dist/clients/deps/minimatch.js +0 -4
- package/node_modules/pi-lens/dist/clients/deps/pi-tui.js +0 -14
- package/node_modules/pi-lens/dist/clients/deps/typebox.js +0 -14
- package/node_modules/pi-lens/dist/clients/deps/vscode-jsonrpc.js +0 -1
- package/node_modules/pi-lens/dist/clients/deps/web-tree-sitter.js +0 -24
- package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +0 -630
- package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +0 -305
- package/node_modules/pi-lens/dist/clients/diagnostic-logger.js +0 -73
- package/node_modules/pi-lens/dist/clients/diagnostic-tracker.js +0 -105
- package/node_modules/pi-lens/dist/clients/diagnostics-publish.js +0 -230
- package/node_modules/pi-lens/dist/clients/dispatch/ast-grep-catalog.js +0 -65
- package/node_modules/pi-lens/dist/clients/dispatch/auxiliary-lsp.js +0 -343
- package/node_modules/pi-lens/dist/clients/dispatch/collect-later-tier.js +0 -35
- package/node_modules/pi-lens/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
- package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +0 -1269
- package/node_modules/pi-lens/dist/clients/dispatch/fact-provider-types.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/fact-rule-runner.js +0 -17
- package/node_modules/pi-lens/dist/clients/dispatch/fact-runner.js +0 -30
- package/node_modules/pi-lens/dist/clients/dispatch/fact-scheduler.js +0 -68
- package/node_modules/pi-lens/dist/clients/dispatch/fact-store.js +0 -377
- package/node_modules/pi-lens/dist/clients/dispatch/facts/comment-facts.js +0 -22
- package/node_modules/pi-lens/dist/clients/dispatch/facts/file-content.js +0 -19
- package/node_modules/pi-lens/dist/clients/dispatch/facts/function-facts.js +0 -348
- package/node_modules/pi-lens/dist/clients/dispatch/facts/import-facts.js +0 -204
- package/node_modules/pi-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
- package/node_modules/pi-lens/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
- package/node_modules/pi-lens/dist/clients/dispatch/finding-policy.js +0 -339
- package/node_modules/pi-lens/dist/clients/dispatch/indent-detect.js +0 -417
- package/node_modules/pi-lens/dist/clients/dispatch/inline-suppressions.js +0 -89
- package/node_modules/pi-lens/dist/clients/dispatch/integration.js +0 -2377
- package/node_modules/pi-lens/dist/clients/dispatch/lazy.js +0 -11
- package/node_modules/pi-lens/dist/clients/dispatch/pending-runner-findings.js +0 -87
- package/node_modules/pi-lens/dist/clients/dispatch/plan.js +0 -278
- package/node_modules/pi-lens/dist/clients/dispatch/priorities.js +0 -20
- package/node_modules/pi-lens/dist/clients/dispatch/rule-id-normalize.js +0 -50
- package/node_modules/pi-lens/dist/clients/dispatch/rule-ignores.js +0 -69
- package/node_modules/pi-lens/dist/clients/dispatch/rule-policy.js +0 -135
- package/node_modules/pi-lens/dist/clients/dispatch/rules/async-noise.js +0 -40
- package/node_modules/pi-lens/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
- package/node_modules/pi-lens/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
- package/node_modules/pi-lens/dist/clients/dispatch/rules/error-obscuring.js +0 -32
- package/node_modules/pi-lens/dist/clients/dispatch/rules/error-swallowing.js +0 -31
- package/node_modules/pi-lens/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
- package/node_modules/pi-lens/dist/clients/dispatch/rules/high-complexity.js +0 -72
- package/node_modules/pi-lens/dist/clients/dispatch/rules/high-fan-out.js +0 -74
- package/node_modules/pi-lens/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
- package/node_modules/pi-lens/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
- package/node_modules/pi-lens/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
- package/node_modules/pi-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
- package/node_modules/pi-lens/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
- package/node_modules/pi-lens/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
- package/node_modules/pi-lens/dist/clients/dispatch/runner-context.js +0 -52
- package/node_modules/pi-lens/dist/clients/dispatch/runners/actionlint.js +0 -111
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
- package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +0 -296
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +0 -219
- package/node_modules/pi-lens/dist/clients/dispatch/runners/credo.js +0 -82
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cue-vet.js +0 -416
- package/node_modules/pi-lens/dist/clients/dispatch/runners/dart-analyze.js +0 -183
- package/node_modules/pi-lens/dist/clients/dispatch/runners/detekt.js +0 -176
- package/node_modules/pi-lens/dist/clients/dispatch/runners/dotnet-build.js +0 -164
- package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +0 -195
- package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +0 -137
- package/node_modules/pi-lens/dist/clients/dispatch/runners/fact-rules.js +0 -29
- package/node_modules/pi-lens/dist/clients/dispatch/runners/fish-indent.js +0 -69
- package/node_modules/pi-lens/dist/clients/dispatch/runners/gleam-check.js +0 -167
- package/node_modules/pi-lens/dist/clients/dispatch/runners/go-vet.js +0 -104
- package/node_modules/pi-lens/dist/clients/dispatch/runners/golangci-lint.js +0 -135
- package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +0 -91
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +0 -171
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-render.js +0 -940
- package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +0 -117
- package/node_modules/pi-lens/dist/clients/dispatch/runners/index.js +0 -108
- package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +0 -99
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ktlint.js +0 -110
- package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +0 -379
- package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +0 -167
- package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +0 -102
- package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +0 -414
- package/node_modules/pi-lens/dist/clients/dispatch/runners/php-lint.js +0 -85
- package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +0 -120
- package/node_modules/pi-lens/dist/clients/dispatch/runners/prisma-validate.js +0 -62
- package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
- package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +0 -169
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rubocop.js +0 -99
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ruff.js +0 -88
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +0 -256
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +0 -173
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +0 -102
- package/node_modules/pi-lens/dist/clients/dispatch/runners/spellcheck.js +0 -128
- package/node_modules/pi-lens/dist/clients/dispatch/runners/spotbugs.js +0 -259
- package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +0 -183
- package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +0 -166
- package/node_modules/pi-lens/dist/clients/dispatch/runners/swiftlint.js +0 -163
- package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +0 -174
- package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +0 -168
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +0 -125
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tree-sitter.js +0 -643
- package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +0 -253
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -95
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils.js +0 -15
- package/node_modules/pi-lens/dist/clients/dispatch/runners/vale.js +0 -128
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +0 -95
- package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +0 -79
- package/node_modules/pi-lens/dist/clients/dispatch/suppress-writer.js +0 -79
- package/node_modules/pi-lens/dist/clients/dispatch/tool-profile.js +0 -30
- package/node_modules/pi-lens/dist/clients/dispatch/types.js +0 -21
- package/node_modules/pi-lens/dist/clients/dispatch/utils/format-utils.js +0 -45
- package/node_modules/pi-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
- package/node_modules/pi-lens/dist/clients/disposition-logger.js +0 -32
- package/node_modules/pi-lens/dist/clients/disposition-publish.js +0 -124
- package/node_modules/pi-lens/dist/clients/durable-store.js +0 -97
- package/node_modules/pi-lens/dist/clients/effective-config.js +0 -415
- package/node_modules/pi-lens/dist/clients/env-utils.js +0 -83
- package/node_modules/pi-lens/dist/clients/error-class.js +0 -23
- package/node_modules/pi-lens/dist/clients/eval-timestamp.js +0 -17
- package/node_modules/pi-lens/dist/clients/event-loop-hold.js +0 -274
- package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +0 -250
- package/node_modules/pi-lens/dist/clients/extension-log.js +0 -504
- package/node_modules/pi-lens/dist/clients/extension-mode.js +0 -73
- package/node_modules/pi-lens/dist/clients/feature-hints.js +0 -103
- package/node_modules/pi-lens/dist/clients/file-kinds.js +0 -412
- package/node_modules/pi-lens/dist/clients/file-role.js +0 -134
- package/node_modules/pi-lens/dist/clients/file-time.js +0 -160
- package/node_modules/pi-lens/dist/clients/file-utils.js +0 -1032
- package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +0 -494
- package/node_modules/pi-lens/dist/clients/finding-identity.js +0 -88
- package/node_modules/pi-lens/dist/clients/fix-worklog.js +0 -103
- package/node_modules/pi-lens/dist/clients/format-events-publish.js +0 -343
- package/node_modules/pi-lens/dist/clients/format-service.js +0 -222
- package/node_modules/pi-lens/dist/clients/formatters-lazy.js +0 -9
- package/node_modules/pi-lens/dist/clients/formatters.js +0 -2032
- package/node_modules/pi-lens/dist/clients/freshness-cadence.js +0 -17
- package/node_modules/pi-lens/dist/clients/freshness.js +0 -38
- package/node_modules/pi-lens/dist/clients/generated-artifacts.js +0 -394
- package/node_modules/pi-lens/dist/clients/generation-guard.js +0 -215
- package/node_modules/pi-lens/dist/clients/git-guard.js +0 -1136
- package/node_modules/pi-lens/dist/clients/git-tracked-ignore.js +0 -243
- package/node_modules/pi-lens/dist/clients/gitleaks-client.js +0 -509
- package/node_modules/pi-lens/dist/clients/go-client.js +0 -104
- package/node_modules/pi-lens/dist/clients/govulncheck-client.js +0 -605
- package/node_modules/pi-lens/dist/clients/gradle-ktfmt-style.js +0 -348
- package/node_modules/pi-lens/dist/clients/grammar-source.js +0 -465
- package/node_modules/pi-lens/dist/clients/gzip-stage-write.js +0 -135
- package/node_modules/pi-lens/dist/clients/hashline-anchor.js +0 -424
- package/node_modules/pi-lens/dist/clients/hook-budgets.js +0 -76
- package/node_modules/pi-lens/dist/clients/host-edit-normalize.js +0 -140
- package/node_modules/pi-lens/dist/clients/host-ports.js +0 -39
- package/node_modules/pi-lens/dist/clients/indent-retarget.js +0 -154
- package/node_modules/pi-lens/dist/clients/inline-blocker-dispositions.js +0 -186
- package/node_modules/pi-lens/dist/clients/install-diagnostics.js +0 -156
- package/node_modules/pi-lens/dist/clients/installer/index.js +0 -5416
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh-session.js +0 -58
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh.js +0 -783
- package/node_modules/pi-lens/dist/clients/instance-reaper-state.js +0 -7
- package/node_modules/pi-lens/dist/clients/instance-reaper.js +0 -1137
- package/node_modules/pi-lens/dist/clients/instance-registry-lock.js +0 -145
- package/node_modules/pi-lens/dist/clients/instance-registry.js +0 -773
- package/node_modules/pi-lens/dist/clients/jscpd-client.js +0 -378
- package/node_modules/pi-lens/dist/clients/json-cache-read.js +0 -65
- package/node_modules/pi-lens/dist/clients/knip-client.js +0 -788
- package/node_modules/pi-lens/dist/clients/language-policy.js +0 -252
- package/node_modules/pi-lens/dist/clients/language-profile.js +0 -361
- package/node_modules/pi-lens/dist/clients/language-registry.js +0 -603
- package/node_modules/pi-lens/dist/clients/latency-logger.js +0 -727
- package/node_modules/pi-lens/dist/clients/lazy-import.js +0 -21
- package/node_modules/pi-lens/dist/clients/ledger-bounds.js +0 -54
- package/node_modules/pi-lens/dist/clients/lens-config.js +0 -404
- package/node_modules/pi-lens/dist/clients/lens-engine.js +0 -358
- package/node_modules/pi-lens/dist/clients/lens-events.js +0 -125
- package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +0 -467
- package/node_modules/pi-lens/dist/clients/lens-map.js +0 -1156
- package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +0 -74
- package/node_modules/pi-lens/dist/clients/log-cleanup.js +0 -222
- package/node_modules/pi-lens/dist/clients/lsp/aggregation.js +0 -178
- package/node_modules/pi-lens/dist/clients/lsp/cascade-tier.js +0 -421
- package/node_modules/pi-lens/dist/clients/lsp/client.js +0 -4593
- package/node_modules/pi-lens/dist/clients/lsp/config.js +0 -691
- package/node_modules/pi-lens/dist/clients/lsp/content-limits.js +0 -41
- package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +0 -225
- package/node_modules/pi-lens/dist/clients/lsp/document-drift.js +0 -467
- package/node_modules/pi-lens/dist/clients/lsp/edits.js +0 -1219
- package/node_modules/pi-lens/dist/clients/lsp/index.js +0 -8305
- package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +0 -216
- package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +0 -298
- package/node_modules/pi-lens/dist/clients/lsp/language.js +0 -63
- package/node_modules/pi-lens/dist/clients/lsp/launch.js +0 -746
- package/node_modules/pi-lens/dist/clients/lsp/lombok.js +0 -158
- package/node_modules/pi-lens/dist/clients/lsp/path-utils.js +0 -5
- package/node_modules/pi-lens/dist/clients/lsp/pending-aux-coverage.js +0 -251
- package/node_modules/pi-lens/dist/clients/lsp/position-encoding.js +0 -61
- package/node_modules/pi-lens/dist/clients/lsp/ruby-drive-dirs.js +0 -83
- package/node_modules/pi-lens/dist/clients/lsp/server.js +0 -3290
- package/node_modules/pi-lens/dist/clients/lsp/session-roots.js +0 -192
- package/node_modules/pi-lens/dist/clients/lsp/spawn-history.js +0 -17
- package/node_modules/pi-lens/dist/clients/lsp/sync-kind.js +0 -56
- package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +0 -332
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/classification.js +0 -85
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/index.js +0 -10
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/strategies.js +0 -392
- package/node_modules/pi-lens/dist/clients/lsp/watch-queue.js +0 -61
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
- package/node_modules/pi-lens/dist/clients/lsp/workspace-sweep-hold.js +0 -184
- package/node_modules/pi-lens/dist/clients/lsp-budget.js +0 -186
- package/node_modules/pi-lens/dist/clients/lsp-document-symbols.js +0 -110
- package/node_modules/pi-lens/dist/clients/lsp-lazy.js +0 -9
- package/node_modules/pi-lens/dist/clients/lsp-mutation.js +0 -396
- package/node_modules/pi-lens/dist/clients/lsp-status.js +0 -59
- package/node_modules/pi-lens/dist/clients/map-with-concurrency.js +0 -40
- package/node_modules/pi-lens/dist/clients/mcp/analyze.js +0 -420
- package/node_modules/pi-lens/dist/clients/mcp/host-shim.js +0 -31
- package/node_modules/pi-lens/dist/clients/mcp/ipc.js +0 -523
- package/node_modules/pi-lens/dist/clients/mcp/review.js +0 -197
- package/node_modules/pi-lens/dist/clients/mcp/session.js +0 -412
- package/node_modules/pi-lens/dist/clients/memory-sampler.js +0 -208
- package/node_modules/pi-lens/dist/clients/message-end-attribution.js +0 -30
- package/node_modules/pi-lens/dist/clients/metrics-client.js +0 -107
- package/node_modules/pi-lens/dist/clients/metrics-history.js +0 -327
- package/node_modules/pi-lens/dist/clients/middle-man-analysis.js +0 -263
- package/node_modules/pi-lens/dist/clients/model-provider.js +0 -53
- package/node_modules/pi-lens/dist/clients/module-report-lsp.js +0 -189
- package/node_modules/pi-lens/dist/clients/module-report.js +0 -2150
- package/node_modules/pi-lens/dist/clients/mutating-tool.js +0 -651
- package/node_modules/pi-lens/dist/clients/mutation-attribution.js +0 -368
- package/node_modules/pi-lens/dist/clients/mutation-bridge.js +0 -240
- package/node_modules/pi-lens/dist/clients/ndjson-logger.js +0 -734
- package/node_modules/pi-lens/dist/clients/observed-mutation-sources.js +0 -101
- package/node_modules/pi-lens/dist/clients/observed-mutation.js +0 -1253
- package/node_modules/pi-lens/dist/clients/oldtext-autopatch.js +0 -128
- package/node_modules/pi-lens/dist/clients/opaque-mutation-scan.js +0 -496
- package/node_modules/pi-lens/dist/clients/opengrep-client.js +0 -333
- package/node_modules/pi-lens/dist/clients/opengrep-config.js +0 -76
- package/node_modules/pi-lens/dist/clients/package-manager.js +0 -607
- package/node_modules/pi-lens/dist/clients/package-root.js +0 -38
- package/node_modules/pi-lens/dist/clients/partial-edit-apply.js +0 -439
- package/node_modules/pi-lens/dist/clients/path-attribution-telemetry.js +0 -43
- package/node_modules/pi-lens/dist/clients/path-keyed-map.js +0 -108
- package/node_modules/pi-lens/dist/clients/path-utils.js +0 -1244
- package/node_modules/pi-lens/dist/clients/performance-report.js +0 -331
- package/node_modules/pi-lens/dist/clients/persist-debounce.js +0 -70
- package/node_modules/pi-lens/dist/clients/persistent-reverify.js +0 -271
- package/node_modules/pi-lens/dist/clients/php-cs-fixer-config.js +0 -119
- package/node_modules/pi-lens/dist/clients/pipeline.js +0 -1480
- package/node_modules/pi-lens/dist/clients/post-autofix-notice.js +0 -37
- package/node_modules/pi-lens/dist/clients/print-mode.js +0 -21
- package/node_modules/pi-lens/dist/clients/probe-home-state.js +0 -228
- package/node_modules/pi-lens/dist/clients/process-bridge.js +0 -66
- package/node_modules/pi-lens/dist/clients/process-singletons.js +0 -210
- package/node_modules/pi-lens/dist/clients/process-snapshot.js +0 -68
- package/node_modules/pi-lens/dist/clients/project-changes.js +0 -181
- package/node_modules/pi-lens/dist/clients/project-conventions.js +0 -171
- package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +0 -137
- package/node_modules/pi-lens/dist/clients/project-diagnostics/extractors.js +0 -109
- package/node_modules/pi-lens/dist/clients/project-diagnostics/fresh-fetch.js +0 -668
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
- package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +0 -520
- package/node_modules/pi-lens/dist/clients/project-diagnostics/types.js +0 -1
- package/node_modules/pi-lens/dist/clients/project-lens-config.js +0 -807
- package/node_modules/pi-lens/dist/clients/project-report.js +0 -701
- package/node_modules/pi-lens/dist/clients/project-scale.js +0 -237
- package/node_modules/pi-lens/dist/clients/project-scan-policy.js +0 -11
- package/node_modules/pi-lens/dist/clients/project-snapshot-fingerprint.js +0 -48
- package/node_modules/pi-lens/dist/clients/project-snapshot-persist-worker.js +0 -20
- package/node_modules/pi-lens/dist/clients/project-snapshot.js +0 -1653
- package/node_modules/pi-lens/dist/clients/project-trust.js +0 -181
- package/node_modules/pi-lens/dist/clients/python-environment.js +0 -217
- package/node_modules/pi-lens/dist/clients/python-provenance.js +0 -639
- package/node_modules/pi-lens/dist/clients/quiet-window-config.js +0 -47
- package/node_modules/pi-lens/dist/clients/quiet-window.js +0 -236
- package/node_modules/pi-lens/dist/clients/read-bridge.js +0 -139
- package/node_modules/pi-lens/dist/clients/read-expansion.js +0 -266
- package/node_modules/pi-lens/dist/clients/read-guard-logger.js +0 -251
- package/node_modules/pi-lens/dist/clients/read-guard-tool-lines.js +0 -1306
- package/node_modules/pi-lens/dist/clients/read-guard.js +0 -1561
- package/node_modules/pi-lens/dist/clients/recent-touches.js +0 -240
- package/node_modules/pi-lens/dist/clients/redact/secrets.js +0 -449
- package/node_modules/pi-lens/dist/clients/resource-sampler.js +0 -628
- package/node_modules/pi-lens/dist/clients/reverse-deps.js +0 -270
- package/node_modules/pi-lens/dist/clients/review-graph/builder.js +0 -5126
- package/node_modules/pi-lens/dist/clients/review-graph/format.js +0 -33
- package/node_modules/pi-lens/dist/clients/review-graph/git-identity.js +0 -163
- package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +0 -481
- package/node_modules/pi-lens/dist/clients/review-graph/persist-worker.js +0 -10
- package/node_modules/pi-lens/dist/clients/review-graph/query.js +0 -244
- package/node_modules/pi-lens/dist/clients/review-graph/revision-drift.js +0 -21
- package/node_modules/pi-lens/dist/clients/review-graph/service.js +0 -96
- package/node_modules/pi-lens/dist/clients/review-graph/shared-extraction-ir.js +0 -82
- package/node_modules/pi-lens/dist/clients/review-graph/symbol-id.js +0 -103
- package/node_modules/pi-lens/dist/clients/review-graph/tsconfig-paths.js +0 -299
- package/node_modules/pi-lens/dist/clients/review-graph/types.js +0 -1
- package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +0 -449
- package/node_modules/pi-lens/dist/clients/review-graph-logger.js +0 -81
- package/node_modules/pi-lens/dist/clients/ruff-client.js +0 -179
- package/node_modules/pi-lens/dist/clients/rules-scanner.js +0 -131
- package/node_modules/pi-lens/dist/clients/run-duration.js +0 -55
- package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +0 -746
- package/node_modules/pi-lens/dist/clients/runtime-config.js +0 -77
- package/node_modules/pi-lens/dist/clients/runtime-context.js +0 -211
- package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +0 -1324
- package/node_modules/pi-lens/dist/clients/runtime-session.js +0 -2485
- package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +0 -1295
- package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +0 -2049
- package/node_modules/pi-lens/dist/clients/runtime-turn.js +0 -3767
- package/node_modules/pi-lens/dist/clients/rust-client.js +0 -97
- package/node_modules/pi-lens/dist/clients/safe-spawn.js +0 -2357
- package/node_modules/pi-lens/dist/clients/sanitize.js +0 -286
- package/node_modules/pi-lens/dist/clients/scan-utils.js +0 -25
- package/node_modules/pi-lens/dist/clients/scratch-tree-policy.js +0 -165
- package/node_modules/pi-lens/dist/clients/search-read-registration.js +0 -94
- package/node_modules/pi-lens/dist/clients/secret-findings.js +0 -114
- package/node_modules/pi-lens/dist/clients/security-scan-client.js +0 -352
- package/node_modules/pi-lens/dist/clients/session-event-guard.js +0 -297
- package/node_modules/pi-lens/dist/clients/session-lifecycle.js +0 -484
- package/node_modules/pi-lens/dist/clients/session-start-observability.js +0 -94
- package/node_modules/pi-lens/dist/clients/session-state-store.js +0 -101
- package/node_modules/pi-lens/dist/clients/session-summary.js +0 -15
- package/node_modules/pi-lens/dist/clients/sessionstart-logger.js +0 -27
- package/node_modules/pi-lens/dist/clients/sg-runner.js +0 -876
- package/node_modules/pi-lens/dist/clients/sgconfig.js +0 -347
- package/node_modules/pi-lens/dist/clients/shared-checkout-guard.js +0 -338
- package/node_modules/pi-lens/dist/clients/single-flight.js +0 -158
- package/node_modules/pi-lens/dist/clients/situational-tool-telemetry.js +0 -108
- package/node_modules/pi-lens/dist/clients/skills-resolver.js +0 -141
- package/node_modules/pi-lens/dist/clients/slow-fs.js +0 -138
- package/node_modules/pi-lens/dist/clients/smells-rollup.js +0 -231
- package/node_modules/pi-lens/dist/clients/source-filter.js +0 -596
- package/node_modules/pi-lens/dist/clients/source-walker.js +0 -211
- package/node_modules/pi-lens/dist/clients/spawn-output-cap.js +0 -120
- package/node_modules/pi-lens/dist/clients/spawn-timeout-cooldown.js +0 -110
- package/node_modules/pi-lens/dist/clients/stale-marker.js +0 -17
- package/node_modules/pi-lens/dist/clients/startup-scan.js +0 -400
- package/node_modules/pi-lens/dist/clients/startup-timing.js +0 -130
- package/node_modules/pi-lens/dist/clients/string-utils.js +0 -33
- package/node_modules/pi-lens/dist/clients/subagent-mode.js +0 -111
- package/node_modules/pi-lens/dist/clients/symbol-containment.js +0 -24
- package/node_modules/pi-lens/dist/clients/symbol-types.js +0 -5
- package/node_modules/pi-lens/dist/clients/test-runner-client.js +0 -2507
- package/node_modules/pi-lens/dist/clients/test-runner-delivery.js +0 -287
- package/node_modules/pi-lens/dist/clients/todo-scanner.js +0 -229
- package/node_modules/pi-lens/dist/clients/tool-agreement.js +0 -423
- package/node_modules/pi-lens/dist/clients/tool-config.js +0 -249
- package/node_modules/pi-lens/dist/clients/tool-cwd.js +0 -270
- package/node_modules/pi-lens/dist/clients/tool-definition.js +0 -47
- package/node_modules/pi-lens/dist/clients/tool-event.js +0 -105
- package/node_modules/pi-lens/dist/clients/tool-policy.js +0 -2755
- package/node_modules/pi-lens/dist/clients/tool-probe.js +0 -53
- package/node_modules/pi-lens/dist/clients/tool-render.js +0 -156
- package/node_modules/pi-lens/dist/clients/tool-set-policy.js +0 -118
- package/node_modules/pi-lens/dist/clients/tree-sitter-cache.js +0 -364
- package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +0 -4195
- package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +0 -100
- package/node_modules/pi-lens/dist/clients/tree-sitter-navigator.js +0 -269
- package/node_modules/pi-lens/dist/clients/tree-sitter-query-loader.js +0 -569
- package/node_modules/pi-lens/dist/clients/tree-sitter-shared.js +0 -158
- package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
- package/node_modules/pi-lens/dist/clients/trivy-client.js +0 -467
- package/node_modules/pi-lens/dist/clients/tui-fit.js +0 -50
- package/node_modules/pi-lens/dist/clients/turn-context.js +0 -52
- package/node_modules/pi-lens/dist/clients/turn-end/lane.js +0 -51
- package/node_modules/pi-lens/dist/clients/turn-end/lanes/govulncheck.js +0 -112
- package/node_modules/pi-lens/dist/clients/turn-end/lanes/secrets.js +0 -204
- package/node_modules/pi-lens/dist/clients/turn-summary-render.js +0 -72
- package/node_modules/pi-lens/dist/clients/turn-summary.js +0 -132
- package/node_modules/pi-lens/dist/clients/typos-config.js +0 -29
- package/node_modules/pi-lens/dist/clients/user-notify.js +0 -51
- package/node_modules/pi-lens/dist/clients/vanished-instance-marker.js +0 -57
- package/node_modules/pi-lens/dist/clients/warm-attach.js +0 -305
- package/node_modules/pi-lens/dist/clients/widget-state.js +0 -1808
- package/node_modules/pi-lens/dist/clients/word-index-logger.js +0 -49
- package/node_modules/pi-lens/dist/clients/word-index-store.js +0 -459
- package/node_modules/pi-lens/dist/clients/word-index.js +0 -2080
- package/node_modules/pi-lens/dist/clients/workspace-topology.js +0 -443
- package/node_modules/pi-lens/dist/clients/write-ordering-guard.js +0 -65
- package/node_modules/pi-lens/dist/clients/zizmor-config.js +0 -340
- package/node_modules/pi-lens/dist/i18n.js +0 -69
- package/node_modules/pi-lens/dist/mcp/build-staleness.js +0 -124
- package/node_modules/pi-lens/dist/scripts/lib/process-scan.mjs +0 -583
- package/node_modules/pi-lens/dist/scripts/lib/skills-predicate.mjs +0 -129
- package/node_modules/pi-lens/dist/scripts/lib/web-tree-sitter-dir.mjs +0 -123
- package/node_modules/pi-lens/dist/tools/activate-tools.js +0 -87
- package/node_modules/pi-lens/dist/tools/ast-grep-outline.js +0 -137
- package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +0 -244
- package/node_modules/pi-lens/dist/tools/ast-grep-search.js +0 -762
- package/node_modules/pi-lens/dist/tools/effective-config.js +0 -90
- package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +0 -375
- package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +0 -2571
- package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +0 -1745
- package/node_modules/pi-lens/dist/tools/lsp-navigation.js +0 -1367
- package/node_modules/pi-lens/dist/tools/lsp-structured-output.js +0 -294
- package/node_modules/pi-lens/dist/tools/module-report.js +0 -382
- package/node_modules/pi-lens/dist/tools/project-report.js +0 -86
- package/node_modules/pi-lens/dist/tools/render-compact.js +0 -374
- package/node_modules/pi-lens/dist/tools/scan-progress.js +0 -53
- package/node_modules/pi-lens/dist/tools/shared.js +0 -29
- package/node_modules/pi-lens/dist/tools/symbol-search.js +0 -155
|
@@ -1,494 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Single documentation home for the finding-delivery gate stack (#1634).
|
|
3
|
-
*
|
|
4
|
-
* Every store that renders findings to the AGENT — the turn-end blocker/
|
|
5
|
-
* advisory tiers, `lens_diagnostics` mode=full/all/delta, the widget/footer
|
|
6
|
-
* tally, agent nudges, and the persisted project-diagnostics snapshot —
|
|
7
|
-
* invented its own freshness and retirement rules across
|
|
8
|
-
* #1461/#1561/#1622/#1631, so the stores drifted from each other and each new
|
|
9
|
-
* store re-created the class. #1622/#1625/#1627/#1633 converged on two gates;
|
|
10
|
-
* this module names them ONE time so every other file points here instead of
|
|
11
|
-
* re-explaining the contract. `mode=delta` — the tool's DEFAULT mode — was
|
|
12
|
-
* the review round's live catch: it re-served the actionable/quality-warnings
|
|
13
|
-
* caches verbatim, unfixed by the earlier per-store passes because it sits
|
|
14
|
-
* one layer up from any single scanner.
|
|
15
|
-
*
|
|
16
|
-
* ── Freshness (mtime vs scannedAt, onMissing policy) ──────────────────────
|
|
17
|
-
* `gateFindingsByPathFreshness` (advisory-provenance.ts) partitions a cached
|
|
18
|
-
* store's findings by what the cited path looks like NOW versus the scan
|
|
19
|
-
* timestamp (`scannedAt`) the store was captured at:
|
|
20
|
-
* - missing → `onMissing: "drop"` (default) removes the finding outright —
|
|
21
|
-
* right when the finding IS the file's content (a secret in a deleted
|
|
22
|
-
* file cannot be rotated). `onMissing: "demote"` keeps it — right when the
|
|
23
|
-
* cited path is only EVIDENCE for a finding pinned elsewhere (a
|
|
24
|
-
* govulncheck CVE is pinned by go.mod, not by the traced call site).
|
|
25
|
-
* - stale (mtime > scannedAt + MTIME_DRIFT_TOLERANCE_MS,
|
|
26
|
-
* `blocker-freshness.ts`) → DEMOTE, never drop. The finding survives,
|
|
27
|
-
* the now-untrustworthy line number does not.
|
|
28
|
-
* - live → deliver unchanged, full authority.
|
|
29
|
-
* - unknown (unparseable/absent `scannedAt`, unreadable path) → fail OPEN,
|
|
30
|
-
* deliver unchanged. A missed demotion is noise; a wrong drop can hide a
|
|
31
|
-
* live credential or CVE.
|
|
32
|
-
* The turn-end secrets (gitleaks/trivy-secrets) and govulncheck advisory both
|
|
33
|
-
* route through this gate in `clients/runtime-turn.ts`, in ONE shared call
|
|
34
|
-
* (#3264) whose arms the secrets LANE (`clients/turn-end/lanes/secrets.ts`,
|
|
35
|
-
* #1892) renders. A lane declares its sources and never gates itself: the
|
|
36
|
-
* pass, its stat budget and its bounded records are per DELIVERY, not per
|
|
37
|
-
* lane.
|
|
38
|
-
*
|
|
39
|
-
* The SAME freshness family, one level up, covers cross-file drift: a cached
|
|
40
|
-
* inline blocker is a verdict about its file *and everything that file
|
|
41
|
-
* imports* — `clients/blocker-freshness.ts` (`sweepInlineBlockerFreshness`,
|
|
42
|
-
* the widget-store counterpart `reconcileStaleWidgetDependencyBlockers`
|
|
43
|
-
* paired with `reconcileStaleWidgetFiles`) stats the file and its forward
|
|
44
|
-
* imports against the verdict's `recordedAtMs` baseline (#1631/#1633). A
|
|
45
|
-
* drifted entry is demoted with the SAME `[stale — re-run to confirm]`
|
|
46
|
-
* marker (`STALE_LINE_MARKER`, `clients/stale-marker.ts` — its own leaf
|
|
47
|
-
* module so `widget-state.ts` can use it without a circular import back
|
|
48
|
-
* through the turn orchestrator, #1631 review V2) and `isBlocking`
|
|
49
|
-
* answers false for it — the one predicate both the footer tally and
|
|
50
|
-
* `mode=all`'s blocking count consult, which is what keeps `mode=all` from
|
|
51
|
-
* contradicting a same-minute `mode=full` sweep on the same paths (#1631
|
|
52
|
-
* criterion 3 / #1634 criterion 4).
|
|
53
|
-
*
|
|
54
|
-
* Two INDEPENDENT gates share this `stale` field, distinguished by
|
|
55
|
-
* `WidgetDiagnostic.staleReason`: `"dependency-drift"` (#1631, above) and
|
|
56
|
-
* `"past-eof"` (#1641 — a cited line beyond the file's current on-disk length,
|
|
57
|
-
* a stale in-memory LSP document diverged from disk). Each gate only HEALS
|
|
58
|
-
* demotions it made itself (`staleReason` defaults to `"past-eof"` for
|
|
59
|
-
* backward compatibility with pre-#1641 records) — composed, not merged into
|
|
60
|
-
* one undifferentiated flag, so a fix for one hazard can never silently clear
|
|
61
|
-
* the other's verdict.
|
|
62
|
-
*
|
|
63
|
-
* ── Dispositions (strict-only for blocking) ───────────────────────────────
|
|
64
|
-
* `applyDispositions` (diagnostic-dispositions.ts) filters false-positive/
|
|
65
|
-
* suppress/defer/flagged judgments the agent or user already recorded for a
|
|
66
|
-
* finding. Anchoring is STRICT (line-content-hashed) only for false-positive
|
|
67
|
-
* — a judgment about one exact piece of code that must NOT survive a rewrite
|
|
68
|
-
* of that line — and WEAK (no line hash) for defer/flagged/suppress, which
|
|
69
|
-
* are intent-level judgments that must survive incidental nearby edits.
|
|
70
|
-
* `formatFullMode` (tools/lens-diagnostics.ts) applies this on every
|
|
71
|
-
* mode=full pass; the per-edit dispatch path applies the identical filter
|
|
72
|
-
* before writing into widget-state, so mode=all and the footer inherit
|
|
73
|
-
* disposition state for any file that has gone through a live edit this
|
|
74
|
-
* session WITHOUT re-computing it (kept cache-only and instant, #1634
|
|
75
|
-
* criterion 5's documented exception — see "Explicit lag labels" below).
|
|
76
|
-
*
|
|
77
|
-
* ── Demotion rendering (#1419) ─────────────────────────────────────────────
|
|
78
|
-
* A demoted finding is never silently dropped and never re-asserted at full
|
|
79
|
-
* authority: it renders with `STALE_LINE_MARKER` (or the widget's `[stale]`
|
|
80
|
-
* tag) in place of the coordinate the drift invalidated. This is the one
|
|
81
|
-
* rendering convention every gated surface reuses — a store must not invent
|
|
82
|
-
* its own "stale" wording.
|
|
83
|
-
*
|
|
84
|
-
* #1944 completes the rule: demotion must change the BODY, not only the
|
|
85
|
-
* channel and the coordinate. A demoted body carries no STOP banner and no
|
|
86
|
-
* "must be fixed" imperative, and a cited line the file no longer has renders
|
|
87
|
-
* as `L<n> (line no longer exists)`. `clients/demoted-finding-render.ts`
|
|
88
|
-
* (`degradeDemotedFindingBody`) is the one implementation for surfaces that
|
|
89
|
-
* deliver a RENDERED BODY — the turn-end advisory tier. Per-row surfaces
|
|
90
|
-
* (`clients/widget-state.ts`, `tools/lens-diagnostics.ts`) have no body to
|
|
91
|
-
* degrade; they satisfy the same rule by dropping the authority marker
|
|
92
|
-
* alongside the coordinate.
|
|
93
|
-
*
|
|
94
|
-
* ── Retirement (#1944, #1950, #2275) ──────────────────────────────────────
|
|
95
|
-
* Demote-not-drop assumes the agent CAN re-run to confirm. Retirement is what
|
|
96
|
-
* happens when re-serving a demotion forever stops being honest. Every kind
|
|
97
|
-
* of retirement records itself in the degradation ledger under
|
|
98
|
-
* `demoted-finding-retired`, whose subject keeps the store and the file
|
|
99
|
-
* (`inline-blocker:` / `widget-blocker:`), so an empty section can only mean
|
|
100
|
-
* "nothing to say". There are three, and they differ in WHY and in HOW MUCH
|
|
101
|
-
* they remove:
|
|
102
|
-
*
|
|
103
|
-
* 1. Past-EOF, unrecoverable (#1944). The file shrank past the cited lines,
|
|
104
|
-
* so no re-run can ever speak to them. Delivered ONCE, degraded, then the
|
|
105
|
-
* record is DROPPED (`RuntimeCoordinator.retireDemotedPastEofBlocker`).
|
|
106
|
-
*
|
|
107
|
-
* 2. Dependency-drift, inline-blocker channel (#1950). The coordinates are
|
|
108
|
-
* still in bounds and a re-run COULD confirm them, so this is a delivery
|
|
109
|
-
* cap, not a verdict: after `DEPENDENCY_DRIFT_MAX_DELIVERIES` turn-end
|
|
110
|
-
* deliveries with no re-run the record is dropped from
|
|
111
|
-
* `_pendingInlineBlockers`, and the LAST delivery carries a note saying it
|
|
112
|
-
* will not be shown again and can still be confirmed
|
|
113
|
-
* (`formatDeliveryCapNote`). Counting is deferred until the turn's content
|
|
114
|
-
* is known not to be suppressed, so the count is deliveries the agent
|
|
115
|
-
* actually received (#1950 fix round F1).
|
|
116
|
-
*
|
|
117
|
-
* 3. Dependency-drift, widget footer (#2275). The same cap number over the
|
|
118
|
-
* widget store, which unlike the inline-blocker map backs MORE THAN ONE
|
|
119
|
-
* surface — `lens_diagnostics mode=all` and `lens_diagnostic_mark` read
|
|
120
|
-
* the same `allDiagnostics` list the footer draws from. So this retirement
|
|
121
|
-
* HIDES rather than drops: the entry keeps its demotion and its place in
|
|
122
|
-
* the error tally, gains `WidgetDiagnostic.footerRetired`, and only the
|
|
123
|
-
* footer stops rendering it; mode=all carries the "capped, no longer shown
|
|
124
|
-
* in the footer, re-run can still confirm" note in place of the inline
|
|
125
|
-
* channel's last-delivery note. Its count is RENDERS, not turn ends — the
|
|
126
|
-
* footer serves one record per pass, so `renderWidget` marks what it drew
|
|
127
|
-
* and the turn-end step drains those marks. Dropping the record instead
|
|
128
|
-
* would have made an unconfirmed LSP error read as CLEAN on mode=all.
|
|
129
|
-
*
|
|
130
|
-
* The rule the three share: a retirement may remove a finding from the
|
|
131
|
-
* surface that has re-served it, never from every surface at once, unless no
|
|
132
|
-
* re-run could ever confirm it (case 1).
|
|
133
|
-
*
|
|
134
|
-
* ── Explicit lag labels (the non-gated escape hatch) ──────────────────────
|
|
135
|
-
* A store that cannot afford the freshness/disposition stack — because it
|
|
136
|
-
* has no cited per-file path to stat (a package-pinned finding like a trivy
|
|
137
|
-
* CRITICAL CVE or a license-risk row), or because re-computing dispositions
|
|
138
|
-
* would cost the "instant" cache-only render mode=all/the footer promise —
|
|
139
|
-
* MUST say so explicitly, with the finding's age, rather than presenting as
|
|
140
|
-
* if it were current. `formatCacheAgeLabel` below is the one implementation;
|
|
141
|
-
* every labeled surface in `DELIVERY_SURFACES` calls it instead of hand-
|
|
142
|
-
* rolling an age string. This is the "(b)" arm of #1634's contract: every
|
|
143
|
-
* agent-facing surface is EITHER gated OR explicitly labeled — never neither.
|
|
144
|
-
*/
|
|
145
|
-
const MS_PER_MINUTE = 60_000;
|
|
146
|
-
/** Mark retained findings whose replacement result could not be reconciled. */
|
|
147
|
-
export function markUnreconciledFindings(findings) {
|
|
148
|
-
return findings.map((finding) => ({ ...finding, stale: true }));
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Render a short, honest age suffix for a store that cannot be freshness-
|
|
152
|
-
* gated per-path (see module doc). `undefined`/unparseable `scannedAt`
|
|
153
|
-
* degrades to a neutral "scan age unknown" label — fail open on WORDING the
|
|
154
|
-
* same way the freshness gate fails open on VERDICT: an unlabeled finding is
|
|
155
|
-
* worse than a vague one, but never fabricate a number from a bad timestamp.
|
|
156
|
-
*/
|
|
157
|
-
export function formatCacheAgeLabel(scannedAt, nowMs = Date.now()) {
|
|
158
|
-
if (scannedAt === undefined || scannedAt === null || scannedAt === "") {
|
|
159
|
-
return "scan age unknown";
|
|
160
|
-
}
|
|
161
|
-
const scannedAtMs = typeof scannedAt === "number" ? scannedAt : Date.parse(scannedAt);
|
|
162
|
-
if (!Number.isFinite(scannedAtMs))
|
|
163
|
-
return "scan age unknown";
|
|
164
|
-
const ageMs = Math.max(0, nowMs - scannedAtMs);
|
|
165
|
-
const ageMinutes = Math.round(ageMs / MS_PER_MINUTE);
|
|
166
|
-
if (ageMinutes < 1)
|
|
167
|
-
return "scanned <1m ago";
|
|
168
|
-
if (ageMinutes < 60)
|
|
169
|
-
return `scanned ${ageMinutes}m ago`;
|
|
170
|
-
// Floor the hour, keep the remainder minutes explicit — a naive
|
|
171
|
-
// `Math.round(ageMinutes / 60)` reported "1h" at 89 minutes (F5), rounding
|
|
172
|
-
// a finding's age UP is the wrong direction to err for a staleness label.
|
|
173
|
-
const ageHours = Math.floor(ageMinutes / 60);
|
|
174
|
-
const remMinutes = ageMinutes % 60;
|
|
175
|
-
return remMinutes === 0
|
|
176
|
-
? `scanned ${ageHours}h ago`
|
|
177
|
-
: `scanned ${ageHours}h ${remMinutes}m ago`;
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* The enumeration (#1634 criterion 1): every surface that renders findings to
|
|
181
|
-
* the agent. Two DIFFERENT seam shapes, each derived structurally rather than
|
|
182
|
-
* hand-listed (#1634 review round F2):
|
|
183
|
-
*
|
|
184
|
-
* - `clients/runtime-turn.ts`: every `blockerParts.push`/`advisoryParts.push`/
|
|
185
|
-
* `staleSecretParts.push` call site carries an `@delivery-surface: <id>`
|
|
186
|
-
* comment naming its entry here. `tests/clients/finding-delivery-gate.test.ts`
|
|
187
|
-
* scans the file for every such push call (comments/strings stripped, so a
|
|
188
|
-
* commented-out or string-embedded false match can't hide a REAL untagged
|
|
189
|
-
* seam) and fails if one has no tag, or a tag names an id not in this
|
|
190
|
-
* registry — a brand-new ungated `advisoryParts.push` cannot pass silently.
|
|
191
|
-
* - `tools/lens-diagnostics.ts`: each `mode=` report is its own function
|
|
192
|
-
* (`formatFullMode`/`formatAllMode`/`formatDeltaMode`), tagged the same way
|
|
193
|
-
* immediately above its `function` line.
|
|
194
|
-
* - `clients/widget-state.ts` (the footer) and `clients/agent-nudge.ts` are
|
|
195
|
-
* hand-registered below — one surface each, not a push-site pattern the
|
|
196
|
-
* scan can derive structurally, so a coverage test asserts these two
|
|
197
|
-
* files are not silently untouched by other tests in the same run.
|
|
198
|
-
*
|
|
199
|
-
* Single source of truth: adding a new render seam without adding/tagging an
|
|
200
|
-
* entry here fails the coverage test, not a human re-reading a hand list.
|
|
201
|
-
*/
|
|
202
|
-
/**
|
|
203
|
-
* Factory for a `gated` entry. #1634 review round (SonarCloud): 20+ entries
|
|
204
|
-
* written as multi-line object literals put the SAME `mode`/`file` key
|
|
205
|
-
* sequence on the same relative lines over and over — the TS/JS duplication
|
|
206
|
-
* detector normalizes string literals to a placeholder token, so those
|
|
207
|
-
* literally-different-content blocks still read as duplicate TOKEN STREAMS.
|
|
208
|
-
* Collapsing each entry to one factory call removes the repeating shape
|
|
209
|
-
* instead of the (irreducible) per-entry data.
|
|
210
|
-
*/
|
|
211
|
-
function gated(file, description, gates, evidence, extra = {}) {
|
|
212
|
-
return { mode: "gated", file, description, gates, evidence, ...extra };
|
|
213
|
-
}
|
|
214
|
-
/** Factory for a `labeled` entry — see {@link gated}'s doc for why this exists. */
|
|
215
|
-
function labeled(file, description, reason, ageSource, evidence = [], extra = {}) {
|
|
216
|
-
return {
|
|
217
|
-
mode: "labeled",
|
|
218
|
-
file,
|
|
219
|
-
description,
|
|
220
|
-
reason,
|
|
221
|
-
ageSource,
|
|
222
|
-
evidence,
|
|
223
|
-
...extra,
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
const RUNTIME_TURN_FILE = "clients/runtime-turn.ts";
|
|
227
|
-
const LENS_DIAGNOSTICS_FILE = "tools/lens-diagnostics.ts";
|
|
228
|
-
export const DELIVERY_SURFACES = {
|
|
229
|
-
// #1892 (lane extraction): both secrets tiers are rendered by the secrets
|
|
230
|
-
// LANE (`clients/turn-end/lanes/secrets.ts`), so `clients/runtime-turn.ts`
|
|
231
|
-
// no longer reads `.live`/`.stale` itself — the arm it can still be pinned
|
|
232
|
-
// to is the whole gated store object it hands the lane. That is WEAKER than
|
|
233
|
-
// the previous `gitleaksGate.live,` pin (it no longer says which partition
|
|
234
|
-
// feeds which tier) and the loss is deliberate: the live/stale split is a
|
|
235
|
-
// lane rule now, pinned behaviourally instead, by
|
|
236
|
-
// `tests/clients/runtime-turn-finding-freshness.test.ts` ("keeps an
|
|
237
|
-
// unmodified file's finding as a full-severity blocker" / "DEMOTES a
|
|
238
|
-
// finding whose file was edited after the scan — kept, no line") and the
|
|
239
|
-
// committed witness goldens under `tests/fixtures/witness/`. What the pin
|
|
240
|
-
// still proves is what this registry exists for: the rows the tier renders
|
|
241
|
-
// came out of a real `gateFindingsByPathFreshness` call and not out of a
|
|
242
|
-
// hand-built object (the R2 binding chain in
|
|
243
|
-
// `tests/clients/finding-delivery-gate.test.ts` walks
|
|
244
|
-
// `gitleaksGate` → `scannerGates` → the call).
|
|
245
|
-
"runtime-turn:secrets-gitleaks": gated(RUNTIME_TURN_FILE, "Turn-end 🔴 secrets blocker, gitleaks cache.", ["gateFindingsByPathFreshness"], ["gitleaksGate,"]),
|
|
246
|
-
"runtime-turn:secrets-trivy": gated(RUNTIME_TURN_FILE, "Turn-end 🔴 secrets blocker, trivy secrets cache.", ["gateFindingsByPathFreshness"], ["trivySecretsGate,"]),
|
|
247
|
-
"runtime-turn:govulncheck-advisory": gated(RUNTIME_TURN_FILE, "Turn-end 🛡️ Go CVE advisory (call-site line only).", ["gateFindingsByPathFreshness"], ["scannerGates.govulncheck"]),
|
|
248
|
-
// Two tagged seams (the stale and live render branches below the same
|
|
249
|
-
// `sweepInlineBlockerFreshness` call) legitimately share one evidence
|
|
250
|
-
// occurrence — evidenceMin: 2 tells the exclusive-assignment check both
|
|
251
|
-
// are expected claimants, not a rogue seam contesting the real one.
|
|
252
|
-
"runtime-turn:unresolved-inline-blocker": gated(RUNTIME_TURN_FILE, "Turn-end re-surfaced unresolved inline blockers.", ["sweepInlineBlockerFreshness"],
|
|
253
|
-
// #1790: the call now passes `additionalEntries` (widget-store rows) as a
|
|
254
|
-
// third argument, so the literal is the call's opening rather than the
|
|
255
|
-
// whole single-line invocation.
|
|
256
|
-
["sweepInlineBlockerFreshness(runtime, cwd, {"], { evidenceMin: 2 }),
|
|
257
|
-
// The same shared gate call and the same two stores as the live secrets
|
|
258
|
-
// tier — one lane renders both tiers, so this surface has no gate call and
|
|
259
|
-
// no arm read of its own; see the note above the live tier for what the pin
|
|
260
|
-
// does and does not prove.
|
|
261
|
-
"runtime-turn:stale-secrets-tier": gated(RUNTIME_TURN_FILE, "Turn-end 🔑 demoted-secrets tier (drifted since scan).", ["gateFindingsByPathFreshness"], ["gitleaksGate,", "trivySecretsGate,"]),
|
|
262
|
-
// The evidence below is the literal header FRAGMENT including the
|
|
263
|
-
// interpolation — proves the label is actually rendered, not merely
|
|
264
|
-
// computed and discarded (review round F1's "deleted the age
|
|
265
|
-
// interpolations" attack).
|
|
266
|
-
"runtime-turn:trivy-critical-blocker": labeled(RUNTIME_TURN_FILE, "Turn-end 🔴 CRITICAL dependency CVE blocker (trivy).", "Package-pinned finding with no cited file:line to stat — freshness has " +
|
|
267
|
-
"nothing to check drift against. The session_start cache can be " +
|
|
268
|
-
"arbitrarily old, so its age is stated instead. Also routes through " +
|
|
269
|
-
"`filterFindingsByDisposition` (#1625) first — a suppressed/false-" +
|
|
270
|
-
"positive finding never reaches this render, so the age label and the " +
|
|
271
|
-
"disposition filter compose rather than substitute for each other.", "TrivyResult.scannedAt", ["CRITICAL dependency CVEs (trivy, ${trivyAgeLabel}"]),
|
|
272
|
-
"runtime-turn:trivy-cve-advisory": labeled(RUNTIME_TURN_FILE, "Turn-end 🛡️ non-critical dependency CVE advisory (trivy).", "Same package-pinned shape and #1625 disposition composition as the " +
|
|
273
|
-
"CRITICAL blocker above.", "TrivyResult.scannedAt", ["Dependency CVEs (trivy, ${trivyAgeLabel}"]),
|
|
274
|
-
"runtime-turn:trivy-license-advisory": labeled(RUNTIME_TURN_FILE, "Turn-end 📜 dependency license-risk advisory (trivy).", "Same package-pinned shape as the CRITICAL blocker above.", "TrivyResult.scannedAt", ["Dependency license risk (trivy, ${trivyAgeLabel}"]),
|
|
275
|
-
"runtime-turn:dead-code-advisory": labeled(RUNTIME_TURN_FILE, "Turn-end dead-code delta advisory (knip/vulture/etc).", "The delta shown is computed from THIS turn's own analyze() call, " +
|
|
276
|
-
"diffed against the previous cache — never a replay of a stale cache.", "live"),
|
|
277
|
-
"runtime-turn:knip-blocker": labeled(RUNTIME_TURN_FILE, "Turn-end 🔴 Knip unresolved-imports/deps blocker.", "Same shape as the dead-code advisory: `await knipClient.analyze(cwd, " +
|
|
278
|
-
"...)` runs fresh THIS turn, diffed against the previous cache and " +
|
|
279
|
-
"filtered to files edited this turn — never a replay of a stale cache.", "live"),
|
|
280
|
-
"runtime-turn:knip-advisory": labeled(RUNTIME_TURN_FILE, "Turn-end ⚠️ Knip newly-unused-exports advisory.", "Same live-this-turn shape as the Knip blocker above.", "live"),
|
|
281
|
-
"runtime-turn:actionable-warnings-advisory": labeled(RUNTIME_TURN_FILE, "Turn-end actionable-warnings advisory (ast-grep etc).", "`peekActionableWarnings` reads `_actionableWarningsThisTurn` — recorded " +
|
|
282
|
-
"fresh from this turn's own dispatch, never a cross-turn cache.", "live"),
|
|
283
|
-
"runtime-turn:code-quality-warnings-advisory": labeled(RUNTIME_TURN_FILE, "Turn-end code-quality-warnings advisory.", "`peekCodeQualityWarnings` reads `_codeQualityWarningsThisTurn` — the " +
|
|
284
|
-
"same per-turn accumulator shape as actionable-warnings above.", "live"),
|
|
285
|
-
"runtime-turn:disposition-suppressed-notice": labeled(RUNTIME_TURN_FILE, "Turn-end running disposition-suppressed-count notice (#1616).", "A live running total accumulated from this turn's own gate/disposition " +
|
|
286
|
-
"calls above (`dispositionSuppressedTotal`) — telemetry ABOUT the other " +
|
|
287
|
-
"gated surfaces, not a cache of its own.", "live"),
|
|
288
|
-
// #2001/#2002 collect-later: findings an auxiliary LSP published AFTER its
|
|
289
|
-
// aux-grace window expired, probed from the client cache at the next
|
|
290
|
-
// turn_end. Gated on the mark timestamp: a cited file deleted or edited
|
|
291
|
-
// since the mark drops its findings (never delivered before, and the
|
|
292
|
-
// drifting edit already re-touched the file — a fresh pending pair
|
|
293
|
-
// supersedes this one), with both drop arms counted in the
|
|
294
|
-
// `late_auxiliary_findings` latency record rather than silenced.
|
|
295
|
-
//
|
|
296
|
-
// #3102: freshness is only half the gate. The survivors also take the shared
|
|
297
|
-
// `clients/dispatch/finding-policy.ts` stack (inline `pi-lens-ignore` →
|
|
298
|
-
// stored dispositions → `.pi-lens.json` rule policy) the per-edit dispatcher,
|
|
299
|
-
// `mode=full` and the `source=lsp` probe lane apply — without it a finding
|
|
300
|
-
// the agent marked `false-positive` re-reported on every drain. Per #3088
|
|
301
|
-
// round-2 F4, the evidence is the CALL TEXT of that filter, which exists
|
|
302
|
-
// nowhere else in this file: a bare `applyFindingPolicy` would also be
|
|
303
|
-
// satisfied by an import line or an unrelated caller.
|
|
304
|
-
"runtime-turn:late-auxiliary-findings": gated(RUNTIME_TURN_FILE, "Turn-end late-auxiliary LSP findings (collect-later probe of aux " +
|
|
305
|
-
"client caches whose grace window expired).",
|
|
306
|
-
// #3248: the open-coded `applyFindingPolicy(...)` here and the identical
|
|
307
|
-
// one the late-RUNNER lane needed are now one `applyPushedFindingPolicy`
|
|
308
|
-
// call, so the gate and the evidence name that call. Same stack, same
|
|
309
|
-
// identities — only the spelling moved.
|
|
310
|
-
["gateFindingsByPathFreshness", "applyPushedFindingPolicy"], ['"late-auxiliary-findings": {', "applyPushedFindingPolicy(gate.live, {"]),
|
|
311
|
-
"runtime-turn:late-runner-findings": gated(RUNTIME_TURN_FILE, "Turn-end CLI runner findings collected after the post-write path.",
|
|
312
|
-
// #3248: this lane was the last push surface with no disposition stage;
|
|
313
|
-
// it now routes through the same shared policy call as its
|
|
314
|
-
// late-auxiliary twin, which is what this gate pins.
|
|
315
|
-
["gateFindingsByPathFreshness", "applyPushedFindingPolicy"], ['"late-runner-findings"'], { evidenceMin: 2 }),
|
|
316
|
-
"runtime-turn:cascade-blocker": labeled(RUNTIME_TURN_FILE, "Turn-end 🧪 cascade neighbor blocker.", "Cascade results settle synchronously this turn where possible " +
|
|
317
|
-
"(`settleCascadeRuns`), but an unsettled compute can carry over to a " +
|
|
318
|
-
"later turn (bounded by a carry cap) — a carried-over result renders " +
|
|
319
|
-
"with an explicit `(carried N turns · scanned Xm ago)` label (#3167, " +
|
|
320
|
-
"#3168 F3), so the agent can tell it from a fresh observation.", "live", ["cascadeCarrySuffix("], { evidenceMin: 1 }),
|
|
321
|
-
"runtime-turn:cascade-coverage-advisory": labeled(RUNTIME_TURN_FILE, "Turn-end cascade-coverage-gap advisories (graph/binding/budget).", "Explains what the cascade check could NOT confirm this turn — not a " +
|
|
322
|
-
"finding with a cited path, an absence-of-coverage disclosure computed " +
|
|
323
|
-
"from this turn's own indeterminate-run list. An advisory computed from " +
|
|
324
|
-
"a carried indeterminate run is labeled `(carried N turns · <age>)` " +
|
|
325
|
-
"(#3167, #3168 F4 — dropped on mixed carried/fresh buckets). The age " +
|
|
326
|
-
"half reads `scan age unknown` on this surface today: no indeterminate-" +
|
|
327
|
-
"run producer stamps `observedAt` (only the resolved-found plumb does, " +
|
|
328
|
-
"`clients/cascade-format.ts`), and one unstamped carried run collapses " +
|
|
329
|
-
"the whole bucket's age rather than claiming the stamped runs' (#3168 " +
|
|
330
|
-
"F13). The carry COUNT is always real.", "live", ["withCarryLabel("], { evidenceMin: 3 }),
|
|
331
|
-
// #3102: the cold-neighbour cascade run is BUILT here, in the quiet-window
|
|
332
|
-
// reconcile (`onResolvedFound` in index.ts), a turn earlier than the
|
|
333
|
-
// `runtime-turn:cascade-blocker` render that finally carries it — so it is
|
|
334
|
-
// its own delivery lane, and it was the one that rendered raw LSP findings
|
|
335
|
-
// with no policy filter at all. The evidence is the CALL TEXT of the shared
|
|
336
|
-
// filter (#3088 round-2 F4): a bare `applyFindingPolicy` would also be
|
|
337
|
-
// satisfied by the import line.
|
|
338
|
-
"cascade-format:resolved-found-run": gated("clients/cascade-format.ts", "Cold-neighbour ERROR diagnostics formatted into the turn-end cascade " +
|
|
339
|
-
"run by `buildResolvedFoundCascadeRun` (quiet-window reconcile of a " +
|
|
340
|
-
"cascade touch that skipped its in-lane wait).", ["applyFindingPolicy"], ["applyFindingPolicy(retained, {"]),
|
|
341
|
-
// #3157: the IN-LANE cascade — a different delivery lane from the
|
|
342
|
-
// quiet-window run above, and the one #3102's sweep cleared WRONGLY. Its four
|
|
343
|
-
// display sites (passive cold snapshot, fresh touch, touch-error fallback,
|
|
344
|
-
// degraded fallback) assemble `CascadeNeighborResult.diagnostics` and reach
|
|
345
|
-
// the agent through `formatCascadeNeighborDiagnostics` without ever entering
|
|
346
|
-
// the dispatcher's `applyOutputFilters` pipeline: the sweep's file-level
|
|
347
|
-
// verdict ("the per-edit dispatch path, which already filters in
|
|
348
|
-
// dispatcher.ts") was true only of the per-edit RUNNER output in
|
|
349
|
-
// `runners/lsp.ts`, which is a different call site in a different file.
|
|
350
|
-
//
|
|
351
|
-
// Evidence is the CALL TEXT (#3088 round-2 F4), counted: `cascadeDisplay(` is
|
|
352
|
-
// the one seam all four sites route through, so `evidenceMin: 4` is the count
|
|
353
|
-
// of display sites in the file and dropping ANY of them back to a raw
|
|
354
|
-
// `convertLspDiagnostics` reds this suite. Identity-stubbing the callee
|
|
355
|
-
// instead is caught behaviourally — it reds twelve cases in
|
|
356
|
-
// `tests/clients/inlane-cascade-finding-policy.test.ts`, which is a stronger
|
|
357
|
-
// signal than the R2 proximity heuristic. Residual, stated: a FIFTH display
|
|
358
|
-
// site that open-codes the conversion keeps the count at 4 and is caught by
|
|
359
|
-
// review, not by this row.
|
|
360
|
-
"dispatch-integration:in-lane-cascade": gated("clients/dispatch/integration.ts", "In-lane per-edit cascade neighbour ERROR diagnostics, rendered into the " +
|
|
361
|
-
"turn-end cascade block by `computeCascadeForFile`.", ["applyCascadeDisplayPolicy"], ["cascadeDisplay("], { evidenceMin: 4 }),
|
|
362
|
-
"runtime-turn:call-graph-advisory": labeled(RUNTIME_TURN_FILE, "Turn-end 📊 call-graph impact advisory.", "`runtime.callGraph` is a session-lifetime in-memory structure; this " +
|
|
363
|
-
"round does not verify or gate ITS OWN freshness policy (how/when it " +
|
|
364
|
-
"incorporates edits made earlier in the session).", "live", [], {
|
|
365
|
-
status: "partial",
|
|
366
|
-
partialReason: "call-graph freshness/invalidation policy is out of this PR's scope — " +
|
|
367
|
-
"tracked as a follow-up, not silently assumed fresh.",
|
|
368
|
-
}),
|
|
369
|
-
// #3088 round 2 F4: this row used to name `applyDispositions`/`applyRulePolicy`
|
|
370
|
-
// with whole-file evidence literals. Once #3088 folded mode=full's stack onto
|
|
371
|
-
// `applyFindingPolicy`, those two literals survived only in UNRELATED
|
|
372
|
-
// mode=delta helpers in the same file, so deleting the entire policy stack out
|
|
373
|
-
// of `applyInlineSuppressionsToSummaries` left this gate — and the ratchet —
|
|
374
|
-
// green while five behaviour cases redded. The evidence is now the call text
|
|
375
|
-
// of the merge's own filter, which exists nowhere else in the file.
|
|
376
|
-
"lens-diagnostics:mode-full": gated(LENS_DIAGNOSTICS_FILE, "`lens_diagnostics mode=full` report.", ["applyFindingPolicy", "reconcileProjectDiagnosticsSnapshot"], [
|
|
377
|
-
"applyFindingPolicy(summary.diagnostics, {",
|
|
378
|
-
"reconcileProjectDiagnosticsSnapshot(",
|
|
379
|
-
]),
|
|
380
|
-
"lens-diagnostics:mode-all": gated(LENS_DIAGNOSTICS_FILE, "`lens_diagnostics mode=all` report (widget-state read).", ["reconcileStaleWidgetFiles", "reconcileStaleWidgetDependencyBlockers"], ["reconcileStaleWidgetFiles(", "reconcileStaleWidgetDependencyBlockers("]),
|
|
381
|
-
// #1634 review round F3: this was the most important gap — the tool's
|
|
382
|
-
// DEFAULT mode rendered cached `file:line` findings with zero freshness
|
|
383
|
-
// check. `applyDeltaFreshnessGate` (this file's sibling in
|
|
384
|
-
// tools/lens-diagnostics.ts) now routes the actionable/quality-warnings
|
|
385
|
-
// caches through the shared gate using each report's own `generatedAt`.
|
|
386
|
-
// Round R3: mode=delta has a THIRD arm — the persisted project-diagnostics
|
|
387
|
-
// delta report, rendered by `appendProjectDiagnosticsDeltaLines` — which
|
|
388
|
-
// carried the identical unfixed shape. It now gates the same way, against
|
|
389
|
-
// its own `generatedAt`.
|
|
390
|
-
"lens-diagnostics:mode-delta": gated(LENS_DIAGNOSTICS_FILE, "`lens_diagnostics mode=delta` report (the tool's DEFAULT mode) — " +
|
|
391
|
-
"re-serves the actionable-warnings/code-quality-warnings caches AND " +
|
|
392
|
-
"the persisted project-diagnostics delta report.", ["gateFindingsByPathFreshness"], [
|
|
393
|
-
'"lens-diagnostics-delta": {',
|
|
394
|
-
"applyDeltaFreshnessGate(",
|
|
395
|
-
'"lens-diagnostics-delta-project": {',
|
|
396
|
-
]),
|
|
397
|
-
"widget-state:footer": gated("clients/widget-state.ts", "TUI footer blocking/error/warning tally.", ["reconcileStaleWidgetFiles", "isBlocking"], ["isBlocking(diagnostic)", "reconcileStaleWidgetFiles()"]),
|
|
398
|
-
"agent-nudge:context-message": labeled("clients/agent-nudge.ts", "Post-edit file-touch nudge injected via `context`.", "Not a scanner finding store: no severity, no cited line, no cache — the " +
|
|
399
|
-
"accumulator is drained and cleared at the moment of injection, so the " +
|
|
400
|
-
"content IS the current state by construction.", "live"),
|
|
401
|
-
"test-runner-delivery:custom-entry": labeled("clients/test-runner-delivery.ts", "Post-agent test-runner failures in a non-context custom entry.", "The cache remains authoritative for pull diagnostics and the commit guard; this surface appends only after provenance validation and an idle recheck.", "live"),
|
|
402
|
-
"project-diagnostics:persisted-snapshot": gated(LENS_DIAGNOSTICS_FILE, "Cross-session persisted project-diagnostics snapshot read.", ["reconcileProjectDiagnosticsSnapshot"], ["reconcileProjectDiagnosticsSnapshot("]),
|
|
403
|
-
// ── #2028: the remaining agent-facing surfaces ──────────────────────────
|
|
404
|
-
// Registered after #2028's root-cause review found the 🔴 STOP block
|
|
405
|
-
// rendering stale/deleted-file blockers because its surface was never in
|
|
406
|
-
// this registry — the exact "gated or labeled, never neither" gap this
|
|
407
|
-
// module exists to close.
|
|
408
|
-
"tool-call:stop-blocker": gated("clients/pipeline.ts", "Per-edit 🔴 STOP blocker output appended to the write/edit tool result.", ["dropFindingsForMissingPaths"], ['store: "stop-blocker"']),
|
|
409
|
-
// The freshness stack itself (own-file mtime + reverse-dependency mtimes
|
|
410
|
-
// via isEntryFresh, plus the #1095 content binding) lives inside
|
|
411
|
-
// clients/lsp/workspace-diagnostics-cache.ts; the two evidence calls are
|
|
412
|
-
// the tool's literal entry points into that gated path.
|
|
413
|
-
"lsp-diagnostics:tool-output": gated("tools/lsp-diagnostics.ts", "`lsp_diagnostics` batch/directory sweep results. Cache hits replay through " +
|
|
414
|
-
"the shared workspace-diagnostics cache: createWorkspaceDiagnosticsCacheContext " +
|
|
415
|
-
"is the tool's entry, and its lookup() applies the #671/#672 freshness stack " +
|
|
416
|
-
"(own-file mtime + reverse-dependency mtimes via isEntryFresh) plus the " +
|
|
417
|
-
"#1095 content binding. #3088: every route out of this tool — fresh, " +
|
|
418
|
-
"cache replay, single file, directory — also passes applyProbeFindingPolicy, " +
|
|
419
|
-
"the stored-disposition / .pi-lens.json rule-policy / inline pi-lens-ignore " +
|
|
420
|
-
"stack the per-edit dispatch path and mode=full apply.", [
|
|
421
|
-
"createWorkspaceDiagnosticsCacheContext",
|
|
422
|
-
"isEntryFresh",
|
|
423
|
-
"cacheCtx.lookup",
|
|
424
|
-
"applyProbeFindingPolicy",
|
|
425
|
-
], [
|
|
426
|
-
"createWorkspaceDiagnosticsCacheContext(resolvedCwd)",
|
|
427
|
-
"cacheCtx.lookup(file, scopeKey)",
|
|
428
|
-
"applyProbeFindingPolicy(",
|
|
429
|
-
]),
|
|
430
|
-
"git-guard:commit-blocked": labeled("clients/git-guard.ts", "Git-guard commit/push 🔴 COMMIT BLOCKED verdict (--lens-guard).", "Synchronous preflight rejection returned inline with the failed git " +
|
|
431
|
-
"command — no stored state is delivered, so nothing can go stale between " +
|
|
432
|
-
"detection and delivery.", "live"),
|
|
433
|
-
"shared-checkout-guard:worktree-mutation-blocked": labeled("clients/shared-checkout-guard.ts", "Shared-checkout 🔴 WORKING-TREE CHANGE BLOCKED verdict (--lens-checkout-guard).", "Synchronous preflight rejection returned inline with the failed git " +
|
|
434
|
-
"command. Both inputs are read at decision time — the instance registry " +
|
|
435
|
-
"and `git status` — so no stored finding is replayed and nothing can go " +
|
|
436
|
-
"stale between detection and delivery.", "live"),
|
|
437
|
-
"read-guard-tool-lines:preflight-errors": labeled("clients/read-guard-tool-lines.ts", "Read-guard hashline BLOCKED / RE-READ REQUIRED / PARTIAL APPLY / " +
|
|
438
|
-
"ALREADY APPLIED preflight errors (#2402).", "Computed fresh per edit attempt and returned as that attempt's rejection — " +
|
|
439
|
-
"no cached findings are replayed, so there is no staleness window. The " +
|
|
440
|
-
"PARTIAL APPLY and ALREADY APPLIED variants describe the same attempt's " +
|
|
441
|
-
"commit outcome; applied-edit recognition reads RuntimeCoordinator's " +
|
|
442
|
-
"session-scoped record, which resets with the session.", "live"),
|
|
443
|
-
"mutating-tool:adapter-preflight-errors": labeled("clients/mutating-tool.ts", "Shape-adapter BLOCKED preflight errors for hashline edit inputs the " +
|
|
444
|
-
"adapter recognized but could not resolve to a range (#2423).", "Computed fresh from the tool input on each attempt and returned as that " +
|
|
445
|
-
"attempt's rejection, so there is no staleness window. The adapters " +
|
|
446
|
-
"read only the call's own arguments; nothing cached is replayed.", "live"),
|
|
447
|
-
"tool-call:duplicate-export-blocker": labeled("clients/runtime-tool-call.ts", "Duplicate-export STOP rejection returned inline with the failed edit.", "Synchronous preflight rejection computed per edit attempt; no stored state.", "live"),
|
|
448
|
-
"agent-behavior:thrashing-notice": labeled("clients/agent-behavior-client.ts", "In-result thrashing/blind-write detection notice.", "Ephemeral notice computed at detection time inside the same tool result — " +
|
|
449
|
-
"no persistence and no cache, so nothing can be stale.", "live"),
|
|
450
|
-
};
|
|
451
|
-
function assertPartialStatusHasReason(id, entry) {
|
|
452
|
-
if (entry.status === "partial" && !entry.partialReason) {
|
|
453
|
-
throw new Error(`finding-delivery-gate: surface "${id}" is status=partial but names no partialReason`);
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
function assertGatedShapeIsWellFormed(id, entry) {
|
|
457
|
-
if (!Array.isArray(entry.gates) || entry.gates.length === 0) {
|
|
458
|
-
throw new Error(`finding-delivery-gate: surface "${id}" is mode=gated but names no gate`);
|
|
459
|
-
}
|
|
460
|
-
if (!Array.isArray(entry.evidence) || entry.evidence.length === 0) {
|
|
461
|
-
throw new Error(`finding-delivery-gate: surface "${id}" is mode=gated but names no evidence`);
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
function assertLabeledShapeIsWellFormed(id, entry) {
|
|
465
|
-
if (!entry.reason || !entry.ageSource) {
|
|
466
|
-
throw new Error(`finding-delivery-gate: surface "${id}" is mode=labeled but is missing reason/ageSource`);
|
|
467
|
-
}
|
|
468
|
-
// "live" surfaces call no age-formatting helper — nothing to grep for.
|
|
469
|
-
// Every other ageSource claims a real cache, so it must be provable.
|
|
470
|
-
if (entry.ageSource !== "live" && entry.evidence.length === 0) {
|
|
471
|
-
throw new Error(`finding-delivery-gate: surface "${id}" claims ageSource "${entry.ageSource}" but names no evidence`);
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
/**
|
|
475
|
-
* Enforce #1634's "no third state" rule: every registered surface is either
|
|
476
|
-
* `gated` (names at least one gate) or `labeled` (names a reason and an age
|
|
477
|
-
* source) — never a malformed/undeclared third shape. Throws naming the
|
|
478
|
-
* offending surface id, so a bad registration fails loudly instead of
|
|
479
|
-
* silently rendering ungated.
|
|
480
|
-
*/
|
|
481
|
-
export function assertNoDeliveryBypass(registry = DELIVERY_SURFACES) {
|
|
482
|
-
for (const [id, entry] of Object.entries(registry)) {
|
|
483
|
-
assertPartialStatusHasReason(id, entry);
|
|
484
|
-
if (entry.mode === "gated") {
|
|
485
|
-
assertGatedShapeIsWellFormed(id, entry);
|
|
486
|
-
continue;
|
|
487
|
-
}
|
|
488
|
-
if (entry.mode === "labeled") {
|
|
489
|
-
assertLabeledShapeIsWellFormed(id, entry);
|
|
490
|
-
continue;
|
|
491
|
-
}
|
|
492
|
-
throw new Error(`finding-delivery-gate: surface "${id}" has unrecognized mode ${JSON.stringify(entry.mode)} — must be "gated" or "labeled"`);
|
|
493
|
-
}
|
|
494
|
-
}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared "finding identity" primitive (#1816 item 2, unifying the #533
|
|
3
|
-
* canonicalization fix that only reached one of three copies).
|
|
4
|
-
*
|
|
5
|
-
* Three call sites independently hand-rolled the same shape — a hash over
|
|
6
|
-
* `relativeFile|tool|rule|...|normalizedMessage` — to derive a stable id for
|
|
7
|
-
* a diagnostic/finding: `diagnostic-dispositions.ts` (dd:/ddw:),
|
|
8
|
-
* `actionable-warnings.ts` (aw:), and `code-quality-warnings.ts` (cq:). Only
|
|
9
|
-
* `diagnostic-dispositions.ts`'s `relativeFile` routed both `cwd` and
|
|
10
|
-
* `filePath` through `normalizeMapKey` before computing the relative path
|
|
11
|
-
* (see the #1024/#210-class comment this module's `relativeFile` carries
|
|
12
|
-
* forward) — the other two hashed the RAW inputs, so a drive-letter-case or
|
|
13
|
-
* slash-variant `filePath` produced a different id in the warning stores
|
|
14
|
-
* than dispositions would compute for the identical file. This module is the
|
|
15
|
-
* single source for all three: one canonicalizing `relativeFile`, one
|
|
16
|
-
* `normalizeMessage`, one `hashText`, and one hash length.
|
|
17
|
-
*
|
|
18
|
-
* Hash length: dispositions used 12 hex chars, the two warning builders used
|
|
19
|
-
* 10. This module picks 12 (dispositions' length — dispositions is the older,
|
|
20
|
-
* more heavily-audited call site) for every finding id going forward.
|
|
21
|
-
* Callers that persist ids in a keyed on-disk store (only
|
|
22
|
-
* `actionable-warnings.ts` does; see its own module doc) are responsible for
|
|
23
|
-
* back-compat lookups against ids computed under their PRE-#1816 formula —
|
|
24
|
-
* this module does not attempt migration itself, since it has no way to know
|
|
25
|
-
* which callers persist and which are ephemeral-per-turn.
|
|
26
|
-
*/
|
|
27
|
-
import { createHash } from "node:crypto";
|
|
28
|
-
import * as path from "node:path";
|
|
29
|
-
import { normalizeMapKey } from "./path-utils.js";
|
|
30
|
-
/** Every finding id in this codebase truncates its sha256 hex digest to this
|
|
31
|
-
* many characters. Single source so the three call sites this module
|
|
32
|
-
* unifies (and any future one) can't drift back apart the way the pre-#1816
|
|
33
|
-
* 10-vs-12 split did. */
|
|
34
|
-
export const FINDING_ID_HASH_LENGTH = 12;
|
|
35
|
-
/** Exported so a cross-check against a live diagnostic's message (e.g.
|
|
36
|
-
* lens-diagnostic-mark's widget match) folds whitespace/case the same way id
|
|
37
|
-
* derivation does — a second, slightly different normalizer would make a
|
|
38
|
-
* real match invisible. */
|
|
39
|
-
export function normalizeMessage(message) {
|
|
40
|
-
return message.replace(/\s+/g, " ").trim().toLowerCase();
|
|
41
|
-
}
|
|
42
|
-
export function hashText(value, length = FINDING_ID_HASH_LENGTH) {
|
|
43
|
-
return createHash("sha256").update(value).digest("hex").slice(0, length);
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Canonicalize BOTH `filePath` and `cwd` through `normalizeMapKey` (realpath
|
|
47
|
-
* + case-fold on Windows) BEFORE computing the relative path, so two callers
|
|
48
|
-
* holding different path FORMS of the same file (raw vs. already-normalized,
|
|
49
|
-
* a Windows drive/segment case difference, a slash variant) converge on the
|
|
50
|
-
* identical relative-path component instead of silently diverging into two
|
|
51
|
-
* different finding ids for the same file (the #533 orphaned-record class).
|
|
52
|
-
* `normalizeMapKey` is idempotent, so an already-canonical caller pays no
|
|
53
|
-
* behavior change, only the realpath I/O — acceptable here because finding
|
|
54
|
-
* ids are computed far less often than a per-write hot-path map key.
|
|
55
|
-
*/
|
|
56
|
-
export function relativeFile(filePath, cwd) {
|
|
57
|
-
const canonicalCwd = normalizeMapKey(cwd);
|
|
58
|
-
const canonicalFile = normalizeMapKey(filePath);
|
|
59
|
-
const rel = path.relative(canonicalCwd, canonicalFile).replace(/\\/g, "/");
|
|
60
|
-
return rel && !rel.startsWith("..") ? rel : canonicalFile;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Shared finding-id builder. `prefix` carries the caller's own namespace
|
|
64
|
-
* (`"dd:"`, `"ddw:"`, `"aw:"`, `"cq:"`, ...) so distinct finding families
|
|
65
|
-
* never collide in a shared store. `parts` is the caller's own ordered,
|
|
66
|
-
* domain-specific identity fields (tool/rule/code/normalizedMessage/line/
|
|
67
|
-
* lineContentHash/...) — this function only supplies the canonical
|
|
68
|
-
* `relativeFile` component and the hash/prefix wiring.
|
|
69
|
-
*
|
|
70
|
-
* Both `undefined` AND `null` entries fold to `""` (review-round F4,
|
|
71
|
-
* #1816), matching the `String(x ?? "")` idiom every pre-#1816 id builder
|
|
72
|
-
* used. `null` is in the parts type despite every caller's field being
|
|
73
|
-
* declared `T | undefined` in TypeScript: those fields (`Diagnostic.code`,
|
|
74
|
-
* `.rule`, etc.) are frequently assigned straight from `JSON.parse`'d tool
|
|
75
|
-
* output, which defeats the static type at runtime — a runner that emits
|
|
76
|
-
* `"code": null` produces a real `null`, not `undefined`. Folding only
|
|
77
|
-
* `undefined` would silently hash that as the string `"null"` instead of
|
|
78
|
-
* `""`, diverging from every other id-construction path for the exact same
|
|
79
|
-
* finding — a fresh, narrower instance of the #533 divergence class this
|
|
80
|
-
* module exists to eliminate.
|
|
81
|
-
*/
|
|
82
|
-
export function stableFindingId(prefix, args) {
|
|
83
|
-
const joined = [
|
|
84
|
-
relativeFile(args.filePath, args.cwd),
|
|
85
|
-
...args.parts.map((part) => part === undefined || part === null ? "" : String(part)),
|
|
86
|
-
].join("|");
|
|
87
|
-
return `${prefix}${hashText(joined)}`;
|
|
88
|
-
}
|