@duckmind/dm-darwin-x64 0.43.2 → 0.43.8

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 (256) hide show
  1. package/dm +0 -0
  2. package/extensions/.dm-extensions.json +242 -49
  3. package/extensions/dm-9router-ext/package.json +2 -19
  4. package/extensions/dm-9router-ext/src/index.js +5 -0
  5. package/extensions/dm-ask-user/index.js +10 -0
  6. package/extensions/dm-ask-user/package.json +1 -21
  7. package/extensions/dm-cli-anything/package.json +0 -6
  8. package/extensions/dm-context/package.json +2 -12
  9. package/extensions/dm-context/src/context.js +1 -0
  10. package/extensions/dm-context/src/index.js +7 -0
  11. package/extensions/dm-context/src/utils.js +1 -0
  12. package/extensions/dm-cua/package.json +0 -7
  13. package/extensions/dm-fff/package.json +1 -28
  14. package/extensions/dm-fff/src/index.js +15 -0
  15. package/extensions/dm-fff/src/query.js +1 -0
  16. package/extensions/dm-goal/package.json +2 -31
  17. package/extensions/dm-goal/src/goal.js +43 -0
  18. package/extensions/dm-grill-me/index.js +174 -0
  19. package/extensions/dm-grill-me/package.json +1 -26
  20. package/extensions/dm-image2/package.json +0 -7
  21. package/extensions/dm-subagents/package.json +1 -32
  22. package/extensions/dm-subagents/src/agents/agent-management.js +37 -0
  23. package/extensions/dm-subagents/src/agents/agent-memory.js +6 -0
  24. package/extensions/dm-subagents/src/agents/agent-scope.js +1 -0
  25. package/extensions/dm-subagents/src/agents/agent-selection.js +1 -0
  26. package/extensions/dm-subagents/src/agents/agent-serializer.js +7 -0
  27. package/extensions/dm-subagents/src/agents/agents.js +11 -0
  28. package/extensions/dm-subagents/src/agents/chain-serializer.js +12 -0
  29. package/extensions/dm-subagents/src/agents/frontmatter.js +6 -0
  30. package/extensions/dm-subagents/src/agents/identity.js +1 -0
  31. package/extensions/dm-subagents/src/agents/proactive-skills.js +1 -0
  32. package/extensions/dm-subagents/src/agents/skills.js +6 -0
  33. package/extensions/dm-subagents/src/extension/config.js +2 -0
  34. package/extensions/dm-subagents/src/extension/control-notices.js +4 -0
  35. package/extensions/dm-subagents/src/extension/doctor.js +16 -0
  36. package/extensions/dm-subagents/src/extension/fanout-child.js +231 -0
  37. package/extensions/dm-subagents/src/extension/index.js +367 -0
  38. package/extensions/dm-subagents/src/extension/rpc.js +8 -0
  39. package/extensions/dm-subagents/src/extension/schemas.js +1 -0
  40. package/extensions/dm-subagents/src/extension/{tool-description.ts → tool-description.js} +6 -126
  41. package/extensions/dm-subagents/src/intercom/intercom-bridge.js +13 -0
  42. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +5 -0
  43. package/extensions/dm-subagents/src/intercom/result-intercom.js +3 -0
  44. package/extensions/dm-subagents/src/profiles/profiles.js +3 -0
  45. package/extensions/dm-subagents/src/runs/background/async-execution.js +46 -0
  46. package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +14 -0
  47. package/extensions/dm-subagents/src/runs/background/async-resume.js +8 -0
  48. package/extensions/dm-subagents/src/runs/background/async-status.js +12 -0
  49. package/extensions/dm-subagents/src/runs/background/chain-append.js +2 -0
  50. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +1 -0
  51. package/extensions/dm-subagents/src/runs/background/completion-batcher.js +1 -0
  52. package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +1 -0
  53. package/extensions/dm-subagents/src/runs/background/control-channel.js +1 -0
  54. package/extensions/dm-subagents/src/runs/background/fleet-view.js +17 -0
  55. package/extensions/dm-subagents/src/runs/background/notify.js +3 -0
  56. package/extensions/dm-subagents/src/runs/background/parallel-groups.js +1 -0
  57. package/extensions/dm-subagents/src/runs/background/result-watcher.js +8 -0
  58. package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +4 -0
  59. package/extensions/dm-subagents/src/runs/background/run-status.js +23 -0
  60. package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +4 -0
  61. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +11 -0
  62. package/extensions/dm-subagents/src/runs/background/subagent-runner.js +78 -0
  63. package/extensions/dm-subagents/src/runs/background/top-level-async.js +1 -0
  64. package/extensions/dm-subagents/src/runs/background/wait.js +11 -0
  65. package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +12 -0
  66. package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +102 -0
  67. package/extensions/dm-subagents/src/runs/foreground/execution.js +51 -0
  68. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +228 -0
  69. package/extensions/dm-subagents/src/runs/shared/acceptance.js +3 -0
  70. package/extensions/dm-subagents/src/runs/shared/chain-outputs.js +1 -0
  71. package/extensions/dm-subagents/src/runs/shared/completion-guard.js +3 -0
  72. package/extensions/dm-subagents/src/runs/shared/dm-args.js +1 -0
  73. package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +1 -0
  74. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +1 -0
  75. package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +1 -0
  76. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +1 -0
  77. package/extensions/dm-subagents/src/runs/shared/model-fallback.js +1 -0
  78. package/extensions/dm-subagents/src/runs/shared/model-scope.js +1 -0
  79. package/extensions/dm-subagents/src/runs/shared/nested-events.js +8 -0
  80. package/extensions/dm-subagents/src/runs/shared/nested-path.js +1 -0
  81. package/extensions/dm-subagents/src/runs/shared/nested-render.js +1 -0
  82. package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +5 -0
  83. package/extensions/dm-subagents/src/runs/shared/run-history.js +5 -0
  84. package/extensions/dm-subagents/src/runs/shared/single-output.js +14 -0
  85. package/extensions/dm-subagents/src/runs/shared/structured-output.js +1 -0
  86. package/extensions/dm-subagents/src/runs/shared/subagent-control.js +5 -0
  87. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +22 -0
  88. package/extensions/dm-subagents/src/runs/shared/tool-budget.js +1 -0
  89. package/extensions/dm-subagents/src/runs/shared/turn-budget.js +7 -0
  90. package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +1 -0
  91. package/extensions/dm-subagents/src/runs/shared/worktree.js +3 -0
  92. package/extensions/dm-subagents/src/shared/artifacts.js +2 -0
  93. package/extensions/dm-subagents/src/shared/atomic-json.js +1 -0
  94. package/extensions/dm-subagents/src/shared/child-transcript.js +5 -0
  95. package/extensions/dm-subagents/src/shared/file-coalescer.js +1 -0
  96. package/extensions/dm-subagents/src/shared/fork-context.js +6 -0
  97. package/extensions/dm-subagents/src/shared/formatters.js +9 -0
  98. package/extensions/dm-subagents/src/shared/jsonl-writer.js +2 -0
  99. package/extensions/dm-subagents/src/shared/model-info.js +1 -0
  100. package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.js +1 -0
  101. package/extensions/dm-subagents/src/shared/session-identity.js +1 -0
  102. package/extensions/dm-subagents/src/shared/session-tokens.js +2 -0
  103. package/extensions/dm-subagents/src/shared/settings.js +23 -0
  104. package/extensions/dm-subagents/src/shared/status-format.js +1 -0
  105. package/extensions/dm-subagents/src/shared/types.js +8 -0
  106. package/extensions/dm-subagents/src/shared/utils.js +2 -0
  107. package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +1 -0
  108. package/extensions/dm-subagents/src/slash/prompt-workflows.js +7 -0
  109. package/extensions/dm-subagents/src/slash/slash-bridge.js +1 -0
  110. package/extensions/dm-subagents/src/slash/slash-commands.js +38 -0
  111. package/extensions/dm-subagents/src/slash/slash-live-state.js +6 -0
  112. package/extensions/dm-subagents/src/tui/render-helpers.js +1 -0
  113. package/extensions/dm-subagents/src/tui/render.js +4 -0
  114. package/extensions/dm-tasks/package.json +1 -30
  115. package/extensions/dm-tasks/src/auto-clear.js +1 -0
  116. package/extensions/dm-tasks/src/index.js +212 -0
  117. package/extensions/dm-tasks/src/process-tracker.js +1 -0
  118. package/extensions/dm-tasks/src/task-store.js +1 -0
  119. package/extensions/dm-tasks/src/tasks-config.js +1 -0
  120. package/extensions/dm-tasks/src/types.js +0 -0
  121. package/extensions/dm-tasks/src/ui/settings-menu.js +1 -0
  122. package/extensions/dm-tasks/src/ui/task-widget.js +1 -0
  123. package/extensions/dm-usage/index.js +9 -0
  124. package/extensions/dm-usage/package.json +1 -18
  125. package/extensions/greedysearch-dm/bin/search.mjs +135 -135
  126. package/extensions/greedysearch-dm/index.js +20 -0
  127. package/extensions/greedysearch-dm/package.json +1 -22
  128. package/extensions/greedysearch-dm/src/formatters/results.js +8 -0
  129. package/extensions/greedysearch-dm/src/formatters/sources.js +1 -0
  130. package/extensions/greedysearch-dm/src/formatters/synthesis.js +1 -0
  131. package/extensions/greedysearch-dm/src/search/engines.mjs +9 -9
  132. package/extensions/greedysearch-dm/src/search/paths.mjs +1 -0
  133. package/extensions/greedysearch-dm/src/search/research.mjs +100 -100
  134. package/extensions/greedysearch-dm/src/search/synthesis-runner.mjs +10 -10
  135. package/extensions/greedysearch-dm/src/tools/greedy-search-handler.js +20 -0
  136. package/extensions/greedysearch-dm/src/tools/shared.js +9 -0
  137. package/extensions/greedysearch-dm/src/types.js +0 -0
  138. package/extensions/greedysearch-dm/src/utils/helpers.js +1 -0
  139. package/package.json +1 -1
  140. package/extensions/dm-9router-ext/src/index.ts +0 -541
  141. package/extensions/dm-ask-user/index.ts +0 -857
  142. package/extensions/dm-context/src/context.ts +0 -158
  143. package/extensions/dm-context/src/index.ts +0 -439
  144. package/extensions/dm-context/src/utils.ts +0 -6
  145. package/extensions/dm-fff/src/index.ts +0 -1023
  146. package/extensions/dm-fff/src/query.ts +0 -87
  147. package/extensions/dm-goal/src/goal.ts +0 -1073
  148. package/extensions/dm-grill-me/index.ts +0 -1085
  149. package/extensions/dm-subagents/src/agents/agent-management.ts +0 -1052
  150. package/extensions/dm-subagents/src/agents/agent-memory.ts +0 -254
  151. package/extensions/dm-subagents/src/agents/agent-scope.ts +0 -6
  152. package/extensions/dm-subagents/src/agents/agent-selection.ts +0 -25
  153. package/extensions/dm-subagents/src/agents/agent-serializer.ts +0 -121
  154. package/extensions/dm-subagents/src/agents/agents.ts +0 -1553
  155. package/extensions/dm-subagents/src/agents/chain-serializer.ts +0 -277
  156. package/extensions/dm-subagents/src/agents/frontmatter.ts +0 -93
  157. package/extensions/dm-subagents/src/agents/identity.ts +0 -30
  158. package/extensions/dm-subagents/src/agents/proactive-skills.ts +0 -191
  159. package/extensions/dm-subagents/src/agents/skills.ts +0 -729
  160. package/extensions/dm-subagents/src/extension/config.ts +0 -39
  161. package/extensions/dm-subagents/src/extension/control-notices.ts +0 -92
  162. package/extensions/dm-subagents/src/extension/doctor.ts +0 -214
  163. package/extensions/dm-subagents/src/extension/fanout-child.ts +0 -172
  164. package/extensions/dm-subagents/src/extension/index.ts +0 -656
  165. package/extensions/dm-subagents/src/extension/rpc.ts +0 -369
  166. package/extensions/dm-subagents/src/extension/schemas.ts +0 -309
  167. package/extensions/dm-subagents/src/intercom/intercom-bridge.ts +0 -180
  168. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.ts +0 -519
  169. package/extensions/dm-subagents/src/intercom/result-intercom.ts +0 -377
  170. package/extensions/dm-subagents/src/profiles/profiles.ts +0 -637
  171. package/extensions/dm-subagents/src/runs/background/async-execution.ts +0 -1065
  172. package/extensions/dm-subagents/src/runs/background/async-job-tracker.ts +0 -441
  173. package/extensions/dm-subagents/src/runs/background/async-resume.ts +0 -391
  174. package/extensions/dm-subagents/src/runs/background/async-status.ts +0 -395
  175. package/extensions/dm-subagents/src/runs/background/chain-append.ts +0 -282
  176. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.ts +0 -191
  177. package/extensions/dm-subagents/src/runs/background/completion-batcher.ts +0 -166
  178. package/extensions/dm-subagents/src/runs/background/completion-dedupe.ts +0 -63
  179. package/extensions/dm-subagents/src/runs/background/control-channel.ts +0 -332
  180. package/extensions/dm-subagents/src/runs/background/fleet-view.ts +0 -515
  181. package/extensions/dm-subagents/src/runs/background/notify.ts +0 -225
  182. package/extensions/dm-subagents/src/runs/background/parallel-groups.ts +0 -45
  183. package/extensions/dm-subagents/src/runs/background/result-watcher.ts +0 -315
  184. package/extensions/dm-subagents/src/runs/background/run-id-resolver.ts +0 -84
  185. package/extensions/dm-subagents/src/runs/background/run-status.ts +0 -434
  186. package/extensions/dm-subagents/src/runs/background/scheduled-runs.ts +0 -514
  187. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.ts +0 -368
  188. package/extensions/dm-subagents/src/runs/background/subagent-runner.ts +0 -3171
  189. package/extensions/dm-subagents/src/runs/background/top-level-async.ts +0 -13
  190. package/extensions/dm-subagents/src/runs/background/wait.ts +0 -353
  191. package/extensions/dm-subagents/src/runs/foreground/chain-clarify.ts +0 -1333
  192. package/extensions/dm-subagents/src/runs/foreground/chain-execution.ts +0 -1313
  193. package/extensions/dm-subagents/src/runs/foreground/execution.ts +0 -1239
  194. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.ts +0 -3613
  195. package/extensions/dm-subagents/src/runs/shared/acceptance.ts +0 -879
  196. package/extensions/dm-subagents/src/runs/shared/chain-outputs.ts +0 -116
  197. package/extensions/dm-subagents/src/runs/shared/completion-guard.ts +0 -147
  198. package/extensions/dm-subagents/src/runs/shared/dm-args.ts +0 -271
  199. package/extensions/dm-subagents/src/runs/shared/dm-spawn.ts +0 -147
  200. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.ts +0 -295
  201. package/extensions/dm-subagents/src/runs/shared/long-running-guard.ts +0 -175
  202. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +0 -365
  203. package/extensions/dm-subagents/src/runs/shared/model-fallback.ts +0 -292
  204. package/extensions/dm-subagents/src/runs/shared/model-scope.ts +0 -128
  205. package/extensions/dm-subagents/src/runs/shared/nested-events.ts +0 -908
  206. package/extensions/dm-subagents/src/runs/shared/nested-path.ts +0 -52
  207. package/extensions/dm-subagents/src/runs/shared/nested-render.ts +0 -115
  208. package/extensions/dm-subagents/src/runs/shared/parallel-utils.ts +0 -198
  209. package/extensions/dm-subagents/src/runs/shared/run-history.ts +0 -60
  210. package/extensions/dm-subagents/src/runs/shared/single-output.ts +0 -180
  211. package/extensions/dm-subagents/src/runs/shared/structured-output.ts +0 -77
  212. package/extensions/dm-subagents/src/runs/shared/subagent-control.ts +0 -223
  213. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.ts +0 -342
  214. package/extensions/dm-subagents/src/runs/shared/tool-budget.ts +0 -74
  215. package/extensions/dm-subagents/src/runs/shared/turn-budget.ts +0 -52
  216. package/extensions/dm-subagents/src/runs/shared/workflow-graph.ts +0 -206
  217. package/extensions/dm-subagents/src/runs/shared/worktree.ts +0 -600
  218. package/extensions/dm-subagents/src/shared/artifacts.ts +0 -113
  219. package/extensions/dm-subagents/src/shared/atomic-json.ts +0 -86
  220. package/extensions/dm-subagents/src/shared/child-transcript.ts +0 -212
  221. package/extensions/dm-subagents/src/shared/file-coalescer.ts +0 -40
  222. package/extensions/dm-subagents/src/shared/fork-context.ts +0 -194
  223. package/extensions/dm-subagents/src/shared/formatters.ts +0 -133
  224. package/extensions/dm-subagents/src/shared/jsonl-writer.ts +0 -81
  225. package/extensions/dm-subagents/src/shared/model-info.ts +0 -78
  226. package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.ts +0 -85
  227. package/extensions/dm-subagents/src/shared/session-identity.ts +0 -10
  228. package/extensions/dm-subagents/src/shared/session-tokens.ts +0 -44
  229. package/extensions/dm-subagents/src/shared/settings.ts +0 -450
  230. package/extensions/dm-subagents/src/shared/status-format.ts +0 -49
  231. package/extensions/dm-subagents/src/shared/types.ts +0 -1257
  232. package/extensions/dm-subagents/src/shared/utils.ts +0 -554
  233. package/extensions/dm-subagents/src/slash/prompt-template-bridge.ts +0 -420
  234. package/extensions/dm-subagents/src/slash/prompt-workflows.ts +0 -330
  235. package/extensions/dm-subagents/src/slash/slash-bridge.ts +0 -176
  236. package/extensions/dm-subagents/src/slash/slash-commands.ts +0 -1296
  237. package/extensions/dm-subagents/src/slash/slash-live-state.ts +0 -292
  238. package/extensions/dm-subagents/src/tui/render-helpers.ts +0 -80
  239. package/extensions/dm-subagents/src/tui/render.ts +0 -1748
  240. package/extensions/dm-tasks/src/auto-clear.ts +0 -91
  241. package/extensions/dm-tasks/src/index.ts +0 -1145
  242. package/extensions/dm-tasks/src/process-tracker.ts +0 -140
  243. package/extensions/dm-tasks/src/task-store.ts +0 -305
  244. package/extensions/dm-tasks/src/tasks-config.ts +0 -23
  245. package/extensions/dm-tasks/src/types.ts +0 -40
  246. package/extensions/dm-tasks/src/ui/settings-menu.ts +0 -100
  247. package/extensions/dm-tasks/src/ui/task-widget.ts +0 -265
  248. package/extensions/dm-usage/index.ts +0 -1718
  249. package/extensions/greedysearch-dm/index.ts +0 -177
  250. package/extensions/greedysearch-dm/src/formatters/results.ts +0 -163
  251. package/extensions/greedysearch-dm/src/formatters/sources.ts +0 -116
  252. package/extensions/greedysearch-dm/src/formatters/synthesis.ts +0 -87
  253. package/extensions/greedysearch-dm/src/tools/greedy-search-handler.ts +0 -370
  254. package/extensions/greedysearch-dm/src/tools/shared.ts +0 -187
  255. package/extensions/greedysearch-dm/src/types.ts +0 -110
  256. package/extensions/greedysearch-dm/src/utils/helpers.ts +0 -40
@@ -1,369 +0,0 @@
1
- import * as path from "node:path";
2
- import type { AgentToolResult } from "@duckmind/dm-agent-core";
3
- import type { ExtensionContext } from "@duckmind/dm-coding-agent";
4
- import { Compile } from "typebox/compile";
5
- import { resolveAsyncRunLocation } from "../runs/background/async-resume.ts";
6
- import { deliverTimeoutRequest } from "../runs/background/control-channel.ts";
7
- import { reconcileAsyncRun } from "../runs/background/stale-run-reconciler.ts";
8
- import type { SubagentParamsLike } from "../runs/foreground/subagent-executor.ts";
9
- import { type Details, ASYNC_DIR, RESULTS_DIR } from "../shared/types.ts";
10
- import { readStatus } from "../shared/utils.ts";
11
- import { SubagentParams } from "./schemas.ts";
12
-
13
- export const SUBAGENT_RPC_PROTOCOL_VERSION = 1;
14
- export const SUBAGENT_RPC_REQUEST_EVENT = "subagents:rpc:v1:request";
15
- export const SUBAGENT_RPC_READY_EVENT = "subagents:rpc:v1:ready";
16
- export const SUBAGENT_RPC_REPLY_EVENT_PREFIX = "subagents:rpc:v1:reply:";
17
-
18
- export const SUBAGENT_RPC_METHODS = ["ping", "status", "spawn", "interrupt", "stop"] as const;
19
- export type SubagentRpcMethod = typeof SUBAGENT_RPC_METHODS[number];
20
-
21
- export interface SubagentRpcRequestEnvelope {
22
- version: typeof SUBAGENT_RPC_PROTOCOL_VERSION;
23
- requestId: string;
24
- method: SubagentRpcMethod;
25
- params?: unknown;
26
- source?: {
27
- extension?: string;
28
- [key: string]: unknown;
29
- };
30
- }
31
-
32
- export type SubagentRpcReplyEnvelope<T = unknown> = {
33
- version: typeof SUBAGENT_RPC_PROTOCOL_VERSION;
34
- requestId: string;
35
- method?: SubagentRpcMethod;
36
- success: true;
37
- data: T;
38
- } | {
39
- version: typeof SUBAGENT_RPC_PROTOCOL_VERSION;
40
- requestId: string;
41
- method?: SubagentRpcMethod;
42
- success: false;
43
- error: {
44
- code: SubagentRpcErrorCode;
45
- message: string;
46
- };
47
- };
48
-
49
- type SubagentRpcErrorCode =
50
- | "invalid_request"
51
- | "invalid_params"
52
- | "unsupported_version"
53
- | "unsupported_method"
54
- | "no_active_session"
55
- | "execution_failed"
56
- | "not_found"
57
- | "invalid_state";
58
-
59
- interface EventBus {
60
- on(event: string, handler: (data: unknown) => void): (() => void) | void;
61
- emit(event: string, data: unknown): void;
62
- }
63
-
64
- interface RegisterSubagentRpcBridgeOptions {
65
- events: EventBus;
66
- getContext: () => ExtensionContext | null;
67
- execute: (
68
- id: string,
69
- params: SubagentParamsLike,
70
- signal: AbortSignal,
71
- onUpdate: ((result: AgentToolResult<Details>) => void) | undefined,
72
- ctx: ExtensionContext,
73
- ) => Promise<AgentToolResult<Details>>;
74
- asyncDirRoot?: string;
75
- resultsDir?: string;
76
- kill?: (pid: number, signal?: NodeJS.Signals | 0) => boolean;
77
- now?: () => number;
78
- }
79
-
80
- class SubagentRpcError extends Error {
81
- readonly code: SubagentRpcErrorCode;
82
-
83
- constructor(code: SubagentRpcErrorCode, message: string) {
84
- super(message);
85
- this.name = "SubagentRpcError";
86
- this.code = code;
87
- }
88
- }
89
-
90
- const subagentParamsValidator = Compile(SubagentParams);
91
-
92
- export function subagentRpcReplyEvent(requestId: string): string {
93
- return `${SUBAGENT_RPC_REPLY_EVENT_PREFIX}${requestId}`;
94
- }
95
-
96
- function isRecord(value: unknown): value is Record<string, unknown> {
97
- return Boolean(value) && typeof value === "object" && !Array.isArray(value);
98
- }
99
-
100
- function assertRequestId(value: unknown): string {
101
- if (typeof value !== "string" || value.trim().length === 0 || /[\r\n]/.test(value)) {
102
- throw new SubagentRpcError("invalid_request", "RPC requestId must be a non-empty string without newlines.");
103
- }
104
- return value;
105
- }
106
-
107
- function assertRecordParams(params: unknown, method: SubagentRpcMethod): Record<string, unknown> {
108
- if (params === undefined) return {};
109
- if (!isRecord(params)) throw new SubagentRpcError("invalid_params", `RPC ${method} params must be an object.`);
110
- return params;
111
- }
112
-
113
- function assertSubagentParams(params: SubagentParamsLike, label: string): void {
114
- if (subagentParamsValidator.Check(params)) return;
115
- const messages = [...subagentParamsValidator.Errors(params)]
116
- .slice(0, 4)
117
- .map((error) => error.message);
118
- throw new SubagentRpcError("invalid_params", `${label}: ${messages.join("; ") || "invalid subagent parameters"}`);
119
- }
120
-
121
- function textFromToolResult(result: AgentToolResult<Details>): string {
122
- return result.content
123
- .filter((part): part is { type: "text"; text: string } => part.type === "text")
124
- .map((part) => part.text)
125
- .join("\n");
126
- }
127
-
128
- function dataFromToolResult(result: AgentToolResult<Details>): { text: string; details?: Details; isError?: boolean } {
129
- return {
130
- text: textFromToolResult(result),
131
- ...(result.details ? { details: result.details } : {}),
132
- ...(result.isError ? { isError: true } : {}),
133
- };
134
- }
135
-
136
- function failIfToolError(result: AgentToolResult<Details>): void {
137
- if (!result.isError) return;
138
- throw new SubagentRpcError("execution_failed", textFromToolResult(result) || "Subagent RPC execution failed.");
139
- }
140
-
141
- function normalizeTargetParams(params: unknown, method: SubagentRpcMethod): Pick<SubagentParamsLike, "id" | "runId" | "dir" | "index"> {
142
- const input = assertRecordParams(params, method);
143
- const output: Pick<SubagentParamsLike, "id" | "runId" | "dir" | "index"> = {};
144
- if (input.id !== undefined) output.id = input.id as string;
145
- if (input.runId !== undefined) output.runId = input.runId as string;
146
- if (input.dir !== undefined) output.dir = input.dir as string;
147
- if (input.index !== undefined) output.index = input.index as number;
148
- return output;
149
- }
150
-
151
- function sessionData(ctx: ExtensionContext | null): { cwd?: string; sessionId?: string; sessionFile?: string | null } {
152
- if (!ctx) return {};
153
- return {
154
- cwd: ctx.cwd,
155
- sessionId: ctx.sessionManager.getSessionId() ?? undefined,
156
- sessionFile: ctx.sessionManager.getSessionFile() ?? null,
157
- };
158
- }
159
-
160
- function pingData(ctx: ExtensionContext | null) {
161
- return {
162
- version: SUBAGENT_RPC_PROTOCOL_VERSION,
163
- methods: [...SUBAGENT_RPC_METHODS],
164
- capabilities: {
165
- status: true,
166
- asyncSpawn: true,
167
- interrupt: true,
168
- stop: true,
169
- },
170
- events: {
171
- ready: SUBAGENT_RPC_READY_EVENT,
172
- request: SUBAGENT_RPC_REQUEST_EVENT,
173
- replyPrefix: SUBAGENT_RPC_REPLY_EVENT_PREFIX,
174
- },
175
- session: sessionData(ctx),
176
- };
177
- }
178
-
179
- async function executeChecked(
180
- options: RegisterSubagentRpcBridgeOptions,
181
- ctx: ExtensionContext,
182
- requestId: string,
183
- method: SubagentRpcMethod,
184
- params: SubagentParamsLike,
185
- ): Promise<{ text: string; details?: Details; isError?: boolean }> {
186
- assertSubagentParams(params, `RPC ${method} params`);
187
- const controller = new AbortController();
188
- const result = await options.execute(`rpc-${method}-${requestId}`, params, controller.signal, undefined, ctx);
189
- failIfToolError(result);
190
- return dataFromToolResult(result);
191
- }
192
-
193
- function spawnParams(params: unknown): SubagentParamsLike {
194
- const input = assertRecordParams(params, "spawn");
195
- if (input.action !== undefined) {
196
- throw new SubagentRpcError("invalid_params", "RPC spawn does not accept management/control actions. Use status or interrupt RPC methods instead.");
197
- }
198
- if (input.async === false) {
199
- throw new SubagentRpcError("invalid_params", "RPC spawn only supports detached async launches; omit async or set async: true.");
200
- }
201
- if (input.clarify === true) {
202
- throw new SubagentRpcError("invalid_params", "RPC spawn cannot open the clarify UI; omit clarify or set clarify: false.");
203
- }
204
- return { ...(input as SubagentParamsLike), async: true, clarify: false };
205
- }
206
-
207
- function stopAsyncRun(
208
- params: unknown,
209
- options: RegisterSubagentRpcBridgeOptions,
210
- ctx: ExtensionContext,
211
- ): { runId: string; asyncDir: string; previousState: string; state: "stopping"; message: string } {
212
- const target = normalizeTargetParams(params, "stop");
213
- assertSubagentParams({ action: "status", ...target }, "RPC stop target params");
214
- const asyncDirRoot = options.asyncDirRoot ?? ASYNC_DIR;
215
- const resultsDir = options.resultsDir ?? RESULTS_DIR;
216
- let location;
217
- try {
218
- location = resolveAsyncRunLocation(target, asyncDirRoot, resultsDir);
219
- } catch (error) {
220
- throw new SubagentRpcError("invalid_params", error instanceof Error ? error.message : String(error));
221
- }
222
- if (!location.asyncDir) {
223
- throw new SubagentRpcError("not_found", "Async run not found or already completed; stop requires a live async run directory.");
224
- }
225
-
226
- const currentSessionId = ctx.sessionManager.getSessionId();
227
- const initialStatus = readStatus(location.asyncDir);
228
- const initialRunId = initialStatus?.runId ?? location.resolvedId ?? path.basename(location.asyncDir);
229
- if (!initialStatus) throw new SubagentRpcError("not_found", `Status file not found for async run '${initialRunId}'.`);
230
- if (!currentSessionId || initialStatus.sessionId !== currentSessionId) {
231
- throw new SubagentRpcError("not_found", `Async run '${initialRunId}' was not found in the active session.`);
232
- }
233
-
234
- let status;
235
- try {
236
- status = reconcileAsyncRun(location.asyncDir, { resultsDir, kill: options.kill, now: options.now }).status;
237
- } catch (error) {
238
- throw new SubagentRpcError("execution_failed", error instanceof Error ? error.message : String(error));
239
- }
240
- const runId = status?.runId ?? initialRunId;
241
- if (!status) throw new SubagentRpcError("not_found", `Status file not found for async run '${runId}'.`);
242
- if (status.sessionId !== currentSessionId) {
243
- throw new SubagentRpcError("not_found", `Async run '${runId}' was not found in the active session.`);
244
- }
245
- if (status.state !== "running") {
246
- throw new SubagentRpcError("invalid_state", `Async run ${runId} is ${status.state}; stop only supports running async runs.`);
247
- }
248
-
249
- try {
250
- deliverTimeoutRequest({
251
- asyncDir: location.asyncDir,
252
- pid: status.pid,
253
- kill: options.kill,
254
- now: options.now,
255
- source: "rpc-stop",
256
- });
257
- } catch (error) {
258
- throw new SubagentRpcError("execution_failed", error instanceof Error ? error.message : String(error));
259
- }
260
-
261
- return {
262
- runId,
263
- asyncDir: location.asyncDir,
264
- previousState: status.state,
265
- state: "stopping",
266
- message: `Stop requested for async run ${runId}.`,
267
- };
268
- }
269
-
270
- async function handleRequest(
271
- request: SubagentRpcRequestEnvelope,
272
- options: RegisterSubagentRpcBridgeOptions,
273
- ): Promise<unknown> {
274
- const ctx = options.getContext();
275
- if (request.method === "ping") return pingData(ctx);
276
- if (!ctx) throw new SubagentRpcError("no_active_session", "No active extension context for subagent RPC.");
277
-
278
- if (request.method === "spawn") {
279
- return executeChecked(options, ctx, request.requestId, request.method, spawnParams(request.params));
280
- }
281
- if (request.method === "status") {
282
- return executeChecked(options, ctx, request.requestId, request.method, { action: "status", ...normalizeTargetParams(request.params, "status") });
283
- }
284
- if (request.method === "interrupt") {
285
- return executeChecked(options, ctx, request.requestId, request.method, { action: "interrupt", ...normalizeTargetParams(request.params, "interrupt") });
286
- }
287
- if (request.method === "stop") {
288
- return stopAsyncRun(request.params, options, ctx);
289
- }
290
- throw new SubagentRpcError("unsupported_method", `Unsupported subagent RPC method: ${String(request.method)}`);
291
- }
292
-
293
- function parseRequest(raw: unknown): SubagentRpcRequestEnvelope {
294
- if (!isRecord(raw)) throw new SubagentRpcError("invalid_request", "Subagent RPC request must be an object.");
295
- const requestId = assertRequestId(raw.requestId);
296
- if (raw.version !== SUBAGENT_RPC_PROTOCOL_VERSION) {
297
- throw new SubagentRpcError("unsupported_version", `Unsupported subagent RPC version: ${String(raw.version)}.`);
298
- }
299
- if (typeof raw.method !== "string" || !(SUBAGENT_RPC_METHODS as readonly string[]).includes(raw.method)) {
300
- throw new SubagentRpcError("unsupported_method", `Unsupported subagent RPC method: ${String(raw.method)}.`);
301
- }
302
- return {
303
- version: SUBAGENT_RPC_PROTOCOL_VERSION,
304
- requestId,
305
- method: raw.method as SubagentRpcMethod,
306
- ...(raw.params !== undefined ? { params: raw.params } : {}),
307
- ...(isRecord(raw.source) ? { source: raw.source as SubagentRpcRequestEnvelope["source"] } : {}),
308
- };
309
- }
310
-
311
- function safeReplyRequestId(raw: unknown): string {
312
- if (!isRecord(raw)) return "unknown";
313
- const requestId = raw.requestId;
314
- return typeof requestId === "string" && requestId.trim().length > 0 && !/[\r\n]/.test(requestId)
315
- ? requestId
316
- : "unknown";
317
- }
318
-
319
- function errorReply(raw: unknown, error: unknown): SubagentRpcReplyEnvelope {
320
- const requestId = safeReplyRequestId(raw);
321
- const method = isRecord(raw) && typeof raw.method === "string" && (SUBAGENT_RPC_METHODS as readonly string[]).includes(raw.method)
322
- ? raw.method as SubagentRpcMethod
323
- : undefined;
324
- const rpcError = error instanceof SubagentRpcError
325
- ? error
326
- : new SubagentRpcError("execution_failed", error instanceof Error ? error.message : String(error));
327
- return {
328
- version: SUBAGENT_RPC_PROTOCOL_VERSION,
329
- requestId,
330
- ...(method ? { method } : {}),
331
- success: false,
332
- error: {
333
- code: rpcError.code,
334
- message: rpcError.message,
335
- },
336
- };
337
- }
338
-
339
- export function registerSubagentRpcBridge(options: RegisterSubagentRpcBridgeOptions): {
340
- emitReady: (ctx?: ExtensionContext | null) => void;
341
- dispose: () => void;
342
- } {
343
- const unsubscribe = options.events.on(SUBAGENT_RPC_REQUEST_EVENT, async (raw) => {
344
- let request: SubagentRpcRequestEnvelope | undefined;
345
- try {
346
- request = parseRequest(raw);
347
- const data = await handleRequest(request, options);
348
- options.events.emit(subagentRpcReplyEvent(request.requestId), {
349
- version: SUBAGENT_RPC_PROTOCOL_VERSION,
350
- requestId: request.requestId,
351
- method: request.method,
352
- success: true,
353
- data,
354
- } satisfies SubagentRpcReplyEnvelope);
355
- } catch (error) {
356
- const reply = errorReply(request ?? raw, error);
357
- options.events.emit(subagentRpcReplyEvent(reply.requestId), reply);
358
- }
359
- });
360
-
361
- return {
362
- emitReady: (ctx) => {
363
- options.events.emit(SUBAGENT_RPC_READY_EVENT, pingData(ctx ?? options.getContext()));
364
- },
365
- dispose: () => {
366
- if (typeof unsubscribe === "function") unsubscribe();
367
- },
368
- };
369
- }
@@ -1,309 +0,0 @@
1
- /**
2
- * TypeBox schemas for subagent tool parameters
3
- */
4
-
5
- import { Type } from "typebox";
6
-
7
- function keepTopLevelParameterDescriptions<T>(schema: T): T {
8
- return pruneNestedDescriptions(schema, []) as T;
9
- }
10
-
11
- function pruneNestedDescriptions(value: unknown, path: string[]): unknown {
12
- if (!value || typeof value !== "object") return value;
13
-
14
- const result = Array.isArray(value) ? [] : Object.create(Object.getPrototypeOf(value));
15
- for (const key of Reflect.ownKeys(value)) {
16
- const descriptor = Object.getOwnPropertyDescriptor(value, key);
17
- if (!descriptor) continue;
18
- if (key === "description" && !isTopLevelParameterDescription(path)) continue;
19
- if ("value" in descriptor) {
20
- const nextPath = typeof key === "string" ? [...path, key] : path;
21
- descriptor.value = pruneNestedDescriptions(descriptor.value, nextPath);
22
- }
23
- Object.defineProperty(result, key, descriptor);
24
- }
25
- return result;
26
- }
27
-
28
- function isTopLevelParameterDescription(path: string[]): boolean {
29
- return path.length === 2 && path[0] === "properties";
30
- }
31
-
32
- const SkillOverride = Type.Unsafe({
33
- anyOf: [
34
- { type: "array", items: { type: "string" } },
35
- { type: "boolean" },
36
- { type: "string" },
37
- ],
38
- description: "Skill name(s) to make available (comma-separated), array of strings, or boolean (false disables, true uses default)",
39
- });
40
-
41
- const OutputOverride = Type.Unsafe({
42
- anyOf: [
43
- { type: "string" },
44
- { type: "boolean" },
45
- ],
46
- description: "Output filename/path (string), or false to disable file output",
47
- });
48
-
49
- const OutputModeOverride = Type.String({
50
- enum: ["inline", "file-only"],
51
- description: "Return saved output inline (default) or only a concise file reference. file-only requires output to be a path.",
52
- });
53
-
54
- const ReadsOverride = Type.Unsafe({
55
- anyOf: [
56
- { type: "array", items: { type: "string" } },
57
- { type: "boolean" },
58
- ],
59
- description: "Files to read before running (array of filenames), or false to disable",
60
- });
61
-
62
- const JsonSchemaObject = Type.Unsafe({
63
- type: "object",
64
- additionalProperties: true,
65
- description: "JSON Schema object for strict structured output. Non-object roots are rejected.",
66
- });
67
-
68
- const AcceptanceOverride = Type.Unsafe({
69
- anyOf: [
70
- { type: "string", enum: ["auto", "none", "attested", "checked", "verified", "reviewed"] },
71
- { type: "boolean", enum: [false] },
72
- { type: "object", additionalProperties: true },
73
- ],
74
- description: "Optional acceptance policy. Omitted means auto-inferred; verified requires configured runtime commands.",
75
- });
76
-
77
- const TurnBudgetOverride = Type.Object({
78
- maxTurns: Type.Integer({ minimum: 1 }),
79
- graceTurns: Type.Optional(Type.Integer({ minimum: 0 })),
80
- }, { additionalProperties: false, description: "Optional assistant-turn budget. At maxTurns the child is asked to wrap up; after graceTurns additional assistant turns it is aborted and partial output is returned." });
81
-
82
- const ToolBudgetBlock = Type.Unsafe({
83
- anyOf: [
84
- { type: "array", minItems: 1, items: { type: "string", minLength: 1 } },
85
- { type: "string", enum: ["*"] },
86
- ],
87
- });
88
-
89
- const ToolBudgetOverride = Type.Object({
90
- soft: Type.Optional(Type.Integer({ minimum: 1 })),
91
- hard: Type.Integer({ minimum: 1 }),
92
- block: Type.Optional(ToolBudgetBlock),
93
- }, { additionalProperties: false, description: "Optional child tool-call budget. soft nudges the child; after hard, block tools (default read/grep/find/ls, or '*' for all tools) are blocked so the child can finalize." });
94
-
95
- const TaskItem = Type.Object({
96
- agent: Type.String(),
97
- task: Type.String(),
98
- cwd: Type.Optional(Type.String()),
99
- count: Type.Optional(Type.Integer({ minimum: 1, description: "Repeat this parallel task N times with the same settings." })),
100
- output: Type.Optional(OutputOverride),
101
- outputMode: Type.Optional(OutputModeOverride),
102
- reads: Type.Optional(ReadsOverride),
103
- progress: Type.Optional(Type.Boolean({ description: "Enable progress.md tracking for this task" })),
104
- model: Type.Optional(Type.String({ description: "Override model for this task (e.g. 'google/gemini-3-pro')" })),
105
- skill: Type.Optional(SkillOverride),
106
- toolBudget: Type.Optional(ToolBudgetOverride),
107
- acceptance: Type.Optional(AcceptanceOverride),
108
- });
109
-
110
- // Parallel task item (within a parallel step)
111
- const ParallelTaskSchema = Type.Object({
112
- agent: Type.String(),
113
- task: Type.Optional(Type.String({ description: "Task template with {task}, {previous}, {chain_dir} variables. Defaults to {previous}." })),
114
- phase: Type.Optional(Type.String({ description: "Optional phase/group label for status and graph rendering." })),
115
- label: Type.Optional(Type.String({ description: "Optional user-facing label for this parallel task." })),
116
- as: Type.Optional(Type.String({ description: "Optional safe identifier used as {outputs.name} in later chain steps." })),
117
- outputSchema: Type.Optional(JsonSchemaObject),
118
- cwd: Type.Optional(Type.String()),
119
- count: Type.Optional(Type.Integer({ minimum: 1, description: "Repeat this parallel task N times with the same settings." })),
120
- output: Type.Optional(OutputOverride),
121
- outputMode: Type.Optional(OutputModeOverride),
122
- reads: Type.Optional(ReadsOverride),
123
- progress: Type.Optional(Type.Boolean({ description: "Enable progress.md tracking in {chain_dir}" })),
124
- skill: Type.Optional(SkillOverride),
125
- model: Type.Optional(Type.String({ description: "Override model for this task" })),
126
- toolBudget: Type.Optional(ToolBudgetOverride),
127
- acceptance: Type.Optional(AcceptanceOverride),
128
- });
129
-
130
- const DynamicExpandSchema = Type.Object({
131
- from: Type.Object({
132
- output: Type.String({ description: "Prior named structured output to expand from." }),
133
- path: Type.String({ description: "JSON Pointer into the structured output, e.g. /items." }),
134
- }, { additionalProperties: false }),
135
- item: Type.Optional(Type.String({ description: "Template variable name for each item. Defaults to item." })),
136
- key: Type.Optional(Type.String({ description: "JSON Pointer relative to each item for stable child ids." })),
137
- maxItems: Type.Optional(Type.Integer({ minimum: 0, description: "Required fanout bound unless configured globally." })),
138
- onEmpty: Type.Optional(Type.String({ enum: ["skip", "fail"], description: "Empty input behavior. Defaults to skip." })),
139
- }, { additionalProperties: false });
140
-
141
- const DynamicParallelTemplateSchema = Type.Object({
142
- agent: Type.String(),
143
- task: Type.Optional(Type.String({ description: "Task template with {item}, {item.path}, {task}, {previous}, {chain_dir}, and {outputs.name} variables." })),
144
- phase: Type.Optional(Type.String({ description: "Optional phase/group label for status and graph rendering." })),
145
- label: Type.Optional(Type.String({ description: "Optional user-facing label; item templates are supported." })),
146
- outputSchema: Type.Optional(JsonSchemaObject),
147
- cwd: Type.Optional(Type.String()),
148
- output: Type.Optional(OutputOverride),
149
- outputMode: Type.Optional(OutputModeOverride),
150
- reads: Type.Optional(ReadsOverride),
151
- progress: Type.Optional(Type.Boolean({ description: "Enable progress.md tracking in {chain_dir}" })),
152
- skill: Type.Optional(SkillOverride),
153
- model: Type.Optional(Type.String({ description: "Override model for this task" })),
154
- toolBudget: Type.Optional(ToolBudgetOverride),
155
- acceptance: Type.Optional(AcceptanceOverride),
156
- }, { additionalProperties: false });
157
-
158
- const DynamicCollectSchema = Type.Object({
159
- as: Type.String({ description: "Safe output name for the ordered collected result array." }),
160
- outputSchema: Type.Optional(JsonSchemaObject),
161
- }, { additionalProperties: false });
162
-
163
- // Flattened so chain steps do not need an object-shape anyOf/oneOf union.
164
- const ChainItem = Type.Object({
165
- agent: Type.Optional(Type.String({ description: "Sequential step agent name" })),
166
- task: Type.Optional(Type.String({
167
- description: "Task template with variables: {task}=original request, {previous}=prior step's text response, {chain_dir}=shared folder, {outputs.name}=prior named output. Required for first step, defaults to '{previous}' for subsequent steps."
168
- })),
169
- phase: Type.Optional(Type.String({ description: "Optional phase/group label for status and graph rendering." })),
170
- label: Type.Optional(Type.String({ description: "Optional user-facing label for this chain step." })),
171
- as: Type.Optional(Type.String({ description: "Optional safe identifier used as {outputs.name} in later chain steps." })),
172
- outputSchema: Type.Optional(JsonSchemaObject),
173
- cwd: Type.Optional(Type.String()),
174
- output: Type.Optional(OutputOverride),
175
- outputMode: Type.Optional(OutputModeOverride),
176
- reads: Type.Optional(ReadsOverride),
177
- progress: Type.Optional(Type.Boolean({ description: "Enable progress.md tracking in {chain_dir}" })),
178
- skill: Type.Optional(SkillOverride),
179
- model: Type.Optional(Type.String({ description: "Override model for this step" })),
180
- toolBudget: Type.Optional(ToolBudgetOverride),
181
- acceptance: Type.Optional(AcceptanceOverride),
182
- parallel: Type.Optional(Type.Unsafe({
183
- anyOf: [
184
- Type.Array(ParallelTaskSchema, { minItems: 1, description: "Tasks to run in parallel" }),
185
- DynamicParallelTemplateSchema,
186
- ],
187
- description: "Static parallel tasks array, or a single dynamic fanout child template when expand/collect are present.",
188
- })),
189
- expand: Type.Optional(DynamicExpandSchema),
190
- collect: Type.Optional(DynamicCollectSchema),
191
- concurrency: Type.Optional(Type.Number({ description: "Max concurrent tasks (default: 4)" })),
192
- failFast: Type.Optional(Type.Boolean({ description: "Stop on first failure (default: false)" })),
193
- worktree: Type.Optional(Type.Boolean({
194
- description: "Create isolated git worktrees for each parallel task."
195
- })),
196
- }, {
197
- description: "Chain step: use {agent, task?, ...} for sequential, {parallel: [...]} for static concurrent execution, or {expand, parallel: {...}, collect} for dynamic fanout.",
198
- additionalProperties: false,
199
- });
200
-
201
- const ControlOverrides = Type.Object({
202
- enabled: Type.Optional(Type.Boolean({ description: "Enable/disable subagent control attention tracking for this run" })),
203
- needsAttentionAfterMs: Type.Optional(Type.Integer({ minimum: 1, description: "No-observed-activity window before a run needs attention" })),
204
- activeNoticeAfterMs: Type.Optional(Type.Integer({ minimum: 1, description: "Active-long-running notice threshold by elapsed ms (default: 240000)" })),
205
- activeNoticeAfterTurns: Type.Optional(Type.Integer({ minimum: 1, description: "Optional active-long-running notice threshold by assistant turns (disabled by default)" })),
206
- activeNoticeAfterTokens: Type.Optional(Type.Integer({ minimum: 1, description: "Optional active-long-running notice threshold by total tokens (disabled by default)" })),
207
- failedToolAttemptsBeforeAttention: Type.Optional(Type.Integer({ minimum: 1, description: "Consecutive mutating-tool failures before escalating to needs_attention (default: 3)" })),
208
- notifyOn: Type.Optional(Type.Array(Type.String({ enum: ["active_long_running", "needs_attention"] }), {
209
- description: "Control event types that should notify the parent/orchestrator. Defaults to active_long_running and needs_attention.",
210
- })),
211
- notifyChannels: Type.Optional(Type.Array(Type.String({ enum: ["event", "async", "intercom"] }), {
212
- description: "Notification channels to use when available. Defaults to event, async, and intercom.",
213
- })),
214
- });
215
-
216
- const SubagentParamsSchema = Type.Object({
217
- agent: Type.Optional(Type.String({ description: "Agent name (SINGLE mode) or target for management get/update/delete" })),
218
- task: Type.Optional(Type.String({ description: "Task (SINGLE mode, optional for self-contained agents)" })),
219
- // Management action (when present, tool operates in management mode)
220
- action: Type.Optional(Type.String({
221
- description: "Management/control action only. Must be omitted for execution mode (single, parallel, or chain)."
222
- })),
223
- id: Type.Optional(Type.String({
224
- description: "Run id or prefix for action='status', action='interrupt', action='resume', action='steer', or action='append-step'."
225
- })),
226
- runId: Type.Optional(Type.String({
227
- description: "Target run ID for action='interrupt', action='resume', action='steer', or action='append-step'. Defaults to the most recently active controllable run for interrupt. Prefer id for new calls."
228
- })),
229
- dir: Type.Optional(Type.String({
230
- description: "Async run directory for action='status', action='resume', or action='steer'."
231
- })),
232
- index: Type.Optional(Type.Integer({ minimum: 0, description: "Zero-based child index for actions that target a specific child or transcript." })),
233
- view: Type.Optional(Type.String({
234
- enum: ["fleet", "transcript"],
235
- description: "Optional status view. Use view='fleet' for a read-only active foreground/async fleet surface, or view='transcript' with id/dir (and optional index) to tail a run transcript.",
236
- })),
237
- lines: Type.Optional(Type.Integer({ minimum: 1, maximum: 500, description: "Maximum transcript lines for action='status', view='transcript'. Defaults to 80." })),
238
- message: Type.Optional(Type.String({ description: "Follow-up message for action='resume' or non-terminal guidance for action='steer'. Use index to choose a child from multi-child runs." })),
239
- schedule: Type.Optional(Type.String({ description: "Explicit one-shot schedule for action='schedule'. Only honored when scheduledRuns.enabled is true. Use '+10m' or a future ISO timestamp with timezone; scheduled runs always launch async with fresh context." })),
240
- scheduleName: Type.Optional(Type.String({ description: "Optional display name for action='schedule'." })),
241
- // Chain identifier for management (can't reuse 'chain' — that's the execution array)
242
- chainName: Type.Optional(Type.String({
243
- description: "Chain name for get/update/delete management actions"
244
- })),
245
- // Agent/chain configuration for create/update (nested to avoid conflicts with execution fields)
246
- config: Type.Optional(Type.Unsafe({
247
- anyOf: [
248
- { type: "object", additionalProperties: true },
249
- { type: "string" },
250
- ],
251
- description: "Agent/chain config for create/update. Object or JSON string; presence of steps creates a chain."
252
- })),
253
- tasks: Type.Optional(Type.Array(TaskItem, { description: "PARALLEL mode: [{agent, task, count?, output?, outputMode?, reads?, progress?}, ...]" })),
254
- concurrency: Type.Optional(Type.Integer({ minimum: 1, description: "Top-level PARALLEL mode only: max concurrent tasks. Defaults to config.parallel.concurrency or 4." })),
255
- worktree: Type.Optional(Type.Boolean({
256
- description: "Create isolated git worktrees for parallel tasks; requires clean git state."
257
- })),
258
- chain: Type.Optional(Type.Array(ChainItem, { description: "CHAIN mode: sequential steps; each result becomes {previous}. append-step takes one tail step and may use {chain_dir}/{outputs.name}." })),
259
- context: Type.Optional(Type.String({
260
- enum: ["fresh", "fork"],
261
- description: "'fresh' or 'fork' to branch from parent session. Explicit context overrides every child in the invocation. If omitted, each requested agent uses its own defaultContext; agents without defaultContext: 'fork' run fresh.",
262
- })),
263
- chainDir: Type.Optional(Type.String({ description: "Persistent chain artifact directory; defaults to user-scoped temp storage." })),
264
- async: Type.Optional(Type.Boolean({ description: "Run in background (default: false, or per config)" })),
265
- timeoutMs: Type.Optional(Type.Integer({ minimum: 1, description: "Optional run-level timeout in ms for foreground and async/background runs. Alias of maxRuntimeMs." })),
266
- maxRuntimeMs: Type.Optional(Type.Integer({ minimum: 1, description: "Alias of timeoutMs for optional run-level timeout in foreground and async/background runs." })),
267
- turnBudget: Type.Optional(TurnBudgetOverride),
268
- toolBudget: Type.Optional(ToolBudgetOverride),
269
- agentScope: Type.Optional(Type.String({ description: "Agent discovery scope: 'user', 'project', or 'both' (default: 'both'; project wins on name collisions)" })),
270
- cwd: Type.Optional(Type.String()),
271
- artifacts: Type.Optional(Type.Boolean({ description: "Write debug artifacts (default: true)" })),
272
- includeProgress: Type.Optional(Type.Boolean({ description: "Include full progress in result (default: false)" })),
273
- share: Type.Optional(Type.Boolean({ description: "Upload session to GitHub Gist for sharing (default: false)" })),
274
- sessionDir: Type.Optional(
275
- Type.String({ description: "Directory to store session logs (default: temp; enables sessions even if share=false)" }),
276
- ),
277
- // Clarification TUI
278
- clarify: Type.Optional(Type.Boolean({ description: "Show TUI to preview/edit before execution. Explicit clarify: true keeps the run foreground for the clarify UI; omitted clarify can still run in the background when async: true is set." })),
279
- control: Type.Optional(ControlOverrides),
280
- // Solo agent overrides
281
- output: Type.Optional(Type.Unsafe({
282
- anyOf: [
283
- { type: "string" },
284
- { type: "boolean" },
285
- ],
286
- description: "Output file for single agent (string), or false to disable. Relative paths resolve against cwd.",
287
- })),
288
- outputMode: Type.Optional(OutputModeOverride),
289
- skill: Type.Optional(SkillOverride),
290
- model: Type.Optional(Type.String({ description: "Override model for single agent (e.g. 'anthropic/claude-sonnet-4')" })),
291
- acceptance: Type.Optional(AcceptanceOverride),
292
- });
293
-
294
- export const SubagentParams = keepTopLevelParameterDescriptions(SubagentParamsSchema);
295
-
296
- const WaitParamsSchema = Type.Object({
297
- id: Type.Optional(Type.String({
298
- description: "Run id or prefix to wait for one specific run. Omit to wait across every active async run started in this session.",
299
- })),
300
- all: Type.Optional(Type.Boolean({
301
- description: "Wait for ALL active runs to finish. Default false: return as soon as the first run finishes, so a fleet manager can spawn a replacement and wait again. Ignored when id targets a single run.",
302
- })),
303
- timeoutMs: Type.Optional(Type.Integer({
304
- minimum: 1,
305
- description: "Give up waiting after this many milliseconds (the runs keep going regardless). Defaults to 1800000 (30 minutes).",
306
- })),
307
- });
308
-
309
- export const WaitParams = keepTopLevelParameterDescriptions(WaitParamsSchema);