@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
@@ -1823,80 +1823,62 @@ onTransient,
1823
1823
  * the expiry as transient rather than as a verdict (#1657).
1824
1824
  */
1825
1825
  timeoutMs = 10000) {
1826
- return new Promise((resolve) => {
1827
- const isWindows = installerPlatform() === "win32";
1828
- const hasKnownWindowsExt = /\.(cmd|exe|ps1)$/i.test(binPath);
1829
- // On Windows, resolve the best executable path:
1830
- // - extensionless → prefer .cmd (cmd.exe-safe)
1831
- // - .ps1 → prefer .cmd sibling to avoid PowerShell execution-policy hangs
1832
- // - .cmd / .exe → use as-is
1833
- let execPath = isWindows && !hasKnownWindowsExt ? `${binPath}.cmd` : binPath;
1834
- let useShell = isWindows && /\.(cmd|bat)$/i.test(execPath);
1835
- if (isWindows && /\.ps1$/i.test(execPath)) {
1836
- const cmdSibling = `${execPath.slice(0, -4)}.cmd`;
1837
- if (require("node:fs").existsSync(cmdSibling)) {
1838
- execPath = cmdSibling;
1839
- useShell = true;
1840
- }
1841
- else {
1842
- // Fall back to running without shell — cmd.exe can't run .ps1
1843
- useShell = false;
1844
- }
1826
+ // #2015: safeSpawnAsync instead of raw spawn. Raw spawn's timeout
1827
+ // SIGTERMed only cmd.exe on Windows (.cmd shims run shell:true), orphaning
1828
+ // the grandchild node process - which kept scanning, held handles against
1829
+ // the cleanup rm, and turned one slow cold-start verify into an
1830
+ // install/verify/reinstall loop (23 SIGTERMs observed in one day).
1831
+ // lifetimeCoupled tree-kill prevents orphans; result.signal gives a typed
1832
+ // kill-reason for transient classification.
1833
+ const isWindows = installerPlatform() === "win32";
1834
+ const hasKnownWindowsExt = /\.(cmd|exe|ps1)$/i.test(binPath);
1835
+ // On Windows, resolve the best executable path:
1836
+ // - extensionless → prefer .cmd (cmd.exe-safe)
1837
+ // - .ps1 → prefer .cmd sibling to avoid PowerShell execution-policy hangs
1838
+ // - .cmd / .exe → use as-is
1839
+ let execPath = isWindows && !hasKnownWindowsExt ? `${binPath}.cmd` : binPath;
1840
+ if (isWindows && /\.ps1$/i.test(execPath)) {
1841
+ const cmdSibling = `${execPath.slice(0, -4)}.cmd`;
1842
+ if (require("node:fs").existsSync(cmdSibling)) {
1843
+ execPath = cmdSibling;
1845
1844
  }
1846
- // When shell:true (Windows .cmd), bake args into the command string to avoid DEP0190.
1847
- const spawnCmd = useShell ? `"${execPath}" --version` : execPath;
1848
- let proc;
1849
- try {
1850
- proc = spawn(spawnCmd, useShell ? [] : ["--version"], {
1851
- timeout: timeoutMs,
1852
- stdio: ["ignore", "pipe", "pipe"],
1853
- shell: useShell,
1854
- });
1845
+ }
1846
+ const useShell = isWindows && /\.(cmd|bat)$/i.test(execPath);
1847
+ // safe-spawn routes .cmd/.bat through its cmd.exe wrapper internally
1848
+ // (shell:false always at the child boundary; the wrapper string is built
1849
+ // there), so no shell option exists or is needed here.
1850
+ void useShell;
1851
+ try {
1852
+ const result = await safeSpawnAsync(execPath, ["--version"], {
1853
+ timeout: timeoutMs,
1854
+ });
1855
+ const output = `${result.stdout}\n${result.stderr}`;
1856
+ if (result.status === 0 && !result.error) {
1857
+ debugLog(`Verified: ${binPath} (version: ${result.stdout.trim()})`);
1858
+ onVersionOutput?.(result.stdout);
1859
+ return true;
1855
1860
  }
1856
- catch (err) {
1857
- // SYNCHRONOUS spawn throw (Windows `spawn UNKNOWN`/EINVAL, the pidusage
1858
- // bug class, #533) — best-effort verify, resolve rather than reject.
1859
- // The prober itself never ran, so this says nothing about the binary.
1860
- logSessionStart(`auto-install verify: spawn threw for ${binPath} (${err instanceof Error ? err.message : String(err)})`);
1861
- onTransient?.();
1862
- resolve(false);
1863
- return;
1861
+ if (isLspTransportRequiredError(output)) {
1862
+ // Valid stdio LSP server that rejects `--version` (#208) — the
1863
+ // transport-required error proves the binary works.
1864
+ debugLog(`Verified (stdio LSP, transport-required): ${binPath}`);
1865
+ return true;
1864
1866
  }
1865
- let stdout = "";
1866
- let stderr = "";
1867
- proc.stdout?.on("data", (data) => (stdout += data));
1868
- proc.stderr?.on("data", (data) => (stderr += data));
1869
- proc.on("exit", (code, signal) => {
1870
- if (code === 0) {
1871
- debugLog(`Verified: ${binPath} (version: ${stdout.trim()})`);
1872
- onVersionOutput?.(stdout);
1873
- resolve(true);
1874
- }
1875
- else if (isLspTransportRequiredError(`${stdout}\n${stderr}`)) {
1876
- // Valid stdio LSP server that rejects `--version` (#208) — the
1877
- // transport-required error proves the binary works.
1878
- debugLog(`Verified (stdio LSP, transport-required): ${binPath}`);
1879
- resolve(true);
1880
- }
1881
- else {
1882
- // `code === null` (usually paired with a `signal`) means the
1883
- // spawn timeout fired and the process was killed before it could
1884
- // exit on its own — a stall, not a verdict from the binary.
1885
- if (code === null || signal)
1886
- onTransient?.();
1887
- logSessionStart(`auto-install verify: failed for ${binPath} (exit=${code}${signal ? `, signal=${signal}` : ""})`);
1888
- resolve(false);
1889
- }
1890
- });
1891
- proc.on("error", (err) => {
1892
- const errno = err.code;
1893
- if (errno === "EAGAIN" || errno === "EBUSY" || errno === "ETIMEDOUT") {
1894
- onTransient?.();
1895
- }
1896
- logSessionStart(`auto-install verify: error for ${binPath}: ${err.message}`);
1897
- resolve(false);
1898
- });
1899
- });
1867
+ // A kill (timeout fired) or spawn-boundary failure is a stall, not a
1868
+ // verdict from the binary (#1569 transient semantics).
1869
+ if (result.signal !== undefined || result.spawnFailure)
1870
+ onTransient?.();
1871
+ logSessionStart(`auto-install verify: failed for ${binPath} (kind=${result.signal ? `killed-signal=${result.signal}` : result.error ? "spawn-error" : "exit-nonzero"}${result.status !== null ? `, exit=${result.status}` : ""})`);
1872
+ return false;
1873
+ }
1874
+ catch (err) {
1875
+ // Spawn-boundary throw (Windows `spawn UNKNOWN`/EINVAL, the pidusage
1876
+ // bug class, #533) — best-effort verify, resolve rather than reject.
1877
+ // The prober itself never ran, so this says nothing about the binary.
1878
+ logSessionStart(`auto-install verify: spawn threw for ${binPath} (${err instanceof Error ? err.message : String(err)})`);
1879
+ onTransient?.();
1880
+ return false;
1881
+ }
1900
1882
  }
1901
1883
  /**
1902
1884
  * Get detailed status for all tools
@@ -3005,7 +2987,10 @@ export async function acquireManagedInstallGate(context) {
3005
2987
  };
3006
2988
  }
3007
2989
  if (!assertInstallAllowed(context)) {
3008
- return { ok: false, reason: `project trust: ${projectTrustDenialReason()}` };
2990
+ return {
2991
+ ok: false,
2992
+ reason: `project trust: ${projectTrustDenialReason()}`,
2993
+ };
3009
2994
  }
3010
2995
  // Held for the whole strategy call, not just the final write — a refresh
3011
2996
  // can race a concurrent `ensureTool` install of the SAME tool into the SAME
@@ -3580,7 +3565,9 @@ async function installArchiveTool(tool) {
3580
3565
  await fs.rm(tmpArchive, { force: true });
3581
3566
  if (!extracted.ok) {
3582
3567
  logSessionStart(`archive-install ${tool.id}: extraction failed: ${extracted.stderr} — keeping installed version`);
3583
- await fs.rm(tmpExtractDir, { recursive: true, force: true }).catch(() => { });
3568
+ await fs
3569
+ .rm(tmpExtractDir, { recursive: true, force: true })
3570
+ .catch(() => { });
3584
3571
  return undefined;
3585
3572
  }
3586
3573
  // Tree bundle (no launcher): the whole extracted tree IS the artifact. Verify
@@ -3596,7 +3583,9 @@ async function installArchiveTool(tool) {
3596
3583
  }
3597
3584
  catch {
3598
3585
  logSessionStart(`archive-install ${tool.id}: tree marker not found at ${tmpMarker} after extraction — keeping installed version`);
3599
- await fs.rm(tmpExtractDir, { recursive: true, force: true }).catch(() => { });
3586
+ await fs
3587
+ .rm(tmpExtractDir, { recursive: true, force: true })
3588
+ .catch(() => { });
3600
3589
  return undefined;
3601
3590
  }
3602
3591
  await swapExtractedDir(tool.id, tmpExtractDir, extractDir);
@@ -3616,7 +3605,9 @@ async function installArchiveTool(tool) {
3616
3605
  }
3617
3606
  catch {
3618
3607
  logSessionStart(`archive-install ${tool.id}: launcher not found at ${tmpResolvedInner} after extraction — keeping installed version`);
3619
- await fs.rm(tmpExtractDir, { recursive: true, force: true }).catch(() => { });
3608
+ await fs
3609
+ .rm(tmpExtractDir, { recursive: true, force: true })
3610
+ .catch(() => { });
3620
3611
  return undefined;
3621
3612
  }
3622
3613
  if (!isWindows)
@@ -3645,7 +3636,9 @@ async function installArchiveTool(tool) {
3645
3636
  }
3646
3637
  catch (err) {
3647
3638
  await fs.rm(tmpArchive, { force: true }).catch(() => { });
3648
- await fs.rm(tmpExtractDir, { recursive: true, force: true }).catch(() => { });
3639
+ await fs
3640
+ .rm(tmpExtractDir, { recursive: true, force: true })
3641
+ .catch(() => { });
3649
3642
  logSessionStart(`archive-install ${tool.id}: install failed: ${err.message} — keeping installed version`);
3650
3643
  return undefined;
3651
3644
  }
@@ -3729,8 +3722,12 @@ async function installNpmTool(packageName, binaryName) {
3729
3722
  // postinstall scripts that complete asynchronously after npm exits 0.
3730
3723
  debugLog(`Verifying ${binaryName}...`);
3731
3724
  let isValid = false;
3725
+ let lastAttemptTransient = false;
3732
3726
  for (let attempt = 1; attempt <= 3; attempt++) {
3733
- isValid = await verifyToolBinary(binPath);
3727
+ lastAttemptTransient = false;
3728
+ isValid = await verifyToolBinary(binPath, undefined, () => {
3729
+ lastAttemptTransient = true;
3730
+ });
3734
3731
  if (isValid)
3735
3732
  break;
3736
3733
  if (attempt < 3) {
@@ -3738,6 +3735,18 @@ async function installNpmTool(packageName, binaryName) {
3738
3735
  await new Promise((r) => setTimeout(r, 1000 * attempt));
3739
3736
  }
3740
3737
  }
3738
+ if (!isValid && lastAttemptTransient) {
3739
+ // #2015: a killed/spawn-failed prober is NOT a verdict about the
3740
+ // binary (#1569 semantics). Cold-start verifies on fresh installs
3741
+ // legitimately exceed the budget on Windows (Defender/OneDrive
3742
+ // first-touch scanning of new node_modules). Deleting a possibly-
3743
+ // healthy install here is what turned one slow verify into the
3744
+ // reinstall loop - keep the installation; the next ensureTool
3745
+ // re-probes the existing binary via discovery instead of
3746
+ // reinstalling from scratch.
3747
+ logSessionStart(`auto-install ${packageName}: verification inconclusive (transient); keeping installation for re-probe`);
3748
+ return undefined;
3749
+ }
3741
3750
  if (!isValid) {
3742
3751
  logSessionStart(`auto-install ${packageName}: installed but verification failed, cleaning up`);
3743
3752
  // Clean up the broken installation
@@ -776,7 +776,10 @@ function parseNonNegativeMs(raw) {
776
776
  * would make the whole backstop silently return zero rows, and this is the
777
777
  * one part of the fix that cannot be checked from a Windows dev machine.
778
778
  */
779
- export const POSIX_PS_ARGS = ["-eo", "pid=,ppid=,etime=,args="];
779
+ export const POSIX_PS_ARGS = [
780
+ "-eo",
781
+ "pid=,ppid=,etime=,args=",
782
+ ];
780
783
  /** Parse `ps -o etime` output: `[[dd-]hh:]mm:ss`. Returns undefined for any
781
784
  * shape the column did not produce (a `ps` without the column emits the
782
785
  * command line where the token was expected). */
@@ -795,7 +798,7 @@ export function ageMsFromPosixEtime(raw) {
795
798
  if (parts.some((part) => !Number.isFinite(part)))
796
799
  return undefined;
797
800
  const [hours, minutes, seconds] = parts.length === 3 ? parts : [0, parts[0], parts[1]];
798
- return (((days * 24 + hours) * 60 * 60 + minutes * 60 + seconds) * 1000);
801
+ return ((days * 24 + hours) * 60 * 60 + minutes * 60 + seconds) * 1000;
799
802
  }
800
803
  /**
801
804
  * Fire-and-forget REGISTRY-INDEPENDENT backstop sweep (#658): finds
@@ -36,7 +36,7 @@ import { getGlobalPiLensDir } from "./file-utils.js";
36
36
  // import is actually invoked.
37
37
  import { realIsPidAlive } from "./instance-reaper.js";
38
38
  import { normalizeFilePath } from "./path-utils.js";
39
- import { getSubagentIdentity, isSubagentSession, } from "./subagent-mode.js";
39
+ import { getSubagentIdentity, isSubagentSession } from "./subagent-mode.js";
40
40
  function registryPath() {
41
41
  return path.join(getGlobalPiLensDir(), "instances.json");
42
42
  }
@@ -429,7 +429,9 @@ export function computeResourceFootprint(instances, isPidAlive) {
429
429
  */
430
430
  export async function getResourceFootprint(isPidAlive = realIsPidAlive) {
431
431
  const instances = await readInstanceRegistry();
432
- const deadPids = new Set(instances.filter((instance) => !isPidAlive(instance.pid)).map((instance) => instance.pid));
432
+ const deadPids = new Set(instances
433
+ .filter((instance) => !isPidAlive(instance.pid))
434
+ .map((instance) => instance.pid));
433
435
  if (deadPids.size > 0) {
434
436
  // Fire-and-forget: a health-report read must never block on, or fail
435
437
  // because of, a registry write.
@@ -238,7 +238,12 @@ export class JscpdClient {
238
238
  ".",
239
239
  ...(hasConfig
240
240
  ? []
241
- : ["--min-lines", String(minLines), "--min-tokens", String(minTokens)]),
241
+ : [
242
+ "--min-lines",
243
+ String(minLines),
244
+ "--min-tokens",
245
+ String(minTokens),
246
+ ]),
242
247
  "--reporters",
243
248
  "json",
244
249
  "--output",
@@ -134,7 +134,9 @@ export function classifyKnipBinary(binary, targetDir) {
134
134
  if (binary === null)
135
135
  return "managed-or-path";
136
136
  const relative = path.relative(path.resolve(targetDir), path.resolve(binary));
137
- return relative === "" || relative.startsWith("..") || path.isAbsolute(relative)
137
+ return relative === "" ||
138
+ relative.startsWith("..") ||
139
+ path.isAbsolute(relative)
138
140
  ? "global"
139
141
  : "project";
140
142
  }
@@ -199,9 +201,7 @@ export class KnipClient {
199
201
  */
200
202
  recordedToolchains = new Set();
201
203
  constructor(verbose = false) {
202
- this.log = verbose
203
- ? createSubsystemLogger("knip")
204
- : () => { };
204
+ this.log = verbose ? createSubsystemLogger("knip") : () => { };
205
205
  }
206
206
  /** Re-arm content-keyed reuse at the session boundary. */
207
207
  resetSessionState() {
@@ -223,7 +223,13 @@ export class KnipClient {
223
223
  * repos often have no package.json at their own root).
224
224
  */
225
225
  resolveProjectRoot(startDir, homeDirOverride) {
226
- return findNearestMarkerRoot(startDir, ["package.json", "knip.json", "knip.ts", "knip.config.js", "knip.config.ts"], { boundaries: [".git", ".hg", ".svn"], homeDir: homeDirOverride });
226
+ return findNearestMarkerRoot(startDir, [
227
+ "package.json",
228
+ "knip.json",
229
+ "knip.ts",
230
+ "knip.config.js",
231
+ "knip.config.ts",
232
+ ], { boundaries: [".git", ".hg", ".svn"], homeDir: homeDirOverride });
227
233
  }
228
234
  /**
229
235
  * Check if knip CLI is available, auto-install if not.
@@ -332,8 +338,7 @@ export class KnipClient {
332
338
  this.log(`Analysis already in flight for ${key}; sharing result`);
333
339
  return existing;
334
340
  }
335
- const promise = this.runAnalyze(key)
336
- .then((result) => {
341
+ const promise = this.runAnalyze(key).then((result) => {
337
342
  const executed = { ...result, execution: "executed" };
338
343
  if (result.success && options.projectSeq !== undefined) {
339
344
  this.completedByProject.set(key, {
@@ -343,12 +348,17 @@ export class KnipClient {
343
348
  });
344
349
  }
345
350
  return executed;
346
- })
347
- .finally(() => {
348
- this.inFlight.delete(key);
349
351
  });
350
- this.inFlight.set(key, promise);
351
- return promise;
352
+ // Identity-guarded release (#1968, #1967's pattern): delete only if
353
+ // THIS build is still the registered one. A bare delete-by-key lets a
354
+ // late-settling build A evict a live build B that replaced the entry
355
+ // mid-flight, and the next caller starts a duplicate.
356
+ const wrapped = promise.finally(() => {
357
+ if (this.inFlight.get(key) === wrapped)
358
+ this.inFlight.delete(key);
359
+ });
360
+ this.inFlight.set(key, wrapped);
361
+ return wrapped;
352
362
  }
353
363
  readMemoFileSignal(filePath) {
354
364
  try {
@@ -371,9 +381,12 @@ export class KnipClient {
371
381
  matchesMemoSignal(targetDir, signal) {
372
382
  const current = {
373
383
  packageJson: this.readMemoFileSignal(path.join(targetDir, "package.json")),
374
- config: signal.config ? this.readMemoFileSignal(signal.config.path) : null,
384
+ config: signal.config
385
+ ? this.readMemoFileSignal(signal.config.path)
386
+ : null,
375
387
  };
376
- return (JSON.stringify(current.packageJson) === JSON.stringify(signal.packageJson) &&
388
+ return (JSON.stringify(current.packageJson) ===
389
+ JSON.stringify(signal.packageJson) &&
377
390
  JSON.stringify(current.config) === JSON.stringify(signal.config));
378
391
  }
379
392
  async runAnalyze(targetDir) {
@@ -593,7 +606,8 @@ export class KnipClient {
593
606
  if (pinned.size === 0)
594
607
  return result;
595
608
  const isPinnedDepIssue = (issue) => (issue.type === "dependency" || issue.type === "devDependency") &&
596
- (pinned.has(issue.name) || (!!issue.package && pinned.has(issue.package)));
609
+ (pinned.has(issue.name) ||
610
+ (!!issue.package && pinned.has(issue.package)));
597
611
  const issues = result.issues.filter((issue) => !isPinnedDepIssue(issue));
598
612
  const unusedDeps = result.unusedDeps.filter((issue) => !isPinnedDepIssue(issue));
599
613
  return unusedDeps.length === result.unusedDeps.length
@@ -279,7 +279,10 @@ export async function collectSourceFilesForWarmup(rootDir, maxFiles = MAX_WARMUP
279
279
  if (entry.isDirectory()) {
280
280
  // Never checked symlinks — always follows them (unlike
281
281
  // source-filter.ts's collectSourceFiles*, refs #191).
282
- if (!shouldRecurseIntoDir(entry, fullPath, { ignoreMatcher, followSymlinks: true })) {
282
+ if (!shouldRecurseIntoDir(entry, fullPath, {
283
+ ignoreMatcher,
284
+ followSymlinks: true,
285
+ })) {
283
286
  continue;
284
287
  }
285
288
  stack.push(fullPath);
@@ -73,6 +73,10 @@ let recentPhases = [];
73
73
  * their own work. `lsp_scanner_coverage_gap` reports the touch's elapsed time for
74
74
  * joinability. Letting any of them win `lastPhase` would attribute a `loop_block`
75
75
  * to the record instead of to the touch that is actually stalled.
76
+ *
77
+ * #1996: `cache_usage_summary` is a zero-duration session rollup over earlier
78
+ * usage records. It reports no new work and therefore cannot own last-phase
79
+ * stall attribution.
76
80
  */
77
81
  const LAST_PHASE_EXCLUDED = new Set([
78
82
  "loop_block",
@@ -82,6 +86,7 @@ const LAST_PHASE_EXCLUDED = new Set([
82
86
  "agent_end_deferred_mutation_drain",
83
87
  "agent_end_deferred_mutation_requeue",
84
88
  "session_end_bus_rollup",
89
+ "cache_usage_summary",
85
90
  "lsp_aux_wait_outcome",
86
91
  "tool_set_mutation",
87
92
  "availability_decision",
@@ -221,7 +226,11 @@ export function phaseFinished(token) {
221
226
  if (!liveBrackets.delete(token))
222
227
  return;
223
228
  closedBrackets = [
224
- { phase: token.phase, startedAt: token.startedAt, closedAt: new Date().toISOString() },
229
+ {
230
+ phase: token.phase,
231
+ startedAt: token.startedAt,
232
+ closedAt: new Date().toISOString(),
233
+ },
225
234
  ...closedBrackets,
226
235
  ].slice(0, CLOSED_BRACKET_CAP);
227
236
  }
@@ -507,7 +516,9 @@ export function resetCurrentPhaseForSession() {
507
516
  }
508
517
  export function logLatency(entry) {
509
518
  const ts = new Date().toISOString();
510
- if (entry.type === "phase" && entry.phase && !LAST_PHASE_EXCLUDED.has(entry.phase)) {
519
+ if (entry.type === "phase" &&
520
+ entry.phase &&
521
+ !LAST_PHASE_EXCLUDED.has(entry.phase)) {
511
522
  recentPhases = [{ phase: entry.phase, ts }, ...recentPhases].slice(0, RECENT_PHASE_CAP);
512
523
  }
513
524
  if (isTestMode()) {
@@ -111,7 +111,7 @@ export function loadPiLensGlobalConfig(configPath = getPiLensGlobalConfigPath())
111
111
  formatSection.mode = format.mode;
112
112
  }
113
113
  else {
114
- // #533: a present-but-invalid mode (e.g. "immedaite") warns and
114
+ // #533: a present-but-invalid mode (e.g. "immedaite") warns and // spellchecker:disable-line
115
115
  // falls back; an absent mode stays silent.
116
116
  if ("mode" in format) {
117
117
  warnInvalid('format.mode must be "immediate" or "deferred"');
@@ -224,7 +224,12 @@ export function aggregateGraphToFiles(graph, options) {
224
224
  }
225
225
  }
226
226
  else {
227
- files.set(id, { id, path: id, language: node.language || "", symbolCount: 0 });
227
+ files.set(id, {
228
+ id,
229
+ path: id,
230
+ language: node.language || "",
231
+ symbolCount: 0,
232
+ });
228
233
  }
229
234
  continue;
230
235
  }
@@ -394,8 +399,8 @@ function seededPosition(id, width, height) {
394
399
  const hx = fnv1a(id);
395
400
  const hy = fnv1a(`${id}\u0000y`);
396
401
  return {
397
- x: (hx % 10000) / 10000 * width,
398
- y: (hy % 10000) / 10000 * height,
402
+ x: ((hx % 10000) / 10000) * width,
403
+ y: ((hy % 10000) / 10000) * height,
399
404
  };
400
405
  }
401
406
  /**
@@ -1,6 +1,6 @@
1
1
  import { recordDegradation } from "./degradation-ledger.js";
2
2
  import { probeCtxActive } from "./session-lifecycle.js";
3
- import { logBusEvent, } from "./bus-events-logger.js";
3
+ import { logBusEvent } from "./bus-events-logger.js";
4
4
  const STALE_CTX_MESSAGE = "This extension ctx is stale after session replacement";
5
5
  /** Ledger a dead activation once, at the publisher's occurrence-window guard. */
6
6
  export function recordStaleBusFailure(subject, error) {
@@ -74,9 +74,7 @@ async function readLSPConfig(configPath) {
74
74
  content = await fs.readFile(configPath, "utf-8");
75
75
  }
76
76
  catch (error) {
77
- if (error instanceof Error &&
78
- "code" in error &&
79
- error.code === "ENOENT") {
77
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") {
80
78
  return undefined;
81
79
  }
82
80
  warnInvalidLSPConfig(configPath, error);
@@ -218,7 +216,8 @@ export async function initLSPConfig(cwd) {
218
216
  if (config.serverOverrides) {
219
217
  for (const [id, entry] of Object.entries(config.serverOverrides)) {
220
218
  if (entry && typeof entry === "object" && !Array.isArray(entry)) {
221
- const initOpts = entry.initializationOptions;
219
+ const initOpts = entry
220
+ .initializationOptions;
222
221
  if (initOpts !== undefined &&
223
222
  typeof initOpts === "object" &&
224
223
  initOpts !== null &&
@@ -291,8 +290,7 @@ export function getServersForFileWithConfig(filePath) {
291
290
  * now report the same primary-vs-auxiliary split for the same file.
292
291
  */
293
292
  export function primaryServerId(filePath) {
294
- return getServersForFileWithConfig(filePath).find((s) => s.role !== "auxiliary")
295
- ?.id;
293
+ return getServersForFileWithConfig(filePath).find((s) => s.role !== "auxiliary")?.id;
296
294
  }
297
295
  /**
298
296
  * Look up an initializationOptions override for a built-in server.