pi-lens 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (650) hide show
  1. package/CHANGELOG.md +1064 -0
  2. package/README.md +115 -25
  3. package/config/dependency-cruiser-eager-allowlist.json +6 -2
  4. package/dist/chunk-22AVIGXS.js +560 -0
  5. package/dist/chunk-27BBHSZC.js +106 -0
  6. package/dist/chunk-2BEMIWEW.js +51 -0
  7. package/dist/chunk-2EECBNC5.js +89 -0
  8. package/dist/chunk-34U7PLGE.js +23 -0
  9. package/dist/chunk-3I5QFT3N.js +181 -0
  10. package/dist/chunk-3MED75HT.js +37 -0
  11. package/dist/chunk-47D2BO4S.js +87 -0
  12. package/dist/chunk-4RERDEXR.js +348 -0
  13. package/dist/chunk-4W2PLC4J.js +27 -0
  14. package/dist/chunk-52H5B5TC.js +202 -0
  15. package/dist/chunk-54B42YRX.js +27 -0
  16. package/dist/chunk-5RXBNSW2.js +266 -0
  17. package/dist/chunk-5THXD6X5.js +201 -0
  18. package/dist/chunk-5W3R6LFT.js +24 -0
  19. package/dist/chunk-5ZEJHV35.js +341 -0
  20. package/dist/chunk-6P62QVEA.js +118 -0
  21. package/dist/chunk-6QIUX4EP.js +459 -0
  22. package/dist/chunk-6VCD4VKZ.js +78 -0
  23. package/dist/chunk-7F72PXY2.js +326 -0
  24. package/dist/chunk-7FBF7NPR.js +998 -0
  25. package/dist/chunk-7U2IDNXN.js +37 -0
  26. package/dist/chunk-ABBOA7UD.js +157 -0
  27. package/dist/chunk-AHDW3GPE.js +50 -0
  28. package/dist/chunk-AJ3QXTRQ.js +756 -0
  29. package/dist/chunk-AJVLWNFN.js +1610 -0
  30. package/dist/chunk-AJXODZY6.js +112 -0
  31. package/dist/chunk-ARFCXG7S.js +84 -0
  32. package/dist/chunk-AS44CFQ4.js +708 -0
  33. package/dist/chunk-AWE5TMPO.js +38 -0
  34. package/dist/chunk-B3I2UUT4.js +4692 -0
  35. package/dist/chunk-BRJKOBZP.js +331 -0
  36. package/dist/chunk-BW5KFIQC.js +59 -0
  37. package/dist/chunk-C2AUYXQH.js +149 -0
  38. package/dist/chunk-CGGAIP7J.js +29 -0
  39. package/dist/chunk-D6QS3U6M.js +30 -0
  40. package/dist/chunk-DFVMIKMQ.js +349 -0
  41. package/dist/chunk-DIULIWKU.js +169 -0
  42. package/dist/chunk-DQ2NZ7C4.js +2317 -0
  43. package/dist/chunk-E2WFBRHM.js +213 -0
  44. package/dist/chunk-E4MAEDPM.js +50 -0
  45. package/dist/chunk-EOKRQ3SA.js +30 -0
  46. package/dist/chunk-F3AU2TMM.js +2626 -0
  47. package/dist/chunk-F3P7VQ7H.js +170 -0
  48. package/dist/chunk-FC4RP4I2.js +12 -0
  49. package/dist/chunk-FJNKANOS.js +32 -0
  50. package/dist/chunk-GUOGVTCQ.js +146 -0
  51. package/dist/chunk-GVXA6CCE.js +18 -0
  52. package/dist/chunk-HHYAELLJ.js +2334 -0
  53. package/dist/chunk-HMFXILPV.js +83 -0
  54. package/dist/chunk-HVUZXSWK.js +421 -0
  55. package/dist/chunk-HWBZIGMJ.js +62 -0
  56. package/dist/chunk-I3R7GKDR.js +17 -0
  57. package/dist/chunk-I7SPGOWI.js +55 -0
  58. package/dist/chunk-IIXOAGHR.js +38 -0
  59. package/dist/chunk-IVP5KAB7.js +2250 -0
  60. package/dist/chunk-IXEBJSUE.js +22 -0
  61. package/dist/chunk-JOLITGCC.js +27 -0
  62. package/dist/chunk-K6VYLB2U.js +145 -0
  63. package/dist/chunk-LJDODBBZ.js +78 -0
  64. package/dist/chunk-LNAKEO63.js +78 -0
  65. package/dist/chunk-LSMJ6KBE.js +4139 -0
  66. package/dist/chunk-LW6XKDZQ.js +5565 -0
  67. package/dist/chunk-N3YQJI6O.js +899 -0
  68. package/dist/chunk-NABLC7W3.js +148 -0
  69. package/dist/chunk-NKOUFPQF.js +659 -0
  70. package/dist/chunk-NL5GLMFI.js +211 -0
  71. package/dist/chunk-NMABWBZN.js +327 -0
  72. package/dist/chunk-NTHH2J74.js +27 -0
  73. package/dist/chunk-NTUJEGDZ.js +59 -0
  74. package/dist/chunk-NXL4FFQQ.js +47 -0
  75. package/dist/chunk-NXPS2L6U.js +466 -0
  76. package/dist/chunk-O5WILGMI.js +42 -0
  77. package/dist/chunk-O6TQT6RI.js +48 -0
  78. package/dist/chunk-OAXNDZJ7.js +323 -0
  79. package/dist/chunk-ODEEOXPH.js +44 -0
  80. package/dist/chunk-OQGFCZJ4.js +4533 -0
  81. package/dist/chunk-ORTMY4Q4.js +282 -0
  82. package/dist/chunk-OS32RNR2.js +442 -0
  83. package/dist/chunk-PAK6IDME.js +189 -0
  84. package/dist/chunk-PWFHBTSF.js +406 -0
  85. package/dist/chunk-Q5U6FMDI.js +2352 -0
  86. package/dist/chunk-QOZXJ4NA.js +3364 -0
  87. package/dist/chunk-QYF5S6P6.js +45 -0
  88. package/dist/chunk-RIISMHKN.js +36 -0
  89. package/dist/chunk-RPD4ZSB7.js +25 -0
  90. package/dist/chunk-RPD5K5NC.js +79 -0
  91. package/dist/chunk-RUOG5D2C.js +262 -0
  92. package/dist/chunk-T4ERT73Y.js +599 -0
  93. package/dist/chunk-T6D4Q4AQ.js +54 -0
  94. package/dist/chunk-TGPXLY2J.js +391 -0
  95. package/dist/chunk-TLGFBM3F.js +12116 -0
  96. package/dist/chunk-TO6WL3GM.js +88 -0
  97. package/dist/chunk-TT22N74J.js +517 -0
  98. package/dist/chunk-TVN5N6GY.js +21216 -0
  99. package/dist/chunk-U3VGR4VU.js +308 -0
  100. package/dist/chunk-UK3CMEAL.js +1250 -0
  101. package/dist/chunk-UOPVJQ4N.js +103 -0
  102. package/dist/chunk-UXVNL3D7.js +23 -0
  103. package/dist/chunk-UY752QSN.js +45 -0
  104. package/dist/chunk-V5PXFSZK.js +188 -0
  105. package/dist/chunk-V7R425XG.js +398 -0
  106. package/dist/chunk-VCSRSYLF.js +81 -0
  107. package/dist/chunk-VD4JQCQC.js +162 -0
  108. package/dist/chunk-VDBPVIKD.js +62 -0
  109. package/dist/chunk-VHQLPIRJ.js +114 -0
  110. package/dist/chunk-VN2AXLEX.js +5414 -0
  111. package/dist/chunk-VNMT7C64.js +478 -0
  112. package/dist/chunk-WONERJTP.js +309 -0
  113. package/dist/chunk-XECLWQZN.js +85 -0
  114. package/dist/chunk-XIMYZ3JA.js +27 -0
  115. package/dist/chunk-XK4CIILI.js +144 -0
  116. package/dist/chunk-Y4T27COV.js +562 -0
  117. package/dist/chunk-YGVYKNSN.js +1860 -0
  118. package/dist/chunk-YLF3PPT5.js +308 -0
  119. package/dist/chunk-YSNFMJKN.js +14 -0
  120. package/dist/chunk-Z3CCVDUB.js +76 -0
  121. package/dist/chunk-Z54ZSOBZ.js +61 -0
  122. package/dist/chunk-ZAWW3AF6.js +97 -0
  123. package/dist/chunk-ZMOL6RQC.js +167 -0
  124. package/dist/index.js +16456 -8335
  125. package/dist/mcp/analyze-cli.js +186 -232
  126. package/dist/mcp/cli.js +137 -98
  127. package/dist/mcp/server.js +22589 -1573
  128. package/dist/mcp/worker.js +97 -38
  129. package/dist/probes/installer.js +135 -0
  130. package/dist/workers/project-snapshot-persist-worker.js +22 -0
  131. package/dist/workers/review-graph-persist-worker.js +15 -0
  132. package/docs/agent-guide.md +13 -4
  133. package/docs/agent-tools.md +42 -0
  134. package/docs/ast-grep_rules_catalog.md +3 -2
  135. package/docs/configuration.md +20 -1
  136. package/docs/environment-variables.md +52 -2
  137. package/docs/features.md +8 -4
  138. package/docs/globalconfig.md +1 -0
  139. package/docs/io-bridge-v2-migration.md +94 -0
  140. package/docs/lsp-capability-matrix.md +36 -4
  141. package/docs/lsp-idle-eviction.md +124 -0
  142. package/docs/mcp.md +21 -5
  143. package/docs/merge-queue-rollout.md +77 -0
  144. package/docs/pi-lens-fixer.md +156 -88
  145. package/docs/pi-lens-investigator.md +74 -26
  146. package/docs/pi-lens-merge-policy.md +694 -0
  147. package/docs/pi-lens-monitor.md +73 -7
  148. package/docs/pi-lens-retro.md +6 -4
  149. package/docs/pi-lens-reviewer.md +188 -48
  150. package/docs/pi-lens-subagent.md +246 -45
  151. package/docs/pi-lens-warden.md +18 -7
  152. package/docs/public-api-stability.md +55 -0
  153. package/docs/release-qa-baseline.md +84 -17
  154. package/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
  155. package/docs/servercapabilities.md +53 -49
  156. package/docs/settings.md +1 -0
  157. package/docs/usage.md +5 -1
  158. package/grammars/tree-sitter-bash.wasm +0 -0
  159. package/grammars/tree-sitter-bash.wasm.json +3 -3
  160. package/package.json +19 -7
  161. package/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
  162. package/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
  163. package/scripts/analyze-pi-lens-logs.mjs +1275 -62
  164. package/scripts/download-grammars.js +5 -0
  165. package/scripts/grammars.lock.json +6 -1
  166. package/scripts/install-selftest.mjs +33 -34
  167. package/scripts/lib/host-provided-deps.mjs +13 -4
  168. package/scripts/lib/web-tree-sitter-dir.mjs +18 -0
  169. package/dist/clients/actionable-warnings-logger.js +0 -35
  170. package/dist/clients/actionable-warnings.js +0 -1610
  171. package/dist/clients/advisory-provenance.js +0 -593
  172. package/dist/clients/agent-behavior-client.js +0 -147
  173. package/dist/clients/agent-nudge.js +0 -325
  174. package/dist/clients/analysed-root.js +0 -1
  175. package/dist/clients/ast-grep-client.js +0 -731
  176. package/dist/clients/ast-grep-rule-manager.js +0 -146
  177. package/dist/clients/ast-grep-tool-logger.js +0 -118
  178. package/dist/clients/ast-grep-types.js +0 -10
  179. package/dist/clients/ast-grep-yaml-synth.js +0 -154
  180. package/dist/clients/atomic-write-staging.js +0 -75
  181. package/dist/clients/atomic-write.js +0 -189
  182. package/dist/clients/availability-probe-flight.js +0 -12
  183. package/dist/clients/bash-file-access.js +0 -1056
  184. package/dist/clients/biome-client.js +0 -357
  185. package/dist/clients/blocker-freshness.js +0 -837
  186. package/dist/clients/blocker-past-eof.js +0 -129
  187. package/dist/clients/bootstrap.js +0 -569
  188. package/dist/clients/bounded-cache.js +0 -190
  189. package/dist/clients/bounded-pid-file-lock.js +0 -202
  190. package/dist/clients/bounded-telemetry.js +0 -295
  191. package/dist/clients/build-identity.js +0 -95
  192. package/dist/clients/bundled-resource-health.js +0 -113
  193. package/dist/clients/bus-events-logger.js +0 -105
  194. package/dist/clients/bus-publish.js +0 -171
  195. package/dist/clients/cache/rule-cache.js +0 -190
  196. package/dist/clients/cache-manager.js +0 -524
  197. package/dist/clients/cache-observability.js +0 -1313
  198. package/dist/clients/call-graph.js +0 -852
  199. package/dist/clients/cargo-manifest.js +0 -422
  200. package/dist/clients/cascade-budget.js +0 -196
  201. package/dist/clients/cascade-format.js +0 -315
  202. package/dist/clients/cascade-logger.js +0 -31
  203. package/dist/clients/cascade-types.js +0 -9
  204. package/dist/clients/child-unref.js +0 -124
  205. package/dist/clients/code-quality-warnings.js +0 -286
  206. package/dist/clients/codebase-model.js +0 -173
  207. package/dist/clients/collateral-test-role.js +0 -40
  208. package/dist/clients/complexity-client.js +0 -462
  209. package/dist/clients/config-core/deny.js +0 -221
  210. package/dist/clients/config-core/index.js +0 -50
  211. package/dist/clients/config-core/merge.js +0 -357
  212. package/dist/clients/config-core/normalize.js +0 -340
  213. package/dist/clients/config-core/process-spec.js +0 -248
  214. package/dist/clients/config-core/provenance.js +0 -164
  215. package/dist/clients/config-core/records.js +0 -218
  216. package/dist/clients/config-core/resolve.js +0 -125
  217. package/dist/clients/config-core/safe-object.js +0 -78
  218. package/dist/clients/config-core/schema.js +0 -165
  219. package/dist/clients/config-diagnostic-codes.js +0 -285
  220. package/dist/clients/config-locations.js +0 -388
  221. package/dist/clients/config-resolve.js +0 -798
  222. package/dist/clients/config-schema.js +0 -251
  223. package/dist/clients/config-warn.js +0 -407
  224. package/dist/clients/console-guard-install.js +0 -26
  225. package/dist/clients/cooperative-budget.js +0 -42
  226. package/dist/clients/dead-code-client.js +0 -510
  227. package/dist/clients/dead-code-logger.js +0 -30
  228. package/dist/clients/deadline-utils.js +0 -280
  229. package/dist/clients/debug-handles.js +0 -211
  230. package/dist/clients/debug-heap.js +0 -174
  231. package/dist/clients/deferred-lsp-work.js +0 -106
  232. package/dist/clients/degradation-ledger.js +0 -426
  233. package/dist/clients/demoted-finding-render.js +0 -169
  234. package/dist/clients/dependency-checker.js +0 -885
  235. package/dist/clients/deps/ast-grep-napi.js +0 -22
  236. package/dist/clients/deps/js-yaml.js +0 -9
  237. package/dist/clients/deps/minimatch.js +0 -4
  238. package/dist/clients/deps/pi-tui.js +0 -14
  239. package/dist/clients/deps/typebox.js +0 -14
  240. package/dist/clients/deps/vscode-jsonrpc.js +0 -1
  241. package/dist/clients/deps/web-tree-sitter.js +0 -24
  242. package/dist/clients/diagnostic-dispositions.js +0 -630
  243. package/dist/clients/diagnostic-line-freshness.js +0 -305
  244. package/dist/clients/diagnostic-logger.js +0 -73
  245. package/dist/clients/diagnostic-tracker.js +0 -105
  246. package/dist/clients/diagnostics-publish.js +0 -230
  247. package/dist/clients/dispatch/ast-grep-catalog.js +0 -65
  248. package/dist/clients/dispatch/auxiliary-lsp.js +0 -343
  249. package/dist/clients/dispatch/collect-later-tier.js +0 -35
  250. package/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
  251. package/dist/clients/dispatch/dispatcher.js +0 -1269
  252. package/dist/clients/dispatch/fact-provider-types.js +0 -1
  253. package/dist/clients/dispatch/fact-rule-runner.js +0 -17
  254. package/dist/clients/dispatch/fact-runner.js +0 -30
  255. package/dist/clients/dispatch/fact-scheduler.js +0 -68
  256. package/dist/clients/dispatch/fact-store.js +0 -377
  257. package/dist/clients/dispatch/facts/comment-facts.js +0 -22
  258. package/dist/clients/dispatch/facts/file-content.js +0 -19
  259. package/dist/clients/dispatch/facts/function-facts.js +0 -348
  260. package/dist/clients/dispatch/facts/import-facts.js +0 -204
  261. package/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
  262. package/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
  263. package/dist/clients/dispatch/finding-policy.js +0 -339
  264. package/dist/clients/dispatch/indent-detect.js +0 -417
  265. package/dist/clients/dispatch/inline-suppressions.js +0 -89
  266. package/dist/clients/dispatch/integration.js +0 -2377
  267. package/dist/clients/dispatch/lazy.js +0 -11
  268. package/dist/clients/dispatch/pending-runner-findings.js +0 -87
  269. package/dist/clients/dispatch/plan.js +0 -278
  270. package/dist/clients/dispatch/priorities.js +0 -20
  271. package/dist/clients/dispatch/rule-id-normalize.js +0 -50
  272. package/dist/clients/dispatch/rule-ignores.js +0 -69
  273. package/dist/clients/dispatch/rule-policy.js +0 -135
  274. package/dist/clients/dispatch/rules/async-noise.js +0 -40
  275. package/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
  276. package/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
  277. package/dist/clients/dispatch/rules/error-obscuring.js +0 -32
  278. package/dist/clients/dispatch/rules/error-swallowing.js +0 -31
  279. package/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
  280. package/dist/clients/dispatch/rules/high-complexity.js +0 -72
  281. package/dist/clients/dispatch/rules/high-fan-out.js +0 -74
  282. package/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
  283. package/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
  284. package/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
  285. package/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
  286. package/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
  287. package/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
  288. package/dist/clients/dispatch/runner-context.js +0 -52
  289. package/dist/clients/dispatch/runners/actionlint.js +0 -111
  290. package/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
  291. package/dist/clients/dispatch/runners/biome-check.js +0 -296
  292. package/dist/clients/dispatch/runners/cpp-check.js +0 -219
  293. package/dist/clients/dispatch/runners/credo.js +0 -82
  294. package/dist/clients/dispatch/runners/cue-vet.js +0 -416
  295. package/dist/clients/dispatch/runners/dart-analyze.js +0 -183
  296. package/dist/clients/dispatch/runners/detekt.js +0 -176
  297. package/dist/clients/dispatch/runners/dotnet-build.js +0 -164
  298. package/dist/clients/dispatch/runners/elixir-check.js +0 -195
  299. package/dist/clients/dispatch/runners/eslint.js +0 -137
  300. package/dist/clients/dispatch/runners/fact-rules.js +0 -29
  301. package/dist/clients/dispatch/runners/fish-indent.js +0 -69
  302. package/dist/clients/dispatch/runners/gleam-check.js +0 -167
  303. package/dist/clients/dispatch/runners/go-vet.js +0 -104
  304. package/dist/clients/dispatch/runners/golangci-lint.js +0 -135
  305. package/dist/clients/dispatch/runners/hadolint.js +0 -91
  306. package/dist/clients/dispatch/runners/helm-lint.js +0 -171
  307. package/dist/clients/dispatch/runners/helm-render.js +0 -940
  308. package/dist/clients/dispatch/runners/htmlhint.js +0 -117
  309. package/dist/clients/dispatch/runners/index.js +0 -108
  310. package/dist/clients/dispatch/runners/javac.js +0 -99
  311. package/dist/clients/dispatch/runners/ktlint.js +0 -110
  312. package/dist/clients/dispatch/runners/lsp.js +0 -379
  313. package/dist/clients/dispatch/runners/markdownlint.js +0 -167
  314. package/dist/clients/dispatch/runners/mypy.js +0 -102
  315. package/dist/clients/dispatch/runners/oxlint.js +0 -414
  316. package/dist/clients/dispatch/runners/php-lint.js +0 -85
  317. package/dist/clients/dispatch/runners/phpstan.js +0 -120
  318. package/dist/clients/dispatch/runners/prisma-validate.js +0 -62
  319. package/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
  320. package/dist/clients/dispatch/runners/pyright.js +0 -169
  321. package/dist/clients/dispatch/runners/rubocop.js +0 -99
  322. package/dist/clients/dispatch/runners/ruff.js +0 -88
  323. package/dist/clients/dispatch/runners/rust-clippy.js +0 -256
  324. package/dist/clients/dispatch/runners/shellcheck.js +0 -173
  325. package/dist/clients/dispatch/runners/shfmt.js +0 -102
  326. package/dist/clients/dispatch/runners/spellcheck.js +0 -128
  327. package/dist/clients/dispatch/runners/spotbugs.js +0 -259
  328. package/dist/clients/dispatch/runners/sqlfluff.js +0 -183
  329. package/dist/clients/dispatch/runners/stylelint.js +0 -166
  330. package/dist/clients/dispatch/runners/swiftlint.js +0 -163
  331. package/dist/clients/dispatch/runners/taplo.js +0 -174
  332. package/dist/clients/dispatch/runners/terragrunt.js +0 -168
  333. package/dist/clients/dispatch/runners/tflint.js +0 -125
  334. package/dist/clients/dispatch/runners/tree-sitter.js +0 -643
  335. package/dist/clients/dispatch/runners/trivy-config.js +0 -253
  336. package/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
  337. package/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
  338. package/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -95
  339. package/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
  340. package/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
  341. package/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
  342. package/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
  343. package/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
  344. package/dist/clients/dispatch/runners/utils.js +0 -15
  345. package/dist/clients/dispatch/runners/vale.js +0 -128
  346. package/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
  347. package/dist/clients/dispatch/runners/yamllint.js +0 -95
  348. package/dist/clients/dispatch/runners/zig-check.js +0 -79
  349. package/dist/clients/dispatch/suppress-writer.js +0 -79
  350. package/dist/clients/dispatch/tool-profile.js +0 -30
  351. package/dist/clients/dispatch/types.js +0 -21
  352. package/dist/clients/dispatch/utils/format-utils.js +0 -45
  353. package/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
  354. package/dist/clients/disposition-logger.js +0 -32
  355. package/dist/clients/disposition-publish.js +0 -124
  356. package/dist/clients/durable-store.js +0 -97
  357. package/dist/clients/effective-config.js +0 -415
  358. package/dist/clients/env-utils.js +0 -83
  359. package/dist/clients/error-class.js +0 -23
  360. package/dist/clients/eval-timestamp.js +0 -17
  361. package/dist/clients/event-loop-hold.js +0 -274
  362. package/dist/clients/event-loop-monitor.js +0 -250
  363. package/dist/clients/extension-log.js +0 -504
  364. package/dist/clients/extension-mode.js +0 -73
  365. package/dist/clients/feature-hints.js +0 -103
  366. package/dist/clients/file-kinds.js +0 -412
  367. package/dist/clients/file-role.js +0 -134
  368. package/dist/clients/file-time.js +0 -160
  369. package/dist/clients/file-utils.js +0 -1032
  370. package/dist/clients/finding-delivery-gate.js +0 -494
  371. package/dist/clients/finding-identity.js +0 -88
  372. package/dist/clients/fix-worklog.js +0 -103
  373. package/dist/clients/format-events-publish.js +0 -343
  374. package/dist/clients/format-service.js +0 -222
  375. package/dist/clients/formatters-lazy.js +0 -9
  376. package/dist/clients/formatters.js +0 -2032
  377. package/dist/clients/freshness-cadence.js +0 -17
  378. package/dist/clients/freshness.js +0 -38
  379. package/dist/clients/generated-artifacts.js +0 -394
  380. package/dist/clients/generation-guard.js +0 -215
  381. package/dist/clients/git-guard.js +0 -1136
  382. package/dist/clients/git-tracked-ignore.js +0 -243
  383. package/dist/clients/gitleaks-client.js +0 -509
  384. package/dist/clients/go-client.js +0 -104
  385. package/dist/clients/govulncheck-client.js +0 -605
  386. package/dist/clients/gradle-ktfmt-style.js +0 -348
  387. package/dist/clients/grammar-source.js +0 -465
  388. package/dist/clients/gzip-stage-write.js +0 -135
  389. package/dist/clients/hashline-anchor.js +0 -424
  390. package/dist/clients/hook-budgets.js +0 -76
  391. package/dist/clients/host-edit-normalize.js +0 -140
  392. package/dist/clients/host-ports.js +0 -39
  393. package/dist/clients/indent-retarget.js +0 -154
  394. package/dist/clients/inline-blocker-dispositions.js +0 -186
  395. package/dist/clients/install-diagnostics.js +0 -156
  396. package/dist/clients/installer/index.js +0 -5416
  397. package/dist/clients/installer/managed-tool-refresh-session.js +0 -58
  398. package/dist/clients/installer/managed-tool-refresh.js +0 -783
  399. package/dist/clients/instance-reaper-state.js +0 -7
  400. package/dist/clients/instance-reaper.js +0 -1137
  401. package/dist/clients/instance-registry-lock.js +0 -145
  402. package/dist/clients/instance-registry.js +0 -773
  403. package/dist/clients/jscpd-client.js +0 -378
  404. package/dist/clients/json-cache-read.js +0 -65
  405. package/dist/clients/knip-client.js +0 -788
  406. package/dist/clients/language-policy.js +0 -252
  407. package/dist/clients/language-profile.js +0 -361
  408. package/dist/clients/language-registry.js +0 -603
  409. package/dist/clients/latency-logger.js +0 -727
  410. package/dist/clients/lazy-import.js +0 -21
  411. package/dist/clients/ledger-bounds.js +0 -54
  412. package/dist/clients/lens-config.js +0 -404
  413. package/dist/clients/lens-engine.js +0 -358
  414. package/dist/clients/lens-events.js +0 -125
  415. package/dist/clients/lens-flag-registry.js +0 -467
  416. package/dist/clients/lens-map.js +0 -1156
  417. package/dist/clients/live-bus-emitter.js +0 -74
  418. package/dist/clients/log-cleanup.js +0 -222
  419. package/dist/clients/lsp/aggregation.js +0 -178
  420. package/dist/clients/lsp/cascade-tier.js +0 -421
  421. package/dist/clients/lsp/client.js +0 -4593
  422. package/dist/clients/lsp/config.js +0 -691
  423. package/dist/clients/lsp/content-limits.js +0 -41
  424. package/dist/clients/lsp/diagnostic-binding.js +0 -225
  425. package/dist/clients/lsp/document-drift.js +0 -467
  426. package/dist/clients/lsp/edits.js +0 -1219
  427. package/dist/clients/lsp/index.js +0 -8305
  428. package/dist/clients/lsp/inferred-project.js +0 -216
  429. package/dist/clients/lsp/jvm-runtime.js +0 -298
  430. package/dist/clients/lsp/language.js +0 -63
  431. package/dist/clients/lsp/launch.js +0 -746
  432. package/dist/clients/lsp/lombok.js +0 -158
  433. package/dist/clients/lsp/path-utils.js +0 -5
  434. package/dist/clients/lsp/pending-aux-coverage.js +0 -251
  435. package/dist/clients/lsp/position-encoding.js +0 -61
  436. package/dist/clients/lsp/ruby-drive-dirs.js +0 -83
  437. package/dist/clients/lsp/server.js +0 -3290
  438. package/dist/clients/lsp/session-roots.js +0 -192
  439. package/dist/clients/lsp/spawn-history.js +0 -17
  440. package/dist/clients/lsp/sync-kind.js +0 -56
  441. package/dist/clients/lsp/tsserver-sync.js +0 -332
  442. package/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
  443. package/dist/clients/lsp/wait-policy/classification.js +0 -85
  444. package/dist/clients/lsp/wait-policy/index.js +0 -10
  445. package/dist/clients/lsp/wait-policy/strategies.js +0 -392
  446. package/dist/clients/lsp/watch-queue.js +0 -61
  447. package/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
  448. package/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
  449. package/dist/clients/lsp/workspace-sweep-hold.js +0 -184
  450. package/dist/clients/lsp-budget.js +0 -186
  451. package/dist/clients/lsp-document-symbols.js +0 -110
  452. package/dist/clients/lsp-lazy.js +0 -9
  453. package/dist/clients/lsp-mutation.js +0 -396
  454. package/dist/clients/lsp-status.js +0 -59
  455. package/dist/clients/map-with-concurrency.js +0 -40
  456. package/dist/clients/mcp/analyze.js +0 -420
  457. package/dist/clients/mcp/host-shim.js +0 -31
  458. package/dist/clients/mcp/ipc.js +0 -523
  459. package/dist/clients/mcp/review.js +0 -197
  460. package/dist/clients/mcp/session.js +0 -412
  461. package/dist/clients/memory-sampler.js +0 -208
  462. package/dist/clients/message-end-attribution.js +0 -30
  463. package/dist/clients/metrics-client.js +0 -107
  464. package/dist/clients/metrics-history.js +0 -327
  465. package/dist/clients/middle-man-analysis.js +0 -263
  466. package/dist/clients/model-provider.js +0 -53
  467. package/dist/clients/module-report-lsp.js +0 -189
  468. package/dist/clients/module-report.js +0 -2150
  469. package/dist/clients/mutating-tool.js +0 -651
  470. package/dist/clients/mutation-attribution.js +0 -368
  471. package/dist/clients/mutation-bridge.js +0 -240
  472. package/dist/clients/ndjson-logger.js +0 -734
  473. package/dist/clients/observed-mutation-sources.js +0 -101
  474. package/dist/clients/observed-mutation.js +0 -1253
  475. package/dist/clients/oldtext-autopatch.js +0 -128
  476. package/dist/clients/opaque-mutation-scan.js +0 -496
  477. package/dist/clients/opengrep-client.js +0 -333
  478. package/dist/clients/opengrep-config.js +0 -76
  479. package/dist/clients/package-manager.js +0 -607
  480. package/dist/clients/package-root.js +0 -38
  481. package/dist/clients/partial-edit-apply.js +0 -439
  482. package/dist/clients/path-attribution-telemetry.js +0 -43
  483. package/dist/clients/path-keyed-map.js +0 -108
  484. package/dist/clients/path-utils.js +0 -1244
  485. package/dist/clients/performance-report.js +0 -331
  486. package/dist/clients/persist-debounce.js +0 -70
  487. package/dist/clients/persistent-reverify.js +0 -271
  488. package/dist/clients/php-cs-fixer-config.js +0 -119
  489. package/dist/clients/pipeline.js +0 -1480
  490. package/dist/clients/post-autofix-notice.js +0 -37
  491. package/dist/clients/print-mode.js +0 -21
  492. package/dist/clients/probe-home-state.js +0 -228
  493. package/dist/clients/process-bridge.js +0 -66
  494. package/dist/clients/process-singletons.js +0 -210
  495. package/dist/clients/process-snapshot.js +0 -68
  496. package/dist/clients/project-changes.js +0 -181
  497. package/dist/clients/project-conventions.js +0 -171
  498. package/dist/clients/project-diagnostics/cache.js +0 -137
  499. package/dist/clients/project-diagnostics/extractors.js +0 -109
  500. package/dist/clients/project-diagnostics/fresh-fetch.js +0 -668
  501. package/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
  502. package/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
  503. package/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
  504. package/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
  505. package/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
  506. package/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
  507. package/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
  508. package/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
  509. package/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
  510. package/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
  511. package/dist/clients/project-diagnostics/scanner.js +0 -520
  512. package/dist/clients/project-diagnostics/types.js +0 -1
  513. package/dist/clients/project-lens-config.js +0 -807
  514. package/dist/clients/project-report.js +0 -701
  515. package/dist/clients/project-scale.js +0 -237
  516. package/dist/clients/project-scan-policy.js +0 -11
  517. package/dist/clients/project-snapshot-fingerprint.js +0 -48
  518. package/dist/clients/project-snapshot-persist-worker.js +0 -20
  519. package/dist/clients/project-snapshot.js +0 -1653
  520. package/dist/clients/project-trust.js +0 -181
  521. package/dist/clients/python-environment.js +0 -217
  522. package/dist/clients/python-provenance.js +0 -639
  523. package/dist/clients/quiet-window-config.js +0 -47
  524. package/dist/clients/quiet-window.js +0 -236
  525. package/dist/clients/read-bridge.js +0 -139
  526. package/dist/clients/read-expansion.js +0 -266
  527. package/dist/clients/read-guard-logger.js +0 -251
  528. package/dist/clients/read-guard-tool-lines.js +0 -1306
  529. package/dist/clients/read-guard.js +0 -1561
  530. package/dist/clients/recent-touches.js +0 -240
  531. package/dist/clients/redact/secrets.js +0 -449
  532. package/dist/clients/resource-sampler.js +0 -628
  533. package/dist/clients/reverse-deps.js +0 -270
  534. package/dist/clients/review-graph/builder.js +0 -5126
  535. package/dist/clients/review-graph/format.js +0 -33
  536. package/dist/clients/review-graph/git-identity.js +0 -163
  537. package/dist/clients/review-graph/import-resolvers.js +0 -481
  538. package/dist/clients/review-graph/persist-worker.js +0 -10
  539. package/dist/clients/review-graph/query.js +0 -244
  540. package/dist/clients/review-graph/revision-drift.js +0 -21
  541. package/dist/clients/review-graph/service.js +0 -96
  542. package/dist/clients/review-graph/shared-extraction-ir.js +0 -82
  543. package/dist/clients/review-graph/symbol-id.js +0 -103
  544. package/dist/clients/review-graph/tsconfig-paths.js +0 -299
  545. package/dist/clients/review-graph/types.js +0 -1
  546. package/dist/clients/review-graph/workspace-modules.js +0 -449
  547. package/dist/clients/review-graph-logger.js +0 -81
  548. package/dist/clients/ruff-client.js +0 -179
  549. package/dist/clients/rules-scanner.js +0 -131
  550. package/dist/clients/run-duration.js +0 -55
  551. package/dist/clients/runtime-agent-end.js +0 -746
  552. package/dist/clients/runtime-config.js +0 -77
  553. package/dist/clients/runtime-context.js +0 -211
  554. package/dist/clients/runtime-coordinator.js +0 -1324
  555. package/dist/clients/runtime-session.js +0 -2485
  556. package/dist/clients/runtime-tool-call.js +0 -1295
  557. package/dist/clients/runtime-tool-result.js +0 -2049
  558. package/dist/clients/runtime-turn.js +0 -3767
  559. package/dist/clients/rust-client.js +0 -97
  560. package/dist/clients/safe-spawn.js +0 -2357
  561. package/dist/clients/sanitize.js +0 -286
  562. package/dist/clients/scan-utils.js +0 -25
  563. package/dist/clients/scratch-tree-policy.js +0 -165
  564. package/dist/clients/search-read-registration.js +0 -94
  565. package/dist/clients/secret-findings.js +0 -114
  566. package/dist/clients/security-scan-client.js +0 -352
  567. package/dist/clients/session-event-guard.js +0 -297
  568. package/dist/clients/session-lifecycle.js +0 -484
  569. package/dist/clients/session-start-observability.js +0 -94
  570. package/dist/clients/session-state-store.js +0 -101
  571. package/dist/clients/session-summary.js +0 -15
  572. package/dist/clients/sessionstart-logger.js +0 -27
  573. package/dist/clients/sg-runner.js +0 -876
  574. package/dist/clients/sgconfig.js +0 -347
  575. package/dist/clients/shared-checkout-guard.js +0 -338
  576. package/dist/clients/single-flight.js +0 -158
  577. package/dist/clients/situational-tool-telemetry.js +0 -108
  578. package/dist/clients/skills-resolver.js +0 -141
  579. package/dist/clients/slow-fs.js +0 -138
  580. package/dist/clients/smells-rollup.js +0 -231
  581. package/dist/clients/source-filter.js +0 -596
  582. package/dist/clients/source-walker.js +0 -211
  583. package/dist/clients/spawn-output-cap.js +0 -120
  584. package/dist/clients/spawn-timeout-cooldown.js +0 -110
  585. package/dist/clients/stale-marker.js +0 -17
  586. package/dist/clients/startup-scan.js +0 -400
  587. package/dist/clients/startup-timing.js +0 -130
  588. package/dist/clients/string-utils.js +0 -33
  589. package/dist/clients/subagent-mode.js +0 -111
  590. package/dist/clients/symbol-containment.js +0 -24
  591. package/dist/clients/symbol-types.js +0 -5
  592. package/dist/clients/test-runner-client.js +0 -2507
  593. package/dist/clients/test-runner-delivery.js +0 -287
  594. package/dist/clients/todo-scanner.js +0 -229
  595. package/dist/clients/tool-agreement.js +0 -423
  596. package/dist/clients/tool-config.js +0 -249
  597. package/dist/clients/tool-cwd.js +0 -270
  598. package/dist/clients/tool-definition.js +0 -47
  599. package/dist/clients/tool-event.js +0 -105
  600. package/dist/clients/tool-policy.js +0 -2755
  601. package/dist/clients/tool-probe.js +0 -53
  602. package/dist/clients/tool-render.js +0 -156
  603. package/dist/clients/tool-set-policy.js +0 -118
  604. package/dist/clients/tree-sitter-cache.js +0 -364
  605. package/dist/clients/tree-sitter-client.js +0 -4195
  606. package/dist/clients/tree-sitter-logger.js +0 -100
  607. package/dist/clients/tree-sitter-navigator.js +0 -269
  608. package/dist/clients/tree-sitter-query-loader.js +0 -569
  609. package/dist/clients/tree-sitter-shared.js +0 -158
  610. package/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
  611. package/dist/clients/trivy-client.js +0 -467
  612. package/dist/clients/tui-fit.js +0 -50
  613. package/dist/clients/turn-context.js +0 -52
  614. package/dist/clients/turn-end/lane.js +0 -51
  615. package/dist/clients/turn-end/lanes/govulncheck.js +0 -112
  616. package/dist/clients/turn-end/lanes/secrets.js +0 -204
  617. package/dist/clients/turn-summary-render.js +0 -72
  618. package/dist/clients/turn-summary.js +0 -132
  619. package/dist/clients/typos-config.js +0 -29
  620. package/dist/clients/user-notify.js +0 -51
  621. package/dist/clients/vanished-instance-marker.js +0 -57
  622. package/dist/clients/warm-attach.js +0 -305
  623. package/dist/clients/widget-state.js +0 -1808
  624. package/dist/clients/word-index-logger.js +0 -49
  625. package/dist/clients/word-index-store.js +0 -459
  626. package/dist/clients/word-index.js +0 -2080
  627. package/dist/clients/workspace-topology.js +0 -443
  628. package/dist/clients/write-ordering-guard.js +0 -65
  629. package/dist/clients/zizmor-config.js +0 -340
  630. package/dist/i18n.js +0 -69
  631. package/dist/mcp/build-staleness.js +0 -124
  632. package/dist/scripts/lib/process-scan.mjs +0 -583
  633. package/dist/scripts/lib/skills-predicate.mjs +0 -129
  634. package/dist/scripts/lib/web-tree-sitter-dir.mjs +0 -123
  635. package/dist/tools/activate-tools.js +0 -87
  636. package/dist/tools/ast-grep-outline.js +0 -137
  637. package/dist/tools/ast-grep-replace.js +0 -244
  638. package/dist/tools/ast-grep-search.js +0 -762
  639. package/dist/tools/effective-config.js +0 -90
  640. package/dist/tools/lens-diagnostic-mark.js +0 -375
  641. package/dist/tools/lens-diagnostics.js +0 -2571
  642. package/dist/tools/lsp-diagnostics.js +0 -1745
  643. package/dist/tools/lsp-navigation.js +0 -1367
  644. package/dist/tools/lsp-structured-output.js +0 -294
  645. package/dist/tools/module-report.js +0 -382
  646. package/dist/tools/project-report.js +0 -86
  647. package/dist/tools/render-compact.js +0 -374
  648. package/dist/tools/scan-progress.js +0 -53
  649. package/dist/tools/shared.js +0 -29
  650. package/dist/tools/symbol-search.js +0 -155
@@ -1,86 +0,0 @@
1
- /**
2
- * project_report pi tool (#773) — the top of the discovery funnel:
3
- * project_report orients the agent in the project, module_report explains one
4
- * file, read_symbol reads the exact body. Thin wrapper over the existing
5
- * projectReport() engine seam (clients/lens-engine.ts), mirroring the MCP
6
- * pilens_project_report tool. Follows symbol_search's cold-cache contract
7
- * (#348 decision 3): a cold graph kicks off a background build and returns
8
- * `available: false` with a retry hint, never blocking the call.
9
- */
10
- import { Type } from "../clients/deps/typebox.js";
11
- import { projectReport, renderCompactProjectReport, } from "../clients/lens-engine.js";
12
- import { compactRenderResult, renderToolText, } from "./render-compact.js";
13
- function errorMessage(err) {
14
- return err instanceof Error ? err.message : String(err);
15
- }
16
- export function createProjectReportTool(getProjectRoot) {
17
- return {
18
- name: "project_report",
19
- label: "Project Report",
20
- description: "Orient in a project from its review graph, with ranked hubs and entry points. On a cold cache, project_report and symbol_search return available: false with a retry hint and start a non-blocking background build; module_report degrades to outline-only with cache freshness explicit. Example: use project_report before module_report when the target file is unknown.",
21
- promptSnippet: "Orient in a project before choosing a file",
22
- renderResult: compactRenderResult(({ details, isError }) => {
23
- if (isError || details?.available === false) {
24
- return `project_report — unavailable${details?.hint ? `: ${details.hint}` : ""}`;
25
- }
26
- const parts = [
27
- `${details?.hubs ?? 0} hub(s)`,
28
- `${details?.entryPoints ?? 0} entry point(s)`,
29
- ];
30
- const view = details?.view && details.view !== "default"
31
- ? ` [${details.view}]`
32
- : "";
33
- return `project_report ${parts.join(" · ")}${view}`;
34
- }),
35
- parameters: Type.Object({
36
- limit: Type.Optional(Type.Number({
37
- description: "Scales every ranked section's cap (default 10) — a single knob for all sections.",
38
- })),
39
- focus: Type.Optional(Type.String({
40
- description: "Optional task hint used only to re-rank sections toward relevant subsystems (does not expand scope or trigger scans).",
41
- })),
42
- view: Type.Optional(Type.String({
43
- enum: ["default", "compact"],
44
- description: "Payload tier. compact (cheapest) returns a line-oriented TEXT rendering instead of JSON. Default returns JSON.",
45
- })),
46
- }),
47
- async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
48
- const cwd = getProjectRoot() || ctx.cwd || ".";
49
- let report;
50
- try {
51
- report = await projectReport(cwd, {
52
- limit: params.limit,
53
- focus: params.focus,
54
- view: params.view === "compact" ? "compact" : undefined,
55
- });
56
- }
57
- catch (err) {
58
- return {
59
- ...renderToolText(`Project report failed: ${errorMessage(err)}`),
60
- isError: true,
61
- details: { available: false },
62
- };
63
- }
64
- if (!report.available) {
65
- return {
66
- ...renderToolText(report.hint ?? "No review graph cached for this workspace yet.", report),
67
- isError: true,
68
- details: { available: false, hint: report.hint },
69
- };
70
- }
71
- const text = params.view === "compact"
72
- ? renderCompactProjectReport(report)
73
- : JSON.stringify(report);
74
- return {
75
- content: [{ type: "text", text }],
76
- isError: false,
77
- details: {
78
- available: true,
79
- hubs: report.hubs?.length ?? 0,
80
- entryPoints: report.entryPoints?.length ?? 0,
81
- view: report.view ?? "default",
82
- },
83
- };
84
- },
85
- };
86
- }
@@ -1,374 +0,0 @@
1
- // Compact tool-result rendering (refs #345).
2
- //
3
- // The navigable/structural tools (module_report, read_symbol, read_enclosing,
4
- // ast_grep_search, ast_grep_outline) return large bodies that are
5
- // useful to the MODEL but flood the user's terminal. The pi host renders a tool's
6
- // `content` verbatim only when the tool defines no `renderResult` (the
7
- // createResultFallback path in tool-execution.ts). By supplying a `renderResult`
8
- // we decouple the two surfaces entirely:
9
- // - `content` (returned from execute) is unchanged -> the model still gets the
10
- // full payload.
11
- // - `renderResult` is TUI-only -> the user sees a one-line summary by default,
12
- // and the full output when the row is expanded (options.expanded), exactly
13
- // like the built-in read/grep/bash tools.
14
- //
15
- // Design borrowed from the community renderer extensions pi-tool-display and
16
- // pi-claude-style-tools (summary-by-default + expand-on-demand), but scoped to
17
- // pi-lens's own tools and driven off structured `details` rather than blind
18
- // truncation. Those extensions default to respecting a tool's own renderResult
19
- // (overrideExistingRenderers === false), so these renderers win and still coexist
20
- // with a globally-installed renderer extension.
21
- import { Text } from "../clients/deps/pi-tui.js";
22
- import * as fs from "node:fs";
23
- import * as path from "node:path";
24
- import { randomUUID } from "node:crypto";
25
- import { recordDegradationOnce } from "../clients/degradation-ledger.js";
26
- import { getGlobalPiLensLogDir } from "../clients/probe-home-state.js";
27
- /** The per-result delivery bound (#2848). Exported so surface gates and their
28
- * pins assert the real budget instead of restating the literal. */
29
- export const MAX_RESULT_BYTES = 40 * 1024;
30
- // 2026-09-10: cap the complete MCP payload before it can retain or log an
31
- // unbounded result; ordinary results keep the complete-log contract below it.
32
- export const COMPLETE_MCP_RESULT_INPUT_BUDGET_BYTES = 8 * 1024 * 1024;
33
- // #2800 item 7: the footer is stamped AFTER the payload bound, so the
34
- // footer's own maximum size is reserved inside MAX_RESULT_BYTES. The reserve
35
- // is computed from the footer's widest literal: the `result error` verdict, a
36
- // bounded diag severity section, and maximum-width numeric fields with the
37
- // wider `truncated=false` value.
38
- const FOOTER_MAX_DIGITS = String(Number.MAX_SAFE_INTEGER).length;
39
- /** One `diag severity=` line is width-bounded so the footer's maximum size
40
- * stays finite and the reserve above stays sound. */
41
- const FOOTER_DIAG_LINE_MAX_CHARS = 200;
42
- const FOOTER_DIAG_SECTION_MAX_BYTES = 1024;
43
- export const RESULT_FOOTER_RESERVE_BYTES = Buffer.byteLength(`\n\nresult error\n${"x".repeat(FOOTER_DIAG_SECTION_MAX_BYTES)}\nusage tokens=${"9".repeat(FOOTER_MAX_DIGITS)} elapsed-ms=${"9".repeat(FOOTER_MAX_DIGITS)} bytes=${"9".repeat(FOOTER_MAX_DIGITS)} truncated=false`, "utf8");
44
- // The literal reserve intentionally leaves about 1 KiB below MAX_RESULT_BYTES
45
- // for footer growth. Keep this conservative slack: deriving the bound by
46
- // iterating over a changing footer caused both overflows and repeated log writes
47
- // (round 2 F2/F7, refs #2862 and #2864).
48
- /** The payload byte budget the footer is stamped into: the delivered result
49
- * budget minus the reserved footer maximum (#2800 item 7). */
50
- export const RESULT_PAYLOAD_BUDGET_BYTES = MAX_RESULT_BYTES - RESULT_FOOTER_RESERVE_BYTES;
51
- function renderHeadTail(text, maxBytes, markerFor) {
52
- const render = (kept) => {
53
- const head = Math.floor(kept / 2);
54
- const tail = kept - head;
55
- return `${text.slice(0, head)}${markerFor(head, tail)}${text.slice(text.length - tail)}`;
56
- };
57
- let low = 0;
58
- let high = text.length;
59
- while (low < high) {
60
- const kept = Math.ceil((low + high) / 2);
61
- if (Buffer.byteLength(render(kept), "utf8") <= maxBytes)
62
- low = kept;
63
- else
64
- high = kept - 1;
65
- }
66
- return { text: render(low), keptCharacters: low };
67
- }
68
- /** Bound model-facing result text while retaining both the useful head and tail.
69
- * `maxBytes` defaults to the full result budget; the footer gate passes the
70
- * payload budget that leaves room for the stamped footer (#2800 item 7). */
71
- export function boundToolText(text, maxBytes = MAX_RESULT_BYTES) {
72
- const totalBytes = Buffer.byteLength(text, "utf8");
73
- if (totalBytes <= maxBytes) {
74
- return { text, truncated: false, omittedCharacters: 0 };
75
- }
76
- const fullOutputPath = path.join(getGlobalPiLensLogDir(), `tool-result-${Date.now()}-${randomUUID()}.log`);
77
- fs.mkdirSync(path.dirname(fullOutputPath), { recursive: true });
78
- if (totalBytes > COMPLETE_MCP_RESULT_INPUT_BUDGET_BYTES) {
79
- const omittedBytes = totalBytes - COMPLETE_MCP_RESULT_INPUT_BUDGET_BYTES;
80
- recordDegradationOnce({
81
- kind: "mcp-complete-result-budget-exceeded",
82
- subject: "complete-result",
83
- reason: `${totalBytes} input bytes exceeded ${COMPLETE_MCP_RESULT_INPUT_BUDGET_BYTES}-byte budget`,
84
- metadata: {
85
- totalBytes,
86
- budgetBytes: COMPLETE_MCP_RESULT_INPUT_BUDGET_BYTES,
87
- },
88
- });
89
- const logText = renderHeadTail(text, COMPLETE_MCP_RESULT_INPUT_BUDGET_BYTES, (head, tail) => {
90
- const keptBytes = Buffer.byteLength(`${text.slice(0, head)}${text.slice(text.length - tail)}`, "utf8");
91
- return `\n\n[incomplete: ${totalBytes - keptBytes} bytes omitted, budget ${COMPLETE_MCP_RESULT_INPUT_BUDGET_BYTES}]\n\n[Full output: ${fullOutputPath}]\n\n`;
92
- });
93
- fs.writeFileSync(fullOutputPath, logText.text, "utf8");
94
- const output = renderHeadTail(logText.text, maxBytes, () => `\n\n[incomplete: ${omittedBytes} bytes omitted, budget ${COMPLETE_MCP_RESULT_INPUT_BUDGET_BYTES}]\n\n[Full output: ${fullOutputPath}]\n\n`);
95
- return {
96
- text: output.text,
97
- truncated: true,
98
- omittedCharacters: text.length - logText.keptCharacters,
99
- fullOutputPath,
100
- };
101
- }
102
- fs.writeFileSync(fullOutputPath, text, "utf8");
103
- const output = renderHeadTail(text, maxBytes, (head, tail) => `\n\n[${text.length - head - tail} characters omitted. Full output: ${fullOutputPath}]\n\n`);
104
- return {
105
- text: output.text,
106
- truncated: true,
107
- omittedCharacters: text.length - output.keptCharacters,
108
- fullOutputPath,
109
- };
110
- }
111
- /** Matches an already-stamped contract footer at the end of the joined text.
112
- * A result re-entering the gate must not gain a second footer (refs #2852 N4).
113
- * The byte and truncated groups let the gate read the kept footer's own
114
- * delivery figures on re-entry (round 2 F1). */
115
- const CONTRACT_FOOTER_TAIL_RE = /(?:^|\n)result (?:ok|error)\n(?:diag severity=[^\n]*\n)*usage tokens=\d+ elapsed-ms=\d+ bytes=(\d+) truncated=(true|false)$/;
116
- /**
117
- * Add the stable, model-facing result footer shared by pi and MCP.
118
- *
119
- * The host adapters own transport and terminal styling; this function owns the
120
- * textual contract. Defaults are deliberately deterministic because elapsed
121
- * time is not a property of a projection and must not make parity tests flaky.
122
- * Idempotent: a result whose text already ends with the footer is only
123
- * `isError`-normalized, never stamped twice.
124
- *
125
- * When `delivery` is given (the gate path), `bytes=`/`truncated=` describe the
126
- * already-bound payload; otherwise they describe this function's input text,
127
- * which is the delivered payload because no bound has run.
128
- */
129
- export function renderToolResultContract(result, delivery) {
130
- const normalized = {
131
- ...result,
132
- isError: result.isError === true,
133
- };
134
- const content = result.content ?? [];
135
- const textBlocks = content
136
- .filter((block) => block.type === "text" && typeof block.text === "string")
137
- .map((block) => block.text);
138
- if (textBlocks.length === 0)
139
- return normalized;
140
- const text = textBlocks.join("\n");
141
- if (CONTRACT_FOOTER_TAIL_RE.test(text))
142
- return normalized;
143
- const details = normalized.details;
144
- // The diag section is width- and byte-bounded (#2800 item 7) so the
145
- // footer's maximum size — and therefore the reserved budget above — stays
146
- // finite regardless of how many diagnostics a result carries.
147
- const diagLines = [];
148
- let diagSectionBytes = 0;
149
- if (Array.isArray(details?.diagnostics)) {
150
- for (const value of details.diagnostics) {
151
- if (!value || typeof value !== "object")
152
- continue;
153
- const severity = value.severity;
154
- if (typeof severity !== "string")
155
- continue;
156
- const line = `diag severity=${severity.slice(0, FOOTER_DIAG_LINE_MAX_CHARS)}`;
157
- const lineBytes = Buffer.byteLength(line, "utf8") + 1;
158
- if (diagSectionBytes + lineBytes > FOOTER_DIAG_SECTION_MAX_BYTES)
159
- break;
160
- diagLines.push(line);
161
- diagSectionBytes += lineBytes;
162
- }
163
- }
164
- const tokens = normalized.usage?.tokens ?? Math.ceil(Buffer.byteLength(text, "utf8") / 4);
165
- const elapsedMs = normalized.usage?.elapsedMs ?? 0;
166
- const deliveredBytes = delivery?.bytes ?? Buffer.byteLength(text, "utf8");
167
- const truncated = delivery?.truncated === true;
168
- const contractLines = [
169
- `result ${normalized.isError ? "error" : "ok"}`,
170
- ...diagLines,
171
- `usage tokens=${tokens} elapsed-ms=${elapsedMs} bytes=${deliveredBytes} truncated=${truncated ? "true" : "false"}`,
172
- ];
173
- let lastTextIndex = -1;
174
- for (let index = content.length - 1; index >= 0; index--) {
175
- const block = content[index];
176
- if (block?.type === "text" && typeof block.text === "string") {
177
- lastTextIndex = index;
178
- break;
179
- }
180
- }
181
- if (lastTextIndex < 0)
182
- return normalized;
183
- return {
184
- ...normalized,
185
- content: content.map((block, index) => index === lastTextIndex && block.type === "text"
186
- ? { ...block, text: `${block.text}\n\n${contractLines.join("\n")}` }
187
- : block),
188
- };
189
- }
190
- /** Bound the payload text blocks so the footer stamped afterwards still fits
191
- * inside MAX_RESULT_BYTES (refs #2800 item 7): each block is bounded to the
192
- * result budget minus the reserved footer maximum, and the delivered byte
193
- * count plus the bound's truncated flag travel with the result so the footer
194
- * can report them. Per-block bounding is inherited from #2852; production
195
- * results carry a single text block (renderToolText). */
196
- export function boundResultPayload(result) {
197
- if (!result.content) {
198
- return { result, deliveredBytes: 0, truncated: false };
199
- }
200
- const joined = fullTextOf(result);
201
- // Reserve the widest footer once. This keeps the MAX_RESULT_BYTES invariant
202
- // independent of payload contents and gives boundToolText one log write.
203
- const bound = boundToolText(joined, RESULT_PAYLOAD_BUDGET_BYTES);
204
- const firstText = result.content.findIndex((block) => block.type === "text" && typeof block.text === "string");
205
- let retainedText = false;
206
- const content = result.content
207
- .filter((block, index) => block.type !== "text" ||
208
- typeof block.text !== "string" ||
209
- index === firstText)
210
- .map((block) => {
211
- if (block.type === "text" &&
212
- typeof block.text === "string" &&
213
- !retainedText) {
214
- retainedText = true;
215
- return { ...block, text: bound.text };
216
- }
217
- return block;
218
- });
219
- const deliveredBytes = Buffer.byteLength(fullTextOf({ content }), "utf8");
220
- return {
221
- result: { ...result, content },
222
- deliveredBytes,
223
- truncated: bound.truncated,
224
- };
225
- }
226
- /** Build the raw result envelope shared by both host adapters: the summary is
227
- * joined with the structured payload's fenced JSON, and the payload also rides
228
- * along as `details` for surface-side consumers (pi's compact-line summarizer,
229
- * the MCP gate's `diag severity=` footer lines). The contract footer and the
230
- * #2848 byte bound are NOT applied here — each surface stamps them once, after
231
- * the tool's own result exists (`finalizeToolResult` / the MCP dispatcher). */
232
- export function renderToolText(summary, structured, compact = false) {
233
- const rawText = structured === undefined
234
- ? summary
235
- : `${summary}\n\n\`\`\`json\n${JSON.stringify(structured, compact ? undefined : null, compact ? undefined : 2)}\n\`\`\``;
236
- return {
237
- content: [{ type: "text", text: rawText }],
238
- details: structured,
239
- };
240
- }
241
- /** Drop the structured `details` field from a finished result. The MCP gate
242
- * consumes `details` for the footer's `diag severity=` lines and then strips
243
- * it before delivery, so the wire carries only the bounded text blocks
244
- * (refs #2852 N1); pi keeps `details` for its compact-line summarizer. */
245
- export function stripResultDetails(result) {
246
- const { details: _details, ...rest } = result;
247
- return rest;
248
- }
249
- /** Finish a host-adapter result after its status and all warnings exist
250
- * (#2800 item 7): the payload bound runs FIRST with the footer's own maximum
251
- * size reserved inside MAX_RESULT_BYTES, then the footer is stamped LAST with
252
- * the delivered payload's byte count and the bound's truncated flag. So
253
- * `bytes=`/`truncated=` describe what the model actually receives, and the
254
- * delivered text — footer included — never exceeds MAX_RESULT_BYTES.
255
- *
256
- * Re-entry (refs #2852 N4, round 2 F1): the bound still runs on an
257
- * already-stamped result — master applied the bound after the stamp-skip, and
258
- * the kept tail carries the footer through it — so re-entry is never delivered
259
- * unbounded. A stamped result within the delivered budget is kept as-is; the
260
- * figures are the kept footer's own prior values, never a footer-inclusive
261
- * re-measure and never a hard-coded `false`. */
262
- export function finalizeToolResultWithDelivery(result) {
263
- const normalized = { ...result, isError: result.isError === true };
264
- const existingText = fullTextOf(normalized);
265
- const existingFooter = CONTRACT_FOOTER_TAIL_RE.exec(existingText);
266
- if (existingFooter &&
267
- Buffer.byteLength(existingText, "utf8") <= MAX_RESULT_BYTES) {
268
- return {
269
- result: normalized,
270
- deliveredBytes: Number(existingFooter[1]),
271
- truncated: existingFooter[2] === "true",
272
- };
273
- }
274
- const bound = boundResultPayload(normalized);
275
- const text = fullTextOf(bound.result);
276
- const keptFooter = CONTRACT_FOOTER_TAIL_RE.exec(text);
277
- if (keptFooter) {
278
- // The bound ran and the kept tail still carries the footer, so there is
279
- // nothing to stamp; the kept footer's figures stay the delivery
280
- // contract (row 6: prior value kept).
281
- return {
282
- result: bound.result,
283
- deliveredBytes: Number(keptFooter[1]),
284
- truncated: keptFooter[2] === "true",
285
- };
286
- }
287
- const stamped = renderToolResultContract(bound.result, {
288
- bytes: bound.deliveredBytes,
289
- truncated: bound.truncated,
290
- });
291
- return {
292
- result: stamped,
293
- deliveredBytes: bound.deliveredBytes,
294
- truncated: bound.truncated,
295
- };
296
- }
297
- /** Finish a host-adapter result after its status and all warnings exist. */
298
- export function finalizeToolResult(result) {
299
- return finalizeToolResultWithDelivery(result).result;
300
- }
301
- // pi-lens brand colour: blue characters on whatever background the pi tool shell
302
- // paints (default success/error background is left untouched). Truecolor bold
303
- // foreground, theme-independent so the summary reads as ours regardless of the
304
- // active pi theme. We reset only the foreground (\x1b[39m) and bold (\x1b[22m) so
305
- // the shell background still composites.
306
- const PI_LENS_BLUE_FG = "\x1b[1m\x1b[38;2;96;165;250m"; // bold blue
307
- const RESET_FG = "\x1b[39m\x1b[22m";
308
- /** Join all text content blocks into the full model-facing string. */
309
- export function fullTextOf(result) {
310
- return (result.content ?? [])
311
- .filter((c) => c.type === "text" && typeof c.text === "string")
312
- .map((c) => c.text)
313
- .join("\n");
314
- }
315
- /**
316
- * Pure selection of what to display — exported separately so it can be unit
317
- * tested without constructing a TUI component or a Theme.
318
- */
319
- export function selectCompactText(result, args, expanded, summarize) {
320
- const text = fullTextOf(result);
321
- if (expanded) {
322
- return {
323
- text: text || "(no output)",
324
- style: result.isError ? "error" : "output",
325
- };
326
- }
327
- const lineCount = text ? text.split("\n").length : 0;
328
- let summary;
329
- try {
330
- summary = summarize({
331
- details: result.details,
332
- args,
333
- isError: result.isError === true,
334
- text,
335
- lineCount,
336
- });
337
- }
338
- catch {
339
- // Never let a summarizer bug blank the row — fall back to the first line.
340
- summary = text.split("\n")[0] ?? "";
341
- }
342
- // Collapsed summaries render in pi-lens blue; errors stay theme-red.
343
- return { text: summary, style: result.isError ? "error" : "brand" };
344
- }
345
- /** Apply a CompactStyle to text. `brand` uses raw blue ANSI; the rest defer to
346
- * the theme so error-red and normal output stay consistent with the host. */
347
- function paintCompact(style, text, theme) {
348
- if (style === "brand") {
349
- return `${PI_LENS_BLUE_FG}${text}${RESET_FG}`;
350
- }
351
- const color = style === "error" ? "error" : "toolOutput";
352
- return theme.fg(color, text);
353
- }
354
- /**
355
- * Build a `renderResult` for a tool. `summarize` produces the one-line collapsed
356
- * view from the structured result; the expanded view shows the full payload.
357
- */
358
- export function compactRenderResult(summarize) {
359
- return (result, options, theme, context) => {
360
- const component = context.lastComponent instanceof Text
361
- ? context.lastComponent
362
- : new Text("", 0, 0);
363
- const { text, style } = selectCompactText(result, (context.args ?? {}), options.expanded === true, summarize);
364
- component.setText(paintCompact(style, text, theme));
365
- return component;
366
- };
367
- }
368
- /** Shorten an absolute/relative path to its basename for the summary line. */
369
- export function baseName(p) {
370
- if (typeof p !== "string" || p.length === 0)
371
- return "";
372
- const parts = p.split(/[\\/]/);
373
- return parts[parts.length - 1] || p;
374
- }
@@ -1,53 +0,0 @@
1
- /**
2
- * Shared progress-streaming helper for the long-running full/batch/directory
3
- * diagnostic scans (`lens_diagnostics mode=full`, `lsp_diagnostics`). Those runs
4
- * are opaque for minutes; this streams a throttled progress bar to the tool's
5
- * `onUpdate` callback so the agent/user sees movement.
6
- */
7
- /**
8
- * For a tool's `compactRenderResult` summarizer: when the result is a streaming
9
- * progress partial (`details.phase === "scanning"`, emitted via `onUpdate` during
10
- * a full scan), return the bar to display — the joined content `text` (which
11
- * already holds `renderScanProgress` output), or a counts fallback. Returns
12
- * `null` for a normal (non-progress) result so the caller falls through to its
13
- * usual summary. Without this, the details-driven summarizer renders "0
14
- * diagnostics" mid-scan and the bar never shows.
15
- */
16
- export function scanningSummaryLine(details, text) {
17
- const d = details;
18
- if (d?.phase !== "scanning")
19
- return null;
20
- return text || `Scanning… ${d.completed ?? 0}/${d.total ?? 0}`;
21
- }
22
- /** A ≤20-char ASCII bar + counts, e.g. `Scanning… [████░░░░░░] 45/123 (37%)`. */
23
- export function renderScanProgress(completed, total, label = "Scanning project diagnostics") {
24
- const pct = total > 0 ? Math.min(100, Math.round((completed / total) * 100)) : 0;
25
- const width = 20;
26
- const filled = Math.round((pct / 100) * width);
27
- const bar = "█".repeat(filled) + "░".repeat(Math.max(0, width - filled));
28
- return `${label}… [${bar}] ${completed}/${total} (${pct}%)`;
29
- }
30
- /**
31
- * Build a throttled `(completed, total) => void` that streams the progress bar to
32
- * `onUpdate` — at most once per `throttleMs` (default 250ms, ~4×/s) plus the
33
- * final tick so the bar always lands on 100%. Returns `undefined` when the SDK
34
- * gave no callback, so callers can pass it straight through as an optional.
35
- */
36
- export function makeProgressReporter(onUpdate, label, throttleMs = 250) {
37
- const emit = onUpdate;
38
- if (typeof emit !== "function")
39
- return undefined;
40
- let lastEmit = 0;
41
- return (completed, total) => {
42
- const now = Date.now();
43
- if (completed < total && now - lastEmit < throttleMs)
44
- return;
45
- lastEmit = now;
46
- emit({
47
- content: [
48
- { type: "text", text: renderScanProgress(completed, total, label) },
49
- ],
50
- details: { phase: "scanning", completed, total },
51
- });
52
- };
53
- }
@@ -1,29 +0,0 @@
1
- /**
2
- * Shared constants for tool definitions
3
- */
4
- export const LANGUAGES = [
5
- "bash",
6
- "c",
7
- "cpp",
8
- "csharp",
9
- "css",
10
- "elixir",
11
- "go",
12
- "haskell",
13
- "html",
14
- "java",
15
- "javascript",
16
- "json",
17
- "kotlin",
18
- "lua",
19
- "nix",
20
- "php",
21
- "python",
22
- "ruby",
23
- "rust",
24
- "scala",
25
- "swift",
26
- "tsx",
27
- "typescript",
28
- "yaml",
29
- ];