@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
@@ -0,0 +1,22 @@
1
+ /** Process-lifetime history of successful LSP spawn plus initialize durations. */
2
+ const MAX_SERVER_HISTORIES = 64;
3
+ const successfulSpawnDurationMs = new Map();
4
+ export function recordSuccessfulLspSpawn(serverId, durationMs) {
5
+ if (!Number.isFinite(durationMs) || durationMs < 0)
6
+ return;
7
+ successfulSpawnDurationMs.delete(serverId);
8
+ successfulSpawnDurationMs.set(serverId, durationMs);
9
+ while (successfulSpawnDurationMs.size > MAX_SERVER_HISTORIES) {
10
+ const oldest = successfulSpawnDurationMs.keys().next().value;
11
+ if (oldest === undefined)
12
+ break;
13
+ successfulSpawnDurationMs.delete(oldest);
14
+ }
15
+ }
16
+ export function getSuccessfulLspSpawnDurationMs(serverId) {
17
+ return successfulSpawnDurationMs.get(serverId);
18
+ }
19
+ /** Test-only: isolate process-lifetime history between cases. */
20
+ export function _clearSuccessfulLspSpawnHistoryForTests() {
21
+ successfulSpawnDurationMs.clear();
22
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * LSP `textDocument/didChange` sync-kind negotiation (#1669).
3
+ *
4
+ * A server advertises how it wants document changes described via
5
+ * `ServerCapabilities.textDocumentSync`, either as a bare
6
+ * `TextDocumentSyncKind` number (the legacy pre-3.0 shape) or as a
7
+ * `TextDocumentSyncOptions` object whose `change` field carries the kind.
8
+ * pi-lens always sent a single whole-document `{ text }` change event — valid
9
+ * for `Full` (1) and harmless for `None` (0, since the server ignores content
10
+ * changes entirely), but out of spec for `Incremental` (2): an
11
+ * Incremental-only server expects every change event to carry a `range`.
12
+ *
13
+ * This module is the pure negotiation core, mirroring `position-encoding.ts`'s
14
+ * shape: read the kind from the server's `initialize` reply, defaulting to
15
+ * `Full` when the server doesn't advertise one — the same shape pi-lens has
16
+ * always sent, so an unrecognized/absent value never regresses `Full`/`None`
17
+ * behavior.
18
+ */
19
+ export const TEXT_DOCUMENT_SYNC_KIND_NONE = 0;
20
+ export const TEXT_DOCUMENT_SYNC_KIND_FULL = 1;
21
+ export const TEXT_DOCUMENT_SYNC_KIND_INCREMENTAL = 2;
22
+ function isSyncKind(value) {
23
+ return value === 0 || value === 1 || value === 2;
24
+ }
25
+ /**
26
+ * The `change` sync kind the server negotiated, read from its `initialize`
27
+ * reply. Defaults to `Full` (pi-lens's historical always-whole-document
28
+ * behavior) when the server omits `textDocumentSync` entirely, or advertises
29
+ * a shape/value this function doesn't recognize.
30
+ */
31
+ export function negotiateSyncKind(serverCapabilities) {
32
+ const sync = serverCapabilities?.textDocumentSync;
33
+ // Legacy shape: the whole field IS the kind.
34
+ if (isSyncKind(sync))
35
+ return sync;
36
+ // 3.0+ shape: `TextDocumentSyncOptions.change`.
37
+ if (sync && typeof sync === "object") {
38
+ const change = sync.change;
39
+ if (isSyncKind(change))
40
+ return change;
41
+ }
42
+ return TEXT_DOCUMENT_SYNC_KIND_FULL;
43
+ }
@@ -32,10 +32,182 @@
32
32
  * `undefined`). The caller must handle `undefined` as "sync path unavailable,
33
33
  * fall back to existing unconfirmed/timed-out behavior".
34
34
  */
35
+ import { logLatency } from "../latency-logger.js";
36
+ import { normalizeMapKey } from "../path-utils.js";
35
37
  // ---------------------------------------------------------------------------
36
38
  // Constants
37
39
  // ---------------------------------------------------------------------------
38
40
  export const TSSERVER_REQUEST_COMMAND = "typescript.tsserverRequest";
41
+ /**
42
+ * tsserver's synthetic inferred-project name, as its own source builds it:
43
+ * `"/dev/null/inferredProject" + counter + "*"`. `/dev/null` is a deliberate
44
+ * sentinel prefix — no real config file can live there — and matching the WHOLE
45
+ * string against it is the only safe test.
46
+ *
47
+ * #1645 review F4: an earlier version also matched an UNANCHORED
48
+ * `/inferred[-_ ]?project/i` anywhere in the string. That inverted the verdict
49
+ * for a real project in a directory a human happened to name that way —
50
+ * `/repo/inferred-project/tsconfig.json` classified as INFERRED, which demoted
51
+ * its genuine blocking errors. A classifier that gates authority must never key
52
+ * off user-controlled directory names.
53
+ *
54
+ * The optional drive-letter/backslash arm covers a host that normalizes the
55
+ * sentinel through win32 path handling before it reaches us; the `/dev/null`
56
+ * prefix is still required.
57
+ */
58
+ const INFERRED_PROJECT_SENTINEL = /^(?:[A-Za-z]:)?[/\\]dev[/\\]null[/\\]inferredProject\d*\*?$/i;
59
+ /**
60
+ * Classify one tsserver `projectInfo` response body.
61
+ *
62
+ * `configFileName` is tsserver's own answer to "which project owns this file".
63
+ * A real project answers with a `tsconfig.json`/`jsconfig.json` path; a file
64
+ * that matches no project's `include`/`files` lands in tsserver's synthetic
65
+ * inferred project, whose `configFileName` is a `/dev/null/inferredProject1*`
66
+ * placeholder. The two are the same field, so the placeholder shape is the only
67
+ * thing that separates "checked against the project's real compiler options"
68
+ * from "checked against defaults nobody configured" (#1640).
69
+ *
70
+ * Exported so the diagnostic-demotion seam (`inferred-project.ts`) and the
71
+ * #1412 telemetry probe share ONE classifier — a second hand-rolled
72
+ * configFileName test would be a parallel source of truth for the same verdict.
73
+ */
74
+ export function classifyProjectInfo(body) {
75
+ if (!body || typeof body !== "object") {
76
+ return { projectKind: "unassociated", association: "unassociated" };
77
+ }
78
+ const info = body;
79
+ const configFile = typeof info.configFileName === "string" && info.configFileName.length > 0
80
+ ? info.configFileName
81
+ : undefined;
82
+ const inferred = configFile
83
+ ? INFERRED_PROJECT_SENTINEL.test(configFile)
84
+ : false;
85
+ const projectKind = configFile
86
+ ? inferred
87
+ ? "inferred"
88
+ : /(?:^|[/\\])(?:tsconfig|jsconfig)\.json$/i.test(configFile)
89
+ ? "configured"
90
+ : "unassociated"
91
+ : "unassociated";
92
+ return {
93
+ projectKind,
94
+ ...(configFile ? { configFile } : {}),
95
+ association: info.languageServiceDisabled === true
96
+ ? "language-service-disabled"
97
+ : projectKind === "unassociated"
98
+ ? "unassociated"
99
+ : "associated",
100
+ };
101
+ }
102
+ /**
103
+ * #1412: after classic TypeScript's first successful didOpen, sample the
104
+ * tsserver project association without delaying diagnostics. The supplied
105
+ * executeCommand channel owns the existing bounded anti-deadlock backstop.
106
+ */
107
+ export async function probeTsserverProjectIdentity(options) {
108
+ const normalizedFile = options.normalizedFile ?? normalizeMapKey(options.file);
109
+ const startedAt = Date.now();
110
+ // Logging starts only once a probe is actually eligible and attempted:
111
+ // ineligible servers (wrong serverId/launchVariant, no command channel) and
112
+ // already-probed dedupe are both routine, high-volume, and per-server — a
113
+ // bare return keeps them out of the telemetry stream entirely instead of
114
+ // writing an `lsp_typescript_project_identity` row per didOpen on every
115
+ // server (python, go, opengrep, ...).
116
+ const logOutcome = (outcome, metadata = {}) => logLatency({
117
+ type: "phase", phase: "lsp_typescript_project_identity", filePath: normalizedFile,
118
+ durationMs: Date.now() - startedAt,
119
+ metadata: { serverId: options.serverId, launchVariant: options.launchVariant, clientRoot: options.clientRoot, outcome, ...metadata },
120
+ });
121
+ if (options.serverId !== "typescript" ||
122
+ options.launchVariant !== "classic" ||
123
+ typeof options.commandChannel.executeCommand !== "function") {
124
+ return;
125
+ }
126
+ if (options.probedFiles.has(normalizedFile))
127
+ return;
128
+ // Claim before yielding so concurrent opens cannot issue duplicate probes.
129
+ options.probedFiles.add(normalizedFile);
130
+ try {
131
+ const outcome = await options.commandChannel.executeCommand(TSSERVER_REQUEST_COMMAND, ["projectInfo", { file: options.file, needFileNameList: false }]);
132
+ if (!outcome.executed) {
133
+ logOutcome("not-executed");
134
+ return;
135
+ }
136
+ const response = outcome.result;
137
+ if (!response) {
138
+ logOutcome("no-response");
139
+ return;
140
+ }
141
+ if (response.success !== true) {
142
+ logOutcome("unsuccessful");
143
+ return;
144
+ }
145
+ const identity = classifyProjectInfo(response.body);
146
+ logLatency({
147
+ type: "phase",
148
+ phase: "lsp_typescript_project_identity",
149
+ filePath: normalizedFile,
150
+ durationMs: Date.now() - startedAt,
151
+ metadata: {
152
+ outcome: "ok",
153
+ serverId: options.serverId,
154
+ launchVariant: options.launchVariant,
155
+ clientRoot: options.clientRoot,
156
+ projectKind: identity.projectKind,
157
+ configFile: identity.configFile,
158
+ association: identity.association,
159
+ },
160
+ });
161
+ }
162
+ catch {
163
+ logOutcome("threw");
164
+ // Best-effort telemetry: command errors/timeouts never reach diagnostics.
165
+ }
166
+ }
167
+ /**
168
+ * #1640: ask tsserver which project owns `file`, on demand, through the same
169
+ * `typescript.tsserverRequest` escape hatch the sync-diagnostics helpers use.
170
+ *
171
+ * Unlike {@link probeTsserverProjectIdentity} — fire-and-forget telemetry
172
+ * sampled once per didOpen — this is a request/response call a caller awaits
173
+ * because it needs the answer to decide how to RENDER a diagnostic.
174
+ *
175
+ * Routed through `executeReadOnlyCommandOnLiveClient` ONLY, never
176
+ * `executeCommand` (#1645 review F1/F2). The mutation channel would open the
177
+ * `workspace/applyEdit` acceptance window, clobber a concurrent command's
178
+ * `activeMutationContext`, carry the 30s mutation backstop instead of the short
179
+ * probe one, and spawn a language-server fleet to answer. All four are wrong for
180
+ * a passive render-path question. A service without the read-only channel is
181
+ * UNKNOWN, not a reason to fall back.
182
+ *
183
+ * Returns `undefined` for every "we do not know" path: no read-only channel, no
184
+ * live server for the file, the command is not advertised (non-classic server,
185
+ * older typescript-language-server), the command was not executed, the response
186
+ * envelope is not `{success:true}`, or the call threw/timed out. `undefined`
187
+ * must never be treated as "inferred" — an unanswered probe is not a verdict
188
+ * (AGENTS.md shape 10: an empty result must distinguish clean from unavailable).
189
+ */
190
+ export async function fetchTsserverProjectIdentity(svc, file) {
191
+ try {
192
+ if (typeof svc.executeReadOnlyCommandOnLiveClient !== "function") {
193
+ return undefined;
194
+ }
195
+ // No `getAdvertisedCommands` pre-flight: that helper routes through
196
+ // `getClientForFile`, which SPAWNS. The read-only channel already enforces
197
+ // allowlist-by-advertisement server-side and answers `executed:false` for
198
+ // a server that never advertised the command.
199
+ const outcome = await svc.executeReadOnlyCommandOnLiveClient(file, TSSERVER_REQUEST_COMMAND, ["projectInfo", { file, needFileNameList: false }]);
200
+ if (!outcome.executed)
201
+ return undefined;
202
+ const response = outcome.result;
203
+ if (!response || response.success !== true)
204
+ return undefined;
205
+ return classifyProjectInfo(response.body);
206
+ }
207
+ catch {
208
+ return undefined;
209
+ }
210
+ }
39
211
  // ---------------------------------------------------------------------------
40
212
  // Helpers
41
213
  // ---------------------------------------------------------------------------
@@ -26,7 +26,7 @@ export function classifyServerWaitTier(serverId, snapshot) {
26
26
  return "pull-capable";
27
27
  if (mode !== "push-only")
28
28
  return "waits";
29
- const strategy = getStrategy(serverId);
29
+ const strategy = getStrategy(serverId, snapshot.launchVariant);
30
30
  if (strategy.silentOnClean !== true)
31
31
  return "waits"; // 2*/unknown push-only
32
32
  // #524/#529/#541/#558: `silentOnClean` on a server-id-keyed strategy is
@@ -44,6 +44,24 @@ export function classifyServerWaitTier(serverId, snapshot) {
44
44
  return "waits";
45
45
  return "tier3-silent";
46
46
  }
47
+ /**
48
+ * Resolve `filePath`'s PRIMARY (non-auxiliary) server id and its live
49
+ * capability snapshot, or `undefined` when the file has no primary server
50
+ * configured. The single place that decides what "this file's server" means
51
+ * for wait-policy purposes — shared by {@link classifyCascadeWaitTier} and the
52
+ * cascade-lane wrapper in `clients/lsp/cascade-tier.ts`, which needs the same
53
+ * id/snapshot pair to apply its one cascade-only override.
54
+ */
55
+ export function resolvePrimaryServerForWaitPolicy(filePath, snapshots) {
56
+ const servers = getServersForFileWithConfig(filePath).filter((s) => s.role !== "auxiliary");
57
+ const primary = servers[0];
58
+ if (!primary)
59
+ return undefined;
60
+ return {
61
+ serverId: primary.id,
62
+ snapshot: snapshots.find((s) => s.serverId === primary.id),
63
+ };
64
+ }
47
65
  /**
48
66
  * Classify whether `filePath`'s PRIMARY language server is a cascade-lane
49
67
  * Tier-3 (push-only, silent-on-clean) server. Ambiguous or missing capability
@@ -54,10 +72,8 @@ export function classifyServerWaitTier(serverId, snapshot) {
54
72
  */
55
73
  export function classifyCascadeWaitTier(lspService, filePath, snapshots) {
56
74
  void lspService; // kept in the signature for call-site clarity/typing only
57
- const servers = getServersForFileWithConfig(filePath).filter((s) => s.role !== "auxiliary");
58
- const primary = servers[0];
75
+ const primary = resolvePrimaryServerForWaitPolicy(filePath, snapshots);
59
76
  if (!primary)
60
77
  return "waits";
61
- const snapshot = snapshots.find((s) => s.serverId === primary.id);
62
- return classifyServerWaitTier(primary.id, snapshot);
78
+ return classifyServerWaitTier(primary.serverId, primary.snapshot);
63
79
  }
@@ -138,7 +138,8 @@ export const SERVER_DIAGNOSTIC_STRATEGIES = {
138
138
  // (#242), so on a 2500ms-capped edit opengrep waits min(2500, 3500)=2500
139
139
  // and on uncapped paths it gets its full 3500. 3500 covers warm and most
140
140
  // cold; a cold scan that overruns isn't lost — late diagnostics are cached
141
- // and surface on the next edit.
141
+ // and surface on the next unchanged-content read through the content-bound
142
+ // auxiliary carry-over path.
142
143
  opengrep: {
143
144
  seedFirstPush: false,
144
145
  pullRetryBudgetMs: 0,
@@ -174,7 +175,8 @@ export const SERVER_DIAGNOSTIC_STRATEGIES = {
174
175
  // reopen-on-resync. A native single-workflow audit is sub-second offline;
175
176
  // online mode may add a GitHub-API round-trip, so 2000ms gives headroom
176
177
  // (bounded by the per-edit caller cap as a ceiling, #242), and any late online
177
- // finding is cached and surfaces on the next edit.
178
+ // finding can surface on the next unchanged-content read through the
179
+ // content-bound auxiliary carry-over path.
178
180
  zizmor: {
179
181
  seedFirstPush: true,
180
182
  pullRetryBudgetMs: 0,
@@ -230,6 +232,59 @@ export const SERVER_DIAGNOSTIC_STRATEGIES = {
230
232
  // warm-up attempt and its retry, with zero diagnostics either time).
231
233
  silentOnClean: true,
232
234
  },
235
+ // cue lsp serve (#1522, #1519, #1520). Measured directly against the real
236
+ // v0.17.1 binary (`getWorkspaceDiagnosticsSupport` reports
237
+ // `mode: "push-only"`; no pull support advertised).
238
+ //
239
+ // It reports load/parse (syntax) errors as you type, but leaves
240
+ // conflicting-value/constraint-failure (evaluation) errors to `cue vet`
241
+ // — the #1522 cue-vet auxiliary runner covers that gap. So the syntax
242
+ // diagnostics this strategy governs are a REAL but PARTIAL signal, not
243
+ // full CUE validation.
244
+ //
245
+ // silentOnClean: true — the load-bearing finding. A cold `didOpen` on an
246
+ // already-CLEAN file publishes NOTHING inside the wait budget (measured:
247
+ // `touchFile` returns `inconclusive: true, inconclusiveReason:
248
+ // "diagnostics-wait"` after the full budget, never an affirmative empty
249
+ // array). This reproduces the #1520 review's original "reports
250
+ // conclusively clean while still waiting" concern for the clean-cold-open
251
+ // case specifically. It is NOT silent on every transition, though: once a
252
+ // document is open and a `didChange` lands, the server DOES publish —
253
+ // both the error (edit clean→broken: confirmed, ~930ms warm) and an
254
+ // explicit empty array clearing it (edit broken→clean: confirmed,
255
+ // ~320ms warm, `contentHash`-bound). That edit-triggered empty publish is
256
+ // exactly what the shared push-only clean-confirm gate needs
257
+ // `silentOnClean` for — it only ever governs the "no publish, notify
258
+ // succeeded" case, never a case that already got a real publish.
259
+ //
260
+ // seedFirstPush: true — the one cold-open case that DOES publish (a
261
+ // file that is already broken) sends the complete single diagnostic on
262
+ // its first push; there is no observed partial-then-complete sequence to
263
+ // wait out.
264
+ //
265
+ // aggregateWaitMs: 2000 covers the measured warm edit-to-publish latency
266
+ // (~930ms, syntax reparse) with margin; a cold spawn's first push (~2.1s
267
+ // end-to-end including process start) is bounded separately by
268
+ // maxClientWaitMs, not this per-diagnostics budget.
269
+ cue: {
270
+ seedFirstPush: true,
271
+ pullRetryBudgetMs: 0,
272
+ debounceMs: 150,
273
+ aggregateWaitMs: 2000,
274
+ expectSemanticSecondPush: false,
275
+ reopenOnResync: false,
276
+ silentOnClean: true,
277
+ },
278
+ };
279
+ /** Native TS7 can publish multiple versionless partial-program snapshots for a
280
+ * single open. Its first push is therefore provisional; a quiet window, rather
281
+ * than a protocol-unstable publication count, establishes the settled push. */
282
+ const NATIVE_TS7_DIAGNOSTIC_STRATEGY = {
283
+ ...SERVER_DIAGNOSTIC_STRATEGIES.typescript,
284
+ seedFirstPush: false,
285
+ // Native TS7 demonstrably publishes on clean, so the classic-only marker
286
+ // must not leak through the shared server id.
287
+ silentOnClean: false,
233
288
  };
234
289
  /** Fallback for unknown servers. Conservative defaults. */
235
290
  export const DEFAULT_STRATEGY = {
@@ -239,6 +294,9 @@ export const DEFAULT_STRATEGY = {
239
294
  aggregateWaitMs: 1500,
240
295
  expectSemanticSecondPush: false,
241
296
  };
242
- export function getStrategy(serverId) {
297
+ export function getStrategy(serverId, launchVariant) {
298
+ if (serverId === "typescript" && launchVariant === "native-ts7") {
299
+ return NATIVE_TS7_DIAGNOSTIC_STRATEGY;
300
+ }
243
301
  return SERVER_DIAGNOSTIC_STRATEGIES[serverId] ?? DEFAULT_STRATEGY;
244
302
  }