pi-lens 4.3.0 → 4.4.0

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 (650) hide show
  1. package/CHANGELOG.md +1064 -0
  2. package/README.md +115 -25
  3. package/config/dependency-cruiser-eager-allowlist.json +6 -2
  4. package/dist/chunk-22AVIGXS.js +560 -0
  5. package/dist/chunk-27BBHSZC.js +106 -0
  6. package/dist/chunk-2BEMIWEW.js +51 -0
  7. package/dist/chunk-2EECBNC5.js +89 -0
  8. package/dist/chunk-34U7PLGE.js +23 -0
  9. package/dist/chunk-3I5QFT3N.js +181 -0
  10. package/dist/chunk-3MED75HT.js +37 -0
  11. package/dist/chunk-47D2BO4S.js +87 -0
  12. package/dist/chunk-4RERDEXR.js +348 -0
  13. package/dist/chunk-4W2PLC4J.js +27 -0
  14. package/dist/chunk-52H5B5TC.js +202 -0
  15. package/dist/chunk-54B42YRX.js +27 -0
  16. package/dist/chunk-5RXBNSW2.js +266 -0
  17. package/dist/chunk-5THXD6X5.js +201 -0
  18. package/dist/chunk-5W3R6LFT.js +24 -0
  19. package/dist/chunk-5ZEJHV35.js +341 -0
  20. package/dist/chunk-6P62QVEA.js +118 -0
  21. package/dist/chunk-6QIUX4EP.js +459 -0
  22. package/dist/chunk-6VCD4VKZ.js +78 -0
  23. package/dist/chunk-7F72PXY2.js +326 -0
  24. package/dist/chunk-7FBF7NPR.js +998 -0
  25. package/dist/chunk-7U2IDNXN.js +37 -0
  26. package/dist/chunk-ABBOA7UD.js +157 -0
  27. package/dist/chunk-AHDW3GPE.js +50 -0
  28. package/dist/chunk-AJ3QXTRQ.js +756 -0
  29. package/dist/chunk-AJVLWNFN.js +1610 -0
  30. package/dist/chunk-AJXODZY6.js +112 -0
  31. package/dist/chunk-ARFCXG7S.js +84 -0
  32. package/dist/chunk-AS44CFQ4.js +708 -0
  33. package/dist/chunk-AWE5TMPO.js +38 -0
  34. package/dist/chunk-B3I2UUT4.js +4692 -0
  35. package/dist/chunk-BRJKOBZP.js +331 -0
  36. package/dist/chunk-BW5KFIQC.js +59 -0
  37. package/dist/chunk-C2AUYXQH.js +149 -0
  38. package/dist/chunk-CGGAIP7J.js +29 -0
  39. package/dist/chunk-D6QS3U6M.js +30 -0
  40. package/dist/chunk-DFVMIKMQ.js +349 -0
  41. package/dist/chunk-DIULIWKU.js +169 -0
  42. package/dist/chunk-DQ2NZ7C4.js +2317 -0
  43. package/dist/chunk-E2WFBRHM.js +213 -0
  44. package/dist/chunk-E4MAEDPM.js +50 -0
  45. package/dist/chunk-EOKRQ3SA.js +30 -0
  46. package/dist/chunk-F3AU2TMM.js +2626 -0
  47. package/dist/chunk-F3P7VQ7H.js +170 -0
  48. package/dist/chunk-FC4RP4I2.js +12 -0
  49. package/dist/chunk-FJNKANOS.js +32 -0
  50. package/dist/chunk-GUOGVTCQ.js +146 -0
  51. package/dist/chunk-GVXA6CCE.js +18 -0
  52. package/dist/chunk-HHYAELLJ.js +2334 -0
  53. package/dist/chunk-HMFXILPV.js +83 -0
  54. package/dist/chunk-HVUZXSWK.js +421 -0
  55. package/dist/chunk-HWBZIGMJ.js +62 -0
  56. package/dist/chunk-I3R7GKDR.js +17 -0
  57. package/dist/chunk-I7SPGOWI.js +55 -0
  58. package/dist/chunk-IIXOAGHR.js +38 -0
  59. package/dist/chunk-IVP5KAB7.js +2250 -0
  60. package/dist/chunk-IXEBJSUE.js +22 -0
  61. package/dist/chunk-JOLITGCC.js +27 -0
  62. package/dist/chunk-K6VYLB2U.js +145 -0
  63. package/dist/chunk-LJDODBBZ.js +78 -0
  64. package/dist/chunk-LNAKEO63.js +78 -0
  65. package/dist/chunk-LSMJ6KBE.js +4139 -0
  66. package/dist/chunk-LW6XKDZQ.js +5565 -0
  67. package/dist/chunk-N3YQJI6O.js +899 -0
  68. package/dist/chunk-NABLC7W3.js +148 -0
  69. package/dist/chunk-NKOUFPQF.js +659 -0
  70. package/dist/chunk-NL5GLMFI.js +211 -0
  71. package/dist/chunk-NMABWBZN.js +327 -0
  72. package/dist/chunk-NTHH2J74.js +27 -0
  73. package/dist/chunk-NTUJEGDZ.js +59 -0
  74. package/dist/chunk-NXL4FFQQ.js +47 -0
  75. package/dist/chunk-NXPS2L6U.js +466 -0
  76. package/dist/chunk-O5WILGMI.js +42 -0
  77. package/dist/chunk-O6TQT6RI.js +48 -0
  78. package/dist/chunk-OAXNDZJ7.js +323 -0
  79. package/dist/chunk-ODEEOXPH.js +44 -0
  80. package/dist/chunk-OQGFCZJ4.js +4533 -0
  81. package/dist/chunk-ORTMY4Q4.js +282 -0
  82. package/dist/chunk-OS32RNR2.js +442 -0
  83. package/dist/chunk-PAK6IDME.js +189 -0
  84. package/dist/chunk-PWFHBTSF.js +406 -0
  85. package/dist/chunk-Q5U6FMDI.js +2352 -0
  86. package/dist/chunk-QOZXJ4NA.js +3364 -0
  87. package/dist/chunk-QYF5S6P6.js +45 -0
  88. package/dist/chunk-RIISMHKN.js +36 -0
  89. package/dist/chunk-RPD4ZSB7.js +25 -0
  90. package/dist/chunk-RPD5K5NC.js +79 -0
  91. package/dist/chunk-RUOG5D2C.js +262 -0
  92. package/dist/chunk-T4ERT73Y.js +599 -0
  93. package/dist/chunk-T6D4Q4AQ.js +54 -0
  94. package/dist/chunk-TGPXLY2J.js +391 -0
  95. package/dist/chunk-TLGFBM3F.js +12116 -0
  96. package/dist/chunk-TO6WL3GM.js +88 -0
  97. package/dist/chunk-TT22N74J.js +517 -0
  98. package/dist/chunk-TVN5N6GY.js +21216 -0
  99. package/dist/chunk-U3VGR4VU.js +308 -0
  100. package/dist/chunk-UK3CMEAL.js +1250 -0
  101. package/dist/chunk-UOPVJQ4N.js +103 -0
  102. package/dist/chunk-UXVNL3D7.js +23 -0
  103. package/dist/chunk-UY752QSN.js +45 -0
  104. package/dist/chunk-V5PXFSZK.js +188 -0
  105. package/dist/chunk-V7R425XG.js +398 -0
  106. package/dist/chunk-VCSRSYLF.js +81 -0
  107. package/dist/chunk-VD4JQCQC.js +162 -0
  108. package/dist/chunk-VDBPVIKD.js +62 -0
  109. package/dist/chunk-VHQLPIRJ.js +114 -0
  110. package/dist/chunk-VN2AXLEX.js +5414 -0
  111. package/dist/chunk-VNMT7C64.js +478 -0
  112. package/dist/chunk-WONERJTP.js +309 -0
  113. package/dist/chunk-XECLWQZN.js +85 -0
  114. package/dist/chunk-XIMYZ3JA.js +27 -0
  115. package/dist/chunk-XK4CIILI.js +144 -0
  116. package/dist/chunk-Y4T27COV.js +562 -0
  117. package/dist/chunk-YGVYKNSN.js +1860 -0
  118. package/dist/chunk-YLF3PPT5.js +308 -0
  119. package/dist/chunk-YSNFMJKN.js +14 -0
  120. package/dist/chunk-Z3CCVDUB.js +76 -0
  121. package/dist/chunk-Z54ZSOBZ.js +61 -0
  122. package/dist/chunk-ZAWW3AF6.js +97 -0
  123. package/dist/chunk-ZMOL6RQC.js +167 -0
  124. package/dist/index.js +16456 -8335
  125. package/dist/mcp/analyze-cli.js +186 -232
  126. package/dist/mcp/cli.js +137 -98
  127. package/dist/mcp/server.js +22589 -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 +3 -2
  135. package/docs/configuration.md +20 -1
  136. package/docs/environment-variables.md +52 -2
  137. package/docs/features.md +8 -4
  138. package/docs/globalconfig.md +1 -0
  139. package/docs/io-bridge-v2-migration.md +94 -0
  140. package/docs/lsp-capability-matrix.md +36 -4
  141. package/docs/lsp-idle-eviction.md +124 -0
  142. package/docs/mcp.md +21 -5
  143. package/docs/merge-queue-rollout.md +77 -0
  144. package/docs/pi-lens-fixer.md +156 -88
  145. package/docs/pi-lens-investigator.md +74 -26
  146. package/docs/pi-lens-merge-policy.md +694 -0
  147. package/docs/pi-lens-monitor.md +73 -7
  148. package/docs/pi-lens-retro.md +6 -4
  149. package/docs/pi-lens-reviewer.md +188 -48
  150. package/docs/pi-lens-subagent.md +246 -45
  151. package/docs/pi-lens-warden.md +18 -7
  152. package/docs/public-api-stability.md +55 -0
  153. package/docs/release-qa-baseline.md +84 -17
  154. package/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
  155. package/docs/servercapabilities.md +53 -49
  156. package/docs/settings.md +1 -0
  157. package/docs/usage.md +5 -1
  158. package/grammars/tree-sitter-bash.wasm +0 -0
  159. package/grammars/tree-sitter-bash.wasm.json +3 -3
  160. package/package.json +19 -7
  161. package/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
  162. package/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
  163. package/scripts/analyze-pi-lens-logs.mjs +1275 -62
  164. package/scripts/download-grammars.js +5 -0
  165. package/scripts/grammars.lock.json +6 -1
  166. package/scripts/install-selftest.mjs +33 -34
  167. package/scripts/lib/host-provided-deps.mjs +13 -4
  168. package/scripts/lib/web-tree-sitter-dir.mjs +18 -0
  169. package/dist/clients/actionable-warnings-logger.js +0 -35
  170. package/dist/clients/actionable-warnings.js +0 -1610
  171. package/dist/clients/advisory-provenance.js +0 -593
  172. package/dist/clients/agent-behavior-client.js +0 -147
  173. package/dist/clients/agent-nudge.js +0 -325
  174. package/dist/clients/analysed-root.js +0 -1
  175. package/dist/clients/ast-grep-client.js +0 -731
  176. package/dist/clients/ast-grep-rule-manager.js +0 -146
  177. package/dist/clients/ast-grep-tool-logger.js +0 -118
  178. package/dist/clients/ast-grep-types.js +0 -10
  179. package/dist/clients/ast-grep-yaml-synth.js +0 -154
  180. package/dist/clients/atomic-write-staging.js +0 -75
  181. package/dist/clients/atomic-write.js +0 -189
  182. package/dist/clients/availability-probe-flight.js +0 -12
  183. package/dist/clients/bash-file-access.js +0 -1056
  184. package/dist/clients/biome-client.js +0 -357
  185. package/dist/clients/blocker-freshness.js +0 -837
  186. package/dist/clients/blocker-past-eof.js +0 -129
  187. package/dist/clients/bootstrap.js +0 -569
  188. package/dist/clients/bounded-cache.js +0 -190
  189. package/dist/clients/bounded-pid-file-lock.js +0 -202
  190. package/dist/clients/bounded-telemetry.js +0 -295
  191. package/dist/clients/build-identity.js +0 -95
  192. package/dist/clients/bundled-resource-health.js +0 -113
  193. package/dist/clients/bus-events-logger.js +0 -105
  194. package/dist/clients/bus-publish.js +0 -171
  195. package/dist/clients/cache/rule-cache.js +0 -190
  196. package/dist/clients/cache-manager.js +0 -524
  197. package/dist/clients/cache-observability.js +0 -1313
  198. package/dist/clients/call-graph.js +0 -852
  199. package/dist/clients/cargo-manifest.js +0 -422
  200. package/dist/clients/cascade-budget.js +0 -196
  201. package/dist/clients/cascade-format.js +0 -315
  202. package/dist/clients/cascade-logger.js +0 -31
  203. package/dist/clients/cascade-types.js +0 -9
  204. package/dist/clients/child-unref.js +0 -124
  205. package/dist/clients/code-quality-warnings.js +0 -286
  206. package/dist/clients/codebase-model.js +0 -173
  207. package/dist/clients/collateral-test-role.js +0 -40
  208. package/dist/clients/complexity-client.js +0 -462
  209. package/dist/clients/config-core/deny.js +0 -221
  210. package/dist/clients/config-core/index.js +0 -50
  211. package/dist/clients/config-core/merge.js +0 -357
  212. package/dist/clients/config-core/normalize.js +0 -340
  213. package/dist/clients/config-core/process-spec.js +0 -248
  214. package/dist/clients/config-core/provenance.js +0 -164
  215. package/dist/clients/config-core/records.js +0 -218
  216. package/dist/clients/config-core/resolve.js +0 -125
  217. package/dist/clients/config-core/safe-object.js +0 -78
  218. package/dist/clients/config-core/schema.js +0 -165
  219. package/dist/clients/config-diagnostic-codes.js +0 -285
  220. package/dist/clients/config-locations.js +0 -388
  221. package/dist/clients/config-resolve.js +0 -798
  222. package/dist/clients/config-schema.js +0 -251
  223. package/dist/clients/config-warn.js +0 -407
  224. package/dist/clients/console-guard-install.js +0 -26
  225. package/dist/clients/cooperative-budget.js +0 -42
  226. package/dist/clients/dead-code-client.js +0 -510
  227. package/dist/clients/dead-code-logger.js +0 -30
  228. package/dist/clients/deadline-utils.js +0 -280
  229. package/dist/clients/debug-handles.js +0 -211
  230. package/dist/clients/debug-heap.js +0 -174
  231. package/dist/clients/deferred-lsp-work.js +0 -106
  232. package/dist/clients/degradation-ledger.js +0 -426
  233. package/dist/clients/demoted-finding-render.js +0 -169
  234. package/dist/clients/dependency-checker.js +0 -885
  235. package/dist/clients/deps/ast-grep-napi.js +0 -22
  236. package/dist/clients/deps/js-yaml.js +0 -9
  237. package/dist/clients/deps/minimatch.js +0 -4
  238. package/dist/clients/deps/pi-tui.js +0 -14
  239. package/dist/clients/deps/typebox.js +0 -14
  240. package/dist/clients/deps/vscode-jsonrpc.js +0 -1
  241. package/dist/clients/deps/web-tree-sitter.js +0 -24
  242. package/dist/clients/diagnostic-dispositions.js +0 -630
  243. package/dist/clients/diagnostic-line-freshness.js +0 -305
  244. package/dist/clients/diagnostic-logger.js +0 -73
  245. package/dist/clients/diagnostic-tracker.js +0 -105
  246. package/dist/clients/diagnostics-publish.js +0 -230
  247. package/dist/clients/dispatch/ast-grep-catalog.js +0 -65
  248. package/dist/clients/dispatch/auxiliary-lsp.js +0 -343
  249. package/dist/clients/dispatch/collect-later-tier.js +0 -35
  250. package/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
  251. package/dist/clients/dispatch/dispatcher.js +0 -1269
  252. package/dist/clients/dispatch/fact-provider-types.js +0 -1
  253. package/dist/clients/dispatch/fact-rule-runner.js +0 -17
  254. package/dist/clients/dispatch/fact-runner.js +0 -30
  255. package/dist/clients/dispatch/fact-scheduler.js +0 -68
  256. package/dist/clients/dispatch/fact-store.js +0 -377
  257. package/dist/clients/dispatch/facts/comment-facts.js +0 -22
  258. package/dist/clients/dispatch/facts/file-content.js +0 -19
  259. package/dist/clients/dispatch/facts/function-facts.js +0 -348
  260. package/dist/clients/dispatch/facts/import-facts.js +0 -204
  261. package/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
  262. package/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
  263. package/dist/clients/dispatch/finding-policy.js +0 -339
  264. package/dist/clients/dispatch/indent-detect.js +0 -417
  265. package/dist/clients/dispatch/inline-suppressions.js +0 -89
  266. package/dist/clients/dispatch/integration.js +0 -2377
  267. package/dist/clients/dispatch/lazy.js +0 -11
  268. package/dist/clients/dispatch/pending-runner-findings.js +0 -87
  269. package/dist/clients/dispatch/plan.js +0 -278
  270. package/dist/clients/dispatch/priorities.js +0 -20
  271. package/dist/clients/dispatch/rule-id-normalize.js +0 -50
  272. package/dist/clients/dispatch/rule-ignores.js +0 -69
  273. package/dist/clients/dispatch/rule-policy.js +0 -135
  274. package/dist/clients/dispatch/rules/async-noise.js +0 -40
  275. package/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
  276. package/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
  277. package/dist/clients/dispatch/rules/error-obscuring.js +0 -32
  278. package/dist/clients/dispatch/rules/error-swallowing.js +0 -31
  279. package/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
  280. package/dist/clients/dispatch/rules/high-complexity.js +0 -72
  281. package/dist/clients/dispatch/rules/high-fan-out.js +0 -74
  282. package/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
  283. package/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
  284. package/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
  285. package/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
  286. package/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
  287. package/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
  288. package/dist/clients/dispatch/runner-context.js +0 -52
  289. package/dist/clients/dispatch/runners/actionlint.js +0 -111
  290. package/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
  291. package/dist/clients/dispatch/runners/biome-check.js +0 -296
  292. package/dist/clients/dispatch/runners/cpp-check.js +0 -219
  293. package/dist/clients/dispatch/runners/credo.js +0 -82
  294. package/dist/clients/dispatch/runners/cue-vet.js +0 -416
  295. package/dist/clients/dispatch/runners/dart-analyze.js +0 -183
  296. package/dist/clients/dispatch/runners/detekt.js +0 -176
  297. package/dist/clients/dispatch/runners/dotnet-build.js +0 -164
  298. package/dist/clients/dispatch/runners/elixir-check.js +0 -195
  299. package/dist/clients/dispatch/runners/eslint.js +0 -137
  300. package/dist/clients/dispatch/runners/fact-rules.js +0 -29
  301. package/dist/clients/dispatch/runners/fish-indent.js +0 -69
  302. package/dist/clients/dispatch/runners/gleam-check.js +0 -167
  303. package/dist/clients/dispatch/runners/go-vet.js +0 -104
  304. package/dist/clients/dispatch/runners/golangci-lint.js +0 -135
  305. package/dist/clients/dispatch/runners/hadolint.js +0 -91
  306. package/dist/clients/dispatch/runners/helm-lint.js +0 -171
  307. package/dist/clients/dispatch/runners/helm-render.js +0 -940
  308. package/dist/clients/dispatch/runners/htmlhint.js +0 -117
  309. package/dist/clients/dispatch/runners/index.js +0 -108
  310. package/dist/clients/dispatch/runners/javac.js +0 -99
  311. package/dist/clients/dispatch/runners/ktlint.js +0 -110
  312. package/dist/clients/dispatch/runners/lsp.js +0 -379
  313. package/dist/clients/dispatch/runners/markdownlint.js +0 -167
  314. package/dist/clients/dispatch/runners/mypy.js +0 -102
  315. package/dist/clients/dispatch/runners/oxlint.js +0 -414
  316. package/dist/clients/dispatch/runners/php-lint.js +0 -85
  317. package/dist/clients/dispatch/runners/phpstan.js +0 -120
  318. package/dist/clients/dispatch/runners/prisma-validate.js +0 -62
  319. package/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
  320. package/dist/clients/dispatch/runners/pyright.js +0 -169
  321. package/dist/clients/dispatch/runners/rubocop.js +0 -99
  322. package/dist/clients/dispatch/runners/ruff.js +0 -88
  323. package/dist/clients/dispatch/runners/rust-clippy.js +0 -256
  324. package/dist/clients/dispatch/runners/shellcheck.js +0 -173
  325. package/dist/clients/dispatch/runners/shfmt.js +0 -102
  326. package/dist/clients/dispatch/runners/spellcheck.js +0 -128
  327. package/dist/clients/dispatch/runners/spotbugs.js +0 -259
  328. package/dist/clients/dispatch/runners/sqlfluff.js +0 -183
  329. package/dist/clients/dispatch/runners/stylelint.js +0 -166
  330. package/dist/clients/dispatch/runners/swiftlint.js +0 -163
  331. package/dist/clients/dispatch/runners/taplo.js +0 -174
  332. package/dist/clients/dispatch/runners/terragrunt.js +0 -168
  333. package/dist/clients/dispatch/runners/tflint.js +0 -125
  334. package/dist/clients/dispatch/runners/tree-sitter.js +0 -643
  335. package/dist/clients/dispatch/runners/trivy-config.js +0 -253
  336. package/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
  337. package/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
  338. package/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -95
  339. package/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
  340. package/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
  341. package/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
  342. package/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
  343. package/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
  344. package/dist/clients/dispatch/runners/utils.js +0 -15
  345. package/dist/clients/dispatch/runners/vale.js +0 -128
  346. package/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
  347. package/dist/clients/dispatch/runners/yamllint.js +0 -95
  348. package/dist/clients/dispatch/runners/zig-check.js +0 -79
  349. package/dist/clients/dispatch/suppress-writer.js +0 -79
  350. package/dist/clients/dispatch/tool-profile.js +0 -30
  351. package/dist/clients/dispatch/types.js +0 -21
  352. package/dist/clients/dispatch/utils/format-utils.js +0 -45
  353. package/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
  354. package/dist/clients/disposition-logger.js +0 -32
  355. package/dist/clients/disposition-publish.js +0 -124
  356. package/dist/clients/durable-store.js +0 -97
  357. package/dist/clients/effective-config.js +0 -415
  358. package/dist/clients/env-utils.js +0 -83
  359. package/dist/clients/error-class.js +0 -23
  360. package/dist/clients/eval-timestamp.js +0 -17
  361. package/dist/clients/event-loop-hold.js +0 -274
  362. package/dist/clients/event-loop-monitor.js +0 -250
  363. package/dist/clients/extension-log.js +0 -504
  364. package/dist/clients/extension-mode.js +0 -73
  365. package/dist/clients/feature-hints.js +0 -103
  366. package/dist/clients/file-kinds.js +0 -412
  367. package/dist/clients/file-role.js +0 -134
  368. package/dist/clients/file-time.js +0 -160
  369. package/dist/clients/file-utils.js +0 -1032
  370. package/dist/clients/finding-delivery-gate.js +0 -494
  371. package/dist/clients/finding-identity.js +0 -88
  372. package/dist/clients/fix-worklog.js +0 -103
  373. package/dist/clients/format-events-publish.js +0 -343
  374. package/dist/clients/format-service.js +0 -222
  375. package/dist/clients/formatters-lazy.js +0 -9
  376. package/dist/clients/formatters.js +0 -2032
  377. package/dist/clients/freshness-cadence.js +0 -17
  378. package/dist/clients/freshness.js +0 -38
  379. package/dist/clients/generated-artifacts.js +0 -394
  380. package/dist/clients/generation-guard.js +0 -215
  381. package/dist/clients/git-guard.js +0 -1136
  382. package/dist/clients/git-tracked-ignore.js +0 -243
  383. package/dist/clients/gitleaks-client.js +0 -509
  384. package/dist/clients/go-client.js +0 -104
  385. package/dist/clients/govulncheck-client.js +0 -605
  386. package/dist/clients/gradle-ktfmt-style.js +0 -348
  387. package/dist/clients/grammar-source.js +0 -465
  388. package/dist/clients/gzip-stage-write.js +0 -135
  389. package/dist/clients/hashline-anchor.js +0 -424
  390. package/dist/clients/hook-budgets.js +0 -76
  391. package/dist/clients/host-edit-normalize.js +0 -140
  392. package/dist/clients/host-ports.js +0 -39
  393. package/dist/clients/indent-retarget.js +0 -154
  394. package/dist/clients/inline-blocker-dispositions.js +0 -186
  395. package/dist/clients/install-diagnostics.js +0 -156
  396. package/dist/clients/installer/index.js +0 -5416
  397. package/dist/clients/installer/managed-tool-refresh-session.js +0 -58
  398. package/dist/clients/installer/managed-tool-refresh.js +0 -783
  399. package/dist/clients/instance-reaper-state.js +0 -7
  400. package/dist/clients/instance-reaper.js +0 -1137
  401. package/dist/clients/instance-registry-lock.js +0 -145
  402. package/dist/clients/instance-registry.js +0 -773
  403. package/dist/clients/jscpd-client.js +0 -378
  404. package/dist/clients/json-cache-read.js +0 -65
  405. package/dist/clients/knip-client.js +0 -788
  406. package/dist/clients/language-policy.js +0 -252
  407. package/dist/clients/language-profile.js +0 -361
  408. package/dist/clients/language-registry.js +0 -603
  409. package/dist/clients/latency-logger.js +0 -727
  410. package/dist/clients/lazy-import.js +0 -21
  411. package/dist/clients/ledger-bounds.js +0 -54
  412. package/dist/clients/lens-config.js +0 -404
  413. package/dist/clients/lens-engine.js +0 -358
  414. package/dist/clients/lens-events.js +0 -125
  415. package/dist/clients/lens-flag-registry.js +0 -467
  416. package/dist/clients/lens-map.js +0 -1156
  417. package/dist/clients/live-bus-emitter.js +0 -74
  418. package/dist/clients/log-cleanup.js +0 -222
  419. package/dist/clients/lsp/aggregation.js +0 -178
  420. package/dist/clients/lsp/cascade-tier.js +0 -421
  421. package/dist/clients/lsp/client.js +0 -4593
  422. package/dist/clients/lsp/config.js +0 -691
  423. package/dist/clients/lsp/content-limits.js +0 -41
  424. package/dist/clients/lsp/diagnostic-binding.js +0 -225
  425. package/dist/clients/lsp/document-drift.js +0 -467
  426. package/dist/clients/lsp/edits.js +0 -1219
  427. package/dist/clients/lsp/index.js +0 -8305
  428. package/dist/clients/lsp/inferred-project.js +0 -216
  429. package/dist/clients/lsp/jvm-runtime.js +0 -298
  430. package/dist/clients/lsp/language.js +0 -63
  431. package/dist/clients/lsp/launch.js +0 -746
  432. package/dist/clients/lsp/lombok.js +0 -158
  433. package/dist/clients/lsp/path-utils.js +0 -5
  434. package/dist/clients/lsp/pending-aux-coverage.js +0 -251
  435. package/dist/clients/lsp/position-encoding.js +0 -61
  436. package/dist/clients/lsp/ruby-drive-dirs.js +0 -83
  437. package/dist/clients/lsp/server.js +0 -3290
  438. package/dist/clients/lsp/session-roots.js +0 -192
  439. package/dist/clients/lsp/spawn-history.js +0 -17
  440. package/dist/clients/lsp/sync-kind.js +0 -56
  441. package/dist/clients/lsp/tsserver-sync.js +0 -332
  442. package/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
  443. package/dist/clients/lsp/wait-policy/classification.js +0 -85
  444. package/dist/clients/lsp/wait-policy/index.js +0 -10
  445. package/dist/clients/lsp/wait-policy/strategies.js +0 -392
  446. package/dist/clients/lsp/watch-queue.js +0 -61
  447. package/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
  448. package/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
  449. package/dist/clients/lsp/workspace-sweep-hold.js +0 -184
  450. package/dist/clients/lsp-budget.js +0 -186
  451. package/dist/clients/lsp-document-symbols.js +0 -110
  452. package/dist/clients/lsp-lazy.js +0 -9
  453. package/dist/clients/lsp-mutation.js +0 -396
  454. package/dist/clients/lsp-status.js +0 -59
  455. package/dist/clients/map-with-concurrency.js +0 -40
  456. package/dist/clients/mcp/analyze.js +0 -420
  457. package/dist/clients/mcp/host-shim.js +0 -31
  458. package/dist/clients/mcp/ipc.js +0 -523
  459. package/dist/clients/mcp/review.js +0 -197
  460. package/dist/clients/mcp/session.js +0 -412
  461. package/dist/clients/memory-sampler.js +0 -208
  462. package/dist/clients/message-end-attribution.js +0 -30
  463. package/dist/clients/metrics-client.js +0 -107
  464. package/dist/clients/metrics-history.js +0 -327
  465. package/dist/clients/middle-man-analysis.js +0 -263
  466. package/dist/clients/model-provider.js +0 -53
  467. package/dist/clients/module-report-lsp.js +0 -189
  468. package/dist/clients/module-report.js +0 -2150
  469. package/dist/clients/mutating-tool.js +0 -651
  470. package/dist/clients/mutation-attribution.js +0 -368
  471. package/dist/clients/mutation-bridge.js +0 -240
  472. package/dist/clients/ndjson-logger.js +0 -734
  473. package/dist/clients/observed-mutation-sources.js +0 -101
  474. package/dist/clients/observed-mutation.js +0 -1253
  475. package/dist/clients/oldtext-autopatch.js +0 -128
  476. package/dist/clients/opaque-mutation-scan.js +0 -496
  477. package/dist/clients/opengrep-client.js +0 -333
  478. package/dist/clients/opengrep-config.js +0 -76
  479. package/dist/clients/package-manager.js +0 -607
  480. package/dist/clients/package-root.js +0 -38
  481. package/dist/clients/partial-edit-apply.js +0 -439
  482. package/dist/clients/path-attribution-telemetry.js +0 -43
  483. package/dist/clients/path-keyed-map.js +0 -108
  484. package/dist/clients/path-utils.js +0 -1244
  485. package/dist/clients/performance-report.js +0 -331
  486. package/dist/clients/persist-debounce.js +0 -70
  487. package/dist/clients/persistent-reverify.js +0 -271
  488. package/dist/clients/php-cs-fixer-config.js +0 -119
  489. package/dist/clients/pipeline.js +0 -1480
  490. package/dist/clients/post-autofix-notice.js +0 -37
  491. package/dist/clients/print-mode.js +0 -21
  492. package/dist/clients/probe-home-state.js +0 -228
  493. package/dist/clients/process-bridge.js +0 -66
  494. package/dist/clients/process-singletons.js +0 -210
  495. package/dist/clients/process-snapshot.js +0 -68
  496. package/dist/clients/project-changes.js +0 -181
  497. package/dist/clients/project-conventions.js +0 -171
  498. package/dist/clients/project-diagnostics/cache.js +0 -137
  499. package/dist/clients/project-diagnostics/extractors.js +0 -109
  500. package/dist/clients/project-diagnostics/fresh-fetch.js +0 -668
  501. package/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
  502. package/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
  503. package/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
  504. package/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
  505. package/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
  506. package/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
  507. package/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
  508. package/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
  509. package/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
  510. package/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
  511. package/dist/clients/project-diagnostics/scanner.js +0 -520
  512. package/dist/clients/project-diagnostics/types.js +0 -1
  513. package/dist/clients/project-lens-config.js +0 -807
  514. package/dist/clients/project-report.js +0 -701
  515. package/dist/clients/project-scale.js +0 -237
  516. package/dist/clients/project-scan-policy.js +0 -11
  517. package/dist/clients/project-snapshot-fingerprint.js +0 -48
  518. package/dist/clients/project-snapshot-persist-worker.js +0 -20
  519. package/dist/clients/project-snapshot.js +0 -1653
  520. package/dist/clients/project-trust.js +0 -181
  521. package/dist/clients/python-environment.js +0 -217
  522. package/dist/clients/python-provenance.js +0 -639
  523. package/dist/clients/quiet-window-config.js +0 -47
  524. package/dist/clients/quiet-window.js +0 -236
  525. package/dist/clients/read-bridge.js +0 -139
  526. package/dist/clients/read-expansion.js +0 -266
  527. package/dist/clients/read-guard-logger.js +0 -251
  528. package/dist/clients/read-guard-tool-lines.js +0 -1306
  529. package/dist/clients/read-guard.js +0 -1561
  530. package/dist/clients/recent-touches.js +0 -240
  531. package/dist/clients/redact/secrets.js +0 -449
  532. package/dist/clients/resource-sampler.js +0 -628
  533. package/dist/clients/reverse-deps.js +0 -270
  534. package/dist/clients/review-graph/builder.js +0 -5126
  535. package/dist/clients/review-graph/format.js +0 -33
  536. package/dist/clients/review-graph/git-identity.js +0 -163
  537. package/dist/clients/review-graph/import-resolvers.js +0 -481
  538. package/dist/clients/review-graph/persist-worker.js +0 -10
  539. package/dist/clients/review-graph/query.js +0 -244
  540. package/dist/clients/review-graph/revision-drift.js +0 -21
  541. package/dist/clients/review-graph/service.js +0 -96
  542. package/dist/clients/review-graph/shared-extraction-ir.js +0 -82
  543. package/dist/clients/review-graph/symbol-id.js +0 -103
  544. package/dist/clients/review-graph/tsconfig-paths.js +0 -299
  545. package/dist/clients/review-graph/types.js +0 -1
  546. package/dist/clients/review-graph/workspace-modules.js +0 -449
  547. package/dist/clients/review-graph-logger.js +0 -81
  548. package/dist/clients/ruff-client.js +0 -179
  549. package/dist/clients/rules-scanner.js +0 -131
  550. package/dist/clients/run-duration.js +0 -55
  551. package/dist/clients/runtime-agent-end.js +0 -746
  552. package/dist/clients/runtime-config.js +0 -77
  553. package/dist/clients/runtime-context.js +0 -211
  554. package/dist/clients/runtime-coordinator.js +0 -1324
  555. package/dist/clients/runtime-session.js +0 -2485
  556. package/dist/clients/runtime-tool-call.js +0 -1295
  557. package/dist/clients/runtime-tool-result.js +0 -2049
  558. package/dist/clients/runtime-turn.js +0 -3767
  559. package/dist/clients/rust-client.js +0 -97
  560. package/dist/clients/safe-spawn.js +0 -2357
  561. package/dist/clients/sanitize.js +0 -286
  562. package/dist/clients/scan-utils.js +0 -25
  563. package/dist/clients/scratch-tree-policy.js +0 -165
  564. package/dist/clients/search-read-registration.js +0 -94
  565. package/dist/clients/secret-findings.js +0 -114
  566. package/dist/clients/security-scan-client.js +0 -352
  567. package/dist/clients/session-event-guard.js +0 -297
  568. package/dist/clients/session-lifecycle.js +0 -484
  569. package/dist/clients/session-start-observability.js +0 -94
  570. package/dist/clients/session-state-store.js +0 -101
  571. package/dist/clients/session-summary.js +0 -15
  572. package/dist/clients/sessionstart-logger.js +0 -27
  573. package/dist/clients/sg-runner.js +0 -876
  574. package/dist/clients/sgconfig.js +0 -347
  575. package/dist/clients/shared-checkout-guard.js +0 -338
  576. package/dist/clients/single-flight.js +0 -158
  577. package/dist/clients/situational-tool-telemetry.js +0 -108
  578. package/dist/clients/skills-resolver.js +0 -141
  579. package/dist/clients/slow-fs.js +0 -138
  580. package/dist/clients/smells-rollup.js +0 -231
  581. package/dist/clients/source-filter.js +0 -596
  582. package/dist/clients/source-walker.js +0 -211
  583. package/dist/clients/spawn-output-cap.js +0 -120
  584. package/dist/clients/spawn-timeout-cooldown.js +0 -110
  585. package/dist/clients/stale-marker.js +0 -17
  586. package/dist/clients/startup-scan.js +0 -400
  587. package/dist/clients/startup-timing.js +0 -130
  588. package/dist/clients/string-utils.js +0 -33
  589. package/dist/clients/subagent-mode.js +0 -111
  590. package/dist/clients/symbol-containment.js +0 -24
  591. package/dist/clients/symbol-types.js +0 -5
  592. package/dist/clients/test-runner-client.js +0 -2507
  593. package/dist/clients/test-runner-delivery.js +0 -287
  594. package/dist/clients/todo-scanner.js +0 -229
  595. package/dist/clients/tool-agreement.js +0 -423
  596. package/dist/clients/tool-config.js +0 -249
  597. package/dist/clients/tool-cwd.js +0 -270
  598. package/dist/clients/tool-definition.js +0 -47
  599. package/dist/clients/tool-event.js +0 -105
  600. package/dist/clients/tool-policy.js +0 -2755
  601. package/dist/clients/tool-probe.js +0 -53
  602. package/dist/clients/tool-render.js +0 -156
  603. package/dist/clients/tool-set-policy.js +0 -118
  604. package/dist/clients/tree-sitter-cache.js +0 -364
  605. package/dist/clients/tree-sitter-client.js +0 -4195
  606. package/dist/clients/tree-sitter-logger.js +0 -100
  607. package/dist/clients/tree-sitter-navigator.js +0 -269
  608. package/dist/clients/tree-sitter-query-loader.js +0 -569
  609. package/dist/clients/tree-sitter-shared.js +0 -158
  610. package/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
  611. package/dist/clients/trivy-client.js +0 -467
  612. package/dist/clients/tui-fit.js +0 -50
  613. package/dist/clients/turn-context.js +0 -52
  614. package/dist/clients/turn-end/lane.js +0 -51
  615. package/dist/clients/turn-end/lanes/govulncheck.js +0 -112
  616. package/dist/clients/turn-end/lanes/secrets.js +0 -204
  617. package/dist/clients/turn-summary-render.js +0 -72
  618. package/dist/clients/turn-summary.js +0 -132
  619. package/dist/clients/typos-config.js +0 -29
  620. package/dist/clients/user-notify.js +0 -51
  621. package/dist/clients/vanished-instance-marker.js +0 -57
  622. package/dist/clients/warm-attach.js +0 -305
  623. package/dist/clients/widget-state.js +0 -1808
  624. package/dist/clients/word-index-logger.js +0 -49
  625. package/dist/clients/word-index-store.js +0 -459
  626. package/dist/clients/word-index.js +0 -2080
  627. package/dist/clients/workspace-topology.js +0 -443
  628. package/dist/clients/write-ordering-guard.js +0 -65
  629. package/dist/clients/zizmor-config.js +0 -340
  630. package/dist/i18n.js +0 -69
  631. package/dist/mcp/build-staleness.js +0 -124
  632. package/dist/scripts/lib/process-scan.mjs +0 -583
  633. package/dist/scripts/lib/skills-predicate.mjs +0 -129
  634. package/dist/scripts/lib/web-tree-sitter-dir.mjs +0 -123
  635. package/dist/tools/activate-tools.js +0 -87
  636. package/dist/tools/ast-grep-outline.js +0 -137
  637. package/dist/tools/ast-grep-replace.js +0 -244
  638. package/dist/tools/ast-grep-search.js +0 -762
  639. package/dist/tools/effective-config.js +0 -90
  640. package/dist/tools/lens-diagnostic-mark.js +0 -375
  641. package/dist/tools/lens-diagnostics.js +0 -2571
  642. package/dist/tools/lsp-diagnostics.js +0 -1745
  643. package/dist/tools/lsp-navigation.js +0 -1367
  644. package/dist/tools/lsp-structured-output.js +0 -294
  645. package/dist/tools/module-report.js +0 -382
  646. package/dist/tools/project-report.js +0 -86
  647. package/dist/tools/render-compact.js +0 -374
  648. package/dist/tools/scan-progress.js +0 -53
  649. package/dist/tools/shared.js +0 -29
  650. 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
- }