pi-lens 4.3.0 → 4.4.1

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