@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,422 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Minimal Cargo.toml reading — table-section slicing plus string-array and
|
|
3
|
-
* scalar-string parsing.
|
|
4
|
-
*
|
|
5
|
-
* Single source of truth (AGENTS.md: "a hand-maintained list that mirrors a
|
|
6
|
-
* registry is a defect"; the same rule applies to a second regex TOML
|
|
7
|
-
* reader). `extractTomlTableSection`/`parseTomlStringArray` originated in
|
|
8
|
-
* `clients/lsp/server.ts`'s rust-analyzer workspace-root hoisting
|
|
9
|
-
* (#1671/#1693) and now live here so `clients/formatters.ts`'s rustfmt
|
|
10
|
-
* `--edition` resolution (#2466) reuses the exact same parser instead of a
|
|
11
|
-
* second hand-rolled one. `clients/lsp/server.ts` re-imports them from here.
|
|
12
|
-
*
|
|
13
|
-
* The ONE Cargo.toml reader in the tree (#2473): `clients/review-graph/
|
|
14
|
-
* workspace-modules.ts`'s `scanCargoModules`/`detectWorkspaceType` used to
|
|
15
|
-
* carry an independent regex TOML reader (`extractTomlArray`/
|
|
16
|
-
* `extractTomlSection`/`extractTomlString`) for module-graph construction — a
|
|
17
|
-
* third copy, folded onto `readCargoPackageName`/`readCargoWorkspaceMembers`/
|
|
18
|
-
* `readCargoDependencyNames` below. That fold also fixed a latent defect:
|
|
19
|
-
* the old `extractTomlString` was NOT table-scoped — it scanned the whole
|
|
20
|
-
* file for the first `key = "value"` line regardless of which table it fell
|
|
21
|
-
* under, so a member manifest with a `name` key under an EARLIER non-package
|
|
22
|
-
* table (a `[[bin]] name = "..."` or `[package.metadata.*]` block preceding
|
|
23
|
-
* `[package]`) silently returned the wrong crate name. `readCargoPackageName`
|
|
24
|
-
* is table-scoped via `extractTomlTableSection` like every other reader here.
|
|
25
|
-
*
|
|
26
|
-
* Review round 2 (PR #2480) hardened the fold itself: `extractTomlTableSection`
|
|
27
|
-
* and `parseTomlStringArray` now run everything through {@link normalizeToml}
|
|
28
|
-
* (CRLF→LF, plus a per-line `#`-to-EOL comment strip that respects quoted
|
|
29
|
-
* strings) before any regex runs, and both the table heading and its
|
|
30
|
-
* terminator are anchored with `[ \t]*` rather than bare `^` so an indented
|
|
31
|
-
* heading or sub-table is read the same way the pre-fold, per-line `.trim()`d
|
|
32
|
-
* reader read it. `readCargoWorkspaceMembers` also gained `[workspace]`
|
|
33
|
-
* table-scoping and a sibling `readCargoWorkspaceExclude`, both now reused by
|
|
34
|
-
* `clients/lsp/server.ts` instead of that file hand-composing the same two
|
|
35
|
-
* primitives itself.
|
|
36
|
-
*
|
|
37
|
-
* #2480's fold missed a THIRD `[workspace]` presence check: `clients/lsp/
|
|
38
|
-
* server.ts`'s `RustWorkspaceRoot` walk-up carried its own
|
|
39
|
-
* `/^\s*\[workspace\]/m.test(...)`, four lines above the call it had already
|
|
40
|
-
* folded onto this file's readers. {@link hasCargoWorkspaceTable} closes that
|
|
41
|
-
* gap (#2498) — the one presence check every caller (that walk-up, and both
|
|
42
|
-
* of {@link resolveCargoPackageEdition}'s own checks below) now shares.
|
|
43
|
-
*/
|
|
44
|
-
import { readFile } from "node:fs/promises";
|
|
45
|
-
import * as os from "node:os";
|
|
46
|
-
import * as path from "node:path";
|
|
47
|
-
import { logExtension } from "./extension-log.js";
|
|
48
|
-
import { findNearestMarkerRoot, isAtOrAboveHomeDir } from "./path-utils.js";
|
|
49
|
-
export async function readTextFileOrUndefined(filePath) {
|
|
50
|
-
try {
|
|
51
|
-
return await readFile(filePath, "utf-8");
|
|
52
|
-
}
|
|
53
|
-
catch {
|
|
54
|
-
return undefined;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Strip a `#`-to-end-of-line TOML comment from one line, leaving a `#`
|
|
59
|
-
* character INSIDE a single- or double-quoted string alone (a version spec or
|
|
60
|
-
* path containing a literal `#` is unusual but legal TOML). A whole-line
|
|
61
|
-
* comment (the line's first non-whitespace character is `#`) reduces to "".
|
|
62
|
-
*/
|
|
63
|
-
function stripTomlLineComment(line) {
|
|
64
|
-
let quote = null;
|
|
65
|
-
for (let i = 0; i < line.length; i++) {
|
|
66
|
-
const ch = line[i];
|
|
67
|
-
if (quote) {
|
|
68
|
-
if (ch === quote)
|
|
69
|
-
quote = null;
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
if (ch === '"' || ch === "'") {
|
|
73
|
-
quote = ch;
|
|
74
|
-
continue;
|
|
75
|
-
}
|
|
76
|
-
if (ch === "#")
|
|
77
|
-
return line.slice(0, i);
|
|
78
|
-
}
|
|
79
|
-
return line;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Normalize CRLF to LF and strip `#`-to-EOL comments line by line. Every
|
|
83
|
-
* regex-based reader below runs on the result.
|
|
84
|
-
*
|
|
85
|
-
* The CRLF→LF pass is DEFENSIVE, not the fix for a real match failure —
|
|
86
|
-
* review round 2, F2 originally claimed a CRLF manifest's `\r` broke the
|
|
87
|
-
* heading/terminator `$` anchor; it does not, because ECMAScript's
|
|
88
|
-
* multiline `$`/`^` treat a bare `\r` as a line terminator on its own (same
|
|
89
|
-
* as `\n`), so the `adv-e-crlf` fixture passes this suite even with this
|
|
90
|
-
* `.replace(/\r\n/g, "\n")` call removed (review round 3, F2 — verified by
|
|
91
|
-
* mutation: dropping the line left all tests green). It stays as
|
|
92
|
-
* belt-and-braces normalization — a single LF-only code path for every
|
|
93
|
-
* downstream regex is simpler to reason about than "also correct on `\r\n`
|
|
94
|
-
* by an ECMAScript technicality" — and because `.split("\n")` below would
|
|
95
|
-
* otherwise leave a trailing `\r` on each line for {@link stripTomlLineComment}
|
|
96
|
-
* to walk past.
|
|
97
|
-
*
|
|
98
|
-
* The comment-strip pass IS load-bearing (review round 2, F1 — the pre-fold
|
|
99
|
-
* `extractTomlArray` stripped comments per line before collecting; the
|
|
100
|
-
* fold's single multi-line regex scan dropped that pass, so a commented-out
|
|
101
|
-
* `# "member",` line stayed live because nothing removed it before the
|
|
102
|
-
* quoted-string scan ran over the whole bracketed span). A commented-out
|
|
103
|
-
* entry must never survive into a captured table/array body.
|
|
104
|
-
*
|
|
105
|
-
* A leading UTF-8 BOM (`\uFEFF`) is stripped first — valid at the start of a
|
|
106
|
-
* Cargo.toml (rust-lang/cargo#2031) — because it sits OUTSIDE every reader's
|
|
107
|
-
* heading/key anchor below (`[ \t]*`, not `\s*`) and would otherwise hide a
|
|
108
|
-
* table or key on the file's very first line. #2498's `RustWorkspaceRoot`
|
|
109
|
-
* walk-up used to carry its own `/^\s*\[workspace\]/m` check, and ES's `\s`
|
|
110
|
-
* class DOES include `\uFEFF` — so that hand-rolled regex accepted a
|
|
111
|
-
* BOM-prefixed manifest by accident; folding it onto this shared reader
|
|
112
|
-
* without this strip would have silently regressed that shape (review round
|
|
113
|
-
* 2, F4).
|
|
114
|
-
*/
|
|
115
|
-
function normalizeToml(content) {
|
|
116
|
-
return content
|
|
117
|
-
.replace(/^\uFEFF/, "")
|
|
118
|
-
.replace(/\r\n/g, "\n")
|
|
119
|
-
.split("\n")
|
|
120
|
-
.map(stripTomlLineComment)
|
|
121
|
-
.join("\n");
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Slice out ONE top-level TOML table's raw body — from its `[name]` heading
|
|
125
|
-
* to the next top-level `[...]`/`[[...]]` heading or EOF. `members`/`exclude`
|
|
126
|
-
* must be read from the `[workspace]` table specifically: `[package]` has its
|
|
127
|
-
* OWN `exclude` key (the standard cargo-publish exclude list, conventionally
|
|
128
|
-
* written above `[workspace]` in a virtual-manifest-less root crate), and a
|
|
129
|
-
* whole-file regex would misread it as workspace membership (#1671 F4).
|
|
130
|
-
*
|
|
131
|
-
* Both the heading and the terminating next-heading are anchored with
|
|
132
|
-
* `[ \t]*` rather than bare `^` — TOML does not require a table heading to
|
|
133
|
-
* start in column 0, and the pre-fold reader (which `.trim()`ed each line
|
|
134
|
-
* before comparing) accepted an indented ` [package]` or ` [dependencies.
|
|
135
|
-
* tokio]` sub-table. The column-0-only anchor this fold shipped with missed
|
|
136
|
-
* both: an indented `[package]` heading never matched at all (the table read
|
|
137
|
-
* as absent), and an indented sub-table heading never terminated the parent
|
|
138
|
-
* slice (its keys leaked into the parent table's body) — review round 2, F2.
|
|
139
|
-
*
|
|
140
|
-
* Returns `undefined` when the table is ABSENT and `""` when the table IS
|
|
141
|
-
* present but has an empty body (its heading is immediately followed by EOF
|
|
142
|
-
* or the next heading, e.g. `[workspace]` as the last line of the file with
|
|
143
|
-
* no trailing newline, or `[workspace] `/`[workspace] # root` at EOF) —
|
|
144
|
-
* review round 3, F1. Both used to collapse to the same `""` sentinel, so a
|
|
145
|
-
* caller checking `!== ""` to mean "table present" silently misread a
|
|
146
|
-
* present-but-empty table as absent. Callers that only care about the table's
|
|
147
|
-
* CONTENT (feeding the result to {@link parseTomlStringArray}/
|
|
148
|
-
* {@link parseTomlScalarString}, which both already treat `undefined` as "no
|
|
149
|
-
* match") are unaffected; callers that check PRESENCE must compare against
|
|
150
|
-
* `undefined`, not `""`.
|
|
151
|
-
*/
|
|
152
|
-
export function extractTomlTableSection(content, tableName) {
|
|
153
|
-
const normalized = normalizeToml(content);
|
|
154
|
-
const heading = new RegExp(`^[ \\t]*\\[${tableName}\\][ \\t]*(?:#.*)?$`, "m");
|
|
155
|
-
const match = heading.exec(normalized);
|
|
156
|
-
if (!match)
|
|
157
|
-
return undefined;
|
|
158
|
-
const rest = normalized.slice(match.index + match[0].length);
|
|
159
|
-
const nextHeading = rest.match(/^[ \t]*\[{1,2}[^\]]+\]{1,2}[ \t]*(?:#.*)?$/m);
|
|
160
|
-
return nextHeading?.index !== undefined
|
|
161
|
-
? rest.slice(0, nextHeading.index)
|
|
162
|
-
: rest;
|
|
163
|
-
}
|
|
164
|
-
export function parseTomlStringArray(content, key) {
|
|
165
|
-
if (content === undefined)
|
|
166
|
-
return [];
|
|
167
|
-
const normalized = normalizeToml(content);
|
|
168
|
-
const match = normalized.match(new RegExp(`^[ \\t]*${key}[ \\t]*=[ \\t]*\\[([\\s\\S]*?)\\]`, "m"));
|
|
169
|
-
if (!match)
|
|
170
|
-
return [];
|
|
171
|
-
return [...match[1].matchAll(/"([^"]*)"|'([^']*)'/g)].map((m) => (m[1] ?? m[2] ?? "").trim());
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Read a scalar `key = "value"` / `key = 'value'` line out of a TOML table
|
|
175
|
-
* section. Anchored to line-start so `swift-edition = "..."` never matches a
|
|
176
|
-
* `key` of `edition`, and a dotted-key inheritance line (`edition.workspace =
|
|
177
|
-
* true`) never matches either — the literal key is immediately followed by
|
|
178
|
-
* `=`, not `.`.
|
|
179
|
-
*/
|
|
180
|
-
function parseTomlScalarString(content, key) {
|
|
181
|
-
if (content === undefined)
|
|
182
|
-
return undefined;
|
|
183
|
-
const match = content.match(new RegExp(`^[ \\t]*${key}[ \\t]*=[ \\t]*(?:"([^"]*)"|'([^']*)')`, "m"));
|
|
184
|
-
if (!match)
|
|
185
|
-
return undefined;
|
|
186
|
-
return match[1] ?? match[2];
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* True when `content` declares a `[workspace]` table — table-scoped and
|
|
190
|
-
* comment/indentation/CRLF-tolerant like every other reader here, because it
|
|
191
|
-
* IS `extractTomlTableSection` underneath. Presence is `!== undefined`, not a
|
|
192
|
-
* truthiness check on the returned string: an empty `[workspace]` table (a
|
|
193
|
-
* heading with no keys) returns `""`, which reads as falsy but is a valid
|
|
194
|
-
* "table present" answer (`extractTomlTableSection`'s own doc comment covers
|
|
195
|
-
* this — review round 3, F1).
|
|
196
|
-
*
|
|
197
|
-
* Exists so a caller that only needs the yes/no answer does not hand-roll a
|
|
198
|
-
* `\[workspace\]` regex to get it — that regex, four lines above
|
|
199
|
-
* `cargoWorkspaceDeclaresMember` in `clients/lsp/server.ts`, was behaviorally
|
|
200
|
-
* identical to this call under every probed shape (comments, indentation,
|
|
201
|
-
* CRLF, trailing content) but sat outside the one Cargo.toml reader #2473
|
|
202
|
-
* consolidated the rest of this file's callers onto (#2498).
|
|
203
|
-
*/
|
|
204
|
-
export function hasCargoWorkspaceTable(content) {
|
|
205
|
-
return hasTomlTable(content, "workspace");
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* True when `content` declares the table `tableName` — the yes/no half of
|
|
209
|
-
* {@link extractTomlTableSection}, for readers that only need presence.
|
|
210
|
-
* `tableName` is a regex SOURCE (it is interpolated into the heading pattern),
|
|
211
|
-
* so a dotted table escapes its dots: `"tool\\.uv\\.workspace"`.
|
|
212
|
-
*
|
|
213
|
-
* Exists so a second file does not re-derive the `!== undefined` comparison
|
|
214
|
-
* that {@link hasCargoWorkspaceTable} exists to hold: `clients/
|
|
215
|
-
* python-environment.ts`'s uv-workspace discovery carried a private
|
|
216
|
-
* `hasUvWorkspaceTable` that was this function's body with a different table
|
|
217
|
-
* name (review round 2, F5). The `!== undefined` (not a truthy test) is the
|
|
218
|
-
* load-bearing part both callers share: an empty table — a heading with no
|
|
219
|
-
* keys — extracts as `""`, which is falsy but IS "table present".
|
|
220
|
-
*/
|
|
221
|
-
export function hasTomlTable(content, tableName) {
|
|
222
|
-
return extractTomlTableSection(content, tableName) !== undefined;
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* Read a crate's `[package] name`, table-scoped to the `[package]` section
|
|
226
|
-
* specifically (#2473) — NOT the first `name = "..."` line in the file. A
|
|
227
|
-
* member manifest commonly has other tables with their own `name` key
|
|
228
|
-
* (`[[bin]] name = "..."`, `[package.metadata.*]` blocks); reading unscoped
|
|
229
|
-
* silently returns whichever happens to sit first in the file.
|
|
230
|
-
*/
|
|
231
|
-
export function readCargoPackageName(content) {
|
|
232
|
-
const packageSection = extractTomlTableSection(content, "package");
|
|
233
|
-
return parseTomlScalarString(packageSection, "name");
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Read `members` off a (typically root/virtual) Cargo.toml for workspace
|
|
237
|
-
* expansion, table-scoped to `[workspace]` (review round 2, F4). A whole-file
|
|
238
|
-
* `members` regex silently also matches `[workspace.metadata.*] members =
|
|
239
|
-
* [...]` or any other table happening to declare a same-named key — the
|
|
240
|
-
* exact "unscoped read of a same-named key under an unrelated table" defect
|
|
241
|
-
* shape `readCargoPackageName` above was already fixed for (#2473), except
|
|
242
|
-
* this reader shipped the fold WITHOUT that scoping and called it out
|
|
243
|
-
* explicitly as intentional in the comment this replaces. It also duplicated
|
|
244
|
-
* `clients/lsp/server.ts`'s independent, already-correctly-scoped
|
|
245
|
-
* `extractTomlTableSection(content, "workspace")` + `parseTomlStringArray`
|
|
246
|
-
* hand-composition for its own `members`/`exclude` read — the SAME
|
|
247
|
-
* single-source-of-truth violation #2473 was filed to close for the OTHER
|
|
248
|
-
* two Cargo.toml readers. `clients/lsp/server.ts` now calls this function
|
|
249
|
-
* (and {@link readCargoWorkspaceExclude} below) instead of re-composing the
|
|
250
|
-
* two primitives itself.
|
|
251
|
-
*/
|
|
252
|
-
export function readCargoWorkspaceMembers(content) {
|
|
253
|
-
return parseTomlStringArray(extractTomlTableSection(content, "workspace"), "members");
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Read `exclude` off a (typically root/virtual) Cargo.toml, table-scoped to
|
|
257
|
-
* `[workspace]` — `[package]` has its OWN `exclude` key (the cargo-publish
|
|
258
|
-
* exclude list; see {@link extractTomlTableSection}'s doc comment), so an
|
|
259
|
-
* unscoped read would misread it as workspace exclusion (#1671 F4). Companion
|
|
260
|
-
* to {@link readCargoWorkspaceMembers}; both replace `clients/lsp/server.ts`'s
|
|
261
|
-
* former hand-composed `extractTomlTableSection` + `parseTomlStringArray`
|
|
262
|
-
* pair (review round 2, F4).
|
|
263
|
-
*/
|
|
264
|
-
export function readCargoWorkspaceExclude(content) {
|
|
265
|
-
return parseTomlStringArray(extractTomlTableSection(content, "workspace"), "exclude");
|
|
266
|
-
}
|
|
267
|
-
/**
|
|
268
|
-
* List the dependency names declared directly under `[dependencies]` (key
|
|
269
|
-
* only — not the version/spec value, which may be a bare string, an inline
|
|
270
|
-
* table, or workspace-inherited).
|
|
271
|
-
*/
|
|
272
|
-
export function readCargoDependencyNames(content) {
|
|
273
|
-
const section = extractTomlTableSection(content, "dependencies");
|
|
274
|
-
if (section === undefined)
|
|
275
|
-
return [];
|
|
276
|
-
const names = [];
|
|
277
|
-
// `section` is already comment-stripped by `extractTomlTableSection`'s
|
|
278
|
-
// `normalizeToml` pass (quote-aware). A second, non-quote-aware
|
|
279
|
-
// `line.split("#", 1)[0]` re-strip here was redundant AND could wrongly
|
|
280
|
-
// truncate a line whose value legitimately contains a `#` inside a quoted
|
|
281
|
-
// string — deleted (review round 3, F4).
|
|
282
|
-
for (const rawLine of section.split(/\r?\n/)) {
|
|
283
|
-
const line = rawLine.trim();
|
|
284
|
-
const match = line.match(/^([A-Za-z0-9_-]+)\s*=/);
|
|
285
|
-
if (match)
|
|
286
|
-
names.push(match[1]);
|
|
287
|
-
}
|
|
288
|
-
return names;
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* True when `key` is declared as workspace-inherited: the dotted-key form
|
|
292
|
-
* (`edition.workspace = true`) or the inline-table form
|
|
293
|
-
* (`edition = { workspace = true }`).
|
|
294
|
-
*/
|
|
295
|
-
function isTomlKeyWorkspaceInherited(content, key) {
|
|
296
|
-
if (content === undefined)
|
|
297
|
-
return false;
|
|
298
|
-
const dotted = new RegExp(`^[ \\t]*${key}\\.workspace[ \\t]*=[ \\t]*true`, "m");
|
|
299
|
-
const inline = new RegExp(`^[ \\t]*${key}[ \\t]*=[ \\t]*\\{[^}\\n]*\\bworkspace[ \\t]*=[ \\t]*true`, "m");
|
|
300
|
-
return dotted.test(content) || inline.test(content);
|
|
301
|
-
}
|
|
302
|
-
/**
|
|
303
|
-
* rustfmt's `--edition` is a closed enum — 2015/2018/2021/2024 as of rustfmt
|
|
304
|
-
* itself, NOT any four-digit string. A manifest typo (`edition = "2019"`) or
|
|
305
|
-
* an edition newer than the installed rustfmt understands would otherwise be
|
|
306
|
-
* passed straight through `--edition`, and rustfmt rejects an edition it
|
|
307
|
-
* doesn't recognize outright — turning EVERY `.rs` format into a hard
|
|
308
|
-
* `outcome: "failed"` where the pre-#2466 bare command formatted fine (#2466
|
|
309
|
-
* review round 2, F2). When Rust stabilizes a new edition, append it to this
|
|
310
|
-
* set — rustfmt's own enum is the forcing function for this list, not a
|
|
311
|
-
* pattern match on digit count.
|
|
312
|
-
*/
|
|
313
|
-
const SUPPORTED_RUSTFMT_EDITIONS = new Set(["2015", "2018", "2021", "2024"]);
|
|
314
|
-
/**
|
|
315
|
-
* Validate a manifest-read edition value against rustfmt's actual enum
|
|
316
|
-
* before letting a caller pass it through `--edition`. A defined-but-invalid
|
|
317
|
-
* value (as opposed to "no edition found at all") is a config anomaly worth
|
|
318
|
-
* a debug trail, not a silent swap to `undefined` — logs the rejected value
|
|
319
|
-
* so a future report of "rustfmt still not carrying edition X" has the exact
|
|
320
|
-
* string that got refused.
|
|
321
|
-
*/
|
|
322
|
-
function validatedEdition(value, filePath) {
|
|
323
|
-
if (value === undefined)
|
|
324
|
-
return undefined;
|
|
325
|
-
if (SUPPORTED_RUSTFMT_EDITIONS.has(value))
|
|
326
|
-
return value;
|
|
327
|
-
logExtension({
|
|
328
|
-
subsystem: "format",
|
|
329
|
-
message: "resolveCargoPackageEdition: manifest edition is not a rustfmt-supported value; falling back to the static rustfmt command",
|
|
330
|
-
level: "debug",
|
|
331
|
-
metadata: { rejectedEdition: value, filePath },
|
|
332
|
-
});
|
|
333
|
-
return undefined;
|
|
334
|
-
}
|
|
335
|
-
/** Read `[workspace.package] edition` out of a manifest that declares it. */
|
|
336
|
-
function readWorkspacePackageEdition(content) {
|
|
337
|
-
const workspaceSection = extractTomlTableSection(content, "workspace.package");
|
|
338
|
-
return parseTomlScalarString(workspaceSection, "edition");
|
|
339
|
-
}
|
|
340
|
-
/**
|
|
341
|
-
* Resolve the four-digit `edition` for the Cargo package that owns
|
|
342
|
-
* `filePath`, so a formatter/build tool that needs it doesn't default to an
|
|
343
|
-
* older edition than the source actually uses (#2466 — rustfmt silently
|
|
344
|
-
* rejecting valid Rust 2024 syntax under an older default edition).
|
|
345
|
-
*
|
|
346
|
-
* - Finds the nearest readable `Cargo.toml` from `filePath` via the shared
|
|
347
|
-
* `findNearestMarkerRoot` walker (home-ceiling guarded, depth-capped —
|
|
348
|
-
* AGENTS.md walk-confinement; never a private walk-up loop).
|
|
349
|
-
* - Reads `[package] edition` directly when present.
|
|
350
|
-
* - When the package declares `edition.workspace = true` (or the inline-table
|
|
351
|
-
* equivalent):
|
|
352
|
-
* - First checks whether the package's OWN manifest also declares
|
|
353
|
-
* `[workspace]` — a root crate can be its own workspace root (`[package]`
|
|
354
|
-
* + `[workspace]` + `[workspace.package]` all in one file, a documented,
|
|
355
|
-
* common Cargo shape) — before climbing past it (#2466 review round 2,
|
|
356
|
-
* F1).
|
|
357
|
-
* - Otherwise climbs ancestors — same home-ceiling guard — for the nearest
|
|
358
|
-
* one that DECLARES `[workspace]` (Cargo's own workspace-root rule, not
|
|
359
|
-
* merely the nearest ancestor Cargo.toml: an intermediate manifest for an
|
|
360
|
-
* unrelated plain package is skipped, not treated as the answer — #2466
|
|
361
|
-
* review round 2, F1), then reads that root's `[workspace.package]
|
|
362
|
-
* edition`.
|
|
363
|
-
* - Every edition value (direct or inherited) is checked against rustfmt's
|
|
364
|
-
* actual enum (`SUPPORTED_RUSTFMT_EDITIONS`), not just "looks like four
|
|
365
|
-
* digits" (#2466 review round 2, F2).
|
|
366
|
-
* - Returns `undefined` on any miss (unreadable manifest, no `[package]`
|
|
367
|
-
* table, unsupported/invalid value, unresolved inheritance): callers fall
|
|
368
|
-
* back to their pre-existing default argv rather than guessing.
|
|
369
|
-
*
|
|
370
|
-
* `homeDir` defaults to `os.homedir()` and exists as a parameter so tests can
|
|
371
|
-
* inject a nearer ceiling and prove the guard actually stops a climb (#2466
|
|
372
|
-
* review round 2, F5) — production callers never pass it.
|
|
373
|
-
*/
|
|
374
|
-
export async function resolveCargoPackageEdition(filePath, homeDir = os.homedir()) {
|
|
375
|
-
const startDir = path.dirname(path.resolve(filePath));
|
|
376
|
-
const packageDir = findNearestMarkerRoot(startDir, ["Cargo.toml"], {
|
|
377
|
-
homeDir,
|
|
378
|
-
});
|
|
379
|
-
if (!packageDir)
|
|
380
|
-
return undefined;
|
|
381
|
-
const packageContent = await readTextFileOrUndefined(path.join(packageDir, "Cargo.toml"));
|
|
382
|
-
if (packageContent === undefined)
|
|
383
|
-
return undefined;
|
|
384
|
-
const packageSection = extractTomlTableSection(packageContent, "package");
|
|
385
|
-
const direct = parseTomlScalarString(packageSection, "edition");
|
|
386
|
-
if (direct !== undefined)
|
|
387
|
-
return validatedEdition(direct, filePath);
|
|
388
|
-
if (!isTomlKeyWorkspaceInherited(packageSection, "edition"))
|
|
389
|
-
return undefined;
|
|
390
|
-
// The package's own manifest may ALSO be the workspace root — check it
|
|
391
|
-
// before climbing so this common shape doesn't fall through to searching
|
|
392
|
-
// ancestors for a `[workspace.package]` that's actually right here. Table
|
|
393
|
-
// PRESENCE is `!== undefined`, not `!== ""` (review round 3, F1): an
|
|
394
|
-
// empty `[workspace]` table (heading with no keys, e.g. the last line of
|
|
395
|
-
// the file with no trailing newline) reads as `""`, the SAME value
|
|
396
|
-
// `extractTomlTableSection` returns for "table absent" — a `!== ""` check
|
|
397
|
-
// would misread this common non-virtual-workspace-root shape as "no
|
|
398
|
-
// [workspace] here" and wrongly climb past it.
|
|
399
|
-
if (hasCargoWorkspaceTable(packageContent)) {
|
|
400
|
-
return validatedEdition(readWorkspacePackageEdition(packageContent), filePath);
|
|
401
|
-
}
|
|
402
|
-
let current = path.dirname(packageDir);
|
|
403
|
-
for (let depth = 0; depth < 64; depth++) {
|
|
404
|
-
if (isAtOrAboveHomeDir(current, homeDir))
|
|
405
|
-
return undefined;
|
|
406
|
-
const ancestorContent = await readTextFileOrUndefined(path.join(current, "Cargo.toml"));
|
|
407
|
-
// Cargo's own rule: the workspace root is the nearest ancestor
|
|
408
|
-
// Cargo.toml that DECLARES `[workspace]`. An intermediate manifest for
|
|
409
|
-
// an unrelated package (no `[workspace]` table) is not it — keep
|
|
410
|
-
// climbing past it instead of stopping here. `!== undefined`, not
|
|
411
|
-
// `!== ""` — see the same-shaped check above (review round 3, F1).
|
|
412
|
-
if (ancestorContent !== undefined &&
|
|
413
|
-
hasCargoWorkspaceTable(ancestorContent)) {
|
|
414
|
-
return validatedEdition(readWorkspacePackageEdition(ancestorContent), filePath);
|
|
415
|
-
}
|
|
416
|
-
const parent = path.dirname(current);
|
|
417
|
-
if (parent === current)
|
|
418
|
-
return undefined;
|
|
419
|
-
current = parent;
|
|
420
|
-
}
|
|
421
|
-
return undefined;
|
|
422
|
-
}
|
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cascade neighbour-budget sizing (#1462).
|
|
3
|
-
*
|
|
4
|
-
* The flat neighbour cap (40) and the turn-end settle wait (5000 ms) were set in
|
|
5
|
-
* two different files with nothing relating them. Dogfood 2026-08-15 measured
|
|
6
|
-
* what that costs: n=50 cascades, median 30 ms, max 3.88 s at nbr=40 — and with
|
|
7
|
-
* a `reverse_deps_cache` refresh ahead of the graph build (2046 ms for
|
|
8
|
-
* `logger.ts`) the run overran the turn_end cap, so `cascade_settle_wait`
|
|
9
|
-
* returned `settled: 0` and the finding arrived a turn late.
|
|
10
|
-
*
|
|
11
|
-
* ## What a slow run actually costs
|
|
12
|
-
*
|
|
13
|
-
* It is NOT lost. `RuntimeCoordinator.settleCascadeRuns` re-parks a promise
|
|
14
|
-
* still in flight at the cap, `agent_settled` gives it a second and more
|
|
15
|
-
* generous drain (`cascade_carry_over_settle`, `quietWindowWaitMs`, 15 000 ms),
|
|
16
|
-
* and `beginTurn` deliberately keeps `_pendingCascadeRuns` so anything still
|
|
17
|
-
* running surfaces at a later turn_end — that is #1443, and pre-#450 these
|
|
18
|
-
* findings were always awaited. So the real trade is:
|
|
19
|
-
*
|
|
20
|
-
* full neighbour set, one turn late vs. a narrowed set, on time,
|
|
21
|
-
* with the remainder lost for good
|
|
22
|
-
*
|
|
23
|
-
* Narrowing is therefore only worth paying for when it genuinely converts a
|
|
24
|
-
* late run into an on-time one. That gives three zones, and the derivation
|
|
25
|
-
* below is exactly those three:
|
|
26
|
-
*
|
|
27
|
-
* fits the full walk still fits the on-time window — nothing to do
|
|
28
|
-
* narrowed the RESCUE BAND: the full walk no longer fits but a shorter
|
|
29
|
-
* one does, so trading the tail for on-time delivery buys
|
|
30
|
-
* something real
|
|
31
|
-
* past-rescue not even a floor-sized walk fits any more, so narrowing would
|
|
32
|
-
* drop neighbours permanently AND still miss the window. Keep
|
|
33
|
-
* the full budget and let the carry-over deliver it complete.
|
|
34
|
-
* This is the cold-session case: a fresh graph build measures up
|
|
35
|
-
* to ~19 s (see `runtime-coordinator.ts`'s carry-over note), and
|
|
36
|
-
* a floor-sized stub there is strictly worse than pre-#1462.
|
|
37
|
-
*
|
|
38
|
-
* One more guard, for the same reason. If the on-time window could not fit a
|
|
39
|
-
* full walk even at zero prelude, there is no LATE run to rescue — every
|
|
40
|
-
* cascade would be permanently downsized because a *wait* was configured small.
|
|
41
|
-
* That is a budget change wearing a timeout's clothes, so the derivation stands
|
|
42
|
-
* down entirely (`no-rescue-window`) and the flat cap applies. This is what
|
|
43
|
-
* keeps `PI_LENS_CASCADE_SETTLE_WAIT_MS` from doubling as a neighbour-count
|
|
44
|
-
* knob: at the 5000/100/40 defaults the band is a prelude of 1.0–4.5 s, and
|
|
45
|
-
* shrinking the wait to 1000 ms disables narrowing rather than capping every
|
|
46
|
-
* cascade at ~10 neighbours.
|
|
47
|
-
*/
|
|
48
|
-
import { recordDegradationOnce } from "./degradation-ledger.js";
|
|
49
|
-
import { toPositiveFinite } from "./env-utils.js";
|
|
50
|
-
// The knobs only, never the scheduler — this module is arithmetic and has no
|
|
51
|
-
// business depending on a task registry to read two numbers (#1462 review N4).
|
|
52
|
-
// Note it buys nothing at load time: `runtime-config.js` below already reaches
|
|
53
|
-
// `pidusage` via `lens-config.js`.
|
|
54
|
-
import { isQuietWindowEnabled, quietWindowWaitMs, } from "./quiet-window-config.js";
|
|
55
|
-
import { RUNTIME_CONFIG } from "./runtime-config.js";
|
|
56
|
-
/**
|
|
57
|
-
* Bounded wait for the turn's deferred cascade computes (#450) to settle before
|
|
58
|
-
* they are merged at turn_end. A late compute is carried over, never dropped.
|
|
59
|
-
*
|
|
60
|
-
* `0` is a meaningful setting (never block turn_end), so this deliberately does
|
|
61
|
-
* NOT use `lazyEnvNumber` — that helper treats 0 as "unset" and would silently
|
|
62
|
-
* restore the 5000 ms default.
|
|
63
|
-
*/
|
|
64
|
-
export function cascadeSettleWaitMs() {
|
|
65
|
-
const raw = Number(process.env.PI_LENS_CASCADE_SETTLE_WAIT_MS);
|
|
66
|
-
return Number.isFinite(raw) && raw >= 0 ? raw : 5000;
|
|
67
|
-
}
|
|
68
|
-
/** The budget floor, and the minimum any env override of the cap can produce. */
|
|
69
|
-
const MIN_NEIGHBOUR_BUDGET = RUNTIME_CONFIG.pipeline.cascadeMaxFiles;
|
|
70
|
-
/**
|
|
71
|
-
* The flat per-run cap: the most neighbours a cascade walks. Still the ceiling
|
|
72
|
-
* — the derivation below only ever narrows it, and only inside the rescue band.
|
|
73
|
-
*/
|
|
74
|
-
const DEFAULT_NEIGHBOUR_BUDGET = 40;
|
|
75
|
-
export const CASCADE_NEIGHBOUR_BUDGET = Math.max(MIN_NEIGHBOUR_BUDGET, Number.parseInt(process.env.PI_LENS_CASCADE_NEIGHBOUR_BUDGET ?? "40", 10) ||
|
|
76
|
-
DEFAULT_NEIGHBOUR_BUDGET);
|
|
77
|
-
/**
|
|
78
|
-
* True when `PI_LENS_CASCADE_NEIGHBOUR_BUDGET` moved the ceiling away from the
|
|
79
|
-
* default (#1462 review F-E). Raising it far enough can push
|
|
80
|
-
* `ceiling * perNeighbourMs` past the settle window, so EVERY cascade reads
|
|
81
|
-
* `no-rescue-window` — the whole derivation disarmed by a cap change nobody
|
|
82
|
-
* meant as a timeout change. Read once at load, same lifetime as the constant
|
|
83
|
-
* it describes.
|
|
84
|
-
*/
|
|
85
|
-
const NEIGHBOUR_BUDGET_OVERRIDDEN = process.env.PI_LENS_CASCADE_NEIGHBOUR_BUDGET !== undefined &&
|
|
86
|
-
CASCADE_NEIGHBOUR_BUDGET !== DEFAULT_NEIGHBOUR_BUDGET;
|
|
87
|
-
/**
|
|
88
|
-
* Marginal wall-clock cost of one more neighbour in the walk, in ms. Calibrated
|
|
89
|
-
* on the 2026-08-15 dogfood tail: 3.88 s at nbr=40 and 3.71 s at nbr=38, both
|
|
90
|
-
* ~97 ms per neighbour. Touches fan out in parallel, so this is the observed
|
|
91
|
-
* marginal cost under LSP contention, not one touch's own latency.
|
|
92
|
-
*
|
|
93
|
-
* It is an ESTIMATE, and the derivation is sensitive to it: if the true cost is
|
|
94
|
-
* materially above this, a walk sized against it still overruns (the rescue
|
|
95
|
-
* fails and the tail was dropped for nothing). `scripts/bench-cascade-budget.mjs
|
|
96
|
-
* --true-cost-ms=<n>` measures that sensitivity directly. Rounded UP from the
|
|
97
|
-
* measurement so the estimate errs toward narrowing less.
|
|
98
|
-
*/
|
|
99
|
-
const DEFAULT_NEIGHBOUR_COST_MS = 100;
|
|
100
|
-
/** Read per call — sized once per cascade run, never on a hot path. */
|
|
101
|
-
function neighbourCostMs() {
|
|
102
|
-
return (toPositiveFinite(process.env.PI_LENS_CASCADE_NEIGHBOUR_COST_MS) ||
|
|
103
|
-
DEFAULT_NEIGHBOUR_COST_MS);
|
|
104
|
-
}
|
|
105
|
-
function neighbourFloor() {
|
|
106
|
-
return (toPositiveFinite(process.env.PI_LENS_CASCADE_NEIGHBOUR_FLOOR) ||
|
|
107
|
-
MIN_NEIGHBOUR_BUDGET);
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Size one run's neighbour walk against the on-time window supplied by its
|
|
111
|
-
* caller.
|
|
112
|
-
*
|
|
113
|
-
* `elapsedMs` is arithmetic input, not an observation made by this function.
|
|
114
|
-
* The production caller measures it against the active turn_end settle window
|
|
115
|
-
* and passes that elapsed time here. When that boundary is unavailable, the
|
|
116
|
-
* caller passes zero to preserve the flat cap. Legacy callers may still pass
|
|
117
|
-
* deferred run age for compatibility.
|
|
118
|
-
*
|
|
119
|
-
* Every override exists so the derivation can be tested and benchmarked as a
|
|
120
|
-
* pure function; the function itself does not observe a deferred run's age.
|
|
121
|
-
*/
|
|
122
|
-
export function deriveCascadeNeighbourBudget(options) {
|
|
123
|
-
const ceiling = options.ceiling ?? CASCADE_NEIGHBOUR_BUDGET;
|
|
124
|
-
// The floor can never exceed the ceiling — a floor above the cap would make
|
|
125
|
-
// the derived budget LARGER than the flat one it exists to bound.
|
|
126
|
-
const floor = Math.min(ceiling, options.floor ?? neighbourFloor());
|
|
127
|
-
const onTimeMs = options.settleWaitMs ?? cascadeSettleWaitMs();
|
|
128
|
-
const perNeighbourMs = options.perNeighbourMs ?? neighbourCostMs();
|
|
129
|
-
const elapsedMs = toPositiveFinite(options.elapsedMs);
|
|
130
|
-
const remainingMs = onTimeMs - elapsedMs;
|
|
131
|
-
const deliveryWindowMs = onTimeMs +
|
|
132
|
-
(options.quietDrainMs ??
|
|
133
|
-
(isQuietWindowEnabled() ? quietWindowWaitMs() : 0));
|
|
134
|
-
const full = { budget: ceiling, ceiling, remainingMs, deliveryWindowMs };
|
|
135
|
-
// No on-time window at all, or one too small to ever fit a full walk. There
|
|
136
|
-
// is no late run to rescue here, only every run to shrink — stand down.
|
|
137
|
-
//
|
|
138
|
-
// Boundary, acknowledged rather than special-cased: at exactly
|
|
139
|
-
// `onTimeMs === ceiling * perNeighbourMs` this does not fire and the `fits`
|
|
140
|
-
// zone has zero width, so ANY prelude narrows. Not slightly, either — at
|
|
141
|
-
// 4000/100/40 a 2 s prelude gives 20 and a 3.5 s prelude gives the floor.
|
|
142
|
-
// Left alone because the narrowing is honest at that setting: with the
|
|
143
|
-
// window sized to exactly one full walk, a run that has spent any of it
|
|
144
|
-
// really would miss, so every one of those cuts is a genuine rescue rather
|
|
145
|
-
// than the `no-rescue-window` case this guard exists to catch. What it does
|
|
146
|
-
// cost is headroom — see the divisor bands in the bench's `--sweep` text.
|
|
147
|
-
if (onTimeMs <= 0 || onTimeMs < ceiling * perNeighbourMs) {
|
|
148
|
-
// #1462 review F-E: name the override, once per session, when it is the
|
|
149
|
-
// REASON the derivation stood down — not when a caller under test asked
|
|
150
|
-
// for a specific ceiling, and not on every one of the cascades this
|
|
151
|
-
// disarms for the rest of the session.
|
|
152
|
-
if (options.ceiling === undefined && NEIGHBOUR_BUDGET_OVERRIDDEN) {
|
|
153
|
-
recordDegradationOnce({
|
|
154
|
-
kind: "cascade-budget-override-disarmed",
|
|
155
|
-
subject: "cascade-neighbour-budget",
|
|
156
|
-
reason: `PI_LENS_CASCADE_NEIGHBOUR_BUDGET=${CASCADE_NEIGHBOUR_BUDGET} needs ` +
|
|
157
|
-
`${ceiling * perNeighbourMs}ms to walk the full cap, which exceeds ` +
|
|
158
|
-
`the ${onTimeMs}ms settle window — the rescue band is disarmed and ` +
|
|
159
|
-
`every cascade keeps the flat (overridden) cap`,
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
return { ...full, zone: "no-rescue-window" };
|
|
163
|
-
}
|
|
164
|
-
// The full walk still fits. Nothing to buy.
|
|
165
|
-
if (remainingMs >= ceiling * perNeighbourMs) {
|
|
166
|
-
return { ...full, zone: "fits" };
|
|
167
|
-
}
|
|
168
|
-
// Past rescue: not even a floor-sized walk fits, so narrowing would drop the
|
|
169
|
-
// tail permanently and still miss the window. The carry-over delivers the
|
|
170
|
-
// whole set one turn later instead.
|
|
171
|
-
//
|
|
172
|
-
// #1462 review F-B, kept rather than shrunk: one dogfood log measured this
|
|
173
|
-
// zone at 0/1090 cascades, and asked whether a 3-zone module earns its keep
|
|
174
|
-
// at that frequency. It was measured against the WRITE-relative clock this
|
|
175
|
-
// same round fixed, which charges elapsed time no cascade actually spent
|
|
176
|
-
// waiting — so it under-counts how often a genuinely slow compute (a cold
|
|
177
|
-
// graph build, ~19 s) overlaps an already-running settle window, which is
|
|
178
|
-
// exactly what this zone exists to catch (F3, a real regression the first
|
|
179
|
-
// review round found: a floor-sized stub on that cold-start case is
|
|
180
|
-
// strictly worse than pre-#1462). Reachability under the corrected clock
|
|
181
|
-
// has not been re-measured; shrinking on a stale sample would trade a
|
|
182
|
-
// cheap, already-tested guard against a proven regression for a paper
|
|
183
|
-
// simplification. Revisit if a post-fix dogfood window confirms it still
|
|
184
|
-
// never fires.
|
|
185
|
-
if (remainingMs < floor * perNeighbourMs) {
|
|
186
|
-
return { ...full, zone: "past-rescue" };
|
|
187
|
-
}
|
|
188
|
-
// The rescue band: a shorter walk lands on time.
|
|
189
|
-
return {
|
|
190
|
-
budget: Math.min(ceiling, Math.max(floor, Math.floor(remainingMs / perNeighbourMs))),
|
|
191
|
-
ceiling,
|
|
192
|
-
remainingMs,
|
|
193
|
-
deliveryWindowMs,
|
|
194
|
-
zone: "narrowed",
|
|
195
|
-
};
|
|
196
|
-
}
|