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,37 +0,0 @@
1
- /**
2
- * The single post-autofix instruction about a written file (#1590).
3
- *
4
- * Two layers used to phrase this. `clients/pipeline.ts` claimed "the attached
5
- * full content is authoritative" from changed-file membership alone, and
6
- * `clients/runtime-tool-result.ts` — the only layer that sees the per-file
7
- * attachment cap and the per-command aggregate budget — appended "too large to
8
- * attach" for the same file. On a size-capped write the agent got both.
9
- *
10
- * The wording now lives here, and `handleToolResult` is the only caller: the
11
- * pipeline supplies the data (display paths it already resolved) and the layer
12
- * that made the attachment decision picks the sentence. Keeping the renderer
13
- * out of `pipeline.ts` also keeps it real in tests that mock the pipeline away.
14
- */
15
- /** Render the ONE post-autofix instruction for `decision`. */
16
- export function renderPostAutofixNotice(notice, decision) {
17
- const topFiles = notice.changedFiles
18
- .slice(0, 8)
19
- .map((f) => " - " + f)
20
- .join("\n");
21
- const overflow = notice.changedFiles.length > 8
22
- ? "\n - ... and " + (notice.changedFiles.length - 8) + " more"
23
- : "";
24
- const fileList = notice.changedFiles.length
25
- ? "\nModified files:\n" + topFiles + overflow
26
- : "";
27
- switch (decision) {
28
- case "attached":
29
- return `⚠️ **The attached full content for ${notice.targetPath} is authoritative after autofix. You MUST re-read any other modified side-effect files before editing them.**${fileList}`;
30
- case "size-capped":
31
- return `⚠️ **File was modified by auto-format/fix. You MUST re-read ${notice.targetPath} before making any further edits — the authoritative content is too large to attach.**${fileList}`;
32
- case "aggregate-budget-degraded":
33
- return `⚠️ **File was modified by auto-format/fix. You MUST re-read ${notice.targetPath} before making any further edits — the aggregate authoritative content for this command is too large to attach.**${fileList}`;
34
- default:
35
- return `⚠️ **File was modified by auto-format/fix. You MUST re-read modified file(s) before making any further edits — the content on disk has changed (whitespace, indentation, quotes, or code). Editing from memory will produce mismatches.**${fileList}`;
36
- }
37
- }
@@ -1,21 +0,0 @@
1
- /**
2
- * One-shot invocation detection, shared across the session_start-scheduled
3
- * background work that must NOT run — or retain the process — in print mode
4
- * (#1154 quick-mode warmup, #1153 orphan-reaper).
5
- *
6
- * `pi -p` / `pi --print` is a one-shot: the host computes a single turn and
7
- * exits. Work scheduled to warm caches / clean up state for a *future* session
8
- * in the same process is pure waste in this mode AND — when it arms a
9
- * referenced libuv handle (a non-`unref`'d timer, an LSP child, an fs walk)
10
- * with no session_shutdown teardown — keeps the already-settled one-shot
11
- * process alive. That is the referenced-handle retention class of
12
- * #1097/#1110/#1148/#1149 and the located #1122 hypothesis-A concern.
13
- *
14
- * argv is read live (not captured at module load) so tests can drive it; the
15
- * flag never changes within a real process, and there is no hot-path caller,
16
- * so recomputing is free. This mirrors the print detection in
17
- * `runtime-session.ts`'s `resolveStartupMode` — keep them a single source.
18
- */
19
- export function isPrintMode(argv = process.argv) {
20
- return argv.includes("--print") || argv.includes("-p");
21
- }
@@ -1,228 +0,0 @@
1
- /**
2
- * The #2506 probe-home redirect, whole: the decision, the per-process memo it
3
- * is cached in, and the degradation event that decision produced.
4
- *
5
- * WHAT IT DECIDES. An ad-hoc probe against the BUILT `clients/*.js` — a bare
6
- * `node -e`, a throwaway `.mjs`, a harness script — has no `PI_LENS_HOME` pin,
7
- * so every logger and ledger it touches used to write into the maintainer's
8
- * REAL `~/.pi-lens`. Confirmed live on 2026-09-02: two review probes left 42
9
- * rows of `/p/.pi-lens.json` fixture garbage in real telemetry. When
10
- * `PI_LENS_HOME` is unset and the process looks like a probe — `PILENS_PROBE=1`,
11
- * a `cwd` inside a specific agent worktree, or a `cwd` under `os.tmpdir()` —
12
- * `resolveProbeHomeDir()` answers with a per-probe directory instead.
13
- *
14
- * WHY IT ALL LIVES HERE and not beside its `getGlobalPiLensDir()` sibling in
15
- * `file-utils.ts`, where round 2 of #2516 left it. `file-utils.ts` sits on an
16
- * import cycle (it still does, via `safe-spawn.js` -> `resource-sampler.js` ->
17
- * `instance-reaper.js` -> `file-utils.js`; the shorter route through
18
- * `degradation-ledger.js` -> `extension-log.js` was this move's doing —
19
- * `extension-log.ts` imported `file-utils.ts` for THIS function and nothing
20
- * else, so the edge went with it, and the known-violations baseline dropped
21
- * from 33 pinned cycles to 12 with none added). Fifteen log-family modules
22
- * call `getGlobalPiLensLogDir()` at their OWN module
23
- * top level. Under vitest's vite-SSR transform each import becomes a
24
- * `__vite_ssr_import_N__` variable assigned in source order, so one of those
25
- * top-level calls re-enters `file-utils.ts` while its body is only PARTWAY
26
- * through those assignments — and a resolver sitting there then dereferences a
27
- * binding that has not been assigned yet, throwing `ReferenceError: Cannot
28
- * access '__vite_ssr_import_N__' before initialization`. Measured live: the
29
- * re-entry arrives through `file-utils.ts`'s FIFTH import,
30
- * `spawn-timeout-cooldown.js`, so every binding declared from the sixth import
31
- * onward is unsafe on that path — which is most of the file.
32
- *
33
- * Round 2 of #2516 papered over that with an `isTestMode()` early return placed
34
- * ahead of the first unsafe dereference. That was load-order luck, not a
35
- * design: moving `file-utils.ts`'s own `isTestMode` import from fifth to last
36
- * makes the GUARD LINE ITSELF throw the same error. It also DEFEATED the
37
- * redirect for every process that has `VITEST` set but no `PI_LENS_HOME` pin —
38
- * vitest's own globalSetup/child processes — sending their logs to the real
39
- * home: the exact hermeticity hole the redirect exists to close.
40
- *
41
- * THIS module is off that cycle. It imports only node builtins and
42
- * `path-utils.js`, itself a leaf (node builtins plus the vendored, zero-import
43
- * `deps/minimatch.js`). A module off every cycle is fully evaluated before any
44
- * importer's body runs — in plain ESM and under the vite-SSR transform alike —
45
- * so none of its own bindings can ever be observed uninitialized, wherever an
46
- * importer chooses to place the import. That is what makes the guard
47
- * unnecessary rather than merely well-placed, and it is why module-scope
48
- * `const`s (including the `Symbol.for` below) are ordinary here where they were
49
- * a hazard in `file-utils.ts`.
50
- *
51
- * `tests/config/global-dir-probe-redirect.test.ts` pins the behaviour through
52
- * real spawned `node` children, including the VITEST-set-but-unpinned case.
53
- */
54
- import * as fs from "node:fs";
55
- import * as os from "node:os";
56
- import * as path from "node:path";
57
- import { isUnderDir, normalizeFilePath } from "./path-utils.js";
58
- /**
59
- * The memo lives in a process-wide `globalThis` slot rather than a plain
60
- * module-scope `let` so that a bundled `dist/index.js` and the loose
61
- * `clients/*.js` loaded into the same process — the shape #335 ships — share
62
- * ONE decision instead of memoizing two. A `Symbol.for` key is interned by
63
- * string, so both copies of this module resolve to the same slot.
64
- */
65
- const RESOLUTION_SLOT = Symbol.for("pi-lens.probe-home-state.resolution");
66
- /** The memoized resolution for this process, or `undefined` before first use. */
67
- export function getProbeHomeResolution() {
68
- return globalThis[RESOLUTION_SLOT];
69
- }
70
- /**
71
- * The degradation row for a redirect that actually happened, or `undefined`
72
- * when this process was not redirected (or has not resolved yet).
73
- * `degradation-ledger.ts`'s `getDegradationSummary()` is the only caller — it
74
- * folds this at READ time rather than having the resolver push a row, because a
75
- * direct import between `file-utils.ts` and `degradation-ledger.ts` in EITHER
76
- * direction (a dynamic `import()` included) adds unpinned `no-client-cycles`
77
- * violations to the cycle named in this module's doc comment.
78
- */
79
- export function getProbeHomeRedirectEvent() {
80
- return getProbeHomeResolution()?.event;
81
- }
82
- /**
83
- * Where pi-lens writes its LOGS, ledger rows and debug dumps: `~/.pi-lens/` by
84
- * default, exactly like `getGlobalPiLensDir()` in `file-utils.ts` — but
85
- * redirected to a per-probe directory when this process looks like an ad-hoc
86
- * probe rather than a real pi session (#2506).
87
- *
88
- * Every log-family writer routes here: `latency.log`, `extension.log`,
89
- * `sessionstart.log`, `cascade.log`, `read-guard.log`, `tree-sitter.log`,
90
- * `word-index.log`, `bus-events.log`, `dispositions.log`, `dead-code.log`,
91
- * `ast-grep-tools.log`, `actionable-warnings.log`, `review-graph.log`, the
92
- * `logs/*.jsonl` diagnostic dir, the debug handle/heap dumps,
93
- * `log-cleanup.ts`'s sweep over all of the above, and `smells-rollup.ts`'s
94
- * read-side tail of `latency.log`/`bus-events.log` (a reader, but it must
95
- * follow the same root or it tails a file nobody is writing).
96
- *
97
- * WHY IT LIVES IN THIS MODULE and not next to its `getGlobalPiLensDir()`
98
- * sibling in `file-utils.ts` — see this file's header. Fifteen of the writers
99
- * listed above call this function at their OWN module top level, and
100
- * `file-utils.ts` is on an import cycle, so resolving from there could observe
101
- * `file-utils.ts` mid-initialization. Resolving from a module off every cycle
102
- * cannot.
103
- *
104
- * `PI_LENS_HOME` wins over any redirect, which is how
105
- * `tests/support/vitest-setup.ts` keeps test workers hermetic. Note the
106
- * redirect still applies under vitest for processes that setup does not cover
107
- * (globalSetup, and children spawned without the pin): #2516 round 2's
108
- * `isTestMode()` guard sent exactly those to the developer's real home.
109
- *
110
- * Deliberately does NOT write a line to the terminal when it fires. #1333 gives
111
- * pi sole ownership of the TTY, and
112
- * `tests/clients/extension-terminal-silence.test.ts` enforces that nothing
113
- * under `clients/` calls `process.std*.write` or `console.*` (round 2 of
114
- * #2506 shipped a `process.stderr.write` here and was red in CI for exactly
115
- * that). Nor can it log through `extension-log.ts`'s
116
- * `createSubsystemLogger`: that module imports THIS one, so an import back
117
- * the other way would close a new, unpinned `no-client-cycles` cycle — and
118
- * `extension.log` is itself redirected by this very function, so the line
119
- * would land in the probe home nobody reads. The durable signal is the
120
- * `global-dir-probe-redirect` degradation row instead, folded into
121
- * `getDegradationSummary()` at read time via
122
- * `getProbeHomeRedirectEvent()` above.
123
- */
124
- export function getGlobalPiLensLogDir() {
125
- const override = process.env.PI_LENS_HOME?.trim();
126
- if (override)
127
- return path.resolve(override);
128
- return resolveProbeHomeDir() ?? path.join(os.homedir(), ".pi-lens");
129
- }
130
- /**
131
- * Resolve the probe-home redirect at most ONCE per process, caching both the
132
- * "yes, here" and the "no redirect" answers (#2506 round 3, F5). Round 2 read
133
- * `process.cwd()` live on every call, which gave a single process up to three
134
- * different global dirs as it chdir'd, and re-ran the whole decision on the hot
135
- * logging path.
136
- *
137
- * `undefined` means "no redirect applies"; `getGlobalPiLensLogDir()` above
138
- * falls back to the real home. This function never consults `PI_LENS_HOME` —
139
- * that pin is handled by its caller, ahead of this decision, so a pinned
140
- * process never memoizes a probe answer it would then keep after the pin
141
- * changed.
142
- */
143
- function resolveProbeHomeDir() {
144
- const slot = globalThis;
145
- const cached = slot[RESOLUTION_SLOT];
146
- if (cached)
147
- return cached.probeHome;
148
- const cwd = process.cwd();
149
- const probeHome = computeProbeHomeDir(cwd);
150
- slot[RESOLUTION_SLOT] = {
151
- probeHome,
152
- event: probeHome ? { probeHome, cwd } : undefined,
153
- };
154
- return probeHome;
155
- }
156
- /**
157
- * Clears the memoized decision AND the event it produced, so the next
158
- * `getGlobalPiLensLogDir()` call re-resolves from scratch. Exercised by
159
- * `tests/config/global-dir-probe-redirect.test.ts`, which drives the resolver
160
- * repeatedly under different in-process conditions; without it the first call
161
- * in a worker would pin the answer for every later case in the same file.
162
- */
163
- export function _resetProbeHomeRedirectStateForTests() {
164
- globalThis[RESOLUTION_SLOT] = undefined;
165
- }
166
- /** The redirect decision itself. */
167
- function computeProbeHomeDir(cwd) {
168
- // The explicit force wins first: it is how a probe run from an ordinary
169
- // project checkout opts in, and it must work even under a harness that has
170
- // set a test-mode marker but no PI_LENS_HOME.
171
- if (process.env.PILENS_PROBE === "1") {
172
- return path.join(cwd, ".pi-lens-probe-home");
173
- }
174
- const worktreeRoot = findAgentWorktreeRoot(cwd);
175
- if (worktreeRoot)
176
- return path.join(worktreeRoot, ".pi-lens-probe-home");
177
- if (isUnderRealDir(cwd, os.tmpdir())) {
178
- return path.join(cwd, ".pi-lens-probe-home");
179
- }
180
- return undefined;
181
- }
182
- /**
183
- * The directory of the SPECIFIC agent worktree containing `cwd`, or
184
- * `undefined` when `cwd` is not inside one.
185
- *
186
- * Requires at least one path segment AFTER `worktrees/`, and anchors the
187
- * probe home at that segment rather than at the live `cwd` (#2506 round 3,
188
- * F5). Round 2's trailing `(\/|$)` alternative also matched a `cwd` of
189
- * `.claude/worktrees` ITSELF, which would have put the probe home in the
190
- * SHARED worktrees parent — every concurrent agent on the box writing into
191
- * one directory, the cross-agent collision this redirect is supposed to
192
- * prevent. Anchoring at the worktree also means a probe run from a
193
- * subdirectory (`<worktree>/clients`) and one run from the worktree root
194
- * agree on a single probe home instead of scattering one per cwd.
195
- */
196
- function findAgentWorktreeRoot(cwd) {
197
- const normalized = normalizeFilePath(path.resolve(cwd));
198
- const match = /(?:^|\/)\.claude\/worktrees\/[^/]+(?:\/|$)/.exec(normalized);
199
- if (!match)
200
- return undefined;
201
- return normalized.slice(0, match.index + match[0].length).replace(/\/$/, "");
202
- }
203
- /**
204
- * `isUnderDir`, but with both sides resolved through `realpath` first
205
- * (#2506 round 3, F7).
206
- *
207
- * On macOS `os.tmpdir()` reports `/var/folders/...` while a `cwd` created
208
- * under it resolves to `/private/var/folders/...` (`/var` is a symlink to
209
- * `/private/var`), so the two NEVER prefix-match unresolved and the tmpdir
210
- * branch would be dead on every Mac. Windows has the same shape with 8.3
211
- * short names and substituted drives. Both sides go through the same
212
- * function, so `realpathSync.native`'s canonical Windows casing applies
213
- * consistently; the result is used only for this containment test, never to
214
- * build the returned path, so no casing change can leak into a log path.
215
- * Best-effort by design: a path that does not exist yet (or an EPERM) falls
216
- * back to its literal form rather than throwing on the logging hot path.
217
- */
218
- function isUnderRealDir(child, parent) {
219
- return isUnderDir(toRealPath(child), toRealPath(parent));
220
- }
221
- function toRealPath(target) {
222
- try {
223
- return fs.realpathSync.native(target);
224
- }
225
- catch {
226
- return target;
227
- }
228
- }
@@ -1,66 +0,0 @@
1
- /**
2
- * Shared process-bridge registration helper (#2437).
3
- *
4
- * `clients/read-bridge.ts` (#1265) and `clients/mutation-bridge.ts` (#2423)
5
- * each mount a versioned, frozen method-table object at a well-known
6
- * `globalThis[Symbol.for("pi-lens:...")]` key so a same-process producer can
7
- * reach pi-lens's bookkeeping without importing its internals. Both bridges
8
- * carried an identical mount body — a first-wins existence check,
9
- * `Object.freeze`, and a non-writable/non-configurable `Object.defineProperty`
10
- * — differing only in their key and method table (named by the #2432 review,
11
- * refs #2423). This module owns that body once.
12
- *
13
- * NOT `clients/process-singletons.ts` (#2146): that module keeps a single
14
- * MUTABLE, adopt-if-version-compatible value per "family" inside ONE shared
15
- * container (a different, single key mounts the container itself, and a
16
- * version mismatch there means "discard and rebuild"). A bridge's contract is
17
- * the opposite: the documented producer protocol reads
18
- * `globalThis[Symbol.for("pi-lens:mutation-bridge")]` directly as a frozen,
19
- * first-wins, unreplaceable property, and a version mismatch is the
20
- * PRODUCER's problem — an unsupported bridge it should not call — never a
21
- * signal for pi-lens to silently reset its own mount. Reusing the singleton
22
- * container would change that documented external contract, so this stays a
23
- * separate, deliberately smaller leaf built for the bridge shape only.
24
- *
25
- * STATIC IMPORTS: none, deliberately. Both `read-bridge.ts` and
26
- * `mutation-bridge.ts` import this module; it must stay a dependency leaf so
27
- * neither gains an edge onto anything else in `clients/` (`no-client-cycles`).
28
- */
29
- /**
30
- * Mount `build()`'s result at `globalThis[key]`, once per process.
31
- *
32
- * First-wins: if `key` already exists on `globalThis` — from an earlier call
33
- * in this process, whether this bridge's own prior registration or a
34
- * redundant re-activation — `build()` is never invoked and the existing
35
- * mount is left untouched. The mounted value is frozen and installed
36
- * non-writable/non-configurable so no later code can silently replace or
37
- * extend it; the `in` check above is what keeps a redundant call from
38
- * throwing on that now-frozen property.
39
- */
40
- export function registerProcessBridge(key, build) {
41
- if (key in globalThis)
42
- return;
43
- const bridge = Object.freeze(build());
44
- Object.defineProperty(globalThis, key, {
45
- value: bridge,
46
- writable: false,
47
- configurable: false,
48
- enumerable: false,
49
- });
50
- }
51
- /**
52
- * The bridge mounted at `key`, or `undefined` when nothing is mounted, the
53
- * mounted value is not an object, or its `version` does not equal `version`.
54
- * A version mismatch means "not a bridge this caller recognizes" — never
55
- * adopted and never reset; the reset-on-mismatch behavior belongs to
56
- * `process-singletons.ts`'s different contract, not this one.
57
- */
58
- export function getProcessBridge(key, version) {
59
- const bridge = globalThis[key];
60
- if (!bridge || typeof bridge !== "object")
61
- return undefined;
62
- const candidate = bridge;
63
- if (candidate.version !== version)
64
- return undefined;
65
- return candidate;
66
- }
@@ -1,210 +0,0 @@
1
- /**
2
- * Process singletons — state that must exist ONCE PER PROCESS, not once per
3
- * module evaluation (#2146).
4
- *
5
- * WHY THIS MODULE EXISTS. pi evaluates the pi-lens module graph more than once
6
- * in a single process: dogfood pass 3 measured one pid emitting `host_boot`
7
- * nine times, another four times. Source and compiled entries load through
8
- * separate module graphs, in-process subagent sessions re-enter the extension
9
- * loader, and vitest re-evaluates modules on `vi.resetModules()`. Every
10
- * module-scope `let` therefore exists N times, and any state whose CORRECTNESS
11
- * depends on being the process's only copy silently breaks:
12
- *
13
- * - `session-lifecycle.ts`'s registered primary: evaluation 2 starts with an
14
- * empty registration, classifies a subagent temp root as `primary`, and runs
15
- * the full session_start battery the #473/#2129/#2133 guard exists to
16
- * decline. Measured cost: three identical word-index full rebuilds in one
17
- * 90s burst, 240.8s of CPU for one index.
18
- * - `instance-registry.ts`'s mutation tail: N tails are N concurrent
19
- * read-modify-write cycles over one `instances.json`. Measured: three
20
- * `instance-registry-corrupt` records in a 9s window, with two project roots
21
- * and one live instance lost from the file.
22
- *
23
- * PRECEDENT, both in-repo and both cited rather than invented:
24
- * - `clients/runtime-session.ts:1826` hangs `__piLensFirstSessionDone` /
25
- * `__piLensWarmupScheduled` on `globalThis` for exactly this reason.
26
- * - `clients/ndjson-logger.ts:125` does the versioned form: a
27
- * `Symbol.for()` key, a schema string, a version number, and an explicit
28
- * adopt-or-decline decision for a state written by a different build.
29
- *
30
- * This module generalizes the second one so each state family gets the same
31
- * treatment without re-deriving the protocol per site.
32
- *
33
- * WHAT BELONGS HERE. Only state that is WRONG when duplicated: process-wide
34
- * registrations, serialization points, and once-per-process latches. A memo or
35
- * cache that re-derives the same answer from a stable source (an env read, a
36
- * host probe) is merely wasteful when duplicated, not wrong, and stays at
37
- * module scope — see the class-sweep table in the #2146 PR body for the
38
- * per-family verdicts.
39
- *
40
- * VERSIONING AND THE OLDER-SHAPE FALLBACK. Two builds can meet in one process:
41
- * a stale `dist/` graph and a fresh source graph, or an extension reload after
42
- * an upgrade. Each family carries its own `version`. The rule is
43
- * adopt-if-compatible, reset otherwise:
44
- *
45
- * - Same schema and same version -> ADOPT the existing value. This is the
46
- * common case and the whole point of the module.
47
- * - Anything else (missing schema, different schema, older version, NEWER
48
- * version) -> do NOT adopt. A shape this build cannot read is not safely
49
- * readable in either direction, so guessing is worse than starting clean.
50
- * The cell is replaced with a fresh value from `create()` and ONE bounded
51
- * `process-singleton-reset` entry is logged per family, so a nine-evaluation
52
- * process still reports at most one row per family. Behavior after a reset is
53
- * exactly today's module-scope behavior for that family, which is the
54
- * fail-safe direction.
55
- *
56
- * The container key itself is versioned (`SINGLETON_HOST_KEY`). A future change
57
- * to the CONTAINER shape bumps the key, so an old container is simply not
58
- * found rather than mis-read.
59
- */
60
- /**
61
- * STATIC IMPORTS: none, deliberately. This module is a dependency leaf.
62
- *
63
- * It cannot import the degradation ledger. `instance-registry.ts` imports this
64
- * module, and the ledger reaches `instance-reaper.ts` (through `extension-log`
65
- * -> `file-utils` -> `git-tracked-ignore` -> `safe-spawn` -> `resource-sampler`),
66
- * and `instance-reaper` imports the registry back. Any edge from here to the
67
- * ledger closes a `no-client-cycles` cycle, which CI's dependency-boundaries
68
- * lane rejects. A dynamic import does not help: the rule excludes
69
- * `dynamic-import` only on the edge it evaluates, not on the intermediate edges
70
- * of the cycle it walks.
71
- *
72
- * So the direction is inverted, exactly as `ndjson-logger.ts` already does for
73
- * its own sink-write failures: this module keeps a bounded reset log, and
74
- * `degradation-ledger.ts` PULLS it at read time through
75
- * {@link getProcessSingletonResets} and folds it into `getDegradationSummary()`.
76
- * The record still reaches `pilens_health`, with no import from here.
77
- */
78
- /** Bump only when the CONTAINER shape changes, never for a family's shape. */
79
- const SINGLETON_HOST_KEY = Symbol.for("pi-lens.process-singletons.v1");
80
- const SINGLETON_SCHEMA = "pi-lens.process-singletons";
81
- /** Degradation kind emitted when an incompatible cell is discarded. */
82
- export const PROCESS_SINGLETON_RESET_KIND = "process-singleton-reset";
83
- const singletonHost = globalThis;
84
- /**
85
- * The process's one container. Deliberately created on first read rather than
86
- * at module scope of a single graph: whichever evaluation runs first wins, and
87
- * every later evaluation adopts it.
88
- */
89
- function container() {
90
- const existing = singletonHost[SINGLETON_HOST_KEY];
91
- if (existing instanceof Map)
92
- return existing;
93
- const fresh = new Map();
94
- singletonHost[SINGLETON_HOST_KEY] = fresh;
95
- return fresh;
96
- }
97
- function isAdoptable(cell, version) {
98
- if (!cell || typeof cell !== "object")
99
- return false;
100
- const candidate = cell;
101
- return (candidate.schema === SINGLETON_SCHEMA &&
102
- candidate.version === version &&
103
- candidate.value !== undefined);
104
- }
105
- /** One bounded reset log per process, capped so a pathological build pair
106
- * cannot grow it without limit. */
107
- export const PROCESS_SINGLETON_RESET_LOG_FAMILY = "process-singleton-reset-log";
108
- const RESET_LOG_FAMILY = PROCESS_SINGLETON_RESET_LOG_FAMILY;
109
- const RESET_LOG_VERSION = 1;
110
- const RESET_LOG_CAP = 16;
111
- function resetLog() {
112
- return getProcessSingleton(RESET_LOG_FAMILY, RESET_LOG_VERSION, () => ({
113
- entries: [],
114
- }));
115
- }
116
- /**
117
- * Record that an incompatible cell was discarded. Bounded twice: once per
118
- * family (a nine-evaluation process logs at most one entry per family) and once
119
- * overall by {@link RESET_LOG_CAP}.
120
- */
121
- function recordIncompatibleCell(family, wantedVersion, found) {
122
- // The reset log is itself a family, so recording ITS reset would recurse.
123
- // Dropping that one record is correct: the log it would be written to is the
124
- // thing being discarded.
125
- if (family === RESET_LOG_FAMILY)
126
- return;
127
- const log = resetLog();
128
- if (log.entries.some((entry) => entry.family === family))
129
- return;
130
- if (log.entries.length >= RESET_LOG_CAP)
131
- return;
132
- log.entries.push({
133
- family,
134
- reason: `incompatible process singleton discarded (found schema=${String(found.schema)} ` +
135
- `version=${String(found.version)}, this build wants schema=${SINGLETON_SCHEMA} ` +
136
- `version=${wantedVersion})`,
137
- });
138
- }
139
- /**
140
- * Read-time view for `degradation-ledger.ts` (see the header). Never performs
141
- * I/O and never throws, so folding it into a health summary is free.
142
- */
143
- export function getProcessSingletonResets() {
144
- return resetLog().entries.map((entry) => ({ ...entry }));
145
- }
146
- /**
147
- * Return the process-wide value for `family`, creating it on the first
148
- * evaluation that asks and adopting it on every later one.
149
- *
150
- * `version` describes the SHAPE of the value `create()` builds. Bump it when a
151
- * build changes that shape, so a graph carrying the old shape is discarded
152
- * instead of mis-read (see the module docstring's fallback rules).
153
- *
154
- * `create()` runs at most once per process per family, unless an incompatible
155
- * cell forced a reset.
156
- *
157
- * `onIncompatible` is for values that own external resources. It runs before
158
- * the cell is replaced, so the owner can tear those resources down safely.
159
- */
160
- export function getProcessSingleton(family, version, create, onIncompatible) {
161
- const cells = container();
162
- const existing = cells.get(family);
163
- if (isAdoptable(existing, version))
164
- return existing.value;
165
- if (existing !== undefined) {
166
- // An incompatible cell from another build. One bounded row per family:
167
- // nine evaluations must not write nine records (AGENTS.md's bounded-record
168
- // rule; `recordDegradationOnce` keys on kind + subject).
169
- recordIncompatibleCell(family, version, existing);
170
- onIncompatible?.(existing.value);
171
- }
172
- const value = create();
173
- cells.set(family, { schema: SINGLETON_SCHEMA, version, value });
174
- return value;
175
- }
176
- /**
177
- * Test-only: drop the process-wide container so the next
178
- * {@link getProcessSingleton} call rebuilds every family from `create()`.
179
- *
180
- * This clears the GLOBAL state, not a module-local copy — a reset that only
181
- * cleared module scope would be the very defect this module fixes, and would
182
- * make every suite that relies on isolation pass vacuously (catalog shape 7).
183
- */
184
- export function _resetProcessSingletonsForTests() {
185
- singletonHost[SINGLETON_HOST_KEY] = new Map();
186
- }
187
- /**
188
- * Test-only: install a raw cell so a suite can exercise the older/newer-shape
189
- * fallback without needing two real builds in one process.
190
- */
191
- export function _seedProcessSingletonCellForTests(family, cell) {
192
- container().set(family, cell);
193
- }
194
- // --- Module-evaluation ordinal (#2146 observability) ---
195
- const EVALUATION_ORDINAL_FAMILY = "module-evaluation-ordinal";
196
- const EVALUATION_ORDINAL_VERSION = 1;
197
- /**
198
- * How many times this process has evaluated the pi-lens module graph, 1-based.
199
- *
200
- * Called once, at module scope of `clients/startup-timing.ts`, so the number it
201
- * returns is the evaluation count of the graph that contains the extension
202
- * entry. It is carried on `host_boot.metadata.evaluationOrdinal` so a multi-eval
203
- * process is greppable from `latency.log` instead of having to be inferred by
204
- * counting `host_boot` lines per pid — the observability gap #2146 names.
205
- */
206
- export function nextModuleEvaluationOrdinal() {
207
- const state = getProcessSingleton(EVALUATION_ORDINAL_FAMILY, EVALUATION_ORDINAL_VERSION, () => ({ evaluations: 0 }));
208
- state.evaluations += 1;
209
- return state.evaluations;
210
- }
@@ -1,68 +0,0 @@
1
- /**
2
- * The extension runtime's door onto the ONE process-table seam (#2443).
3
- *
4
- * `scripts/lib/process-scan.mjs` owns what a process listing IS: the field →
5
- * platform-column table, the Windows CIM/WQL and POSIX `ps` command
6
- * composition, the WQL escaping, and the row parser. This module owns how
7
- * clients/ RUNS one, which is genuinely different from how a script runs one
8
- * and stays different on purpose:
9
- *
10
- * - the child and its stdout pipe are `unref`'d (#1155) so a one-shot
11
- * `pi --print` can settle without waiting on a CIM query;
12
- * - a child that blows its timeout is terminated through the caller's own
13
- * tree-kill-and-verify machinery (#1864 F3), injected as `onTimeout` — a
14
- * sweep that leaks its own scanner is the defect the sweep exists to fix;
15
- * - the outcome carries a `SpawnCollectStatus`, so "the table is empty" and
16
- * "the query never ran" stay distinguishable and the caller can record the
17
- * degradation (#1857).
18
- *
19
- * WHY THE SEAM IS IMPORTED FROM scripts/ RATHER THAN LIVING HERE: the .mjs
20
- * header argues it in full. Short version — `scripts/prune-agent-worktrees.mjs`
21
- * is a SessionStart/SubagentStop hook that runs inside freshly created agent
22
- * worktrees, where `clients/*.js` (gitignored build output) does not exist
23
- * yet, so the shared half has to be the side that needs no build. This file
24
- * is the single crossing point; nothing else in clients/ imports scripts/.
25
- */
26
- import { spawnCollectStdoutResult, } from "./child-unref.js";
27
- import { buildProcessQuery, parseProcessTable, } from "../scripts/lib/process-scan.mjs";
28
- /**
29
- * Re-exported, not redefined. `windowsExe` resolves an absolute System32
30
- * interpreter path for a spawn this process is about to make (a bare
31
- * `powershell.exe`/`taskkill.exe` is resolvable through a PATH a caller can
32
- * shadow, and these spawns decide what gets killed) — one definition of that
33
- * rule is the whole point of the seam.
34
- */
35
- export { windowsExe } from "../scripts/lib/process-scan.mjs";
36
- /**
37
- * Run one process-table query on the extension's spawn rails.
38
- *
39
- * Never throws and never rejects: an unbuildable query (a Windows-only column
40
- * asked for on POSIX, an empty filter) resolves as `spawn-error` with no rows,
41
- * the same shape every other failure takes, because every caller here is
42
- * best-effort instrumentation or a best-effort sweep.
43
- */
44
- export async function queryProcessTable(request, options) {
45
- let query;
46
- try {
47
- query = buildProcessQuery(request.fields, {
48
- filter: request.filter,
49
- excludeSelfPid: request.excludeSelfPid,
50
- });
51
- }
52
- catch {
53
- return { rows: [], status: "spawn-error", serverSideFiltered: false };
54
- }
55
- const result = await spawnCollectStdoutResult(query.command, query.args, { shell: false, windowsHide: true, stdio: ["ignore", "pipe", "ignore"] }, { timeoutMs: options.timeoutMs, onTimeout: options.onTimeout });
56
- return {
57
- // Whatever the collector kept is parsed rather than discarded here: it
58
- // drops stdout on a non-zero exit (that output is not evidence of what
59
- // is NOT running) but KEEPS the partial table from a timed-out child,
60
- // and the caller decides what a partial table is worth by reading
61
- // `status`. Re-deciding that here would be a second policy.
62
- rows: parseProcessTable(result.stdout, query.tabSeparated, query.fields),
63
- status: result.status,
64
- exitCode: result.exitCode,
65
- timeoutKill: result.timeoutKill,
66
- serverSideFiltered: query.serverSideFiltered,
67
- };
68
- }