@herbertgao/pi-extensions 2026.8.5 → 2026.8.7

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 (389) hide show
  1. package/README.md +5 -5
  2. package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +2 -2
  3. package/node_modules/@herbertgao/pi-cc-extensions/README.md +2 -2
  4. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +19 -7
  5. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +30 -9
  6. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +272 -22
  7. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +74 -5
  8. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +94 -77
  9. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/markdown-enhance.ts +48 -6
  10. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/message-display.ts +1 -1
  11. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/hover.ts +14 -0
  12. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +55 -17
  13. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/layout.ts +41 -2
  14. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-renderer.ts +75 -6
  15. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/types.ts +7 -3
  16. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +64 -1
  17. package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
  18. package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +16 -0
  19. package/node_modules/@herbertgao/pi-subagents/README.md +30 -22
  20. package/node_modules/@herbertgao/pi-subagents/examples/agent-tool-description.md +5 -5
  21. package/node_modules/@herbertgao/pi-subagents/package.json +7 -7
  22. package/node_modules/@herbertgao/pi-subagents/src/agent-file-toggle.ts +7 -1
  23. package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +48 -19
  24. package/node_modules/@herbertgao/pi-subagents/src/agent-runner.ts +22 -15
  25. package/node_modules/@herbertgao/pi-subagents/src/custom-agents.ts +26 -2
  26. package/node_modules/@herbertgao/pi-subagents/src/index.ts +219 -40
  27. package/node_modules/@herbertgao/pi-subagents/src/invocation-config.ts +101 -3
  28. package/node_modules/@herbertgao/pi-subagents/src/nested-tools.ts +18 -4
  29. package/node_modules/@herbertgao/pi-subagents/src/settings.ts +99 -0
  30. package/node_modules/@herbertgao/pi-subagents/src/types.ts +22 -3
  31. package/node_modules/@herbertgao/pi-subagents/src/ui/agent-widget.ts +51 -3
  32. package/node_modules/@herbertgao/pi-subagents/src/ui/conversation-viewer.ts +20 -2
  33. package/node_modules/@herbertgao/pi-subagents/src/ui/fleet-list.ts +34 -10
  34. package/node_modules/@herbertgao/pi-subagents/src/usage.ts +129 -1
  35. package/node_modules/@herbertgao/pi-subagents/src/worktree.ts +29 -5
  36. package/node_modules/@juicesharp/rpiv-ask-user-question/README.md +3 -0
  37. package/node_modules/@juicesharp/rpiv-ask-user-question/ask-user-question.ts +46 -10
  38. package/node_modules/@juicesharp/rpiv-ask-user-question/config.ts +25 -0
  39. package/node_modules/@juicesharp/rpiv-ask-user-question/docs/configuration.md +13 -4
  40. package/node_modules/@juicesharp/rpiv-ask-user-question/docs/hosts.md +8 -1
  41. package/node_modules/@juicesharp/rpiv-ask-user-question/docs/localization.md +3 -1
  42. package/node_modules/@juicesharp/rpiv-ask-user-question/locales/en.json +2 -2
  43. package/node_modules/@juicesharp/rpiv-ask-user-question/locales/zh.json +2 -2
  44. package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +3 -2
  45. package/node_modules/@juicesharp/rpiv-ask-user-question/state/build-questionnaire.ts +10 -0
  46. package/node_modules/@juicesharp/rpiv-ask-user-question/state/key-router.ts +3 -1
  47. package/node_modules/@juicesharp/rpiv-ask-user-question/state/questionnaire-session.ts +30 -7
  48. package/node_modules/@juicesharp/rpiv-ask-user-question/state/state.ts +14 -6
  49. package/node_modules/@juicesharp/rpiv-ask-user-question/view/dialog-builder.ts +30 -4
  50. package/node_modules/@juicesharp/rpiv-ask-user-question/view/tab-content-strategy.ts +26 -5
  51. package/node_modules/@narumitw/pi-btw/README.md +119 -103
  52. package/node_modules/@narumitw/pi-btw/dist/index.ts +2898 -0
  53. package/node_modules/@narumitw/pi-btw/dist/index.ts.map +7 -0
  54. package/node_modules/@narumitw/pi-btw/package.json +13 -9
  55. package/node_modules/@narumitw/pi-btw/src/btw.ts +40 -42
  56. package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +55 -10
  57. package/node_modules/@narumitw/pi-btw/src/main-tree-picker.ts +390 -0
  58. package/node_modules/@narumitw/pi-btw/src/menu.ts +78 -15
  59. package/node_modules/@narumitw/pi-btw/src/settings.ts +22 -2
  60. package/node_modules/@narumitw/pi-btw/src/transcript-pager.ts +136 -45
  61. package/node_modules/pi-lens/CHANGELOG.md +1004 -0
  62. package/node_modules/pi-lens/README.md +11 -3
  63. package/node_modules/pi-lens/config/ruff/core.toml +42 -0
  64. package/node_modules/pi-lens/dist/clients/actionable-warnings.js +130 -27
  65. package/node_modules/pi-lens/dist/clients/advisory-provenance.js +427 -0
  66. package/node_modules/pi-lens/dist/clients/agent-nudge.js +79 -16
  67. package/node_modules/pi-lens/dist/clients/ast-grep-client.js +9 -3
  68. package/node_modules/pi-lens/dist/clients/atomic-write.js +9 -3
  69. package/node_modules/pi-lens/dist/clients/bash-file-access.js +285 -8
  70. package/node_modules/pi-lens/dist/clients/biome-client.js +176 -37
  71. package/node_modules/pi-lens/dist/clients/blocker-freshness.js +428 -0
  72. package/node_modules/pi-lens/dist/clients/blocker-past-eof.js +119 -0
  73. package/node_modules/pi-lens/dist/clients/bootstrap.js +12 -1
  74. package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +12 -3
  75. package/node_modules/pi-lens/dist/clients/bounded-telemetry.js +192 -0
  76. package/node_modules/pi-lens/dist/clients/bus-events-logger.js +62 -6
  77. package/node_modules/pi-lens/dist/clients/bus-publish.js +11 -3
  78. package/node_modules/pi-lens/dist/clients/cascade-budget.js +196 -0
  79. package/node_modules/pi-lens/dist/clients/cascade-format.js +76 -2
  80. package/node_modules/pi-lens/dist/clients/cascade-types.js +9 -1
  81. package/node_modules/pi-lens/dist/clients/child-unref.js +54 -6
  82. package/node_modules/pi-lens/dist/clients/code-quality-warnings.js +76 -24
  83. package/node_modules/pi-lens/dist/clients/console-guard-install.js +16 -4
  84. package/node_modules/pi-lens/dist/clients/dead-code-client.js +249 -52
  85. package/node_modules/pi-lens/dist/clients/deadline-utils.js +8 -1
  86. package/node_modules/pi-lens/dist/clients/debug-handles.js +5 -0
  87. package/node_modules/pi-lens/dist/clients/degradation-ledger.js +62 -13
  88. package/node_modules/pi-lens/dist/clients/dependency-checker.js +43 -9
  89. package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +153 -37
  90. package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +298 -0
  91. package/node_modules/pi-lens/dist/clients/diagnostics-publish.js +10 -3
  92. package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +165 -11
  93. package/node_modules/pi-lens/dist/clients/dispatch/integration.js +325 -72
  94. package/node_modules/pi-lens/dist/clients/dispatch/lazy.js +7 -4
  95. package/node_modules/pi-lens/dist/clients/dispatch/plan.js +5 -0
  96. package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +234 -18
  97. package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +187 -19
  98. package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +6 -3
  99. package/node_modules/pi-lens/dist/clients/dispatch/runners/credo.js +11 -9
  100. package/node_modules/pi-lens/dist/clients/dispatch/runners/cue-vet.js +398 -0
  101. package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +11 -3
  102. package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +12 -7
  103. package/node_modules/pi-lens/dist/clients/dispatch/runners/go-vet.js +18 -0
  104. package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-render.js +895 -0
  105. package/node_modules/pi-lens/dist/clients/dispatch/runners/index.js +4 -0
  106. package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +16 -3
  107. package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +81 -41
  108. package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +16 -0
  109. package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +23 -0
  110. package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +331 -55
  111. package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +38 -5
  112. package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +97 -19
  113. package/node_modules/pi-lens/dist/clients/dispatch/runners/spellcheck.js +14 -0
  114. package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +20 -0
  115. package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +22 -0
  116. package/node_modules/pi-lens/dist/clients/dispatch/runners/swiftlint.js +10 -0
  117. package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +18 -6
  118. package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +73 -12
  119. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/availability-policy.js +488 -0
  120. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +84 -0
  121. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +260 -27
  122. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +943 -93
  123. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +86 -11
  124. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +72 -0
  125. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +106 -0
  126. package/node_modules/pi-lens/dist/clients/dispatch/runners/vale.js +9 -0
  127. package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +18 -1
  128. package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +4 -2
  129. package/node_modules/pi-lens/dist/clients/disposition-publish.js +10 -3
  130. package/node_modules/pi-lens/dist/clients/eval-timestamp.js +17 -0
  131. package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +28 -5
  132. package/node_modules/pi-lens/dist/clients/extension-log.js +317 -3
  133. package/node_modules/pi-lens/dist/clients/file-kinds.js +8 -2
  134. package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +294 -0
  135. package/node_modules/pi-lens/dist/clients/finding-identity.js +88 -0
  136. package/node_modules/pi-lens/dist/clients/fix-worklog.js +5 -1
  137. package/node_modules/pi-lens/dist/clients/format-events-publish.js +39 -8
  138. package/node_modules/pi-lens/dist/clients/formatters-lazy.js +3 -2
  139. package/node_modules/pi-lens/dist/clients/formatters.js +500 -115
  140. package/node_modules/pi-lens/dist/clients/generation-guard.js +216 -0
  141. package/node_modules/pi-lens/dist/clients/git-guard.js +49 -21
  142. package/node_modules/pi-lens/dist/clients/gitleaks-client.js +181 -8
  143. package/node_modules/pi-lens/dist/clients/go-client.js +21 -39
  144. package/node_modules/pi-lens/dist/clients/govulncheck-client.js +219 -10
  145. package/node_modules/pi-lens/dist/clients/grammar-source.js +333 -10
  146. package/node_modules/pi-lens/dist/clients/host-ports.js +9 -1
  147. package/node_modules/pi-lens/dist/clients/installer/index.js +1119 -101
  148. package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh-session.js +58 -0
  149. package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh.js +715 -0
  150. package/node_modules/pi-lens/dist/clients/instance-reaper.js +643 -97
  151. package/node_modules/pi-lens/dist/clients/instance-registry.js +87 -17
  152. package/node_modules/pi-lens/dist/clients/jscpd-client.js +86 -15
  153. package/node_modules/pi-lens/dist/clients/knip-client.js +361 -24
  154. package/node_modules/pi-lens/dist/clients/language-policy.js +8 -2
  155. package/node_modules/pi-lens/dist/clients/language-profile.js +2 -0
  156. package/node_modules/pi-lens/dist/clients/latency-logger.js +487 -9
  157. package/node_modules/pi-lens/dist/clients/lazy-import.js +21 -0
  158. package/node_modules/pi-lens/dist/clients/ledger-bounds.js +21 -0
  159. package/node_modules/pi-lens/dist/clients/lens-events.js +56 -25
  160. package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +16 -0
  161. package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +45 -2
  162. package/node_modules/pi-lens/dist/clients/lsp/aggregation.js +30 -4
  163. package/node_modules/pi-lens/dist/clients/lsp/cascade-tier.js +160 -20
  164. package/node_modules/pi-lens/dist/clients/lsp/client.js +1666 -148
  165. package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +111 -0
  166. package/node_modules/pi-lens/dist/clients/lsp/document-drift.js +389 -0
  167. package/node_modules/pi-lens/dist/clients/lsp/index.js +2496 -171
  168. package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +215 -0
  169. package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +146 -14
  170. package/node_modules/pi-lens/dist/clients/lsp/language.js +48 -4
  171. package/node_modules/pi-lens/dist/clients/lsp/server.js +517 -69
  172. package/node_modules/pi-lens/dist/clients/lsp/spawn-history.js +22 -0
  173. package/node_modules/pi-lens/dist/clients/lsp/sync-kind.js +43 -0
  174. package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +172 -0
  175. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/classification.js +21 -5
  176. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/strategies.js +61 -3
  177. package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +422 -28
  178. package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-session.js +30 -0
  179. package/node_modules/pi-lens/dist/clients/lsp/workspace-sweep-hold.js +175 -0
  180. package/node_modules/pi-lens/dist/clients/lsp-lazy.js +3 -2
  181. package/node_modules/pi-lens/dist/clients/mcp/analyze.js +4 -0
  182. package/node_modules/pi-lens/dist/clients/mcp/session.js +39 -18
  183. package/node_modules/pi-lens/dist/clients/model-provider.js +53 -0
  184. package/node_modules/pi-lens/dist/clients/module-report.js +8 -0
  185. package/node_modules/pi-lens/dist/clients/opengrep-client.js +15 -1
  186. package/node_modules/pi-lens/dist/clients/package-manager.js +170 -14
  187. package/node_modules/pi-lens/dist/clients/path-attribution-telemetry.js +27 -0
  188. package/node_modules/pi-lens/dist/clients/path-utils.js +160 -0
  189. package/node_modules/pi-lens/dist/clients/pipeline.js +178 -30
  190. package/node_modules/pi-lens/dist/clients/post-autofix-notice.js +37 -0
  191. package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +17 -3
  192. package/node_modules/pi-lens/dist/clients/project-diagnostics/extractors.js +89 -22
  193. package/node_modules/pi-lens/dist/clients/project-diagnostics/fresh-fetch.js +85 -15
  194. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +15 -3
  195. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +23 -2
  196. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +50 -2
  197. package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +5 -0
  198. package/node_modules/pi-lens/dist/clients/project-lens-config.js +3 -0
  199. package/node_modules/pi-lens/dist/clients/project-snapshot.js +299 -0
  200. package/node_modules/pi-lens/dist/clients/quiet-window-config.js +47 -0
  201. package/node_modules/pi-lens/dist/clients/quiet-window.js +11 -25
  202. package/node_modules/pi-lens/dist/clients/read-guard-logger.js +1 -1
  203. package/node_modules/pi-lens/dist/clients/read-guard.js +184 -10
  204. package/node_modules/pi-lens/dist/clients/resource-sampler.js +49 -17
  205. package/node_modules/pi-lens/dist/clients/reverse-deps.js +50 -11
  206. package/node_modules/pi-lens/dist/clients/review-graph/query.js +76 -4
  207. package/node_modules/pi-lens/dist/clients/run-duration.js +55 -0
  208. package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +248 -13
  209. package/node_modules/pi-lens/dist/clients/runtime-context.js +112 -12
  210. package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +472 -61
  211. package/node_modules/pi-lens/dist/clients/runtime-session.js +359 -13
  212. package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +217 -22
  213. package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +269 -22
  214. package/node_modules/pi-lens/dist/clients/runtime-turn.js +948 -87
  215. package/node_modules/pi-lens/dist/clients/rust-client.js +21 -37
  216. package/node_modules/pi-lens/dist/clients/safe-spawn.js +220 -7
  217. package/node_modules/pi-lens/dist/clients/scratch-tree-policy.js +161 -0
  218. package/node_modules/pi-lens/dist/clients/search-read-registration.js +34 -6
  219. package/node_modules/pi-lens/dist/clients/security-scan-client.js +224 -8
  220. package/node_modules/pi-lens/dist/clients/sg-runner.js +249 -37
  221. package/node_modules/pi-lens/dist/clients/single-flight.js +158 -0
  222. package/node_modules/pi-lens/dist/clients/smells-rollup.js +18 -11
  223. package/node_modules/pi-lens/dist/clients/stale-marker.js +17 -0
  224. package/node_modules/pi-lens/dist/clients/startup-timing.js +26 -2
  225. package/node_modules/pi-lens/dist/clients/test-runner-client.js +574 -32
  226. package/node_modules/pi-lens/dist/clients/tool-event.js +56 -5
  227. package/node_modules/pi-lens/dist/clients/tool-policy.js +127 -20
  228. package/node_modules/pi-lens/dist/clients/tool-set-policy.js +76 -0
  229. package/node_modules/pi-lens/dist/clients/tree-sitter-cache.js +75 -1
  230. package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +769 -64
  231. package/node_modules/pi-lens/dist/clients/tree-sitter-shared.js +11 -0
  232. package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +90 -0
  233. package/node_modules/pi-lens/dist/clients/trivy-client.js +19 -1
  234. package/node_modules/pi-lens/dist/clients/warm-attach.js +17 -0
  235. package/node_modules/pi-lens/dist/clients/widget-state.js +336 -36
  236. package/node_modules/pi-lens/dist/clients/word-index.js +305 -33
  237. package/node_modules/pi-lens/dist/clients/zizmor-config.js +214 -14
  238. package/node_modules/pi-lens/dist/index.js +64677 -49484
  239. package/node_modules/pi-lens/dist/mcp/server.js +8 -2
  240. package/node_modules/pi-lens/dist/tools/activate-tools.js +17 -5
  241. package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +9 -4
  242. package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +5 -2
  243. package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +469 -56
  244. package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +190 -46
  245. package/node_modules/pi-lens/dist/tools/lsp-navigation.js +46 -7
  246. package/node_modules/pi-lens/dist/tools/symbol-search.js +1 -1
  247. package/node_modules/pi-lens/docs/agent-guide.md +44 -14
  248. package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +518 -501
  249. package/node_modules/pi-lens/docs/dispositions.md +21 -0
  250. package/node_modules/pi-lens/docs/features.md +33 -6
  251. package/node_modules/pi-lens/docs/globalconfig.md +14 -0
  252. package/node_modules/pi-lens/docs/language-coverage.md +71 -5
  253. package/node_modules/pi-lens/docs/mcp.md +2 -2
  254. package/node_modules/pi-lens/docs/servercapabilities.md +4 -1
  255. package/node_modules/pi-lens/docs/settings.md +25 -1
  256. package/node_modules/pi-lens/docs/usage.md +24 -5
  257. package/node_modules/pi-lens/docs/word-index.md +35 -0
  258. package/node_modules/pi-lens/package.json +10 -6
  259. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/no-reflect-get-js-snapshot.yml +23 -0
  260. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/no-reflect-get-snapshot.yml +23 -0
  261. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/ts-void-zero-snapshot.yml +23 -0
  262. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-bare-object-param-test.yml +16 -0
  263. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-chained-type-assertions-test.yml +22 -0
  264. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-compile-call-test.yml +29 -1
  265. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-conditional-empty-object-spread-js-test.yml +9 -0
  266. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-conditional-empty-object-spread-test.yml +9 -0
  267. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-dupe-class-members-test.yml +33 -0
  268. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-inner-html-js-test.yml +7 -1
  269. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-inner-html-test.yml +7 -1
  270. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-known-value-widening-test.yml +9 -0
  271. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-non-null-assertion-test.yml +216 -0
  272. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-apply-js-test.yml +9 -0
  273. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-apply-test.yml +9 -0
  274. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-js-test.yml +9 -0
  275. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-test.yml +9 -0
  276. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-return-value-in-generator-test.yml +12 -0
  277. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-runtime-typeof-test.yml +33 -0
  278. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-server-bind-wildcard-test.yml +9 -0
  279. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-shape-in-symbol-names-test.yml +13 -0
  280. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-sql-in-code-js-test.yml +5 -1
  281. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-sql-in-code-test.yml +5 -1
  282. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-laundering-test.yml +11 -0
  283. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-parameters-test.yml +12 -0
  284. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-returns-test.yml +16 -0
  285. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-any-test.yml +10 -0
  286. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-unknown-test.yml +8 -0
  287. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/redundant-unsafe-function-test.yml +35 -0
  288. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/require-safety-comment-for-as-unknown-as-test.yml +177 -0
  289. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/ts-void-zero-test.yml +1 -0
  290. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-await-expression-member-js.yml +13 -2
  291. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-await-expression-member.yml +13 -2
  292. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-host-path-in-win32-branch.yml +2 -0
  293. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-object-param.yml +60 -0
  294. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-chained-type-assertions.yml +66 -0
  295. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-compile-call.yml +63 -5
  296. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-conditional-empty-object-spread-js.yml +21 -0
  297. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-conditional-empty-object-spread.yml +29 -0
  298. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-dupe-class-members.yml +52 -8
  299. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-inner-html-js.yml +27 -2
  300. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-inner-html.yml +27 -2
  301. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-known-value-widening.yml +71 -0
  302. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-non-null-assertion.yml +316 -0
  303. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-raw-json-store-write.yml +7 -0
  304. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-apply-js.yml +29 -0
  305. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-apply.yml +30 -0
  306. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-get-js.yml +41 -0
  307. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-get.yml +42 -0
  308. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-return-value-in-generator.yml +22 -5
  309. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-runtime-typeof.yml +121 -0
  310. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-server-bind-wildcard.yml +23 -7
  311. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-shape-in-symbol-names.yml +68 -0
  312. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-sql-in-code-js.yml +41 -2
  313. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-sql-in-code.yml +41 -2
  314. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-laundering.yml +32 -0
  315. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-parameters.yml +67 -0
  316. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-returns.yml +106 -0
  317. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unsafe-dictionary-any.yml +50 -0
  318. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unsafe-dictionary-unknown.yml +56 -0
  319. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-win32-isabsolute-for-qualification.yml +2 -0
  320. package/node_modules/pi-lens/rules/ast-grep-rules/rules/redundant-unsafe-function.yml +32 -0
  321. package/node_modules/pi-lens/rules/ast-grep-rules/rules/require-safety-comment-for-as-unknown-as.yml +184 -0
  322. package/node_modules/pi-lens/rules/ast-grep-rules/rules/ts-void-zero.yml +5 -0
  323. package/node_modules/pi-lens/rules/ast-grep-rules/self-scan-baseline.json +5 -0
  324. package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +132 -1
  325. package/node_modules/pi-lens/scripts/download-grammars.js +25 -0
  326. package/node_modules/pi-lens/scripts/grammars.lock.json +9 -0
  327. package/node_modules/pi-lens/skills/pi-lens-ast-grep/SKILL.md +12 -11
  328. package/node_modules/pi-lens/skills/pi-lens-lsp-navigation/SKILL.md +22 -22
  329. package/node_modules/pi-lens/skills/pi-lens-write-ast-grep-rule/SKILL.md +87 -116
  330. package/node_modules/pi-lens/skills/pi-lens-write-ast-grep-rule/reference.md +170 -0
  331. package/node_modules/pi-lens/skills/pi-lens-write-tree-sitter-rule/SKILL.md +3 -1
  332. package/node_modules/pi-lens/vendor/grammars/tree-sitter-cue.wasm +0 -0
  333. package/node_modules/pi-mcp-adapter/CHANGELOG.md +49 -0
  334. package/node_modules/pi-mcp-adapter/README.md +51 -6
  335. package/node_modules/pi-mcp-adapter/agent-dir.ts +12 -4
  336. package/node_modules/pi-mcp-adapter/cli.js +188 -5
  337. package/node_modules/pi-mcp-adapter/commands.ts +128 -22
  338. package/node_modules/pi-mcp-adapter/config.ts +28 -10
  339. package/node_modules/pi-mcp-adapter/direct-tools.ts +23 -19
  340. package/node_modules/pi-mcp-adapter/index.ts +219 -32
  341. package/node_modules/pi-mcp-adapter/init.ts +36 -4
  342. package/node_modules/pi-mcp-adapter/lifecycle.ts +315 -24
  343. package/node_modules/pi-mcp-adapter/mcp-auth-flow.ts +39 -6
  344. package/node_modules/pi-mcp-adapter/mcp-bearer-store.ts +387 -0
  345. package/node_modules/pi-mcp-adapter/mcp-callback-server.ts +27 -3
  346. package/node_modules/pi-mcp-adapter/mcp-code.ts +4 -0
  347. package/node_modules/pi-mcp-adapter/mcp-panel.ts +42 -13
  348. package/node_modules/pi-mcp-adapter/mcp-setup-panel.ts +2 -1
  349. package/node_modules/pi-mcp-adapter/metadata-cache.ts +46 -25
  350. package/node_modules/pi-mcp-adapter/package-mcp-loader.ts +168 -0
  351. package/node_modules/pi-mcp-adapter/package.json +4 -1
  352. package/node_modules/pi-mcp-adapter/proxy-modes.ts +5 -4
  353. package/node_modules/pi-mcp-adapter/request-headers-command.ts +330 -0
  354. package/node_modules/pi-mcp-adapter/search-ranking.ts +92 -22
  355. package/node_modules/pi-mcp-adapter/server-manager.ts +145 -2
  356. package/node_modules/pi-mcp-adapter/session-recovery.ts +7 -0
  357. package/node_modules/pi-mcp-adapter/tool-approval.ts +15 -2
  358. package/node_modules/pi-mcp-adapter/tool-metadata.ts +38 -18
  359. package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +44 -4
  360. package/node_modules/pi-mcp-adapter/types.ts +95 -10
  361. package/node_modules/pi-mcp-adapter/ui-server.ts +18 -16
  362. package/node_modules/pi-mcp-adapter/utils.ts +70 -0
  363. package/node_modules/pi-web-access/CHANGELOG.md +37 -0
  364. package/node_modules/pi-web-access/README.md +38 -14
  365. package/node_modules/pi-web-access/anysearch.ts +4 -2
  366. package/node_modules/pi-web-access/auth-fetch.ts +148 -0
  367. package/node_modules/pi-web-access/brave.ts +16 -4
  368. package/node_modules/pi-web-access/chrome-cookies.ts +110 -23
  369. package/node_modules/pi-web-access/curator-page.ts +8 -3
  370. package/node_modules/pi-web-access/curator-server.ts +5 -1
  371. package/node_modules/pi-web-access/exa.ts +18 -7
  372. package/node_modules/pi-web-access/extract.ts +134 -37
  373. package/node_modules/pi-web-access/fetch-params.ts +17 -3
  374. package/node_modules/pi-web-access/firecrawl.ts +172 -12
  375. package/node_modules/pi-web-access/gemini-search.ts +33 -7
  376. package/node_modules/pi-web-access/index.ts +160 -104
  377. package/node_modules/pi-web-access/package.json +2 -2
  378. package/node_modules/pi-web-access/page-query.ts +4 -2
  379. package/node_modules/pi-web-access/parallel-mcp.ts +249 -0
  380. package/node_modules/pi-web-access/parallel.ts +2 -2
  381. package/node_modules/pi-web-access/query-rewrite.ts +51 -0
  382. package/node_modules/pi-web-access/serper.ts +211 -0
  383. package/node_modules/pi-web-access/summary-model-scope.ts +12 -4
  384. package/node_modules/pi-web-access/summary-review.ts +51 -23
  385. package/node_modules/pi-web-access/tavily.ts +16 -4
  386. package/node_modules/pi-web-access/utils.ts +87 -0
  387. package/node_modules/pi-web-access/valyu.ts +199 -0
  388. package/node_modules/pi-web-access/youtube-extract.ts +2 -2
  389. package/package.json +13 -13
@@ -20,6 +20,7 @@
20
20
  * through the host's own render path (`ctx.ui.notify` / a display-only session
21
21
  * entry) — never a raw write.
22
22
  */
23
+ import { AsyncLocalStorage } from "node:async_hooks";
23
24
  import * as path from "node:path";
24
25
  import { isTestMode } from "./env-utils.js";
25
26
  import { getGlobalPiLensDir } from "./file-utils.js";
@@ -54,6 +55,11 @@ export function createSubsystemLogger(subsystem, defaultLevel = "debug") {
54
55
  }
55
56
  /** No-op with the `SubsystemLogger` shape, for the verbose-off branch. */
56
57
  export function noopSubsystemLogger() {
58
+ // SAFETY: `SubsystemLogger` is a callable with `error`/`warn`/`debug`
59
+ // properties. TypeScript cannot type a function literal that gains its
60
+ // properties on the following lines, so the cast runs ahead of the three
61
+ // assignments that complete the shape. Every member of the interface is
62
+ // assigned before `noop` escapes this function.
57
63
  const noop = (() => { });
58
64
  noop.error = () => { };
59
65
  noop.warn = () => { };
@@ -82,6 +88,267 @@ const CONSOLE_METHODS = [
82
88
  "dir",
83
89
  ];
84
90
  let consoleGuardInstalled = false;
91
+ /** The console methods captured before the patch, for an exact restore. */
92
+ const originalConsoleMethods = new Map();
93
+ /** The replacements this module installed, so uninstall never clobbers a later patch. */
94
+ const installedConsoleMethods = new Map();
95
+ /**
96
+ * The async capture window (#1434).
97
+ *
98
+ * The guard must catch pi-lens's own writes without swallowing the host's. pi's
99
+ * one-shot CLI commands print through `console.log`, so a permanent global
100
+ * reroute makes `pi list` print nothing in any project whose cwd loads the
101
+ * extension first. The store answers "is pi-lens executing right now?" and
102
+ * `AsyncLocalStorage` carries that answer into every promise, timer and
103
+ * callback created inside the window — so an async handler still captures after
104
+ * an `await`, while host code outside the window keeps its real sink.
105
+ *
106
+ * Built LAZILY (S1b, #1434 review): an active `AsyncLocalStorage` enables an
107
+ * async_hooks init hook for every promise in the process on Node 22 — the same
108
+ * hazard `tree-sitter-client.ts`'s `parseCacheMeasurement.disable()` comment
109
+ * documents — so constructing one at module scope taxes every `await` in the
110
+ * host even when the kill switch (`PI_LENS_CONSOLE_GUARD=0`) or test mode means
111
+ * the guard never installs and nothing ever reads the store. Construction is
112
+ * deferred to the first `runInConsoleCaptureWindow` call, and only happens once
113
+ * `installConsoleGuard()` has actually installed (never under the kill switch
114
+ * or test mode, since `consoleGuardInstalled` stays false in both).
115
+ */
116
+ let consoleCaptureStorage;
117
+ function getConsoleCaptureStorage() {
118
+ if (!consoleGuardInstalled)
119
+ return undefined;
120
+ if (consoleCaptureStorage === undefined) {
121
+ consoleCaptureStorage = new AsyncLocalStorage();
122
+ }
123
+ return consoleCaptureStorage;
124
+ }
125
+ /**
126
+ * Module evaluation is the one window `AsyncLocalStorage` cannot wrap: the
127
+ * module graph is evaluated by the loader, not by a pi-lens call. It is
128
+ * synchronous, so a plain flag is enough (#1333's original concern — a
129
+ * transitively loaded dependency writing during its own init).
130
+ */
131
+ let moduleLoadWindowOpen = false;
132
+ /**
133
+ * True while pi-lens owns execution, so console writes belong in the log.
134
+ *
135
+ * `consoleCaptureStorage` may not have been constructed yet (S1b) — that state
136
+ * means "no window was ever opened through `runInConsoleCaptureWindow`", i.e.
137
+ * the same as an empty store, so it reads as "no window" rather than throwing.
138
+ */
139
+ export function isConsoleCaptureActive() {
140
+ return (moduleLoadWindowOpen || consoleCaptureStorage?.getStore() === true);
141
+ }
142
+ /**
143
+ * Open the module-evaluation window. Called by `clients/console-guard-install.ts`
144
+ * before any other pi-lens module evaluates.
145
+ *
146
+ * The window closes explicitly at the end of `index.ts`. The backstop below
147
+ * closes it anyway if that never runs (an import throws, or the entry changes
148
+ * shape), because a leaked window would capture the host's output — the very
149
+ * bug this design fixes. Module evaluation is synchronous, so the end of the
150
+ * current macrotask is always past it. The timer is unref'd, so it can never
151
+ * hold a one-shot CLI process open (defect shape 4).
152
+ */
153
+ export function openModuleLoadConsoleWindow() {
154
+ if (moduleLoadWindowOpen)
155
+ return;
156
+ moduleLoadWindowOpen = true;
157
+ const backstop = setImmediate(() => {
158
+ moduleLoadWindowOpen = false;
159
+ });
160
+ backstop.unref?.();
161
+ }
162
+ /** Close the module-evaluation window. Idempotent. */
163
+ export function closeModuleLoadConsoleWindow() {
164
+ moduleLoadWindowOpen = false;
165
+ }
166
+ /**
167
+ * Run `fn` inside a capture window. Console writes from `fn`, and from anything
168
+ * `fn` schedules, go to the extension log instead of the terminal.
169
+ *
170
+ * When the guard was never installed (kill switch or test mode), there is
171
+ * nothing for a window to gate — `installConsoleGuard`'s own dispatcher is the
172
+ * only reader of `isConsoleCaptureActive()`, and it short-circuits before that
173
+ * call in both cases. Skip constructing the `AsyncLocalStorage` (S1b) and run
174
+ * `fn` directly.
175
+ */
176
+ export function runInConsoleCaptureWindow(fn) {
177
+ const storage = getConsoleCaptureStorage();
178
+ if (!storage)
179
+ return fn();
180
+ return storage.run(true, fn);
181
+ }
182
+ function inCaptureWindow(fn) {
183
+ // SAFETY: the wrapper forwards `this` and every argument to `fn` unchanged
184
+ // and returns its result unchanged, so it is call-compatible with `T` at
185
+ // runtime. TypeScript cannot prove that for a generic `T` it did not
186
+ // construct, because a variadic `(...args: unknown[]) => unknown` is not
187
+ // assignable to an arbitrary function type. The invariant is the
188
+ // pass-through itself: change the body to alter arguments or the return
189
+ // value and this cast stops being true.
190
+ return function (...args) {
191
+ return runInConsoleCaptureWindow(() => fn.apply(this, args));
192
+ };
193
+ }
194
+ /**
195
+ * True for every host API member that can hand pi-lens's own functions back to
196
+ * the host to be called later: `on(event, handler)` and any `register*`
197
+ * method (`registerTool`, `registerCommand`, `registerMessageRenderer`,
198
+ * `registerShortcut`, `registerFlag`, `registerMarkdownTransformer`,
199
+ * `registerEntryRenderer`, `registerProvider`, and any the host adds later).
200
+ *
201
+ * This is a DENY-LIST, not an allow-list (#1434 S1a review): every member
202
+ * matching this predicate gets its function arguments wrapped, with no
203
+ * per-method exemption. The earlier allow-list form (only `on` and
204
+ * `registerTool`) let the 9 `registerCommand` call sites and
205
+ * `registerMessageRenderer` bypass the window, regressing #1333 for those
206
+ * paths — a host callback fired for one of them would still write straight to
207
+ * the terminal.
208
+ */
209
+ function isCaptureSeam(prop) {
210
+ return prop === "on" || (typeof prop === "string" && prop.startsWith("register"));
211
+ }
212
+ /**
213
+ * Wrap every function value found in `value`, in place. Handles the two
214
+ * shapes a `register*`/`on` call takes today: a function passed directly
215
+ * (`on(event, handler)`, `registerMessageRenderer(type, fn)`), and a
216
+ * function ONE level inside a plain options/definition object
217
+ * (`options.handler`, `tool.execute`).
218
+ *
219
+ * Deliberately NOT recursive past that one level (#1434 perf review): a tool
220
+ * definition's `parameters`/`schema` is a large, deeply nested TypeBox object
221
+ * that holds no functions, but walking its full tree on every `registerTool`
222
+ * call — across every tool, on every extension activation, across the many
223
+ * test files that re-activate the extension per case — measurably slowed
224
+ * activation (a wiring test tripped its 5s budget under transform load; see
225
+ * the commit body for the measured before/after). Checking only the
226
+ * argument's own top-level keys is O(keys), independent of how deep an
227
+ * unrelated nested value's own structure goes, and covers every shape
228
+ * PI-LENS actually registers (`options.handler`, `tool.execute` — never two
229
+ * levels deep). It does NOT cover every shape the host's `ExtensionAPI` type
230
+ * permits: `registerProvider`'s `config.oauth.*` callbacks sit two levels
231
+ * deep and `config.models[]` sits behind a skipped array. pi-lens never
232
+ * calls `registerProvider`; extend the descent if that changes (same known-
233
+ * gap convention as the `pi.events` note in AGENTS.md).
234
+ *
235
+ * Mutates the object in place rather than copying — a spread copy would drop
236
+ * non-enumerable or prototype-carried members of a definition object (defect
237
+ * shape 5), and these definitions are pi-lens's own, built just above the
238
+ * register call.
239
+ */
240
+ function wrapFunctionsInPlace(value) {
241
+ if (typeof value === "function") {
242
+ return inCaptureWindow(value);
243
+ }
244
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
245
+ return value;
246
+ }
247
+ const obj = value;
248
+ for (const key of Object.keys(obj)) {
249
+ const propValue = obj[key];
250
+ if (typeof propValue === "function") {
251
+ assignWrapped(obj, key, propValue);
252
+ }
253
+ }
254
+ return value;
255
+ }
256
+ /**
257
+ * Assign a wrapped function back onto `obj[key]`, degrading instead of
258
+ * throwing or dropping the registration when the property resists (S2b).
259
+ * ESM is always strict mode, so assigning into a non-writable data property
260
+ * throws a `TypeError`; `Object.defineProperty` is tried next (it can
261
+ * redefine a configurable-but-non-writable property); if both fail the
262
+ * property is frozen solid, so the ORIGINAL unwrapped function is left in
263
+ * place — the registration still succeeds, just without the console-capture
264
+ * net for that one callback, which is strictly better than the tool/command
265
+ * never registering at all.
266
+ */
267
+ function assignWrapped(obj, key, fn) {
268
+ const wrapped = inCaptureWindow(fn);
269
+ try {
270
+ obj[key] = wrapped;
271
+ return;
272
+ }
273
+ catch {
274
+ // Non-writable data property — fall through to defineProperty.
275
+ }
276
+ try {
277
+ Object.defineProperty(obj, key, {
278
+ value: wrapped,
279
+ writable: true,
280
+ configurable: true,
281
+ enumerable: true,
282
+ });
283
+ }
284
+ catch {
285
+ // Frozen solid: leave the original unwrapped function in place rather
286
+ // than throwing (which would abort the whole register call) or silently
287
+ // dropping it.
288
+ }
289
+ }
290
+ /**
291
+ * Wrap the host extension API so every pi-lens entry point runs in a capture
292
+ * window.
293
+ *
294
+ * pi calls our event handlers and tool bodies from its own async context, so a
295
+ * window opened during registration does not reach them. Wrapping every
296
+ * `register*`/`on` seam (see `isCaptureSeam`) covers every current and future
297
+ * handler from one place, instead of a hand-maintained list of call sites.
298
+ * Everything else forwards untouched, except it is bound to `target` (S3a) so
299
+ * a destructured reference (`const { getFlag } = pi`) keeps working, and
300
+ * wrapper functions are memoized per-proxy in `wrapperCache` (S3b) so
301
+ * `proxy.on === proxy.on` — code that compares handler identity, or a test
302
+ * asserting a mock was called with a specific function reference across two
303
+ * reads of the same property, sees a stable value.
304
+ */
305
+ export function withConsoleCaptureWindows(api) {
306
+ const wrapperCache = new Map();
307
+ const proxy = new Proxy(api, {
308
+ get(target, prop) {
309
+ // A non-configurable, non-writable OWN data property is a proxy
310
+ // invariant: the get trap MUST return the exact value the target
311
+ // holds, or the engine throws a TypeError on read. Degrade to the raw
312
+ // value instead of tripping that invariant (S2a) — a frozen host API
313
+ // loses the capture window for that member, but keeps working.
314
+ const descriptor = Reflect.getOwnPropertyDescriptor(target, prop);
315
+ if (descriptor && descriptor.writable === false && descriptor.configurable === false) {
316
+ return descriptor.value;
317
+ }
318
+ const cached = wrapperCache.get(prop);
319
+ if (cached !== undefined)
320
+ return cached;
321
+ const value = Reflect.get(target, prop, target);
322
+ if (typeof value !== "function")
323
+ return value;
324
+ const method = value;
325
+ // A host that returns `this` for chaining would hand back the raw API,
326
+ // so a chained `on(...).on(...)` would register an unwrapped handler.
327
+ // Keep the proxy on the chain.
328
+ const keepProxy = (result) => Object.is(result, target) ? proxy : result;
329
+ // Pass-through members are cached too (S3a/S3b: `proxy.getFlag ===
330
+ // proxy.getFlag`), but the cached wrapper re-reads `target[prop]` on
331
+ // EVERY call rather than closing over `method` -- a plain
332
+ // `method.bind(target)` pins the function reference captured at first
333
+ // access, so a host (or a test simulating one) that reassigns its own
334
+ // method after registration would silently keep calling the stale one.
335
+ // Re-reading keeps the cached wrapper's identity stable while staying
336
+ // live to whatever `target[prop]` currently is.
337
+ const wrapper = isCaptureSeam(prop)
338
+ ? (...args) => {
339
+ const wrapped = args.map((arg) => wrapFunctionsInPlace(arg));
340
+ return keepProxy(method.apply(target, wrapped));
341
+ }
342
+ : (...args) => {
343
+ const current = Reflect.get(target, prop, target);
344
+ return current.apply(target, args);
345
+ };
346
+ wrapperCache.set(prop, wrapper);
347
+ return wrapper;
348
+ },
349
+ });
350
+ return proxy;
351
+ }
85
352
  function formatConsoleArgs(args) {
86
353
  return args
87
354
  .map((arg) => {
@@ -104,6 +371,12 @@ function formatConsoleArgs(args) {
104
371
  * mirror of `mcp/server.ts`'s `console.log = console.error` guard, which
105
372
  * protects the JSON-RPC stdout channel for the same structural reason.
106
373
  *
374
+ * The patch is a DISPATCHER, not a permanent reroute (#1434). It sends a write
375
+ * to the extension log only while pi-lens owns execution; every other write
376
+ * goes to the original console method. pi's own one-shot CLI commands print
377
+ * through `console.log`, so an unconditional reroute silenced them: `pi list`
378
+ * exited 0 with no output in any project whose cwd loaded the extension first.
379
+ *
107
380
  * This is a NET, not the fix: pi-lens's own sites are migrated to real sinks
108
381
  * with real schemas. Idempotent, and inert under test mode (vitest owns the
109
382
  * console) and under `PI_LENS_CONSOLE_GUARD=0`.
@@ -118,11 +391,23 @@ export function installConsoleGuard() {
118
391
  if (process.env.PI_LENS_CONSOLE_GUARD === "0")
119
392
  return false;
120
393
  consoleGuardInstalled = true;
394
+ // SAFETY: re-views `console` as a string-keyed record so the loop below can
395
+ // read and replace methods by name. `ConsoleMethod` is the union of keys
396
+ // that exist on `Console`, and each read is guarded by `typeof original ===
397
+ // "function"` before use, so a host whose console lacks a method is skipped
398
+ // rather than patched with undefined.
121
399
  const target = console;
122
400
  for (const method of CONSOLE_METHODS) {
123
- if (typeof target[method] !== "function")
401
+ const original = target[method];
402
+ if (typeof original !== "function")
124
403
  continue;
125
- target[method] = (...args) => {
404
+ const originalFn = original;
405
+ originalConsoleMethods.set(method, originalFn);
406
+ const replacement = (...args) => {
407
+ if (!isConsoleCaptureActive()) {
408
+ originalFn.apply(console, args);
409
+ return;
410
+ }
126
411
  logExtension({
127
412
  subsystem: "console",
128
413
  level: method === "warn" ? "warn" : method === "error" ? "error" : "debug",
@@ -130,10 +415,39 @@ export function installConsoleGuard() {
130
415
  metadata: { method },
131
416
  });
132
417
  };
418
+ installedConsoleMethods.set(method, replacement);
419
+ target[method] = replacement;
420
+ }
421
+ return true;
422
+ }
423
+ /**
424
+ * Restore the exact console methods captured at install time.
425
+ *
426
+ * A method someone else patched after us is left alone — restoring it would
427
+ * clobber their replacement. Returns true when this call uninstalled.
428
+ */
429
+ export function uninstallConsoleGuard() {
430
+ if (!consoleGuardInstalled)
431
+ return false;
432
+ consoleGuardInstalled = false;
433
+ // SAFETY: same re-view as `installConsoleGuard`. Only keys this module
434
+ // recorded in `originalConsoleMethods` at install time are written back,
435
+ // and only when the current value is still the replacement this module
436
+ // installed, so a method someone else patched afterwards is left alone.
437
+ const target = console;
438
+ for (const [method, original] of originalConsoleMethods) {
439
+ if (target[method] === installedConsoleMethods.get(method)) {
440
+ target[method] = original;
441
+ }
133
442
  }
443
+ originalConsoleMethods.clear();
444
+ installedConsoleMethods.clear();
134
445
  return true;
135
446
  }
136
- /** Test-only: forget that the guard was installed. */
447
+ /** Test-only: uninstall the guard and close every open capture window. */
137
448
  export function _resetConsoleGuardForTests() {
449
+ uninstallConsoleGuard();
138
450
  consoleGuardInstalled = false;
451
+ consoleCaptureStorage = undefined;
452
+ moduleLoadWindowOpen = false;
139
453
  }
@@ -25,6 +25,7 @@ export const KIND_EXTENSIONS = {
25
25
  ".sass",
26
26
  ".scss",
27
27
  ],
28
+ cue: [".cue"],
28
29
  // From llvm-project/clang/lib/Driver/Types.cpp clang::driver::types::lookupTypeForExtension:
29
30
  cxx: [
30
31
  // C
@@ -260,8 +261,10 @@ for (const [kind, exts] of Object.entries(KIND_EXTENSIONS)) {
260
261
  }
261
262
  }
262
263
  }
263
- // Special filenames that indicate a file kind
264
- const SPECIAL_FILENAMES = [
264
+ // Special filenames that indicate a file kind. Exported so other seams that
265
+ // classify by basename (e.g. lsp/language.ts's language-id resolution) derive
266
+ // from this list instead of hand-keeping their own basename literals (#1594).
267
+ export const SPECIAL_FILENAMES = [
265
268
  { pattern: /^CMakeLists\.txt$/i, kind: "cmake" },
266
269
  { pattern: /^Makefile$/i, kind: "shell" },
267
270
  { pattern: /^Dockerfile(\.\w+)?$/i, kind: "docker" },
@@ -336,6 +339,7 @@ export const CODE_KINDS = new Set([
336
339
  "clojure",
337
340
  "cmake",
338
341
  "csharp",
342
+ "cue",
339
343
  "cxx",
340
344
  "dart",
341
345
  "docker",
@@ -434,6 +438,7 @@ export function getFileKindLabel(kind) {
434
438
  gleam: "Gleam",
435
439
  ocaml: "OCaml",
436
440
  clojure: "Clojure",
441
+ cue: "CUE",
437
442
  terraform: "Terraform",
438
443
  terragrunt: "Terragrunt",
439
444
  nix: "Nix",
@@ -504,6 +509,7 @@ export function getLanguageId(kind) {
504
509
  gleam: "gleam",
505
510
  ocaml: "ocaml",
506
511
  clojure: "clojure",
512
+ cue: "cue",
507
513
  terraform: "terraform",
508
514
  terragrunt: "terragrunt",
509
515
  nix: "nix",