pi-lens 4.3.0 → 4.4.1

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.
Files changed (659) hide show
  1. package/CHANGELOG.md +1159 -0
  2. package/README.md +116 -25
  3. package/config/dependency-cruiser-eager-allowlist.json +6 -2
  4. package/dist/chunk-2BEMIWEW.js +51 -0
  5. package/dist/chunk-2EECBNC5.js +89 -0
  6. package/dist/chunk-2FQ62SPM.js +83 -0
  7. package/dist/chunk-2UMYMRI3.js +118 -0
  8. package/dist/chunk-34OCDWOS.js +48 -0
  9. package/dist/chunk-3FERWMCH.js +144 -0
  10. package/dist/chunk-3JL6IFD7.js +97 -0
  11. package/dist/chunk-3JSEWUWI.js +327 -0
  12. package/dist/chunk-3MED75HT.js +37 -0
  13. package/dist/chunk-3MRXIJ6I.js +79 -0
  14. package/dist/chunk-3P4PF2BX.js +2250 -0
  15. package/dist/chunk-3PNFWVHT.js +201 -0
  16. package/dist/chunk-3TTPKMEF.js +162 -0
  17. package/dist/chunk-5JHXUETW.js +326 -0
  18. package/dist/chunk-5W3R6LFT.js +24 -0
  19. package/dist/chunk-64LU2OVH.js +341 -0
  20. package/dist/chunk-6B5I6ICN.js +44 -0
  21. package/dist/chunk-6P54TMWL.js +274 -0
  22. package/dist/chunk-6UYA642J.js +145 -0
  23. package/dist/chunk-6XX5HCLK.js +398 -0
  24. package/dist/chunk-7AXO3ZDF.js +30 -0
  25. package/dist/chunk-7BX5DWSA.js +1907 -0
  26. package/dist/chunk-7ELY2CSM.js +902 -0
  27. package/dist/chunk-7M4T5N3V.js +38 -0
  28. package/dist/chunk-7U2IDNXN.js +37 -0
  29. package/dist/chunk-ABBOA7UD.js +157 -0
  30. package/dist/chunk-AFZYMAIV.js +756 -0
  31. package/dist/chunk-ALQRYH6O.js +112 -0
  32. package/dist/chunk-AXKPQ6ZI.js +1610 -0
  33. package/dist/chunk-BHWHXMQ2.js +62 -0
  34. package/dist/chunk-BJF25SUG.js +22 -0
  35. package/dist/chunk-BNKLYOOO.js +18 -0
  36. package/dist/chunk-BW5KFIQC.js +59 -0
  37. package/dist/chunk-CBD2B5CP.js +599 -0
  38. package/dist/chunk-CFYISHUW.js +42 -0
  39. package/dist/chunk-CMU4RMJB.js +30 -0
  40. package/dist/chunk-CULQYFLU.js +14 -0
  41. package/dist/chunk-D65GOCJB.js +289 -0
  42. package/dist/chunk-D6YF5HKX.js +59 -0
  43. package/dist/chunk-DMS52BEP.js +342 -0
  44. package/dist/chunk-ELVWJYRV.js +211 -0
  45. package/dist/chunk-EUT3B22Y.js +27 -0
  46. package/dist/chunk-F5VLZHUW.js +146 -0
  47. package/dist/chunk-FC4RP4I2.js +12 -0
  48. package/dist/chunk-FGALODG3.js +55 -0
  49. package/dist/chunk-G3RLJYA2.js +2358 -0
  50. package/dist/chunk-GAYGGICG.js +32 -0
  51. package/dist/chunk-H2W2AXD3.js +419 -0
  52. package/dist/chunk-H5EV3VMF.js +114 -0
  53. package/dist/chunk-HREZQCT3.js +106 -0
  54. package/dist/chunk-HSIRMK2D.js +517 -0
  55. package/dist/chunk-IMSQR4WO.js +184 -0
  56. package/dist/chunk-IQZXOZ7S.js +4816 -0
  57. package/dist/chunk-IR6XFA5P.js +37 -0
  58. package/dist/chunk-IUKPRZER.js +78 -0
  59. package/dist/chunk-IUR76K6A.js +262 -0
  60. package/dist/chunk-J3FZR3YY.js +98 -0
  61. package/dist/chunk-J6DFZDFA.js +562 -0
  62. package/dist/chunk-J7WJZ6W7.js +50 -0
  63. package/dist/chunk-JONGANYH.js +202 -0
  64. package/dist/chunk-KJCWXUUS.js +425 -0
  65. package/dist/chunk-KJN4IOEJ.js +17 -0
  66. package/dist/chunk-KMGPUKFD.js +25 -0
  67. package/dist/chunk-LD7WFTRX.js +4533 -0
  68. package/dist/chunk-LJDODBBZ.js +78 -0
  69. package/dist/chunk-LNOMA3MP.js +169 -0
  70. package/dist/chunk-MGIWSROG.js +2334 -0
  71. package/dist/chunk-MQA2YBAH.js +308 -0
  72. package/dist/chunk-MTDRLSI7.js +21720 -0
  73. package/dist/chunk-N2IRDBZI.js +2355 -0
  74. package/dist/chunk-N77WFUL7.js +50 -0
  75. package/dist/chunk-N7YNJE5R.js +466 -0
  76. package/dist/chunk-NABLC7W3.js +148 -0
  77. package/dist/chunk-NFXP47RV.js +999 -0
  78. package/dist/chunk-NJF2X5XF.js +45 -0
  79. package/dist/chunk-NXL4FFQQ.js +47 -0
  80. package/dist/chunk-O7HZX7CA.js +309 -0
  81. package/dist/chunk-OC7LYAU5.js +708 -0
  82. package/dist/chunk-OEX24ECI.js +348 -0
  83. package/dist/chunk-OYOB3ZFG.js +78 -0
  84. package/dist/chunk-OYTMZXRF.js +41 -0
  85. package/dist/chunk-OZJINN4O.js +84 -0
  86. package/dist/chunk-PCHDGUKT.js +23 -0
  87. package/dist/chunk-QOZXJ4NA.js +3364 -0
  88. package/dist/chunk-QYF5S6P6.js +45 -0
  89. package/dist/chunk-RJFED73B.js +79 -0
  90. package/dist/chunk-RTQNRM5X.js +27 -0
  91. package/dist/chunk-S6AMWKPC.js +189 -0
  92. package/dist/chunk-T4QZ6FEH.js +308 -0
  93. package/dist/chunk-T54VJRAD.js +5456 -0
  94. package/dist/chunk-TA5L5KWQ.js +167 -0
  95. package/dist/chunk-TQFBZVCG.js +27 -0
  96. package/dist/chunk-U52SAGRM.js +62 -0
  97. package/dist/chunk-UEAHAMEI.js +5814 -0
  98. package/dist/chunk-UGSMCQ4D.js +327 -0
  99. package/dist/chunk-UOPVJQ4N.js +103 -0
  100. package/dist/chunk-USHG4DLH.js +459 -0
  101. package/dist/chunk-UXVNL3D7.js +23 -0
  102. package/dist/chunk-V5MEBST3.js +4139 -0
  103. package/dist/chunk-VGEVL5EQ.js +29 -0
  104. package/dist/chunk-VPWKF3GN.js +87 -0
  105. package/dist/chunk-VSMJK3ZJ.js +1250 -0
  106. package/dist/chunk-VYKKMYVT.js +560 -0
  107. package/dist/chunk-VZHJS6DR.js +442 -0
  108. package/dist/chunk-WATC3IQR.js +213 -0
  109. package/dist/chunk-WPE5FPGR.js +54 -0
  110. package/dist/chunk-WSEWKCXU.js +188 -0
  111. package/dist/chunk-WW5BLB74.js +659 -0
  112. package/dist/chunk-XGUL4SLQ.js +406 -0
  113. package/dist/chunk-XHSCVSOL.js +170 -0
  114. package/dist/chunk-XIMYZ3JA.js +27 -0
  115. package/dist/chunk-YLN4K6WD.js +385 -0
  116. package/dist/chunk-Z3CCVDUB.js +76 -0
  117. package/dist/chunk-Z54ZSOBZ.js +61 -0
  118. package/dist/chunk-Z6BB4JLQ.js +478 -0
  119. package/dist/chunk-Z7QQA2KT.js +27 -0
  120. package/dist/chunk-ZETYB3XG.js +2626 -0
  121. package/dist/chunk-ZMOMPX2Z.js +87 -0
  122. package/dist/chunk-ZOEYVXSV.js +149 -0
  123. package/dist/chunk-ZZUFZUQZ.js +12120 -0
  124. package/dist/index.js +39712 -29876
  125. package/dist/mcp/analyze-cli.js +186 -232
  126. package/dist/mcp/cli.js +137 -98
  127. package/dist/mcp/server.js +22688 -1573
  128. package/dist/mcp/worker.js +97 -38
  129. package/dist/probes/installer.js +135 -0
  130. package/dist/workers/project-snapshot-persist-worker.js +22 -0
  131. package/dist/workers/review-graph-persist-worker.js +15 -0
  132. package/docs/agent-guide.md +13 -4
  133. package/docs/agent-tools.md +42 -0
  134. package/docs/ast-grep_rules_catalog.md +5 -4
  135. package/docs/configuration.md +28 -2
  136. package/docs/custom-rules.md +25 -2
  137. package/docs/environment-variables.md +86 -8
  138. package/docs/features.md +45 -5
  139. package/docs/globalconfig.md +2 -1
  140. package/docs/io-bridge-v2-migration.md +94 -0
  141. package/docs/lsp-capability-matrix.md +37 -4
  142. package/docs/lsp-idle-eviction.md +124 -0
  143. package/docs/mcp.md +21 -5
  144. package/docs/merge-queue-rollout.md +77 -0
  145. package/docs/pi-lens-fixer.md +160 -88
  146. package/docs/pi-lens-investigator.md +74 -26
  147. package/docs/pi-lens-merge-policy.md +736 -0
  148. package/docs/pi-lens-monitor.md +75 -7
  149. package/docs/pi-lens-retro.md +6 -4
  150. package/docs/pi-lens-reviewer.md +189 -48
  151. package/docs/pi-lens-subagent.md +246 -45
  152. package/docs/pi-lens-warden.md +18 -7
  153. package/docs/public-api-stability.md +55 -0
  154. package/docs/release-qa-baseline.md +84 -17
  155. package/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
  156. package/docs/schema/pi-lens-config-v1.json +530 -0
  157. package/docs/servercapabilities.md +56 -49
  158. package/docs/settings.md +1 -0
  159. package/docs/usage.md +5 -1
  160. package/docs/word-index.md +6 -0
  161. package/grammars/tree-sitter-bash.wasm +0 -0
  162. package/grammars/tree-sitter-bash.wasm.json +3 -3
  163. package/package.json +19 -7
  164. package/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
  165. package/rules/ast-grep-rules/rule-tests/no-identity-operator-on-literals-test.yml +12 -2
  166. package/rules/ast-grep-rules/rule-tests/throw-new-error-js-test.yml +2 -0
  167. package/rules/ast-grep-rules/rule-tests/throw-new-error-test.yml +2 -0
  168. package/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
  169. package/rules/ast-grep-rules/rules/no-identity-operator-on-literals.yml +20 -12
  170. package/rules/ast-grep-rules/rules/throw-new-error-js.yml +2 -2
  171. package/rules/ast-grep-rules/rules/throw-new-error.yml +2 -2
  172. package/scripts/analyze-pi-lens-logs.mjs +1275 -62
  173. package/scripts/download-grammars.js +5 -0
  174. package/scripts/grammars.lock.json +6 -1
  175. package/scripts/install-selftest.mjs +33 -34
  176. package/scripts/lib/host-provided-deps.mjs +13 -4
  177. package/scripts/lib/web-tree-sitter-dir.mjs +18 -0
  178. package/dist/clients/actionable-warnings-logger.js +0 -35
  179. package/dist/clients/actionable-warnings.js +0 -1610
  180. package/dist/clients/advisory-provenance.js +0 -593
  181. package/dist/clients/agent-behavior-client.js +0 -147
  182. package/dist/clients/agent-nudge.js +0 -325
  183. package/dist/clients/analysed-root.js +0 -1
  184. package/dist/clients/ast-grep-client.js +0 -731
  185. package/dist/clients/ast-grep-rule-manager.js +0 -146
  186. package/dist/clients/ast-grep-tool-logger.js +0 -118
  187. package/dist/clients/ast-grep-types.js +0 -10
  188. package/dist/clients/ast-grep-yaml-synth.js +0 -154
  189. package/dist/clients/atomic-write-staging.js +0 -75
  190. package/dist/clients/atomic-write.js +0 -189
  191. package/dist/clients/availability-probe-flight.js +0 -12
  192. package/dist/clients/bash-file-access.js +0 -1056
  193. package/dist/clients/biome-client.js +0 -357
  194. package/dist/clients/blocker-freshness.js +0 -837
  195. package/dist/clients/blocker-past-eof.js +0 -129
  196. package/dist/clients/bootstrap.js +0 -569
  197. package/dist/clients/bounded-cache.js +0 -190
  198. package/dist/clients/bounded-pid-file-lock.js +0 -202
  199. package/dist/clients/bounded-telemetry.js +0 -295
  200. package/dist/clients/build-identity.js +0 -95
  201. package/dist/clients/bundled-resource-health.js +0 -113
  202. package/dist/clients/bus-events-logger.js +0 -105
  203. package/dist/clients/bus-publish.js +0 -171
  204. package/dist/clients/cache/rule-cache.js +0 -190
  205. package/dist/clients/cache-manager.js +0 -524
  206. package/dist/clients/cache-observability.js +0 -1313
  207. package/dist/clients/call-graph.js +0 -852
  208. package/dist/clients/cargo-manifest.js +0 -422
  209. package/dist/clients/cascade-budget.js +0 -196
  210. package/dist/clients/cascade-format.js +0 -315
  211. package/dist/clients/cascade-logger.js +0 -31
  212. package/dist/clients/cascade-types.js +0 -9
  213. package/dist/clients/child-unref.js +0 -124
  214. package/dist/clients/code-quality-warnings.js +0 -286
  215. package/dist/clients/codebase-model.js +0 -173
  216. package/dist/clients/collateral-test-role.js +0 -40
  217. package/dist/clients/complexity-client.js +0 -462
  218. package/dist/clients/config-core/deny.js +0 -221
  219. package/dist/clients/config-core/index.js +0 -50
  220. package/dist/clients/config-core/merge.js +0 -357
  221. package/dist/clients/config-core/normalize.js +0 -340
  222. package/dist/clients/config-core/process-spec.js +0 -248
  223. package/dist/clients/config-core/provenance.js +0 -164
  224. package/dist/clients/config-core/records.js +0 -218
  225. package/dist/clients/config-core/resolve.js +0 -125
  226. package/dist/clients/config-core/safe-object.js +0 -78
  227. package/dist/clients/config-core/schema.js +0 -165
  228. package/dist/clients/config-diagnostic-codes.js +0 -285
  229. package/dist/clients/config-locations.js +0 -388
  230. package/dist/clients/config-resolve.js +0 -798
  231. package/dist/clients/config-schema.js +0 -251
  232. package/dist/clients/config-warn.js +0 -407
  233. package/dist/clients/console-guard-install.js +0 -26
  234. package/dist/clients/cooperative-budget.js +0 -42
  235. package/dist/clients/dead-code-client.js +0 -510
  236. package/dist/clients/dead-code-logger.js +0 -30
  237. package/dist/clients/deadline-utils.js +0 -280
  238. package/dist/clients/debug-handles.js +0 -211
  239. package/dist/clients/debug-heap.js +0 -174
  240. package/dist/clients/deferred-lsp-work.js +0 -106
  241. package/dist/clients/degradation-ledger.js +0 -426
  242. package/dist/clients/demoted-finding-render.js +0 -169
  243. package/dist/clients/dependency-checker.js +0 -885
  244. package/dist/clients/deps/ast-grep-napi.js +0 -22
  245. package/dist/clients/deps/js-yaml.js +0 -9
  246. package/dist/clients/deps/minimatch.js +0 -4
  247. package/dist/clients/deps/pi-tui.js +0 -14
  248. package/dist/clients/deps/typebox.js +0 -14
  249. package/dist/clients/deps/vscode-jsonrpc.js +0 -1
  250. package/dist/clients/deps/web-tree-sitter.js +0 -24
  251. package/dist/clients/diagnostic-dispositions.js +0 -630
  252. package/dist/clients/diagnostic-line-freshness.js +0 -305
  253. package/dist/clients/diagnostic-logger.js +0 -73
  254. package/dist/clients/diagnostic-tracker.js +0 -105
  255. package/dist/clients/diagnostics-publish.js +0 -230
  256. package/dist/clients/dispatch/ast-grep-catalog.js +0 -65
  257. package/dist/clients/dispatch/auxiliary-lsp.js +0 -343
  258. package/dist/clients/dispatch/collect-later-tier.js +0 -35
  259. package/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
  260. package/dist/clients/dispatch/dispatcher.js +0 -1269
  261. package/dist/clients/dispatch/fact-provider-types.js +0 -1
  262. package/dist/clients/dispatch/fact-rule-runner.js +0 -17
  263. package/dist/clients/dispatch/fact-runner.js +0 -30
  264. package/dist/clients/dispatch/fact-scheduler.js +0 -68
  265. package/dist/clients/dispatch/fact-store.js +0 -377
  266. package/dist/clients/dispatch/facts/comment-facts.js +0 -22
  267. package/dist/clients/dispatch/facts/file-content.js +0 -19
  268. package/dist/clients/dispatch/facts/function-facts.js +0 -348
  269. package/dist/clients/dispatch/facts/import-facts.js +0 -204
  270. package/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
  271. package/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
  272. package/dist/clients/dispatch/finding-policy.js +0 -339
  273. package/dist/clients/dispatch/indent-detect.js +0 -417
  274. package/dist/clients/dispatch/inline-suppressions.js +0 -89
  275. package/dist/clients/dispatch/integration.js +0 -2377
  276. package/dist/clients/dispatch/lazy.js +0 -11
  277. package/dist/clients/dispatch/pending-runner-findings.js +0 -87
  278. package/dist/clients/dispatch/plan.js +0 -278
  279. package/dist/clients/dispatch/priorities.js +0 -20
  280. package/dist/clients/dispatch/rule-id-normalize.js +0 -50
  281. package/dist/clients/dispatch/rule-ignores.js +0 -69
  282. package/dist/clients/dispatch/rule-policy.js +0 -135
  283. package/dist/clients/dispatch/rules/async-noise.js +0 -40
  284. package/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
  285. package/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
  286. package/dist/clients/dispatch/rules/error-obscuring.js +0 -32
  287. package/dist/clients/dispatch/rules/error-swallowing.js +0 -31
  288. package/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
  289. package/dist/clients/dispatch/rules/high-complexity.js +0 -72
  290. package/dist/clients/dispatch/rules/high-fan-out.js +0 -74
  291. package/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
  292. package/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
  293. package/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
  294. package/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
  295. package/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
  296. package/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
  297. package/dist/clients/dispatch/runner-context.js +0 -52
  298. package/dist/clients/dispatch/runners/actionlint.js +0 -111
  299. package/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
  300. package/dist/clients/dispatch/runners/biome-check.js +0 -296
  301. package/dist/clients/dispatch/runners/cpp-check.js +0 -219
  302. package/dist/clients/dispatch/runners/credo.js +0 -82
  303. package/dist/clients/dispatch/runners/cue-vet.js +0 -416
  304. package/dist/clients/dispatch/runners/dart-analyze.js +0 -183
  305. package/dist/clients/dispatch/runners/detekt.js +0 -176
  306. package/dist/clients/dispatch/runners/dotnet-build.js +0 -164
  307. package/dist/clients/dispatch/runners/elixir-check.js +0 -195
  308. package/dist/clients/dispatch/runners/eslint.js +0 -137
  309. package/dist/clients/dispatch/runners/fact-rules.js +0 -29
  310. package/dist/clients/dispatch/runners/fish-indent.js +0 -69
  311. package/dist/clients/dispatch/runners/gleam-check.js +0 -167
  312. package/dist/clients/dispatch/runners/go-vet.js +0 -104
  313. package/dist/clients/dispatch/runners/golangci-lint.js +0 -135
  314. package/dist/clients/dispatch/runners/hadolint.js +0 -91
  315. package/dist/clients/dispatch/runners/helm-lint.js +0 -171
  316. package/dist/clients/dispatch/runners/helm-render.js +0 -940
  317. package/dist/clients/dispatch/runners/htmlhint.js +0 -117
  318. package/dist/clients/dispatch/runners/index.js +0 -108
  319. package/dist/clients/dispatch/runners/javac.js +0 -99
  320. package/dist/clients/dispatch/runners/ktlint.js +0 -110
  321. package/dist/clients/dispatch/runners/lsp.js +0 -379
  322. package/dist/clients/dispatch/runners/markdownlint.js +0 -167
  323. package/dist/clients/dispatch/runners/mypy.js +0 -102
  324. package/dist/clients/dispatch/runners/oxlint.js +0 -414
  325. package/dist/clients/dispatch/runners/php-lint.js +0 -85
  326. package/dist/clients/dispatch/runners/phpstan.js +0 -120
  327. package/dist/clients/dispatch/runners/prisma-validate.js +0 -62
  328. package/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
  329. package/dist/clients/dispatch/runners/pyright.js +0 -169
  330. package/dist/clients/dispatch/runners/rubocop.js +0 -99
  331. package/dist/clients/dispatch/runners/ruff.js +0 -88
  332. package/dist/clients/dispatch/runners/rust-clippy.js +0 -256
  333. package/dist/clients/dispatch/runners/shellcheck.js +0 -173
  334. package/dist/clients/dispatch/runners/shfmt.js +0 -102
  335. package/dist/clients/dispatch/runners/spellcheck.js +0 -128
  336. package/dist/clients/dispatch/runners/spotbugs.js +0 -259
  337. package/dist/clients/dispatch/runners/sqlfluff.js +0 -183
  338. package/dist/clients/dispatch/runners/stylelint.js +0 -166
  339. package/dist/clients/dispatch/runners/swiftlint.js +0 -163
  340. package/dist/clients/dispatch/runners/taplo.js +0 -174
  341. package/dist/clients/dispatch/runners/terragrunt.js +0 -168
  342. package/dist/clients/dispatch/runners/tflint.js +0 -125
  343. package/dist/clients/dispatch/runners/tree-sitter.js +0 -643
  344. package/dist/clients/dispatch/runners/trivy-config.js +0 -253
  345. package/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
  346. package/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
  347. package/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -95
  348. package/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
  349. package/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
  350. package/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
  351. package/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
  352. package/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
  353. package/dist/clients/dispatch/runners/utils.js +0 -15
  354. package/dist/clients/dispatch/runners/vale.js +0 -128
  355. package/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
  356. package/dist/clients/dispatch/runners/yamllint.js +0 -95
  357. package/dist/clients/dispatch/runners/zig-check.js +0 -79
  358. package/dist/clients/dispatch/suppress-writer.js +0 -79
  359. package/dist/clients/dispatch/tool-profile.js +0 -30
  360. package/dist/clients/dispatch/types.js +0 -21
  361. package/dist/clients/dispatch/utils/format-utils.js +0 -45
  362. package/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
  363. package/dist/clients/disposition-logger.js +0 -32
  364. package/dist/clients/disposition-publish.js +0 -124
  365. package/dist/clients/durable-store.js +0 -97
  366. package/dist/clients/effective-config.js +0 -415
  367. package/dist/clients/env-utils.js +0 -83
  368. package/dist/clients/error-class.js +0 -23
  369. package/dist/clients/eval-timestamp.js +0 -17
  370. package/dist/clients/event-loop-hold.js +0 -274
  371. package/dist/clients/event-loop-monitor.js +0 -250
  372. package/dist/clients/extension-log.js +0 -504
  373. package/dist/clients/extension-mode.js +0 -73
  374. package/dist/clients/feature-hints.js +0 -103
  375. package/dist/clients/file-kinds.js +0 -412
  376. package/dist/clients/file-role.js +0 -134
  377. package/dist/clients/file-time.js +0 -160
  378. package/dist/clients/file-utils.js +0 -1032
  379. package/dist/clients/finding-delivery-gate.js +0 -494
  380. package/dist/clients/finding-identity.js +0 -88
  381. package/dist/clients/fix-worklog.js +0 -103
  382. package/dist/clients/format-events-publish.js +0 -343
  383. package/dist/clients/format-service.js +0 -222
  384. package/dist/clients/formatters-lazy.js +0 -9
  385. package/dist/clients/formatters.js +0 -2032
  386. package/dist/clients/freshness-cadence.js +0 -17
  387. package/dist/clients/freshness.js +0 -38
  388. package/dist/clients/generated-artifacts.js +0 -394
  389. package/dist/clients/generation-guard.js +0 -215
  390. package/dist/clients/git-guard.js +0 -1136
  391. package/dist/clients/git-tracked-ignore.js +0 -243
  392. package/dist/clients/gitleaks-client.js +0 -509
  393. package/dist/clients/go-client.js +0 -104
  394. package/dist/clients/govulncheck-client.js +0 -605
  395. package/dist/clients/gradle-ktfmt-style.js +0 -348
  396. package/dist/clients/grammar-source.js +0 -465
  397. package/dist/clients/gzip-stage-write.js +0 -135
  398. package/dist/clients/hashline-anchor.js +0 -424
  399. package/dist/clients/hook-budgets.js +0 -76
  400. package/dist/clients/host-edit-normalize.js +0 -140
  401. package/dist/clients/host-ports.js +0 -39
  402. package/dist/clients/indent-retarget.js +0 -154
  403. package/dist/clients/inline-blocker-dispositions.js +0 -186
  404. package/dist/clients/install-diagnostics.js +0 -156
  405. package/dist/clients/installer/index.js +0 -5416
  406. package/dist/clients/installer/managed-tool-refresh-session.js +0 -58
  407. package/dist/clients/installer/managed-tool-refresh.js +0 -783
  408. package/dist/clients/instance-reaper-state.js +0 -7
  409. package/dist/clients/instance-reaper.js +0 -1137
  410. package/dist/clients/instance-registry-lock.js +0 -145
  411. package/dist/clients/instance-registry.js +0 -773
  412. package/dist/clients/jscpd-client.js +0 -378
  413. package/dist/clients/json-cache-read.js +0 -65
  414. package/dist/clients/knip-client.js +0 -788
  415. package/dist/clients/language-policy.js +0 -252
  416. package/dist/clients/language-profile.js +0 -361
  417. package/dist/clients/language-registry.js +0 -603
  418. package/dist/clients/latency-logger.js +0 -727
  419. package/dist/clients/lazy-import.js +0 -21
  420. package/dist/clients/ledger-bounds.js +0 -54
  421. package/dist/clients/lens-config.js +0 -404
  422. package/dist/clients/lens-engine.js +0 -358
  423. package/dist/clients/lens-events.js +0 -125
  424. package/dist/clients/lens-flag-registry.js +0 -467
  425. package/dist/clients/lens-map.js +0 -1156
  426. package/dist/clients/live-bus-emitter.js +0 -74
  427. package/dist/clients/log-cleanup.js +0 -222
  428. package/dist/clients/lsp/aggregation.js +0 -178
  429. package/dist/clients/lsp/cascade-tier.js +0 -421
  430. package/dist/clients/lsp/client.js +0 -4593
  431. package/dist/clients/lsp/config.js +0 -691
  432. package/dist/clients/lsp/content-limits.js +0 -41
  433. package/dist/clients/lsp/diagnostic-binding.js +0 -225
  434. package/dist/clients/lsp/document-drift.js +0 -467
  435. package/dist/clients/lsp/edits.js +0 -1219
  436. package/dist/clients/lsp/index.js +0 -8305
  437. package/dist/clients/lsp/inferred-project.js +0 -216
  438. package/dist/clients/lsp/jvm-runtime.js +0 -298
  439. package/dist/clients/lsp/language.js +0 -63
  440. package/dist/clients/lsp/launch.js +0 -746
  441. package/dist/clients/lsp/lombok.js +0 -158
  442. package/dist/clients/lsp/path-utils.js +0 -5
  443. package/dist/clients/lsp/pending-aux-coverage.js +0 -251
  444. package/dist/clients/lsp/position-encoding.js +0 -61
  445. package/dist/clients/lsp/ruby-drive-dirs.js +0 -83
  446. package/dist/clients/lsp/server.js +0 -3290
  447. package/dist/clients/lsp/session-roots.js +0 -192
  448. package/dist/clients/lsp/spawn-history.js +0 -17
  449. package/dist/clients/lsp/sync-kind.js +0 -56
  450. package/dist/clients/lsp/tsserver-sync.js +0 -332
  451. package/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
  452. package/dist/clients/lsp/wait-policy/classification.js +0 -85
  453. package/dist/clients/lsp/wait-policy/index.js +0 -10
  454. package/dist/clients/lsp/wait-policy/strategies.js +0 -392
  455. package/dist/clients/lsp/watch-queue.js +0 -61
  456. package/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
  457. package/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
  458. package/dist/clients/lsp/workspace-sweep-hold.js +0 -184
  459. package/dist/clients/lsp-budget.js +0 -186
  460. package/dist/clients/lsp-document-symbols.js +0 -110
  461. package/dist/clients/lsp-lazy.js +0 -9
  462. package/dist/clients/lsp-mutation.js +0 -396
  463. package/dist/clients/lsp-status.js +0 -59
  464. package/dist/clients/map-with-concurrency.js +0 -40
  465. package/dist/clients/mcp/analyze.js +0 -420
  466. package/dist/clients/mcp/host-shim.js +0 -31
  467. package/dist/clients/mcp/ipc.js +0 -523
  468. package/dist/clients/mcp/review.js +0 -197
  469. package/dist/clients/mcp/session.js +0 -412
  470. package/dist/clients/memory-sampler.js +0 -208
  471. package/dist/clients/message-end-attribution.js +0 -30
  472. package/dist/clients/metrics-client.js +0 -107
  473. package/dist/clients/metrics-history.js +0 -327
  474. package/dist/clients/middle-man-analysis.js +0 -263
  475. package/dist/clients/model-provider.js +0 -53
  476. package/dist/clients/module-report-lsp.js +0 -189
  477. package/dist/clients/module-report.js +0 -2150
  478. package/dist/clients/mutating-tool.js +0 -651
  479. package/dist/clients/mutation-attribution.js +0 -368
  480. package/dist/clients/mutation-bridge.js +0 -240
  481. package/dist/clients/ndjson-logger.js +0 -734
  482. package/dist/clients/observed-mutation-sources.js +0 -101
  483. package/dist/clients/observed-mutation.js +0 -1253
  484. package/dist/clients/oldtext-autopatch.js +0 -128
  485. package/dist/clients/opaque-mutation-scan.js +0 -496
  486. package/dist/clients/opengrep-client.js +0 -333
  487. package/dist/clients/opengrep-config.js +0 -76
  488. package/dist/clients/package-manager.js +0 -607
  489. package/dist/clients/package-root.js +0 -38
  490. package/dist/clients/partial-edit-apply.js +0 -439
  491. package/dist/clients/path-attribution-telemetry.js +0 -43
  492. package/dist/clients/path-keyed-map.js +0 -108
  493. package/dist/clients/path-utils.js +0 -1244
  494. package/dist/clients/performance-report.js +0 -331
  495. package/dist/clients/persist-debounce.js +0 -70
  496. package/dist/clients/persistent-reverify.js +0 -271
  497. package/dist/clients/php-cs-fixer-config.js +0 -119
  498. package/dist/clients/pipeline.js +0 -1480
  499. package/dist/clients/post-autofix-notice.js +0 -37
  500. package/dist/clients/print-mode.js +0 -21
  501. package/dist/clients/probe-home-state.js +0 -228
  502. package/dist/clients/process-bridge.js +0 -66
  503. package/dist/clients/process-singletons.js +0 -210
  504. package/dist/clients/process-snapshot.js +0 -68
  505. package/dist/clients/project-changes.js +0 -181
  506. package/dist/clients/project-conventions.js +0 -171
  507. package/dist/clients/project-diagnostics/cache.js +0 -137
  508. package/dist/clients/project-diagnostics/extractors.js +0 -109
  509. package/dist/clients/project-diagnostics/fresh-fetch.js +0 -668
  510. package/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
  511. package/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
  512. package/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
  513. package/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
  514. package/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
  515. package/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
  516. package/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
  517. package/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
  518. package/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
  519. package/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
  520. package/dist/clients/project-diagnostics/scanner.js +0 -520
  521. package/dist/clients/project-diagnostics/types.js +0 -1
  522. package/dist/clients/project-lens-config.js +0 -807
  523. package/dist/clients/project-report.js +0 -701
  524. package/dist/clients/project-scale.js +0 -237
  525. package/dist/clients/project-scan-policy.js +0 -11
  526. package/dist/clients/project-snapshot-fingerprint.js +0 -48
  527. package/dist/clients/project-snapshot-persist-worker.js +0 -20
  528. package/dist/clients/project-snapshot.js +0 -1653
  529. package/dist/clients/project-trust.js +0 -181
  530. package/dist/clients/python-environment.js +0 -217
  531. package/dist/clients/python-provenance.js +0 -639
  532. package/dist/clients/quiet-window-config.js +0 -47
  533. package/dist/clients/quiet-window.js +0 -236
  534. package/dist/clients/read-bridge.js +0 -139
  535. package/dist/clients/read-expansion.js +0 -266
  536. package/dist/clients/read-guard-logger.js +0 -251
  537. package/dist/clients/read-guard-tool-lines.js +0 -1306
  538. package/dist/clients/read-guard.js +0 -1561
  539. package/dist/clients/recent-touches.js +0 -240
  540. package/dist/clients/redact/secrets.js +0 -449
  541. package/dist/clients/resource-sampler.js +0 -628
  542. package/dist/clients/reverse-deps.js +0 -270
  543. package/dist/clients/review-graph/builder.js +0 -5126
  544. package/dist/clients/review-graph/format.js +0 -33
  545. package/dist/clients/review-graph/git-identity.js +0 -163
  546. package/dist/clients/review-graph/import-resolvers.js +0 -481
  547. package/dist/clients/review-graph/persist-worker.js +0 -10
  548. package/dist/clients/review-graph/query.js +0 -244
  549. package/dist/clients/review-graph/revision-drift.js +0 -21
  550. package/dist/clients/review-graph/service.js +0 -96
  551. package/dist/clients/review-graph/shared-extraction-ir.js +0 -82
  552. package/dist/clients/review-graph/symbol-id.js +0 -103
  553. package/dist/clients/review-graph/tsconfig-paths.js +0 -299
  554. package/dist/clients/review-graph/types.js +0 -1
  555. package/dist/clients/review-graph/workspace-modules.js +0 -449
  556. package/dist/clients/review-graph-logger.js +0 -81
  557. package/dist/clients/ruff-client.js +0 -179
  558. package/dist/clients/rules-scanner.js +0 -131
  559. package/dist/clients/run-duration.js +0 -55
  560. package/dist/clients/runtime-agent-end.js +0 -746
  561. package/dist/clients/runtime-config.js +0 -77
  562. package/dist/clients/runtime-context.js +0 -211
  563. package/dist/clients/runtime-coordinator.js +0 -1324
  564. package/dist/clients/runtime-session.js +0 -2485
  565. package/dist/clients/runtime-tool-call.js +0 -1295
  566. package/dist/clients/runtime-tool-result.js +0 -2049
  567. package/dist/clients/runtime-turn.js +0 -3767
  568. package/dist/clients/rust-client.js +0 -97
  569. package/dist/clients/safe-spawn.js +0 -2357
  570. package/dist/clients/sanitize.js +0 -286
  571. package/dist/clients/scan-utils.js +0 -25
  572. package/dist/clients/scratch-tree-policy.js +0 -165
  573. package/dist/clients/search-read-registration.js +0 -94
  574. package/dist/clients/secret-findings.js +0 -114
  575. package/dist/clients/security-scan-client.js +0 -352
  576. package/dist/clients/session-event-guard.js +0 -297
  577. package/dist/clients/session-lifecycle.js +0 -484
  578. package/dist/clients/session-start-observability.js +0 -94
  579. package/dist/clients/session-state-store.js +0 -101
  580. package/dist/clients/session-summary.js +0 -15
  581. package/dist/clients/sessionstart-logger.js +0 -27
  582. package/dist/clients/sg-runner.js +0 -876
  583. package/dist/clients/sgconfig.js +0 -347
  584. package/dist/clients/shared-checkout-guard.js +0 -338
  585. package/dist/clients/single-flight.js +0 -158
  586. package/dist/clients/situational-tool-telemetry.js +0 -108
  587. package/dist/clients/skills-resolver.js +0 -141
  588. package/dist/clients/slow-fs.js +0 -138
  589. package/dist/clients/smells-rollup.js +0 -231
  590. package/dist/clients/source-filter.js +0 -596
  591. package/dist/clients/source-walker.js +0 -211
  592. package/dist/clients/spawn-output-cap.js +0 -120
  593. package/dist/clients/spawn-timeout-cooldown.js +0 -110
  594. package/dist/clients/stale-marker.js +0 -17
  595. package/dist/clients/startup-scan.js +0 -400
  596. package/dist/clients/startup-timing.js +0 -130
  597. package/dist/clients/string-utils.js +0 -33
  598. package/dist/clients/subagent-mode.js +0 -111
  599. package/dist/clients/symbol-containment.js +0 -24
  600. package/dist/clients/symbol-types.js +0 -5
  601. package/dist/clients/test-runner-client.js +0 -2507
  602. package/dist/clients/test-runner-delivery.js +0 -287
  603. package/dist/clients/todo-scanner.js +0 -229
  604. package/dist/clients/tool-agreement.js +0 -423
  605. package/dist/clients/tool-config.js +0 -249
  606. package/dist/clients/tool-cwd.js +0 -270
  607. package/dist/clients/tool-definition.js +0 -47
  608. package/dist/clients/tool-event.js +0 -105
  609. package/dist/clients/tool-policy.js +0 -2755
  610. package/dist/clients/tool-probe.js +0 -53
  611. package/dist/clients/tool-render.js +0 -156
  612. package/dist/clients/tool-set-policy.js +0 -118
  613. package/dist/clients/tree-sitter-cache.js +0 -364
  614. package/dist/clients/tree-sitter-client.js +0 -4195
  615. package/dist/clients/tree-sitter-logger.js +0 -100
  616. package/dist/clients/tree-sitter-navigator.js +0 -269
  617. package/dist/clients/tree-sitter-query-loader.js +0 -569
  618. package/dist/clients/tree-sitter-shared.js +0 -158
  619. package/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
  620. package/dist/clients/trivy-client.js +0 -467
  621. package/dist/clients/tui-fit.js +0 -50
  622. package/dist/clients/turn-context.js +0 -52
  623. package/dist/clients/turn-end/lane.js +0 -51
  624. package/dist/clients/turn-end/lanes/govulncheck.js +0 -112
  625. package/dist/clients/turn-end/lanes/secrets.js +0 -204
  626. package/dist/clients/turn-summary-render.js +0 -72
  627. package/dist/clients/turn-summary.js +0 -132
  628. package/dist/clients/typos-config.js +0 -29
  629. package/dist/clients/user-notify.js +0 -51
  630. package/dist/clients/vanished-instance-marker.js +0 -57
  631. package/dist/clients/warm-attach.js +0 -305
  632. package/dist/clients/widget-state.js +0 -1808
  633. package/dist/clients/word-index-logger.js +0 -49
  634. package/dist/clients/word-index-store.js +0 -459
  635. package/dist/clients/word-index.js +0 -2080
  636. package/dist/clients/workspace-topology.js +0 -443
  637. package/dist/clients/write-ordering-guard.js +0 -65
  638. package/dist/clients/zizmor-config.js +0 -340
  639. package/dist/i18n.js +0 -69
  640. package/dist/mcp/build-staleness.js +0 -124
  641. package/dist/scripts/lib/process-scan.mjs +0 -583
  642. package/dist/scripts/lib/skills-predicate.mjs +0 -129
  643. package/dist/scripts/lib/web-tree-sitter-dir.mjs +0 -123
  644. package/dist/tools/activate-tools.js +0 -87
  645. package/dist/tools/ast-grep-outline.js +0 -137
  646. package/dist/tools/ast-grep-replace.js +0 -244
  647. package/dist/tools/ast-grep-search.js +0 -762
  648. package/dist/tools/effective-config.js +0 -90
  649. package/dist/tools/lens-diagnostic-mark.js +0 -375
  650. package/dist/tools/lens-diagnostics.js +0 -2571
  651. package/dist/tools/lsp-diagnostics.js +0 -1745
  652. package/dist/tools/lsp-navigation.js +0 -1367
  653. package/dist/tools/lsp-structured-output.js +0 -294
  654. package/dist/tools/module-report.js +0 -382
  655. package/dist/tools/project-report.js +0 -86
  656. package/dist/tools/render-compact.js +0 -374
  657. package/dist/tools/scan-progress.js +0 -53
  658. package/dist/tools/shared.js +0 -29
  659. package/dist/tools/symbol-search.js +0 -155
@@ -1,315 +0,0 @@
1
- import * as fs from "node:fs";
2
- import { retagAuxiliaryDiagnostics } from "./dispatch/auxiliary-lsp.js";
3
- import { applyFindingPolicy, loadProjectRulePolicyMap, renderedRuleIdentities, } from "./dispatch/finding-policy.js";
4
- import { detectFileRole } from "./file-role.js";
5
- import { logLatency } from "./latency-logger.js";
6
- import { formatCacheAgeLabel } from "./finding-delivery-gate.js";
7
- import { convertLspDiagnostics } from "./dispatch/utils/lsp-diagnostics.js";
8
- import { toRunnerDisplayPath } from "./dispatch/runner-context.js";
9
- export function formatCascadeNeighborDiagnostics(cwd, neighbors, options = {}) {
10
- const withErrors = neighbors.filter((n) => n.diagnostics.length > 0);
11
- const inconclusive = neighbors.filter((n) => n.inconclusive === true && n.diagnostics.length === 0);
12
- // #1459: a neighbour whose scanner never looked at it is not a clean leaf. It
13
- // is also not `inconclusive` — the language server answered — so it gets its
14
- // own honest line instead of being folded into either bucket. Only the
15
- // zero-diagnostic case needs saying: a neighbour with findings already renders.
16
- const uncovered = neighbors.filter((n) => n.diagnostics.length === 0 &&
17
- n.inconclusive !== true &&
18
- (n.unconfirmedServerIds?.length ?? 0) > 0);
19
- if (withErrors.length === 0 &&
20
- inconclusive.length === 0 &&
21
- uncovered.length === 0) {
22
- return "";
23
- }
24
- const noun = options.noun ?? "neighbor";
25
- let out = withErrors.length > 0
26
- ? `📐 Cascade errors in ${withErrors.length} ${noun} file(s) — fix before finishing turn:`
27
- : "";
28
- for (const neighbor of withErrors) {
29
- const display = toRunnerDisplayPath(cwd, neighbor.filePath);
30
- const reason = options.includeReason ? ` reason="${neighbor.reason}"` : "";
31
- out += `\n<diagnostics file="${display}"${reason}>`;
32
- for (const d of neighbor.diagnostics) {
33
- const line = d.line ?? 1;
34
- const col = d.column ?? 1;
35
- const rule = d.rule ? ` rule=${d.rule}` : "";
36
- out += `\n line ${line}, col ${col}${rule}: ${d.message.split("\n")[0].slice(0, 100)}`;
37
- }
38
- out += "\n</diagnostics>";
39
- }
40
- if (inconclusive.length > 0) {
41
- if (out)
42
- out += "\n";
43
- out += `⚠️ Cascade diagnostics inconclusive for ${inconclusive.length} ${noun} file(s) — no clean result was confirmed:`;
44
- for (const neighbor of inconclusive) {
45
- out += `\n ${toRunnerDisplayPath(cwd, neighbor.filePath)}`;
46
- }
47
- }
48
- if (uncovered.length > 0) {
49
- if (out)
50
- out += "\n";
51
- out += `⚠️ Cascade scanners did not cover ${uncovered.length} ${noun} file(s) — no findings does NOT mean clean here:`;
52
- for (const neighbor of uncovered) {
53
- const servers = (neighbor.unconfirmedServerIds ?? []).join(", ");
54
- out += `\n ${toRunnerDisplayPath(cwd, neighbor.filePath)} (not scanned by ${servers})`;
55
- }
56
- }
57
- return out;
58
- }
59
- /**
60
- * Build the turn-end `CascadeRun` for a neighbour whose diagnostics landed only
61
- * AFTER its cascade touch skipped the in-lane wait (#1023's `resolved-found`
62
- * quiet-window outcome; #1444 made native TS7 take that same path). Returns
63
- * `undefined` when there is nothing agent-facing to say — no ERROR-severity
64
- * diagnostics, or nothing the formatter renders.
65
- *
66
- * Lives here rather than inline in the quiet-window callback so the delivery
67
- * path (reconcile → run → turn_end) is testable end to end; index.ts only wires
68
- * it to `runtime.appendCascadeRun`.
69
- *
70
- * #3102: the survivors are what the agent READS, so they go through the same
71
- * `clients/dispatch/finding-policy.ts` stack — inline `pi-lens-ignore` → stored
72
- * dispositions → the project's `.pi-lens.json` rule policy — that the per-edit
73
- * dispatcher, `mode=full` and the `source=lsp` probe lane apply. Without it a
74
- * cold-neighbour ERROR the agent already marked `false-positive` came back on
75
- * every quiet-window reconcile.
76
- */
77
- export function buildResolvedFoundCascadeRun(cwd, neighbor) {
78
- const { filePath } = neighbor;
79
- const errors = neighbor.diagnostics.filter((d) => d.severity === 1);
80
- if (errors.length === 0)
81
- return undefined;
82
- const policyStart = Date.now();
83
- // This lane's roots are one and the same: index.ts hands `runtime.projectRoot`
84
- // in as `cwd`, so the retag's config lookup and the disposition/rule-policy
85
- // store read the same directory. The in-lane cascade's do NOT — see
86
- // `applyCascadeDisplayPolicy`.
87
- const { diagnostics, suppressed, auxSuppressed, total } = applyCascadeDisplayPolicy(errors, {
88
- cwd,
89
- policyRoot: cwd,
90
- filePath,
91
- });
92
- // One bounded record per RUN, never one per finding (AGENTS.md "bounded
93
- // observability"). This is a PUSH surface: silence after a mark is the mark
94
- // working, not a clean verdict, so the count is recorded here rather than
95
- // re-announced to the agent on every reconcile. `durationMs` covers the
96
- // content read too — the latency this fold added to the quiet-window
97
- // callback, measurable in the same per-phase record as every other cost.
98
- recordCascadeFindingPolicy({
99
- filePath,
100
- durationMs: Date.now() - policyStart,
101
- suppressed,
102
- total,
103
- auxSuppressed,
104
- });
105
- // No zero-length early return here: `formatCascadeNeighborDiagnostics`
106
- // renders "" for a neighbour with no diagnostics and the `!formatted` guard
107
- // below already returns `undefined` for it — a second check was mutation-
108
- // inert (M7: deleting it left all 7 cascade cases green).
109
- const neighbors = [
110
- { filePath, reason: "references", diagnostics, lspTouched: true },
111
- ];
112
- const rendered = formatCascadeNeighborDiagnostics(cwd, neighbors, {
113
- noun: "cold neighbor",
114
- });
115
- if (!rendered)
116
- return undefined;
117
- // #1616 / #3102 AC 4, round 2 F2: a delivery that still has something to say
118
- // states what it dropped, once per delivery — the same sentence the
119
- // late-auxiliary advisory renders (`clients/runtime-turn.ts`). Policy drops
120
- // only: an aux drop is the file's own suppression comment, which the
121
- // per-edit dispatch path honours silently too, and it stays in the record
122
- // above. A delivery with NOTHING left says nothing at all — silence on a
123
- // push surface is not a claim that the neighbour is clean.
124
- const formatted = suppressed > 0
125
- ? `${rendered}\nsuppressed by disposition: ${suppressed} finding(s) (marked false-positive or won't-fix).`
126
- : rendered;
127
- return {
128
- filePath,
129
- result: {
130
- filePath,
131
- impact: {
132
- filePath,
133
- changedSymbols: [],
134
- directImporters: [],
135
- directCallers: [],
136
- neighborFiles: [filePath],
137
- riskFlags: [],
138
- },
139
- neighbors,
140
- formatted,
141
- },
142
- neighborCount: 1,
143
- diagnosticCount: diagnostics.length,
144
- // #3168 F3: the #1444 publish stamp — the run's own observation time, so
145
- // the carried-render age label states the real age instead of claiming
146
- // no stamp exists.
147
- ...(neighbor.publishedAt !== undefined
148
- ? { observedAt: neighbor.publishedAt }
149
- : {}),
150
- };
151
- }
152
- /**
153
- * The ONE convert → retag → `applyFindingPolicy` derivation every cascade
154
- * DISPLAY lane runs before its diagnostics reach the agent (#3102/#3157).
155
- *
156
- * Five lanes render `CascadeNeighborResult.diagnostics` through
157
- * `formatCascadeNeighborDiagnostics`: the quiet-window builder above, and the
158
- * four in-lane sites in `clients/dispatch/integration.ts` (passive cold
159
- * snapshot, fresh touch, touch-error fallback, degraded fallback). Each one
160
- * used to open-code `convertLspDiagnostics(...)` and render the result raw, so
161
- * a neighbour ERROR the agent had marked `false-positive` was hidden by
162
- * `mode=delta`/`mode=full`/the per-edit dispatcher/the probe lane and STILL
163
- * re-reported by the cascade block on every edit that cascaded to it (#3157).
164
- *
165
- * TWO ROOTS, deliberately separate (the #1030 rule):
166
- * - `cwd` is the LANGUAGE root, and only `retagAuxiliaryDiagnostics` sees it
167
- * — `profile.allowBlocking(cwd)` looks for a local opengrep/zizmor/typos
168
- * config, exactly as the per-edit runner (`runners/lsp.ts`) passes
169
- * `ctx.cwd`.
170
- * - `policyRoot` is the PROJECT root, and the disposition store and the
171
- * `.pi-lens.json` rule map are read from it — `lens_diagnostic_mark` writes
172
- * under `runtime.projectRoot` (`index.ts`), so reading from a nested
173
- * language root in a monorepo opens a different
174
- * `diagnostic-dispositions.json` and silently no-ops every mark. This is
175
- * what `dispatcher.ts` already does with `ctx.projectRoot ?? ctx.cwd`.
176
- *
177
- * The auxiliary drop set (native `# nosemgrep`-style comments, `skipTestFiles`)
178
- * is KEPT: every caller's diagnostics come straight off a client cache or a
179
- * `touchFile` result, so nothing upstream ran `applyAuxiliarySuppressions`
180
- * (only the `mode=full` workspace sweep does, `clients/lsp/index.ts`) and this
181
- * is the FIRST application, not a double-apply — which is why the probe lane
182
- * ignores it and these lanes do not.
183
- *
184
- * No `range.start.line` pre-partition here, unlike the late-auxiliary drain,
185
- * whose own comment gives the alignment reason (`clients/runtime-turn.ts`,
186
- * above its `anchored` filter): `convertLspDiagnostics` drops line-less
187
- * entries, which would break the 1:1 index pairing `retagAuxiliaryDiagnostics`
188
- * needs. That reason holds here too — it is simply already satisfied. Every
189
- * caller reads the same `client.getAllDiagnostics()` / `touchFile` map, whose
190
- * `mergeDiagnosticLists` (`clients/lsp/client.ts`) dereferences
191
- * `diagnostic.range.start.line` unguarded, so a line-less entry throws long
192
- * before any builder sees it and `converted` is always 1:1 with `errors`.
193
- *
194
- * Reads nothing when there is nothing to render, and never logs: the RECORD is
195
- * the caller's decision, because the in-lane lane walks up to
196
- * `CASCADE_NEIGHBOUR_BUDGET` neighbours per edit and must aggregate one row per
197
- * run rather than one per neighbour.
198
- */
199
- export function applyCascadeDisplayPolicy(
200
- /** ERROR-severity raw diagnostics, already capped by the caller's own
201
- * display cap (`MAX_PER_FILE` in-lane; uncapped for the single-neighbour
202
- * quiet-window run). */
203
- errors, options) {
204
- if (errors.length === 0) {
205
- return { diagnostics: [], suppressed: 0, auxSuppressed: 0, total: 0 };
206
- }
207
- const { cwd, policyRoot, filePath } = options;
208
- // `undefined` → the fail-open empty string: inline suppression becomes a
209
- // no-op and a STRICT `false-positive` anchor hashes an empty line, so a
210
- // finding is never hidden by an I/O error (AGENTS.md shape 48).
211
- const content = options.content ?? readNeighborContent(filePath);
212
- const converted = convertLspDiagnostics(errors, filePath);
213
- // #692/#3046: identity comes from the ONE shared derivation every other
214
- // surface anchors a mark against — never a hardcoded `tool: "lsp"`.
215
- const retained = retagAuxiliaryDiagnostics(converted, errors, content ?? "", {
216
- cwd,
217
- fileRole: detectFileRole(filePath, content),
218
- });
219
- const { kept } = applyFindingPolicy(retained, {
220
- cwd: policyRoot,
221
- filePath,
222
- content: content ?? "",
223
- policyMap: loadProjectRulePolicyMap(policyRoot),
224
- identities: renderedRuleIdentities,
225
- });
226
- return {
227
- diagnostics: options.displayCap === undefined
228
- ? kept
229
- : kept.slice(0, options.displayCap),
230
- // Policy drops only, DISJOINT from `auxSuppressed` — the same split the
231
- // `late_auxiliary_findings` record uses, so one operator reading both
232
- // records does not have to know that one nests and the other does not.
233
- suppressed: retained.length - kept.length,
234
- auxSuppressed: converted.length - retained.length,
235
- total: converted.length,
236
- };
237
- }
238
- /**
239
- * The ONE `cascade_finding_policy` row both cascade display lanes write.
240
- *
241
- * Gated on EITHER counter (#3102 round 2, F1): gating on the policy count alone
242
- * made an aux-only drop — an ERROR master rendered, removed by the profile's own
243
- * `# nosemgrep` / `skipTestFiles` rule — vanish with no row at all, the
244
- * silent-drop shape this record exists to prevent (AGENTS.md shape 10). The
245
- * `late_auxiliary_findings` twin reports both counters every drain.
246
- */
247
- export function recordCascadeFindingPolicy(entry) {
248
- const inputTruncated = entry.inputTruncated ?? 0;
249
- if (entry.suppressed === 0 &&
250
- entry.auxSuppressed === 0 &&
251
- inputTruncated === 0)
252
- return;
253
- logLatency({
254
- type: "phase",
255
- toolName: "cascade",
256
- filePath: entry.filePath,
257
- phase: "cascade_finding_policy",
258
- durationMs: entry.durationMs,
259
- metadata: {
260
- suppressed: entry.suppressed,
261
- total: entry.total,
262
- auxSuppressed: entry.auxSuppressed,
263
- ...(inputTruncated > 0 && { inputTruncated }),
264
- },
265
- });
266
- }
267
- /**
268
- * The neighbour's current bytes, for the two content-bound halves of the
269
- * policy stack (inline `pi-lens-ignore` and the STRICT `false-positive`
270
- * anchor). One synchronous read, paid only once a neighbour actually has ERROR
271
- * diagnostics to render — the same read `mode=full` pays per flagged file and
272
- * the probe lane pays per cache replay.
273
- *
274
- * SYNC here, while the in-lane cascade's own neighbour read at
275
- * `clients/dispatch/integration.ts` (the active touch, under its "A6: async
276
- * read to avoid blocking event loop on network-mounted drives" comment) is
277
- * ASYNC. The asymmetry is deliberate and measured, not an oversight: that read
278
- * happens for EVERY actively-touched neighbour in a parallel fan-out, while
279
- * this one is paid at most once per DELIVERING neighbour — 0.0125 ms per
280
- * neighbour measured on 40 real 15.6 KiB sources (#3157 AC 3), on loops that
281
- * already do synchronous fs work (`nodeFs.existsSync` in the degraded
282
- * fallback, and the `boundToCurrentDisk` verify whenever the producer attached
283
- * a content hash and its (path, mtime, size) memo misses —
284
- * `clients/lsp/diagnostic-binding.ts`). An async read here would force the
285
- * quiet-window builder's synchronous callback to become async for no
286
- * measurable gain.
287
- *
288
- * `undefined` on any failure: the caller degrades to the content-free half
289
- * rather than hiding a finding it could not identify.
290
- */
291
- function readNeighborContent(filePath) {
292
- try {
293
- return fs.readFileSync(filePath, "utf-8");
294
- }
295
- catch {
296
- return undefined;
297
- }
298
- }
299
- /**
300
- * Fix B (#3167/#3168): the carry label for a cascade run re-rendered at a
301
- * later turn_end. The carry is bounded to ONE turn (`RuntimeCoordinator.beginTurn`
302
- * drops anything that would reach 2), so the honest label names the carry
303
- * count. #3168 F3 corrected this docstring's earlier claim that no stamp
304
- * exists: the run DOES carry one (`observedAt`, threaded from #1444's
305
- * `publishedAt` through the resolved-found plumb), so the age half renders
306
- * from it via `formatCacheAgeLabel`. The deferred-compute re-park arm has no
307
- * stamp and correctly falls to the neutral wording. Returns `undefined` for
308
- * non-carried runs: no label noise on fresh observations.
309
- */
310
- export function cascadeCarrySuffix(carriedTurns, observedAt) {
311
- if (carriedTurns === undefined || carriedTurns < 1)
312
- return undefined;
313
- const noun = carriedTurns === 1 ? "turn" : "turns";
314
- return `(carried ${carriedTurns} ${noun} · ${formatCacheAgeLabel(observedAt)})`;
315
- }
@@ -1,31 +0,0 @@
1
- import * as path from "node:path";
2
- import { isTestMode } from "./env-utils.js";
3
- import { getGlobalPiLensLogDir } from "./probe-home-state.js";
4
- import { createNdjsonLogger } from "./ndjson-logger.js";
5
- import { getMaxLogSizeMB } from "./log-cleanup.js";
6
- import { normalizeLoggedPath } from "./path-utils.js";
7
- const CASCADE_LOG_DIR = getGlobalPiLensLogDir();
8
- const CASCADE_LOG_FILE = path.join(CASCADE_LOG_DIR, "cascade.log");
9
- const writer = createNdjsonLogger({
10
- filePath: CASCADE_LOG_FILE,
11
- maxBytes: getMaxLogSizeMB() * 1024 * 1024,
12
- });
13
- /**
14
- * #2219 (the #2141 class): call sites across `dispatch/integration.ts`,
15
- * `runtime-turn.ts`, and `runtime-coordinator.ts` feed a mix of raw
16
- * `filePath`/`cwd` params and (for `lsp/cascade-tier.ts`) the
17
- * `"<quiet-window>"` sentinel. Normalize once here, the single emit seam —
18
- * same pattern as `review-graph-logger.ts`'s `logReviewGraph`, guarded via
19
- * `normalizeLoggedPath` so the non-path sentinel passes through unchanged
20
- * instead of being resolved against the process cwd.
21
- */
22
- export function logCascade(entry) {
23
- if (isTestMode()) {
24
- return;
25
- }
26
- writer.log({
27
- ts: new Date().toISOString(),
28
- ...entry,
29
- filePath: normalizeLoggedPath(entry.filePath),
30
- });
31
- }
@@ -1,9 +0,0 @@
1
- /**
2
- * How long a cascade neighbour's diagnostics stay usable (#1816).
3
- *
4
- * One constant for two consumers that each declared their own `240_000`:
5
- * `clients/lsp/index.ts` (the neighbour-diagnostics cache) and
6
- * `clients/dispatch/integration.ts` (the cascade turn scope). They must move
7
- * together — a split pair reads as two independent policies and drifts.
8
- */
9
- export const CASCADE_DIAGNOSTICS_TTL_MS = 240_000;
@@ -1,124 +0,0 @@
1
- /**
2
- * Shared plumbing for best-effort, fire-and-forget child-process spawns
3
- * (shape 4 of the recurring-defect catalog in AGENTS.md: "a timer / promise /
4
- * worker / child that outlives its one-shot settle"). Extracted from the
5
- * orphan reaper's `unrefReaperChild` (#1153/#1160) into a
6
- * shared, dependency-free module so every one-shot
7
- * `spawn(..., { stdio: ["ignore","pipe",...] })` call site in the codebase —
8
- * the reaper's enumeration/kill spawns AND the resource sampler's Windows
9
- * CIM/powershell spawns (#1155) — uses the exact same unref+collect shape
10
- * instead of re-deriving it (also closes the #1155 PR's SonarCloud
11
- * new-code-duplication finding: two near-identical spawn→collect-stdout
12
- * blocks in `clients/resource-sampler.ts` collapsed to one shared helper).
13
- *
14
- * Deliberately has NO imports beyond `node:child_process` types and
15
- * `spawn-output-cap.ts` (itself import-free, #3383), so both
16
- * `clients/instance-reaper.ts` and `clients/resource-sampler.ts` (which
17
- * `clients/safe-spawn.ts` itself depends on) can import this without risking
18
- * a circular-import chain. That is also why the output bound below reports
19
- * nothing to the degradation ledger: importing the ledger here would put
20
- * `safe-spawn.ts`'s own dependency above it in the graph.
21
- */
22
- import { spawn as nodeSpawn } from "node:child_process";
23
- import { createBoundedOutputSink } from "./spawn-output-cap.js";
24
- /**
25
- * Detach a best-effort, fire-and-forget child process from the event loop.
26
- *
27
- * A piped, `data`-listener-attached stdout/stderr/stdin stream keeps the libuv
28
- * loop REFERENCED even after `child.unref()` — the child handle and every
29
- * live stdio stream must all be unref'd, or a settled one-shot process (e.g.
30
- * `pi --print`) cannot exit until the child `close`s. Unref only means "do
31
- * not keep the process alive FOR this best-effort work": in an interactive/
32
- * long-lived session the loop stays referenced for other reasons, so the
33
- * child's `data`/`close` events still fire normally and callers still collect
34
- * output/usage; only a genuinely-settled one-shot is allowed to exit without
35
- * waiting for it. Never throws.
36
- */
37
- export function unrefChildAndPipes(child) {
38
- try {
39
- child.unref();
40
- // Child stdio pipes are `net.Socket`s at runtime (which expose `unref`),
41
- // but are typed as `Readable`/`Writable` (which do not) — cast to the
42
- // optional-`unref` shape and guard, so an un-piped ("ignore") stream is a
43
- // no-op rather than a crash.
44
- for (const stream of [child.stdout, child.stderr, child.stdin]) {
45
- stream?.unref?.();
46
- }
47
- }
48
- catch {
49
- // best-effort — unref must never throw out of a fire-and-forget spawn
50
- }
51
- }
52
- /**
53
- * unref, collect, settle plumbing; the only additions are an optional hard
54
- * timeout and a status discriminator. Never rejects.
55
- */
56
- export function spawnCollectStdoutResult(command, args, options, collectOptions = {}) {
57
- return new Promise((resolve) => {
58
- let settled = false;
59
- let timer;
60
- const settle = (result) => {
61
- if (settled)
62
- return;
63
- settled = true;
64
- if (timer)
65
- clearTimeout(timer);
66
- resolve(result);
67
- };
68
- try {
69
- const child = nodeSpawn(command, args, options);
70
- unrefChildAndPipes(child);
71
- // #3383: bounded, not `out += chunk`. The producer is a process-table
72
- // query (`ps`, `wmic`, `powershell`) whose output nothing else limits,
73
- // and the concatenation runs inside a `data` handler where V8's
74
- // `RangeError: Invalid string length` would be an uncaught exception
75
- // rather than this promise's result. A truncated table is the ending
76
- // this contract already documents for a timed-out child: whatever was
77
- // kept is parsed, and the caller reads `status`.
78
- const out = createBoundedOutputSink();
79
- child.stdout?.on("data", (chunk) => out.append(chunk));
80
- child.once("error", (error) => settle({ stdout: "", status: "spawn-error", error }));
81
- child.once("close", (code, signal) => settle(code === 0 && signal === null
82
- ? { stdout: out.text, status: "ok" }
83
- : {
84
- stdout: "",
85
- status: "exit-error",
86
- exitCode: code,
87
- exitSignal: signal,
88
- }));
89
- const timeoutMs = collectOptions.timeoutMs;
90
- if (typeof timeoutMs === "number" && timeoutMs > 0) {
91
- timer = setTimeout(() => {
92
- // Settle only AFTER the child's fate is known. Killing and
93
- // resolving in the same tick bounds the caller and abandons the
94
- // child, which is the leak this timeout exists to prevent.
95
- void terminateTimedOutChild(child, collectOptions.onTimeout).then((timeoutKill) => settle({ stdout: out.text, status: "timeout", timeoutKill }));
96
- }, timeoutMs);
97
- timer.unref();
98
- }
99
- }
100
- catch (error) {
101
- settle({ stdout: "", status: "spawn-error", error });
102
- }
103
- });
104
- }
105
- /** Run the caller's termination handler, or the bare-signal default, and
106
- * never let either throw out of the timeout path. */
107
- async function terminateTimedOutChild(child, onTimeout) {
108
- if (onTimeout) {
109
- try {
110
- return await onTimeout(child);
111
- }
112
- catch {
113
- // A handler that threw did not verify anything.
114
- return "unverified";
115
- }
116
- }
117
- try {
118
- child.kill();
119
- }
120
- catch {
121
- // best-effort — the child may already be gone
122
- }
123
- return "unverified";
124
- }