@duckmind/dm-linux-x64 0.65.5 → 0.65.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1208) hide show
  1. package/README.md +0 -8
  2. package/dm +2 -2
  3. package/extensions/.dm-extensions.json +677 -44
  4. package/extensions/dm-lens/clients/actionable-warnings-logger.js +0 -6
  5. package/extensions/dm-lens/clients/actionable-warnings.js +42 -13
  6. package/extensions/dm-lens/clients/advisory-provenance.js +129 -41
  7. package/extensions/dm-lens/clients/agent-behavior-client.js +1 -0
  8. package/extensions/dm-lens/clients/analysed-root.js +0 -0
  9. package/extensions/dm-lens/clients/ast-grep-client.js +38 -3
  10. package/extensions/dm-lens/clients/ast-grep-rule-manager.js +37 -5
  11. package/extensions/dm-lens/clients/ast-grep-tool-logger.js +1 -7
  12. package/extensions/dm-lens/clients/bash-file-access.js +138 -1
  13. package/extensions/dm-lens/clients/biome-client.js +9 -2
  14. package/extensions/dm-lens/clients/blocker-freshness.js +171 -21
  15. package/extensions/dm-lens/clients/bootstrap.js +9 -5
  16. package/extensions/dm-lens/clients/bounded-pid-file-lock.js +1 -1
  17. package/extensions/dm-lens/clients/bounded-telemetry.js +1 -4
  18. package/extensions/dm-lens/clients/bundled-resource-health.js +43 -0
  19. package/extensions/dm-lens/clients/bus-events-logger.js +0 -6
  20. package/extensions/dm-lens/clients/cache/rule-cache.js +11 -3
  21. package/extensions/dm-lens/clients/cache-manager.js +29 -5
  22. package/extensions/dm-lens/clients/cache-observability.js +104 -4
  23. package/extensions/dm-lens/clients/cargo-manifest.js +6 -3
  24. package/extensions/dm-lens/clients/cascade-format.js +87 -5
  25. package/extensions/dm-lens/clients/cascade-logger.js +0 -6
  26. package/extensions/dm-lens/clients/child-unref.js +5 -9
  27. package/extensions/dm-lens/clients/code-quality-warnings.js +4 -2
  28. package/extensions/dm-lens/clients/complexity-client.js +5 -1
  29. package/extensions/dm-lens/clients/config-core/index.js +2 -68
  30. package/extensions/dm-lens/clients/config-core/process-spec.js +1 -1
  31. package/extensions/dm-lens/clients/config-core/provenance.js +1 -2
  32. package/extensions/dm-lens/clients/config-core/records.js +1 -1
  33. package/extensions/dm-lens/clients/config-core/schema.js +3 -6
  34. package/extensions/dm-lens/clients/config-diagnostic-codes.js +5 -3
  35. package/extensions/dm-lens/clients/config-locations.js +125 -5
  36. package/extensions/dm-lens/clients/config-resolve.js +12 -6
  37. package/extensions/dm-lens/clients/config-schema.js +56 -3
  38. package/extensions/dm-lens/clients/config-warn.js +3 -2
  39. package/extensions/dm-lens/clients/dead-code-client.js +4 -1
  40. package/extensions/dm-lens/clients/dead-code-logger.js +0 -3
  41. package/extensions/dm-lens/clients/degradation-ledger.js +29 -4
  42. package/extensions/dm-lens/clients/dependency-checker.js +29 -50
  43. package/extensions/dm-lens/clients/diagnostic-dispositions.js +23 -4
  44. package/extensions/dm-lens/clients/diagnostic-logger.js +1 -1
  45. package/extensions/dm-lens/clients/dispatch/ast-grep-catalog.js +19 -0
  46. package/extensions/dm-lens/clients/dispatch/auxiliary-lsp.js +9 -0
  47. package/extensions/dm-lens/clients/dispatch/collect-later-tier.js +0 -3
  48. package/extensions/dm-lens/clients/dispatch/dispatcher.js +30 -27
  49. package/extensions/dm-lens/clients/dispatch/facts/function-facts.js +1 -1
  50. package/extensions/dm-lens/clients/dispatch/facts/import-facts.js +4 -1
  51. package/extensions/dm-lens/clients/dispatch/finding-policy.js +163 -0
  52. package/extensions/dm-lens/clients/dispatch/indent-detect.js +213 -13
  53. package/extensions/dm-lens/clients/dispatch/inline-suppressions.js +20 -1
  54. package/extensions/dm-lens/clients/dispatch/integration.js +77 -13
  55. package/extensions/dm-lens/clients/dispatch/lazy.js +0 -3
  56. package/extensions/dm-lens/clients/dispatch/pending-runner-findings.js +1 -1
  57. package/extensions/dm-lens/clients/dispatch/plan.js +0 -3
  58. package/extensions/dm-lens/clients/dispatch/rule-ignores.js +21 -0
  59. package/extensions/dm-lens/clients/dispatch/rules/high-complexity.js +2 -2
  60. package/extensions/dm-lens/clients/dispatch/rules/high-fan-out.js +1 -1
  61. package/extensions/dm-lens/clients/dispatch/runners/actionlint.js +25 -29
  62. package/extensions/dm-lens/clients/dispatch/runners/ast-grep-napi.js +8 -32
  63. package/extensions/dm-lens/clients/dispatch/runners/biome-check.js +39 -23
  64. package/extensions/dm-lens/clients/dispatch/runners/cpp-check.js +29 -48
  65. package/extensions/dm-lens/clients/dispatch/runners/credo.js +17 -14
  66. package/extensions/dm-lens/clients/dispatch/runners/cue-vet.js +9 -7
  67. package/extensions/dm-lens/clients/dispatch/runners/dart-analyze.js +21 -43
  68. package/extensions/dm-lens/clients/dispatch/runners/detekt.js +11 -5
  69. package/extensions/dm-lens/clients/dispatch/runners/dotnet-build.js +27 -23
  70. package/extensions/dm-lens/clients/dispatch/runners/elixir-check.js +23 -38
  71. package/extensions/dm-lens/clients/dispatch/runners/eslint.js +22 -35
  72. package/extensions/dm-lens/clients/dispatch/runners/fish-indent.js +2 -1
  73. package/extensions/dm-lens/clients/dispatch/runners/gleam-check.js +35 -12
  74. package/extensions/dm-lens/clients/dispatch/runners/go-vet.js +5 -3
  75. package/extensions/dm-lens/clients/dispatch/runners/golangci-lint.js +21 -22
  76. package/extensions/dm-lens/clients/dispatch/runners/hadolint.js +26 -16
  77. package/extensions/dm-lens/clients/dispatch/runners/helm-lint.js +3 -1
  78. package/extensions/dm-lens/clients/dispatch/runners/helm-render.js +3 -2
  79. package/extensions/dm-lens/clients/dispatch/runners/htmlhint.js +18 -9
  80. package/extensions/dm-lens/clients/dispatch/runners/javac.js +24 -23
  81. package/extensions/dm-lens/clients/dispatch/runners/ktlint.js +23 -54
  82. package/extensions/dm-lens/clients/dispatch/runners/lsp.js +17 -7
  83. package/extensions/dm-lens/clients/dispatch/runners/markdownlint.js +12 -6
  84. package/extensions/dm-lens/clients/dispatch/runners/mypy.js +2 -1
  85. package/extensions/dm-lens/clients/dispatch/runners/oxlint.js +24 -7
  86. package/extensions/dm-lens/clients/dispatch/runners/php-lint.js +26 -17
  87. package/extensions/dm-lens/clients/dispatch/runners/phpstan.js +2 -1
  88. package/extensions/dm-lens/clients/dispatch/runners/prisma-validate.js +2 -1
  89. package/extensions/dm-lens/clients/dispatch/runners/psscriptanalyzer.js +10 -11
  90. package/extensions/dm-lens/clients/dispatch/runners/pyright.js +2 -1
  91. package/extensions/dm-lens/clients/dispatch/runners/rubocop.js +22 -18
  92. package/extensions/dm-lens/clients/dispatch/runners/ruff.js +17 -22
  93. package/extensions/dm-lens/clients/dispatch/runners/rust-clippy.js +8 -11
  94. package/extensions/dm-lens/clients/dispatch/runners/shellcheck.js +9 -4
  95. package/extensions/dm-lens/clients/dispatch/runners/shfmt.js +4 -13
  96. package/extensions/dm-lens/clients/dispatch/runners/spellcheck.js +15 -5
  97. package/extensions/dm-lens/clients/dispatch/runners/spotbugs.js +2 -1
  98. package/extensions/dm-lens/clients/dispatch/runners/sqlfluff.js +10 -4
  99. package/extensions/dm-lens/clients/dispatch/runners/stylelint.js +9 -4
  100. package/extensions/dm-lens/clients/dispatch/runners/swiftlint.js +11 -3
  101. package/extensions/dm-lens/clients/dispatch/runners/taplo.js +13 -7
  102. package/extensions/dm-lens/clients/dispatch/runners/terragrunt.js +2 -1
  103. package/extensions/dm-lens/clients/dispatch/runners/tflint.js +26 -16
  104. package/extensions/dm-lens/clients/dispatch/runners/tree-sitter.js +12 -13
  105. package/extensions/dm-lens/clients/dispatch/runners/trivy-config.js +9 -3
  106. package/extensions/dm-lens/clients/dispatch/runners/utils/availability-policy.js +5 -0
  107. package/extensions/dm-lens/clients/dispatch/runners/utils/candidate-probe.js +2 -2
  108. package/extensions/dm-lens/clients/dispatch/runners/utils/diagnostic-parsers.js +8 -52
  109. package/extensions/dm-lens/clients/dispatch/runners/utils/runner-helpers.js +35 -3
  110. package/extensions/dm-lens/clients/dispatch/runners/utils.js +0 -17
  111. package/extensions/dm-lens/clients/dispatch/runners/vale.js +12 -4
  112. package/extensions/dm-lens/clients/dispatch/runners/yaml-rule-parser.js +2 -20
  113. package/extensions/dm-lens/clients/dispatch/runners/yamllint.js +16 -4
  114. package/extensions/dm-lens/clients/dispatch/runners/zig-check.js +26 -38
  115. package/extensions/dm-lens/clients/dispatch/suppress-writer.js +13 -3
  116. package/extensions/dm-lens/clients/dispatch/types.js +4 -1
  117. package/extensions/dm-lens/clients/dispatch/utils/format-utils.js +2 -2
  118. package/extensions/dm-lens/clients/disposition-logger.js +0 -6
  119. package/extensions/dm-lens/clients/disposition-publish.js +2 -1
  120. package/extensions/dm-lens/clients/effective-config.js +14 -4
  121. package/extensions/dm-lens/clients/event-loop-hold.js +123 -0
  122. package/extensions/dm-lens/clients/event-loop-monitor.js +2 -2
  123. package/extensions/dm-lens/clients/extension-log.js +6 -1
  124. package/extensions/dm-lens/clients/feature-hints.js +2 -1
  125. package/extensions/dm-lens/clients/file-kinds.js +17 -21
  126. package/extensions/dm-lens/clients/file-role.js +11 -2
  127. package/extensions/dm-lens/clients/file-time.js +1 -1
  128. package/extensions/dm-lens/clients/file-utils.js +93 -6
  129. package/extensions/dm-lens/clients/finding-delivery-gate.js +22 -26
  130. package/extensions/dm-lens/clients/format-service.js +33 -16
  131. package/extensions/dm-lens/clients/formatters.js +129 -92
  132. package/extensions/dm-lens/clients/generated-artifacts.js +2 -2
  133. package/extensions/dm-lens/clients/generation-guard.js +4 -0
  134. package/extensions/dm-lens/clients/git-guard.js +80 -26
  135. package/extensions/dm-lens/clients/gitleaks-client.js +26 -0
  136. package/extensions/dm-lens/clients/govulncheck-client.js +34 -6
  137. package/extensions/dm-lens/clients/gradle-ktfmt-style.js +96 -13
  138. package/extensions/dm-lens/clients/grammar-source.js +3 -3
  139. package/extensions/dm-lens/clients/host-edit-normalize.js +1 -1
  140. package/extensions/dm-lens/clients/indent-retarget.js +35 -5
  141. package/extensions/dm-lens/clients/inline-blocker-dispositions.js +107 -0
  142. package/extensions/dm-lens/clients/install-diagnostics.js +8 -6
  143. package/extensions/dm-lens/clients/installer/index.js +695 -183
  144. package/extensions/dm-lens/clients/installer/managed-tool-refresh.js +85 -25
  145. package/extensions/dm-lens/clients/instance-reaper-state.js +3 -0
  146. package/extensions/dm-lens/clients/instance-reaper.js +23 -16
  147. package/extensions/dm-lens/clients/instance-registry.js +34 -2
  148. package/extensions/dm-lens/clients/jscpd-client.js +11 -1
  149. package/extensions/dm-lens/clients/knip-client.js +2 -1
  150. package/extensions/dm-lens/clients/language-profile.js +18 -12
  151. package/extensions/dm-lens/clients/language-registry.js +3 -1
  152. package/extensions/dm-lens/clients/latency-logger.js +14 -4
  153. package/extensions/dm-lens/clients/ledger-bounds.js +13 -1
  154. package/extensions/dm-lens/clients/lens-config.js +74 -7
  155. package/extensions/dm-lens/clients/lens-engine.js +9 -10
  156. package/extensions/dm-lens/clients/lens-events.js +1 -1
  157. package/extensions/dm-lens/clients/lens-flag-registry.js +47 -2
  158. package/extensions/dm-lens/clients/lens-map.js +1 -1
  159. package/extensions/dm-lens/clients/log-cleanup.js +0 -28
  160. package/extensions/dm-lens/clients/lsp/cascade-tier.js +2 -1
  161. package/extensions/dm-lens/clients/lsp/client.js +70 -30
  162. package/extensions/dm-lens/clients/lsp/config.js +41 -15
  163. package/extensions/dm-lens/clients/lsp/content-limits.js +21 -0
  164. package/extensions/dm-lens/clients/lsp/diagnostic-binding.js +8 -0
  165. package/extensions/dm-lens/clients/lsp/document-drift.js +72 -1
  166. package/extensions/dm-lens/clients/lsp/edits.js +3 -3
  167. package/extensions/dm-lens/clients/lsp/index.js +435 -62
  168. package/extensions/dm-lens/clients/lsp/inferred-project.js +1 -1
  169. package/extensions/dm-lens/clients/lsp/language.js +0 -3
  170. package/extensions/dm-lens/clients/lsp/launch.js +12 -5
  171. package/extensions/dm-lens/clients/lsp/path-utils.js +0 -2
  172. package/extensions/dm-lens/clients/lsp/pending-aux-coverage.js +0 -1
  173. package/extensions/dm-lens/clients/lsp/server.js +125 -60
  174. package/extensions/dm-lens/clients/lsp/session-roots.js +26 -5
  175. package/extensions/dm-lens/clients/lsp/sync-kind.js +14 -1
  176. package/extensions/dm-lens/clients/lsp/tsserver-sync.js +5 -7
  177. package/extensions/dm-lens/clients/lsp/wait-policy/classification.js +3 -0
  178. package/extensions/dm-lens/clients/lsp/wait-policy/strategies.js +31 -2
  179. package/extensions/dm-lens/clients/lsp/workspace-diagnostics-cache.js +26 -4
  180. package/extensions/dm-lens/clients/lsp-document-symbols.js +1 -1
  181. package/extensions/dm-lens/clients/map-with-concurrency.js +7 -3
  182. package/extensions/dm-lens/clients/mcp/analyze.js +1 -1
  183. package/extensions/dm-lens/clients/mcp/ipc.js +104 -40
  184. package/extensions/dm-lens/clients/mcp/review.js +39 -7
  185. package/extensions/dm-lens/clients/mcp/session.js +38 -4
  186. package/extensions/dm-lens/clients/metrics-history.js +19 -84
  187. package/extensions/dm-lens/clients/middle-man-analysis.js +2 -4
  188. package/extensions/dm-lens/clients/module-report.js +1 -1
  189. package/extensions/dm-lens/clients/mutating-tool.js +3 -3
  190. package/extensions/dm-lens/clients/mutation-attribution.js +3 -3
  191. package/extensions/dm-lens/clients/ndjson-logger.js +17 -9
  192. package/extensions/dm-lens/clients/observed-mutation.js +42 -11
  193. package/extensions/dm-lens/clients/opaque-mutation-scan.js +17 -7
  194. package/extensions/dm-lens/clients/opengrep-client.js +92 -10
  195. package/extensions/dm-lens/clients/opengrep-config.js +1 -1
  196. package/extensions/dm-lens/clients/package-manager.js +2 -1
  197. package/extensions/dm-lens/clients/path-utils.js +199 -3
  198. package/extensions/dm-lens/clients/performance-report.js +3 -3
  199. package/extensions/dm-lens/clients/persistent-reverify.js +167 -0
  200. package/extensions/dm-lens/clients/php-cs-fixer-config.js +9 -4
  201. package/extensions/dm-lens/clients/pipeline.js +124 -68
  202. package/extensions/dm-lens/clients/project-changes.js +1 -1
  203. package/extensions/dm-lens/clients/project-diagnostics/cache.js +19 -5
  204. package/extensions/dm-lens/clients/project-diagnostics/extractors.js +1 -1
  205. package/extensions/dm-lens/clients/project-diagnostics/fresh-fetch.js +150 -18
  206. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/dead-code.js +4 -1
  207. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/gitleaks.js +3 -3
  208. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/jscpd.js +1 -1
  209. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/knip.js +1 -1
  210. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/madge.js +1 -1
  211. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/opengrep.js +1 -1
  212. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/runner-findings.js +19 -2
  213. package/extensions/dm-lens/clients/project-diagnostics/scanner.js +35 -4
  214. package/extensions/dm-lens/clients/project-lens-config.js +58 -4
  215. package/extensions/dm-lens/clients/project-scan-policy.js +0 -46
  216. package/extensions/dm-lens/clients/python-environment.js +80 -4
  217. package/extensions/dm-lens/clients/python-provenance.js +551 -0
  218. package/extensions/dm-lens/clients/read-guard-logger.js +3 -1
  219. package/extensions/dm-lens/clients/read-guard.js +29 -6
  220. package/extensions/dm-lens/clients/recent-touches.js +2 -2
  221. package/extensions/dm-lens/clients/resource-sampler.js +59 -9
  222. package/extensions/dm-lens/clients/review-graph/builder.js +39 -34
  223. package/extensions/dm-lens/clients/review-graph/git-identity.js +11 -7
  224. package/extensions/dm-lens/clients/review-graph/import-resolvers.js +1 -1
  225. package/extensions/dm-lens/clients/review-graph-logger.js +3 -1
  226. package/extensions/dm-lens/clients/ruff-client.js +11 -10
  227. package/extensions/dm-lens/clients/runtime-agent-end.js +41 -5
  228. package/extensions/dm-lens/clients/runtime-context.js +5 -2
  229. package/extensions/dm-lens/clients/runtime-coordinator.js +60 -6
  230. package/extensions/dm-lens/clients/runtime-session.js +52 -8
  231. package/extensions/dm-lens/clients/runtime-tool-call.js +27 -15
  232. package/extensions/dm-lens/clients/runtime-tool-result.js +279 -63
  233. package/extensions/dm-lens/clients/runtime-turn.js +453 -185
  234. package/extensions/dm-lens/clients/safe-spawn.js +248 -62
  235. package/extensions/dm-lens/clients/sanitize.js +0 -4
  236. package/extensions/dm-lens/clients/scan-utils.js +1 -39
  237. package/extensions/dm-lens/clients/scratch-tree-policy.js +2 -3
  238. package/extensions/dm-lens/clients/security-scan-client.js +2 -2
  239. package/extensions/dm-lens/clients/session-event-guard.js +59 -2
  240. package/extensions/dm-lens/clients/session-summary.js +0 -25
  241. package/extensions/dm-lens/clients/sg-runner.js +24 -12
  242. package/extensions/dm-lens/clients/sgconfig.js +58 -6
  243. package/extensions/dm-lens/clients/shared-checkout-guard.js +1 -1
  244. package/extensions/dm-lens/clients/situational-tool-telemetry.js +85 -0
  245. package/extensions/dm-lens/clients/skills-resolver.js +42 -0
  246. package/extensions/dm-lens/clients/smells-rollup.js +2 -2
  247. package/extensions/dm-lens/clients/spawn-output-cap.js +29 -0
  248. package/extensions/dm-lens/clients/startup-scan.js +1 -2
  249. package/extensions/dm-lens/clients/string-utils.js +3 -0
  250. package/extensions/dm-lens/clients/test-runner-client.js +118 -57
  251. package/extensions/dm-lens/clients/test-runner-delivery.js +118 -66
  252. package/extensions/dm-lens/clients/tool-agreement.js +403 -0
  253. package/extensions/dm-lens/clients/tool-config.js +218 -0
  254. package/extensions/dm-lens/clients/tool-cwd.js +248 -0
  255. package/extensions/dm-lens/clients/tool-definition.js +18 -1
  256. package/extensions/dm-lens/clients/tool-policy.js +138 -10
  257. package/extensions/dm-lens/clients/tool-probe.js +5 -0
  258. package/extensions/dm-lens/clients/tool-set-policy.js +35 -0
  259. package/extensions/dm-lens/clients/tree-sitter-client.js +201 -80
  260. package/extensions/dm-lens/clients/tree-sitter-query-loader.js +78 -130
  261. package/extensions/dm-lens/clients/trivy-client.js +8 -1
  262. package/extensions/dm-lens/clients/tui-fit.js +0 -3
  263. package/extensions/dm-lens/clients/turn-context.js +48 -0
  264. package/extensions/dm-lens/clients/turn-end/lane.js +0 -0
  265. package/extensions/dm-lens/clients/turn-end/lanes/govulncheck.js +54 -0
  266. package/extensions/dm-lens/clients/turn-end/lanes/secrets.js +140 -0
  267. package/extensions/dm-lens/clients/user-notify.js +0 -3
  268. package/extensions/dm-lens/clients/warm-attach.js +25 -0
  269. package/extensions/dm-lens/clients/widget-state.js +203 -13
  270. package/extensions/dm-lens/clients/word-index-logger.js +0 -6
  271. package/extensions/dm-lens/clients/word-index-store.js +1 -4
  272. package/extensions/dm-lens/clients/word-index.js +9 -5
  273. package/extensions/dm-lens/clients/workspace-topology.js +20 -3
  274. package/extensions/dm-lens/clients/write-ordering-guard.js +6 -0
  275. package/extensions/dm-lens/clients/zizmor-config.js +15 -11
  276. package/extensions/dm-lens/config/dependency-cruiser-eager-allowlist.json +8 -2
  277. package/extensions/dm-lens/dist/clients/actionable-warnings-logger.js +24 -0
  278. package/extensions/dm-lens/dist/clients/actionable-warnings.js +1014 -0
  279. package/extensions/dm-lens/dist/clients/advisory-provenance.js +385 -0
  280. package/extensions/dm-lens/dist/clients/agent-behavior-client.js +94 -0
  281. package/extensions/dm-lens/dist/clients/agent-nudge.js +151 -0
  282. package/extensions/dm-lens/dist/clients/analysed-root.js +1 -0
  283. package/extensions/dm-lens/dist/clients/ast-grep-client.js +576 -0
  284. package/extensions/dm-lens/dist/clients/ast-grep-rule-manager.js +114 -0
  285. package/extensions/dm-lens/dist/clients/ast-grep-tool-logger.js +85 -0
  286. package/extensions/dm-lens/dist/clients/ast-grep-types.js +1 -0
  287. package/extensions/dm-lens/dist/clients/ast-grep-yaml-synth.js +109 -0
  288. package/extensions/dm-lens/dist/clients/atomic-write-staging.js +66 -0
  289. package/extensions/dm-lens/dist/clients/atomic-write.js +37 -0
  290. package/extensions/dm-lens/dist/clients/availability-probe-flight.js +11 -0
  291. package/extensions/dm-lens/dist/clients/bash-file-access.js +830 -0
  292. package/extensions/dm-lens/dist/clients/biome-client.js +221 -0
  293. package/extensions/dm-lens/dist/clients/blocker-freshness.js +385 -0
  294. package/extensions/dm-lens/dist/clients/blocker-past-eof.js +49 -0
  295. package/extensions/dm-lens/dist/clients/bootstrap.js +246 -0
  296. package/extensions/dm-lens/dist/clients/bounded-cache.js +105 -0
  297. package/extensions/dm-lens/dist/clients/bounded-pid-file-lock.js +173 -0
  298. package/extensions/dm-lens/dist/clients/bounded-telemetry.js +104 -0
  299. package/extensions/dm-lens/dist/clients/build-identity.js +45 -0
  300. package/extensions/dm-lens/dist/clients/bundled-resource-health.js +41 -0
  301. package/extensions/dm-lens/dist/clients/bus-events-logger.js +48 -0
  302. package/extensions/dm-lens/dist/clients/bus-publish.js +117 -0
  303. package/extensions/dm-lens/dist/clients/cache/rule-cache.js +103 -0
  304. package/extensions/dm-lens/dist/clients/cache-manager.js +340 -0
  305. package/extensions/dm-lens/dist/clients/cache-observability.js +847 -0
  306. package/extensions/dm-lens/dist/clients/call-graph.js +628 -0
  307. package/extensions/dm-lens/dist/clients/cargo-manifest.js +151 -0
  308. package/extensions/dm-lens/dist/clients/cascade-budget.js +52 -0
  309. package/extensions/dm-lens/dist/clients/cascade-format.js +160 -0
  310. package/extensions/dm-lens/dist/clients/cascade-logger.js +22 -0
  311. package/extensions/dm-lens/dist/clients/cascade-types.js +1 -0
  312. package/extensions/dm-lens/dist/clients/child-unref.js +59 -0
  313. package/extensions/dm-lens/dist/clients/code-quality-warnings.js +192 -0
  314. package/extensions/dm-lens/dist/clients/codebase-model.js +110 -0
  315. package/extensions/dm-lens/dist/clients/collateral-test-role.js +8 -0
  316. package/extensions/dm-lens/dist/clients/complexity-client.js +398 -0
  317. package/extensions/dm-lens/dist/clients/config-core/deny.js +117 -0
  318. package/extensions/dm-lens/dist/clients/config-core/index.js +2 -0
  319. package/extensions/dm-lens/dist/clients/config-core/merge.js +228 -0
  320. package/extensions/dm-lens/dist/clients/config-core/normalize.js +217 -0
  321. package/extensions/dm-lens/dist/clients/config-core/process-spec.js +147 -0
  322. package/extensions/dm-lens/dist/clients/config-core/provenance.js +54 -0
  323. package/extensions/dm-lens/dist/clients/config-core/records.js +79 -0
  324. package/extensions/dm-lens/dist/clients/config-core/resolve.js +48 -0
  325. package/extensions/dm-lens/dist/clients/config-core/safe-object.js +22 -0
  326. package/extensions/dm-lens/dist/clients/config-core/schema.js +90 -0
  327. package/extensions/dm-lens/dist/clients/config-diagnostic-codes.js +90 -0
  328. package/extensions/dm-lens/dist/clients/config-locations.js +175 -0
  329. package/extensions/dm-lens/dist/clients/config-resolve.js +359 -0
  330. package/extensions/dm-lens/dist/clients/config-schema.js +128 -0
  331. package/extensions/dm-lens/dist/clients/config-warn.js +146 -0
  332. package/extensions/dm-lens/dist/clients/console-guard-install.js +4 -0
  333. package/extensions/dm-lens/dist/clients/cooperative-budget.js +36 -0
  334. package/extensions/dm-lens/dist/clients/dead-code-client.js +342 -0
  335. package/extensions/dm-lens/dist/clients/dead-code-logger.js +18 -0
  336. package/extensions/dm-lens/dist/clients/deadline-utils.js +117 -0
  337. package/extensions/dm-lens/dist/clients/debug-handles.js +121 -0
  338. package/extensions/dm-lens/dist/clients/debug-heap.js +80 -0
  339. package/extensions/dm-lens/dist/clients/deferred-lsp-work.js +33 -0
  340. package/extensions/dm-lens/dist/clients/degradation-ledger.js +272 -0
  341. package/extensions/dm-lens/dist/clients/demoted-finding-render.js +61 -0
  342. package/extensions/dm-lens/dist/clients/dependency-checker.js +525 -0
  343. package/extensions/dm-lens/dist/clients/deps/ast-grep-napi.js +17 -0
  344. package/extensions/dm-lens/dist/clients/deps/dm-host-deps.js +10 -0
  345. package/extensions/dm-lens/dist/clients/deps/dm-tui-compat.js +58 -0
  346. package/extensions/dm-lens/dist/clients/deps/js-yaml.js +7 -0
  347. package/extensions/dm-lens/dist/clients/deps/minimatch.js +6 -0
  348. package/extensions/dm-lens/dist/clients/deps/pidusage.js +5 -0
  349. package/extensions/dm-lens/dist/clients/deps/typebox.js +5 -0
  350. package/extensions/dm-lens/dist/clients/deps/vscode-jsonrpc.js +8 -0
  351. package/extensions/dm-lens/dist/clients/deps/web-tree-sitter.js +11 -0
  352. package/extensions/dm-lens/dist/clients/diagnostic-dispositions.js +318 -0
  353. package/extensions/dm-lens/dist/clients/diagnostic-line-freshness.js +144 -0
  354. package/extensions/dm-lens/dist/clients/diagnostic-logger.js +60 -0
  355. package/extensions/dm-lens/dist/clients/diagnostic-tracker.js +89 -0
  356. package/extensions/dm-lens/dist/clients/diagnostics-publish.js +134 -0
  357. package/extensions/dm-lens/dist/clients/dispatch/ast-grep-catalog.js +16 -0
  358. package/extensions/dm-lens/dist/clients/dispatch/auxiliary-lsp.js +158 -0
  359. package/extensions/dm-lens/dist/clients/dispatch/collect-later-tier.js +25 -0
  360. package/extensions/dm-lens/dist/clients/dispatch/diagnostic-taxonomy.js +58 -0
  361. package/extensions/dm-lens/dist/clients/dispatch/dispatcher.js +953 -0
  362. package/extensions/dm-lens/dist/clients/dispatch/fact-provider-types.js +1 -0
  363. package/extensions/dm-lens/dist/clients/dispatch/fact-rule-runner.js +17 -0
  364. package/extensions/dm-lens/dist/clients/dispatch/fact-runner.js +18 -0
  365. package/extensions/dm-lens/dist/clients/dispatch/fact-scheduler.js +52 -0
  366. package/extensions/dm-lens/dist/clients/dispatch/fact-store.js +199 -0
  367. package/extensions/dm-lens/dist/clients/dispatch/facts/comment-facts.js +20 -0
  368. package/extensions/dm-lens/dist/clients/dispatch/facts/file-content.js +18 -0
  369. package/extensions/dm-lens/dist/clients/dispatch/facts/function-facts.js +281 -0
  370. package/extensions/dm-lens/dist/clients/dispatch/facts/import-facts.js +169 -0
  371. package/extensions/dm-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +19 -0
  372. package/extensions/dm-lens/dist/clients/dispatch/facts/try-catch-facts.js +95 -0
  373. package/extensions/dm-lens/dist/clients/dispatch/finding-policy.js +159 -0
  374. package/extensions/dm-lens/dist/clients/dispatch/indent-detect.js +227 -0
  375. package/extensions/dm-lens/dist/clients/dispatch/inline-suppressions.js +52 -0
  376. package/extensions/dm-lens/dist/clients/dispatch/integration.js +1463 -0
  377. package/extensions/dm-lens/dist/clients/dispatch/lazy.js +8 -0
  378. package/extensions/dm-lens/dist/clients/dispatch/pending-runner-findings.js +75 -0
  379. package/extensions/dm-lens/dist/clients/dispatch/plan.js +278 -0
  380. package/extensions/dm-lens/dist/clients/dispatch/priorities.js +14 -0
  381. package/extensions/dm-lens/dist/clients/dispatch/rule-id-normalize.js +42 -0
  382. package/extensions/dm-lens/dist/clients/dispatch/rule-ignores.js +21 -0
  383. package/extensions/dm-lens/dist/clients/dispatch/rule-policy.js +73 -0
  384. package/extensions/dm-lens/dist/clients/dispatch/rules/async-noise.js +31 -0
  385. package/extensions/dm-lens/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +27 -0
  386. package/extensions/dm-lens/dist/clients/dispatch/rules/cors-wildcard.js +35 -0
  387. package/extensions/dm-lens/dist/clients/dispatch/rules/error-obscuring.js +29 -0
  388. package/extensions/dm-lens/dist/clients/dispatch/rules/error-swallowing.js +29 -0
  389. package/extensions/dm-lens/dist/clients/dispatch/rules/framework-call-noise.js +31 -0
  390. package/extensions/dm-lens/dist/clients/dispatch/rules/high-complexity.js +56 -0
  391. package/extensions/dm-lens/dist/clients/dispatch/rules/high-fan-out.js +45 -0
  392. package/extensions/dm-lens/dist/clients/dispatch/rules/high-import-coupling.js +31 -0
  393. package/extensions/dm-lens/dist/clients/dispatch/rules/missing-error-propagation.js +45 -0
  394. package/extensions/dm-lens/dist/clients/dispatch/rules/no-commented-credentials.js +46 -0
  395. package/extensions/dm-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +38 -0
  396. package/extensions/dm-lens/dist/clients/dispatch/rules/placeholder-comments.js +40 -0
  397. package/extensions/dm-lens/dist/clients/dispatch/rules/unsafe-boundary.js +101 -0
  398. package/extensions/dm-lens/dist/clients/dispatch/runner-context.js +46 -0
  399. package/extensions/dm-lens/dist/clients/dispatch/runners/actionlint.js +98 -0
  400. package/extensions/dm-lens/dist/clients/dispatch/runners/ast-grep-napi.js +690 -0
  401. package/extensions/dm-lens/dist/clients/dispatch/runners/biome-check.js +202 -0
  402. package/extensions/dm-lens/dist/clients/dispatch/runners/cpp-check.js +190 -0
  403. package/extensions/dm-lens/dist/clients/dispatch/runners/credo.js +66 -0
  404. package/extensions/dm-lens/dist/clients/dispatch/runners/cue-vet.js +167 -0
  405. package/extensions/dm-lens/dist/clients/dispatch/runners/dart-analyze.js +151 -0
  406. package/extensions/dm-lens/dist/clients/dispatch/runners/detekt.js +157 -0
  407. package/extensions/dm-lens/dist/clients/dispatch/runners/dotnet-build.js +157 -0
  408. package/extensions/dm-lens/dist/clients/dispatch/runners/elixir-check.js +153 -0
  409. package/extensions/dm-lens/dist/clients/dispatch/runners/eslint.js +99 -0
  410. package/extensions/dm-lens/dist/clients/dispatch/runners/fact-rules.js +20 -0
  411. package/extensions/dm-lens/dist/clients/dispatch/runners/fish-indent.js +65 -0
  412. package/extensions/dm-lens/dist/clients/dispatch/runners/gleam-check.js +107 -0
  413. package/extensions/dm-lens/dist/clients/dispatch/runners/go-vet.js +51 -0
  414. package/extensions/dm-lens/dist/clients/dispatch/runners/golangci-lint.js +89 -0
  415. package/extensions/dm-lens/dist/clients/dispatch/runners/hadolint.js +83 -0
  416. package/extensions/dm-lens/dist/clients/dispatch/runners/helm-lint.js +144 -0
  417. package/extensions/dm-lens/dist/clients/dispatch/runners/helm-render.js +593 -0
  418. package/extensions/dm-lens/dist/clients/dispatch/runners/htmlhint.js +103 -0
  419. package/extensions/dm-lens/dist/clients/dispatch/runners/index.js +100 -0
  420. package/extensions/dm-lens/dist/clients/dispatch/runners/javac.js +82 -0
  421. package/extensions/dm-lens/dist/clients/dispatch/runners/ktlint.js +93 -0
  422. package/extensions/dm-lens/dist/clients/dispatch/runners/lsp.js +206 -0
  423. package/extensions/dm-lens/dist/clients/dispatch/runners/markdownlint.js +129 -0
  424. package/extensions/dm-lens/dist/clients/dispatch/runners/mypy.js +70 -0
  425. package/extensions/dm-lens/dist/clients/dispatch/runners/oxlint.js +305 -0
  426. package/extensions/dm-lens/dist/clients/dispatch/runners/php-lint.js +70 -0
  427. package/extensions/dm-lens/dist/clients/dispatch/runners/phpstan.js +90 -0
  428. package/extensions/dm-lens/dist/clients/dispatch/runners/prisma-validate.js +56 -0
  429. package/extensions/dm-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +307 -0
  430. package/extensions/dm-lens/dist/clients/dispatch/runners/pyright.js +118 -0
  431. package/extensions/dm-lens/dist/clients/dispatch/runners/rubocop.js +79 -0
  432. package/extensions/dm-lens/dist/clients/dispatch/runners/ruff.js +69 -0
  433. package/extensions/dm-lens/dist/clients/dispatch/runners/rust-clippy.js +147 -0
  434. package/extensions/dm-lens/dist/clients/dispatch/runners/shellcheck.js +111 -0
  435. package/extensions/dm-lens/dist/clients/dispatch/runners/shfmt.js +81 -0
  436. package/extensions/dm-lens/dist/clients/dispatch/runners/spellcheck.js +74 -0
  437. package/extensions/dm-lens/dist/clients/dispatch/runners/spotbugs.js +208 -0
  438. package/extensions/dm-lens/dist/clients/dispatch/runners/sqlfluff.js +136 -0
  439. package/extensions/dm-lens/dist/clients/dispatch/runners/stylelint.js +118 -0
  440. package/extensions/dm-lens/dist/clients/dispatch/runners/swiftlint.js +143 -0
  441. package/extensions/dm-lens/dist/clients/dispatch/runners/taplo.js +97 -0
  442. package/extensions/dm-lens/dist/clients/dispatch/runners/terragrunt.js +110 -0
  443. package/extensions/dm-lens/dist/clients/dispatch/runners/tflint.js +104 -0
  444. package/extensions/dm-lens/dist/clients/dispatch/runners/tree-sitter.js +516 -0
  445. package/extensions/dm-lens/dist/clients/dispatch/runners/trivy-config.js +155 -0
  446. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/availability-policy.js +285 -0
  447. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +61 -0
  448. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +61 -0
  449. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +130 -0
  450. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +1067 -0
  451. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +40 -0
  452. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/tool-failure.js +117 -0
  453. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +88 -0
  454. package/extensions/dm-lens/dist/clients/dispatch/runners/utils.js +8 -0
  455. package/extensions/dm-lens/dist/clients/dispatch/runners/vale.js +106 -0
  456. package/extensions/dm-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +163 -0
  457. package/extensions/dm-lens/dist/clients/dispatch/runners/yamllint.js +83 -0
  458. package/extensions/dm-lens/dist/clients/dispatch/runners/zig-check.js +72 -0
  459. package/extensions/dm-lens/dist/clients/dispatch/suppress-writer.js +57 -0
  460. package/extensions/dm-lens/dist/clients/dispatch/tool-profile.js +30 -0
  461. package/extensions/dm-lens/dist/clients/dispatch/types.js +7 -0
  462. package/extensions/dm-lens/dist/clients/dispatch/utils/format-utils.js +45 -0
  463. package/extensions/dm-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +31 -0
  464. package/extensions/dm-lens/dist/clients/disposition-logger.js +19 -0
  465. package/extensions/dm-lens/dist/clients/disposition-publish.js +88 -0
  466. package/extensions/dm-lens/dist/clients/durable-store.js +77 -0
  467. package/extensions/dm-lens/dist/clients/effective-config.js +160 -0
  468. package/extensions/dm-lens/dist/clients/env-utils.js +26 -0
  469. package/extensions/dm-lens/dist/clients/error-class.js +3 -0
  470. package/extensions/dm-lens/dist/clients/eval-timestamp.js +2 -0
  471. package/extensions/dm-lens/dist/clients/event-loop-hold.js +119 -0
  472. package/extensions/dm-lens/dist/clients/event-loop-monitor.js +84 -0
  473. package/extensions/dm-lens/dist/clients/extension-log.js +230 -0
  474. package/extensions/dm-lens/dist/clients/extension-mode.js +20 -0
  475. package/extensions/dm-lens/dist/clients/feature-hints.js +88 -0
  476. package/extensions/dm-lens/dist/clients/file-kinds.js +304 -0
  477. package/extensions/dm-lens/dist/clients/file-role.js +50 -0
  478. package/extensions/dm-lens/dist/clients/file-time.js +112 -0
  479. package/extensions/dm-lens/dist/clients/file-utils.js +630 -0
  480. package/extensions/dm-lens/dist/clients/finding-delivery-gate.js +129 -0
  481. package/extensions/dm-lens/dist/clients/finding-identity.js +23 -0
  482. package/extensions/dm-lens/dist/clients/fix-worklog.js +75 -0
  483. package/extensions/dm-lens/dist/clients/format-events-publish.js +230 -0
  484. package/extensions/dm-lens/dist/clients/format-service.js +154 -0
  485. package/extensions/dm-lens/dist/clients/formatters-lazy.js +8 -0
  486. package/extensions/dm-lens/dist/clients/formatters.js +1351 -0
  487. package/extensions/dm-lens/dist/clients/freshness-cadence.js +1 -0
  488. package/extensions/dm-lens/dist/clients/freshness.js +8 -0
  489. package/extensions/dm-lens/dist/clients/generated-artifacts.js +209 -0
  490. package/extensions/dm-lens/dist/clients/generation-guard.js +105 -0
  491. package/extensions/dm-lens/dist/clients/git-guard.js +770 -0
  492. package/extensions/dm-lens/dist/clients/git-tracked-ignore.js +120 -0
  493. package/extensions/dm-lens/dist/clients/gitleaks-client.js +282 -0
  494. package/extensions/dm-lens/dist/clients/go-client.js +47 -0
  495. package/extensions/dm-lens/dist/clients/govulncheck-client.js +411 -0
  496. package/extensions/dm-lens/dist/clients/gradle-ktfmt-style.js +177 -0
  497. package/extensions/dm-lens/dist/clients/grammar-source.js +224 -0
  498. package/extensions/dm-lens/dist/clients/gzip-stage-write.js +85 -0
  499. package/extensions/dm-lens/dist/clients/hashline-anchor.js +222 -0
  500. package/extensions/dm-lens/dist/clients/hook-budgets.js +16 -0
  501. package/extensions/dm-lens/dist/clients/host-edit-normalize.js +87 -0
  502. package/extensions/dm-lens/dist/clients/host-ports.js +35 -0
  503. package/extensions/dm-lens/dist/clients/indent-retarget.js +102 -0
  504. package/extensions/dm-lens/dist/clients/inline-blocker-dispositions.js +103 -0
  505. package/extensions/dm-lens/dist/clients/install-diagnostics.js +123 -0
  506. package/extensions/dm-lens/dist/clients/installer/index.js +3770 -0
  507. package/extensions/dm-lens/dist/clients/installer/managed-tool-refresh-session.js +17 -0
  508. package/extensions/dm-lens/dist/clients/installer/managed-tool-refresh.js +522 -0
  509. package/extensions/dm-lens/dist/clients/instance-reaper-state.js +3 -0
  510. package/extensions/dm-lens/dist/clients/instance-reaper.js +577 -0
  511. package/extensions/dm-lens/dist/clients/instance-registry-lock.js +131 -0
  512. package/extensions/dm-lens/dist/clients/instance-registry.js +452 -0
  513. package/extensions/dm-lens/dist/clients/jscpd-client.js +252 -0
  514. package/extensions/dm-lens/dist/clients/json-cache-read.js +25 -0
  515. package/extensions/dm-lens/dist/clients/knip-client.js +472 -0
  516. package/extensions/dm-lens/dist/clients/language-policy.js +242 -0
  517. package/extensions/dm-lens/dist/clients/language-profile.js +261 -0
  518. package/extensions/dm-lens/dist/clients/language-registry.js +424 -0
  519. package/extensions/dm-lens/dist/clients/latency-logger.js +192 -0
  520. package/extensions/dm-lens/dist/clients/lazy-import.js +14 -0
  521. package/extensions/dm-lens/dist/clients/ledger-bounds.js +21 -0
  522. package/extensions/dm-lens/dist/clients/lens-config.js +237 -0
  523. package/extensions/dm-lens/dist/clients/lens-engine.js +181 -0
  524. package/extensions/dm-lens/dist/clients/lens-events.js +105 -0
  525. package/extensions/dm-lens/dist/clients/lens-flag-registry.js +302 -0
  526. package/extensions/dm-lens/dist/clients/lens-map.js +980 -0
  527. package/extensions/dm-lens/dist/clients/live-bus-emitter.js +53 -0
  528. package/extensions/dm-lens/dist/clients/log-cleanup.js +138 -0
  529. package/extensions/dm-lens/dist/clients/lsp/aggregation.js +88 -0
  530. package/extensions/dm-lens/dist/clients/lsp/cascade-tier.js +203 -0
  531. package/extensions/dm-lens/dist/clients/lsp/client.js +2709 -0
  532. package/extensions/dm-lens/dist/clients/lsp/config.js +252 -0
  533. package/extensions/dm-lens/dist/clients/lsp/content-limits.js +21 -0
  534. package/extensions/dm-lens/dist/clients/lsp/diagnostic-binding.js +79 -0
  535. package/extensions/dm-lens/dist/clients/lsp/document-drift.js +312 -0
  536. package/extensions/dm-lens/dist/clients/lsp/edits.js +930 -0
  537. package/extensions/dm-lens/dist/clients/lsp/index.js +4448 -0
  538. package/extensions/dm-lens/dist/clients/lsp/inferred-project.js +121 -0
  539. package/extensions/dm-lens/dist/clients/lsp/jvm-runtime.js +194 -0
  540. package/extensions/dm-lens/dist/clients/lsp/language.js +23 -0
  541. package/extensions/dm-lens/dist/clients/lsp/launch.js +468 -0
  542. package/extensions/dm-lens/dist/clients/lsp/lombok.js +146 -0
  543. package/extensions/dm-lens/dist/clients/lsp/path-utils.js +1 -0
  544. package/extensions/dm-lens/dist/clients/lsp/pending-aux-coverage.js +90 -0
  545. package/extensions/dm-lens/dist/clients/lsp/position-encoding.js +28 -0
  546. package/extensions/dm-lens/dist/clients/lsp/ruby-drive-dirs.js +42 -0
  547. package/extensions/dm-lens/dist/clients/lsp/server.js +2422 -0
  548. package/extensions/dm-lens/dist/clients/lsp/session-roots.js +52 -0
  549. package/extensions/dm-lens/dist/clients/lsp/spawn-history.js +15 -0
  550. package/extensions/dm-lens/dist/clients/lsp/sync-kind.js +30 -0
  551. package/extensions/dm-lens/dist/clients/lsp/tsserver-sync.js +156 -0
  552. package/extensions/dm-lens/dist/clients/lsp/wait-policy/capability-snapshot.js +1 -0
  553. package/extensions/dm-lens/dist/clients/lsp/wait-policy/classification.js +36 -0
  554. package/extensions/dm-lens/dist/clients/lsp/wait-policy/index.js +3 -0
  555. package/extensions/dm-lens/dist/clients/lsp/wait-policy/strategies.js +175 -0
  556. package/extensions/dm-lens/dist/clients/lsp/watch-queue.js +40 -0
  557. package/extensions/dm-lens/dist/clients/lsp/workspace-diagnostics-cache.js +267 -0
  558. package/extensions/dm-lens/dist/clients/lsp/workspace-diagnostics-session.js +7 -0
  559. package/extensions/dm-lens/dist/clients/lsp/workspace-sweep-hold.js +93 -0
  560. package/extensions/dm-lens/dist/clients/lsp-budget.js +83 -0
  561. package/extensions/dm-lens/dist/clients/lsp-document-symbols.js +93 -0
  562. package/extensions/dm-lens/dist/clients/lsp-lazy.js +8 -0
  563. package/extensions/dm-lens/dist/clients/lsp-mutation.js +273 -0
  564. package/extensions/dm-lens/dist/clients/lsp-status.js +37 -0
  565. package/extensions/dm-lens/dist/clients/map-with-concurrency.js +20 -0
  566. package/extensions/dm-lens/dist/clients/mcp/analyze.js +251 -0
  567. package/extensions/dm-lens/dist/clients/mcp/host-shim.js +14 -0
  568. package/extensions/dm-lens/dist/clients/mcp/ipc.js +302 -0
  569. package/extensions/dm-lens/dist/clients/mcp/review.js +137 -0
  570. package/extensions/dm-lens/dist/clients/mcp/session.js +305 -0
  571. package/extensions/dm-lens/dist/clients/memory-sampler.js +107 -0
  572. package/extensions/dm-lens/dist/clients/message-end-attribution.js +18 -0
  573. package/extensions/dm-lens/dist/clients/metrics-client.js +80 -0
  574. package/extensions/dm-lens/dist/clients/metrics-history.js +255 -0
  575. package/extensions/dm-lens/dist/clients/middle-man-analysis.js +161 -0
  576. package/extensions/dm-lens/dist/clients/model-provider.js +31 -0
  577. package/extensions/dm-lens/dist/clients/module-report-lsp.js +140 -0
  578. package/extensions/dm-lens/dist/clients/module-report.js +1642 -0
  579. package/extensions/dm-lens/dist/clients/mutating-tool.js +377 -0
  580. package/extensions/dm-lens/dist/clients/mutation-attribution.js +168 -0
  581. package/extensions/dm-lens/dist/clients/mutation-bridge.js +102 -0
  582. package/extensions/dm-lens/dist/clients/ndjson-logger.js +471 -0
  583. package/extensions/dm-lens/dist/clients/observed-mutation-sources.js +43 -0
  584. package/extensions/dm-lens/dist/clients/observed-mutation.js +709 -0
  585. package/extensions/dm-lens/dist/clients/oldtext-autopatch.js +100 -0
  586. package/extensions/dm-lens/dist/clients/opaque-mutation-scan.js +313 -0
  587. package/extensions/dm-lens/dist/clients/opengrep-client.js +216 -0
  588. package/extensions/dm-lens/dist/clients/opengrep-config.js +52 -0
  589. package/extensions/dm-lens/dist/clients/package-manager.js +303 -0
  590. package/extensions/dm-lens/dist/clients/package-root.js +25 -0
  591. package/extensions/dm-lens/dist/clients/partial-edit-apply.js +337 -0
  592. package/extensions/dm-lens/dist/clients/path-attribution-telemetry.js +31 -0
  593. package/extensions/dm-lens/dist/clients/path-keyed-map.js +57 -0
  594. package/extensions/dm-lens/dist/clients/path-utils.js +476 -0
  595. package/extensions/dm-lens/dist/clients/performance-report.js +291 -0
  596. package/extensions/dm-lens/dist/clients/persist-debounce.js +37 -0
  597. package/extensions/dm-lens/dist/clients/persistent-reverify.js +165 -0
  598. package/extensions/dm-lens/dist/clients/php-cs-fixer-config.js +15 -0
  599. package/extensions/dm-lens/dist/clients/pipeline.js +1091 -0
  600. package/extensions/dm-lens/dist/clients/post-autofix-notice.js +19 -0
  601. package/extensions/dm-lens/dist/clients/print-mode.js +3 -0
  602. package/extensions/dm-lens/dist/clients/probe-home-state.js +62 -0
  603. package/extensions/dm-lens/dist/clients/process-bridge.js +20 -0
  604. package/extensions/dm-lens/dist/clients/process-singletons.js +69 -0
  605. package/extensions/dm-lens/dist/clients/process-snapshot.js +22 -0
  606. package/extensions/dm-lens/dist/clients/project-changes.js +112 -0
  607. package/extensions/dm-lens/dist/clients/project-conventions.js +152 -0
  608. package/extensions/dm-lens/dist/clients/project-diagnostics/cache.js +91 -0
  609. package/extensions/dm-lens/dist/clients/project-diagnostics/extractors.js +53 -0
  610. package/extensions/dm-lens/dist/clients/project-diagnostics/fresh-fetch.js +408 -0
  611. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +64 -0
  612. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/dead-code.js +38 -0
  613. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +21 -0
  614. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +23 -0
  615. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/jscpd.js +28 -0
  616. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/knip.js +45 -0
  617. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/madge.js +34 -0
  618. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/opengrep.js +32 -0
  619. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +79 -0
  620. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +41 -0
  621. package/extensions/dm-lens/dist/clients/project-diagnostics/scanner.js +349 -0
  622. package/extensions/dm-lens/dist/clients/project-diagnostics/types.js +1 -0
  623. package/extensions/dm-lens/dist/clients/project-lens-config.js +437 -0
  624. package/extensions/dm-lens/dist/clients/project-report.js +527 -0
  625. package/extensions/dm-lens/dist/clients/project-scale.js +60 -0
  626. package/extensions/dm-lens/dist/clients/project-scan-policy.js +4 -0
  627. package/extensions/dm-lens/dist/clients/project-snapshot-fingerprint.js +39 -0
  628. package/extensions/dm-lens/dist/clients/project-snapshot-persist-worker.js +14 -0
  629. package/extensions/dm-lens/dist/clients/project-snapshot.js +1178 -0
  630. package/extensions/dm-lens/dist/clients/project-trust.js +104 -0
  631. package/extensions/dm-lens/dist/clients/python-environment.js +120 -0
  632. package/extensions/dm-lens/dist/clients/python-provenance.js +551 -0
  633. package/extensions/dm-lens/dist/clients/quiet-window-config.js +16 -0
  634. package/extensions/dm-lens/dist/clients/quiet-window.js +126 -0
  635. package/extensions/dm-lens/dist/clients/read-bridge.js +46 -0
  636. package/extensions/dm-lens/dist/clients/read-expansion.js +218 -0
  637. package/extensions/dm-lens/dist/clients/read-guard-logger.js +178 -0
  638. package/extensions/dm-lens/dist/clients/read-guard-tool-lines.js +1042 -0
  639. package/extensions/dm-lens/dist/clients/read-guard.js +1096 -0
  640. package/extensions/dm-lens/dist/clients/recent-touches.js +126 -0
  641. package/extensions/dm-lens/dist/clients/redact/secrets.js +386 -0
  642. package/extensions/dm-lens/dist/clients/resource-sampler.js +344 -0
  643. package/extensions/dm-lens/dist/clients/reverse-deps.js +227 -0
  644. package/extensions/dm-lens/dist/clients/review-graph/builder.js +3635 -0
  645. package/extensions/dm-lens/dist/clients/review-graph/format.js +30 -0
  646. package/extensions/dm-lens/dist/clients/review-graph/git-identity.js +115 -0
  647. package/extensions/dm-lens/dist/clients/review-graph/import-resolvers.js +325 -0
  648. package/extensions/dm-lens/dist/clients/review-graph/persist-worker.js +8 -0
  649. package/extensions/dm-lens/dist/clients/review-graph/query.js +195 -0
  650. package/extensions/dm-lens/dist/clients/review-graph/revision-drift.js +3 -0
  651. package/extensions/dm-lens/dist/clients/review-graph/service.js +60 -0
  652. package/extensions/dm-lens/dist/clients/review-graph/shared-extraction-ir.js +54 -0
  653. package/extensions/dm-lens/dist/clients/review-graph/symbol-id.js +29 -0
  654. package/extensions/dm-lens/dist/clients/review-graph/tsconfig-paths.js +253 -0
  655. package/extensions/dm-lens/dist/clients/review-graph/types.js +1 -0
  656. package/extensions/dm-lens/dist/clients/review-graph/workspace-modules.js +374 -0
  657. package/extensions/dm-lens/dist/clients/review-graph-logger.js +51 -0
  658. package/extensions/dm-lens/dist/clients/ruff-client.js +109 -0
  659. package/extensions/dm-lens/dist/clients/rules-scanner.js +113 -0
  660. package/extensions/dm-lens/dist/clients/run-duration.js +9 -0
  661. package/extensions/dm-lens/dist/clients/runtime-agent-end.js +608 -0
  662. package/extensions/dm-lens/dist/clients/runtime-config.js +39 -0
  663. package/extensions/dm-lens/dist/clients/runtime-context.js +155 -0
  664. package/extensions/dm-lens/dist/clients/runtime-coordinator.js +817 -0
  665. package/extensions/dm-lens/dist/clients/runtime-session.js +1625 -0
  666. package/extensions/dm-lens/dist/clients/runtime-tool-call.js +868 -0
  667. package/extensions/dm-lens/dist/clients/runtime-tool-result.js +1317 -0
  668. package/extensions/dm-lens/dist/clients/runtime-turn.js +2333 -0
  669. package/extensions/dm-lens/dist/clients/rust-client.js +48 -0
  670. package/extensions/dm-lens/dist/clients/safe-spawn.js +1267 -0
  671. package/extensions/dm-lens/dist/clients/sanitize.js +174 -0
  672. package/extensions/dm-lens/dist/clients/scan-utils.js +7 -0
  673. package/extensions/dm-lens/dist/clients/scratch-tree-policy.js +57 -0
  674. package/extensions/dm-lens/dist/clients/search-read-registration.js +59 -0
  675. package/extensions/dm-lens/dist/clients/secret-findings.js +69 -0
  676. package/extensions/dm-lens/dist/clients/security-scan-client.js +208 -0
  677. package/extensions/dm-lens/dist/clients/session-event-guard.js +111 -0
  678. package/extensions/dm-lens/dist/clients/session-lifecycle.js +173 -0
  679. package/extensions/dm-lens/dist/clients/session-start-observability.js +47 -0
  680. package/extensions/dm-lens/dist/clients/session-state-store.js +63 -0
  681. package/extensions/dm-lens/dist/clients/session-summary.js +8 -0
  682. package/extensions/dm-lens/dist/clients/sessionstart-logger.js +22 -0
  683. package/extensions/dm-lens/dist/clients/sg-runner.js +627 -0
  684. package/extensions/dm-lens/dist/clients/sgconfig.js +280 -0
  685. package/extensions/dm-lens/dist/clients/shared-checkout-guard.js +177 -0
  686. package/extensions/dm-lens/dist/clients/single-flight.js +52 -0
  687. package/extensions/dm-lens/dist/clients/situational-tool-telemetry.js +85 -0
  688. package/extensions/dm-lens/dist/clients/skills-resolver.js +38 -0
  689. package/extensions/dm-lens/dist/clients/slow-fs.js +77 -0
  690. package/extensions/dm-lens/dist/clients/smells-rollup.js +118 -0
  691. package/extensions/dm-lens/dist/clients/source-filter.js +320 -0
  692. package/extensions/dm-lens/dist/clients/source-walker.js +96 -0
  693. package/extensions/dm-lens/dist/clients/spawn-output-cap.js +35 -0
  694. package/extensions/dm-lens/dist/clients/spawn-timeout-cooldown.js +51 -0
  695. package/extensions/dm-lens/dist/clients/stale-marker.js +1 -0
  696. package/extensions/dm-lens/dist/clients/startup-scan.js +222 -0
  697. package/extensions/dm-lens/dist/clients/startup-timing.js +67 -0
  698. package/extensions/dm-lens/dist/clients/string-utils.js +6 -0
  699. package/extensions/dm-lens/dist/clients/subagent-mode.js +40 -0
  700. package/extensions/dm-lens/dist/clients/symbol-containment.js +16 -0
  701. package/extensions/dm-lens/dist/clients/symbol-types.js +1 -0
  702. package/extensions/dm-lens/dist/clients/test-runner-client.js +1504 -0
  703. package/extensions/dm-lens/dist/clients/test-runner-delivery.js +260 -0
  704. package/extensions/dm-lens/dist/clients/todo-scanner.js +164 -0
  705. package/extensions/dm-lens/dist/clients/tool-agreement.js +377 -0
  706. package/extensions/dm-lens/dist/clients/tool-config.js +218 -0
  707. package/extensions/dm-lens/dist/clients/tool-cwd.js +235 -0
  708. package/extensions/dm-lens/dist/clients/tool-definition.js +22 -0
  709. package/extensions/dm-lens/dist/clients/tool-event.js +18 -0
  710. package/extensions/dm-lens/dist/clients/tool-policy.js +2393 -0
  711. package/extensions/dm-lens/dist/clients/tool-probe.js +5 -0
  712. package/extensions/dm-lens/dist/clients/tool-render.js +79 -0
  713. package/extensions/dm-lens/dist/clients/tool-set-policy.js +70 -0
  714. package/extensions/dm-lens/dist/clients/tree-sitter-cache.js +206 -0
  715. package/extensions/dm-lens/dist/clients/tree-sitter-client.js +2787 -0
  716. package/extensions/dm-lens/dist/clients/tree-sitter-logger.js +77 -0
  717. package/extensions/dm-lens/dist/clients/tree-sitter-navigator.js +198 -0
  718. package/extensions/dm-lens/dist/clients/tree-sitter-query-loader.js +318 -0
  719. package/extensions/dm-lens/dist/clients/tree-sitter-shared.js +87 -0
  720. package/extensions/dm-lens/dist/clients/tree-sitter-symbol-extractor.js +957 -0
  721. package/extensions/dm-lens/dist/clients/trivy-client.js +305 -0
  722. package/extensions/dm-lens/dist/clients/tui-fit.js +26 -0
  723. package/extensions/dm-lens/dist/clients/turn-context.js +48 -0
  724. package/extensions/dm-lens/dist/clients/turn-end/lane.js +1 -0
  725. package/extensions/dm-lens/dist/clients/turn-end/lanes/govulncheck.js +54 -0
  726. package/extensions/dm-lens/dist/clients/turn-end/lanes/secrets.js +131 -0
  727. package/extensions/dm-lens/dist/clients/turn-summary-render.js +56 -0
  728. package/extensions/dm-lens/dist/clients/turn-summary.js +84 -0
  729. package/extensions/dm-lens/dist/clients/typos-config.js +9 -0
  730. package/extensions/dm-lens/dist/clients/user-notify.js +15 -0
  731. package/extensions/dm-lens/dist/clients/vanished-instance-marker.js +18 -0
  732. package/extensions/dm-lens/dist/clients/warm-attach.js +210 -0
  733. package/extensions/dm-lens/dist/clients/widget-state.js +963 -0
  734. package/extensions/dm-lens/dist/clients/word-index-logger.js +21 -0
  735. package/extensions/dm-lens/dist/clients/word-index-store.js +222 -0
  736. package/extensions/dm-lens/dist/clients/word-index.js +1426 -0
  737. package/extensions/dm-lens/dist/clients/workspace-topology.js +261 -0
  738. package/extensions/dm-lens/dist/clients/write-ordering-guard.js +24 -0
  739. package/extensions/dm-lens/dist/clients/zizmor-config.js +160 -0
  740. package/extensions/dm-lens/dist/i18n.js +67 -0
  741. package/extensions/dm-lens/dist/index.js +1782 -0
  742. package/extensions/dm-lens/dist/mcp/analyze-cli.js +178 -0
  743. package/extensions/dm-lens/dist/mcp/build-staleness.js +55 -0
  744. package/extensions/dm-lens/dist/mcp/cli.js +78 -0
  745. package/extensions/dm-lens/dist/mcp/server.js +1208 -0
  746. package/extensions/dm-lens/dist/mcp/worker.js +33 -0
  747. package/extensions/dm-lens/dist/scripts/lib/process-scan.mjs +256 -0
  748. package/extensions/dm-lens/dist/scripts/lib/skills-predicate.mjs +53 -0
  749. package/extensions/dm-lens/dist/scripts/lib/web-tree-sitter-dir.mjs +45 -0
  750. package/extensions/dm-lens/dist/tools/activate-tools.js +61 -0
  751. package/extensions/dm-lens/dist/tools/ast-grep-outline.js +127 -0
  752. package/extensions/dm-lens/dist/tools/ast-grep-replace.js +226 -0
  753. package/extensions/dm-lens/dist/tools/ast-grep-search.js +687 -0
  754. package/extensions/dm-lens/dist/tools/effective-config.js +59 -0
  755. package/extensions/dm-lens/dist/tools/lens-diagnostic-mark.js +240 -0
  756. package/extensions/dm-lens/dist/tools/lens-diagnostics.js +1484 -0
  757. package/extensions/dm-lens/dist/tools/lsp-diagnostics.js +1088 -0
  758. package/extensions/dm-lens/dist/tools/lsp-navigation.js +1194 -0
  759. package/extensions/dm-lens/dist/tools/lsp-structured-output.js +277 -0
  760. package/extensions/dm-lens/dist/tools/module-report.js +332 -0
  761. package/extensions/dm-lens/dist/tools/project-report.js +72 -0
  762. package/extensions/dm-lens/dist/tools/render-compact.js +272 -0
  763. package/extensions/dm-lens/dist/tools/scan-progress.js +31 -0
  764. package/extensions/dm-lens/dist/tools/shared.js +26 -0
  765. package/extensions/dm-lens/dist/tools/symbol-search.js +133 -0
  766. package/extensions/dm-lens/index.js +278 -101
  767. package/extensions/dm-lens/mcp/analyze-cli.js +3 -2
  768. package/extensions/dm-lens/mcp/build-staleness.js +1 -1
  769. package/extensions/dm-lens/mcp/server.js +144 -73
  770. package/extensions/dm-lens/package.json +4 -4
  771. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-assert-tuple-test.yml +13 -0
  772. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-boolean-in-except-test.yml +26 -0
  773. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-http-headers-bracket-access-test.yml +10 -0
  774. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/unchecked-numeric-parse-python-test.yml +18 -0
  775. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/unchecked-throwing-call-python-test.yml +4 -3
  776. package/extensions/dm-lens/rules/ast-grep-rules/rules/go-no-fmt-println.yml +2 -2
  777. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-assert-tuple.yml +23 -13
  778. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-boolean-in-except.yml +7 -3
  779. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-console-except-error-js.yml +2 -2
  780. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-console-except-error.yml +2 -2
  781. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-http-headers-bracket-access.yml +12 -7
  782. package/extensions/dm-lens/rules/ast-grep-rules/rules/unchecked-numeric-parse-python.yml +44 -0
  783. package/extensions/dm-lens/rules/ast-grep-rules/rules/unchecked-throwing-call-python.yml +5 -3
  784. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-cross-language-method.yml +3 -3
  785. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-hallucinated-import.yml +2 -2
  786. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-sql-injection.yml +12 -2
  787. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/console-statement.yml +2 -2
  788. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/sql-injection.yml +23 -7
  789. package/extensions/dm-lens/rules/typos/_typos.toml +4 -2
  790. package/extensions/dm-lens/scripts/lib/process-scan.mjs +1 -1
  791. package/extensions/dm-lens/scripts/lib/skills-predicate.mjs +53 -0
  792. package/extensions/dm-lens/scripts/lib/web-tree-sitter-dir.mjs +45 -0
  793. package/extensions/dm-lens/skills/pi-lens-ast-grep/SKILL.md +23 -6
  794. package/extensions/dm-lens/skills/pi-lens-lsp-navigation/SKILL.md +26 -9
  795. package/extensions/dm-lens/tools/activate-tools.js +10 -7
  796. package/extensions/dm-lens/tools/ast-grep-outline.js +2 -6
  797. package/extensions/dm-lens/tools/ast-grep-replace.js +5 -16
  798. package/extensions/dm-lens/tools/ast-grep-search.js +83 -38
  799. package/extensions/dm-lens/tools/effective-config.js +5 -4
  800. package/extensions/dm-lens/tools/lens-diagnostic-mark.js +5 -3
  801. package/extensions/dm-lens/tools/lens-diagnostics.js +478 -106
  802. package/extensions/dm-lens/tools/lsp-diagnostics.js +317 -172
  803. package/extensions/dm-lens/tools/lsp-navigation.js +26 -56
  804. package/extensions/dm-lens/tools/lsp-structured-output.js +3 -3
  805. package/extensions/dm-lens/tools/module-report.js +5 -5
  806. package/extensions/dm-lens/tools/project-report.js +9 -15
  807. package/extensions/dm-lens/tools/render-compact.js +220 -1
  808. package/extensions/dm-lens/tools/symbol-search.js +3 -5
  809. package/extensions/dm-mcp-adapter/OAUTH.md +368 -2
  810. package/extensions/dm-mcp-adapter/THIRD_PARTY_NOTICES.md +1 -1
  811. package/extensions/dm-mcp-adapter/agent-plugin-loader.js +73 -30
  812. package/extensions/dm-mcp-adapter/agent-plugin-provenance.js +26 -0
  813. package/extensions/dm-mcp-adapter/bearer-command-resolver.js +182 -0
  814. package/extensions/dm-mcp-adapter/claude-plugin-loader.js +350 -0
  815. package/extensions/dm-mcp-adapter/cli.js +82 -5
  816. package/extensions/dm-mcp-adapter/commands.js +89 -15
  817. package/extensions/dm-mcp-adapter/config.js +283 -33
  818. package/extensions/dm-mcp-adapter/consent-manager.js +32 -8
  819. package/extensions/dm-mcp-adapter/direct-tool-surface.js +223 -0
  820. package/extensions/dm-mcp-adapter/direct-tools.js +21 -216
  821. package/extensions/dm-mcp-adapter/dist/abort.js +35 -0
  822. package/extensions/dm-mcp-adapter/dist/agent-plugin-loader.js +73 -30
  823. package/extensions/dm-mcp-adapter/dist/agent-plugin-provenance.js +26 -0
  824. package/extensions/dm-mcp-adapter/dist/bearer-command-resolver.js +182 -0
  825. package/extensions/dm-mcp-adapter/dist/claude-plugin-loader.js +350 -0
  826. package/extensions/dm-mcp-adapter/dist/config.js +283 -33
  827. package/extensions/dm-mcp-adapter/dist/consent-manager.js +84 -0
  828. package/extensions/dm-mcp-adapter/dist/elicitation-handler.js +308 -0
  829. package/extensions/dm-mcp-adapter/dist/errors.js +225 -0
  830. package/extensions/dm-mcp-adapter/dist/http-ca.js +71 -0
  831. package/extensions/dm-mcp-adapter/dist/jev-client.js +359 -0
  832. package/extensions/dm-mcp-adapter/dist/jev-contracts.js +1 -0
  833. package/extensions/dm-mcp-adapter/dist/jev-key-store.js +176 -0
  834. package/extensions/dm-mcp-adapter/dist/json-schema-validator.js +70 -0
  835. package/extensions/dm-mcp-adapter/dist/lifecycle.js +387 -0
  836. package/extensions/dm-mcp-adapter/dist/logger.js +115 -0
  837. package/extensions/dm-mcp-adapter/dist/mcp-auth-fetch.js +86 -0
  838. package/extensions/dm-mcp-adapter/dist/mcp-auth-flow.js +949 -0
  839. package/extensions/dm-mcp-adapter/dist/mcp-auth.js +997 -0
  840. package/extensions/dm-mcp-adapter/dist/mcp-bearer-store.js +7 -136
  841. package/extensions/dm-mcp-adapter/dist/mcp-callback-server.js +381 -0
  842. package/extensions/dm-mcp-adapter/dist/mcp-oauth-provider.js +524 -0
  843. package/extensions/dm-mcp-adapter/dist/mcp-probe.js +151 -0
  844. package/extensions/dm-mcp-adapter/dist/mcp-tasks.js +300 -0
  845. package/extensions/dm-mcp-adapter/dist/mcp-trace.js +215 -0
  846. package/extensions/dm-mcp-adapter/dist/metadata-cache.js +10 -28
  847. package/extensions/dm-mcp-adapter/dist/npx-resolver.js +465 -0
  848. package/extensions/dm-mcp-adapter/dist/package-mcp-loader.js +5 -16
  849. package/extensions/dm-mcp-adapter/dist/request-headers-command.js +294 -0
  850. package/extensions/dm-mcp-adapter/dist/runtime-owner.js +94 -0
  851. package/extensions/dm-mcp-adapter/dist/sampling-handler.js +213 -0
  852. package/extensions/dm-mcp-adapter/dist/secure-keyring.js +191 -0
  853. package/extensions/dm-mcp-adapter/dist/server-manager.js +1514 -0
  854. package/extensions/dm-mcp-adapter/dist/session-approvals.js +127 -0
  855. package/extensions/dm-mcp-adapter/dist/session-recovery.js +82 -0
  856. package/extensions/dm-mcp-adapter/dist/state.js +1 -0
  857. package/extensions/dm-mcp-adapter/dist/types.js +39 -0
  858. package/extensions/dm-mcp-adapter/dist/ui-resource-handler.js +204 -0
  859. package/extensions/dm-mcp-adapter/dist/unix-socket-transport.js +83 -0
  860. package/extensions/dm-mcp-adapter/dist/utils.js +84 -9
  861. package/extensions/dm-mcp-adapter/elicitation-handler.js +27 -22
  862. package/extensions/dm-mcp-adapter/host-html-template.js +17 -18
  863. package/extensions/dm-mcp-adapter/http-ca.js +71 -0
  864. package/extensions/dm-mcp-adapter/index.js +904 -167
  865. package/extensions/dm-mcp-adapter/init.js +53 -42
  866. package/extensions/dm-mcp-adapter/jev-client.js +359 -0
  867. package/extensions/dm-mcp-adapter/jev-contracts.js +0 -0
  868. package/extensions/dm-mcp-adapter/jev-key-store.js +176 -0
  869. package/extensions/dm-mcp-adapter/json-schema-validator.js +19 -2
  870. package/extensions/dm-mcp-adapter/lazy-loader.js +7 -0
  871. package/extensions/dm-mcp-adapter/lifecycle.js +8 -3
  872. package/extensions/dm-mcp-adapter/mcp-auth-fetch.js +86 -0
  873. package/extensions/dm-mcp-adapter/mcp-auth-flow.js +228 -75
  874. package/extensions/dm-mcp-adapter/mcp-auth.js +312 -47
  875. package/extensions/dm-mcp-adapter/mcp-bearer-store.js +7 -136
  876. package/extensions/dm-mcp-adapter/mcp-code.js +151 -20
  877. package/extensions/dm-mcp-adapter/mcp-install.js +40 -0
  878. package/extensions/dm-mcp-adapter/mcp-oauth-provider.js +52 -8
  879. package/extensions/dm-mcp-adapter/mcp-output-guard.js +42 -43
  880. package/extensions/dm-mcp-adapter/mcp-panel-theme.js +79 -0
  881. package/extensions/dm-mcp-adapter/mcp-panel.js +294 -286
  882. package/extensions/dm-mcp-adapter/mcp-references.js +13 -18
  883. package/extensions/dm-mcp-adapter/mcp-script-worker.mjs +5 -1
  884. package/extensions/dm-mcp-adapter/mcp-setup-panel.js +317 -282
  885. package/extensions/dm-mcp-adapter/mcp-status.js +2 -0
  886. package/extensions/dm-mcp-adapter/mcp-tasks.js +309 -0
  887. package/extensions/dm-mcp-adapter/metadata-cache.js +11 -28
  888. package/extensions/dm-mcp-adapter/namespace-tools.js +43 -7
  889. package/extensions/dm-mcp-adapter/oauth.js +1 -1
  890. package/extensions/dm-mcp-adapter/package-mcp-loader.js +5 -16
  891. package/extensions/dm-mcp-adapter/package.json +4 -1
  892. package/extensions/dm-mcp-adapter/prompts.js +31 -4
  893. package/extensions/dm-mcp-adapter/proxy-modes.js +394 -199
  894. package/extensions/dm-mcp-adapter/request-headers-command.js +3 -2
  895. package/extensions/dm-mcp-adapter/runtime-owner.js +16 -1
  896. package/extensions/dm-mcp-adapter/sampling-handler.js +16 -25
  897. package/extensions/dm-mcp-adapter/sandbox-proxy-template.js +14 -90
  898. package/extensions/dm-mcp-adapter/search-ranking.js +31 -6
  899. package/extensions/dm-mcp-adapter/secure-keyring.js +191 -0
  900. package/extensions/dm-mcp-adapter/semantic-search.js +160 -0
  901. package/extensions/dm-mcp-adapter/server-manager.js +406 -117
  902. package/extensions/dm-mcp-adapter/session-approvals.js +127 -0
  903. package/extensions/dm-mcp-adapter/skills/mcp-scripting/SKILL.md +11 -1
  904. package/extensions/dm-mcp-adapter/test-runner.mjs +3 -4
  905. package/extensions/dm-mcp-adapter/tool-approval.js +32 -22
  906. package/extensions/dm-mcp-adapter/tool-metadata.js +18 -11
  907. package/extensions/dm-mcp-adapter/tool-registrar.js +7 -4
  908. package/extensions/dm-mcp-adapter/tool-result-renderer.js +4 -2
  909. package/extensions/dm-mcp-adapter/types.js +39 -0
  910. package/extensions/dm-mcp-adapter/ui-server.js +51 -36
  911. package/extensions/dm-mcp-adapter/ui-session.js +57 -25
  912. package/extensions/dm-mcp-adapter/utils.js +84 -9
  913. package/extensions/dm-ponytail/hooks/cursor-hooks.json +17 -0
  914. package/extensions/dm-ponytail/hooks/ponytail-activate.js +14 -2
  915. package/extensions/dm-ponytail/hooks/ponytail-mode-tracker.js +21 -2
  916. package/extensions/dm-ponytail/hooks/ponytail-runtime.js +23 -0
  917. package/extensions/dm-ponytail/package.json +1 -1
  918. package/extensions/dm-subagents/agents/claude-code-writer.md +1 -0
  919. package/extensions/dm-subagents/agents/codex-exec-writer.md +1 -0
  920. package/extensions/dm-subagents/agents/cursor-agent-writer.md +1 -0
  921. package/extensions/dm-subagents/agents/evidence-auditor.md +34 -0
  922. package/extensions/dm-subagents/agents/researcher.md +23 -13
  923. package/extensions/dm-subagents/agents/reviewer.md +6 -4
  924. package/extensions/dm-subagents/agents/scout.md +1 -1
  925. package/extensions/dm-subagents/agents/worker.md +3 -2
  926. package/extensions/dm-subagents/index.js +3 -2
  927. package/extensions/dm-subagents/inspector-runner.mjs +2 -2
  928. package/extensions/dm-subagents/install.mjs +1 -2
  929. package/extensions/dm-subagents/package.json +35 -1
  930. package/extensions/dm-subagents/prompts/council.md +6 -3
  931. package/extensions/dm-subagents/prompts/parallel-review.md +1 -1
  932. package/extensions/dm-subagents/runner-peer-loader.mjs +18 -0
  933. package/extensions/dm-subagents/runner-peer-preload.mjs +29 -0
  934. package/extensions/dm-subagents/skills/dm-subagents/SKILL.md +35 -22
  935. package/extensions/dm-subagents/skills/dm-subagents/references/constraints-and-recipes.md +9 -5
  936. package/extensions/dm-subagents/skills/dm-subagents/references/execution-controls.md +40 -19
  937. package/extensions/dm-subagents/skills/dm-subagents/references/management-authoring-rpc.md +6 -6
  938. package/extensions/dm-subagents/skills/dm-subagents/references/multi-lane-orchestration.md +11 -1
  939. package/extensions/dm-subagents/skills/dm-subagents/references/prompting-and-roles.md +35 -30
  940. package/extensions/dm-subagents/skills/dm-subagents/references/review-and-validation.md +3 -3
  941. package/extensions/dm-subagents/src/agents/advertised-agent-prompt.js +70 -0
  942. package/extensions/dm-subagents/src/agents/agent-management.js +276 -172
  943. package/extensions/dm-subagents/src/agents/agent-memory.js +92 -3
  944. package/extensions/dm-subagents/src/agents/agent-serializer.js +17 -8
  945. package/extensions/dm-subagents/src/agents/agents.js +389 -207
  946. package/extensions/dm-subagents/src/agents/builtin-names.js +1 -0
  947. package/extensions/dm-subagents/src/agents/chain-serializer.js +7 -0
  948. package/extensions/dm-subagents/src/agents/global-npm-root.js +47 -0
  949. package/extensions/dm-subagents/src/agents/proactive-skills.js +1 -1
  950. package/extensions/dm-subagents/src/agents/runtime-agent-registry.js +17 -13
  951. package/extensions/dm-subagents/src/agents/skills.js +36 -10
  952. package/extensions/dm-subagents/src/api/capability-ceiling.js +0 -1
  953. package/extensions/dm-subagents/src/api/child-tool-plan.js +3 -0
  954. package/extensions/dm-subagents/src/api/preflight.js +75 -64
  955. package/extensions/dm-subagents/src/api/required-child-extensions.js +3 -0
  956. package/extensions/dm-subagents/src/api/workflow-resources.js +1 -0
  957. package/extensions/dm-subagents/src/extension/config.js +27 -18
  958. package/extensions/dm-subagents/src/extension/doctor.js +10 -13
  959. package/extensions/dm-subagents/src/extension/fanout-child.js +91 -14
  960. package/extensions/dm-subagents/src/extension/herdr-dm-bridge.js +258 -0
  961. package/extensions/dm-subagents/src/extension/index.js +202 -66
  962. package/extensions/dm-subagents/src/extension/public-execution.js +55 -4
  963. package/extensions/dm-subagents/src/extension/rpc.js +18 -27
  964. package/extensions/dm-subagents/src/extension/schemas.js +99 -84
  965. package/extensions/dm-subagents/src/extension/subagent-guide.js +14 -3
  966. package/extensions/dm-subagents/src/extension/tool-activation.js +157 -0
  967. package/extensions/dm-subagents/src/extension/tool-description.js +30 -78
  968. package/extensions/dm-subagents/src/inspectors/actions.js +145 -0
  969. package/extensions/dm-subagents/src/inspectors/ghostty/actions.js +60 -0
  970. package/extensions/dm-subagents/src/inspectors/ghostty/plugin.js +17 -0
  971. package/extensions/dm-subagents/src/inspectors/herdr/actions.js +94 -179
  972. package/extensions/dm-subagents/src/inspectors/herdr/plugin.js +13 -0
  973. package/extensions/dm-subagents/src/inspectors/herdr/project-panes.js +1 -1
  974. package/extensions/dm-subagents/src/inspectors/{herdr/inspector-runner.js → inspector-runner.js} +31 -25
  975. package/extensions/dm-subagents/src/inspectors/plugins.js +5 -0
  976. package/extensions/dm-subagents/src/inspectors/{herdr/session-roots-codec.js → session-roots-codec.js} +1 -6
  977. package/extensions/dm-subagents/src/inspectors/types.js +1 -0
  978. package/extensions/dm-subagents/src/integrations/dm-web-session-liveness.js +50 -0
  979. package/extensions/dm-subagents/src/intercom/intercom-bridge.js +39 -5
  980. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +256 -151
  981. package/extensions/dm-subagents/src/intercom/result-intercom.js +6 -0
  982. package/extensions/dm-subagents/src/intercom/supervisor-ui.js +199 -0
  983. package/extensions/dm-subagents/src/missions/workflow-state.js +30 -17
  984. package/extensions/dm-subagents/src/policy/authority.js +6 -2
  985. package/extensions/dm-subagents/src/profiles/profiles.js +10 -5
  986. package/extensions/dm-subagents/src/runs/background/active-async-capacity.js +28 -35
  987. package/extensions/dm-subagents/src/runs/background/active-run-index.js +17 -0
  988. package/extensions/dm-subagents/src/runs/background/async-execution.js +580 -389
  989. package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +71 -47
  990. package/extensions/dm-subagents/src/runs/background/async-resume.js +61 -26
  991. package/extensions/dm-subagents/src/runs/background/async-retention.js +8 -0
  992. package/extensions/dm-subagents/src/runs/background/async-status-snapshot.js +3 -4
  993. package/extensions/dm-subagents/src/runs/background/async-status.js +90 -13
  994. package/extensions/dm-subagents/src/runs/background/auto-drain.js +57 -33
  995. package/extensions/dm-subagents/src/runs/background/binary-bootstrap.js +54 -0
  996. package/extensions/dm-subagents/src/runs/background/chain-append.js +1 -1
  997. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +11 -27
  998. package/extensions/dm-subagents/src/runs/background/control-channel.js +105 -256
  999. package/extensions/dm-subagents/src/runs/background/fleet-view.js +67 -10
  1000. package/extensions/dm-subagents/src/runs/background/notify.js +252 -17
  1001. package/extensions/dm-subagents/src/runs/background/owned-process-tree.js +33 -2
  1002. package/extensions/dm-subagents/src/runs/background/process-terminal-candidate.js +88 -0
  1003. package/extensions/dm-subagents/src/runs/background/process-terminal.js +29 -87
  1004. package/extensions/dm-subagents/src/runs/background/result-files.js +8 -4
  1005. package/extensions/dm-subagents/src/runs/background/result-watcher.js +15 -3
  1006. package/extensions/dm-subagents/src/runs/background/retained-children.js +3 -2
  1007. package/extensions/dm-subagents/src/runs/background/retained-nested-route-tracker.js +86 -0
  1008. package/extensions/dm-subagents/src/runs/background/run-child-session.js +574 -0
  1009. package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +9 -5
  1010. package/extensions/dm-subagents/src/runs/background/run-status.js +114 -11
  1011. package/extensions/dm-subagents/src/runs/background/runner-aliases.js +129 -0
  1012. package/extensions/dm-subagents/src/runs/background/runner-child-launch.js +62 -0
  1013. package/extensions/dm-subagents/src/runs/background/runner-child-sessions.js +16 -0
  1014. package/extensions/dm-subagents/src/runs/background/runner-http-dispatcher.js +84 -0
  1015. package/extensions/dm-subagents/src/runs/background/runner-startup-failure.js +43 -0
  1016. package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +119 -20
  1017. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +33 -10
  1018. package/extensions/dm-subagents/src/runs/background/steering.js +24 -3
  1019. package/extensions/dm-subagents/src/runs/background/subagent-runner-bootstrap.js +238 -0
  1020. package/extensions/dm-subagents/src/runs/background/subagent-runner.js +1008 -1344
  1021. package/extensions/dm-subagents/src/runs/background/subagent-wait.js +156 -26
  1022. package/extensions/dm-subagents/src/runs/background/wait-completions.js +91 -23
  1023. package/extensions/dm-subagents/src/runs/background/wait-subscriptions.js +10 -3
  1024. package/extensions/dm-subagents/src/runs/background/wait-tool.js +8 -12
  1025. package/extensions/dm-subagents/src/runs/background/workflow-terminal-proof.js +60 -0
  1026. package/extensions/dm-subagents/src/runs/foreground/async-steering-action.js +29 -26
  1027. package/extensions/dm-subagents/src/runs/foreground/async-stop-action.js +94 -2
  1028. package/extensions/dm-subagents/src/runs/foreground/execution.js +446 -648
  1029. package/extensions/dm-subagents/src/runs/foreground/foreground-control.js +4 -0
  1030. package/extensions/dm-subagents/src/runs/foreground/foreground-history.js +5 -2
  1031. package/extensions/dm-subagents/src/runs/foreground/prompt-audit.js +8 -4
  1032. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +1337 -445
  1033. package/extensions/dm-subagents/src/runs/foreground/workflow-detach-reconcile.js +10 -5
  1034. package/extensions/dm-subagents/src/runs/foreground/workflow-foreground-steering.js +65 -90
  1035. package/extensions/dm-subagents/src/runs/shared/acceptance.js +265 -68
  1036. package/extensions/dm-subagents/src/runs/shared/agent-contract.js +1 -1
  1037. package/extensions/dm-subagents/src/runs/shared/async-status-projection.js +133 -76
  1038. package/extensions/dm-subagents/src/runs/shared/capability-ceiling.js +4 -2
  1039. package/extensions/dm-subagents/src/runs/shared/child-hooks.js +166 -0
  1040. package/extensions/dm-subagents/src/runs/shared/child-identity.js +10 -2
  1041. package/extensions/dm-subagents/src/runs/shared/child-launch-plan.js +19 -2
  1042. package/extensions/dm-subagents/src/runs/shared/child-launch.js +212 -0
  1043. package/extensions/dm-subagents/src/runs/shared/child-lifecycle.js +22 -0
  1044. package/extensions/dm-subagents/src/runs/shared/child-runtime-config.js +31 -0
  1045. package/extensions/dm-subagents/src/runs/shared/child-session.js +378 -0
  1046. package/extensions/dm-subagents/src/runs/shared/child-tool-plan.js +299 -0
  1047. package/extensions/dm-subagents/src/runs/shared/claude-code-adapter.js +1 -1
  1048. package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +148 -32
  1049. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +6 -4
  1050. package/extensions/dm-subagents/src/runs/shared/effective-system-prompt.js +19 -0
  1051. package/extensions/dm-subagents/src/runs/shared/external-cli-contract.js +6 -1
  1052. package/extensions/dm-subagents/src/runs/shared/external-cli-preflight.js +14 -2
  1053. package/extensions/dm-subagents/src/runs/shared/external-cli-runner.js +6 -7
  1054. package/extensions/dm-subagents/src/runs/shared/external-job-bridge.js +60 -0
  1055. package/extensions/dm-subagents/src/runs/shared/git-environment.js +25 -0
  1056. package/extensions/dm-subagents/src/runs/shared/herdr-connection.js +341 -0
  1057. package/extensions/dm-subagents/src/runs/shared/herdr-dm-protocol.js +60 -0
  1058. package/extensions/dm-subagents/src/runs/shared/herdr-external-adapters.js +555 -0
  1059. package/extensions/dm-subagents/src/runs/shared/herdr-machine.js +239 -0
  1060. package/extensions/dm-subagents/src/runs/shared/herdr-placed-run.js +987 -0
  1061. package/extensions/dm-subagents/src/runs/shared/host-step-status.js +2 -0
  1062. package/extensions/dm-subagents/src/runs/shared/lane-metadata.js +23 -3
  1063. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +4 -3
  1064. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-grant.js +15 -5
  1065. package/extensions/dm-subagents/src/runs/shared/model-resolution-diagnostic.js +43 -0
  1066. package/extensions/dm-subagents/src/runs/shared/{model-fallback.js → model-resolution.js} +44 -128
  1067. package/extensions/dm-subagents/src/runs/shared/nested-events.js +39 -49
  1068. package/extensions/dm-subagents/src/runs/shared/nested-path.js +0 -13
  1069. package/extensions/dm-subagents/src/runs/shared/orca-progress-tabs.js +22 -12
  1070. package/extensions/dm-subagents/src/runs/shared/parallel-handoff.js +78 -2
  1071. package/extensions/dm-subagents/src/runs/shared/permissions.js +1 -16
  1072. package/extensions/dm-subagents/src/runs/shared/process-signal.js +3 -0
  1073. package/extensions/dm-subagents/src/runs/shared/readonly-drain-observation.js +51 -0
  1074. package/extensions/dm-subagents/src/runs/shared/run-fanout-budget.js +0 -13
  1075. package/extensions/dm-subagents/src/runs/shared/runtime-acknowledged-extensions.js +0 -26
  1076. package/extensions/dm-subagents/src/runs/shared/single-output.js +20 -2
  1077. package/extensions/dm-subagents/src/runs/shared/structured-output.js +263 -10
  1078. package/extensions/dm-subagents/src/runs/shared/subagent-control.js +6 -14
  1079. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +117 -370
  1080. package/extensions/dm-subagents/src/runs/shared/tool-availability.js +12 -50
  1081. package/extensions/dm-subagents/src/runs/shared/tool-budget.js +10 -13
  1082. package/extensions/dm-subagents/src/runs/shared/tool-timeout.js +1 -1
  1083. package/extensions/dm-subagents/src/runs/shared/usage-reconciliation.js +69 -0
  1084. package/extensions/dm-subagents/src/runs/shared/workflow-async-child-guidance.js +11 -0
  1085. package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-plan.js +30 -10
  1086. package/extensions/dm-subagents/src/runs/shared/worktree-setup-command.js +195 -0
  1087. package/extensions/dm-subagents/src/runs/shared/worktree.js +814 -141
  1088. package/extensions/dm-subagents/src/shared/atomic-json.js +2 -1
  1089. package/extensions/dm-subagents/src/shared/child-cache-retention.js +19 -0
  1090. package/extensions/dm-subagents/src/shared/fork-context.js +40 -77
  1091. package/extensions/dm-subagents/src/shared/fork-session-cwd.js +24 -0
  1092. package/extensions/dm-subagents/src/shared/jsonl-writer.js +8 -0
  1093. package/extensions/dm-subagents/src/shared/launch-contract.js +37 -6
  1094. package/extensions/dm-subagents/src/shared/model-response-aliases.js +15 -0
  1095. package/extensions/dm-subagents/src/shared/opencode-session-headers.js +15 -0
  1096. package/extensions/dm-subagents/src/shared/pruned-fork.js +83 -76
  1097. package/extensions/dm-subagents/src/shared/required-child-extensions.js +72 -0
  1098. package/extensions/dm-subagents/src/shared/shortcuts.js +0 -2
  1099. package/extensions/dm-subagents/src/shared/thinking-ceiling.js +0 -6
  1100. package/extensions/dm-subagents/src/shared/types.js +16 -12
  1101. package/extensions/dm-subagents/src/shared/utils.js +22 -7
  1102. package/extensions/dm-subagents/src/shared/watch-strategy.js +2 -0
  1103. package/extensions/dm-subagents/src/shared/workflow-child-permit.js +70 -0
  1104. package/extensions/dm-subagents/src/slash/delegation-adapters.js +15 -1
  1105. package/extensions/dm-subagents/src/slash/delegation-request.js +13 -0
  1106. package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +28 -1
  1107. package/extensions/dm-subagents/src/slash/prompt-workflows.js +15 -2
  1108. package/extensions/dm-subagents/src/slash/slash-commands.js +12 -269
  1109. package/extensions/dm-subagents/src/slash/subagent-cost.js +255 -0
  1110. package/extensions/dm-subagents/src/slash/subagents-admin.js +49 -25
  1111. package/extensions/dm-subagents/src/tui/fleet-status.js +224 -23
  1112. package/extensions/dm-subagents/src/tui/fleet.js +38 -25
  1113. package/extensions/dm-subagents/src/tui/render.js +636 -63
  1114. package/extensions/dm-subagents/src/watchdog/child-status.js +42 -23
  1115. package/extensions/dm-subagents/src/watchdog/diff-tool.js +86 -0
  1116. package/extensions/dm-subagents/src/watchdog/emission-guard.js +4 -3
  1117. package/extensions/dm-subagents/src/watchdog/guidance.js +19 -0
  1118. package/extensions/dm-subagents/src/watchdog/lsp-diagnostics.js +1 -1
  1119. package/extensions/dm-subagents/src/watchdog/model-selection.js +18 -1
  1120. package/extensions/dm-subagents/src/watchdog/permission-arbiter.js +16 -10
  1121. package/extensions/dm-subagents/src/watchdog/register-child.js +39 -26
  1122. package/extensions/dm-subagents/src/watchdog/register-main.js +51 -43
  1123. package/extensions/dm-subagents/src/watchdog/render.js +5 -7
  1124. package/extensions/dm-subagents/src/watchdog/review.js +142 -67
  1125. package/extensions/dm-subagents/src/watchdog/rules.js +55 -0
  1126. package/extensions/dm-subagents/src/watchdog/runtime.js +167 -109
  1127. package/extensions/dm-subagents/src/watchdog/scope.js +1 -9
  1128. package/extensions/dm-subagents/src/watchdog/settings.js +55 -99
  1129. package/extensions/dm-subagents/src/watchdog/tool-actions.js +11 -12
  1130. package/extensions/dm-subagents/src/watchdog/turn-delta.js +30 -5
  1131. package/extensions/dm-subagents/src/watchdog/types.js +2 -4
  1132. package/extensions/dm-subagents/src/watchdog/warning-format.js +2 -3
  1133. package/extensions/dm-subagents/src/workflows/chat-progress.js +4 -4
  1134. package/extensions/dm-subagents/src/workflows/scripted-workflow.js +482 -36
  1135. package/extensions/dm-subagents/src/workflows/workflow-checklist.js +303 -0
  1136. package/extensions/dm-subagents/src/workflows/workflow-child-summary.js +57 -5
  1137. package/extensions/dm-subagents/src/workflows/workflow-preflight.js +27 -1
  1138. package/extensions/dm-subagents/src/workflows/workflow-receipt.js +51 -3
  1139. package/extensions/dm-subagents/src/workflows/workflow-resources.js +226 -0
  1140. package/extensions/dm-subagents/src/workflows/workflow-settlement.js +5 -0
  1141. package/extensions/dm-web-access/abortable.js +19 -0
  1142. package/extensions/dm-web-access/anysearch.js +4 -13
  1143. package/extensions/dm-web-access/baizhi.js +123 -0
  1144. package/extensions/dm-web-access/bocha.js +3 -24
  1145. package/extensions/dm-web-access/brave.js +3 -23
  1146. package/extensions/dm-web-access/brightdata.js +5 -30
  1147. package/extensions/dm-web-access/content-find.js +181 -47
  1148. package/extensions/dm-web-access/crawl4ai.js +166 -0
  1149. package/extensions/dm-web-access/credential-source.js +1 -0
  1150. package/extensions/dm-web-access/curator-page.js +27 -2
  1151. package/extensions/dm-web-access/curator-run.js +36 -0
  1152. package/extensions/dm-web-access/curator-server.js +11 -2
  1153. package/extensions/dm-web-access/domain-filter-normalization.js +17 -0
  1154. package/extensions/dm-web-access/duckduckgo.js +4 -24
  1155. package/extensions/dm-web-access/extract.js +54 -12
  1156. package/extensions/dm-web-access/fetch-params.js +1 -1
  1157. package/extensions/dm-web-access/firecrawl.js +7 -45
  1158. package/extensions/dm-web-access/gemini-search.js +101 -46
  1159. package/extensions/dm-web-access/github-extract.js +2 -11
  1160. package/extensions/dm-web-access/index.js +382 -247
  1161. package/extensions/dm-web-access/jina-search.js +4 -13
  1162. package/extensions/dm-web-access/kagi.js +4 -13
  1163. package/extensions/dm-web-access/kimi-search.js +5 -30
  1164. package/extensions/dm-web-access/mistral-search.js +251 -0
  1165. package/extensions/dm-web-access/ollama.js +2 -7
  1166. package/extensions/dm-web-access/openai-search.js +204 -46
  1167. package/extensions/dm-web-access/opencode-session-headers.js +15 -0
  1168. package/extensions/dm-web-access/package.json +1 -1
  1169. package/extensions/dm-web-access/page-query.js +14 -4
  1170. package/extensions/dm-web-access/parallel.js +1 -17
  1171. package/extensions/dm-web-access/pdf-extract.js +1 -0
  1172. package/extensions/dm-web-access/perplexity.js +10 -1
  1173. package/extensions/dm-web-access/querit.js +5 -34
  1174. package/extensions/dm-web-access/query-rewrite.js +6 -2
  1175. package/extensions/dm-web-access/search-answer-formatting.js +6 -0
  1176. package/extensions/dm-web-access/search-result-count-normalization.js +5 -0
  1177. package/extensions/dm-web-access/search1api.js +5 -34
  1178. package/extensions/dm-web-access/searchinfinity.js +5 -34
  1179. package/extensions/dm-web-access/searxng.js +3 -23
  1180. package/extensions/dm-web-access/serpapi.js +183 -0
  1181. package/extensions/dm-web-access/serpbase.js +3 -24
  1182. package/extensions/dm-web-access/serpdive.js +3 -23
  1183. package/extensions/dm-web-access/serper.js +5 -30
  1184. package/extensions/dm-web-access/serply.js +184 -0
  1185. package/extensions/dm-web-access/source-check.js +10 -46
  1186. package/extensions/dm-web-access/ssrf-protection.js +3 -1
  1187. package/extensions/dm-web-access/storage.js +9 -0
  1188. package/extensions/dm-web-access/summary-review.js +36 -25
  1189. package/extensions/dm-web-access/tavily.js +3 -23
  1190. package/extensions/dm-web-access/tinyfish.js +5 -34
  1191. package/extensions/dm-web-access/tool-activation.js +112 -0
  1192. package/extensions/dm-web-access/utils.js +27 -10
  1193. package/extensions/dm-web-access/valyu.js +5 -30
  1194. package/extensions/dm-web-access/xai-search.js +78 -42
  1195. package/extensions/dm-web-access/xcrawl.js +5 -30
  1196. package/package.json +7 -4
  1197. package/extensions/dm-lens/tools/ast-dump.js +0 -101
  1198. package/extensions/dm-subagents/src/api/dm-args.js +0 -3
  1199. package/extensions/dm-subagents/src/runs/shared/child-protocol.js +0 -447
  1200. package/extensions/dm-subagents/src/runs/shared/completion-evidence.js +0 -40
  1201. package/extensions/dm-subagents/src/runs/shared/completion-guard.js +0 -173
  1202. package/extensions/dm-subagents/src/runs/shared/dm-args.js +0 -581
  1203. package/extensions/dm-subagents/src/runs/shared/llm-intent-arbiter.js +0 -190
  1204. package/extensions/dm-subagents/src/runs/shared/model-exclusions.js +0 -207
  1205. package/extensions/dm-subagents/src/runs/shared/subagent-startup-retry.js +0 -50
  1206. package/extensions/dm-subagents/src/runs/shared/task-intent.js +0 -130
  1207. package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.js +0 -68
  1208. /package/extensions/dm-subagents/src/inspectors/{herdr/shell-command.js → shell-command.js} +0 -0
@@ -16,9 +16,14 @@ import {
16
16
  const _installerRequire = createRequire(import.meta.url);
17
17
  import { createGunzip } from "node:zlib";
18
18
  import { TRANSIENT_MAX_COOLDOWN_MS } from "../dispatch/runners/utils/availability-policy.js";
19
- import { recordDegradationOnce } from "../degradation-ledger.js";
19
+ import {
20
+ getDegradationLedgerGeneration,
21
+ recordDegradationOnce
22
+ } from "../degradation-ledger.js";
20
23
  import { commitDurableStoreAsync } from "../durable-store.js";
21
24
  import { getGlobalDmLensDir } from "../file-utils.js";
25
+ import { createGenerationMap } from "../generation-guard.js";
26
+ import { resolveToolCwd } from "../tool-cwd.js";
22
27
  import {
23
28
  allAvailableGlobalBinDirs,
24
29
  installArgs,
@@ -29,7 +34,13 @@ import {
29
34
  resetSafeSpawnWindowsCommandCache,
30
35
  safeSpawnAsync
31
36
  } from "../safe-spawn.js";
37
+ import {
38
+ createBoundedOutputSink,
39
+ DEFAULT_MAX_OUTPUT_BYTES
40
+ } from "../spawn-output-cap.js";
41
+ import { probeToolAsync } from "../tool-probe.js";
32
42
  import { logSessionStart } from "../sessionstart-logger.js";
43
+ import { resolveGitHubToken } from "../zizmor-config.js";
33
44
  const TOOLS_DIR = path.join(getGlobalDmLensDir(), "tools");
34
45
  const INSTALL_LOCK_PATH = path.join(TOOLS_DIR, ".install.lock");
35
46
  const activeInstallLocks = new Set;
@@ -136,6 +147,131 @@ const OS_ARCH_ZIP_ASSETS = {
136
147
  darwin: { x64: "darwin_amd64.zip", arm64: "darwin_arm64.zip" },
137
148
  win32: { x64: "windows_amd64.zip", arm64: "windows_arm64.zip" }
138
149
  };
150
+ function managedPackageFormatterTool(spec) {
151
+ return {
152
+ id: spec.id,
153
+ name: spec.name,
154
+ checkCommand: spec.id,
155
+ checkArgs: ["--version"],
156
+ installStrategy: spec.installStrategy,
157
+ packageName: spec.packageName,
158
+ binaryName: spec.id
159
+ };
160
+ }
161
+ const MANAGED_PACKAGE_FORMATTERS = [
162
+ { id: "black", name: "Black", installStrategy: "pip", packageName: "black" },
163
+ {
164
+ id: "cmake-format",
165
+ name: "cmake-format",
166
+ installStrategy: "pip",
167
+ packageName: "cmakelang[yaml]"
168
+ },
169
+ { id: "oxfmt", name: "oxfmt", installStrategy: "npm", packageName: "oxfmt" }
170
+ ];
171
+ function managedGitHubFormatterTool(spec) {
172
+ return {
173
+ id: spec.id,
174
+ name: spec.name,
175
+ checkCommand: spec.id,
176
+ checkArgs: ["--version"],
177
+ installStrategy: "github",
178
+ binaryName: spec.id,
179
+ github: {
180
+ repo: `${spec.owner}/${spec.repo}`,
181
+ assetMatch: spec.assetPattern,
182
+ ...spec.binaryInArchive && { binaryInArchive: spec.binaryInArchive },
183
+ ...spec.kind === "phar" && { launcher: "php" },
184
+ ...spec.kind === "jar" && { launcher: "java" }
185
+ }
186
+ };
187
+ }
188
+ const MANAGED_GITHUB_FORMATTERS = [
189
+ {
190
+ id: "typstyle",
191
+ name: "typstyle",
192
+ owner: "typstyle-rs",
193
+ repo: "typstyle",
194
+ assetPattern: archAssetMatch({
195
+ linux: {
196
+ x64: "typstyle-x86_64-unknown-linux-gnu",
197
+ arm64: "typstyle-aarch64-unknown-linux-gnu"
198
+ },
199
+ darwin: {
200
+ x64: "typstyle-x86_64-apple-darwin",
201
+ arm64: "typstyle-aarch64-apple-darwin"
202
+ },
203
+ win32: {
204
+ x64: "typstyle-x86_64-pc-windows-msvc.exe",
205
+ arm64: "typstyle-aarch64-pc-windows-msvc.exe"
206
+ }
207
+ }),
208
+ kind: "binary"
209
+ },
210
+ {
211
+ id: "stylua",
212
+ name: "StyLua",
213
+ owner: "JohnnyMorganz",
214
+ repo: "StyLua",
215
+ assetPattern: archAssetMatch({
216
+ linux: { x64: "linux-x86_64.zip", arm64: "linux-aarch64.zip" },
217
+ darwin: { x64: "macos-x86_64.zip", arm64: "macos-aarch64.zip" },
218
+ win32: { x64: "windows-x86_64.zip" }
219
+ }),
220
+ kind: "binary",
221
+ binaryInArchive: "stylua"
222
+ },
223
+ {
224
+ id: "php-cs-fixer",
225
+ name: "PHP CS Fixer",
226
+ owner: "PHP-CS-Fixer",
227
+ repo: "PHP-CS-Fixer",
228
+ assetPattern: (platform) => platform === "linux" || platform === "darwin" || platform === "win32" ? "php-cs-fixer.phar" : undefined,
229
+ kind: "phar"
230
+ },
231
+ {
232
+ id: "cljfmt",
233
+ name: "cljfmt",
234
+ owner: "weavejester",
235
+ repo: "cljfmt",
236
+ assetPattern: (platform, arch) => {
237
+ if (platform === "linux")
238
+ return arch === "arm64" ? "standalone.jar" : "linux-amd64-static.tar.gz";
239
+ if (platform === "darwin")
240
+ return "standalone.jar";
241
+ if (platform === "win32")
242
+ return "win-amd64.zip";
243
+ return;
244
+ },
245
+ kind: "jar",
246
+ binaryInArchive: "cljfmt"
247
+ }
248
+ ];
249
+ const MANAGED_MAVEN_FORMATTERS = [
250
+ {
251
+ id: "google-java-format",
252
+ name: "google-java-format",
253
+ groupId: "com.google.googlejavaformat",
254
+ artifactId: "google-java-format",
255
+ version: "1.27.0",
256
+ classifier: "all-deps"
257
+ }
258
+ ];
259
+ function managedMavenFormatterTool(spec) {
260
+ return {
261
+ id: spec.id,
262
+ name: spec.name,
263
+ checkCommand: spec.id,
264
+ checkArgs: ["--version"],
265
+ installStrategy: "maven",
266
+ binaryName: spec.id,
267
+ maven: {
268
+ groupId: spec.groupId,
269
+ artifactId: spec.artifactId,
270
+ version: spec.version,
271
+ classifier: spec.classifier
272
+ }
273
+ };
274
+ }
139
275
  export const TOOLS = [
140
276
  {
141
277
  id: "typescript-language-server",
@@ -143,7 +279,7 @@ export const TOOLS = [
143
279
  checkCommand: "typescript-language-server",
144
280
  checkArgs: ["--version"],
145
281
  installStrategy: "npm",
146
- packageName: "typescript-language-server",
282
+ packageName: "typescript-language-server@5.3.0",
147
283
  binaryName: "typescript-language-server"
148
284
  },
149
285
  {
@@ -173,6 +309,7 @@ export const TOOLS = [
173
309
  packageName: "prettier",
174
310
  binaryName: "prettier"
175
311
  },
312
+ ...MANAGED_PACKAGE_FORMATTERS.map(managedPackageFormatterTool),
176
313
  {
177
314
  id: "ruff",
178
315
  name: "Ruff",
@@ -227,7 +364,7 @@ export const TOOLS = [
227
364
  checkCommand: "jscpd",
228
365
  checkArgs: ["--version"],
229
366
  installStrategy: "npm",
230
- packageName: "jscpd@5.0.12",
367
+ packageName: "jscpd@5.3.0",
231
368
  binaryName: "jscpd"
232
369
  },
233
370
  {
@@ -304,7 +441,8 @@ export const TOOLS = [
304
441
  checkArgs: ["--version"],
305
442
  installStrategy: "pip",
306
443
  packageName: "cmake-language-server",
307
- binaryName: "cmake-language-server"
444
+ binaryName: "cmake-language-server",
445
+ pipConstraints: ["pygls<2"]
308
446
  },
309
447
  {
310
448
  id: "yaml-language-server",
@@ -331,7 +469,7 @@ export const TOOLS = [
331
469
  checkCommand: "vscode-html-language-server",
332
470
  checkArgs: ["--version"],
333
471
  installStrategy: "npm",
334
- packageName: "vscode-html-languageserver-bin",
472
+ packageName: "vscode-langservers-extracted",
335
473
  binaryName: "vscode-html-language-server"
336
474
  },
337
475
  {
@@ -411,7 +549,7 @@ export const TOOLS = [
411
549
  checkCommand: "vscode-css-language-server",
412
550
  checkArgs: ["--version"],
413
551
  installStrategy: "npm",
414
- packageName: "vscode-css-languageserver",
552
+ packageName: "vscode-langservers-extracted",
415
553
  binaryName: "vscode-css-language-server"
416
554
  },
417
555
  {
@@ -428,6 +566,7 @@ export const TOOLS = [
428
566
  name: "Intelephense",
429
567
  checkCommand: "intelephense",
430
568
  checkArgs: ["--version"],
569
+ verification: "package-entry",
431
570
  installStrategy: "npm",
432
571
  packageName: "intelephense",
433
572
  binaryName: "intelephense"
@@ -548,6 +687,8 @@ export const TOOLS = [
548
687
  }
549
688
  }
550
689
  },
690
+ ...MANAGED_GITHUB_FORMATTERS.map(managedGitHubFormatterTool),
691
+ ...MANAGED_MAVEN_FORMATTERS.map(managedMavenFormatterTool),
551
692
  {
552
693
  id: "rust-analyzer",
553
694
  name: "rust-analyzer",
@@ -718,7 +859,7 @@ export const TOOLS = [
718
859
  return arch === "arm64" ? undefined : `${base}/lua-language-server-${version}-win32-x64.zip`;
719
860
  return;
720
861
  },
721
- kind: "zip",
862
+ kind: (platform) => platform === "win32" ? "zip" : "tgz",
722
863
  stripComponents: 0,
723
864
  treeMarker: "bin"
724
865
  }
@@ -1017,6 +1158,32 @@ export const TOOLS = [
1017
1158
  binaryInArchive: "gleam"
1018
1159
  }
1019
1160
  },
1161
+ {
1162
+ id: "tinymist",
1163
+ name: "Tinymist",
1164
+ checkCommand: "tinymist",
1165
+ checkArgs: ["--version"],
1166
+ installStrategy: "github",
1167
+ binaryName: "tinymist",
1168
+ github: {
1169
+ repo: "Myriad-Dreamin/tinymist",
1170
+ assetMatch: archAssetMatch({
1171
+ linux: {
1172
+ x64: "tinymist-x86_64-unknown-linux-gnu.tar.gz",
1173
+ arm64: "tinymist-aarch64-unknown-linux-gnu.tar.gz"
1174
+ },
1175
+ darwin: {
1176
+ x64: "tinymist-x86_64-apple-darwin.tar.gz",
1177
+ arm64: "tinymist-aarch64-apple-darwin.tar.gz"
1178
+ },
1179
+ win32: {
1180
+ x64: "tinymist-x86_64-pc-windows-msvc.zip",
1181
+ arm64: "tinymist-aarch64-pc-windows-msvc.zip"
1182
+ }
1183
+ }),
1184
+ binaryInArchive: "tinymist"
1185
+ }
1186
+ },
1020
1187
  {
1021
1188
  id: "marksman",
1022
1189
  name: "Marksman",
@@ -1258,26 +1425,10 @@ function isAstGrepVersionOutput(output) {
1258
1425
  return /\bast[- ]grep\b/i.test(output);
1259
1426
  }
1260
1427
  async function verifyAstGrepProbePath(binPath) {
1261
- return new Promise((resolve) => {
1262
- let proc;
1263
- try {
1264
- proc = spawn(binPath, ["--version"], {
1265
- stdio: ["ignore", "pipe", "pipe"],
1266
- shell: process.platform === "win32" && /\.(cmd|bat)$/i.test(binPath),
1267
- timeout: 5000
1268
- });
1269
- } catch {
1270
- resolve(false);
1271
- return;
1272
- }
1273
- let output = "";
1274
- proc.stdout?.on("data", (data) => output += data);
1275
- proc.stderr?.on("data", (data) => output += data);
1276
- proc.on("exit", (code) => {
1277
- resolve(code === 0 && isAstGrepVersionOutput(output));
1278
- });
1279
- proc.on("error", () => resolve(false));
1428
+ const result = await probeToolAsync(binPath, ["--version"], {
1429
+ timeout: 5000
1280
1430
  });
1431
+ return !result.error && result.status === 0 && isAstGrepVersionOutput(`${result.stdout}${result.stderr}`);
1281
1432
  }
1282
1433
  export async function checkProbeCache(toolId) {
1283
1434
  const cache = await readProbeCache();
@@ -1404,7 +1555,7 @@ export function isLspTransportRequiredError(output) {
1404
1555
  return /Connection (?:input|output) stream is not set|Use arguments of createConnection/i.test(output);
1405
1556
  }
1406
1557
  const lspTransportRequiredMatcher = /Connection (?:input|output) stream is not set|Use arguments of createConnection/i;
1407
- function parsePinnedVersion(packageName) {
1558
+ export function parsePinnedVersion(packageName) {
1408
1559
  const at = packageName.lastIndexOf("@");
1409
1560
  if (at <= 0)
1410
1561
  return;
@@ -1414,7 +1565,54 @@ function extractVersionToken(output) {
1414
1565
  return output.match(/\d+\.\d+\.\d+(?:[-+][\w.]+)?/)?.[0];
1415
1566
  }
1416
1567
  const lastManagedInstallVersion = new Map;
1417
- export async function verifyToolBinary(binPath, onVersionOutput, onTransient, timeoutMs = 1e4, verificationArgs = ["--version"]) {
1568
+ export function packageEntryVerification(tool) {
1569
+ return tool.verification === "package-entry" ? tool.packageName : undefined;
1570
+ }
1571
+ export async function verifyNpmPackageEntry(binPath, packageName) {
1572
+ const nodeModulesDir = path.dirname(path.dirname(binPath));
1573
+ const pinned = parsePinnedVersion(packageName);
1574
+ const bareName = pinned ? packageName.slice(0, -(pinned.length + 1)) : packageName;
1575
+ const packageDir = path.join(nodeModulesDir, ...bareName.split("/"));
1576
+ const shimName = path.basename(binPath).replace(/\.(cmd|exe|ps1|bat)$/i, "").toLowerCase();
1577
+ const fail = (reason) => {
1578
+ logSessionStart(`auto-install verify: failed for ${binPath} (check=package-entry, kind=${reason})`);
1579
+ return false;
1580
+ };
1581
+ try {
1582
+ const shim = statSync(binPath);
1583
+ if (!shim.isFile() || shim.size === 0)
1584
+ return fail("shim-not-a-file");
1585
+ } catch {
1586
+ return fail("shim-missing");
1587
+ }
1588
+ let manifest;
1589
+ try {
1590
+ manifest = JSON.parse(await fs.readFile(path.join(packageDir, "package.json"), "utf8"));
1591
+ } catch {
1592
+ return fail("package-json-unreadable");
1593
+ }
1594
+ if (typeof manifest.version !== "string" || !manifest.version) {
1595
+ return fail("package-json-no-version");
1596
+ }
1597
+ const bin = manifest.bin;
1598
+ const entry = typeof bin === "string" ? bin : bin && typeof bin === "object" ? Object.entries(bin).find(([name]) => name.toLowerCase() === shimName)?.[1] : undefined;
1599
+ if (typeof entry !== "string" || !entry) {
1600
+ return fail("package-json-no-entry");
1601
+ }
1602
+ try {
1603
+ const stat = statSync(path.join(packageDir, entry));
1604
+ if (!stat.isFile() || stat.size === 0)
1605
+ return fail("entry-not-a-file");
1606
+ } catch {
1607
+ return fail("entry-missing");
1608
+ }
1609
+ logSessionStart(`auto-install verify: succeeded for ${binPath} (check=package-entry, version=${manifest.version}, entry=${entry})`);
1610
+ return true;
1611
+ }
1612
+ export async function verifyToolBinary(binPath, onVersionOutput, onTransient, timeoutMs = 1e4, verificationArgs = ["--version"], packageEntryOf, onInconclusive) {
1613
+ if (packageEntryOf !== undefined) {
1614
+ return verifyNpmPackageEntry(binPath, packageEntryOf);
1615
+ }
1418
1616
  const isWindows = installerPlatform() === "win32";
1419
1617
  const hasKnownWindowsExt = /\.(cmd|exe|ps1)$/i.test(binPath);
1420
1618
  let execPath = isWindows && !hasKnownWindowsExt ? `${binPath}.cmd` : binPath;
@@ -1452,6 +1650,14 @@ ${result.stderr}`;
1452
1650
  }
1453
1651
  if (result.signal !== undefined || result.spawnFailure)
1454
1652
  onTransient?.();
1653
+ if (result.outputTruncated && result.signal === undefined && !result.spawnFailure) {
1654
+ onInconclusive?.();
1655
+ recordDegradationOnce({
1656
+ kind: "installer-verification-inconclusive",
1657
+ subject: binPath,
1658
+ reason: `transport-required marker unresolved in truncated output (${verificationArgs.join(" ")})`
1659
+ });
1660
+ }
1455
1661
  const kind = result.spawnFailure?.kind ?? (result.signal ? `killed-signal=${result.signal}` : result.error ? "spawn-error" : "exit-nonzero");
1456
1662
  logSessionStart(`auto-install verify: failed for ${binPath} (check=${verificationArgs.join(" ")}, kind=${kind}${result.status !== null ? `, exit=${result.status}` : ""})`);
1457
1663
  return false;
@@ -1485,26 +1691,11 @@ export async function getAllToolStatuses() {
1485
1691
  status.installed = true;
1486
1692
  status.source = "global-path";
1487
1693
  status.path = tool.checkCommand;
1488
- const versionResult = await new Promise((resolve) => {
1489
- let proc;
1490
- try {
1491
- proc = spawn(tool.checkCommand, ["--version"], {
1492
- stdio: ["ignore", "pipe", "pipe"],
1493
- shell: process.platform === "win32",
1494
- timeout: 5000
1495
- });
1496
- } catch {
1497
- resolve("");
1498
- return;
1499
- }
1500
- let out = "";
1501
- proc.stdout?.on("data", (d) => out += d);
1502
- proc.stderr?.on("data", (d) => out += d);
1503
- proc.on("exit", () => resolve(out.trim().split(`
1504
- `)[0]?.slice(0, 30) || ""));
1505
- proc.on("error", () => resolve(""));
1694
+ const probe = await probeToolAsync(tool.checkCommand, ["--version"], {
1695
+ timeout: 5000
1506
1696
  });
1507
- status.version = versionResult || undefined;
1697
+ status.version = `${probe.stdout}${probe.stderr}`.trim().split(`
1698
+ `)[0]?.slice(0, 30) || undefined;
1508
1699
  statuses.push(status);
1509
1700
  continue;
1510
1701
  }
@@ -1542,7 +1733,7 @@ export async function getAllToolStatuses() {
1542
1733
  const localPath = installerPlatform() === "win32" ? `${localBase}.cmd` : localBase;
1543
1734
  try {
1544
1735
  await fs.access(localPath);
1545
- if (await verifyToolBinary(localPath, undefined, undefined, getToolVerificationTimeout(tool), tool.checkArgs)) {
1736
+ if (await verifyToolBinary(localPath, undefined, undefined, getToolVerificationTimeout(tool), tool.checkArgs, packageEntryVerification(tool))) {
1546
1737
  status.installed = true;
1547
1738
  status.source = "dm-lens-auto";
1548
1739
  status.path = localPath;
@@ -1635,7 +1826,7 @@ async function getToolPathResolved(toolId, onTransient) {
1635
1826
  const cmdPath = `${localBase}.cmd`;
1636
1827
  try {
1637
1828
  await fs.access(cmdPath);
1638
- if (await verifyToolBinary(cmdPath, recordVersion, onTransient, getToolVerificationTimeout(tool), tool.checkArgs)) {
1829
+ if (await verifyToolBinary(cmdPath, recordVersion, onTransient, getToolVerificationTimeout(tool), tool.checkArgs, packageEntryVerification(tool))) {
1639
1830
  return cmdPath;
1640
1831
  }
1641
1832
  logSessionStart(`auto-install verify: ${cmdPath} exists but is broken, will reinstall`);
@@ -1643,7 +1834,7 @@ async function getToolPathResolved(toolId, onTransient) {
1643
1834
  const exePath = `${localBase}.exe`;
1644
1835
  try {
1645
1836
  await fs.access(exePath);
1646
- if (await verifyToolBinary(exePath, recordVersion, onTransient, getToolVerificationTimeout(tool), tool.checkArgs)) {
1837
+ if (await verifyToolBinary(exePath, recordVersion, onTransient, getToolVerificationTimeout(tool), tool.checkArgs, packageEntryVerification(tool))) {
1647
1838
  return exePath;
1648
1839
  }
1649
1840
  logSessionStart(`auto-install verify: ${exePath} exists but is broken, will reinstall`);
@@ -1652,7 +1843,7 @@ async function getToolPathResolved(toolId, onTransient) {
1652
1843
  if (installerPlatform() !== "win32") {
1653
1844
  try {
1654
1845
  await fs.access(localBase);
1655
- if (await verifyToolBinary(localBase, recordVersion, onTransient, getToolVerificationTimeout(tool), tool.checkArgs)) {
1846
+ if (await verifyToolBinary(localBase, recordVersion, onTransient, getToolVerificationTimeout(tool), tool.checkArgs, packageEntryVerification(tool))) {
1656
1847
  return localBase;
1657
1848
  }
1658
1849
  logSessionStart(`auto-install verify: ${localBase} exists but is broken, will reinstall`);
@@ -1671,8 +1862,24 @@ async function getToolPathResolved(toolId, onTransient) {
1671
1862
  if (githubPath)
1672
1863
  return githubPath;
1673
1864
  }
1674
- if (await isCommandAvailable(tool.checkCommand, tool.checkArgs)) {
1675
- return tool.checkCommand;
1865
+ if (await isCommandAvailable(tool.checkCommand)) {
1866
+ if (packageEntryVerification(tool) !== undefined)
1867
+ return tool.checkCommand;
1868
+ let probeStalled = false;
1869
+ const verified = await verifyToolBinary(tool.checkCommand, undefined, () => {
1870
+ probeStalled = true;
1871
+ onTransient();
1872
+ }, getToolVerificationTimeout(tool), tool.checkArgs, undefined, () => {
1873
+ probeStalled = true;
1874
+ });
1875
+ if (verified || probeStalled)
1876
+ return tool.checkCommand;
1877
+ recordDegradationOnce({
1878
+ kind: "installer-path-candidate-unrunnable",
1879
+ subject: toolId,
1880
+ reason: `${tool.checkCommand} on PATH failed its own check (${tool.checkArgs.join(" ")}); ignoring PATH for this tool`
1881
+ });
1882
+ logSessionStart(`auto-install ${toolId}: PATH candidate ${tool.checkCommand} failed ${tool.checkArgs.join(" ")} — ignoring PATH, trying managed install`);
1676
1883
  }
1677
1884
  if (tool.installStrategy === "npm") {
1678
1885
  const npmPath = await findNpmGlobalToolPath(tool.binaryName || tool.id, onTransient, tool.checkArgs, getToolVerificationTimeout(tool));
@@ -1727,6 +1934,13 @@ function getGitHubInstalledBinaryName(binaryName, platform, assetName) {
1727
1934
  return `${binaryName}.cmd`;
1728
1935
  return `${binaryName}.exe`;
1729
1936
  }
1937
+ function launcherForGitHubAsset(spec, assetName) {
1938
+ if (spec.launcher === "php" && assetName.endsWith(".phar"))
1939
+ return "php";
1940
+ if (spec.launcher === "java" && assetName.endsWith(".jar"))
1941
+ return "java";
1942
+ return;
1943
+ }
1730
1944
  function getArchiveBinaryCandidates(binaryName, platform, assetName) {
1731
1945
  if (platform !== "win32")
1732
1946
  return [binaryName];
@@ -1787,12 +2001,14 @@ async function getNpmGlobalBinCandidates(onTransient) {
1787
2001
  return dirs;
1788
2002
  }
1789
2003
  async function findPipUserToolPath(binaryName, onTransient, verificationArgs = ["--version"], verificationTimeoutMs = 1e4) {
1790
- const isWindows = process.platform === "win32";
1791
- const userBaseCandidates = await getPythonUserBaseCandidates();
2004
+ const isWindows = installerPlatform() === "win32";
2005
+ const userBaseCandidates = [
2006
+ path.join(getGlobalDmLensDir(), "pip-tools"),
2007
+ path.join(getGlobalDmLensDir(), "pip-user"),
2008
+ ...await getPythonUserBaseCandidates()
2009
+ ];
1792
2010
  for (const userBase of userBaseCandidates) {
1793
- const scriptDirs = [
1794
- path.join(userBase, isWindows ? "Scripts" : "bin")
1795
- ];
2011
+ const scriptDirs = [pipScriptsDir(userBase, installerPlatform())];
1796
2012
  if (isWindows) {
1797
2013
  try {
1798
2014
  const children = await fs.readdir(userBase, { withFileTypes: true });
@@ -1823,6 +2039,23 @@ async function findPipUserToolPath(binaryName, onTransient, verificationArgs = [
1823
2039
  }
1824
2040
  return;
1825
2041
  }
2042
+ export function userBaseProbeResult(command, code, stdout) {
2043
+ if (stdout.truncated) {
2044
+ recordDegradationOnce({
2045
+ kind: "spawn-output-cap-truncated",
2046
+ subject: `user-base-probe:${command}`,
2047
+ reason: `\`${command} -m site --user-base\` reached the ${DEFAULT_MAX_OUTPUT_BYTES}-byte default cap after ${stdout.observedBytes} bytes; the probed user base is unusable`,
2048
+ metadata: {
2049
+ capBytes: DEFAULT_MAX_OUTPUT_BYTES,
2050
+ capSource: "default",
2051
+ observedBytes: stdout.observedBytes,
2052
+ killed: false
2053
+ }
2054
+ });
2055
+ return "";
2056
+ }
2057
+ return code === 0 ? stdout.text.trim() : "";
2058
+ }
1826
2059
  async function getPythonUserBaseCandidates() {
1827
2060
  const candidates = [];
1828
2061
  const seen = new Set;
@@ -1861,19 +2094,49 @@ async function getPythonUserBaseCandidates() {
1861
2094
  resolve("");
1862
2095
  return;
1863
2096
  }
1864
- let stdout = "";
1865
- proc.stdout?.on("data", (data) => stdout += data);
1866
- proc.on("exit", (code) => resolve(code === 0 ? stdout.trim() : ""));
2097
+ const stdout = createBoundedOutputSink();
2098
+ proc.stdout?.on("data", (data) => stdout.append(data));
2099
+ proc.on("exit", (code) => resolve(userBaseProbeResult(probe.command, code, stdout)));
1867
2100
  proc.on("error", () => resolve(""));
1868
2101
  });
1869
2102
  add(userBase);
1870
2103
  }
1871
2104
  return candidates;
1872
2105
  }
1873
- function githubApiAuthHeaders() {
1874
- const token = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;
2106
+ async function githubApiAuthHeaders() {
2107
+ const token = await resolveGitHubToken();
1875
2108
  return token ? { Authorization: `Bearer ${token}` } : {};
1876
2109
  }
2110
+
2111
+ class HttpStatusError extends Error {
2112
+ statusCode;
2113
+ constructor(statusCode, url) {
2114
+ super(url ? `HTTP ${statusCode} for ${url}` : `HTTP ${statusCode}`);
2115
+ this.name = "HttpStatusError";
2116
+ this.statusCode = statusCode;
2117
+ }
2118
+ }
2119
+
2120
+ class GitHubHttpError extends HttpStatusError {
2121
+ anonymousRateLimitExhausted;
2122
+ constructor(statusCode, requestHeaders, responseHeaders) {
2123
+ super(statusCode);
2124
+ this.name = "GitHubHttpError";
2125
+ this.message = `GitHub API HTTP ${statusCode}`;
2126
+ this.anonymousRateLimitExhausted = statusCode === 403 && !Object.keys(requestHeaders).some((key) => key.toLowerCase() === "authorization") && readHeader(responseHeaders, "x-ratelimit-remaining") === "0";
2127
+ }
2128
+ }
2129
+ function readHeader(headers, name) {
2130
+ const entry = Object.entries(headers).find(([key]) => key.toLowerCase() === name.toLowerCase())?.[1];
2131
+ return Array.isArray(entry) ? entry[0]?.trim() : entry?.trim();
2132
+ }
2133
+ function isGitHubApiUrl(url) {
2134
+ try {
2135
+ return new URL(url).host.toLowerCase() === "api.github.com";
2136
+ } catch {
2137
+ return false;
2138
+ }
2139
+ }
1877
2140
  function sameHost(a, b) {
1878
2141
  try {
1879
2142
  return new URL(a).host === new URL(b).host;
@@ -1901,7 +2164,7 @@ function httpsGetWithMeta(url, maxRedirects = 5, headers = {}) {
1901
2164
  }
1902
2165
  if (res.statusCode !== 200) {
1903
2166
  res.resume();
1904
- return reject(new Error(`HTTP ${res.statusCode} for ${url}`));
2167
+ return reject(isGitHubApiUrl(url) ? new GitHubHttpError(res.statusCode ?? 0, headers, res.headers) : new HttpStatusError(res.statusCode ?? 0, url));
1905
2168
  }
1906
2169
  const chunks = [];
1907
2170
  res.on("data", (chunk) => chunks.push(chunk));
@@ -1952,10 +2215,18 @@ async function installGitHubTool(tool, prefetchedRelease) {
1952
2215
  } else {
1953
2216
  logSessionStart(`github-install ${tool.id}: fetching release metadata from ${spec.repo}`);
1954
2217
  try {
1955
- const body = await httpsGet(`https://api.github.com/repos/${spec.repo}/releases/latest`, 5, githubApiAuthHeaders());
2218
+ const body = await httpsGet(`https://api.github.com/repos/${spec.repo}/releases/latest`, 5, await githubApiAuthHeaders());
1956
2219
  releaseJson = JSON.parse(body.toString("utf8"));
1957
2220
  } catch (err) {
1958
- logSessionStart(`github-install ${tool.id}: release fetch failed: ${err.message}`);
2221
+ const reason = err instanceof GitHubHttpError && err.anonymousRateLimitExhausted ? "GitHub API rate limit exhausted; authenticate with `gh auth login` or set GITHUB_TOKEN/GH_TOKEN and retry" : `release fetch failed: ${err.message}`;
2222
+ if (err instanceof GitHubHttpError && err.anonymousRateLimitExhausted) {
2223
+ recordDegradationOnce({
2224
+ kind: "github-api-rate-limit",
2225
+ subject: tool.id,
2226
+ reason
2227
+ });
2228
+ }
2229
+ logSessionStart(`github-install ${tool.id}: ${reason}`);
1959
2230
  return;
1960
2231
  }
1961
2232
  }
@@ -1986,10 +2257,33 @@ async function installGitHubTool(tool, prefetchedRelease) {
1986
2257
  const binaryName = tool.binaryName ?? tool.id;
1987
2258
  const isWindows = platform === "win32";
1988
2259
  const finalBinaryName = getGitHubInstalledBinaryName(binaryName, platform, asset.name);
1989
- const destPath = path.join(GITHUB_BIN_DIR, finalBinaryName);
2260
+ let destPath = path.join(GITHUB_BIN_DIR, finalBinaryName);
1990
2261
  const assetName = asset.name;
2262
+ const launcherRuntime = launcherForGitHubAsset(spec, assetName);
2263
+ if (launcherRuntime && !await isCommandAvailable(launcherRuntime, ["--version"])) {
2264
+ logSessionStart(`github-install ${tool.id}: ${launcherRuntime} not found — asset requires a runtime launcher`);
2265
+ return;
2266
+ }
1991
2267
  try {
1992
- if (assetName.endsWith(".gz") && !assetName.endsWith(".tar.gz")) {
2268
+ if (launcherRuntime) {
2269
+ const assetPath = path.join(GITHUB_BIN_DIR, `${tool.id}${assetName.endsWith(".phar") ? ".phar" : ".jar"}`);
2270
+ await writeFileAtomicAsync(assetPath, assetBuffer, {
2271
+ bestEffort: false,
2272
+ mode: 488
2273
+ });
2274
+ const launcherName = isWindows ? `${binaryName}.bat` : binaryName;
2275
+ destPath = path.join(GITHUB_BIN_DIR, launcherName);
2276
+ const runtimeTarget = assetName.endsWith(".phar") ? `${tool.id}.phar` : `${tool.id}.jar`;
2277
+ const command = isWindows ? `@echo off\r
2278
+ ${launcherRuntime} "%~dp0${runtimeTarget}" %*\r
2279
+ ` : `#!/bin/sh
2280
+ exec ${launcherRuntime} "$(dirname "$0")/${runtimeTarget}" "$@"
2281
+ `;
2282
+ await writeFileAtomicAsync(destPath, command, {
2283
+ bestEffort: false,
2284
+ mode: isWindows ? undefined : 488
2285
+ });
2286
+ } else if (assetName.endsWith(".gz") && !assetName.endsWith(".tar.gz")) {
1993
2287
  const decompressed = await new Promise((resolve, reject) => {
1994
2288
  const gunzip = createGunzip();
1995
2289
  const chunks = [];
@@ -2107,11 +2401,17 @@ export function npmToolNeedsPostinstall(packageName) {
2107
2401
  return NEEDS_POSTINSTALL.has(packageName);
2108
2402
  }
2109
2403
  export function getRefreshableManagedNpmTools() {
2404
+ const seenPackages = new Set;
2110
2405
  return getRefreshableManagedTools().filter((candidate) => candidate.strategy === "npm").map((candidate) => ({
2111
2406
  toolId: candidate.toolId,
2112
2407
  packageName: candidate.packageName,
2113
2408
  binaryName: candidate.binaryName
2114
- }));
2409
+ })).filter((candidate) => {
2410
+ if (seenPackages.has(candidate.packageName))
2411
+ return false;
2412
+ seenPackages.add(candidate.packageName);
2413
+ return true;
2414
+ });
2115
2415
  }
2116
2416
  function mavenCoordinate(spec) {
2117
2417
  return [
@@ -2139,7 +2439,8 @@ export function getRefreshableManagedTools() {
2139
2439
  checkArgs: tool.checkArgs,
2140
2440
  packageName: tool.packageName,
2141
2441
  binaryName: tool.binaryName,
2142
- verificationTimeoutMs: tool.verificationTimeoutMs
2442
+ verificationTimeoutMs: tool.verificationTimeoutMs,
2443
+ packageEntryOf: packageEntryVerification(tool)
2143
2444
  });
2144
2445
  break;
2145
2446
  }
@@ -2228,7 +2529,7 @@ async function probeManagedToolVersion(tool) {
2228
2529
  if (!cached?.path || !existsSync(cached.path))
2229
2530
  return;
2230
2531
  try {
2231
- const result = await safeSpawnAsync(cached.path, tool.checkArgs, {
2532
+ const result = await probeToolAsync(cached.path, tool.checkArgs, {
2232
2533
  timeout: getToolVerificationTimeout(tool),
2233
2534
  input: "",
2234
2535
  ignoreAmbientSignal: true,
@@ -2306,14 +2607,22 @@ async function refreshGitHubManagedTool(tool, known) {
2306
2607
  let response;
2307
2608
  try {
2308
2609
  response = await httpsGetWithMeta(`https://api.github.com/repos/${spec.repo}/releases/latest`, 5, {
2309
- ...githubApiAuthHeaders(),
2610
+ ...await githubApiAuthHeaders(),
2310
2611
  ...known.etag ? { "If-None-Match": known.etag } : {}
2311
2612
  });
2312
2613
  } catch (err) {
2614
+ const reason = err instanceof GitHubHttpError && err.anonymousRateLimitExhausted ? "GitHub API rate limit exhausted; authenticate with `gh auth login` or set GITHUB_TOKEN/GH_TOKEN and retry" : `release query failed: ${err.message}`;
2615
+ if (err instanceof GitHubHttpError && err.anonymousRateLimitExhausted) {
2616
+ recordDegradationOnce({
2617
+ kind: "github-api-rate-limit",
2618
+ subject: tool.id,
2619
+ reason
2620
+ });
2621
+ }
2313
2622
  return {
2314
2623
  ok: false,
2315
2624
  unchanged: true,
2316
- reason: `release query failed: ${err.message}`
2625
+ reason
2317
2626
  };
2318
2627
  }
2319
2628
  if (response.statusCode === 304) {
@@ -2397,7 +2706,9 @@ async function refreshPackageManagerManagedTool(tool) {
2397
2706
  return { ok: false, unchanged: true, reason: "no package name" };
2398
2707
  }
2399
2708
  const previous = await probeManagedToolVersion(tool);
2400
- const installed = tool.installStrategy === "pip" ? await installPipTool(tool.packageName, { upgrade: true }) : await installGemTool(tool.packageName);
2709
+ const installed = tool.installStrategy === "pip" ? await installPipTool(tool.id, tool.packageName, tool.binaryName ?? tool.id, {
2710
+ upgrade: true
2711
+ }) : await installGemTool(tool.id, tool.packageName);
2401
2712
  if (!installed) {
2402
2713
  return {
2403
2714
  ok: false,
@@ -2523,9 +2834,32 @@ exec java -jar "$(dirname "$0")/${tool.id}.jar" "$@"
2523
2834
  return;
2524
2835
  }
2525
2836
  }
2526
- export function resolveArchiveUrl(spec, platform = process.platform, arch = process.arch) {
2837
+ export function resolveArchiveUrl(spec, platform = installerPlatform(), arch = process.arch) {
2527
2838
  return typeof spec.url === "function" ? spec.url(platform, arch) : spec.url;
2528
2839
  }
2840
+ export function resolveArchiveKind(spec, platform = installerPlatform(), arch = process.arch) {
2841
+ return typeof spec.kind === "function" ? spec.kind(platform, arch) : spec.kind;
2842
+ }
2843
+ function recordArchiveExtractionDegradation(toolId, format, reason) {
2844
+ recordDegradationOnce({
2845
+ kind: "managed-tool-install",
2846
+ subject: `${toolId}:${format}`,
2847
+ reason: `archive extraction ${reason}`
2848
+ });
2849
+ }
2850
+ async function stripExtractedArchiveRoot(dir, components) {
2851
+ for (let i = 0;i < components; i++) {
2852
+ const entries = await fs.readdir(dir, { withFileTypes: true });
2853
+ const [entry] = entries;
2854
+ if (entries.length !== 1 || !entry?.isDirectory())
2855
+ return false;
2856
+ const root = path.join(dir, entry.name);
2857
+ for (const child of await fs.readdir(root))
2858
+ await fs.rename(path.join(root, child), path.join(dir, child));
2859
+ await fs.rm(root, { recursive: true, force: true });
2860
+ }
2861
+ return true;
2862
+ }
2529
2863
  export async function swapExtractedDir(toolId, tmpDir, finalDir) {
2530
2864
  const backupDir = `${finalDir}.rollback`;
2531
2865
  await fs.rm(backupDir, { recursive: true, force: true });
@@ -2563,8 +2897,10 @@ async function installArchiveTool(tool) {
2563
2897
  if (!spec)
2564
2898
  return;
2565
2899
  const binaryName = tool.binaryName ?? tool.id;
2566
- const isWindows = process.platform === "win32";
2567
- const url = resolveArchiveUrl(spec);
2900
+ const platform = installerPlatform();
2901
+ const isWindows = platform === "win32";
2902
+ const archiveKind = resolveArchiveKind(spec, platform, process.arch);
2903
+ const url = resolveArchiveUrl(spec, platform, process.arch);
2568
2904
  if (!url) {
2569
2905
  logSessionStart(`archive-install ${tool.id}: no archive for ${process.platform}/${process.arch} — unsupported, skipping`);
2570
2906
  return;
@@ -2580,7 +2916,7 @@ async function installArchiveTool(tool) {
2580
2916
  }
2581
2917
  const extractName = tool.id;
2582
2918
  const tmpExtractName = `${extractName}.refresh-tmp`;
2583
- const archiveName = `${tool.id}.download.${spec.kind === "zip" ? "zip" : "tgz"}`;
2919
+ const archiveName = `${tool.id}.download.${archiveKind === "zip" ? "zip" : "tgz"}`;
2584
2920
  const extractDir = path.join(TOOLS_DIR, extractName);
2585
2921
  const tmpExtractDir = path.join(TOOLS_DIR, tmpExtractName);
2586
2922
  const tmpArchive = path.join(TOOLS_DIR, archiveName);
@@ -2590,27 +2926,38 @@ async function installArchiveTool(tool) {
2590
2926
  await fs.mkdir(tmpExtractDir, { recursive: true });
2591
2927
  await fs.writeFile(tmpArchive, archiveBuffer);
2592
2928
  const stripComponents = spec.stripComponents ?? 1;
2593
- const tarArgs = [
2594
- spec.kind === "tgz" ? "-xzf" : "-xf",
2929
+ const extractionArgs = archiveKind === "zip" && isWindows ? [
2930
+ "-NoProfile",
2931
+ "-Command",
2932
+ `Expand-Archive -LiteralPath '${archiveName}' -DestinationPath '${tmpExtractName}' -Force`
2933
+ ] : archiveKind === "zip" ? ["-q", "-o", archiveName, "-d", tmpExtractName] : [
2934
+ "-xzf",
2595
2935
  archiveName,
2596
2936
  "-C",
2597
2937
  tmpExtractName,
2598
2938
  ...stripComponents > 0 ? [`--strip-components=${stripComponents}`] : []
2599
2939
  ];
2600
- const tarBin = isWindows ? `${process.env.SystemRoot ?? "C:\\Windows"}\\System32\\tar.exe` : "tar";
2601
- const extractResult = await safeSpawnAsync(tarBin, tarArgs, {
2940
+ const extractor = archiveKind === "zip" && isWindows ? `${process.env.SystemRoot ?? "C:\\Windows"}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe` : archiveKind === "zip" ? "unzip" : isWindows ? `${process.env.SystemRoot ?? "C:\\Windows"}\\System32\\tar.exe` : "tar";
2941
+ const extractionResult = await safeSpawnAsync(extractor, extractionArgs, {
2602
2942
  cwd: TOOLS_DIR,
2603
2943
  timeout: 120000,
2604
2944
  ignoreAmbientSignal: true,
2605
2945
  lifetimeCoupled: true
2606
2946
  });
2607
2947
  const extracted = {
2608
- ok: extractResult.status === 0,
2609
- stderr: extractResult.error?.message ?? extractResult.stderr
2948
+ ok: extractionResult.status === 0,
2949
+ reason: extractionResult.spawnFailure?.kind === "tool-not-found" ? "extractor-unavailable" : extractionResult.spawnFailure ? "extractor-error" : "extractor-exit"
2610
2950
  };
2611
2951
  await fs.rm(tmpArchive, { force: true });
2612
2952
  if (!extracted.ok) {
2613
- logSessionStart(`archive-install ${tool.id}: extraction failed: ${extracted.stderr} — keeping installed version`);
2953
+ recordArchiveExtractionDegradation(tool.id, archiveKind, extracted.reason);
2954
+ logSessionStart(`archive-install ${tool.id}: ${archiveKind} extraction failed (${extracted.reason}) — keeping installed version`);
2955
+ await fs.rm(tmpExtractDir, { recursive: true, force: true }).catch(() => {});
2956
+ return;
2957
+ }
2958
+ if (archiveKind === "zip" && !await stripExtractedArchiveRoot(tmpExtractDir, stripComponents)) {
2959
+ recordArchiveExtractionDegradation(tool.id, archiveKind, "layout-invalid");
2960
+ logSessionStart(`archive-install ${tool.id}: ${archiveKind} layout invalid — keeping installed version`);
2614
2961
  await fs.rm(tmpExtractDir, { recursive: true, force: true }).catch(() => {});
2615
2962
  return;
2616
2963
  }
@@ -2619,7 +2966,8 @@ async function installArchiveTool(tool) {
2619
2966
  try {
2620
2967
  await fs.access(tmpMarker);
2621
2968
  } catch {
2622
- logSessionStart(`archive-install ${tool.id}: tree marker not found at ${tmpMarker} after extraction — keeping installed version`);
2969
+ recordArchiveExtractionDegradation(tool.id, archiveKind, "marker-missing");
2970
+ logSessionStart(`archive-install ${tool.id}: ${archiveKind} marker missing after extraction — keeping installed version`);
2623
2971
  await fs.rm(tmpExtractDir, { recursive: true, force: true }).catch(() => {});
2624
2972
  return;
2625
2973
  }
@@ -2634,7 +2982,8 @@ async function installArchiveTool(tool) {
2634
2982
  try {
2635
2983
  await fs.access(tmpResolvedInner);
2636
2984
  } catch {
2637
- logSessionStart(`archive-install ${tool.id}: launcher not found at ${tmpResolvedInner} after extraction — keeping installed version`);
2985
+ recordArchiveExtractionDegradation(tool.id, archiveKind, "launcher-missing");
2986
+ logSessionStart(`archive-install ${tool.id}: ${archiveKind} launcher missing after extraction — keeping installed version`);
2638
2987
  await fs.rm(tmpExtractDir, { recursive: true, force: true }).catch(() => {});
2639
2988
  return;
2640
2989
  }
@@ -2665,7 +3014,19 @@ exec "${resolvedInner}" "$@"
2665
3014
  return;
2666
3015
  }
2667
3016
  }
2668
- async function installNpmTool(packageName, binaryName, verificationArgs = ["--version"], verificationTimeoutMs = 1e4) {
3017
+ function recordPackageManagerInstallException(toolId, strategyLabel, packageName, err) {
3018
+ const message = boundInstallError(err.message);
3019
+ logSessionStart(`auto-install ${strategyLabel} ${packageName}: exception: ${message}`);
3020
+ installFailureReasons.set(toolId, message);
3021
+ return;
3022
+ }
3023
+ const INSTALL_ERROR_LINE_LIMIT = 1000;
3024
+ const INSTALL_CANDIDATE_ERROR_LIMIT = 200;
3025
+ function boundInstallError(value, limit = INSTALL_ERROR_LINE_LIMIT) {
3026
+ const line = value.replace(/[\r\n]+/g, " ").trim();
3027
+ return line.length > limit ? `${line.slice(0, limit - 3)}...` : line;
3028
+ }
3029
+ async function installNpmTool(toolId, packageName, binaryName, verificationArgs = ["--version"], verificationTimeoutMs = 1e4, packageEntryOf) {
2669
3030
  try {
2670
3031
  await fs.mkdir(TOOLS_DIR, { recursive: true });
2671
3032
  const packageJsonPath = path.join(TOOLS_DIR, "package.json");
@@ -2725,11 +3086,15 @@ async function installNpmTool(packageName, binaryName, verificationArgs = ["--ve
2725
3086
  debugLog(`Verifying ${binaryName}...`);
2726
3087
  let isValid = false;
2727
3088
  let lastAttemptTransient = false;
3089
+ let lastAttemptInconclusive = false;
2728
3090
  for (let attempt = 1;attempt <= 3; attempt++) {
2729
3091
  lastAttemptTransient = false;
3092
+ lastAttemptInconclusive = false;
2730
3093
  isValid = await verifyToolBinary(binPath, undefined, () => {
2731
3094
  lastAttemptTransient = true;
2732
- }, verificationTimeoutMs, verificationArgs);
3095
+ }, verificationTimeoutMs, verificationArgs, packageEntryOf, () => {
3096
+ lastAttemptInconclusive = true;
3097
+ });
2733
3098
  if (isValid)
2734
3099
  break;
2735
3100
  if (attempt < 3) {
@@ -2737,6 +3102,13 @@ async function installNpmTool(packageName, binaryName, verificationArgs = ["--ve
2737
3102
  await new Promise((r) => setTimeout(r, 1000 * attempt));
2738
3103
  }
2739
3104
  }
3105
+ if (!isValid && lastAttemptInconclusive) {
3106
+ if (await verifyNpmPackageEntry(binPath, packageName)) {
3107
+ logSessionStart(`auto-install ${packageName}: verification inconclusive (output truncated before the transport-required marker) but the installed tree is intact; keeping installation for re-probe`);
3108
+ return;
3109
+ }
3110
+ logSessionStart(`auto-install ${packageName}: verification inconclusive AND the installed tree is incomplete; cleaning up so the next install can repair it`);
3111
+ }
2740
3112
  if (!isValid && lastAttemptTransient) {
2741
3113
  logSessionStart(`auto-install ${packageName}: verification inconclusive (transient); keeping installation for re-probe`);
2742
3114
  return;
@@ -2756,49 +3128,184 @@ async function installNpmTool(packageName, binaryName, verificationArgs = ["--ve
2756
3128
  }
2757
3129
  return binPath;
2758
3130
  } catch (err) {
2759
- logSessionStart(`auto-install npm ${packageName}: exception: ${err.message}`);
2760
- return;
3131
+ return recordPackageManagerInstallException(toolId, "npm", packageName, err);
2761
3132
  }
2762
3133
  }
2763
- async function installPipTool(packageName, options = {}) {
3134
+ export function pipCommandCandidates() {
3135
+ return process.platform === "win32" ? ["pip", "py", "python"] : ["pip3", "pip", "python3", "python"];
3136
+ }
3137
+ export function pipScriptsDir(base, platform = installerPlatform()) {
3138
+ return path.join(base, platform === "win32" ? "Scripts" : "bin");
3139
+ }
3140
+ const pipPep668LoggedRefusals = createGenerationMap("installer-pep668-log");
3141
+ async function pipConstraintEnvFor(toolId) {
3142
+ const constraints = TOOLS.find((t) => t.id === toolId)?.pipConstraints;
3143
+ if (!constraints || constraints.length === 0)
3144
+ return {};
3145
+ const directories = [
3146
+ path.join(getGlobalDmLensDir(), "pip-constraints"),
3147
+ path.join(os.tmpdir(), "dm-lens-pip-constraints")
3148
+ ];
3149
+ const directory = directories.find((candidate) => !/\s/.test(candidate));
3150
+ if (!directory) {
3151
+ recordDegradationOnce({
3152
+ kind: "pip-constraint-path-unusable",
3153
+ subject: toolId,
3154
+ reason: `no whitespace-free directory for the constraints file (tried ${directories.join(", ")}); installing unconstrained`
3155
+ });
3156
+ return {};
3157
+ }
3158
+ const file = path.join(directory, `${toolId}.txt`);
2764
3159
  try {
2765
- const isWindows = process.platform === "win32";
2766
- const verb = options.upgrade ? ["install", "-U", "--user"] : ["install", "--user"];
2767
- const pipCandidates = isWindows ? [
2768
- { command: "pip", args: [...verb, packageName] },
2769
- {
2770
- command: "py",
2771
- args: ["-m", "pip", ...verb, packageName]
2772
- },
2773
- {
2774
- command: "python",
2775
- args: ["-m", "pip", ...verb, packageName]
2776
- }
2777
- ] : [
2778
- { command: "pip3", args: [...verb, packageName] },
2779
- { command: "pip", args: [...verb, packageName] },
2780
- {
2781
- command: "python3",
2782
- args: ["-m", "pip", ...verb, packageName]
2783
- },
2784
- {
2785
- command: "python",
2786
- args: ["-m", "pip", ...verb, packageName]
3160
+ await fs.mkdir(path.dirname(file), { recursive: true });
3161
+ await writeFileAtomicAsync(file, `${constraints.join(`
3162
+ `)}
3163
+ `, {
3164
+ bestEffort: false
3165
+ });
3166
+ } catch (err) {
3167
+ recordDegradationOnce({
3168
+ kind: "pip-constraint-file-unwritable",
3169
+ subject: toolId,
3170
+ reason: `${file}: ${err instanceof Error ? err.message : String(err)}`
3171
+ });
3172
+ return {};
3173
+ }
3174
+ logSessionStart(`auto-install pip ${toolId}: constraining resolution with ${constraints.join(", ")} (${file})`);
3175
+ return { PIP_CONSTRAINT: file, UV_CONSTRAINT: file };
3176
+ }
3177
+ async function installPipTool(toolId, packageName, binaryName, options = {}) {
3178
+ try {
3179
+ const isWindows = installerPlatform() === "win32";
3180
+ const verb = options.upgrade ? ["install", "-U"] : ["install"];
3181
+ const pipConstraintEnv = await pipConstraintEnvFor(toolId);
3182
+ const pipCandidates = pipCommandCandidates().map((command) => ({
3183
+ command,
3184
+ args: command === "pip" || command === "pip3" ? [...verb, packageName] : ["-m", "pip", ...verb, packageName]
3185
+ }));
3186
+ const pep668 = /externally-managed-environment/i;
3187
+ const refuse = (strategy, reason) => {
3188
+ if (!pep668.test(reason))
3189
+ return;
3190
+ const subject = `${toolId}:${strategy}`;
3191
+ recordDegradationOnce({
3192
+ kind: "pip-pep668-strategy-refused",
3193
+ subject,
3194
+ reason
3195
+ });
3196
+ const logKey = `${getDegradationLedgerGeneration()}:${subject}`;
3197
+ if (pipPep668LoggedRefusals.current(logKey) === 0) {
3198
+ pipPep668LoggedRefusals.bump(logKey);
3199
+ logSessionStart(`auto-install pip ${packageName}: ${strategy} refused by PEP 668 (${boundInstallError(reason)})`);
2787
3200
  }
2788
- ];
2789
- let lastError = "";
2790
- for (const candidate of pipCandidates) {
2791
- const pipResult = await safeSpawnAsync(candidate.command, candidate.args, {
3201
+ };
3202
+ const succeeded = (strategy, binaryPath) => {
3203
+ recordDegradationOnce({
3204
+ kind: "pip-install-strategy-succeeded",
3205
+ subject: `${toolId}:${strategy}`,
3206
+ reason: binaryPath
3207
+ });
3208
+ return binaryPath;
3209
+ };
3210
+ const run = (command, args, env) => {
3211
+ const spawnEnv = Object.keys(pipConstraintEnv).length > 0 ? { ...env ?? process.env, ...pipConstraintEnv } : env;
3212
+ return safeSpawnAsync(command, args, {
2792
3213
  timeout: 120000,
2793
3214
  ignoreAmbientSignal: true,
2794
- lifetimeCoupled: true
3215
+ lifetimeCoupled: true,
3216
+ cwd: resolveToolCwd("runner", toolId, getGlobalDmLensDir(), {
3217
+ cwd: getGlobalDmLensDir(),
3218
+ suppressTelemetry: true
3219
+ }).cwd,
3220
+ ...spawnEnv ? { env: spawnEnv } : {}
2795
3221
  });
2796
- const outcome = {
2797
- ok: pipResult.status === 0,
2798
- error: (pipResult.error?.message ?? pipResult.stderr).trim()
2799
- };
2800
- if (outcome.ok) {
2801
- const userBaseResult = await new Promise((resolve) => {
3222
+ };
3223
+ const addBinToPath = async (binDir) => {
3224
+ try {
3225
+ await fs.access(binDir);
3226
+ } catch {
3227
+ return;
3228
+ }
3229
+ const currentPath = process.env.PATH || process.env.Path || "";
3230
+ const separator = isWindows ? ";" : path.delimiter;
3231
+ if (!currentPath.toLowerCase().split(separator).includes(binDir.toLowerCase())) {
3232
+ const updatedPath = `${binDir}${separator}${currentPath}`;
3233
+ process.env.PATH = updatedPath;
3234
+ if (isWindows)
3235
+ process.env.Path = updatedPath;
3236
+ }
3237
+ const names = isWindows ? [`${binaryName}.exe`, `${binaryName}.cmd`, binaryName] : [binaryName];
3238
+ for (const name of names) {
3239
+ const candidate = path.join(binDir, name);
3240
+ try {
3241
+ await fs.access(candidate);
3242
+ return candidate;
3243
+ } catch {}
3244
+ }
3245
+ return;
3246
+ };
3247
+ if (await isCommandAvailable("pipx")) {
3248
+ const result = await run("pipx", options.upgrade ? ["upgrade", packageName] : ["install", "--force", packageName]);
3249
+ const error = (result.error?.message ?? result.stderr).trim();
3250
+ if (result.status === 0) {
3251
+ const location = await run("pipx", [
3252
+ "environment",
3253
+ "--value",
3254
+ "PIPX_BIN_DIR"
3255
+ ]);
3256
+ const binDir = location.status === 0 && location.stdout.trim() ? location.stdout.trim() : path.join(os.homedir(), ".local", "bin");
3257
+ const binaryPath = await addBinToPath(binDir);
3258
+ if (binaryPath)
3259
+ return succeeded("pipx", binaryPath);
3260
+ throw new Error(`pipx installed ${packageName} but ${binaryName} is not resolvable`);
3261
+ }
3262
+ refuse("pipx", error);
3263
+ }
3264
+ const pythonCandidates = pipCandidates.filter(({ command }) => command === "python3" || command === "python" || command === "py");
3265
+ const pythonAvailability = await Promise.all(pythonCandidates.map(({ command }) => isCommandAvailable(command)));
3266
+ const availablePythonCandidates = pythonCandidates.filter((_, index) => pythonAvailability[index]);
3267
+ const venvRoot = path.join(getGlobalDmLensDir(), "pip-tools");
3268
+ for (const candidate of availablePythonCandidates) {
3269
+ const venvBin = pipScriptsDir(venvRoot, installerPlatform());
3270
+ let venvPip = path.join(venvBin, isWindows ? "pip.exe" : "pip");
3271
+ try {
3272
+ await fs.access(venvPip);
3273
+ } catch {
3274
+ const created = await run(candidate.command, ["-m", "venv", venvRoot]);
3275
+ const error = (created.error?.message ?? created.stderr).trim();
3276
+ if (created.status !== 0) {
3277
+ refuse("venv", error || "python venv module unavailable");
3278
+ continue;
3279
+ }
3280
+ }
3281
+ try {
3282
+ await fs.access(venvPip);
3283
+ } catch {
3284
+ venvPip = path.join(venvBin, isWindows ? "pip.cmd" : "pip3");
3285
+ try {
3286
+ await fs.access(venvPip);
3287
+ } catch {
3288
+ continue;
3289
+ }
3290
+ }
3291
+ const result = await run(venvPip, [...verb, packageName]);
3292
+ const error = (result.error?.message ?? result.stderr).trim();
3293
+ if (result.status === 0) {
3294
+ const binaryPath = await addBinToPath(venvBin);
3295
+ if (binaryPath)
3296
+ return succeeded("venv", binaryPath);
3297
+ throw new Error(`venv installed ${packageName} but ${binaryName} is not resolvable`);
3298
+ }
3299
+ refuse("venv", error);
3300
+ }
3301
+ const candidateErrors = [];
3302
+ let userRefused = false;
3303
+ for (const candidate of pipCandidates) {
3304
+ const args = candidate.command === "pip" || candidate.command === "pip3" ? [...verb, "--user", packageName] : ["-m", "pip", ...verb, "--user", packageName];
3305
+ const result = await run(candidate.command, args);
3306
+ const error = (result.error?.message ?? result.stderr).trim();
3307
+ if (result.status === 0) {
3308
+ const base = await new Promise((resolve) => {
2802
3309
  let probe;
2803
3310
  try {
2804
3311
  probe = spawn(candidate.command, ["-m", "site", "--user-base"], {
@@ -2809,66 +3316,52 @@ async function installPipTool(packageName, options = {}) {
2809
3316
  resolve("");
2810
3317
  return;
2811
3318
  }
2812
- let stdout = "";
2813
- probe.stdout?.on("data", (data) => stdout += data);
2814
- probe.on("exit", (code) => {
2815
- if (code === 0)
2816
- resolve(stdout.trim());
2817
- else
2818
- resolve("");
2819
- });
3319
+ const stdout = createBoundedOutputSink();
3320
+ probe.stdout?.on("data", (data) => stdout.append(data));
3321
+ probe.on("exit", (code) => resolve(userBaseProbeResult(candidate.command, code, stdout)));
2820
3322
  probe.on("error", () => resolve(""));
2821
3323
  });
2822
- if (userBaseResult) {
2823
- const candidateScriptDirs = [
2824
- path.join(userBaseResult, isWindows ? "Scripts" : "bin")
2825
- ];
2826
- if (isWindows) {
2827
- try {
2828
- const children = await fs.readdir(userBaseResult, {
2829
- withFileTypes: true
2830
- });
2831
- for (const entry of children) {
2832
- if (!entry.isDirectory())
2833
- continue;
2834
- if (!/^python\d+$/i.test(entry.name))
2835
- continue;
2836
- candidateScriptDirs.push(path.join(userBaseResult, entry.name, "Scripts"));
2837
- }
2838
- } catch {}
2839
- }
2840
- const currentPath = process.env.PATH || process.env.Path || process.env.path || "";
2841
- const separator = isWindows ? ";" : ":";
2842
- const normalizedPath = currentPath.toLowerCase().split(separator).map((p) => p.trim());
2843
- for (const scriptsDir of candidateScriptDirs) {
2844
- try {
2845
- await fs.access(scriptsDir);
2846
- if (!normalizedPath.includes(scriptsDir.toLowerCase())) {
2847
- const existingPath = process.env.PATH || process.env.Path || process.env.path || "";
2848
- const updatedPath = `${scriptsDir}${separator}${existingPath}`;
2849
- process.env.PATH = updatedPath;
2850
- if (isWindows) {
2851
- process.env.Path = updatedPath;
2852
- }
2853
- debugLog(`Added pip user scripts dir to PATH: ${scriptsDir}`);
2854
- }
2855
- } catch {
2856
- debugLog(`pip user scripts dir not accessible: ${scriptsDir}`);
2857
- }
2858
- }
2859
- }
2860
- return packageName;
3324
+ const binaryPath = base ? await addBinToPath(pipScriptsDir(base, installerPlatform())) : undefined;
3325
+ return succeeded("user", binaryPath ?? packageName);
3326
+ }
3327
+ const candidateError = `${candidate.command} ${args.join(" ")}: ${boundInstallError(error, INSTALL_CANDIDATE_ERROR_LIMIT)}`;
3328
+ candidateErrors.push(candidateError);
3329
+ if (pep668.test(error)) {
3330
+ userRefused = true;
3331
+ refuse("user", error);
2861
3332
  }
2862
- lastError = `${candidate.command} ${candidate.args.join(" ")}: ${outcome.error}`;
2863
- debugLog(`[pip-fallback] ${lastError}`);
2864
3333
  }
2865
- throw new Error(`Failed to install ${packageName}: no usable pip command found (${lastError || "unknown error"})`);
3334
+ if (!userRefused)
3335
+ throw new Error(`pip install failed: ${candidateErrors.join(" | ") || "unknown error"}`);
3336
+ const privateBase = path.join(getGlobalDmLensDir(), "pip-user");
3337
+ const privateEnv = { ...process.env, PYTHONUSERBASE: privateBase };
3338
+ for (const candidate of pipCandidates) {
3339
+ const args = candidate.command === "pip" || candidate.command === "pip3" ? [...verb, "--user", "--break-system-packages", packageName] : [
3340
+ "-m",
3341
+ "pip",
3342
+ ...verb,
3343
+ "--user",
3344
+ "--break-system-packages",
3345
+ packageName
3346
+ ];
3347
+ const result = await run(candidate.command, args, privateEnv);
3348
+ const error = (result.error?.message ?? result.stderr).trim();
3349
+ if (result.status !== 0) {
3350
+ const candidateError = `${candidate.command} ${args.join(" ")}: ${boundInstallError(error, INSTALL_CANDIDATE_ERROR_LIMIT)}`;
3351
+ candidateErrors.push(candidateError);
3352
+ continue;
3353
+ }
3354
+ const binaryPath = await addBinToPath(pipScriptsDir(privateBase, installerPlatform()));
3355
+ if (binaryPath)
3356
+ return succeeded("private-prefix", binaryPath);
3357
+ throw new Error(`private-prefix pip installed ${packageName} but ${binaryName} is not resolvable`);
3358
+ }
3359
+ throw new Error(`pip install failed: ${candidateErrors.join(" | ") || "unknown error"}`);
2866
3360
  } catch (err) {
2867
- logSessionStart(`auto-install pip ${packageName}: exception: ${err.message}`);
2868
- return;
3361
+ return recordPackageManagerInstallException(toolId, "pip", packageName, err);
2869
3362
  }
2870
3363
  }
2871
- async function installGemTool(packageName) {
3364
+ async function installGemTool(toolId, packageName) {
2872
3365
  try {
2873
3366
  const gemResult = await safeSpawnAsync("gem", ["install", packageName, "--no-document"], {
2874
3367
  timeout: 120000,
@@ -2884,8 +3377,7 @@ async function installGemTool(packageName) {
2884
3377
  }
2885
3378
  return packageName;
2886
3379
  } catch (err) {
2887
- logSessionStart(`auto-install gem ${packageName}: exception: ${err.message}`);
2888
- return;
3380
+ return recordPackageManagerInstallException(toolId, "gem", packageName, err);
2889
3381
  }
2890
3382
  }
2891
3383
  async function stampInstallResolution(toolId) {
@@ -2934,7 +3426,7 @@ export async function installTool(toolId) {
2934
3426
  case "npm": {
2935
3427
  if (!tool.packageName || !tool.binaryName)
2936
3428
  return false;
2937
- const npmPath = await installNpmTool(tool.packageName, tool.binaryName, tool.checkArgs, getToolVerificationTimeout(tool));
3429
+ const npmPath = await installNpmTool(tool.id, tool.packageName, tool.binaryName, tool.checkArgs, getToolVerificationTimeout(tool), packageEntryVerification(tool));
2938
3430
  if (npmPath !== undefined) {
2939
3431
  await import("./managed-tool-refresh.js").then((m) => m.stampManagedToolInstalled(tool.id, tool.packageName)).catch(() => {});
2940
3432
  }
@@ -2943,18 +3435,24 @@ export async function installTool(toolId) {
2943
3435
  case "pip": {
2944
3436
  if (!tool.packageName)
2945
3437
  return false;
2946
- const pipPath = await installPipTool(tool.packageName);
3438
+ const pipPath = await installPipTool(tool.id, tool.packageName, tool.binaryName ?? tool.id);
2947
3439
  return finishInstallAttempt(tool.id, pipPath !== undefined, startedAt);
2948
3440
  }
2949
3441
  case "gem": {
2950
3442
  if (!tool.packageName)
2951
3443
  return false;
2952
- const gemPath = await installGemTool(tool.packageName);
3444
+ const gemPath = await installGemTool(tool.id, tool.packageName);
2953
3445
  return finishInstallAttempt(tool.id, gemPath !== undefined, startedAt);
2954
3446
  }
2955
3447
  case "github": {
2956
3448
  if (!tool.github)
2957
3449
  return false;
3450
+ if (!tool.github.assetMatch(process.platform, process.arch)) {
3451
+ const reason = `unsupported platform=${process.platform} arch=${process.arch}`;
3452
+ noteInstallAttempt(tool.id, "unavailable", reason);
3453
+ logSessionStart(`auto-install ${tool.id}: ${reason}`);
3454
+ return false;
3455
+ }
2958
3456
  const ghPath = await installGitHubTool(tool);
2959
3457
  return finishInstallAttempt(tool.id, ghPath !== undefined, startedAt);
2960
3458
  }
@@ -2967,6 +3465,12 @@ export async function installTool(toolId) {
2967
3465
  case "archive": {
2968
3466
  if (!tool.archive)
2969
3467
  return false;
3468
+ if (!resolveArchiveUrl(tool.archive)) {
3469
+ const reason = `unsupported platform=${process.platform} arch=${process.arch}`;
3470
+ noteInstallAttempt(tool.id, "unavailable", reason);
3471
+ logSessionStart(`auto-install ${tool.id}: ${reason}`);
3472
+ return false;
3473
+ }
2970
3474
  const archivePath = await installArchiveTool(tool);
2971
3475
  return finishInstallAttempt(tool.id, archivePath !== undefined, startedAt);
2972
3476
  }
@@ -3191,6 +3695,8 @@ export function getToolInstallStrategy(toolId) {
3191
3695
  return TOOLS.find((tool) => tool.id === toolId)?.installStrategy;
3192
3696
  }
3193
3697
  export const GITHUB_TOOLS = [
3698
+ "cljfmt",
3699
+ "php-cs-fixer",
3194
3700
  "shellcheck",
3195
3701
  "shfmt",
3196
3702
  "rust-analyzer",
@@ -3213,6 +3719,8 @@ export const GITHUB_TOOLS = [
3213
3719
  "clojure-lsp",
3214
3720
  "cue",
3215
3721
  "gleam",
3722
+ "typstyle",
3723
+ "tinymist",
3216
3724
  "marksman",
3217
3725
  "expert"
3218
3726
  ];
@@ -3220,6 +3728,10 @@ export function resolveGitHubAsset(toolId, platform, arch) {
3220
3728
  const tool = TOOLS.find((t) => t.id === toolId);
3221
3729
  return tool?.github?.assetMatch(platform, arch);
3222
3730
  }
3731
+ export function resolveGitHubAssetLauncher(toolId, _platform, assetName) {
3732
+ const tool = TOOLS.find((t) => t.id === toolId);
3733
+ return tool?.github ? launcherForGitHubAsset(tool.github, assetName) : undefined;
3734
+ }
3223
3735
  export function resolveGitHubInstalledBinaryName(toolId, platform, assetName) {
3224
3736
  const tool = TOOLS.find((t) => t.id === toolId);
3225
3737
  if (!tool)