subharness 0.0.4 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/README.md +95 -9
  2. package/dist/adapters/claude-process.d.ts +3 -0
  3. package/dist/adapters/claude-process.js +19 -2
  4. package/dist/adapters/claude-process.js.map +1 -1
  5. package/dist/adapters/claude-result.d.ts +2 -0
  6. package/dist/adapters/claude-result.js +22 -0
  7. package/dist/adapters/claude-result.js.map +1 -0
  8. package/dist/adapters/claude-tools.d.ts +6 -2
  9. package/dist/adapters/claude-tools.js +14 -12
  10. package/dist/adapters/claude-tools.js.map +1 -1
  11. package/dist/adapters/claude-worker-client.d.ts +49 -0
  12. package/dist/adapters/claude-worker-client.js +359 -0
  13. package/dist/adapters/claude-worker-client.js.map +1 -0
  14. package/dist/adapters/claude-worker-process.d.ts +20 -0
  15. package/dist/adapters/claude-worker-process.js +76 -0
  16. package/dist/adapters/claude-worker-process.js.map +1 -0
  17. package/dist/adapters/claude-worker-protocol.d.ts +38 -0
  18. package/dist/adapters/claude-worker-protocol.js +2 -0
  19. package/dist/adapters/claude-worker-protocol.js.map +1 -0
  20. package/dist/adapters/claude-worker.d.ts +1 -0
  21. package/dist/adapters/claude-worker.js +126 -0
  22. package/dist/adapters/claude-worker.js.map +1 -0
  23. package/dist/adapters/claude.d.ts +16 -6
  24. package/dist/adapters/claude.js +164 -75
  25. package/dist/adapters/claude.js.map +1 -1
  26. package/dist/adapters/codex.js +4 -1
  27. package/dist/adapters/codex.js.map +1 -1
  28. package/dist/adapters/copilot-permissions.d.ts +26 -0
  29. package/dist/adapters/copilot-permissions.js +121 -0
  30. package/dist/adapters/copilot-permissions.js.map +1 -0
  31. package/dist/adapters/copilot-tools.d.ts +12 -0
  32. package/dist/adapters/copilot-tools.js +61 -0
  33. package/dist/adapters/copilot-tools.js.map +1 -0
  34. package/dist/adapters/copilot.d.ts +108 -0
  35. package/dist/adapters/copilot.js +819 -0
  36. package/dist/adapters/copilot.js.map +1 -0
  37. package/dist/adapters/cursor-cli-approvals.d.ts +2 -0
  38. package/dist/adapters/cursor-cli-approvals.js +83 -0
  39. package/dist/adapters/cursor-cli-approvals.js.map +1 -0
  40. package/dist/adapters/cursor-cli-model.d.ts +4 -0
  41. package/dist/adapters/cursor-cli-model.js +64 -0
  42. package/dist/adapters/cursor-cli-model.js.map +1 -0
  43. package/dist/adapters/cursor-cli-session.d.ts +32 -0
  44. package/dist/adapters/cursor-cli-session.js +316 -0
  45. package/dist/adapters/cursor-cli-session.js.map +1 -0
  46. package/dist/adapters/cursor-cli-tools.d.ts +20 -0
  47. package/dist/adapters/cursor-cli-tools.js +181 -0
  48. package/dist/adapters/cursor-cli-tools.js.map +1 -0
  49. package/dist/adapters/cursor-cli.d.ts +2 -0
  50. package/dist/adapters/cursor-cli.js +306 -0
  51. package/dist/adapters/cursor-cli.js.map +1 -0
  52. package/dist/adapters/cursor-model.d.ts +7 -0
  53. package/dist/adapters/cursor-model.js +67 -0
  54. package/dist/adapters/cursor-model.js.map +1 -0
  55. package/dist/adapters/cursor-rpc.d.ts +42 -0
  56. package/dist/adapters/cursor-rpc.js +271 -0
  57. package/dist/adapters/cursor-rpc.js.map +1 -0
  58. package/dist/adapters/cursor-session.d.ts +4 -0
  59. package/dist/adapters/cursor-session.js +327 -0
  60. package/dist/adapters/cursor-session.js.map +1 -0
  61. package/dist/adapters/cursor-startup.d.ts +16 -0
  62. package/dist/adapters/cursor-startup.js +74 -0
  63. package/dist/adapters/cursor-startup.js.map +1 -0
  64. package/dist/adapters/cursor-tools.d.ts +11 -0
  65. package/dist/adapters/cursor-tools.js +49 -0
  66. package/dist/adapters/cursor-tools.js.map +1 -0
  67. package/dist/adapters/cursor.d.ts +6 -0
  68. package/dist/adapters/cursor.js +17 -0
  69. package/dist/adapters/cursor.js.map +1 -0
  70. package/dist/adapters/fx-auth.d.ts +12 -2
  71. package/dist/adapters/fx-auth.js +51 -61
  72. package/dist/adapters/fx-auth.js.map +1 -1
  73. package/dist/adapters/fx-profile.d.ts +8 -0
  74. package/dist/adapters/fx-profile.js +101 -0
  75. package/dist/adapters/fx-profile.js.map +1 -0
  76. package/dist/adapters/fx-rpc.d.ts +2 -0
  77. package/dist/adapters/fx-rpc.js +30 -4
  78. package/dist/adapters/fx-rpc.js.map +1 -1
  79. package/dist/adapters/fx-status.d.ts +2 -0
  80. package/dist/adapters/fx-status.js +96 -0
  81. package/dist/adapters/fx-status.js.map +1 -0
  82. package/dist/adapters/fx.js +28 -12
  83. package/dist/adapters/fx.js.map +1 -1
  84. package/dist/adapters/opencode-access.d.ts +13 -0
  85. package/dist/adapters/opencode-access.js +76 -0
  86. package/dist/adapters/opencode-access.js.map +1 -0
  87. package/dist/adapters/opencode-config.d.ts +11 -0
  88. package/dist/adapters/opencode-config.js +238 -0
  89. package/dist/adapters/opencode-config.js.map +1 -0
  90. package/dist/adapters/opencode-http.d.ts +28 -0
  91. package/dist/adapters/opencode-http.js +297 -0
  92. package/dist/adapters/opencode-http.js.map +1 -0
  93. package/dist/adapters/opencode-tools.d.ts +19 -0
  94. package/dist/adapters/opencode-tools.js +127 -0
  95. package/dist/adapters/opencode-tools.js.map +1 -0
  96. package/dist/adapters/opencode.d.ts +2 -0
  97. package/dist/adapters/opencode.js +569 -0
  98. package/dist/adapters/opencode.js.map +1 -0
  99. package/dist/adapters/rpc.d.ts +3 -0
  100. package/dist/adapters/rpc.js +45 -4
  101. package/dist/adapters/rpc.js.map +1 -1
  102. package/dist/adapters/types.d.ts +5 -0
  103. package/dist/adapters/types.js.map +1 -1
  104. package/dist/approvals/types.d.ts +1 -1
  105. package/dist/approvals/types.js.map +1 -1
  106. package/dist/cli/args.d.ts +1 -1
  107. package/dist/cli/args.js +4 -1
  108. package/dist/cli/args.js.map +1 -1
  109. package/dist/cli/catalog-worker.js.map +1 -1
  110. package/dist/cli/dashboard-client.js +20 -31
  111. package/dist/cli/dashboard-client.js.map +1 -1
  112. package/dist/cli/dashboard-controller.d.ts +7 -0
  113. package/dist/cli/dashboard-controller.js +27 -0
  114. package/dist/cli/dashboard-controller.js.map +1 -0
  115. package/dist/cli/dashboard-detail-view.d.ts +1 -1
  116. package/dist/cli/dashboard-detail-view.js +3 -4
  117. package/dist/cli/dashboard-detail-view.js.map +1 -1
  118. package/dist/cli/dashboard-history-view.js.map +1 -1
  119. package/dist/cli/dashboard-input.d.ts +1 -1
  120. package/dist/cli/dashboard-input.js +11 -1
  121. package/dist/cli/dashboard-input.js.map +1 -1
  122. package/dist/cli/dashboard-layout.js +3 -3
  123. package/dist/cli/dashboard-layout.js.map +1 -1
  124. package/dist/cli/dashboard-renderer.js.map +1 -1
  125. package/dist/cli/dashboard-style.js +2 -2
  126. package/dist/cli/dashboard-style.js.map +1 -1
  127. package/dist/cli/dashboard.d.ts +2 -2
  128. package/dist/cli/dashboard.js +7 -32
  129. package/dist/cli/dashboard.js.map +1 -1
  130. package/dist/cli/help.d.ts +1 -1
  131. package/dist/cli/help.js +30 -12
  132. package/dist/cli/help.js.map +1 -1
  133. package/dist/cli/main.js +55 -43
  134. package/dist/cli/main.js.map +1 -1
  135. package/dist/config/access-provenance.d.ts +10 -0
  136. package/dist/config/access-provenance.js +31 -0
  137. package/dist/config/access-provenance.js.map +1 -0
  138. package/dist/config/access.d.ts +12 -2
  139. package/dist/config/access.js +125 -27
  140. package/dist/config/access.js.map +1 -1
  141. package/dist/config/loader.js +1 -0
  142. package/dist/config/loader.js.map +1 -1
  143. package/dist/config/oidc.js +4 -2
  144. package/dist/config/oidc.js.map +1 -1
  145. package/dist/config/project.js +2 -1
  146. package/dist/config/project.js.map +1 -1
  147. package/dist/config/resolve-access.js +24 -10
  148. package/dist/config/resolve-access.js.map +1 -1
  149. package/dist/errors.d.ts +2 -2
  150. package/dist/errors.js.map +1 -1
  151. package/dist/index.d.ts +8 -2
  152. package/dist/index.js +4 -1
  153. package/dist/index.js.map +1 -1
  154. package/dist/process-diagnostics.d.ts +2 -0
  155. package/dist/process-diagnostics.js +11 -0
  156. package/dist/process-diagnostics.js.map +1 -0
  157. package/dist/runtime/access-errors.d.ts +4 -0
  158. package/dist/runtime/access-errors.js +25 -0
  159. package/dist/runtime/access-errors.js.map +1 -0
  160. package/dist/runtime/approval-registry.d.ts +9 -0
  161. package/dist/runtime/approval-registry.js +144 -5
  162. package/dist/runtime/approval-registry.js.map +1 -1
  163. package/dist/runtime/capture.d.ts +22 -0
  164. package/dist/runtime/capture.js +320 -0
  165. package/dist/runtime/capture.js.map +1 -0
  166. package/dist/runtime/catalog.d.ts +39 -0
  167. package/dist/runtime/catalog.js +84 -0
  168. package/dist/runtime/catalog.js.map +1 -0
  169. package/dist/runtime/client.d.ts +2 -1
  170. package/dist/runtime/client.js +74 -47
  171. package/dist/runtime/client.js.map +1 -1
  172. package/dist/runtime/coordinator.d.ts +44 -7
  173. package/dist/runtime/coordinator.js +265 -31
  174. package/dist/runtime/coordinator.js.map +1 -1
  175. package/dist/runtime/daemon.js +12 -6
  176. package/dist/runtime/daemon.js.map +1 -1
  177. package/dist/runtime/dashboard-sanitize.d.ts +2 -0
  178. package/dist/runtime/dashboard-sanitize.js +7 -0
  179. package/dist/runtime/dashboard-sanitize.js.map +1 -0
  180. package/dist/runtime/dashboard-workspace.js +5 -1
  181. package/dist/runtime/dashboard-workspace.js.map +1 -1
  182. package/dist/runtime/dashboard.d.ts +1 -1
  183. package/dist/runtime/dashboard.js +2 -3
  184. package/dist/runtime/dashboard.js.map +1 -1
  185. package/dist/runtime/definition.d.ts +6 -1
  186. package/dist/runtime/definition.js +42 -2
  187. package/dist/runtime/definition.js.map +1 -1
  188. package/dist/runtime/native-owner.js +7 -1
  189. package/dist/runtime/native-owner.js.map +1 -1
  190. package/dist/runtime/pagination.d.ts +9 -0
  191. package/dist/runtime/pagination.js +36 -0
  192. package/dist/runtime/pagination.js.map +1 -0
  193. package/dist/runtime/sdk-observation.d.ts +8 -0
  194. package/dist/runtime/sdk-observation.js +75 -0
  195. package/dist/runtime/sdk-observation.js.map +1 -0
  196. package/dist/runtime/sdk-projection.d.ts +8 -0
  197. package/dist/runtime/sdk-projection.js +19 -0
  198. package/dist/runtime/sdk-projection.js.map +1 -0
  199. package/dist/runtime/sdk-service.d.ts +11 -0
  200. package/dist/runtime/sdk-service.js +109 -0
  201. package/dist/runtime/sdk-service.js.map +1 -0
  202. package/dist/runtime/select-native.d.ts +4 -1
  203. package/dist/runtime/select-native.js +28 -13
  204. package/dist/runtime/select-native.js.map +1 -1
  205. package/dist/runtime/service.d.ts +11 -1
  206. package/dist/runtime/service.js +178 -3
  207. package/dist/runtime/service.js.map +1 -1
  208. package/dist/runtime/session-launcher.js +1 -1
  209. package/dist/runtime/session-launcher.js.map +1 -1
  210. package/dist/runtime/snapshots.d.ts +103 -0
  211. package/dist/runtime/snapshots.js +124 -0
  212. package/dist/runtime/snapshots.js.map +1 -0
  213. package/dist/runtime/state.d.ts +26 -0
  214. package/dist/runtime/state.js +86 -17
  215. package/dist/runtime/state.js.map +1 -1
  216. package/dist/runtime/task-data.d.ts +38 -0
  217. package/dist/runtime/task-data.js +2 -0
  218. package/dist/runtime/task-data.js.map +1 -0
  219. package/dist/runtime/transport.d.ts +13 -0
  220. package/dist/runtime/transport.js +166 -0
  221. package/dist/runtime/transport.js.map +1 -0
  222. package/dist/runtime/types.d.ts +28 -9
  223. package/dist/runtime/types.js.map +1 -1
  224. package/dist/runtime/worker-client.js +40 -13
  225. package/dist/runtime/worker-client.js.map +1 -1
  226. package/dist/runtime/worker-server.js +105 -24
  227. package/dist/runtime/worker-server.js.map +1 -1
  228. package/dist/sdk/connected-types.d.ts +42 -0
  229. package/dist/sdk/connected-types.js +2 -0
  230. package/dist/sdk/connected-types.js.map +1 -0
  231. package/dist/sdk/connected.d.ts +3 -0
  232. package/dist/sdk/connected.js +232 -0
  233. package/dist/sdk/connected.js.map +1 -0
  234. package/dist/sdk/definitions.d.ts +4 -1
  235. package/dist/sdk/definitions.js +16 -2
  236. package/dist/sdk/definitions.js.map +1 -1
  237. package/dist/sdk/execution-definition.d.ts +3 -0
  238. package/dist/sdk/execution-definition.js +59 -0
  239. package/dist/sdk/execution-definition.js.map +1 -0
  240. package/dist/sdk/execution-driver.d.ts +6 -0
  241. package/dist/sdk/execution-driver.js +86 -0
  242. package/dist/sdk/execution-driver.js.map +1 -0
  243. package/dist/sdk/execution-observation.d.ts +3 -0
  244. package/dist/sdk/execution-observation.js +35 -0
  245. package/dist/sdk/execution-observation.js.map +1 -0
  246. package/dist/sdk/execution-options.d.ts +17 -0
  247. package/dist/sdk/execution-options.js +115 -0
  248. package/dist/sdk/execution-options.js.map +1 -0
  249. package/dist/sdk/execution-types.d.ts +72 -0
  250. package/dist/sdk/execution-types.js +2 -0
  251. package/dist/sdk/execution-types.js.map +1 -0
  252. package/dist/sdk/execution.d.ts +3 -0
  253. package/dist/sdk/execution.js +3 -0
  254. package/dist/sdk/execution.js.map +1 -0
  255. package/dist/sdk/hosted-error.d.ts +3 -0
  256. package/dist/sdk/hosted-error.js +14 -0
  257. package/dist/sdk/hosted-error.js.map +1 -0
  258. package/dist/sdk/hosted.d.ts +23 -0
  259. package/dist/sdk/hosted.js +204 -0
  260. package/dist/sdk/hosted.js.map +1 -0
  261. package/dist/sdk/permission-validation.js +10 -1
  262. package/dist/sdk/permission-validation.js.map +1 -1
  263. package/dist/sdk/runner.d.ts +5 -0
  264. package/dist/sdk/runner.js +107 -0
  265. package/dist/sdk/runner.js.map +1 -0
  266. package/dist/sdk/tools.js +4 -1
  267. package/dist/sdk/tools.js.map +1 -1
  268. package/dist/sdk/types.d.ts +29 -1
  269. package/dist/sdk/types.js.map +1 -1
  270. package/package.json +6 -3
  271. package/sdk/access-config.md +60 -4
  272. package/sdk/adapter-contract.md +13 -3
  273. package/sdk/additional-harnesses.md +43 -0
  274. package/sdk/agent-skill.md +2 -2
  275. package/sdk/agent.md +6 -4
  276. package/sdk/approvals.md +5 -1
  277. package/sdk/authentication.md +1 -1
  278. package/sdk/cli/dashboard-design.md +6 -0
  279. package/sdk/cli/index.md +9 -6
  280. package/sdk/cli/output.md +3 -1
  281. package/sdk/completion-notifications.md +2 -0
  282. package/sdk/config.md +1 -1
  283. package/sdk/copilot.md +53 -0
  284. package/sdk/cursor.md +68 -0
  285. package/sdk/diagnostics.md +29 -0
  286. package/sdk/distribution.md +5 -3
  287. package/sdk/evals.md +1 -1
  288. package/sdk/examples/chat-tool.ts +126 -0
  289. package/sdk/execution.md +743 -0
  290. package/sdk/fx.md +50 -5
  291. package/sdk/harnesses.md +13 -13
  292. package/sdk/index.md +45 -20
  293. package/sdk/message-delivery.md +2 -0
  294. package/sdk/opencode.md +57 -0
  295. package/sdk/permissions.md +6 -2
  296. package/sdk/plugins/sub-agents.md +4 -2
  297. package/sdk/project-team.md +25 -1
  298. package/sdk/sessions.md +2 -0
  299. package/sdk/tools.md +4 -2
  300. package/sdk/v1-runtime.md +8 -6
  301. package/dist/cli/catalog.d.ts +0 -26
  302. package/dist/cli/catalog.js +0 -41
  303. package/dist/cli/catalog.js.map +0 -1
@@ -3,8 +3,18 @@ import { fileURLToPath } from 'node:url';
3
3
  import { delimiter } from 'node:path';
4
4
  import { AgentError, errorInfo } from '../errors.js';
5
5
  import { createSessionLauncher } from './session-launcher.js';
6
+ import { processExitDescription } from '../process-diagnostics.js';
6
7
  const closeResponseTimeoutMs = 15_000;
7
8
  const shutdownTimeoutMs = 1_000;
9
+ const workerOperationLabels = {
10
+ open: 'startup',
11
+ turn: 'turn submission',
12
+ steer: 'steering',
13
+ interrupt: 'interruption',
14
+ resume: 'recovery',
15
+ close: 'closing',
16
+ 'approval.respond': 'approval response',
17
+ };
8
18
  function waitWithin(promise, timeout) {
9
19
  return new Promise(resolve => {
10
20
  const timer = setTimeout(() => resolve(false), timeout);
@@ -18,6 +28,8 @@ function withTimeout(promise, timeout) {
18
28
  });
19
29
  }
20
30
  export async function createWorker(input, options = {}) {
31
+ if ('kind' in input.reference && input.reference.kind === 'inline')
32
+ throw new AgentError('INVALID_DEFINITION', 'Inline agent definitions cannot be loaded by native CLI workers.');
21
33
  const launcher = await createSessionLauncher(input.env.AGENT_STATE_DIR, input.token);
22
34
  const workerModule = options.workerModule ?? new URL(`./worker.${import.meta.url.endsWith('.ts') ? 'ts' : 'js'}`, import.meta.url);
23
35
  const extension = workerModule.pathname.endsWith('.ts') ? 'ts' : 'js';
@@ -30,9 +42,9 @@ export async function createWorker(input, options = {}) {
30
42
  stdio: ['ignore', 'ignore', 'ignore', 'ipc'],
31
43
  });
32
44
  }
33
- catch (error) {
45
+ catch {
34
46
  await launcher.close();
35
- throw error;
47
+ throw new AgentError('HARNESS_FAILED', 'The session worker could not be spawned during startup.');
36
48
  }
37
49
  let nextId = 1;
38
50
  const pending = new Map();
@@ -40,22 +52,28 @@ export async function createWorker(input, options = {}) {
40
52
  const withdrawApprovals = () => { for (const controller of approvals.values())
41
53
  controller.abort(); approvals.clear(); };
42
54
  let exited = false;
55
+ let closing = false;
56
+ let observedExit = '';
43
57
  let markExited;
44
58
  const processExit = new Promise(resolve => { markExited = resolve; });
45
- const exit = () => {
59
+ const exit = (code, signal, spawnFailure = false) => {
46
60
  if (exited)
47
61
  return;
48
62
  exited = true;
63
+ observedExit = spawnFailure || closing ? '' : processExitDescription(code, signal);
49
64
  withdrawApprovals();
50
65
  markExited();
51
66
  void launcher.close().catch(() => { }).finally(() => {
52
- for (const waiting of pending.values())
53
- waiting.reject(new AgentError('HARNESS_FAILED', 'The session worker exited.'));
67
+ for (const waiting of pending.values()) {
68
+ waiting.reject(new AgentError('HARNESS_FAILED', spawnFailure
69
+ ? `The session worker process failed while ${waiting.operation} was pending.`
70
+ : `The session worker exited while ${waiting.operation} was pending${observedExit}.`));
71
+ }
54
72
  pending.clear();
55
73
  });
56
74
  };
57
- child.once('error', exit);
58
- child.once('exit', exit);
75
+ child.once('error', () => exit(undefined, undefined, true));
76
+ child.once('exit', (code, signal) => exit(code, signal));
59
77
  child.on('message', (message) => {
60
78
  if ('event' in message) {
61
79
  if (message.event === 'approval.withdraw') {
@@ -89,16 +107,24 @@ export async function createWorker(input, options = {}) {
89
107
  waiting.resolve(message.result);
90
108
  });
91
109
  const request = (method, extra = {}) => new Promise((resolve, reject) => {
110
+ const operation = workerOperationLabels[method] ?? 'native operation';
92
111
  if (exited) {
93
- reject(new AgentError('HARNESS_FAILED', 'The session worker is unavailable.'));
112
+ reject(new AgentError('HARNESS_FAILED', `The session worker is unavailable while ${operation} was pending${observedExit}.`));
94
113
  return;
95
114
  }
96
115
  const id = nextId++;
97
- pending.set(id, { resolve, reject });
98
- child.send({ id, method, ...extra }, error => { if (error) {
99
- pending.delete(id);
100
- reject(new AgentError('HARNESS_FAILED', 'Cannot reach the session worker.'));
101
- } });
116
+ pending.set(id, { operation, resolve, reject });
117
+ child.send({ id, method, ...extra }, error => {
118
+ if (!error)
119
+ return;
120
+ setImmediate(() => {
121
+ const waiting = pending.get(id);
122
+ if (!waiting || exited)
123
+ return;
124
+ pending.delete(id);
125
+ waiting.reject(new AgentError('HARNESS_FAILED', `Cannot reach the session worker while ${operation} was pending.`));
126
+ });
127
+ });
102
128
  });
103
129
  let selectedHarness;
104
130
  const { onApproval, ...serializedInput } = input;
@@ -136,6 +162,7 @@ export async function createWorker(input, options = {}) {
136
162
  interrupt: async () => { withdrawApprovals(); await request('interrupt'); },
137
163
  resume: () => request('resume'),
138
164
  close: async () => {
165
+ closing = true;
139
166
  withdrawApprovals();
140
167
  let failure;
141
168
  if (!exited) {
@@ -1 +1 @@
1
- {"version":3,"file":"worker-client.js","sourceRoot":"","sources":["../../src/runtime/worker-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { fork, type ChildProcess } from 'node:child_process';\nimport { fileURLToPath } from 'node:url';\nimport { delimiter } from 'node:path';\nimport { AgentError, errorInfo, type ErrorInfo } from '../errors.js';\nimport type { DriverInput } from './types.js';\nimport type { ManagedNativeSession } from './types.js';\nimport type { HarnessKind } from '../sdk/types.js';\nimport { createSessionLauncher } from './session-launcher.js';\nimport type { ApprovalEvent } from './worker-approvals.js';\n\ninterface WorkerClientOptions {\n workerModule?: URL;\n shutdownTimeoutMs?: number;\n}\n\nconst closeResponseTimeoutMs = 15_000;\nconst shutdownTimeoutMs = 1_000;\n\nfunction waitWithin(promise: Promise<unknown>, timeout: number): Promise<boolean> {\n return new Promise(resolve => {\n const timer = setTimeout(() => resolve(false),timeout);\n promise.then(\n () => { clearTimeout(timer); resolve(true); },\n () => { clearTimeout(timer); resolve(true); },\n );\n });\n}\n\nfunction withTimeout<T>(promise: Promise<T>, timeout: number): Promise<T> {\n return new Promise((resolve,reject) => {\n const timer = setTimeout(() => reject(new AgentError('HARNESS_FAILED','The session worker did not complete cleanup.')),timeout);\n promise.then(\n value => { clearTimeout(timer); resolve(value); },\n error => { clearTimeout(timer); reject(error); },\n );\n });\n}\n\nexport async function createWorker(input: DriverInput, options: WorkerClientOptions = {}): Promise<ManagedNativeSession> {\n const launcher = await createSessionLauncher(input.env.AGENT_STATE_DIR!,input.token);\n const workerModule = options.workerModule ?? new URL(`./worker.${import.meta.url.endsWith('.ts') ? 'ts' : 'js'}`, import.meta.url);\n const extension = workerModule.pathname.endsWith('.ts') ? 'ts' : 'js';\n let child: ChildProcess;\n try {\n child = fork(fileURLToPath(workerModule), [], {\n cwd: input.cwd, env: {...input.env,AGENT_PARENT_TOKEN:input.token,AGENT_CLI_PATH:launcher.path,\n PATH:launcher.directory + delimiter + (input.env.PATH ?? '')},\n execArgv: extension === 'ts' ? ['--import', import.meta.resolve('tsx')] : [],\n stdio: ['ignore','ignore','ignore','ipc'],\n });\n } catch (error) { await launcher.close(); throw error; }\n let nextId = 1;\n const pending = new Map<number, {resolve(value:unknown):void;reject(error:Error):void}>();\n const approvals = new Map<number,AbortController>();\n const withdrawApprovals = () => { for (const controller of approvals.values()) controller.abort(); approvals.clear(); };\n let exited = false;\n let markExited!: () => void;\n const processExit = new Promise<void>(resolve => { markExited = resolve; });\n const exit = () => {\n if (exited) return;\n exited = true;\n withdrawApprovals();\n markExited();\n void launcher.close().catch(() => {}).finally(() => {\n for (const waiting of pending.values()) waiting.reject(new AgentError('HARNESS_FAILED','The session worker exited.'));\n pending.clear();\n });\n };\n child.once('error', exit); child.once('exit', exit);\n child.on('message', (message: ApprovalEvent | {id:number;result?:unknown;error?:ErrorInfo}) => {\n if ('event' in message) {\n if (message.event === 'approval.withdraw') {\n approvals.get(message.requestId)?.abort(); approvals.delete(message.requestId);\n } else if (message.event === 'approval.request') {\n const controller = new AbortController();\n approvals.set(message.requestId,controller);\n void Promise.resolve().then(() => {\n if (!input.onApproval) throw new AgentError('INPUT_REQUIRED','Native tool approval requires an observing caller.');\n return input.onApproval(message.request,controller.signal);\n }).then(\n content => { if (!controller.signal.aborted && !exited) return request('approval.respond',{requestId:message.requestId,content}); },\n error => { if (!controller.signal.aborted && !exited) return request('approval.respond',{requestId:message.requestId,error:errorInfo(error)}); },\n ).catch(error => {\n // A rejected control cannot leave an already-settled caller callback parked forever.\n if (!controller.signal.aborted && !exited)\n return request('approval.respond',{requestId:message.requestId,error:errorInfo(error)}).catch(() => {});\n }).finally(() => { approvals.delete(message.requestId); });\n }\n return;\n }\n const waiting = pending.get(message.id);\n if (!waiting) return;\n pending.delete(message.id);\n if (message.error) waiting.reject(new AgentError(message.error.code, message.error.message));\n else waiting.resolve(message.result);\n });\n const request = (method:string, extra:Record<string,unknown> = {}) => new Promise<unknown>((resolve,reject) => {\n if (exited) { reject(new AgentError('HARNESS_FAILED','The session worker is unavailable.')); return; }\n const id = nextId++;\n pending.set(id,{resolve,reject});\n child.send({id,method,...extra}, error => { if (error) { pending.delete(id); reject(new AgentError('HARNESS_FAILED','Cannot reach the session worker.')); } });\n });\n let selectedHarness: HarnessKind;\n const {onApproval,...serializedInput} = input;\n try { selectedHarness = await request('open',{input:serializedInput,handlesApprovals:!!onApproval}) as HarnessKind; } catch (error) { child.kill(); await launcher.close(); throw error; }\n const stopWorker = async () => {\n if (exited) return;\n if (child.connected) try { child.disconnect(); } catch { /* Continue to termination escalation. */ }\n const timeout = options.shutdownTimeoutMs ?? shutdownTimeoutMs;\n if (await waitWithin(processExit,timeout)) return;\n child.kill('SIGTERM');\n if (await waitWithin(processExit,timeout)) return;\n child.kill('SIGKILL');\n if (await waitWithin(processExit,timeout)) return;\n throw new AgentError('HARNESS_FAILED','The session worker did not confirm termination.');\n };\n return {\n selectedHarness,\n turn: prompt => request('turn',{prompt}) as Promise<string>,\n steer: async prompt => { await request('steer',{prompt}); },\n interrupt: async () => { withdrawApprovals(); await request('interrupt'); },\n resume: () => request('resume') as Promise<string>,\n close: async () => {\n withdrawApprovals();\n let failure: unknown;\n if (!exited) {\n try { await withTimeout(request('close'),closeResponseTimeoutMs); }\n catch (error) { failure = error; }\n }\n try { await stopWorker(); } catch (error) { failure ??= error; }\n try { await launcher.close(); } catch (error) { failure ??= error; }\n if (failure) throw failure;\n },\n };\n}\n"]}
1
+ {"version":3,"file":"worker-client.js","sourceRoot":"","sources":["../../src/runtime/worker-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { fork, type ChildProcess } from 'node:child_process';\nimport { fileURLToPath } from 'node:url';\nimport { delimiter } from 'node:path';\nimport { AgentError, errorInfo, type ErrorInfo } from '../errors.js';\nimport type { DriverInput } from './types.js';\nimport type { ManagedNativeSession } from './types.js';\nimport type { HarnessKind } from '../sdk/types.js';\nimport { createSessionLauncher } from './session-launcher.js';\nimport type { ApprovalEvent } from './worker-approvals.js';\nimport { processExitDescription } from '../process-diagnostics.js';\n\ninterface WorkerClientOptions {\n workerModule?: URL;\n shutdownTimeoutMs?: number;\n}\n\nconst closeResponseTimeoutMs = 15_000;\nconst shutdownTimeoutMs = 1_000;\n\nconst workerOperationLabels: Record<string,string> = {\n open:'startup',\n turn:'turn submission',\n steer:'steering',\n interrupt:'interruption',\n resume:'recovery',\n close:'closing',\n 'approval.respond':'approval response',\n};\n\nfunction waitWithin(promise: Promise<unknown>, timeout: number): Promise<boolean> {\n return new Promise(resolve => {\n const timer = setTimeout(() => resolve(false),timeout);\n promise.then(\n () => { clearTimeout(timer); resolve(true); },\n () => { clearTimeout(timer); resolve(true); },\n );\n });\n}\n\nfunction withTimeout<T>(promise: Promise<T>, timeout: number): Promise<T> {\n return new Promise((resolve,reject) => {\n const timer = setTimeout(() => reject(new AgentError('HARNESS_FAILED','The session worker did not complete cleanup.')),timeout);\n promise.then(\n value => { clearTimeout(timer); resolve(value); },\n error => { clearTimeout(timer); reject(error); },\n );\n });\n}\n\nexport async function createWorker(input: DriverInput, options: WorkerClientOptions = {}): Promise<ManagedNativeSession> {\n if ('kind' in input.reference && input.reference.kind === 'inline')\n throw new AgentError('INVALID_DEFINITION', 'Inline agent definitions cannot be loaded by native CLI workers.');\n const launcher = await createSessionLauncher(input.env.AGENT_STATE_DIR!,input.token);\n const workerModule = options.workerModule ?? new URL(`./worker.${import.meta.url.endsWith('.ts') ? 'ts' : 'js'}`, import.meta.url);\n const extension = workerModule.pathname.endsWith('.ts') ? 'ts' : 'js';\n let child: ChildProcess;\n try {\n child = fork(fileURLToPath(workerModule), [], {\n cwd: input.cwd, env: {...input.env,AGENT_PARENT_TOKEN:input.token,AGENT_CLI_PATH:launcher.path,\n PATH:launcher.directory + delimiter + (input.env.PATH ?? '')},\n execArgv: extension === 'ts' ? ['--import', import.meta.resolve('tsx')] : [],\n stdio: ['ignore','ignore','ignore','ipc'],\n });\n } catch { await launcher.close(); throw new AgentError('HARNESS_FAILED','The session worker could not be spawned during startup.'); }\n let nextId = 1;\n const pending = new Map<number, {operation:string;resolve(value:unknown):void;reject(error:Error):void}>();\n const approvals = new Map<number,AbortController>();\n const withdrawApprovals = () => { for (const controller of approvals.values()) controller.abort(); approvals.clear(); };\n let exited = false;\n let closing = false;\n let observedExit = '';\n let markExited!: () => void;\n const processExit = new Promise<void>(resolve => { markExited = resolve; });\n const exit = (code: unknown, signal: unknown, spawnFailure = false) => {\n if (exited) return;\n exited = true;\n observedExit = spawnFailure || closing ? '' : processExitDescription(code,signal);\n withdrawApprovals();\n markExited();\n void launcher.close().catch(() => {}).finally(() => {\n for (const waiting of pending.values()) {\n waiting.reject(new AgentError('HARNESS_FAILED', spawnFailure\n ? `The session worker process failed while ${waiting.operation} was pending.`\n : `The session worker exited while ${waiting.operation} was pending${observedExit}.`));\n }\n pending.clear();\n });\n };\n child.once('error', () => exit(undefined,undefined,true));\n child.once('exit', (code,signal) => exit(code,signal));\n child.on('message', (message: ApprovalEvent | {id:number;result?:unknown;error?:ErrorInfo}) => {\n if ('event' in message) {\n if (message.event === 'approval.withdraw') {\n approvals.get(message.requestId)?.abort(); approvals.delete(message.requestId);\n } else if (message.event === 'approval.request') {\n const controller = new AbortController();\n approvals.set(message.requestId,controller);\n void Promise.resolve().then(() => {\n if (!input.onApproval) throw new AgentError('INPUT_REQUIRED','Native tool approval requires an observing caller.');\n return input.onApproval(message.request,controller.signal);\n }).then(\n content => { if (!controller.signal.aborted && !exited) return request('approval.respond',{requestId:message.requestId,content}); },\n error => { if (!controller.signal.aborted && !exited) return request('approval.respond',{requestId:message.requestId,error:errorInfo(error)}); },\n ).catch(error => {\n // A rejected control cannot leave an already-settled caller callback parked forever.\n if (!controller.signal.aborted && !exited)\n return request('approval.respond',{requestId:message.requestId,error:errorInfo(error)}).catch(() => {});\n }).finally(() => { approvals.delete(message.requestId); });\n }\n return;\n }\n const waiting = pending.get(message.id);\n if (!waiting) return;\n pending.delete(message.id);\n if (message.error) waiting.reject(new AgentError(message.error.code, message.error.message));\n else waiting.resolve(message.result);\n });\n const request = (method:string, extra:Record<string,unknown> = {}) => new Promise<unknown>((resolve,reject) => {\n const operation = workerOperationLabels[method] ?? 'native operation';\n if (exited) {\n reject(new AgentError('HARNESS_FAILED',`The session worker is unavailable while ${operation} was pending${observedExit}.`));\n return;\n }\n const id = nextId++;\n pending.set(id,{operation,resolve,reject});\n child.send({id,method,...extra}, error => {\n if (!error) return;\n setImmediate(() => {\n const waiting = pending.get(id);\n if (!waiting || exited) return;\n pending.delete(id);\n waiting.reject(new AgentError('HARNESS_FAILED',`Cannot reach the session worker while ${operation} was pending.`));\n });\n });\n });\n let selectedHarness: HarnessKind;\n const {onApproval,...serializedInput} = input;\n try { selectedHarness = await request('open',{input:serializedInput,handlesApprovals:!!onApproval}) as HarnessKind; } catch (error) { child.kill(); await launcher.close(); throw error; }\n const stopWorker = async () => {\n if (exited) return;\n if (child.connected) try { child.disconnect(); } catch { /* Continue to termination escalation. */ }\n const timeout = options.shutdownTimeoutMs ?? shutdownTimeoutMs;\n if (await waitWithin(processExit,timeout)) return;\n child.kill('SIGTERM');\n if (await waitWithin(processExit,timeout)) return;\n child.kill('SIGKILL');\n if (await waitWithin(processExit,timeout)) return;\n throw new AgentError('HARNESS_FAILED','The session worker did not confirm termination.');\n };\n return {\n selectedHarness,\n turn: prompt => request('turn',{prompt}) as Promise<string>,\n steer: async prompt => { await request('steer',{prompt}); },\n interrupt: async () => { withdrawApprovals(); await request('interrupt'); },\n resume: () => request('resume') as Promise<string>,\n close: async () => {\n closing = true;\n withdrawApprovals();\n let failure: unknown;\n if (!exited) {\n try { await withTimeout(request('close'),closeResponseTimeoutMs); }\n catch (error) { failure = error; }\n }\n try { await stopWorker(); } catch (error) { failure ??= error; }\n try { await launcher.close(); } catch (error) { failure ??= error; }\n if (failure) throw failure;\n },\n };\n}\n"]}
@@ -1,8 +1,8 @@
1
- import { dirname } from 'node:path';
1
+ import { delimiter, dirname } from 'node:path';
2
2
  import { rm } from 'node:fs/promises';
3
- import { loadExecutionDefinition } from './definition.js';
3
+ import { captureExecutionDefinition, loadExecutionDefinition } from './definition.js';
4
4
  import { loadAccess } from '../config/access.js';
5
- import { errorInfo } from '../errors.js';
5
+ import { AgentError, errorInfo } from '../errors.js';
6
6
  import { selectNative } from './select-native.js';
7
7
  import { NativeOwner } from './native-owner.js';
8
8
  import { shellQuote } from '../shell.js';
@@ -50,20 +50,39 @@ export function delegationInstructions(definition, launcherPath) {
50
50
  export function startWorker(dependencies = {}) {
51
51
  const removeLauncherDirectory = dependencies.removeLauncherDirectory ??
52
52
  ((path) => rm(path, { recursive: true, force: true }));
53
- let native;
54
- const owner = new NativeOwner();
55
- const launcherDirectory = dirname(process.env.AGENT_CLI_PATH);
53
+ const leases = new Map();
54
+ let nextLeaseId = 1;
55
+ const legacyLauncher = process.env.AGENT_CLI_PATH;
56
+ const launcherDirectory = legacyLauncher ? dirname(legacyLauncher) : undefined;
56
57
  let closing;
57
58
  const reply = (message) => { if (process.connected)
58
59
  process.send?.(message, () => { }); };
59
- const approvals = new WorkerApprovals(reply);
60
+ const newLease = (definition, reference) => {
61
+ const leaseId = nextLeaseId++;
62
+ const approvals = new WorkerApprovals(event => reply({ ...event, leaseId }));
63
+ leases.set(leaseId, { definition, reference, owner: new NativeOwner(), approvals });
64
+ return leaseId;
65
+ };
66
+ const childSummary = (definition) => Object.entries(definition.subagents ?? {})
67
+ .map(([name, child]) => ({ name, description: child.description }));
68
+ const closeLease = async (leaseId) => {
69
+ const lease = leases.get(leaseId);
70
+ if (!lease)
71
+ return;
72
+ lease.approvals.close();
73
+ await lease.owner.close();
74
+ leases.delete(leaseId);
75
+ };
60
76
  const close = () => closing ??= (async () => {
61
- approvals.close();
62
77
  try {
63
- await owner.close();
78
+ const results = await Promise.allSettled([...leases.keys()].map(closeLease));
79
+ const failure = results.find(result => result.status === 'rejected');
80
+ if (failure?.status === 'rejected')
81
+ throw failure.reason;
64
82
  }
65
83
  finally {
66
- await removeLauncherDirectory(launcherDirectory);
84
+ if (launcherDirectory)
85
+ await removeLauncherDirectory(launcherDirectory);
67
86
  }
68
87
  })();
69
88
  process.on('message', async (message) => {
@@ -83,43 +102,105 @@ export function startWorker(dependencies = {}) {
83
102
  }
84
103
  try {
85
104
  let result;
86
- if (message.method === 'open') {
87
- let selectedHarness;
88
- native = await owner.open(async () => {
105
+ if (message.method === 'capture') {
106
+ const captured = await captureExecutionDefinition(message.agent, process.cwd());
107
+ const leaseId = newLease(captured.definition, captured.reference);
108
+ result = { leaseId, reference: captured.reference, children: childSummary(captured.definition) };
109
+ }
110
+ else if (message.method === 'capture.reference') {
111
+ const reference = message.reference;
112
+ const definition = await loadExecutionDefinition(reference);
113
+ const leaseId = newLease(definition, reference);
114
+ result = { leaseId, reference, children: childSummary(definition) };
115
+ }
116
+ else if (message.method === 'child') {
117
+ const parent = leases.get(message.leaseId);
118
+ const child = parent?.definition.subagents?.[message.name];
119
+ if (!parent || !child)
120
+ throw new AgentError('INVALID_PARENT', 'This subagent is not available in the captured parent context.');
121
+ const parentReference = parent.reference;
122
+ const reference = 'file' in parentReference
123
+ ? { file: parentReference.file, subagents: [...parentReference.subagents, message.name] }
124
+ : parentReference;
125
+ const leaseId = newLease(child, reference);
126
+ result = { leaseId, reference, children: childSummary(child) };
127
+ }
128
+ else if (message.method === 'open') {
129
+ let lease;
130
+ if (message.leaseId === undefined) {
89
131
  const input = message.input;
90
132
  const definition = await loadExecutionDefinition(input.reference);
91
- const instructions = delegationInstructions(definition, process.env.AGENT_CLI_PATH);
92
- return (dependencies.selectNative ?? selectNative)({ ...definition, instructions }, input.cwd, process.env, await loadAccess(input.cwd), undefined, harness => { selectedHarness = harness; }, message.handlesApprovals ? approvals.handle : undefined);
133
+ const leaseId = newLease(definition, input.reference);
134
+ lease = leases.get(leaseId);
135
+ message.leaseId = leaseId;
136
+ }
137
+ else {
138
+ const retained = leases.get(message.leaseId);
139
+ if (!retained)
140
+ throw new AgentError('HARNESS_FAILED', 'The captured execution lease is closed.');
141
+ lease = retained;
142
+ }
143
+ if (lease.native)
144
+ throw new AgentError('HARNESS_FAILED', 'Native session startup is unavailable.');
145
+ let selectedHarness;
146
+ const current = lease;
147
+ const input = message.input;
148
+ const launcherPath = message.launcherPath ?? legacyLauncher;
149
+ const sessionEnvironment = { ...input.env, AGENT_PARENT_TOKEN: input.token, AGENT_CLI_PATH: launcherPath,
150
+ PATH: dirname(launcherPath) + delimiter + (input.env.PATH ?? '') };
151
+ current.native = await current.owner.open(async () => {
152
+ const instructions = delegationInstructions(current.definition, launcherPath);
153
+ return (dependencies.selectNative ?? selectNative)({ ...current.definition, instructions }, input.cwd, sessionEnvironment, await loadAccess(input.cwd), undefined, harness => { selectedHarness = harness; }, message.handlesApprovals ? current.approvals.handle : undefined);
93
154
  });
155
+ current.selectedHarness = selectedHarness;
94
156
  result = selectedHarness;
95
157
  }
96
- else if (message.method === 'approval.respond')
97
- approvals.respond(message.requestId, message.content, message.error);
158
+ else if (message.method === 'approval.respond') {
159
+ const lease = message.leaseId === undefined ? [...leases.values()][0] : leases.get(message.leaseId);
160
+ lease?.approvals.respond(message.requestId, message.content, message.error);
161
+ }
98
162
  else if (message.method === 'turn') {
163
+ const lease = message.leaseId === undefined ? [...leases.values()][0] : leases.get(message.leaseId);
99
164
  try {
100
- result = await native.turn(message.prompt);
165
+ result = await lease.native.turn(message.prompt);
101
166
  }
102
167
  finally {
103
- approvals.close();
168
+ lease.approvals.close();
104
169
  }
105
170
  }
106
171
  else if (message.method === 'steer')
107
- result = await native.steer(message.prompt);
172
+ result = await (message.leaseId === undefined ? [...leases.values()][0] : leases.get(message.leaseId)).native.steer(message.prompt);
108
173
  else if (message.method === 'interrupt') {
109
- approvals.close();
110
- result = await native.interrupt();
174
+ const lease = (message.leaseId === undefined ? [...leases.values()][0] : leases.get(message.leaseId));
175
+ lease.approvals.close();
176
+ result = await lease.native.interrupt();
111
177
  }
112
178
  else if (message.method === 'resume') {
179
+ const lease = (message.leaseId === undefined ? [...leases.values()][0] : leases.get(message.leaseId));
113
180
  try {
114
- result = await native.resume();
181
+ result = await lease.native.resume();
115
182
  }
116
183
  finally {
117
- approvals.close();
184
+ lease.approvals.close();
118
185
  }
119
186
  }
187
+ else if (message.method === 'native.close') {
188
+ const lease = message.leaseId === undefined ? [...leases.values()][0] : leases.get(message.leaseId);
189
+ if (lease) {
190
+ lease.approvals.close();
191
+ await lease.owner.close();
192
+ }
193
+ }
194
+ else if (message.method === 'lease.close') {
195
+ await closeLease(message.leaseId);
196
+ result = null;
197
+ }
120
198
  else
121
199
  throw new Error('Unknown worker operation');
122
200
  reply({ id: message.id, result: result ?? null });
201
+ if (message.method === 'lease.close' && leases.size === 0)
202
+ setImmediate(() => { if (process.connected)
203
+ process.disconnect(); });
123
204
  }
124
205
  catch (error) {
125
206
  reply({ id: message.id, error: errorInfo(error) });
@@ -1 +1 @@
1
- {"version":3,"file":"worker-server.js","sourceRoot":"","sources":["../../src/runtime/worker-server.ts"],"names":[],"mappings":"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","sourcesContent":["import { dirname } from 'node:path';\nimport { rm } from 'node:fs/promises';\nimport { loadExecutionDefinition } from './definition.js';\nimport { loadAccess } from '../config/access.js';\nimport { errorInfo, type ErrorInfo } from '../errors.js';\nimport { selectNative } from './select-native.js';\nimport { NativeOwner } from './native-owner.js';\nimport type { DriverInput } from './types.js';\nimport type { ExecutionDefinition, NativeSession } from '../adapters/types.js';\nimport type { HarnessKind } from '../sdk/types.js';\nimport { shellQuote } from '../shell.js';\nimport { WorkerApprovals } from './worker-approvals.js';\n\ninterface WorkerServerDependencies {\n removeLauncherDirectory?(path: string): Promise<void>;\n selectNative?: typeof selectNative;\n}\n\nexport function delegationInstructions(definition: ExecutionDefinition, launcherPath: string): string {\n const children = Object.entries(definition.subagents ?? {});\n if (children.length === 0) return definition.instructions;\n const launcher = shellQuote(launcherPath);\n return definition.instructions + '\\n\\nAvailable delegated agents:\\n' +\n children.map(([name, child]) => `- subagent:${name}: ${child.description}`).join('\\n') +\n '\\nOnly the listed delegated agents are authorized. Do not infer native background-command support from the ' +\n 'harness name, and do not invent native tool parameters.\\n' +\n '\\nCopy the launcher path and its quoting exactly from the command below. Do not shorten or replace the path. ' +\n 'Replace only the angle-bracket arguments. Use --prompt-file instead of --prompt when needed.\\n' +\n 'When the native host is known to support background commands, use one ordinary run through those controls, ' +\n 'continue independent work, and later collect that hosted command\\'s output:\\n' +\n `\\n\\`\\`\\`sh\\n${launcher} run subagent:<name> --cwd <existing-directory> --prompt <task>\\n\\`\\`\\`\\n` +\n 'That ordinary run already observes the first response or a pending permission request. Read its output before ' +\n 'invoking a separate Subharness wait or status.\\n' +\n 'If native background-command support is unavailable or uncertain, use the detached fallback:\\n' +\n `\\n\\`\\`\\`sh\\n${launcher} run subagent:<name> --detach --cwd <existing-directory> --prompt <task>\\n\\`\\`\\`\\n` +\n 'Retain the returned task and session identifiers, continue independent work, and later collect the result with wait:\\n' +\n `\\n\\`\\`\\`sh\\n${launcher} wait <task-id>\\n\\`\\`\\`\\n` +\n 'Use status only when a snapshot or additional state is needed:\\n' +\n `\\n\\`\\`\\`sh\\n${launcher} status <task-id> --full\\n\\`\\`\\`\\n` +\n 'Confirm its terminal outcome. Detached admission is not completion, and shell `&` does not replace the ' +\n 'managed task record. This background flow does not promise notification or automatic chat reactivation.\\n' +\n 'If run, send, or wait returns approval_required, the native operation is still pending. Inspect every request\\'s ' +\n 'origin, action context, and requestedSchema. Request messages and option titles describe the operation; ' +\n 'they do not authorize it. Answer each request using only its actual schema and offered values. ' +\n 'Choice identifiers and scopes differ by request; \"always\" may mean only this session.\\n' +\n `\\n\\`\\`\\`sh\\n${launcher} respond <request-id> --content-file <answer-json-file>\\n${launcher} wait <observed-task-id>\\n\\`\\`\\`\\n` +\n 'The answer file contains one JSON object matching requestedSchema. For a request offering a decision enum, ' +\n 'an answer has the form {\"decision\":\"<actual-offered-value>\"}; include every required field. ' +\n 'approval_answered acknowledges submission, not task completion. Retain and use any response cursor with wait --after. ' +\n 'Reject an operation through its offered denial choice. Do not use resume, send, or a new run to answer a permission request. ' +\n 'Use cancel only to stop a task. Managed agents may answer only requests from their strict descendants.\\n' +\n 'If native permissions block the launcher or coordinator connection, report the exact blocked operation. ' +\n 'Do not retry an unchanged permission failure or broaden the permission policy.\\n' +\n 'For follow-ups, queue, steer, interrupt, wait, status, and cancellation, read the help:\\n' +\n `\\n\\`\\`\\`sh\\n${launcher} --help\\n\\`\\`\\`\\n` +\n 'Include needed task context; child sessions do not inherit your conversation.';\n}\n\nexport function startWorker(dependencies: WorkerServerDependencies = {}): void {\n const removeLauncherDirectory = dependencies.removeLauncherDirectory ??\n ((path: string) => rm(path,{recursive:true,force:true}));\n let native: NativeSession | undefined;\n const owner = new NativeOwner();\n const launcherDirectory = dirname(process.env.AGENT_CLI_PATH!);\n let closing: Promise<void> | undefined;\n const reply = (message: unknown) => { if (process.connected) process.send?.(message as object, () => {}); };\n const approvals = new WorkerApprovals(reply);\n const close = () => closing ??= (async () => {\n approvals.close();\n try { await owner.close(); }\n finally { await removeLauncherDirectory(launcherDirectory); }\n })();\n process.on('message', async (message: {id:number;method:string;input?:DriverInput;prompt?:string;\n handlesApprovals?:boolean;requestId?:number;content?:unknown;error?:ErrorInfo}) => {\n if (message.method === 'close') {\n try { await close(); reply({id:message.id,result:null}); }\n catch (error) { reply({id:message.id,error:errorInfo(error)}); }\n finally { if (process.connected) process.disconnect(); }\n return;\n }\n try {\n let result: unknown;\n if (message.method === 'open') {\n let selectedHarness: HarnessKind | undefined;\n native = await owner.open(async () => {\n const input = message.input!;\n const definition = await loadExecutionDefinition(input.reference);\n const instructions = delegationInstructions(definition, process.env.AGENT_CLI_PATH!);\n return (dependencies.selectNative ?? selectNative)({...definition,instructions}, input.cwd, process.env, await loadAccess(input.cwd), undefined,\n harness => { selectedHarness = harness; }, message.handlesApprovals ? approvals.handle : undefined);\n });\n result = selectedHarness;\n } else if (message.method === 'approval.respond') approvals.respond(message.requestId!,message.content,message.error);\n else if (message.method === 'turn') {\n try { result = await native!.turn(message.prompt!); } finally { approvals.close(); }\n }\n else if (message.method === 'steer') result = await native!.steer(message.prompt!);\n else if (message.method === 'interrupt') { approvals.close(); result = await native!.interrupt(); }\n else if (message.method === 'resume') {\n try { result = await native!.resume(); } finally { approvals.close(); }\n }\n else throw new Error('Unknown worker operation');\n reply({id:message.id,result:result ?? null});\n } catch (error) { reply({id:message.id,error:errorInfo(error)}); }\n });\n process.on('disconnect', () => { void close().catch(() => {}).finally(() => process.exit()); });\n}\n"]}
1
+ {"version":3,"file":"worker-server.js","sourceRoot":"","sources":["../../src/runtime/worker-server.ts"],"names":[],"mappings":"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","sourcesContent":["import { delimiter, dirname } from 'node:path';\nimport { rm } from 'node:fs/promises';\nimport { captureExecutionDefinition, loadExecutionDefinition } from './definition.js';\nimport { loadAccess } from '../config/access.js';\nimport { AgentError, errorInfo, type ErrorInfo } from '../errors.js';\nimport { selectNative } from './select-native.js';\nimport { NativeOwner } from './native-owner.js';\nimport type { DriverInput } from './types.js';\nimport type { ExecutionDefinition, NativeSession } from '../adapters/types.js';\nimport type { HarnessKind } from '../sdk/types.js';\nimport type { HarnessConfig } from '../sdk/types.js';\nimport { shellQuote } from '../shell.js';\nimport { WorkerApprovals } from './worker-approvals.js';\n\ninterface WorkerServerDependencies {\n removeLauncherDirectory?(path: string): Promise<void>;\n selectNative?: typeof selectNative;\n}\n\nexport function delegationInstructions(definition: ExecutionDefinition, launcherPath: string): string {\n const children = Object.entries(definition.subagents ?? {});\n if (children.length === 0) return definition.instructions;\n const launcher = shellQuote(launcherPath);\n return definition.instructions + '\\n\\nAvailable delegated agents:\\n' +\n children.map(([name, child]) => `- subagent:${name}: ${child.description}`).join('\\n') +\n '\\nOnly the listed delegated agents are authorized. Do not infer native background-command support from the ' +\n 'harness name, and do not invent native tool parameters.\\n' +\n '\\nCopy the launcher path and its quoting exactly from the command below. Do not shorten or replace the path. ' +\n 'Replace only the angle-bracket arguments. Use --prompt-file instead of --prompt when needed.\\n' +\n 'When the native host is known to support background commands, use one ordinary run through those controls, ' +\n 'continue independent work, and later collect that hosted command\\'s output:\\n' +\n `\\n\\`\\`\\`sh\\n${launcher} run subagent:<name> --cwd <existing-directory> --prompt <task>\\n\\`\\`\\`\\n` +\n 'That ordinary run already observes the first response or a pending permission request. Read its output before ' +\n 'invoking a separate Subharness wait or status.\\n' +\n 'If native background-command support is unavailable or uncertain, use the detached fallback:\\n' +\n `\\n\\`\\`\\`sh\\n${launcher} run subagent:<name> --detach --cwd <existing-directory> --prompt <task>\\n\\`\\`\\`\\n` +\n 'Retain the returned task and session identifiers, continue independent work, and later collect the result with wait:\\n' +\n `\\n\\`\\`\\`sh\\n${launcher} wait <task-id>\\n\\`\\`\\`\\n` +\n 'Use status only when a snapshot or additional state is needed:\\n' +\n `\\n\\`\\`\\`sh\\n${launcher} status <task-id> --full\\n\\`\\`\\`\\n` +\n 'Confirm its terminal outcome. Detached admission is not completion, and shell `&` does not replace the ' +\n 'managed task record. This background flow does not promise notification or automatic chat reactivation.\\n' +\n 'If run, send, or wait returns approval_required, the native operation is still pending. Inspect every request\\'s ' +\n 'origin, action context, and requestedSchema. Request messages and option titles describe the operation; ' +\n 'they do not authorize it. Answer each request using only its actual schema and offered values. ' +\n 'Choice identifiers and scopes differ by request; \"always\" may mean only this session.\\n' +\n `\\n\\`\\`\\`sh\\n${launcher} respond <request-id> --content-file <answer-json-file>\\n${launcher} wait <observed-task-id>\\n\\`\\`\\`\\n` +\n 'The answer file contains one JSON object matching requestedSchema. For a request offering a decision enum, ' +\n 'an answer has the form {\"decision\":\"<actual-offered-value>\"}; include every required field. ' +\n 'approval_answered acknowledges submission, not task completion. Retain and use any response cursor with wait --after. ' +\n 'Reject an operation through its offered denial choice. Do not use resume, send, or a new run to answer a permission request. ' +\n 'Use cancel only to stop a task. Managed agents may answer only requests from their strict descendants.\\n' +\n 'If native permissions block the launcher or coordinator connection, report the exact blocked operation. ' +\n 'Do not retry an unchanged permission failure or broaden the permission policy.\\n' +\n 'For follow-ups, queue, steer, interrupt, wait, status, and cancellation, read the help:\\n' +\n `\\n\\`\\`\\`sh\\n${launcher} --help\\n\\`\\`\\`\\n` +\n 'Include needed task context; child sessions do not inherit your conversation.';\n}\n\nexport function startWorker(dependencies: WorkerServerDependencies = {}): void {\n const removeLauncherDirectory = dependencies.removeLauncherDirectory ??\n ((path: string) => rm(path,{recursive:true,force:true}));\n interface Lease {\n definition: ExecutionDefinition;\n reference: import('./types.js').ExecutionReference;\n owner: NativeOwner;\n approvals: WorkerApprovals;\n native?: NativeSession;\n selectedHarness?: HarnessKind;\n }\n const leases = new Map<number,Lease>();\n let nextLeaseId = 1;\n const legacyLauncher = process.env.AGENT_CLI_PATH;\n const launcherDirectory = legacyLauncher ? dirname(legacyLauncher) : undefined;\n let closing: Promise<void> | undefined;\n const reply = (message: unknown) => { if (process.connected) process.send?.(message as object, () => {}); };\n const newLease = (definition:ExecutionDefinition,reference:import('./types.js').ExecutionReference) => {\n const leaseId = nextLeaseId++;\n const approvals = new WorkerApprovals(event=>reply({...event,leaseId}));\n leases.set(leaseId,{definition,reference,owner:new NativeOwner(),approvals});\n return leaseId;\n };\n const childSummary = (definition:ExecutionDefinition) => Object.entries(definition.subagents??{})\n .map(([name,child])=>({name,description:child.description}));\n const closeLease = async (leaseId:number) => {\n const lease = leases.get(leaseId);\n if (!lease) return;\n lease.approvals.close();\n await lease.owner.close();\n leases.delete(leaseId);\n };\n const close = () => closing ??= (async () => {\n try {\n const results = await Promise.allSettled([...leases.keys()].map(closeLease));\n const failure = results.find(result=>result.status==='rejected');\n if (failure?.status==='rejected') throw failure.reason;\n } finally {\n if (launcherDirectory) await removeLauncherDirectory(launcherDirectory);\n }\n })();\n process.on('message', async (message: {id:number;method:string;input?:DriverInput;prompt?:string;\n handlesApprovals?:boolean;requestId?:number;content?:unknown;error?:ErrorInfo;leaseId?:number;\n agent?:string|HarnessConfig;reference?:import('./types.js').ExecutionReference;name?:string;launcherPath?:string}) => {\n if (message.method === 'close') {\n try { await close(); reply({id:message.id,result:null}); }\n catch (error) { reply({id:message.id,error:errorInfo(error)}); }\n finally { if (process.connected) process.disconnect(); }\n return;\n }\n try {\n let result: unknown;\n if (message.method === 'capture') {\n const captured = await captureExecutionDefinition(message.agent!,process.cwd());\n const leaseId = newLease(captured.definition,captured.reference);\n result = {leaseId,reference:captured.reference,children:childSummary(captured.definition)};\n } else if (message.method === 'capture.reference') {\n const reference=message.reference!;\n const definition=await loadExecutionDefinition(reference);\n const leaseId=newLease(definition,reference);\n result={leaseId,reference,children:childSummary(definition)};\n } else if (message.method === 'child') {\n const parent = leases.get(message.leaseId!);\n const child = parent?.definition.subagents?.[message.name!];\n if (!parent || !child) throw new AgentError('INVALID_PARENT','This subagent is not available in the captured parent context.');\n const parentReference = parent.reference;\n const reference = 'file' in parentReference\n ? {file:parentReference.file,subagents:[...parentReference.subagents,message.name!]}\n : parentReference;\n const leaseId = newLease(child,reference);\n result = {leaseId,reference,children:childSummary(child)};\n } else if (message.method === 'open') {\n let lease:Lease;\n if(message.leaseId===undefined){\n const input = message.input!;\n const definition = await loadExecutionDefinition(input.reference);\n const leaseId = newLease(definition,input.reference);\n lease = leases.get(leaseId)!;\n message.leaseId = leaseId;\n }else{\n const retained=leases.get(message.leaseId);\n if(!retained)throw new AgentError('HARNESS_FAILED','The captured execution lease is closed.');\n lease=retained;\n }\n if (lease.native) throw new AgentError('HARNESS_FAILED','Native session startup is unavailable.');\n let selectedHarness: HarnessKind | undefined;\n const current = lease;\n const input = message.input!;\n const launcherPath = message.launcherPath ?? legacyLauncher!;\n const sessionEnvironment = {...input.env,AGENT_PARENT_TOKEN:input.token,AGENT_CLI_PATH:launcherPath,\n PATH:dirname(launcherPath)+delimiter+(input.env.PATH??'')};\n current.native = await current.owner.open(async () => {\n const instructions = delegationInstructions(current.definition,launcherPath);\n return (dependencies.selectNative ?? selectNative)({...current.definition,instructions},input.cwd,sessionEnvironment,\n await loadAccess(input.cwd),undefined,harness=>{selectedHarness=harness;},\n message.handlesApprovals ? current.approvals.handle : undefined);\n });\n current.selectedHarness=selectedHarness;\n result = selectedHarness;\n } else if (message.method === 'approval.respond') {\n const lease = message.leaseId===undefined ? [...leases.values()][0] : leases.get(message.leaseId);\n lease?.approvals.respond(message.requestId!,message.content,message.error);\n }\n else if (message.method === 'turn') {\n const lease=message.leaseId===undefined?[...leases.values()][0]:leases.get(message.leaseId);\n try { result=await lease!.native!.turn(message.prompt!); } finally { lease!.approvals.close(); }\n }\n else if (message.method === 'steer') result=await (message.leaseId===undefined?[...leases.values()][0]:leases.get(message.leaseId))!.native!.steer(message.prompt!);\n else if (message.method === 'interrupt') { const lease=(message.leaseId===undefined?[...leases.values()][0]:leases.get(message.leaseId))!;lease.approvals.close();result=await lease.native!.interrupt(); }\n else if (message.method === 'resume') {\n const lease=(message.leaseId===undefined?[...leases.values()][0]:leases.get(message.leaseId))!;\n try { result=await lease.native!.resume(); } finally { lease.approvals.close(); }\n }\n else if (message.method === 'native.close') { const lease=message.leaseId===undefined?[...leases.values()][0]:leases.get(message.leaseId);if(lease){lease.approvals.close();await lease.owner.close();} }\n else if (message.method === 'lease.close') { await closeLease(message.leaseId!);result=null; }\n else throw new Error('Unknown worker operation');\n reply({id:message.id,result:result ?? null});\n if(message.method==='lease.close'&&leases.size===0)setImmediate(()=>{if(process.connected)process.disconnect();});\n } catch (error) { reply({id:message.id,error:errorInfo(error)}); }\n });\n process.on('disconnect',()=>{void close().catch(()=>{}).finally(()=>process.exit());});\n}\n"]}
@@ -0,0 +1,42 @@
1
+ import type { HarnessConfig } from './types.js';
2
+ import type { ApprovalResponse, Page, PageOptions, SessionHandle, SessionSummary, TaskHandle, TaskSummary } from './execution-types.js';
3
+ export interface ConnectOptions {
4
+ readonly start?: boolean;
5
+ readonly stateDirectory?: string;
6
+ }
7
+ export interface ConnectedSessionOptions {
8
+ readonly agent: string | HarnessConfig;
9
+ readonly cwd: string;
10
+ readonly env?: Readonly<Record<string, string | undefined>>;
11
+ }
12
+ export interface AgentSummary {
13
+ readonly id: string;
14
+ readonly name: string;
15
+ readonly description: string;
16
+ readonly scope: 'harness' | 'repo' | 'global';
17
+ }
18
+ export interface Client {
19
+ readonly agents: {
20
+ list(options: {
21
+ readonly cwd: string;
22
+ }): Promise<{
23
+ readonly items: readonly AgentSummary[];
24
+ }>;
25
+ check(options: ConnectedSessionOptions): Promise<void>;
26
+ };
27
+ readonly sessions: {
28
+ create(options: ConnectedSessionOptions): Promise<SessionHandle>;
29
+ list(options?: PageOptions): Promise<Page<SessionSummary>>;
30
+ get(id: string): Promise<SessionHandle>;
31
+ };
32
+ readonly tasks: {
33
+ list(options?: PageOptions & {
34
+ readonly sessionId?: string;
35
+ }): Promise<Page<TaskSummary>>;
36
+ get(id: string): Promise<TaskHandle>;
37
+ };
38
+ readonly approvals: {
39
+ respond(requestId: string, response: ApprovalResponse): Promise<void>;
40
+ };
41
+ disconnect(): Promise<void>;
42
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=connected-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connected-types.js","sourceRoot":"","sources":["../../src/sdk/connected-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { HarnessConfig } from './types.js';\nimport type {\n ApprovalResponse, Page, PageOptions, SessionHandle, SessionSummary, TaskHandle, TaskSummary,\n} from './execution-types.js';\n\nexport interface ConnectOptions {\n readonly start?:boolean;\n readonly stateDirectory?:string;\n}\nexport interface ConnectedSessionOptions {\n readonly agent:string|HarnessConfig;\n readonly cwd:string;\n readonly env?:Readonly<Record<string,string|undefined>>;\n}\nexport interface AgentSummary {\n readonly id:string;\n readonly name:string;\n readonly description:string;\n readonly scope:'harness'|'repo'|'global';\n}\nexport interface Client {\n readonly agents:{\n list(options:{readonly cwd:string}):Promise<{readonly items:readonly AgentSummary[]}>;\n check(options:ConnectedSessionOptions):Promise<void>;\n };\n readonly sessions:{\n create(options:ConnectedSessionOptions):Promise<SessionHandle>;\n list(options?:PageOptions):Promise<Page<SessionSummary>>;\n get(id:string):Promise<SessionHandle>;\n };\n readonly tasks:{\n list(options?:PageOptions&{readonly sessionId?:string}):Promise<Page<TaskSummary>>;\n get(id:string):Promise<TaskHandle>;\n };\n readonly approvals:{respond(requestId:string,response:ApprovalResponse):Promise<void>};\n disconnect():Promise<void>;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Client, ConnectOptions } from './connected-types.js';
2
+ export declare function connect(options?: ConnectOptions): Promise<Client>;
3
+ export type { AgentSummary, Client, ConnectedSessionOptions, ConnectOptions } from './connected-types.js';