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