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,184 +0,0 @@
1
- /**
2
- * #1618: a full workspace sweep (`LSPService.runWorkspaceDiagnostics`, the
3
- * engine behind `lens_diagnostics mode=full`) grants itself a wall-clock
4
- * ceiling (`FULL_SCAN_WALL_CLOCK_MS`, see {@link getFullScanWallClockMs})
5
- * that can outlive the detached LSP idle-reset timer armed by
6
- * `clients/runtime-turn.ts`'s `handleTurnEnd` on a file-less turn. Nothing
7
- * previously stopped that timer from firing mid-sweep and destroying the
8
- * very service the sweep was actively touching — every file the sweep had
9
- * not yet reached then failed with zero trace and got mislabeled as budget
10
- * exhaustion.
11
- *
12
- * This module is the shared hold: `runWorkspaceDiagnostics` acquires it for
13
- * its own lifetime (try/finally, so a throw or an aborted sweep still
14
- * releases it) and the idle-reset timer consults it before firing. Holds are
15
- * tracked as TOKENS (acquire-time-stamped), not a bare counter — two
16
- * overlapping `lens_diagnostics mode=full` calls (or a sweep started while
17
- * another is still finishing) must each be free to release independently
18
- * without the other's hold being dropped early.
19
- *
20
- * A leaked hold that never re-arms idle reset is the inverse defect (state
21
- * that must re-arm cannot hide behind a stuck guard), so this module screens
22
- * against it on TWO axes, matching the repo's own session-boundary +
23
- * bounded-lifetime conventions:
24
- * 1. `clearWorkspaceSweepHoldForSessionStart` — `resetLSPService({reason:
25
- * "session_start"})` clears every held token unconditionally. A session
26
- * boundary means no in-flight sweep from a PRIOR generation is still
27
- * meaningful to wait on.
28
- * 2. `reapStaleHolds` (internal, called from every liveness check) —
29
- * force-releases any token older than {@link getWorkspaceSweepMaxHoldAgeMs},
30
- * derived from the sweep's own wall-clock ceiling plus a safety margin.
31
- * A real sweep is either done or self-aborted well within that window
32
- * (`tools/lens-diagnostics.ts` races `FULL_SCAN_WALL_CLOCK_MS`), so a
33
- * token still held past it can only be a bug — never a legitimate long
34
- * sweep — and gets force-released with its own distinct log record.
35
- *
36
- * `getFullScanWallClockMs` also lives here (rather than duplicated between
37
- * `tools/lens-diagnostics.ts` and `clients/runtime-turn.ts`) so the idle-reset
38
- * delay on every path (base AND the subagent/budget-shortened paths) can be
39
- * DERIVED from the sweep's own ceiling instead of the constants drifting
40
- * apart again (#1618 acceptance criterion 6).
41
- */
42
- import { logLatency } from "../latency-logger.js";
43
- import { getProcessSingleton } from "../process-singletons.js";
44
- /** Extra headroom beyond the sweep's own wall-clock ceiling before an
45
- * idle-reset delay (or the max-hold-age failsafe) trusts that a real sweep
46
- * must be done. Single source for both derivations below AND for every
47
- * idle-reset path `clients/runtime-turn.ts` derives (base, subagent, and
48
- * budget-shortened) — never a second independently-tunable literal. */
49
- export const SWEEP_IDLE_SAFETY_MARGIN_MS = 60_000;
50
- const WORKSPACE_SWEEP_HOLD_FAMILY = "lsp.workspace-sweep-hold";
51
- const WORKSPACE_SWEEP_HOLD_VERSION = 1;
52
- function state() {
53
- return getProcessSingleton(WORKSPACE_SWEEP_HOLD_FAMILY, WORKSPACE_SWEEP_HOLD_VERSION, () => ({ holds: new Map(), nextHoldId: 1, idleWaiters: [] }));
54
- }
55
- function flushIdleWaitersIfEmpty() {
56
- const current = state();
57
- if (current.holds.size > 0)
58
- return;
59
- if (current.idleWaiters.length === 0)
60
- return;
61
- const waiters = current.idleWaiters;
62
- current.idleWaiters = [];
63
- for (const waiter of waiters) {
64
- try {
65
- waiter();
66
- }
67
- catch {
68
- // Best-effort — a waiter failure must never propagate into the
69
- // releasing/reaping call stack.
70
- }
71
- }
72
- }
73
- /**
74
- * A held token past this age can only be a bug (leaked release, a sweep that
75
- * hung outside its own abort signal, …) — a legitimate sweep is done or
76
- * self-aborted well before it. Derived, not a separate literal, so it can't
77
- * drift out of sync with `getFullScanWallClockMs` the way the idle-reset
78
- * timer and the sweep's own ceiling once did.
79
- */
80
- export function getWorkspaceSweepMaxHoldAgeMs() {
81
- return getFullScanWallClockMs() + SWEEP_IDLE_SAFETY_MARGIN_MS;
82
- }
83
- function reapStaleHolds() {
84
- const current = state();
85
- if (current.holds.size === 0)
86
- return;
87
- const maxAgeMs = getWorkspaceSweepMaxHoldAgeMs();
88
- const now = Date.now();
89
- for (const [holdId, acquiredAt] of current.holds) {
90
- const ageMs = now - acquiredAt;
91
- if (ageMs <= maxAgeMs)
92
- continue;
93
- current.holds.delete(holdId);
94
- logLatency({
95
- type: "phase",
96
- phase: "lsp_workspace_sweep_hold_force_released",
97
- filePath: "",
98
- durationMs: ageMs,
99
- metadata: { holdId, maxHoldAgeMs: maxAgeMs },
100
- });
101
- }
102
- flushIdleWaitersIfEmpty();
103
- }
104
- /**
105
- * Acquire the hold for one `runWorkspaceDiagnostics` call. Returns a release
106
- * function; callers MUST call it from a `finally` block so an overlapping or
107
- * throwing sweep still releases its hold. Idempotent — calling the returned
108
- * function more than once past the first call, or after the hold was already
109
- * force-released (session reset / max-age reap), is a no-op.
110
- */
111
- export function acquireWorkspaceSweepHold() {
112
- const current = state();
113
- const holdId = current.nextHoldId++;
114
- current.holds.set(holdId, Date.now());
115
- return () => {
116
- if (!state().holds.delete(holdId))
117
- return;
118
- flushIdleWaitersIfEmpty();
119
- };
120
- }
121
- /** True while at least one `runWorkspaceDiagnostics` sweep is in flight.
122
- * Reaps stale holds first, so a leaked/hung hold can't permanently read as
123
- * "active" past its own max age. */
124
- export function isWorkspaceSweepActive() {
125
- reapStaleHolds();
126
- return state().holds.size > 0;
127
- }
128
- /**
129
- * Run `cb` once the hold count next returns to zero. Runs synchronously and
130
- * immediately when no sweep is active right now — the common case, and the
131
- * one every non-sweep idle-reset arm/fire takes.
132
- */
133
- export function runWhenWorkspaceSweepIdle(cb) {
134
- reapStaleHolds();
135
- const current = state();
136
- if (current.holds.size === 0) {
137
- cb();
138
- return;
139
- }
140
- current.idleWaiters.push(cb);
141
- }
142
- /**
143
- * `resetLSPService({reason: "session_start"})` calls this: a session
144
- * boundary means no hold from a PRIOR generation is still meaningful to wait
145
- * on, so every held token is cleared unconditionally (state that must
146
- * re-arm at session_start cannot hide behind a leaked/stuck guard from the
147
- * generation before it). Only logs when there was actually something to
148
- * clear — the common case (no sweep in flight at session boundary) stays
149
- * silent.
150
- */
151
- export function clearWorkspaceSweepHoldForSessionStart() {
152
- const current = state();
153
- if (current.holds.size === 0)
154
- return;
155
- logLatency({
156
- type: "phase",
157
- phase: "lsp_workspace_sweep_hold_session_reset",
158
- filePath: "",
159
- durationMs: 0,
160
- metadata: { clearedHolds: current.holds.size },
161
- });
162
- current.holds.clear();
163
- flushIdleWaitersIfEmpty();
164
- }
165
- /** Test-only: reset the process-singleton hold state between tests. */
166
- export function _resetWorkspaceSweepHoldForTests() {
167
- const current = state();
168
- current.holds.clear();
169
- current.idleWaiters = [];
170
- current.nextHoldId = 1;
171
- }
172
- /**
173
- * Wall-clock ceiling for one `lens_diagnostics mode=full` scan
174
- * (`runWorkspaceDiagnostics` plus its concurrent project-runner/analyzer
175
- * work). Single source for `tools/lens-diagnostics.ts` (the sweep caller),
176
- * `clients/runtime-turn.ts` (every idle-reset path, whose delay must outlive
177
- * it), and this module's own max-hold-age failsafe — lazy env read, never
178
- * memoized, matching this codebase's house style so a test can flip the
179
- * override mid-run.
180
- */
181
- export function getFullScanWallClockMs() {
182
- const raw = Number(process.env.PI_LENS_LENS_DIAGNOSTICS_FULL_TIMEOUT_MS);
183
- return Number.isFinite(raw) && raw > 0 ? raw : 300_000; // 5 min default
184
- }
@@ -1,186 +0,0 @@
1
- /**
2
- * Cross-process LSP budget (#449 slice 2 — PROTOTYPE).
3
- *
4
- * Slice 1 (#472/#474/#475, `clients/instance-registry.ts` +
5
- * `clients/instance-reaper.ts`) made every concurrent pi-lens process visible
6
- * to every other one via `~/.pi-lens/instances.json`. This module is the
7
- * first thing that DOES something with that visibility: a machine-wide cap
8
- * on total live LSP server processes. When a NEW session starts and the
9
- * machine is already over budget, it degrades its OWN spawn plan — it never
10
- * touches another instance's already-running servers.
11
- *
12
- * Deliberately NOT a clearinghouse: no negotiation, no reservation, no
13
- * cross-process locking. Each session reads the registry once at
14
- * `session_start`, decides locally, and moves on — a "position limit," per
15
- * the issue's own framing, not shared ownership of anyone else's servers.
16
- *
17
- * Degrade mechanism chosen for this first slice: skip spawning AUXILIARY LSP
18
- * servers (role:"auxiliary" in clients/lsp/server.ts — opengrep, ast-grep,
19
- * zizmor, typos, marksman) for the remainder of THIS session, keeping only
20
- * the primary language server per file. Auxiliaries are cross-cutting
21
- * scanners layered on top of (not required for) core diagnostics, so this is
22
- * the cheapest, highest-signal thing to shed under machine-wide pressure.
23
- * The cached decision also shortens this session's idle reset and lets
24
- * pull-capable servers skip their push fallback. All three degrade mechanisms
25
- * read the same session-boundary snapshot; pressure never changes mid-touch.
26
- *
27
- * Ceiling default (`DEFAULT_LSP_BUDGET_CEILING = 16`): a rough RAM-budget
28
- * back-of-envelope, not a measured figure (#620's CPU/RSS sampling had not
29
- * landed as of this prototype) — assume ~250MB average RSS per live LSP
30
- * child process (typescript-language-server/pyright cold-index spikes
31
- * higher, short-lived auxiliaries like typos-lsp are much lighter, so this
32
- * is a rough blend) against a soft target of ~4GB machine-wide dedicated to
33
- * the LSP fleet: 4000MB / 250MB ≈ 16. Deliberately conservative-permissive
34
- * for a first cut — the goal is to catch the "25 concurrent node.exe, several
35
- * at 600MB-2GB RSS" pathological pile-up this was written in response to
36
- * (dogfooding note, 2026-07-12/13), not to micromanage the common 2-4-agent
37
- * case. `PI_LENS_LSP_BUDGET_CEILING` overrides it once real-world data (#620)
38
- * says otherwise.
39
- *
40
- * Kill switch: `PI_LENS_CROSS_PROCESS_BUDGET=0` disables this module
41
- * entirely (every session always spawns its full fleet, today's behavior) —
42
- * lazy env read, never memoized, matching the house style
43
- * (session-lifecycle.ts / runtime-config.ts).
44
- */
45
- import { isInstanceRegistryEnabled, readInstanceRegistry, } from "./instance-registry.js";
46
- import { realIsPidAlive, STALE_HEARTBEAT_MS } from "./instance-reaper.js";
47
- import { logLatency } from "./latency-logger.js";
48
- /** See the module docstring for the derivation. */
49
- export const DEFAULT_LSP_BUDGET_CEILING = 16;
50
- export const DEFAULT_LSP_BUDGET_IDLE_TIMEOUT_MS = 60_000;
51
- /** `PI_LENS_CROSS_PROCESS_BUDGET=0` disables the budget check entirely —
52
- * lazy env read (house style), never memoized so tests can flip it mid-run. */
53
- export function isCrossProcessBudgetEnabled() {
54
- return process.env.PI_LENS_CROSS_PROCESS_BUDGET !== "0";
55
- }
56
- /** `PI_LENS_LSP_BUDGET_CEILING` overrides {@link DEFAULT_LSP_BUDGET_CEILING}.
57
- * Non-finite/non-positive overrides are ignored (NaN-guard house style, see
58
- * clients/runtime-config.ts) — falls back to the default rather than
59
- * silently producing a ceiling of 0 (which would degrade every session). */
60
- export function getLspBudgetCeiling() {
61
- const raw = Number(process.env.PI_LENS_LSP_BUDGET_CEILING);
62
- return Number.isFinite(raw) && raw > 0 ? raw : DEFAULT_LSP_BUDGET_CEILING;
63
- }
64
- /** Optional aggregate host + LSP-child RSS ceiling. Undefined means disabled. */
65
- export function getLspBudgetRssCeilingBytes() {
66
- const raw = Number(process.env.PI_LENS_LSP_BUDGET_RSS_MB);
67
- return Number.isFinite(raw) && raw > 0 ? raw * 1024 * 1024 : undefined;
68
- }
69
- export function getLspBudgetIdleTimeoutMs() {
70
- const raw = Number(process.env.PI_LENS_LSP_BUDGET_IDLE_TIMEOUT_MS);
71
- return Number.isFinite(raw) && raw > 0
72
- ? raw
73
- : DEFAULT_LSP_BUDGET_IDLE_TIMEOUT_MS;
74
- }
75
- /**
76
- * PURE decision function — no I/O. Mirrors `decideOrphanReaping`'s shape
77
- * (clients/instance-reaper.ts) for the same reason: injectable liveness
78
- * predicate, fully unit-testable with fake registry data, zero real
79
- * process.kill/spawn/fs calls.
80
- *
81
- * Liveness is counted, not just registry presence, because a dead-parent
82
- * instance's `lspChildren` entries are exactly the orphan reaper's target —
83
- * counting them here would double-penalize new sessions for load that's
84
- * already being cleaned up (or was already cleaned up and the entry just
85
- * hasn't been pruned from this snapshot yet).
86
- */
87
- export function decideLspBudget(registry, isPidAlive, ceiling, rssCeilingBytes, now = Date.now()) {
88
- const liveInstances = registry.filter((instance) => isPidAlive(instance.pid));
89
- const totalLiveLspServers = liveInstances.reduce((sum, instance) => sum + instance.lspChildren.length, 0);
90
- const hasCompleteFreshSamples = rssCeilingBytes !== undefined &&
91
- liveInstances.length > 0 &&
92
- liveInstances.every((instance) => {
93
- const heartbeatMs = Date.parse(instance.heartbeatAt);
94
- return (Number.isFinite(heartbeatMs) &&
95
- now - heartbeatMs <= STALE_HEARTBEAT_MS &&
96
- Number.isFinite(instance.rssBytes) &&
97
- instance.lspChildren.every((child) => Number.isFinite(child.rssBytes)));
98
- });
99
- const totalRssBytes = hasCompleteFreshSamples
100
- ? liveInstances.reduce((sum, instance) => sum +
101
- instance.rssBytes +
102
- instance.lspChildren.reduce((childSum, child) => childSum + (child.rssBytes ?? 0), 0), 0)
103
- : undefined;
104
- const rssPressure = totalRssBytes !== undefined &&
105
- rssCeilingBytes !== undefined &&
106
- totalRssBytes >= rssCeilingBytes;
107
- const overBudget = totalLiveLspServers >= ceiling || rssPressure;
108
- return {
109
- totalLiveLspServers,
110
- ceiling,
111
- totalRssBytes,
112
- rssCeilingBytes,
113
- rssPressure,
114
- overBudget,
115
- degradeAuxiliary: overBudget,
116
- shortenIdleTimeout: overBudget,
117
- preferPullOnly: overBudget,
118
- };
119
- }
120
- // --- Module-scope decision cache, read by clients/dispatch/auxiliary-lsp.ts ---
121
- //
122
- // session_start fires this check fire-and-forget (must never block session
123
- // start on a registry read) and stashes the result here; the auxiliary-LSP
124
- // enablement gate reads it synchronously on every dispatch. Default (before
125
- // the async check resolves, or if it's never run — e.g. the kill switch, or
126
- // a process that never reached session_start) is "don't degrade" — fail
127
- // toward today's behavior, exactly like the concurrent-session guard.
128
- let cachedDecision;
129
- /** True once the budget check has run this process and found the machine
130
- * over the configured ceiling. Read by
131
- * `clients/dispatch/auxiliary-lsp.ts#enabledAuxiliaryLspServerIds`. Never
132
- * throws; absent-decision (not yet checked, or disabled) reads as `false`. */
133
- export function shouldDegradeAuxiliaryLsp() {
134
- return cachedDecision?.degradeAuxiliary ?? false;
135
- }
136
- export function shouldShortenLspIdleTimeout() {
137
- return cachedDecision?.shortenIdleTimeout ?? false;
138
- }
139
- export function shouldPreferPullOnlyDiagnostics() {
140
- return cachedDecision?.preferPullOnly ?? false;
141
- }
142
- /** Test-only: reset the module-scope cache between tests. */
143
- export function _resetLspBudgetDecisionForTests() {
144
- cachedDecision = undefined;
145
- }
146
- /**
147
- * Fire-and-forget budget check for `session_start`. Reads the instance
148
- * registry, decides via {@link decideLspBudget}, and caches the result for
149
- * `shouldDegradeAuxiliaryLsp` to read on subsequent dispatch calls. Never
150
- * throws — a failed check just leaves the cache at its "don't degrade"
151
- * default, matching every other best-effort registry consumer in this
152
- * codebase (registerInstance/sweepOrphans).
153
- *
154
- */
155
- export async function checkCrossProcessLspBudget(testOverrides = {}) {
156
- if (!isCrossProcessBudgetEnabled() || !isInstanceRegistryEnabled())
157
- return;
158
- try {
159
- const registry = testOverrides.registry ?? (await readInstanceRegistry());
160
- if (registry.length === 0)
161
- return; // nothing to be over budget against
162
- const ceiling = getLspBudgetCeiling();
163
- const decision = decideLspBudget(registry, testOverrides.isPidAlive ?? realIsPidAlive, ceiling, getLspBudgetRssCeilingBytes());
164
- cachedDecision = decision;
165
- if (decision.overBudget) {
166
- logLatency({
167
- type: "phase",
168
- phase: "cross_process_lsp_budget_degraded",
169
- filePath: "",
170
- durationMs: 0,
171
- metadata: {
172
- totalLiveLspServers: decision.totalLiveLspServers,
173
- ceiling: decision.ceiling,
174
- totalRssBytes: decision.totalRssBytes,
175
- rssCeilingBytes: decision.rssCeilingBytes,
176
- rssPressure: decision.rssPressure,
177
- instanceCount: registry.length,
178
- },
179
- });
180
- }
181
- }
182
- catch {
183
- // Best-effort observability-driven check — never throw out of
184
- // session_start over this.
185
- }
186
- }
@@ -1,110 +0,0 @@
1
- import { getLSPService } from "./lsp/index.js";
2
- // Grounded against this repo's workspace-native TypeScript 7.0.2 server
3
- // (`tsc --lsp --stdio`) on 2026-07-30: 20 already-open documentSymbol calls
4
- // measured p50 3.70 ms / p95 5.28 ms. Keep generous headroom for slower hosts.
5
- const LSP_DOCUMENT_SYMBOL_TIMEOUT_MS = 150;
6
- export const SYMBOL_KIND_NAMES = {
7
- 1: "file",
8
- 2: "module",
9
- 3: "namespace",
10
- 4: "package",
11
- 5: "class",
12
- 6: "method",
13
- 7: "property",
14
- 8: "field",
15
- 9: "constructor",
16
- 10: "enum",
17
- 11: "interface",
18
- 12: "function",
19
- 13: "variable",
20
- 14: "constant",
21
- 15: "string",
22
- 16: "number",
23
- 17: "boolean",
24
- 18: "array",
25
- 19: "object",
26
- 20: "key",
27
- 21: "null",
28
- 22: "enum-member",
29
- 23: "struct",
30
- 24: "event",
31
- 25: "operator",
32
- 26: "type-parameter",
33
- };
34
- export function lspSymbolKindName(kind) {
35
- return SYMBOL_KIND_NAMES[kind] ?? `lsp-symbol-${kind}`;
36
- }
37
- export async function getOpenDocumentSymbols(filePath, timeoutMs = LSP_DOCUMENT_SYMBOL_TIMEOUT_MS) {
38
- const spawned = await getLSPService().getWarmClientForFile(filePath);
39
- if (!spawned ||
40
- !spawned.client.isDocumentOpen(filePath) ||
41
- !spawned.client.getOperationSupport().documentSymbol) {
42
- return undefined;
43
- }
44
- let timer;
45
- try {
46
- return await Promise.race([
47
- spawned.client.documentSymbol(filePath),
48
- new Promise((resolve) => {
49
- timer = setTimeout(() => resolve(undefined), timeoutMs);
50
- }),
51
- ]);
52
- }
53
- catch {
54
- return undefined;
55
- }
56
- finally {
57
- if (timer)
58
- clearTimeout(timer);
59
- }
60
- }
61
- function symbolRange(symbol) {
62
- return symbol.range ?? symbol.location?.range;
63
- }
64
- export function findDocumentSymbolAtLine(symbols, oneBasedLine) {
65
- const line = oneBasedLine - 1;
66
- let best;
67
- let bestSpan = Number.POSITIVE_INFINITY;
68
- const visit = (items, ancestry) => {
69
- for (const symbol of items) {
70
- const range = symbolRange(symbol);
71
- if (range && range.start.line <= line && range.end.line >= line) {
72
- const nextAncestry = [...ancestry, symbol];
73
- const span = range.end.line - range.start.line;
74
- if (span <= bestSpan) {
75
- best = { symbol, ancestry };
76
- bestSpan = span;
77
- }
78
- if (symbol.children)
79
- visit(symbol.children, nextAncestry);
80
- }
81
- }
82
- };
83
- visit(symbols, []);
84
- return best;
85
- }
86
- /**
87
- * Full owner chain for a FLAT SymbolInformation result: hierarchical results
88
- * carry ancestry directly, but native-ts7 (measured: TypeScript 7.0.2 via
89
- * tsc --lsp) returns flat symbols whose only containment signal is the
90
- * immediate `containerName`. Walk containerName links through the full result
91
- * so nested owners qualify completely (Outer.Inner.method, #951 review) —
92
- * cycle-guarded and depth-capped.
93
- */
94
- export function containerNameChain(symbol, allSymbols) {
95
- const chain = [];
96
- const seen = new Set();
97
- let container = symbol.containerName;
98
- while (container && !seen.has(container) && chain.length < 10) {
99
- chain.unshift(container);
100
- seen.add(container);
101
- container = allSymbols?.find((candidate) => candidate.name === container)?.containerName;
102
- }
103
- return chain;
104
- }
105
- export function qualifiedLspSymbolName(located, allSymbols) {
106
- const owners = located.ancestry.length > 0
107
- ? located.ancestry.map((entry) => entry.name)
108
- : containerNameChain(located.symbol, allSymbols);
109
- return [...owners, located.symbol.name].join(".");
110
- }
@@ -1,9 +0,0 @@
1
- /** Shared lazy LSP service seam (#1394). */
2
- import { createLazyImport } from "./lazy-import.js";
3
- const lazyLsp = createLazyImport(() => import("./lsp/index.js"));
4
- export function warmLspService() {
5
- return lazyLsp.get();
6
- }
7
- export function loadLspService() {
8
- return warmLspService();
9
- }