@bastani/atomic 0.9.12 → 0.9.13-alpha.1

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 (264) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/builtin/intercom/CHANGELOG.md +6 -0
  3. package/dist/builtin/intercom/README.md +5 -12
  4. package/dist/builtin/intercom/broker/client.ts +11 -2
  5. package/dist/builtin/intercom/contact-supervisor-tool.ts +13 -3
  6. package/dist/builtin/intercom/index-heavy.ts +13 -3
  7. package/dist/builtin/intercom/index.ts +43 -19
  8. package/dist/builtin/intercom/intercom-utils.ts +15 -29
  9. package/dist/builtin/intercom/package.json +1 -1
  10. package/dist/builtin/intercom/source-ownership.ts +9 -12
  11. package/dist/builtin/mcp/CHANGELOG.md +6 -0
  12. package/dist/builtin/mcp/README.md +3 -1
  13. package/dist/builtin/mcp/index.ts +10 -16
  14. package/dist/builtin/mcp/package.json +1 -1
  15. package/dist/builtin/mcp/startup-warmup.ts +20 -8
  16. package/dist/builtin/subagents/CHANGELOG.md +30 -0
  17. package/dist/builtin/subagents/README.md +22 -30
  18. package/dist/builtin/subagents/package.json +1 -1
  19. package/dist/builtin/subagents/src/extension/doctor.ts +1 -1
  20. package/dist/builtin/subagents/src/extension/fanout-child.ts +76 -56
  21. package/dist/builtin/subagents/src/extension/index.ts +23 -32
  22. package/dist/builtin/subagents/src/extension/startup-maintenance.ts +25 -44
  23. package/dist/builtin/subagents/src/intercom/result-intercom.ts +7 -7
  24. package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +166 -434
  25. package/dist/builtin/subagents/src/runs/background/notify.ts +29 -8
  26. package/dist/builtin/subagents/src/runs/foreground/chain-execution-dynamic-step.ts +2 -2
  27. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +4 -4
  28. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +2 -2
  29. package/dist/builtin/subagents/src/runs/foreground/chain-execution-sequential-step.ts +2 -2
  30. package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +1 -281
  31. package/dist/builtin/subagents/src/runs/foreground/execution-structured-retries.ts +11 -75
  32. package/dist/builtin/subagents/src/runs/foreground/inprocess-run-sync.ts +457 -0
  33. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +119 -246
  34. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-chain.ts +1 -1
  35. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +18 -9
  36. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +1 -1
  37. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +4 -4
  38. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +1 -646
  39. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-runtime.ts +2 -7
  40. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +5 -5
  41. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +7 -8
  42. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +14 -5
  43. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +158 -93
  44. package/dist/builtin/subagents/src/runs/inprocess/background-single.ts +179 -0
  45. package/dist/builtin/subagents/src/runs/inprocess/background.ts +89 -0
  46. package/dist/builtin/subagents/src/runs/inprocess/child-policy.ts +27 -0
  47. package/dist/builtin/subagents/src/runs/inprocess/control-registry.ts +55 -0
  48. package/dist/builtin/subagents/src/runs/inprocess/control-status.ts +106 -0
  49. package/dist/builtin/subagents/src/runs/inprocess/index.ts +50 -0
  50. package/dist/builtin/subagents/src/runs/inprocess/nested-routing.ts +218 -0
  51. package/dist/builtin/subagents/src/runs/{shared/subagent-prompt-runtime.ts → inprocess/prompt-behavior.ts} +37 -75
  52. package/dist/builtin/subagents/src/runs/inprocess/runner.ts +1138 -0
  53. package/dist/builtin/subagents/src/runs/{shared/nested-events.ts → inprocess/runtime-support/nested-api.ts} +13 -7
  54. package/dist/builtin/subagents/src/runs/{shared/nested-events-control.ts → inprocess/runtime-support/nested-control.ts} +18 -17
  55. package/dist/builtin/subagents/src/runs/{shared/nested-events-core.ts → inprocess/runtime-support/nested-core.ts} +14 -61
  56. package/dist/builtin/subagents/src/runs/{shared/nested-events-projection.ts → inprocess/runtime-support/nested-projection.ts} +4 -10
  57. package/dist/builtin/subagents/src/runs/{shared/nested-events-registry.ts → inprocess/runtime-support/nested-registry.ts} +19 -4
  58. package/dist/builtin/subagents/src/runs/{shared/nested-render.ts → inprocess/runtime-support/nested-rendering.ts} +3 -3
  59. package/dist/builtin/subagents/src/runs/{shared/nested-events-sanitize.ts → inprocess/runtime-support/nested-sanitize.ts} +3 -3
  60. package/dist/builtin/subagents/src/runs/inprocess.ts +1 -0
  61. package/dist/builtin/subagents/src/runs/shared/dynamic-fanout.ts +10 -4
  62. package/dist/builtin/subagents/src/runs/shared/model-candidate-filter.ts +0 -1
  63. package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +15 -492
  64. package/dist/builtin/subagents/src/runs/shared/parallel-utils.ts +13 -11
  65. package/dist/builtin/subagents/src/runs/shared/run-history.ts +3 -5
  66. package/dist/builtin/subagents/src/runs/shared/single-output.ts +4 -4
  67. package/dist/builtin/subagents/src/runs/shared/workflow-graph.ts +5 -5
  68. package/dist/builtin/subagents/src/shared/types-async.ts +0 -1
  69. package/dist/builtin/subagents/src/shared/types-config.ts +18 -0
  70. package/dist/builtin/subagents/src/shared/types-results.ts +9 -2
  71. package/dist/builtin/subagents/src/slash/prompt-template-bridge.ts +2 -3
  72. package/dist/builtin/subagents/src/slash/slash-live-state.ts +2 -2
  73. package/dist/builtin/subagents/src/tui/render-chain-graph.ts +10 -4
  74. package/dist/builtin/subagents/src/tui/render-event-formatting.ts +12 -11
  75. package/dist/builtin/subagents/src/tui/render-result-compact.ts +49 -12
  76. package/dist/builtin/subagents/src/tui/render-result.ts +46 -17
  77. package/dist/builtin/subagents/src/tui/render-stable-output.ts +1 -1
  78. package/dist/builtin/subagents/src/tui/render-status-progress.ts +8 -5
  79. package/dist/builtin/subagents/src/tui/render-widget-graph.ts +0 -8
  80. package/dist/builtin/subagents/src/tui/render-widget.ts +0 -24
  81. package/dist/builtin/web-access/package.json +1 -1
  82. package/dist/builtin/workflows/CHANGELOG.md +25 -0
  83. package/dist/builtin/workflows/README.md +13 -3
  84. package/dist/builtin/workflows/package.json +1 -1
  85. package/dist/builtin/workflows/src/durable/backend.ts +7 -0
  86. package/dist/builtin/workflows/src/durable/dbos-metadata.ts +11 -1
  87. package/dist/builtin/workflows/src/durable/resume-runtime.ts +1 -0
  88. package/dist/builtin/workflows/src/durable/tool-primitive.ts +4 -28
  89. package/dist/builtin/workflows/src/durable/types.ts +5 -0
  90. package/dist/builtin/workflows/src/engine/run.ts +17 -1
  91. package/dist/builtin/workflows/src/extension/atomic-stage-session.ts +12 -39
  92. package/dist/builtin/workflows/src/extension/config-file-loader.ts +10 -1
  93. package/dist/builtin/workflows/src/extension/config-loader.ts +1 -1
  94. package/dist/builtin/workflows/src/extension/dispatcher.ts +4 -0
  95. package/dist/builtin/workflows/src/extension/index.bundle.mjs +1151 -737
  96. package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +303 -38
  97. package/dist/builtin/workflows/src/extension/render-result.ts +4 -0
  98. package/dist/builtin/workflows/src/extension/runtime-durable-resume.ts +6 -3
  99. package/dist/builtin/workflows/src/extension/runtime.ts +7 -1
  100. package/dist/builtin/workflows/src/extension/wiring.ts +53 -11
  101. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +12 -3
  102. package/dist/builtin/workflows/src/extension/workflow-durable-resume-command.ts +5 -2
  103. package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +9 -7
  104. package/dist/builtin/workflows/src/extension/workflow-status-summary.ts +11 -0
  105. package/dist/builtin/workflows/src/extension/workflow-tool-content.ts +18 -1
  106. package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +10 -8
  107. package/dist/builtin/workflows/src/extension/workflow-tool.ts +9 -4
  108. package/dist/builtin/workflows/src/runs/background/quit.ts +28 -4
  109. package/dist/builtin/workflows/src/runs/background/resume-acknowledgements.ts +2 -1
  110. package/dist/builtin/workflows/src/runs/background/status.ts +55 -8
  111. package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +4 -0
  112. package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +3 -1
  113. package/dist/builtin/workflows/src/runs/foreground/executor-stage-control.ts +1 -1
  114. package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +1 -1
  115. package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +688 -38
  116. package/dist/builtin/workflows/src/runs/foreground/stage-runner-types.ts +3 -1
  117. package/dist/builtin/workflows/src/runs/shared/model-fallback-failures.ts +19 -514
  118. package/dist/builtin/workflows/src/runs/shared/retry.ts +44 -0
  119. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +5 -0
  120. package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +6 -0
  121. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +5 -1
  122. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +5 -0
  123. package/dist/builtin/workflows/src/shared/persistence-restore-helpers.ts +5 -0
  124. package/dist/builtin/workflows/src/shared/persistence-restore.ts +3 -0
  125. package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +4 -0
  126. package/dist/builtin/workflows/src/shared/run-indicator-status.ts +75 -0
  127. package/dist/builtin/workflows/src/shared/store-public-types.ts +43 -7
  128. package/dist/builtin/workflows/src/shared/store-run-methods.ts +42 -8
  129. package/dist/builtin/workflows/src/shared/store-stage-methods.ts +31 -8
  130. package/dist/builtin/workflows/src/shared/store-types.ts +34 -0
  131. package/dist/builtin/workflows/src/shared/timing.ts +10 -0
  132. package/dist/builtin/workflows/src/tui/chat-surface-message.ts +22 -2
  133. package/dist/builtin/workflows/src/tui/session-list.ts +1 -1
  134. package/dist/builtin/workflows/src/tui/session-overlays.ts +14 -10
  135. package/dist/builtin/workflows/src/tui/session-picker.ts +20 -4
  136. package/dist/builtin/workflows/src/tui/status-list.ts +31 -47
  137. package/dist/builtin/workflows/src/tui/store-widget-installer.ts +9 -1
  138. package/dist/builtin/workflows/src/tui/widget.ts +16 -46
  139. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  140. package/dist/core/agent-session-auto-compaction.js +54 -11
  141. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  142. package/dist/core/agent-session-events.d.ts.map +1 -1
  143. package/dist/core/agent-session-events.js +49 -14
  144. package/dist/core/agent-session-events.js.map +1 -1
  145. package/dist/core/agent-session-methods.d.ts +13 -0
  146. package/dist/core/agent-session-methods.d.ts.map +1 -1
  147. package/dist/core/agent-session-methods.js.map +1 -1
  148. package/dist/core/agent-session-models.d.ts.map +1 -1
  149. package/dist/core/agent-session-models.js +12 -1
  150. package/dist/core/agent-session-models.js.map +1 -1
  151. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  152. package/dist/core/agent-session-prompt.js +4 -0
  153. package/dist/core/agent-session-prompt.js.map +1 -1
  154. package/dist/core/agent-session-retry.d.ts +21 -4
  155. package/dist/core/agent-session-retry.d.ts.map +1 -1
  156. package/dist/core/agent-session-retry.js +232 -106
  157. package/dist/core/agent-session-retry.js.map +1 -1
  158. package/dist/core/agent-session-state.d.ts.map +1 -1
  159. package/dist/core/agent-session-state.js +2 -1
  160. package/dist/core/agent-session-state.js.map +1 -1
  161. package/dist/core/agent-session-tool-hooks.d.ts.map +1 -1
  162. package/dist/core/agent-session-tool-hooks.js +12 -0
  163. package/dist/core/agent-session-tool-hooks.js.map +1 -1
  164. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  165. package/dist/core/agent-session-tool-registry.js +1 -1
  166. package/dist/core/agent-session-tool-registry.js.map +1 -1
  167. package/dist/core/agent-session-types.d.ts +3 -1
  168. package/dist/core/agent-session-types.d.ts.map +1 -1
  169. package/dist/core/agent-session-types.js.map +1 -1
  170. package/dist/core/agent-session.d.ts +12 -1
  171. package/dist/core/agent-session.d.ts.map +1 -1
  172. package/dist/core/agent-session.js +7 -0
  173. package/dist/core/agent-session.js.map +1 -1
  174. package/dist/core/extensions/context-types.d.ts +25 -0
  175. package/dist/core/extensions/context-types.d.ts.map +1 -1
  176. package/dist/core/extensions/context-types.js.map +1 -1
  177. package/dist/core/extensions/index.d.ts +1 -1
  178. package/dist/core/extensions/index.d.ts.map +1 -1
  179. package/dist/core/extensions/index.js.map +1 -1
  180. package/dist/core/extensions/runner-context.d.ts +2 -1
  181. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  182. package/dist/core/extensions/runner-context.js +4 -0
  183. package/dist/core/extensions/runner-context.js.map +1 -1
  184. package/dist/core/extensions/runner.d.ts +3 -2
  185. package/dist/core/extensions/runner.d.ts.map +1 -1
  186. package/dist/core/extensions/runner.js +3 -1
  187. package/dist/core/extensions/runner.js.map +1 -1
  188. package/dist/core/model-fallback-failures.d.ts +30 -0
  189. package/dist/core/model-fallback-failures.d.ts.map +1 -0
  190. package/dist/core/model-fallback-failures.js +610 -0
  191. package/dist/core/model-fallback-failures.js.map +1 -0
  192. package/dist/core/retry-policy.d.ts +30 -0
  193. package/dist/core/retry-policy.d.ts.map +1 -0
  194. package/dist/core/retry-policy.js +25 -0
  195. package/dist/core/retry-policy.js.map +1 -0
  196. package/dist/core/sdk-types.d.ts +8 -2
  197. package/dist/core/sdk-types.d.ts.map +1 -1
  198. package/dist/core/sdk-types.js.map +1 -1
  199. package/dist/core/sdk.d.ts.map +1 -1
  200. package/dist/core/sdk.js +6 -1
  201. package/dist/core/sdk.js.map +1 -1
  202. package/dist/core/session-manager-core.d.ts +2 -0
  203. package/dist/core/session-manager-core.d.ts.map +1 -1
  204. package/dist/core/session-manager-core.js +7 -0
  205. package/dist/core/session-manager-core.js.map +1 -1
  206. package/dist/index-extensions.d.ts +1 -1
  207. package/dist/index-extensions.d.ts.map +1 -1
  208. package/dist/index-extensions.js.map +1 -1
  209. package/dist/index.d.ts +3 -0
  210. package/dist/index.d.ts.map +1 -1
  211. package/dist/index.js +2 -0
  212. package/dist/index.js.map +1 -1
  213. package/docs/intercom.md +5 -10
  214. package/docs/settings.md +7 -1
  215. package/docs/subagents.md +19 -19
  216. package/docs/workflows.md +21 -5
  217. package/examples/extensions/gondolin/package-lock.json +3 -3
  218. package/npm-shrinkwrap.json +29 -29
  219. package/package.json +2 -2
  220. package/dist/builtin/subagents/src/runs/background/async-event-journal.ts +0 -112
  221. package/dist/builtin/subagents/src/runs/background/async-execution-chain.ts +0 -543
  222. package/dist/builtin/subagents/src/runs/background/async-execution-common.ts +0 -140
  223. package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +0 -279
  224. package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +0 -99
  225. package/dist/builtin/subagents/src/runs/background/async-execution.ts +0 -17
  226. package/dist/builtin/subagents/src/runs/background/async-resume.ts +0 -402
  227. package/dist/builtin/subagents/src/runs/background/async-status.ts +0 -411
  228. package/dist/builtin/subagents/src/runs/background/completion-claims.ts +0 -196
  229. package/dist/builtin/subagents/src/runs/background/completion-dedupe.ts +0 -102
  230. package/dist/builtin/subagents/src/runs/background/parallel-groups.ts +0 -59
  231. package/dist/builtin/subagents/src/runs/background/result-delivery-processor.ts +0 -300
  232. package/dist/builtin/subagents/src/runs/background/result-file-claims.ts +0 -166
  233. package/dist/builtin/subagents/src/runs/background/result-quarantine.ts +0 -77
  234. package/dist/builtin/subagents/src/runs/background/result-retry-scheduler.ts +0 -48
  235. package/dist/builtin/subagents/src/runs/background/result-status.ts +0 -87
  236. package/dist/builtin/subagents/src/runs/background/result-watcher-data.ts +0 -72
  237. package/dist/builtin/subagents/src/runs/background/result-watcher.ts +0 -320
  238. package/dist/builtin/subagents/src/runs/background/run-id-resolver.ts +0 -105
  239. package/dist/builtin/subagents/src/runs/background/run-status.ts +0 -358
  240. package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +0 -457
  241. package/dist/builtin/subagents/src/runs/background/subagent-runner-dynamic.ts +0 -376
  242. package/dist/builtin/subagents/src/runs/background/subagent-runner-finalize.ts +0 -150
  243. package/dist/builtin/subagents/src/runs/background/subagent-runner-output.ts +0 -109
  244. package/dist/builtin/subagents/src/runs/background/subagent-runner-parallel-helpers.ts +0 -128
  245. package/dist/builtin/subagents/src/runs/background/subagent-runner-parallel.ts +0 -309
  246. package/dist/builtin/subagents/src/runs/background/subagent-runner-sequential.ts +0 -173
  247. package/dist/builtin/subagents/src/runs/background/subagent-runner-state.ts +0 -578
  248. package/dist/builtin/subagents/src/runs/background/subagent-runner-step.ts +0 -330
  249. package/dist/builtin/subagents/src/runs/background/subagent-runner-streaming.ts +0 -330
  250. package/dist/builtin/subagents/src/runs/background/subagent-runner-types.ts +0 -210
  251. package/dist/builtin/subagents/src/runs/background/subagent-runner-utils.ts +0 -69
  252. package/dist/builtin/subagents/src/runs/background/subagent-runner.ts +0 -90
  253. package/dist/builtin/subagents/src/runs/background/top-level-async.ts +0 -12
  254. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-control.ts +0 -140
  255. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-finalize.ts +0 -108
  256. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-types.ts +0 -17
  257. package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +0 -558
  258. package/dist/builtin/subagents/src/runs/shared/attempt-watchdog.ts +0 -126
  259. package/dist/builtin/subagents/src/runs/shared/final-drain.ts +0 -39
  260. package/dist/builtin/subagents/src/runs/shared/pi-args.ts +0 -339
  261. package/dist/builtin/subagents/src/runs/shared/pi-spawn.ts +0 -165
  262. package/dist/builtin/subagents/src/runs/shared/spawn-env.ts +0 -21
  263. package/dist/builtin/subagents/src/shared/post-exit-stdio-guard.ts +0 -86
  264. /package/dist/builtin/subagents/src/runs/{shared/nested-path.ts → inprocess/runtime-support/nested-paths.ts} +0 -0
@@ -1,651 +1,6 @@
1
- import { randomUUID } from "node:crypto";
2
- import * as fs from "node:fs";
3
1
  import * as path from "node:path";
4
- import type { ExtensionContext } from "@bastani/atomic";
5
- import { resolveExecutionAgentScope } from "../../agents/agent-scope.ts";
6
- import {
7
- applyIntercomBridgeToAgent,
8
- resolveIntercomBridge,
9
- resolveIntercomSessionTarget,
10
- resolveSubagentIntercomTarget,
11
- } from "../../intercom/intercom-bridge.ts";
12
- import { deliverSubagentIntercomMessageEvent } from "../../intercom/result-intercom.ts";
13
- import { requestSupervisorAuthorization } from "../../intercom/supervisor-authorization.ts";
14
- import { toModelInfo } from "../../shared/model-info.ts";
15
- import { resolveCurrentSessionId } from "../../shared/session-identity.ts";
16
- import { resolveSingleProgress } from "../../shared/settings.ts";
17
- import {
18
- type ArtifactConfig,
19
- checkSubagentDepth,
20
- DEFAULT_ARTIFACT_CONFIG,
21
- isWorkflowStageOrchestrationContext,
22
- type NestedRunSummary,
23
- resolveSubagentDepthPolicy,
24
- resolveWorkflowStageMaxSubagentDepth,
25
- type SubagentState,
26
- type SubagentToolResult,
27
- subagentDepthBlockedMessage,
28
- workflowSessionMetadataFromContext,
29
- } from "../../shared/types.ts";
30
- import { readStatus } from "../../shared/utils.ts";
31
- import { buildRevivedAsyncTask, resolveAsyncResumeTarget } from "../background/async-resume.ts";
32
- import { type ResolvedSubagentRunId, resolveSubagentRunId } from "../background/run-id-resolver.ts";
33
- import { inheritedIntercomGroup } from "../shared/intercom-group.ts";
34
- import { currentModelFullId } from "../shared/model-fallback.ts";
35
- import {
36
- createNestedRoute,
37
- type NestedRunResolutionScope,
38
- readNestedControlResults,
39
- resolveInheritedNestedRouteFromEnv,
40
- resolveNestedAsyncDir,
41
- resolveNestedParentAddressFromEnv,
42
- writeNestedControlRequest,
43
- } from "../shared/nested-events.ts";
44
- import { resolveControlConfig } from "../shared/subagent-control.ts";
45
- import type { ResolvedExecutorDeps, SubagentParamsLike } from "./subagent-executor-types.ts";
46
-
47
- const ASYNC_INTERRUPT_SIGNAL: NodeJS.Signals = process.platform === "win32" ? "SIGBREAK" : "SIGUSR2";
48
2
 
3
+ /** Resolve a caller-provided cwd against the current session cwd. */
49
4
  export function resolveRequestedCwd(runtimeCwd: string, requestedCwd: string | undefined): string {
50
5
  return requestedCwd ? path.resolve(runtimeCwd, requestedCwd) : runtimeCwd;
51
6
  }
52
-
53
- export function nestedResolutionScopeForExecutor(deps: ResolvedExecutorDeps): NestedRunResolutionScope | undefined {
54
- if (deps.allowMutatingManagementActions !== false) return undefined;
55
- const route = resolveInheritedNestedRouteFromEnv();
56
- const address = route ? resolveNestedParentAddressFromEnv() : undefined;
57
- return {
58
- routes: route ? [route] : [],
59
- ...(address
60
- ? {
61
- descendantOf: {
62
- parentRunId: address.parentRunId,
63
- ...(address.parentStepIndex !== undefined ? { parentStepIndex: address.parentStepIndex } : {}),
64
- },
65
- }
66
- : {}),
67
- };
68
- }
69
-
70
- function resolveForegroundResumeTarget(
71
- params: SubagentParamsLike,
72
- state: SubagentState,
73
- ):
74
- | {
75
- runId: string;
76
- mode: "single" | "parallel" | "chain";
77
- state: "complete";
78
- agent: string;
79
- index: number;
80
- intercomTarget: string;
81
- cwd: string;
82
- sessionFile: string;
83
- }
84
- | undefined {
85
- const requested = (params.id ?? params.runId)?.trim();
86
- if (!requested || !state.foregroundRuns?.size) return undefined;
87
- const direct = state.foregroundRuns.get(requested);
88
- const matches = direct
89
- ? [direct]
90
- : [...state.foregroundRuns.values()].filter((run) => run.runId.startsWith(requested));
91
- if (matches.length === 0) return undefined;
92
- if (matches.length > 1)
93
- throw new Error(
94
- `Ambiguous foreground run id prefix '${requested}' matched: ${matches.map((run) => run.runId).join(", ")}. Provide a longer id.`,
95
- );
96
- const run = matches[0]!;
97
- if (run.children.length > 1 && params.index === undefined)
98
- throw new Error(
99
- `Foreground run '${run.runId}' has ${run.children.length} children. Provide index to choose one.`,
100
- );
101
- const index = params.index ?? 0;
102
- if (!Number.isInteger(index)) throw new Error(`Foreground run '${run.runId}' index must be an integer.`);
103
- if (index < 0 || index >= run.children.length)
104
- throw new Error(
105
- `Foreground run '${run.runId}' has ${run.children.length} children. Index ${index} is out of range.`,
106
- );
107
- const child = run.children[index]!;
108
- if (child.status === "detached")
109
- throw new Error(
110
- `Foreground run '${run.runId}' child ${index} is detached for intercom coordination and cannot be revived safely from the remembered foreground state. Reply to the supervisor request first; after the child exits, start a fresh follow-up if needed.`,
111
- );
112
- if (!child.sessionFile)
113
- throw new Error(
114
- `Foreground run '${run.runId}' child ${index} does not have a persisted session file to resume from.`,
115
- );
116
- if (path.extname(child.sessionFile) !== ".jsonl")
117
- throw new Error(
118
- `Foreground run '${run.runId}' child ${index} session file must be a .jsonl file: ${child.sessionFile}`,
119
- );
120
- const sessionFile = path.resolve(child.sessionFile);
121
- if (!fs.existsSync(sessionFile))
122
- throw new Error(`Foreground run '${run.runId}' child ${index} session file does not exist: ${child.sessionFile}`);
123
- return {
124
- runId: run.runId,
125
- mode: run.mode,
126
- state: "complete",
127
- agent: child.agent,
128
- index,
129
- intercomTarget: resolveSubagentIntercomTarget(run.runId, child.agent, index),
130
- cwd: run.cwd,
131
- sessionFile,
132
- };
133
- }
134
-
135
- type AsyncResumeSourceTarget = ReturnType<typeof resolveAsyncResumeTarget> & { source: "async" };
136
- type ForegroundResumeSourceTarget = NonNullable<ReturnType<typeof resolveForegroundResumeTarget>> & {
137
- kind: "revive";
138
- source: "foreground";
139
- };
140
- type NestedResumeSourceTarget = {
141
- kind: "revive";
142
- source: "nested";
143
- runId: string;
144
- state: "complete" | "failed" | "paused";
145
- agent: string;
146
- index: number;
147
- intercomTarget: string;
148
- cwd?: string;
149
- sessionFile: string;
150
- };
151
- type ResumeSourceTarget = AsyncResumeSourceTarget | ForegroundResumeSourceTarget | NestedResumeSourceTarget;
152
-
153
- function isAsyncRunNotFound(error: unknown): boolean {
154
- return error instanceof Error && error.message.startsWith("Async run not found.");
155
- }
156
-
157
- function isResumeAmbiguity(error: unknown): boolean {
158
- return error instanceof Error && /Ambiguous .*run id prefix/.test(error.message);
159
- }
160
-
161
- function resumeTargetExact(target: { runId: string } | undefined, requested: string): boolean {
162
- return target?.runId === requested;
163
- }
164
-
165
- function escapeRegExp(value: string): string {
166
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
167
- }
168
-
169
- function isExactResumeError(error: unknown, source: "async" | "foreground", requested: string): boolean {
170
- if (!(error instanceof Error) || !requested) return false;
171
- return new RegExp(`\\b${source} run '${escapeRegExp(requested)}'`, "i").test(error.message);
172
- }
173
-
174
- function resolveResumeTarget(params: SubagentParamsLike, state: SubagentState): ResumeSourceTarget {
175
- const requested = (params.id ?? params.runId)?.trim() ?? "";
176
- let foregroundTarget: ForegroundResumeSourceTarget | undefined;
177
- let foregroundError: unknown;
178
- let asyncTarget: AsyncResumeSourceTarget | undefined;
179
- let asyncError: unknown;
180
-
181
- try {
182
- const target = resolveForegroundResumeTarget(params, state);
183
- if (target) foregroundTarget = { kind: "revive", source: "foreground", ...target };
184
- } catch (error) {
185
- foregroundError = error;
186
- }
187
- try {
188
- asyncTarget = { source: "async", ...resolveAsyncResumeTarget(params) };
189
- } catch (error) {
190
- asyncError = error;
191
- }
192
-
193
- if (foregroundTarget && asyncTarget) {
194
- const foregroundExact = resumeTargetExact(foregroundTarget, requested);
195
- const asyncExact = resumeTargetExact(asyncTarget, requested);
196
- if (foregroundExact && !asyncExact) return foregroundTarget;
197
- if (asyncExact && !foregroundExact) return asyncTarget;
198
- throw new Error(
199
- `Resume id '${requested}' is ambiguous between foreground run '${foregroundTarget.runId}' and async run '${asyncTarget.runId}'. Provide a full run id.`,
200
- );
201
- }
202
- if (foregroundTarget) {
203
- if (isExactResumeError(asyncError, "async", requested)) throw asyncError;
204
- if (isResumeAmbiguity(asyncError) && !resumeTargetExact(foregroundTarget, requested)) throw asyncError;
205
- return foregroundTarget;
206
- }
207
- if (asyncTarget) {
208
- if (isExactResumeError(foregroundError, "foreground", requested)) throw foregroundError;
209
- if (isResumeAmbiguity(foregroundError) && !resumeTargetExact(asyncTarget, requested)) throw foregroundError;
210
- return asyncTarget;
211
- }
212
- if (foregroundError && !isAsyncRunNotFound(asyncError)) throw foregroundError;
213
- if (foregroundError) throw foregroundError;
214
- if (asyncError) throw asyncError;
215
- throw new Error("Run not found. Provide id or runId.");
216
- }
217
-
218
- function getAsyncInterruptTarget(
219
- state: SubagentState,
220
- runId: string | undefined,
221
- ): { asyncId: string; asyncDir: string } | undefined {
222
- if (runId) {
223
- const direct = state.asyncJobs.get(runId);
224
- if (direct) return { asyncId: direct.asyncId, asyncDir: direct.asyncDir };
225
- }
226
- let newest: { asyncId: string; asyncDir: string; updatedAt: number } | undefined;
227
- for (const job of state.asyncJobs.values()) {
228
- if (job.status !== "running") continue;
229
- if (!newest || (job.updatedAt ?? 0) > newest.updatedAt) {
230
- newest = { asyncId: job.asyncId, asyncDir: job.asyncDir, updatedAt: job.updatedAt ?? 0 };
231
- }
232
- }
233
- return newest ? { asyncId: newest.asyncId, asyncDir: newest.asyncDir } : undefined;
234
- }
235
-
236
- export function interruptAsyncRun(state: SubagentState, runId: string | undefined): SubagentToolResult | null {
237
- const target = getAsyncInterruptTarget(state, runId);
238
- if (!target) return null;
239
- const status = readStatus(target.asyncDir);
240
- if (status?.state !== "running" || typeof status.pid !== "number") {
241
- return {
242
- content: [
243
- {
244
- type: "text",
245
- text: `No running async run with an interrupt-capable pid was found for '${runId ?? "current"}'.`,
246
- },
247
- ],
248
- isError: true,
249
- details: { mode: "management", results: [] },
250
- };
251
- }
252
- try {
253
- process.kill(status.pid, ASYNC_INTERRUPT_SIGNAL);
254
- const tracked = state.asyncJobs.get(target.asyncId);
255
- if (tracked) {
256
- tracked.activityState = undefined;
257
- tracked.updatedAt = Date.now();
258
- }
259
- return {
260
- content: [{ type: "text", text: `Interrupt requested for async run ${target.asyncId}.` }],
261
- details: { mode: "management", results: [] },
262
- };
263
- } catch (error) {
264
- const message = error instanceof Error ? error.message : String(error);
265
- return {
266
- content: [{ type: "text", text: `Failed to interrupt async run ${target.asyncId}: ${message}` }],
267
- isError: true,
268
- details: { mode: "management", results: [] },
269
- };
270
- }
271
- }
272
-
273
- function nestedRunSessionFile(run: NestedRunSummary): string | undefined {
274
- return run.sessionFile ?? (run.steps?.length === 1 ? run.steps[0]?.sessionFile : undefined);
275
- }
276
-
277
- function nestedRunAgent(run: NestedRunSummary): string | undefined {
278
- return run.agent ?? run.agents?.[0] ?? (run.steps?.length === 1 ? run.steps[0]?.agent : undefined);
279
- }
280
-
281
- function pathWithin(base: string, candidate: string): boolean {
282
- const resolvedBase = path.resolve(base);
283
- const resolvedCandidate = path.resolve(candidate);
284
- return resolvedCandidate === resolvedBase || resolvedCandidate.startsWith(`${resolvedBase}${path.sep}`);
285
- }
286
-
287
- function validateNestedSessionFile(run: NestedRunSummary, trustedSessionRoots: string[]): string {
288
- const sessionFile = nestedRunSessionFile(run);
289
- if (!sessionFile) throw new Error(`Nested run '${run.id}' does not have a persisted session file to resume from.`);
290
- if (path.extname(sessionFile) !== ".jsonl")
291
- throw new Error(`Nested run '${run.id}' session file must be a .jsonl file: ${sessionFile}`);
292
- const resolved = path.resolve(sessionFile);
293
- if (!path.isAbsolute(sessionFile))
294
- throw new Error(`Nested run '${run.id}' session file must be absolute: ${sessionFile}`);
295
- if (!fs.existsSync(resolved)) throw new Error(`Nested run '${run.id}' session file does not exist: ${sessionFile}`);
296
- const stat = fs.lstatSync(resolved);
297
- if (!stat.isFile() || stat.isSymbolicLink())
298
- throw new Error(`Nested run '${run.id}' session file is not a regular file: ${sessionFile}`);
299
- const realSessionFile = fs.realpathSync(resolved);
300
- const trustedRoots = trustedSessionRoots.filter((root) => fs.existsSync(root)).map((root) => fs.realpathSync(root));
301
- if (!trustedRoots.some((root) => pathWithin(root, realSessionFile))) {
302
- throw new Error(`Nested run '${run.id}' session file is outside trusted nested session roots: ${sessionFile}`);
303
- }
304
- if (!realSessionFile.split(path.sep).includes(run.id)) {
305
- throw new Error(
306
- `Nested run '${run.id}' session file is not under that nested run's session directory: ${sessionFile}`,
307
- );
308
- }
309
- return realSessionFile;
310
- }
311
-
312
- function resolveNestedResumeTarget(
313
- match: ResolvedSubagentRunId & { kind: "nested" },
314
- trustedSessionRoots: string[],
315
- ): NestedResumeSourceTarget {
316
- const run = match.match.run;
317
- if (run.state === "running" || run.state === "queued")
318
- throw new Error(`Nested run '${run.id}' is live; route the follow-up to the owner process instead.`);
319
- const agent = nestedRunAgent(run);
320
- if (!agent) throw new Error(`Could not determine child agent for nested run '${run.id}'.`);
321
- const state = run.state === "complete" || run.state === "failed" || run.state === "paused" ? run.state : "failed";
322
- const asyncDir = resolveNestedAsyncDir(match.match.rootRunId, run);
323
- return {
324
- kind: "revive",
325
- source: "nested",
326
- runId: run.id,
327
- state,
328
- agent,
329
- index: 0,
330
- intercomTarget: resolveSubagentIntercomTarget(run.id, agent, 0),
331
- cwd: asyncDir ? path.dirname(asyncDir) : undefined,
332
- sessionFile: validateNestedSessionFile(run, trustedSessionRoots),
333
- };
334
- }
335
-
336
- async function waitForNestedControlResult(
337
- target: ResolvedSubagentRunId & { kind: "nested" },
338
- requestId: string,
339
- timeoutMs = 1_000,
340
- ) {
341
- const deadline = Date.now() + timeoutMs;
342
- while (Date.now() < deadline) {
343
- const result = readNestedControlResults(target.match.route).find(
344
- (candidate) => candidate.requestId === requestId && candidate.targetRunId === target.match.run.id,
345
- );
346
- if (result) return result;
347
- await new Promise((resolve) => setTimeout(resolve, 50));
348
- }
349
- return undefined;
350
- }
351
-
352
- async function sendNestedControlRequest(
353
- target: ResolvedSubagentRunId & { kind: "nested" },
354
- action: "interrupt" | "resume",
355
- message?: string,
356
- ) {
357
- const requestId = randomUUID();
358
- writeNestedControlRequest(target.match.route, {
359
- ts: Date.now(),
360
- requestId,
361
- targetRunId: target.match.run.id,
362
- action,
363
- ...(message ? { message } : {}),
364
- });
365
- return waitForNestedControlResult(target, requestId);
366
- }
367
-
368
- function directNestedAsyncInterrupt(
369
- target: ResolvedSubagentRunId & { kind: "nested" },
370
- ): SubagentToolResult | undefined {
371
- const run = target.match.run;
372
- const asyncDir = resolveNestedAsyncDir(target.match.rootRunId, run);
373
- if (!asyncDir) return undefined;
374
- const status = readStatus(asyncDir);
375
- const pid = typeof status?.pid === "number" && status.pid > 0 ? status.pid : run.pid;
376
- if (status?.state !== "running" || typeof pid !== "number" || pid <= 0) return undefined;
377
- try {
378
- process.kill(pid, ASYNC_INTERRUPT_SIGNAL);
379
- return {
380
- content: [{ type: "text", text: `Interrupt requested for nested async run ${run.id}.` }],
381
- details: { mode: "management", results: [] },
382
- };
383
- } catch (error) {
384
- const message = error instanceof Error ? error.message : String(error);
385
- return {
386
- content: [{ type: "text", text: `Failed to interrupt nested async run ${run.id}: ${message}` }],
387
- isError: true,
388
- details: { mode: "management", results: [] },
389
- };
390
- }
391
- }
392
-
393
- export async function interruptNestedRun(
394
- target: ResolvedSubagentRunId & { kind: "nested" },
395
- ): Promise<SubagentToolResult> {
396
- const run = target.match.run;
397
- if (run.state === "complete")
398
- return {
399
- content: [{ type: "text", text: `Nested run ${run.id} is already complete and cannot be interrupted.` }],
400
- isError: true,
401
- details: { mode: "management", results: [] },
402
- };
403
- if (run.state === "failed")
404
- return {
405
- content: [{ type: "text", text: `Nested run ${run.id} has failed and cannot be interrupted.` }],
406
- isError: true,
407
- details: { mode: "management", results: [] },
408
- };
409
- if (run.state === "paused")
410
- return {
411
- content: [{ type: "text", text: `Nested run ${run.id} is already paused.` }],
412
- isError: true,
413
- details: { mode: "management", results: [] },
414
- };
415
- const result = await sendNestedControlRequest(target, "interrupt");
416
- if (result)
417
- return {
418
- content: [{ type: "text", text: result.message }],
419
- isError: result.ok ? undefined : true,
420
- details: { mode: "management", results: [] },
421
- };
422
- const direct = directNestedAsyncInterrupt(target);
423
- if (direct) return direct;
424
- return {
425
- content: [
426
- {
427
- type: "text",
428
- text: `Nested run ${run.id} owner is not reachable and no safe direct async interrupt fallback is available.`,
429
- },
430
- ],
431
- isError: true,
432
- details: { mode: "management", results: [] },
433
- };
434
- }
435
-
436
- async function resumeLiveNestedRun(input: {
437
- target: ResolvedSubagentRunId & { kind: "nested" };
438
- message: string;
439
- }): Promise<SubagentToolResult> {
440
- const run = input.target.match.run;
441
- const result = await sendNestedControlRequest(input.target, "resume", input.message);
442
- if (result)
443
- return {
444
- content: [{ type: "text", text: result.message }],
445
- isError: result.ok ? undefined : true,
446
- details: { mode: "management", results: [] },
447
- };
448
- return {
449
- content: [
450
- {
451
- type: "text",
452
- text: `Nested run ${run.id} appears live but its owner route is not reachable. Wait for completion, then retry action='resume'.`,
453
- },
454
- ],
455
- isError: true,
456
- details: { mode: "management", results: [] },
457
- };
458
- }
459
-
460
- export async function resumeAsyncRun(input: {
461
- params: SubagentParamsLike;
462
- requestCwd: string;
463
- ctx: ExtensionContext;
464
- deps: ResolvedExecutorDeps;
465
- }): Promise<SubagentToolResult> {
466
- const followUp = (input.params.message ?? input.params.task ?? "").trim();
467
- if (!followUp) {
468
- return {
469
- content: [{ type: "text", text: "action='resume' requires message." }],
470
- isError: true,
471
- details: { mode: "management", results: [] },
472
- };
473
- }
474
-
475
- let target: ResumeSourceTarget;
476
- const parentSessionFile = input.ctx.sessionManager.getSessionFile() ?? null;
477
- try {
478
- const requestedId = input.params.id ?? input.params.runId;
479
- const resolved = requestedId
480
- ? resolveSubagentRunId(requestedId, {
481
- state: input.deps.state,
482
- nested: nestedResolutionScopeForExecutor(input.deps),
483
- })
484
- : undefined;
485
- if (resolved?.kind === "nested") {
486
- if (resolved.match.run.state === "running" || resolved.match.run.state === "queued") {
487
- return resumeLiveNestedRun({ target: resolved, message: followUp });
488
- }
489
- const trustedSessionRoots = [
490
- ...(input.deps.config.defaultSessionDir
491
- ? [path.resolve(input.deps.expandTilde(input.deps.config.defaultSessionDir))]
492
- : []),
493
- ...(parentSessionFile ? [input.deps.getSubagentSessionRoot(parentSessionFile)] : []),
494
- ];
495
- target = resolveNestedResumeTarget(resolved, trustedSessionRoots);
496
- } else {
497
- target = resolveResumeTarget(input.params, input.deps.state);
498
- }
499
- } catch (error) {
500
- const message = error instanceof Error ? error.message : String(error);
501
- return {
502
- content: [{ type: "text", text: message }],
503
- isError: true,
504
- details: { mode: "management", results: [] },
505
- };
506
- }
507
-
508
- if (target.kind === "live") {
509
- const delivered = await deliverSubagentIntercomMessageEvent(
510
- input.deps.pi.events,
511
- target.intercomTarget,
512
- `Follow-up for async run ${target.runId} (${target.agent}):\n\n${followUp}`,
513
- 500,
514
- { source: "async-resume", runId: target.runId, agent: target.agent, index: target.index },
515
- );
516
- if (delivered) {
517
- return {
518
- content: [
519
- {
520
- type: "text",
521
- text: [
522
- `Delivered follow-up to live async child.`,
523
- `Run: ${target.runId}`,
524
- `Intercom target: ${target.intercomTarget}`,
525
- ].join("\n"),
526
- },
527
- ],
528
- details: { mode: "management", results: [] },
529
- };
530
- }
531
- return {
532
- content: [
533
- {
534
- type: "text",
535
- text: [
536
- `Async child appears live but its intercom target is not registered.`,
537
- `Run: ${target.runId}`,
538
- `Intercom target: ${target.intercomTarget}`,
539
- `Wait for completion, then retry action='resume'.`,
540
- ].join("\n"),
541
- },
542
- ],
543
- isError: true,
544
- details: { mode: "management", results: [] },
545
- };
546
- }
547
-
548
- const resumeDepthPolicy = resolveSubagentDepthPolicy(input.ctx, input.deps.config.maxSubagentDepth);
549
- const { blocked, depth, maxDepth, workflowStageGuard } = checkSubagentDepth(resumeDepthPolicy.maxSubagentDepth);
550
- if (blocked) {
551
- return {
552
- content: [
553
- {
554
- type: "text",
555
- text: subagentDepthBlockedMessage(depth, maxDepth, {
556
- action: "resume",
557
- workflowStageGuard: workflowStageGuard || resumeDepthPolicy.workflowStageSubagentGuard,
558
- }),
559
- },
560
- ],
561
- isError: true,
562
- details: { mode: "management", results: [] },
563
- };
564
- }
565
-
566
- input.deps.state.currentSessionId = resolveCurrentSessionId(input.ctx.sessionManager);
567
- const effectiveCwd = target.cwd ?? input.requestCwd;
568
- const scope = resolveExecutionAgentScope(input.params.agentScope);
569
- const discoveredAgents = input.deps.discoverAgents(effectiveCwd, scope).agents;
570
- const sessionName = resolveIntercomSessionTarget(
571
- input.deps.pi.getSessionName(),
572
- input.ctx.sessionManager.getSessionId(),
573
- );
574
- const intercomBridge = resolveIntercomBridge({
575
- config: input.deps.config.intercomBridge,
576
- context: input.params.context,
577
- orchestratorTarget: sessionName,
578
- cwd: effectiveCwd,
579
- });
580
- const agents = intercomBridge.active
581
- ? discoveredAgents.map((agent) => applyIntercomBridgeToAgent(agent, intercomBridge))
582
- : discoveredAgents;
583
- const agentConfig = agents.find((agent) => agent.name === target.agent);
584
- if (!agentConfig) {
585
- return {
586
- content: [{ type: "text", text: `Unknown agent for resume: ${target.agent}` }],
587
- isError: true,
588
- details: { mode: "management", results: [] },
589
- };
590
- }
591
-
592
- const runId = randomUUID().slice(0, 8);
593
- const revivedTarget = intercomBridge.active ? resolveSubagentIntercomTarget(runId, target.agent, 0) : undefined;
594
- const supervisorAuthorization = await requestSupervisorAuthorization(input.deps.pi.events, revivedTarget);
595
- const artifactConfig: ArtifactConfig = { ...DEFAULT_ARTIFACT_CONFIG, enabled: input.params.artifacts !== false };
596
- const availableModels = input.ctx.modelRegistry.getAvailable().map(toModelInfo);
597
- const result = input.deps.runtime.executeAsyncSingle(runId, {
598
- agent: target.agent,
599
- task: buildRevivedAsyncTask(target, followUp),
600
- group: input.params.group,
601
- agentConfig,
602
- progress: resolveSingleProgress(agentConfig, input.params.progress, followUp),
603
- ctx: {
604
- pi: input.deps.pi,
605
- cwd: input.requestCwd,
606
- currentSessionId: input.deps.state.currentSessionId,
607
- currentModelProvider: input.ctx.model?.provider,
608
- currentModel: currentModelFullId(input.ctx.model),
609
- intercomGroup: inheritedIntercomGroup(input.ctx),
610
- workflowSessionMetadata: workflowSessionMetadataFromContext(input.ctx),
611
- },
612
- cwd: effectiveCwd,
613
- maxOutput: input.params.maxOutput,
614
- artifactsDir: input.deps.tempArtifactsDir,
615
- artifactConfig,
616
- shareEnabled: input.params.share === true,
617
- sessionRoot: input.deps.getSubagentSessionRoot(parentSessionFile),
618
- sessionFile: target.sessionFile,
619
- maxSubagentDepth: resolveWorkflowStageMaxSubagentDepth(input.ctx, input.deps.config.maxSubagentDepth),
620
- workflowStageSubagentGuard: isWorkflowStageOrchestrationContext(input.ctx),
621
- worktreeSetupHook: input.deps.config.worktreeSetupHook,
622
- worktreeSetupHookTimeoutMs: input.deps.config.worktreeSetupHookTimeoutMs,
623
- controlConfig: resolveControlConfig(input.deps.config.control, input.params.control),
624
- controlIntercomTarget: intercomBridge.active ? intercomBridge.orchestratorTarget : undefined,
625
- childIntercomTarget: intercomBridge.active
626
- ? (agent, index) => resolveSubagentIntercomTarget(runId, agent, index)
627
- : undefined,
628
- supervisorAuthorization,
629
- availableModels,
630
- });
631
- if (result.isError) return result;
632
-
633
- const revivedId = result.details.asyncId ?? runId;
634
- const sourceLabel = target.source;
635
- const lines = [
636
- `Revived ${sourceLabel} subagent from ${target.runId}.`,
637
- `Revived run: ${revivedId}`,
638
- `Agent: ${target.agent}`,
639
- `Session: ${target.sessionFile}`,
640
- result.details.asyncDir ? `Async dir: ${result.details.asyncDir}` : undefined,
641
- revivedTarget ? `Intercom target: ${revivedTarget} (if registered)` : undefined,
642
- `Status if needed: subagent({ action: "status", id: "${revivedId}" })`,
643
- ].filter((line): line is string => Boolean(line));
644
- return {
645
- content: [{ type: "text", text: input.deps.runtime.formatAsyncStartedMessage(lines.join("\n")) }],
646
- details: result.details,
647
- };
648
- }
649
-
650
- export type { ResolvedSubagentRunId };
651
- export { createNestedRoute };
@@ -1,15 +1,10 @@
1
- import {
2
- executeAsyncChain,
3
- executeAsyncSingle,
4
- formatAsyncStartedMessage,
5
- isAsyncAvailable,
6
- } from "../background/async-execution.ts";
1
+ import { formatAsyncStartedMessage, isAsyncAvailable } from "../inprocess/background.ts";
2
+ import { executeAsyncSingle } from "../inprocess/background-single.ts";
7
3
  import { runSync } from "./execution.ts";
8
4
  import type { SubagentExecutorRuntimeDeps } from "./subagent-executor-types.ts";
9
5
 
10
6
  const defaultSubagentExecutorRuntimeDeps: SubagentExecutorRuntimeDeps = {
11
7
  runSync,
12
- executeAsyncChain,
13
8
  executeAsyncSingle,
14
9
  isAsyncAvailable,
15
10
  formatAsyncStartedMessage,