@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,1136 +0,0 @@
|
|
|
1
|
-
import * as nodeFs from "node:fs";
|
|
2
|
-
import * as path from "node:path";
|
|
3
|
-
import { isPathIgnoredByProject } from "./file-utils.js";
|
|
4
|
-
import { tokenizeShellCommand } from "./bash-file-access.js";
|
|
5
|
-
import { logLatency } from "./latency-logger.js";
|
|
6
|
-
import { resolveLensToolName } from "./tool-config.js";
|
|
7
|
-
import { advisoryFileHash, advisoryPathKey, MAX_ADVISORY_AFFECTED_FILES, snapshotAdvisoryProvenance, } from "./advisory-provenance.js";
|
|
8
|
-
function resolveGuardPath(filePath, cwd) {
|
|
9
|
-
return path.resolve(cwd, filePath);
|
|
10
|
-
}
|
|
11
|
-
function guardPathKey(filePath, cwd) {
|
|
12
|
-
return advisoryPathKey(filePath, cwd);
|
|
13
|
-
}
|
|
14
|
-
function fileFingerprint(filePath) {
|
|
15
|
-
return advisoryFileHash(filePath);
|
|
16
|
-
}
|
|
17
|
-
function currentFileFingerprint(filePath) {
|
|
18
|
-
try {
|
|
19
|
-
nodeFs.statSync(filePath);
|
|
20
|
-
return fileFingerprint(filePath);
|
|
21
|
-
}
|
|
22
|
-
catch (err) {
|
|
23
|
-
return err.code === "ENOENT"
|
|
24
|
-
? "missing"
|
|
25
|
-
: `unreadable:${err.code ?? "unknown"}`;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
function capAffectedFiles(files, cwd) {
|
|
29
|
-
const unique = [...new Set(files.map((file) => resolveGuardPath(file, cwd)))];
|
|
30
|
-
return {
|
|
31
|
-
files: unique.slice(0, MAX_ADVISORY_AFFECTED_FILES),
|
|
32
|
-
truncated: unique.length > MAX_ADVISORY_AFFECTED_FILES,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* The turn-end composer's per-file attribution line
|
|
37
|
-
* (`clients/runtime-turn.ts:1085`). The optional suppression notice carries its
|
|
38
|
-
* own `": "`, so this shape is tried BEFORE the per-edit one below — otherwise
|
|
39
|
-
* everything up to `disposition` reads as the file name (#3282 F5).
|
|
40
|
-
*/
|
|
41
|
-
const TURN_END_BLOCKER_SECTION = /^Unresolved from this turn — ([^\s].*?)(?: \(suppressed by disposition: \d+ finding\(s\)\))?:$/;
|
|
42
|
-
/**
|
|
43
|
-
* The file a line of `blockerContent` ATTRIBUTES a new blocker section to, or
|
|
44
|
-
* `undefined` when the line is rendered body that attributes nothing.
|
|
45
|
-
*
|
|
46
|
-
* Exactly the two shapes the two writers emit, and nothing else:
|
|
47
|
-
*
|
|
48
|
-
* - `<path>: <text>` at column 0 — `syncGitGuardRecord`'s own join below;
|
|
49
|
-
* - `Unresolved from this turn — <path>[ (suppressed by disposition: N
|
|
50
|
-
* finding(s))]:` — the turn-end composer's blocker section header.
|
|
51
|
-
*
|
|
52
|
-
* Both writers render the blocker BODY with `formatDiagnostics(…, "blocking")`
|
|
53
|
-
* (`clients/dispatch/utils/format-utils.ts:29`), which indents every line it
|
|
54
|
-
* emits — the ` L<n>: <message>` diagnostics, their ` 💡 Fix:` lines, the
|
|
55
|
-
* ` ... and N more` tail, and the two-space continuations of a multi-line
|
|
56
|
-
* message. The leading-whitespace test is therefore what separates body from
|
|
57
|
-
* attribution, and it is why #3282 happened: a line-by-line parse read
|
|
58
|
-
* ` L1: alpha is unsafe` as a file named `L1`.
|
|
59
|
-
*/
|
|
60
|
-
function blockerSectionFile(line) {
|
|
61
|
-
const turnEndSection = TURN_END_BLOCKER_SECTION.exec(line);
|
|
62
|
-
if (turnEndSection)
|
|
63
|
-
return turnEndSection[1];
|
|
64
|
-
if (/^\s/.test(line))
|
|
65
|
-
return undefined;
|
|
66
|
-
const separator = line.indexOf(": ");
|
|
67
|
-
if (separator <= 0)
|
|
68
|
-
return undefined;
|
|
69
|
-
return line.slice(0, separator);
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* The path key of every blocker SECTION `blockerContent` attributes, or
|
|
73
|
-
* `undefined` when the text cannot be attributed at all.
|
|
74
|
-
*
|
|
75
|
-
* `blockerContent` is a sequence of per-file blocker SECTIONS: an attribution
|
|
76
|
-
* line, then the rendered body it owns, up to the next attribution line or the
|
|
77
|
-
* composer's `"\n\n"` part separator (`clients/runtime-turn.ts:4291`). The one
|
|
78
|
-
* consumer is `clearedLastKnownBlocker` below, which drops `blockerContent`
|
|
79
|
-
* when the file that just dispatched clean was the last entry in
|
|
80
|
-
* `blockingFiles` — sound only if `blockingFiles` accounts for the WHOLE of
|
|
81
|
-
* that text.
|
|
82
|
-
*
|
|
83
|
-
* Named recurrences, both live:
|
|
84
|
-
*
|
|
85
|
-
* - #3282: the writers render MULTI-LINE blocker text and a line-by-line parse
|
|
86
|
-
* judged every such record untrusted, so the first blocker of a session
|
|
87
|
-
* latched `blocking_provenance_untrusted` and refused every later commit —
|
|
88
|
-
* including after the agent fixed it.
|
|
89
|
-
* - #1561: a section for a file `blockingFiles` omits must keep the gate
|
|
90
|
-
* closed, and so must a section no file owns at all. `blockerParts` is
|
|
91
|
-
* multi-lane — the trivy CRITICAL report (`clients/runtime-turn.ts:2141`),
|
|
92
|
-
* knip (`:2147`), the secrets lane (`:2099`) and cascade (`:1340`) each push
|
|
93
|
-
* sections belonging to no file — and clearing one of those on a clean
|
|
94
|
-
* dispatch of the file beside it would drop a live CVE or leaked secret out
|
|
95
|
-
* of the commit gate. That is the fail-closed direction, and the reason an
|
|
96
|
-
* unattributable line answers `unknown` rather than being swallowed.
|
|
97
|
-
*
|
|
98
|
-
* The rule is one-directional on purpose — every SECTION is owned, and
|
|
99
|
-
* `blockingFiles` may name more. Demanding a bijection was #3282's second
|
|
100
|
-
* cause: the composer writes `blockingFiles: affectedFiles`
|
|
101
|
-
* (`clients/runtime-turn.ts:4292`), which carries every file the turn touched
|
|
102
|
-
* plus every cascade neighbour with diagnostics, while only the files with a
|
|
103
|
-
* surviving blocker get a section — so any turn that edited a second file was
|
|
104
|
-
* judged untrusted for the rest of the session. The extra direction also
|
|
105
|
-
* guarded nothing: the one consumer clears only when `blockingFiles` has
|
|
106
|
-
* shrunk to the single file that just dispatched clean, and every section is
|
|
107
|
-
* then that file's by this rule. For the same reason a duplicate section and a
|
|
108
|
-
* duplicate `blockingFiles` entry need no clause of their own: neither can make
|
|
109
|
-
* the clear drop a blocker some other file owns. An all-blank `blockerContent`
|
|
110
|
-
* is NOT in that company — round 1 claimed it was, and the section-count guard
|
|
111
|
-
* below is why (HIGH-3287-1).
|
|
112
|
-
*/
|
|
113
|
-
function blockingProvenance(blockerContent, blockingFiles, cwd) {
|
|
114
|
-
if (typeof blockerContent !== "string" || blockerContent.length === 0)
|
|
115
|
-
return undefined;
|
|
116
|
-
// `Array.isArray` only: a non-empty `blockingFiles` is not a separate
|
|
117
|
-
// requirement (MEDIUM-3287-2, mutation M11 — it stayed green across the whole
|
|
118
|
-
// seam suite). With at least one section required below, an empty
|
|
119
|
-
// `blockingFiles` cannot satisfy the ownership test either way, so the clause
|
|
120
|
-
// decided nothing; the entry type check under it still does, and has its own
|
|
121
|
-
// red (M8).
|
|
122
|
-
if (!Array.isArray(blockingFiles))
|
|
123
|
-
return undefined;
|
|
124
|
-
if (blockingFiles.some((file) => typeof file !== "string" || file.trim().length === 0)) {
|
|
125
|
-
return undefined;
|
|
126
|
-
}
|
|
127
|
-
const provenanceKeys = blockingFiles.map((file) => guardPathKey(file, cwd));
|
|
128
|
-
const sectionKeys = [];
|
|
129
|
-
let inSection = false;
|
|
130
|
-
for (const line of blockerContent.split("\n")) {
|
|
131
|
-
// A ZERO-LENGTH line only: the composer's part separator. A
|
|
132
|
-
// whitespace-only line is how `formatDiagnostics` renders a blank line
|
|
133
|
-
// inside a multi-line diagnostic message, and it is body (#3282 F13).
|
|
134
|
-
if (line.length === 0) {
|
|
135
|
-
inSection = false;
|
|
136
|
-
continue;
|
|
137
|
-
}
|
|
138
|
-
const file = blockerSectionFile(line);
|
|
139
|
-
if (file === undefined) {
|
|
140
|
-
// Body of the open section, or — with no section open — text that no
|
|
141
|
-
// entry of `blockingFiles` can be held responsible for.
|
|
142
|
-
if (!inSection)
|
|
143
|
-
return undefined;
|
|
144
|
-
continue;
|
|
145
|
-
}
|
|
146
|
-
sectionKeys.push(guardPathKey(file, cwd));
|
|
147
|
-
inSection = true;
|
|
148
|
-
}
|
|
149
|
-
// No line opened a section, so there is nothing for `blockingFiles` to be
|
|
150
|
-
// checked against and nothing a per-file dispatch may claim authority over.
|
|
151
|
-
// All-blank-but-non-empty text lands here (HIGH-3287-1, round 1's fail-open):
|
|
152
|
-
// `[].every(…)` is vacuously true, so treating zero sections as "nothing left
|
|
153
|
-
// to attribute" let a clean dispatch of an unrelated file DELETE a record
|
|
154
|
-
// whose `blockingFiles` named a different file, and the gate then answered
|
|
155
|
-
// `no_record`. Unattributed is not clean.
|
|
156
|
-
if (sectionKeys.length === 0)
|
|
157
|
-
return undefined;
|
|
158
|
-
return sectionKeys.every((key) => provenanceKeys.includes(key))
|
|
159
|
-
? sectionKeys
|
|
160
|
-
: undefined;
|
|
161
|
-
}
|
|
162
|
-
function getShellCommand(input) {
|
|
163
|
-
if (!input || typeof input !== "object")
|
|
164
|
-
return "";
|
|
165
|
-
const raw = input;
|
|
166
|
-
if (typeof raw.command === "string" && raw.command.trim())
|
|
167
|
-
return raw.command;
|
|
168
|
-
if (typeof raw.cmd === "string" && raw.cmd.trim())
|
|
169
|
-
return raw.cmd;
|
|
170
|
-
if (typeof raw.command === "string")
|
|
171
|
-
return raw.command;
|
|
172
|
-
return "";
|
|
173
|
-
}
|
|
174
|
-
function executableName(value) {
|
|
175
|
-
const normalized = value.replace(/\\/g, "/");
|
|
176
|
-
let name = (normalized.slice(normalized.lastIndexOf("/") + 1) ?? "").toLowerCase();
|
|
177
|
-
// Shell launchers are commonly supplied as resolved Windows paths or as
|
|
178
|
-
// PATHEXT-qualified names. Guard classification must happen after the same
|
|
179
|
-
// basename/extension normalization for every wrapper family.
|
|
180
|
-
return name.replace(/\.(?:exe|com|bat|cmd)$/i, "");
|
|
181
|
-
}
|
|
182
|
-
function isShellWrapper(value) {
|
|
183
|
-
return new Set([
|
|
184
|
-
"sh",
|
|
185
|
-
"bash",
|
|
186
|
-
"dash",
|
|
187
|
-
"zsh",
|
|
188
|
-
"ash",
|
|
189
|
-
"cmd",
|
|
190
|
-
"pwsh",
|
|
191
|
-
"powershell",
|
|
192
|
-
]).has(executableName(value));
|
|
193
|
-
}
|
|
194
|
-
function isGitExecutable(value) {
|
|
195
|
-
return new Set(["git", "git.exe", "git.cmd", "git.bat"]).has(executableName(value));
|
|
196
|
-
}
|
|
197
|
-
const COMMAND_STRING_WRAPPERS = new Set(["busybox", "toybox", "nix-shell"]);
|
|
198
|
-
function isCommandStringWrapper(value) {
|
|
199
|
-
return COMMAND_STRING_WRAPPERS.has(executableName(value));
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Canonicalize shell parameter separators before command classification. The
|
|
203
|
-
* quote-aware pass deliberately leaves literal arguments alone; the lexer
|
|
204
|
-
* then supplies the command-position boundaries used by the guard.
|
|
205
|
-
*/
|
|
206
|
-
function canonicalizeGuardCommand(command) {
|
|
207
|
-
let result = "";
|
|
208
|
-
let quote;
|
|
209
|
-
let escaped = false;
|
|
210
|
-
for (let i = 0; i < command.length; i++) {
|
|
211
|
-
const ch = command[i];
|
|
212
|
-
if (quote === "single") {
|
|
213
|
-
result += ch;
|
|
214
|
-
if (ch === "'")
|
|
215
|
-
quote = undefined;
|
|
216
|
-
continue;
|
|
217
|
-
}
|
|
218
|
-
if (quote === "double") {
|
|
219
|
-
result += ch;
|
|
220
|
-
if (escaped)
|
|
221
|
-
escaped = false;
|
|
222
|
-
else if (ch === "\\")
|
|
223
|
-
escaped = true;
|
|
224
|
-
else if (ch === '"')
|
|
225
|
-
quote = undefined;
|
|
226
|
-
continue;
|
|
227
|
-
}
|
|
228
|
-
if (ch === "'" || ch === '"') {
|
|
229
|
-
quote = ch === "'" ? "single" : "double";
|
|
230
|
-
result += ch;
|
|
231
|
-
continue;
|
|
232
|
-
}
|
|
233
|
-
const parameter = command.slice(i).match(/^\$\{IFS[^}]*\}/)?.[0];
|
|
234
|
-
const positional = command.slice(i).match(/^\$IFS(?:\$[0-9]+)?/)?.[0];
|
|
235
|
-
if (parameter || positional) {
|
|
236
|
-
result += " ";
|
|
237
|
-
i += (parameter ?? positional ?? "").length - 1;
|
|
238
|
-
continue;
|
|
239
|
-
}
|
|
240
|
-
result += ch;
|
|
241
|
-
}
|
|
242
|
-
let collapsed = "";
|
|
243
|
-
let pendingSpace = false;
|
|
244
|
-
quote = undefined;
|
|
245
|
-
for (const ch of result) {
|
|
246
|
-
if (!quote && ch === "\n") {
|
|
247
|
-
collapsed += ch;
|
|
248
|
-
pendingSpace = false;
|
|
249
|
-
continue;
|
|
250
|
-
}
|
|
251
|
-
if (!quote && /\s/.test(ch)) {
|
|
252
|
-
pendingSpace = collapsed.length > 0;
|
|
253
|
-
continue;
|
|
254
|
-
}
|
|
255
|
-
if (pendingSpace)
|
|
256
|
-
collapsed += " ";
|
|
257
|
-
pendingSpace = false;
|
|
258
|
-
collapsed += ch;
|
|
259
|
-
if (!quote && (ch === "'" || ch === '"')) {
|
|
260
|
-
quote = ch === "'" ? "single" : "double";
|
|
261
|
-
}
|
|
262
|
-
else if ((quote === "single" && ch === "'") ||
|
|
263
|
-
(quote === "double" && ch === '"')) {
|
|
264
|
-
quote = undefined;
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
return collapsed.trim();
|
|
268
|
-
}
|
|
269
|
-
/** Normalize only a command-position token; never apply this to path args. */
|
|
270
|
-
function normalizeGuardVerbToken(value) {
|
|
271
|
-
return value
|
|
272
|
-
.replace(/\\(?=[A-Za-z0-9_])/g, "")
|
|
273
|
-
.replace(/`(?=.)/g, "")
|
|
274
|
-
.replace(/\^(?=.)/g, "");
|
|
275
|
-
}
|
|
276
|
-
function expandGuardVerbToken(value) {
|
|
277
|
-
return normalizeGuardVerbToken(value).trim().split(/\s+/).filter(Boolean);
|
|
278
|
-
}
|
|
279
|
-
function delimitedSubstitutionBody(command, start, opener, closer) {
|
|
280
|
-
let depth = 1;
|
|
281
|
-
let quote;
|
|
282
|
-
let escaped = false;
|
|
283
|
-
for (let i = start + opener.length; i < command.length; i++) {
|
|
284
|
-
const ch = command[i];
|
|
285
|
-
if (quote === "single") {
|
|
286
|
-
if (ch === "'")
|
|
287
|
-
quote = undefined;
|
|
288
|
-
continue;
|
|
289
|
-
}
|
|
290
|
-
if (quote === "double" && ch === '"') {
|
|
291
|
-
quote = undefined;
|
|
292
|
-
continue;
|
|
293
|
-
}
|
|
294
|
-
if (escaped) {
|
|
295
|
-
escaped = false;
|
|
296
|
-
continue;
|
|
297
|
-
}
|
|
298
|
-
if (ch === "\\") {
|
|
299
|
-
escaped = true;
|
|
300
|
-
continue;
|
|
301
|
-
}
|
|
302
|
-
if (ch === "'" || ch === '"') {
|
|
303
|
-
quote = ch === "'" ? "single" : "double";
|
|
304
|
-
continue;
|
|
305
|
-
}
|
|
306
|
-
if (command.startsWith(opener, i)) {
|
|
307
|
-
depth += 1;
|
|
308
|
-
i += opener.length - 1;
|
|
309
|
-
continue;
|
|
310
|
-
}
|
|
311
|
-
if (command.startsWith(closer, i) && --depth === 0) {
|
|
312
|
-
return { body: command.slice(start + opener.length, i), end: i };
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
return undefined;
|
|
316
|
-
}
|
|
317
|
-
const COMMIT_PUSH_MATCHER = {
|
|
318
|
-
id: "commit-push",
|
|
319
|
-
matchesVerb: (verb) => verb === "commit" || verb === "push",
|
|
320
|
-
indirectAlwaysMatches: true,
|
|
321
|
-
suppressPostVerbHelp: false,
|
|
322
|
-
};
|
|
323
|
-
function containsGuardedSubstitution(command, depth, matcher) {
|
|
324
|
-
if (depth > 3)
|
|
325
|
-
return false;
|
|
326
|
-
let quote;
|
|
327
|
-
let escaped = false;
|
|
328
|
-
for (let i = 0; i < command.length; i++) {
|
|
329
|
-
const ch = command[i];
|
|
330
|
-
if (quote === "single") {
|
|
331
|
-
if (ch === "'")
|
|
332
|
-
quote = undefined;
|
|
333
|
-
continue;
|
|
334
|
-
}
|
|
335
|
-
if (quote === "double" && ch === '"') {
|
|
336
|
-
quote = undefined;
|
|
337
|
-
continue;
|
|
338
|
-
}
|
|
339
|
-
if (escaped) {
|
|
340
|
-
escaped = false;
|
|
341
|
-
continue;
|
|
342
|
-
}
|
|
343
|
-
if (ch === "\\") {
|
|
344
|
-
escaped = true;
|
|
345
|
-
continue;
|
|
346
|
-
}
|
|
347
|
-
if (ch === '"' || ch === "'") {
|
|
348
|
-
quote = ch === "'" ? "single" : "double";
|
|
349
|
-
continue;
|
|
350
|
-
}
|
|
351
|
-
const substitution = command.startsWith("$(", i)
|
|
352
|
-
? delimitedSubstitutionBody(command, i, "$(", ")")
|
|
353
|
-
: command.startsWith("<(", i)
|
|
354
|
-
? delimitedSubstitutionBody(command, i, "<(", ")")
|
|
355
|
-
: command.startsWith(">(", i)
|
|
356
|
-
? delimitedSubstitutionBody(command, i, ">(", ")")
|
|
357
|
-
: ch === "`"
|
|
358
|
-
? {
|
|
359
|
-
body: command.slice(i + 1, command.indexOf("`", i + 1)),
|
|
360
|
-
end: command.indexOf("`", i + 1),
|
|
361
|
-
}
|
|
362
|
-
: undefined;
|
|
363
|
-
if (substitution && substitution.end >= 0) {
|
|
364
|
-
const nested = canonicalizeGuardCommand(substitution.body);
|
|
365
|
-
if (containsGuardedSubstitution(nested, depth + 1, matcher) ||
|
|
366
|
-
tokenizeShellCommand(nested).some((segment) => containsGuardedGitVerb(segment.tokens, depth + 1, matcher))) {
|
|
367
|
-
return true;
|
|
368
|
-
}
|
|
369
|
-
i = substitution.end;
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
return false;
|
|
373
|
-
}
|
|
374
|
-
/** Git global options that consume the following token as their value. */
|
|
375
|
-
const GIT_GLOBAL_OPTIONS_WITH_VALUE = new Set([
|
|
376
|
-
"-C",
|
|
377
|
-
"-c",
|
|
378
|
-
"--config-env",
|
|
379
|
-
"--git-dir",
|
|
380
|
-
"--work-tree",
|
|
381
|
-
"--exec-path",
|
|
382
|
-
"--namespace",
|
|
383
|
-
]);
|
|
384
|
-
const GIT_GLOBAL_OPTIONS_WITH_INLINE_VALUE = [
|
|
385
|
-
"--config-env",
|
|
386
|
-
"--git-dir",
|
|
387
|
-
"--work-tree",
|
|
388
|
-
"--exec-path",
|
|
389
|
-
"--namespace",
|
|
390
|
-
];
|
|
391
|
-
/**
|
|
392
|
-
* Index of git's subcommand token in `gitTokens` (which starts at the `git`
|
|
393
|
-
* executable), after skipping global options and their values. Returns
|
|
394
|
-
* `undefined` when the invocation has no subcommand at all — `git --help`,
|
|
395
|
-
* `git --version`, or a trailing option with no verb behind it.
|
|
396
|
-
*
|
|
397
|
-
* Shared by the direct and indirect paths so both ask the same question about
|
|
398
|
-
* the same position (#2007).
|
|
399
|
-
*/
|
|
400
|
-
function gitVerbIndex(gitTokens) {
|
|
401
|
-
let i = 1;
|
|
402
|
-
while (i < gitTokens.length && gitTokens[i].startsWith("-")) {
|
|
403
|
-
const option = gitTokens[i];
|
|
404
|
-
if (["--help", "-h", "--version", "-v", "-V"].includes(option)) {
|
|
405
|
-
return undefined;
|
|
406
|
-
}
|
|
407
|
-
if (option === "--")
|
|
408
|
-
return i + 1 < gitTokens.length ? i + 1 : undefined;
|
|
409
|
-
if (["-C", "-c"].some((prefix) => option.startsWith(prefix) && option.length > prefix.length)) {
|
|
410
|
-
i += 1;
|
|
411
|
-
continue;
|
|
412
|
-
}
|
|
413
|
-
if (GIT_GLOBAL_OPTIONS_WITH_INLINE_VALUE.some((prefix) => option.startsWith(`${prefix}=`))) {
|
|
414
|
-
i += 1;
|
|
415
|
-
continue;
|
|
416
|
-
}
|
|
417
|
-
i += GIT_GLOBAL_OPTIONS_WITH_VALUE.has(option) ? 2 : 1;
|
|
418
|
-
}
|
|
419
|
-
return i < gitTokens.length ? i : undefined;
|
|
420
|
-
}
|
|
421
|
-
/**
|
|
422
|
-
* True when the subcommand in git's command position is one the matcher
|
|
423
|
-
* governs. `gitTokens[0]` is the `git` executable token.
|
|
424
|
-
*/
|
|
425
|
-
export function matchGitVerbAtCommandPosition(gitTokens, matcher) {
|
|
426
|
-
const index = gitVerbIndex(gitTokens);
|
|
427
|
-
if (index === undefined)
|
|
428
|
-
return false;
|
|
429
|
-
const argsAfterVerb = gitTokens.slice(index + 1);
|
|
430
|
-
// `git checkout --help` prints documentation and touches nothing, and the
|
|
431
|
-
// global-option walk above cannot see it, because it sits AFTER the verb.
|
|
432
|
-
//
|
|
433
|
-
// Only the FIRST argument counts, and only for matchers that opt in. `-h`
|
|
434
|
-
// deeper in the argv may be an option VALUE rather than a help request —
|
|
435
|
-
// `git commit -m -h` commits with the message `-h`, `git clean -e -h`
|
|
436
|
-
// excludes a pattern named `-h`. Reading any position would need a
|
|
437
|
-
// per-verb table of value-taking options for every governed verb, which is
|
|
438
|
-
// exactly the hand-maintained parallel list this repo forbids, and every
|
|
439
|
-
// gap in it would silently UNDER-block. Leading-position-only needs no
|
|
440
|
-
// table, covers how help is actually invoked, and every other spelling
|
|
441
|
-
// falls through to a match, which is the safe direction for a guard.
|
|
442
|
-
if (matcher.suppressPostVerbHelp &&
|
|
443
|
-
(argsAfterVerb[0] === "--help" || argsAfterVerb[0] === "-h")) {
|
|
444
|
-
return false;
|
|
445
|
-
}
|
|
446
|
-
const verbs = expandGuardVerbToken(gitTokens[index] ?? "");
|
|
447
|
-
return verbs.length === 1 && matcher.matchesVerb(verbs[0], argsAfterVerb);
|
|
448
|
-
}
|
|
449
|
-
/** Strip one layer of shell quoting the lexer preserved on a value token. */
|
|
450
|
-
function unquoteGuardValue(value) {
|
|
451
|
-
const trimmed = value.trim();
|
|
452
|
-
if (trimmed.length >= 2) {
|
|
453
|
-
const first = trimmed[0];
|
|
454
|
-
const last = trimmed[trimmed.length - 1];
|
|
455
|
-
if ((first === '"' || first === "'") && first === last) {
|
|
456
|
-
return trimmed.slice(1, -1);
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
return trimmed;
|
|
460
|
-
}
|
|
461
|
-
/**
|
|
462
|
-
* The directory a git invocation actually targets (#2007).
|
|
463
|
-
*
|
|
464
|
-
* `git -C <dir>` and `--work-tree` retarget the command at a DIFFERENT
|
|
465
|
-
* directory, so a guard that evaluates the caller's cwd would inspect the
|
|
466
|
-
* wrong working tree and allow a destructive command against a shared one.
|
|
467
|
-
* `-C` composes cumulatively, exactly as git applies it; `--work-tree` names
|
|
468
|
-
* the working tree directly and therefore wins.
|
|
469
|
-
*
|
|
470
|
-
* Returns the resolved absolute directory, or `cwd` when the invocation
|
|
471
|
-
* carries no retargeting option.
|
|
472
|
-
*/
|
|
473
|
-
export function resolveGitTargetDirectory(gitTokens, cwd) {
|
|
474
|
-
let base = cwd;
|
|
475
|
-
let workTree;
|
|
476
|
-
let i = 1;
|
|
477
|
-
while (i < gitTokens.length && gitTokens[i].startsWith("-")) {
|
|
478
|
-
const option = gitTokens[i];
|
|
479
|
-
if (["--help", "-h", "--version", "-v", "-V"].includes(option))
|
|
480
|
-
break;
|
|
481
|
-
if (option === "--")
|
|
482
|
-
break;
|
|
483
|
-
if (option === "-C" && i + 1 < gitTokens.length) {
|
|
484
|
-
base = path.resolve(base, unquoteGuardValue(gitTokens[i + 1]));
|
|
485
|
-
i += 2;
|
|
486
|
-
continue;
|
|
487
|
-
}
|
|
488
|
-
if (option.startsWith("-C") && option.length > 2) {
|
|
489
|
-
base = path.resolve(base, unquoteGuardValue(option.slice(2)));
|
|
490
|
-
i += 1;
|
|
491
|
-
continue;
|
|
492
|
-
}
|
|
493
|
-
if (option === "--work-tree" && i + 1 < gitTokens.length) {
|
|
494
|
-
workTree = unquoteGuardValue(gitTokens[i + 1]);
|
|
495
|
-
i += 2;
|
|
496
|
-
continue;
|
|
497
|
-
}
|
|
498
|
-
if (option.startsWith("--work-tree=")) {
|
|
499
|
-
workTree = unquoteGuardValue(option.slice("--work-tree=".length));
|
|
500
|
-
i += 1;
|
|
501
|
-
continue;
|
|
502
|
-
}
|
|
503
|
-
if (option.startsWith("-c") &&
|
|
504
|
-
option.length > 2 &&
|
|
505
|
-
!option.startsWith("--")) {
|
|
506
|
-
i += 1;
|
|
507
|
-
continue;
|
|
508
|
-
}
|
|
509
|
-
if (GIT_GLOBAL_OPTIONS_WITH_INLINE_VALUE.some((prefix) => option.startsWith(`${prefix}=`))) {
|
|
510
|
-
i += 1;
|
|
511
|
-
continue;
|
|
512
|
-
}
|
|
513
|
-
i += GIT_GLOBAL_OPTIONS_WITH_VALUE.has(option) ? 2 : 1;
|
|
514
|
-
}
|
|
515
|
-
return workTree === undefined ? base : path.resolve(base, workTree);
|
|
516
|
-
}
|
|
517
|
-
/**
|
|
518
|
-
* Every git invocation the command contains, as token arrays starting at the
|
|
519
|
-
* `git` executable. Used by callers that must know WHICH directory a matched
|
|
520
|
-
* command targets, not merely that it matched (#2007).
|
|
521
|
-
*/
|
|
522
|
-
export function collectGitInvocations(toolName, input) {
|
|
523
|
-
if (toolName !== "bash")
|
|
524
|
-
return [];
|
|
525
|
-
const command = getShellCommand(input);
|
|
526
|
-
if (!command)
|
|
527
|
-
return [];
|
|
528
|
-
const invocations = [];
|
|
529
|
-
for (const segment of tokenizeShellCommand(canonicalizeGuardCommand(command))) {
|
|
530
|
-
const gitIndex = segment.tokens.findIndex((token) => isGitExecutable(token));
|
|
531
|
-
if (gitIndex >= 0)
|
|
532
|
-
invocations.push(segment.tokens.slice(gitIndex));
|
|
533
|
-
}
|
|
534
|
-
return invocations;
|
|
535
|
-
}
|
|
536
|
-
function containsGuardedGitVerb(tokens, depth, matcher) {
|
|
537
|
-
if (depth > 3 || tokens.length === 0)
|
|
538
|
-
return false;
|
|
539
|
-
let commandTokens = tokens;
|
|
540
|
-
while (/^[A-Za-z_][A-Za-z0-9_]*=/.test(commandTokens[0] ?? "")) {
|
|
541
|
-
commandTokens = commandTokens.slice(1);
|
|
542
|
-
}
|
|
543
|
-
if (commandTokens.length === 0)
|
|
544
|
-
return false;
|
|
545
|
-
const expandedHead = expandGuardVerbToken(commandTokens[0] ?? "");
|
|
546
|
-
if (expandedHead.length > 1) {
|
|
547
|
-
commandTokens = [...expandedHead, ...commandTokens.slice(1)];
|
|
548
|
-
}
|
|
549
|
-
if (isCommandStringWrapper(commandTokens[0] ?? "")) {
|
|
550
|
-
const lower = commandTokens.slice(1).map((token) => token.toLowerCase());
|
|
551
|
-
const runIndex = lower.findIndex((token) => token === "--run");
|
|
552
|
-
if (runIndex >= 0 && runIndex + 1 < commandTokens.length) {
|
|
553
|
-
const nestedCommand = commandTokens.slice(runIndex + 2).join(" ");
|
|
554
|
-
return tokenizeShellCommand(canonicalizeGuardCommand(nestedCommand)).some((segment) => containsGuardedGitVerb(segment.tokens, depth + 1, matcher));
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
// These commands consume their following words as text/patterns; a bare
|
|
558
|
-
// git token in their arguments is not an indirect executable invocation.
|
|
559
|
-
// `$(git push)` is execution and must block; `"git push"` as literal text
|
|
560
|
-
// is allowed. Substitutions are screened before this text-consumer escape.
|
|
561
|
-
if (["echo", "printf", "grep"].includes(executableName(commandTokens[0] ?? ""))) {
|
|
562
|
-
return false;
|
|
563
|
-
}
|
|
564
|
-
const gitIndex = commandTokens.findIndex((token) => isGitExecutable(token));
|
|
565
|
-
if (gitIndex >= 0) {
|
|
566
|
-
// Any non-leading git invocation is indirect. Do not maintain a wrapper
|
|
567
|
-
// or flag allowlist: unknown launchers are the security boundary here.
|
|
568
|
-
if (gitIndex > 0 && matcher.indirectAlwaysMatches)
|
|
569
|
-
return true;
|
|
570
|
-
// #2007: a guard that protects the agent from its own accident must not
|
|
571
|
-
// decline `xargs git status`, so the indirect path stays armed only when
|
|
572
|
-
// a governed verb sits in git's real COMMAND POSITION. Scanning every
|
|
573
|
-
// token instead would fire on `find . -name checkout | xargs git add`,
|
|
574
|
-
// where `checkout` is a positional value and not a subcommand at all.
|
|
575
|
-
return matchGitVerbAtCommandPosition(commandTokens.slice(gitIndex), matcher);
|
|
576
|
-
}
|
|
577
|
-
const leadingExecutable = commandTokens[0] ?? "";
|
|
578
|
-
const knownCommandStringWrapper = isShellWrapper(leadingExecutable) ||
|
|
579
|
-
isCommandStringWrapper(leadingExecutable);
|
|
580
|
-
if (!knownCommandStringWrapper) {
|
|
581
|
-
// Unknown launchers are a fail-closed boundary only when they explicitly
|
|
582
|
-
// accept a command string. Re-tokenizing the value keeps literal mentions
|
|
583
|
-
// such as `myprog -c "echo git push"` out of the guarded-command path.
|
|
584
|
-
const unknownSwitchIndex = commandTokens
|
|
585
|
-
.slice(1)
|
|
586
|
-
.findIndex((token) => (token.startsWith("-") || token.startsWith("/")) && token.length > 1);
|
|
587
|
-
if (unknownSwitchIndex < 0)
|
|
588
|
-
return false;
|
|
589
|
-
const commandIndex = unknownSwitchIndex + 2;
|
|
590
|
-
if (commandIndex >= commandTokens.length)
|
|
591
|
-
return false;
|
|
592
|
-
const nestedCommand = commandTokens.slice(commandIndex).join(" ");
|
|
593
|
-
return tokenizeShellCommand(canonicalizeGuardCommand(nestedCommand)).some((segment) => containsGuardedGitVerb(segment.tokens, depth + 1, matcher));
|
|
594
|
-
}
|
|
595
|
-
const lower = commandTokens.slice(1).map((token) => token.toLowerCase());
|
|
596
|
-
const switchIndex = lower.findIndex((token) => token === "-c" ||
|
|
597
|
-
token === "--run" ||
|
|
598
|
-
token === "-lc" ||
|
|
599
|
-
(/^-[^-]*c$/.test(token) && !token.startsWith("--")) ||
|
|
600
|
-
token === "/c" ||
|
|
601
|
-
token === "-command" ||
|
|
602
|
-
token === "-command:" ||
|
|
603
|
-
token === "-encodedcommand");
|
|
604
|
-
if (switchIndex < 0 || switchIndex + 1 >= commandTokens.length)
|
|
605
|
-
return false;
|
|
606
|
-
// Encoded PowerShell is intentionally unsupported: decoding it here would
|
|
607
|
-
// be a second shell/parser and could turn an ambiguous command into a false
|
|
608
|
-
// allow. Plain -Command/-c is safely handed back to the shared lexer.
|
|
609
|
-
if (lower[switchIndex] === "-encodedcommand")
|
|
610
|
-
return false;
|
|
611
|
-
// switchIndex is relative to commandTokens.slice(1), so +2 addresses the
|
|
612
|
-
// command token after the switch for both cmd and PowerShell. This also
|
|
613
|
-
// handles cmd options preceding /C (for example `/S /C`).
|
|
614
|
-
let commandIndex = switchIndex + 2;
|
|
615
|
-
if (commandTokens[commandIndex] === "--")
|
|
616
|
-
commandIndex += 1;
|
|
617
|
-
const nestedCommand = commandTokens.slice(commandIndex).join(" ");
|
|
618
|
-
return tokenizeShellCommand(canonicalizeGuardCommand(nestedCommand)).some((segment) => containsGuardedGitVerb(segment.tokens, depth + 1, matcher));
|
|
619
|
-
}
|
|
620
|
-
/**
|
|
621
|
-
* Analyze actual executable invocations, not substrings in shell text.
|
|
622
|
-
*
|
|
623
|
-
* Shared entry point for every guard that needs "is this bash input really a
|
|
624
|
-
* git invocation of a verb I govern" (#2007). The verb question is the only
|
|
625
|
-
* parameter; wrapper, substitution, and text-consumer analysis are identical
|
|
626
|
-
* for all callers by construction.
|
|
627
|
-
*/
|
|
628
|
-
export function detectGuardedGitVerb(toolName, input, matcher) {
|
|
629
|
-
if (toolName !== "bash")
|
|
630
|
-
return false;
|
|
631
|
-
const command = getShellCommand(input);
|
|
632
|
-
if (!command)
|
|
633
|
-
return false;
|
|
634
|
-
const canonical = canonicalizeGuardCommand(command);
|
|
635
|
-
if (containsGuardedSubstitution(canonical, 0, matcher))
|
|
636
|
-
return true;
|
|
637
|
-
return tokenizeShellCommand(canonical).some((segment) => containsGuardedGitVerb(segment.tokens, 0, matcher));
|
|
638
|
-
}
|
|
639
|
-
/** The #1063 commit gate's own question. */
|
|
640
|
-
export function isGitCommitOrPushAttempt(toolName, input) {
|
|
641
|
-
return detectGuardedGitVerb(toolName, input, COMMIT_PUSH_MATCHER);
|
|
642
|
-
}
|
|
643
|
-
function isTurnEndFindingsCache(value) {
|
|
644
|
-
if (!value || typeof value !== "object")
|
|
645
|
-
return false;
|
|
646
|
-
const record = value;
|
|
647
|
-
return (typeof record.content === "string" &&
|
|
648
|
-
typeof record.hasBlockers === "boolean" &&
|
|
649
|
-
Array.isArray(record.affectedFiles) &&
|
|
650
|
-
record.affectedFiles.every((file) => typeof file === "string") &&
|
|
651
|
-
typeof record.sessionId === "string" &&
|
|
652
|
-
typeof record.projectSeqStart === "number" &&
|
|
653
|
-
typeof record.projectSeqEnd === "number" &&
|
|
654
|
-
Number.isFinite(record.projectSeqStart) &&
|
|
655
|
-
Number.isFinite(record.projectSeqEnd) &&
|
|
656
|
-
!!record.fileSeqByPath &&
|
|
657
|
-
typeof record.fileSeqByPath === "object" &&
|
|
658
|
-
Object.values(record.fileSeqByPath).every((seq) => typeof seq === "number" && Number.isFinite(seq)) &&
|
|
659
|
-
!!record.fileContentHashes &&
|
|
660
|
-
typeof record.fileContentHashes === "object" &&
|
|
661
|
-
Object.values(record.fileContentHashes).every((hash) => typeof hash === "string") &&
|
|
662
|
-
(record.affectedFilesTruncated === undefined ||
|
|
663
|
-
typeof record.affectedFilesTruncated === "boolean") &&
|
|
664
|
-
(record.blockingFiles === undefined || Array.isArray(record.blockingFiles)));
|
|
665
|
-
}
|
|
666
|
-
function cacheRecord(cacheManager, cwd) {
|
|
667
|
-
const entry = cacheManager.readCache("turn-end-findings", cwd);
|
|
668
|
-
return entry && isTurnEndFindingsCache(entry.data) ? entry.data : undefined;
|
|
669
|
-
}
|
|
670
|
-
function markCacheUnknown(runtime, reason) {
|
|
671
|
-
runtime.markGitGuardCacheUnknown(reason);
|
|
672
|
-
}
|
|
673
|
-
/** Persist a complete, bounded, content-bound guard record. */
|
|
674
|
-
export function writeGitGuardRecord(cacheManager, runtime, cwd, record) {
|
|
675
|
-
const capped = capAffectedFiles(Array.isArray(record.affectedFiles) ? record.affectedFiles : [], cwd);
|
|
676
|
-
const fileSeqByPath = { ...record.fileSeqByPath };
|
|
677
|
-
for (const file of capped.files) {
|
|
678
|
-
const key = guardPathKey(file, cwd);
|
|
679
|
-
if (fileSeqByPath[key] === undefined) {
|
|
680
|
-
fileSeqByPath[key] = runtime.getFileSeq(resolveGuardPath(file, cwd));
|
|
681
|
-
}
|
|
682
|
-
}
|
|
683
|
-
const currentProvenance = snapshotAdvisoryProvenance({
|
|
684
|
-
cwd,
|
|
685
|
-
runtime,
|
|
686
|
-
generation: 0,
|
|
687
|
-
files: capped.files.map((file) => ({
|
|
688
|
-
path: file,
|
|
689
|
-
role: "affected",
|
|
690
|
-
})),
|
|
691
|
-
truncated: capped.truncated,
|
|
692
|
-
});
|
|
693
|
-
const fileContentHashes = Object.fromEntries(currentProvenance.files.map((file) => [
|
|
694
|
-
guardPathKey(file.path, cwd),
|
|
695
|
-
file.sha256,
|
|
696
|
-
]));
|
|
697
|
-
const data = {
|
|
698
|
-
...record,
|
|
699
|
-
affectedFiles: capped.files,
|
|
700
|
-
affectedFilesTruncated: capped.truncated,
|
|
701
|
-
fileSeqByPath,
|
|
702
|
-
blockingFiles: Array.isArray(record.blockingFiles)
|
|
703
|
-
? capAffectedFiles(record.blockingFiles, cwd).files
|
|
704
|
-
: undefined,
|
|
705
|
-
fileContentHashes,
|
|
706
|
-
provenance: record.provenance ?? currentProvenance,
|
|
707
|
-
};
|
|
708
|
-
try {
|
|
709
|
-
cacheManager.writeCache("turn-end-findings", data, cwd);
|
|
710
|
-
runtime.clearGitGuardCacheUnknown();
|
|
711
|
-
return true;
|
|
712
|
-
}
|
|
713
|
-
catch {
|
|
714
|
-
markCacheUnknown(runtime, "cache_write_failed");
|
|
715
|
-
return false;
|
|
716
|
-
}
|
|
717
|
-
}
|
|
718
|
-
function logDecision(cwd, decision, reasonCategory, metadata = {}) {
|
|
719
|
-
logLatency({
|
|
720
|
-
type: "phase",
|
|
721
|
-
toolName: "git-guard",
|
|
722
|
-
filePath: cwd,
|
|
723
|
-
phase: "decision",
|
|
724
|
-
durationMs: 0,
|
|
725
|
-
result: decision,
|
|
726
|
-
metadata: { decision, reasonCategory, ...metadata },
|
|
727
|
-
});
|
|
728
|
-
}
|
|
729
|
-
function unknown(cwd, reasonCategory, metadata = {}) {
|
|
730
|
-
logDecision(cwd, "unknown", reasonCategory, metadata);
|
|
731
|
-
return {
|
|
732
|
-
block: true,
|
|
733
|
-
unknown: true,
|
|
734
|
-
reason: `🔴 COMMIT BLOCKED (--lens-guard): blocker state is unknown (${reasonCategory}). Re-run pi-lens checks or start a fresh session, then retry.`,
|
|
735
|
-
};
|
|
736
|
-
}
|
|
737
|
-
/**
|
|
738
|
-
* Reconcile the one persisted record after a per-file dispatch. This is called
|
|
739
|
-
* on tool_result, never tool_call, and therefore does not add disk I/O to the
|
|
740
|
-
* edit preflight path.
|
|
741
|
-
*/
|
|
742
|
-
/**
|
|
743
|
-
* Retire one file's inline blocker on a confirmed-clean verdict, then bring the
|
|
744
|
-
* commit gate back in line with the map (#1561 F2).
|
|
745
|
-
*
|
|
746
|
-
* Retiring the map entry alone is not enough and claiming otherwise was wrong:
|
|
747
|
-
* the gate reads a LATCH (`gitGuardHasBlockers`) and a PERSISTED record, and
|
|
748
|
-
* `evaluateGitGuard` short-circuits on the latch before it ever looks at the
|
|
749
|
-
* record. A retire that touched neither left the commit blocked and quoted the
|
|
750
|
-
* retired blocker back as the reason.
|
|
751
|
-
*
|
|
752
|
-
* Both are recomputed exactly the way a clean dispatch recomputes them:
|
|
753
|
-
* `updateGitGuardStatus(false, "")` re-derives the latch from the blocker map
|
|
754
|
-
* — it cannot clear a latch another file's live blocker still justifies,
|
|
755
|
-
* because that file's entry is still in the map — and `syncGitGuardRecord`
|
|
756
|
-
* rewrites the persisted record from the same source of truth.
|
|
757
|
-
*
|
|
758
|
-
* Colocated with the gate rather than inlined at the wiring site so the claim
|
|
759
|
-
* is testable without booting the extension.
|
|
760
|
-
*
|
|
761
|
-
* @returns true when an entry was retired (the caller logs it — #1432 Gap 1).
|
|
762
|
-
*/
|
|
763
|
-
export function retireInlineBlockerAndResyncGuard(args) {
|
|
764
|
-
const retired = args.runtime.retireInlineBlockerOnConfirmedClean(args.filePath, args.writeIndex, args.coveredSources);
|
|
765
|
-
if (!retired)
|
|
766
|
-
return false;
|
|
767
|
-
args.runtime.updateGitGuardStatus(false, "");
|
|
768
|
-
if (args.lensGuardEnabled) {
|
|
769
|
-
syncGitGuardRecord(args.runtime, args.cacheManager, args.cwd, args.filePath);
|
|
770
|
-
}
|
|
771
|
-
return true;
|
|
772
|
-
}
|
|
773
|
-
/**
|
|
774
|
-
* Bring the commit-gate LATCH back in line with the turn-end disposition
|
|
775
|
-
* policy (#3248), at the point where the post-policy survivor set per file is
|
|
776
|
-
* final.
|
|
777
|
-
*
|
|
778
|
-
* The defect this exists for: the agent marks every blocker on a file
|
|
779
|
-
* `false-positive`, the turn-end composer renders no `Unresolved from this
|
|
780
|
-
* turn` section and no `🔴 STOP` — and `lens-guard` still blocks the commit,
|
|
781
|
-
* because `evaluateGitGuard` reads the LATCH first and the latch counted the
|
|
782
|
-
* still-present map entry. The blocker record stays in the map on purpose: the
|
|
783
|
-
* policy is content-bound and re-derived every turn end, so retiring the entry
|
|
784
|
-
* would be silencing rather than filtering (AGENTS.md shape 10). It carries
|
|
785
|
-
* the verdict instead, and the two gate derivations honor it — this latch, and
|
|
786
|
-
* `syncGitGuardRecord`'s persisted `blockerContent` below.
|
|
787
|
-
*
|
|
788
|
-
* The persisted record needs no third writer here. The composer that calls
|
|
789
|
-
* this rewrites it later in the SAME turn end from the same survivor set —
|
|
790
|
-
* `writeGitGuardRecord` with `hasBlockers` derived from the surviving blocker
|
|
791
|
-
* sections (`clients/runtime-turn.ts:4287`, and the dedupe path at `:4231`),
|
|
792
|
-
* or `clearCache("turn-end-findings")` when nothing survives
|
|
793
|
-
* (`clients/runtime-turn.ts:4379`) — and that clear is itself gated on the
|
|
794
|
-
* latch this call just recomputed. Adding a second durable writer between them
|
|
795
|
-
* would only race the one that already owns the record.
|
|
796
|
-
*
|
|
797
|
-
* Colocated with the gate rather than inlined at the wiring site, for the same
|
|
798
|
-
* reason `retireInlineBlockerAndResyncGuard` is: the claim is testable without
|
|
799
|
-
* booting the extension.
|
|
800
|
-
*/
|
|
801
|
-
export function resyncGitGuardAfterInlinePolicy(args) {
|
|
802
|
-
const changed = args.runtime.applyInlineBlockerPolicyVerdicts(args.suppressedFilePaths);
|
|
803
|
-
// Nothing left the gate's view of the map and nothing rejoined it. This is
|
|
804
|
-
// what keeps the recompute off every ordinary turn end: `updateGitGuardStatus`
|
|
805
|
-
// re-derives the latch from the map, and a turn that changed no verdict has
|
|
806
|
-
// no business re-deriving anything.
|
|
807
|
-
if (args.suppressedFilePaths.length === 0 && changed === 0)
|
|
808
|
-
return;
|
|
809
|
-
// Exactly as the retire path re-derives it: `false` is this caller's own
|
|
810
|
-
// contribution, never a blanket clear — a sibling file's surviving blocker
|
|
811
|
-
// is still in the map and still sets the latch.
|
|
812
|
-
args.runtime.updateGitGuardStatus(false, "");
|
|
813
|
-
}
|
|
814
|
-
export function syncGitGuardRecord(runtime, cacheManager, cwd, editedFilePath) {
|
|
815
|
-
// #3248: a record the turn-end policy fully suppressed is not a blocker the
|
|
816
|
-
// commit gate may persist — the agent was shown nothing for it. The entry
|
|
817
|
-
// stays in the map so the next turn re-derives the verdict from current
|
|
818
|
-
// bytes; it just stops speaking for the gate.
|
|
819
|
-
const entries = (runtime.getInlineBlockersSnapshot?.() ?? []).filter((entry) => !entry.policySuppressed);
|
|
820
|
-
const inspection = cacheManager.inspectCache("turn-end-findings", cwd);
|
|
821
|
-
const existing = cacheRecord(cacheManager, cwd);
|
|
822
|
-
if (existing &&
|
|
823
|
-
existing.sessionId !== runtime.telemetrySessionId &&
|
|
824
|
-
entries.length === 0) {
|
|
825
|
-
markCacheUnknown(runtime, "session_mismatch");
|
|
826
|
-
return;
|
|
827
|
-
}
|
|
828
|
-
if (!existing && inspection !== "missing" && entries.length === 0) {
|
|
829
|
-
markCacheUnknown(runtime, `cache_${inspection}`);
|
|
830
|
-
return;
|
|
831
|
-
}
|
|
832
|
-
const fileSeqByPath = {};
|
|
833
|
-
for (const [filePath, seq] of runtime.getFileSeqEntries?.() ?? []) {
|
|
834
|
-
fileSeqByPath[guardPathKey(filePath, cwd)] = seq;
|
|
835
|
-
}
|
|
836
|
-
const inlineFiles = entries.map((entry) => resolveGuardPath(entry.filePath, cwd));
|
|
837
|
-
const existingBlockingFiles = existing?.blockingFiles ?? [];
|
|
838
|
-
const blockerSections = existing?.blockerContent
|
|
839
|
-
? blockingProvenance(existing.blockerContent, existingBlockingFiles, cwd)
|
|
840
|
-
: undefined;
|
|
841
|
-
if (existing?.blockerContent && !blockerSections) {
|
|
842
|
-
markCacheUnknown(runtime, "blocking_provenance_untrusted");
|
|
843
|
-
return;
|
|
844
|
-
}
|
|
845
|
-
const editedKey = editedFilePath
|
|
846
|
-
? guardPathKey(editedFilePath, cwd)
|
|
847
|
-
: undefined;
|
|
848
|
-
const testFiles = existing?.testFailureFiles ?? [];
|
|
849
|
-
const remainingBlockingFiles = editedKey && existingBlockingFiles.length > 0
|
|
850
|
-
? existingBlockingFiles.filter((file) => guardPathKey(file, cwd) !== editedKey)
|
|
851
|
-
: existingBlockingFiles;
|
|
852
|
-
let affectedFiles = [...(existing?.affectedFiles ?? []), ...inlineFiles];
|
|
853
|
-
if (!entries.length && editedKey && existing) {
|
|
854
|
-
const isStillTestFailure = testFiles.some((file) => guardPathKey(file, cwd) === editedKey);
|
|
855
|
-
const isUnknownBlockingPath = existingBlockingFiles.length === 0 && !!existing.blockerContent;
|
|
856
|
-
if (!isStillTestFailure && !isUnknownBlockingPath) {
|
|
857
|
-
affectedFiles = affectedFiles.filter((file) => guardPathKey(file, cwd) !== editedKey);
|
|
858
|
-
}
|
|
859
|
-
}
|
|
860
|
-
// A clean per-file dispatch is authoritative for that file. When every
|
|
861
|
-
// blocker section the persisted record still carries is THIS file's,
|
|
862
|
-
// retaining `blockerContent` would resurrect a blocker the dispatch just
|
|
863
|
-
// cleared on every later git-guard lookup. Records whose text cannot be
|
|
864
|
-
// attributed remain fail-closed: they returned above.
|
|
865
|
-
//
|
|
866
|
-
// The question is asked of the SECTIONS, not of `blockingFiles` (#3282): the
|
|
867
|
-
// turn-end composer persists `blockingFiles: affectedFiles`
|
|
868
|
-
// (`clients/runtime-turn.ts:4292`) — every file the turn touched, blocking or
|
|
869
|
-
// not — so "the list has shrunk to nothing" never became true for a turn that
|
|
870
|
-
// edited a clean file alongside a blocking one, and the fixed blocker was
|
|
871
|
-
// quoted back at every commit for the rest of the session.
|
|
872
|
-
const clearedLastKnownBlocker = !entries.length &&
|
|
873
|
-
!!editedKey &&
|
|
874
|
-
!!blockerSections &&
|
|
875
|
-
blockerSections.every((key) => key === editedKey);
|
|
876
|
-
const blockerContent = entries.length > 0
|
|
877
|
-
? entries.map((entry) => `${entry.filePath}: ${entry.summary}`).join("\n")
|
|
878
|
-
: clearedLastKnownBlocker
|
|
879
|
-
? undefined
|
|
880
|
-
: existing?.blockerContent;
|
|
881
|
-
const hasTestFailures = existing?.testFailures === true;
|
|
882
|
-
const hasBlockers = !!blockerContent || hasTestFailures;
|
|
883
|
-
const content = [
|
|
884
|
-
blockerContent,
|
|
885
|
-
hasTestFailures ? existing?.testFailureContent : undefined,
|
|
886
|
-
]
|
|
887
|
-
.filter((value) => !!value)
|
|
888
|
-
.join("\n\n");
|
|
889
|
-
if (!hasBlockers && !content) {
|
|
890
|
-
cacheManager.clearCache("turn-end-findings", cwd);
|
|
891
|
-
// #3282 acceptance 5: this branch is a COMPLETE recomputation of the
|
|
892
|
-
// gate's state that happens to find nothing left to record, so it owns the
|
|
893
|
-
// unknown reason exactly as `writeGitGuardRecord` does (`:800`). Without
|
|
894
|
-
// this, a reason latched earlier in the session outlived the record it
|
|
895
|
-
// described and refused every commit after it, with no re-run able to
|
|
896
|
-
// clear it.
|
|
897
|
-
runtime.clearGitGuardCacheUnknown();
|
|
898
|
-
return;
|
|
899
|
-
}
|
|
900
|
-
writeGitGuardRecord(cacheManager, runtime, cwd, {
|
|
901
|
-
content: content || existing?.content || "",
|
|
902
|
-
blockerContent,
|
|
903
|
-
blockingFiles: entries.length > 0 ? inlineFiles : remainingBlockingFiles,
|
|
904
|
-
hasBlockers,
|
|
905
|
-
affectedFiles,
|
|
906
|
-
sessionId: runtime.telemetrySessionId,
|
|
907
|
-
projectSeqStart: runtime.turnStartProjectSeq,
|
|
908
|
-
projectSeqEnd: runtime.projectSeq,
|
|
909
|
-
fileSeqByPath,
|
|
910
|
-
fileContentHashes: {},
|
|
911
|
-
consumed: false,
|
|
912
|
-
testFailures: existing?.testFailures,
|
|
913
|
-
testFailureContent: existing?.testFailureContent,
|
|
914
|
-
testFailureFiles: existing?.testFailureFiles,
|
|
915
|
-
});
|
|
916
|
-
}
|
|
917
|
-
/** Add blocking test failures to the same turn-end record. */
|
|
918
|
-
export function mergeGitGuardTestFailure(cacheManager, cwd, runtime, content, files) {
|
|
919
|
-
const existing = cacheRecord(cacheManager, cwd);
|
|
920
|
-
const fileSeqByPath = {};
|
|
921
|
-
for (const [filePath, seq] of runtime.getFileSeqEntries?.() ?? []) {
|
|
922
|
-
fileSeqByPath[guardPathKey(filePath, cwd)] = seq;
|
|
923
|
-
}
|
|
924
|
-
const failedFiles = files.map((file) => resolveGuardPath(file, cwd));
|
|
925
|
-
const blockerContent = existing?.blockerContent;
|
|
926
|
-
const testFailureFiles = [
|
|
927
|
-
...(existing?.testFailureFiles ?? []),
|
|
928
|
-
...failedFiles,
|
|
929
|
-
].filter((file, index, all) => all.findIndex((candidate) => guardPathKey(candidate, cwd) === guardPathKey(file, cwd)) === index);
|
|
930
|
-
writeGitGuardRecord(cacheManager, runtime, cwd, {
|
|
931
|
-
content: [blockerContent, content].filter(Boolean).join("\n\n"),
|
|
932
|
-
blockerContent,
|
|
933
|
-
blockingFiles: existing?.blockingFiles ?? [],
|
|
934
|
-
testFailureContent: content,
|
|
935
|
-
testFailureFiles: testFailureFiles,
|
|
936
|
-
hasBlockers: true,
|
|
937
|
-
affectedFiles: [...(existing?.affectedFiles ?? []), ...failedFiles],
|
|
938
|
-
sessionId: runtime.telemetrySessionId,
|
|
939
|
-
projectSeqStart: runtime.turnStartProjectSeq,
|
|
940
|
-
projectSeqEnd: runtime.projectSeq,
|
|
941
|
-
fileSeqByPath,
|
|
942
|
-
fileContentHashes: {},
|
|
943
|
-
consumed: false,
|
|
944
|
-
testFailures: true,
|
|
945
|
-
});
|
|
946
|
-
}
|
|
947
|
-
/** A passing test run resolves only its own previous test failures. */
|
|
948
|
-
export function clearGitGuardTestFailure(cacheManager, cwd, runtime, passedFiles = []) {
|
|
949
|
-
const existing = cacheRecord(cacheManager, cwd);
|
|
950
|
-
if (!existing?.testFailures)
|
|
951
|
-
return;
|
|
952
|
-
const passedKeys = new Set((passedFiles.length > 0
|
|
953
|
-
? passedFiles
|
|
954
|
-
: (existing.testFailureFiles ?? [])).map((file) => guardPathKey(file, cwd)));
|
|
955
|
-
const remainingFiles = (existing.testFailureFiles ?? []).filter((file) => !passedKeys.has(guardPathKey(file, cwd)));
|
|
956
|
-
const blockerContent = existing.blockerContent ?? "";
|
|
957
|
-
if (!blockerContent && remainingFiles.length === 0) {
|
|
958
|
-
cacheManager.clearCache("turn-end-findings", cwd);
|
|
959
|
-
return;
|
|
960
|
-
}
|
|
961
|
-
const blockingKeys = new Set((existing.blockingFiles ?? []).map((file) => guardPathKey(file, cwd)));
|
|
962
|
-
const affectedFiles = existing.affectedFiles.filter((file) => blockingKeys.has(guardPathKey(file, cwd)) ||
|
|
963
|
-
remainingFiles.some((testFile) => guardPathKey(testFile, cwd) === guardPathKey(file, cwd)));
|
|
964
|
-
writeGitGuardRecord(cacheManager, runtime, cwd, {
|
|
965
|
-
...existing,
|
|
966
|
-
content: blockerContent,
|
|
967
|
-
blockerContent,
|
|
968
|
-
affectedFiles,
|
|
969
|
-
testFailures: remainingFiles.length > 0,
|
|
970
|
-
testFailureContent: remainingFiles.length > 0 ? existing.testFailureContent : undefined,
|
|
971
|
-
testFailureFiles: remainingFiles.length > 0 ? remainingFiles : undefined,
|
|
972
|
-
hasBlockers: !!blockerContent || remainingFiles.length > 0,
|
|
973
|
-
sessionId: runtime.telemetrySessionId,
|
|
974
|
-
projectSeqStart: runtime.turnStartProjectSeq,
|
|
975
|
-
projectSeqEnd: runtime.projectSeq,
|
|
976
|
-
fileSeqByPath: Object.fromEntries(runtime
|
|
977
|
-
.getFileSeqEntries()
|
|
978
|
-
.map(([filePath, seq]) => [guardPathKey(filePath, cwd), seq])),
|
|
979
|
-
fileContentHashes: {},
|
|
980
|
-
});
|
|
981
|
-
}
|
|
982
|
-
/**
|
|
983
|
-
* The first suppression verdict in the blocker map that no longer describes the
|
|
984
|
-
* file it was computed against, if any (#3248 round 2, GG-3283-01).
|
|
985
|
-
*
|
|
986
|
-
* `policySuppressed` is a statement about BYTES: the turn-end policy read the
|
|
987
|
-
* file's current content, re-derived the record's blockers through the
|
|
988
|
-
* content-bound disposition anchors, and found every one of them suppressed. It
|
|
989
|
-
* is therefore only true while those bytes are still there. Everything that
|
|
990
|
-
* changes a file THROUGH pi-lens re-establishes the verdict on its own — a
|
|
991
|
-
* dispatch replaces the record wholesale, and the turn-end freshness sweep
|
|
992
|
-
* demotes a self-drifted record before the policy loop can suppress it, which
|
|
993
|
-
* clears the verdict. Bytes that move OUTSIDE dispatch (an external formatter, a
|
|
994
|
-
* `git checkout`, an editor write) trigger neither, and the commit gate can be
|
|
995
|
-
* reached with no turn end in between at all — so the gate, the one reader that
|
|
996
|
-
* can let a verdict OPEN a commit, confirms it here instead of trusting the
|
|
997
|
-
* latch memo.
|
|
998
|
-
*
|
|
999
|
-
* Unverifiable is not clean: a record whose dispatch could not fingerprint the
|
|
1000
|
-
* file (`inlineBlockerFileContent` absent, `clients/pipeline.ts:1632`) carries
|
|
1001
|
-
* nothing to confirm, so it fails CLOSED — the same rule
|
|
1002
|
-
* `retireInlineBlockerOnConfirmedClean` applies to unknown provenance.
|
|
1003
|
-
*
|
|
1004
|
-
* Cost: nothing at all unless a verdict is live (the common case), then one
|
|
1005
|
-
* read per suppressed record — on commit/push attempts, the path that already
|
|
1006
|
-
* fingerprints every affected file below. A size/mtime fast path was written
|
|
1007
|
-
* first and deleted: `fileFingerprint` decides the same question on its own, so
|
|
1008
|
-
* the tiers were unmutatable branches, not guards. `fileFingerprint` also
|
|
1009
|
-
* returns `"missing"`/`"unreadable:<code>"` rather than throwing, and neither
|
|
1010
|
-
* can equal a recorded hash, so an unreadable file is expired too.
|
|
1011
|
-
*/
|
|
1012
|
-
function firstExpiredSuppressionVerdict(runtime) {
|
|
1013
|
-
for (const entry of runtime.getInlineBlockersSnapshot?.() ?? []) {
|
|
1014
|
-
if (!entry.policySuppressed)
|
|
1015
|
-
continue;
|
|
1016
|
-
if (entry.recordedHash === undefined) {
|
|
1017
|
-
return { filePath: entry.filePath, tier: "no_baseline" };
|
|
1018
|
-
}
|
|
1019
|
-
if (fileFingerprint(entry.filePath) !== entry.recordedHash) {
|
|
1020
|
-
return { filePath: entry.filePath, tier: "content" };
|
|
1021
|
-
}
|
|
1022
|
-
}
|
|
1023
|
-
return undefined;
|
|
1024
|
-
}
|
|
1025
|
-
export function evaluateGitGuard(runtime, cacheManager, cwd, host = "pi") {
|
|
1026
|
-
// #2535 F3: a known tool with no mapping on this host resolves to
|
|
1027
|
-
// undefined — rephrase rather than naming a dead tool. `lens_diagnostics`
|
|
1028
|
-
// is pinned available on both hosts, so the fallback is defensive only.
|
|
1029
|
-
const diagnosticsTool = resolveLensToolName("lens_diagnostics", host);
|
|
1030
|
-
const inspectLine = diagnosticsTool
|
|
1031
|
-
? `Run ${diagnosticsTool} mode=all for full details, then commit again.`
|
|
1032
|
-
: "Inspect the full diagnostics, then commit again.";
|
|
1033
|
-
if (runtime.gitGuardHasBlockers) {
|
|
1034
|
-
logDecision(cwd, "blocked", "runtime_blockers", {
|
|
1035
|
-
projectSeq: runtime.projectSeq,
|
|
1036
|
-
});
|
|
1037
|
-
const detail = runtime.gitGuardSummary
|
|
1038
|
-
? `\n${runtime.gitGuardSummary}`
|
|
1039
|
-
: "";
|
|
1040
|
-
return {
|
|
1041
|
-
block: true,
|
|
1042
|
-
reason: `🔴 COMMIT BLOCKED (--lens-guard): unresolved blockers must be fixed before commit/push.${detail}\n${inspectLine}`,
|
|
1043
|
-
};
|
|
1044
|
-
}
|
|
1045
|
-
// #3248 round 2 (GG-3283-01): the latch above is a MEMO of the last policy
|
|
1046
|
-
// pass, and a pass can only speak for the bytes it read. A verdict whose file
|
|
1047
|
-
// has moved since is no answer at all, so it must not be the reason this
|
|
1048
|
-
// commit is allowed.
|
|
1049
|
-
const expired = firstExpiredSuppressionVerdict(runtime);
|
|
1050
|
-
if (expired) {
|
|
1051
|
-
return unknown(cwd, "inline_policy_stale", {
|
|
1052
|
-
file: expired.filePath,
|
|
1053
|
-
tier: expired.tier,
|
|
1054
|
-
});
|
|
1055
|
-
}
|
|
1056
|
-
if (runtime.gitGuardCacheUnknownReason) {
|
|
1057
|
-
return unknown(cwd, runtime.gitGuardCacheUnknownReason);
|
|
1058
|
-
}
|
|
1059
|
-
const inspection = cacheManager.inspectCache("turn-end-findings", cwd);
|
|
1060
|
-
if (inspection === "missing") {
|
|
1061
|
-
logDecision(cwd, "allowed", "no_record");
|
|
1062
|
-
return { block: false };
|
|
1063
|
-
}
|
|
1064
|
-
if (inspection !== "fresh")
|
|
1065
|
-
return unknown(cwd, `cache_${inspection}`);
|
|
1066
|
-
const pending = cacheManager.readCache("turn-end-findings", cwd);
|
|
1067
|
-
if (!pending || !isTurnEndFindingsCache(pending.data)) {
|
|
1068
|
-
return unknown(cwd, "cache_malformed");
|
|
1069
|
-
}
|
|
1070
|
-
const record = pending.data;
|
|
1071
|
-
if (!record.hasBlockers) {
|
|
1072
|
-
logDecision(cwd, "allowed", "advisory_only");
|
|
1073
|
-
return { block: false };
|
|
1074
|
-
}
|
|
1075
|
-
if (record.affectedFilesTruncated) {
|
|
1076
|
-
return unknown(cwd, "affected_files_truncated");
|
|
1077
|
-
}
|
|
1078
|
-
if (record.sessionId !== runtime.telemetrySessionId) {
|
|
1079
|
-
return unknown(cwd, "session_mismatch");
|
|
1080
|
-
}
|
|
1081
|
-
if (record.projectSeqEnd !== runtime.projectSeq) {
|
|
1082
|
-
return unknown(cwd, "project_sequence_mismatch", {
|
|
1083
|
-
recordedProjectSeq: record.projectSeqEnd,
|
|
1084
|
-
currentProjectSeq: runtime.projectSeq,
|
|
1085
|
-
});
|
|
1086
|
-
}
|
|
1087
|
-
const liveFiles = [];
|
|
1088
|
-
for (const file of record.affectedFiles) {
|
|
1089
|
-
const resolved = resolveGuardPath(file, cwd);
|
|
1090
|
-
const key = guardPathKey(resolved, cwd);
|
|
1091
|
-
const recordedSeq = record.fileSeqByPath[key];
|
|
1092
|
-
if (recordedSeq === undefined ||
|
|
1093
|
-
recordedSeq !== (runtime.getFileSeq?.(resolved) ?? 0)) {
|
|
1094
|
-
return unknown(cwd, "file_sequence_mismatch", { file: resolved });
|
|
1095
|
-
}
|
|
1096
|
-
try {
|
|
1097
|
-
if (!isPathIgnoredByProject(resolved, runtime.projectRoot || cwd, false)) {
|
|
1098
|
-
const currentHash = currentFileFingerprint(resolved);
|
|
1099
|
-
if (currentHash !== "missing") {
|
|
1100
|
-
liveFiles.push(resolved);
|
|
1101
|
-
const expectedHash = record.fileContentHashes[key];
|
|
1102
|
-
if (!expectedHash ||
|
|
1103
|
-
expectedHash.startsWith("unreadable:") ||
|
|
1104
|
-
currentHash.startsWith("unreadable:") ||
|
|
1105
|
-
expectedHash !== currentHash) {
|
|
1106
|
-
return unknown(cwd, "file_content_changed", { file: resolved });
|
|
1107
|
-
}
|
|
1108
|
-
}
|
|
1109
|
-
}
|
|
1110
|
-
}
|
|
1111
|
-
catch {
|
|
1112
|
-
return unknown(cwd, "file_unreadable", { file: resolved });
|
|
1113
|
-
}
|
|
1114
|
-
}
|
|
1115
|
-
if (record.hasBlockers && record.affectedFiles.length === 0) {
|
|
1116
|
-
return unknown(cwd, "blocker_without_affected_file");
|
|
1117
|
-
}
|
|
1118
|
-
// A deleted/ignored affected file has been resolved; no stale blocker is
|
|
1119
|
-
// allowed to survive solely because its old path remains in the record.
|
|
1120
|
-
if (record.hasBlockers &&
|
|
1121
|
-
liveFiles.length === 0 &&
|
|
1122
|
-
record.affectedFiles.length > 0) {
|
|
1123
|
-
logDecision(cwd, "allowed", "affected_files_resolved", {
|
|
1124
|
-
projectSeq: record.projectSeqEnd,
|
|
1125
|
-
});
|
|
1126
|
-
return { block: false };
|
|
1127
|
-
}
|
|
1128
|
-
logDecision(cwd, "blocked", "cache_blockers", {
|
|
1129
|
-
projectSeq: record.projectSeqEnd,
|
|
1130
|
-
affectedFileCount: record.affectedFiles.length,
|
|
1131
|
-
});
|
|
1132
|
-
return {
|
|
1133
|
-
block: true,
|
|
1134
|
-
reason: `🔴 COMMIT BLOCKED (--lens-guard): unresolved blockers must be fixed before commit/push.\n${inspectLine}`,
|
|
1135
|
-
};
|
|
1136
|
-
}
|