@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,83 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Environment / config input helpers.
|
|
3
|
-
*
|
|
4
|
-
* Small, dependency-free utilities used by logger modules and runtime tuning
|
|
5
|
-
* knobs to keep duplicated env-handling expressions in a single place.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* True when pi-lens should suppress side-effecting log writes — e.g. inside
|
|
9
|
-
* the vitest test runner, or when callers explicitly set `PI_LENS_TEST_MODE=1`.
|
|
10
|
-
*
|
|
11
|
-
* Resolution:
|
|
12
|
-
* - `PI_LENS_TEST_MODE === "1"` → true (explicit opt-in)
|
|
13
|
-
* - `VITEST` set and `PI_LENS_TEST_MODE !== "0"` → true (vitest default, with explicit opt-out)
|
|
14
|
-
* - otherwise false
|
|
15
|
-
*
|
|
16
|
-
* Replaces the boolean previously duplicated verbatim in ~10 logger modules.
|
|
17
|
-
*/
|
|
18
|
-
export function isTestMode() {
|
|
19
|
-
if (process.env.PI_LENS_TEST_MODE === "1")
|
|
20
|
-
return true;
|
|
21
|
-
if (process.env.VITEST && process.env.PI_LENS_TEST_MODE !== "0")
|
|
22
|
-
return true;
|
|
23
|
-
return false;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Coerce an arbitrary input to a non-negative finite number, or 0 otherwise.
|
|
27
|
-
*
|
|
28
|
-
* Use this to gate config / env values before they flow into `Math.max` /
|
|
29
|
-
* `Math.min` / `setTimeout`. `Number(undefined)` is `NaN`, and a single NaN
|
|
30
|
-
* argument makes `Math.max` return NaN, which `setTimeout` silently treats
|
|
31
|
-
* as 0 — see the runner-timeout-floor regression caught in PR #109.
|
|
32
|
-
*
|
|
33
|
-
* @example
|
|
34
|
-
* ```ts
|
|
35
|
-
* const floor = Math.max(
|
|
36
|
-
* toPositiveFinite(process.env.PI_LENS_KNOB_MS),
|
|
37
|
-
* toPositiveFinite(loadedConfig?.knobMs),
|
|
38
|
-
* 0,
|
|
39
|
-
* );
|
|
40
|
-
* ```
|
|
41
|
-
*/
|
|
42
|
-
export function toPositiveFinite(value) {
|
|
43
|
-
const num = typeof value === "number" ? value : Number(value);
|
|
44
|
-
return Number.isFinite(num) && num > 0 ? num : 0;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Factory for the lazy-memoized "positive-finite-number env override, else a
|
|
48
|
-
* default" getter pattern repeated across `startup-scan.ts` (#699, #758) and
|
|
49
|
-
* originally documented as house style in `runtime-config.ts` / `slow-fs.ts` /
|
|
50
|
-
* `subagent-mode.ts` (#763).
|
|
51
|
-
*
|
|
52
|
-
* `get()` reads `process.env[envName]` through {@link toPositiveFinite} the
|
|
53
|
-
* first time it's called, memoizes the result (or `fallback` when the env var
|
|
54
|
-
* is unset/non-finite/non-positive), and returns the memo on every subsequent
|
|
55
|
-
* call. `_resetForTests()` clears the memo so a test can flip the env var and
|
|
56
|
-
* observe a fresh read (matching the existing `_resetForTests` convention).
|
|
57
|
-
*
|
|
58
|
-
* Deliberately does NOT touch `process.env` until `get()` is first called —
|
|
59
|
-
* that's the entire point of the lazy pattern: importing a module must never
|
|
60
|
-
* have a side effect on process env at load time.
|
|
61
|
-
*
|
|
62
|
-
* @example
|
|
63
|
-
* ```ts
|
|
64
|
-
* const _ttl = lazyEnvNumber("PI_LENS_STARTUP_SCAN_VERDICT_TTL_MS", DEFAULT_TTL_MS);
|
|
65
|
-
* export const getStartupScanVerdictTtlMs = _ttl.get;
|
|
66
|
-
* export const _resetStartupScanVerdictTtlForTests = _ttl._resetForTests;
|
|
67
|
-
* ```
|
|
68
|
-
*/
|
|
69
|
-
export function lazyEnvNumber(envName, fallback) {
|
|
70
|
-
let memo;
|
|
71
|
-
return {
|
|
72
|
-
get() {
|
|
73
|
-
if (memo !== undefined)
|
|
74
|
-
return memo;
|
|
75
|
-
const envValue = toPositiveFinite(process.env[envName]);
|
|
76
|
-
memo = envValue > 0 ? envValue : fallback;
|
|
77
|
-
return memo;
|
|
78
|
-
},
|
|
79
|
-
_resetForTests() {
|
|
80
|
-
memo = undefined;
|
|
81
|
-
},
|
|
82
|
-
};
|
|
83
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The class name of a caught error, and NOTHING else — never the message,
|
|
3
|
-
* which for some callers could quote content they do not want to risk
|
|
4
|
-
* surfacing (a config-core bug thrown while walking the raw, untrusted
|
|
5
|
-
* parsed document; a whole-resolution catch wrapping several stages at
|
|
6
|
-
* once). One leaf so that guarantee does not grow a third, fourth, and
|
|
7
|
-
* fifth hand-rolled `error instanceof Error ? error.name : "unknown error"`
|
|
8
|
-
* (#2451 — `clients/config-warn.ts`'s `normalizeParseErrorReason` (the
|
|
9
|
-
* `classOnly` option), `clients/config-core/normalize.ts`,
|
|
10
|
-
* `clients/config-core/resolve.ts`, and `clients/lens-config.ts` all call
|
|
11
|
-
* this instead of inlining their own copy).
|
|
12
|
-
*
|
|
13
|
-
* Zero imports of its own, deliberately: `config-core/` must never import a
|
|
14
|
-
* sink (`clients/config-warn.ts` -> the degradation ledger) — that exact
|
|
15
|
-
* import closed seven cycles when #2426 removed it, and importing
|
|
16
|
-
* `normalizeParseErrorReason` from inside `config-core/` to get this one
|
|
17
|
-
* value back would reopen them. This leaf is how `config-warn.ts` and
|
|
18
|
-
* `config-core/*.ts` share ONE implementation without either importing the
|
|
19
|
-
* other.
|
|
20
|
-
*/
|
|
21
|
-
export function errorClassName(error) {
|
|
22
|
-
return error instanceof Error ? error.name : "unknown error";
|
|
23
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { performance } from "node:perf_hooks";
|
|
2
|
-
/**
|
|
3
|
-
* The moment pi-lens's module graph started evaluating, captured as this
|
|
4
|
-
* module's first statement (#1374 host-boot vs extension-eval split).
|
|
5
|
-
*
|
|
6
|
-
* This module is otherwise side-effect-free by design (#1434 S3d review): it
|
|
7
|
-
* does nothing but capture a timestamp. `clients/console-guard-install.ts`
|
|
8
|
-
* imports it as its FIRST import so the capture happens before the guard's
|
|
9
|
-
* own install work, and `clients/startup-timing.ts` imports it too, for the
|
|
10
|
-
* constant alone. Before this split, `startup-timing.ts` imported the
|
|
11
|
-
* constant FROM `console-guard-install.ts` — which meant importing
|
|
12
|
-
* startup-timing anywhere (e.g. a test measuring load time) silently
|
|
13
|
-
* installed the console guard as a side effect. Splitting the constant out
|
|
14
|
-
* means importing this module, or `startup-timing.ts`, never installs
|
|
15
|
-
* anything.
|
|
16
|
-
*/
|
|
17
|
-
export const PI_LENS_EVAL_STARTED_MS = performance.now();
|
|
@@ -1,274 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* #2507: hold the event loop for the lifetime of in-flight work that would
|
|
3
|
-
* otherwise be kept alive by NOTHING.
|
|
4
|
-
*
|
|
5
|
-
* Every handle pi-lens owns on the way to an LSP answer is deliberately
|
|
6
|
-
* unref'd. `clients/lsp/launch.ts#unrefLspProcessHandles` unrefs the language
|
|
7
|
-
* server child AND its three stdio pipes so a settled one-shot `pi --print`
|
|
8
|
-
* can exit without waiting for a lingering server (the #1097/#1110 class);
|
|
9
|
-
* `clients/child-unref.ts` does the same for every fire-and-forget probe
|
|
10
|
-
* spawn; `bounded()` and several LSP waits unref their timers for the same
|
|
11
|
-
* reason. That is correct for an IDLE process and wrong for a BUSY one: in a
|
|
12
|
-
* headless child (`pi --mode json -p --no-extensions`, stdin ignored, no TUI,
|
|
13
|
-
* no other extension holding a socket or timer) an in-flight `lsp_diagnostics`
|
|
14
|
-
* call reaches a point where the only thing it is waiting on is an unref'd
|
|
15
|
-
* timer or an unref'd pipe, libuv finds no referenced handle, and Node exits 0
|
|
16
|
-
* IN THE MIDDLE of the tool call — no error, no result, no `turn_end`. The
|
|
17
|
-
* reporter measured it against pyright; the drain site the repro lands on is
|
|
18
|
-
* `LSPService.ensureWarmForSweep`'s warm-up retry backoff (an explicitly
|
|
19
|
-
* `.unref()`'d `setTimeout`), but it is one of many: any await whose only
|
|
20
|
-
* pending handle is unref'd has the same shape.
|
|
21
|
-
*
|
|
22
|
-
* The fix is NOT to stop unref'ing — that would leak a lingering server into
|
|
23
|
-
* every settled one-shot process, which is the reason the unref exists. It is
|
|
24
|
-
* to hold ONE referenced handle for exactly as long as something is in
|
|
25
|
-
* flight: a counted keep-alive, armed while at least one hold is taken and
|
|
26
|
-
* disarmed the moment the last one is released. Idle behaviour is therefore
|
|
27
|
-
* byte-identical to before — no hold, no timer, nothing referenced.
|
|
28
|
-
*
|
|
29
|
-
* Shape 15's screen (AGENTS.md), which this follows deliberately:
|
|
30
|
-
* - a COUNTER of tokens, not a boolean, so overlapping tool calls each
|
|
31
|
-
* release independently and a throwing/aborted caller still releases
|
|
32
|
-
* (callers release from `finally`);
|
|
33
|
-
* - a bounded lifetime PER HOLD, because a leaked hold is the INVERSE defect
|
|
34
|
-
* (a process that can never exit). Each token gets {@link
|
|
35
|
-
* getEventLoopHoldMaxMs} measured from its OWN acquire — derived from the
|
|
36
|
-
* longest legitimate operation's ceiling (`getWorkspaceSweepMaxHoldAgeMs`,
|
|
37
|
-
* the full-scan wall clock plus its safety margin) rather than a second,
|
|
38
|
-
* independently-drifting literal. The keep-alive is armed for the SOONEST
|
|
39
|
-
* outstanding deadline; when it fires, only tokens that are actually stale
|
|
40
|
-
* are released (with a log record naming them), and it re-arms for
|
|
41
|
-
* whatever remains. An epoch-anchored version of this — one timer from the
|
|
42
|
-
* first hold, clearing every token when it fired — was #2649 review F1: a
|
|
43
|
-
* call issued late in a legitimate 300s `lens_diagnostics mode=full` was
|
|
44
|
-
* force-released seconds after starting, i.e. #2507's drain reproduced BY
|
|
45
|
-
* the fix.
|
|
46
|
-
*
|
|
47
|
-
* There is deliberately NO session-boundary clear here, unlike
|
|
48
|
-
* `clients/lsp/workspace-sweep-hold.ts`. A `session_start` can land mid-turn
|
|
49
|
-
* (see `clients/bootstrap.ts`), so clearing holds on a session boundary would
|
|
50
|
-
* un-hold a tool call that is still running and reintroduce this exact defect
|
|
51
|
-
* for it. The hold is scoped to one call's try/finally, not to a session.
|
|
52
|
-
*/
|
|
53
|
-
import { claimPhaseOncePerSession, logLatency, releaseOncePerSessionPhase, } from "./latency-logger.js";
|
|
54
|
-
import { getWorkspaceSweepMaxHoldAgeMs } from "./lsp/workspace-sweep-hold.js";
|
|
55
|
-
import { getProcessSingleton } from "./process-singletons.js";
|
|
56
|
-
/** The one row per session proving the keep-alive was taken (#2649 F2). */
|
|
57
|
-
const EVENT_LOOP_HOLD_ARMED_PHASE = "event_loop_hold_armed";
|
|
58
|
-
const EVENT_LOOP_HOLD_FAMILY = "event-loop-hold";
|
|
59
|
-
const EVENT_LOOP_HOLD_VERSION = 1;
|
|
60
|
-
/**
|
|
61
|
-
* Process-scoped on purpose: pi evaluates the pi-lens module graph more than
|
|
62
|
-
* once in one process (see `clients/process-singletons.ts`), and what is being
|
|
63
|
-
* counted here is a property of the PROCESS's event loop, not of one module
|
|
64
|
-
* evaluation. Two copies would arm two timers for one loop.
|
|
65
|
-
*/
|
|
66
|
-
function state() {
|
|
67
|
-
return getProcessSingleton(EVENT_LOOP_HOLD_FAMILY, EVENT_LOOP_HOLD_VERSION, () => ({ holds: new Map(), nextHoldId: 1, timer: undefined }));
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Upper bound on how long ONE hold — each hold, measured from its OWN
|
|
71
|
-
* acquire — may keep this process alive. Derived from `lens_diagnostics
|
|
72
|
-
* mode=full`'s own wall-clock ceiling plus the shared
|
|
73
|
-
* `SWEEP_IDLE_SAFETY_MARGIN_MS` — the same derivation the workspace-sweep
|
|
74
|
-
* hold's max-hold-age failsafe uses, so the two cannot drift apart into a
|
|
75
|
-
* relationship where the longest legitimate tool call outlives the bound that
|
|
76
|
-
* is supposed to only catch bugs.
|
|
77
|
-
*/
|
|
78
|
-
export function getEventLoopHoldMaxMs() {
|
|
79
|
-
return getWorkspaceSweepMaxHoldAgeMs();
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Arm the keep-alive for the SOONEST deadline any outstanding hold has — the
|
|
83
|
-
* earliest moment a token can become stale — never for a fixed epoch from the
|
|
84
|
-
* first hold (#2649 review F1).
|
|
85
|
-
*
|
|
86
|
-
* Round 1 armed once on 0→1 and cleared every token when it fired, so a call
|
|
87
|
-
* that started while an older one was still running inherited whatever was
|
|
88
|
-
* left of the FIRST call's bound: a `lens_diagnostics mode=full` legitimately
|
|
89
|
-
* running to its 300s ceiling force-released a healthy `lsp_diagnostics`
|
|
90
|
-
* issued at t=305s, which is #2507's own drain produced by the fix. The
|
|
91
|
-
* reviewer reproduced it in a real child with the bound shortened: both calls
|
|
92
|
-
* unsettled, `active=[]`, `EXIT code=0`.
|
|
93
|
-
*
|
|
94
|
-
* Soonest-deadline, not the youngest survivor's: the youngest would let an
|
|
95
|
-
* older survivor overstay its own max age by the whole age gap. Each token is
|
|
96
|
-
* released when IT is stale and never before.
|
|
97
|
-
*/
|
|
98
|
-
function armForNextDeadline(current) {
|
|
99
|
-
if (current.timer !== undefined)
|
|
100
|
-
return;
|
|
101
|
-
if (current.holds.size === 0)
|
|
102
|
-
return;
|
|
103
|
-
const maxMs = getEventLoopHoldMaxMs();
|
|
104
|
-
let soonest = Number.POSITIVE_INFINITY;
|
|
105
|
-
for (const entry of current.holds.values()) {
|
|
106
|
-
soonest = Math.min(soonest, entry.acquiredAt + maxMs);
|
|
107
|
-
}
|
|
108
|
-
// A past-due deadline is left negative on purpose: Node clamps any delay
|
|
109
|
-
// below 1ms to 1ms, so it fires on a later turn of the loop either way, and
|
|
110
|
-
// a hand-written floor here would be a guard naming a recurrence that
|
|
111
|
-
// cannot happen (#2649 verify F4 — probed: 5 re-arms at delay -5000
|
|
112
|
-
// completed in 5ms, and no test reds without the floor).
|
|
113
|
-
const delayMs = soonest - Date.now();
|
|
114
|
-
// NOT `unref()`'d — referencing the loop is this timer's entire job. It is
|
|
115
|
-
// also the failsafe: when it fires, whatever is stale is over either way.
|
|
116
|
-
current.timer = setTimeout(() => reapStaleHolds(), delayMs);
|
|
117
|
-
}
|
|
118
|
-
function disarmIfIdle(current) {
|
|
119
|
-
if (current.holds.size > 0)
|
|
120
|
-
return;
|
|
121
|
-
if (current.timer === undefined)
|
|
122
|
-
return;
|
|
123
|
-
clearTimeout(current.timer);
|
|
124
|
-
current.timer = undefined;
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Release every hold that has outlived {@link getEventLoopHoldMaxMs} ON ITS
|
|
128
|
-
* OWN CLOCK, log what was released, and re-arm for whatever is still
|
|
129
|
-
* outstanding. Same shape as `clients/lsp/workspace-sweep-hold.ts`'s
|
|
130
|
-
* `reapStaleHolds` — deliberately a second, independent implementation rather
|
|
131
|
-
* than a shared ledger (that consolidation is tracked separately).
|
|
132
|
-
*/
|
|
133
|
-
function reapStaleHolds() {
|
|
134
|
-
const current = state();
|
|
135
|
-
current.timer = undefined;
|
|
136
|
-
try {
|
|
137
|
-
const maxMs = getEventLoopHoldMaxMs();
|
|
138
|
-
const now = Date.now();
|
|
139
|
-
const released = [];
|
|
140
|
-
for (const [holdId, entry] of current.holds) {
|
|
141
|
-
if (now - entry.acquiredAt <= maxMs)
|
|
142
|
-
continue;
|
|
143
|
-
current.holds.delete(holdId);
|
|
144
|
-
released.push(entry);
|
|
145
|
-
}
|
|
146
|
-
if (released.length > 0) {
|
|
147
|
-
recordForceReleased(released, current.holds.size, maxMs, now);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
finally {
|
|
151
|
-
// A survivor is held by nothing until this re-arms — the drain — and
|
|
152
|
-
// forever if it never does — the leak. In a `finally` because this runs
|
|
153
|
-
// inside a timer callback, where anything that escapes is an uncaught
|
|
154
|
-
// exception, and because the round-2 code put the log between the reap
|
|
155
|
-
// and the re-arm: a throwing sink stranded the survivor (#2649 verify
|
|
156
|
-
// F3). The map is already consistent by here — entries are deleted
|
|
157
|
-
// before anything is logged.
|
|
158
|
-
armForNextDeadline(current);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* The force-release record, and its own absorption. Telemetry may not break
|
|
163
|
-
* the guard it observes — the house rule spelled at
|
|
164
|
-
* `clients/runtime-tool-call.ts`'s blocked-attribution cleanup: a guard that
|
|
165
|
-
* fails because its telemetry broke is worse than no guard. Nothing here has
|
|
166
|
-
* a fallback sink to escalate to; the keep-alive's correctness does not
|
|
167
|
-
* depend on the row being written.
|
|
168
|
-
*/
|
|
169
|
-
function recordForceReleased(released, stillHeld, maxMs, now) {
|
|
170
|
-
try {
|
|
171
|
-
const oldestAcquiredAt = Math.min(...released.map((entry) => entry.acquiredAt));
|
|
172
|
-
logLatency({
|
|
173
|
-
type: "phase",
|
|
174
|
-
phase: "event_loop_hold_force_released",
|
|
175
|
-
filePath: "",
|
|
176
|
-
durationMs: now - oldestAcquiredAt,
|
|
177
|
-
metadata: {
|
|
178
|
-
maxHoldMs: maxMs,
|
|
179
|
-
releasedHolds: released.length,
|
|
180
|
-
stillHeld,
|
|
181
|
-
labels: [...new Set(released.map((entry) => entry.label))].slice(0, 8),
|
|
182
|
-
},
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
catch {
|
|
186
|
-
// see the doc comment — a broken sink must not reach the reap path
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* ONE row per session saying the keep-alive was actually taken (#2649 review
|
|
191
|
-
* F2). Without it the only record this module ever writes is the failsafe, so
|
|
192
|
-
* a silent log cannot distinguish "working as designed" from "never wired at
|
|
193
|
-
* all" — the #2526 gap shape. Claimed through the logger's own
|
|
194
|
-
* once-per-session mechanism rather than a private latch, so the "one row per
|
|
195
|
-
* session" a reader counts against is the same property `config_resolved`
|
|
196
|
-
* has.
|
|
197
|
-
*/
|
|
198
|
-
function recordFirstArm(entry, maxMs) {
|
|
199
|
-
try {
|
|
200
|
-
if (!claimPhaseOncePerSession(EVENT_LOOP_HOLD_ARMED_PHASE, "process")) {
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
logLatency({
|
|
204
|
-
type: "phase",
|
|
205
|
-
phase: EVENT_LOOP_HOLD_ARMED_PHASE,
|
|
206
|
-
filePath: "",
|
|
207
|
-
durationMs: 0,
|
|
208
|
-
metadata: { label: entry.label, maxHoldMs: maxMs },
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
catch {
|
|
212
|
-
// This runs on the ACQUIRE path, and `normalizeToolDefinition` takes the
|
|
213
|
-
// hold outside its own try — so a throw here rejected the tool call with
|
|
214
|
-
// the sink's error instead of returning the tool's result (#2649 verify
|
|
215
|
-
// F3). Same house rule as `recordForceReleased` above: the hold is
|
|
216
|
-
// already taken and armed by this point, so absorbing the throw loses a
|
|
217
|
-
// log row and nothing else.
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Take one hold for the lifetime of a piece of in-flight work, and return its
|
|
222
|
-
* release. Callers MUST release from a `finally` block: a throw, a rejection
|
|
223
|
-
* or an abort has to release exactly like a normal return, or the hold leaks
|
|
224
|
-
* and the process stops being able to exit.
|
|
225
|
-
*
|
|
226
|
-
* The release is identity-guarded and idempotent — calling it twice, or after
|
|
227
|
-
* the max-age failsafe already force-released it, is a no-op and never
|
|
228
|
-
* disarms another caller's hold.
|
|
229
|
-
*/
|
|
230
|
-
export function acquireEventLoopHold(label) {
|
|
231
|
-
const current = state();
|
|
232
|
-
const holdId = current.nextHoldId++;
|
|
233
|
-
const entry = { acquiredAt: Date.now(), label };
|
|
234
|
-
current.holds.set(holdId, entry);
|
|
235
|
-
const wasArmed = current.timer !== undefined;
|
|
236
|
-
armForNextDeadline(current);
|
|
237
|
-
if (!wasArmed)
|
|
238
|
-
recordFirstArm(entry, getEventLoopHoldMaxMs());
|
|
239
|
-
return () => {
|
|
240
|
-
const now = state();
|
|
241
|
-
if (!now.holds.delete(holdId))
|
|
242
|
-
return;
|
|
243
|
-
disarmIfIdle(now);
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
/** Test-only: how many holds are outstanding right now. */
|
|
247
|
-
export function _eventLoopHoldCountForTests() {
|
|
248
|
-
return state().holds.size;
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Test-only: the keep-alive handle's own state. `hasRef` is the property the
|
|
252
|
-
* whole fix rests on — a handle that is armed but unref'd holds nothing — so
|
|
253
|
-
* it is read from the live `Timeout` (`hasRef()`), not asserted from the
|
|
254
|
-
* source text.
|
|
255
|
-
*/
|
|
256
|
-
export function _eventLoopKeepAliveForTests() {
|
|
257
|
-
const timer = state().timer;
|
|
258
|
-
return {
|
|
259
|
-
armed: timer !== undefined,
|
|
260
|
-
hasRef: timer?.hasRef?.() === true,
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
/** Test-only: drop every hold and disarm, between tests. */
|
|
264
|
-
export function _resetEventLoopHoldForTests() {
|
|
265
|
-
// This module's own phase only — never a blanket clear of a structure other
|
|
266
|
-
// producers claim in (`releaseOncePerSessionPhase`'s doc comment).
|
|
267
|
-
releaseOncePerSessionPhase(EVENT_LOOP_HOLD_ARMED_PHASE);
|
|
268
|
-
const current = state();
|
|
269
|
-
current.holds.clear();
|
|
270
|
-
if (current.timer !== undefined)
|
|
271
|
-
clearTimeout(current.timer);
|
|
272
|
-
current.timer = undefined;
|
|
273
|
-
current.nextHoldId = 1;
|
|
274
|
-
}
|
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Production event-loop occupancy monitor (#192 Phase 2).
|
|
3
|
-
*
|
|
4
|
-
* pi-lens runs on pi's TUI event loop; a long synchronous block freezes
|
|
5
|
-
* keystrokes. Our telemetry historically logged phase *durations*, which can't
|
|
6
|
-
* distinguish a TUI-freezing synchronous burst from harmless async/subprocess
|
|
7
|
-
* time — that blind spot let a ~1.5s enumeration freeze through (#188/#191).
|
|
8
|
-
*
|
|
9
|
-
* This wraps Node's native `perf_hooks.monitorEventLoopDelay()` — a histogram
|
|
10
|
-
* of how late the loop services its own timer, i.e. how long it was blocked —
|
|
11
|
-
* with **no per-event JS overhead**. `max` ≈ the worst synchronous block since
|
|
12
|
-
* the last reset.
|
|
13
|
-
*
|
|
14
|
-
* ## System-stall contamination (#1122 / #1123)
|
|
15
|
-
*
|
|
16
|
-
* `monitorEventLoopDelay` measures timer lag with the monotonic clock
|
|
17
|
-
* (`uv_hrtime`, backed by `QueryPerformanceCounter` on Windows). When the whole
|
|
18
|
-
* process is frozen or descheduled — machine sleep / Modern Standby, or paging
|
|
19
|
-
* thrash under commit-charge exhaustion — its next timer fires late by the
|
|
20
|
-
* *entire* wall-clock gap, and the histogram records that gap as a "block".
|
|
21
|
-
* Two distinct system stalls were confirmed against the Windows System event
|
|
22
|
-
* log: (1) a 290,179 ms block that lined up exactly with a 14:33:05Z→14:37:55Z
|
|
23
|
-
* Modern Standby window (Kernel-Power 506/507), reported byte-identical by two
|
|
24
|
-
* independent pids because the HDR histogram quantizes ~290 s into one bucket;
|
|
25
|
-
* (2) a later silent host exit with zero sleep events but twelve
|
|
26
|
-
* Resource-Exhaustion-Detector (id 2004) events at 97% commit charge — the
|
|
27
|
-
* process was paging, not sleeping. Both are machine artifacts, not pi-lens
|
|
28
|
-
* work; latency.log also held multi-*hour* "blocks" that can only be overnight
|
|
29
|
-
* sleep.
|
|
30
|
-
*
|
|
31
|
-
* Comparing a wall clock to a monotonic clock does NOT catch these: on Windows
|
|
32
|
-
* both advance across Modern Standby (the histogram's monotonic delta already
|
|
33
|
-
* equalled the wall gap). The reliable discriminator is **CPU consumption**: a
|
|
34
|
-
* genuine synchronous block of D ms burns ≈ D ms of main-thread CPU, so the
|
|
35
|
-
* window that contains it must have consumed at least ~D ms of CPU. A frozen or
|
|
36
|
-
* thrashing process consumes ~0 CPU across the gap, so when the worst block
|
|
37
|
-
* exceeds all the CPU the window could account for, it was a stall, not work.
|
|
38
|
-
* We window per turn (so the CPU accounting is bounded and each block is
|
|
39
|
-
* attributable to its turn) and tag system-stall-suspected samples instead of
|
|
40
|
-
* letting them poison the "worst real block" high-water.
|
|
41
|
-
*/
|
|
42
|
-
import { logExtension } from "./extension-log.js";
|
|
43
|
-
import { monitorEventLoopDelay } from "node:perf_hooks";
|
|
44
|
-
const NS_PER_MS = 1e6;
|
|
45
|
-
const US_PER_MS = 1e3;
|
|
46
|
-
let histogram;
|
|
47
|
-
let monitorUnavailable = false;
|
|
48
|
-
// Per-window (per-turn) baselines for CPU-vs-wall accounting. Captured when the
|
|
49
|
-
// monitor starts and re-captured on every reset, so each window's CPU budget is
|
|
50
|
-
// measured against exactly the histogram window it will be compared to.
|
|
51
|
-
let windowStartWallMs = 0;
|
|
52
|
-
let windowStartCpuMs = 0;
|
|
53
|
-
const cpuTotalMs = () => {
|
|
54
|
-
const c = process.cpuUsage();
|
|
55
|
-
return (c.user + c.system) / US_PER_MS;
|
|
56
|
-
};
|
|
57
|
-
/**
|
|
58
|
-
* Start the monitor (idempotent). Call once, as early as possible, so startup
|
|
59
|
-
* blocks are captured. Cheap — the sampling is native; nothing runs per event.
|
|
60
|
-
*
|
|
61
|
-
* Purely observational: if the runtime doesn't implement
|
|
62
|
-
* `perf_hooks.monitorEventLoopDelay` (e.g. Bun < 1.3, which throws
|
|
63
|
-
* `ERR_NOT_IMPLEMENTED` on the call), we degrade to "no stats" rather than let
|
|
64
|
-
* the throw abort extension load. `getEventLoopStats()` already tolerates an
|
|
65
|
-
* absent histogram, so every caller keeps working without telemetry.
|
|
66
|
-
*/
|
|
67
|
-
export function startEventLoopMonitor(resolutionMs = 20) {
|
|
68
|
-
if (histogram || monitorUnavailable)
|
|
69
|
-
return;
|
|
70
|
-
try {
|
|
71
|
-
const h = monitorEventLoopDelay({ resolution: resolutionMs });
|
|
72
|
-
h.enable();
|
|
73
|
-
histogram = h;
|
|
74
|
-
windowStartWallMs = Date.now();
|
|
75
|
-
windowStartCpuMs = cpuTotalMs();
|
|
76
|
-
}
|
|
77
|
-
catch (err) {
|
|
78
|
-
monitorUnavailable = true;
|
|
79
|
-
logExtension({
|
|
80
|
-
subsystem: "event-loop-monitor",
|
|
81
|
-
message: `event-loop occupancy telemetry disabled (runtime lacks monitorEventLoopDelay): ${err?.message ?? String(err)}`,
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Below this, a block is not classified at all (`below-floor`). #1980 mined
|
|
87
|
-
* the 5 s+ tier; 1 s is a deliberately conservative floor that still covers
|
|
88
|
-
* every block that tier cares about while keeping sub-second jitter — where
|
|
89
|
-
* measurement slop rivals the signal — out of the verdict.
|
|
90
|
-
*/
|
|
91
|
-
const STALL_CLASSIFY_FLOOR_MS = 1000;
|
|
92
|
-
/**
|
|
93
|
-
* Slack allowed to the CPU budget before a block counts as unaccounted.
|
|
94
|
-
* `process.cpuUsage()` and the histogram are sampled at slightly different
|
|
95
|
-
* instants and the histogram quantizes, so a block whose CPU coverage is
|
|
96
|
-
* within this much of exact is called `cpu-accounted`, not a stall.
|
|
97
|
-
*/
|
|
98
|
-
const STALL_CLASSIFY_SLOP_MS = 250;
|
|
99
|
-
/**
|
|
100
|
-
* Split a block into compute-vs-stall from the CPU it could possibly have
|
|
101
|
-
* burned (#1980). Pure, so the discrimination is testable without the native
|
|
102
|
-
* histogram or a real machine stall — the same reason
|
|
103
|
-
* {@link isSuspendSuspectedBlock} is pure.
|
|
104
|
-
*
|
|
105
|
-
* ## Why this is sound in exactly one direction
|
|
106
|
-
*
|
|
107
|
-
* `windowCpuMs` is the CPU the WHOLE process consumed across the WHOLE window
|
|
108
|
-
* — every thread, every phase, not just this block. So it is an UPPER BOUND on
|
|
109
|
-
* the CPU this one block could have burned. A synchronous compute block of D ms
|
|
110
|
-
* needs ≈ D ms of main-thread CPU. Therefore:
|
|
111
|
-
*
|
|
112
|
-
* - `windowCpuMs + slop < maxMs` PROVES the block was not compute. Even if the
|
|
113
|
-
* block had been the only thing running, there was not enough CPU in the
|
|
114
|
-
* whole window to cover it. This is the `non-cpu-stall` verdict and it is a
|
|
115
|
-
* real inference, not a heuristic.
|
|
116
|
-
* - The converse proves nothing. A window can burn 30 s of CPU in other phases
|
|
117
|
-
* and still contain a 5 s I/O park. That is why the label is
|
|
118
|
-
* `cpu-accounted` ("the budget covers it") rather than "compute": it reports
|
|
119
|
-
* the absence of proof, not the presence of compute.
|
|
120
|
-
*
|
|
121
|
-
* The existing 20 s suspend verdict is not re-derived here; this delegates to
|
|
122
|
-
* {@link isSuspendSuspectedBlock} so there is one definition of a suspend, and
|
|
123
|
-
* `system-stall` is checked BEFORE `non-cpu-stall` because a suspend is the
|
|
124
|
-
* strictly more specific case of the same evidence.
|
|
125
|
-
*
|
|
126
|
-
* ## Known ambiguity, carried forward not silenced
|
|
127
|
-
*
|
|
128
|
-
* `isSuspendSuspectedBlock`'s own doc records that a >20 s synchronous syscall
|
|
129
|
-
* stall is CPU-indistinguishable from a suspend. Nothing here fixes that. What
|
|
130
|
-
* this adds is the tier BELOW that floor: a 5-20 s non-CPU block, which used
|
|
131
|
-
* to read as ordinary compute and now reads as `non-cpu-stall` with the
|
|
132
|
-
* `inFlightPhase` attribution beside it.
|
|
133
|
-
*/
|
|
134
|
-
export function classifyLoopBlock(maxMs, windowCpuMs, options = {}) {
|
|
135
|
-
const { floorMs = STALL_CLASSIFY_FLOOR_MS, slopMs = STALL_CLASSIFY_SLOP_MS, suspendFloorMs, suspendSlopMs, } = options;
|
|
136
|
-
const cpuCoverageRatio = maxMs > 0 ? Math.round((windowCpuMs / maxMs) * 100) / 100 : undefined;
|
|
137
|
-
if (maxMs < floorMs)
|
|
138
|
-
return { stallClass: "below-floor", cpuCoverageRatio };
|
|
139
|
-
if (isSuspendSuspectedBlock(maxMs, windowCpuMs, suspendFloorMs, suspendSlopMs))
|
|
140
|
-
return { stallClass: "system-stall", cpuCoverageRatio };
|
|
141
|
-
if (windowCpuMs + slopMs < maxMs)
|
|
142
|
-
return { stallClass: "non-cpu-stall", cpuCoverageRatio };
|
|
143
|
-
return { stallClass: "cpu-accounted", cpuCoverageRatio };
|
|
144
|
-
}
|
|
145
|
-
const safeMs = (ns) => Number.isFinite(ns) ? Math.round((ns / NS_PER_MS) * 10) / 10 : 0;
|
|
146
|
-
/**
|
|
147
|
-
* Classify a worst-block sample as genuine CPU work or a suspend/freeze
|
|
148
|
-
* artifact. Pure so the discrimination is testable without the (vitest-flaky)
|
|
149
|
-
* native histogram or a real machine sleep.
|
|
150
|
-
*
|
|
151
|
-
* A block is system-stall-suspected only when it is both (a) larger than any
|
|
152
|
-
* plausible synchronous pi-lens stall (`floorMs`, default 20 s — the real tier
|
|
153
|
-
* observed in latency.log tops out ~15 s) and (b) unaccounted for by the
|
|
154
|
-
* window's CPU budget (`windowCpuMs + slopMs < maxMs`). The floor keeps a real
|
|
155
|
-
* multi-second I/O-bound block (low CPU, but genuine) from being mislabeled,
|
|
156
|
-
* while a frozen or paging process — ~0 CPU across a minutes-to-hours gap —
|
|
157
|
-
* always trips. Sub-floor blocks are never auto-tagged, but the logged
|
|
158
|
-
* `windowCpuMs`/`windowWallMs` still expose the CPU-vs-wall ratio so a reviewer
|
|
159
|
-
* can spot a shorter paging stall by hand.
|
|
160
|
-
*
|
|
161
|
-
* KNOWN AMBIGUITY (honest, not fully resolvable from CPU alone): a genuine
|
|
162
|
-
* pi-lens block that is BLOCKED IN A SYSCALL for >20 s — e.g. a `readdirSync` /
|
|
163
|
-
* `statSync` stalled on a OneDrive/cloud-backed path fetching a dehydrated file,
|
|
164
|
-
* or an antivirus-throttled read — also consumes ~0 CPU while wall time
|
|
165
|
-
* advances, so it is CPU-indistinguishable from a suspend and WILL be tagged
|
|
166
|
-
* `suspectSystemStall` and excluded from the health high-waters. That is the
|
|
167
|
-
* conservative choice (a >20 s synchronous FS stall is itself a P0-worthy bug we
|
|
168
|
-
* do NOT want silently counted as normal), and it is not silenced: such a sample
|
|
169
|
-
* still re-logs every turn with its `lastPhase` attribution, which is the
|
|
170
|
-
* forensic breadcrumb for exactly this class. Sharper corroboration (a magnitude
|
|
171
|
-
* ceiling, a `maxMs`-vs-`windowWallMs` ratio) is tracked as a follow-up note on
|
|
172
|
-
* #1123, not decided here.
|
|
173
|
-
*/
|
|
174
|
-
export function isSuspendSuspectedBlock(maxMs, windowCpuMs, floorMs = 20000, slopMs = 1000) {
|
|
175
|
-
if (maxMs < floorMs)
|
|
176
|
-
return false;
|
|
177
|
-
return windowCpuMs + slopMs < maxMs;
|
|
178
|
-
}
|
|
179
|
-
/** Current occupancy stats, or undefined if the monitor was never started. */
|
|
180
|
-
export function getEventLoopStats() {
|
|
181
|
-
if (!histogram)
|
|
182
|
-
return undefined;
|
|
183
|
-
const maxMs = safeMs(histogram.max);
|
|
184
|
-
const windowWallMs = Math.max(0, Date.now() - windowStartWallMs);
|
|
185
|
-
const windowCpuMs = Math.max(0, cpuTotalMs() - windowStartCpuMs);
|
|
186
|
-
// One classification pass feeds both fields, so `suspectSystemStall` and
|
|
187
|
-
// `stallClass` can never disagree about the same sample (#1980).
|
|
188
|
-
const classification = classifyLoopBlock(maxMs, windowCpuMs);
|
|
189
|
-
return {
|
|
190
|
-
maxMs,
|
|
191
|
-
p99Ms: safeMs(histogram.percentile(99)),
|
|
192
|
-
meanMs: safeMs(histogram.mean),
|
|
193
|
-
windowWallMs: Math.round(windowWallMs),
|
|
194
|
-
windowCpuMs: Math.round(windowCpuMs),
|
|
195
|
-
suspectSystemStall: classification.stallClass === "system-stall",
|
|
196
|
-
stallClass: classification.stallClass,
|
|
197
|
-
cpuCoverageRatio: classification.cpuCoverageRatio,
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* Reset the histogram and re-baseline the CPU/wall window — called at turn
|
|
202
|
-
* boundaries so each window's worst block is attributable to that turn and its
|
|
203
|
-
* CPU budget is measured over the same span (#192 intent, wired in #1122).
|
|
204
|
-
*/
|
|
205
|
-
export function resetEventLoopMonitor() {
|
|
206
|
-
histogram?.reset();
|
|
207
|
-
windowStartWallMs = Date.now();
|
|
208
|
-
windowStartCpuMs = cpuTotalMs();
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Decide whether THIS block beats the session's running high-water. Pure so
|
|
212
|
-
* the threshold logic is testable without the (vitest-flaky) native
|
|
213
|
-
* histogram. Requires `maxMs > lastLoggedMs + deltaMs` above a floor
|
|
214
|
-
* (`minMs`) so noise near the current max doesn't keep re-triggering the
|
|
215
|
-
* high-water bookkeeping.
|
|
216
|
-
*
|
|
217
|
-
* NOTE (#1723): this is no longer the logging gate — see
|
|
218
|
-
* `shouldLogLoopBlock` for that. This function now answers a narrower
|
|
219
|
-
* question ("is this a new session worst?", used for the `worstSoFar`
|
|
220
|
-
* metadata flag and for deciding whether to advance the high-water), because
|
|
221
|
-
* gating the LOG on it hid every sub-maximum block after a session's first
|
|
222
|
-
* large one, which made loop_block-vs-pull-timeout correlation undecidable.
|
|
223
|
-
*/
|
|
224
|
-
export function shouldLogWorstBlock(maxMs, lastLoggedMs, minMs = 60, deltaMs = 25) {
|
|
225
|
-
return maxMs >= minMs && maxMs > lastLoggedMs + deltaMs;
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Decide whether a block is worth persisting to `latency.log` AT ALL (#1723).
|
|
229
|
-
* Every block at or above the floor (`minMs`) qualifies — not only a new
|
|
230
|
-
* session worst — because a session's later blocks can be smaller than an
|
|
231
|
-
* early spike yet still be exactly the ones that starved an LSP pull
|
|
232
|
-
* (#1549/#1713) and are otherwise invisible to the correlation.
|
|
233
|
-
*
|
|
234
|
-
* Volume is bounded by CALL CADENCE, not by this gate: the `turn_end` caller
|
|
235
|
-
* invokes this at most once per turn (the histogram window is reset every
|
|
236
|
-
* turn), so the natural cap is one `loop_block` record per turn — a jittery
|
|
237
|
-
* session cannot flood the log because there is nowhere for a second sample
|
|
238
|
-
* to come from within the same turn.
|
|
239
|
-
*/
|
|
240
|
-
export function shouldLogLoopBlock(maxMs, minMs = 60) {
|
|
241
|
-
return maxMs >= minMs;
|
|
242
|
-
}
|
|
243
|
-
/** Test-only: stop and clear the monitor so cases don't leak into each other. */
|
|
244
|
-
export function _stopEventLoopMonitorForTest() {
|
|
245
|
-
histogram?.disable();
|
|
246
|
-
histogram = undefined;
|
|
247
|
-
monitorUnavailable = false;
|
|
248
|
-
windowStartWallMs = 0;
|
|
249
|
-
windowStartCpuMs = 0;
|
|
250
|
-
}
|