@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,181 +0,0 @@
|
|
|
1
|
-
import * as fs from "node:fs";
|
|
2
|
-
import * as path from "node:path";
|
|
3
|
-
import { getProjectDataDir } from "./file-utils.js";
|
|
4
|
-
import { normalizeMapKey } from "./path-utils.js";
|
|
5
|
-
export function getProjectChangeLogPath(cwd) {
|
|
6
|
-
return path.join(getProjectDataDir(cwd), "change-log.jsonl");
|
|
7
|
-
}
|
|
8
|
-
function parseChangeLine(line) {
|
|
9
|
-
try {
|
|
10
|
-
const parsed = JSON.parse(line);
|
|
11
|
-
if (typeof parsed.seq !== "number" ||
|
|
12
|
-
typeof parsed.fileSeq !== "number" ||
|
|
13
|
-
typeof parsed.filePath !== "string" ||
|
|
14
|
-
typeof parsed.source !== "string") {
|
|
15
|
-
return undefined;
|
|
16
|
-
}
|
|
17
|
-
return {
|
|
18
|
-
seq: parsed.seq,
|
|
19
|
-
timestamp: parsed.timestamp ?? new Date(0).toISOString(),
|
|
20
|
-
sessionId: parsed.sessionId ?? "unknown",
|
|
21
|
-
turnIndex: parsed.turnIndex ?? 0,
|
|
22
|
-
source: parsed.source,
|
|
23
|
-
filePath: parsed.filePath,
|
|
24
|
-
fileSeq: parsed.fileSeq,
|
|
25
|
-
changedRange: parsed.changedRange,
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
return undefined;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
export function readProjectChanges(cwd) {
|
|
33
|
-
const logPath = getProjectChangeLogPath(cwd);
|
|
34
|
-
try {
|
|
35
|
-
const content = fs.readFileSync(logPath, "utf-8");
|
|
36
|
-
return content
|
|
37
|
-
.split(/\r?\n/)
|
|
38
|
-
.map((line) => line.trim())
|
|
39
|
-
.filter(Boolean)
|
|
40
|
-
.map(parseChangeLine)
|
|
41
|
-
.filter((entry) => Boolean(entry));
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
return [];
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Async twin of `readProjectChanges` (#1162). `fs.promises.readFile` — unlike
|
|
49
|
-
* the sync `readFileSync` above — YIELDS to the event loop, which is what lets
|
|
50
|
-
* a caller bound it with a `Promise.race` timeout: a `setTimeout` can never
|
|
51
|
-
* preempt a synchronous blocking read (the thread doesn't return to the event
|
|
52
|
-
* loop until the OS does), so a bounded read on the session_start hot path
|
|
53
|
-
* requires the async form. Same parse/error-swallow semantics as the sync
|
|
54
|
-
* version — a missing/corrupt log is the normal cold-start case, not a
|
|
55
|
-
* caller-visible error.
|
|
56
|
-
*/
|
|
57
|
-
async function readProjectChangesAsync(cwd) {
|
|
58
|
-
const logPath = getProjectChangeLogPath(cwd);
|
|
59
|
-
try {
|
|
60
|
-
const content = await fs.promises.readFile(logPath, "utf-8");
|
|
61
|
-
return content
|
|
62
|
-
.split(/\r?\n/)
|
|
63
|
-
.map((line) => line.trim())
|
|
64
|
-
.filter(Boolean)
|
|
65
|
-
.map(parseChangeLine)
|
|
66
|
-
.filter((entry) => Boolean(entry));
|
|
67
|
-
}
|
|
68
|
-
catch {
|
|
69
|
-
return [];
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
export function readChangesSince(cwd, seq, maxEntries = 200) {
|
|
73
|
-
const limit = Math.max(1, maxEntries);
|
|
74
|
-
return readProjectChanges(cwd)
|
|
75
|
-
.filter((entry) => entry.seq > seq)
|
|
76
|
-
.sort((a, b) => a.seq - b.seq)
|
|
77
|
-
.slice(-limit);
|
|
78
|
-
}
|
|
79
|
-
// Test-observable count of the EXPENSIVE per-entry folds (each one does a
|
|
80
|
-
// `path.resolve` + `normalizeMapKey`/`realpathSync.native` syscall). Lets the
|
|
81
|
-
// #1019 equivalence tests prove the partial path folds strictly FEWER entries
|
|
82
|
-
// than the full replay for the same log — i.e. that the bound actually holds —
|
|
83
|
-
// without a brittle spy on the path helpers.
|
|
84
|
-
let _sequenceFoldCountForTests = 0;
|
|
85
|
-
export function getSequenceFoldCountForTests() {
|
|
86
|
-
return _sequenceFoldCountForTests;
|
|
87
|
-
}
|
|
88
|
-
export function resetSequenceFoldCountForTests() {
|
|
89
|
-
_sequenceFoldCountForTests = 0;
|
|
90
|
-
}
|
|
91
|
-
function foldEntry(entry, fileSeqByPath) {
|
|
92
|
-
_sequenceFoldCountForTests++;
|
|
93
|
-
const key = normalizeMapKey(path.resolve(entry.filePath));
|
|
94
|
-
fileSeqByPath.set(key, Math.max(fileSeqByPath.get(key) ?? 0, entry.fileSeq));
|
|
95
|
-
}
|
|
96
|
-
function fullReplay(entries) {
|
|
97
|
-
let projectSeq = 0;
|
|
98
|
-
const fileSeqByPath = new Map();
|
|
99
|
-
for (const entry of entries) {
|
|
100
|
-
projectSeq = Math.max(projectSeq, entry.seq);
|
|
101
|
-
foldEntry(entry, fileSeqByPath);
|
|
102
|
-
}
|
|
103
|
-
return { projectSeq, fileSeqByPath };
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Attempt the bounded partial replay: hydrate `base` (pre-normalized keys, no
|
|
107
|
-
* `realpath` cost) and fold ONLY entries with `seq > base.sinceSeq`. Returns
|
|
108
|
-
* `null` — signalling the caller to fall back to a full replay — whenever the
|
|
109
|
-
* base cannot be trusted to be byte-identical to a full replay:
|
|
110
|
-
*
|
|
111
|
-
* - `base.sinceSeq` is AHEAD of the log's max seq (the log was truncated /
|
|
112
|
-
* rotated below the snapshot, or the snapshot seq is simply ahead). Serving
|
|
113
|
-
* the base would over-report the seq; the full replay reflects the real log.
|
|
114
|
-
*
|
|
115
|
-
* The result is provably equal to a full replay under the append-only,
|
|
116
|
-
* single-writer invariant (`base` == fold of the log up to `sinceSeq`): every
|
|
117
|
-
* historical file's seq is already in `base`, and folding the strictly-newer
|
|
118
|
-
* entries with the SAME `Math.max` the full replay uses reproduces the max over
|
|
119
|
-
* the whole log for both `projectSeq` and each file. `Math.max` makes the fold
|
|
120
|
-
* order-independent, so gaps / out-of-order entries are handled exactly as the
|
|
121
|
-
* full replay handles them.
|
|
122
|
-
*/
|
|
123
|
-
function partialReplay(entries, base) {
|
|
124
|
-
let logMaxSeq = 0;
|
|
125
|
-
for (const entry of entries) {
|
|
126
|
-
if (entry.seq > logMaxSeq)
|
|
127
|
-
logMaxSeq = entry.seq;
|
|
128
|
-
}
|
|
129
|
-
// Snapshot ahead of / newer than the log (truncation, rotation, or a stale
|
|
130
|
-
// log): the base describes a state the log no longer backs — never serve it.
|
|
131
|
-
if (base.sinceSeq > logMaxSeq)
|
|
132
|
-
return null;
|
|
133
|
-
const fileSeqByPath = new Map(base.fileSeqByPath);
|
|
134
|
-
let projectSeq = Math.max(0, base.projectSeq);
|
|
135
|
-
for (const entry of entries) {
|
|
136
|
-
if (entry.seq <= base.sinceSeq)
|
|
137
|
-
continue; // covered by the base
|
|
138
|
-
projectSeq = Math.max(projectSeq, entry.seq);
|
|
139
|
-
foldEntry(entry, fileSeqByPath);
|
|
140
|
-
}
|
|
141
|
-
return { projectSeq, fileSeqByPath };
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Compute the current `{ projectSeq, fileSeqByPath }` from the append-only
|
|
145
|
-
* change log. With no `base`, this is a full replay of the entire log. With a
|
|
146
|
-
* snapshot-embedded `base` (#1019), it folds only entries newer than
|
|
147
|
-
* `base.sinceSeq` on top of the base — O(changes since snapshot) instead of
|
|
148
|
-
* O(entire log) — and transparently falls back to a full replay when the base
|
|
149
|
-
* cannot be trusted (see `partialReplay`). A legacy/stale/missing snapshot
|
|
150
|
-
* simply passes no `base` (or one the guard rejects), so correctness never
|
|
151
|
-
* depends on the optimization being applicable.
|
|
152
|
-
*/
|
|
153
|
-
export function readLatestProjectSequence(cwd, base) {
|
|
154
|
-
const entries = readProjectChanges(cwd);
|
|
155
|
-
if (base) {
|
|
156
|
-
const partial = partialReplay(entries, base);
|
|
157
|
-
if (partial)
|
|
158
|
-
return partial;
|
|
159
|
-
}
|
|
160
|
-
return fullReplay(entries);
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Async twin of `readLatestProjectSequence` (#1162) — same fold logic, but
|
|
164
|
-
* reads the log via `readProjectChangesAsync` so a caller can bound the wait
|
|
165
|
-
* with a `Promise.race` timeout (see that function's doc comment for why the
|
|
166
|
-
* sync form can't be bounded at all).
|
|
167
|
-
*/
|
|
168
|
-
export async function readLatestProjectSequenceAsync(cwd, base) {
|
|
169
|
-
const entries = await readProjectChangesAsync(cwd);
|
|
170
|
-
if (base) {
|
|
171
|
-
const partial = partialReplay(entries, base);
|
|
172
|
-
if (partial)
|
|
173
|
-
return partial;
|
|
174
|
-
}
|
|
175
|
-
return fullReplay(entries);
|
|
176
|
-
}
|
|
177
|
-
export function appendProjectChange(cwd, entry) {
|
|
178
|
-
const logPath = getProjectChangeLogPath(cwd);
|
|
179
|
-
fs.mkdirSync(path.dirname(logPath), { recursive: true });
|
|
180
|
-
fs.appendFileSync(logPath, `${JSON.stringify(entry)}\n`, "utf-8");
|
|
181
|
-
}
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
import * as fs from "node:fs";
|
|
2
|
-
import * as path from "node:path";
|
|
3
|
-
function readPackageJson(cwd) {
|
|
4
|
-
const pkgPath = path.join(cwd, "package.json");
|
|
5
|
-
try {
|
|
6
|
-
const raw = fs.readFileSync(pkgPath, "utf-8");
|
|
7
|
-
return JSON.parse(raw);
|
|
8
|
-
}
|
|
9
|
-
catch {
|
|
10
|
-
return undefined;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
function hasDep(pkg, name) {
|
|
14
|
-
if (!pkg)
|
|
15
|
-
return false;
|
|
16
|
-
return Boolean(pkg.dependencies?.[name] ??
|
|
17
|
-
pkg.devDependencies?.[name] ??
|
|
18
|
-
pkg.peerDependencies?.[name]);
|
|
19
|
-
}
|
|
20
|
-
function fileExists(cwd, ...segments) {
|
|
21
|
-
try {
|
|
22
|
-
return fs.existsSync(path.join(cwd, ...segments));
|
|
23
|
-
}
|
|
24
|
-
catch {
|
|
25
|
-
return false;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
function dirExists(cwd, ...segments) {
|
|
29
|
-
try {
|
|
30
|
-
const target = path.join(cwd, ...segments);
|
|
31
|
-
const stat = fs.statSync(target);
|
|
32
|
-
return stat.isDirectory();
|
|
33
|
-
}
|
|
34
|
-
catch {
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
function detectReact(_cwd, pkg) {
|
|
39
|
-
const signals = [];
|
|
40
|
-
if (hasDep(pkg, "react"))
|
|
41
|
-
signals.push("package.json:dependencies.react");
|
|
42
|
-
if (hasDep(pkg, "react-dom"))
|
|
43
|
-
signals.push("package.json:dependencies.react-dom");
|
|
44
|
-
if (hasDep(pkg, "@types/react"))
|
|
45
|
-
signals.push("package.json:devDependencies.@types/react");
|
|
46
|
-
if (signals.length === 0)
|
|
47
|
-
return undefined;
|
|
48
|
-
const confidence = hasDep(pkg, "react-dom")
|
|
49
|
-
? "high"
|
|
50
|
-
: "medium";
|
|
51
|
-
return { id: "react", confidence, signals };
|
|
52
|
-
}
|
|
53
|
-
function detectNext(cwd, pkg) {
|
|
54
|
-
const signals = [];
|
|
55
|
-
if (hasDep(pkg, "next"))
|
|
56
|
-
signals.push("package.json:dependencies.next");
|
|
57
|
-
for (const candidate of [
|
|
58
|
-
"next.config.js",
|
|
59
|
-
"next.config.mjs",
|
|
60
|
-
"next.config.ts",
|
|
61
|
-
]) {
|
|
62
|
-
if (fileExists(cwd, candidate))
|
|
63
|
-
signals.push(candidate);
|
|
64
|
-
}
|
|
65
|
-
if (dirExists(cwd, "src", "pages"))
|
|
66
|
-
signals.push("src/pages/");
|
|
67
|
-
else if (dirExists(cwd, "pages"))
|
|
68
|
-
signals.push("pages/");
|
|
69
|
-
if (dirExists(cwd, "src", "app"))
|
|
70
|
-
signals.push("src/app/");
|
|
71
|
-
else if (dirExists(cwd, "app"))
|
|
72
|
-
signals.push("app/");
|
|
73
|
-
if (signals.length === 0)
|
|
74
|
-
return undefined;
|
|
75
|
-
const confidence = hasDep(pkg, "next") && signals.some((s) => s.startsWith("next.config."))
|
|
76
|
-
? "high"
|
|
77
|
-
: hasDep(pkg, "next")
|
|
78
|
-
? "medium"
|
|
79
|
-
: "low";
|
|
80
|
-
return { id: "next", confidence, signals };
|
|
81
|
-
}
|
|
82
|
-
function detectVite(cwd, pkg) {
|
|
83
|
-
const signals = [];
|
|
84
|
-
if (hasDep(pkg, "vite"))
|
|
85
|
-
signals.push("package.json:devDependencies.vite");
|
|
86
|
-
for (const candidate of [
|
|
87
|
-
"vite.config.ts",
|
|
88
|
-
"vite.config.js",
|
|
89
|
-
"vite.config.mjs",
|
|
90
|
-
"vite.config.mts",
|
|
91
|
-
]) {
|
|
92
|
-
if (fileExists(cwd, candidate))
|
|
93
|
-
signals.push(candidate);
|
|
94
|
-
}
|
|
95
|
-
if (signals.length === 0)
|
|
96
|
-
return undefined;
|
|
97
|
-
const confidence = hasDep(pkg, "vite") && signals.some((s) => s.startsWith("vite.config."))
|
|
98
|
-
? "high"
|
|
99
|
-
: "medium";
|
|
100
|
-
return { id: "vite", confidence, signals };
|
|
101
|
-
}
|
|
102
|
-
function detectVitest(cwd, pkg) {
|
|
103
|
-
const signals = [];
|
|
104
|
-
if (hasDep(pkg, "vitest"))
|
|
105
|
-
signals.push("package.json:devDependencies.vitest");
|
|
106
|
-
for (const candidate of [
|
|
107
|
-
"vitest.config.ts",
|
|
108
|
-
"vitest.config.js",
|
|
109
|
-
"vitest.config.mjs",
|
|
110
|
-
"vitest.config.mts",
|
|
111
|
-
]) {
|
|
112
|
-
if (fileExists(cwd, candidate))
|
|
113
|
-
signals.push(candidate);
|
|
114
|
-
}
|
|
115
|
-
if (signals.length === 0)
|
|
116
|
-
return undefined;
|
|
117
|
-
const confidence = hasDep(pkg, "vitest")
|
|
118
|
-
? "high"
|
|
119
|
-
: "medium";
|
|
120
|
-
return { id: "vitest", confidence, signals };
|
|
121
|
-
}
|
|
122
|
-
const AGENT_DOC_CANDIDATES = [
|
|
123
|
-
"AGENTS.md",
|
|
124
|
-
"CLAUDE.md",
|
|
125
|
-
".cursorrules",
|
|
126
|
-
];
|
|
127
|
-
function summarizeAgentDocs(cwd) {
|
|
128
|
-
const docs = [];
|
|
129
|
-
for (const candidate of AGENT_DOC_CANDIDATES) {
|
|
130
|
-
const abs = path.join(cwd, candidate);
|
|
131
|
-
try {
|
|
132
|
-
const raw = fs.readFileSync(abs, "utf-8");
|
|
133
|
-
const lineCount = raw.split(/\r?\n/).length;
|
|
134
|
-
docs.push({ filePath: candidate, lineCount });
|
|
135
|
-
}
|
|
136
|
-
catch {
|
|
137
|
-
// candidate not present
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
return docs;
|
|
141
|
-
}
|
|
142
|
-
export function detectProjectConventions(cwd) {
|
|
143
|
-
let cwdExists = false;
|
|
144
|
-
try {
|
|
145
|
-
cwdExists = fs.statSync(cwd).isDirectory();
|
|
146
|
-
}
|
|
147
|
-
catch {
|
|
148
|
-
cwdExists = false;
|
|
149
|
-
}
|
|
150
|
-
if (!cwdExists) {
|
|
151
|
-
return { frameworks: [], testRunners: [], buildTools: [], agentDocs: [] };
|
|
152
|
-
}
|
|
153
|
-
const pkg = readPackageJson(cwd);
|
|
154
|
-
const detectors = [detectReact, detectNext, detectVite, detectVitest];
|
|
155
|
-
const frameworks = [];
|
|
156
|
-
for (const detector of detectors) {
|
|
157
|
-
const detection = detector(cwd, pkg);
|
|
158
|
-
if (detection)
|
|
159
|
-
frameworks.push(detection);
|
|
160
|
-
}
|
|
161
|
-
const testRunners = [];
|
|
162
|
-
if (frameworks.some((f) => f.id === "vitest"))
|
|
163
|
-
testRunners.push("vitest");
|
|
164
|
-
const buildTools = [];
|
|
165
|
-
if (frameworks.some((f) => f.id === "vite"))
|
|
166
|
-
buildTools.push("vite");
|
|
167
|
-
if (frameworks.some((f) => f.id === "next"))
|
|
168
|
-
buildTools.push("next");
|
|
169
|
-
const agentDocs = summarizeAgentDocs(cwd);
|
|
170
|
-
return { frameworks, testRunners, buildTools, agentDocs };
|
|
171
|
-
}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import * as fs from "node:fs";
|
|
2
|
-
import * as path from "node:path";
|
|
3
|
-
import { getProjectDataDir } from "../file-utils.js";
|
|
4
|
-
import { writeFileAtomic } from "../atomic-write.js";
|
|
5
|
-
import { readJsonCache } from "../json-cache-read.js";
|
|
6
|
-
import { freshnessFromMtime } from "../freshness.js";
|
|
7
|
-
import { hashDiagnosticContent } from "../lsp/diagnostic-binding.js";
|
|
8
|
-
// v3 (#2154, #3060 review F1): rows carry `fileFingerprints` — the size and
|
|
9
|
-
// sha256 of the bytes the scan actually read. A v2 snapshot has no content
|
|
10
|
-
// axis at all; its rows can only be judged by `mtime <= scannedAt`, the test
|
|
11
|
-
// that let an edit landing mid-scan read as fresh forever. Every row here is
|
|
12
|
-
// a POSITIVE claim, so v2 records are rejected by the version guard and the
|
|
13
|
-
// project is re-scanned rather than served under the axis that failed — the
|
|
14
|
-
// same clean break `WORKSPACE_DIAGNOSTICS_CACHE_VERSION` v3 (#2776) made.
|
|
15
|
-
// v2: cheap-tier scan now also runs ast-grep-napi (#308); invalidate older
|
|
16
|
-
// snapshots so a pre-ast-grep cache isn't served as complete via refreshRunners=cached.
|
|
17
|
-
export const PROJECT_DIAGNOSTICS_CACHE_VERSION = 3;
|
|
18
|
-
const SNAPSHOT_CACHE_FILE = "project-diagnostics.json";
|
|
19
|
-
const DELTA_CACHE_FILE = "project-diagnostics-delta.json";
|
|
20
|
-
function cachePath(cwd, fileName) {
|
|
21
|
-
return path.join(getProjectDataDir(cwd), "cache", fileName);
|
|
22
|
-
}
|
|
23
|
-
export function loadProjectDiagnosticsSnapshot(cwd) {
|
|
24
|
-
return readJsonCache(cachePath(cwd, SNAPSHOT_CACHE_FILE), (parsed) => {
|
|
25
|
-
if (!parsed || typeof parsed !== "object")
|
|
26
|
-
return undefined;
|
|
27
|
-
const snapshot = parsed;
|
|
28
|
-
if (snapshot.version !== PROJECT_DIAGNOSTICS_CACHE_VERSION)
|
|
29
|
-
return undefined;
|
|
30
|
-
if (!Array.isArray(snapshot.diagnostics))
|
|
31
|
-
return undefined;
|
|
32
|
-
return snapshot;
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
export function saveProjectDiagnosticsSnapshot(cwd, snapshot) {
|
|
36
|
-
const filePath = cachePath(cwd, SNAPSHOT_CACHE_FILE);
|
|
37
|
-
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
38
|
-
writeFileAtomic(filePath, JSON.stringify(snapshot, null, 2));
|
|
39
|
-
}
|
|
40
|
-
export function loadProjectDiagnosticsDeltaReport(cwd) {
|
|
41
|
-
return readJsonCache(cachePath(cwd, DELTA_CACHE_FILE), (parsed) => {
|
|
42
|
-
if (!parsed || typeof parsed !== "object")
|
|
43
|
-
return undefined;
|
|
44
|
-
const report = parsed;
|
|
45
|
-
if (report.version !== PROJECT_DIAGNOSTICS_CACHE_VERSION)
|
|
46
|
-
return undefined;
|
|
47
|
-
if (!Array.isArray(report.diagnostics))
|
|
48
|
-
return undefined;
|
|
49
|
-
return report;
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
export function writeProjectDiagnosticsDeltaReport(cwd, report) {
|
|
53
|
-
const filePath = cachePath(cwd, DELTA_CACHE_FILE);
|
|
54
|
-
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
55
|
-
writeFileAtomic(filePath, JSON.stringify(report, null, 2));
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Drop diagnostics whose underlying file changed on disk after the snapshot was
|
|
59
|
-
* taken (`mtimeMs > scannedAt + MTIME_DRIFT_TOLERANCE_MS`) or no longer
|
|
60
|
-
* exists. The persisted snapshot is a
|
|
61
|
-
* cross-session cache served by `lens_diagnostics mode=full refreshRunners=cached`;
|
|
62
|
-
* without this it replays diagnostics the agent has since fixed or for files that
|
|
63
|
-
* were deleted (#298 — "the cache needs to be cleaned before running diagnostics
|
|
64
|
-
* because it became stale"). This mirrors `reconcileStaleWidgetFiles` for the
|
|
65
|
-
* in-memory widget, applied at the consumer so `loadProjectDiagnosticsSnapshot`
|
|
66
|
-
* stays a pure reader. Synchronous (a `statSync` per *distinct* file, memoised),
|
|
67
|
-
* since the cached full-mode path is already off the typing hot loop.
|
|
68
|
-
*
|
|
69
|
-
* The boundary is `mtime > scannedAt + MTIME_DRIFT_TOLERANCE_MS`
|
|
70
|
-
* (`blocker-freshness.ts`), not a bare `mtime > scannedAt`: #1711 found this
|
|
71
|
-
* consumer's old +1ms slack did not cover the measured Windows host skew
|
|
72
|
-
* between a file's mtime and the `Date.now()` read that produces `scannedAt`
|
|
73
|
-
* (up to ~11.4ms, #1491/#1498) — a same-tick write-then-scan silently
|
|
74
|
-
* dropped a live finding here, worse than `findingPathFreshness`'s sibling
|
|
75
|
-
* gate (#1708) since this arm DROPS rather than demotes. Reusing the shared
|
|
76
|
-
* constant keeps one source of truth for the measured skew.
|
|
77
|
-
*
|
|
78
|
-
* Fail-safe on an unparseable `scannedAt`: return the snapshot untouched rather
|
|
79
|
-
* than risk dropping live findings on a clock/format anomaly.
|
|
80
|
-
*/
|
|
81
|
-
export function reconcileProjectDiagnosticsSnapshot(snapshot) {
|
|
82
|
-
const scannedAtMs = Date.parse(snapshot.scannedAt);
|
|
83
|
-
if (!Number.isFinite(scannedAtMs))
|
|
84
|
-
return { snapshot, staleDropped: 0 };
|
|
85
|
-
const staleByFile = new Map();
|
|
86
|
-
const isStale = (filePath) => {
|
|
87
|
-
const cached = staleByFile.get(filePath);
|
|
88
|
-
if (cached !== undefined)
|
|
89
|
-
return cached;
|
|
90
|
-
let stale;
|
|
91
|
-
let stat;
|
|
92
|
-
try {
|
|
93
|
-
stat = fs.statSync(filePath);
|
|
94
|
-
}
|
|
95
|
-
catch {
|
|
96
|
-
stat = undefined; // deleted / unreadable -> indeterminate -> drop
|
|
97
|
-
}
|
|
98
|
-
// #2154: when the scan recorded what this file's bytes WERE, that answers
|
|
99
|
-
// the question directly and the timestamp comparison below cannot — a
|
|
100
|
-
// file edited while the scan was still running carries an mtime at or
|
|
101
|
-
// before `scannedAt` while holding bytes no rule here ever saw. Size is
|
|
102
|
-
// the cheap reject; only a same-size file is read and hashed. An exact
|
|
103
|
-
// content match is stronger evidence than any mtime ordering, so it
|
|
104
|
-
// settles the verdict on its own: these are per-file syntax rules, so
|
|
105
|
-
// identical bytes mean identical findings no matter what the clock says.
|
|
106
|
-
const fingerprint = snapshot.fileFingerprints?.[filePath];
|
|
107
|
-
if (fingerprint && stat) {
|
|
108
|
-
stale = true;
|
|
109
|
-
if (stat.size === fingerprint.sizeBytes) {
|
|
110
|
-
try {
|
|
111
|
-
stale =
|
|
112
|
-
hashDiagnosticContent(fs.readFileSync(filePath, "utf-8")) !==
|
|
113
|
-
fingerprint.contentHash;
|
|
114
|
-
}
|
|
115
|
-
catch {
|
|
116
|
-
stale = true; // unreadable now -> indeterminate -> drop
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
staleByFile.set(filePath, stale);
|
|
120
|
-
return stale;
|
|
121
|
-
}
|
|
122
|
-
const verdict = freshnessFromMtime({
|
|
123
|
-
mtimeMs: stat?.mtimeMs,
|
|
124
|
-
referenceMs: scannedAtMs,
|
|
125
|
-
});
|
|
126
|
-
// Pre-kernel policy: an unreadable/missing file is stale (dropped).
|
|
127
|
-
stale = verdict.verdict !== "fresh";
|
|
128
|
-
staleByFile.set(filePath, stale);
|
|
129
|
-
return stale;
|
|
130
|
-
};
|
|
131
|
-
const kept = snapshot.diagnostics.filter((d) => !isStale(d.filePath));
|
|
132
|
-
if (kept.length === snapshot.diagnostics.length) {
|
|
133
|
-
return { snapshot, staleDropped: 0 };
|
|
134
|
-
}
|
|
135
|
-
const staleDropped = [...staleByFile.values()].filter(Boolean).length;
|
|
136
|
-
return { snapshot: { ...snapshot, diagnostics: kept }, staleDropped };
|
|
137
|
-
}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* #533: which trigger warms each analyzer, surfaced in the "cold" honesty note
|
|
3
|
-
* so the note is actionable (names what to do), matching the #511/#514 house
|
|
4
|
-
* shape. Keyed by the ids `fetchFreshProjectDiagnostics` (./fresh-fetch.ts)
|
|
5
|
-
* reports in its `cold` list — keep in sync with that module's `ANALYZER_IDS`.
|
|
6
|
-
*/
|
|
7
|
-
const WARM_TRIGGER = {
|
|
8
|
-
knip: "runs at session-start",
|
|
9
|
-
jscpd: "runs at session-start",
|
|
10
|
-
madge: "runs at session-start",
|
|
11
|
-
gitleaks: "runs at session-start (config opt-in), or on any git repo via mode=full (#608)",
|
|
12
|
-
govulncheck: "runs at session-start (Go projects only)",
|
|
13
|
-
opengrep: "runs at session-start",
|
|
14
|
-
trivy: "runs at session-start",
|
|
15
|
-
"dead-code": "runs at session-start (Python projects only)",
|
|
16
|
-
"test-runner": "fires per-edit at turn_end (only after a source file with a discoverable test companion is edited)",
|
|
17
|
-
};
|
|
18
|
-
function warmTriggerFor(analyzerId) {
|
|
19
|
-
return WARM_TRIGGER[analyzerId] ?? "runs at session-start";
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* #1623: single formatter for a "not run" lane entry — reused by every
|
|
23
|
-
* caller that renders `fetchFreshProjectDiagnostics`'s `cold` list (today,
|
|
24
|
-
* `tools/lens-diagnostics.ts`'s mode=full) so the wording can't drift
|
|
25
|
-
* per-caller. Prefers the SPECIFIC reason captured at the decision point
|
|
26
|
-
* (`coldReasons`, ./fresh-fetch.ts) over the generic `warmTriggerFor` guess —
|
|
27
|
-
* the latter only remains a fallback for a `cold` id this map doesn't cover.
|
|
28
|
-
*/
|
|
29
|
-
export function formatNotRunEntry(analyzerId, coldReasons) {
|
|
30
|
-
const reason = coldReasons?.[analyzerId];
|
|
31
|
-
return reason
|
|
32
|
-
? `${analyzerId} — not run (${reason})`
|
|
33
|
-
: `${analyzerId} — not run (${warmTriggerFor(analyzerId)})`;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* #1623: human-readable age, for a lane whose result was served from cache
|
|
37
|
-
* rather than executed fresh this call (see `cachedAgeMs`, ./fresh-fetch.ts).
|
|
38
|
-
* Mirrors the granularity an agent actually needs to judge staleness — exact
|
|
39
|
-
* seconds don't matter, "12m" vs "3h" does.
|
|
40
|
-
*/
|
|
41
|
-
export function formatCacheAge(ms) {
|
|
42
|
-
// #1623 fix-round F4: `CacheManager.readCache` accepts a missing/corrupt
|
|
43
|
-
// `meta.timestamp` as a HIT (the timestamp only gates staleness, not
|
|
44
|
-
// validity), so `Date.now() - new Date(badTimestamp).getTime()` reaches
|
|
45
|
-
// here as NaN. Rendering "NaNh old" is a worse honesty gap than the one
|
|
46
|
-
// this whole module exists to close — say the age is unknown instead of
|
|
47
|
-
// fabricating one. Mirrors the sibling `Number.isFinite` guard in
|
|
48
|
-
// `./cache.ts`'s `reconcileProjectDiagnosticsSnapshot` (fail-safe on an
|
|
49
|
-
// unparseable timestamp rather than propagate NaN).
|
|
50
|
-
if (!Number.isFinite(ms))
|
|
51
|
-
return "age unknown";
|
|
52
|
-
if (ms < 0)
|
|
53
|
-
return "0m";
|
|
54
|
-
const totalMinutes = Math.round(ms / 60_000);
|
|
55
|
-
if (totalMinutes < 1)
|
|
56
|
-
return "under 1m";
|
|
57
|
-
if (totalMinutes < 60)
|
|
58
|
-
return `${totalMinutes}m`;
|
|
59
|
-
const hours = Math.floor(totalMinutes / 60);
|
|
60
|
-
const minutes = totalMinutes % 60;
|
|
61
|
-
return minutes > 0 ? `${hours}h${minutes}m` : `${hours}h`;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* #1623 fix-round F5: the full "<age> old" phrase for a cache-read lane.
|
|
65
|
-
* Every render call site used to append the literal word " old" after
|
|
66
|
-
* `formatCacheAge` itself, so a corrupt/missing timestamp's "age unknown"
|
|
67
|
-
* came out as the ungrammatical "age unknown old" — the exact residual the
|
|
68
|
-
* issue's tracking comment named. "Old" only makes sense once an age is
|
|
69
|
-
* actually known, so this is the single place that decides whether to say
|
|
70
|
-
* it, instead of every caller repeating (and occasionally forgetting) the
|
|
71
|
-
* same guard.
|
|
72
|
-
*/
|
|
73
|
-
export function formatCacheAgeOld(ms) {
|
|
74
|
-
const age = formatCacheAge(ms);
|
|
75
|
-
return Number.isFinite(ms) ? `${age} old` : age;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* #1623 fix-round F1: a "cold" reason for an analyzer whose `ensureAvailable()`
|
|
79
|
-
* returned false, built from the SAME `AvailabilityOutcome`/`AvailabilityCause`
|
|
80
|
-
* taxonomy every dispatch-side unavailability message already uses
|
|
81
|
-
* (`describeUnavailability`, availability-policy.ts) — not a re-guessed
|
|
82
|
-
* "binary unavailable" for every failure shape.
|
|
83
|
-
*
|
|
84
|
-
* `ensureAvailable() === false` collapses at least three distinct causes: a
|
|
85
|
-
* durable absence (`missing`), a transient probe under an active retry
|
|
86
|
-
* cooldown (`transient`), and — for govulncheck specifically — a project-trust
|
|
87
|
-
* install denial the latch never even records (`assertInstallAllowed` returns
|
|
88
|
-
* before touching it, project-trust.ts). fresh-fetch.ts's govulncheck task
|
|
89
|
-
* checks trust denial itself, via `projectTrustDenialReason()`, before
|
|
90
|
-
* falling back to this function. Wording a cooldown as "unavailable" would
|
|
91
|
-
* repeat, one layer up, exactly the dispatch-layer defect #1467 fixed.
|
|
92
|
-
*/
|
|
93
|
-
export function reasonFromAvailabilityVerdict(tool, verdict) {
|
|
94
|
-
if (!verdict || verdict.outcome === null)
|
|
95
|
-
return `${tool} binary unavailable`;
|
|
96
|
-
const { outcome, cause } = verdict;
|
|
97
|
-
if (outcome === "transient") {
|
|
98
|
-
if (cause === "install-retry-exhausted") {
|
|
99
|
-
return `${tool} install kept timing out and hit its retry ceiling this session (not reported missing)`;
|
|
100
|
-
}
|
|
101
|
-
const remainingMs = verdict.retryAtMs - Date.now();
|
|
102
|
-
const remainingS = remainingMs > 0 ? Math.round(remainingMs / 1000) : 0;
|
|
103
|
-
return `${tool} availability probe — retry cooldown (${remainingS}s), not a missing install`;
|
|
104
|
-
}
|
|
105
|
-
if (outcome === "non-installable") {
|
|
106
|
-
return `${tool} unavailable on this host (non-installable)`;
|
|
107
|
-
}
|
|
108
|
-
return `${tool} binary unavailable`;
|
|
109
|
-
}
|