@duckmind/dm-linux-x64 0.65.5 → 0.65.6

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
@@ -3,34 +3,37 @@ import { randomUUID } from "node:crypto";
3
3
  import * as fs from "node:fs";
4
4
  import * as path from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
- import { createRequire } from "node:module";
6
+ import * as nodeModule from "node:module";
7
7
  import { discoverAgents, formatUnknownAgentError, unknownAgentDiagnosticContext } from "../../agents/agents.js";
8
- import { appendAgentRefinementOverlay } from "../../agents/agent-refinements.js";
9
- import { writePrivateAtomicJson } from "../../shared/atomic-json.js";
8
+ import { createAtomicJsonWriter, writePrivateAtomicJson } from "../../shared/atomic-json.js";
9
+ import { childCacheRetentionEnv } from "../../shared/child-cache-retention.js";
10
+ import { buildEffectiveSystemPrompt } from "../shared/effective-system-prompt.js";
10
11
  import { currentCompletionOwnerId } from "../../shared/completion-owner.js";
11
- import { planChildLaunch, resolveStepBehavior, suppressProgressForReadOnlyTask } from "../shared/child-launch-plan.js";
12
- import { applyThinkingSuffix, projectLaunchResolvedChildExtensions, resolvePiLaunchToolPlan } from "../shared/dm-args.js";
13
- import { injectOutputPathSystemPrompt, injectSingleOutputInstruction, normalizeSingleOutputOverride, resolveSingleOutputPath, validateFileOnlyOutputMode } from "../shared/single-output.js";
14
- import { buildChainInstructions, isDynamicParallelStep, isParallelStep, resolveExistingReadPaths, writeInitialProgressFile } from "../../shared/settings.js";
15
- import { resolvePiPackageRoot } from "../shared/dm-spawn.js";
12
+ import { planChildLaunch, projectChainOutputSchemas, resolveStepBehavior, suppressProgressForReadOnlyTask } from "../shared/child-launch-plan.js";
13
+ import { formatHerdrMachineRunnerUnsupported, resolveHerdrMachinePlacement } from "../shared/herdr-machine.js";
14
+ import { applyThinkingSuffix, projectLaunchResolvedChildExtensions, resolvePiLaunchToolPlan } from "../shared/child-tool-plan.js";
15
+ import { injectSingleOutputInstruction, normalizeSingleOutputOverride, resolveSingleOutputPath, validateFileOnlyOutputMode } from "../shared/single-output.js";
16
+ import { applyWatchdogLaunchRules, sendRuleViolationWarning } from "../../watchdog/rules.js";
17
+ import { buildChainInstructions, isDynamicParallelStep, isParallelStep, resolveExistingReadInstructionPaths, resolveExistingReadPaths, writeInitialProgressFile } from "../../shared/settings.js";
18
+ import { isDynamicRunnerGroup, isParallelGroup } from "../shared/parallel-utils.js";
19
+ import { DM_CODING_AGENT_PACKAGE, resolveBunPiExecutable, resolveInstalledPiPackageRoot, resolvePiPackageRoot } from "../shared/dm-spawn.js";
20
+ import { JITI_ALIAS_ENV, resolveHostPeerAliases } from "./runner-aliases.js";
16
21
  import { preflightLaunchCwd } from "../shared/launch-cwd.js";
17
22
  import { resolveNodeExecutable } from "../../shared/node-executable.js";
18
23
  import { backgroundProcessOptions } from "../shared/background-process-options.js";
19
- import { buildSkillInjection, normalizeSkillInput, resolveSkillsWithFallback } from "../../agents/skills.js";
20
- import { buildAgentMemoryInjection } from "../../agents/agent-memory.js";
24
+ import { normalizeSkillInput, resolveSkillsWithFallback } from "../../agents/skills.js";
21
25
  import { DM_CODING_AGENT_PACKAGE_ROOT_ENV, PROMPT_REDACTED, resolveChildCwd } from "../../shared/utils.js";
22
- import { buildModelCandidates, inheritsParentModel, resolveEffectiveSubagentModel, resolveSubagentModelOverride } from "../shared/model-fallback.js";
26
+ import { resolveEffectiveSubagentModel, resolveModelOrigin, resolveModelSelection, resolveSubagentModelOverride } from "../shared/model-resolution.js";
23
27
  import { resolveToolTimeoutMs, toolTimeoutFromEnv } from "../shared/tool-timeout.js";
24
28
  import { resolveModelScopesForAgent } from "../shared/model-scope.js";
25
29
  import { findModelInfo, resolveEffectiveThinking } from "../../shared/model-info.js";
26
- import { assertThinkingWithinCeiling, decodeThinkingCeiling, intersectThinkingCeilings, SUBAGENT_THINKING_CEILING_ENV } from "../../shared/thinking-ceiling.js";
27
- import { resolveExpectedWorktreeAgentCwd } from "../shared/worktree.js";
30
+ import { assertThinkingWithinCeiling, intersectThinkingCeilings } from "../../shared/thinking-ceiling.js";
31
+ import { resolveExpectedWorktreeAgentCwd, resolveWorktreeProvider, shouldDeferWorktreeCwd, WORKTREE_AGENT_CWD_PLACEHOLDER } from "../shared/worktree.js";
28
32
  import { buildWorkflowGraphSnapshot } from "../shared/workflow-graph.js";
29
33
  import { ChainOutputValidationError, validateChainOutputBindings } from "../shared/chain-outputs.js";
30
34
  import { createStructuredOutputRuntime } from "../shared/structured-output.js";
31
- import { resolveEffectiveAcceptance, validateAcceptanceInput, validateExecutionAcceptance } from "../shared/acceptance.js";
35
+ import { resolveAcceptanceReportMode, resolveEffectiveAcceptance, validateAcceptanceInput, validateExecutionAcceptance } from "../shared/acceptance.js";
32
36
  import { createRunFanoutBudget, writeRunFanoutBudgetDescriptor } from "../shared/run-fanout-budget.js";
33
- import { validateImplementationToolContract } from "../shared/completion-guard.js";
34
37
  import {
35
38
  DIRS,
36
39
  SUBAGENT_ASYNC_STARTED_EVENT,
@@ -39,20 +42,30 @@ import {
39
42
  getAsyncConfigPath,
40
43
  resolveChildMaxSubagentDepth
41
44
  } from "../../shared/types.js";
42
- import { nestedResultsPath, nestedSummaryFromAsyncStatus, resolveInheritedNestedRouteFromEnv, resolveNestedParentAddressFromEnv, writeNestedEvent } from "../shared/nested-events.js";
45
+ import { inheritedNestedParentAddressOf, inheritedNestedRouteOf, nestedResultsPath, nestedSummaryFromAsyncStatus, writeNestedEvent } from "../shared/nested-events.js";
46
+ import { SUBAGENT_PARENT_SESSION_ENV } from "../shared/child-runtime-config.js";
47
+ import { childSessionFactoryModule } from "../shared/child-session.js";
48
+ import { inheritedChildRuntime } from "../shared/child-launch.js";
43
49
  import { resultFilePath } from "./result-files.js";
50
+ import { updateActiveRunIndex } from "./active-run-index.js";
44
51
  import { validateToolBudgetConfig } from "../shared/tool-budget.js";
45
52
  import { usageBudgetState } from "../shared/usage-budget.js";
46
- import { finalizeProcessTerminal, readProcessTerminal } from "./process-terminal.js";
53
+ import { finalizeProcessTerminal, initializeProcessTerminal, readProcessTerminal } from "./process-terminal.js";
54
+ import { persistRunnerStartupFailure } from "./runner-startup-failure.js";
47
55
  import { statusStepDescription } from "./chain-append.js";
48
56
  import { SUBAGENT_PROCESS_TERMINAL_EVENT } from "../../shared/types.js";
49
- import { assertAgentAllowedByCapabilityCeiling, decodeSubagentCapabilityCeiling, intersectSubagentCapabilityCeilings, resolveCurrentSubagentCapabilityCeiling, SUBAGENT_CAPABILITY_CEILING_ENV } from "../shared/capability-ceiling.js";
50
- import { agentDefinitionDigest, launchBindingDigest } from "../../shared/launch-contract.js";
57
+ import { assertAgentAllowedByCapabilityCeiling, intersectSubagentCapabilityCeilings, resolveCurrentSubagentCapabilityCeiling } from "../shared/capability-ceiling.js";
58
+ import { resolveLaunchBinding } from "../../shared/launch-contract.js";
51
59
  import { resolvePermissionRules } from "../shared/permissions.js";
52
60
  import { normalizeExtensionBindings, omitExtensionBindingsEnv } from "../shared/extension-bindings.js";
61
+ import { omitGitRoutingEnv } from "../shared/git-environment.js";
53
62
  import { assertWorkflowLaneKey, normalizeWorkflowLaneMetadata } from "../shared/lane-metadata.js";
54
- const require = createRequire(import.meta.url);
55
- const piPackageRoot = resolvePiPackageRoot();
63
+ import { resolveRequiredChildExtensions } from "../../shared/required-child-extensions.js";
64
+ const require = nodeModule.createRequire(import.meta.url);
65
+ const piPackageRoot = resolveAsyncPiPackageRoot();
66
+ function resolveAsyncPiPackageRoot(env = process.env) {
67
+ return resolvePiPackageRoot() || env[DM_CODING_AGENT_PACKAGE_ROOT_ENV]?.trim() || resolveInstalledPiPackageRoot();
68
+ }
56
69
  function resolveJitiCliFromPackageJson(packageJsonPath) {
57
70
  if (!fs.existsSync(packageJsonPath))
58
71
  return;
@@ -71,12 +84,12 @@ function resolveJitiCliFromPackageJson(packageJsonPath) {
71
84
  function resolveJitiCliPath() {
72
85
  const candidates = [
73
86
  () => require.resolve("jiti/package.json"),
74
- () => piPackageRoot ? createRequire(path.join(piPackageRoot, "package.json")).resolve("jiti/package.json") : undefined,
87
+ () => piPackageRoot ? nodeModule.createRequire(path.join(piPackageRoot, "package.json")).resolve("jiti/package.json") : undefined,
75
88
  () => {
76
89
  if (!process.argv[1])
77
90
  return;
78
91
  const piEntry = fs.realpathSync(process.argv[1]);
79
- return createRequire(piEntry).resolve("jiti/package.json");
92
+ return nodeModule.createRequire(piEntry).resolve("jiti/package.json");
80
93
  },
81
94
  () => piPackageRoot ? path.join(piPackageRoot, "node_modules", "jiti", "package.json") : undefined
82
95
  ];
@@ -93,6 +106,11 @@ function resolveJitiCliPath() {
93
106
  return;
94
107
  }
95
108
  const jitiCliPath = resolveJitiCliPath();
109
+ const asyncRunnerSourcePath = path.join(path.dirname(fileURLToPath(import.meta.url)), `subagent-runner-bootstrap${path.extname(fileURLToPath(import.meta.url))}`);
110
+ const sourceUnderNodeModules = asyncRunnerSourcePath.split(path.sep).some((segment) => segment.toLowerCase() === "node_modules");
111
+ function supportsNativeRunner(nodeExecutable) {
112
+ return Boolean(process.features.typescript) && typeof nodeModule.registerHooks === "function" && nodeExecutable === process.execPath && !sourceUnderNodeModules;
113
+ }
96
114
  export const DEFAULT_ASYNC_TIMEOUT_MS = 30 * 60 * 1000;
97
115
  export function formatAsyncStartedMessage(headline, interactive) {
98
116
  const guidance = interactive ? [
@@ -110,7 +128,7 @@ export function formatAsyncStartedMessage(headline, interactive) {
110
128
  `);
111
129
  }
112
130
  export function isAsyncAvailable() {
113
- return jitiCliPath !== undefined;
131
+ return resolveBunPiExecutable() !== undefined || supportsNativeRunner(resolveNodeExecutable()) || jitiCliPath !== undefined;
114
132
  }
115
133
  export function resolveAsyncRunnerLogPaths(cfg) {
116
134
  const asyncDir = typeof cfg.asyncDir === "string" ? cfg.asyncDir : undefined;
@@ -129,15 +147,8 @@ function closeFd(fd) {
129
147
  } catch {}
130
148
  }
131
149
  const RUNNER_STARTUP_TIMEOUT_MS = 1e4;
132
- const RUNNER_STARTUP_WAIT_BUFFER = typeof SharedArrayBuffer !== "undefined" ? new SharedArrayBuffer(4) : undefined;
133
- const RUNNER_STARTUP_WAIT_VIEW = RUNNER_STARTUP_WAIT_BUFFER ? new Int32Array(RUNNER_STARTUP_WAIT_BUFFER) : undefined;
134
150
  function waitForStartupInterval(delayMs = 20) {
135
- if (RUNNER_STARTUP_WAIT_VIEW) {
136
- Atomics.wait(RUNNER_STARTUP_WAIT_VIEW, 0, 0, delayMs);
137
- return;
138
- }
139
- const waitUntil = Date.now() + delayMs;
140
- while (Date.now() < waitUntil) {}
151
+ return new Promise((resolve) => setTimeout(resolve, delayMs));
141
152
  }
142
153
  function readRunnerStartup(startupPath, expectedState, expectedToken) {
143
154
  if (!fs.existsSync(startupPath))
@@ -156,23 +167,48 @@ function readRunnerStartup(startupPath, expectedState, expectedToken) {
156
167
  return { ok: false, error: `Failed to read async runner startup handshake '${startupPath}': ${error instanceof Error ? error.message : String(error)}`, startupDidNotProceed: true };
157
168
  }
158
169
  }
159
- function waitForRunnerStartup(startupPath, expectedState, timeoutMs, expectedToken) {
170
+ async function waitForRunnerStartup(startupPath, expectedState, timeoutMs, expectedToken, processClosed) {
171
+ const confirmOpen = async (result) => {
172
+ if (!processClosed || result.ok === false)
173
+ return result;
174
+ const outcome = await Promise.race([processClosed.then((exit) => ({ exit })), new Promise((resolve) => setImmediate(() => resolve(undefined)))]);
175
+ if (!outcome)
176
+ return result;
177
+ const finalResult = readRunnerStartup(startupPath, expectedState, expectedToken);
178
+ if (finalResult?.ok === false)
179
+ return finalResult;
180
+ const { exitCode, signal } = outcome.exit;
181
+ return { ok: false, error: `Async runner exited before startup state '${expectedState}' (exit code ${exitCode ?? "unknown"}, signal ${signal ?? "none"}).`, startupDidNotProceed: true };
182
+ };
160
183
  const deadline = Date.now() + timeoutMs;
161
- for (;; ) {
184
+ while (Date.now() <= deadline) {
162
185
  const result = readRunnerStartup(startupPath, expectedState, expectedToken);
163
186
  if (result)
164
- return result;
165
- if (Date.now() >= deadline)
166
- break;
167
- waitForStartupInterval(Math.min(20, Math.max(1, deadline - Date.now())));
187
+ return await confirmOpen(result);
188
+ const delay = waitForStartupInterval(Math.min(20, Math.max(1, deadline - Date.now())));
189
+ if (processClosed) {
190
+ const outcome = await Promise.race([delay.then(() => {
191
+ return;
192
+ }), processClosed.then((exit) => ({ exit }))]);
193
+ if (outcome) {
194
+ const finalResult = readRunnerStartup(startupPath, expectedState, expectedToken);
195
+ if (finalResult?.ok === false)
196
+ return finalResult;
197
+ const { exitCode, signal } = outcome.exit;
198
+ return { ok: false, error: `Async runner exited before startup state '${expectedState}' (exit code ${exitCode ?? "unknown"}, signal ${signal ?? "none"}).`, startupDidNotProceed: true };
199
+ }
200
+ } else {
201
+ await delay;
202
+ }
168
203
  }
169
204
  const finalResult = readRunnerStartup(startupPath, expectedState, expectedToken);
170
205
  if (finalResult)
171
206
  return finalResult;
172
207
  return { ok: false, error: `Timed out after ${timeoutMs}ms waiting for the async runner startup state '${expectedState}'.`, startupDidNotProceed: true };
173
208
  }
209
+ const writePrivateStartupControlJson = createAtomicJsonWriter({ mode: 384, ignoreCleanupErrorAfterSuccess: true });
174
210
  function writeRunnerStartupControl(filePath, payload) {
175
- writePrivateAtomicJson(filePath, payload);
211
+ writePrivateStartupControlJson(filePath, payload);
176
212
  }
177
213
  function runnerIsAlive(pid) {
178
214
  try {
@@ -182,6 +218,10 @@ function runnerIsAlive(pid) {
182
218
  return error.code === "EPERM";
183
219
  }
184
220
  }
221
+ function waitForStartupIntervalSync(delayMs = 20) {
222
+ const waitUntil = Date.now() + delayMs;
223
+ while (Date.now() < waitUntil) {}
224
+ }
185
225
  function terminateRunnerBeforeProceed(pid) {
186
226
  for (const signal of ["SIGTERM", "SIGKILL"]) {
187
227
  if (!runnerIsAlive(pid))
@@ -194,40 +234,92 @@ function terminateRunnerBeforeProceed(pid) {
194
234
  }
195
235
  const deadline = Date.now() + 1000;
196
236
  while (runnerIsAlive(pid) && Date.now() < deadline)
197
- waitForStartupInterval();
237
+ waitForStartupIntervalSync();
198
238
  }
199
239
  return !runnerIsAlive(pid);
200
240
  }
201
- function persistPreProceedStartupFailure(asyncDir, runId, runnerProcessInstanceId, sessionId, completionOwnerId, message) {
202
- const now = Date.now();
241
+ async function terminateRunnerBeforeProceedAsync(proc, processClosed) {
242
+ for (const signal of ["SIGTERM", "SIGKILL"]) {
243
+ if (proc.pid === undefined || !runnerIsAlive(proc.pid))
244
+ return true;
245
+ try {
246
+ process.kill(proc.pid, signal);
247
+ } catch {
248
+ if (proc.pid === undefined || !runnerIsAlive(proc.pid))
249
+ return true;
250
+ }
251
+ const exited = await Promise.race([processClosed.then(() => true), waitForStartupInterval(1000).then(() => false)]);
252
+ if (exited || proc.pid === undefined || !runnerIsAlive(proc.pid))
253
+ return true;
254
+ }
255
+ return proc.pid === undefined || !runnerIsAlive(proc.pid);
256
+ }
257
+ async function completeRunnerStartupHandshake(startupPath, startupAckPath, startupConfirmPath, startupProceedPath, proc, processClosed, getObservedProcessExit, runnerProcessInstanceId, persistStartupFailure) {
203
258
  try {
204
- const statusPath = path.join(asyncDir, "status.json");
205
- let status = {};
259
+ const ready = await waitForRunnerStartup(startupPath, "ready", RUNNER_STARTUP_TIMEOUT_MS, undefined, processClosed);
260
+ if (ready.ok === false) {
261
+ persistStartupFailure(ready.error);
262
+ const terminationObserved = await terminateRunnerBeforeProceedAsync(proc, processClosed);
263
+ return { pid: proc.pid, runnerProcessInstanceId, error: ready.error, terminationObserved, startupDidNotProceed: true };
264
+ }
206
265
  try {
207
- status = JSON.parse(fs.readFileSync(statusPath, "utf-8"));
266
+ writeRunnerStartupControl(startupAckPath, { action: "ack", token: ready.token });
267
+ } catch (error) {
268
+ const message = `Failed to acknowledge async runner startup: ${error instanceof Error ? error.message : String(error)}`;
269
+ persistStartupFailure(message);
270
+ const terminationObserved = await terminateRunnerBeforeProceedAsync(proc, processClosed);
271
+ return { pid: proc.pid, runnerProcessInstanceId, error: message, terminationObserved, startupDidNotProceed: true };
272
+ }
273
+ const acknowledged = await waitForRunnerStartup(startupPath, "acknowledged", RUNNER_STARTUP_TIMEOUT_MS, ready.token, processClosed);
274
+ if (acknowledged.ok === false) {
275
+ persistStartupFailure(acknowledged.error);
276
+ const terminationObserved = await terminateRunnerBeforeProceedAsync(proc, processClosed);
277
+ return { pid: proc.pid, runnerProcessInstanceId, error: acknowledged.error, terminationObserved, startupDidNotProceed: true };
278
+ }
279
+ try {
280
+ writeRunnerStartupControl(startupConfirmPath, { action: "confirm", token: ready.token });
281
+ } catch (error) {
282
+ const message = `Failed to confirm async runner startup: ${error instanceof Error ? error.message : String(error)}`;
283
+ persistStartupFailure(message);
284
+ const terminationObserved = await terminateRunnerBeforeProceedAsync(proc, processClosed);
285
+ return { pid: proc.pid, runnerProcessInstanceId, error: message, terminationObserved, startupDidNotProceed: true };
286
+ }
287
+ const confirmed = await waitForRunnerStartup(startupPath, "confirmed", RUNNER_STARTUP_TIMEOUT_MS, ready.token, processClosed);
288
+ if (confirmed.ok === false) {
289
+ persistStartupFailure(confirmed.error);
290
+ const terminationObserved = await terminateRunnerBeforeProceedAsync(proc, processClosed);
291
+ return { pid: proc.pid, runnerProcessInstanceId, error: confirmed.error, terminationObserved, startupDidNotProceed: true };
292
+ }
293
+ const closedAtCommit = await Promise.race([
294
+ processClosed.then((exit) => exit),
295
+ new Promise((resolve) => setImmediate(() => resolve(undefined)))
296
+ ]);
297
+ const observedExit = closedAtCommit ?? getObservedProcessExit();
298
+ if (observedExit) {
299
+ const message = `Async runner exited after startup state 'acknowledged' before proceed (exit code ${observedExit.exitCode ?? "unknown"}, signal ${observedExit.signal ?? "none"}).`;
300
+ persistStartupFailure(message);
301
+ const terminationObserved = await terminateRunnerBeforeProceedAsync(proc, processClosed);
302
+ return { pid: proc.pid, runnerProcessInstanceId, error: message, terminationObserved, startupDidNotProceed: true };
303
+ }
304
+ try {
305
+ writeRunnerStartupControl(startupProceedPath, { action: "proceed", token: ready.token });
306
+ } catch (error) {
307
+ const message = `Failed to authorize async runner startup: ${error instanceof Error ? error.message : String(error)}`;
308
+ persistStartupFailure(message);
309
+ const terminationObserved = await terminateRunnerBeforeProceedAsync(proc, processClosed);
310
+ return { pid: proc.pid, runnerProcessInstanceId, error: message, terminationObserved, startupDidNotProceed: true };
311
+ }
312
+ try {
313
+ fs.rmSync(startupPath, { force: true });
208
314
  } catch {}
209
- writePrivateAtomicJson(statusPath, {
210
- ...status,
211
- runId,
212
- ...sessionId ? { sessionId } : {},
213
- ...completionOwnerId ? { completionOwnerId } : {},
214
- state: "failed",
215
- lastUpdate: now,
216
- error: message,
217
- processTerminal: {
218
- version: 1,
219
- state: "not-started",
220
- runId,
221
- runnerProcessInstanceId
222
- }
223
- });
224
- writePrivateAtomicJson(path.join(asyncDir, "process-terminal-candidate.json"), {
225
- version: 1,
226
- runId,
227
- runnerProcessInstanceId,
228
- writers: {},
229
- expectedWriters: { 0: 0 }
230
- });
315
+ return { pid: proc.pid, runnerProcessInstanceId };
316
+ } finally {
317
+ await new Promise((resolve) => setImmediate(resolve));
318
+ }
319
+ }
320
+ function persistPreProceedStartupFailure(asyncDir, runId, runnerProcessInstanceId, sessionId, completionOwnerId, message) {
321
+ try {
322
+ persistRunnerStartupFailure({ asyncDir, runId, runnerProcessInstanceId, sessionId, completionOwnerId, message });
231
323
  } catch {}
232
324
  }
233
325
  function isStaleExtensionContextError(error) {
@@ -242,12 +334,36 @@ export function emitProcessTerminalEvent(ctx, proof) {
242
334
  console.error("Failed to emit subagent process-terminal event:", error);
243
335
  }
244
336
  }
245
- function spawnRunner(cfg, suffix, cwd, initialStatus, initialStatusPath, onProcessTerminal, requestedCwd = cwd) {
337
+ function spawnRunner(cfg, suffix, cwd, initialStatus, initialStatusPath, launchParentSessionId, onProcessTerminal, onBeforeProceed, requestedCwd = cwd) {
246
338
  const cwdError = preflightLaunchCwd(requestedCwd, cwd);
247
339
  if (cwdError)
248
340
  return { error: cwdError };
249
- if (!jitiCliPath) {
250
- return { error: "upstream jiti for TypeScript execution could not be found; ensure package dependencies are installed" };
341
+ if (launchParentSessionId !== undefined && (!launchParentSessionId || launchParentSessionId.trim() !== launchParentSessionId)) {
342
+ return { error: "Background runner parent session identity is invalid." };
343
+ }
344
+ const steps = cfg.steps;
345
+ if (!Array.isArray(steps))
346
+ return { error: "Background runner launch is missing its steps." };
347
+ const inconsistentParent = steps.some((step) => isParallelGroup(step) ? step.parallel.some((child) => child.parentSessionId !== launchParentSessionId) : (isDynamicRunnerGroup(step) ? step.parallel.parentSessionId : step.parentSessionId) !== launchParentSessionId);
348
+ if (inconsistentParent)
349
+ return { error: "Background runner steps have inconsistent parent session identities." };
350
+ const binaryHost = resolveBunPiExecutable();
351
+ const nodeExecutable = resolveNodeExecutable();
352
+ const nativeRunnerSupported = supportsNativeRunner(nodeExecutable);
353
+ const runner = asyncRunnerSourcePath;
354
+ const runnerIsJavaScript = path.extname(runner) === ".js";
355
+ const bootstrap = path.join(path.dirname(runner), `binary-bootstrap${path.extname(fileURLToPath(import.meta.url))}`);
356
+ if (binaryHost && !fs.existsSync(bootstrap))
357
+ return { error: `Background runner bootstrap not found: ${bootstrap}` };
358
+ if (!binaryHost && !runnerIsJavaScript && !nativeRunnerSupported && !jitiCliPath) {
359
+ return { error: sourceUnderNodeModules ? "Background runner source is installed under node_modules, so upstream jiti is required for TypeScript execution." : "Background runner requires enabled native TypeScript with synchronous module hooks, or installed upstream jiti for TypeScript execution." };
360
+ }
361
+ if (!binaryHost && !piPackageRoot) {
362
+ return { error: `Background children require a supported standalone DM host or the installed npm package (${DM_CODING_AGENT_PACKAGE}); neither is available.` };
363
+ }
364
+ const hostPeerAliases = !binaryHost && piPackageRoot ? resolveHostPeerAliases(piPackageRoot) : { aliases: {}, missing: [] };
365
+ if (hostPeerAliases.missing.length > 0) {
366
+ return { error: `Background children require the host npm package (${DM_CODING_AGENT_PACKAGE}) with its dependencies; ${piPackageRoot} does not provide ${hostPeerAliases.missing.join(", ")}.` };
251
367
  }
252
368
  fs.mkdirSync(TEMP_ROOT_DIR, { recursive: true });
253
369
  const cfgPath = getAsyncConfigPath(suffix);
@@ -256,8 +372,7 @@ function spawnRunner(cfg, suffix, cwd, initialStatus, initialStatusPath, onProce
256
372
  const launchBarrierToken = hasRevivalLease ? undefined : runnerProcessInstanceId;
257
373
  const launchConfig = { ...cfg, runnerProcessInstanceId, ...launchBarrierToken ? { launchBarrierToken } : {} };
258
374
  writePrivateAtomicJson(cfgPath, launchConfig);
259
- const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.js");
260
- const nodeCommand = resolveNodeExecutable();
375
+ const command = binaryHost ?? nodeExecutable;
261
376
  const launchForStartup = launchConfig;
262
377
  const launchAsyncDir = typeof launchForStartup.asyncDir === "string" ? launchForStartup.asyncDir : undefined;
263
378
  const launchRunId = typeof launchForStartup.id === "string" ? launchForStartup.id : suffix;
@@ -265,11 +380,14 @@ function spawnRunner(cfg, suffix, cwd, initialStatus, initialStatusPath, onProce
265
380
  const launchCompletionOwnerId = typeof launchForStartup.completionOwnerId === "string" ? launchForStartup.completionOwnerId : undefined;
266
381
  const startupPath = typeof launchForStartup.revivalLease === "object" && launchAsyncDir ? path.join(launchAsyncDir, "runner-startup.json") : undefined;
267
382
  const startupAckPath = startupPath ? path.join(path.dirname(startupPath), "runner-startup-ack.json") : undefined;
383
+ const startupConfirmPath = startupPath ? path.join(path.dirname(startupPath), "runner-startup-confirm.json") : undefined;
268
384
  const startupProceedPath = launchAsyncDir && (startupPath || launchBarrierToken) ? path.join(launchAsyncDir, "runner-startup-proceed.json") : undefined;
269
385
  if (startupPath)
270
386
  fs.rmSync(startupPath, { force: true });
271
387
  if (startupAckPath)
272
388
  fs.rmSync(startupAckPath, { force: true });
389
+ if (startupConfirmPath)
390
+ fs.rmSync(startupConfirmPath, { force: true });
273
391
  if (startupProceedPath)
274
392
  fs.rmSync(startupProceedPath, { force: true });
275
393
  const logPaths = resolveAsyncRunnerLogPaths(launchConfig);
@@ -281,14 +399,36 @@ function spawnRunner(cfg, suffix, cwd, initialStatus, initialStatusPath, onProce
281
399
  stdoutFd = fs.openSync(logPaths.stdoutPath, "a");
282
400
  stderrFd = fs.openSync(logPaths.stderrPath, "a");
283
401
  }
284
- const proc = spawn(nodeCommand, [jitiCliPath, runner, cfgPath], {
402
+ const preload = Object.keys(hostPeerAliases.aliases).length > 0 ? ["--import", new URL("../../../runner-peer-preload.mjs", import.meta.url).href] : [];
403
+ const args = binaryHost ? ["--no-extensions", "--no-skills", "--no-prompt-templates", "--no-session", "--mode", "rpc", "--extension", bootstrap] : runnerIsJavaScript ? [...preload, runner, cfgPath] : nativeRunnerSupported ? [...preload, "--experimental-strip-types", runner, cfgPath] : [...preload, jitiCliPath, runner, cfgPath];
404
+ const runnerEnv = {
405
+ ...omitGitRoutingEnv(omitExtensionBindingsEnv(process.env)),
406
+ ...childCacheRetentionEnv(),
407
+ [DM_CODING_AGENT_PACKAGE_ROOT_ENV]: binaryHost ? undefined : piPackageRoot,
408
+ PI_PACKAGE_DIR: binaryHost ? process.env.PI_PACKAGE_DIR : piPackageRoot,
409
+ [JITI_ALIAS_ENV]: binaryHost ? undefined : JSON.stringify(hostPeerAliases.aliases),
410
+ PI_ASYNC_NATIVE_RUNNER: !binaryHost && (runnerIsJavaScript || nativeRunnerSupported) ? "1" : "0",
411
+ DM_SUBAGENT_RUNNER_CONFIG: binaryHost ? cfgPath : undefined
412
+ };
413
+ if (launchParentSessionId === undefined)
414
+ delete runnerEnv[SUBAGENT_PARENT_SESSION_ENV];
415
+ else
416
+ runnerEnv[SUBAGENT_PARENT_SESSION_ENV] = launchParentSessionId;
417
+ const proc = spawn(command, args, {
285
418
  cwd,
286
419
  ...backgroundProcessOptions(),
287
420
  stdio: ["ignore", stdoutFd ?? "ignore", stderrFd ?? "ignore"],
288
- env: {
289
- ...omitExtensionBindingsEnv(process.env),
290
- ...piPackageRoot ? { [DM_CODING_AGENT_PACKAGE_ROOT_ENV]: piPackageRoot } : {}
291
- }
421
+ env: runnerEnv
422
+ });
423
+ let observedProcessExit;
424
+ proc.once("exit", (exitCode, signal) => {
425
+ observedProcessExit = { exitCode, signal };
426
+ });
427
+ const processClosed = new Promise((resolve) => {
428
+ proc.once("close", (exitCode, signal) => {
429
+ observedProcessExit ??= { exitCode, signal };
430
+ resolve({ exitCode, signal });
431
+ });
292
432
  });
293
433
  closeFd(stdoutFd);
294
434
  closeFd(stderrFd);
@@ -296,56 +436,62 @@ function spawnRunner(cfg, suffix, cwd, initialStatus, initialStatusPath, onProce
296
436
  console.error(`[dm-subagents] async spawn failed: ${error.message}`);
297
437
  });
298
438
  proc.once("close", (exitCode, signal) => {
299
- const launch = launchConfig;
300
- const asyncDir = launch.asyncDir;
301
- const runId = launch.id;
302
- if (typeof asyncDir !== "string" || typeof runId !== "string")
303
- return;
304
- finalizeProcessTerminal(asyncDir, runId, {
305
- processInstanceId: runnerProcessInstanceId,
306
- closeObservedAt: Date.now(),
307
- exitCode,
308
- signal
309
- });
310
- const persisted = readProcessTerminal(asyncDir, { runId, runnerProcessInstanceId });
311
- if (!persisted)
312
- return;
313
- if (launch.nestedRoute && launch.nestedSelf) {
314
- try {
315
- let status;
439
+ const finalize = () => {
440
+ const launch = launchConfig;
441
+ const asyncDir = launch.asyncDir;
442
+ const runId = launch.id;
443
+ if (typeof asyncDir !== "string" || typeof runId !== "string")
444
+ return;
445
+ finalizeProcessTerminal(asyncDir, runId, {
446
+ processInstanceId: runnerProcessInstanceId,
447
+ closeObservedAt: Date.now(),
448
+ exitCode,
449
+ signal
450
+ });
451
+ const persisted = readProcessTerminal(asyncDir, { runId, runnerProcessInstanceId });
452
+ if (!persisted)
453
+ return;
454
+ if (launch.nestedRoute && launch.nestedSelf) {
316
455
  try {
317
- status = JSON.parse(fs.readFileSync(path.join(asyncDir, "status.json"), "utf-8"));
318
- status.processTerminal = persisted;
319
- } catch {
320
- status = {
321
- runId,
322
- mode: "single",
323
- state: persisted.state === "observed" ? "complete" : "failed",
324
- startedAt: persisted.observedAt ?? Date.now(),
325
- lastUpdate: Date.now(),
326
- processTerminal: persisted
327
- };
328
- }
329
- writeNestedEvent(launch.nestedRoute, {
330
- type: "subagent.nested.completed",
331
- ts: Date.now(),
332
- parentRunId: launch.nestedSelf.parentRunId,
333
- parentStepIndex: launch.nestedSelf.parentStepIndex,
334
- child: nestedSummaryFromAsyncStatus(status, asyncDir, {
335
- id: runId,
456
+ let status;
457
+ try {
458
+ status = JSON.parse(fs.readFileSync(path.join(asyncDir, "status.json"), "utf-8"));
459
+ status.processTerminal = persisted;
460
+ } catch {
461
+ status = {
462
+ runId,
463
+ mode: "single",
464
+ state: persisted.state === "observed" ? "complete" : "failed",
465
+ startedAt: persisted.observedAt ?? Date.now(),
466
+ lastUpdate: Date.now(),
467
+ processTerminal: persisted
468
+ };
469
+ }
470
+ writeNestedEvent(launch.nestedRoute, {
471
+ type: "subagent.nested.completed",
472
+ ts: Date.now(),
336
473
  parentRunId: launch.nestedSelf.parentRunId,
337
474
  parentStepIndex: launch.nestedSelf.parentStepIndex,
338
- depth: launch.nestedSelf.depth,
339
- path: launch.nestedSelf.path,
340
- mode: status.mode,
341
- ts: Date.now()
342
- })
343
- });
344
- } catch (error) {
345
- console.error("Failed to emit final nested process-terminal status:", error);
475
+ child: nestedSummaryFromAsyncStatus(status, asyncDir, {
476
+ id: runId,
477
+ parentRunId: launch.nestedSelf.parentRunId,
478
+ parentStepIndex: launch.nestedSelf.parentStepIndex,
479
+ depth: launch.nestedSelf.depth,
480
+ path: launch.nestedSelf.path,
481
+ mode: status.mode,
482
+ ts: Date.now()
483
+ })
484
+ });
485
+ } catch (error) {
486
+ console.error("Failed to emit final nested process-terminal status:", error);
487
+ }
346
488
  }
347
- }
348
- onProcessTerminal?.(persisted);
489
+ onProcessTerminal?.(persisted);
490
+ };
491
+ if (startupPath)
492
+ setImmediate(finalize);
493
+ else
494
+ finalize();
349
495
  });
350
496
  if (typeof proc.pid !== "number") {
351
497
  return { error: `async runner did not produce a pid for cwd: ${cwd}` };
@@ -356,8 +502,31 @@ function spawnRunner(cfg, suffix, cwd, initialStatus, initialStatusPath, onProce
356
502
  pid: proc.pid,
357
503
  processTerminal: { version: 1, state: "pending", runId: initialStatus.runId, runnerProcessInstanceId }
358
504
  });
505
+ updateActiveRunIndex(path.dirname(initialStatusPath), initialStatus.state, initialStatus.toolCallId);
359
506
  } catch (error) {
360
507
  const message = `Failed to persist initial async status: ${error instanceof Error ? error.message : String(error)}`;
508
+ if (launchAsyncDir)
509
+ persistPreProceedStartupFailure(launchAsyncDir, launchRunId, runnerProcessInstanceId, launchSessionId, launchCompletionOwnerId, message);
510
+ const terminationObserved = terminateRunnerBeforeProceed(proc.pid);
511
+ return { pid: proc.pid, runnerProcessInstanceId, error: message, terminationObserved, startupDidNotProceed: true };
512
+ }
513
+ try {
514
+ if (!launchAsyncDir)
515
+ throw new Error("Async runner is missing its lifecycle directory.");
516
+ initializeProcessTerminal(launchAsyncDir, launchRunId, runnerProcessInstanceId);
517
+ } catch (error) {
518
+ const message = `Failed to establish async runner lifecycle sidecar: ${error instanceof Error ? error.message : String(error)}`;
519
+ if (launchAsyncDir)
520
+ persistPreProceedStartupFailure(launchAsyncDir, launchRunId, runnerProcessInstanceId, launchSessionId, launchCompletionOwnerId, message);
521
+ const terminationObserved = terminateRunnerBeforeProceed(proc.pid);
522
+ return { pid: proc.pid, runnerProcessInstanceId, error: message, terminationObserved, startupDidNotProceed: true };
523
+ }
524
+ try {
525
+ onBeforeProceed?.(runnerProcessInstanceId);
526
+ } catch (error) {
527
+ const message = `Failed to establish async runner capacity ownership: ${error instanceof Error ? error.message : String(error)}`;
528
+ if (launchAsyncDir)
529
+ persistPreProceedStartupFailure(launchAsyncDir, launchRunId, runnerProcessInstanceId, launchSessionId, launchCompletionOwnerId, message);
361
530
  const terminationObserved = terminateRunnerBeforeProceed(proc.pid);
362
531
  return { pid: proc.pid, runnerProcessInstanceId, error: message, terminationObserved, startupDidNotProceed: true };
363
532
  }
@@ -373,42 +542,12 @@ function spawnRunner(cfg, suffix, cwd, initialStatus, initialStatusPath, onProce
373
542
  }
374
543
  }
375
544
  proc.unref();
376
- if (startupPath && startupAckPath && startupProceedPath) {
545
+ if (startupPath && startupAckPath && startupConfirmPath && startupProceedPath) {
377
546
  const persistStartupFailure = (message) => {
378
547
  if (launchAsyncDir)
379
548
  persistPreProceedStartupFailure(launchAsyncDir, launchRunId, runnerProcessInstanceId, launchSessionId, launchCompletionOwnerId, message);
380
549
  };
381
- const ready = waitForRunnerStartup(startupPath, "ready", RUNNER_STARTUP_TIMEOUT_MS);
382
- if (ready.ok === false) {
383
- persistStartupFailure(ready.error);
384
- const terminationObserved = terminateRunnerBeforeProceed(proc.pid);
385
- return { pid: proc.pid, runnerProcessInstanceId, error: ready.error, terminationObserved, startupDidNotProceed: ready.startupDidNotProceed };
386
- }
387
- try {
388
- writeRunnerStartupControl(startupAckPath, { action: "ack", token: ready.token });
389
- } catch (error) {
390
- const message = `Failed to acknowledge async runner startup: ${error instanceof Error ? error.message : String(error)}`;
391
- persistStartupFailure(message);
392
- const terminationObserved = terminateRunnerBeforeProceed(proc.pid);
393
- return { pid: proc.pid, runnerProcessInstanceId, error: message, terminationObserved, startupDidNotProceed: true };
394
- }
395
- const acknowledged = waitForRunnerStartup(startupPath, "acknowledged", RUNNER_STARTUP_TIMEOUT_MS, ready.token);
396
- if (acknowledged.ok === false) {
397
- persistStartupFailure(acknowledged.error);
398
- const terminationObserved = terminateRunnerBeforeProceed(proc.pid);
399
- return { pid: proc.pid, runnerProcessInstanceId, error: acknowledged.error, terminationObserved, startupDidNotProceed: acknowledged.startupDidNotProceed };
400
- }
401
- try {
402
- writeRunnerStartupControl(startupProceedPath, { action: "proceed", token: ready.token });
403
- } catch (error) {
404
- const message = `Failed to authorize async runner startup: ${error instanceof Error ? error.message : String(error)}`;
405
- persistStartupFailure(message);
406
- const terminationObserved = terminateRunnerBeforeProceed(proc.pid);
407
- return { pid: proc.pid, runnerProcessInstanceId, error: message, terminationObserved, startupDidNotProceed: true };
408
- }
409
- try {
410
- fs.rmSync(startupPath, { force: true });
411
- } catch {}
550
+ return completeRunnerStartupHandshake(startupPath, startupAckPath, startupConfirmPath, startupProceedPath, proc, processClosed, () => observedProcessExit ?? (proc.exitCode !== null || proc.signalCode !== null ? { exitCode: proc.exitCode, signal: proc.signalCode } : undefined), runnerProcessInstanceId, persistStartupFailure);
412
551
  }
413
552
  return { pid: proc.pid, runnerProcessInstanceId };
414
553
  } catch (error) {
@@ -441,13 +580,26 @@ export function buildAsyncRunnerSteps(id, params) {
441
580
  thinkingOverridesByFlatIndex,
442
581
  maxSubagentDepth,
443
582
  worktreeBaseDir,
583
+ worktreeProvider,
584
+ worktreeBranchPrefix,
444
585
  asyncDir
445
586
  } = params;
587
+ const launchParentSessionId = ctx.parentSessionId ?? ctx.currentSessionId;
446
588
  const outputBaseDir = params.outputBaseDir;
447
589
  const resultMode = params.resultMode ?? "chain";
448
590
  const chainSkills = params.chainSkills ?? [];
449
591
  const availableModels = params.availableModels;
450
592
  const runnerCwd = resolveChildCwd(ctx.cwd, cwd);
593
+ const launchMachine = params.machine;
594
+ let managedWorktreeProvider;
595
+ try {
596
+ if (chain.some((step) => ("worktree" in step) && step.worktree === true)) {
597
+ const resolved = resolveWorktreeProvider(worktreeProvider, worktreeBaseDir);
598
+ managedWorktreeProvider = shouldDeferWorktreeCwd(worktreeProvider, worktreeBaseDir) ? "worktrunk" : resolved;
599
+ }
600
+ } catch (error) {
601
+ return { error: error instanceof Error ? error.message : String(error) };
602
+ }
451
603
  const progressDir = params.progressDir ?? runnerCwd;
452
604
  const graphChain = params.attachRoot ? [{
453
605
  agent: params.attachRoot.agent,
@@ -466,7 +618,6 @@ export function buildAsyncRunnerSteps(id, params) {
466
618
  return { error: error.message };
467
619
  throw error;
468
620
  }
469
- const workflowGraph = buildWorkflowGraphSnapshot({ runId: id, mode: resultMode, steps: graphChain });
470
621
  const diagnosticContext = params.unknownAgentDiagnosticContext ?? unknownAgentDiagnosticContext(discoverAgents(path.resolve(runnerCwd), "both"));
471
622
  for (const s of chain) {
472
623
  const stepAgents = isParallelStep(s) ? s.parallel.map((t) => t.agent) : isDynamicParallelStep(s) ? [s.parallel.agent] : [s.agent];
@@ -475,6 +626,8 @@ export function buildAsyncRunnerSteps(id, params) {
475
626
  return { error: formatUnknownAgentError(agentName, diagnosticContext) };
476
627
  }
477
628
  }
629
+ const graphSteps = projectChainOutputSchemas(graphChain, agents);
630
+ const workflowGraph = buildWorkflowGraphSnapshot({ runId: id, mode: resultMode, steps: graphSteps });
478
631
  let progressInstructionCreated = false;
479
632
  const buildStepOverrides = (s) => {
480
633
  const stepSkillInput = normalizeSkillInput(s.skill);
@@ -485,18 +638,35 @@ export function buildAsyncRunnerSteps(id, params) {
485
638
  ...s.progress !== undefined ? { progress: s.progress } : {},
486
639
  ...stepSkillInput !== undefined ? { skills: stepSkillInput } : {},
487
640
  ...s.model !== undefined ? { model: s.model } : {},
488
- ...s.fast !== undefined ? { fast: s.fast } : {}
641
+ ...s.fast !== undefined ? { fast: s.fast } : {},
642
+ ...s.outputSchema !== undefined ? { outputSchema: s.outputSchema } : {}
489
643
  };
490
644
  };
491
645
  const buildSeqStep = (s, sessionFile, behaviorCwd, progressPrecreated = false, resolvedBehavior, flatIndex, parallelOutputNamespace, runFanoutPath) => {
492
646
  const a = agents.find((x) => x.name === s.agent);
647
+ const effectiveBehavior = resolvedBehavior ?? suppressProgressForReadOnlyTask(resolveStepBehavior(a, buildStepOverrides(s), chainSkills), s.task, originalTask);
648
+ const requestedMachine = s.machine ?? launchMachine ?? a.machine;
493
649
  const externalRunner = a.runner?.type === "external-cli" || a.runner?.type === "external-job";
494
650
  const externalRunnerType = a.runner?.type;
651
+ const machineUnsupported = formatHerdrMachineRunnerUnsupported({ machine: requestedMachine, agentName: a.name, runnerType: a.runner?.type, adapter: a.runner?.type === "external-cli" ? a.runner.adapter : undefined, worktree: s.worktree });
652
+ if (machineUnsupported)
653
+ throw new AsyncStartValidationError(machineUnsupported);
654
+ let machine;
655
+ let machineEnv;
656
+ if (requestedMachine) {
657
+ try {
658
+ const placement = resolveHerdrMachinePlacement({ machine: requestedMachine, cwd: runnerCwd, stepCwd: s.cwd ?? params.machineCwd });
659
+ machine = placement.machine;
660
+ machineEnv = placement.env;
661
+ } catch (error) {
662
+ throw new AsyncStartValidationError(error instanceof Error ? error.message : String(error));
663
+ }
664
+ }
495
665
  if (externalRunner) {
496
666
  const unsupported = [];
497
667
  if (s.model !== undefined)
498
668
  unsupported.push("model override");
499
- if (s.outputSchema !== undefined)
669
+ if (effectiveBehavior.outputSchema !== undefined)
500
670
  unsupported.push("structured output");
501
671
  if (s.acceptance !== undefined || params.agentContract !== undefined || s.agentContract !== undefined)
502
672
  unsupported.push("acceptance/agent contract");
@@ -510,7 +680,7 @@ export function buildAsyncRunnerSteps(id, params) {
510
680
  throw new AsyncStartValidationError(`Agent '${a.name}' uses runner.type='${externalRunnerType}' and does not support: ${unsupported.join(", ")}.`);
511
681
  }
512
682
  try {
513
- assertAgentAllowedByCapabilityCeiling(a.name, intersectSubagentCapabilityCeilings(params.capabilityCeiling, decodeSubagentCapabilityCeiling(process.env[SUBAGENT_CAPABILITY_CEILING_ENV])));
683
+ assertAgentAllowedByCapabilityCeiling(a.name, intersectSubagentCapabilityCeilings(params.capabilityCeiling, ctx.childRuntime?.capabilityCeiling));
514
684
  } catch (error) {
515
685
  throw new AsyncStartValidationError(error instanceof Error ? error.message : String(error));
516
686
  }
@@ -535,52 +705,39 @@ export function buildAsyncRunnerSteps(id, params) {
535
705
  runtimeCwd: ctx.cwd,
536
706
  stepCwdInput: s.cwd,
537
707
  behaviorCwd,
708
+ ...machine ? { machineCwd: machine.cwd } : {},
538
709
  chainSkills,
539
710
  outputBaseDir,
540
711
  parallelOutputNamespace,
541
- resolvedBehavior
712
+ resolvedBehavior: effectiveBehavior
542
713
  });
543
714
  const { stepCwd, instructionCwd, readExistenceCwd, behavior, namespaceOutputPath, outputPath, skillNames } = launchPlan;
544
715
  const { resolved: resolvedSkills, missing: missingSkills } = resolveSkillsWithFallback(skillNames, stepCwd, ctx.cwd, a.skillPath, a.filePath ? path.dirname(a.filePath) : stepCwd);
545
716
  if (missingSkills.includes("dm-subagents"))
546
717
  throw new UnavailableSubagentSkillError(UNAVAILABLE_SUBAGENT_SKILL_ERROR);
547
- let systemPrompt = a.systemPrompt?.trim() ?? "";
548
- if (resolvedSkills.length > 0) {
549
- const injection = buildSkillInjection(resolvedSkills);
550
- systemPrompt = systemPrompt ? `${systemPrompt}
551
-
552
- ${injection}` : injection;
553
- }
554
- const memoryInjection = buildAgentMemoryInjection(a, stepCwd);
555
- if (memoryInjection) {
556
- systemPrompt = systemPrompt ? `${systemPrompt}
557
-
558
- ${memoryInjection}` : memoryInjection;
559
- }
560
- systemPrompt = appendAgentRefinementOverlay(systemPrompt, { cwd: stepCwd, agentName: a.name });
718
+ const systemPrompt = buildEffectiveSystemPrompt({ agent: a, resolvedSkills, cwd: stepCwd, ...!namespaceOutputPath && outputPath ? { outputPath } : {} });
561
719
  const readInstructions = buildChainInstructions({ ...behavior, output: false, progress: false }, instructionCwd, false, undefined, readExistenceCwd);
562
720
  const isFirstProgressAgent = behavior.progress && !progressPrecreated && !progressInstructionCreated;
563
721
  if (behavior.progress)
564
722
  progressInstructionCreated = true;
565
723
  const progressInstructions = buildChainInstructions({ ...behavior, output: false, reads: false }, progressDir, isFirstProgressAgent);
566
- if (!namespaceOutputPath)
567
- systemPrompt = injectOutputPathSystemPrompt(systemPrompt, outputPath, a);
568
724
  const validationError = validateFileOnlyOutputMode(behavior.outputMode, outputPath, `Async step (${s.agent})`);
569
725
  if (validationError)
570
726
  throw new AsyncStartValidationError(validationError);
571
727
  let taskTemplate = s.task ?? "{previous}";
572
728
  taskTemplate = taskTemplate.replace(/\{task\}/g, originalTask ?? "");
573
- taskTemplate = taskTemplate.replace(/\{chain_dir\}/g, runnerCwd);
729
+ taskTemplate = taskTemplate.replace(/\{chain_dir\}/g, behaviorCwd ?? runnerCwd);
574
730
  const taskText = `${readInstructions.prefix}${taskTemplate}${progressInstructions.suffix}`;
575
731
  const task = namespaceOutputPath ? taskText : injectSingleOutputInstruction(taskText, outputPath, a);
576
732
  const modelScopes = resolveModelScopesForAgent(ctx.modelScope, a.name, ctx.currentModel);
577
- const primaryModelFromParent = inheritsParentModel(s.model, a.model, ctx.currentModel);
578
- const primaryModel = externalRunner ? undefined : resolveEffectiveSubagentModel(s.model, a.model, ctx.currentModel, availableModels, a.modelProvider ?? ctx.currentModelProvider, { scope: modelScopes });
733
+ const modelOrigin = resolveModelOrigin({ explicitModel: s.model, agentModel: a.model, parentModel: ctx.currentModel });
734
+ const primaryModelFromParent = modelOrigin === "inherited";
735
+ const primaryModel = externalRunner ? undefined : resolveEffectiveSubagentModel(s.model, a.model, ctx.currentModel, availableModels, a.modelProvider ?? ctx.currentModelProvider, { scope: modelScopes, source: modelOrigin === "explicit" ? "explicit" : "inherited" });
579
736
  const thinkingOverride = flatIndex === undefined ? undefined : thinkingOverridesByFlatIndex?.[flatIndex];
580
737
  const effectiveThinking = externalRunner ? undefined : thinkingOverride ?? a.thinking;
581
738
  const model = externalRunner ? undefined : applyThinkingSuffix(primaryModel, effectiveThinking, thinkingOverride !== undefined);
582
739
  const contextLimit = model ? findModelInfo(model, availableModels, a.modelProvider ?? ctx.currentModelProvider)?.contextWindow : undefined;
583
- const thinkingCeiling = externalRunner ? undefined : intersectThinkingCeilings(params.thinkingCeiling, a.maxThinking, decodeThinkingCeiling(process.env[SUBAGENT_THINKING_CEILING_ENV]));
740
+ const thinkingCeiling = externalRunner ? undefined : intersectThinkingCeilings(params.thinkingCeiling, a.maxThinking, ctx.childRuntime?.thinkingCeiling);
584
741
  if (!externalRunner) {
585
742
  try {
586
743
  assertThinkingWithinCeiling({ model, configThinking: effectiveThinking, ceiling: thinkingCeiling, agent: a.name, runId: id });
@@ -590,36 +747,42 @@ ${memoryInjection}` : memoryInjection;
590
747
  }
591
748
  const agentContract = s.agentContract ?? params.agentContract;
592
749
  const permissionRules = resolvePermissionRules(ctx.permissions, a.permissions);
593
- const modelCandidates = externalRunner ? [] : buildModelCandidates(primaryModel, a.fallbackModels, availableModels, a.modelProvider ?? ctx.currentModelProvider, {
594
- scope: modelScopes,
595
- primaryModelFromParent
596
- }).flatMap((candidate) => {
597
- const resolved = applyThinkingSuffix(candidate, effectiveThinking, thinkingOverride !== undefined);
598
- return resolved ? [resolved] : [];
599
- });
750
+ let selectedModel = model;
751
+ let requestedModel;
600
752
  if (!externalRunner) {
601
753
  try {
602
- for (const candidate of modelCandidates)
603
- assertThinkingWithinCeiling({ model: candidate, configThinking: effectiveThinking, ceiling: thinkingCeiling, agent: a.name, runId: id });
754
+ const modelEvidence = resolveModelSelection(primaryModel, availableModels, a.modelProvider ?? ctx.currentModelProvider, {
755
+ scope: modelScopes,
756
+ primaryModelFromParent,
757
+ origin: modelOrigin
758
+ });
759
+ requestedModel = modelEvidence.requestedModel;
760
+ selectedModel = applyThinkingSuffix(modelEvidence.model, effectiveThinking, thinkingOverride !== undefined);
761
+ assertThinkingWithinCeiling({ model: selectedModel, configThinking: effectiveThinking, ceiling: thinkingCeiling, agent: a.name, runId: id });
604
762
  } catch (error) {
605
763
  throw new AsyncStartValidationError(error instanceof Error ? error.message : String(error));
606
764
  }
607
765
  }
766
+ const launchRuleError = applyWatchdogLaunchRules({ cwd: machine ? runnerCwd : stepCwd, agent: a.name, model: selectedModel, warn: (violation) => sendRuleViolationWarning(ctx.dm, violation) });
767
+ if (launchRuleError)
768
+ throw new AsyncStartValidationError(launchRuleError);
608
769
  const fast = s.fast ?? params.fast ?? a.fast;
770
+ const requiredExtensions = externalRunner ? [] : ctx.childRuntime?.requiredExtensions ?? resolveRequiredChildExtensions(ctx.parentSessionId ?? ctx.currentSessionId ?? undefined);
609
771
  const toolPlan = resolvePiLaunchToolPlan({
610
772
  tools: a.tools,
773
+ excludeTools: a.excludeTools,
611
774
  allowNestedSubagents: a.allowNestedSubagents,
612
775
  extensions: a.extensions,
613
776
  subagentOnlyExtensions: a.subagentOnlyExtensions,
777
+ requiredExtensions,
614
778
  mcpDirectTools: a.mcpDirectTools,
615
779
  cwd: stepCwd,
616
780
  requireReadTool: Boolean(resolvedSkills.length),
617
- structuredOutput: Boolean(s.outputSchema),
781
+ structuredOutput: Boolean(behavior.outputSchema),
618
782
  fast,
619
- model,
620
- modelCandidates,
783
+ model: selectedModel,
621
784
  capabilityCeiling: params.capabilityCeiling,
622
- inheritedCapabilityCeiling: decodeSubagentCapabilityCeiling(process.env[SUBAGENT_CAPABILITY_CEILING_ENV]),
785
+ inheritedCapabilityCeiling: ctx.childRuntime?.capabilityCeiling,
623
786
  agentName: a.name,
624
787
  permissionRules,
625
788
  runtimeSnapshotHost: ctx.dm
@@ -628,55 +791,43 @@ ${memoryInjection}` : memoryInjection;
628
791
  if (externalRunner && permissionRules) {
629
792
  throw new AsyncStartValidationError(`Agent '${a.name}' uses runner.type='${externalRunnerType}', which cannot enforce native DM child permission rules.`);
630
793
  }
631
- if (!externalRunner) {
632
- const contractTools = toolPlan.explicitToolAllowlist ? toolPlan.effectiveToolAllowlist : undefined;
633
- const contractError = validateImplementationToolContract({
634
- agent: a.name,
635
- task,
636
- tools: contractTools,
637
- mcpDirectTools: toolPlan.effectiveMcpTools,
638
- configuredExtensions: toolPlan.configuredExtensions,
639
- requestedTools: toolPlan.requestedBuiltinTools,
640
- acceptanceRole: a.acceptanceRole,
641
- completionGuard: a.completionGuard
642
- });
643
- if (contractError)
644
- throw new AsyncStartValidationError(contractError);
645
- }
646
794
  return {
647
- parentSessionId: ctx.parentSessionId ?? ctx.currentSessionId,
795
+ parentSessionId: launchParentSessionId,
648
796
  permissionRules,
649
797
  ...params.capabilityCeiling ? { capabilityCeiling: params.capabilityCeiling } : {},
650
798
  ...runFanoutPath ? { runFanoutPath } : {},
651
799
  agent: s.agent,
652
800
  task,
653
801
  ...a.runner ? { runner: a.runner } : {},
802
+ ...machine ? { machine } : {},
803
+ ...machineEnv ? { machineEnv } : {},
654
804
  ...params.contextForAgent ? { context: params.contextForAgent(s.agent) } : {},
655
805
  ...agentContract ? { agentContract } : {},
656
806
  phase: s.phase,
657
807
  label: s.label,
658
808
  outputName: s.as,
659
- structured: Boolean(s.outputSchema),
809
+ structured: Boolean(behavior.outputSchema),
660
810
  cwd: stepCwd,
661
- requestedCwd: s.cwd ?? stepCwd,
662
- model,
811
+ requestedCwd: machine ? machine.cwd : s.cwd ?? stepCwd,
812
+ model: selectedModel,
663
813
  ...contextLimit !== undefined ? { contextLimit } : {},
664
814
  ...fast !== undefined ? { fast } : {},
665
- thinking: resolveEffectiveThinking(model, effectiveThinking),
815
+ thinking: resolveEffectiveThinking(selectedModel, effectiveThinking),
666
816
  ...thinkingCeiling ? { thinkingCeiling } : {},
667
817
  launchResolvedExtensions,
668
- ...toolPlan.mcpConfig ? { mcpConfig: toolPlan.mcpConfig } : {},
669
- ...toolPlan.runtimeServerNames ? { runtimeServerNames: toolPlan.runtimeServerNames } : {},
670
- modelCandidates: externalRunner ? undefined : modelCandidates,
818
+ ...requestedModel ? { requestedModel } : {},
671
819
  ...primaryModelFromParent ? { skipPrimaryModelVerification: true } : {},
672
820
  ...availableModels && availableModels.length > 0 ? { modelVerificationRegistry: availableModels } : {},
821
+ ...ctx.modelResponseAliases ? { modelResponseAliases: ctx.modelResponseAliases } : {},
673
822
  tools: a.tools,
823
+ excludeTools: a.excludeTools,
674
824
  allowNestedSubagents: a.allowNestedSubagents,
825
+ allowedAgents: a.allowedAgents,
675
826
  extensions: a.extensions,
676
827
  subagentOnlyExtensions: a.subagentOnlyExtensions,
828
+ ...!externalRunner ? { requiredExtensions } : {},
677
829
  mcpDirectTools: a.mcpDirectTools,
678
830
  mutationTools: a.mutationTools,
679
- completionGuard: a.completionGuard,
680
831
  systemPrompt,
681
832
  systemPromptMode: a.systemPromptMode,
682
833
  inheritProjectContext: a.inheritProjectContext,
@@ -705,8 +856,8 @@ ${memoryInjection}` : memoryInjection;
705
856
  acceptanceInput: s.acceptance,
706
857
  acceptanceRole: a.acceptanceRole,
707
858
  ...s.gateOn ? { gateOn: s.gateOn } : {},
708
- ...s.outputSchema ? { structuredOutputSchema: s.outputSchema } : {},
709
- ...s.outputSchema ? { structuredOutput: createStructuredOutputRuntime(s.outputSchema, path.join(asyncDir, "structured-output"), { captureAcceptanceReport: s.acceptance !== false }) } : {},
859
+ ...behavior.outputSchema ? { structuredOutputSchema: behavior.outputSchema } : {},
860
+ ...behavior.outputSchema ? { structuredOutput: createStructuredOutputRuntime(behavior.outputSchema, path.join(asyncDir, "structured-output"), { acceptanceReport: resolveAcceptanceReportMode(s.acceptance) }) } : {},
710
861
  ...resolvedToolBudget.budget ? { toolBudget: resolvedToolBudget.budget } : {},
711
862
  ...s.worktree ? { worktree: true } : {}
712
863
  };
@@ -739,7 +890,9 @@ ${memoryInjection}` : memoryInjection;
739
890
  return {
740
891
  parallel: s.parallel.map((t, taskIndex) => {
741
892
  let behaviorCwd;
742
- if (s.worktree) {
893
+ if (s.worktree && managedWorktreeProvider === "worktrunk") {
894
+ behaviorCwd = WORKTREE_AGENT_CWD_PLACEHOLDER;
895
+ } else if (s.worktree && managedWorktreeProvider === "native") {
743
896
  try {
744
897
  behaviorCwd = resolveExpectedWorktreeAgentCwd(runnerCwd, `${id}-s${stepIndex}`, taskIndex, worktreeBaseDir);
745
898
  } catch {
@@ -747,7 +900,7 @@ ${memoryInjection}` : memoryInjection;
747
900
  }
748
901
  }
749
902
  const staticStep = nextFlatStep();
750
- return buildSeqStep({ ...t, agentContract: t.agentContract ?? s.agentContract, gateOn: t.gateOn ?? s.gateOn }, staticStep.sessionFile, behaviorCwd, progressPrecreated, parallelBehaviors[taskIndex], staticStep.index, { stepIndex, taskIndex }, resultMode === "parallel" ? `tasks[${taskIndex}]` : `chain[${stepIndex}].parallel[${taskIndex}]`);
903
+ return buildSeqStep({ ...t, machine: t.machine ?? s.machine, worktree: s.worktree, agentContract: t.agentContract ?? s.agentContract, gateOn: t.gateOn ?? s.gateOn }, staticStep.sessionFile, behaviorCwd, progressPrecreated, parallelBehaviors[taskIndex], staticStep.index, { stepIndex, taskIndex }, resultMode === "parallel" ? `tasks[${taskIndex}]` : `chain[${stepIndex}].parallel[${taskIndex}]`);
751
904
  }),
752
905
  concurrency: s.concurrency,
753
906
  failFast: s.failFast,
@@ -794,7 +947,9 @@ ${memoryInjection}` : memoryInjection;
794
947
  }
795
948
  const sequential = s;
796
949
  let behaviorCwd;
797
- if (sequential.worktree) {
950
+ if (sequential.worktree && managedWorktreeProvider === "worktrunk") {
951
+ behaviorCwd = WORKTREE_AGENT_CWD_PLACEHOLDER;
952
+ } else if (sequential.worktree && managedWorktreeProvider === "native") {
798
953
  try {
799
954
  behaviorCwd = resolveExpectedWorktreeAgentCwd(runnerCwd, `${id}-s${stepIndex}`, 0, worktreeBaseDir);
800
955
  } catch {
@@ -805,6 +960,7 @@ ${memoryInjection}` : memoryInjection;
805
960
  return buildSeqStep(sequential, staticStep.sessionFile, behaviorCwd, false, undefined, staticStep.index, undefined, `chain[${stepIndex}]`);
806
961
  });
807
962
  const steps = params.attachRoot ? [{
963
+ parentSessionId: launchParentSessionId,
808
964
  agent: params.attachRoot.agent,
809
965
  task: "",
810
966
  label: params.attachRoot.label ?? `Attached root ${params.attachRoot.runId}`,
@@ -858,6 +1014,9 @@ export function executeAsyncChain(id, params) {
858
1014
  worktreeSetupHook,
859
1015
  worktreeSetupHookTimeoutMs,
860
1016
  worktreeBaseDir,
1017
+ baseRef,
1018
+ worktreeProvider,
1019
+ worktreeBranchPrefix,
861
1020
  controlConfig,
862
1021
  controlIntercomTarget,
863
1022
  childIntercomTarget,
@@ -865,19 +1024,13 @@ export function executeAsyncChain(id, params) {
865
1024
  } = params;
866
1025
  const resultMode = params.resultMode ?? "chain";
867
1026
  const acceptanceErrors = validateExecutionAcceptance({
868
- chain: chain.map((step) => {
869
- if (isParallelStep(step))
870
- return { parallel: step.parallel };
871
- if (isDynamicParallelStep(step))
872
- return { acceptance: step.acceptance, parallel: step.parallel };
873
- return { acceptance: step.acceptance };
874
- })
1027
+ chain: projectChainOutputSchemas(chain, agents, (step, outputSchema) => ({ acceptance: step.acceptance, outputSchema }), (step, parallel) => Array.isArray(step.parallel) ? { parallel } : { acceptance: "acceptance" in step ? step.acceptance : undefined, parallel })
875
1028
  });
876
1029
  if (acceptanceErrors.length > 0)
877
1030
  return formatAsyncStartError(resultMode, acceptanceErrors.join(" "));
878
1031
  const capabilityCeiling = params.capabilityCeiling ?? resolveCurrentSubagentCapabilityCeiling(ctx.currentSessionId);
879
- const inheritedNestedRoute = resolveInheritedNestedRouteFromEnv();
880
- const nestedAddress = inheritedNestedRoute ? resolveNestedParentAddressFromEnv() : undefined;
1032
+ const inheritedNestedRoute = inheritedNestedRouteOf(ctx.childRuntime);
1033
+ const nestedAddress = inheritedNestedRoute ? inheritedNestedParentAddressOf(ctx.childRuntime) : undefined;
881
1034
  const asyncDir = inheritedNestedRoute ? path.join(TEMP_ROOT_DIR, "nested-subagent-runs", inheritedNestedRoute.rootRunId, id) : path.join(DIRS.async, id);
882
1035
  let runFanoutBudget;
883
1036
  try {
@@ -903,6 +1056,8 @@ export function executeAsyncChain(id, params) {
903
1056
  availableModels: params.availableModels,
904
1057
  cwd,
905
1058
  chainSkills: params.chainSkills,
1059
+ machine: params.machine,
1060
+ machineCwd: params.machineCwd,
906
1061
  sessionFilesByFlatIndex,
907
1062
  thinkingOverridesByFlatIndex,
908
1063
  contextForAgent: params.contextForAgent,
@@ -914,6 +1069,8 @@ export function executeAsyncChain(id, params) {
914
1069
  waitToolEnabled: params.waitToolEnabled,
915
1070
  waitToolDefaultTimeoutMs: params.waitToolDefaultTimeoutMs,
916
1071
  worktreeBaseDir,
1072
+ worktreeProvider,
1073
+ worktreeBranchPrefix,
917
1074
  asyncDir,
918
1075
  fast: params.fast,
919
1076
  toolBudget: params.toolBudget,
@@ -961,6 +1118,7 @@ export function executeAsyncChain(id, params) {
961
1118
  }
962
1119
  const initialStatusAt = Date.now();
963
1120
  const initialCompletionOwnerId = ctx.completionOwnerId ?? currentCompletionOwnerId();
1121
+ const launchParentSessionId = ctx.parentSessionId ?? ctx.currentSessionId;
964
1122
  let spawnResult = {};
965
1123
  try {
966
1124
  spawnResult = spawnRunner({
@@ -979,10 +1137,14 @@ export function executeAsyncChain(id, params) {
979
1137
  completionOwnerId: ctx.completionOwnerId ?? currentCompletionOwnerId(),
980
1138
  ...capabilityCeiling ? { capabilityCeiling } : {},
981
1139
  piPackageRoot,
982
- piArgv1: process.argv[1],
1140
+ childSessionFactoryModule: childSessionFactoryModule(),
1141
+ inheritedChildRuntime: inheritedChildRuntime(ctx.childRuntime),
983
1142
  worktreeSetupHook,
984
1143
  worktreeSetupHookTimeoutMs,
985
1144
  worktreeBaseDir,
1145
+ baseRef,
1146
+ worktreeProvider,
1147
+ worktreeBranchPrefix,
986
1148
  controlConfig,
987
1149
  toolBudget: params.toolBudget,
988
1150
  usageBudget: params.usageBudget,
@@ -1017,14 +1179,17 @@ export function executeAsyncChain(id, params) {
1017
1179
  chainStepCount: eventChain.length,
1018
1180
  ...initialParallelGroups.length ? { parallelGroups: initialParallelGroups } : {},
1019
1181
  steps: initialStatusSteps
1020
- }, path.join(asyncDir, "status.json"), (proof) => emitProcessTerminalEvent(ctx, proof));
1182
+ }, path.join(asyncDir, "status.json"), launchParentSessionId, (proof) => emitProcessTerminalEvent(ctx, proof), (runnerProcessInstanceId) => params.activeAsyncCapacity?.markStarted(runnerProcessInstanceId));
1021
1183
  } catch (error) {
1022
1184
  params.activeAsyncCapacity?.rollback();
1023
1185
  const message = error instanceof Error ? error.message : String(error);
1024
1186
  return formatAsyncStartError(resultMode, `Failed to start async ${resultMode} '${id}': ${message}`);
1025
1187
  }
1026
1188
  if (spawnResult.error) {
1027
- if (!spawnResult.pid || !spawnResult.runnerProcessInstanceId || spawnResult.startupDidNotProceed && spawnResult.terminationObserved)
1189
+ if (spawnResult.startupDidNotProceed) {
1190
+ if (!spawnResult.runnerProcessInstanceId || params.activeAsyncCapacity?.rollbackBeforeRunnerProceed(spawnResult.runnerProcessInstanceId) !== true)
1191
+ params.activeAsyncCapacity?.rollback();
1192
+ } else if (!spawnResult.pid || !spawnResult.runnerProcessInstanceId)
1028
1193
  params.activeAsyncCapacity?.rollback();
1029
1194
  else
1030
1195
  params.activeAsyncCapacity?.markStarted(spawnResult.runnerProcessInstanceId);
@@ -1034,7 +1199,6 @@ export function executeAsyncChain(id, params) {
1034
1199
  params.activeAsyncCapacity?.rollback();
1035
1200
  return formatAsyncStartError(resultMode, `Failed to start async ${resultMode} '${id}': runner identity unavailable`);
1036
1201
  }
1037
- params.activeAsyncCapacity?.markStarted(spawnResult.runnerProcessInstanceId);
1038
1202
  if (spawnResult.pid) {
1039
1203
  const eventFirstStep = eventChain[0];
1040
1204
  if (!eventFirstStep) {
@@ -1077,7 +1241,7 @@ export function executeAsyncChain(id, params) {
1077
1241
  path: nestedAddress.path,
1078
1242
  asyncDir,
1079
1243
  pid: spawnResult.pid,
1080
- ownerIntercomTarget: process.env.DM_SUBAGENT_INTERCOM_SESSION_NAME,
1244
+ ownerIntercomTarget: ctx.childRuntime?.intercomSessionName,
1081
1245
  leafIntercomTarget: childIntercomTargets?.[0],
1082
1246
  intercomTarget: childIntercomTargets?.[0],
1083
1247
  ownerState: "live",
@@ -1148,6 +1312,9 @@ export function executeAsyncSingle(id, params) {
1148
1312
  worktreeSetupHook,
1149
1313
  worktreeSetupHookTimeoutMs,
1150
1314
  worktreeBaseDir,
1315
+ baseRef,
1316
+ worktreeProvider,
1317
+ worktreeBranchPrefix,
1151
1318
  controlConfig,
1152
1319
  controlIntercomTarget,
1153
1320
  childIntercomTarget,
@@ -1198,36 +1365,46 @@ export function executeAsyncSingle(id, params) {
1198
1365
  if (unsupported.length > 0)
1199
1366
  return formatAsyncStartError("single", `Agent '${agentConfig.name}' uses runner.type='${externalRunnerType}' and does not support: ${unsupported.join(", ")}.`);
1200
1367
  }
1201
- const capabilityCeiling = intersectSubagentCapabilityCeilings(params.capabilityCeiling ?? resolveCurrentSubagentCapabilityCeiling(ctx.currentSessionId), decodeSubagentCapabilityCeiling(process.env[SUBAGENT_CAPABILITY_CEILING_ENV]));
1368
+ const capabilityCeiling = intersectSubagentCapabilityCeilings(params.capabilityCeiling ?? resolveCurrentSubagentCapabilityCeiling(ctx.currentSessionId), ctx.childRuntime?.capabilityCeiling);
1202
1369
  try {
1203
1370
  assertAgentAllowedByCapabilityCeiling(agentConfig.name, capabilityCeiling);
1204
1371
  } catch (error) {
1205
1372
  return formatAsyncStartError("single", error instanceof Error ? error.message : String(error));
1206
1373
  }
1207
1374
  const runnerCwd = resolveChildCwd(ctx.cwd, cwd);
1208
- const instructionCwd = params.worktree === true ? resolveExpectedWorktreeAgentCwd(runnerCwd, `${id}-s0`, 0, worktreeBaseDir) : runnerCwd;
1375
+ const requestedMachine = params.machine ?? agentConfig.machine;
1376
+ const machineUnsupported = formatHerdrMachineRunnerUnsupported({ machine: requestedMachine, agentName: agentConfig.name, runnerType: agentConfig.runner?.type, adapter: agentConfig.runner?.type === "external-cli" ? agentConfig.runner.adapter : undefined, worktree: params.worktree });
1377
+ if (machineUnsupported)
1378
+ return formatAsyncStartError("single", machineUnsupported);
1379
+ let machine;
1380
+ let machineEnv;
1381
+ if (requestedMachine) {
1382
+ try {
1383
+ const placement = resolveHerdrMachinePlacement({ machine: requestedMachine, cwd: runnerCwd, stepCwd: params.machineCwd });
1384
+ machine = placement.machine;
1385
+ machineEnv = placement.env;
1386
+ } catch (error) {
1387
+ return formatAsyncStartError("single", error instanceof Error ? error.message : String(error));
1388
+ }
1389
+ }
1390
+ let managedWorktreeProvider;
1391
+ if (params.worktree === true) {
1392
+ try {
1393
+ const resolved = resolveWorktreeProvider(params.worktreeProvider, worktreeBaseDir);
1394
+ managedWorktreeProvider = shouldDeferWorktreeCwd(params.worktreeProvider, worktreeBaseDir) ? "worktrunk" : resolved;
1395
+ } catch (error) {
1396
+ return formatAsyncStartError("single", error instanceof Error ? error.message : String(error));
1397
+ }
1398
+ }
1399
+ const instructionCwd = params.worktree === true && managedWorktreeProvider === "worktrunk" ? WORKTREE_AGENT_CWD_PLACEHOLDER : params.worktree === true && managedWorktreeProvider === "native" ? resolveExpectedWorktreeAgentCwd(runnerCwd, `${id}-s0`, 0, worktreeBaseDir) : machine?.cwd ?? runnerCwd;
1209
1400
  const readExistenceCwd = params.worktree === true ? runnerCwd : instructionCwd;
1210
1401
  const skillNames = params.skills ?? agentConfig.skills ?? [];
1211
1402
  const availableModels = params.availableModels;
1212
1403
  const { resolved: resolvedSkills, missing: missingSkills } = resolveSkillsWithFallback(skillNames, runnerCwd, ctx.cwd, agentConfig.skillPath, agentConfig.filePath ? path.dirname(agentConfig.filePath) : runnerCwd);
1213
1404
  if (missingSkills.includes("dm-subagents"))
1214
1405
  return formatAsyncStartError("single", UNAVAILABLE_SUBAGENT_SKILL_ERROR);
1215
- let systemPrompt = agentConfig.systemPrompt?.trim() ?? "";
1216
- if (resolvedSkills.length > 0) {
1217
- const injection = buildSkillInjection(resolvedSkills);
1218
- systemPrompt = systemPrompt ? `${systemPrompt}
1219
-
1220
- ${injection}` : injection;
1221
- }
1222
- const memoryInjection = buildAgentMemoryInjection(agentConfig, runnerCwd);
1223
- if (memoryInjection) {
1224
- systemPrompt = systemPrompt ? `${systemPrompt}
1225
-
1226
- ${memoryInjection}` : memoryInjection;
1227
- }
1228
- systemPrompt = appendAgentRefinementOverlay(systemPrompt, { cwd: runnerCwd, agentName: agentConfig.name });
1229
- const inheritedNestedRoute = resolveInheritedNestedRouteFromEnv();
1230
- const nestedAddress = inheritedNestedRoute ? resolveNestedParentAddressFromEnv() : undefined;
1406
+ const inheritedNestedRoute = inheritedNestedRouteOf(ctx.childRuntime);
1407
+ const nestedAddress = inheritedNestedRoute ? inheritedNestedParentAddressOf(ctx.childRuntime) : undefined;
1231
1408
  const asyncDir = inheritedNestedRoute ? path.join(TEMP_ROOT_DIR, "nested-subagent-runs", inheritedNestedRoute.rootRunId, id) : path.join(DIRS.async, id);
1232
1409
  let runFanoutBudget;
1233
1410
  try {
@@ -1244,24 +1421,36 @@ ${memoryInjection}` : memoryInjection;
1244
1421
  }
1245
1422
  const effectiveOutput = normalizeSingleOutputOverride(params.output, agentConfig.output);
1246
1423
  const outputPath = resolveSingleOutputPath(effectiveOutput, ctx.cwd, instructionCwd, params.outputBaseDir ?? (artifactsDir ? path.join(artifactsDir, "outputs", id) : undefined));
1247
- systemPrompt = injectOutputPathSystemPrompt(systemPrompt, outputPath, agentConfig);
1424
+ const systemPrompt = buildEffectiveSystemPrompt({ agent: agentConfig, resolvedSkills, cwd: runnerCwd, ...outputPath ? { outputPath } : {} });
1248
1425
  const outputMode = params.outputMode ?? agentConfig.outputMode ?? "inline";
1249
1426
  const validationError = validateFileOnlyOutputMode(outputMode, outputPath, `Async single run (${agent})`);
1250
1427
  if (validationError)
1251
1428
  return formatAsyncStartError("single", validationError);
1252
1429
  const taskWithOutputInstruction = injectSingleOutputInstruction(task, outputPath, agentConfig);
1253
1430
  const reads = params.reads !== undefined ? params.reads : agentConfig.defaultReads ?? false;
1254
- const readPaths = Array.isArray(reads) ? resolveExistingReadPaths(reads, readExistenceCwd) : [];
1431
+ const readPaths = Array.isArray(reads) ? machine ? externalRunner ? reads.map((read) => read === "~" || read.startsWith("~/") || path.posix.isAbsolute(read) ? read : path.posix.resolve(instructionCwd, read)) : [] : managedWorktreeProvider === "worktrunk" ? resolveExistingReadInstructionPaths(reads, instructionCwd, readExistenceCwd) : resolveExistingReadPaths(reads, readExistenceCwd) : [];
1255
1432
  const readsInstruction = readPaths.length > 0 ? `[Read from: ${readPaths.join(", ")}]
1256
1433
 
1257
1434
  ` : "";
1258
1435
  const taskText = readsInstruction + taskWithOutputInstruction;
1259
1436
  const modelScopes = resolveModelScopesForAgent(ctx.modelScope, agentConfig.name, ctx.currentModel);
1260
- const primaryModel = externalRunner ? undefined : params.modelOverrideFromParent ? params.modelOverride : resolveSubagentModelOverride(params.modelOverride ?? agentConfig.model, ctx.currentModel, availableModels, ctx.currentModelProvider, { scope: modelScopes });
1437
+ const modelOrigin = resolveModelOrigin({
1438
+ fromParent: params.modelOverrideFromParent,
1439
+ storedOrigin: params.modelOrigin,
1440
+ explicitModel: params.modelOverrideFromParent ? undefined : params.modelOverride,
1441
+ agentModel: agentConfig.model,
1442
+ parentModel: ctx.currentModel
1443
+ });
1444
+ let primaryModel;
1445
+ try {
1446
+ primaryModel = externalRunner ? undefined : modelOrigin === "inherited" ? params.modelOverride ?? (ctx.currentModel ? `${ctx.currentModel.provider}/${ctx.currentModel.id}` : undefined) : resolveSubagentModelOverride(params.modelOverride ?? agentConfig.model, ctx.currentModel, availableModels, ctx.currentModelProvider, { scope: modelScopes, source: modelOrigin === "explicit" ? "explicit" : "inherited" });
1447
+ } catch (error) {
1448
+ return formatAsyncStartError("single", error instanceof Error ? error.message : String(error));
1449
+ }
1261
1450
  const effectiveThinking = externalRunner ? undefined : params.thinkingOverride ?? agentConfig.thinking;
1262
1451
  const model = externalRunner ? undefined : applyThinkingSuffix(primaryModel, effectiveThinking, params.thinkingOverride !== undefined);
1263
1452
  const contextLimit = model ? findModelInfo(model, availableModels, agentConfig.modelProvider ?? ctx.currentModelProvider)?.contextWindow : undefined;
1264
- const thinkingCeiling = externalRunner ? undefined : intersectThinkingCeilings(params.thinkingCeiling, agentConfig.maxThinking, decodeThinkingCeiling(process.env[SUBAGENT_THINKING_CEILING_ENV]));
1453
+ const thinkingCeiling = externalRunner ? undefined : intersectThinkingCeilings(params.thinkingCeiling, agentConfig.maxThinking, ctx.childRuntime?.thinkingCeiling);
1265
1454
  if (!externalRunner) {
1266
1455
  try {
1267
1456
  assertThinkingWithinCeiling({ model, configThinking: effectiveThinking, ceiling: thinkingCeiling, agent: agentConfig.name, runId: id });
@@ -1288,73 +1477,55 @@ ${memoryInjection}` : memoryInjection;
1288
1477
  const toolTimeoutMs = resolvedToolTimeout.toolTimeoutMs;
1289
1478
  const initialUsageBudget = usageBudgetState(params.usageBudget, undefined);
1290
1479
  const resolvedSessionDir = params.sessionDir ?? (sessionRoot ? path.join(sessionRoot, `async-${id}`) : undefined);
1291
- const structuredOutput = params.structuredOutputSchema ? createStructuredOutputRuntime(params.structuredOutputSchema, path.join(asyncDir, "structured-output"), { captureAcceptanceReport: params.acceptance !== false }) : undefined;
1292
- const modelCandidates = externalRunner ? [] : buildModelCandidates(primaryModel, agentConfig.fallbackModels, availableModels, agentConfig.modelProvider ?? ctx.currentModelProvider, {
1293
- scope: modelScopes,
1294
- primaryModelFromParent: params.modelOverrideFromParent
1295
- }).flatMap((candidate) => {
1296
- const resolved = applyThinkingSuffix(candidate, effectiveThinking, params.thinkingOverride !== undefined);
1297
- return resolved ? [resolved] : [];
1298
- });
1480
+ const structuredOutput = params.structuredOutputSchema ? createStructuredOutputRuntime(params.structuredOutputSchema, path.join(asyncDir, "structured-output"), { acceptanceReport: resolveAcceptanceReportMode(params.acceptance) }) : undefined;
1481
+ let selectedModel = model;
1482
+ let requestedModel;
1299
1483
  if (!externalRunner) {
1300
1484
  try {
1301
- for (const candidate of modelCandidates)
1302
- assertThinkingWithinCeiling({ model: candidate, configThinking: effectiveThinking, ceiling: thinkingCeiling, agent: agentConfig.name, runId: id });
1485
+ const modelEvidence = resolveModelSelection(primaryModel, availableModels, agentConfig.modelProvider ?? ctx.currentModelProvider, {
1486
+ scope: modelScopes,
1487
+ primaryModelFromParent: modelOrigin === "inherited",
1488
+ origin: modelOrigin
1489
+ });
1490
+ requestedModel = modelEvidence.requestedModel;
1491
+ selectedModel = applyThinkingSuffix(modelEvidence.model, effectiveThinking, params.thinkingOverride !== undefined);
1492
+ assertThinkingWithinCeiling({ model: selectedModel, configThinking: effectiveThinking, ceiling: thinkingCeiling, agent: agentConfig.name, runId: id });
1303
1493
  } catch (error) {
1304
1494
  return formatAsyncStartError("single", error instanceof Error ? error.message : String(error));
1305
1495
  }
1306
1496
  }
1497
+ const requiredExtensions = externalRunner ? [] : params.requiredExtensions ?? ctx.childRuntime?.requiredExtensions ?? resolveRequiredChildExtensions(ctx.parentSessionId ?? ctx.currentSessionId ?? undefined);
1307
1498
  const toolPlan = resolvePiLaunchToolPlan({
1308
1499
  tools: agentConfig.tools,
1500
+ excludeTools: agentConfig.excludeTools,
1309
1501
  allowNestedSubagents: agentConfig.allowNestedSubagents,
1310
1502
  extensions: agentConfig.extensions,
1311
1503
  subagentOnlyExtensions: agentConfig.subagentOnlyExtensions,
1504
+ requiredExtensions,
1312
1505
  mcpDirectTools: agentConfig.mcpDirectTools,
1313
1506
  cwd: runnerCwd,
1314
1507
  requireReadTool: Boolean(resolvedSkills.length),
1315
1508
  structuredOutput: Boolean(params.structuredOutputSchema),
1316
1509
  fast: params.fast ?? agentConfig.fast,
1317
- model,
1318
- modelCandidates,
1510
+ model: selectedModel,
1319
1511
  capabilityCeiling,
1320
- inheritedCapabilityCeiling: decodeSubagentCapabilityCeiling(process.env[SUBAGENT_CAPABILITY_CEILING_ENV]),
1512
+ inheritedCapabilityCeiling: ctx.childRuntime?.capabilityCeiling,
1321
1513
  agentName: agentConfig.name,
1322
1514
  permissionRules: resolvePermissionRules(ctx.permissions, agentConfig.permissions),
1323
1515
  runtimeSnapshotHost: ctx.dm
1324
1516
  });
1325
1517
  const launchResolvedExtensions = externalRunner ? undefined : projectLaunchResolvedChildExtensions(toolPlan);
1326
- if (!externalRunner) {
1327
- const contractTools = toolPlan.explicitToolAllowlist ? toolPlan.effectiveToolAllowlist : undefined;
1328
- const contractError = validateImplementationToolContract({
1329
- agent: agentConfig.name,
1330
- task: taskText,
1331
- tools: contractTools,
1332
- mcpDirectTools: toolPlan.effectiveMcpTools,
1333
- configuredExtensions: toolPlan.configuredExtensions,
1334
- requestedTools: toolPlan.requestedBuiltinTools,
1335
- acceptanceRole: agentConfig.acceptanceRole,
1336
- completionGuard: agentConfig.completionGuard
1337
- });
1338
- if (contractError)
1339
- return formatAsyncStartError("single", contractError);
1340
- }
1341
- const launchContractDigest = launchBindingDigest({
1342
- definitionDigest: agentDefinitionDigest(agentConfig),
1518
+ const fast = params.fast ?? agentConfig.fast;
1519
+ const launchThinking = resolveEffectiveThinking(selectedModel, effectiveThinking);
1520
+ const { definitionDigest, launchContractDigest } = resolveLaunchBinding({
1521
+ agent: agentConfig,
1343
1522
  task,
1344
- ...model ? { model } : {},
1345
- modelCandidates,
1346
- ...(params.fast ?? agentConfig.fast) !== undefined ? { fast: params.fast ?? agentConfig.fast } : {},
1347
- ...resolveEffectiveThinking(model, effectiveThinking) ? { thinking: resolveEffectiveThinking(model, effectiveThinking) } : {},
1348
- ...thinkingCeiling ? { thinkingCeiling } : {},
1523
+ model: selectedModel,
1524
+ ...fast !== undefined ? { fast } : {},
1525
+ ...launchThinking ? { thinking: launchThinking } : {},
1349
1526
  systemPrompt,
1350
- systemPromptMode: agentConfig.systemPromptMode,
1351
- inheritProjectContext: agentConfig.inheritProjectContext,
1352
- inheritGlobalContext: agentConfig.inheritGlobalContext,
1353
- inheritSkills: agentConfig.inheritSkills,
1354
1527
  skills: resolvedSkills.map((skill) => skill.name),
1355
- tools: toolPlan.effectiveToolAllowlist,
1356
- extensions: toolPlan.extensionArgs,
1357
- mcpDirectTools: toolPlan.effectiveMcpTools,
1528
+ toolPlan,
1358
1529
  ...outputPath ? { outputPath } : {},
1359
1530
  outputMode,
1360
1531
  ...params.structuredOutputSchema ? { structuredOutputSchema: params.structuredOutputSchema } : {},
@@ -1371,10 +1542,12 @@ ${memoryInjection}` : memoryInjection;
1371
1542
  });
1372
1543
  const recoveryAgentConfig = params.recoveryAgentConfig ?? agentConfig;
1373
1544
  const recoveryDescriptor = {
1545
+ ...ctx.modelResponseAliases ? { modelResponseAliases: ctx.modelResponseAliases } : {},
1374
1546
  version: 1,
1375
1547
  ...lane ? { lane } : {},
1376
1548
  launchContractDigest,
1377
1549
  ...extensionBindings ? { extensionBindings } : {},
1550
+ ...requiredExtensions.length > 0 ? { requiredExtensions } : {},
1378
1551
  runFanoutBudget,
1379
1552
  sourceRunId: id,
1380
1553
  ...params.agentContract ? { agentContract: params.agentContract } : {},
@@ -1382,15 +1555,17 @@ ${memoryInjection}` : memoryInjection;
1382
1555
  launchResolvedExtensions,
1383
1556
  ...sessionFile ? { sessionFile } : {},
1384
1557
  cwd: runnerCwd,
1385
- ...model ? { model } : {},
1558
+ ...selectedModel ? { model: selectedModel } : {},
1386
1559
  ...params.fast ?? recoveryAgentConfig.fast ? { fast: params.fast ?? recoveryAgentConfig.fast } : {},
1387
1560
  ...recoveryAgentConfig.modelProvider ? { modelProvider: recoveryAgentConfig.modelProvider } : {},
1388
- ...params.modelOverrideFromParent ? { modelOverrideFromParent: true } : {},
1389
- ...recoveryAgentConfig.fallbackModels ? { fallbackModels: [...recoveryAgentConfig.fallbackModels] } : {},
1390
- ...effectiveThinking ? { thinking: resolveEffectiveThinking(model, effectiveThinking) } : {},
1561
+ ...modelOrigin === "inherited" ? { modelOverrideFromParent: true } : {},
1562
+ modelOrigin,
1563
+ ...effectiveThinking ? { thinking: resolveEffectiveThinking(selectedModel, effectiveThinking) } : {},
1391
1564
  ...thinkingCeiling ? { thinkingCeiling } : {},
1392
1565
  ...recoveryAgentConfig.tools ? { tools: [...recoveryAgentConfig.tools] } : {},
1566
+ ...recoveryAgentConfig.excludeTools ? { excludeTools: [...recoveryAgentConfig.excludeTools] } : {},
1393
1567
  ...recoveryAgentConfig.allowNestedSubagents !== undefined ? { allowNestedSubagents: recoveryAgentConfig.allowNestedSubagents } : {},
1568
+ ...recoveryAgentConfig.allowedAgents !== undefined ? { allowedAgents: [...recoveryAgentConfig.allowedAgents] } : {},
1394
1569
  ...recoveryAgentConfig.extensions ? { extensions: [...recoveryAgentConfig.extensions] } : {},
1395
1570
  ...recoveryAgentConfig.subagentOnlyExtensions ? { subagentOnlyExtensions: [...recoveryAgentConfig.subagentOnlyExtensions] } : {},
1396
1571
  ...recoveryAgentConfig.mcpDirectTools ? { mcpDirectTools: [...recoveryAgentConfig.mcpDirectTools] } : {},
@@ -1403,7 +1578,6 @@ ${memoryInjection}` : memoryInjection;
1403
1578
  ...resolvedSkills.length ? { skills: resolvedSkills.map((skill) => skill.name) } : {},
1404
1579
  ...recoveryAgentConfig.skillPath ? { skillPath: [...recoveryAgentConfig.skillPath] } : {},
1405
1580
  ...recoveryAgentConfig.filePath ? { agentFilePath: recoveryAgentConfig.filePath } : {},
1406
- ...recoveryAgentConfig.completionGuard !== undefined ? { completionGuard: recoveryAgentConfig.completionGuard } : {},
1407
1581
  ...recoveryAgentConfig.memory ? { memory: { ...recoveryAgentConfig.memory } } : {},
1408
1582
  ...outputPath ? { outputPath } : {},
1409
1583
  outputMode,
@@ -1412,6 +1586,7 @@ ${memoryInjection}` : memoryInjection;
1412
1586
  ...controlConfig ? { controlConfig } : {},
1413
1587
  ...params.context ? { context: params.context } : {},
1414
1588
  ...params.intercomBridge !== undefined ? { intercomBridge: params.intercomBridge } : {},
1589
+ ...params.baseRef !== undefined ? { baseRef: params.baseRef } : {},
1415
1590
  ...deadlineAt !== undefined ? { absoluteDeadlineAt: deadlineAt } : {},
1416
1591
  ...resolvedToolBudget.budget ? { initialToolBudget: resolvedToolBudget.budget } : {},
1417
1592
  maxSubagentDepth: resolveChildMaxSubagentDepth(maxSubagentDepth, recoveryAgentConfig.maxSubagentDepth),
@@ -1429,41 +1604,46 @@ ${memoryInjection}` : memoryInjection;
1429
1604
  return formatAsyncStartError("single", `Failed to persist async recovery descriptor for '${id}': ${error instanceof Error ? error.message : String(error)}`);
1430
1605
  }
1431
1606
  }
1432
- let spawnResult = {};
1607
+ let spawnResultOrPromise = {};
1433
1608
  const initialStatusAt = Date.now();
1434
1609
  const initialCompletionOwnerId = ctx.completionOwnerId ?? currentCompletionOwnerId();
1610
+ const launchParentSessionId = ctx.parentSessionId ?? ctx.currentSessionId;
1435
1611
  try {
1436
- spawnResult = spawnRunner({
1612
+ spawnResultOrPromise = spawnRunner({
1437
1613
  id,
1438
1614
  steps: [
1439
1615
  {
1440
- parentSessionId: ctx.parentSessionId ?? ctx.currentSessionId,
1616
+ parentSessionId: launchParentSessionId,
1441
1617
  permissionRules,
1442
1618
  ...capabilityCeiling ? { capabilityCeiling } : {},
1443
1619
  agent,
1444
1620
  task: taskText,
1445
1621
  ...agentConfig.runner ? { runner: agentConfig.runner } : {},
1622
+ ...machine ? { machine } : {},
1623
+ ...!externalRunner && machine && params.reads !== undefined ? { remoteReads: params.reads } : {},
1624
+ ...machineEnv ? { machineEnv } : {},
1446
1625
  ...params.externalJobFollowUp ? { externalJobFollowUp: params.externalJobFollowUp } : {},
1447
1626
  ...params.context ? { context: params.context } : {},
1448
- cwd: runnerCwd,
1449
- requestedCwd: params.requestedCwd ?? runnerCwd,
1450
- model,
1627
+ cwd: machine?.cwd ?? runnerCwd,
1628
+ requestedCwd: machine?.cwd ?? params.requestedCwd ?? runnerCwd,
1629
+ model: selectedModel,
1451
1630
  ...contextLimit !== undefined ? { contextLimit } : {},
1452
1631
  ...params.fast ?? agentConfig.fast ? { fast: params.fast ?? agentConfig.fast } : {},
1453
- thinking: resolveEffectiveThinking(model, effectiveThinking),
1632
+ thinking: resolveEffectiveThinking(selectedModel, effectiveThinking),
1454
1633
  ...thinkingCeiling ? { thinkingCeiling } : {},
1455
- modelCandidates,
1456
- ...params.modelOverrideFromParent ? { skipPrimaryModelVerification: true } : {},
1634
+ ...requestedModel ? { requestedModel } : {},
1635
+ ...modelOrigin === "inherited" ? { skipPrimaryModelVerification: true } : {},
1457
1636
  ...availableModels && availableModels.length > 0 ? { modelVerificationRegistry: availableModels } : {},
1637
+ ...ctx.modelResponseAliases ? { modelResponseAliases: ctx.modelResponseAliases } : {},
1458
1638
  tools: agentConfig.tools,
1639
+ excludeTools: agentConfig.excludeTools,
1459
1640
  allowNestedSubagents: agentConfig.allowNestedSubagents,
1641
+ allowedAgents: agentConfig.allowedAgents,
1460
1642
  extensions: agentConfig.extensions,
1461
1643
  subagentOnlyExtensions: agentConfig.subagentOnlyExtensions,
1644
+ ...!externalRunner ? { requiredExtensions } : {},
1462
1645
  mcpDirectTools: agentConfig.mcpDirectTools,
1463
- ...toolPlan.mcpConfig ? { mcpConfig: toolPlan.mcpConfig } : {},
1464
- ...toolPlan.runtimeServerNames ? { runtimeServerNames: toolPlan.runtimeServerNames } : {},
1465
1646
  mutationTools: agentConfig.mutationTools,
1466
- completionGuard: agentConfig.completionGuard,
1467
1647
  systemPrompt,
1468
1648
  systemPromptMode: agentConfig.systemPromptMode,
1469
1649
  inheritProjectContext: agentConfig.inheritProjectContext,
@@ -1478,12 +1658,13 @@ ${memoryInjection}` : memoryInjection;
1478
1658
  waitToolEnabled: params.waitToolEnabled,
1479
1659
  waitToolDefaultTimeoutMs: params.waitToolDefaultTimeoutMs,
1480
1660
  ...params.agentContract ? { agentContract: params.agentContract } : {},
1481
- definitionDigest: agentDefinitionDigest(agentConfig),
1661
+ definitionDigest,
1482
1662
  launchBindingTask: task,
1483
1663
  launchContractDigest,
1484
1664
  ...extensionBindings ? { extensionBindings } : {},
1485
1665
  launchResolvedExtensions,
1486
1666
  effectiveAcceptance: resolvedAcceptance,
1667
+ acceptanceInput: params.acceptance,
1487
1668
  ...structuredOutput ? { structuredOutput } : {},
1488
1669
  ...params.structuredOutputSchema ? { structuredOutputSchema: params.structuredOutputSchema } : {},
1489
1670
  ...resolvedToolBudget.budget ? { toolBudget: resolvedToolBudget.budget } : {},
@@ -1504,14 +1685,19 @@ ${memoryInjection}` : memoryInjection;
1504
1685
  completionOwnerId: ctx.completionOwnerId ?? currentCompletionOwnerId(),
1505
1686
  ...capabilityCeiling ? { capabilityCeiling } : {},
1506
1687
  piPackageRoot,
1507
- piArgv1: process.argv[1],
1688
+ childSessionFactoryModule: childSessionFactoryModule(),
1689
+ inheritedChildRuntime: inheritedChildRuntime(ctx.childRuntime),
1508
1690
  worktreeSetupHook,
1509
1691
  worktreeSetupHookTimeoutMs,
1510
1692
  worktreeBaseDir,
1693
+ baseRef,
1694
+ worktreeProvider,
1695
+ worktreeBranchPrefix,
1511
1696
  controlConfig,
1512
1697
  timeoutMs,
1513
1698
  deadlineAt,
1514
1699
  toolTimeoutMs,
1700
+ checkpointBeforeDeadlineMs: params.checkpointBeforeDeadlineMs,
1515
1701
  toolBudget: params.toolBudget,
1516
1702
  usageBudget: params.usageBudget,
1517
1703
  controlIntercomTarget,
@@ -1544,85 +1730,90 @@ ${memoryInjection}` : memoryInjection;
1544
1730
  chainStepCount: 1,
1545
1731
  ...lane ? { lane } : {},
1546
1732
  steps: [{ agent, status: "pending", ...lane ? { lane } : {}, ...model ? { model } : {}, ...contextLimit !== undefined ? { contextLimit } : {} }]
1547
- }, path.join(asyncDir, "status.json"), (proof) => emitProcessTerminalEvent(ctx, proof), params.requestedCwd ?? runnerCwd);
1733
+ }, path.join(asyncDir, "status.json"), launchParentSessionId, (proof) => emitProcessTerminalEvent(ctx, proof), (runnerProcessInstanceId) => params.activeAsyncCapacity?.markStarted(runnerProcessInstanceId), params.requestedCwd ?? runnerCwd);
1548
1734
  } catch (error) {
1549
1735
  params.activeAsyncCapacity?.rollback();
1550
1736
  const message = error instanceof Error ? error.message : String(error);
1551
1737
  return formatAsyncStartError("single", `Failed to start async run '${id}': ${message}`);
1552
1738
  }
1553
- if (spawnResult.error) {
1554
- if (!spawnResult.pid || !spawnResult.runnerProcessInstanceId || spawnResult.startupDidNotProceed && spawnResult.terminationObserved)
1739
+ const finishSpawnResult = (spawnResult) => {
1740
+ if (spawnResult.error) {
1741
+ if (spawnResult.startupDidNotProceed) {
1742
+ if (!spawnResult.runnerProcessInstanceId || params.activeAsyncCapacity?.rollbackBeforeRunnerProceed(spawnResult.runnerProcessInstanceId) !== true)
1743
+ params.activeAsyncCapacity?.rollback();
1744
+ } else if (!spawnResult.pid || !spawnResult.runnerProcessInstanceId)
1745
+ params.activeAsyncCapacity?.rollback();
1746
+ else
1747
+ params.activeAsyncCapacity?.markStarted(spawnResult.runnerProcessInstanceId);
1748
+ return formatAsyncStartError("single", `Failed to start async run '${id}': ${spawnResult.error}`);
1749
+ }
1750
+ if (!spawnResult.pid || !spawnResult.runnerProcessInstanceId) {
1555
1751
  params.activeAsyncCapacity?.rollback();
1556
- else
1557
- params.activeAsyncCapacity?.markStarted(spawnResult.runnerProcessInstanceId);
1558
- return formatAsyncStartError("single", `Failed to start async run '${id}': ${spawnResult.error}`);
1559
- }
1560
- if (!spawnResult.pid || !spawnResult.runnerProcessInstanceId) {
1561
- params.activeAsyncCapacity?.rollback();
1562
- return formatAsyncStartError("single", `Failed to start async run '${id}': runner identity unavailable`);
1563
- }
1564
- params.activeAsyncCapacity?.markStarted(spawnResult.runnerProcessInstanceId);
1565
- if (spawnResult.pid) {
1566
- if (inheritedNestedRoute && nestedAddress) {
1567
- const now = Date.now();
1568
- try {
1569
- writeNestedEvent(inheritedNestedRoute, {
1570
- type: "subagent.nested.started",
1571
- ts: now,
1572
- parentRunId: nestedAddress.parentRunId,
1573
- parentStepIndex: nestedAddress.parentStepIndex,
1574
- child: {
1575
- id,
1752
+ return formatAsyncStartError("single", `Failed to start async run '${id}': runner identity unavailable`);
1753
+ }
1754
+ if (spawnResult.pid) {
1755
+ if (inheritedNestedRoute && nestedAddress) {
1756
+ const now = Date.now();
1757
+ try {
1758
+ writeNestedEvent(inheritedNestedRoute, {
1759
+ type: "subagent.nested.started",
1760
+ ts: now,
1576
1761
  parentRunId: nestedAddress.parentRunId,
1577
1762
  parentStepIndex: nestedAddress.parentStepIndex,
1578
- depth: nestedAddress.depth,
1579
- path: nestedAddress.path,
1580
- asyncDir,
1581
- pid: spawnResult.pid,
1582
- ownerIntercomTarget: process.env.DM_SUBAGENT_INTERCOM_SESSION_NAME,
1583
- leafIntercomTarget: childIntercomTarget?.(agent, 0),
1584
- intercomTarget: childIntercomTarget?.(agent, 0),
1585
- ownerState: "live",
1586
- mode: "single",
1587
- state: "running",
1588
- agent,
1589
- agents: [agent],
1590
- chainStepCount: 1,
1591
- ...timeoutMs !== undefined ? { timeoutMs, deadlineAt } : {},
1592
- startedAt: now,
1593
- lastUpdate: now,
1594
- ...capabilityCeiling ? { capabilityCeiling } : {}
1595
- }
1596
- });
1597
- } catch (error) {
1598
- console.error("Failed to emit nested async start event:", error);
1763
+ child: {
1764
+ id,
1765
+ parentRunId: nestedAddress.parentRunId,
1766
+ parentStepIndex: nestedAddress.parentStepIndex,
1767
+ depth: nestedAddress.depth,
1768
+ path: nestedAddress.path,
1769
+ asyncDir,
1770
+ pid: spawnResult.pid,
1771
+ ownerIntercomTarget: ctx.childRuntime?.intercomSessionName,
1772
+ leafIntercomTarget: childIntercomTarget?.(agent, 0),
1773
+ intercomTarget: childIntercomTarget?.(agent, 0),
1774
+ ownerState: "live",
1775
+ mode: "single",
1776
+ state: "running",
1777
+ agent,
1778
+ agents: [agent],
1779
+ chainStepCount: 1,
1780
+ ...timeoutMs !== undefined ? { timeoutMs, deadlineAt } : {},
1781
+ startedAt: now,
1782
+ lastUpdate: now,
1783
+ ...capabilityCeiling ? { capabilityCeiling } : {}
1784
+ }
1785
+ });
1786
+ } catch (error) {
1787
+ console.error("Failed to emit nested async start event:", error);
1788
+ }
1599
1789
  }
1790
+ ctx.dm.events.emit(SUBAGENT_ASYNC_STARTED_EVENT, {
1791
+ lifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,
1792
+ id,
1793
+ pid: spawnResult.pid,
1794
+ sessionId: ctx.currentSessionId,
1795
+ completionOwnerId: ctx.completionOwnerId ?? currentCompletionOwnerId(),
1796
+ mode: "single",
1797
+ agent,
1798
+ task: task?.trim() ? PROMPT_REDACTED : undefined,
1799
+ goal: (params.goal ?? task).trim() ? PROMPT_REDACTED : undefined,
1800
+ cwd: runnerCwd,
1801
+ asyncDir,
1802
+ ...sessionRoot ? { sessionRoot } : {},
1803
+ launchContractDigest,
1804
+ launchResolvedExtensions,
1805
+ ...params.parentWorkflowRunId ? { parentWorkflowRunId: params.parentWorkflowRunId } : {},
1806
+ ...params.workflowKey ? { workflowKey: params.workflowKey } : {},
1807
+ ...timeoutMs !== undefined ? { timeoutMs, deadlineAt } : {},
1808
+ ...initialUsageBudget ? { usageBudget: initialUsageBudget } : {},
1809
+ ...capabilityCeiling ? { capabilityCeiling } : {},
1810
+ nestedRoute
1811
+ });
1600
1812
  }
1601
- ctx.dm.events.emit(SUBAGENT_ASYNC_STARTED_EVENT, {
1602
- lifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,
1603
- id,
1604
- pid: spawnResult.pid,
1605
- sessionId: ctx.currentSessionId,
1606
- completionOwnerId: ctx.completionOwnerId ?? currentCompletionOwnerId(),
1607
- mode: "single",
1608
- agent,
1609
- task: task?.trim() ? PROMPT_REDACTED : undefined,
1610
- goal: (params.goal ?? task).trim() ? PROMPT_REDACTED : undefined,
1611
- cwd: runnerCwd,
1612
- asyncDir,
1613
- ...sessionRoot ? { sessionRoot } : {},
1614
- launchContractDigest,
1615
- launchResolvedExtensions,
1616
- ...params.parentWorkflowRunId ? { parentWorkflowRunId: params.parentWorkflowRunId } : {},
1617
- ...params.workflowKey ? { workflowKey: params.workflowKey } : {},
1618
- ...timeoutMs !== undefined ? { timeoutMs, deadlineAt } : {},
1619
- ...initialUsageBudget ? { usageBudget: initialUsageBudget } : {},
1620
- ...capabilityCeiling ? { capabilityCeiling } : {},
1621
- nestedRoute
1622
- });
1623
- }
1624
- return {
1625
- content: [{ type: "text", text: formatAsyncStartedMessage(`Async: ${agent} [${id}]`, ctx.interactive === true) }],
1626
- details: { mode: "single", runId: id, results: [], asyncId: id, asyncDir, launchContractDigest, launchResolvedExtensions, ...capabilityCeiling ? { capabilityCeiling } : {}, ...params.context ? { context: params.context } : {}, ...timeoutMs !== undefined ? { timeoutMs, deadlineAt } : {}, ...params.toolBudget ? { toolBudget: resolvedToolBudget.budget ?? params.toolBudget } : {}, ...initialUsageBudget ? { usageBudget: initialUsageBudget } : {} }
1813
+ return {
1814
+ content: [{ type: "text", text: formatAsyncStartedMessage(`Async: ${agent} [${id}]`, ctx.interactive === true) }],
1815
+ details: { mode: "single", runId: id, results: [], asyncId: id, asyncDir, launchContractDigest, launchResolvedExtensions, ...capabilityCeiling ? { capabilityCeiling } : {}, ...params.context ? { context: params.context } : {}, ...timeoutMs !== undefined ? { timeoutMs, deadlineAt } : {}, ...params.toolBudget ? { toolBudget: resolvedToolBudget.budget ?? params.toolBudget } : {}, ...initialUsageBudget ? { usageBudget: initialUsageBudget } : {} }
1816
+ };
1627
1817
  };
1818
+ return spawnResultOrPromise instanceof Promise ? spawnResultOrPromise.then(finishSpawnResult) : finishSpawnResult(spawnResultOrPromise);
1628
1819
  }