@herbertgao/pi-extensions 2026.8.11 → 2026.8.13

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 (476) hide show
  1. package/README.md +23 -10
  2. package/{node_modules/@herbertgao/pi-mermaid-open/LICENSE → THIRD_PARTY_NOTICES.md} +19 -1
  3. package/node_modules/@czottmann/pi-automode/CHANGELOG.md +15 -0
  4. package/node_modules/@czottmann/pi-automode/README.md +5 -3
  5. package/node_modules/@czottmann/pi-automode/docs/adr/ADR-001-permission-precedence-and-trust-boundaries.md +2 -0
  6. package/node_modules/@czottmann/pi-automode/docs/adr/ADR-002-global-config-in-extension-data-directory.md +60 -0
  7. package/node_modules/@czottmann/pi-automode/docs/adr/INDEX.md +1 -0
  8. package/node_modules/@czottmann/pi-automode/docs/automode-classifier-flow.md +4 -4
  9. package/node_modules/@czottmann/pi-automode/docs/configuration.md +20 -4
  10. package/node_modules/@czottmann/pi-automode/docs/observability-logging.md +1 -1
  11. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/bash.ts +692 -0
  12. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/config.ts +181 -3
  13. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/constants.ts +4 -1
  14. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/extension.ts +143 -36
  15. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/hard-deny.ts +103 -148
  16. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/paths.ts +32 -6
  17. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/permissions.ts +344 -22
  18. package/node_modules/@czottmann/pi-automode/extensions/auto-mode.ts +1 -0
  19. package/node_modules/@czottmann/pi-automode/package.json +4 -1
  20. package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +2 -1
  21. package/node_modules/@herbertgao/pi-cc-extensions/README.md +2 -1
  22. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +4 -0
  23. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +21 -1
  24. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/agent-summary/core.ts +1 -1
  25. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +19 -19
  26. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +4 -2
  27. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +2 -1
  28. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +10 -2
  29. package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
  30. package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +10 -0
  31. package/node_modules/@herbertgao/pi-subagents/README.md +21 -15
  32. package/node_modules/@herbertgao/pi-subagents/package.json +3 -3
  33. package/node_modules/@herbertgao/pi-subagents/src/agent-file-toggle.ts +11 -8
  34. package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +184 -106
  35. package/node_modules/@herbertgao/pi-subagents/src/cross-extension-rpc.ts +31 -11
  36. package/node_modules/@herbertgao/pi-subagents/src/custom-agents.ts +9 -1
  37. package/node_modules/@herbertgao/pi-subagents/src/index.ts +156 -31
  38. package/node_modules/@herbertgao/pi-subagents/src/invocation-config.ts +17 -0
  39. package/node_modules/@herbertgao/pi-subagents/src/model-resolver.ts +14 -0
  40. package/node_modules/@herbertgao/pi-subagents/src/schedule.ts +8 -0
  41. package/node_modules/@herbertgao/pi-subagents/src/settings.ts +32 -1
  42. package/node_modules/@herbertgao/pi-subagents/src/types.ts +17 -2
  43. package/node_modules/@herbertgao/pi-subagents/src/ui/agent-widget.ts +23 -2
  44. package/node_modules/@herbertgao/pi-subagents/src/ui/conversation-viewer.ts +259 -24
  45. package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +2 -2
  46. package/node_modules/@luxusai/pi-hindsight/CHANGELOG.md +376 -0
  47. package/node_modules/@luxusai/pi-hindsight/README.md +92 -0
  48. package/node_modules/@luxusai/pi-hindsight/docs/adr/001-memory-lifecycle-and-scope.md +56 -0
  49. package/node_modules/@luxusai/pi-hindsight/docs/adr/002-explicit-routing-strategy-seam.md +169 -0
  50. package/node_modules/@luxusai/pi-hindsight/docs/adr/003-tui-memory-mode-vocabulary.md +107 -0
  51. package/node_modules/@luxusai/pi-hindsight/docs/adr/004-lifeos-dual-bank-design.md +89 -0
  52. package/node_modules/@luxusai/pi-hindsight/docs/adr/005-domain-banks-and-agent-first-surface.md +189 -0
  53. package/node_modules/@luxusai/pi-hindsight/docs/assets/logos/pi-hindsight-logo-dark.webp +0 -0
  54. package/node_modules/@luxusai/pi-hindsight/docs/assets/logos/pi-hindsight-logo-dark@2x.webp +0 -0
  55. package/node_modules/@luxusai/pi-hindsight/docs/coding-memory-evaluation.md +54 -0
  56. package/node_modules/@luxusai/pi-hindsight/docs/compatibility.md +75 -0
  57. package/node_modules/@luxusai/pi-hindsight/docs/hindsight-core-functions.md +300 -0
  58. package/node_modules/@luxusai/pi-hindsight/docs/mission-and-mental-model-quality.md +158 -0
  59. package/node_modules/@luxusai/pi-hindsight/docs/next-opt-out-design.md +164 -0
  60. package/node_modules/@luxusai/pi-hindsight/docs/risky-memory-modes.md +139 -0
  61. package/node_modules/@luxusai/pi-hindsight/docs/starter-mental-model-suggestions.md +74 -0
  62. package/node_modules/@luxusai/pi-hindsight/docs/surface-reference.md +261 -0
  63. package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-operations.ts +151 -0
  64. package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-selection.ts +18 -0
  65. package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-settings-presenter.ts +46 -0
  66. package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-templates.ts +383 -0
  67. package/node_modules/@luxusai/pi-hindsight/extensions/banks/banking.ts +240 -0
  68. package/node_modules/@luxusai/pi-hindsight/extensions/banks/knowledge-page-seed.ts +176 -0
  69. package/node_modules/@luxusai/pi-hindsight/extensions/banks/retain-strategies.ts +178 -0
  70. package/node_modules/@luxusai/pi-hindsight/extensions/client/client-retry.ts +41 -0
  71. package/node_modules/@luxusai/pi-hindsight/extensions/client/client.ts +386 -0
  72. package/node_modules/@luxusai/pi-hindsight/extensions/client/fetch-compat.ts +39 -0
  73. package/node_modules/@luxusai/pi-hindsight/extensions/client/timeout.ts +34 -0
  74. package/node_modules/@luxusai/pi-hindsight/extensions/config/config-defaults.ts +140 -0
  75. package/node_modules/@luxusai/pi-hindsight/extensions/config/config-editing-model.ts +61 -0
  76. package/node_modules/@luxusai/pi-hindsight/extensions/config/config-editing-registry.ts +925 -0
  77. package/node_modules/@luxusai/pi-hindsight/extensions/config/config-field-paths.ts +247 -0
  78. package/node_modules/@luxusai/pi-hindsight/extensions/config/config-normalize.ts +547 -0
  79. package/node_modules/@luxusai/pi-hindsight/extensions/config/config-writer.ts +480 -0
  80. package/node_modules/@luxusai/pi-hindsight/extensions/config/config.ts +182 -0
  81. package/node_modules/@luxusai/pi-hindsight/extensions/config/setup-gate.ts +86 -0
  82. package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-execute.ts +1010 -0
  83. package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-parse.ts +175 -0
  84. package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-plan.ts +425 -0
  85. package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-presentation.ts +210 -0
  86. package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-sessions.ts +817 -0
  87. package/node_modules/@luxusai/pi-hindsight/extensions/index.ts +25 -0
  88. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/git-seed.ts +319 -0
  89. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-recall.ts +196 -0
  90. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-retain.ts +189 -0
  91. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-runtime.ts +65 -0
  92. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle.ts +260 -0
  93. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/mental-models.ts +244 -0
  94. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/observation-scopes.ts +59 -0
  95. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall-cleanup.ts +82 -0
  96. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall-visibility.ts +45 -0
  97. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall.ts +331 -0
  98. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-cursor.ts +354 -0
  99. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-job-builder.ts +66 -0
  100. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-receipts.ts +132 -0
  101. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain.ts +228 -0
  102. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-bank-template-operations.ts +74 -0
  103. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-config-operations.ts +16 -0
  104. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-control-operations.ts +648 -0
  105. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-diagnostics-operations.ts +105 -0
  106. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-identity.ts +68 -0
  107. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-operation-service.ts +71 -0
  108. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-operation-types.ts +13 -0
  109. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-recall-operations.ts +162 -0
  110. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-retain-operations.ts +131 -0
  111. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-scope.ts +104 -0
  112. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-session-operations.ts +37 -0
  113. package/node_modules/@luxusai/pi-hindsight/extensions/operations/operation-catalog.ts +893 -0
  114. package/node_modules/@luxusai/pi-hindsight/extensions/operations/reflect-presenter.ts +35 -0
  115. package/node_modules/@luxusai/pi-hindsight/extensions/operations/scope-migrate.ts +177 -0
  116. package/node_modules/@luxusai/pi-hindsight/extensions/operations/tools.ts +7 -0
  117. package/node_modules/@luxusai/pi-hindsight/extensions/queue/flush-presenter.ts +21 -0
  118. package/node_modules/@luxusai/pi-hindsight/extensions/queue/jsonl-queue-store.ts +112 -0
  119. package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-delivery.ts +111 -0
  120. package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-lock.ts +214 -0
  121. package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-operations.ts +70 -0
  122. package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue.ts +392 -0
  123. package/node_modules/@luxusai/pi-hindsight/extensions/tui/bank-template-presentation.ts +45 -0
  124. package/node_modules/@luxusai/pi-hindsight/extensions/tui/commands.ts +9 -0
  125. package/node_modules/@luxusai/pi-hindsight/extensions/tui/guided-setup.ts +860 -0
  126. package/node_modules/@luxusai/pi-hindsight/extensions/tui/prefill-input.ts +105 -0
  127. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-flow.ts +189 -0
  128. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-server-probe.ts +299 -0
  129. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-actions.ts +201 -0
  130. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-facts.ts +47 -0
  131. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-render.ts +239 -0
  132. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-types.ts +50 -0
  133. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui.ts +259 -0
  134. package/node_modules/@luxusai/pi-hindsight/extensions/tui/tool-presenters.ts +77 -0
  135. package/node_modules/@luxusai/pi-hindsight/extensions/types.ts +534 -0
  136. package/node_modules/@luxusai/pi-hindsight/extensions/utils/diagnostics.ts +319 -0
  137. package/node_modules/@luxusai/pi-hindsight/extensions/utils/messages.ts +325 -0
  138. package/node_modules/@luxusai/pi-hindsight/extensions/utils/sanitize.ts +42 -0
  139. package/node_modules/@luxusai/pi-hindsight/extensions/utils/session-memory-meta.ts +244 -0
  140. package/node_modules/@luxusai/pi-hindsight/extensions/utils/session-operations.ts +56 -0
  141. package/node_modules/@luxusai/pi-hindsight/extensions/utils/session.ts +50 -0
  142. package/node_modules/@luxusai/pi-hindsight/extensions/utils/status-fields.ts +167 -0
  143. package/node_modules/@luxusai/pi-hindsight/extensions/utils/status-health.ts +207 -0
  144. package/node_modules/@luxusai/pi-hindsight/extensions/utils/status.ts +120 -0
  145. package/node_modules/@luxusai/pi-hindsight/extensions/version.ts +8 -0
  146. package/node_modules/@luxusai/pi-hindsight/package.json +118 -0
  147. package/node_modules/@luxusai/pi-hindsight/skills/hindsight-memory-doctor/SKILL.md +75 -0
  148. package/node_modules/@narumitw/pi-btw/dist/index.ts +143 -46
  149. package/node_modules/@narumitw/pi-btw/dist/index.ts.map +3 -3
  150. package/node_modules/@narumitw/pi-btw/package.json +6 -6
  151. package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +136 -22
  152. package/node_modules/{@herbertgao → @tifan}/pi-copy-response/README.md +2 -4
  153. package/node_modules/{@herbertgao → @tifan}/pi-copy-response/package.json +5 -15
  154. package/node_modules/{@herbertgao → @tifan}/pi-handoff/README.md +4 -6
  155. package/node_modules/@tifan/pi-handoff/package.json +43 -0
  156. package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/index.ts +1 -1
  157. package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/README.md +2 -4
  158. package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/package.json +5 -15
  159. package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/README.md +5 -7
  160. package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/package.json +5 -19
  161. package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/README.md +4 -6
  162. package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/package.json +6 -16
  163. package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/src/index.ts +1 -6
  164. package/node_modules/{@herbertgao → @tifan}/pi-recap/README.md +4 -6
  165. package/node_modules/@tifan/pi-recap/package.json +42 -0
  166. package/node_modules/{@herbertgao → @tifan}/pi-recap/src/models.ts +1 -6
  167. package/node_modules/{@herbertgao → @tifan}/pi-rename/README.md +13 -8
  168. package/node_modules/@tifan/pi-rename/package.json +47 -0
  169. package/node_modules/@tifan/pi-rename/src/herdr-label.ts +4 -0
  170. package/node_modules/{@herbertgao → @tifan}/pi-rename/src/index.ts +4 -16
  171. package/node_modules/{@herbertgao → @tifan}/pi-rename/src/models.ts +1 -6
  172. package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/README.md +2 -4
  173. package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/package.json +5 -15
  174. package/node_modules/pi-lens/CHANGELOG.md +96 -1
  175. package/node_modules/pi-lens/dist/clients/actionable-warnings-logger.js +2 -1
  176. package/node_modules/pi-lens/dist/clients/actionable-warnings.js +14 -5
  177. package/node_modules/pi-lens/dist/clients/advisory-provenance.js +48 -18
  178. package/node_modules/pi-lens/dist/clients/ast-grep-client.js +1 -3
  179. package/node_modules/pi-lens/dist/clients/atomic-write-staging.js +16 -4
  180. package/node_modules/pi-lens/dist/clients/bash-file-access.js +3 -1
  181. package/node_modules/pi-lens/dist/clients/biome-client.js +1 -3
  182. package/node_modules/pi-lens/dist/clients/blocker-freshness.js +21 -8
  183. package/node_modules/pi-lens/dist/clients/bounded-cache.js +24 -8
  184. package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +4 -3
  185. package/node_modules/pi-lens/dist/clients/cache-manager.js +6 -7
  186. package/node_modules/pi-lens/dist/clients/cache-observability.js +461 -66
  187. package/node_modules/pi-lens/dist/clients/call-graph.js +238 -63
  188. package/node_modules/pi-lens/dist/clients/codebase-model.js +13 -5
  189. package/node_modules/pi-lens/dist/clients/complexity-client.js +1 -3
  190. package/node_modules/pi-lens/dist/clients/dead-code-client.js +19 -8
  191. package/node_modules/pi-lens/dist/clients/dead-code-logger.js +1 -2
  192. package/node_modules/pi-lens/dist/clients/deadline-utils.js +3 -1
  193. package/node_modules/pi-lens/dist/clients/debug-heap.js +8 -1
  194. package/node_modules/pi-lens/dist/clients/degradation-ledger.js +1 -1
  195. package/node_modules/pi-lens/dist/clients/dependency-checker.js +11 -7
  196. package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +39 -2
  197. package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +5 -1
  198. package/node_modules/pi-lens/dist/clients/dispatch/auxiliary-lsp.js +2 -3
  199. package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +13 -1
  200. package/node_modules/pi-lens/dist/clients/dispatch/facts/function-facts.js +3 -1
  201. package/node_modules/pi-lens/dist/clients/dispatch/facts/import-facts.js +2 -1
  202. package/node_modules/pi-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +1 -1
  203. package/node_modules/pi-lens/dist/clients/dispatch/integration.js +9 -4
  204. package/node_modules/pi-lens/dist/clients/dispatch/rules/error-swallowing.js +3 -1
  205. package/node_modules/pi-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +6 -2
  206. package/node_modules/pi-lens/dist/clients/dispatch/rules/unsafe-boundary.js +31 -7
  207. package/node_modules/pi-lens/dist/clients/dispatch/runners/actionlint.js +5 -2
  208. package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +10 -14
  209. package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +5 -1
  210. package/node_modules/pi-lens/dist/clients/dispatch/runners/dotnet-build.js +1 -1
  211. package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +3 -1
  212. package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +25 -6
  213. package/node_modules/pi-lens/dist/clients/dispatch/runners/fish-indent.js +1 -1
  214. package/node_modules/pi-lens/dist/clients/dispatch/runners/gleam-check.js +1 -1
  215. package/node_modules/pi-lens/dist/clients/dispatch/runners/golangci-lint.js +3 -1
  216. package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +13 -8
  217. package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +4 -1
  218. package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +25 -10
  219. package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +1 -1
  220. package/node_modules/pi-lens/dist/clients/dispatch/runners/ktlint.js +1 -1
  221. package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +1 -1
  222. package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +28 -4
  223. package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +6 -8
  224. package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +212 -11
  225. package/node_modules/pi-lens/dist/clients/dispatch/runners/php-lint.js +1 -1
  226. package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +8 -4
  227. package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +10 -6
  228. package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +23 -14
  229. package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +1 -1
  230. package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +7 -9
  231. package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +5 -2
  232. package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +7 -7
  233. package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +6 -8
  234. package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +13 -8
  235. package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +13 -8
  236. package/node_modules/pi-lens/dist/clients/dispatch/runners/tree-sitter.js +17 -3
  237. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +7 -1
  238. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +24 -1
  239. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +35 -0
  240. package/node_modules/pi-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +1 -3
  241. package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +6 -8
  242. package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +1 -1
  243. package/node_modules/pi-lens/dist/clients/dispatch/suppress-writer.js +2 -1
  244. package/node_modules/pi-lens/dist/clients/dispatch/types.js +6 -1
  245. package/node_modules/pi-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +6 -2
  246. package/node_modules/pi-lens/dist/clients/extension-log.js +5 -3
  247. package/node_modules/pi-lens/dist/clients/feature-hints.js +8 -1
  248. package/node_modules/pi-lens/dist/clients/file-kinds.js +34 -129
  249. package/node_modules/pi-lens/dist/clients/file-utils.js +17 -1
  250. package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +57 -2
  251. package/node_modules/pi-lens/dist/clients/formatters.js +144 -27
  252. package/node_modules/pi-lens/dist/clients/freshness.js +38 -0
  253. package/node_modules/pi-lens/dist/clients/git-guard.js +43 -13
  254. package/node_modules/pi-lens/dist/clients/go-client.js +1 -3
  255. package/node_modules/pi-lens/dist/clients/grammar-source.js +1 -1
  256. package/node_modules/pi-lens/dist/clients/gzip-stage-write.js +30 -4
  257. package/node_modules/pi-lens/dist/clients/host-edit-normalize.js +1 -3
  258. package/node_modules/pi-lens/dist/clients/install-diagnostics.js +4 -2
  259. package/node_modules/pi-lens/dist/clients/installer/index.js +86 -77
  260. package/node_modules/pi-lens/dist/clients/instance-reaper.js +5 -2
  261. package/node_modules/pi-lens/dist/clients/instance-registry.js +4 -2
  262. package/node_modules/pi-lens/dist/clients/jscpd-client.js +6 -1
  263. package/node_modules/pi-lens/dist/clients/knip-client.js +29 -15
  264. package/node_modules/pi-lens/dist/clients/language-profile.js +4 -1
  265. package/node_modules/pi-lens/dist/clients/latency-logger.js +13 -2
  266. package/node_modules/pi-lens/dist/clients/lens-config.js +1 -1
  267. package/node_modules/pi-lens/dist/clients/lens-map.js +8 -3
  268. package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +1 -1
  269. package/node_modules/pi-lens/dist/clients/lsp/config.js +4 -6
  270. package/node_modules/pi-lens/dist/clients/lsp/edits.js +119 -32
  271. package/node_modules/pi-lens/dist/clients/lsp/index.js +94 -35
  272. package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +2 -1
  273. package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +4 -1
  274. package/node_modules/pi-lens/dist/clients/lsp/launch.js +11 -3
  275. package/node_modules/pi-lens/dist/clients/lsp/pending-aux-coverage.js +152 -0
  276. package/node_modules/pi-lens/dist/clients/lsp/server.js +19 -7
  277. package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +10 -2
  278. package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +9 -4
  279. package/node_modules/pi-lens/dist/clients/lsp-document-symbols.js +1 -3
  280. package/node_modules/pi-lens/dist/clients/lsp-mutation.js +10 -20
  281. package/node_modules/pi-lens/dist/clients/mcp/host-shim.js +1 -1
  282. package/node_modules/pi-lens/dist/clients/memory-sampler.js +73 -7
  283. package/node_modules/pi-lens/dist/clients/metrics-client.js +1 -3
  284. package/node_modules/pi-lens/dist/clients/middle-man-analysis.js +8 -3
  285. package/node_modules/pi-lens/dist/clients/module-report-lsp.js +7 -1
  286. package/node_modules/pi-lens/dist/clients/module-report.js +14 -17
  287. package/node_modules/pi-lens/dist/clients/ndjson-logger.js +3 -5
  288. package/node_modules/pi-lens/dist/clients/opaque-mutation-scan.js +220 -0
  289. package/node_modules/pi-lens/dist/clients/package-manager.js +6 -1
  290. package/node_modules/pi-lens/dist/clients/pipeline.js +57 -9
  291. package/node_modules/pi-lens/dist/clients/project-conventions.js +2 -8
  292. package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +10 -7
  293. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +2 -1
  294. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +3 -1
  295. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +13 -9
  296. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +3 -1
  297. package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +5 -2
  298. package/node_modules/pi-lens/dist/clients/project-lens-config.js +12 -5
  299. package/node_modules/pi-lens/dist/clients/project-snapshot-fingerprint.js +48 -0
  300. package/node_modules/pi-lens/dist/clients/project-snapshot-persist-worker.js +15 -1
  301. package/node_modules/pi-lens/dist/clients/project-snapshot.js +472 -66
  302. package/node_modules/pi-lens/dist/clients/read-expansion.js +12 -2
  303. package/node_modules/pi-lens/dist/clients/read-guard-logger.js +5 -4
  304. package/node_modules/pi-lens/dist/clients/read-guard-tool-lines.js +5 -2
  305. package/node_modules/pi-lens/dist/clients/read-guard.js +1 -1
  306. package/node_modules/pi-lens/dist/clients/resource-sampler.js +1 -1
  307. package/node_modules/pi-lens/dist/clients/reverse-deps.js +6 -5
  308. package/node_modules/pi-lens/dist/clients/review-graph/builder.js +42 -17
  309. package/node_modules/pi-lens/dist/clients/review-graph/git-identity.js +8 -2
  310. package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +10 -1
  311. package/node_modules/pi-lens/dist/clients/review-graph/query.js +2 -1
  312. package/node_modules/pi-lens/dist/clients/review-graph/tsconfig-paths.js +4 -2
  313. package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +2 -2
  314. package/node_modules/pi-lens/dist/clients/ruff-client.js +6 -5
  315. package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +63 -31
  316. package/node_modules/pi-lens/dist/clients/runtime-context.js +12 -4
  317. package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +83 -4
  318. package/node_modules/pi-lens/dist/clients/runtime-session.js +14 -0
  319. package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +59 -3
  320. package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +148 -34
  321. package/node_modules/pi-lens/dist/clients/runtime-turn.js +147 -6
  322. package/node_modules/pi-lens/dist/clients/rust-client.js +1 -3
  323. package/node_modules/pi-lens/dist/clients/safe-spawn.js +150 -11
  324. package/node_modules/pi-lens/dist/clients/security-scan-client.js +1 -3
  325. package/node_modules/pi-lens/dist/clients/session-summary.js +3 -1
  326. package/node_modules/pi-lens/dist/clients/sg-runner.js +1 -3
  327. package/node_modules/pi-lens/dist/clients/source-filter.js +10 -6
  328. package/node_modules/pi-lens/dist/clients/source-walker.js +1 -1
  329. package/node_modules/pi-lens/dist/clients/spawn-timeout-cooldown.js +96 -0
  330. package/node_modules/pi-lens/dist/clients/startup-scan.js +4 -1
  331. package/node_modules/pi-lens/dist/clients/tool-definition.js +7 -0
  332. package/node_modules/pi-lens/dist/clients/tool-policy.js +26 -11
  333. package/node_modules/pi-lens/dist/clients/tool-render.js +2 -1
  334. package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +10 -4
  335. package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +2 -2
  336. package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +12 -5
  337. package/node_modules/pi-lens/dist/clients/warm-attach.js +12 -5
  338. package/node_modules/pi-lens/dist/clients/widget-state.js +27 -11
  339. package/node_modules/pi-lens/dist/clients/word-index.js +3 -1
  340. package/node_modules/pi-lens/dist/clients/workspace-topology.js +8 -2
  341. package/node_modules/pi-lens/dist/clients/zizmor-config.js +9 -1
  342. package/node_modules/pi-lens/dist/i18n.js +13 -5
  343. package/node_modules/pi-lens/dist/index.js +10797 -8627
  344. package/node_modules/pi-lens/dist/mcp/server.js +3 -1
  345. package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +68 -12
  346. package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +21 -7
  347. package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +164 -35
  348. package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +24 -7
  349. package/node_modules/pi-lens/dist/tools/lsp-navigation.js +3 -1
  350. package/node_modules/pi-lens/dist/tools/module-report.js +1 -1
  351. package/node_modules/pi-lens/dist/tools/project-report.js +1 -1
  352. package/node_modules/pi-lens/dist/tools/symbol-search.js +5 -2
  353. package/node_modules/pi-lens/docs/durable-store-audit-1202.md +1 -1
  354. package/node_modules/pi-lens/docs/servercapabilities.md +1 -1
  355. package/node_modules/pi-lens/package.json +160 -156
  356. package/node_modules/pi-lens/rules/typos/_typos.toml +2 -2
  357. package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +31 -13
  358. package/node_modules/pi-lens/scripts/download-grammars.js +9 -3
  359. package/node_modules/pi-lens/scripts/rpc-load-check.mjs +30 -9
  360. package/node_modules/pi-mcp-adapter/CHANGELOG.md +47 -0
  361. package/node_modules/pi-mcp-adapter/README.md +42 -13
  362. package/node_modules/pi-mcp-adapter/commands.ts +4 -2
  363. package/node_modules/pi-mcp-adapter/config.ts +45 -5
  364. package/node_modules/pi-mcp-adapter/direct-tools.ts +103 -92
  365. package/node_modules/pi-mcp-adapter/dist/agent-dir.d.ts +10 -0
  366. package/node_modules/pi-mcp-adapter/dist/agent-dir.js +63 -0
  367. package/node_modules/pi-mcp-adapter/dist/agent-dir.js.map +1 -0
  368. package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.d.ts +8 -0
  369. package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.js +356 -0
  370. package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.js.map +1 -0
  371. package/node_modules/pi-mcp-adapter/dist/config.d.ts +123 -0
  372. package/node_modules/pi-mcp-adapter/dist/config.js +1087 -0
  373. package/node_modules/pi-mcp-adapter/dist/config.js.map +1 -0
  374. package/node_modules/pi-mcp-adapter/dist/metadata-cache.d.ts +19 -0
  375. package/node_modules/pi-mcp-adapter/dist/metadata-cache.js +319 -0
  376. package/node_modules/pi-mcp-adapter/dist/metadata-cache.js.map +1 -0
  377. package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.d.ts +2 -0
  378. package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.js +156 -0
  379. package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.js.map +1 -0
  380. package/node_modules/pi-mcp-adapter/dist/resource-tools.d.ts +1 -0
  381. package/node_modules/pi-mcp-adapter/dist/resource-tools.js +15 -0
  382. package/node_modules/pi-mcp-adapter/dist/resource-tools.js.map +1 -0
  383. package/node_modules/pi-mcp-adapter/dist/types.d.ts +564 -0
  384. package/node_modules/pi-mcp-adapter/dist/types.js +287 -0
  385. package/node_modules/pi-mcp-adapter/dist/types.js.map +1 -0
  386. package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.d.ts +6 -0
  387. package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.js +37 -0
  388. package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.js.map +1 -0
  389. package/node_modules/pi-mcp-adapter/dist/ui-stream-types.d.ts +104 -0
  390. package/node_modules/pi-mcp-adapter/dist/ui-stream-types.js +59 -0
  391. package/node_modules/pi-mcp-adapter/dist/ui-stream-types.js.map +1 -0
  392. package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.d.ts +4 -0
  393. package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.js +27 -0
  394. package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.js.map +1 -0
  395. package/node_modules/pi-mcp-adapter/dist/utils.d.ts +32 -0
  396. package/node_modules/pi-mcp-adapter/dist/utils.js +338 -0
  397. package/node_modules/pi-mcp-adapter/dist/utils.js.map +1 -0
  398. package/node_modules/pi-mcp-adapter/failure-backoff.ts +23 -0
  399. package/node_modules/pi-mcp-adapter/index.ts +204 -82
  400. package/node_modules/pi-mcp-adapter/init.ts +41 -30
  401. package/node_modules/pi-mcp-adapter/lifecycle.ts +16 -8
  402. package/node_modules/pi-mcp-adapter/mcp-code.ts +2 -0
  403. package/node_modules/pi-mcp-adapter/mcp-oauth-provider.ts +66 -16
  404. package/node_modules/pi-mcp-adapter/mcp-output-guard.ts +95 -7
  405. package/node_modules/pi-mcp-adapter/mcp-probe.ts +18 -4
  406. package/node_modules/pi-mcp-adapter/mcp-references.ts +368 -0
  407. package/node_modules/pi-mcp-adapter/mcp-status.ts +8 -19
  408. package/node_modules/pi-mcp-adapter/metadata-cache.ts +20 -12
  409. package/node_modules/pi-mcp-adapter/namespace-tools.ts +276 -0
  410. package/node_modules/pi-mcp-adapter/package.json +24 -6
  411. package/node_modules/pi-mcp-adapter/proxy-modes.ts +66 -10
  412. package/node_modules/pi-mcp-adapter/search-ranking.ts +2 -0
  413. package/node_modules/pi-mcp-adapter/server-manager.ts +63 -12
  414. package/node_modules/pi-mcp-adapter/state.ts +1 -3
  415. package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +16 -2
  416. package/node_modules/pi-mcp-adapter/types.ts +48 -1
  417. package/node_modules/pi-mcp-adapter/ui-server.ts +3 -19
  418. package/node_modules/pi-mcp-adapter/ui-session.ts +2 -1
  419. package/node_modules/pi-mcp-adapter/utils.ts +21 -19
  420. package/node_modules/pi-web-access/CHANGELOG.md +26 -0
  421. package/node_modules/pi-web-access/README.md +71 -14
  422. package/node_modules/pi-web-access/chrome-cookies.ts +115 -35
  423. package/node_modules/pi-web-access/credential-source.ts +6 -2
  424. package/node_modules/pi-web-access/curator-page.ts +5 -3
  425. package/node_modules/pi-web-access/curator-server.ts +2 -1
  426. package/node_modules/pi-web-access/extract.ts +89 -9
  427. package/node_modules/pi-web-access/fetch-params.ts +13 -0
  428. package/node_modules/pi-web-access/gemini-adc.ts +298 -0
  429. package/node_modules/pi-web-access/gemini-api.ts +59 -15
  430. package/node_modules/pi-web-access/gemini-search.ts +58 -18
  431. package/node_modules/pi-web-access/gemini-url-context.ts +3 -2
  432. package/node_modules/pi-web-access/gemini-web-config.ts +57 -7
  433. package/node_modules/pi-web-access/gemini-web.ts +9 -3
  434. package/node_modules/pi-web-access/github-api.ts +5 -4
  435. package/node_modules/pi-web-access/github-issue-pr.ts +700 -0
  436. package/node_modules/pi-web-access/index.ts +403 -297
  437. package/node_modules/pi-web-access/kimi-search.ts +234 -0
  438. package/node_modules/pi-web-access/openai-search.ts +118 -21
  439. package/node_modules/pi-web-access/package.json +3 -2
  440. package/node_modules/pi-web-access/ssrf-protection.ts +4 -1
  441. package/node_modules/pi-web-access/utils.ts +307 -1
  442. package/node_modules/pi-web-access/youtube-extract.ts +2 -2
  443. package/package.json +46 -37
  444. package/node_modules/@herbertgao/pi-copy-response/CHANGELOG.md +0 -49
  445. package/node_modules/@herbertgao/pi-copy-response/LICENSE +0 -22
  446. package/node_modules/@herbertgao/pi-handoff/CHANGELOG.md +0 -83
  447. package/node_modules/@herbertgao/pi-handoff/LICENSE +0 -22
  448. package/node_modules/@herbertgao/pi-handoff/package.json +0 -60
  449. package/node_modules/@herbertgao/pi-inline-skills/CHANGELOG.md +0 -57
  450. package/node_modules/@herbertgao/pi-inline-skills/LICENSE +0 -22
  451. package/node_modules/@herbertgao/pi-mermaid-open/CHANGELOG.md +0 -39
  452. package/node_modules/@herbertgao/pi-preferred-thinking/CHANGELOG.md +0 -63
  453. package/node_modules/@herbertgao/pi-preferred-thinking/LICENSE +0 -22
  454. package/node_modules/@herbertgao/pi-recap/CHANGELOG.md +0 -101
  455. package/node_modules/@herbertgao/pi-recap/LICENSE +0 -22
  456. package/node_modules/@herbertgao/pi-recap/package.json +0 -55
  457. package/node_modules/@herbertgao/pi-rename/CHANGELOG.md +0 -49
  458. package/node_modules/@herbertgao/pi-rename/LICENSE +0 -22
  459. package/node_modules/@herbertgao/pi-rename/package.json +0 -63
  460. package/node_modules/@herbertgao/pi-titlebar-spinner/CHANGELOG.md +0 -25
  461. package/node_modules/@herbertgao/pi-titlebar-spinner/LICENSE +0 -22
  462. /package/node_modules/{@herbertgao → @tifan}/pi-copy-response/src/index.ts +0 -0
  463. /package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/complete-text.ts +0 -0
  464. /package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/session-query.ts +0 -0
  465. /package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/src/index.ts +0 -0
  466. /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/herdr-plugin/herdr-plugin.toml +0 -0
  467. /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/herdr-plugin/viewer.mjs +0 -0
  468. /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/src/index.ts +0 -0
  469. /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/index.ts +0 -0
  470. /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/model-picker.ts +0 -0
  471. /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/sanitize.ts +0 -0
  472. /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/tui.ts +0 -0
  473. /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/model-picker.ts +0 -0
  474. /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/naming.ts +0 -0
  475. /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/sanitize.ts +0 -0
  476. /package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/src/index.ts +0 -0
@@ -31,6 +31,10 @@ import { formatRunDurationMs } from "./run-duration.js";
31
31
  import { MAX_ADVISORY_AFFECTED_FILES, gateFindingsByPathFreshness, snapshotAdvisoryProvenance, } from "./advisory-provenance.js";
32
32
  import { sweepInlineBlockerFreshness } from "./blocker-freshness.js";
33
33
  import { sweepInlineBlockerPastEof } from "./blocker-past-eof.js";
34
+ // #2001/#2002: collect-later delivery for slow auxiliary LSP servers.
35
+ import { getLSPService } from "./lsp/index.js";
36
+ import { drainPendingAuxiliaryCoverage, isPendingAuxiliaryPastRearmTtl, markPendingAuxiliaryCoverage, } from "./lsp/pending-aux-coverage.js";
37
+ import { convertLspDiagnostics } from "./dispatch/utils/lsp-diagnostics.js";
34
38
  // #1631 review V2: moved to its own leaf module so a low-level store
35
39
  // (widget-state.ts) can use the marker without importing this orchestrator —
36
40
  // see clients/stale-marker.ts's doc comment.
@@ -267,7 +271,8 @@ export async function handleTurnEnd(deps) {
267
271
  dbg(`turn_end: foreign live owner retained (${turnState.owner?.kind ?? "legacy"}:${turnState.owner?.id ?? turnState.sessionId})`);
268
272
  return;
269
273
  }
270
- if (access === "available" && (turnState.files || turnState.owner || turnState.sessionId)) {
274
+ if (access === "available" &&
275
+ (turnState.files || turnState.owner || turnState.sessionId)) {
271
276
  dbg("turn_end: evicting stale turn-state owner");
272
277
  cacheManager.clearTurnState(cwd, currentOwner);
273
278
  turnState = cacheManager.readTurnState(cwd);
@@ -583,7 +588,9 @@ export async function handleTurnEnd(deps) {
583
588
  neighborCount: uniqueNeighborFiles.length,
584
589
  metadata: {
585
590
  neighborFiles: uniqueNeighborFiles.slice(0, 10),
586
- suggestedTestFiles: testSuggestions.slice(0, 10).map((s) => s.testFile),
591
+ suggestedTestFiles: testSuggestions
592
+ .slice(0, 10)
593
+ .map((s) => s.testFile),
587
594
  runner: testSuggestions[0]?.runner,
588
595
  truncated: testSuggestions.length > 10,
589
596
  zeroSuggestions: testSuggestions.length === 0,
@@ -1461,9 +1468,12 @@ export async function handleTurnEnd(deps) {
1461
1468
  generation: testRunGeneration,
1462
1469
  files: provenanceFiles,
1463
1470
  });
1464
- const superseded = launchedFrom.revision.sessionId !== publishedAgainst.revision.sessionId ||
1465
- launchedFrom.revision.projectSeq !== publishedAgainst.revision.projectSeq ||
1466
- launchedFrom.revision.turnIndex !== publishedAgainst.revision.turnIndex ||
1471
+ const superseded = launchedFrom.revision.sessionId !==
1472
+ publishedAgainst.revision.sessionId ||
1473
+ launchedFrom.revision.projectSeq !==
1474
+ publishedAgainst.revision.projectSeq ||
1475
+ launchedFrom.revision.turnIndex !==
1476
+ publishedAgainst.revision.turnIndex ||
1467
1477
  launchedFrom.files.some((file, index) => publishedAgainst.files[index]?.sha256 !== file.sha256 ||
1468
1478
  publishedAgainst.files[index]?.path !== file.path);
1469
1479
  // #628: the turn advancing while tests ran no longer means the
@@ -1516,6 +1526,13 @@ export async function handleTurnEnd(deps) {
1516
1526
  // git-guard blocker. `formatResult` already renders the
1517
1527
  // error-only case as "Could not run tests: ...".
1518
1528
  if (failed > 0 || error) {
1529
+ // #2028: "Test file not found" is an expected skip
1530
+ // (conventional test path without an actual file),
1531
+ // not an actionable failure. Don't surface it.
1532
+ if (error &&
1533
+ String(r.value?.error ?? "").includes("Test file not found")) {
1534
+ continue;
1535
+ }
1519
1536
  const formatted = testRunnerClient.formatResult(r.value);
1520
1537
  if (formatted)
1521
1538
  failures.push(formatted);
@@ -1541,7 +1558,8 @@ export async function handleTurnEnd(deps) {
1541
1558
  provenance: publishedAgainst,
1542
1559
  superseded,
1543
1560
  }, cwd);
1544
- if (getFlag("lens-guard") && firedSessionId === runtime.telemetrySessionId) {
1561
+ if (getFlag("lens-guard") &&
1562
+ firedSessionId === runtime.telemetrySessionId) {
1545
1563
  // #1524: `&& !value.error` — a runner-error result has
1546
1564
  // `failed === 0` (the suite never ran, so nothing could
1547
1565
  // fail), but it is not a pass. Without the filter it
@@ -1791,6 +1809,129 @@ export async function handleTurnEnd(deps) {
1791
1809
  });
1792
1810
  }
1793
1811
  cacheManager.incrementTurnCycle(cwd, currentOwner);
1812
+ // #2001/#2002: collect-later delivery for auxiliary LSP servers whose
1813
+ // aux-grace window expired without a publication (opengrep on Windows:
1814
+ // ~8s per scan against a 2s grace — the scanner's eventual findings sat
1815
+ // in its client cache, agent-invisible). Probe each pending pair through
1816
+ // the read-only cache seam (never spawns), freshness-gate the result
1817
+ // against when the pair was marked, and deliver survivors as an advisory.
1818
+ // A pair whose client is alive but has STILL published nothing re-arms
1819
+ // (baseline preserved, TTL anchor advanced) until the re-arm TTL; a dead
1820
+ // client drops silently.
1821
+ const lateAuxStart = Date.now();
1822
+ const drainedPairs = drainPendingAuxiliaryCoverage();
1823
+ let lateAuxDelivered = 0;
1824
+ let lateAuxStale = 0;
1825
+ let lateAuxMissing = 0;
1826
+ let lateAuxRearmed = 0;
1827
+ let lateAuxClientGone = 0;
1828
+ let lateAuxProbeFailed = 0;
1829
+ if (drainedPairs.length > 0) {
1830
+ const byFile = new Map();
1831
+ for (const pair of drainedPairs) {
1832
+ const list = byFile.get(pair.filePath);
1833
+ if (list)
1834
+ list.push(pair);
1835
+ else
1836
+ byFile.set(pair.filePath, [pair]);
1837
+ }
1838
+ try {
1839
+ const service = getLSPService();
1840
+ for (const [lateAuxPath, pairs] of byFile) {
1841
+ let cached;
1842
+ try {
1843
+ cached = await service.readCachedDiagnosticsForServers(lateAuxPath, new Set(pairs.map((p) => p.serverId)));
1844
+ }
1845
+ catch {
1846
+ // #2027 round-1 P3-2: count dropped pairs — never silent.
1847
+ lateAuxProbeFailed += pairs.length;
1848
+ for (const pair of pairs) {
1849
+ markPendingAuxiliaryCoverage(pair.filePath, [pair.serverId], Date.now());
1850
+ }
1851
+ continue;
1852
+ }
1853
+ const displayLateAuxPath = toRunnerDisplayPath(cwd, lateAuxPath);
1854
+ for (const pair of pairs) {
1855
+ const rawDiags = cached.get(pair.serverId);
1856
+ if (rawDiags === undefined) {
1857
+ // No live client for this server any more — best-effort probe,
1858
+ // drop the pair silently.
1859
+ lateAuxClientGone += 1;
1860
+ continue;
1861
+ }
1862
+ if (rawDiags.length === 0) {
1863
+ // Still scanning (or published nothing yet) — keep waiting
1864
+ // so a scan finishing before the NEXT turn end still
1865
+ // delivers. Two clocks, deliberately decoupled: the
1866
+ // freshness baseline (`markedAtMs`) NEVER moves — it is what
1867
+ // the delivery gate stats against — while the re-arm TTL is
1868
+ // anchored on `lastRearmedAtMs`, advanced by every successful
1869
+ // empty probe: the scanner is demonstrably alive, just slow.
1870
+ if (!isPendingAuxiliaryPastRearmTtl(pair)) {
1871
+ markPendingAuxiliaryCoverage(lateAuxPath, [pair.serverId], pair.markedAtMs, Date.now());
1872
+ lateAuxRearmed += 1;
1873
+ }
1874
+ continue;
1875
+ }
1876
+ const converted = convertLspDiagnostics(rawDiags, lateAuxPath, {
1877
+ tool: "lsp",
1878
+ });
1879
+ if (converted.length === 0)
1880
+ continue;
1881
+ // Freshness kernel (#1634 gated surface): stat the cited file
1882
+ // against the mark timestamp. Missing → drop (no remediation for
1883
+ // a deleted file); mtime drifted past the mark → drop too, NOT
1884
+ // demote — unlike the cached-blocker gates these findings were
1885
+ // NEVER delivered before, and the edit that drifted the file
1886
+ // already re-touched it (a fresh pending pair supersedes this
1887
+ // one), so a stale-arm replay would double-report old content.
1888
+ // Both drops are COUNTED here and in the latency record below —
1889
+ // never silent (shape 10).
1890
+ const gate = gateFindingsByPathFreshness({
1891
+ store: "late-auxiliary-findings",
1892
+ findings: converted,
1893
+ cwd,
1894
+ scannedAt: pair.markedAtMs,
1895
+ citedPath: () => lateAuxPath,
1896
+ });
1897
+ lateAuxStale += gate.stale.length;
1898
+ lateAuxMissing +=
1899
+ converted.length - gate.live.length - gate.stale.length;
1900
+ if (gate.stale.length > 0) {
1901
+ // Stale findings mean the scan predates the last edit.
1902
+ // Re-arm with a REFRESHED baseline so the next turn probes
1903
+ // the newer revision (#2027 round-1 P2-1).
1904
+ markPendingAuxiliaryCoverage(lateAuxPath, [pair.serverId], Date.now());
1905
+ }
1906
+ if (gate.live.length === 0)
1907
+ continue;
1908
+ const lines = gate.live.map((f) => ` ${displayLateAuxPath}:${f.line}:${f.column} [${f.rule}] ${f.message}`);
1909
+ lateAuxDelivered += gate.live.length;
1910
+ // @delivery-surface: runtime-turn:late-auxiliary-findings
1911
+ advisoryParts.push(`🕐 Late auxiliary diagnostics (${pair.serverId} answered after its grace window):\n${lines.join("\n")}`);
1912
+ }
1913
+ }
1914
+ }
1915
+ catch (err) {
1916
+ dbg(`turn_end: late-auxiliary probe failed: ${err}`);
1917
+ }
1918
+ logLatency({
1919
+ type: "phase",
1920
+ toolName: "turn_end",
1921
+ filePath: cwd,
1922
+ phase: "late_auxiliary_findings",
1923
+ durationMs: Date.now() - lateAuxStart,
1924
+ metadata: {
1925
+ pending: drainedPairs.length,
1926
+ delivered: lateAuxDelivered,
1927
+ stale: lateAuxStale,
1928
+ missing: lateAuxMissing,
1929
+ rearmed: lateAuxRearmed,
1930
+ clientGone: lateAuxClientGone,
1931
+ probeFailed: lateAuxProbeFailed,
1932
+ },
1933
+ });
1934
+ }
1794
1935
  const labeledAdvisoryParts = advisoryParts.map((p) => `ℹ️ Advisory — no action required this turn:\n${p}`);
1795
1936
  // Stale-secret parts sit between the two tiers and are NOT relabelled — they
1796
1937
  // ship the imperative preamble they were built with (#1622 review M2).
@@ -34,9 +34,7 @@ export class RustClient {
34
34
  availability;
35
35
  log;
36
36
  constructor(verbose = false) {
37
- this.log = verbose
38
- ? createSubsystemLogger("rust")
39
- : () => { };
37
+ this.log = verbose ? createSubsystemLogger("rust") : () => { };
40
38
  this.availability = createToolchainAvailability({
41
39
  tool: "cargo",
42
40
  label: "Cargo",
@@ -37,6 +37,38 @@ export function hasSpawnFailureKind(error, kind) {
37
37
  "kind" in error &&
38
38
  error.kind === kind);
39
39
  }
40
+ /**
41
+ * #2010: derive teardown evidence from observed timestamps.
42
+ *
43
+ * Pure by design so every branch is deterministically unit-testable,
44
+ * including the natural-exit-at-budget-expiry race where the timeout
45
+ * callback arms a kill against an already-dead child.
46
+ *
47
+ * - No recorded kill start (the guard saw the child already dying), no
48
+ * observed death at all, or death PREDATING the kill start: the child
49
+ * left on its own -> "exited", ms 0. Claiming a kill we cannot
50
+ * distinguish from a natural exit would be invented evidence.
51
+ * - Death observed after the kill started: "escalate-kill" when the
52
+ * SIGKILL escalation fired, otherwise "killed-by-signal"; ms is the
53
+ * observed gap (floor 0 - clock jitter must never produce a negative).
54
+ */
55
+ export function resolveTeardownOutcome(input) {
56
+ // Another path (abort / output-limit) owns this death: emitting teardown
57
+ // evidence here would describe a kill this timeout didn't perform.
58
+ if (input.killStartedAtMs === undefined ||
59
+ input.deathObservedAtMs === undefined) {
60
+ return undefined;
61
+ }
62
+ // True natural-exit race: the child beat the budget-expired kill by a
63
+ // hair - death observed before (or exactly at) the kill start.
64
+ if (input.deathObservedAtMs <= input.killStartedAtMs) {
65
+ return { ms: 0, outcome: "exited" };
66
+ }
67
+ return {
68
+ ms: Math.max(0, input.deathObservedAtMs - input.killStartedAtMs),
69
+ outcome: input.escalated ? "escalate-kill" : "killed-by-signal",
70
+ };
71
+ }
40
72
  function toError(error) {
41
73
  return error instanceof Error ? error : new Error(String(error));
42
74
  }
@@ -74,7 +106,12 @@ function cwdIsUnresolvableSync(cwd) {
74
106
  */
75
107
  function commandProbablyPresent(command) {
76
108
  const exts = process.platform === "win32"
77
- ? ["", ...(process.env.PATHEXT ?? ".COM;.EXE;.BAT;.CMD").split(";").filter(Boolean)]
109
+ ? [
110
+ "",
111
+ ...(process.env.PATHEXT ?? ".COM;.EXE;.BAT;.CMD")
112
+ .split(";")
113
+ .filter(Boolean),
114
+ ]
78
115
  : [""];
79
116
  const existsWithExt = (base) => {
80
117
  for (const ext of exts) {
@@ -192,7 +229,15 @@ function killPidTreeSync(pid) {
192
229
  return;
193
230
  }
194
231
  try {
195
- process.kill(pid, "SIGKILL");
232
+ // #2026: negative pid = whole process group (POSIX children spawn
233
+ // detached), reaching grandchildren too. Any failure (ESRCH = already
234
+ // gone, EPERM = raced) falls through to the direct-child attempt.
235
+ try {
236
+ process.kill(-pid, "SIGKILL");
237
+ }
238
+ catch {
239
+ process.kill(pid, "SIGKILL");
240
+ }
196
241
  }
197
242
  catch {
198
243
  // Child already exited.
@@ -268,10 +313,16 @@ function cmdEscapeArg(arg) {
268
313
  * that already worked. The `chcp 65001` prefix forces the UTF-8 code page (so
269
314
  * tool output isn't mangled by the system code page) and, as a side benefit,
270
315
  * keeps the (possibly quoted) command off the front of the line, avoiding
271
- * cmd.exe's `/s` outer-quote-stripping quirk.
316
+ * cmd.exe's `/s` outer-quote-stripping quirk. #2023: chcp is invoked via its
317
+ * absolute `%SystemRoot%\System32\chcp.com` path and chained with `&`, not
318
+ * `&&` — a child environment whose PATH cannot resolve System32 used to fail
319
+ * the bare `chcp` lookup, and `&&` then short-circuited EVERY .cmd/.bat spawn
320
+ * into exit 1 with empty output. With the pin plus `&`, even a chcp failure
321
+ * can never suppress the real command.
272
322
  */
273
323
  export function buildWindowsShellCommand(command, args) {
274
- return `chcp 65001 >nul 2>&1 && ${[command, ...args].map(cmdEscapeArg).join(" ")}`;
324
+ const chcp = `${process.env.SystemRoot ?? "C:\\Windows"}\\System32\\chcp.com`;
325
+ return `${chcp} 65001 >nul 2>&1 & ${[command, ...args].map(cmdEscapeArg).join(" ")}`;
275
326
  }
276
327
  /**
277
328
  * The extensions this resolver treats as executable suffixes on their own,
@@ -859,6 +910,15 @@ export async function safeSpawnAsync(command, args, options) {
859
910
  // a ref'd 1s timer that outlives the child it was escalating against
860
911
  // would keep a one-shot `pi --print` process alive for up to 1s.
861
912
  let escalationTimer;
913
+ let teardownStartedAtMs;
914
+ let teardownEscalated = false;
915
+ // #2010: teardown evidence for the spawn's OWN timeout. The wall clock
916
+ // starts when the budget expires and the tree-kill is issued, and stops
917
+ // when the process tree is observed dead (`await killPromise` settles)
918
+ // - measured SEPARATELY from the budget itself, so a slow teardown is
919
+ // visible instead of silently inflating "how long the tool ran".
920
+ // `teardownEscalated` names whether SIGTERM sufficed or the SIGKILL
921
+ // escalation fired (POSIX; Windows taskkill /F is always forceful).
862
922
  // #1114: `child.killed` is set by Node the moment `kill()` successfully
863
923
  // SENDS a signal, not when the child actually dies — so gating the
864
924
  // escalation on `!child.killed` right after a successful `SIGTERM` send
@@ -994,6 +1054,14 @@ export async function safeSpawnAsync(command, args, options) {
994
1054
  return;
995
1055
  }
996
1056
  let child;
1057
+ // #2026: on POSIX, run the child in its OWN process group (detached).
1058
+ // killTree/killPidTreeSync then signal the whole GROUP (-pid), which
1059
+ // makes grandchildren (npm -> node, sh -> sleep, etc.) die with their
1060
+ // tool instead of surviving every timeout as orphans. Detachment stops
1061
+ // direct terminal-signal delivery, so EVERY POSIX pid registers for
1062
+ // lifetime cleanup - pi's signal/exit handlers forward the kill,
1063
+ // preserving die-with-host semantics.
1064
+ const posixProcessGroup = process.platform !== "win32";
997
1065
  try {
998
1066
  child = spawn(spawnCmd, spawnArgs, {
999
1067
  cwd: spawnCwd,
@@ -1001,6 +1069,7 @@ export async function safeSpawnAsync(command, args, options) {
1001
1069
  windowsHide: true,
1002
1070
  shell: false,
1003
1071
  windowsVerbatimArguments,
1072
+ detached: posixProcessGroup,
1004
1073
  });
1005
1074
  }
1006
1075
  catch (err) {
@@ -1022,7 +1091,10 @@ export async function safeSpawnAsync(command, args, options) {
1022
1091
  }));
1023
1092
  return;
1024
1093
  }
1025
- if (options?.lifetimeCoupled && child.pid) {
1094
+ if (child.pid && (posixProcessGroup || options?.lifetimeCoupled)) {
1095
+ // #2026: POSIX registers unconditionally - detached children no
1096
+ // longer receive terminal signals directly, so the lifetime
1097
+ // cleanup's signal forwarding IS their die-with-host path.
1026
1098
  installLifetimeCleanup();
1027
1099
  lifetimeState.pids.add(child.pid);
1028
1100
  }
@@ -1066,11 +1138,56 @@ export async function safeSpawnAsync(command, args, options) {
1066
1138
  child.kill("SIGKILL");
1067
1139
  }
1068
1140
  }
1141
+ else if (posixProcessGroup && child.pid && child.pid > 0) {
1142
+ // #2026: signal the whole process group. Grandchildren spawned
1143
+ // by the tool share its group, so one signal reaches the whole
1144
+ // tree; a negative-pid ESRCH means it already exited.
1145
+ const pgid = -child.pid;
1146
+ try {
1147
+ process.kill(pgid, "SIGTERM");
1148
+ }
1149
+ catch {
1150
+ child.kill("SIGTERM");
1151
+ }
1152
+ // #2027 round-1: gate the SIGKILL escalation on GROUP liveness,
1153
+ // not direct-child death - a tool can exit instantly on SIGTERM
1154
+ // while a SIGTERM-hardy grandchild keeps the group alive. The
1155
+ // timer stays REF'D for group mode (max 1s tail after resolve):
1156
+ // it is the only backstop for this group once finalize deletes
1157
+ // the pid from lifetimeState.
1158
+ escalationTimer = setTimeout(() => {
1159
+ let groupAlive = true;
1160
+ try {
1161
+ process.kill(pgid, 0);
1162
+ }
1163
+ catch {
1164
+ groupAlive = false;
1165
+ }
1166
+ if (!groupAlive)
1167
+ return;
1168
+ teardownEscalated = true;
1169
+ logLatency({
1170
+ type: "phase",
1171
+ phase: "spawn_group_kill_escalation",
1172
+ filePath: "",
1173
+ durationMs: 0,
1174
+ metadata: { pgid: child.pid },
1175
+ });
1176
+ try {
1177
+ process.kill(pgid, "SIGKILL");
1178
+ }
1179
+ catch {
1180
+ // Raced with group exit.
1181
+ }
1182
+ }, 1000);
1183
+ }
1069
1184
  else {
1070
1185
  child.kill("SIGTERM");
1071
1186
  escalationTimer = setTimeout(() => {
1072
- if (!closed)
1187
+ if (!closed) {
1188
+ teardownEscalated = true;
1073
1189
  child.kill("SIGKILL");
1190
+ }
1074
1191
  }, 1000);
1075
1192
  }
1076
1193
  };
@@ -1119,14 +1236,21 @@ export async function safeSpawnAsync(command, args, options) {
1119
1236
  // boolean here, before any await, means `waitForPipeIdle` can check
1120
1237
  // "did close already happen" synchronously the moment it runs.
1121
1238
  let closeSeen = false;
1239
+ // #2010: WHEN death was observed - the stop-clock for teardown evidence
1240
+ // and the discriminator for its outcome. A close that predates the
1241
+ // budget-expired kill means the child exited on its own ("exited"), no
1242
+ // matter that the timer callback raced and armed a kill anyway.
1243
+ let closedAtMs;
1122
1244
  child.on("close", () => {
1123
1245
  closeSeen = true;
1246
+ closedAtMs ??= Date.now();
1124
1247
  });
1125
1248
  // Timeout handling - KILL the process, don't just abandon it
1126
1249
  const timeoutId = setTimeout(() => {
1127
1250
  timedOut = true;
1128
1251
  if (!killed && !child.killed) {
1129
1252
  killed = true;
1253
+ teardownStartedAtMs = Date.now();
1130
1254
  killPromise = killTree();
1131
1255
  }
1132
1256
  }, timeout);
@@ -1267,11 +1391,14 @@ export async function safeSpawnAsync(command, args, options) {
1267
1391
  await killPromise;
1268
1392
  if (resolved)
1269
1393
  return;
1270
- // #1109: the child has exited — if killTree armed the non-Windows
1271
- // SIGTERM→SIGKILL escalation timer and it hasn't fired yet, clear it
1272
- // so it doesn't linger as a ref'd handle after this promise resolves.
1273
- if (escalationTimer)
1394
+ // #1109: the child has exited - clear the non-Windows escalation
1395
+ // timer so it doesn't linger as a ref'd handle. #2027 EXCEPTION:
1396
+ // in POSIX group mode the timer is the liveness-gated SIGKILL
1397
+ // backstop for SIGTERM-hardy grandchildren; it stays armed and
1398
+ // self-cleans within 1s of firing (max 1s ref'd tail).
1399
+ if (escalationTimer && !posixProcessGroup) {
1274
1400
  clearTimeout(escalationTimer);
1401
+ }
1275
1402
  // #1673 review F1: latch the verdict as DECIDED here, before the
1276
1403
  // idle-pipe wait — not after it. `code`/`signal`/`timedOut`/`aborted`
1277
1404
  // are already fixed by this point (they don't change during the
@@ -1294,6 +1421,15 @@ export async function safeSpawnAsync(command, args, options) {
1294
1421
  const signalInfo = signal ? { signal } : {};
1295
1422
  if (timedOut) {
1296
1423
  const cause = new Error(`Process timed out after ${timeout}ms (killed with ${signal || "SIGTERM"})`);
1424
+ // #2010: teardown evidence lives ONLY on the timeout path - it
1425
+ // describes how long the tree took to die after the budget
1426
+ // expired, and how it died ("exited" = the child beat the signal;
1427
+ // "killed-by-signal" / "escalate-kill" = how WE ended it).
1428
+ const timeoutTeardown = resolveTeardownOutcome({
1429
+ killStartedAtMs: teardownStartedAtMs,
1430
+ deathObservedAtMs: closedAtMs,
1431
+ escalated: teardownEscalated,
1432
+ });
1297
1433
  resolve({
1298
1434
  stdout,
1299
1435
  stderr,
@@ -1301,6 +1437,7 @@ export async function safeSpawnAsync(command, args, options) {
1301
1437
  error: cause,
1302
1438
  failure: "timeout",
1303
1439
  ...signalInfo,
1440
+ ...(timeoutTeardown && { timeoutTeardown }),
1304
1441
  spawnFailure: new SpawnFailureError("timeout", cause.message, cause),
1305
1442
  ...outputInfo,
1306
1443
  resourceUsage,
@@ -1383,8 +1520,10 @@ export async function safeSpawnAsync(command, args, options) {
1383
1520
  closed = true;
1384
1521
  clearTimeout(timeoutId);
1385
1522
  abortSignal?.removeEventListener("abort", onAbort);
1386
- if (escalationTimer)
1523
+ // #2027: group-mode timer stays armed as the grandchild backstop.
1524
+ if (escalationTimer && !posixProcessGroup) {
1387
1525
  clearTimeout(escalationTimer);
1526
+ }
1388
1527
  if (child.pid)
1389
1528
  lifetimeState.pids.delete(child.pid);
1390
1529
  const resourceUsage = finishResourceUsage();
@@ -89,9 +89,7 @@ export class SecurityScanClient {
89
89
  */
90
90
  constructor(toolName, verbose = false) {
91
91
  this.toolName = toolName;
92
- this.log = verbose
93
- ? createSubsystemLogger(toolName)
94
- : () => { };
92
+ this.log = verbose ? createSubsystemLogger(toolName) : () => { };
95
93
  }
96
94
  /**
97
95
  * Resolve (once) whether the scanner is usable, sharing the probe promise
@@ -31,7 +31,9 @@ export function formatSlopScoreSummary(summary) {
31
31
  }
32
32
  const topRules = summary.ruleCounts.slice(0, 3);
33
33
  const detail = topRules.length > 0
34
- ? " (" + topRules.map((entry) => entry.ruleId + " ×" + entry.count).join(", ") + ")"
34
+ ? " (" +
35
+ topRules.map((entry) => entry.ruleId + " ×" + entry.count).join(", ") +
36
+ ")"
35
37
  : "";
36
38
  return `Slop score: ${summary.scorePerKloc.toFixed(1)}/KLOC${detail}`;
37
39
  }
@@ -151,9 +151,7 @@ export class SgRunner {
151
151
  */
152
152
  sweepDurablyMissing = [];
153
153
  constructor(verbose = false) {
154
- this.log = verbose
155
- ? createSubsystemLogger("sg-runner")
156
- : () => { };
154
+ this.log = verbose ? createSubsystemLogger("sg-runner") : () => { };
157
155
  }
158
156
  /**
159
157
  * Check if ast-grep CLI is available, auto-install if not.
@@ -72,9 +72,9 @@ export function sourceTwinCandidates(filePath) {
72
72
  : ext === ".cjs"
73
73
  ? [".cts", ".ts", ".tsx", ".mts"]
74
74
  : ext === ".jsx"
75
- // Deliberately retain the broad fallback: a .jsx next to a .ts
76
- // is treated as a build artifact even without a .tsx sibling.
77
- ? [".tsx", ".ts", ".mts", ".cts"]
75
+ ? // Deliberately retain the broad fallback: a .jsx next to a .ts
76
+ // is treated as a build artifact even without a .tsx sibling.
77
+ [".tsx", ".ts", ".mts", ".cts"]
78
78
  : ext === ".js"
79
79
  ? [".ts", ".tsx", ".mts", ".cts"]
80
80
  : [];
@@ -251,7 +251,7 @@ function classifySkipGeneratedOrArtifact(filePath, options) {
251
251
  });
252
252
  }
253
253
  function shouldSkipGeneratedOrArtifact(filePath, options) {
254
- return classifySkipGeneratedOrArtifact(filePath, options).verdict === "generated";
254
+ return (classifySkipGeneratedOrArtifact(filePath, options).verdict === "generated");
255
255
  }
256
256
  /**
257
257
  * Extract the basename (filename without extension) from a path.
@@ -281,7 +281,8 @@ export function findSourceSibling(filePath, probeCache) {
281
281
  const dir = getDir(filePath);
282
282
  const base = getBasename(filePath);
283
283
  for (const [sourceExt, shadowedExts] of Object.entries(SOURCE_PRECEDENCE)) {
284
- if (!sourceExtsForCompiledExt(sourceExt).length && shadowedExts.includes(ext)) {
284
+ if (!sourceExtsForCompiledExt(sourceExt).length &&
285
+ shadowedExts.includes(ext)) {
285
286
  const siblingPath = path.join(dir, base + sourceExt);
286
287
  if (probeExists(siblingPath, probeCache))
287
288
  return siblingPath;
@@ -296,7 +297,10 @@ export function findSourceSibling(filePath, probeCache) {
296
297
  * Omit for the original, uncached behavior.
297
298
  */
298
299
  function sourceExtsForCompiledExt(sourceExt) {
299
- return sourceExt === ".ts" || sourceExt === ".tsx" || sourceExt === ".mts" || sourceExt === ".cts"
300
+ return sourceExt === ".ts" ||
301
+ sourceExt === ".tsx" ||
302
+ sourceExt === ".mts" ||
303
+ sourceExt === ".cts"
300
304
  ? [sourceExt]
301
305
  : [];
302
306
  }
@@ -31,7 +31,7 @@ import * as fs from "node:fs";
31
31
  import * as path from "node:path";
32
32
  import { isExcludedDirName } from "./file-utils.js";
33
33
  import { isGeneratedArtifactDirectoryName } from "./generated-artifacts.js";
34
- import { createDeadline, yieldIfOverBudget, } from "./cooperative-budget.js";
34
+ import { createDeadline, yieldIfOverBudget } from "./cooperative-budget.js";
35
35
  /**
36
36
  * Read a directory's entries, returning `[]` for a permission-denied or
37
37
  * missing directory instead of throwing. Shared by every walker below — a