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,569 +0,0 @@
1
- /**
2
- * Analyzer bootstrap: the 17 shell-out analysis clients, loaded ON DEMAND.
3
- *
4
- * #2467: nothing about extension activation needs these clients. They are
5
- * consumed by session startup's background scans, by the bootstrap-dependent
6
- * `tool_call` branches, and by the project-diagnostics tools — every one of
7
- * which can prove it needs them before the graph is paid for. So activation
8
- * never touches this seam, and the load itself sits behind ONE shared
9
- * retryable promise every consumer joins: `clients/single-flight.ts`'s
10
- * primitive owns the identity-guarded release, so a rejected load frees the
11
- * key for the next demand instead of latching (#1690/#1674) and concurrent
12
- * demands never start a second load.
13
- *
14
- * The measured cost this moves off the interactive path is ~16ms of module
15
- * evaluation plus ~3ms of construction, on top of whatever the 17 client
16
- * modules are not already resident for — see the PR body for the numbers.
17
- * The first session of a process runs in QUICK mode, which uses none of these
18
- * clients, so that whole cost used to be paid for nothing on exactly the
19
- * start the user is waiting on.
20
- *
21
- * Two accessors, deliberately different contracts:
22
- *
23
- * - {@link loadBootstrapClients} is the STRICT form the callers that cannot
24
- * proceed without the clients keep using. It rejects rather than inventing
25
- * an answer.
26
- * - {@link requestBootstrapClients} is the BOUNDED, FAIL-OPEN form (#2467):
27
- * it bounds the caller's wait on both axes AGENTS.md requires — a
28
- * wall-clock ceiling and the caller's abort signal — and returns `null`
29
- * rather than throwing, so the caller proceeds without the clients and the
30
- * degradation is counted once in the ledger instead of surfacing as a
31
- * failed tool call.
32
- *
33
- * Neither bound cancels the LOAD; promises are not cancellable and a dynamic
34
- * import has no abort seam. They bound the WAIT. The shared flight keeps
35
- * running, so a later demand reuses whatever it produced — the same
36
- * abandon-the-wait, keep-the-work shape as `lsp-pull-late-answer`.
37
- */
38
- import { logExtension } from "./extension-log.js";
39
- import { bounded } from "./deadline-utils.js";
40
- import { logLatency } from "./latency-logger.js";
41
- import { emitBounded } from "./bounded-telemetry.js";
42
- import { recordDegradationOnce } from "./degradation-ledger.js";
43
- import { createSingleFlight } from "./single-flight.js";
44
- import { agentBehaviorClient } from "./agent-behavior-client.js";
45
- /**
46
- * The clients of a COMPLETED load, or `null` while none has completed.
47
- *
48
- * Process-lifetime on purpose: the 17 clients are stateless constructions and
49
- * every session-scoped latch that lives ON them is re-armed at `session_start`
50
- * by its own registered reset (`resetInstallRetryLatches`, #1497, is the
51
- * canonical one). Dropping the clients at a session boundary would re-pay the
52
- * whole load for nothing and would silently orphan those resets.
53
- *
54
- * Only a SUCCESSFUL load writes it, which is what makes retry-after-failure
55
- * work at all: a rejected load leaves this `null`, so the next demand starts a
56
- * fresh flight instead of replaying the rejection (#1570's eviction, now owned
57
- * by the single-flight primitive's identity-guarded release).
58
- */
59
- let residentClients = null;
60
- /** Behaviour history remains available before analyzer bootstrap completes. */
61
- export function getAgentBehaviorClient() {
62
- return agentBehaviorClient;
63
- }
64
- /**
65
- * Set by {@link markAnalyzerBootstrapShutdown} when the PRIMARY session tears
66
- * down. It refuses NEW loads only — a demand that already joined the in-flight
67
- * load keeps its promise and still settles (#2467 AC4). Session-scoped, not
68
- * process-scoped: a replacement session in the same process must be able to
69
- * load again, which is what {@link resetAnalyzerBootstrapSessionState} restores.
70
- */
71
- let bootstrapShutdown = false;
72
- /**
73
- * The abort signal every BOUNDED demand races, aborted by
74
- * {@link markAnalyzerBootstrapShutdown} and replaced at `session_start`.
75
- *
76
- * #2467 review: the two session-start schedulers must NOT bind the ambient
77
- * TURN signal — a `session_start` that lands mid-turn (sequential
78
- * replacement, `/new`) would otherwise cancel every startup scan with no
79
- * retry, which is #1394's exact lesson. They are not turn-scoped work. But
80
- * "no abort at all" is not the answer either: AGENTS.md's both-bounds rule
81
- * wants a wall-clock ceiling AND an abort race, and the bound that is
82
- * genuinely theirs is the SESSION's own teardown. So the seam supplies it,
83
- * for every caller, rather than each caller inventing one.
84
- */
85
- let bootstrapShutdownController = new AbortController();
86
- /**
87
- * Consecutive BUILD failures, reset by a successful build and by
88
- * `session_start`. See {@link BOOTSTRAP_FAILURE_STRIKE_LIMIT}.
89
- */
90
- let bootstrapFailureStrikes = 0;
91
- /**
92
- * How many BUILDS have been started this process (not how many demands were
93
- * made — concurrent demands share one build). Stamped into the
94
- * `bootstrap_clients_load` record as `attempt`, which is the discrimination
95
- * #2467's observability section asks for: it tells a field reader whether a
96
- * record is the initial attempt or a retry after a transient failure, without
97
- * adding a per-demand record.
98
- */
99
- let bootstrapLoadAttempts = 0;
100
- /**
101
- * The one key in the flight registry. `createSingleFlight` is keyed because
102
- * most of its sites dedupe per file or per server; this one has a single
103
- * subject, so it pays one map entry for the four guards the primitive owns.
104
- */
105
- const BOOTSTRAP_FLIGHT_KEY = "analyzer-bootstrap";
106
- /**
107
- * No `generation` hook. The primitive's own doc states the rule: a generation
108
- * is for an answer a session boundary INVALIDATES. These clients are stateless
109
- * and outlive every session in the process, so a pre-reset flight's result is
110
- * exactly as correct for a post-reset caller — a generation check here could
111
- * never kill a test, which is the vacuous guard this repo keeps deleting.
112
- */
113
- const bootstrapFlight = createSingleFlight();
114
- /**
115
- * Wall-clock ceiling on ONE caller's wait, not on the load.
116
- *
117
- * Measured cold cost of the load is ~100ms from an empty module graph and
118
- * ~19ms once `index.ts`'s own graph is resident, so 10s is not a performance
119
- * budget — it is the liveness bound AGENTS.md's both-bounds rule requires, so
120
- * a wedged module evaluation cannot park a `tool_call` handler forever.
121
- */
122
- const BOOTSTRAP_LOAD_TIMEOUT_MS = 10_000;
123
- /**
124
- * How many consecutive failed builds before the seam stops rebuilding.
125
- *
126
- * Retry-after-failure is right for a TRANSIENT fault, which is the case the
127
- * flight's identity-guarded release was written for. It is wrong for a
128
- * PERMANENT one: an analyzer module that cannot resolve under the host's
129
- * package layout (#285/#335) fails identically every time, and without a
130
- * latch every later demand re-ran seventeen dynamic imports plus
131
- * `collectInstallDiagnostics` — on the tool-call hot path — for an answer
132
- * that could not change. Three strikes distinguishes "the filesystem
133
- * hiccuped" from "this environment cannot load these analyzers"; after that
134
- * the demand fails OPEN immediately, and `session_start` re-arms the latch so
135
- * a repaired environment is never locked out for the life of the process.
136
- */
137
- const BOOTSTRAP_FAILURE_STRIKE_LIMIT = 3;
138
- /**
139
- * A stand-in for an analysis client whose module failed to load (an unresolved
140
- * runtime dependency under a package-manager layout the resolver can't traverse
141
- * — #285/#335). Every method call no-ops to `undefined`, which every analyzer
142
- * consumer already treats as "nothing to report", so a single failed analyzer
143
- * degrades to silence instead of taking down the whole extension. This keeps the
144
- * fail-soft in ONE seam (the bootstrap) so consumers never special-case it —
145
- * the same single-seam principle as the clients/deps/* accessors.
146
- */
147
- export function degradedClient() {
148
- return new Proxy({}, {
149
- get(_target, prop) {
150
- // Not thenable (so `await stub` / Promise.resolve(stub) won't treat it
151
- // as a promise), not iterable, no surprising coercion.
152
- if (typeof prop === "symbol" || prop === "then")
153
- return undefined;
154
- return () => undefined;
155
- },
156
- });
157
- }
158
- /**
159
- * One or more client modules failed to load — almost always an unresolved
160
- * runtime dependency under a package-manager layout the runtime's resolver can't
161
- * traverse (#285/#335). Name each disabled analyzer, then emit ONE paste-able
162
- * environment fingerprint so a reporter can tell us exactly what failed and
163
- * where. Best-effort: never let the diagnostic itself mask the failure.
164
- */
165
- async function logBootstrapFailures(failures) {
166
- for (const { name, err } of failures) {
167
- logExtension({
168
- subsystem: "bootstrap",
169
- message: `analyzer "${name}" disabled (degraded mode): ${err?.message ?? String(err)}`,
170
- metadata: { analyzer: name },
171
- });
172
- }
173
- try {
174
- const { collectInstallDiagnostics, formatInstallDiagnostics } = await import("./install-diagnostics.js");
175
- logExtension({
176
- subsystem: "bootstrap",
177
- message: formatInstallDiagnostics(collectInstallDiagnostics(), failures[0]?.err),
178
- metadata: { kind: "install_diagnostics" },
179
- });
180
- }
181
- catch {
182
- // the per-analyzer lines above already named the failures
183
- }
184
- }
185
- /**
186
- * Build the 17 clients once. Every per-client load below is individually
187
- * fail-soft (`load`/`loadList` degrade to a stub instead of throwing), so this
188
- * is not expected to reject in practice — a genuinely unexpected throw (e.g.
189
- * `logBootstrapFailures`) is what the retryable flight above exists for.
190
- *
191
- * Not exported: callers go through {@link loadBootstrapClients} or
192
- * {@link requestBootstrapClients} so the sharing, the retry, and the shutdown
193
- * gate cannot be bypassed by a new call site.
194
- */
195
- async function buildBootstrapClients() {
196
- const failures = [];
197
- // Load + construct one client in isolation; on failure record it and
198
- // substitute a degraded no-op stub so the others still load — single-seam
199
- // fail-soft, consumers never special-case it.
200
- async function load(name, make) {
201
- try {
202
- return await make();
203
- }
204
- catch (err) {
205
- failures.push({ name, err });
206
- return degradedClient();
207
- }
208
- }
209
- // Lists degrade to empty (a stub Proxy isn't iterable), e.g. dead-code.
210
- async function loadList(name, make) {
211
- try {
212
- return await make();
213
- }
214
- catch (err) {
215
- failures.push({ name, err });
216
- return [];
217
- }
218
- }
219
- const [ruffClient, biomeClient, knipClient, todoScanner, jscpdClient, depChecker, testRunnerClient, metricsClient, complexityClient, goClient, govulncheckClient, gitleaksClient, trivyClient, opengrepClient, rustClient, agentBehaviorClient, deadCodeClients,] = await Promise.all([
220
- load("ruff", async () => new (await import("./ruff-client.js")).RuffClient()),
221
- load("biome", async () => new (await import("./biome-client.js")).BiomeClient()),
222
- load("knip", async () => new (await import("./knip-client.js")).KnipClient()),
223
- load("todo", async () => new (await import("./todo-scanner.js")).TodoScanner()),
224
- load("jscpd", async () => new (await import("./jscpd-client.js")).JscpdClient()),
225
- load("dependency-checker", async () => new (await import("./dependency-checker.js")).DependencyChecker()),
226
- load("test-runner", async () => new (await import("./test-runner-client.js")).TestRunnerClient()),
227
- load("metrics", async () => new (await import("./metrics-client.js")).MetricsClient()),
228
- load("complexity", async () => new (await import("./complexity-client.js")).ComplexityClient()),
229
- // The process-wide singleton, NOT a fresh instance (#2455 fix round 4,
230
- // F2). `handleSessionStart` reads this object for its "Active tools"
231
- // line while `resetGoAvailability` re-arms the singleton's latch; a
232
- // second instance here meant the reset never reached the surface a
233
- // user actually sees.
234
- load("go", async () => (await import("./go-client.js")).goClient),
235
- load("govulncheck", async () => new (await import("./govulncheck-client.js")).GovulncheckClient()),
236
- load("gitleaks", async () => new (await import("./gitleaks-client.js")).GitleaksClient()),
237
- load("trivy", async () => new (await import("./trivy-client.js")).TrivyClient()),
238
- load("opengrep", async () => new (await import("./opengrep-client.js")).OpengrepClient()),
239
- // The process-wide singleton, for the same reason as "go" above.
240
- load("rust", async () => (await import("./rust-client.js")).rustClient),
241
- load("agent-behavior", async () => (await import("./agent-behavior-client.js")).agentBehaviorClient),
242
- loadList("dead-code", async () => (await import("./dead-code-client.js")).getDeadCodeClients()),
243
- ]);
244
- if (failures.length > 0)
245
- await logBootstrapFailures(failures);
246
- return {
247
- ruffClient,
248
- biomeClient,
249
- knipClient,
250
- todoScanner,
251
- jscpdClient,
252
- depChecker,
253
- testRunnerClient,
254
- metricsClient,
255
- complexityClient,
256
- goClient,
257
- govulncheckClient,
258
- gitleaksClient,
259
- trivyClient,
260
- opengrepClient,
261
- rustClient,
262
- agentBehaviorClient,
263
- deadCodeClients,
264
- };
265
- }
266
- /**
267
- * Why a demand could not be served: `shutdown` (the primary session already
268
- * tore down, so no new load may start), `timeout` (the caller's wall-clock
269
- * ceiling elapsed), `aborted` (the caller's own signal fired — Escape, turn
270
- * abort), `failed` (the load itself rejected), or `latched`
271
- * ({@link BOOTSTRAP_FAILURE_STRIKE_LIMIT} consecutive builds failed, so the
272
- * seam stopped rebuilding). A `null` from
273
- * {@link requestBootstrapClients} never says which on its own, so the reason
274
- * travels in the bounded record and the ledger entry instead.
275
- */
276
- const BOOTSTRAP_UNAVAILABLE_REASONS = [
277
- "shutdown",
278
- "timeout",
279
- "aborted",
280
- "failed",
281
- "latched",
282
- ];
283
- /** A demand that could not be served. Carries the discriminating reason. */
284
- class BootstrapUnavailableError extends Error {
285
- unavailableReason;
286
- constructor(unavailableReason, message) {
287
- super(message);
288
- this.name = "BootstrapUnavailableError";
289
- this.unavailableReason = unavailableReason;
290
- }
291
- }
292
- /**
293
- * The clients a completed load produced, or `null`.
294
- *
295
- * NEVER starts a load. This is the accessor for work that must touch the
296
- * clients only if they already exist — session start's `metricsClient.reset()`
297
- * and `knipClient.resetSessionState()` are exactly that: re-arming state on a
298
- * client that was never constructed is vacuous, and loading 17 modules in
299
- * order to reset nothing is the cost #2467 removes.
300
- */
301
- export function peekBootstrapClients() {
302
- return residentClients;
303
- }
304
- /**
305
- * A {@link SessionBootstrapAccess} over clients that are ALREADY loaded.
306
- *
307
- * `clients/mcp/session.ts` builds its whole session context up front — an MCP
308
- * call has nothing to defer to — so it holds the seventeen clients before it
309
- * ever calls `handleSessionStart`. This is the two-line adapter that lets the
310
- * handler take ONE shape instead of admitting a second, untyped one in which
311
- * fifteen individually-optional client fields stood in for the seam ("exactly
312
- * one of the two is supplied" was prose, not a type; a dropped
313
- * `metricsClient` compiled and silently skipped every startup scan).
314
- */
315
- export function residentBootstrapAccess(clients) {
316
- return {
317
- peek: () => clients,
318
- request: async () => clients,
319
- };
320
- }
321
- /**
322
- * The STRICT accessor: resolve the shared clients or reject.
323
- *
324
- * Concurrent callers join one flight (identity-guarded by
325
- * `clients/single-flight.ts`, so a late settle can never evict a successor's
326
- * entry). A rejected load releases the key, so the NEXT demand retries rather
327
- * than replaying the rejection — with the caveat `clients/lazy-import.ts`
328
- * documents: a module that threw during EVALUATION is memoized as rejected by
329
- * Node's ESM loader, so a retry re-runs `buildBootstrapClients` but that one
330
- * module's `import()` replays its cached rejection. Every per-client load is
331
- * individually fail-soft, so that case degrades one analyzer, not the set.
332
- */
333
- export function loadBootstrapClients() {
334
- // The memo short-circuit sits ABOVE the flight check deliberately, and is
335
- // written only on success — so it can never hide the in-flight path from a
336
- // concurrent caller the way #1690's did. Before the first success there is
337
- // no memo, which is exactly the window sharing has to cover.
338
- if (residentClients)
339
- return Promise.resolve(residentClients);
340
- // #2467: refuse to START a load after primary shutdown, but never
341
- // invalidate a waiter. `has()` is the whole guard: when a flight is already
342
- // running the call below joins it, so the demand that was mid-air when
343
- // shutdown landed still settles with real clients.
344
- if (bootstrapShutdown && !bootstrapFlight.has(BOOTSTRAP_FLIGHT_KEY)) {
345
- return Promise.reject(new BootstrapUnavailableError("shutdown", "analyzer bootstrap declined: primary session is shutting down"));
346
- }
347
- // Unlike the shutdown gate above, this one has no `!has()` half: strikes
348
- // only ever reach the limit inside `noteBootstrapBuildFailure`, which runs
349
- // synchronously INSIDE this flight's own callback, immediately before it
350
- // rethrows and the flight's `release` runs — there is no synchronous window
351
- // in which a fresh call can observe strikes at the limit while that same
352
- // flight is still registered. A `!has()` half here would only ever be
353
- // false, so it stayed an untested branch (#2467 review, F2) rather than a
354
- // second guard.
355
- if (bootstrapFailureStrikes >= BOOTSTRAP_FAILURE_STRIKE_LIMIT) {
356
- return Promise.reject(new BootstrapUnavailableError("latched", `analyzer bootstrap declined: ${bootstrapFailureStrikes} consecutive load failures`));
357
- }
358
- return bootstrapFlight.run(BOOTSTRAP_FLIGHT_KEY, async () => {
359
- const attempt = (bootstrapLoadAttempts += 1);
360
- const startedAt = Date.now();
361
- let clients;
362
- try {
363
- clients = await buildBootstrapClients();
364
- }
365
- catch (err) {
366
- noteBootstrapBuildFailure(err);
367
- throw err;
368
- }
369
- // A SUCCESS is what makes the strikes consecutive rather than a running
370
- // total, so one bad build in a healthy process never edges the latch shut.
371
- bootstrapFailureStrikes = 0;
372
- residentClients = clients;
373
- // The one timing record #2467's observability section keeps. It used to
374
- // be emitted by `handleSessionStart` from timestamps `index.ts` took
375
- // around its eager pre-handler load; now it is emitted where the load
376
- // actually happens, so it stays truthful once the load is on demand.
377
- // `attempt` distinguishes a retry from the initial attempt without
378
- // adding a per-demand record.
379
- logLatency({
380
- type: "phase",
381
- phase: "bootstrap_clients_load",
382
- filePath: process.cwd(),
383
- startedAt: new Date(startedAt).toISOString(),
384
- durationMs: Date.now() - startedAt,
385
- metadata: { attempt },
386
- });
387
- return clients;
388
- });
389
- }
390
- /**
391
- * Count a failed build and, on the transition that closes the latch, write the
392
- * ONE durable row saying this environment has stopped being retried.
393
- *
394
- * `recordDegradationOnce` is the repo's own once-per-kind/subject recorder, so
395
- * the latch needs no parallel "have I logged this yet" boolean beside the one
396
- * the ledger already keeps.
397
- */
398
- function noteBootstrapBuildFailure(err) {
399
- bootstrapFailureStrikes += 1;
400
- if (bootstrapFailureStrikes !== BOOTSTRAP_FAILURE_STRIKE_LIMIT)
401
- return;
402
- recordDegradationOnce({
403
- kind: "analyzer-bootstrap-latched",
404
- subject: BOOTSTRAP_FLIGHT_KEY,
405
- reason: `${BOOTSTRAP_FAILURE_STRIKE_LIMIT} consecutive load failures; no further builds this session: ${err?.message ?? String(err)}`,
406
- });
407
- }
408
- /**
409
- * The BOUNDED, FAIL-OPEN accessor (#2467).
410
- *
411
- * Bounds the caller's WAIT on both axes AGENTS.md's both-bounds rule names —
412
- * a wall-clock ceiling AND the caller's abort signal — and answers `null`
413
- * instead of throwing, so the caller proceeds without the clients. Every
414
- * `null` caused by the SEAM (shutdown, timeout, a rejected load, or the
415
- * strike latch) is counted in the degradation ledger under
416
- * `analyzer-bootstrap-unavailable`, rising-edge per subject, so a repeated
417
- * failure stays one record with an exact count rather than per-demand spam.
418
- * A `null` caused by the CALLER'S OWN signal firing is not: that is the
419
- * caller choosing to stop waiting (Escape, a turn ending), not the analyzer
420
- * graph degrading, and counting it inverted the two in `pilens_health`.
421
- */
422
- export async function requestBootstrapClients(options) {
423
- if (residentClients)
424
- return residentClients;
425
- // The seam's own session-teardown bound travels with EVERY demand, so a
426
- // caller whose work is not turn-scoped (the two session-start schedulers)
427
- // still satisfies AGENTS.md's both-bounds rule without binding a turn
428
- // signal that would cancel it for the wrong reason.
429
- const shutdownSignal = bootstrapShutdownController.signal;
430
- const timeoutMs = options.timeoutMs ?? BOOTSTRAP_LOAD_TIMEOUT_MS;
431
- try {
432
- // #2523 slice 2: this used to be `awaitWithinBounds`, a private copy of
433
- // exactly what `bounded()` does — same three-way precedence, same
434
- // remove-the-listener-in-`finally`, same abandon-the-wait-keep-the-work
435
- // contract. `bounded()` is a true superset of it (it also records the
436
- // abandonment), so the copy is gone rather than kept in sync by hand.
437
- //
438
- // `undefined` here can only mean a bound fired: `loadBootstrapClients`
439
- // resolves `BootstrapClients` or rejects, never `undefined`.
440
- const clients = await bounded(loadBootstrapClients(), {
441
- ms: timeoutMs,
442
- // Genuinely absent for the three session-start schedulers — see
443
- // `SessionBootstrapAccess.request` for why binding a turn signal
444
- // there is the wrong bound. `shutdownSignal` is the second live
445
- // bound in that case, so both still hold.
446
- signal: options.signal,
447
- shutdownSignal,
448
- // The hook on the hook axis, the demand on the label (#2557 F7).
449
- // `<hook>:loadBootstrapClients:<reason>` joins against
450
- // `HOOK_WALL_BUDGET_MS` and still says WHICH demand blew the budget.
451
- hook: options.hook,
452
- label: `loadBootstrapClients:${options.reason}`,
453
- });
454
- if (clients)
455
- return clients;
456
- throw abandonedError(options.signal, shutdownSignal, timeoutMs);
457
- }
458
- catch (err) {
459
- const unavailableReason = err instanceof BootstrapUnavailableError
460
- ? err.unavailableReason
461
- : "failed";
462
- // "aborted" means the CALLER'S OWN signal fired — a user pressing Escape
463
- // mid-tool-call, a turn ending. That is the caller choosing to stop
464
- // waiting, not the analyzer graph degrading, and writing it to the ledger
465
- // inverted the two: a deliberate cancel surfaced identically to an
466
- // unhealthy environment in `pilens_health`. `shutdown`/`timeout`/`failed`/
467
- // `latched` all describe the SEAM failing to serve the demand, so those
468
- // still count.
469
- if (unavailableReason !== "aborted") {
470
- emitBounded("bootstrap_clients_unavailable", options.reason, {
471
- durationMs: 0,
472
- metadata: {
473
- unavailableReason,
474
- attempt: bootstrapLoadAttempts,
475
- detail: err?.message ?? String(err),
476
- },
477
- }, {
478
- ledgerKind: "analyzer-bootstrap-unavailable",
479
- risingEdgePer: "identity",
480
- reason: unavailableReason,
481
- });
482
- }
483
- return null;
484
- }
485
- }
486
- /**
487
- * Which bound won, read off the caller's own signal rather than guessed.
488
- *
489
- * Read AFTER `bounded()` has settled, exactly as the deleted `awaitWithinBounds`
490
- * read it after its own race — and in the same precedence `bounded()` applies
491
- * internally (caller, then teardown, then the clock), so the reason this
492
- * reconstructs is the reason that fired.
493
- */
494
- function abandonedError(signal, shutdownSignal, timeoutMs) {
495
- if (signal?.aborted) {
496
- return new BootstrapUnavailableError("aborted", "analyzer bootstrap wait abandoned: caller aborted");
497
- }
498
- if (shutdownSignal.aborted) {
499
- return new BootstrapUnavailableError("shutdown", "analyzer bootstrap wait abandoned: primary session is shutting down");
500
- }
501
- return new BootstrapUnavailableError("timeout", `analyzer bootstrap wait abandoned after ${timeoutMs}ms`);
502
- }
503
- /**
504
- * Refuse NEW loads from here on — the primary session is tearing down.
505
- *
506
- * Deliberately does NOT clear `residentClients` or the in-flight entry: a
507
- * demand already waiting must still settle (#2467), and the clients a
508
- * completed load produced stay usable for whatever teardown work is still
509
- * draining. Nothing here spawns, which is what AGENTS.md's #234 teardown rule
510
- * requires of a `session_shutdown`-time call.
511
- */
512
- export function markAnalyzerBootstrapShutdown() {
513
- bootstrapShutdown = true;
514
- // Unparks any bounded demand still waiting on a load rather than leaving it
515
- // to burn the full wall-clock ceiling for clients its session will never use.
516
- bootstrapShutdownController.abort();
517
- }
518
- /**
519
- * Re-arm the shutdown gate at `session_start`.
520
- *
521
- * The gate is a per-SESSION claim ("this session is over") held in
522
- * process-lived storage — AGENTS.md defect shape 17 exactly. Without this a
523
- * replacement session in the same process would find the analyzers refused
524
- * for the rest of the process. The resident clients are NOT dropped: see
525
- * `residentClients`' own comment for why re-paying the load at every session
526
- * boundary would be wrong.
527
- */
528
- export function resetAnalyzerBootstrapSessionState() {
529
- bootstrapShutdown = false;
530
- bootstrapShutdownController = new AbortController();
531
- // The strike latch is a per-SESSION claim too: an environment repaired
532
- // between sessions (a dependency installed, a package layout fixed) must be
533
- // retried, not written off for the life of the process.
534
- bootstrapFailureStrikes = 0;
535
- }
536
- /**
537
- * Is the shutdown gate closed — i.e. would a fresh demand be refused?
538
- *
539
- * A synchronous read of the same flag {@link loadBootstrapClients} checks,
540
- * so the session-state registry's probe can prove the session_start reset
541
- * re-arms it without awaiting a load.
542
- */
543
- export function isAnalyzerBootstrapShutdown() {
544
- return bootstrapShutdown;
545
- }
546
- /**
547
- * How many consecutive builds have failed — the session-state registry's probe
548
- * for the strike latch, which cannot be read off {@link isAnalyzerBootstrapShutdown}.
549
- */
550
- export function _analyzerBootstrapFailureStrikes() {
551
- return bootstrapFailureStrikes;
552
- }
553
- /** Test-only: close the strike latch without paying three real failed builds. */
554
- export function _armAnalyzerBootstrapLatchForTests() {
555
- bootstrapFailureStrikes = BOOTSTRAP_FAILURE_STRIKE_LIMIT;
556
- }
557
- /** Test-only: drop the resident clients, the flight, and the gate. */
558
- export function _resetAnalyzerBootstrapForTests() {
559
- residentClients = null;
560
- bootstrapShutdown = false;
561
- bootstrapShutdownController = new AbortController();
562
- bootstrapFailureStrikes = 0;
563
- bootstrapLoadAttempts = 0;
564
- bootstrapFlight.clear();
565
- }
566
- /** Test/diagnostic: how many builds have been STARTED this process. */
567
- export function _analyzerBootstrapLoadAttempts() {
568
- return bootstrapLoadAttempts;
569
- }