@herbertgao/pi-extensions 2026.9.1 → 2026.9.3

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 (341) hide show
  1. package/README.md +3 -2
  2. package/THIRD_PARTY_NOTICES.md +24 -0
  3. package/node_modules/@herbertgao/sol-pi/LICENSE +19 -0
  4. package/node_modules/@herbertgao/sol-pi/README.md +159 -0
  5. package/node_modules/@herbertgao/sol-pi/SECURITY.md +26 -0
  6. package/node_modules/@herbertgao/sol-pi/THIRD_PARTY_NOTICES.md +19 -0
  7. package/node_modules/@herbertgao/sol-pi/agents-install.md +150 -0
  8. package/node_modules/@herbertgao/sol-pi/assets/sol-pi-hero.png +0 -0
  9. package/node_modules/@herbertgao/sol-pi/docs/compatibility.md +69 -0
  10. package/node_modules/@herbertgao/sol-pi/docs/configuration.md +75 -0
  11. package/node_modules/@herbertgao/sol-pi/package.json +76 -0
  12. package/node_modules/@herbertgao/sol-pi/scripts/check-pi-compat.mjs +32 -0
  13. package/node_modules/@herbertgao/sol-pi/scripts/check-sol-pi-config.mjs +120 -0
  14. package/node_modules/@herbertgao/sol-pi/sol-pi.example.json +10 -0
  15. package/node_modules/@herbertgao/sol-pi/src/sol-pi/config.ts +135 -0
  16. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/file-queue.ts +74 -0
  17. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/index.ts +185 -0
  18. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/then-run.ts +128 -0
  19. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/evidence-preserving-reducer/archive.ts +53 -0
  20. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/evidence-preserving-reducer/candidate.ts +101 -0
  21. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/evidence-preserving-reducer/config.ts +71 -0
  22. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/evidence-preserving-reducer/index.ts +220 -0
  23. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/evidence-preserving-reducer/journal.ts +25 -0
  24. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/evidence-preserving-reducer/provider.ts +164 -0
  25. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/evidence-preserving-reducer/receipt.ts +177 -0
  26. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/observation-pack/index.ts +227 -0
  27. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/observation-pack/ledger.ts +20 -0
  28. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/observation-pack/observation.ts +252 -0
  29. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/economics.ts +237 -0
  30. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/extension.ts +455 -0
  31. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/index.ts +49 -0
  32. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/plan.ts +79 -0
  33. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/state.ts +208 -0
  34. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/tools.ts +100 -0
  35. package/node_modules/@herbertgao/sol-pi/src/sol-pi/index.ts +42 -0
  36. package/node_modules/@herbertgao/sol-pi/src/sol-pi/runtime-paths.ts +17 -0
  37. package/node_modules/@herbertgao/sol-pi/src/sol-pi/tui.ts +71 -0
  38. package/node_modules/@narumitw/pi-btw/README.md +57 -141
  39. package/node_modules/@narumitw/pi-btw/dist/index.ts +478 -43
  40. package/node_modules/@narumitw/pi-btw/dist/index.ts.map +4 -4
  41. package/node_modules/@narumitw/pi-btw/docs/workflows.md +74 -0
  42. package/node_modules/@narumitw/pi-btw/package.json +2 -1
  43. package/node_modules/@narumitw/pi-btw/src/btw.ts +28 -3
  44. package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +32 -2
  45. package/node_modules/@narumitw/pi-btw/src/keybindings.ts +330 -0
  46. package/node_modules/@narumitw/pi-btw/src/menu.ts +136 -19
  47. package/node_modules/@narumitw/pi-btw/src/settings.ts +32 -0
  48. package/node_modules/@narumitw/pi-btw/src/side-thread.ts +57 -5
  49. package/node_modules/@narumitw/pi-btw/src/transcript-pager.ts +52 -30
  50. package/node_modules/pi-lens/CHANGELOG.md +260 -0
  51. package/node_modules/pi-lens/README.md +13 -8
  52. package/node_modules/pi-lens/config/dependency-cruiser-eager-allowlist.json +3 -1
  53. package/node_modules/pi-lens/dist/clients/actionable-warnings-logger.js +0 -7
  54. package/node_modules/pi-lens/dist/clients/advisory-provenance.js +1 -1
  55. package/node_modules/pi-lens/dist/clients/analysed-root.js +1 -0
  56. package/node_modules/pi-lens/dist/clients/ast-grep-client.js +1 -1
  57. package/node_modules/pi-lens/dist/clients/ast-grep-tool-logger.js +1 -8
  58. package/node_modules/pi-lens/dist/clients/ast-grep-types.js +2 -0
  59. package/node_modules/pi-lens/dist/clients/bash-file-access.js +133 -1
  60. package/node_modules/pi-lens/dist/clients/biome-client.js +13 -2
  61. package/node_modules/pi-lens/dist/clients/blocker-freshness.js +0 -6
  62. package/node_modules/pi-lens/dist/clients/bootstrap.js +4 -4
  63. package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +1 -1
  64. package/node_modules/pi-lens/dist/clients/bounded-telemetry.js +2 -5
  65. package/node_modules/pi-lens/dist/clients/bus-events-logger.js +1 -9
  66. package/node_modules/pi-lens/dist/clients/cache-observability.js +122 -6
  67. package/node_modules/pi-lens/dist/clients/cargo-manifest.js +2 -2
  68. package/node_modules/pi-lens/dist/clients/cascade-logger.js +0 -7
  69. package/node_modules/pi-lens/dist/clients/child-unref.js +1 -19
  70. package/node_modules/pi-lens/dist/clients/complexity-client.js +5 -0
  71. package/node_modules/pi-lens/dist/clients/config-core/index.js +11 -8
  72. package/node_modules/pi-lens/dist/clients/config-core/process-spec.js +1 -1
  73. package/node_modules/pi-lens/dist/clients/config-core/provenance.js +2 -9
  74. package/node_modules/pi-lens/dist/clients/config-core/records.js +1 -1
  75. package/node_modules/pi-lens/dist/clients/config-core/schema.js +3 -5
  76. package/node_modules/pi-lens/dist/clients/config-diagnostic-codes.js +3 -1
  77. package/node_modules/pi-lens/dist/clients/config-resolve.js +10 -7
  78. package/node_modules/pi-lens/dist/clients/config-schema.js +56 -2
  79. package/node_modules/pi-lens/dist/clients/config-warn.js +2 -2
  80. package/node_modules/pi-lens/dist/clients/dead-code-client.js +8 -1
  81. package/node_modules/pi-lens/dist/clients/dead-code-logger.js +0 -4
  82. package/node_modules/pi-lens/dist/clients/dependency-checker.js +5 -1
  83. package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +1 -1
  84. package/node_modules/pi-lens/dist/clients/diagnostic-logger.js +1 -1
  85. package/node_modules/pi-lens/dist/clients/dispatch/collect-later-tier.js +0 -4
  86. package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +38 -41
  87. package/node_modules/pi-lens/dist/clients/dispatch/facts/function-facts.js +1 -1
  88. package/node_modules/pi-lens/dist/clients/dispatch/facts/import-facts.js +5 -1
  89. package/node_modules/pi-lens/dist/clients/dispatch/integration.js +18 -1
  90. package/node_modules/pi-lens/dist/clients/dispatch/lazy.js +0 -6
  91. package/node_modules/pi-lens/dist/clients/dispatch/pending-runner-findings.js +1 -1
  92. package/node_modules/pi-lens/dist/clients/dispatch/plan.js +0 -3
  93. package/node_modules/pi-lens/dist/clients/dispatch/rules/high-complexity.js +2 -2
  94. package/node_modules/pi-lens/dist/clients/dispatch/rules/high-fan-out.js +1 -1
  95. package/node_modules/pi-lens/dist/clients/dispatch/runners/actionlint.js +2 -1
  96. package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +3 -1
  97. package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +2 -3
  98. package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +7 -2
  99. package/node_modules/pi-lens/dist/clients/dispatch/runners/credo.js +2 -1
  100. package/node_modules/pi-lens/dist/clients/dispatch/runners/cue-vet.js +2 -1
  101. package/node_modules/pi-lens/dist/clients/dispatch/runners/dart-analyze.js +2 -1
  102. package/node_modules/pi-lens/dist/clients/dispatch/runners/detekt.js +2 -1
  103. package/node_modules/pi-lens/dist/clients/dispatch/runners/dotnet-build.js +2 -1
  104. package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +2 -1
  105. package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +2 -1
  106. package/node_modules/pi-lens/dist/clients/dispatch/runners/fish-indent.js +2 -1
  107. package/node_modules/pi-lens/dist/clients/dispatch/runners/gleam-check.js +2 -1
  108. package/node_modules/pi-lens/dist/clients/dispatch/runners/go-vet.js +2 -1
  109. package/node_modules/pi-lens/dist/clients/dispatch/runners/golangci-lint.js +2 -1
  110. package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +2 -1
  111. package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +3 -1
  112. package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-render.js +3 -2
  113. package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +2 -1
  114. package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +2 -1
  115. package/node_modules/pi-lens/dist/clients/dispatch/runners/ktlint.js +2 -1
  116. package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +19 -1
  117. package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +3 -2
  118. package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +2 -1
  119. package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +3 -1
  120. package/node_modules/pi-lens/dist/clients/dispatch/runners/php-lint.js +2 -1
  121. package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +2 -1
  122. package/node_modules/pi-lens/dist/clients/dispatch/runners/prisma-validate.js +2 -1
  123. package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +15 -11
  124. package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +2 -1
  125. package/node_modules/pi-lens/dist/clients/dispatch/runners/rubocop.js +2 -1
  126. package/node_modules/pi-lens/dist/clients/dispatch/runners/ruff.js +3 -3
  127. package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +12 -11
  128. package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +3 -2
  129. package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +2 -1
  130. package/node_modules/pi-lens/dist/clients/dispatch/runners/spellcheck.js +5 -3
  131. package/node_modules/pi-lens/dist/clients/dispatch/runners/spotbugs.js +2 -1
  132. package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +3 -2
  133. package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +3 -2
  134. package/node_modules/pi-lens/dist/clients/dispatch/runners/swiftlint.js +2 -1
  135. package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +2 -1
  136. package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +2 -1
  137. package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +2 -1
  138. package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +2 -1
  139. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/availability-policy.js +5 -0
  140. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +2 -2
  141. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +1 -64
  142. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +8 -2
  143. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils.js +0 -21
  144. package/node_modules/pi-lens/dist/clients/dispatch/runners/vale.js +2 -1
  145. package/node_modules/pi-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +2 -20
  146. package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +5 -3
  147. package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +2 -1
  148. package/node_modules/pi-lens/dist/clients/dispatch/utils/format-utils.js +2 -2
  149. package/node_modules/pi-lens/dist/clients/disposition-logger.js +0 -7
  150. package/node_modules/pi-lens/dist/clients/effective-config.js +12 -2
  151. package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +2 -2
  152. package/node_modules/pi-lens/dist/clients/extension-log.js +2 -0
  153. package/node_modules/pi-lens/dist/clients/file-kinds.js +1 -38
  154. package/node_modules/pi-lens/dist/clients/file-role.js +18 -1
  155. package/node_modules/pi-lens/dist/clients/file-time.js +1 -1
  156. package/node_modules/pi-lens/dist/clients/file-utils.js +5 -1
  157. package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +4 -0
  158. package/node_modules/pi-lens/dist/clients/format-service.js +0 -1
  159. package/node_modules/pi-lens/dist/clients/formatters.js +66 -93
  160. package/node_modules/pi-lens/dist/clients/generated-artifacts.js +3 -4
  161. package/node_modules/pi-lens/dist/clients/generation-guard.js +4 -0
  162. package/node_modules/pi-lens/dist/clients/git-guard.js +5 -0
  163. package/node_modules/pi-lens/dist/clients/gitleaks-client.js +42 -6
  164. package/node_modules/pi-lens/dist/clients/govulncheck-client.js +48 -7
  165. package/node_modules/pi-lens/dist/clients/grammar-source.js +3 -3
  166. package/node_modules/pi-lens/dist/clients/installer/index.js +416 -61
  167. package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh.js +84 -18
  168. package/node_modules/pi-lens/dist/clients/instance-reaper.js +6 -6
  169. package/node_modules/pi-lens/dist/clients/jscpd-client.js +9 -1
  170. package/node_modules/pi-lens/dist/clients/knip-client.js +9 -2
  171. package/node_modules/pi-lens/dist/clients/language-profile.js +12 -11
  172. package/node_modules/pi-lens/dist/clients/language-registry.js +5 -1
  173. package/node_modules/pi-lens/dist/clients/latency-logger.js +7 -7
  174. package/node_modules/pi-lens/dist/clients/ledger-bounds.js +21 -1
  175. package/node_modules/pi-lens/dist/clients/lens-config.js +23 -0
  176. package/node_modules/pi-lens/dist/clients/lens-engine.js +3 -4
  177. package/node_modules/pi-lens/dist/clients/lens-events.js +1 -1
  178. package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +18 -0
  179. package/node_modules/pi-lens/dist/clients/lens-map.js +1 -1
  180. package/node_modules/pi-lens/dist/clients/log-cleanup.js +0 -36
  181. package/node_modules/pi-lens/dist/clients/lsp/client.js +4 -3
  182. package/node_modules/pi-lens/dist/clients/lsp/config.js +37 -7
  183. package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +24 -1
  184. package/node_modules/pi-lens/dist/clients/lsp/document-drift.js +79 -1
  185. package/node_modules/pi-lens/dist/clients/lsp/edits.js +3 -3
  186. package/node_modules/pi-lens/dist/clients/lsp/index.js +491 -64
  187. package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +1 -1
  188. package/node_modules/pi-lens/dist/clients/lsp/language.js +0 -8
  189. package/node_modules/pi-lens/dist/clients/lsp/path-utils.js +1 -1
  190. package/node_modules/pi-lens/dist/clients/lsp/pending-aux-coverage.js +0 -2
  191. package/node_modules/pi-lens/dist/clients/lsp/server.js +62 -15
  192. package/node_modules/pi-lens/dist/clients/lsp/sync-kind.js +0 -1
  193. package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +5 -5
  194. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/classification.js +6 -0
  195. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/strategies.js +2 -1
  196. package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +37 -4
  197. package/node_modules/pi-lens/dist/clients/lsp-document-symbols.js +1 -1
  198. package/node_modules/pi-lens/dist/clients/mcp/analyze.js +3 -0
  199. package/node_modules/pi-lens/dist/clients/mcp/session.js +2 -0
  200. package/node_modules/pi-lens/dist/clients/metrics-history.js +28 -107
  201. package/node_modules/pi-lens/dist/clients/middle-man-analysis.js +1 -1
  202. package/node_modules/pi-lens/dist/clients/module-report.js +1 -1
  203. package/node_modules/pi-lens/dist/clients/mutating-tool.js +3 -3
  204. package/node_modules/pi-lens/dist/clients/mutation-attribution.js +3 -3
  205. package/node_modules/pi-lens/dist/clients/ndjson-logger.js +0 -4
  206. package/node_modules/pi-lens/dist/clients/observed-mutation.js +9 -9
  207. package/node_modules/pi-lens/dist/clients/opaque-mutation-scan.js +2 -6
  208. package/node_modules/pi-lens/dist/clients/opengrep-client.js +2 -0
  209. package/node_modules/pi-lens/dist/clients/opengrep-config.js +1 -1
  210. package/node_modules/pi-lens/dist/clients/package-manager.js +2 -1
  211. package/node_modules/pi-lens/dist/clients/path-utils.js +23 -2
  212. package/node_modules/pi-lens/dist/clients/performance-report.js +2 -2
  213. package/node_modules/pi-lens/dist/clients/php-cs-fixer-config.js +9 -4
  214. package/node_modules/pi-lens/dist/clients/pipeline.js +5 -4
  215. package/node_modules/pi-lens/dist/clients/project-changes.js +1 -1
  216. package/node_modules/pi-lens/dist/clients/project-diagnostics/extractors.js +1 -1
  217. package/node_modules/pi-lens/dist/clients/project-diagnostics/fresh-fetch.js +38 -10
  218. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +10 -9
  219. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/jscpd.js +1 -1
  220. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/knip.js +1 -1
  221. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/madge.js +1 -1
  222. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/opengrep.js +1 -1
  223. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +1 -1
  224. package/node_modules/pi-lens/dist/clients/project-lens-config.js +49 -1
  225. package/node_modules/pi-lens/dist/clients/project-scan-policy.js +3 -51
  226. package/node_modules/pi-lens/dist/clients/python-provenance.js +1 -1
  227. package/node_modules/pi-lens/dist/clients/read-guard-logger.js +3 -1
  228. package/node_modules/pi-lens/dist/clients/read-guard.js +5 -2
  229. package/node_modules/pi-lens/dist/clients/recent-touches.js +2 -2
  230. package/node_modules/pi-lens/dist/clients/review-graph/builder.js +3 -5
  231. package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +1 -1
  232. package/node_modules/pi-lens/dist/clients/review-graph-logger.js +2 -0
  233. package/node_modules/pi-lens/dist/clients/ruff-client.js +18 -9
  234. package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +10 -1
  235. package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +5 -0
  236. package/node_modules/pi-lens/dist/clients/runtime-session.js +58 -14
  237. package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +11 -1
  238. package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +4 -1
  239. package/node_modules/pi-lens/dist/clients/runtime-turn.js +48 -1
  240. package/node_modules/pi-lens/dist/clients/sanitize.js +0 -11
  241. package/node_modules/pi-lens/dist/clients/scan-utils.js +1 -56
  242. package/node_modules/pi-lens/dist/clients/security-scan-client.js +2 -2
  243. package/node_modules/pi-lens/dist/clients/session-event-guard.js +69 -1
  244. package/node_modules/pi-lens/dist/clients/session-summary.js +0 -24
  245. package/node_modules/pi-lens/dist/clients/sg-runner.js +2 -1
  246. package/node_modules/pi-lens/dist/clients/sgconfig.js +1 -5
  247. package/node_modules/pi-lens/dist/clients/shared-checkout-guard.js +1 -1
  248. package/node_modules/pi-lens/dist/clients/situational-tool-telemetry.js +108 -0
  249. package/node_modules/pi-lens/dist/clients/smells-rollup.js +2 -2
  250. package/node_modules/pi-lens/dist/clients/startup-scan.js +2 -10
  251. package/node_modules/pi-lens/dist/clients/test-runner-client.js +291 -76
  252. package/node_modules/pi-lens/dist/clients/test-runner-delivery.js +77 -72
  253. package/node_modules/pi-lens/dist/clients/tool-config.js +199 -0
  254. package/node_modules/pi-lens/dist/clients/tool-cwd.js +299 -0
  255. package/node_modules/pi-lens/dist/clients/tool-policy.js +1 -1
  256. package/node_modules/pi-lens/dist/clients/tool-probe.js +53 -0
  257. package/node_modules/pi-lens/dist/clients/tool-set-policy.js +42 -0
  258. package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +1 -52
  259. package/node_modules/pi-lens/dist/clients/trivy-client.js +9 -1
  260. package/node_modules/pi-lens/dist/clients/tui-fit.js +0 -4
  261. package/node_modules/pi-lens/dist/clients/turn-context.js +52 -0
  262. package/node_modules/pi-lens/dist/clients/user-notify.js +0 -4
  263. package/node_modules/pi-lens/dist/clients/widget-state.js +4 -3
  264. package/node_modules/pi-lens/dist/clients/word-index-logger.js +0 -7
  265. package/node_modules/pi-lens/dist/clients/word-index-store.js +3 -7
  266. package/node_modules/pi-lens/dist/clients/word-index.js +9 -16
  267. package/node_modules/pi-lens/dist/clients/zizmor-config.js +1 -1
  268. package/node_modules/pi-lens/dist/index.js +19969 -17481
  269. package/node_modules/pi-lens/dist/mcp/analyze-cli.js +3 -2
  270. package/node_modules/pi-lens/dist/mcp/build-staleness.js +1 -1
  271. package/node_modules/pi-lens/dist/mcp/server.js +135 -159
  272. package/node_modules/pi-lens/dist/scripts/lib/process-scan.mjs +1 -1
  273. package/node_modules/pi-lens/dist/scripts/lib/skills-predicate.mjs +1 -1
  274. package/node_modules/pi-lens/dist/tools/activate-tools.js +10 -7
  275. package/node_modules/pi-lens/dist/tools/ast-grep-outline.js +2 -13
  276. package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +8 -13
  277. package/node_modules/pi-lens/dist/tools/ast-grep-search.js +83 -39
  278. package/node_modules/pi-lens/dist/tools/effective-config.js +4 -3
  279. package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +1 -10
  280. package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +354 -86
  281. package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +54 -112
  282. package/node_modules/pi-lens/dist/tools/lsp-navigation.js +20 -44
  283. package/node_modules/pi-lens/dist/tools/lsp-structured-output.js +3 -3
  284. package/node_modules/pi-lens/dist/tools/module-report.js +5 -9
  285. package/node_modules/pi-lens/dist/tools/project-report.js +9 -17
  286. package/node_modules/pi-lens/dist/tools/render-compact.js +281 -2
  287. package/node_modules/pi-lens/dist/tools/symbol-search.js +3 -4
  288. package/node_modules/pi-lens/docs/agent-guide.md +3 -4
  289. package/node_modules/pi-lens/docs/agent-tools.md +46 -22
  290. package/node_modules/pi-lens/docs/configuration.md +9 -0
  291. package/node_modules/pi-lens/docs/environment-variables.md +0 -5
  292. package/node_modules/pi-lens/docs/features.md +5 -5
  293. package/node_modules/pi-lens/docs/globalconfig.md +31 -1
  294. package/node_modules/pi-lens/docs/lsp-capability-matrix.md +9 -1
  295. package/node_modules/pi-lens/docs/mcp.md +13 -1
  296. package/node_modules/pi-lens/docs/pi-lens-fixer.md +71 -0
  297. package/node_modules/pi-lens/docs/pi-lens-investigator.md +15 -0
  298. package/node_modules/pi-lens/docs/pi-lens-monitor.md +88 -0
  299. package/node_modules/pi-lens/docs/pi-lens-reviewer.md +41 -0
  300. package/node_modules/pi-lens/docs/pi-lens-subagent.md +21 -2
  301. package/node_modules/pi-lens/docs/public-api-stability.md +1 -0
  302. package/node_modules/pi-lens/docs/real-harness.md +46 -0
  303. package/node_modules/pi-lens/docs/release-qa-baseline.md +17 -5
  304. package/node_modules/pi-lens/docs/servercapabilities.md +2 -3
  305. package/node_modules/pi-lens/docs/settings.md +37 -2
  306. package/node_modules/pi-lens/docs/tools_improvement2.md +4 -4
  307. package/node_modules/pi-lens/docs/tree-sitter_rules_catalog.md +1 -1
  308. package/node_modules/pi-lens/docs/usage.md +13 -3
  309. package/node_modules/pi-lens/docs/word-index.md +1 -1
  310. package/node_modules/pi-lens/package.json +15 -15
  311. package/node_modules/pi-lens/rules/tree-sitter-queries/typescript/sql-injection.yml +7 -3
  312. package/node_modules/pi-lens/rules/typos/_typos.toml +4 -2
  313. package/node_modules/pi-lens/scripts/lib/skills-predicate.mjs +1 -1
  314. package/node_modules/pi-lens/scripts/lib/warm-loader-cache.mjs +1 -1
  315. package/node_modules/pi-lens/scripts/warm-loader-cache.mjs +4 -2
  316. package/node_modules/pi-lens/skills/pi-lens-ast-grep/SKILL.md +8 -6
  317. package/node_modules/pi-lens/skills/pi-lens-lsp-navigation/SKILL.md +19 -9
  318. package/node_modules/pi-web-access/CHANGELOG.md +29 -0
  319. package/node_modules/pi-web-access/README.md +33 -22
  320. package/node_modules/pi-web-access/abortable.ts +17 -0
  321. package/node_modules/pi-web-access/crawl4ai.ts +204 -0
  322. package/node_modules/pi-web-access/credential-source.ts +1 -0
  323. package/node_modules/pi-web-access/curator-page.ts +20 -2
  324. package/node_modules/pi-web-access/curator-run.ts +44 -0
  325. package/node_modules/pi-web-access/curator-server.ts +3 -1
  326. package/node_modules/pi-web-access/duckduckgo.ts +1 -1
  327. package/node_modules/pi-web-access/extract.ts +57 -12
  328. package/node_modules/pi-web-access/fetch-params.ts +1 -1
  329. package/node_modules/pi-web-access/gemini-search.ts +9 -5
  330. package/node_modules/pi-web-access/index.ts +25 -18
  331. package/node_modules/pi-web-access/openai-search.ts +35 -13
  332. package/node_modules/pi-web-access/package.json +2 -2
  333. package/node_modules/pi-web-access/page-query.ts +5 -2
  334. package/node_modules/pi-web-access/query-rewrite.ts +5 -2
  335. package/node_modules/pi-web-access/serpapi.ts +220 -0
  336. package/node_modules/pi-web-access/ssrf-protection.ts +5 -1
  337. package/node_modules/pi-web-access/storage.ts +10 -0
  338. package/node_modules/pi-web-access/summary-review.ts +34 -21
  339. package/node_modules/pi-web-access/utils.ts +6 -4
  340. package/package.json +7 -4
  341. package/node_modules/pi-lens/dist/tools/ast-dump.js +0 -103
@@ -1173,7 +1173,7 @@ export function resolveConfigurationSection(initialization, section) {
1173
1173
  // Exported (only) so tests can invoke the publishDiagnostics notification
1174
1174
  // handler directly against a mock LSPClientState/connection without spawning
1175
1175
  // a real language server. Not part of the public client API surface.
1176
- export function setupIncomingHandlers(state, initialization) {
1176
+ export function setupIncomingHandlers(state, initialization, onDiagnosticsPublished) {
1177
1177
  state.connection.onNotification("textDocument/publishDiagnostics", (params) => {
1178
1178
  // #1639: the settle operation's own clock for THIS publish. A
1179
1179
  // "quiet-window" settle's durationMs below measures from here (when
@@ -1188,6 +1188,7 @@ export function setupIncomingHandlers(state, initialization) {
1188
1188
  // that is no longer open on this client.
1189
1189
  if (state.closedDocuments?.has(normalizedPath))
1190
1190
  return;
1191
+ onDiagnosticsPublished?.(state.serverId);
1191
1192
  const newDiags = normalizeLspDiagnostics(params.diagnostics || []);
1192
1193
  const docVersion = params.version;
1193
1194
  if (PUB_DEBUG) {
@@ -3498,7 +3499,7 @@ async function resolveCodeActionBestEffort(state, action) {
3498
3499
  // --- Client Factory ---
3499
3500
  export async function createLSPClient(options) {
3500
3501
  installCrashGuard();
3501
- const { serverId, process: lspProcess, root, sessionCwd, initialization, initializeTimeoutMs = INITIALIZE_TIMEOUT_MS, launchVariant, } = options;
3502
+ const { serverId, process: lspProcess, root, sessionCwd, initialization, initializeTimeoutMs = INITIALIZE_TIMEOUT_MS, launchVariant, onDiagnosticsPublished, } = options;
3502
3503
  // #449/#472: register this LSP child in the cross-process instance registry
3503
3504
  // as soon as we have a live pid — BEFORE `initialize` completes, not after.
3504
3505
  // Registering early means a child that dies/hangs during initialize (the
@@ -3671,7 +3672,7 @@ export async function createLSPClient(options) {
3671
3672
  return;
3672
3673
  void safeSendNotification(state.connection, "workspace/didChangeWatchedFiles", { changes });
3673
3674
  });
3674
- setupIncomingHandlers(state, initialization);
3675
+ setupIncomingHandlers(state, initialization, onDiagnosticsPublished);
3675
3676
  connection.listen();
3676
3677
  setupConnectionLifecycle(state, recentStderr);
3677
3678
  let initResult;
@@ -63,10 +63,11 @@ import { getGlobalPiLensDir } from "../file-utils.js";
63
63
  import { claimPhaseOncePerSession, currentSessionRecordId, logLatency, releaseOncePerSessionPhase, releasePhaseClaim, } from "../latency-logger.js";
64
64
  import { getPiLensGlobalConfigPath } from "../lens-config.js";
65
65
  import { normalizeFilePath } from "../path-utils.js";
66
+ import { resolveToolCwd } from "../tool-cwd.js";
66
67
  import { logSessionStart } from "../sessionstart-logger.js";
67
68
  import { launchLSP } from "./launch.js";
68
69
  import { registerSessionRoot, resetSessionRootsForTests, sessionRootConfigEntries, setSessionRootConfig, } from "./session-roots.js";
69
- import { createRootDetector, LSP_SERVERS, resetLSPCaseSensitivityState, } from "./server.js";
70
+ import { LSP_SERVERS, resetLSPCaseSensitivityState, resolveLspServerCwd, } from "./server.js";
70
71
  // --- Config Loading ---
71
72
  /**
72
73
  * For tests that need to force the warn-once cache to reset between cases —
@@ -336,10 +337,15 @@ export function createCustomServer(config, id) {
336
337
  return {
337
338
  id,
338
339
  name: config.name,
340
+ custom: true,
339
341
  extensions: config.extensions,
342
+ ...(config.rootMarkers ? { rootMarkers: config.rootMarkers } : {}),
340
343
  root: config.rootMarkers
341
- ? createRootDetector(config.rootMarkers)
342
- : async () => process.cwd(),
344
+ ? async (file) => resolveToolCwd("lsp", id, file, {
345
+ cwd: process.cwd(),
346
+ ...(config.rootMarkers ? { rootMarkers: config.rootMarkers } : {}),
347
+ })
348
+ : async (file) => resolveToolCwd("lsp", id, file, { cwd: process.cwd() }),
343
349
  async spawn(root) {
344
350
  const proc = await launchLSP(config.command, config.args ?? ["--stdio"], {
345
351
  cwd: root,
@@ -599,12 +605,21 @@ export function getServersForFileWithConfig(filePath) {
599
605
  const base = path.basename(filePath).toLowerCase();
600
606
  return registeredServers(config).filter((server) => selectionReason(server, config, filePath, ext, base) === "selected");
601
607
  }
608
+ /**
609
+ * The primary language server ENTRY for a file — the one "first non-auxiliary
610
+ * server" predicate, shared by {@link primaryServerId} and
611
+ * {@link resolveLspCwdForFile} so the id-level and entry-level consumers
612
+ * cannot drift. `role` is only ever set to "auxiliary" on cross-cutting
613
+ * scanner entries (ast-grep, opengrep, zizmor, typos, marksman, ...) — see
614
+ * clients/lsp/server.ts; undefined here means a real language server.
615
+ */
616
+ function primaryServerEntry(filePath) {
617
+ return getServersForFileWithConfig(filePath).find((s) => s.role !== "auxiliary");
618
+ }
602
619
  /**
603
620
  * The primary language server for a file (e.g. "typescript"), as opposed to a
604
621
  * cross-cutting auxiliary scanner attached via clientScope "all"/
605
- * "with-auxiliary" (ast-grep, opengrep, zizmor, typos, marksman, ...). `role`
606
- * is only ever set to "auxiliary" on those auxiliary entries (see
607
- * clients/lsp/server.ts) — undefined means a real language server. Used to
622
+ * "with-auxiliary" (ast-grep, opengrep, zizmor, typos, marksman, ...). Used to
608
623
  * split a file's diagnostics into "primary confirmation" vs "auxiliary
609
624
  * findings" so a page of ast-grep/opengrep/marksman noise never buries
610
625
  * whether the actual type checker/compiler confirmed the file clean.
@@ -615,7 +630,22 @@ export function getServersForFileWithConfig(filePath) {
615
630
  * now report the same primary-vs-auxiliary split for the same file.
616
631
  */
617
632
  export function primaryServerId(filePath) {
618
- return getServersForFileWithConfig(filePath).find((s) => s.role !== "auxiliary")?.id;
633
+ return primaryServerEntry(filePath)?.id;
634
+ }
635
+ /**
636
+ * #2777 O1: the one seam a tool uses to answer "which cwd did this file's
637
+ * primary LSP server resolve to". Folds the three-step lookup callers used to
638
+ * hand-roll (`primaryServerId` + `getServersForFileWithConfig` +
639
+ * `resolveLspServerCwd`) into one call that returns `undefined` for a file
640
+ * with no primary LSP server, so the caller must handle the absent case
641
+ * instead of rendering it (the N1 `cwd=undefined` row becomes structurally
642
+ * impossible).
643
+ */
644
+ export async function resolveLspCwdForFile(filePath, sessionCwd) {
645
+ const primary = primaryServerEntry(filePath);
646
+ if (!primary)
647
+ return undefined;
648
+ return resolveLspServerCwd(primary, filePath, sessionCwd);
619
649
  }
620
650
  /**
621
651
  * Look up an initializationOptions override for a built-in server.
@@ -73,6 +73,27 @@ export function touchCoverageGap(result) {
73
73
  export function touchCompletedConfirmationPolicy(result) {
74
74
  return result?.confirmation !== undefined;
75
75
  }
76
+ /**
77
+ * #2878: one publication-evidence predicate for auxiliary coverage. A
78
+ * content-hash binding proves that the stored publication describes these
79
+ * bytes. For a version-less publisher, an advanced per-path publication stamp
80
+ * proves that the auxiliary published after this touch's pre-notify baseline;
81
+ * the stamp alone cannot prove that the bytes matched. The pre-notify boolean
82
+ * passed as `bindingMatchesContent` preserves a binding that the notify
83
+ * cleared, while the live stamp covers a publication that landed after the
84
+ * wait began. This predicate is the union. Four callers use it; only the
85
+ * demoted row's `publishedThisContent` takes the union — the sibling and
86
+ * aggregate rows compute that field from `auxCoversThisContent` directly
87
+ * (#2914), while their `outcome` field still reads the stamp through this
88
+ * predicate. Absent evidence fails closed.
89
+ */
90
+ export function auxiliaryPublicationEvidence({ bindingMatchesContent, baseline, currentPathVersion, raced = true, }) {
91
+ return (bindingMatchesContent ||
92
+ (raced &&
93
+ Number.isFinite(baseline) &&
94
+ currentPathVersion !== undefined &&
95
+ currentPathVersion > baseline));
96
+ }
76
97
  /**
77
98
  * #1493: the single policy deciding which auxiliaries a touch carries NO
78
99
  * evidence from. Both no-answer shapes belong here, because they are the same
@@ -106,7 +127,9 @@ export function touchCompletedConfirmationPolicy(result) {
106
127
  * irrelevant once a verified publication for them exists. Exempting `silent` but
107
128
  * not `cut_off` on identical evidence would report the same coverage two ways
108
129
  * depending on which timer happened to win. This stays fail-closed — it
109
- * un-narrows only against a content-hash match, never against a timer.
130
+ * un-narrows only against publication evidence (content-hash match, or an
131
+ * advanced per-path publication stamp for version-less publishers), never
132
+ * against a timer.
110
133
  */
111
134
  export function auxiliaryCoverageGap(evidence) {
112
135
  return evidence
@@ -88,7 +88,7 @@ const SKIPPED = {
88
88
  tracked: 0,
89
89
  };
90
90
  /** Documents stat'd per pass. Bounds the per-pass cost on a large workspace. */
91
- export const DRIFT_CHECK_BATCH = 64;
91
+ const DRIFT_CHECK_BATCH = 64;
92
92
  /** Resyncs issued per pass. Paces the heal so a bulk edit cannot burst. */
93
93
  export const DRIFT_RESYNC_BATCH = 4;
94
94
  /** Tracked-document ceiling. A workspace sweep can open far more than this. */
@@ -106,6 +106,8 @@ export function driftCheckIntervalMs() {
106
106
  export class DocumentDriftTracker {
107
107
  /** Insertion-ordered; the sweep cursor walks it round-robin. */
108
108
  synced = new Map();
109
+ /** Git/external recovery targets waiting for the same paced resync budget. */
110
+ pendingResync = new Set();
109
111
  lastSweepAt = 0;
110
112
  cursor = 0;
111
113
  /**
@@ -123,6 +125,15 @@ export class DocumentDriftTracker {
123
125
  peek(filePath) {
124
126
  return this.synced.get(normalizeMapKey(filePath));
125
127
  }
128
+ /** Queue known-open targets for the next ordinary paced drift pass. */
129
+ enqueueResync(filePaths) {
130
+ for (const filePath of filePaths) {
131
+ this.pendingResync.add(normalizeMapKey(filePath));
132
+ }
133
+ }
134
+ get pendingResyncCount() {
135
+ return this.pendingResync.size;
136
+ }
126
137
  /**
127
138
  * Record content that landed on EVERY server holding this document.
128
139
  *
@@ -154,6 +165,7 @@ export class DocumentDriftTracker {
154
165
  /** Drop every record. Used on shutdown/session reset, where the server's view dies with it. */
155
166
  clear() {
156
167
  this.synced.clear();
168
+ this.pendingResync.clear();
157
169
  this.cursor = 0;
158
170
  this.lastSweepAt = 0;
159
171
  this.flight.clear();
@@ -270,11 +282,77 @@ export class DocumentDriftTracker {
270
282
  mtimeMs: entry.stat.mtimeMs,
271
283
  });
272
284
  }
285
+ const queued = [...this.pendingResync];
286
+ for (const key of queued) {
287
+ if (deps.holdsDocument && !deps.holdsDocument(key)) {
288
+ this.pendingResync.delete(key);
289
+ unheld += 1;
290
+ continue;
291
+ }
292
+ }
273
293
  let resynced = 0;
274
294
  let failed = 0;
275
295
  let unchanged = 0;
276
296
  let deferred = 0;
297
+ const resyncedKeys = new Set();
298
+ for (const key of queued) {
299
+ if (!this.pendingResync.has(key))
300
+ continue;
301
+ if (resynced >= DRIFT_RESYNC_BATCH) {
302
+ deferred += 1;
303
+ deps.onDrift?.({
304
+ filePath: key,
305
+ driftAgeMs: 0,
306
+ disposition: "deferred",
307
+ syncedSize: this.synced.get(key)?.size ?? 0,
308
+ diskSize: -1,
309
+ });
310
+ continue;
311
+ }
312
+ let content;
313
+ try {
314
+ content = await read(key);
315
+ }
316
+ catch {
317
+ this.pendingResync.delete(key);
318
+ vanished += 1;
319
+ continue;
320
+ }
321
+ let landed = false;
322
+ try {
323
+ landed = await deps.resync(key, content, 0);
324
+ }
325
+ catch {
326
+ landed = false;
327
+ }
328
+ if (!landed) {
329
+ failed += 1;
330
+ deps.onDrift?.({
331
+ filePath: key,
332
+ driftAgeMs: 0,
333
+ disposition: "failed",
334
+ syncedSize: this.synced.get(key)?.size ?? 0,
335
+ diskSize: Buffer.byteLength(content, "utf8"),
336
+ });
337
+ continue;
338
+ }
339
+ this.pendingResync.delete(key);
340
+ resynced += 1;
341
+ resyncedKeys.add(key);
342
+ deps.onDrift?.({
343
+ filePath: key,
344
+ driftAgeMs: 0,
345
+ disposition: "resynced",
346
+ syncedSize: this.synced.get(key)?.size ?? 0,
347
+ diskSize: Buffer.byteLength(content, "utf8"),
348
+ });
349
+ }
277
350
  for (const { key, record, mtimeMs } of drifted) {
351
+ // A Git recovery target and the ordinary stat backstop can identify the
352
+ // same file in one pass. One event gets one resync opportunity; otherwise
353
+ // folding Git recovery onto this scheduler double-counts the same write.
354
+ if (resyncedKeys.has(key))
355
+ continue;
278
356
  const driftAgeMs = Math.max(0, now() - record.syncedAt);
279
357
  if (resynced >= DRIFT_RESYNC_BATCH) {
280
358
  // Paced, not dropped: the cursor already advanced past this file, but
@@ -131,7 +131,7 @@ function parseWorkspaceEdit(edit) {
131
131
  function formatRange(range) {
132
132
  return `${range.start.line + 1}:${range.start.character + 1}-${range.end.line + 1}:${range.end.character + 1}`;
133
133
  }
134
- export function rangesOverlap(a, b) {
134
+ function rangesOverlap(a, b) {
135
135
  return (comparePosition(a.start, b.end) < 0 && comparePosition(b.start, a.end) < 0);
136
136
  }
137
137
  function positionsEqual(a, b) {
@@ -351,7 +351,7 @@ export async function normalizeWorkspaceEditToUtf16(edit, positionEncoding, cwd)
351
351
  ...(edit.documentChanges !== undefined ? { documentChanges } : {}),
352
352
  };
353
353
  }
354
- export function flattenWorkspaceTextEdits(edit) {
354
+ function flattenWorkspaceTextEdits(edit) {
355
355
  parseWorkspaceEdit(edit);
356
356
  const buckets = new Map();
357
357
  const push = (uri, edits) => {
@@ -786,7 +786,7 @@ async function createWorkspaceUriConfiner(cwd) {
786
786
  filePath = uriToPath(uri);
787
787
  }
788
788
  catch (err) {
789
- throw new Error(`invalid workspace edit URI ${uri}: ${err instanceof Error ? err.message : String(err)}`);
789
+ throw new Error(`invalid workspace edit URI ${uri}: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
790
790
  }
791
791
  if (!path.isAbsolute(filePath))
792
792
  throw new Error(`workspace edit path escapes workspace: ${uri}`);