@herbertgao/pi-extensions 2026.10.1 → 2026.10.3
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 +14 -17
- 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/{remote-pi → @herbertgao/pi-agency}/LICENSE +1 -1
- 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/@herbertgao/pi-subagents/CHANGELOG.md +8 -0
- package/node_modules/@herbertgao/pi-subagents/README.md +1 -1
- package/node_modules/@herbertgao/pi-subagents/package.json +4 -5
- package/node_modules/@herbertgao/pi-subagents/src/index.ts +1 -1
- package/node_modules/@herbertgao/pi-subagents/src/invocation-config.ts +1 -1
- package/node_modules/@herbertgao/pi-subagents/src/mention-clone.ts +48 -72
- package/node_modules/@herbertgao/pi-subagents/src/nested-tools.ts +1 -1
- package/node_modules/@herbertgao/pi-subagents/src/output-file.ts +15 -6
- package/node_modules/@herbertgao/pi-subagents/src/workflow/collisions.ts +4 -1
- package/node_modules/@herbertgao/pi-subagents/src/workflow/json-schema.ts +9 -8
- package/node_modules/@narumitw/pi-caffeinate/dist/index.ts +6 -1
- package/node_modules/@narumitw/pi-caffeinate/dist/index.ts.map +2 -2
- package/node_modules/@narumitw/pi-caffeinate/package.json +3 -3
- package/node_modules/@narumitw/pi-caffeinate/src/dbus-inhibit.ts +13 -1
- 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 +1159 -0
- package/node_modules/pi-lens/README.md +116 -25
- package/node_modules/pi-lens/config/dependency-cruiser-eager-allowlist.json +6 -2
- 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-2FQ62SPM.js +83 -0
- package/node_modules/pi-lens/dist/chunk-2UMYMRI3.js +118 -0
- package/node_modules/pi-lens/dist/chunk-34OCDWOS.js +48 -0
- package/node_modules/pi-lens/dist/chunk-3FERWMCH.js +144 -0
- package/node_modules/pi-lens/dist/chunk-3JL6IFD7.js +97 -0
- package/node_modules/pi-lens/dist/chunk-3JSEWUWI.js +327 -0
- package/node_modules/pi-lens/dist/chunk-3MED75HT.js +37 -0
- package/node_modules/pi-lens/dist/chunk-3MRXIJ6I.js +79 -0
- package/node_modules/pi-lens/dist/chunk-3P4PF2BX.js +2250 -0
- package/node_modules/pi-lens/dist/chunk-3PNFWVHT.js +201 -0
- package/node_modules/pi-lens/dist/chunk-3TTPKMEF.js +162 -0
- package/node_modules/pi-lens/dist/chunk-5JHXUETW.js +326 -0
- package/node_modules/pi-lens/dist/chunk-5W3R6LFT.js +24 -0
- package/node_modules/pi-lens/dist/chunk-64LU2OVH.js +341 -0
- package/node_modules/pi-lens/dist/chunk-6B5I6ICN.js +44 -0
- package/node_modules/pi-lens/dist/chunk-6P54TMWL.js +274 -0
- package/node_modules/pi-lens/dist/chunk-6UYA642J.js +145 -0
- package/node_modules/pi-lens/dist/chunk-6XX5HCLK.js +398 -0
- package/node_modules/pi-lens/dist/chunk-7AXO3ZDF.js +30 -0
- package/node_modules/pi-lens/dist/chunk-7BX5DWSA.js +1907 -0
- package/node_modules/pi-lens/dist/chunk-7ELY2CSM.js +902 -0
- package/node_modules/pi-lens/dist/chunk-7M4T5N3V.js +38 -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-AFZYMAIV.js +756 -0
- package/node_modules/pi-lens/dist/chunk-ALQRYH6O.js +112 -0
- package/node_modules/pi-lens/dist/chunk-AXKPQ6ZI.js +1610 -0
- package/node_modules/pi-lens/dist/chunk-BHWHXMQ2.js +62 -0
- package/node_modules/pi-lens/dist/chunk-BJF25SUG.js +22 -0
- package/node_modules/pi-lens/dist/chunk-BNKLYOOO.js +18 -0
- package/node_modules/pi-lens/dist/chunk-BW5KFIQC.js +59 -0
- package/node_modules/pi-lens/dist/chunk-CBD2B5CP.js +599 -0
- package/node_modules/pi-lens/dist/chunk-CFYISHUW.js +42 -0
- package/node_modules/pi-lens/dist/chunk-CMU4RMJB.js +30 -0
- package/node_modules/pi-lens/dist/chunk-CULQYFLU.js +14 -0
- package/node_modules/pi-lens/dist/chunk-D65GOCJB.js +289 -0
- package/node_modules/pi-lens/dist/chunk-D6YF5HKX.js +59 -0
- package/node_modules/pi-lens/dist/chunk-DMS52BEP.js +342 -0
- package/node_modules/pi-lens/dist/chunk-ELVWJYRV.js +211 -0
- package/node_modules/pi-lens/dist/chunk-EUT3B22Y.js +27 -0
- package/node_modules/pi-lens/dist/chunk-F5VLZHUW.js +146 -0
- package/node_modules/pi-lens/dist/chunk-FC4RP4I2.js +12 -0
- package/node_modules/pi-lens/dist/chunk-FGALODG3.js +55 -0
- package/node_modules/pi-lens/dist/chunk-G3RLJYA2.js +2358 -0
- package/node_modules/pi-lens/dist/chunk-GAYGGICG.js +32 -0
- package/node_modules/pi-lens/dist/chunk-H2W2AXD3.js +419 -0
- package/node_modules/pi-lens/dist/chunk-H5EV3VMF.js +114 -0
- package/node_modules/pi-lens/dist/chunk-HREZQCT3.js +106 -0
- package/node_modules/pi-lens/dist/chunk-HSIRMK2D.js +517 -0
- package/node_modules/pi-lens/dist/chunk-IMSQR4WO.js +184 -0
- package/node_modules/pi-lens/dist/chunk-IQZXOZ7S.js +4816 -0
- package/node_modules/pi-lens/dist/chunk-IR6XFA5P.js +37 -0
- package/node_modules/pi-lens/dist/chunk-IUKPRZER.js +78 -0
- package/node_modules/pi-lens/dist/chunk-IUR76K6A.js +262 -0
- package/node_modules/pi-lens/dist/chunk-J3FZR3YY.js +98 -0
- package/node_modules/pi-lens/dist/chunk-J6DFZDFA.js +562 -0
- package/node_modules/pi-lens/dist/chunk-J7WJZ6W7.js +50 -0
- package/node_modules/pi-lens/dist/chunk-JONGANYH.js +202 -0
- package/node_modules/pi-lens/dist/chunk-KJCWXUUS.js +425 -0
- package/node_modules/pi-lens/dist/chunk-KJN4IOEJ.js +17 -0
- package/node_modules/pi-lens/dist/chunk-KMGPUKFD.js +25 -0
- package/node_modules/pi-lens/dist/chunk-LD7WFTRX.js +4533 -0
- package/node_modules/pi-lens/dist/chunk-LJDODBBZ.js +78 -0
- package/node_modules/pi-lens/dist/chunk-LNOMA3MP.js +169 -0
- package/node_modules/pi-lens/dist/chunk-MGIWSROG.js +2334 -0
- package/node_modules/pi-lens/dist/chunk-MQA2YBAH.js +308 -0
- package/node_modules/pi-lens/dist/chunk-MTDRLSI7.js +21720 -0
- package/node_modules/pi-lens/dist/chunk-N2IRDBZI.js +2355 -0
- package/node_modules/pi-lens/dist/chunk-N77WFUL7.js +50 -0
- package/node_modules/pi-lens/dist/chunk-N7YNJE5R.js +466 -0
- package/node_modules/pi-lens/dist/chunk-NABLC7W3.js +148 -0
- package/node_modules/pi-lens/dist/chunk-NFXP47RV.js +999 -0
- package/node_modules/pi-lens/dist/chunk-NJF2X5XF.js +45 -0
- package/node_modules/pi-lens/dist/chunk-NXL4FFQQ.js +47 -0
- package/node_modules/pi-lens/dist/chunk-O7HZX7CA.js +309 -0
- package/node_modules/pi-lens/dist/chunk-OC7LYAU5.js +708 -0
- package/node_modules/pi-lens/dist/chunk-OEX24ECI.js +348 -0
- package/node_modules/pi-lens/dist/chunk-OYOB3ZFG.js +78 -0
- package/node_modules/pi-lens/dist/chunk-OYTMZXRF.js +41 -0
- package/node_modules/pi-lens/dist/chunk-OZJINN4O.js +84 -0
- package/node_modules/pi-lens/dist/chunk-PCHDGUKT.js +23 -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-RJFED73B.js +79 -0
- package/node_modules/pi-lens/dist/chunk-RTQNRM5X.js +27 -0
- package/node_modules/pi-lens/dist/chunk-S6AMWKPC.js +189 -0
- package/node_modules/pi-lens/dist/chunk-T4QZ6FEH.js +308 -0
- package/node_modules/pi-lens/dist/chunk-T54VJRAD.js +5456 -0
- package/node_modules/pi-lens/dist/chunk-TA5L5KWQ.js +167 -0
- package/node_modules/pi-lens/dist/chunk-TQFBZVCG.js +27 -0
- package/node_modules/pi-lens/dist/chunk-U52SAGRM.js +62 -0
- package/node_modules/pi-lens/dist/chunk-UEAHAMEI.js +5814 -0
- package/node_modules/pi-lens/dist/chunk-UGSMCQ4D.js +327 -0
- package/node_modules/pi-lens/dist/chunk-UOPVJQ4N.js +103 -0
- package/node_modules/pi-lens/dist/chunk-USHG4DLH.js +459 -0
- package/node_modules/pi-lens/dist/chunk-UXVNL3D7.js +23 -0
- package/node_modules/pi-lens/dist/chunk-V5MEBST3.js +4139 -0
- package/node_modules/pi-lens/dist/chunk-VGEVL5EQ.js +29 -0
- package/node_modules/pi-lens/dist/chunk-VPWKF3GN.js +87 -0
- package/node_modules/pi-lens/dist/chunk-VSMJK3ZJ.js +1250 -0
- package/node_modules/pi-lens/dist/chunk-VYKKMYVT.js +560 -0
- package/node_modules/pi-lens/dist/chunk-VZHJS6DR.js +442 -0
- package/node_modules/pi-lens/dist/chunk-WATC3IQR.js +213 -0
- package/node_modules/pi-lens/dist/chunk-WPE5FPGR.js +54 -0
- package/node_modules/pi-lens/dist/chunk-WSEWKCXU.js +188 -0
- package/node_modules/pi-lens/dist/chunk-WW5BLB74.js +659 -0
- package/node_modules/pi-lens/dist/chunk-XGUL4SLQ.js +406 -0
- package/node_modules/pi-lens/dist/chunk-XHSCVSOL.js +170 -0
- package/node_modules/pi-lens/dist/chunk-XIMYZ3JA.js +27 -0
- package/node_modules/pi-lens/dist/chunk-YLN4K6WD.js +385 -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-Z6BB4JLQ.js +478 -0
- package/node_modules/pi-lens/dist/chunk-Z7QQA2KT.js +27 -0
- package/node_modules/pi-lens/dist/chunk-ZETYB3XG.js +2626 -0
- package/node_modules/pi-lens/dist/chunk-ZMOMPX2Z.js +87 -0
- package/node_modules/pi-lens/dist/chunk-ZOEYVXSV.js +149 -0
- package/node_modules/pi-lens/dist/chunk-ZZUFZUQZ.js +12120 -0
- package/node_modules/pi-lens/dist/index.js +39712 -29876
- 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 +22688 -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 +5 -4
- package/node_modules/pi-lens/docs/configuration.md +28 -2
- package/node_modules/pi-lens/docs/custom-rules.md +25 -2
- package/node_modules/pi-lens/docs/environment-variables.md +86 -8
- package/node_modules/pi-lens/docs/features.md +45 -5
- package/node_modules/pi-lens/docs/globalconfig.md +2 -1
- package/node_modules/pi-lens/docs/io-bridge-v2-migration.md +94 -0
- package/node_modules/pi-lens/docs/lsp-capability-matrix.md +37 -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 +160 -88
- package/node_modules/pi-lens/docs/pi-lens-investigator.md +74 -26
- package/node_modules/pi-lens/docs/pi-lens-merge-policy.md +736 -0
- package/node_modules/pi-lens/docs/pi-lens-monitor.md +75 -7
- package/node_modules/pi-lens/docs/pi-lens-retro.md +6 -4
- package/node_modules/pi-lens/docs/pi-lens-reviewer.md +189 -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/schema/pi-lens-config-v1.json +530 -0
- package/node_modules/pi-lens/docs/servercapabilities.md +56 -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/docs/word-index.md +6 -0
- 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/rule-tests/no-identity-operator-on-literals-test.yml +12 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/throw-new-error-js-test.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/throw-new-error-test.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-identity-operator-on-literals.yml +20 -12
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/throw-new-error-js.yml +2 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/throw-new-error.yml +2 -2
- package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +1275 -62
- package/node_modules/pi-lens/scripts/download-grammars.js +5 -0
- package/node_modules/pi-lens/scripts/grammars.lock.json +6 -1
- package/node_modules/pi-lens/scripts/install-selftest.mjs +33 -34
- package/node_modules/pi-lens/scripts/lib/host-provided-deps.mjs +13 -4
- package/node_modules/pi-lens/scripts/lib/web-tree-sitter-dir.mjs +18 -0
- package/node_modules/pi-web-access/CHANGELOG.md +28 -0
- package/node_modules/pi-web-access/README.md +10 -6
- package/node_modules/pi-web-access/ceramic.ts +219 -0
- package/node_modules/pi-web-access/curator-page.ts +3 -1
- package/node_modules/pi-web-access/curator-server.ts +1 -0
- package/node_modules/pi-web-access/dist/index.js +846 -588
- package/node_modules/pi-web-access/dist/mcp-cli.js +725 -516
- package/node_modules/pi-web-access/gemini-search.ts +8 -4
- package/node_modules/pi-web-access/github-extract.ts +34 -2
- package/node_modules/pi-web-access/index.ts +72 -30
- package/node_modules/pi-web-access/openai-search.ts +3 -3
- package/node_modules/pi-web-access/package.json +2 -2
- package/node_modules/pi-web-access/page-query.ts +6 -9
- package/node_modules/pi-web-access/parallel-mcp.ts +2 -0
- package/node_modules/pi-web-access/query-rewrite.ts +2 -2
- package/node_modules/pi-web-access/storage.ts +49 -0
- package/node_modules/pi-web-access/summary-review.ts +7 -6
- package/node_modules/pi-web-access/utils.ts +21 -6
- package/node_modules/pi-web-access/web-tool-core.ts +1 -0
- package/package.json +19 -19
- 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
- package/node_modules/pi-web-access/opencode-session-headers.ts +0 -24
- package/node_modules/remote-pi/README.md +0 -675
- package/node_modules/remote-pi/dist/actions/handlers.d.ts +0 -122
- package/node_modules/remote-pi/dist/actions/handlers.js +0 -160
- package/node_modules/remote-pi/dist/actions/handlers.js.map +0 -1
- package/node_modules/remote-pi/dist/actions/registry.d.ts +0 -39
- package/node_modules/remote-pi/dist/actions/registry.js +0 -58
- package/node_modules/remote-pi/dist/actions/registry.js.map +0 -1
- package/node_modules/remote-pi/dist/bin/supervisord.d.ts +0 -2
- package/node_modules/remote-pi/dist/bin/supervisord.js +0 -86
- package/node_modules/remote-pi/dist/bin/supervisord.js.map +0 -1
- package/node_modules/remote-pi/dist/commands/builtin_mirror.d.ts +0 -58
- package/node_modules/remote-pi/dist/commands/builtin_mirror.js +0 -71
- package/node_modules/remote-pi/dist/commands/builtin_mirror.js.map +0 -1
- package/node_modules/remote-pi/dist/commands/list_commands.d.ts +0 -60
- package/node_modules/remote-pi/dist/commands/list_commands.js +0 -73
- package/node_modules/remote-pi/dist/commands/list_commands.js.map +0 -1
- package/node_modules/remote-pi/dist/config.d.ts +0 -62
- package/node_modules/remote-pi/dist/config.js +0 -115
- package/node_modules/remote-pi/dist/config.js.map +0 -1
- package/node_modules/remote-pi/dist/daemon/client.d.ts +0 -20
- package/node_modules/remote-pi/dist/daemon/client.js +0 -131
- package/node_modules/remote-pi/dist/daemon/client.js.map +0 -1
- package/node_modules/remote-pi/dist/daemon/control_protocol.d.ts +0 -176
- package/node_modules/remote-pi/dist/daemon/control_protocol.js +0 -63
- package/node_modules/remote-pi/dist/daemon/control_protocol.js.map +0 -1
- package/node_modules/remote-pi/dist/daemon/cron_log.d.ts +0 -45
- package/node_modules/remote-pi/dist/daemon/cron_log.js +0 -72
- package/node_modules/remote-pi/dist/daemon/cron_log.js.map +0 -1
- package/node_modules/remote-pi/dist/daemon/cron_registry.d.ts +0 -80
- package/node_modules/remote-pi/dist/daemon/cron_registry.js +0 -194
- package/node_modules/remote-pi/dist/daemon/cron_registry.js.map +0 -1
- package/node_modules/remote-pi/dist/daemon/id.d.ts +0 -24
- package/node_modules/remote-pi/dist/daemon/id.js +0 -36
- package/node_modules/remote-pi/dist/daemon/id.js.map +0 -1
- package/node_modules/remote-pi/dist/daemon/install.d.ts +0 -170
- package/node_modules/remote-pi/dist/daemon/install.js +0 -547
- package/node_modules/remote-pi/dist/daemon/install.js.map +0 -1
- package/node_modules/remote-pi/dist/daemon/registry.d.ts +0 -63
- package/node_modules/remote-pi/dist/daemon/registry.js +0 -153
- package/node_modules/remote-pi/dist/daemon/registry.js.map +0 -1
- package/node_modules/remote-pi/dist/daemon/rpc_child.d.ts +0 -194
- package/node_modules/remote-pi/dist/daemon/rpc_child.js +0 -389
- package/node_modules/remote-pi/dist/daemon/rpc_child.js.map +0 -1
- package/node_modules/remote-pi/dist/daemon/supervisor.d.ts +0 -93
- package/node_modules/remote-pi/dist/daemon/supervisor.js +0 -596
- package/node_modules/remote-pi/dist/daemon/supervisor.js.map +0 -1
- package/node_modules/remote-pi/dist/extension_ui_bridge.d.ts +0 -26
- package/node_modules/remote-pi/dist/extension_ui_bridge.js +0 -341
- package/node_modules/remote-pi/dist/extension_ui_bridge.js.map +0 -1
- package/node_modules/remote-pi/dist/index.d.ts +0 -213
- package/node_modules/remote-pi/dist/index.js +0 -4996
- package/node_modules/remote-pi/dist/index.js.map +0 -1
- package/node_modules/remote-pi/dist/mcp/mesh_result.d.ts +0 -10
- package/node_modules/remote-pi/dist/mcp/mesh_result.js +0 -42
- package/node_modules/remote-pi/dist/mcp/mesh_result.js.map +0 -1
- package/node_modules/remote-pi/dist/mcp/mesh_server.d.ts +0 -16
- package/node_modules/remote-pi/dist/mcp/mesh_server.js +0 -327
- package/node_modules/remote-pi/dist/mcp/mesh_server.js.map +0 -1
- package/node_modules/remote-pi/dist/mesh/canonical.d.ts +0 -30
- package/node_modules/remote-pi/dist/mesh/canonical.js +0 -61
- package/node_modules/remote-pi/dist/mesh/canonical.js.map +0 -1
- package/node_modules/remote-pi/dist/mesh/client.d.ts +0 -18
- package/node_modules/remote-pi/dist/mesh/client.js +0 -125
- package/node_modules/remote-pi/dist/mesh/client.js.map +0 -1
- package/node_modules/remote-pi/dist/mesh/encoding.d.ts +0 -38
- package/node_modules/remote-pi/dist/mesh/encoding.js +0 -216
- package/node_modules/remote-pi/dist/mesh/encoding.js.map +0 -1
- package/node_modules/remote-pi/dist/mesh/self_revoke.d.ts +0 -73
- package/node_modules/remote-pi/dist/mesh/self_revoke.js +0 -401
- package/node_modules/remote-pi/dist/mesh/self_revoke.js.map +0 -1
- package/node_modules/remote-pi/dist/mesh/siblings.d.ts +0 -49
- package/node_modules/remote-pi/dist/mesh/siblings.js +0 -159
- package/node_modules/remote-pi/dist/mesh/siblings.js.map +0 -1
- package/node_modules/remote-pi/dist/mesh/types.d.ts +0 -34
- package/node_modules/remote-pi/dist/mesh/types.js +0 -11
- package/node_modules/remote-pi/dist/mesh/types.js.map +0 -1
- package/node_modules/remote-pi/dist/mesh/verify.d.ts +0 -17
- package/node_modules/remote-pi/dist/mesh/verify.js +0 -86
- package/node_modules/remote-pi/dist/mesh/verify.js.map +0 -1
- package/node_modules/remote-pi/dist/pairing/crypto.d.ts +0 -8
- package/node_modules/remote-pi/dist/pairing/crypto.js +0 -22
- package/node_modules/remote-pi/dist/pairing/crypto.js.map +0 -1
- package/node_modules/remote-pi/dist/pairing/handshake.d.ts +0 -28
- package/node_modules/remote-pi/dist/pairing/handshake.js +0 -113
- package/node_modules/remote-pi/dist/pairing/handshake.js.map +0 -1
- package/node_modules/remote-pi/dist/pairing/noise-sha256.d.ts +0 -16
- package/node_modules/remote-pi/dist/pairing/noise-sha256.js +0 -103
- package/node_modules/remote-pi/dist/pairing/noise-sha256.js.map +0 -1
- package/node_modules/remote-pi/dist/pairing/qr.d.ts +0 -59
- package/node_modules/remote-pi/dist/pairing/qr.js +0 -125
- package/node_modules/remote-pi/dist/pairing/qr.js.map +0 -1
- package/node_modules/remote-pi/dist/pairing/storage.d.ts +0 -120
- package/node_modules/remote-pi/dist/pairing/storage.js +0 -604
- package/node_modules/remote-pi/dist/pairing/storage.js.map +0 -1
- package/node_modules/remote-pi/dist/protocol/codec.d.ts +0 -7
- package/node_modules/remote-pi/dist/protocol/codec.js +0 -49
- package/node_modules/remote-pi/dist/protocol/codec.js.map +0 -1
- package/node_modules/remote-pi/dist/protocol/types.d.ts +0 -393
- package/node_modules/remote-pi/dist/protocol/types.js +0 -2
- package/node_modules/remote-pi/dist/protocol/types.js.map +0 -1
- package/node_modules/remote-pi/dist/rooms.d.ts +0 -29
- package/node_modules/remote-pi/dist/rooms.js +0 -57
- package/node_modules/remote-pi/dist/rooms.js.map +0 -1
- package/node_modules/remote-pi/dist/session/address.d.ts +0 -49
- package/node_modules/remote-pi/dist/session/address.js +0 -58
- package/node_modules/remote-pi/dist/session/address.js.map +0 -1
- package/node_modules/remote-pi/dist/session/agent_bridge.d.ts +0 -55
- package/node_modules/remote-pi/dist/session/agent_bridge.js +0 -146
- package/node_modules/remote-pi/dist/session/agent_bridge.js.map +0 -1
- package/node_modules/remote-pi/dist/session/bridge.d.ts +0 -37
- package/node_modules/remote-pi/dist/session/bridge.js +0 -130
- package/node_modules/remote-pi/dist/session/bridge.js.map +0 -1
- package/node_modules/remote-pi/dist/session/broker.d.ts +0 -189
- package/node_modules/remote-pi/dist/session/broker.js +0 -507
- package/node_modules/remote-pi/dist/session/broker.js.map +0 -1
- package/node_modules/remote-pi/dist/session/broker_remote.d.ts +0 -74
- package/node_modules/remote-pi/dist/session/broker_remote.js +0 -583
- package/node_modules/remote-pi/dist/session/broker_remote.js.map +0 -1
- package/node_modules/remote-pi/dist/session/cwd_lock.d.ts +0 -33
- package/node_modules/remote-pi/dist/session/cwd_lock.js +0 -126
- package/node_modules/remote-pi/dist/session/cwd_lock.js.map +0 -1
- package/node_modules/remote-pi/dist/session/envelope.d.ts +0 -33
- package/node_modules/remote-pi/dist/session/envelope.js +0 -117
- package/node_modules/remote-pi/dist/session/envelope.js.map +0 -1
- package/node_modules/remote-pi/dist/session/global_config.d.ts +0 -33
- package/node_modules/remote-pi/dist/session/global_config.js +0 -73
- package/node_modules/remote-pi/dist/session/global_config.js.map +0 -1
- package/node_modules/remote-pi/dist/session/ipc.d.ts +0 -27
- package/node_modules/remote-pi/dist/session/ipc.js +0 -22
- package/node_modules/remote-pi/dist/session/ipc.js.map +0 -1
- package/node_modules/remote-pi/dist/session/leader_election.d.ts +0 -32
- package/node_modules/remote-pi/dist/session/leader_election.js +0 -106
- package/node_modules/remote-pi/dist/session/leader_election.js.map +0 -1
- package/node_modules/remote-pi/dist/session/local_config.d.ts +0 -55
- package/node_modules/remote-pi/dist/session/local_config.js +0 -157
- package/node_modules/remote-pi/dist/session/local_config.js.map +0 -1
- package/node_modules/remote-pi/dist/session/mesh_message.d.ts +0 -20
- package/node_modules/remote-pi/dist/session/mesh_message.js +0 -28
- package/node_modules/remote-pi/dist/session/mesh_message.js.map +0 -1
- package/node_modules/remote-pi/dist/session/mesh_node.d.ts +0 -116
- package/node_modules/remote-pi/dist/session/mesh_node.js +0 -573
- package/node_modules/remote-pi/dist/session/mesh_node.js.map +0 -1
- package/node_modules/remote-pi/dist/session/peer.d.ts +0 -139
- package/node_modules/remote-pi/dist/session/peer.js +0 -451
- package/node_modules/remote-pi/dist/session/peer.js.map +0 -1
- package/node_modules/remote-pi/dist/session/peer_inventory.d.ts +0 -13
- package/node_modules/remote-pi/dist/session/peer_inventory.js +0 -48
- package/node_modules/remote-pi/dist/session/peer_inventory.js.map +0 -1
- package/node_modules/remote-pi/dist/session/peer_limits.d.ts +0 -9
- package/node_modules/remote-pi/dist/session/peer_limits.js +0 -21
- package/node_modules/remote-pi/dist/session/peer_limits.js.map +0 -1
- package/node_modules/remote-pi/dist/session/setup_wizard.d.ts +0 -39
- package/node_modules/remote-pi/dist/session/setup_wizard.js +0 -63
- package/node_modules/remote-pi/dist/session/setup_wizard.js.map +0 -1
- package/node_modules/remote-pi/dist/session/tool_gate.d.ts +0 -5
- package/node_modules/remote-pi/dist/session/tool_gate.js +0 -11
- package/node_modules/remote-pi/dist/session/tool_gate.js.map +0 -1
- package/node_modules/remote-pi/dist/session/tools.d.ts +0 -24
- package/node_modules/remote-pi/dist/session/tools.js +0 -252
- package/node_modules/remote-pi/dist/session/tools.js.map +0 -1
- package/node_modules/remote-pi/dist/session/wizard.d.ts +0 -13
- package/node_modules/remote-pi/dist/session/wizard.js +0 -20
- package/node_modules/remote-pi/dist/session/wizard.js.map +0 -1
- package/node_modules/remote-pi/dist/settings.d.ts +0 -15
- package/node_modules/remote-pi/dist/settings.js +0 -52
- package/node_modules/remote-pi/dist/settings.js.map +0 -1
- package/node_modules/remote-pi/dist/transport/peer_channel.d.ts +0 -37
- package/node_modules/remote-pi/dist/transport/peer_channel.js +0 -98
- package/node_modules/remote-pi/dist/transport/peer_channel.js.map +0 -1
- package/node_modules/remote-pi/dist/transport/pi_forward_client.d.ts +0 -29
- package/node_modules/remote-pi/dist/transport/pi_forward_client.js +0 -62
- package/node_modules/remote-pi/dist/transport/pi_forward_client.js.map +0 -1
- package/node_modules/remote-pi/dist/transport/relay_client.d.ts +0 -91
- package/node_modules/remote-pi/dist/transport/relay_client.js +0 -206
- package/node_modules/remote-pi/dist/transport/relay_client.js.map +0 -1
- package/node_modules/remote-pi/dist/ui/footer.d.ts +0 -32
- package/node_modules/remote-pi/dist/ui/footer.js +0 -34
- package/node_modules/remote-pi/dist/ui/footer.js.map +0 -1
- package/node_modules/remote-pi/docs/daemon.md +0 -289
- package/node_modules/remote-pi/package.json +0 -92
- package/node_modules/remote-pi/service-templates/launchd.plist.template +0 -35
- package/node_modules/remote-pi/service-templates/systemd.service.template +0 -19
- package/node_modules/remote-pi/service-templates/task-launcher.vbs.template +0 -10
- package/node_modules/remote-pi/service-templates/task-scheduler.xml.template +0 -38
- package/node_modules/remote-pi/skills/agent-network/SKILL.md +0 -310
|
@@ -1,1295 +0,0 @@
|
|
|
1
|
-
import * as nodeFs from "node:fs";
|
|
2
|
-
import * as path from "node:path";
|
|
3
|
-
import { loadBootstrapClients, requestBootstrapClients } from "./bootstrap.js";
|
|
4
|
-
import { recordDegradationOnce } from "./degradation-ledger.js";
|
|
5
|
-
import { detectFileKind } from "./file-kinds.js";
|
|
6
|
-
import { isPathIgnoredByProject } from "./file-utils.js";
|
|
7
|
-
import { evaluateGitGuard, isGitCommitOrPushAttempt } from "./git-guard.js";
|
|
8
|
-
import { dropHashlineAnchorMemo } from "./hashline-anchor.js";
|
|
9
|
-
import { evaluateSharedCheckoutGuard } from "./shared-checkout-guard.js";
|
|
10
|
-
import { logLatency } from "./latency-logger.js";
|
|
11
|
-
import { normalizeMapKey, toPosix } from "./path-utils.js";
|
|
12
|
-
import { captureFileStats, getOpaqueBaselineStore, isGitWorktree, } from "./opaque-mutation-scan.js";
|
|
13
|
-
import { normalizeForGuardMatch } from "./host-edit-normalize.js";
|
|
14
|
-
import { retargetReplacementIndentation } from "./indent-retarget.js";
|
|
15
|
-
import { LANGUAGE_POLICY } from "./language-policy.js";
|
|
16
|
-
import { isComplexitySupportedFile } from "./tree-sitter-shared.js";
|
|
17
|
-
import { classifyMutatingTool, readMutationPathField, } from "./mutating-tool.js";
|
|
18
|
-
import { isProvisionalLearnedAttribution } from "./mutation-attribution.js";
|
|
19
|
-
import { armObservedMutation } from "./observed-mutation.js";
|
|
20
|
-
import { getLSPService } from "./lsp/index.js";
|
|
21
|
-
import { findDocumentSymbolAtLine, getOpenDocumentSymbols, lspSymbolKindName, qualifiedLspSymbolName, } from "./lsp-document-symbols.js";
|
|
22
|
-
import { computeTrailingWhitespaceOldTextPatch, findUniqueMatchLineRange, } from "./oldtext-autopatch.js";
|
|
23
|
-
import { applyPartiallyApplicableEdits } from "./partial-edit-apply.js";
|
|
24
|
-
import { isExternalOrVendorFile, resolveHostPathVariants, resolveHostToolPath, } from "./path-utils.js";
|
|
25
|
-
import { EXPANSION_BUDGET_MS, EXPANSION_LIMIT_LINES, tryExpandRead, } from "./read-expansion.js";
|
|
26
|
-
import { boundedIndexesForCount, createReadGuardEditBatchSummary, getReadGuardCorrelationId, logReadGuardEvent, } from "./read-guard-logger.js";
|
|
27
|
-
import { countFileLines, formatAlreadyAppliedNotes, getTouchedLinesForGuard, relocateEditRange, tryCorrectIndentationMismatch, tryCorrectIndentationMismatchFromContent, } from "./read-guard-tool-lines.js";
|
|
28
|
-
import { handleToolResult } from "./runtime-tool-result.js";
|
|
29
|
-
import { resolveToolCallCorrelationId } from "./tool-event.js";
|
|
30
|
-
import { getSharedTreeSitterClient } from "./tree-sitter-shared.js";
|
|
31
|
-
const LSP_TOOLCALL_NAV_TOUCH_BUDGET_MS = Math.max(0, Number.parseInt(process.env.PI_LENS_TOOLCALL_NAV_TOUCH_MS ??
|
|
32
|
-
process.env.PI_LENS_LSP_NAV_CLIENT_WAIT_MS ??
|
|
33
|
-
"1500", 10) || 1500);
|
|
34
|
-
const LSP_TOOLCALL_TOUCH_BUDGET_MS = Math.max(0, Number.parseInt(process.env.PI_LENS_TOOLCALL_TOUCH_MS ?? "750", 10) || 750);
|
|
35
|
-
/**
|
|
36
|
-
* Composes the final block reason for a partial apply whose commit landed
|
|
37
|
-
* (#2402). The committed bytes lead the message; the preflight's per-edit
|
|
38
|
-
* failure bodies follow UNCHANGED, so they still describe exactly the edits
|
|
39
|
-
* that were NOT applied. The preflight header (🔄/🛑) is never reused here —
|
|
40
|
-
* relabelling committed edits as a retryable oldText miss is the #2402 defect.
|
|
41
|
-
*/
|
|
42
|
-
function composePartialApplyReason(args) {
|
|
43
|
-
const parts = [];
|
|
44
|
-
const editSuffix = args.appliedCount === 1 ? "" : "s";
|
|
45
|
-
parts.push(args.postEditStatus === "failed"
|
|
46
|
-
? `⚠️ PARTIAL APPLY — ${args.appliedCount} edit${editSuffix} committed (${args.appliedIndices}). Post-edit analysis failed after the commit; the committed bytes stand and were not reverted. Do NOT resubmit the applied edits.`
|
|
47
|
-
: `⚠️ PARTIAL APPLY — ${args.appliedCount} edit${editSuffix} committed (${args.appliedIndices}). Do NOT resubmit the applied edits.`);
|
|
48
|
-
if (args.preflightDetails && args.preflightDetails.length > 0) {
|
|
49
|
-
parts.push(args.preflightDetails.join("\n\n"));
|
|
50
|
-
}
|
|
51
|
-
const alreadyNotes = formatAlreadyAppliedNotes(args.alreadyAppliedEdits);
|
|
52
|
-
if (alreadyNotes)
|
|
53
|
-
parts.push(alreadyNotes.trimStart());
|
|
54
|
-
if (args.postEditOutput && args.postEditStatus === "succeeded") {
|
|
55
|
-
parts.push(`Post-apply analysis:\n${args.postEditOutput}`);
|
|
56
|
-
}
|
|
57
|
-
return parts.join("\n\n");
|
|
58
|
-
}
|
|
59
|
-
function getToolCallRawFilePath(toolName, event) {
|
|
60
|
-
const inputObj = (event.input ?? {});
|
|
61
|
-
// #2423: the seam owns "does this tool target a file it mutates". No ctx is
|
|
62
|
-
// passed — the path is not resolved yet, so adapters must not log here.
|
|
63
|
-
const mutation = classifyMutatingTool({ ...event, toolName });
|
|
64
|
-
if (mutation)
|
|
65
|
-
return mutation.path;
|
|
66
|
-
if (toolName === "read") {
|
|
67
|
-
if (typeof inputObj.path === "string")
|
|
68
|
-
return inputObj.path;
|
|
69
|
-
if (typeof inputObj.filePath === "string")
|
|
70
|
-
return inputObj.filePath;
|
|
71
|
-
return undefined;
|
|
72
|
-
}
|
|
73
|
-
if (toolName === "lsp_navigation") {
|
|
74
|
-
return typeof inputObj.filePath === "string"
|
|
75
|
-
? inputObj.filePath
|
|
76
|
-
: undefined;
|
|
77
|
-
}
|
|
78
|
-
return undefined;
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Resolve a tool_call's raw path to the file pi will actually touch.
|
|
82
|
-
*
|
|
83
|
-
* The `cwd` basis is the host `ctx.cwd`, which for the pinned host IS the same
|
|
84
|
-
* value the tools were constructed with — `AgentSession` passes its one `_cwd`
|
|
85
|
-
* to both `createAllToolDefinitions`
|
|
86
|
-
* (`@earendil-works/pi-coding-agent/dist/core/agent-session.js:2026`, source
|
|
87
|
-
* `src/core/tools/index.ts:99-124`) and the `ExtensionRunner` behind `ctx.cwd`
|
|
88
|
-
* (`dist/core/agent-session.js:2037`; `runner.js:154`, `:476-479`). Neither is
|
|
89
|
-
* reassigned after construction, so there is no drift TODAY (#1655 item 4).
|
|
90
|
-
* `tests/clients/pi-host-contract.test.ts` pins that, because the day a host
|
|
91
|
-
* lets one move independently, every path here silently retargets.
|
|
92
|
-
*
|
|
93
|
-
* The path is produced the way pi produces it, in pi's two stages (#1655 item
|
|
94
|
-
* 5, plus review F1):
|
|
95
|
-
*
|
|
96
|
-
* 1. `resolveHostToolPath` mirrors pi's BASE resolution, `resolveToCwd`
|
|
97
|
-
* (`dist/core/tools/path-utils.js:42-44`, source
|
|
98
|
-
* `src/core/tools/path-utils.ts:~44-46`) — unicode-space folding, `@`
|
|
99
|
-
* prefix stripping, `~` expansion, `file://` conversion, and Git-Bash
|
|
100
|
-
* drive paths, all BEFORE anything is probed.
|
|
101
|
-
* 2. `resolveHostPathVariants` mirrors pi's fallback LADDER
|
|
102
|
-
* (`dist/core/tools/path-utils.js:45-70`, source
|
|
103
|
-
* `src/core/tools/path-utils.ts:52-83`).
|
|
104
|
-
*
|
|
105
|
-
* Stage 1 was missing in the first cut of this fix, and the ladder cannot
|
|
106
|
-
* stand in for it: an `@`-prefixed path, a `file://` URL, or a non-breaking
|
|
107
|
-
* space are all resolved by pi at stage 1 and are untouched by any of the four
|
|
108
|
-
* stage-2 candidates. A plain `path.resolve` therefore produced a path pi
|
|
109
|
-
* never opens, and the miss looked identical to "file genuinely absent".
|
|
110
|
-
*/
|
|
111
|
-
function resolveToolCallFilePath(rawFilePath, cwd, projectRoot) {
|
|
112
|
-
if (!rawFilePath)
|
|
113
|
-
return undefined;
|
|
114
|
-
return resolveHostPathVariants(resolveHostToolPath(rawFilePath, cwd ?? projectRoot));
|
|
115
|
-
}
|
|
116
|
-
function getReadToolInput(toolName, input) {
|
|
117
|
-
if (toolName !== "read")
|
|
118
|
-
return undefined;
|
|
119
|
-
return input;
|
|
120
|
-
}
|
|
121
|
-
function getEffectiveReadLimit(filePath, readInput) {
|
|
122
|
-
if (!filePath || !readInput)
|
|
123
|
-
return undefined;
|
|
124
|
-
const requestedOffset = readInput.offset ?? 1;
|
|
125
|
-
const requestedLimit = readInput.limit;
|
|
126
|
-
return (requestedLimit ??
|
|
127
|
-
Math.max(1, countFileLines(filePath) - requestedOffset + 1));
|
|
128
|
-
}
|
|
129
|
-
function isLspCapableFile(filePath) {
|
|
130
|
-
const kind = detectFileKind(filePath);
|
|
131
|
-
if (!kind)
|
|
132
|
-
return false;
|
|
133
|
-
return LANGUAGE_POLICY[kind]?.lspCapable !== false;
|
|
134
|
-
}
|
|
135
|
-
function shouldSkipLspAutoTouch(filePath, projectRoot) {
|
|
136
|
-
// #1193 P3: the separator fold is `toPosix`, not a fourth inline copy of
|
|
137
|
-
// `.replace(/\\/g, "/")`. The `toLowerCase` stays and is NOT a path-key case
|
|
138
|
-
// fold: `normalized` is never a map key, only the haystack for the
|
|
139
|
-
// lowercase marker substrings below, which must match a mis-cased spelling
|
|
140
|
-
// of the same marker directory on a case-insensitive filesystem.
|
|
141
|
-
const normalized = toPosix(path.resolve(filePath)).toLowerCase();
|
|
142
|
-
const base = path.basename(filePath).toLowerCase();
|
|
143
|
-
if (normalized.includes("/.pi-lens/"))
|
|
144
|
-
return true;
|
|
145
|
-
if (normalized.includes("/.harness/"))
|
|
146
|
-
return true;
|
|
147
|
-
if (isExternalOrVendorFile(filePath, projectRoot))
|
|
148
|
-
return true;
|
|
149
|
-
if (base === "stdout.jsonl" ||
|
|
150
|
-
base === "stderr.txt" ||
|
|
151
|
-
base === "prompt.txt") {
|
|
152
|
-
return true;
|
|
153
|
-
}
|
|
154
|
-
if (base === "case.json" && normalized.includes("/cases/")) {
|
|
155
|
-
return true;
|
|
156
|
-
}
|
|
157
|
-
return false;
|
|
158
|
-
}
|
|
159
|
-
// Kept in lockstep with the gate's normalizeContent + oldtext-autopatch's
|
|
160
|
-
// normalizeOldTextForMatch: the host edit tool's full fuzzy-match space, so the
|
|
161
|
-
// autopatch passes count/locate oldText exactly where the host applies it (#257).
|
|
162
|
-
function normalizeOldTextForMatch(text) {
|
|
163
|
-
return normalizeForGuardMatch(text);
|
|
164
|
-
}
|
|
165
|
-
function countTextOccurrences(haystack, needle) {
|
|
166
|
-
if (!needle)
|
|
167
|
-
return 0;
|
|
168
|
-
let count = 0;
|
|
169
|
-
let pos = 0;
|
|
170
|
-
while (pos < haystack.length) {
|
|
171
|
-
const idx = haystack.indexOf(needle, pos);
|
|
172
|
-
if (idx === -1)
|
|
173
|
-
break;
|
|
174
|
-
count += 1;
|
|
175
|
-
pos = idx + needle.length;
|
|
176
|
-
}
|
|
177
|
-
return count;
|
|
178
|
-
}
|
|
179
|
-
function countOldTextMatches(filePath, oldText, cachedNormalizedContent) {
|
|
180
|
-
try {
|
|
181
|
-
const content = cachedNormalizedContent ??
|
|
182
|
-
normalizeOldTextForMatch(nodeFs.readFileSync(filePath, "utf-8"));
|
|
183
|
-
return countTextOccurrences(content, normalizeOldTextForMatch(oldText));
|
|
184
|
-
}
|
|
185
|
-
catch {
|
|
186
|
-
return 0;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
function isIndentationOnlyChange(before, after) {
|
|
190
|
-
const beforeLines = before.replace(/\r\n/g, "\n").split("\n");
|
|
191
|
-
const afterLines = after.replace(/\r\n/g, "\n").split("\n");
|
|
192
|
-
if (beforeLines.length !== afterLines.length)
|
|
193
|
-
return false;
|
|
194
|
-
// Strip both leading and trailing whitespace: consistent with
|
|
195
|
-
// findIndentationInsensitiveCandidate which matches via .trimEnd(), so a
|
|
196
|
-
// candidate that differs only in trailing whitespace is still indentation-only.
|
|
197
|
-
return beforeLines.every((line, index) => line.trim() === afterLines[index].trim());
|
|
198
|
-
}
|
|
199
|
-
function getNewContentFromToolCall(event) {
|
|
200
|
-
const mutation = classifyMutatingTool(event);
|
|
201
|
-
if (mutation?.kind === "write") {
|
|
202
|
-
return event.input
|
|
203
|
-
.content;
|
|
204
|
-
}
|
|
205
|
-
if (mutation?.kind === "edit") {
|
|
206
|
-
const edits = event.input.edits;
|
|
207
|
-
return edits?.map((edit) => edit.newText ?? "").join("\n");
|
|
208
|
-
}
|
|
209
|
-
return undefined;
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Total guard around the `tool_call` handler body (#1655 item 1).
|
|
213
|
-
*
|
|
214
|
-
* `tool_call` is the ONE pi emit path with no per-handler `try`/`catch`. Every
|
|
215
|
-
* sibling wraps each handler and routes a throw to `emitError`
|
|
216
|
-
* (`emitToolResult` at
|
|
217
|
-
* `@earendil-works/pi-coding-agent/dist/core/extensions/runner.js:649-707`,
|
|
218
|
-
* source `src/core/extensions/runner.ts:877-930`; the generic `emit` at
|
|
219
|
-
* source `runner.ts:801-832`). `emitToolCall`
|
|
220
|
-
* (`dist/core/extensions/runner.js:701-717`, source `runner.ts:932-953`) calls
|
|
221
|
-
* `await handler(event, ctx)` bare, and its caller
|
|
222
|
-
* `AgentSession._installAgentToolHooks`'s `beforeToolCall`
|
|
223
|
-
* (`dist/core/agent-session.js:229-241`, source `agent-session.ts:~228-242`)
|
|
224
|
-
* rethrows: `throw new Error("Extension failed, blocking execution: ...")`.
|
|
225
|
-
*
|
|
226
|
-
* So an unguarded throw anywhere in pi-lens's `tool_call` handler does not
|
|
227
|
-
* degrade pi-lens — it BLOCKS the user's tool call outright. Advisory
|
|
228
|
-
* instrumentation must never be able to do that. Every failure degrades to
|
|
229
|
-
* "pi-lens did nothing for this call" (`undefined`, which pi reads as
|
|
230
|
-
* "no extension opinion") and lands one ledger entry per tool name.
|
|
231
|
-
*
|
|
232
|
-
* Returning `undefined` on a throw is deliberate: a partially-executed handler
|
|
233
|
-
* cannot have earned a `{ block: true }` verdict, and inventing one would turn
|
|
234
|
-
* a pi-lens bug into a refused user tool call — the exact outcome this guard
|
|
235
|
-
* exists to prevent.
|
|
236
|
-
*
|
|
237
|
-
* #1642 F2 (inside the guard): a BLOCKED call (git-guard, read-guard
|
|
238
|
-
* preflight, the duplicate-export check) never gets a paired `tool_result` —
|
|
239
|
-
* the host never lets the tool execute. Any path attribution recorded for it
|
|
240
|
-
* below would otherwise sit in the correlation cache forever (bounded by its
|
|
241
|
-
* LRU cap, but pure garbage that can crowd out a live in-flight record under
|
|
242
|
-
* enough blocked-edit volume — a reviewer-reproduced leak). Clear it eagerly
|
|
243
|
-
* on the way out whenever the call was blocked; a no-op if nothing was
|
|
244
|
-
* recorded (a gitignored SKIP is not a block, so it is unaffected). This
|
|
245
|
-
* cleanup runs INSIDE the try, so a throw out of it is absorbed too.
|
|
246
|
-
*/
|
|
247
|
-
export async function handleToolCall(deps) {
|
|
248
|
-
try {
|
|
249
|
-
const result = await handleToolCallImpl(deps);
|
|
250
|
-
if (result && result.block) {
|
|
251
|
-
// Review F2 — this cleanup gets its OWN catch, and it is not optional
|
|
252
|
-
// tidiness. By the time it runs, `result` is a FINAL `{ block: true }`
|
|
253
|
-
// verdict: the read guard has already refused an edit-without-read, or
|
|
254
|
-
// the git guard has already refused a commit. Letting a throw out of
|
|
255
|
-
// bookkeeping reach the outer catch would convert that verdict into
|
|
256
|
-
// `undefined` — "pi-lens has no opinion" — and the refused edit would
|
|
257
|
-
// execute. A guard that fails OPEN because its telemetry broke is
|
|
258
|
-
// worse than no guard, so the verdict is returned regardless of what
|
|
259
|
-
// the cleanup does.
|
|
260
|
-
try {
|
|
261
|
-
const toolCallId = resolveToolCallCorrelationId(deps.event);
|
|
262
|
-
if (toolCallId !== undefined) {
|
|
263
|
-
deps.runtime.takeToolCallAttribution(toolCallId);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
catch (cleanupError) {
|
|
267
|
-
const reason = cleanupError instanceof Error
|
|
268
|
-
? cleanupError.message
|
|
269
|
-
: String(cleanupError);
|
|
270
|
-
recordDegradationOnce({
|
|
271
|
-
kind: "tool-call-handler-throw",
|
|
272
|
-
subject: `attribution-cleanup:${deps.event?.toolName ?? "unknown"}`,
|
|
273
|
-
reason,
|
|
274
|
-
});
|
|
275
|
-
try {
|
|
276
|
-
deps.dbg?.(`tool_call blocked-attribution cleanup threw (block verdict preserved): ${reason}`);
|
|
277
|
-
}
|
|
278
|
-
catch {
|
|
279
|
-
// A broken `dbg` must not resurrect the throw just absorbed.
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
return result;
|
|
284
|
-
}
|
|
285
|
-
catch (error) {
|
|
286
|
-
const toolName = deps.event?.toolName ?? "unknown";
|
|
287
|
-
const reason = error instanceof Error ? error.message : String(error);
|
|
288
|
-
// Once per tool name per session: a wedged handler fires on every call of
|
|
289
|
-
// that tool, and the ledger is a health surface, not a log.
|
|
290
|
-
recordDegradationOnce({
|
|
291
|
-
kind: "tool-call-handler-throw",
|
|
292
|
-
subject: toolName,
|
|
293
|
-
reason,
|
|
294
|
-
});
|
|
295
|
-
try {
|
|
296
|
-
deps.dbg?.(`tool_call handler threw for ${toolName} (degraded, not blocking): ${reason}`);
|
|
297
|
-
if (error instanceof Error && error.stack) {
|
|
298
|
-
deps.dbg?.(`tool_call handler stack: ${error.stack}`);
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
catch {
|
|
302
|
-
// A broken `dbg` must not resurrect the throw this guard just absorbed.
|
|
303
|
-
}
|
|
304
|
-
// Any attribution already recorded is deliberately LEFT in place: the
|
|
305
|
-
// tool now executes (this returns "no opinion"), so its paired
|
|
306
|
-
// `tool_result` still arrives and claims the record exactly once.
|
|
307
|
-
return undefined;
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
async function handleToolCallImpl(deps) {
|
|
311
|
-
const { event, ctx, lensEnabled, getFlag, dbg, runtime, cacheManager, ensureLSPConfigInitialized, updateLspStatus, resetLSPService, getTreeSitterClient = getSharedTreeSitterClient, } = deps;
|
|
312
|
-
// #2423 review round 4, finding F5: the hashline anchor memo is keyed by
|
|
313
|
-
// mtime+size, which a same-size rewrite inside one mtime tick cannot
|
|
314
|
-
// distinguish from stale content. It only ever needs to survive the
|
|
315
|
-
// several `classifyMutatingTool` asks WITHIN this one tool_call, so drop
|
|
316
|
-
// it here at the boundary rather than trusting mtime+size across calls.
|
|
317
|
-
dropHashlineAnchorMemo();
|
|
318
|
-
const readGuardCorrelationId = getReadGuardCorrelationId(event);
|
|
319
|
-
let filePath;
|
|
320
|
-
const logToolReadGuardEvent = (entry) => logReadGuardEvent({ ...entry, correlationId: readGuardCorrelationId });
|
|
321
|
-
const toolName = event.toolName ?? "";
|
|
322
|
-
// #2423: one classification per tool_call, reused by every branch below that
|
|
323
|
-
// used to compare `toolName` to the `"write"` / `"edit"` literals. No ctx —
|
|
324
|
-
// `filePath` is not resolved yet, and adapters stay silent without one.
|
|
325
|
-
const mutation = classifyMutatingTool(event);
|
|
326
|
-
const editInputForTelemetry = event.input;
|
|
327
|
-
// #1655 item 3: SNAPSHOT the requested batch width here, at handler entry.
|
|
328
|
-
// `input` is a live, mutable, extension-ordered object — pi types it
|
|
329
|
-
// `Record<string, unknown>` and hands the SAME reference to every handler in
|
|
330
|
-
// turn (`@earendil-works/pi-coding-agent/dist/core/extensions/runner.js:701-716`
|
|
331
|
-
// passes `event` unchanged through the loop; source
|
|
332
|
-
// `src/core/extensions/types.ts:914-919`), and pi-lens itself rewrites it in
|
|
333
|
-
// place further down (indent correction, hashline resolution, range
|
|
334
|
-
// relocation). `requestedEditIndexes` was already a snapshot; the totals
|
|
335
|
-
// below used to RE-READ `editInputForTelemetry.edits.length` from the live
|
|
336
|
-
// object hundreds of lines and several `await`s later, so a batch that
|
|
337
|
-
// changed width in between produced an internally inconsistent summary —
|
|
338
|
-
// indexes from the call-time array, totals from the mutated one.
|
|
339
|
-
const requestedEditIndexes = mutation?.kind === "write"
|
|
340
|
-
? [0]
|
|
341
|
-
: Array.isArray(editInputForTelemetry?.edits)
|
|
342
|
-
? boundedIndexesForCount(editInputForTelemetry.edits.length)
|
|
343
|
-
: [0];
|
|
344
|
-
const requestedEditTotal = mutation?.kind === "write"
|
|
345
|
-
? 1
|
|
346
|
-
: Array.isArray(editInputForTelemetry?.edits)
|
|
347
|
-
? editInputForTelemetry.edits.length
|
|
348
|
-
: 1;
|
|
349
|
-
const logBlockedEditSummary = (source) => logToolReadGuardEvent({
|
|
350
|
-
event: "edit_batch_summary",
|
|
351
|
-
filePath: filePath ?? "",
|
|
352
|
-
metadata: {
|
|
353
|
-
tool: toolName,
|
|
354
|
-
source,
|
|
355
|
-
editBatchSummary: createReadGuardEditBatchSummary({
|
|
356
|
-
requestedIndexes: requestedEditIndexes,
|
|
357
|
-
requestedTotal: requestedEditTotal,
|
|
358
|
-
rejectedReasons: requestedEditIndexes.map((index) => ({
|
|
359
|
-
index,
|
|
360
|
-
code: "preflight_blocked",
|
|
361
|
-
})),
|
|
362
|
-
rejectedTotal: requestedEditTotal,
|
|
363
|
-
terminalStatus: "blocked",
|
|
364
|
-
}),
|
|
365
|
-
},
|
|
366
|
-
});
|
|
367
|
-
if (!lensEnabled)
|
|
368
|
-
return;
|
|
369
|
-
// #2000 phase 2: opaque-command pre-snapshot. A bash command whose writes
|
|
370
|
-
// the extractor will not recognize gets a bounded stat snapshot of the
|
|
371
|
-
// project source universe BEFORE it runs; the tool_result side diffs it.
|
|
372
|
-
// Fire-and-forget capture is WRONG here (the child may finish first), but
|
|
373
|
-
// the capture is stat-only and budgeted, so awaiting it is bounded work on
|
|
374
|
-
// an already-second-scale bash path.
|
|
375
|
-
if (toolName === "bash") {
|
|
376
|
-
const commandInput = event.input;
|
|
377
|
-
if (typeof commandInput?.command === "string" && commandInput.command) {
|
|
378
|
-
const scanRoot = ctx.cwd ?? runtime.projectRoot;
|
|
379
|
-
if (scanRoot) {
|
|
380
|
-
const started = Date.now();
|
|
381
|
-
const rootKey = `${normalizeMapKey(path.resolve(scanRoot))}:${runtime.sessionGeneration}`;
|
|
382
|
-
let baseline;
|
|
383
|
-
let resultNote;
|
|
384
|
-
if (await isGitWorktree(scanRoot)) {
|
|
385
|
-
// Git-first: the timestamp IS the baseline; git answers what
|
|
386
|
-
// changed, at any repo size, with no file-universe cap.
|
|
387
|
-
baseline = { startedAt: started, strategy: "git" };
|
|
388
|
-
resultNote = "git";
|
|
389
|
-
}
|
|
390
|
-
else {
|
|
391
|
-
const outcome = await captureFileStats(scanRoot, {
|
|
392
|
-
withHashes: true,
|
|
393
|
-
});
|
|
394
|
-
baseline = outcome.snapshot
|
|
395
|
-
? {
|
|
396
|
-
startedAt: started,
|
|
397
|
-
strategy: "stat-diff",
|
|
398
|
-
stats: outcome.snapshot,
|
|
399
|
-
}
|
|
400
|
-
: {
|
|
401
|
-
startedAt: started,
|
|
402
|
-
strategy: "stat-diff",
|
|
403
|
-
statsUnknownReason: outcome.unknownReason ?? "walk-failed",
|
|
404
|
-
};
|
|
405
|
-
resultNote =
|
|
406
|
-
outcome.unknownReason ?? `scanned:${outcome.scannedCount}`;
|
|
407
|
-
}
|
|
408
|
-
// Session-stamped key: a concurrent-secondary session (#473)
|
|
409
|
-
// replacing this slot must yield a no-pending-snapshot UNKNOWN
|
|
410
|
-
// for us - never a diff against another session's baseline.
|
|
411
|
-
getOpaqueBaselineStore().record(rootKey, baseline);
|
|
412
|
-
logLatency({
|
|
413
|
-
type: "phase",
|
|
414
|
-
phase: "opaque_mutation_prescan",
|
|
415
|
-
filePath: commandInput.command.slice(0, 80),
|
|
416
|
-
durationMs: Date.now() - started,
|
|
417
|
-
result: resultNote,
|
|
418
|
-
});
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
// #2430: the observational net. A call the seam could NOT classify, whose
|
|
423
|
-
// input still names a file, gets a bounded pre-snapshot so the tool_result
|
|
424
|
-
// side can see whether it actually wrote anything. `bash` is excluded
|
|
425
|
-
// because it already has its own (wider, git-first) baseline above, and a
|
|
426
|
-
// classified mutation never reaches here at all — that is what keeps the
|
|
427
|
-
// cost of a plain write/edit at zero.
|
|
428
|
-
//
|
|
429
|
-
// `isProvisionalLearnedAttribution` is the ONE exception (#2449 review round
|
|
430
|
-
// 2, F2): a tool attributed from a single observation IS classified from
|
|
431
|
-
// here on, but its attribution has not earned persistence yet, and the only
|
|
432
|
-
// thing that can earn it is a second real disk diff. Without this clause the
|
|
433
|
-
// tool is classified on call two and never observed again, so
|
|
434
|
-
// `PERSIST_AFTER_OBSERVATIONS = 2` is unreachable and nothing is ever
|
|
435
|
-
// written to disk for the next session to learn from.
|
|
436
|
-
//
|
|
437
|
-
// The eligibility check inside `armObservedMutation` is a map lookup, so an
|
|
438
|
-
// ineligible tool (durably attributed, or twice observed clean) pays that
|
|
439
|
-
// and nothing else. The universe is the TARGET PATH alone, so an armed call
|
|
440
|
-
// costs one stat plus one hash of the file it named — not a directory walk.
|
|
441
|
-
if ((mutation === undefined || isProvisionalLearnedAttribution(toolName)) &&
|
|
442
|
-
toolName !== "bash" &&
|
|
443
|
-
!getFlag("no-read-guard")) {
|
|
444
|
-
const observedRawPath = readMutationPathField(event);
|
|
445
|
-
const observedPath = observedRawPath
|
|
446
|
-
? resolveToolCallFilePath(observedRawPath, ctx.cwd, runtime.projectRoot)
|
|
447
|
-
?.path
|
|
448
|
-
: undefined;
|
|
449
|
-
if (observedPath) {
|
|
450
|
-
await armObservedMutation({
|
|
451
|
-
toolCallId: resolveToolCallCorrelationId(event),
|
|
452
|
-
toolName,
|
|
453
|
-
targetPath: observedPath,
|
|
454
|
-
cwd: ctx.cwd ?? runtime.projectRoot,
|
|
455
|
-
sessionGeneration: runtime.sessionGeneration,
|
|
456
|
-
turnIndex: runtime.turnIndex,
|
|
457
|
-
signal: ctx.signal,
|
|
458
|
-
dbg,
|
|
459
|
-
});
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
if (getFlag("lens-guard") &&
|
|
463
|
-
isGitCommitOrPushAttempt(toolName, event.input)) {
|
|
464
|
-
const guard = evaluateGitGuard(runtime, cacheManager, ctx.cwd ?? runtime.projectRoot, ctx.host ?? "pi");
|
|
465
|
-
if (guard.block) {
|
|
466
|
-
return {
|
|
467
|
-
block: true,
|
|
468
|
-
reason: guard.reason,
|
|
469
|
-
};
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
// #2007: a sibling session's branch switch destroys uncommitted work in a
|
|
473
|
-
// shared checkout. Independent of `lens-guard`: that gate is about blocker
|
|
474
|
-
// hygiene before a commit, this one is about not deleting a peer's WIP.
|
|
475
|
-
// The evaluator short-circuits on a pure string classification, so a
|
|
476
|
-
// non-git bash command pays no I/O here.
|
|
477
|
-
if (getFlag("lens-checkout-guard")) {
|
|
478
|
-
const sharedCheckout = await evaluateSharedCheckoutGuard(toolName, event.input, ctx.cwd ?? runtime.projectRoot ?? process.cwd());
|
|
479
|
-
if (sharedCheckout.block) {
|
|
480
|
-
return {
|
|
481
|
-
block: true,
|
|
482
|
-
reason: sharedCheckout.reason,
|
|
483
|
-
};
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
const rawFilePath = getToolCallRawFilePath(toolName, event);
|
|
487
|
-
const pathResolution = resolveToolCallFilePath(rawFilePath, ctx.cwd, runtime.projectRoot);
|
|
488
|
-
filePath = pathResolution?.path;
|
|
489
|
-
if (pathResolution?.variant) {
|
|
490
|
-
dbg(`tool_call: path resolved via host ${pathResolution.variant} variant → ${filePath}`);
|
|
491
|
-
}
|
|
492
|
-
if (!getFlag("no-lsp")) {
|
|
493
|
-
try {
|
|
494
|
-
const configCwd = filePath
|
|
495
|
-
? path.dirname(filePath)
|
|
496
|
-
: (ctx.cwd ?? runtime.projectRoot ?? process.cwd());
|
|
497
|
-
await ensureLSPConfigInitialized(configCwd);
|
|
498
|
-
}
|
|
499
|
-
catch (cfgErr) {
|
|
500
|
-
dbg(`lsp config init failed during tool_call: ${cfgErr}`);
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
if (!filePath)
|
|
504
|
-
return;
|
|
505
|
-
dbg(`tool_call fired for: ${filePath} (exists: ${nodeFs.existsSync(filePath)})`);
|
|
506
|
-
const toolCallId = resolveToolCallCorrelationId(event);
|
|
507
|
-
const attributesMutationTarget = toolCallId !== undefined && mutation !== undefined;
|
|
508
|
-
const targetMissing = !nodeFs.existsSync(filePath);
|
|
509
|
-
// #1642 F1: a brand-new file's WRITE is never a "skip" — `tool_call`
|
|
510
|
-
// fires PRE-execution, so `existsSync` is false for every path a write
|
|
511
|
-
// is about to CREATE. Gitignore is a pure pattern match (no existence
|
|
512
|
-
// requirement), so it is checked regardless of `targetMissing`; only an
|
|
513
|
-
// actual ignore verdict is a real "refuse". Folding `targetMissing` into
|
|
514
|
-
// `skipped` (the pre-fix-round-2 shape of this file) made EVERY new-file
|
|
515
|
-
// write's paired tool_result refuse to run diagnostics/autofix/format at
|
|
516
|
-
// all — a full pipeline regression worse than the bug #1642 fixes.
|
|
517
|
-
const targetIgnored = isPathIgnoredByProject(filePath, runtime.projectRoot, false);
|
|
518
|
-
if (attributesMutationTarget) {
|
|
519
|
-
// #1642: record the canonical target BY TOOL-CALL IDENTITY — including
|
|
520
|
-
// (especially) when it is being skipped here. The paired tool_result
|
|
521
|
-
// must take this exact verdict rather than re-deriving its own path
|
|
522
|
-
// from relative diff metadata, which is how a gitignored worktree
|
|
523
|
-
// edit got re-attributed onto a same-relative-path parent file.
|
|
524
|
-
runtime.recordToolCallAttribution(toolCallId, {
|
|
525
|
-
resolvedPath: filePath,
|
|
526
|
-
skipped: targetIgnored,
|
|
527
|
-
originCwd: ctx.cwd ?? runtime.projectRoot,
|
|
528
|
-
});
|
|
529
|
-
}
|
|
530
|
-
if (targetMissing) {
|
|
531
|
-
// #1655 item 5: this early return used to be the whole story — pi-lens
|
|
532
|
-
// did nothing, said nothing, and the file pi went on to read stayed
|
|
533
|
-
// invisible to the read guard, the LSP warm, and the dispatch. The
|
|
534
|
-
// variant ladder above now finds the macOS-shaped cases; when it probed
|
|
535
|
-
// variants and STILL found nothing, say so rather than returning an
|
|
536
|
-
// indistinguishable silence (defect shape 10). `write` is exempt for the
|
|
537
|
-
// same reason #1642 F1 gives just above: a write's target legitimately
|
|
538
|
-
// does not exist yet.
|
|
539
|
-
//
|
|
540
|
-
// Review F1: this used to also require `triedVariants.length > 0`, which
|
|
541
|
-
// silenced exactly the misses the base-normalization gap produced —
|
|
542
|
-
// those paths have no quote and no AM/PM, so every stage-2 candidate
|
|
543
|
-
// collapses onto the base path and nothing is "tried". `unresolved` is
|
|
544
|
-
// the whole condition; the tried list is detail for the reason string.
|
|
545
|
-
if (mutation?.kind !== "write" && pathResolution?.unresolved) {
|
|
546
|
-
const tried = pathResolution.triedVariants.length > 0
|
|
547
|
-
? `tried ${pathResolution.triedVariants.join(", ")}`
|
|
548
|
-
: "no variant differed from the resolved path";
|
|
549
|
-
recordDegradationOnce({
|
|
550
|
-
kind: "path-variant-unresolved",
|
|
551
|
-
subject: filePath,
|
|
552
|
-
reason: `${toolName}: no file at the resolved path, and none of pi's variants matched (${tried})`,
|
|
553
|
-
});
|
|
554
|
-
}
|
|
555
|
-
return;
|
|
556
|
-
}
|
|
557
|
-
if (targetIgnored) {
|
|
558
|
-
dbg(`tool_call: skipping gitignored file ${filePath}`);
|
|
559
|
-
return;
|
|
560
|
-
}
|
|
561
|
-
const isExternalOrVendor = isExternalOrVendorFile(filePath, runtime.projectRoot);
|
|
562
|
-
const lspCapableFile = isLspCapableFile(filePath);
|
|
563
|
-
const lspAutoTouchSkipped = shouldSkipLspAutoTouch(filePath, runtime.projectRoot);
|
|
564
|
-
const lspAutoTouchEligible = lspCapableFile && !lspAutoTouchSkipped;
|
|
565
|
-
const shouldWarmReadLsp = toolName === "read" &&
|
|
566
|
-
lspAutoTouchEligible &&
|
|
567
|
-
runtime.shouldWarmLspOnRead(filePath);
|
|
568
|
-
const shouldAutoTouch = (mutation !== undefined ||
|
|
569
|
-
toolName === "lsp_navigation" ||
|
|
570
|
-
shouldWarmReadLsp) &&
|
|
571
|
-
!getFlag("no-lsp") &&
|
|
572
|
-
lspAutoTouchEligible;
|
|
573
|
-
if (!lspCapableFile && !getFlag("no-lsp")) {
|
|
574
|
-
dbg(`lsp auto-touch skipped: ${path.basename(filePath)} (file kind not LSP-capable)`);
|
|
575
|
-
}
|
|
576
|
-
else if (lspAutoTouchSkipped && !getFlag("no-lsp")) {
|
|
577
|
-
dbg(`lsp auto-touch skipped: ${path.basename(filePath)} (internal/support artifact)`);
|
|
578
|
-
}
|
|
579
|
-
if (toolName === "read" && !getFlag("no-lsp") && !shouldWarmReadLsp) {
|
|
580
|
-
const readSkipReason = !lspAutoTouchEligible
|
|
581
|
-
? "file not eligible for LSP warm"
|
|
582
|
-
: "already warming or warmed recently";
|
|
583
|
-
dbg(`lsp read warm skipped: ${path.basename(filePath)} (${readSkipReason})`);
|
|
584
|
-
}
|
|
585
|
-
if (shouldAutoTouch) {
|
|
586
|
-
try {
|
|
587
|
-
const fileContent = nodeFs.readFileSync(filePath, "utf-8");
|
|
588
|
-
const maxClientWaitMs = toolName === "lsp_navigation"
|
|
589
|
-
? LSP_TOOLCALL_NAV_TOUCH_BUDGET_MS
|
|
590
|
-
: LSP_TOOLCALL_TOUCH_BUDGET_MS;
|
|
591
|
-
if (toolName === "read") {
|
|
592
|
-
runtime.markLspReadWarmStarted(filePath);
|
|
593
|
-
dbg(`lsp read warm started: ${path.basename(filePath)}`);
|
|
594
|
-
}
|
|
595
|
-
void getLSPService()
|
|
596
|
-
.touchFile(filePath, fileContent, {
|
|
597
|
-
diagnostics: "none",
|
|
598
|
-
source: `tool_call:${toolName}`,
|
|
599
|
-
clientScope: "primary",
|
|
600
|
-
maxClientWaitMs,
|
|
601
|
-
})
|
|
602
|
-
.then((result) => {
|
|
603
|
-
if (toolName === "read") {
|
|
604
|
-
if (result === undefined) {
|
|
605
|
-
runtime.clearLspReadWarmState(filePath);
|
|
606
|
-
dbg(`lsp read warm unavailable: ${path.basename(filePath)} (no LSP client ready)`);
|
|
607
|
-
}
|
|
608
|
-
else {
|
|
609
|
-
runtime.markLspReadWarmCompleted(filePath);
|
|
610
|
-
dbg(`lsp read warm completed: ${path.basename(filePath)}`);
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
if (ctx.ui) {
|
|
614
|
-
updateLspStatus(ctx.ui.setStatus, ctx.ui.theme);
|
|
615
|
-
}
|
|
616
|
-
})
|
|
617
|
-
.catch((err) => {
|
|
618
|
-
if (toolName === "read") {
|
|
619
|
-
runtime.clearLspReadWarmState(filePath);
|
|
620
|
-
}
|
|
621
|
-
dbg(`lsp auto-touch failed for ${filePath}: ${err}`);
|
|
622
|
-
});
|
|
623
|
-
}
|
|
624
|
-
catch {
|
|
625
|
-
if (toolName === "read") {
|
|
626
|
-
runtime.clearLspReadWarmState(filePath);
|
|
627
|
-
}
|
|
628
|
-
// Best effort only; never block tool calls.
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
const readInput = getReadToolInput(toolName, event.input);
|
|
632
|
-
const requestedReadOffset = readInput?.offset ?? 1;
|
|
633
|
-
const requestedReadLimit = readInput?.limit;
|
|
634
|
-
let effectiveReadOffset = requestedReadOffset;
|
|
635
|
-
let effectiveReadLimit = getEffectiveReadLimit(filePath, readInput);
|
|
636
|
-
// --- Opportunistic read expansion via tree-sitter ---
|
|
637
|
-
// For partial reads (small limit, not from line 1), find the enclosing
|
|
638
|
-
// symbol and expand the read range to cover it. This gives the read guard
|
|
639
|
-
// accurate symbol-level coverage without requiring an LSP server.
|
|
640
|
-
let enclosingSymbol;
|
|
641
|
-
const readExpansionClient = toolName === "read" &&
|
|
642
|
-
!getFlag("no-lsp") &&
|
|
643
|
-
!isExternalOrVendor &&
|
|
644
|
-
filePath &&
|
|
645
|
-
readInput &&
|
|
646
|
-
requestedReadLimit != null &&
|
|
647
|
-
requestedReadLimit <= EXPANSION_LIMIT_LINES
|
|
648
|
-
? getTreeSitterClient()
|
|
649
|
-
: null;
|
|
650
|
-
if (readExpansionClient &&
|
|
651
|
-
filePath &&
|
|
652
|
-
readInput &&
|
|
653
|
-
requestedReadLimit != null) {
|
|
654
|
-
const totalLines = effectiveReadLimit != null && requestedReadLimit == null
|
|
655
|
-
? effectiveReadLimit
|
|
656
|
-
: countFileLines(filePath);
|
|
657
|
-
try {
|
|
658
|
-
const expansion = await tryExpandRead(filePath, requestedReadOffset, requestedReadLimit, totalLines, readExpansionClient);
|
|
659
|
-
if (expansion) {
|
|
660
|
-
readInput.offset = expansion.newOffset;
|
|
661
|
-
readInput.limit = expansion.newLimit;
|
|
662
|
-
effectiveReadOffset = expansion.newOffset;
|
|
663
|
-
effectiveReadLimit = expansion.newLimit;
|
|
664
|
-
let enriched = false;
|
|
665
|
-
let enrichedAncestry = expansion.ancestry;
|
|
666
|
-
const lspSymbols = await getOpenDocumentSymbols(filePath);
|
|
667
|
-
const located = lspSymbols
|
|
668
|
-
? findDocumentSymbolAtLine(lspSymbols, expansion.enclosingSymbol.startLine)
|
|
669
|
-
: undefined;
|
|
670
|
-
if (located) {
|
|
671
|
-
enclosingSymbol = {
|
|
672
|
-
...expansion.enclosingSymbol,
|
|
673
|
-
name: qualifiedLspSymbolName(located, lspSymbols),
|
|
674
|
-
kind: lspSymbolKindName(located.symbol.kind),
|
|
675
|
-
};
|
|
676
|
-
// Flat SymbolInformation results (native-ts7's real shape) carry
|
|
677
|
-
// no hierarchy — an empty LSP ancestry must NOT wipe the real
|
|
678
|
-
// tree-sitter chain (#951 review finding 1). Enrich only when
|
|
679
|
-
// the LSP actually provided one.
|
|
680
|
-
if (located.ancestry.length > 0) {
|
|
681
|
-
enrichedAncestry = located.ancestry.map((entry) => ({
|
|
682
|
-
name: entry.name,
|
|
683
|
-
kind: lspSymbolKindName(entry.kind),
|
|
684
|
-
startLine: ((entry.range ?? entry.location?.range)?.start.line ?? 0) + 1,
|
|
685
|
-
endLine: ((entry.range ?? entry.location?.range)?.end.line ?? 0) + 1,
|
|
686
|
-
}));
|
|
687
|
-
}
|
|
688
|
-
enriched = true;
|
|
689
|
-
}
|
|
690
|
-
else {
|
|
691
|
-
enclosingSymbol = expansion.enclosingSymbol;
|
|
692
|
-
}
|
|
693
|
-
logToolReadGuardEvent({
|
|
694
|
-
event: "ts_range_expanded",
|
|
695
|
-
sessionId: runtime.telemetrySessionId,
|
|
696
|
-
filePath,
|
|
697
|
-
requestedOffset: requestedReadOffset,
|
|
698
|
-
requestedLimit: requestedReadLimit,
|
|
699
|
-
effectiveOffset: expansion.newOffset,
|
|
700
|
-
effectiveLimit: expansion.newLimit,
|
|
701
|
-
symbol: enclosingSymbol.name,
|
|
702
|
-
symbolKind: enclosingSymbol.kind,
|
|
703
|
-
symbolStartLine: expansion.enclosingSymbol.startLine,
|
|
704
|
-
symbolEndLine: expansion.enclosingSymbol.endLine,
|
|
705
|
-
metadata: {
|
|
706
|
-
enriched,
|
|
707
|
-
durationMs: expansion.durationMs,
|
|
708
|
-
budgetMs: EXPANSION_BUDGET_MS,
|
|
709
|
-
},
|
|
710
|
-
});
|
|
711
|
-
const symbolPath = [
|
|
712
|
-
...(enrichedAncestry ?? []).map((a) => a.name),
|
|
713
|
-
enclosingSymbol.name,
|
|
714
|
-
].join(" → ");
|
|
715
|
-
dbg(`ts expanded read: ${path.basename(filePath)} ` +
|
|
716
|
-
`lines ${requestedReadOffset}–${requestedReadOffset + requestedReadLimit - 1} ` +
|
|
717
|
-
`→ ${symbolPath} ` +
|
|
718
|
-
`(${expansion.newOffset}–${expansion.newOffset + expansion.newLimit - 1})`);
|
|
719
|
-
}
|
|
720
|
-
}
|
|
721
|
-
catch {
|
|
722
|
-
// Best-effort only.
|
|
723
|
-
}
|
|
724
|
-
}
|
|
725
|
-
// Register the host-resolved path at tool_call. This path is load-bearing for
|
|
726
|
-
// the read guard and the observed-mutation settled sweep, including under
|
|
727
|
-
// --no-read-guard. The paired tool_result adds the authoritative delivered
|
|
728
|
-
// range after the host applies EOF and output-cap clipping (#2802 probe 3).
|
|
729
|
-
if (toolName === "read" && filePath && !isExternalOrVendor) {
|
|
730
|
-
const totalLines = countFileLines(filePath);
|
|
731
|
-
const deliveredLimit = effectiveReadLimit ?? 1;
|
|
732
|
-
logToolReadGuardEvent({
|
|
733
|
-
event: "read_pattern",
|
|
734
|
-
sessionId: runtime.telemetrySessionId,
|
|
735
|
-
filePath,
|
|
736
|
-
requestedOffset: requestedReadOffset,
|
|
737
|
-
requestedLimit: requestedReadLimit ?? deliveredLimit,
|
|
738
|
-
effectiveOffset: effectiveReadOffset,
|
|
739
|
-
effectiveLimit: deliveredLimit,
|
|
740
|
-
metadata: {
|
|
741
|
-
totalLines,
|
|
742
|
-
isPartial: requestedReadLimit != null && requestedReadLimit < totalLines,
|
|
743
|
-
fileKind: detectFileKind(filePath) ?? "unknown",
|
|
744
|
-
fractionRead: totalLines > 0
|
|
745
|
-
? Math.round((deliveredLimit / totalLines) * 100) / 100
|
|
746
|
-
: 1,
|
|
747
|
-
expandedByTs: enclosingSymbol !== undefined,
|
|
748
|
-
},
|
|
749
|
-
});
|
|
750
|
-
runtime.readGuard.recordRead({
|
|
751
|
-
filePath,
|
|
752
|
-
requestedOffset: requestedReadOffset,
|
|
753
|
-
requestedLimit: requestedReadLimit ?? deliveredLimit,
|
|
754
|
-
effectiveOffset: effectiveReadOffset,
|
|
755
|
-
effectiveLimit: deliveredLimit,
|
|
756
|
-
expandedByLsp: enclosingSymbol !== undefined,
|
|
757
|
-
...(enclosingSymbol !== undefined && { enclosingSymbol }),
|
|
758
|
-
turnIndex: runtime.turnIndex,
|
|
759
|
-
writeIndex: runtime.peekWriteIndex(),
|
|
760
|
-
timestamp: Date.now(),
|
|
761
|
-
provisional: true,
|
|
762
|
-
...(resolveToolCallCorrelationId(event) !== undefined && {
|
|
763
|
-
source: `native-read:${resolveToolCallCorrelationId(event)}:provisional`,
|
|
764
|
-
}),
|
|
765
|
-
});
|
|
766
|
-
}
|
|
767
|
-
// Record complexity baseline for historical tracking (booboo/tdi).
|
|
768
|
-
// Not shown inline - just captured for delta analysis.
|
|
769
|
-
//
|
|
770
|
-
// #2467: every client-free guard runs FIRST, so a tool call that cannot
|
|
771
|
-
// produce a baseline never loads the analyzer graph. This await used to sit
|
|
772
|
-
// above them and fire on EVERY tool_call — a bash command, a grep, a read
|
|
773
|
-
// of a vendored file, a second read of an already-baselined file all paid
|
|
774
|
-
// the seventeen-module load.
|
|
775
|
-
//
|
|
776
|
-
// `isComplexitySupportedFile` is the LAST of those guards and the one that
|
|
777
|
-
// matters most in a real repo: complexity has node mappings for six
|
|
778
|
-
// grammars, so every .md/.json/.yaml/.css/.java/.sh read is unsupported.
|
|
779
|
-
// Asking the CLIENT (`isSupportedFile`) would mean loading the graph to
|
|
780
|
-
// learn the answer is no — and because only a produced baseline memoizes
|
|
781
|
-
// the file, the same read would pay it again on every repeat. The predicate
|
|
782
|
-
// is the client's own answer, hoisted into `tree-sitter-shared.ts` where it
|
|
783
|
-
// needs nothing but the extension registry; `ComplexityClient.isSupportedFile`
|
|
784
|
-
// delegates to it, so this is not a second copy.
|
|
785
|
-
if (!getFlag("no-complexity") &&
|
|
786
|
-
!isExternalOrVendor &&
|
|
787
|
-
filePath &&
|
|
788
|
-
!runtime.complexityBaselines.has(filePath) &&
|
|
789
|
-
isComplexitySupportedFile(filePath)) {
|
|
790
|
-
// Fail open: no clients means no baseline for this call, counted once in
|
|
791
|
-
// the ledger. A complexity baseline is delta-analysis bookkeeping — it
|
|
792
|
-
// must never be the reason a user's tool call fails or stalls.
|
|
793
|
-
const complexityClient = (await requestBootstrapClients({
|
|
794
|
-
reason: "tool-call-complexity-baseline",
|
|
795
|
-
// The pre-dispatch hook. It carries no wall budget in #2523's
|
|
796
|
-
// contract, which is why `LedgerHookKey` names it alongside the
|
|
797
|
-
// budgeted families rather than leaving this site to spell its
|
|
798
|
-
// own axis value (#2557 review F7).
|
|
799
|
-
hook: "tool_call",
|
|
800
|
-
// The ambient slot is populated by tool_result, AFTER this hook has
|
|
801
|
-
// already run, so the live `tool_call` signal is the only one that
|
|
802
|
-
// can release this await when the user presses Escape (#2523 AC4).
|
|
803
|
-
// #2939 round 2 restored this after round 2's own measurement: with
|
|
804
|
-
// the signal absent, an aborted caller waits the demand's whole
|
|
805
|
-
// `BOOTSTRAP_LOAD_TIMEOUT_MS` out and the cancel then surfaces on the
|
|
806
|
-
// ledger as a `timeout` degradation — the exact inversion
|
|
807
|
-
// `requestBootstrapClients`'s `unavailableReason !== "aborted"` guard
|
|
808
|
-
// exists to prevent.
|
|
809
|
-
signal: deps.ctx.signal,
|
|
810
|
-
}))?.complexityClient;
|
|
811
|
-
const baseline = await complexityClient?.analyzeFile(filePath);
|
|
812
|
-
if (baseline) {
|
|
813
|
-
runtime.complexityBaselines.set(filePath, baseline);
|
|
814
|
-
const { captureSnapshot } = await import("./metrics-history.js");
|
|
815
|
-
captureSnapshot(filePath, {
|
|
816
|
-
maintainabilityIndex: baseline.maintainabilityIndex,
|
|
817
|
-
cognitiveComplexity: baseline.cognitiveComplexity,
|
|
818
|
-
maxNestingDepth: baseline.maxNestingDepth,
|
|
819
|
-
linesOfCode: baseline.linesOfCode,
|
|
820
|
-
maxCyclomatic: baseline.maxCyclomaticComplexity,
|
|
821
|
-
entropy: baseline.codeEntropy,
|
|
822
|
-
});
|
|
823
|
-
}
|
|
824
|
-
}
|
|
825
|
-
else if (getFlag("no-complexity") &&
|
|
826
|
-
filePath &&
|
|
827
|
-
isComplexitySupportedFile(filePath)) {
|
|
828
|
-
recordDegradationOnce({
|
|
829
|
-
kind: "startup-analyzer-disabled",
|
|
830
|
-
subject: "complexity",
|
|
831
|
-
reason: "skipped (disabled by config)",
|
|
832
|
-
});
|
|
833
|
-
}
|
|
834
|
-
// --- Read-Before-Edit Guard: check edits ---
|
|
835
|
-
// write = full replacement; no prior read needed (you're starting fresh).
|
|
836
|
-
// edit = partial modification; guard enforced to prevent blind overwrites.
|
|
837
|
-
const isEditOnly = mutation?.kind === "edit";
|
|
838
|
-
const isWriteOrEdit = mutation !== undefined;
|
|
839
|
-
// Track any Write so recordWritten can inject a synthetic read afterward.
|
|
840
|
-
// The agent authored the content (new or overwritten), so it trivially "knows" the file.
|
|
841
|
-
if (!isEditOnly &&
|
|
842
|
-
isWriteOrEdit &&
|
|
843
|
-
event.toolName !== "bash" &&
|
|
844
|
-
filePath &&
|
|
845
|
-
!getFlag("no-read-guard")) {
|
|
846
|
-
runtime.readGuard.noteCreatedFile(filePath, runtime.turnIndex, runtime.peekWriteIndex());
|
|
847
|
-
}
|
|
848
|
-
// --- Indentation mismatch correction ---
|
|
849
|
-
// Some models output spaces in oldText when the file uses tabs (or vice versa).
|
|
850
|
-
// Detect this before the read guard runs so a recoverable mismatch does not
|
|
851
|
-
// degrade into a no-line-info allow path.
|
|
852
|
-
if (isEditOnly && filePath) {
|
|
853
|
-
const editInput = event.input;
|
|
854
|
-
const oldTexts = editInput.oldText
|
|
855
|
-
? [
|
|
856
|
-
{
|
|
857
|
-
label: "oldText",
|
|
858
|
-
value: editInput.oldText,
|
|
859
|
-
newText: editInput.newText,
|
|
860
|
-
apply: (corrected) => {
|
|
861
|
-
editInput.oldText = corrected;
|
|
862
|
-
},
|
|
863
|
-
applyNewText: (corrected) => {
|
|
864
|
-
editInput.newText = corrected;
|
|
865
|
-
},
|
|
866
|
-
},
|
|
867
|
-
]
|
|
868
|
-
: (editInput.edits ?? [])
|
|
869
|
-
.map((e, i) => e.oldText
|
|
870
|
-
? {
|
|
871
|
-
label: `edits[${i}].oldText`,
|
|
872
|
-
value: e.oldText,
|
|
873
|
-
newText: e.newText,
|
|
874
|
-
apply: (corrected) => {
|
|
875
|
-
e.oldText = corrected;
|
|
876
|
-
},
|
|
877
|
-
applyNewText: (corrected) => {
|
|
878
|
-
e.newText = corrected;
|
|
879
|
-
},
|
|
880
|
-
}
|
|
881
|
-
: null)
|
|
882
|
-
.filter((entry) => entry !== null);
|
|
883
|
-
// Read the file once; derive the two normalized forms needed by
|
|
884
|
-
// tryCorrectIndentationMismatchFromContent (CRLF->LF only) and
|
|
885
|
-
// countOldTextMatches / the autopatch bridge (host fuzzy-match space).
|
|
886
|
-
let crlfContent;
|
|
887
|
-
let matchNormalizedContent;
|
|
888
|
-
try {
|
|
889
|
-
const raw = nodeFs.readFileSync(filePath, "utf-8");
|
|
890
|
-
crlfContent = raw.replace(/\r\n/g, "\n");
|
|
891
|
-
matchNormalizedContent = normalizeOldTextForMatch(raw);
|
|
892
|
-
}
|
|
893
|
-
catch {
|
|
894
|
-
// File unreadable — corrections will be skipped gracefully below.
|
|
895
|
-
}
|
|
896
|
-
// --- Pass 0: escaped control-char correction ---
|
|
897
|
-
// Models may write literal \n or \t in oldText (JSON interprets them as actual
|
|
898
|
-
// newline/tab) when the file has the two-character escape sequences (e.g. inside
|
|
899
|
-
// a regex or string literal). Safety gates: original must not match at all;
|
|
900
|
-
// escaped version must match exactly once.
|
|
901
|
-
if (matchNormalizedContent !== undefined) {
|
|
902
|
-
for (const entry of oldTexts) {
|
|
903
|
-
const v = entry.value;
|
|
904
|
-
if (!v.includes("\t") && !v.includes("\n"))
|
|
905
|
-
continue;
|
|
906
|
-
if (countOldTextMatches(filePath, v, matchNormalizedContent) !== 0)
|
|
907
|
-
continue;
|
|
908
|
-
const escaped = v.replace(/\t/g, "\\t").replace(/\n/g, "\\n");
|
|
909
|
-
if (escaped === v)
|
|
910
|
-
continue;
|
|
911
|
-
if (countOldTextMatches(filePath, escaped, matchNormalizedContent) !== 1)
|
|
912
|
-
continue;
|
|
913
|
-
entry.apply(escaped);
|
|
914
|
-
entry.value = escaped;
|
|
915
|
-
logToolReadGuardEvent({
|
|
916
|
-
event: "oldtext_escape_autopatched",
|
|
917
|
-
sessionId: runtime.telemetrySessionId,
|
|
918
|
-
filePath,
|
|
919
|
-
metadata: { tool: "edit", label: entry.label },
|
|
920
|
-
});
|
|
921
|
-
}
|
|
922
|
-
}
|
|
923
|
-
// --- Pass 1: trailing whitespace correction ---
|
|
924
|
-
// Editors strip trailing whitespace on save; the model may copy content
|
|
925
|
-
// that had it. Safety gates: the original raw oldText must not already
|
|
926
|
-
// match, and the stripped raw candidate must match exactly once. When
|
|
927
|
-
// trailing empty lines are stripped from oldText, strip the equivalent
|
|
928
|
-
// suffix from newText so the replacement span is not accidentally widened.
|
|
929
|
-
if (crlfContent !== undefined) {
|
|
930
|
-
for (const entry of oldTexts) {
|
|
931
|
-
const patch = computeTrailingWhitespaceOldTextPatch({
|
|
932
|
-
oldText: entry.value,
|
|
933
|
-
newText: entry.newText,
|
|
934
|
-
fileContent: crlfContent,
|
|
935
|
-
});
|
|
936
|
-
if (!patch)
|
|
937
|
-
continue;
|
|
938
|
-
entry.apply(patch.oldText);
|
|
939
|
-
entry.value = patch.oldText;
|
|
940
|
-
const newTextPatched = patch.newText !== undefined && patch.newText !== entry.newText;
|
|
941
|
-
if (newTextPatched) {
|
|
942
|
-
entry.applyNewText(patch.newText);
|
|
943
|
-
entry.newText = patch.newText;
|
|
944
|
-
}
|
|
945
|
-
logToolReadGuardEvent({
|
|
946
|
-
event: "oldtext_trailing_ws_autopatched",
|
|
947
|
-
sessionId: runtime.telemetrySessionId,
|
|
948
|
-
filePath,
|
|
949
|
-
metadata: {
|
|
950
|
-
tool: "edit",
|
|
951
|
-
label: entry.label,
|
|
952
|
-
removedLineTrailingWhitespace: patch.removedLineTrailingWhitespace,
|
|
953
|
-
removedTrailingEmptyLineCount: patch.removedTrailingEmptyLineCount,
|
|
954
|
-
newTextTrailingEmptyLinesPatched: newTextPatched,
|
|
955
|
-
},
|
|
956
|
-
});
|
|
957
|
-
// Bridge: same rationale as the indent autopatch — the
|
|
958
|
-
// trailing-ws patcher only applies when the stripped oldText
|
|
959
|
-
// matches exactly once against the file, so the agent's text
|
|
960
|
-
// reflects real content at the matched span. Register a
|
|
961
|
-
// synthetic read covering it so the read-guard downstream
|
|
962
|
-
// doesn't fire a zero_read block after the verification.
|
|
963
|
-
if (matchNormalizedContent !== undefined && runtime.readGuard) {
|
|
964
|
-
const range = findUniqueMatchLineRange(matchNormalizedContent, patch.oldText);
|
|
965
|
-
if (range) {
|
|
966
|
-
runtime.readGuard.recordRead({
|
|
967
|
-
filePath,
|
|
968
|
-
requestedOffset: range.startLine,
|
|
969
|
-
requestedLimit: range.endLine - range.startLine + 1,
|
|
970
|
-
effectiveOffset: range.startLine,
|
|
971
|
-
effectiveLimit: range.endLine - range.startLine + 1,
|
|
972
|
-
expandedByLsp: false,
|
|
973
|
-
turnIndex: runtime.turnIndex,
|
|
974
|
-
writeIndex: 0,
|
|
975
|
-
timestamp: Date.now(),
|
|
976
|
-
});
|
|
977
|
-
}
|
|
978
|
-
}
|
|
979
|
-
}
|
|
980
|
-
}
|
|
981
|
-
const correctedOldTexts = oldTexts
|
|
982
|
-
.map(({ label, value, newText, apply, applyNewText }) => {
|
|
983
|
-
const corrected = crlfContent !== undefined
|
|
984
|
-
? tryCorrectIndentationMismatchFromContent(value, crlfContent)
|
|
985
|
-
: tryCorrectIndentationMismatch(value, filePath);
|
|
986
|
-
return corrected === undefined
|
|
987
|
-
? undefined
|
|
988
|
-
: {
|
|
989
|
-
label,
|
|
990
|
-
value,
|
|
991
|
-
newText,
|
|
992
|
-
corrected,
|
|
993
|
-
apply,
|
|
994
|
-
applyNewText,
|
|
995
|
-
currentMatchCount: countOldTextMatches(filePath, value, matchNormalizedContent),
|
|
996
|
-
correctedMatchCount: countOldTextMatches(filePath, corrected, matchNormalizedContent),
|
|
997
|
-
indentationOnly: isIndentationOnlyChange(value, corrected),
|
|
998
|
-
};
|
|
999
|
-
})
|
|
1000
|
-
.filter((entry) => entry !== undefined);
|
|
1001
|
-
// Apply safe corrections individually — each edit stands alone.
|
|
1002
|
-
// Unsafe corrections (non-indentation-only or ambiguous) fall through
|
|
1003
|
-
// to resolveOldTextEdits, which handles them per-edit with proper
|
|
1004
|
-
// oldtext_duplicate / oldtext_not_found reporting and partial apply.
|
|
1005
|
-
for (const entry of correctedOldTexts) {
|
|
1006
|
-
if (entry.indentationOnly &&
|
|
1007
|
-
entry.currentMatchCount === 0 &&
|
|
1008
|
-
entry.correctedMatchCount === 1) {
|
|
1009
|
-
entry.apply(entry.corrected);
|
|
1010
|
-
// The same unique-match span the synthetic-read bridge below
|
|
1011
|
-
// resolves, computed once and reused: it also anchors the
|
|
1012
|
-
// interior-mask lexer to the real file (#3116 review round 2,
|
|
1013
|
-
// F1) so a template literal the oldText fragment crosses the
|
|
1014
|
-
// boundary of is read correctly instead of ambiguously — a
|
|
1015
|
-
// fragment-only lexer can misread which side of a boundary a
|
|
1016
|
-
// line falls on when the fragment doesn't carry the opener or
|
|
1017
|
-
// closer that resolves it. Falls back to fragment-only masking
|
|
1018
|
-
// inside retargetReplacementIndentation when no unique span is
|
|
1019
|
-
// found (file unreadable, or the corrected text isn't unique in
|
|
1020
|
-
// the host's fuzzy-match space).
|
|
1021
|
-
const matchedRange = matchNormalizedContent !== undefined
|
|
1022
|
-
? findUniqueMatchLineRange(matchNormalizedContent, entry.corrected)
|
|
1023
|
-
: undefined;
|
|
1024
|
-
const correctedNewText = entry.newText
|
|
1025
|
-
? retargetReplacementIndentation(entry.newText, entry.value, entry.corrected, matchNormalizedContent !== undefined && matchedRange
|
|
1026
|
-
? {
|
|
1027
|
-
content: matchNormalizedContent,
|
|
1028
|
-
startLine: matchedRange.startLine,
|
|
1029
|
-
}
|
|
1030
|
-
: undefined)
|
|
1031
|
-
: undefined;
|
|
1032
|
-
if (correctedNewText !== undefined) {
|
|
1033
|
-
entry.applyNewText(correctedNewText);
|
|
1034
|
-
}
|
|
1035
|
-
logToolReadGuardEvent({
|
|
1036
|
-
event: "oldtext_indent_autopatched",
|
|
1037
|
-
sessionId: runtime.telemetrySessionId,
|
|
1038
|
-
filePath,
|
|
1039
|
-
metadata: {
|
|
1040
|
-
tool: "edit",
|
|
1041
|
-
label: entry.label,
|
|
1042
|
-
correctedMatchCount: entry.correctedMatchCount,
|
|
1043
|
-
newTextIndentationPatched: correctedNewText !== undefined,
|
|
1044
|
-
},
|
|
1045
|
-
});
|
|
1046
|
-
// Bridge: a unique-match autopatch proves the agent's oldText
|
|
1047
|
-
// reflects real content at this span. Register a synthetic read
|
|
1048
|
-
// for the matched range so a zero_read block downstream isn't
|
|
1049
|
-
// thrown after the autopatch already verified the content.
|
|
1050
|
-
if (matchNormalizedContent !== undefined && runtime.readGuard) {
|
|
1051
|
-
const range = matchedRange;
|
|
1052
|
-
if (range) {
|
|
1053
|
-
runtime.readGuard.recordRead({
|
|
1054
|
-
filePath,
|
|
1055
|
-
requestedOffset: range.startLine,
|
|
1056
|
-
requestedLimit: range.endLine - range.startLine + 1,
|
|
1057
|
-
effectiveOffset: range.startLine,
|
|
1058
|
-
effectiveLimit: range.endLine - range.startLine + 1,
|
|
1059
|
-
expandedByLsp: false,
|
|
1060
|
-
turnIndex: runtime.turnIndex,
|
|
1061
|
-
writeIndex: 0,
|
|
1062
|
-
timestamp: Date.now(),
|
|
1063
|
-
});
|
|
1064
|
-
}
|
|
1065
|
-
}
|
|
1066
|
-
}
|
|
1067
|
-
}
|
|
1068
|
-
}
|
|
1069
|
-
if (isEditOnly && filePath && !getFlag("no-read-guard")) {
|
|
1070
|
-
const readGuard = runtime.readGuard;
|
|
1071
|
-
const isExistingFile = typeof readGuard?.isNewFile !== "function" ||
|
|
1072
|
-
!readGuard.isNewFile(filePath);
|
|
1073
|
-
if (readGuard && isExistingFile && !isExternalOrVendor) {
|
|
1074
|
-
const { touchedLines, editRanges, preflightError, preflightDetails, alreadyAppliedEdits, partiallyApplicable, contentMatchValidated, editBatchSummary, } = getTouchedLinesForGuard(event, filePath, runtime.telemetrySessionId, readGuardCorrelationId, runtime.partialApplyRecords);
|
|
1075
|
-
if (preflightError) {
|
|
1076
|
-
if (partiallyApplicable && partiallyApplicable.length > 0) {
|
|
1077
|
-
try {
|
|
1078
|
-
const partial = await applyPartiallyApplicableEdits({
|
|
1079
|
-
filePath,
|
|
1080
|
-
edits: partiallyApplicable,
|
|
1081
|
-
summary: editBatchSummary,
|
|
1082
|
-
correlationId: readGuardCorrelationId,
|
|
1083
|
-
recordStore: runtime.partialApplyRecords,
|
|
1084
|
-
afterWrite: async () => {
|
|
1085
|
-
const { biomeClient, ruffClient, metricsClient, agentBehaviorClient, } = await loadBootstrapClients();
|
|
1086
|
-
const result = await handleToolResult({
|
|
1087
|
-
signal: deps.ctx.signal,
|
|
1088
|
-
event: {
|
|
1089
|
-
toolName: "write",
|
|
1090
|
-
input: { path: filePath },
|
|
1091
|
-
details: {
|
|
1092
|
-
piLensPartialApply: true,
|
|
1093
|
-
readGuardCorrelationId,
|
|
1094
|
-
},
|
|
1095
|
-
content: [],
|
|
1096
|
-
// #1655 item 2: `provider`/`model`/`sessionId`/`session`
|
|
1097
|
-
// used to be forwarded here from the tool_call event.
|
|
1098
|
-
// pi builds a `tool_call` with exactly
|
|
1099
|
-
// `type`/`toolName`/`toolCallId`/`input`
|
|
1100
|
-
// (`@earendil-works/pi-coding-agent/dist/core/agent-session.js:230-234`,
|
|
1101
|
-
// source `src/core/agent-session.ts:~228-236`), so all
|
|
1102
|
-
// four were always `undefined` and the tool_result
|
|
1103
|
-
// branch they fed was unreachable.
|
|
1104
|
-
},
|
|
1105
|
-
getFlag: (name) => getFlag(name),
|
|
1106
|
-
dbg,
|
|
1107
|
-
runtime,
|
|
1108
|
-
cacheManager,
|
|
1109
|
-
biomeClient,
|
|
1110
|
-
ruffClient,
|
|
1111
|
-
metricsClient,
|
|
1112
|
-
resetLSPService,
|
|
1113
|
-
readGuard: runtime.readGuard,
|
|
1114
|
-
agentBehaviorRecord: (toolName, analyzedPath) => agentBehaviorClient.recordToolCall(toolName, analyzedPath),
|
|
1115
|
-
formatBehaviorWarnings: (warnings) => agentBehaviorClient.formatWarnings(warnings),
|
|
1116
|
-
});
|
|
1117
|
-
if (result?.isError) {
|
|
1118
|
-
throw new Error("post-edit pipeline rejected synthetic partial apply");
|
|
1119
|
-
}
|
|
1120
|
-
return result?.content
|
|
1121
|
-
?.map((item) => item.text)
|
|
1122
|
-
.filter((text) => !!text)
|
|
1123
|
-
.join("\n\n");
|
|
1124
|
-
},
|
|
1125
|
-
});
|
|
1126
|
-
if (partial.rejected) {
|
|
1127
|
-
// Nothing was written and no post-edit dispatch ran. The
|
|
1128
|
-
// preflight verdict still describes the whole batch; append
|
|
1129
|
-
// the structured rejection so the agent rebuilds from a
|
|
1130
|
-
// fresh read instead of retrying the stale payload.
|
|
1131
|
-
if (!editBatchSummary)
|
|
1132
|
-
logBlockedEditSummary("preflight");
|
|
1133
|
-
return {
|
|
1134
|
-
block: true,
|
|
1135
|
-
reason: `${preflightError}\n\n🛑 Batch not applied: ${partial.rejected.detail}`,
|
|
1136
|
-
};
|
|
1137
|
-
}
|
|
1138
|
-
if (partial.postEditStatus === "failed") {
|
|
1139
|
-
// The commit stands; the post-edit analysis does not. The
|
|
1140
|
-
// committed bytes must never be re-labelled by the preflight
|
|
1141
|
-
// header (a RETRYABLE/RE-READ line here sends the agent into
|
|
1142
|
-
// the #2402 retry loop against already-applied edits).
|
|
1143
|
-
return {
|
|
1144
|
-
block: true,
|
|
1145
|
-
reason: composePartialApplyReason({
|
|
1146
|
-
appliedCount: partial.appliedCount,
|
|
1147
|
-
appliedIndices: partial.appliedIndices,
|
|
1148
|
-
postEditStatus: "failed",
|
|
1149
|
-
preflightDetails,
|
|
1150
|
-
alreadyAppliedEdits,
|
|
1151
|
-
}),
|
|
1152
|
-
};
|
|
1153
|
-
}
|
|
1154
|
-
if (partial.appliedCount > 0) {
|
|
1155
|
-
logToolReadGuardEvent({
|
|
1156
|
-
event: "edit_partial_apply",
|
|
1157
|
-
sessionId: runtime.telemetrySessionId,
|
|
1158
|
-
filePath,
|
|
1159
|
-
metadata: {
|
|
1160
|
-
appliedCount: partial.appliedCount,
|
|
1161
|
-
appliedTotal: partial.appliedTotal,
|
|
1162
|
-
appliedIndices: partial.appliedIndices,
|
|
1163
|
-
editBatchSummary: partial.summary,
|
|
1164
|
-
routedThroughPostEditPipeline: true,
|
|
1165
|
-
},
|
|
1166
|
-
});
|
|
1167
|
-
return {
|
|
1168
|
-
block: true,
|
|
1169
|
-
reason: composePartialApplyReason({
|
|
1170
|
-
appliedCount: partial.appliedCount,
|
|
1171
|
-
appliedIndices: partial.appliedIndices,
|
|
1172
|
-
postEditStatus: "succeeded",
|
|
1173
|
-
postEditOutput: partial.postEditOutput,
|
|
1174
|
-
preflightDetails,
|
|
1175
|
-
alreadyAppliedEdits,
|
|
1176
|
-
}),
|
|
1177
|
-
};
|
|
1178
|
-
}
|
|
1179
|
-
}
|
|
1180
|
-
catch {
|
|
1181
|
-
// commit write failure — fall through to the full preflight block
|
|
1182
|
-
}
|
|
1183
|
-
}
|
|
1184
|
-
if (!editBatchSummary)
|
|
1185
|
-
logBlockedEditSummary("preflight");
|
|
1186
|
-
return { block: true, reason: preflightError };
|
|
1187
|
-
}
|
|
1188
|
-
logToolReadGuardEvent({
|
|
1189
|
-
event: "edit_check_started",
|
|
1190
|
-
sessionId: runtime.telemetrySessionId,
|
|
1191
|
-
filePath,
|
|
1192
|
-
metadata: {
|
|
1193
|
-
tool: mutation?.kind ?? "edit",
|
|
1194
|
-
touchedLines: touchedLines ?? null,
|
|
1195
|
-
isExistingFile,
|
|
1196
|
-
},
|
|
1197
|
-
});
|
|
1198
|
-
const verdict = typeof readGuard.checkEdit === "function"
|
|
1199
|
-
? readGuard.checkEdit(filePath, touchedLines, editRanges, {
|
|
1200
|
-
skipSnapshotCheck: !!contentMatchValidated,
|
|
1201
|
-
oldTextResolved: !!contentMatchValidated,
|
|
1202
|
-
})
|
|
1203
|
-
: { action: "allow" };
|
|
1204
|
-
// Content-verified range-stale relocation: the lines the agent meant
|
|
1205
|
-
// to edit moved (read-time line hashes uniquely match the new spot),
|
|
1206
|
-
// so re-target the positional edit to where the content now lives
|
|
1207
|
-
// instead of dead-ending. Safe because the hashes prove the new span
|
|
1208
|
-
// IS the intended content — the same guarantee that lets
|
|
1209
|
-
// pi-hashline-readmap auto-apply. Single-range only (set by the guard).
|
|
1210
|
-
if (verdict.relocation) {
|
|
1211
|
-
const relocated = relocateEditRange(event.input, verdict.relocation.from, verdict.relocation.to);
|
|
1212
|
-
if (relocated) {
|
|
1213
|
-
const [toStart, toEnd] = verdict.relocation.to;
|
|
1214
|
-
runtime.readGuard?.recordRead({
|
|
1215
|
-
filePath,
|
|
1216
|
-
requestedOffset: toStart,
|
|
1217
|
-
requestedLimit: toEnd - toStart + 1,
|
|
1218
|
-
effectiveOffset: toStart,
|
|
1219
|
-
effectiveLimit: toEnd - toStart + 1,
|
|
1220
|
-
expandedByLsp: false,
|
|
1221
|
-
turnIndex: runtime.turnIndex,
|
|
1222
|
-
writeIndex: 0,
|
|
1223
|
-
timestamp: Date.now(),
|
|
1224
|
-
});
|
|
1225
|
-
logToolReadGuardEvent({
|
|
1226
|
-
event: "edit_range_relocated",
|
|
1227
|
-
sessionId: runtime.telemetrySessionId,
|
|
1228
|
-
filePath,
|
|
1229
|
-
metadata: {
|
|
1230
|
-
tool: "edit",
|
|
1231
|
-
from: verdict.relocation.from,
|
|
1232
|
-
to: verdict.relocation.to,
|
|
1233
|
-
},
|
|
1234
|
-
});
|
|
1235
|
-
// Relocation applied — let the re-targeted edit proceed.
|
|
1236
|
-
}
|
|
1237
|
-
else if (verdict.action === "block") {
|
|
1238
|
-
logBlockedEditSummary("range_relocated_blocked");
|
|
1239
|
-
return { block: true, reason: verdict.reason };
|
|
1240
|
-
}
|
|
1241
|
-
}
|
|
1242
|
-
else if (verdict.action === "block") {
|
|
1243
|
-
logBlockedEditSummary("read_guard_blocked");
|
|
1244
|
-
return {
|
|
1245
|
-
block: true,
|
|
1246
|
-
reason: verdict.reason,
|
|
1247
|
-
};
|
|
1248
|
-
}
|
|
1249
|
-
}
|
|
1250
|
-
}
|
|
1251
|
-
// --- Pre-write duplicate detection ---
|
|
1252
|
-
// Check if new content redefines functions that already exist elsewhere.
|
|
1253
|
-
// Uses cachedExports (populated at session_start via ast-grep scan).
|
|
1254
|
-
if (isWriteOrEdit && runtime.cachedExports.size > 0) {
|
|
1255
|
-
const newContent = getNewContentFromToolCall(event);
|
|
1256
|
-
if (newContent) {
|
|
1257
|
-
const dupeWarnings = [];
|
|
1258
|
-
const exportRe = /export\s+(?:async\s+)?(?:function|class|const|let|type|interface)\s+(\w+)/g;
|
|
1259
|
-
// Read current on-disk content once so we can check whether the file
|
|
1260
|
-
// being written already owns a given export (e.g. it IS the source and
|
|
1261
|
-
// another file merely re-exports from it). cachedExports only tracks one
|
|
1262
|
-
// file per name — whichever was scanned first — so a re-exporter can
|
|
1263
|
-
// win the slot and incorrectly shadow the original definition.
|
|
1264
|
-
let currentFileExports;
|
|
1265
|
-
if (filePath && nodeFs.existsSync(filePath)) {
|
|
1266
|
-
try {
|
|
1267
|
-
const currentContent = nodeFs.readFileSync(filePath, "utf-8");
|
|
1268
|
-
currentFileExports = new Set();
|
|
1269
|
-
for (const m of currentContent.matchAll(exportRe)) {
|
|
1270
|
-
currentFileExports.add(m[1]);
|
|
1271
|
-
}
|
|
1272
|
-
}
|
|
1273
|
-
catch {
|
|
1274
|
-
// non-fatal — fall back to no current-export knowledge
|
|
1275
|
-
}
|
|
1276
|
-
}
|
|
1277
|
-
for (const match of newContent.matchAll(exportRe)) {
|
|
1278
|
-
const name = match[1];
|
|
1279
|
-
const existingFile = runtime.cachedExports.get(name);
|
|
1280
|
-
if (existingFile &&
|
|
1281
|
-
path.resolve(existingFile) !== path.resolve(filePath) &&
|
|
1282
|
-
!currentFileExports?.has(name)) {
|
|
1283
|
-
dupeWarnings.push(`\`${name}\` already exists in ${path.relative(runtime.projectRoot, existingFile)}`);
|
|
1284
|
-
}
|
|
1285
|
-
}
|
|
1286
|
-
if (dupeWarnings.length > 0) {
|
|
1287
|
-
return {
|
|
1288
|
-
block: true,
|
|
1289
|
-
reason: "🔴 STOP - Redefining existing export(s). Import instead:\n" +
|
|
1290
|
-
dupeWarnings.map((w) => " • " + w).join("\n"),
|
|
1291
|
-
};
|
|
1292
|
-
}
|
|
1293
|
-
}
|
|
1294
|
-
}
|
|
1295
|
-
}
|