@duckmind/dm-windows-x64 0.61.4 → 0.61.9

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 (279) hide show
  1. package/dm.exe +0 -0
  2. package/extensions/.dm-extensions.json +211 -67
  3. package/extensions/dm-subagents/agents/claude-code-writer.md +15 -0
  4. package/extensions/dm-subagents/agents/claude-code.md +15 -0
  5. package/extensions/dm-subagents/agents/codex-exec-writer.md +15 -0
  6. package/extensions/dm-subagents/agents/codex-exec.md +15 -0
  7. package/extensions/dm-subagents/agents/cursor-agent-writer.md +14 -0
  8. package/extensions/dm-subagents/agents/cursor-agent.md +14 -0
  9. package/extensions/dm-subagents/agents/delegate.md +3 -2
  10. package/extensions/dm-subagents/agents/oracle.md +10 -5
  11. package/extensions/dm-subagents/agents/researcher.md +2 -2
  12. package/extensions/dm-subagents/agents/reviewer.md +17 -7
  13. package/extensions/dm-subagents/agents/scout.md +5 -5
  14. package/extensions/dm-subagents/agents/worker.md +6 -2
  15. package/extensions/dm-subagents/async-retention-discovery-worker.mjs +167 -0
  16. package/extensions/dm-subagents/index.js +4 -0
  17. package/extensions/dm-subagents/inspector-runner.mjs +10 -0
  18. package/extensions/dm-subagents/install.mjs +3 -2
  19. package/extensions/dm-subagents/package.json +2 -2
  20. package/extensions/dm-subagents/prompts/council.md +60 -0
  21. package/extensions/dm-subagents/prompts/parallel-review.md +5 -1
  22. package/extensions/dm-subagents/prompts/review-loop.md +13 -7
  23. package/extensions/dm-subagents/skills/council-mode/SKILL.md +59 -0
  24. package/extensions/dm-subagents/skills/council-mode/references/pass-contracts.md +150 -0
  25. package/extensions/dm-subagents/skills/dm-subagents/SKILL.md +96 -911
  26. package/extensions/dm-subagents/skills/dm-subagents/references/constraints-and-recipes.md +70 -0
  27. package/extensions/dm-subagents/skills/dm-subagents/references/execution-controls.md +539 -0
  28. package/extensions/dm-subagents/skills/dm-subagents/references/management-authoring-rpc.md +161 -0
  29. package/extensions/dm-subagents/skills/dm-subagents/references/multi-lane-orchestration.md +51 -0
  30. package/extensions/dm-subagents/skills/dm-subagents/references/prompting-and-roles.md +295 -0
  31. package/extensions/dm-subagents/skills/dm-subagents/references/review-and-validation.md +73 -0
  32. package/extensions/dm-subagents/src/agents/agent-management.js +716 -484
  33. package/extensions/dm-subagents/src/agents/agent-refinements.js +563 -0
  34. package/extensions/dm-subagents/src/agents/agent-serializer.js +70 -5
  35. package/extensions/dm-subagents/src/agents/agents.js +1447 -299
  36. package/extensions/dm-subagents/src/agents/builtin-names.js +15 -0
  37. package/extensions/dm-subagents/src/agents/chain-serializer.js +12 -7
  38. package/extensions/dm-subagents/src/agents/frontmatter.js +64 -14
  39. package/extensions/dm-subagents/src/agents/identity.js +1 -1
  40. package/extensions/dm-subagents/src/agents/proactive-skills.js +14 -11
  41. package/extensions/dm-subagents/src/agents/runtime-agent-events.js +49 -0
  42. package/extensions/dm-subagents/src/agents/runtime-agent-registry.js +412 -0
  43. package/extensions/dm-subagents/src/agents/skills.js +52 -35
  44. package/extensions/dm-subagents/src/api/agents.js +6 -0
  45. package/extensions/dm-subagents/src/api/background-work.js +151 -0
  46. package/extensions/dm-subagents/src/api/capability-ceiling.js +12 -0
  47. package/extensions/dm-subagents/src/api/control-channel.js +3 -0
  48. package/extensions/dm-subagents/src/api/delegation.js +5 -0
  49. package/extensions/dm-subagents/src/api/dm-args.js +3 -0
  50. package/extensions/dm-subagents/src/api/external-job-provider.js +137 -0
  51. package/extensions/dm-subagents/src/api/external-runs.js +233 -0
  52. package/extensions/dm-subagents/src/api/intercom-bridge.js +3 -0
  53. package/extensions/dm-subagents/src/api/preflight.js +322 -0
  54. package/extensions/dm-subagents/src/api/project-panes.js +11 -0
  55. package/extensions/dm-subagents/src/api/shared-types.js +4 -0
  56. package/extensions/dm-subagents/src/extension/config.js +175 -0
  57. package/extensions/dm-subagents/src/extension/control-notices.js +4 -43
  58. package/extensions/dm-subagents/src/extension/doctor.js +71 -17
  59. package/extensions/dm-subagents/src/extension/fanout-child.js +49 -32
  60. package/extensions/dm-subagents/src/extension/index.js +711 -265
  61. package/extensions/dm-subagents/src/extension/public-execution.js +114 -0
  62. package/extensions/dm-subagents/src/extension/rpc.js +427 -22
  63. package/extensions/dm-subagents/src/extension/schemas.js +158 -65
  64. package/extensions/dm-subagents/src/extension/steering-notices.js +23 -0
  65. package/extensions/dm-subagents/src/extension/subagent-guide.js +31 -0
  66. package/extensions/dm-subagents/src/extension/tool-description.js +92 -74
  67. package/extensions/dm-subagents/src/extension/tool-result.js +7 -0
  68. package/extensions/dm-subagents/src/inspectors/herdr/actions.js +218 -0
  69. package/extensions/dm-subagents/src/inspectors/herdr/client.js +123 -0
  70. package/extensions/dm-subagents/src/inspectors/herdr/focus.js +47 -0
  71. package/extensions/dm-subagents/src/inspectors/herdr/inspector-runner.js +160 -0
  72. package/extensions/dm-subagents/src/inspectors/herdr/project-panes.js +618 -0
  73. package/extensions/dm-subagents/src/inspectors/herdr/session-roots-codec.js +21 -0
  74. package/extensions/dm-subagents/src/inspectors/herdr/shell-command.js +15 -0
  75. package/extensions/dm-subagents/src/integrations/herdr-status.js +377 -0
  76. package/extensions/dm-subagents/src/intercom/intercom-bridge.js +17 -13
  77. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +371 -79
  78. package/extensions/dm-subagents/src/intercom/result-intercom.js +47 -7
  79. package/extensions/dm-subagents/src/missions/actions.js +394 -0
  80. package/extensions/dm-subagents/src/missions/goal-driver.js +149 -0
  81. package/extensions/dm-subagents/src/missions/lifecycle.js +331 -0
  82. package/extensions/dm-subagents/src/missions/store.js +548 -0
  83. package/extensions/dm-subagents/src/missions/types.js +9 -0
  84. package/extensions/dm-subagents/src/missions/workflow-state.js +245 -0
  85. package/extensions/dm-subagents/src/policy/authority.js +37 -0
  86. package/extensions/dm-subagents/src/profiles/profiles.js +36 -18
  87. package/extensions/dm-subagents/src/runs/background/active-async-capacity.js +427 -0
  88. package/extensions/dm-subagents/src/runs/background/active-run-index.js +122 -0
  89. package/extensions/dm-subagents/src/runs/background/async-execution.js +925 -137
  90. package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +515 -148
  91. package/extensions/dm-subagents/src/runs/background/async-resume.js +378 -51
  92. package/extensions/dm-subagents/src/runs/background/async-retention.js +828 -0
  93. package/extensions/dm-subagents/src/runs/background/async-status-snapshot.js +31 -0
  94. package/extensions/dm-subagents/src/runs/background/async-status.js +259 -22
  95. package/extensions/dm-subagents/src/runs/background/auto-drain.js +46 -0
  96. package/extensions/dm-subagents/src/runs/background/chain-append.js +50 -15
  97. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +67 -12
  98. package/extensions/dm-subagents/src/runs/background/completion-batcher.js +5 -1
  99. package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +3 -11
  100. package/extensions/dm-subagents/src/runs/background/completion-replay.js +245 -0
  101. package/extensions/dm-subagents/src/runs/background/control-channel.js +423 -36
  102. package/extensions/dm-subagents/src/runs/background/fleet-view.js +132 -59
  103. package/extensions/dm-subagents/src/runs/background/index-segment.js +38 -0
  104. package/extensions/dm-subagents/src/runs/background/inspect-rpc.js +373 -0
  105. package/extensions/dm-subagents/src/runs/background/notify.js +357 -57
  106. package/extensions/dm-subagents/src/runs/background/owned-process-tree.js +86 -0
  107. package/extensions/dm-subagents/src/runs/background/process-terminal.js +269 -0
  108. package/extensions/dm-subagents/src/runs/background/result-delivery-ownership.js +34 -0
  109. package/extensions/dm-subagents/src/runs/background/result-files.js +469 -0
  110. package/extensions/dm-subagents/src/runs/background/result-watcher.js +540 -75
  111. package/extensions/dm-subagents/src/runs/background/resume-guidance.js +44 -0
  112. package/extensions/dm-subagents/src/runs/background/retained-children.js +119 -0
  113. package/extensions/dm-subagents/src/runs/background/run-id-query.js +5 -0
  114. package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +93 -9
  115. package/extensions/dm-subagents/src/runs/background/run-status.js +303 -32
  116. package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +784 -376
  117. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +75 -34
  118. package/extensions/dm-subagents/src/runs/background/steering.js +221 -0
  119. package/extensions/dm-subagents/src/runs/background/subagent-runner.js +3106 -844
  120. package/extensions/dm-subagents/src/runs/background/subagent-wait.js +529 -0
  121. package/extensions/dm-subagents/src/runs/background/terminal-run-index.js +106 -0
  122. package/extensions/dm-subagents/src/runs/background/top-level-async.js +1 -1
  123. package/extensions/dm-subagents/src/runs/background/wait-completions.js +155 -0
  124. package/extensions/dm-subagents/src/runs/background/wait-config.js +46 -0
  125. package/extensions/dm-subagents/src/runs/background/wait-subscriptions.js +278 -0
  126. package/extensions/dm-subagents/src/runs/background/wait-tool.js +47 -0
  127. package/extensions/dm-subagents/src/runs/foreground/async-dismiss-action.js +81 -0
  128. package/extensions/dm-subagents/src/runs/foreground/async-steering-action.js +245 -0
  129. package/extensions/dm-subagents/src/runs/foreground/async-stop-action.js +74 -0
  130. package/extensions/dm-subagents/src/runs/foreground/execution.js +1401 -342
  131. package/extensions/dm-subagents/src/runs/foreground/foreground-control.js +133 -0
  132. package/extensions/dm-subagents/src/runs/foreground/foreground-history.js +148 -0
  133. package/extensions/dm-subagents/src/runs/foreground/prompt-audit.js +139 -0
  134. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +4278 -1441
  135. package/extensions/dm-subagents/src/runs/foreground/workflow-detach-reconcile.js +278 -0
  136. package/extensions/dm-subagents/src/runs/foreground/workflow-foreground-steering.js +155 -0
  137. package/extensions/dm-subagents/src/runs/shared/abort-recovery.js +97 -0
  138. package/extensions/dm-subagents/src/runs/shared/acceptance.js +597 -148
  139. package/extensions/dm-subagents/src/runs/shared/agent-contract.js +35 -0
  140. package/extensions/dm-subagents/src/runs/shared/async-status-projection.js +472 -0
  141. package/extensions/dm-subagents/src/runs/shared/background-process-options.js +6 -0
  142. package/extensions/dm-subagents/src/runs/shared/capability-ceiling.js +175 -0
  143. package/extensions/dm-subagents/src/runs/shared/child-identity.js +32 -0
  144. package/extensions/dm-subagents/src/runs/shared/child-launch-plan.js +65 -0
  145. package/extensions/dm-subagents/src/runs/shared/child-protocol.js +447 -0
  146. package/extensions/dm-subagents/src/runs/shared/claude-code-adapter.js +120 -0
  147. package/extensions/dm-subagents/src/runs/shared/codex-exec-adapter.js +129 -0
  148. package/extensions/dm-subagents/src/runs/shared/completion-evidence.js +40 -0
  149. package/extensions/dm-subagents/src/runs/shared/completion-guard.js +140 -83
  150. package/extensions/dm-subagents/src/runs/shared/context-mode.js +38 -0
  151. package/extensions/dm-subagents/src/runs/shared/cursor-agent-adapter.js +101 -0
  152. package/extensions/dm-subagents/src/runs/shared/dm-args.js +445 -72
  153. package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +27 -16
  154. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +19 -6
  155. package/extensions/dm-subagents/src/runs/shared/extension-bindings.js +81 -0
  156. package/extensions/dm-subagents/src/runs/shared/external-cli-contract.js +134 -0
  157. package/extensions/dm-subagents/src/runs/shared/external-cli-preflight.js +98 -0
  158. package/extensions/dm-subagents/src/runs/shared/external-cli-runner.js +419 -0
  159. package/extensions/dm-subagents/src/runs/shared/external-job-bridge.js +404 -0
  160. package/extensions/dm-subagents/src/runs/shared/external-job-runner.js +334 -0
  161. package/extensions/dm-subagents/src/runs/shared/fast-mode-extension.js +8 -0
  162. package/extensions/dm-subagents/src/runs/shared/host-step-status.js +228 -0
  163. package/extensions/dm-subagents/src/runs/shared/lane-metadata.js +104 -0
  164. package/extensions/dm-subagents/src/runs/shared/launch-cwd.js +17 -0
  165. package/extensions/dm-subagents/src/runs/shared/llm-intent-arbiter.js +190 -0
  166. package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +48 -3
  167. package/extensions/dm-subagents/src/runs/shared/mcp-config-sources.js +387 -0
  168. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +212 -137
  169. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-grant.js +131 -0
  170. package/extensions/dm-subagents/src/runs/shared/model-exclusions.js +207 -0
  171. package/extensions/dm-subagents/src/runs/shared/model-fallback.js +225 -55
  172. package/extensions/dm-subagents/src/runs/shared/model-scope.js +85 -28
  173. package/extensions/dm-subagents/src/runs/shared/mutation-evidence.js +182 -0
  174. package/extensions/dm-subagents/src/runs/shared/nested-events.js +264 -102
  175. package/extensions/dm-subagents/src/runs/shared/nested-render.js +15 -5
  176. package/extensions/dm-subagents/src/runs/shared/orca-progress-tabs.js +505 -0
  177. package/extensions/dm-subagents/src/runs/shared/parallel-handoff.js +653 -0
  178. package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +29 -12
  179. package/extensions/dm-subagents/src/runs/shared/permissions.js +108 -0
  180. package/extensions/dm-subagents/src/runs/shared/process-signal.js +13 -0
  181. package/extensions/dm-subagents/src/runs/shared/run-fanout-budget.js +257 -0
  182. package/extensions/dm-subagents/src/runs/shared/run-history.js +133 -13
  183. package/extensions/dm-subagents/src/runs/shared/runtime-acknowledged-extensions.js +62 -0
  184. package/extensions/dm-subagents/src/runs/shared/session-lease.js +225 -0
  185. package/extensions/dm-subagents/src/runs/shared/single-output.js +129 -27
  186. package/extensions/dm-subagents/src/runs/shared/spawn-budget.js +95 -0
  187. package/extensions/dm-subagents/src/runs/shared/structured-output.js +129 -10
  188. package/extensions/dm-subagents/src/runs/shared/subagent-control.js +66 -11
  189. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +548 -70
  190. package/extensions/dm-subagents/src/runs/shared/subagent-startup-retry.js +50 -0
  191. package/extensions/dm-subagents/src/runs/shared/task-intent.js +130 -0
  192. package/extensions/dm-subagents/src/runs/shared/tool-availability.js +59 -0
  193. package/extensions/dm-subagents/src/runs/shared/tool-budget.js +7 -5
  194. package/extensions/dm-subagents/src/runs/shared/tool-timeout.js +64 -0
  195. package/extensions/dm-subagents/src/runs/shared/usage-budget.js +74 -0
  196. package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +22 -0
  197. package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-plan.js +721 -0
  198. package/extensions/dm-subagents/src/runs/shared/worktree.js +168 -19
  199. package/extensions/dm-subagents/src/shared/accessible-dir.js +35 -0
  200. package/extensions/dm-subagents/src/shared/agent-stream-options.js +3 -0
  201. package/extensions/dm-subagents/src/shared/artifacts.js +170 -11
  202. package/extensions/dm-subagents/src/shared/atomic-json.js +36 -38
  203. package/extensions/dm-subagents/src/shared/capacity-resilient-json.js +77 -0
  204. package/extensions/dm-subagents/src/shared/child-session-name.js +15 -0
  205. package/extensions/dm-subagents/src/shared/child-transcript.js +57 -2
  206. package/extensions/dm-subagents/src/shared/completion-owner.js +7 -0
  207. package/extensions/dm-subagents/src/shared/display-text.js +142 -0
  208. package/extensions/dm-subagents/src/shared/extension-context.js +17 -0
  209. package/extensions/dm-subagents/src/shared/file-coalescer.js +9 -0
  210. package/extensions/dm-subagents/src/shared/file-system-retry.js +56 -0
  211. package/extensions/dm-subagents/src/shared/fork-context.js +96 -33
  212. package/extensions/dm-subagents/src/shared/formatters.js +21 -7
  213. package/extensions/dm-subagents/src/shared/launch-contract.js +94 -0
  214. package/extensions/dm-subagents/src/shared/model-info.js +10 -5
  215. package/extensions/dm-subagents/src/shared/node-executable.js +19 -0
  216. package/extensions/dm-subagents/src/shared/prompt-resources.js +10 -0
  217. package/extensions/dm-subagents/src/shared/pruned-fork.js +427 -0
  218. package/extensions/dm-subagents/src/shared/session-file-trust.js +19 -0
  219. package/extensions/dm-subagents/src/shared/session-tokens.js +14 -3
  220. package/extensions/dm-subagents/src/shared/settings.js +39 -47
  221. package/extensions/dm-subagents/src/shared/shortcuts.js +16 -0
  222. package/extensions/dm-subagents/src/shared/status-format.js +9 -2
  223. package/extensions/dm-subagents/src/shared/thinking-ceiling.js +41 -0
  224. package/extensions/dm-subagents/src/shared/types.js +47 -7
  225. package/extensions/dm-subagents/src/shared/utf8.js +12 -0
  226. package/extensions/dm-subagents/src/shared/utils.js +151 -131
  227. package/extensions/dm-subagents/src/shared/watch-strategy.js +3 -0
  228. package/extensions/dm-subagents/src/shared/workflow-child-permit.js +84 -0
  229. package/extensions/dm-subagents/src/slash/delegation-adapters.js +274 -0
  230. package/extensions/dm-subagents/src/slash/delegation-json.js +113 -0
  231. package/extensions/dm-subagents/src/slash/delegation-request.js +152 -0
  232. package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +294 -243
  233. package/extensions/dm-subagents/src/slash/prompt-workflows.js +35 -73
  234. package/extensions/dm-subagents/src/slash/selector.js +101 -0
  235. package/extensions/dm-subagents/src/slash/slash-bridge.js +17 -1
  236. package/extensions/dm-subagents/src/slash/slash-commands.js +722 -732
  237. package/extensions/dm-subagents/src/slash/slash-live-state.js +37 -19
  238. package/extensions/dm-subagents/src/slash/subagents-admin.js +410 -0
  239. package/extensions/dm-subagents/src/tui/fleet-status.js +824 -0
  240. package/extensions/dm-subagents/src/tui/fleet-transcript.js +479 -0
  241. package/extensions/dm-subagents/src/tui/fleet.js +1326 -0
  242. package/extensions/dm-subagents/src/tui/render-helpers.js +22 -0
  243. package/extensions/dm-subagents/src/tui/render.js +1511 -261
  244. package/extensions/dm-subagents/src/watchdog/change-signature.js +220 -0
  245. package/extensions/dm-subagents/src/watchdog/child-status.js +151 -0
  246. package/extensions/dm-subagents/src/watchdog/emission-guard.js +90 -0
  247. package/extensions/dm-subagents/src/watchdog/lsp-diagnostics.js +484 -0
  248. package/extensions/dm-subagents/src/watchdog/model-selection.js +154 -0
  249. package/extensions/dm-subagents/src/watchdog/permission-arbiter.js +138 -0
  250. package/extensions/dm-subagents/src/watchdog/register-child.js +112 -0
  251. package/extensions/dm-subagents/src/watchdog/register-main.js +419 -0
  252. package/extensions/dm-subagents/src/watchdog/render.js +54 -0
  253. package/extensions/dm-subagents/src/watchdog/review.js +251 -0
  254. package/extensions/dm-subagents/src/watchdog/runtime.js +803 -0
  255. package/extensions/dm-subagents/src/watchdog/scope.js +56 -0
  256. package/extensions/dm-subagents/src/watchdog/settings.js +515 -0
  257. package/extensions/dm-subagents/src/watchdog/tool-actions.js +151 -0
  258. package/extensions/dm-subagents/src/watchdog/turn-delta.js +169 -0
  259. package/extensions/dm-subagents/src/watchdog/types.js +29 -0
  260. package/extensions/dm-subagents/src/watchdog/warning-format.js +58 -0
  261. package/extensions/dm-subagents/src/workflows/chat-progress.js +116 -0
  262. package/extensions/dm-subagents/src/workflows/host-command.js +227 -0
  263. package/extensions/dm-subagents/src/workflows/scripted-workflow.js +2011 -0
  264. package/extensions/dm-subagents/src/workflows/workflow-child-summary.js +116 -0
  265. package/extensions/dm-subagents/src/workflows/workflow-preflight.js +243 -0
  266. package/extensions/dm-subagents/src/workflows/workflow-receipt.js +387 -0
  267. package/extensions/dm-subagents/src/workflows/workflow-settlement.js +189 -0
  268. package/package.json +4 -3
  269. package/extensions/dm-fff/package.json +0 -21
  270. package/extensions/dm-fff/src/index.js +0 -691
  271. package/extensions/dm-fff/src/query.js +0 -60
  272. package/extensions/dm-subagents/agents/context-builder.md +0 -46
  273. package/extensions/dm-subagents/agents/planner.md +0 -55
  274. package/extensions/dm-subagents/prompts/parallel-context-build.md +0 -55
  275. package/extensions/dm-subagents/prompts/parallel-handoff-plan.md +0 -61
  276. package/extensions/dm-subagents/src/runs/background/wait.js +0 -206
  277. package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +0 -1013
  278. package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +0 -981
  279. package/extensions/dm-subagents/src/runs/shared/turn-budget.js +0 -50
@@ -1,288 +1,339 @@
1
- export const PROMPT_TEMPLATE_SUBAGENT_REQUEST_EVENT = "prompt-template:subagent:request";
2
- export const PROMPT_TEMPLATE_SUBAGENT_STARTED_EVENT = "prompt-template:subagent:started";
3
- export const PROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT = "prompt-template:subagent:response";
4
- export const PROMPT_TEMPLATE_SUBAGENT_UPDATE_EVENT = "prompt-template:subagent:update";
5
- export const PROMPT_TEMPLATE_SUBAGENT_CANCEL_EVENT = "prompt-template:subagent:cancel";
6
- function parseDelegationTasks(tasks) {
7
- if (!Array.isArray(tasks))
8
- return [];
9
- const parsed = [];
10
- for (const item of tasks) {
11
- if (!item || typeof item !== "object")
12
- return [];
13
- const value = item;
14
- if (typeof value.agent !== "string" || !value.agent.trim())
15
- return [];
16
- if (typeof value.task !== "string" || !value.task.trim())
17
- return [];
18
- const model = typeof value.model === "string" && value.model.trim().length > 0 ? value.model : undefined;
19
- const cwd = typeof value.cwd === "string" && value.cwd.trim().length > 0 ? value.cwd : undefined;
20
- parsed.push({
21
- agent: value.agent,
22
- task: value.task,
23
- ...model ? { model } : {},
24
- ...cwd ? { cwd } : {}
25
- });
26
- }
27
- return parsed;
28
- }
29
- function parsePromptTemplateRequest(data) {
30
- if (!data || typeof data !== "object")
31
- return;
1
+ import {
2
+ SUBAGENT_DELEGATION_CANCEL_EVENT,
3
+ SUBAGENT_DELEGATION_REQUEST_EVENT,
4
+ SUBAGENT_DELEGATION_RESPONSE_EVENT,
5
+ SUBAGENT_DELEGATION_STARTED_EVENT,
6
+ SUBAGENT_DELEGATION_UPDATE_EVENT
7
+ } from "../api/delegation.js";
8
+ import { parseSubagentDelegationRequest } from "./delegation-request.js";
9
+ import {
10
+ parsePromptTemplateRequest,
11
+ toDelegationUpdate,
12
+ toPromptTemplateResponse,
13
+ toSubagentDelegationExecutionParams,
14
+ toSubagentDelegationResponse,
15
+ toSubagentDelegationUpdate
16
+ } from "./delegation-adapters.js";
17
+ export const PROMPT_TEMPLATE_SUBAGENT_REQUEST_EVENT = SUBAGENT_DELEGATION_REQUEST_EVENT;
18
+ export const PROMPT_TEMPLATE_SUBAGENT_STARTED_EVENT = SUBAGENT_DELEGATION_STARTED_EVENT;
19
+ export const PROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT = SUBAGENT_DELEGATION_RESPONSE_EVENT;
20
+ export const PROMPT_TEMPLATE_SUBAGENT_UPDATE_EVENT = SUBAGENT_DELEGATION_UPDATE_EVENT;
21
+ export const PROMPT_TEMPLATE_SUBAGENT_CANCEL_EVENT = SUBAGENT_DELEGATION_CANCEL_EVENT;
22
+ function hasStructuredDelegationMarker(data) {
23
+ if (!data || typeof data !== "object" || Array.isArray(data))
24
+ return false;
32
25
  const value = data;
33
- if (typeof value.requestId !== "string" || !value.requestId)
34
- return;
35
- if (typeof value.model !== "string" || !value.model)
36
- return;
37
- if (typeof value.cwd !== "string" || !value.cwd)
38
- return;
39
- if (value.context !== "fresh" && value.context !== "fork")
40
- return;
41
- const tasks = parseDelegationTasks(value.tasks);
42
- const worktree = value.worktree === true ? true : undefined;
43
- const hasSingle = typeof value.agent === "string" && value.agent.length > 0 && typeof value.task === "string" && value.task.length > 0;
44
- if (!hasSingle && tasks.length === 0)
45
- return;
46
- const fallbackTask = tasks[0];
47
- return {
48
- requestId: value.requestId,
49
- agent: hasSingle ? value.agent : fallbackTask.agent,
50
- task: hasSingle ? value.task : fallbackTask.task,
51
- ...tasks.length > 0 ? { tasks } : {},
52
- context: value.context,
53
- model: value.model,
54
- cwd: value.cwd,
55
- ...worktree ? { worktree } : {}
56
- };
26
+ return Object.hasOwn(value, "ownerRunId") || Object.hasOwn(value, "nodeId") || Object.hasOwn(value, "result") || Object.hasOwn(value, "version");
57
27
  }
58
- function firstTextContent(content) {
59
- if (!Array.isArray(content))
60
- return;
61
- for (const part of content) {
62
- if (!part || typeof part !== "object")
63
- continue;
64
- if (part.type !== "text")
65
- continue;
66
- const text = part.text;
67
- if (typeof text === "string" && text.trim())
68
- return text.trim();
69
- }
70
- return;
71
- }
72
- function filterRecentOutput(lines) {
73
- if (!lines || lines.length === 0)
74
- return;
75
- const filtered = lines.filter((line) => typeof line === "string" && line.trim() && line.trim() !== "(running...)");
76
- if (filtered.length === 0)
77
- return;
78
- return filtered;
79
- }
80
- function sanitizeRecentTools(tools) {
81
- if (!tools || tools.length === 0)
82
- return;
83
- const sanitized = tools.flatMap((entry) => {
84
- if (typeof entry.tool !== "string" || entry.tool.trim().length === 0)
85
- return [];
86
- return [{
87
- tool: entry.tool,
88
- args: typeof entry.args === "string" ? entry.args : String(entry.args ?? "")
89
- }];
90
- });
91
- return sanitized.length > 0 ? sanitized : undefined;
92
- }
93
- function resolveProgressModel(update, entry) {
94
- const results = update.details?.results;
95
- if (!results || results.length === 0)
96
- return;
97
- if (typeof entry.index === "number" && entry.index >= 0) {
98
- const byIndex = results[entry.index];
99
- if (typeof byIndex?.model === "string")
100
- return byIndex.model;
101
- }
102
- if (entry.agent) {
103
- const byAgent = results.find((result) => result.agent === entry.agent && typeof result.model === "string");
104
- if (byAgent?.model)
105
- return byAgent.model;
106
- }
107
- const firstWithModel = results.find((result) => typeof result.model === "string");
108
- return firstWithModel?.model;
109
- }
110
- function toolCallNameFromSummary(summary) {
111
- const text = typeof summary.expandedText === "string" && summary.expandedText.trim().length > 0 ? summary.expandedText.trim() : typeof summary.text === "string" ? summary.text.trim() : "";
112
- if (!text)
113
- return;
114
- if (text.startsWith("$ "))
115
- return "bash";
116
- return text.match(/^[A-Za-z_][\w.-]*/)?.[0];
117
- }
118
- function buildDelegationMessages(result, fallbackText) {
119
- if (Array.isArray(result.messages) && result.messages.length > 0)
120
- return result.messages;
121
- const toolCallParts = (result.toolCalls ?? []).flatMap((summary) => {
122
- const name = toolCallNameFromSummary(summary);
123
- return name ? [{ type: "toolCall", name, arguments: { summary: summary.expandedText ?? summary.text ?? "" } }] : [];
124
- });
125
- const text = typeof result.finalOutput === "string" && result.finalOutput.trim().length > 0 ? result.finalOutput.trim() : fallbackText;
126
- const content = [
127
- ...toolCallParts,
128
- ...text ? [{ type: "text", text }] : []
129
- ];
130
- if (content.length === 0)
131
- return [];
132
- return [{ role: "assistant", content }];
133
- }
134
- function toDelegationUpdate(requestId, update) {
135
- const progress = update.details?.progress?.[0];
136
- const taskProgress = update.details?.progress?.map((entry) => {
137
- const lastOutput = entry.recentOutput?.[entry.recentOutput.length - 1];
138
- const safeLastOutput = typeof lastOutput === "string" && lastOutput.trim() && lastOutput !== "(running...)" ? lastOutput : undefined;
139
- return {
140
- index: entry.index,
141
- agent: entry.agent ?? "delegate",
142
- status: entry.status,
143
- currentTool: entry.currentTool,
144
- currentToolArgs: entry.currentToolArgs,
145
- recentOutput: safeLastOutput,
146
- recentOutputLines: filterRecentOutput(entry.recentOutput),
147
- recentTools: sanitizeRecentTools(entry.recentTools),
148
- model: resolveProgressModel(update, entry),
149
- toolCount: entry.toolCount,
150
- durationMs: entry.durationMs,
151
- tokens: entry.tokens
152
- };
153
- });
154
- if (!progress && (!taskProgress || taskProgress.length === 0))
155
- return;
156
- const lastOutput = progress?.recentOutput?.[progress.recentOutput.length - 1];
157
- const safeLastOutput = typeof lastOutput === "string" && lastOutput.trim() && lastOutput !== "(running...)" ? lastOutput : undefined;
158
- return {
159
- requestId,
160
- currentTool: progress?.currentTool,
161
- currentToolArgs: progress?.currentToolArgs,
162
- recentOutput: safeLastOutput,
163
- recentOutputLines: filterRecentOutput(progress?.recentOutput),
164
- recentTools: sanitizeRecentTools(progress?.recentTools),
165
- model: progress ? resolveProgressModel(update, progress) : undefined,
166
- toolCount: progress?.toolCount,
167
- durationMs: progress?.durationMs,
168
- tokens: progress?.tokens,
169
- taskProgress
170
- };
28
+ function validId(value) {
29
+ return typeof value === "string" && value.trim().length > 0 && value.length <= 256 && !/[\r\n]/.test(value);
171
30
  }
172
31
  export function registerPromptTemplateDelegationBridge(options) {
173
- const controllers = new Map;
174
- const pendingCancels = new Set;
32
+ const legacyControllers = new Map;
33
+ const pendingLegacyCancels = new Map;
34
+ const attemptControllers = new Map;
35
+ const pendingAttemptCancels = new Map;
36
+ const activeOwnedNodes = new Map;
37
+ const settledAttempts = new Map;
175
38
  const subscriptions = [];
39
+ let disposed = false;
40
+ let identitySaturated = false;
176
41
  const subscribe = (event, handler) => {
177
42
  const unsubscribe = options.events.on(event, handler);
178
43
  if (typeof unsubscribe === "function")
179
44
  subscriptions.push(unsubscribe);
180
45
  };
46
+ const ownsLegacyRequest = (requestId, controller) => !disposed && legacyControllers.get(requestId) === controller;
47
+ const ownsAttempt = (attemptKey, controller) => !disposed && attemptControllers.get(attemptKey) === controller;
48
+ const boundedRemember = (map, key) => {
49
+ map.delete(key);
50
+ map.set(key, true);
51
+ while (map.size > 256) {
52
+ const oldest = map.keys().next().value;
53
+ if (typeof oldest !== "string")
54
+ break;
55
+ map.delete(oldest);
56
+ }
57
+ };
58
+ const rememberIdentity = (map, key) => {
59
+ if (map.has(key) || identitySaturated)
60
+ return;
61
+ if (map.size >= 8192) {
62
+ identitySaturated = true;
63
+ return;
64
+ }
65
+ map.set(key, true);
66
+ if (map.size === 8192) {
67
+ identitySaturated = true;
68
+ }
69
+ };
70
+ const nodeKey = (ownerRunId, nodeId) => JSON.stringify([ownerRunId, nodeId]);
71
+ const attemptKey = (requestId, ownerRunId, nodeId) => JSON.stringify([requestId, ownerRunId, nodeId]);
72
+ const rememberPendingLegacyCancel = (requestId) => {
73
+ boundedRemember(pendingLegacyCancels, requestId);
74
+ };
75
+ const emitTerminal = (key, payload) => {
76
+ if (disposed || settledAttempts.has(key))
77
+ return;
78
+ rememberIdentity(settledAttempts, key);
79
+ options.events.emit(SUBAGENT_DELEGATION_RESPONSE_EVENT, payload);
80
+ };
181
81
  subscribe(PROMPT_TEMPLATE_SUBAGENT_CANCEL_EVENT, (data) => {
182
- if (!data || typeof data !== "object")
82
+ if (!data || typeof data !== "object" || Array.isArray(data))
183
83
  return;
184
- const requestId = data.requestId;
185
- if (typeof requestId !== "string")
84
+ const value = data;
85
+ const requestId = value.requestId;
86
+ if (!validId(requestId))
87
+ return;
88
+ if (hasStructuredDelegationMarker(data)) {
89
+ if (Object.keys(value).some((key) => key !== "requestId" && key !== "ownerRunId" && key !== "nodeId"))
90
+ return;
91
+ const ownerRunId = value.ownerRunId;
92
+ const nodeId = value.nodeId;
93
+ if (!validId(ownerRunId) || !validId(nodeId))
94
+ return;
95
+ const key = attemptKey(requestId, ownerRunId, nodeId);
96
+ const controller = attemptControllers.get(key);
97
+ if (controller)
98
+ controller.abort();
99
+ else
100
+ rememberIdentity(pendingAttemptCancels, key);
186
101
  return;
187
- const controller = controllers.get(requestId);
102
+ }
103
+ const controller = legacyControllers.get(requestId);
188
104
  if (controller) {
189
105
  controller.abort();
190
106
  return;
191
107
  }
192
- pendingCancels.add(requestId);
108
+ rememberPendingLegacyCancel(requestId);
193
109
  });
194
110
  subscribe(PROMPT_TEMPLATE_SUBAGENT_REQUEST_EVENT, async (data) => {
195
- const request = parsePromptTemplateRequest(data);
196
- if (!request)
111
+ const structuredPayload = hasStructuredDelegationMarker(data);
112
+ let requestId;
113
+ let params;
114
+ let structuredRequest;
115
+ let key;
116
+ let legacyRequest;
117
+ if (structuredPayload) {
118
+ const parsed = parseSubagentDelegationRequest(data);
119
+ if (parsed.ok === false) {
120
+ if (!disposed && parsed.requestId) {
121
+ const payload = {
122
+ requestId: parsed.requestId,
123
+ ...parsed.ownerRunId ? { ownerRunId: parsed.ownerRunId } : {},
124
+ ...parsed.nodeId ? { nodeId: parsed.nodeId } : {},
125
+ status: "invalid_request",
126
+ error: parsed.error
127
+ };
128
+ if (parsed.ownerRunId && parsed.nodeId) {
129
+ const attemptedKey = attemptKey(parsed.requestId, parsed.ownerRunId, parsed.nodeId);
130
+ if (!attemptControllers.has(attemptedKey))
131
+ emitTerminal(attemptedKey, payload);
132
+ } else {
133
+ options.events.emit(SUBAGENT_DELEGATION_RESPONSE_EVENT, payload);
134
+ }
135
+ }
136
+ return;
137
+ }
138
+ structuredRequest = parsed.request;
139
+ requestId = parsed.request.requestId;
140
+ key = attemptKey(requestId, parsed.request.ownerRunId, parsed.request.nodeId);
141
+ params = toSubagentDelegationExecutionParams(parsed.request);
142
+ } else {
143
+ if (data && typeof data === "object" && !Array.isArray(data)) {
144
+ const legacy = data;
145
+ if ((legacy.tasks !== undefined || legacy.worktree !== undefined) && typeof legacy.requestId === "string" && legacy.requestId) {
146
+ options.events.emit(PROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT, {
147
+ requestId: legacy.requestId,
148
+ messages: [],
149
+ isError: true,
150
+ errorText: "Legacy prompt-template tasks/worktree orchestration was removed; use workflowScript."
151
+ });
152
+ return;
153
+ }
154
+ }
155
+ legacyRequest = parsePromptTemplateRequest(data);
156
+ if (!legacyRequest)
157
+ return;
158
+ options.events.emit(PROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT, {
159
+ ...legacyRequest,
160
+ messages: [],
161
+ isError: true,
162
+ errorText: "Legacy prompt-template direct delegation was removed; use workflowScript through the subagent tool or structured delegation."
163
+ });
197
164
  return;
165
+ }
166
+ if (!structuredRequest && legacyControllers.has(requestId))
167
+ return;
168
+ if (structuredRequest && key) {
169
+ if (attemptControllers.has(key) || settledAttempts.has(key))
170
+ return;
171
+ if (pendingAttemptCancels.delete(key)) {
172
+ emitTerminal(key, {
173
+ requestId,
174
+ ownerRunId: structuredRequest.ownerRunId,
175
+ nodeId: structuredRequest.nodeId,
176
+ status: "cancelled"
177
+ });
178
+ return;
179
+ }
180
+ if (identitySaturated) {
181
+ options.events.emit(SUBAGENT_DELEGATION_RESPONSE_EVENT, {
182
+ requestId,
183
+ ownerRunId: structuredRequest.ownerRunId,
184
+ nodeId: structuredRequest.nodeId,
185
+ status: "unavailable_context",
186
+ error: "Delegation identity capacity is exhausted for this extension context."
187
+ });
188
+ return;
189
+ }
190
+ const active = activeOwnedNodes.get(nodeKey(structuredRequest.ownerRunId, structuredRequest.nodeId));
191
+ if (active) {
192
+ emitTerminal(key, {
193
+ requestId,
194
+ ownerRunId: structuredRequest.ownerRunId,
195
+ nodeId: structuredRequest.nodeId,
196
+ status: "duplicate_node"
197
+ });
198
+ return;
199
+ }
200
+ }
198
201
  const ctx = options.getContext();
199
202
  if (!ctx) {
200
- const response = {
201
- ...request,
202
- messages: [],
203
- isError: true,
204
- errorText: "No active extension context for delegated subagent execution."
205
- };
206
- options.events.emit(PROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT, response);
203
+ if (structuredRequest && key) {
204
+ emitTerminal(key, {
205
+ requestId,
206
+ ownerRunId: structuredRequest.ownerRunId,
207
+ nodeId: structuredRequest.nodeId,
208
+ status: "unavailable_context",
209
+ error: "No active extension context for delegated subagent execution."
210
+ });
211
+ } else if (legacyRequest) {
212
+ options.events.emit(PROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT, {
213
+ ...legacyRequest,
214
+ messages: [],
215
+ isError: true,
216
+ errorText: "No active extension context for delegated subagent execution."
217
+ });
218
+ }
207
219
  return;
208
220
  }
209
221
  const controller = new AbortController;
210
- controllers.set(request.requestId, controller);
211
- if (pendingCancels.delete(request.requestId)) {
212
- controller.abort();
213
- const response = {
214
- ...request,
215
- messages: [],
216
- isError: true,
217
- errorText: "Delegated prompt cancelled."
218
- };
219
- options.events.emit(PROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT, response);
220
- controllers.delete(request.requestId);
222
+ if (structuredRequest && key) {
223
+ attemptControllers.set(key, controller);
224
+ activeOwnedNodes.set(nodeKey(structuredRequest.ownerRunId, structuredRequest.nodeId), { attemptKey: key, controller });
225
+ } else {
226
+ legacyControllers.set(requestId, controller);
227
+ if (pendingLegacyCancels.delete(requestId))
228
+ controller.abort();
229
+ }
230
+ if (controller.signal.aborted) {
231
+ if (structuredRequest && key) {
232
+ emitTerminal(key, {
233
+ requestId,
234
+ ownerRunId: structuredRequest.ownerRunId,
235
+ nodeId: structuredRequest.nodeId,
236
+ status: "cancelled"
237
+ });
238
+ activeOwnedNodes.delete(nodeKey(structuredRequest.ownerRunId, structuredRequest.nodeId));
239
+ } else if (legacyRequest) {
240
+ options.events.emit(PROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT, {
241
+ ...legacyRequest,
242
+ messages: [],
243
+ isError: true,
244
+ errorText: "Delegated prompt cancelled."
245
+ });
246
+ }
247
+ if (key)
248
+ attemptControllers.delete(key);
249
+ else
250
+ legacyControllers.delete(requestId);
221
251
  return;
222
252
  }
223
- options.events.emit(PROMPT_TEMPLATE_SUBAGENT_STARTED_EVENT, { requestId: request.requestId });
253
+ options.events.emit(structuredRequest ? SUBAGENT_DELEGATION_STARTED_EVENT : PROMPT_TEMPLATE_SUBAGENT_STARTED_EVENT, structuredRequest ? { requestId, ownerRunId: structuredRequest.ownerRunId, nodeId: structuredRequest.nodeId } : { requestId });
224
254
  try {
225
- const result = await options.execute(request.requestId, request, controller.signal, ctx, (update) => {
226
- const payload = toDelegationUpdate(request.requestId, update);
227
- if (!payload)
255
+ const executeRequest = structuredRequest && options.executeStructured ? options.executeStructured : options.execute;
256
+ const result = await executeRequest(requestId, params, controller.signal, ctx, (update) => {
257
+ if (key ? !ownsAttempt(key, controller) : !ownsLegacyRequest(requestId, controller))
258
+ return;
259
+ if (structuredRequest) {
260
+ const payload = toSubagentDelegationUpdate(structuredRequest, update);
261
+ if (payload)
262
+ options.events.emit(SUBAGENT_DELEGATION_UPDATE_EVENT, payload);
228
263
  return;
229
- options.events.emit(PROMPT_TEMPLATE_SUBAGENT_UPDATE_EVENT, payload);
230
- });
231
- const contentText = firstTextContent(result.content);
232
- const messages = buildDelegationMessages(result.details?.results?.[0] ?? {}, contentText);
233
- const parallelResults = request.tasks ? request.tasks.map((task, index) => {
234
- const step = result.details?.results?.[index];
235
- if (!step) {
236
- return {
237
- agent: task.agent,
238
- messages: [],
239
- isError: true,
240
- errorText: "Missing result for delegated parallel task."
241
- };
242
264
  }
243
- const exitCode = typeof step.exitCode === "number" ? step.exitCode : undefined;
244
- const errorText = step.error;
245
- return {
246
- agent: step.agent ?? task.agent,
247
- messages: buildDelegationMessages(step),
248
- isError: exitCode !== undefined && exitCode !== 0 || !!errorText,
249
- errorText: errorText || undefined
250
- };
251
- }) : undefined;
252
- const response = {
253
- ...request,
254
- messages,
255
- ...parallelResults ? { parallelResults } : {},
256
- ...contentText ? { contentText } : {},
257
- isError: result.isError === true,
258
- errorText: result.isError ? contentText : undefined
259
- };
260
- options.events.emit(PROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT, response);
265
+ const payload = toDelegationUpdate(requestId, update);
266
+ if (payload)
267
+ options.events.emit(PROMPT_TEMPLATE_SUBAGENT_UPDATE_EVENT, payload);
268
+ });
269
+ if (key ? !ownsAttempt(key, controller) : !ownsLegacyRequest(requestId, controller))
270
+ return;
271
+ if (structuredRequest && key) {
272
+ emitTerminal(key, toSubagentDelegationResponse(structuredRequest, result, controller.signal.aborted));
273
+ } else if (legacyRequest) {
274
+ options.events.emit(PROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT, controller.signal.aborted ? { ...legacyRequest, messages: [], isError: true, errorText: "Delegated prompt cancelled." } : toPromptTemplateResponse(legacyRequest, result));
275
+ }
261
276
  } catch (error) {
262
- const response = {
263
- ...request,
264
- messages: [],
265
- isError: true,
266
- errorText: error instanceof Error ? error.message : String(error)
267
- };
268
- options.events.emit(PROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT, response);
277
+ if (key ? !ownsAttempt(key, controller) : !ownsLegacyRequest(requestId, controller))
278
+ return;
279
+ if (structuredRequest && key) {
280
+ emitTerminal(key, {
281
+ requestId,
282
+ ownerRunId: structuredRequest.ownerRunId,
283
+ nodeId: structuredRequest.nodeId,
284
+ status: controller.signal.aborted ? "cancelled" : "failed",
285
+ ...controller.signal.aborted ? {} : { error: error instanceof Error ? error.message : String(error) }
286
+ });
287
+ } else if (legacyRequest) {
288
+ options.events.emit(PROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT, {
289
+ ...legacyRequest,
290
+ messages: [],
291
+ isError: true,
292
+ errorText: error instanceof Error ? error.message : String(error)
293
+ });
294
+ }
269
295
  } finally {
270
- controllers.delete(request.requestId);
296
+ if (key) {
297
+ if (attemptControllers.get(key) === controller)
298
+ attemptControllers.delete(key);
299
+ } else if (legacyControllers.get(requestId) === controller)
300
+ legacyControllers.delete(requestId);
301
+ if (structuredRequest) {
302
+ const ownedNodeKey = nodeKey(structuredRequest.ownerRunId, structuredRequest.nodeId);
303
+ if (activeOwnedNodes.get(ownedNodeKey)?.controller === controller)
304
+ activeOwnedNodes.delete(ownedNodeKey);
305
+ }
271
306
  }
272
307
  });
273
308
  return {
274
309
  cancelAll: () => {
275
- for (const controller of controllers.values()) {
310
+ for (const controller of legacyControllers.values())
276
311
  controller.abort();
277
- }
278
- controllers.clear();
279
- pendingCancels.clear();
312
+ for (const controller of attemptControllers.values())
313
+ controller.abort();
314
+ legacyControllers.clear();
315
+ attemptControllers.clear();
316
+ pendingLegacyCancels.clear();
317
+ pendingAttemptCancels.clear();
318
+ activeOwnedNodes.clear();
319
+ settledAttempts.clear();
320
+ identitySaturated = false;
280
321
  },
281
322
  dispose: () => {
323
+ disposed = true;
324
+ for (const controller of legacyControllers.values())
325
+ controller.abort();
326
+ for (const controller of attemptControllers.values())
327
+ controller.abort();
328
+ legacyControllers.clear();
329
+ attemptControllers.clear();
282
330
  for (const unsubscribe of subscriptions)
283
331
  unsubscribe();
284
332
  subscriptions.length = 0;
285
- pendingCancels.clear();
333
+ pendingLegacyCancels.clear();
334
+ pendingAttemptCancels.clear();
335
+ activeOwnedNodes.clear();
336
+ settledAttempts.clear();
286
337
  }
287
338
  };
288
339
  }