@herbertgao/pi-extensions 2026.10.0 → 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 +16 -12
- package/THIRD_PARTY_NOTICES.md +3 -3
- 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/.opencode/plugins/index.js +4 -0
- package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/ponytail-frontmatter.cjs +43 -3
- package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/ponytail.mjs +142 -59
- 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 +52 -242
- package/node_modules/@dietrichgebert/ponytail/hooks/claude-codex-hooks.json +3 -3
- package/node_modules/@dietrichgebert/ponytail/hooks/copilot-hooks.json +4 -4
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-activate.js +70 -16
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-config.js +8 -7
- 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/hooks/ponytail-mode-tracker.js +46 -23
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-runtime.js +39 -7
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-subagent.js +20 -3
- package/node_modules/@dietrichgebert/ponytail/hooks/qoder-hooks.json +3 -3
- package/node_modules/@dietrichgebert/ponytail/package.json +3 -3
- package/node_modules/@dietrichgebert/ponytail/pi-extension/index.js +47 -17
- package/node_modules/@dietrichgebert/ponytail/scripts/uninstall.js +21 -7
- package/node_modules/@dietrichgebert/ponytail/skills/plugin.json +5 -0
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail/SKILL.md +33 -101
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-audit/SKILL.md +89 -27
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-debt/SKILL.md +13 -12
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-gain/SKILL.md +21 -18
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-help/SKILL.md +12 -13
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-review/SKILL.md +96 -52
- 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 +4 -4
- 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/node_modules/pi-typesafe/README.md +1 -1
- package/node_modules/pi-typesafe/dist/backends.d.ts +15 -5
- package/node_modules/pi-typesafe/dist/backends.js +18 -0
- package/node_modules/pi-typesafe/dist/client.d.ts +4 -3
- package/node_modules/pi-typesafe/dist/client.js +22 -7
- package/node_modules/pi-typesafe/dist/index.d.ts +2 -2
- package/node_modules/pi-typesafe/dist/index.js +1 -1
- package/node_modules/pi-typesafe/dist/usage.d.ts +14 -4
- package/node_modules/pi-typesafe/dist/usage.js +147 -42
- package/node_modules/pi-typesafe/package.json +1 -1
- package/node_modules/pi-web-access/CHANGELOG.md +48 -0
- package/node_modules/pi-web-access/README.md +57 -11
- package/node_modules/pi-web-access/brave-rate-limit.ts +8 -2
- package/node_modules/pi-web-access/curator-page.ts +5 -1
- package/node_modules/pi-web-access/curator-server.ts +2 -0
- package/node_modules/pi-web-access/declared-web-links.ts +2 -2
- package/node_modules/pi-web-access/degoog.ts +323 -0
- package/node_modules/pi-web-access/dist/index.js +3483 -2745
- package/node_modules/pi-web-access/dist/mcp-cli.js +27443 -0
- package/node_modules/pi-web-access/exa.ts +5 -1
- package/node_modules/pi-web-access/extract.ts +41 -3
- package/node_modules/pi-web-access/firecrawl.ts +35 -4
- package/node_modules/pi-web-access/gemini-search.ts +34 -11
- package/node_modules/pi-web-access/gemini-web.ts +14 -9
- package/node_modules/pi-web-access/index.ts +153 -1202
- package/node_modules/pi-web-access/keenable.ts +221 -0
- package/node_modules/pi-web-access/mcp-cli.ts +40 -0
- package/node_modules/pi-web-access/mcp-server.ts +81 -0
- package/node_modules/pi-web-access/mcp-tool-definitions.ts +117 -0
- package/node_modules/pi-web-access/openai-search.ts +34 -1
- package/node_modules/pi-web-access/package.json +23 -5
- package/node_modules/pi-web-access/perplexity.ts +64 -56
- package/node_modules/pi-web-access/tool-arguments.ts +20 -0
- package/node_modules/pi-web-access/video-extract.ts +1 -1
- package/node_modules/pi-web-access/web-tool-contract.ts +86 -0
- package/node_modules/pi-web-access/web-tool-core.ts +1502 -0
- package/node_modules/pi-web-access/youtube-extract.ts +2 -5
- package/package.json +17 -12
- package/node_modules/@dietrichgebert/ponytail/README.es.md +0 -329
- package/node_modules/@dietrichgebert/ponytail/README.ko.md +0 -346
- package/node_modules/@dietrichgebert/ponytail/assets/benchmark-3model.svg +0 -21
- package/node_modules/@dietrichgebert/ponytail/assets/benchmark-agentic.svg +0 -62
- package/node_modules/@dietrichgebert/ponytail/assets/logo-dark.png +0 -0
- package/node_modules/@dietrichgebert/ponytail/assets/logo-dark.svg +0 -115
- package/node_modules/@dietrichgebert/ponytail/assets/logo-greenpt-dark.svg +0 -27
- package/node_modules/@dietrichgebert/ponytail/assets/logo-greenpt.svg +0 -27
- package/node_modules/@dietrichgebert/ponytail/assets/logo.png +0 -0
- package/node_modules/@dietrichgebert/ponytail/assets/retriever-icon.png +0 -0
- package/node_modules/@dietrichgebert/ponytail/assets/retriever-logo-dark.svg +0 -4
- package/node_modules/@dietrichgebert/ponytail/assets/retriever-logo-light.svg +0 -4
- package/node_modules/@dietrichgebert/ponytail/assets/social-preview.png +0 -0
- package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner-es.png +0 -0
- package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner-ko.png +0 -0
- package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner.png +0 -0
- 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,593 +0,0 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
2
|
-
import * as fs from "node:fs";
|
|
3
|
-
import * as path from "node:path";
|
|
4
|
-
import { logLatency } from "./latency-logger.js";
|
|
5
|
-
import { normalizeMapKey, toProjectRelativePath } from "./path-utils.js";
|
|
6
|
-
import { resolveRunnerPath } from "./dispatch/runner-context.js";
|
|
7
|
-
import { freshnessFromMtime } from "./freshness.js";
|
|
8
|
-
export const MAX_ADVISORY_AFFECTED_FILES = 256;
|
|
9
|
-
export function advisoryPathKey(filePath, cwd) {
|
|
10
|
-
return normalizeMapKey(path.resolve(cwd, filePath));
|
|
11
|
-
}
|
|
12
|
-
/** Shared with git guard: there is one SHA-256 implementation for advisories. */
|
|
13
|
-
export function advisoryFileHash(filePath) {
|
|
14
|
-
try {
|
|
15
|
-
return createHash("sha256").update(fs.readFileSync(filePath)).digest("hex");
|
|
16
|
-
}
|
|
17
|
-
catch (error) {
|
|
18
|
-
const code = error.code ?? "unknown";
|
|
19
|
-
return code === "ENOENT" ? "missing" : `unreadable:${code}`;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
function snapshotOne(filePath, cwd, role) {
|
|
23
|
-
const resolved = path.resolve(cwd, filePath);
|
|
24
|
-
try {
|
|
25
|
-
const stat = fs.statSync(resolved);
|
|
26
|
-
return {
|
|
27
|
-
path: resolved,
|
|
28
|
-
role,
|
|
29
|
-
mtimeMs: stat.mtimeMs,
|
|
30
|
-
size: stat.size,
|
|
31
|
-
sha256: advisoryFileHash(resolved),
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
catch (error) {
|
|
35
|
-
const code = error.code ?? "unknown";
|
|
36
|
-
return {
|
|
37
|
-
path: resolved,
|
|
38
|
-
role,
|
|
39
|
-
mtimeMs: -1,
|
|
40
|
-
size: -1,
|
|
41
|
-
sha256: code === "ENOENT" ? "missing" : `unreadable:${code}`,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
export function snapshotAdvisoryProvenance(args) {
|
|
46
|
-
const seen = new Set();
|
|
47
|
-
const files = [];
|
|
48
|
-
for (const file of args.files) {
|
|
49
|
-
const key = advisoryPathKey(file.path, args.cwd);
|
|
50
|
-
if (seen.has(key))
|
|
51
|
-
continue;
|
|
52
|
-
seen.add(key);
|
|
53
|
-
files.push(snapshotOne(file.path, args.cwd, file.role));
|
|
54
|
-
}
|
|
55
|
-
return {
|
|
56
|
-
revision: {
|
|
57
|
-
sessionId: args.runtime.telemetrySessionId,
|
|
58
|
-
projectSeq: args.runtime.projectSeq,
|
|
59
|
-
turnIndex: args.runtime.turnIndex,
|
|
60
|
-
generation: args.generation,
|
|
61
|
-
capturedAt: args.capturedAt ?? Date.now(),
|
|
62
|
-
},
|
|
63
|
-
files,
|
|
64
|
-
...(args.truncated ? { truncated: true } : {}),
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
function isFiniteNumber(value) {
|
|
68
|
-
return typeof value === "number" && Number.isFinite(value);
|
|
69
|
-
}
|
|
70
|
-
function isCapturedHash(value) {
|
|
71
|
-
return (typeof value === "string" &&
|
|
72
|
-
(/^[a-f0-9]{64}$/.test(value) ||
|
|
73
|
-
value === "missing" ||
|
|
74
|
-
value.startsWith("unreadable:")));
|
|
75
|
-
}
|
|
76
|
-
function isWellFormed(value) {
|
|
77
|
-
if (!value || typeof value !== "object")
|
|
78
|
-
return false;
|
|
79
|
-
const record = value;
|
|
80
|
-
const revision = record.revision;
|
|
81
|
-
return (!!revision &&
|
|
82
|
-
typeof revision.sessionId === "string" &&
|
|
83
|
-
isFiniteNumber(revision.projectSeq) &&
|
|
84
|
-
isFiniteNumber(revision.turnIndex) &&
|
|
85
|
-
isFiniteNumber(revision.generation) &&
|
|
86
|
-
isFiniteNumber(revision.capturedAt) &&
|
|
87
|
-
Array.isArray(record.files) &&
|
|
88
|
-
record.files.length > 0 &&
|
|
89
|
-
record.files.every((file) => !!file &&
|
|
90
|
-
typeof file.path === "string" &&
|
|
91
|
-
(file.role === "source" ||
|
|
92
|
-
file.role === "test" ||
|
|
93
|
-
file.role === "affected") &&
|
|
94
|
-
isFiniteNumber(file.mtimeMs) &&
|
|
95
|
-
isFiniteNumber(file.size) &&
|
|
96
|
-
isCapturedHash(file.sha256)));
|
|
97
|
-
}
|
|
98
|
-
export function validateAdvisoryProvenance(record, cwd, runtime) {
|
|
99
|
-
if (!isWellFormed(record.provenance)) {
|
|
100
|
-
return {
|
|
101
|
-
status: "unknown",
|
|
102
|
-
reasons: ["malformed-or-legacy-provenance"],
|
|
103
|
-
allFilesDeleted: false,
|
|
104
|
-
changedPathCount: 0,
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
const provenance = record.provenance;
|
|
108
|
-
const reasons = [];
|
|
109
|
-
let unknown = provenance.truncated === true;
|
|
110
|
-
if (unknown)
|
|
111
|
-
reasons.push("truncated-provenance");
|
|
112
|
-
if (runtime) {
|
|
113
|
-
if (provenance.revision.sessionId !== runtime.telemetrySessionId)
|
|
114
|
-
reasons.push("session-mismatch");
|
|
115
|
-
}
|
|
116
|
-
let deletedFiles = 0;
|
|
117
|
-
const changedPaths = new Set();
|
|
118
|
-
for (const captured of provenance.files) {
|
|
119
|
-
const resolved = path.resolve(cwd, captured.path);
|
|
120
|
-
const reasonsBefore = reasons.length;
|
|
121
|
-
let stat;
|
|
122
|
-
try {
|
|
123
|
-
stat = fs.statSync(resolved);
|
|
124
|
-
}
|
|
125
|
-
catch (error) {
|
|
126
|
-
const code = error.code ?? "unknown";
|
|
127
|
-
if (code === "ENOENT") {
|
|
128
|
-
if (captured.sha256 !== "missing") {
|
|
129
|
-
deletedFiles += 1;
|
|
130
|
-
reasons.push(`missing:${advisoryPathKey(resolved, cwd)}`);
|
|
131
|
-
changedPaths.add(advisoryPathKey(resolved, cwd));
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
unknown = true;
|
|
136
|
-
reasons.push(`unreadable:${advisoryPathKey(resolved, cwd)}:${code}`);
|
|
137
|
-
changedPaths.add(advisoryPathKey(resolved, cwd));
|
|
138
|
-
}
|
|
139
|
-
continue;
|
|
140
|
-
}
|
|
141
|
-
if (captured.sha256.startsWith("unreadable:")) {
|
|
142
|
-
unknown = true;
|
|
143
|
-
reasons.push(`capture-unreadable:${advisoryPathKey(resolved, cwd)}`);
|
|
144
|
-
changedPaths.add(advisoryPathKey(resolved, cwd));
|
|
145
|
-
continue;
|
|
146
|
-
}
|
|
147
|
-
if (captured.sha256 === "missing") {
|
|
148
|
-
reasons.push(`created:${advisoryPathKey(resolved, cwd)}`);
|
|
149
|
-
changedPaths.add(advisoryPathKey(resolved, cwd));
|
|
150
|
-
continue;
|
|
151
|
-
}
|
|
152
|
-
if (stat.mtimeMs !== captured.mtimeMs || stat.size !== captured.size) {
|
|
153
|
-
reasons.push(`metadata-changed:${advisoryPathKey(resolved, cwd)}`);
|
|
154
|
-
}
|
|
155
|
-
const currentHash = advisoryFileHash(resolved);
|
|
156
|
-
if (currentHash.startsWith("unreadable:")) {
|
|
157
|
-
unknown = true;
|
|
158
|
-
reasons.push(`${currentHash}:${advisoryPathKey(resolved, cwd)}`);
|
|
159
|
-
}
|
|
160
|
-
else if (currentHash !== captured.sha256) {
|
|
161
|
-
reasons.push(`content-changed:${advisoryPathKey(resolved, cwd)}`);
|
|
162
|
-
}
|
|
163
|
-
if (reasons.length > reasonsBefore)
|
|
164
|
-
changedPaths.add(advisoryPathKey(resolved, cwd));
|
|
165
|
-
}
|
|
166
|
-
const allFilesDeleted = deletedFiles === provenance.files.length;
|
|
167
|
-
if (unknown)
|
|
168
|
-
return {
|
|
169
|
-
status: "unknown",
|
|
170
|
-
reasons,
|
|
171
|
-
allFilesDeleted,
|
|
172
|
-
changedPathCount: changedPaths.size,
|
|
173
|
-
};
|
|
174
|
-
return reasons.length > 0
|
|
175
|
-
? {
|
|
176
|
-
status: "superseded",
|
|
177
|
-
reasons,
|
|
178
|
-
allFilesDeleted,
|
|
179
|
-
changedPathCount: changedPaths.size,
|
|
180
|
-
}
|
|
181
|
-
: { status: "current", reasons: [], allFilesDeleted, changedPathCount: 0 };
|
|
182
|
-
}
|
|
183
|
-
// ── Finding-cited path existence (#1461 slice 1) ──────────────────────────────
|
|
184
|
-
//
|
|
185
|
-
// `validateAdvisoryProvenance` above answers "did the files the agent EDITED
|
|
186
|
-
// change since capture?". A cached scanner finding asks a different question:
|
|
187
|
-
// "does the file this finding NAMES still exist?". #1460's live case is the gap
|
|
188
|
-
// between them — a gitleaks blocker for a directory deleted eleven minutes
|
|
189
|
-
// earlier shipped as `current` seven consecutive times, because the edited
|
|
190
|
-
// files were all intact and the cited path was never in the envelope.
|
|
191
|
-
//
|
|
192
|
-
// CONTRACT (the five remaining #1461 slices reuse this verbatim):
|
|
193
|
-
// - Input is any finding shape; the caller supplies `citedPath`, so nothing
|
|
194
|
-
// here knows about gitleaks, trivy, govulncheck, vulture, or delta mode.
|
|
195
|
-
// - A finding whose cited path is absent (ENOENT/ENOTDIR) is DROPPED, not
|
|
196
|
-
// demoted. There is no remediation for a file that is gone — the agent
|
|
197
|
-
// cannot rotate a credential in it or delete a line from it. Content drift
|
|
198
|
-
// on a SURVIVING file stays `validateAdvisoryProvenance`'s job, and that
|
|
199
|
-
// one demotes.
|
|
200
|
-
// - Fail open, never closed: a finding with no cited path, an unreadable
|
|
201
|
-
// path (EACCES/EPERM/EBUSY), or a path past the stat budget is DELIVERED.
|
|
202
|
-
// Unreadable is not absent; a missed drop is noise, a wrong drop is a lost
|
|
203
|
-
// secret.
|
|
204
|
-
// - Bounded cost: findings are deduped by their RAW cited string first —
|
|
205
|
-
// zero filesystem work — before anything pays for `resolveRunnerPath`'s
|
|
206
|
-
// ancestor walk or `normalizeMapKey`'s realpath. A first cut that deduped
|
|
207
|
-
// by the resolved/canonical key instead still ran that expensive step
|
|
208
|
-
// once per FINDING, not once per unique path, because the dedup lookup
|
|
209
|
-
// came after the cost it was meant to avoid: #1461's live 126-finding
|
|
210
|
-
// record measured 72.7ms in that shape, all of it before the first
|
|
211
|
-
// `statSync`. Deduping the raw string first drops the same record to a
|
|
212
|
-
// ~1.6ms median (this repo, Windows, 10-sample bench) — the remaining
|
|
213
|
-
// cost is one canonicalization + one stat per distinct cited string,
|
|
214
|
-
// capped at `MAX_FINDING_PATH_STATS`.
|
|
215
|
-
// - Path identity uses the guard normalizer (`resolveRunnerPath` →
|
|
216
|
-
// `normalizeMapKey`) for the canonical-key dedup and the shape-aware
|
|
217
|
-
// `toProjectRelativePath` for display, so Windows spellings of one path
|
|
218
|
-
// collapse to one stat and one log entry (defect shapes 1 and 2). This
|
|
219
|
-
// helper has no zero-I/O contract of its own to protect — it stats.
|
|
220
|
-
// Slice 3 (delta mode) must find and name its OWN seam before reusing
|
|
221
|
-
// this shape; `formatDeltaMode` (tools/lens-diagnostics.ts) reads only
|
|
222
|
-
// actionable-warnings, code-quality-warnings, and the delta report, none
|
|
223
|
-
// of which any #1461 slice writes yet, so nothing here currently touches
|
|
224
|
-
// it.
|
|
225
|
-
/** Stat budget: one per unique cited path, sharing the envelope's own cap. */
|
|
226
|
-
const MAX_FINDING_PATH_STATS = MAX_ADVISORY_AFFECTED_FILES;
|
|
227
|
-
/** How many dead paths a single drop record names before it stops. */
|
|
228
|
-
const MAX_LOGGED_DEAD_PATHS = 3;
|
|
229
|
-
/**
|
|
230
|
-
* One stat, one verdict. With `scannedAtMs` supplied, a surviving file whose
|
|
231
|
-
* mtime is newer than the scan reports `stale`.
|
|
232
|
-
*
|
|
233
|
-
* The boundary is `mtime > scannedAt + MTIME_DRIFT_TOLERANCE_MS`: a file
|
|
234
|
-
* scanned AT `scannedAt`, or written within the tolerance window of the scan
|
|
235
|
-
* timestamp being captured, reads live; genuinely past it reads stale.
|
|
236
|
-
*
|
|
237
|
-
* #1708: a bare +1ms tolerance — the convention `reconcileProjectDiagnosticsSnapshot`
|
|
238
|
-
* (clients/project-diagnostics/cache.ts:98) still uses, and the one this gate
|
|
239
|
-
* originally cited-but-withheld ("over-demoting costs a line number,
|
|
240
|
-
* under-demoting replays a false coordinate — the cheaper error wins the
|
|
241
|
-
* tie") — was not enough: on Windows a file's mtime can LEAD the immediately
|
|
242
|
-
* following `Date.now()` read by up to ~11.4ms, the same host skew
|
|
243
|
-
* `MTIME_DRIFT_TOLERANCE_MS` (`blocker-freshness.ts`) was raised to 50ms for
|
|
244
|
-
* (#1491/#1498). At +1ms this gate still demoted a real STOP-blocker (a
|
|
245
|
-
* trivy secret, #1628) to ACTION NEEDED, flaking
|
|
246
|
-
* tests/clients/runtime-turn-secrets-disposition.test.ts. Reusing the shared
|
|
247
|
-
* constant — rather than a second hand-tuned number — keeps one source of
|
|
248
|
-
* truth for the measured skew.
|
|
249
|
-
*/
|
|
250
|
-
export function findingPathFreshness(resolvedPath, scannedAtMs) {
|
|
251
|
-
return freshnessFromFacts(statFindingPath(resolvedPath), scannedAtMs);
|
|
252
|
-
}
|
|
253
|
-
/** The one filesystem touch. Injectable via `probePath` so rules stay testable. */
|
|
254
|
-
function statFindingPath(resolvedPath) {
|
|
255
|
-
try {
|
|
256
|
-
return { state: "present", mtimeMs: fs.statSync(resolvedPath).mtimeMs };
|
|
257
|
-
}
|
|
258
|
-
catch (error) {
|
|
259
|
-
const code = error.code ?? "unknown";
|
|
260
|
-
// ENOTDIR: an ancestor component is no longer a directory — the cited
|
|
261
|
-
// path cannot exist either, same as ENOENT.
|
|
262
|
-
return code === "ENOENT" || code === "ENOTDIR"
|
|
263
|
-
? { state: "missing" }
|
|
264
|
-
: { state: "unknown" };
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
/** Pure: one store's verdict for one path's facts. No filesystem, no policy. */
|
|
268
|
-
function freshnessFromFacts(facts, scannedAtMs) {
|
|
269
|
-
if (facts.state === "missing")
|
|
270
|
-
return "missing";
|
|
271
|
-
if (facts.state === "unknown")
|
|
272
|
-
return "unknown";
|
|
273
|
-
// No scan timestamp recorded: the pre-kernel behavior treated the path as
|
|
274
|
-
// live (no reference to be stale against) - preserved.
|
|
275
|
-
if (scannedAtMs === undefined)
|
|
276
|
-
return "live";
|
|
277
|
-
return freshnessFromMtime({
|
|
278
|
-
mtimeMs: facts.mtimeMs,
|
|
279
|
-
referenceMs: scannedAtMs,
|
|
280
|
-
}).verdict === "stale"
|
|
281
|
-
? "stale"
|
|
282
|
-
: "live";
|
|
283
|
-
}
|
|
284
|
-
/** Existence-only probe. Retained for callers that have no scan timestamp. */
|
|
285
|
-
export function findingPathExistence(resolvedPath) {
|
|
286
|
-
return findingPathFreshness(resolvedPath);
|
|
287
|
-
}
|
|
288
|
-
/**
|
|
289
|
-
* Parse a scan timestamp into epoch ms, or `undefined` when it cannot be
|
|
290
|
-
* trusted. `undefined` disables the staleness arm — never demote on a bad
|
|
291
|
-
* clock.
|
|
292
|
-
*/
|
|
293
|
-
export function parseScannedAtMs(scannedAt) {
|
|
294
|
-
if (scannedAt === undefined || scannedAt === null || scannedAt === "") {
|
|
295
|
-
return undefined;
|
|
296
|
-
}
|
|
297
|
-
const ms = typeof scannedAt === "number" ? scannedAt : Date.parse(scannedAt);
|
|
298
|
-
return Number.isFinite(ms) ? ms : undefined;
|
|
299
|
-
}
|
|
300
|
-
/**
|
|
301
|
-
* Partition findings into `{live, stale, dropped}` by what the path each one
|
|
302
|
-
* names looks like now. Pure apart from the `fs.statSync` probe, which is
|
|
303
|
-
* injectable so the partition rules are unit-testable without a filesystem.
|
|
304
|
-
*
|
|
305
|
-
* The stat memo lives in local `Map`s built fresh on every call — per delivery,
|
|
306
|
-
* never per process. A module-level cache here would be the process-lifetime
|
|
307
|
-
* latch shape: it would pin the first verdict for a path and re-serve it for
|
|
308
|
-
* every later turn, which is the very defect this gate exists to close.
|
|
309
|
-
*/
|
|
310
|
-
export function partitionFindingsByCitedPath(args) {
|
|
311
|
-
return partitionOneSource({ ...args, store: args.store ?? "" }, createPathFactsMemo(args));
|
|
312
|
-
}
|
|
313
|
-
function createPathFactsMemo(args) {
|
|
314
|
-
return {
|
|
315
|
-
facts: new Map(),
|
|
316
|
-
probe: args.probePath ?? statFindingPath,
|
|
317
|
-
limit: args.maxUniquePaths ?? MAX_FINDING_PATH_STATS,
|
|
318
|
-
starved: new Map(),
|
|
319
|
-
};
|
|
320
|
-
}
|
|
321
|
-
function partitionOneSource(args, memo) {
|
|
322
|
-
const scannedAtMs = parseScannedAtMs(args.scannedAt);
|
|
323
|
-
const onMissing = args.onMissing ?? "drop";
|
|
324
|
-
// Two dedup layers, cheapest first. `rawVerdicts` collapses findings that
|
|
325
|
-
// cite the IDENTICAL string with zero filesystem work — the dominant case
|
|
326
|
-
// (#1460's live record: 126 findings over a handful of distinct `file`
|
|
327
|
-
// strings). Only a raw string not seen before pays for
|
|
328
|
-
// `resolveRunnerPath`/`advisoryPathKey`, which folds FS-confirmed spelling
|
|
329
|
-
// variants (case, separators, ancestor walk-up) into `memo.facts`, the
|
|
330
|
-
// canonical-key map that `statCount` reports. Keying the expensive work by
|
|
331
|
-
// the RESOLVED path instead of the raw one (the pre-#1461-HIGH-2 shape)
|
|
332
|
-
// still called it once per finding, since the dedup lookup came after the
|
|
333
|
-
// cost it was meant to dedupe.
|
|
334
|
-
//
|
|
335
|
-
// `rawVerdicts` is per SOURCE (the verdict is this store's), `memo.facts` is
|
|
336
|
-
// per DELIVERY (the stat is nobody's). #1892.
|
|
337
|
-
const rawVerdicts = new Map();
|
|
338
|
-
const live = [];
|
|
339
|
-
const stale = [];
|
|
340
|
-
const dropped = [];
|
|
341
|
-
const deadPaths = [];
|
|
342
|
-
const stalePaths = [];
|
|
343
|
-
const seenPaths = new Set();
|
|
344
|
-
// This SOURCE's own probes. A memo hit costs nothing, so an earlier source
|
|
345
|
-
// having paid for a path only ever helps this one (#3264 review F2).
|
|
346
|
-
let probed = 0;
|
|
347
|
-
for (const finding of args.findings) {
|
|
348
|
-
const cited = args.citedPath(finding);
|
|
349
|
-
if (!cited) {
|
|
350
|
-
live.push(finding);
|
|
351
|
-
continue;
|
|
352
|
-
}
|
|
353
|
-
let verdict = rawVerdicts.get(cited);
|
|
354
|
-
if (verdict === undefined) {
|
|
355
|
-
// Ancestor-tolerant, same as `toRunnerDisplayPath`'s resolution in
|
|
356
|
-
// runtime-turn.ts — a bare `path.resolve` here would decide the drop
|
|
357
|
-
// against a different root than the one used to render the survivor,
|
|
358
|
-
// dropping findings the display path would have shown correctly
|
|
359
|
-
// (#1461 HIGH-1). `resolveRunnerPath` already runs its result through
|
|
360
|
-
// `normalizeMapKey`, so the resolved path IS the canonical key — a
|
|
361
|
-
// second `advisoryPathKey` pass would re-pay the same realpath cost.
|
|
362
|
-
const resolved = resolveRunnerPath(args.cwd, cited);
|
|
363
|
-
let facts = memo.facts.get(resolved);
|
|
364
|
-
if (facts === undefined) {
|
|
365
|
-
if (probed >= memo.limit) {
|
|
366
|
-
// Allowance spent on paths nobody in this delivery has seen —
|
|
367
|
-
// deliver rather than guess, exactly as the pre-fold per-lane cap
|
|
368
|
-
// did. Guessing a verdict for a path nobody looked at is the worse
|
|
369
|
-
// error; what the fold adds is that the guess is now RECORDED.
|
|
370
|
-
memo.starved.set(args.store, (memo.starved.get(args.store) ?? 0) + 1);
|
|
371
|
-
facts = { state: "unknown" };
|
|
372
|
-
}
|
|
373
|
-
else {
|
|
374
|
-
probed += 1;
|
|
375
|
-
facts = memo.probe(resolved);
|
|
376
|
-
memo.facts.set(resolved, facts);
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
verdict = freshnessFromFacts(facts, scannedAtMs);
|
|
380
|
-
// A store that treats deletion as evidence-loss rather than
|
|
381
|
-
// remediation-loss folds `missing` into the demote arm here, so
|
|
382
|
-
// every downstream list and record sees one consistent verdict. It is
|
|
383
|
-
// applied per SOURCE, after the shared lookup: `onMissing` is this
|
|
384
|
-
// store's policy and must never be cached into another store's answer.
|
|
385
|
-
if (verdict === "missing" && onMissing === "demote")
|
|
386
|
-
verdict = "stale";
|
|
387
|
-
if (!seenPaths.has(resolved)) {
|
|
388
|
-
seenPaths.add(resolved);
|
|
389
|
-
if (verdict === "missing")
|
|
390
|
-
deadPaths.push(resolved);
|
|
391
|
-
else if (verdict === "stale")
|
|
392
|
-
stalePaths.push(resolved);
|
|
393
|
-
}
|
|
394
|
-
rawVerdicts.set(cited, verdict);
|
|
395
|
-
}
|
|
396
|
-
if (verdict === "missing")
|
|
397
|
-
dropped.push(finding);
|
|
398
|
-
else if (verdict === "stale")
|
|
399
|
-
stale.push(finding);
|
|
400
|
-
else
|
|
401
|
-
live.push(finding);
|
|
402
|
-
}
|
|
403
|
-
return {
|
|
404
|
-
live,
|
|
405
|
-
stale,
|
|
406
|
-
dropped,
|
|
407
|
-
deadPaths,
|
|
408
|
-
stalePaths,
|
|
409
|
-
statCount: memo.facts.size,
|
|
410
|
-
truncated: (memo.starved.get(args.store) ?? 0) > 0,
|
|
411
|
-
};
|
|
412
|
-
}
|
|
413
|
-
/**
|
|
414
|
-
* Delivery-seam wrapper: partition, then emit one bounded `finding_dead_path_drop`
|
|
415
|
-
* record when anything was dropped, and return only what is safe to deliver.
|
|
416
|
-
*
|
|
417
|
-
* The record is the #1432 Gap 1 principle applied here — an eviction that logs
|
|
418
|
-
* nothing is only confirmable by the absence of complaints. One record per
|
|
419
|
-
* store per delivery, with a capped path sample; never one per finding.
|
|
420
|
-
*/
|
|
421
|
-
export function dropFindingsForMissingPaths(args) {
|
|
422
|
-
// No `scannedAt` — existence-only, so `partition.stale` is always empty.
|
|
423
|
-
const partition = partitionFindingsByCitedPath(args);
|
|
424
|
-
emitDeadPathDropRecord(args.cwd, partition, {
|
|
425
|
-
[args.store]: partition.dropped.length,
|
|
426
|
-
});
|
|
427
|
-
return partition.live;
|
|
428
|
-
}
|
|
429
|
-
/**
|
|
430
|
-
* Delivery-seam wrapper with the #1622 freshness verdict, over one or more
|
|
431
|
-
* stores at once. The store name is the KEY of `sources`, and it is also the
|
|
432
|
-
* finding's source identity inside the gate: every store's `scannedAt` and
|
|
433
|
-
* `onMissing` decide that store's findings and only that store's.
|
|
434
|
-
*
|
|
435
|
-
* #1892: the three turn-end scanner lanes used to call this once each, so one
|
|
436
|
-
* file cited by gitleaks AND trivy-secrets was stat'd twice, spent two separate
|
|
437
|
-
* stat budgets, and wrote two `finding_stale_line_demote` rows for ONE decision.
|
|
438
|
-
* Passing them together makes the filesystem pass shared and the record one per
|
|
439
|
-
* delivery, without letting one store's clean/stale/missing answer speak for
|
|
440
|
-
* another's — the two directions this seam has to keep apart.
|
|
441
|
-
*
|
|
442
|
-
* Callers that have no scan timestamp keep using `dropFindingsForMissingPaths`.
|
|
443
|
-
*/
|
|
444
|
-
export function gateFindingsByPathFreshness(args) {
|
|
445
|
-
const memo = createPathFactsMemo(args);
|
|
446
|
-
// Sorted, not literal order: which source pays for a shared path, and the
|
|
447
|
-
// order stores appear in the records, must not depend on how the CALLER
|
|
448
|
-
// happened to write the object (#3264 review F2).
|
|
449
|
-
const names = Object.keys(args.sources).sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
|
|
450
|
-
const gates = {};
|
|
451
|
-
const dropped = {};
|
|
452
|
-
const demoted = {};
|
|
453
|
-
const merged = {
|
|
454
|
-
live: [],
|
|
455
|
-
stale: [],
|
|
456
|
-
dropped: [],
|
|
457
|
-
deadPaths: [],
|
|
458
|
-
stalePaths: [],
|
|
459
|
-
statCount: 0,
|
|
460
|
-
truncated: false,
|
|
461
|
-
};
|
|
462
|
-
const scannedAtByStore = {};
|
|
463
|
-
for (const name of names) {
|
|
464
|
-
const source = args.sources[name];
|
|
465
|
-
const partition = partitionOneSource({ ...source, store: name, cwd: args.cwd }, memo);
|
|
466
|
-
gates[name] = { live: partition.live, stale: partition.stale };
|
|
467
|
-
if (partition.dropped.length > 0)
|
|
468
|
-
dropped[name] = partition.dropped.length;
|
|
469
|
-
if (partition.stale.length > 0)
|
|
470
|
-
demoted[name] = partition.stale.length;
|
|
471
|
-
if (source.scannedAt !== undefined) {
|
|
472
|
-
scannedAtByStore[name] = String(source.scannedAt);
|
|
473
|
-
}
|
|
474
|
-
merged.live.push(...partition.live);
|
|
475
|
-
merged.stale.push(...partition.stale);
|
|
476
|
-
merged.dropped.push(...partition.dropped);
|
|
477
|
-
for (const deadPath of partition.deadPaths) {
|
|
478
|
-
if (!merged.deadPaths.includes(deadPath))
|
|
479
|
-
merged.deadPaths.push(deadPath);
|
|
480
|
-
}
|
|
481
|
-
for (const stalePath of partition.stalePaths) {
|
|
482
|
-
if (!merged.stalePaths.includes(stalePath)) {
|
|
483
|
-
merged.stalePaths.push(stalePath);
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
merged.statCount = memo.facts.size;
|
|
488
|
-
merged.truncated = memo.starved.size > 0;
|
|
489
|
-
emitDeadPathDropRecord(args.cwd, merged, dropped);
|
|
490
|
-
emitStaleLineDemoteRecord(args.cwd, scannedAtByStore, merged, demoted);
|
|
491
|
-
emitStatBudgetRecord(args.cwd, memo);
|
|
492
|
-
return gates;
|
|
493
|
-
}
|
|
494
|
-
/**
|
|
495
|
-
* `store` is the joined source names, so a single-source delivery still reads
|
|
496
|
-
* `store: "gitleaks"` exactly as it did pre-#1892; `byStore` is what makes the
|
|
497
|
-
* merged record discriminating — which store's findings this decision retired.
|
|
498
|
-
*/
|
|
499
|
-
function emitDeadPathDropRecord(cwd, partition, byStore) {
|
|
500
|
-
if (partition.dropped.length === 0)
|
|
501
|
-
return;
|
|
502
|
-
const stores = Object.keys(byStore);
|
|
503
|
-
logLatency({
|
|
504
|
-
type: "phase",
|
|
505
|
-
phase: "finding_dead_path_drop",
|
|
506
|
-
filePath: cwd,
|
|
507
|
-
durationMs: 0,
|
|
508
|
-
metadata: {
|
|
509
|
-
store: stores.join("+"),
|
|
510
|
-
byStore,
|
|
511
|
-
droppedDeadPaths: partition.dropped.length,
|
|
512
|
-
deadPathCount: partition.deadPaths.length,
|
|
513
|
-
deliveredCount: partition.live.length,
|
|
514
|
-
statCount: partition.statCount,
|
|
515
|
-
samplePaths: partition.deadPaths
|
|
516
|
-
.slice(0, MAX_LOGGED_DEAD_PATHS)
|
|
517
|
-
.map((deadPath) => toProjectRelativePath(deadPath, cwd)),
|
|
518
|
-
...(partition.truncated ? { truncated: true } : {}),
|
|
519
|
-
},
|
|
520
|
-
});
|
|
521
|
-
}
|
|
522
|
-
/**
|
|
523
|
-
* #1622 criterion 5: the demote path gets the same record shape as the drop
|
|
524
|
-
* path. Before this, a stale-line replay window was reconstructible only by
|
|
525
|
-
* proxy — the blocker payload is written nowhere.
|
|
526
|
-
*/
|
|
527
|
-
function emitStaleLineDemoteRecord(cwd, scannedAtByStore, partition, byStore) {
|
|
528
|
-
if (partition.stale.length === 0)
|
|
529
|
-
return;
|
|
530
|
-
// Only the stores that actually contributed to THIS decision are named, so
|
|
531
|
-
// `store` still reads `gitleaks` for a gitleaks-only demotion whether the
|
|
532
|
-
// delivery gated one store or three.
|
|
533
|
-
const stores = Object.keys(byStore);
|
|
534
|
-
const single = stores.length === 1 ? scannedAtByStore[stores[0]] : undefined;
|
|
535
|
-
logLatency({
|
|
536
|
-
type: "phase",
|
|
537
|
-
phase: "finding_stale_line_demote",
|
|
538
|
-
filePath: cwd,
|
|
539
|
-
durationMs: 0,
|
|
540
|
-
metadata: {
|
|
541
|
-
store: stores.join("+"),
|
|
542
|
-
byStore,
|
|
543
|
-
demotedStalePaths: partition.stale.length,
|
|
544
|
-
stalePathCount: partition.stalePaths.length,
|
|
545
|
-
deliveredCount: partition.live.length,
|
|
546
|
-
statCount: partition.statCount,
|
|
547
|
-
samplePaths: partition.stalePaths
|
|
548
|
-
.slice(0, MAX_LOGGED_DEAD_PATHS)
|
|
549
|
-
.map((stalePath) => toProjectRelativePath(stalePath, cwd)),
|
|
550
|
-
// One store: the flat `scannedAt` field, unchanged. Several: the
|
|
551
|
-
// per-store map, because the whole point of the fold is that they
|
|
552
|
-
// differ — one flattened timestamp here would be the same authority
|
|
553
|
-
// collapse the gate refuses to make on the findings themselves.
|
|
554
|
-
...(single === undefined ? {} : { scannedAt: single }),
|
|
555
|
-
...(stores.length > 1
|
|
556
|
-
? {
|
|
557
|
-
scannedAtByStore: Object.fromEntries(stores.map((name) => [name, scannedAtByStore[name] ?? ""])),
|
|
558
|
-
}
|
|
559
|
-
: {}),
|
|
560
|
-
...(partition.truncated ? { truncated: true } : {}),
|
|
561
|
-
},
|
|
562
|
-
});
|
|
563
|
-
}
|
|
564
|
-
/**
|
|
565
|
-
* #3264 review F2: the drop and demote records both return early when nothing
|
|
566
|
-
* was dropped or demoted, so a delivery whose only casualty was the stat
|
|
567
|
-
* allowance — every starved finding failing OPEN, delivered at full severity
|
|
568
|
-
* against a path nobody looked at — wrote no row at all. This is that row: one
|
|
569
|
-
* per delivery, naming the cap and every source that hit it, never one per
|
|
570
|
-
* finding.
|
|
571
|
-
*/
|
|
572
|
-
function emitStatBudgetRecord(cwd, memo) {
|
|
573
|
-
if (memo.starved.size === 0)
|
|
574
|
-
return;
|
|
575
|
-
const stores = [...memo.starved.keys()].sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
|
|
576
|
-
logLatency({
|
|
577
|
-
type: "phase",
|
|
578
|
-
phase: "finding_path_stat_budget_exhausted",
|
|
579
|
-
filePath: cwd,
|
|
580
|
-
durationMs: 0,
|
|
581
|
-
metadata: {
|
|
582
|
-
store: stores.join("+"),
|
|
583
|
-
byStore: Object.fromEntries(stores.map((name) => [name, memo.starved.get(name) ?? 0])),
|
|
584
|
-
maxUniquePaths: memo.limit,
|
|
585
|
-
statCount: memo.facts.size,
|
|
586
|
-
},
|
|
587
|
-
});
|
|
588
|
-
}
|
|
589
|
-
export function provenanceStamp(provenance) {
|
|
590
|
-
if (!isWellFormed(provenance))
|
|
591
|
-
return "session unknown / turn unknown / generation unknown";
|
|
592
|
-
return `session ${provenance.revision.sessionId} / turn ${provenance.revision.turnIndex} / generation ${provenance.revision.generation}`;
|
|
593
|
-
}
|