@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,424 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `pi-hashline-edit-pro` anchor resolution (#2423 review round 1, finding F1).
|
|
3
|
-
*
|
|
4
|
-
* ## Why this module exists
|
|
5
|
-
*
|
|
6
|
-
* `pi-hashline-edit-pro` addresses lines by a bare THREE-CHARACTER base62
|
|
7
|
-
* anchor — `"aB3"`, never `"42"`. Its schema says so in as many words
|
|
8
|
-
* (`src/payload-contract.ts`: *"Bare 3-char anchor only (e.g. \"aB3\")"*), and
|
|
9
|
-
* its parser accepts exactly `trimmed.length === ANCHOR_LEN && ALPH_RE.test()`
|
|
10
|
-
* (`src/hashline/parse.ts`). The first cut of the shape adapter in
|
|
11
|
-
* `clients/mutating-tool.ts` read those fields as DECIMAL line numbers, so
|
|
12
|
-
* against the real extension every anchor was "malformed" and the adapter
|
|
13
|
-
* blocked a working edit tool.
|
|
14
|
-
*
|
|
15
|
-
* This module reproduces the extension's own line-hash function so pi-lens can
|
|
16
|
-
* map an anchor back to a line, and does it from the extension's source rather
|
|
17
|
-
* than from a guess. Everything below is a port of
|
|
18
|
-
* `pi-hashline-edit-pro@8f027ca1c2a0796ccf1c15bd5a0d12db5d9fb9f0`
|
|
19
|
-
* (github.com/YuGiMob/pi-hashline-edit-pro, branch `master`):
|
|
20
|
-
*
|
|
21
|
-
* - `src/hashline/alphabet.ts` — `HASH_LEN = 3`, the 62-character alphabet
|
|
22
|
-
* `A-Za-z0-9`.
|
|
23
|
-
* - `src/hashline/hash.ts` — `hashSource` (strip `\r`, `trimEnd`, truncate to
|
|
24
|
-
* `MAX_HASH_SOURCE_BYTES = 500` UTF-8 bytes on a code-point boundary),
|
|
25
|
-
* `baseIdx = (xxh32(source) >>> 14) % 62**3`, and open-addressed collision
|
|
26
|
-
* probing with stride `62**2 + 62 + 1` over a used-index bitset.
|
|
27
|
-
* - `src/hashline/hasher.ts` — `xxh32` is `xxhash-wasm`'s `h32`, i.e. standard
|
|
28
|
-
* XXH32 with seed 0 over the UTF-8 bytes. Reimplemented here in ~40 lines of
|
|
29
|
-
* integer arithmetic rather than taking a runtime dependency (pi installs
|
|
30
|
-
* pi-lens with `npm install --omit=dev`, so a hashing dep would ship to every
|
|
31
|
-
* user for one adapter).
|
|
32
|
-
* - `src/hashline/resolve.ts` — `resAnchorFromMap`: an anchor resolves ONLY
|
|
33
|
-
* when it matches exactly one line. Zero matches is `not_found`, two or more
|
|
34
|
-
* is `ambiguous`, and the extension refuses both rather than guessing.
|
|
35
|
-
*
|
|
36
|
-
* `tests/clients/hashline-anchor.test.ts` pins the port against a vector table
|
|
37
|
-
* generated by RUNNING the upstream code with the real `xxhash-wasm`, so a
|
|
38
|
-
* drift in either direction is a red test rather than a silent misattribution.
|
|
39
|
-
*
|
|
40
|
-
* ## Why resolution is gated on UNIQUE CONTENT (review round 3, finding F1) —
|
|
41
|
-
* and why the gate is NOT a correctness proof (review round 4, finding F1)
|
|
42
|
-
*
|
|
43
|
-
* The live extension does not recompute hashes on every read. It persists a
|
|
44
|
-
* per-file snapshot (`src/hash-store.ts`) and, after every edit, carries a
|
|
45
|
-
* surviving line's old anchor forward (`mapStableHashes` in
|
|
46
|
-
* `src/hashline/hash.ts`) before persisting the result — so the anchors the
|
|
47
|
-
* agent sends back are STORE-CARRIED, not freshly computed. pi-lens has no
|
|
48
|
-
* access to that store and can only recompute with `_lineHashesPure`.
|
|
49
|
-
*
|
|
50
|
-
* Where a line's canonical content is unique in the file, the store's anchor
|
|
51
|
-
* for it and pi-lens's own recomputed anchor for it USUALLY agree — that is
|
|
52
|
-
* the case the gate below exists to hold. Where content is NOT unique — `}`,
|
|
53
|
-
* a blank line, `continue;`, a bare comment-close line — the anchor comes
|
|
54
|
-
* from probing, whose result depends on every line before it, so an edit
|
|
55
|
-
* anywhere upstream repermutes those anchors among the identical lines. A
|
|
56
|
-
* store-carried anchor then still matches EXACTLY ONE line under
|
|
57
|
-
* recomputation: a confident, unique, WRONG answer.
|
|
58
|
-
*
|
|
59
|
-
* Gating on "the matched line's content is unique" narrows that failure a
|
|
60
|
-
* long way, but it is not a proof, and review round 4 measured the two
|
|
61
|
-
* mechanisms that survive it:
|
|
62
|
-
*
|
|
63
|
-
* (a) The gate is ONE-SIDED: it checks the MATCHED line's content, never the
|
|
64
|
-
* anchor's own provenance. A probe-derived anchor that truly belongs to
|
|
65
|
-
* some duplicate-content line elsewhere can, by construction of the
|
|
66
|
-
* probe stride, land on the same anchor VALUE as a completely unrelated
|
|
67
|
-
* unique-content line's own base index. Measured case: a file with 25
|
|
68
|
-
* occurrences of a bare block-comment-close line — the store-carried
|
|
69
|
-
* anchor for one of them resolved to an unrelated unique-content line
|
|
70
|
-
* 1532 lines away, and the gate answered it, because that OTHER line's
|
|
71
|
-
* content is (correctly) unique. A unique answer is not evidence the
|
|
72
|
-
* anchor was ever meant for it.
|
|
73
|
-
* (b) Content uniqueness does not imply base-index uniqueness. `baseIdx =
|
|
74
|
-
* (xxh32(source) >>> 14) % 238328` has only 238,328 slots; over enough
|
|
75
|
-
* DISTINCT line contents in a real file, two different contents collide
|
|
76
|
-
* on the same base index and one of them is probed to a different slot
|
|
77
|
-
* — the identical open-addressing mechanism as a literal duplicate, just
|
|
78
|
-
* between lines whose content is each unique. Measured across 220 files:
|
|
79
|
-
* 194 of 74,386 unique-content lines carry a probe-derived anchor, not
|
|
80
|
-
* their own content's base index.
|
|
81
|
-
*
|
|
82
|
-
* So `resolveHashlineAnchor` answers when the matched line's canonical
|
|
83
|
-
* content occurs exactly once in the file — a gate that removes nearly all
|
|
84
|
-
* of the literal-duplicate case and neither (a) nor (b). Measured over 220
|
|
85
|
-
* files and five edit shapes (~550,000 anchors asked): roughly 2 anchors
|
|
86
|
-
* resolved to the wrong line, against ~67% of anchors answered at all. That
|
|
87
|
-
* residual is ACCEPTED (review round 4 orchestrator decision), not fixed
|
|
88
|
-
* here: closing it needs either the extension's own store, which pi-lens
|
|
89
|
-
* does not have, or refusing every anchor within probing distance of a
|
|
90
|
-
* collision, which costs far more coverage than the ~2-in-550,000 residual
|
|
91
|
-
* is worth. Everything the gate refuses is `content_not_unique`: unresolved,
|
|
92
|
-
* which is a report and never a block. pi-lens's uncertainty about a
|
|
93
|
-
* third-party tool's addressing is not evidence that the agent's edit is
|
|
94
|
-
* wrong. An unresolved anchor degrades to "mutation recognized, lines
|
|
95
|
-
* unknown" — the same state a host `edit` with an unknown schema reaches on
|
|
96
|
-
* master — so the file still gets its turn-state entry (the whole file as
|
|
97
|
-
* its modified range), its deferred format and its change-log receipt.
|
|
98
|
-
*
|
|
99
|
-
* This costs coverage: roughly a third of the lines in a typical TypeScript
|
|
100
|
-
* file are blank or a bare brace. Trading those for an almost-always-correct
|
|
101
|
-
* answer on the rest is the deliberate choice — a wrong line range is worse
|
|
102
|
-
* than no line range on average, because the guard acts on it, but "gated on
|
|
103
|
-
* unique content" is a reduction of the wrong-line rate, not its elimination.
|
|
104
|
-
*/
|
|
105
|
-
import * as nodeFs from "node:fs";
|
|
106
|
-
import { BoundedFifoMap } from "./bounded-cache.js";
|
|
107
|
-
/** `HASH_LEN` in `src/hashline/alphabet.ts`. */
|
|
108
|
-
const HASHLINE_ANCHOR_LENGTH = 3;
|
|
109
|
-
/** `ALPH` in `src/hashline/alphabet.ts`. Order is load-bearing: it is the digit set. */
|
|
110
|
-
const ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
111
|
-
/** `HASH_SPACE` — 62**3 = 238328 addressable anchors. */
|
|
112
|
-
const HASH_SPACE = ALPHABET.length ** HASHLINE_ANCHOR_LENGTH;
|
|
113
|
-
/** `HASH_PROBE_STRIDE` — 62**2 + 62 + 1, the open-addressing step. */
|
|
114
|
-
const HASH_PROBE_STRIDE = ALPHABET.length ** 2 + ALPHABET.length + 1;
|
|
115
|
-
/** `MAX_HASH_SOURCE_BYTES` in `src/constants.ts`. */
|
|
116
|
-
const MAX_HASH_SOURCE_BYTES = 500;
|
|
117
|
-
const BITSET_WORDS = Math.ceil(HASH_SPACE / 32);
|
|
118
|
-
const ANCHOR_TOKEN_RE = /^[A-Za-z0-9]{3}$/;
|
|
119
|
-
// --- XXH32 (seed 0), the algorithm behind `xxhash-wasm`'s `h32` -------------
|
|
120
|
-
const XXH_PRIME1 = 0x9e3779b1;
|
|
121
|
-
const XXH_PRIME2 = 0x85ebca77;
|
|
122
|
-
const XXH_PRIME3 = 0xc2b2ae3d;
|
|
123
|
-
const XXH_PRIME4 = 0x27d4eb2f;
|
|
124
|
-
const XXH_PRIME5 = 0x165667b1;
|
|
125
|
-
function rotl32(value, bits) {
|
|
126
|
-
return (value << bits) | (value >>> (32 - bits));
|
|
127
|
-
}
|
|
128
|
-
function xxhRound(acc, input) {
|
|
129
|
-
return (Math.imul(rotl32((acc + Math.imul(input, XXH_PRIME2)) | 0, 13), XXH_PRIME1) | 0);
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Standard XXH32 with seed 0 over `bytes`. Returns an unsigned 32-bit integer,
|
|
133
|
-
* matching `xxh32()` in `src/hashline/hasher.ts`.
|
|
134
|
-
*/
|
|
135
|
-
export function xxh32Bytes(bytes) {
|
|
136
|
-
const length = bytes.length;
|
|
137
|
-
let index = 0;
|
|
138
|
-
let hash;
|
|
139
|
-
if (length >= 16) {
|
|
140
|
-
const limit = length - 16;
|
|
141
|
-
let v1 = (XXH_PRIME1 + XXH_PRIME2) | 0;
|
|
142
|
-
let v2 = XXH_PRIME2 | 0;
|
|
143
|
-
let v3 = 0;
|
|
144
|
-
let v4 = -XXH_PRIME1 | 0;
|
|
145
|
-
do {
|
|
146
|
-
v1 = xxhRound(v1, readU32(bytes, index));
|
|
147
|
-
v2 = xxhRound(v2, readU32(bytes, index + 4));
|
|
148
|
-
v3 = xxhRound(v3, readU32(bytes, index + 8));
|
|
149
|
-
v4 = xxhRound(v4, readU32(bytes, index + 12));
|
|
150
|
-
index += 16;
|
|
151
|
-
} while (index <= limit);
|
|
152
|
-
hash =
|
|
153
|
-
(rotl32(v1, 1) + rotl32(v2, 7) + rotl32(v3, 12) + rotl32(v4, 18)) | 0;
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
hash = XXH_PRIME5 | 0;
|
|
157
|
-
}
|
|
158
|
-
hash = (hash + length) | 0;
|
|
159
|
-
while (index + 4 <= length) {
|
|
160
|
-
hash =
|
|
161
|
-
Math.imul(rotl32((hash + Math.imul(readU32(bytes, index), XXH_PRIME3)) | 0, 17), XXH_PRIME4) | 0;
|
|
162
|
-
index += 4;
|
|
163
|
-
}
|
|
164
|
-
while (index < length) {
|
|
165
|
-
hash =
|
|
166
|
-
Math.imul(rotl32((hash + Math.imul(bytes[index], XXH_PRIME5)) | 0, 11), XXH_PRIME1) | 0;
|
|
167
|
-
index += 1;
|
|
168
|
-
}
|
|
169
|
-
hash = (hash ^ (hash >>> 15)) | 0;
|
|
170
|
-
hash = Math.imul(hash, XXH_PRIME2) | 0;
|
|
171
|
-
hash = (hash ^ (hash >>> 13)) | 0;
|
|
172
|
-
hash = Math.imul(hash, XXH_PRIME3) | 0;
|
|
173
|
-
hash = (hash ^ (hash >>> 16)) | 0;
|
|
174
|
-
return hash >>> 0;
|
|
175
|
-
}
|
|
176
|
-
function readU32(bytes, offset) {
|
|
177
|
-
return (bytes[offset] |
|
|
178
|
-
(bytes[offset + 1] << 8) |
|
|
179
|
-
(bytes[offset + 2] << 16) |
|
|
180
|
-
(bytes[offset + 3] << 24) |
|
|
181
|
-
0);
|
|
182
|
-
}
|
|
183
|
-
// --- The line-hash function -------------------------------------------------
|
|
184
|
-
/** `canon` in `src/hashline/hash.ts`. */
|
|
185
|
-
function canon(line) {
|
|
186
|
-
return line.replace(/\r/g, "").trimEnd();
|
|
187
|
-
}
|
|
188
|
-
/** `splitLines` in `src/utils.ts`. An empty file is ONE empty line. */
|
|
189
|
-
function splitLines(text) {
|
|
190
|
-
if (text.length === 0)
|
|
191
|
-
return [""];
|
|
192
|
-
const lines = text.split("\n");
|
|
193
|
-
return text.endsWith("\n") ? lines.slice(0, -1) : lines;
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* `hashSource` in `src/hashline/hash.ts`, as bytes.
|
|
197
|
-
*
|
|
198
|
-
* Upstream truncates the STRING to 500 UTF-8 bytes by iterating code points
|
|
199
|
-
* (`truncateToBytes` in `src/utils.ts`) and then hashes its UTF-8 encoding.
|
|
200
|
-
* Cutting the encoded buffer back to the last non-continuation byte is the
|
|
201
|
-
* same operation, because a UTF-8 code point occupies contiguous bytes.
|
|
202
|
-
*/
|
|
203
|
-
function hashSourceBytes(line) {
|
|
204
|
-
const bytes = Buffer.from(canon(line), "utf8");
|
|
205
|
-
if (bytes.length <= MAX_HASH_SOURCE_BYTES)
|
|
206
|
-
return bytes;
|
|
207
|
-
let cut = MAX_HASH_SOURCE_BYTES;
|
|
208
|
-
while (cut > 0 && (bytes[cut] & 0xc0) === 0x80)
|
|
209
|
-
cut -= 1;
|
|
210
|
-
return bytes.subarray(0, cut);
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* The same `hashSource` value as a string — the key upstream itself compares
|
|
214
|
-
* lines by (`newByContent` / `removedByContent` in `mapStableHashes`). Two
|
|
215
|
-
* lines with the same key are indistinguishable to BOTH implementations, which
|
|
216
|
-
* is exactly the condition the uniqueness gate tests. Decoding the truncated
|
|
217
|
-
* buffer is lossless because the cut lands on a code-point boundary.
|
|
218
|
-
*/
|
|
219
|
-
function hashSourceKey(line) {
|
|
220
|
-
return Buffer.from(hashSourceBytes(line)).toString("utf8");
|
|
221
|
-
}
|
|
222
|
-
function indexToAnchor(index) {
|
|
223
|
-
let out = "";
|
|
224
|
-
let remaining = index;
|
|
225
|
-
for (let digit = 0; digit < HASHLINE_ANCHOR_LENGTH; digit += 1) {
|
|
226
|
-
out = ALPHABET[remaining % ALPHABET.length] + out;
|
|
227
|
-
remaining = Math.floor(remaining / ALPHABET.length);
|
|
228
|
-
}
|
|
229
|
-
return out;
|
|
230
|
-
}
|
|
231
|
-
function getBit(bits, index) {
|
|
232
|
-
return ((bits[index >>> 5] >>> (index & 31)) & 1) !== 0;
|
|
233
|
-
}
|
|
234
|
-
function setBit(bits, index) {
|
|
235
|
-
bits[index >>> 5] |= 1 << (index & 31);
|
|
236
|
-
}
|
|
237
|
-
function nextZeroBit(bits, start) {
|
|
238
|
-
let index = start % HASH_SPACE;
|
|
239
|
-
for (let step = 0; step < HASH_SPACE; step += 1) {
|
|
240
|
-
if (!getBit(bits, index))
|
|
241
|
-
return index;
|
|
242
|
-
index += HASH_PROBE_STRIDE;
|
|
243
|
-
if (index >= HASH_SPACE)
|
|
244
|
-
index -= HASH_SPACE;
|
|
245
|
-
}
|
|
246
|
-
// Upstream throws `[E_FILE_TOO_LARGE]` here. pi-lens is an observer, so it
|
|
247
|
-
// reports "cannot address this file" instead of failing the caller.
|
|
248
|
-
return -1;
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* `_lineHashesPure` in `src/hashline/hash.ts`: one anchor per line of
|
|
252
|
-
* ALREADY-NORMALIZED content (BOM stripped, CRLF folded to LF).
|
|
253
|
-
*
|
|
254
|
-
* Returns `undefined` for a file with more lines than the anchor space can
|
|
255
|
-
* address, which is where upstream raises `[E_FILE_TOO_LARGE]`.
|
|
256
|
-
*/
|
|
257
|
-
export function computeHashlineAnchors(content) {
|
|
258
|
-
const lines = splitLines(content);
|
|
259
|
-
if (lines.length > HASH_SPACE)
|
|
260
|
-
return undefined;
|
|
261
|
-
const anchors = [];
|
|
262
|
-
anchors.length = lines.length;
|
|
263
|
-
const used = new Uint32Array(BITSET_WORDS);
|
|
264
|
-
let hint = 0;
|
|
265
|
-
const sourceCache = new Map();
|
|
266
|
-
for (let i = 0; i < lines.length; i += 1) {
|
|
267
|
-
const line = lines[i];
|
|
268
|
-
let baseIndex = sourceCache.get(line);
|
|
269
|
-
if (baseIndex === undefined) {
|
|
270
|
-
baseIndex = (xxh32Bytes(hashSourceBytes(line)) >>> 14) % HASH_SPACE;
|
|
271
|
-
sourceCache.set(line, baseIndex);
|
|
272
|
-
}
|
|
273
|
-
if (!getBit(used, baseIndex)) {
|
|
274
|
-
setBit(used, baseIndex);
|
|
275
|
-
hint = baseIndex + HASH_PROBE_STRIDE;
|
|
276
|
-
anchors[i] = indexToAnchor(baseIndex);
|
|
277
|
-
continue;
|
|
278
|
-
}
|
|
279
|
-
const probed = nextZeroBit(used, hint);
|
|
280
|
-
if (probed < 0)
|
|
281
|
-
return undefined;
|
|
282
|
-
setBit(used, probed);
|
|
283
|
-
hint = probed + HASH_PROBE_STRIDE;
|
|
284
|
-
anchors[i] = indexToAnchor(probed);
|
|
285
|
-
}
|
|
286
|
-
return anchors;
|
|
287
|
-
}
|
|
288
|
-
// --- Anchor tokens ----------------------------------------------------------
|
|
289
|
-
/**
|
|
290
|
-
* The anchor token an edit-pro request carries, or `undefined` when the value
|
|
291
|
-
* is not one. Mirrors `parseRef` in `src/hashline/parse.ts`: trim, then require
|
|
292
|
-
* exactly three characters from the alphabet. A decimal line number is NOT an
|
|
293
|
-
* anchor.
|
|
294
|
-
*/
|
|
295
|
-
export function normalizeHashlineAnchorToken(value) {
|
|
296
|
-
if (typeof value !== "string")
|
|
297
|
-
return undefined;
|
|
298
|
-
const trimmed = value.trim();
|
|
299
|
-
return ANCHOR_TOKEN_RE.test(trimmed) ? trimmed : undefined;
|
|
300
|
-
}
|
|
301
|
-
/**
|
|
302
|
-
* Files larger than this are not anchor-resolved. The extension itself caps at
|
|
303
|
-
* `MAX_HASH_LINES` (62**3 lines); this byte cap keeps the synchronous read on
|
|
304
|
-
* the tool_call path bounded regardless of line length.
|
|
305
|
-
*/
|
|
306
|
-
const MAX_ANCHOR_FILE_BYTES = 4 * 1024 * 1024;
|
|
307
|
-
/**
|
|
308
|
-
* Bounded memo. `classifyMutatingTool` runs several times per tool call and the
|
|
309
|
-
* same file is asked about repeatedly; without this every ask re-reads and
|
|
310
|
-
* re-hashes the file. Keyed by path and invalidated by mtime/size, so an edit
|
|
311
|
-
* between two asks is USUALLY not answered from the stale index.
|
|
312
|
-
*
|
|
313
|
-
* "Usually" (review round 4, finding F5): mtime/size alone is not sufficient.
|
|
314
|
-
* A same-size rewrite that lands within one filesystem mtime tick (mtime
|
|
315
|
-
* resolution is coarser than a millisecond on some platforms/filesystems)
|
|
316
|
-
* changes neither key, so the memo can serve stale content for a file that
|
|
317
|
-
* genuinely changed. The memo only ever needs to survive WITHIN one tool
|
|
318
|
-
* call — the repeated-ask case above — so `dropHashlineAnchorMemo` is called
|
|
319
|
-
* at the `tool_call` boundary in `runtime-tool-call.ts` (`handleToolCallImpl`
|
|
320
|
-
* entry) to bound its lifetime to that, rather than trusting mtime/size
|
|
321
|
-
* across calls.
|
|
322
|
-
*/
|
|
323
|
-
const ANCHOR_INDEX_CACHE_LIMIT = 8;
|
|
324
|
-
const ANCHOR_INDEX_CACHE = new BoundedFifoMap(ANCHOR_INDEX_CACHE_LIMIT);
|
|
325
|
-
/**
|
|
326
|
-
* Drop the memo. Called at the `tool_call` boundary in production
|
|
327
|
-
* (`runtime-tool-call.ts`) so a stale mtime/size match from a PRIOR tool call
|
|
328
|
-
* can never leak into this one (review round 4, finding F5), and as a test
|
|
329
|
-
* seam so a fixture rewrite is never answered from cache.
|
|
330
|
-
*/
|
|
331
|
-
export function dropHashlineAnchorMemo() {
|
|
332
|
-
ANCHOR_INDEX_CACHE.clear();
|
|
333
|
-
}
|
|
334
|
-
function buildAnchorIndex(filePath) {
|
|
335
|
-
let stats;
|
|
336
|
-
try {
|
|
337
|
-
stats = nodeFs.statSync(filePath);
|
|
338
|
-
}
|
|
339
|
-
catch {
|
|
340
|
-
return { failure: "file_unreadable" };
|
|
341
|
-
}
|
|
342
|
-
if (!stats.isFile())
|
|
343
|
-
return { failure: "file_unreadable" };
|
|
344
|
-
if (stats.size > MAX_ANCHOR_FILE_BYTES)
|
|
345
|
-
return { failure: "file_too_large" };
|
|
346
|
-
const cached = ANCHOR_INDEX_CACHE.get(filePath);
|
|
347
|
-
if (cached &&
|
|
348
|
-
cached.mtimeMs === stats.mtimeMs &&
|
|
349
|
-
cached.size === stats.size) {
|
|
350
|
-
return { index: cached.index, contentUnique: cached.contentUnique };
|
|
351
|
-
}
|
|
352
|
-
let raw;
|
|
353
|
-
try {
|
|
354
|
-
raw = nodeFs.readFileSync(filePath, "utf8");
|
|
355
|
-
}
|
|
356
|
-
catch {
|
|
357
|
-
return { failure: "file_unreadable" };
|
|
358
|
-
}
|
|
359
|
-
// `readNormFile` in the extension strips the BOM and folds line endings to
|
|
360
|
-
// LF before hashing, so the same normalization has to happen here.
|
|
361
|
-
const normalized = (raw.startsWith("") ? raw.slice(1) : raw)
|
|
362
|
-
.replace(/\r\n/g, "\n")
|
|
363
|
-
.replace(/\r/g, "\n");
|
|
364
|
-
const anchors = computeHashlineAnchors(normalized);
|
|
365
|
-
if (anchors === undefined)
|
|
366
|
-
return { failure: "file_too_large" };
|
|
367
|
-
const index = new Map();
|
|
368
|
-
for (let i = 0; i < anchors.length; i += 1) {
|
|
369
|
-
index.set(anchors[i], i + 1);
|
|
370
|
-
}
|
|
371
|
-
// Content multiplicity, keyed exactly as upstream keys it. A line whose key
|
|
372
|
-
// repeats is unanswerable: see the module header.
|
|
373
|
-
const lines = splitLines(normalized);
|
|
374
|
-
const keys = [];
|
|
375
|
-
keys.length = lines.length;
|
|
376
|
-
const keyCounts = new Map();
|
|
377
|
-
const keyCache = new Map();
|
|
378
|
-
for (let i = 0; i < lines.length; i += 1) {
|
|
379
|
-
const line = lines[i];
|
|
380
|
-
let key = keyCache.get(line);
|
|
381
|
-
if (key === undefined) {
|
|
382
|
-
key = hashSourceKey(line);
|
|
383
|
-
keyCache.set(line, key);
|
|
384
|
-
}
|
|
385
|
-
keys[i] = key;
|
|
386
|
-
keyCounts.set(key, (keyCounts.get(key) ?? 0) + 1);
|
|
387
|
-
}
|
|
388
|
-
const contentUnique = keys.map((key) => keyCounts.get(key) === 1);
|
|
389
|
-
ANCHOR_INDEX_CACHE.set(filePath, {
|
|
390
|
-
mtimeMs: stats.mtimeMs,
|
|
391
|
-
size: stats.size,
|
|
392
|
-
index,
|
|
393
|
-
contentUnique,
|
|
394
|
-
});
|
|
395
|
-
return { index, contentUnique };
|
|
396
|
-
}
|
|
397
|
-
/**
|
|
398
|
-
* Resolve one anchor token against the file's CURRENT content.
|
|
399
|
-
*
|
|
400
|
-
* TWO conditions, both required (review round 3, finding F1):
|
|
401
|
-
*
|
|
402
|
-
* 1. The anchor matches a line of the recomputed table — `resAnchorFromMap` in
|
|
403
|
-
* `src/hashline/resolve.ts` requires that much.
|
|
404
|
-
* 2. That line's canonical content occurs exactly once in the file. Without
|
|
405
|
-
* this, a store-carried anchor for one `}` resolves confidently to a
|
|
406
|
-
* DIFFERENT `}`, and the wrong range reaches the read guard. The module
|
|
407
|
-
* header has the measurement — including the residual this narrows but
|
|
408
|
-
* does not close (review round 4, finding F1).
|
|
409
|
-
*/
|
|
410
|
-
export function resolveHashlineAnchor(filePath, anchor) {
|
|
411
|
-
const token = normalizeHashlineAnchorToken(anchor);
|
|
412
|
-
if (token === undefined)
|
|
413
|
-
return { failure: "not_an_anchor" };
|
|
414
|
-
const built = buildAnchorIndex(filePath);
|
|
415
|
-
if ("failure" in built)
|
|
416
|
-
return { failure: built.failure };
|
|
417
|
-
const line = built.index.get(token);
|
|
418
|
-
if (line === undefined)
|
|
419
|
-
return { failure: "anchor_not_found" };
|
|
420
|
-
if (built.contentUnique[line - 1] !== true) {
|
|
421
|
-
return { failure: "content_not_unique" };
|
|
422
|
-
}
|
|
423
|
-
return { line };
|
|
424
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The per-hook wall-clock budgets, in ONE table (#2523).
|
|
3
|
-
*
|
|
4
|
-
* ## What a budget here means
|
|
5
|
-
*
|
|
6
|
-
* The maintainer contract behind #2523: only the write/edit `tool_result`
|
|
7
|
-
* path may block pi's host loop. `session_start`, `turn_end`, `agent_end`,
|
|
8
|
-
* `agent_settled` and read-only `tool_result` must either finish inside a
|
|
9
|
-
* small bound or deliver their work OFF-hook (`clients/deferred-lsp-work.ts`,
|
|
10
|
-
* `publishActionableWarningsReport` #2509, the test-runner `agent_settled`
|
|
11
|
-
* delivery #2366, the cascade deferred settle #450) — deliver, never drop.
|
|
12
|
-
*
|
|
13
|
-
* A number here is the TOTAL wall time the hook may spend, not a per-await
|
|
14
|
-
* allowance. `0` means the hook may not await anything at all: whatever it
|
|
15
|
-
* does must be synchronous bookkeeping or fire-and-forget with its own
|
|
16
|
-
* bound.
|
|
17
|
-
*
|
|
18
|
-
* The numbers are the contract's, not a measurement: they are the ceilings
|
|
19
|
-
* the maintainer set for what the host may be made to wait for. #2523's
|
|
20
|
-
* sweep measured today's reality against them — `turn_end` p50 3687 ms /
|
|
21
|
-
* p90 14246 ms against a 3000 ms budget, `agent_end` p90 10043 ms against
|
|
22
|
-
* 1000 ms — which is what makes this table a target rather than a
|
|
23
|
-
* description.
|
|
24
|
-
*
|
|
25
|
-
* ## Why a table, and why it is not wired yet
|
|
26
|
-
*
|
|
27
|
-
* Slice 1 of #2523 ships the enforcement PRIMITIVE (`bounded()` in
|
|
28
|
-
* `clients/deadline-utils.ts`) and the guard that makes a new unbounded hook
|
|
29
|
-
* await impossible to add (`tests/config/hook-await-bounds.test.ts`). It
|
|
30
|
-
* deliberately changes NO hook's behavior. This table exists now so the
|
|
31
|
-
* guard's exemption table can say which hook each unbounded await belongs to
|
|
32
|
-
* — a claim that is checked, since every exemption's `hook` field must be a
|
|
33
|
-
* key of {@link HOOK_WALL_BUDGET_MS}. Slice 2 (AC3-AC8) wires it into the
|
|
34
|
-
* outer `bounded()` around each registered handler.
|
|
35
|
-
*
|
|
36
|
-
* #1978's phase-budget watchdog is the general form of this idea ("every
|
|
37
|
-
* recorded duration gets a declared budget"). When it lands it must CONSUME
|
|
38
|
-
* this table for the hook family rather than declare a second set of hook
|
|
39
|
-
* numbers — AGENTS.md's single-source-of-truth rule, and #2523 AC7 says so
|
|
40
|
-
* explicitly.
|
|
41
|
-
*/
|
|
42
|
-
/**
|
|
43
|
-
* Total wall-clock budget per hook, in milliseconds. `0` = may not await.
|
|
44
|
-
*
|
|
45
|
-
* `session_start` is the one VISIBLE budget: 5 s of startup is work the user
|
|
46
|
-
* is already watching a progress line for. Everything else is time the user
|
|
47
|
-
* did not ask to spend.
|
|
48
|
-
*/
|
|
49
|
-
export const HOOK_WALL_BUDGET_MS = Object.freeze({
|
|
50
|
-
/** Visible startup work; the user is watching a progress line. */
|
|
51
|
-
session_start: 5000,
|
|
52
|
-
/** Pure bookkeeping — nothing here may await (#2523 contract). */
|
|
53
|
-
turn_start: 0,
|
|
54
|
-
/** Measured p50 3687 ms / p90 14246 ms today. The gap IS the issue. */
|
|
55
|
-
turn_end: 3000,
|
|
56
|
-
/** Measured p90 10043 ms today, from one unbounded pipeline re-entry. */
|
|
57
|
-
agent_end: 1000,
|
|
58
|
-
/** The designated place for settled-time sweeps; the widest non-edit budget. */
|
|
59
|
-
agent_settled: 10000,
|
|
60
|
-
/** Read/Grep/Glob/Bash: must never await analyzer bootstrap (AC5). */
|
|
61
|
-
tool_result_read_only: 500,
|
|
62
|
-
/** The ONLY path the contract lets block the host, and only this long. */
|
|
63
|
-
tool_result_edit: 10000,
|
|
64
|
-
/** Teardown: spawning or awaiting here aborts libuv (#234). */
|
|
65
|
-
session_shutdown: 0,
|
|
66
|
-
/** Synchronous message contribution; the host is blocked on the answer. */
|
|
67
|
-
context: 0,
|
|
68
|
-
/** Fork bookkeeping; the session is being replaced under it. */
|
|
69
|
-
session_before_fork: 0,
|
|
70
|
-
});
|
|
71
|
-
/** Every declared hook family, for sweeps that must enumerate them. */
|
|
72
|
-
export const HOOK_BUDGET_KEYS = Object.keys(HOOK_WALL_BUDGET_MS);
|
|
73
|
-
/** Type guard for a string that names a declared hook family. */
|
|
74
|
-
export function isHookBudgetKey(value) {
|
|
75
|
-
return Object.hasOwn(HOOK_WALL_BUDGET_MS, value);
|
|
76
|
-
}
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Vendored port of the pi host edit tool's text-normalization primitives, so
|
|
3
|
-
* the read-guard's oldText->range matching agrees *by construction* with how the
|
|
4
|
-
* host actually applies edits (exact-then-fuzzy in normalized space).
|
|
5
|
-
*
|
|
6
|
-
* SOURCE OF TRUTH: `@earendil-works/pi-coding-agent`
|
|
7
|
-
* `dist/core/tools/edit-diff.js` -- `normalizeForFuzzyMatch`, `normalizeToLF`,
|
|
8
|
-
* `detectLineEnding`, `restoreLineEndings`. As of 0.85.1 the BOM
|
|
9
|
-
* split/strip primitive (`stripBom`'s underlying `splitBom`) moved to
|
|
10
|
-
* `dist/utils/text.js`, imported by edit-diff.js rather than inlined there
|
|
11
|
-
* -- see the sync test's two-source read.
|
|
12
|
-
*
|
|
13
|
-
* The host SDK is a *type-only* dependency at runtime (pi installs extensions
|
|
14
|
-
* with `npm install --omit=dev`, so the SDK is not in `node_modules`). These
|
|
15
|
-
* functions are therefore intentionally COPIED, not imported -- keep each one
|
|
16
|
-
* behaviourally identical to the host. The companion sync test
|
|
17
|
-
* (`tests/clients/host-edit-normalize-sync.test.ts`) re-reads the host source
|
|
18
|
-
* from devDeps and fails if it drifts from this port, pinning the floor below.
|
|
19
|
-
*
|
|
20
|
-
* The Unicode fold classes are built from explicit code points (HOST_* below)
|
|
21
|
-
* rather than literal glyphs so this file stays pure-ASCII; the code-point sets
|
|
22
|
-
* are the same ones the host hard-codes as \u escapes in `normalizeForFuzzyMatch`.
|
|
23
|
-
*
|
|
24
|
-
* Refs #257 (read-guard / edit-autopatch alignment with the host edit tool).
|
|
25
|
-
*/
|
|
26
|
-
/**
|
|
27
|
-
* Host SDK version this port mirrors. Bump together with the devDependency
|
|
28
|
-
* floor in package.json and re-confirm the sync test when the host changes its
|
|
29
|
-
* normalization ladder.
|
|
30
|
-
*/
|
|
31
|
-
export const HOST_EDIT_DIFF_SDK_FLOOR = "0.85.1";
|
|
32
|
-
// Host normalizeForFuzzyMatch code-point sets (edit-diff.js). Exported so the
|
|
33
|
-
// sync test can assert the host source still encodes exactly these.
|
|
34
|
-
/** U+2018 U+2019 U+201A U+201B -> ' */
|
|
35
|
-
export const HOST_SMART_SINGLE_QUOTES = [0x2018, 0x2019, 0x201a, 0x201b];
|
|
36
|
-
/** U+201C U+201D U+201E U+201F -> " */
|
|
37
|
-
export const HOST_SMART_DOUBLE_QUOTES = [0x201c, 0x201d, 0x201e, 0x201f];
|
|
38
|
-
/** U+2010..U+2015 dashes + U+2212 minus -> - */
|
|
39
|
-
export const HOST_UNICODE_DASHES = [
|
|
40
|
-
0x2010, 0x2011, 0x2012, 0x2013, 0x2014, 0x2015, 0x2212,
|
|
41
|
-
];
|
|
42
|
-
/** U+00A0 NBSP, U+2002..U+200A spaces, U+202F, U+205F, U+3000 -> space */
|
|
43
|
-
export const HOST_SPECIAL_SPACES = [
|
|
44
|
-
0x00a0, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009,
|
|
45
|
-
0x200a, 0x202f, 0x205f, 0x3000,
|
|
46
|
-
];
|
|
47
|
-
/** U+FEFF byte-order mark */
|
|
48
|
-
export const HOST_BOM_CODE_POINT = 0xfeff;
|
|
49
|
-
const charClass = (codePoints) => new RegExp(`[${String.fromCharCode(...codePoints)}]`, "g");
|
|
50
|
-
const SMART_SINGLE_QUOTES_RE = charClass(HOST_SMART_SINGLE_QUOTES);
|
|
51
|
-
const SMART_DOUBLE_QUOTES_RE = charClass(HOST_SMART_DOUBLE_QUOTES);
|
|
52
|
-
const UNICODE_DASHES_RE = charClass(HOST_UNICODE_DASHES);
|
|
53
|
-
const SPECIAL_SPACES_RE = charClass(HOST_SPECIAL_SPACES);
|
|
54
|
-
const BOM = String.fromCharCode(HOST_BOM_CODE_POINT);
|
|
55
|
-
// --- verbatim host ports (edit-diff.js) ---------------------------------------
|
|
56
|
-
/** First-occurrence-wins line-ending detection (CRLF vs LF). */
|
|
57
|
-
export function detectLineEnding(content) {
|
|
58
|
-
const crlfIdx = content.indexOf("\r\n");
|
|
59
|
-
const lfIdx = content.indexOf("\n");
|
|
60
|
-
if (lfIdx === -1)
|
|
61
|
-
return "\n";
|
|
62
|
-
if (crlfIdx === -1)
|
|
63
|
-
return "\n";
|
|
64
|
-
return crlfIdx < lfIdx ? "\r\n" : "\n";
|
|
65
|
-
}
|
|
66
|
-
/** Collapse CRLF and lone-CR line endings to LF. */
|
|
67
|
-
export function normalizeToLF(text) {
|
|
68
|
-
return text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
69
|
-
}
|
|
70
|
-
/** Restore LF text back to the detected ending (no-op for LF files). */
|
|
71
|
-
export function restoreLineEndings(text, ending) {
|
|
72
|
-
return ending === "\r\n" ? text.replace(/\n/g, "\r\n") : text;
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Normalize text for fuzzy matching. Mirrors the host's progressive ladder:
|
|
76
|
-
* NFKC -> strip trailing whitespace per line -> smart quotes -> Unicode
|
|
77
|
-
* dashes/hyphens -> special Unicode spaces. None of these transforms add or
|
|
78
|
-
* remove a newline, so line numbers computed on the result map 1:1 to file
|
|
79
|
-
* lines.
|
|
80
|
-
*/
|
|
81
|
-
export function normalizeForFuzzyMatch(text) {
|
|
82
|
-
return text
|
|
83
|
-
.normalize("NFKC")
|
|
84
|
-
.split("\n")
|
|
85
|
-
.map((line) => line.trimEnd())
|
|
86
|
-
.join("\n")
|
|
87
|
-
.replace(SMART_SINGLE_QUOTES_RE, "'")
|
|
88
|
-
.replace(SMART_DOUBLE_QUOTES_RE, '"')
|
|
89
|
-
.replace(UNICODE_DASHES_RE, "-")
|
|
90
|
-
.replace(SPECIAL_SPACES_RE, " ");
|
|
91
|
-
}
|
|
92
|
-
/** Strip a leading UTF-8 BOM if present. */
|
|
93
|
-
export function stripBom(content) {
|
|
94
|
-
return content.startsWith(BOM)
|
|
95
|
-
? { bom: BOM, text: content.slice(1) }
|
|
96
|
-
: { bom: "", text: content };
|
|
97
|
-
}
|
|
98
|
-
// --- composed guard helper ----------------------------------------------------
|
|
99
|
-
/**
|
|
100
|
-
* Full host MATCH-space normalization used by the read-guard's oldText->range
|
|
101
|
-
* resolver and the autopatch synthetic-read bridge: BOM strip -> LF -> fuzzy
|
|
102
|
-
* fold. A needle normalized this way finds exactly what the host's
|
|
103
|
-
* `fuzzyFindText` / `countOccurrences` would find, so the gate no longer
|
|
104
|
-
* rejects edits the host would apply (smart quotes, em-dashes, NBSP, BOM, lone
|
|
105
|
-
* CR, NFKC-equivalent forms). Newline positions are preserved relative to the
|
|
106
|
-
* LF view, so occurrence line numbers stay aligned with the file.
|
|
107
|
-
*/
|
|
108
|
-
export function normalizeForGuardMatch(text) {
|
|
109
|
-
return normalizeForFuzzyMatch(normalizeToLF(stripBom(text).text));
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Replicate the host edit tool's match *decision* for a single oldText against
|
|
113
|
-
* file content, WITHOUT applying anything: exact-then-fuzzy find + duplicate
|
|
114
|
-
* count in fuzzy space, exactly as `fuzzyFindText` + `countOccurrences` do
|
|
115
|
-
* (edit-diff.js). The host pre-strips BOM and normalizes to LF, so this does the
|
|
116
|
-
* same before matching.
|
|
117
|
-
*
|
|
118
|
-
* Used as the read-guard's counterfactual log: when the guard blocks an edit,
|
|
119
|
-
* `wouldApply === true` flags a false-block (the host would have applied it),
|
|
120
|
-
* `false` confirms a genuine miss (the host would also fail). This is the only
|
|
121
|
-
* way to measure the guard's false-block rate without an A/B harness (#257).
|
|
122
|
-
*/
|
|
123
|
-
export function hostWouldApplyOldText(content, oldText) {
|
|
124
|
-
const c = normalizeToLF(stripBom(content).text);
|
|
125
|
-
const o = normalizeToLF(stripBom(oldText).text);
|
|
126
|
-
if (o.length === 0) {
|
|
127
|
-
return { wouldApply: false, occurrences: 0, usedFuzzyMatch: false };
|
|
128
|
-
}
|
|
129
|
-
const exactFound = c.indexOf(o) !== -1;
|
|
130
|
-
// The host always counts duplicates in fuzzy space, even for an exact match.
|
|
131
|
-
const fuzzyContent = normalizeForFuzzyMatch(c);
|
|
132
|
-
const fuzzyOldText = normalizeForFuzzyMatch(o);
|
|
133
|
-
const fuzzyFound = fuzzyContent.indexOf(fuzzyOldText) !== -1;
|
|
134
|
-
const occurrences = fuzzyOldText.length === 0 ? 0 : fuzzyContent.split(fuzzyOldText).length - 1;
|
|
135
|
-
return {
|
|
136
|
-
wouldApply: (exactFound || fuzzyFound) && occurrences === 1,
|
|
137
|
-
occurrences,
|
|
138
|
-
usedFuzzyMatch: !exactFound && fuzzyFound,
|
|
139
|
-
};
|
|
140
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/** Host-neutral capabilities available to the pi-lens engine (#1358 S2). */
|
|
2
|
-
/**
|
|
3
|
-
* Headless/test implementation. Its feature-detection defaults deliberately
|
|
4
|
-
* match the pre-ports absent-host paths: unknown trust/mode, fail-open spawn,
|
|
5
|
-
* and no-op delivery surfaces.
|
|
6
|
-
*/
|
|
7
|
-
export function createDefaultHostPorts(overrides = {}) {
|
|
8
|
-
const unknownMode = () => "unknown";
|
|
9
|
-
const defaults = {
|
|
10
|
-
notify: { user: () => { } },
|
|
11
|
-
trust: { isProjectTrusted: () => "unknown" },
|
|
12
|
-
mode: {
|
|
13
|
-
current: unknownMode,
|
|
14
|
-
supportsTuiWidget: () => true,
|
|
15
|
-
suppressesUserNotify: () => false,
|
|
16
|
-
},
|
|
17
|
-
log: { extension: () => { }, debug: () => { }, sink: () => () => { } },
|
|
18
|
-
emit: { bus: () => { } },
|
|
19
|
-
status: { set: () => { } },
|
|
20
|
-
spawn: { abortSignal: () => undefined, isAllowed: () => true },
|
|
21
|
-
render: { invalidate: () => { } },
|
|
22
|
-
session: { id: () => undefined },
|
|
23
|
-
workspace: { cwd: () => undefined, projectRoot: () => undefined },
|
|
24
|
-
flags: { get: () => undefined },
|
|
25
|
-
tools: { has: async () => false, getActive: () => [], setActive: () => { } },
|
|
26
|
-
};
|
|
27
|
-
// SAFETY: `Object.fromEntries` is typed `Record<string, T>` — it cannot
|
|
28
|
-
// carry the key literals or the per-group value types through. The keys
|
|
29
|
-
// come from `Object.entries(defaults)`, and `defaults` is declared as a
|
|
30
|
-
// complete `HostPorts`, so every group is present; each value is that
|
|
31
|
-
// group's default spread-merged with the same group's override, so no
|
|
32
|
-
// group's member set shrinks. Add a group to `HostPorts` without adding it
|
|
33
|
-
// to `defaults` and this cast becomes a lie, which is why `defaults` is
|
|
34
|
-
// annotated rather than inferred.
|
|
35
|
-
return Object.fromEntries(Object.entries(defaults).map(([group, value]) => [
|
|
36
|
-
group,
|
|
37
|
-
{ ...value, ...overrides[group] },
|
|
38
|
-
]));
|
|
39
|
-
}
|