@herbertgao/pi-extensions 2026.8.11 → 2026.8.12

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 (374) hide show
  1. package/README.md +18 -10
  2. package/{node_modules/@herbertgao/pi-inline-skills/LICENSE → THIRD_PARTY_NOTICES.md} +15 -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/@narumitw/pi-btw/dist/index.ts +143 -46
  47. package/node_modules/@narumitw/pi-btw/dist/index.ts.map +3 -3
  48. package/node_modules/@narumitw/pi-btw/package.json +6 -6
  49. package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +136 -22
  50. package/node_modules/{@herbertgao → @tifan}/pi-copy-response/README.md +2 -4
  51. package/node_modules/{@herbertgao → @tifan}/pi-copy-response/package.json +5 -15
  52. package/node_modules/{@herbertgao → @tifan}/pi-handoff/README.md +4 -6
  53. package/node_modules/@tifan/pi-handoff/package.json +43 -0
  54. package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/index.ts +1 -1
  55. package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/README.md +2 -4
  56. package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/package.json +5 -15
  57. package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/README.md +5 -7
  58. package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/package.json +5 -19
  59. package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/README.md +4 -6
  60. package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/package.json +6 -16
  61. package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/src/index.ts +1 -6
  62. package/node_modules/{@herbertgao → @tifan}/pi-recap/README.md +4 -6
  63. package/node_modules/@tifan/pi-recap/package.json +42 -0
  64. package/node_modules/{@herbertgao → @tifan}/pi-recap/src/models.ts +1 -6
  65. package/node_modules/{@herbertgao → @tifan}/pi-rename/README.md +13 -8
  66. package/node_modules/@tifan/pi-rename/package.json +47 -0
  67. package/node_modules/@tifan/pi-rename/src/herdr-label.ts +4 -0
  68. package/node_modules/{@herbertgao → @tifan}/pi-rename/src/index.ts +4 -16
  69. package/node_modules/{@herbertgao → @tifan}/pi-rename/src/models.ts +1 -6
  70. package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/README.md +2 -4
  71. package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/package.json +5 -15
  72. package/node_modules/pi-lens/CHANGELOG.md +96 -1
  73. package/node_modules/pi-lens/dist/clients/actionable-warnings-logger.js +2 -1
  74. package/node_modules/pi-lens/dist/clients/actionable-warnings.js +14 -5
  75. package/node_modules/pi-lens/dist/clients/advisory-provenance.js +48 -18
  76. package/node_modules/pi-lens/dist/clients/ast-grep-client.js +1 -3
  77. package/node_modules/pi-lens/dist/clients/atomic-write-staging.js +16 -4
  78. package/node_modules/pi-lens/dist/clients/bash-file-access.js +3 -1
  79. package/node_modules/pi-lens/dist/clients/biome-client.js +1 -3
  80. package/node_modules/pi-lens/dist/clients/blocker-freshness.js +21 -8
  81. package/node_modules/pi-lens/dist/clients/bounded-cache.js +24 -8
  82. package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +4 -3
  83. package/node_modules/pi-lens/dist/clients/cache-manager.js +6 -7
  84. package/node_modules/pi-lens/dist/clients/cache-observability.js +461 -66
  85. package/node_modules/pi-lens/dist/clients/call-graph.js +238 -63
  86. package/node_modules/pi-lens/dist/clients/codebase-model.js +13 -5
  87. package/node_modules/pi-lens/dist/clients/complexity-client.js +1 -3
  88. package/node_modules/pi-lens/dist/clients/dead-code-client.js +19 -8
  89. package/node_modules/pi-lens/dist/clients/dead-code-logger.js +1 -2
  90. package/node_modules/pi-lens/dist/clients/deadline-utils.js +3 -1
  91. package/node_modules/pi-lens/dist/clients/debug-heap.js +8 -1
  92. package/node_modules/pi-lens/dist/clients/degradation-ledger.js +1 -1
  93. package/node_modules/pi-lens/dist/clients/dependency-checker.js +11 -7
  94. package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +39 -2
  95. package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +5 -1
  96. package/node_modules/pi-lens/dist/clients/dispatch/auxiliary-lsp.js +2 -3
  97. package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +13 -1
  98. package/node_modules/pi-lens/dist/clients/dispatch/facts/function-facts.js +3 -1
  99. package/node_modules/pi-lens/dist/clients/dispatch/facts/import-facts.js +2 -1
  100. package/node_modules/pi-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +1 -1
  101. package/node_modules/pi-lens/dist/clients/dispatch/integration.js +9 -4
  102. package/node_modules/pi-lens/dist/clients/dispatch/rules/error-swallowing.js +3 -1
  103. package/node_modules/pi-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +6 -2
  104. package/node_modules/pi-lens/dist/clients/dispatch/rules/unsafe-boundary.js +31 -7
  105. package/node_modules/pi-lens/dist/clients/dispatch/runners/actionlint.js +5 -2
  106. package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +10 -14
  107. package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +5 -1
  108. package/node_modules/pi-lens/dist/clients/dispatch/runners/dotnet-build.js +1 -1
  109. package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +3 -1
  110. package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +25 -6
  111. package/node_modules/pi-lens/dist/clients/dispatch/runners/fish-indent.js +1 -1
  112. package/node_modules/pi-lens/dist/clients/dispatch/runners/gleam-check.js +1 -1
  113. package/node_modules/pi-lens/dist/clients/dispatch/runners/golangci-lint.js +3 -1
  114. package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +13 -8
  115. package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +4 -1
  116. package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +25 -10
  117. package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +1 -1
  118. package/node_modules/pi-lens/dist/clients/dispatch/runners/ktlint.js +1 -1
  119. package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +1 -1
  120. package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +28 -4
  121. package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +6 -8
  122. package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +212 -11
  123. package/node_modules/pi-lens/dist/clients/dispatch/runners/php-lint.js +1 -1
  124. package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +8 -4
  125. package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +10 -6
  126. package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +23 -14
  127. package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +1 -1
  128. package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +7 -9
  129. package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +5 -2
  130. package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +7 -7
  131. package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +6 -8
  132. package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +13 -8
  133. package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +13 -8
  134. package/node_modules/pi-lens/dist/clients/dispatch/runners/tree-sitter.js +17 -3
  135. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +7 -1
  136. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +24 -1
  137. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +35 -0
  138. package/node_modules/pi-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +1 -3
  139. package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +6 -8
  140. package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +1 -1
  141. package/node_modules/pi-lens/dist/clients/dispatch/suppress-writer.js +2 -1
  142. package/node_modules/pi-lens/dist/clients/dispatch/types.js +6 -1
  143. package/node_modules/pi-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +6 -2
  144. package/node_modules/pi-lens/dist/clients/extension-log.js +5 -3
  145. package/node_modules/pi-lens/dist/clients/feature-hints.js +8 -1
  146. package/node_modules/pi-lens/dist/clients/file-kinds.js +34 -129
  147. package/node_modules/pi-lens/dist/clients/file-utils.js +17 -1
  148. package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +57 -2
  149. package/node_modules/pi-lens/dist/clients/formatters.js +144 -27
  150. package/node_modules/pi-lens/dist/clients/freshness.js +38 -0
  151. package/node_modules/pi-lens/dist/clients/git-guard.js +43 -13
  152. package/node_modules/pi-lens/dist/clients/go-client.js +1 -3
  153. package/node_modules/pi-lens/dist/clients/grammar-source.js +1 -1
  154. package/node_modules/pi-lens/dist/clients/gzip-stage-write.js +30 -4
  155. package/node_modules/pi-lens/dist/clients/host-edit-normalize.js +1 -3
  156. package/node_modules/pi-lens/dist/clients/install-diagnostics.js +4 -2
  157. package/node_modules/pi-lens/dist/clients/installer/index.js +86 -77
  158. package/node_modules/pi-lens/dist/clients/instance-reaper.js +5 -2
  159. package/node_modules/pi-lens/dist/clients/instance-registry.js +4 -2
  160. package/node_modules/pi-lens/dist/clients/jscpd-client.js +6 -1
  161. package/node_modules/pi-lens/dist/clients/knip-client.js +29 -15
  162. package/node_modules/pi-lens/dist/clients/language-profile.js +4 -1
  163. package/node_modules/pi-lens/dist/clients/latency-logger.js +13 -2
  164. package/node_modules/pi-lens/dist/clients/lens-config.js +1 -1
  165. package/node_modules/pi-lens/dist/clients/lens-map.js +8 -3
  166. package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +1 -1
  167. package/node_modules/pi-lens/dist/clients/lsp/config.js +4 -6
  168. package/node_modules/pi-lens/dist/clients/lsp/edits.js +119 -32
  169. package/node_modules/pi-lens/dist/clients/lsp/index.js +94 -35
  170. package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +2 -1
  171. package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +4 -1
  172. package/node_modules/pi-lens/dist/clients/lsp/launch.js +11 -3
  173. package/node_modules/pi-lens/dist/clients/lsp/pending-aux-coverage.js +152 -0
  174. package/node_modules/pi-lens/dist/clients/lsp/server.js +19 -7
  175. package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +10 -2
  176. package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +9 -4
  177. package/node_modules/pi-lens/dist/clients/lsp-document-symbols.js +1 -3
  178. package/node_modules/pi-lens/dist/clients/lsp-mutation.js +10 -20
  179. package/node_modules/pi-lens/dist/clients/mcp/host-shim.js +1 -1
  180. package/node_modules/pi-lens/dist/clients/memory-sampler.js +73 -7
  181. package/node_modules/pi-lens/dist/clients/metrics-client.js +1 -3
  182. package/node_modules/pi-lens/dist/clients/middle-man-analysis.js +8 -3
  183. package/node_modules/pi-lens/dist/clients/module-report-lsp.js +7 -1
  184. package/node_modules/pi-lens/dist/clients/module-report.js +14 -17
  185. package/node_modules/pi-lens/dist/clients/ndjson-logger.js +3 -5
  186. package/node_modules/pi-lens/dist/clients/opaque-mutation-scan.js +220 -0
  187. package/node_modules/pi-lens/dist/clients/package-manager.js +6 -1
  188. package/node_modules/pi-lens/dist/clients/pipeline.js +57 -9
  189. package/node_modules/pi-lens/dist/clients/project-conventions.js +2 -8
  190. package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +10 -7
  191. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +2 -1
  192. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +3 -1
  193. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +13 -9
  194. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +3 -1
  195. package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +5 -2
  196. package/node_modules/pi-lens/dist/clients/project-lens-config.js +12 -5
  197. package/node_modules/pi-lens/dist/clients/project-snapshot-fingerprint.js +48 -0
  198. package/node_modules/pi-lens/dist/clients/project-snapshot-persist-worker.js +15 -1
  199. package/node_modules/pi-lens/dist/clients/project-snapshot.js +472 -66
  200. package/node_modules/pi-lens/dist/clients/read-expansion.js +12 -2
  201. package/node_modules/pi-lens/dist/clients/read-guard-logger.js +5 -4
  202. package/node_modules/pi-lens/dist/clients/read-guard-tool-lines.js +5 -2
  203. package/node_modules/pi-lens/dist/clients/read-guard.js +1 -1
  204. package/node_modules/pi-lens/dist/clients/resource-sampler.js +1 -1
  205. package/node_modules/pi-lens/dist/clients/reverse-deps.js +6 -5
  206. package/node_modules/pi-lens/dist/clients/review-graph/builder.js +42 -17
  207. package/node_modules/pi-lens/dist/clients/review-graph/git-identity.js +8 -2
  208. package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +10 -1
  209. package/node_modules/pi-lens/dist/clients/review-graph/query.js +2 -1
  210. package/node_modules/pi-lens/dist/clients/review-graph/tsconfig-paths.js +4 -2
  211. package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +2 -2
  212. package/node_modules/pi-lens/dist/clients/ruff-client.js +6 -5
  213. package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +63 -31
  214. package/node_modules/pi-lens/dist/clients/runtime-context.js +12 -4
  215. package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +83 -4
  216. package/node_modules/pi-lens/dist/clients/runtime-session.js +14 -0
  217. package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +59 -3
  218. package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +148 -34
  219. package/node_modules/pi-lens/dist/clients/runtime-turn.js +147 -6
  220. package/node_modules/pi-lens/dist/clients/rust-client.js +1 -3
  221. package/node_modules/pi-lens/dist/clients/safe-spawn.js +150 -11
  222. package/node_modules/pi-lens/dist/clients/security-scan-client.js +1 -3
  223. package/node_modules/pi-lens/dist/clients/session-summary.js +3 -1
  224. package/node_modules/pi-lens/dist/clients/sg-runner.js +1 -3
  225. package/node_modules/pi-lens/dist/clients/source-filter.js +10 -6
  226. package/node_modules/pi-lens/dist/clients/source-walker.js +1 -1
  227. package/node_modules/pi-lens/dist/clients/spawn-timeout-cooldown.js +96 -0
  228. package/node_modules/pi-lens/dist/clients/startup-scan.js +4 -1
  229. package/node_modules/pi-lens/dist/clients/tool-definition.js +7 -0
  230. package/node_modules/pi-lens/dist/clients/tool-policy.js +26 -11
  231. package/node_modules/pi-lens/dist/clients/tool-render.js +2 -1
  232. package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +10 -4
  233. package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +2 -2
  234. package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +12 -5
  235. package/node_modules/pi-lens/dist/clients/warm-attach.js +12 -5
  236. package/node_modules/pi-lens/dist/clients/widget-state.js +27 -11
  237. package/node_modules/pi-lens/dist/clients/word-index.js +3 -1
  238. package/node_modules/pi-lens/dist/clients/workspace-topology.js +8 -2
  239. package/node_modules/pi-lens/dist/clients/zizmor-config.js +9 -1
  240. package/node_modules/pi-lens/dist/i18n.js +13 -5
  241. package/node_modules/pi-lens/dist/index.js +10797 -8627
  242. package/node_modules/pi-lens/dist/mcp/server.js +3 -1
  243. package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +68 -12
  244. package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +21 -7
  245. package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +164 -35
  246. package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +24 -7
  247. package/node_modules/pi-lens/dist/tools/lsp-navigation.js +3 -1
  248. package/node_modules/pi-lens/dist/tools/module-report.js +1 -1
  249. package/node_modules/pi-lens/dist/tools/project-report.js +1 -1
  250. package/node_modules/pi-lens/dist/tools/symbol-search.js +5 -2
  251. package/node_modules/pi-lens/docs/durable-store-audit-1202.md +1 -1
  252. package/node_modules/pi-lens/docs/servercapabilities.md +1 -1
  253. package/node_modules/pi-lens/package.json +160 -156
  254. package/node_modules/pi-lens/rules/typos/_typos.toml +2 -2
  255. package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +31 -13
  256. package/node_modules/pi-lens/scripts/download-grammars.js +9 -3
  257. package/node_modules/pi-lens/scripts/rpc-load-check.mjs +30 -9
  258. package/node_modules/pi-mcp-adapter/CHANGELOG.md +34 -0
  259. package/node_modules/pi-mcp-adapter/README.md +42 -13
  260. package/node_modules/pi-mcp-adapter/commands.ts +4 -2
  261. package/node_modules/pi-mcp-adapter/config.ts +35 -5
  262. package/node_modules/pi-mcp-adapter/direct-tools.ts +103 -92
  263. package/node_modules/pi-mcp-adapter/dist/agent-dir.d.ts +10 -0
  264. package/node_modules/pi-mcp-adapter/dist/agent-dir.js +63 -0
  265. package/node_modules/pi-mcp-adapter/dist/agent-dir.js.map +1 -0
  266. package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.d.ts +8 -0
  267. package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.js +356 -0
  268. package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.js.map +1 -0
  269. package/node_modules/pi-mcp-adapter/dist/config.d.ts +123 -0
  270. package/node_modules/pi-mcp-adapter/dist/config.js +1077 -0
  271. package/node_modules/pi-mcp-adapter/dist/config.js.map +1 -0
  272. package/node_modules/pi-mcp-adapter/dist/metadata-cache.d.ts +19 -0
  273. package/node_modules/pi-mcp-adapter/dist/metadata-cache.js +319 -0
  274. package/node_modules/pi-mcp-adapter/dist/metadata-cache.js.map +1 -0
  275. package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.d.ts +2 -0
  276. package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.js +156 -0
  277. package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.js.map +1 -0
  278. package/node_modules/pi-mcp-adapter/dist/resource-tools.d.ts +1 -0
  279. package/node_modules/pi-mcp-adapter/dist/resource-tools.js +15 -0
  280. package/node_modules/pi-mcp-adapter/dist/resource-tools.js.map +1 -0
  281. package/node_modules/pi-mcp-adapter/dist/types.d.ts +564 -0
  282. package/node_modules/pi-mcp-adapter/dist/types.js +287 -0
  283. package/node_modules/pi-mcp-adapter/dist/types.js.map +1 -0
  284. package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.d.ts +6 -0
  285. package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.js +37 -0
  286. package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.js.map +1 -0
  287. package/node_modules/pi-mcp-adapter/dist/ui-stream-types.d.ts +104 -0
  288. package/node_modules/pi-mcp-adapter/dist/ui-stream-types.js +59 -0
  289. package/node_modules/pi-mcp-adapter/dist/ui-stream-types.js.map +1 -0
  290. package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.d.ts +4 -0
  291. package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.js +27 -0
  292. package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.js.map +1 -0
  293. package/node_modules/pi-mcp-adapter/dist/utils.d.ts +32 -0
  294. package/node_modules/pi-mcp-adapter/dist/utils.js +338 -0
  295. package/node_modules/pi-mcp-adapter/dist/utils.js.map +1 -0
  296. package/node_modules/pi-mcp-adapter/failure-backoff.ts +23 -0
  297. package/node_modules/pi-mcp-adapter/index.ts +204 -82
  298. package/node_modules/pi-mcp-adapter/init.ts +36 -29
  299. package/node_modules/pi-mcp-adapter/lifecycle.ts +16 -8
  300. package/node_modules/pi-mcp-adapter/mcp-code.ts +2 -0
  301. package/node_modules/pi-mcp-adapter/mcp-oauth-provider.ts +66 -16
  302. package/node_modules/pi-mcp-adapter/mcp-output-guard.ts +95 -7
  303. package/node_modules/pi-mcp-adapter/mcp-probe.ts +18 -4
  304. package/node_modules/pi-mcp-adapter/mcp-references.ts +368 -0
  305. package/node_modules/pi-mcp-adapter/mcp-status.ts +8 -19
  306. package/node_modules/pi-mcp-adapter/metadata-cache.ts +20 -12
  307. package/node_modules/pi-mcp-adapter/namespace-tools.ts +276 -0
  308. package/node_modules/pi-mcp-adapter/package.json +24 -6
  309. package/node_modules/pi-mcp-adapter/proxy-modes.ts +66 -10
  310. package/node_modules/pi-mcp-adapter/search-ranking.ts +2 -0
  311. package/node_modules/pi-mcp-adapter/server-manager.ts +63 -12
  312. package/node_modules/pi-mcp-adapter/state.ts +1 -3
  313. package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +16 -2
  314. package/node_modules/pi-mcp-adapter/types.ts +48 -1
  315. package/node_modules/pi-mcp-adapter/ui-server.ts +3 -19
  316. package/node_modules/pi-mcp-adapter/ui-session.ts +2 -1
  317. package/node_modules/pi-mcp-adapter/utils.ts +21 -19
  318. package/node_modules/pi-web-access/CHANGELOG.md +26 -0
  319. package/node_modules/pi-web-access/README.md +71 -14
  320. package/node_modules/pi-web-access/chrome-cookies.ts +115 -35
  321. package/node_modules/pi-web-access/credential-source.ts +6 -2
  322. package/node_modules/pi-web-access/curator-page.ts +5 -3
  323. package/node_modules/pi-web-access/curator-server.ts +2 -1
  324. package/node_modules/pi-web-access/extract.ts +89 -9
  325. package/node_modules/pi-web-access/fetch-params.ts +13 -0
  326. package/node_modules/pi-web-access/gemini-adc.ts +298 -0
  327. package/node_modules/pi-web-access/gemini-api.ts +59 -15
  328. package/node_modules/pi-web-access/gemini-search.ts +58 -18
  329. package/node_modules/pi-web-access/gemini-url-context.ts +3 -2
  330. package/node_modules/pi-web-access/gemini-web-config.ts +57 -7
  331. package/node_modules/pi-web-access/gemini-web.ts +9 -3
  332. package/node_modules/pi-web-access/github-api.ts +5 -4
  333. package/node_modules/pi-web-access/github-issue-pr.ts +700 -0
  334. package/node_modules/pi-web-access/index.ts +403 -297
  335. package/node_modules/pi-web-access/kimi-search.ts +234 -0
  336. package/node_modules/pi-web-access/openai-search.ts +118 -21
  337. package/node_modules/pi-web-access/package.json +3 -2
  338. package/node_modules/pi-web-access/ssrf-protection.ts +4 -1
  339. package/node_modules/pi-web-access/utils.ts +307 -1
  340. package/node_modules/pi-web-access/youtube-extract.ts +2 -2
  341. package/package.json +40 -37
  342. package/node_modules/@herbertgao/pi-copy-response/CHANGELOG.md +0 -49
  343. package/node_modules/@herbertgao/pi-copy-response/LICENSE +0 -22
  344. package/node_modules/@herbertgao/pi-handoff/CHANGELOG.md +0 -83
  345. package/node_modules/@herbertgao/pi-handoff/LICENSE +0 -22
  346. package/node_modules/@herbertgao/pi-handoff/package.json +0 -60
  347. package/node_modules/@herbertgao/pi-inline-skills/CHANGELOG.md +0 -57
  348. package/node_modules/@herbertgao/pi-mermaid-open/CHANGELOG.md +0 -39
  349. package/node_modules/@herbertgao/pi-mermaid-open/LICENSE +0 -22
  350. package/node_modules/@herbertgao/pi-preferred-thinking/CHANGELOG.md +0 -63
  351. package/node_modules/@herbertgao/pi-preferred-thinking/LICENSE +0 -22
  352. package/node_modules/@herbertgao/pi-recap/CHANGELOG.md +0 -101
  353. package/node_modules/@herbertgao/pi-recap/LICENSE +0 -22
  354. package/node_modules/@herbertgao/pi-recap/package.json +0 -55
  355. package/node_modules/@herbertgao/pi-rename/CHANGELOG.md +0 -49
  356. package/node_modules/@herbertgao/pi-rename/LICENSE +0 -22
  357. package/node_modules/@herbertgao/pi-rename/package.json +0 -63
  358. package/node_modules/@herbertgao/pi-titlebar-spinner/CHANGELOG.md +0 -25
  359. package/node_modules/@herbertgao/pi-titlebar-spinner/LICENSE +0 -22
  360. /package/node_modules/{@herbertgao → @tifan}/pi-copy-response/src/index.ts +0 -0
  361. /package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/complete-text.ts +0 -0
  362. /package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/session-query.ts +0 -0
  363. /package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/src/index.ts +0 -0
  364. /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/herdr-plugin/herdr-plugin.toml +0 -0
  365. /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/herdr-plugin/viewer.mjs +0 -0
  366. /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/src/index.ts +0 -0
  367. /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/index.ts +0 -0
  368. /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/model-picker.ts +0 -0
  369. /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/sanitize.ts +0 -0
  370. /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/tui.ts +0 -0
  371. /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/model-picker.ts +0 -0
  372. /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/naming.ts +0 -0
  373. /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/sanitize.ts +0 -0
  374. /package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/src/index.ts +0 -0
@@ -5,6 +5,7 @@ import { getLinterPolicyForCwd } from "../../tool-policy.js";
5
5
  import { PRIORITY } from "../priorities.js";
6
6
  import { createAvailabilityChecker, resolveAvailableOrInstall, } from "./utils/runner-helpers.js";
7
7
  import { spawnFailedWithNoOutput } from "./utils/spawn-outcome.js";
8
+ import { finishParsedRun } from "./utils/tool-failure.js";
8
9
  const terragrunt = createAvailabilityChecker("terragrunt", ".exe");
9
10
  function normalizeSeverity(raw) {
10
11
  if (typeof raw === "number")
@@ -149,15 +150,19 @@ const terragruntRunner = {
149
150
  if (spawnFailedWithNoOutput(result))
150
151
  return SKIPPED;
151
152
  const diagnostics = parseTerragruntOutput(result.stdout || "", ctx.filePath, absPath);
152
- if (diagnostics.length === 0) {
153
- return { status: "succeeded", diagnostics: [], semantic: "none" };
154
- }
155
- const hasErrors = diagnostics.some((d) => d.severity === "error");
156
- return {
157
- status: hasErrors ? "failed" : "succeeded",
153
+ return finishParsedRun({
154
+ tool: "terragrunt",
155
+ ctx,
156
+ result,
158
157
  diagnostics,
159
- semantic: hasErrors ? "blocking" : "warning",
160
- };
158
+ classify: (diagnostics) => {
159
+ const hasErrors = diagnostics.some((d) => d.severity === "error");
160
+ return {
161
+ status: hasErrors ? "failed" : "succeeded",
162
+ semantic: hasErrors ? "blocking" : "warning",
163
+ };
164
+ },
165
+ });
161
166
  },
162
167
  };
163
168
  export default terragruntRunner;
@@ -5,6 +5,7 @@ import { findNearestDirWithAnyBasename } from "../../workspace-topology.js";
5
5
  import { PRIORITY } from "../priorities.js";
6
6
  import { createAvailabilityChecker, resolveAvailableOrInstall, } from "./utils/runner-helpers.js";
7
7
  import { parseToolRun } from "./utils/tool-failure.js";
8
+ import { finishParsedRun } from "./utils/tool-failure.js";
8
9
  const tflint = createAvailabilityChecker("tflint", ".exe");
9
10
  const TFLINT_CONFIG = ".tflint.hcl";
10
11
  /**
@@ -91,15 +92,19 @@ const tflintRunner = {
91
92
  if (run.skipped)
92
93
  return run.skipped;
93
94
  const diagnostics = run.diagnostics;
94
- if (diagnostics.length === 0) {
95
- return { status: "succeeded", diagnostics: [], semantic: "none" };
96
- }
97
- const hasErrors = diagnostics.some((d) => d.severity === "error");
98
- return {
99
- status: hasErrors ? "failed" : "succeeded",
95
+ return finishParsedRun({
96
+ tool: "tflint",
97
+ ctx,
98
+ result,
100
99
  diagnostics,
101
- semantic: hasErrors ? "blocking" : "warning",
102
- };
100
+ classify: (diagnostics) => {
101
+ const hasErrors = diagnostics.some((d) => d.severity === "error");
102
+ return {
103
+ status: hasErrors ? "failed" : "succeeded",
104
+ semantic: hasErrors ? "blocking" : "warning",
105
+ };
106
+ },
107
+ });
103
108
  },
104
109
  };
105
110
  export default tflintRunner;
@@ -300,7 +300,9 @@ const ENTITY_EXTRACTION_LINE_THRESHOLD = 5;
300
300
  */
301
301
  function relativeForIgnoreGlob(filePath, root) {
302
302
  const rel = path.relative(root, filePath);
303
- const normalized = (rel.startsWith("..") ? filePath : rel).split(path.sep).join("/");
303
+ const normalized = (rel.startsWith("..") ? filePath : rel)
304
+ .split(path.sep)
305
+ .join("/");
304
306
  return normalized;
305
307
  }
306
308
  function matchesIgnorePaths(filePath, root, patterns) {
@@ -311,7 +313,17 @@ function matchesIgnorePaths(filePath, root, patterns) {
311
313
  }
312
314
  const treeSitterRunner = {
313
315
  id: "tree-sitter",
314
- appliesTo: ["jsts", "python", "go", "rust", "ruby", "cxx", "csharp", "php", "css"],
316
+ appliesTo: [
317
+ "jsts",
318
+ "python",
319
+ "go",
320
+ "rust",
321
+ "ruby",
322
+ "cxx",
323
+ "csharp",
324
+ "php",
325
+ "css",
326
+ ],
315
327
  priority: PRIORITY.STRUCTURAL_ANALYSIS,
316
328
  enabledByDefault: true,
317
329
  skipTestFiles: false, // Run on test files too (structural issues matter there)
@@ -323,7 +335,9 @@ const treeSitterRunner = {
323
335
  logTreeSitter({
324
336
  phase: "runner_skip",
325
337
  filePath: ctx.filePath,
326
- reason: isTreeSitterWasmAborted() ? "wasm_aborted" : "client_unavailable",
338
+ reason: isTreeSitterWasmAborted()
339
+ ? "wasm_aborted"
340
+ : "client_unavailable",
327
341
  status: "skipped",
328
342
  });
329
343
  return { status: "skipped", diagnostics: [], semantic: "none" };
@@ -80,5 +80,11 @@ export async function probeAvailabilityCandidates(candidates, probeArgs, timeout
80
80
  // above rather than through a thrown spawn.
81
81
  }
82
82
  }
83
- return { foundPath: null, sawTransient, transientCause, hostStallMs, evidence };
83
+ return {
84
+ foundPath: null,
85
+ sawTransient,
86
+ transientCause,
87
+ hostStallMs,
88
+ evidence,
89
+ };
84
90
  }
@@ -19,6 +19,7 @@ import { getServersForFileWithConfig, isServerDisabled, } from "../../../lsp/con
19
19
  import { findGlobalBinary } from "../../../package-manager.js";
20
20
  import { safeSpawnAsync } from "../../../safe-spawn.js";
21
21
  import { getToolCommandSpec, shouldAutoInstallTool, } from "../../../tool-policy.js";
22
+ import { isInSpawnTimeoutCooldown } from "../../../spawn-timeout-cooldown.js";
22
23
  import { classifyProbeFailure, createAvailabilityLatch, describeInstallAttempt, describeProbeEvidence, isLatchingOutcome, logAvailabilityDecision, startHostStallSampler, transientRetryDelayMs, } from "./availability-policy.js";
23
24
  export { createAvailabilityLatch, classifyProbeFailure, describeProbeEvidence, describeUnavailability, isTransientDecision, logAvailabilityDecision, startHostStallSampler, } from "./availability-policy.js";
24
25
  /**
@@ -777,6 +778,27 @@ export function createAvailabilityChecker(command, windowsExt = "", versionArgs
777
778
  return false;
778
779
  }
779
780
  const cmd = await findCommand(resolvedCwd);
781
+ // #1995: a command cooling down after a RUNTIME timeout (lint or
782
+ // autofix lane blew its real budget) must not re-probe on every
783
+ // edit - the positive verdict is effectively cooled. Consult-only:
784
+ // probe timeouts do NOT arm the cooldown here, because a single
785
+ // slow --version under host stall (#1467) is transient evidence,
786
+ // and session-long suppression from it would contradict the
787
+ // #1494 retry ladder this classification exists for.
788
+ if (isInSpawnTimeoutCooldown(cmd)) {
789
+ noteDecision(cache, resolvedCwd, {
790
+ available: false,
791
+ outcome: "transient",
792
+ cause: "probe-timeout",
793
+ elapsedMs: 0,
794
+ classifiedBy: "caller",
795
+ evidence: {
796
+ command: cmd,
797
+ status: null,
798
+ },
799
+ });
800
+ return false;
801
+ }
780
802
  const env = await options.environment?.(resolvedCwd);
781
803
  // The probe budget is enforced by a HOST-side timer, so host event-loop
782
804
  // stalls are charged to the child. Measure the stall that overlapped the
@@ -856,7 +878,8 @@ export function createAvailabilityChecker(command, windowsExt = "", versionArgs
856
878
  outcome: cache.outcome,
857
879
  cause: cache.cause,
858
880
  elapsedMs: cache.elapsedMs,
859
- latched: cache.available !== false || isLatchingOutcome(cache.outcome ?? "missing"),
881
+ latched: cache.available !== false ||
882
+ isLatchingOutcome(cache.outcome ?? "missing"),
860
883
  retryAtMs: cache.retryAtMs,
861
884
  };
862
885
  }
@@ -186,3 +186,38 @@ export function parseToolRun(tool, input, parse, options = {}) {
186
186
  }
187
187
  return { skipped: null, diagnostics, parsedNothing };
188
188
  }
189
+ export function finishParsedRun(input) {
190
+ const raw = `${input.result.stdout ?? ""}${input.result.stderr ?? ""}`;
191
+ const status = input.result.status ?? null;
192
+ if (input.diagnostics.length === 0) {
193
+ if (status !== 0 && raw.trim().length > 0) {
194
+ return {
195
+ status: "failed",
196
+ diagnostics: [
197
+ {
198
+ id: `${input.tool}:parse-error:1`,
199
+ message: `${input.tool} exited ${status} but its output could not be parsed`,
200
+ filePath: input.ctx.filePath,
201
+ line: 1,
202
+ column: 1,
203
+ severity: "warning",
204
+ semantic: "warning",
205
+ tool: input.tool,
206
+ },
207
+ ],
208
+ semantic: "warning",
209
+ };
210
+ }
211
+ return { status: "succeeded", diagnostics: [], semantic: "none" };
212
+ }
213
+ const mapped = input.classify?.(input.diagnostics);
214
+ if (mapped) {
215
+ return { ...mapped, diagnostics: input.diagnostics };
216
+ }
217
+ const hasBlocking = input.diagnostics.some((d) => d.semantic === "blocking");
218
+ return {
219
+ status: hasBlocking ? "failed" : "succeeded",
220
+ diagnostics: input.diagnostics,
221
+ semantic: hasBlocking ? "blocking" : "warning",
222
+ };
223
+ }
@@ -106,9 +106,7 @@ export function loadYamlRulesFresh(ruleDir, severityFilter) {
106
106
  hash.update("\0");
107
107
  }
108
108
  const signature = hash.digest("hex");
109
- const cache = severityFilter === "error"
110
- ? contentBlockingRulesCache
111
- : contentRulesCache;
109
+ const cache = severityFilter === "error" ? contentBlockingRulesCache : contentRulesCache;
112
110
  const cached = cache.get(ruleDir);
113
111
  if (cached?.signature === signature)
114
112
  return cached.rules;
@@ -3,6 +3,7 @@ import { getLinterPolicyForCwd, hasYamllintConfig } from "../../tool-policy.js";
3
3
  import { PRIORITY } from "../priorities.js";
4
4
  import { createAvailabilityChecker, resolveToolCommandWithInstallFallback, } from "./utils/runner-helpers.js";
5
5
  import { parseToolRun } from "./utils/tool-failure.js";
6
+ import { finishParsedRun } from "./utils/tool-failure.js";
6
7
  const yamllint = createAvailabilityChecker("yamllint", ".exe");
7
8
  export { hasYamllintConfig };
8
9
  function parseYamllintParsable(raw, filePath) {
@@ -72,15 +73,12 @@ const yamllintRunner = {
72
73
  if (run.skipped)
73
74
  return run.skipped;
74
75
  const diagnostics = run.diagnostics;
75
- if (diagnostics.length === 0) {
76
- return { status: "succeeded", diagnostics: [], semantic: "none" };
77
- }
78
- const hasBlocking = diagnostics.some((d) => d.semantic === "blocking");
79
- return {
80
- status: hasBlocking ? "failed" : "succeeded",
76
+ return finishParsedRun({
77
+ tool: "yamllint",
78
+ ctx,
79
+ result,
81
80
  diagnostics,
82
- semantic: hasBlocking ? "blocking" : "warning",
83
- };
81
+ });
84
82
  },
85
83
  };
86
84
  export default yamllintRunner;
@@ -48,7 +48,7 @@ const zigCheckRunner = {
48
48
  skipTestFiles: false,
49
49
  async run(ctx) {
50
50
  const cwd = ctx.cwd || process.cwd();
51
- if (!(await (zig.isAvailableAsync(cwd)))) {
51
+ if (!(await zig.isAvailableAsync(cwd))) {
52
52
  return { status: "skipped", diagnostics: [], semantic: "none" };
53
53
  }
54
54
  const cmd = zig.getCommand(cwd);
@@ -56,7 +56,8 @@ export function insertSuppressComment(content, filePath, line, rule) {
56
56
  .filter(Boolean);
57
57
  if (!rules.includes(rule))
58
58
  rules.push(rule);
59
- lines[aboveIdx] = existingAbove.slice(0, match.index) + match[1] + rules.join(", ");
59
+ lines[aboveIdx] =
60
+ existingAbove.slice(0, match.index) + match[1] + rules.join(", ");
60
61
  return lines.join("\n");
61
62
  }
62
63
  // Match the indentation of the flagged line so the inserted comment lines
@@ -10,4 +10,9 @@
10
10
  *
11
11
  * The dispatcher must handle these semantics consistently.
12
12
  */
13
- export {};
13
+ /** Closed telemetry taxonomy for expected runner skips. */
14
+ export const RUNNER_SKIP_REASONS = ["no-files-matched"];
15
+ /** Runtime guard for untyped/plugin-provided runner results. */
16
+ export function isRunnerSkipReason(value) {
17
+ return RUNNER_SKIP_REASONS.some((reason) => reason === value);
18
+ }
@@ -3,9 +3,13 @@ export function convertLspDiagnostics(diags, filePath, options = {}) {
3
3
  return diags
4
4
  .filter((d) => d.range?.start?.line !== undefined)
5
5
  .map((d, idx) => {
6
- const severityMap = { 1: "error", 2: "warning", 4: "hint" };
6
+ const severityMap = {
7
+ 1: "error",
8
+ 2: "warning",
9
+ 4: "hint",
10
+ };
7
11
  const severity = severityMap[d.severity] ?? "info";
8
- const semantic = d.severity === 1 ? "blocking" : (d.severity === 2 ? "warning" : "none");
12
+ const semantic = d.severity === 1 ? "blocking" : d.severity === 2 ? "warning" : "none";
9
13
  const code = String(d.code ?? "unknown");
10
14
  // #692: identity ALWAYS derives from the diagnostic's own source — never
11
15
  // from a caller-supplied scan label (see `scanOrigin`'s doc comment above).
@@ -137,7 +137,7 @@ let moduleLoadWindowOpen = false;
137
137
  * the same as an empty store, so it reads as "no window" rather than throwing.
138
138
  */
139
139
  export function isConsoleCaptureActive() {
140
- return (moduleLoadWindowOpen || consoleCaptureStorage?.getStore() === true);
140
+ return moduleLoadWindowOpen || consoleCaptureStorage?.getStore() === true;
141
141
  }
142
142
  /**
143
143
  * Open the module-evaluation window. Called by `clients/console-guard-install.ts`
@@ -207,7 +207,7 @@ function inCaptureWindow(fn) {
207
207
  * the terminal.
208
208
  */
209
209
  function isCaptureSeam(prop) {
210
- return prop === "on" || (typeof prop === "string" && prop.startsWith("register"));
210
+ return (prop === "on" || (typeof prop === "string" && prop.startsWith("register")));
211
211
  }
212
212
  /**
213
213
  * Wrap every function value found in `value`, in place. Handles the two
@@ -312,7 +312,9 @@ export function withConsoleCaptureWindows(api) {
312
312
  // value instead of tripping that invariant (S2a) — a frozen host API
313
313
  // loses the capture window for that member, but keeps working.
314
314
  const descriptor = Reflect.getOwnPropertyDescriptor(target, prop);
315
- if (descriptor && descriptor.writable === false && descriptor.configurable === false) {
315
+ if (descriptor &&
316
+ descriptor.writable === false &&
317
+ descriptor.configurable === false) {
316
318
  return descriptor.value;
317
319
  }
318
320
  const cached = wrapperCache.get(prop);
@@ -81,7 +81,14 @@ export function inferTrustBoundaries(nameOrPath) {
81
81
  boundaries.add("user-input");
82
82
  boundaries.add("process-exec");
83
83
  }
84
- if (hasHintToken(normalized, ["auth", "login", "token", "session", "oauth", "jwt"])) {
84
+ if (hasHintToken(normalized, [
85
+ "auth",
86
+ "login",
87
+ "token",
88
+ "session",
89
+ "oauth",
90
+ "jwt",
91
+ ])) {
85
92
  boundaries.add("auth");
86
93
  boundaries.add("user-input");
87
94
  }
@@ -7,24 +7,10 @@
7
7
  import { basename, extname } from "node:path";
8
8
  // --- Extension Maps ---
9
9
  export const KIND_EXTENSIONS = {
10
- clojure: [
11
- ".clj",
12
- ".cljc",
13
- ".cljs",
14
- ".edn",
15
- ],
16
- cmake: [
17
- ".cmake",
18
- ],
19
- csharp: [
20
- ".cs",
21
- ],
22
- css: [
23
- ".css",
24
- ".less",
25
- ".sass",
26
- ".scss",
27
- ],
10
+ clojure: [".clj", ".cljc", ".cljs", ".edn"],
11
+ cmake: [".cmake"],
12
+ csharp: [".cs"],
13
+ css: [".css", ".less", ".sass", ".scss"],
28
14
  cue: [".cue"],
29
15
  // From llvm-project/clang/lib/Driver/Types.cpp clang::driver::types::lookupTypeForExtension:
30
16
  cxx: [
@@ -61,49 +47,18 @@ export const KIND_EXTENSIONS = {
61
47
  ".cl",
62
48
  ".clcpp",
63
49
  ],
64
- dart: [
65
- ".dart",
66
- ],
67
- docker: [
68
- ".dockerfile",
69
- ],
70
- elixir: [
71
- ".ex",
72
- ".exs",
73
- ],
74
- fish: [
75
- ".fish",
76
- ],
77
- fsharp: [
78
- ".fs",
79
- ".fsi",
80
- ".fsx",
81
- ],
82
- gleam: [
83
- ".gleam",
84
- ],
85
- go: [
86
- ".go",
87
- ],
88
- haskell: [
89
- ".hs",
90
- ".lhs",
91
- ],
92
- "helm-template": [
93
- ".tpl",
94
- ],
95
- html: [
96
- ".htm",
97
- ".html",
98
- ],
99
- java: [
100
- ".java",
101
- ],
102
- json: [
103
- ".json",
104
- ".json5",
105
- ".jsonc",
106
- ],
50
+ dart: [".dart"],
51
+ docker: [".dockerfile"],
52
+ elixir: [".ex", ".exs"],
53
+ fish: [".fish"],
54
+ fsharp: [".fs", ".fsi", ".fsx"],
55
+ gleam: [".gleam"],
56
+ go: [".go"],
57
+ haskell: [".hs", ".lhs"],
58
+ "helm-template": [".tpl"],
59
+ html: [".htm", ".html"],
60
+ java: [".java"],
61
+ json: [".json", ".json5", ".jsonc"],
107
62
  jsts: [
108
63
  ".cjs",
109
64
  ".cts",
@@ -116,75 +71,25 @@ export const KIND_EXTENSIONS = {
116
71
  ".tsx",
117
72
  ".vue",
118
73
  ],
119
- kotlin: [
120
- ".kt",
121
- ".kts",
122
- ],
123
- lua: [
124
- ".lua",
125
- ],
126
- markdown: [
127
- ".md",
128
- ".mdx",
129
- ],
130
- nix: [
131
- ".nix",
132
- ],
133
- ocaml: [
134
- ".ml",
135
- ".mli",
136
- ],
137
- php: [
138
- ".php",
139
- ],
140
- powershell: [
141
- ".ps1",
142
- ".psm1",
143
- ".psd1",
144
- ],
145
- prisma: [
146
- ".prisma",
147
- ],
148
- python: [
149
- ".py",
150
- ".pyi",
151
- ],
152
- ruby: [
153
- ".gemspec",
154
- ".rake",
155
- ".rb",
156
- ".ru",
157
- ],
158
- rust: [
159
- ".rs",
160
- ],
161
- shell: [
162
- ".bash",
163
- ".sh",
164
- ".zsh",
165
- ],
166
- sql: [
167
- ".sql",
168
- ],
169
- swift: [
170
- ".swift",
171
- ],
172
- terraform: [
173
- ".tf",
174
- ".tfvars",
175
- ],
74
+ kotlin: [".kt", ".kts"],
75
+ lua: [".lua"],
76
+ markdown: [".md", ".mdx"],
77
+ nix: [".nix"],
78
+ ocaml: [".ml", ".mli"],
79
+ php: [".php"],
80
+ powershell: [".ps1", ".psm1", ".psd1"],
81
+ prisma: [".prisma"],
82
+ python: [".py", ".pyi"],
83
+ ruby: [".gemspec", ".rake", ".rb", ".ru"],
84
+ rust: [".rs"],
85
+ shell: [".bash", ".sh", ".zsh"],
86
+ sql: [".sql"],
87
+ swift: [".swift"],
88
+ terraform: [".tf", ".tfvars"],
176
89
  terragrunt: [],
177
- toml: [
178
- ".toml",
179
- ],
180
- yaml: [
181
- ".yaml",
182
- ".yml",
183
- ],
184
- zig: [
185
- ".zig",
186
- ".zon",
187
- ],
90
+ toml: [".toml"],
91
+ yaml: [".yaml", ".yml"],
92
+ zig: [".zig", ".zon"],
188
93
  };
189
94
  /** Return whether a path has an extension registered for the given file kind. */
190
95
  export function hasKindExtension(filePath, kind) {
@@ -5,7 +5,8 @@ import * as fs from "node:fs";
5
5
  import * as os from "node:os";
6
6
  import * as path from "node:path";
7
7
  import { minimatch } from "./deps/minimatch.js";
8
- import { collectTrackedFiles, getTrackedFilesSnapshot } from "./git-tracked-ignore.js";
8
+ import { isInSpawnTimeoutCooldown, noteSpawnTimeout, } from "./spawn-timeout-cooldown.js";
9
+ import { collectTrackedFiles, getTrackedFilesSnapshot, } from "./git-tracked-ignore.js";
9
10
  import { getGlobalIgnorePatterns, getPiLensGlobalConfigPath, } from "./lens-config.js";
10
11
  import { normalizeEphemeralMapKey, normalizeFilePath } from "./path-utils.js";
11
12
  import { findPiLensConfigInDir, findPiLensProjectConfig, loadPiLensConfigInDir, loadPiLensProjectConfig, } from "./project-lens-config.js";
@@ -577,12 +578,27 @@ export async function detectFileChangedAfterCommand(filePath, command, args, cwd
577
578
  catch {
578
579
  return 0;
579
580
  }
581
+ // #1995: a command cooling down after a spawn timeout must not be handed
582
+ // a second budget - autofix is one of the lanes that paid twice for a
583
+ // wedged .cmd shim. Return "no fix applied" (an honest not-checked).
584
+ if (isInSpawnTimeoutCooldown(command))
585
+ return 0;
580
586
  const result = await safeSpawnAsync(command, args, {
581
587
  timeout: 30000,
582
588
  cwd,
583
589
  });
584
590
  if (result.error)
585
591
  return 0;
592
+ if (result.failure === "timeout") {
593
+ noteSpawnTimeout({
594
+ tool: path.basename(command).replace(/\.[^.]+$/, ""),
595
+ command,
596
+ phase: "autofix",
597
+ durationMs: 30000,
598
+ teardown: result.timeoutTeardown,
599
+ });
600
+ return 0;
601
+ }
586
602
  if (result.status !== 0 && !ignoreStatuses.includes(result.status ?? -1)) {
587
603
  return 0;
588
604
  }