subharness 0.0.3 → 0.0.5

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 (241) hide show
  1. package/README.md +39 -9
  2. package/dist/adapters/approval-context.d.ts +2 -0
  3. package/dist/adapters/approval-context.js +9 -0
  4. package/dist/adapters/approval-context.js.map +1 -0
  5. package/dist/adapters/approval-lifetime.d.ts +8 -0
  6. package/dist/adapters/approval-lifetime.js +50 -0
  7. package/dist/adapters/approval-lifetime.js.map +1 -0
  8. package/dist/adapters/claude-approvals.d.ts +4 -0
  9. package/dist/adapters/claude-approvals.js +32 -0
  10. package/dist/adapters/claude-approvals.js.map +1 -0
  11. package/dist/adapters/claude-permissions.js +1 -1
  12. package/dist/adapters/claude-permissions.js.map +1 -1
  13. package/dist/adapters/claude-process.d.ts +3 -0
  14. package/dist/adapters/claude-process.js +11 -1
  15. package/dist/adapters/claude-process.js.map +1 -1
  16. package/dist/adapters/claude-result.d.ts +2 -0
  17. package/dist/adapters/claude-result.js +22 -0
  18. package/dist/adapters/claude-result.js.map +1 -0
  19. package/dist/adapters/claude.js +60 -12
  20. package/dist/adapters/claude.js.map +1 -1
  21. package/dist/adapters/codex-approvals.d.ts +6 -0
  22. package/dist/adapters/codex-approvals.js +111 -0
  23. package/dist/adapters/codex-approvals.js.map +1 -0
  24. package/dist/adapters/codex.js +36 -3
  25. package/dist/adapters/codex.js.map +1 -1
  26. package/dist/adapters/copilot-permissions.d.ts +26 -0
  27. package/dist/adapters/copilot-permissions.js +121 -0
  28. package/dist/adapters/copilot-permissions.js.map +1 -0
  29. package/dist/adapters/copilot-tools.d.ts +12 -0
  30. package/dist/adapters/copilot-tools.js +61 -0
  31. package/dist/adapters/copilot-tools.js.map +1 -0
  32. package/dist/adapters/copilot.d.ts +108 -0
  33. package/dist/adapters/copilot.js +819 -0
  34. package/dist/adapters/copilot.js.map +1 -0
  35. package/dist/adapters/cursor-cli-approvals.d.ts +2 -0
  36. package/dist/adapters/cursor-cli-approvals.js +83 -0
  37. package/dist/adapters/cursor-cli-approvals.js.map +1 -0
  38. package/dist/adapters/cursor-cli-model.d.ts +4 -0
  39. package/dist/adapters/cursor-cli-model.js +64 -0
  40. package/dist/adapters/cursor-cli-model.js.map +1 -0
  41. package/dist/adapters/cursor-cli-session.d.ts +32 -0
  42. package/dist/adapters/cursor-cli-session.js +316 -0
  43. package/dist/adapters/cursor-cli-session.js.map +1 -0
  44. package/dist/adapters/cursor-cli-tools.d.ts +20 -0
  45. package/dist/adapters/cursor-cli-tools.js +181 -0
  46. package/dist/adapters/cursor-cli-tools.js.map +1 -0
  47. package/dist/adapters/cursor-cli.d.ts +2 -0
  48. package/dist/adapters/cursor-cli.js +306 -0
  49. package/dist/adapters/cursor-cli.js.map +1 -0
  50. package/dist/adapters/cursor-model.d.ts +7 -0
  51. package/dist/adapters/cursor-model.js +67 -0
  52. package/dist/adapters/cursor-model.js.map +1 -0
  53. package/dist/adapters/cursor-rpc.d.ts +42 -0
  54. package/dist/adapters/cursor-rpc.js +271 -0
  55. package/dist/adapters/cursor-rpc.js.map +1 -0
  56. package/dist/adapters/cursor-session.d.ts +4 -0
  57. package/dist/adapters/cursor-session.js +327 -0
  58. package/dist/adapters/cursor-session.js.map +1 -0
  59. package/dist/adapters/cursor-startup.d.ts +16 -0
  60. package/dist/adapters/cursor-startup.js +74 -0
  61. package/dist/adapters/cursor-startup.js.map +1 -0
  62. package/dist/adapters/cursor-tools.d.ts +11 -0
  63. package/dist/adapters/cursor-tools.js +49 -0
  64. package/dist/adapters/cursor-tools.js.map +1 -0
  65. package/dist/adapters/cursor.d.ts +6 -0
  66. package/dist/adapters/cursor.js +17 -0
  67. package/dist/adapters/cursor.js.map +1 -0
  68. package/dist/adapters/fx-approvals.d.ts +2 -0
  69. package/dist/adapters/fx-approvals.js +14 -0
  70. package/dist/adapters/fx-approvals.js.map +1 -0
  71. package/dist/adapters/fx-auth.d.ts +12 -2
  72. package/dist/adapters/fx-auth.js +51 -61
  73. package/dist/adapters/fx-auth.js.map +1 -1
  74. package/dist/adapters/fx-profile.d.ts +8 -0
  75. package/dist/adapters/fx-profile.js +101 -0
  76. package/dist/adapters/fx-profile.js.map +1 -0
  77. package/dist/adapters/fx-rpc.d.ts +2 -0
  78. package/dist/adapters/fx-rpc.js +30 -4
  79. package/dist/adapters/fx-rpc.js.map +1 -1
  80. package/dist/adapters/fx-status.d.ts +2 -0
  81. package/dist/adapters/fx-status.js +96 -0
  82. package/dist/adapters/fx-status.js.map +1 -0
  83. package/dist/adapters/fx.js +77 -30
  84. package/dist/adapters/fx.js.map +1 -1
  85. package/dist/adapters/opencode-access.d.ts +13 -0
  86. package/dist/adapters/opencode-access.js +76 -0
  87. package/dist/adapters/opencode-access.js.map +1 -0
  88. package/dist/adapters/opencode-config.d.ts +11 -0
  89. package/dist/adapters/opencode-config.js +238 -0
  90. package/dist/adapters/opencode-config.js.map +1 -0
  91. package/dist/adapters/opencode-http.d.ts +28 -0
  92. package/dist/adapters/opencode-http.js +297 -0
  93. package/dist/adapters/opencode-http.js.map +1 -0
  94. package/dist/adapters/opencode-tools.d.ts +19 -0
  95. package/dist/adapters/opencode-tools.js +127 -0
  96. package/dist/adapters/opencode-tools.js.map +1 -0
  97. package/dist/adapters/opencode.d.ts +2 -0
  98. package/dist/adapters/opencode.js +569 -0
  99. package/dist/adapters/opencode.js.map +1 -0
  100. package/dist/adapters/rpc.d.ts +3 -0
  101. package/dist/adapters/rpc.js +45 -4
  102. package/dist/adapters/rpc.js.map +1 -1
  103. package/dist/adapters/types.d.ts +7 -0
  104. package/dist/adapters/types.js.map +1 -1
  105. package/dist/approvals/schema.d.ts +4 -0
  106. package/dist/approvals/schema.js +70 -0
  107. package/dist/approvals/schema.js.map +1 -0
  108. package/dist/approvals/types.d.ts +47 -0
  109. package/dist/approvals/types.js +2 -0
  110. package/dist/approvals/types.js.map +1 -0
  111. package/dist/cli/args.d.ts +3 -2
  112. package/dist/cli/args.js +24 -3
  113. package/dist/cli/args.js.map +1 -1
  114. package/dist/cli/dashboard-client.d.ts +5 -1
  115. package/dist/cli/dashboard-client.js +162 -15
  116. package/dist/cli/dashboard-client.js.map +1 -1
  117. package/dist/cli/dashboard-controller.d.ts +7 -0
  118. package/dist/cli/dashboard-controller.js +27 -0
  119. package/dist/cli/dashboard-controller.js.map +1 -0
  120. package/dist/cli/dashboard-detail-view.d.ts +16 -0
  121. package/dist/cli/dashboard-detail-view.js +162 -0
  122. package/dist/cli/dashboard-detail-view.js.map +1 -0
  123. package/dist/cli/dashboard-history-view.d.ts +29 -0
  124. package/dist/cli/dashboard-history-view.js +211 -0
  125. package/dist/cli/dashboard-history-view.js.map +1 -0
  126. package/dist/cli/dashboard-input.d.ts +14 -0
  127. package/dist/cli/dashboard-input.js +128 -0
  128. package/dist/cli/dashboard-input.js.map +1 -0
  129. package/dist/cli/dashboard-layout.d.ts +12 -1
  130. package/dist/cli/dashboard-layout.js +32 -30
  131. package/dist/cli/dashboard-layout.js.map +1 -1
  132. package/dist/cli/dashboard-renderer.d.ts +30 -2
  133. package/dist/cli/dashboard-renderer.js +125 -7
  134. package/dist/cli/dashboard-renderer.js.map +1 -1
  135. package/dist/cli/dashboard-style.d.ts +9 -0
  136. package/dist/cli/dashboard-style.js +36 -0
  137. package/dist/cli/dashboard-style.js.map +1 -0
  138. package/dist/cli/dashboard.d.ts +5 -3
  139. package/dist/cli/dashboard.js +102 -12
  140. package/dist/cli/dashboard.js.map +1 -1
  141. package/dist/cli/help.d.ts +1 -1
  142. package/dist/cli/help.js +37 -12
  143. package/dist/cli/help.js.map +1 -1
  144. package/dist/cli/input.d.ts +1 -0
  145. package/dist/cli/input.js +23 -17
  146. package/dist/cli/input.js.map +1 -1
  147. package/dist/cli/main.js +6 -2
  148. package/dist/cli/main.js.map +1 -1
  149. package/dist/cli/output.js +17 -1
  150. package/dist/cli/output.js.map +1 -1
  151. package/dist/config/access-provenance.d.ts +10 -0
  152. package/dist/config/access-provenance.js +31 -0
  153. package/dist/config/access-provenance.js.map +1 -0
  154. package/dist/config/access.d.ts +12 -2
  155. package/dist/config/access.js +125 -27
  156. package/dist/config/access.js.map +1 -1
  157. package/dist/config/loader.js +1 -0
  158. package/dist/config/loader.js.map +1 -1
  159. package/dist/config/oidc.js +4 -2
  160. package/dist/config/oidc.js.map +1 -1
  161. package/dist/config/project.js +2 -1
  162. package/dist/config/project.js.map +1 -1
  163. package/dist/config/resolve-access.js +24 -10
  164. package/dist/config/resolve-access.js.map +1 -1
  165. package/dist/index.d.ts +2 -2
  166. package/dist/index.js +1 -1
  167. package/dist/index.js.map +1 -1
  168. package/dist/process-diagnostics.d.ts +2 -0
  169. package/dist/process-diagnostics.js +11 -0
  170. package/dist/process-diagnostics.js.map +1 -0
  171. package/dist/runtime/access-errors.d.ts +4 -0
  172. package/dist/runtime/access-errors.js +25 -0
  173. package/dist/runtime/access-errors.js.map +1 -0
  174. package/dist/runtime/approval-registry.d.ts +27 -0
  175. package/dist/runtime/approval-registry.js +126 -0
  176. package/dist/runtime/approval-registry.js.map +1 -0
  177. package/dist/runtime/client.js +54 -14
  178. package/dist/runtime/client.js.map +1 -1
  179. package/dist/runtime/coordinator.d.ts +17 -1
  180. package/dist/runtime/coordinator.js +124 -6
  181. package/dist/runtime/coordinator.js.map +1 -1
  182. package/dist/runtime/dashboard-sanitize.d.ts +2 -0
  183. package/dist/runtime/dashboard-sanitize.js +7 -0
  184. package/dist/runtime/dashboard-sanitize.js.map +1 -0
  185. package/dist/runtime/dashboard.d.ts +43 -1
  186. package/dist/runtime/dashboard.js +2 -3
  187. package/dist/runtime/dashboard.js.map +1 -1
  188. package/dist/runtime/definition.js +11 -1
  189. package/dist/runtime/definition.js.map +1 -1
  190. package/dist/runtime/select-native.d.ts +2 -1
  191. package/dist/runtime/select-native.js +28 -10
  192. package/dist/runtime/select-native.js.map +1 -1
  193. package/dist/runtime/service.js +24 -1
  194. package/dist/runtime/service.js.map +1 -1
  195. package/dist/runtime/types.d.ts +9 -1
  196. package/dist/runtime/types.js.map +1 -1
  197. package/dist/runtime/worker-approvals.d.ts +21 -0
  198. package/dist/runtime/worker-approvals.js +51 -0
  199. package/dist/runtime/worker-approvals.js.map +1 -0
  200. package/dist/runtime/worker-client.js +73 -20
  201. package/dist/runtime/worker-client.js.map +1 -1
  202. package/dist/runtime/worker-server.d.ts +2 -0
  203. package/dist/runtime/worker-server.js +39 -10
  204. package/dist/runtime/worker-server.js.map +1 -1
  205. package/dist/sdk/definitions.d.ts +4 -1
  206. package/dist/sdk/definitions.js +16 -2
  207. package/dist/sdk/definitions.js.map +1 -1
  208. package/dist/sdk/permission-validation.js +10 -1
  209. package/dist/sdk/permission-validation.js.map +1 -1
  210. package/dist/sdk/types.d.ts +29 -1
  211. package/dist/sdk/types.js.map +1 -1
  212. package/package.json +4 -1
  213. package/sdk/access-config.md +86 -4
  214. package/sdk/adapter-contract.md +7 -13
  215. package/sdk/additional-harnesses.md +43 -0
  216. package/sdk/agent-skill.md +7 -4
  217. package/sdk/agent.md +5 -3
  218. package/sdk/approvals.md +120 -0
  219. package/sdk/authentication.md +1 -1
  220. package/sdk/cli/dashboard-design.md +44 -4
  221. package/sdk/cli/dashboard-inspection.md +25 -0
  222. package/sdk/cli/index.md +20 -11
  223. package/sdk/cli/output.md +10 -4
  224. package/sdk/completion-notifications.md +2 -0
  225. package/sdk/config.md +1 -1
  226. package/sdk/copilot.md +53 -0
  227. package/sdk/cursor.md +68 -0
  228. package/sdk/diagnostics.md +29 -0
  229. package/sdk/distribution.md +53 -1
  230. package/sdk/evals.md +10 -4
  231. package/sdk/fx.md +51 -6
  232. package/sdk/harnesses.md +13 -13
  233. package/sdk/index.md +4 -2
  234. package/sdk/message-delivery.md +1 -1
  235. package/sdk/opencode.md +57 -0
  236. package/sdk/permissions.md +7 -5
  237. package/sdk/pr-integration.md +1 -1
  238. package/sdk/project-team.md +2 -0
  239. package/sdk/sessions.md +4 -1
  240. package/sdk/tools.md +1 -1
  241. package/sdk/v1-runtime.md +6 -6
@@ -4,12 +4,15 @@ import { AgentError, errorInfo } from '../errors.js';
4
4
  import { terminal } from './types.js';
5
5
  import { dashboardHarness, dashboardTitle } from './dashboard.js';
6
6
  import { resolveDashboardWorkspace } from './dashboard-workspace.js';
7
+ import { ApprovalRegistry } from './approval-registry.js';
7
8
  export class Coordinator {
8
9
  factory;
9
10
  now;
10
11
  sessions = new Map();
11
12
  tasks = new Map();
12
13
  dashboardHistory;
14
+ closed = false;
15
+ approvals = new ApprovalRegistry(id => this.approvalChanged(this.task(id)));
13
16
  constructor(factory, now = Date.now) {
14
17
  this.factory = factory;
15
18
  this.now = now;
@@ -81,6 +84,10 @@ export class Coordinator {
81
84
  return { version: 1, type: 'terminal', taskId: id,
82
85
  sessionId: task.sessionId, state: task.state, ...(task.error ? { error: task.error } : {}) };
83
86
  }
87
+ const requests = this.pendingApprovals(task);
88
+ if (requests.length)
89
+ return { version: 1, type: 'approval_required', taskId: id,
90
+ sessionId: task.sessionId, state: task.state, requests };
84
91
  await waitForChange(task.changed, signal);
85
92
  }
86
93
  }
@@ -93,12 +100,32 @@ export class Coordinator {
93
100
  }
94
101
  status(id, full = false) {
95
102
  const task = this.task(id), response = task.responses.at(-1);
103
+ const requests = this.pendingApprovals(task);
96
104
  return { version: 1, type: 'status', taskId: id, sessionId: task.sessionId, state: task.state,
105
+ ...(requests.length ? { requests } : {}),
97
106
  ...(task.error ? { error: task.error } : {}), ...(response ? { response: {
98
107
  responseId: response.responseId, text: full ? response.text : response.text.slice(0, 4000),
99
108
  truncated: !full && response.text.length > 4000
100
109
  } } : {}) };
101
110
  }
111
+ respond(id, content, parentToken) {
112
+ const request = this.approvals.request(id);
113
+ if (parentToken !== undefined) {
114
+ let caller;
115
+ try {
116
+ caller = this.parentContext(parentToken).taskId;
117
+ }
118
+ catch {
119
+ throw new AgentError('INVALID_APPROVAL_OWNER', 'The caller cannot answer this permission request.');
120
+ }
121
+ let ancestor = this.task(request.taskId).parentId;
122
+ while (ancestor && ancestor !== caller)
123
+ ancestor = this.task(ancestor).parentId;
124
+ if (!ancestor)
125
+ throw new AgentError('INVALID_APPROVAL_OWNER', 'Only an active strict ancestor can answer this permission request.');
126
+ }
127
+ return this.approvals.respond(id, content);
128
+ }
102
129
  async dashboard() {
103
130
  // New sessions join the next snapshot; every serialized row has resolved context.
104
131
  const admitted = [...this.sessions.values()];
@@ -117,13 +144,75 @@ export class Coordinator {
117
144
  .sort((first, second) => second.finishedAt - first.finishedAt);
118
145
  const visible = new Set(current.map(task => task.id));
119
146
  const tasks = [...current, ...this.dashboardHistory.filter(task => workspaces.has(task.sessionId) && !visible.has(task.id))];
120
- const sessions = tasks.map(task => ({ sessionId: task.sessionId, taskId: task.id,
147
+ const sessions = tasks.map(task => this.dashboardRow(task, workspaces.get(task.sessionId)));
148
+ return { version: 1, type: 'dashboard', history: true, grouping: true, sessions };
149
+ }
150
+ async dashboardDetail(id, includePrompt = true, knownResponseId) {
151
+ const task = this.task(id);
152
+ const session = this.session(task.sessionId);
153
+ const workspace = await session.workspace;
154
+ const response = task.responses.at(-1);
155
+ return {
156
+ version: 1,
157
+ type: 'dashboard-detail',
158
+ task: this.dashboardRow(task, workspace),
159
+ ...(includePrompt ? { prompt: task.prompt } : {}),
160
+ ...(response ? { response: {
161
+ responseId: response.responseId,
162
+ ...(response.responseId === knownResponseId ? {} : { text: response.text }),
163
+ } } : {}),
164
+ ...(task.error ? { error: task.error } : {}),
165
+ children: [...task.children].map(childId => this.dashboardRelatedTask(this.task(childId))),
166
+ queue: {
167
+ paused: session.paused,
168
+ tasks: session.tasks.map(taskId => this.dashboardRelatedTask(this.task(taskId))),
169
+ },
170
+ stopUnconfirmed: task.stopUnconfirmed ?? false,
171
+ };
172
+ }
173
+ async dashboardSession(id) {
174
+ const session = this.session(this.task(id).sessionId);
175
+ const workspace = await session.workspace;
176
+ // Collect all metadata after discovery, without another asynchronous boundary.
177
+ const retained = [...this.tasks.values()];
178
+ const tasks = retained.filter(task => task.sessionId === session.id);
179
+ const childIds = new Set(tasks.flatMap(task => [...task.children]));
180
+ const childSessions = new Set(retained.filter(task => childIds.has(task.id)).map(task => task.sessionId));
181
+ const latest = new Map();
182
+ const titles = new Map();
183
+ for (const task of retained) {
184
+ latest.set(task.sessionId, task.id);
185
+ if (!titles.has(task.sessionId))
186
+ titles.set(task.sessionId, task.title);
187
+ }
188
+ const representative = (candidate) => this.task(candidate.active ?? candidate.tasks[0]
189
+ ?? latest.get(candidate.id));
190
+ const requests = tasks.map((task, index) => ({ ...this.dashboardRow(task, workspace),
191
+ ordinal: index + 1, stopUnconfirmed: task.stopUnconfirmed ?? false }));
192
+ requests.sort((first, second) => Number(second.state === 'queued') - Number(first.state === 'queued')
193
+ || second.ordinal - first.ordinal);
194
+ return {
195
+ version: 1, type: 'dashboard-session', taskId: id, sessionId: session.id,
196
+ title: titles.get(session.id), harness: session.harness,
197
+ state: representative(session).state, workspace, requests,
198
+ subagents: [...childSessions].map(sessionId => {
199
+ const child = this.session(sessionId);
200
+ return { ...this.dashboardRelatedTask(representative(child)), title: titles.get(child.id) };
201
+ }),
202
+ queuePaused: session.paused,
203
+ };
204
+ }
205
+ dashboardRow(task, workspace) {
206
+ return { sessionId: task.sessionId, taskId: task.id,
121
207
  harness: this.session(task.sessionId).harness, title: task.title, state: task.state,
122
- workspace: workspaces.get(task.sessionId), updatedAt: task.updatedAt,
208
+ workspace, updatedAt: task.updatedAt,
123
209
  ...(task.dispatchedAt === undefined ? {} : { dispatchedAt: task.dispatchedAt }),
124
210
  ...(task.failedAt === undefined ? {} : { failedAt: task.failedAt }),
125
- ...(task.finishedAt === undefined ? {} : { finishedAt: task.finishedAt }) }));
126
- return { version: 1, type: 'dashboard', history: true, grouping: true, sessions };
211
+ ...(task.finishedAt === undefined ? {} : { finishedAt: task.finishedAt }) };
212
+ }
213
+ dashboardRelatedTask(task) {
214
+ return { taskId: task.id, sessionId: task.sessionId, harness: this.session(task.sessionId).harness,
215
+ title: task.title, state: task.state };
127
216
  }
128
217
  finish(task, state, at = this.now(), updatedAt = at) {
129
218
  task.state = state;
@@ -157,6 +246,11 @@ export class Coordinator {
157
246
  });
158
247
  }
159
248
  async close() {
249
+ this.closed = true;
250
+ for (const task of this.tasks.values())
251
+ if (!terminal(task.state))
252
+ task.stopping = true;
253
+ this.approvals.close();
160
254
  await Promise.allSettled([...this.sessions.values()].map(async (session) => (await session.driver)?.close()));
161
255
  }
162
256
  async cancel(id) {
@@ -195,6 +289,7 @@ export class Coordinator {
195
289
  async finishStop(task, outcome) {
196
290
  const session = this.session(task.sessionId);
197
291
  task.stopping = true;
292
+ this.approvals.retireTask(task.id);
198
293
  session.tasks = session.tasks.filter(id => id !== task.id);
199
294
  try {
200
295
  const stops = [...task.children].map(id => this.task(id)).filter(child => !terminal(child.state) || child.stopUnconfirmed).map(child => this.stop(child, 'cancelled'));
@@ -244,6 +339,8 @@ export class Coordinator {
244
339
  ...(blockedByTaskId ? { paused: true, blockedByTaskId } : {}) };
245
340
  }
246
341
  validateAdmission(session, prompt, parentToken, replacement = false) {
342
+ if (this.closed)
343
+ throw new AgentError('COORDINATOR_UNAVAILABLE', 'The coordinator is shutting down.');
247
344
  if (typeof prompt !== 'string' || !prompt.trim() || Buffer.byteLength(prompt) > 1024 * 1024)
248
345
  throw new AgentError('INVALID_ARGUMENT', 'Prompt must contain text and cannot exceed 1 MiB.');
249
346
  if (!replacement && session && session.tasks.length >= 100)
@@ -261,7 +358,7 @@ export class Coordinator {
261
358
  return parent;
262
359
  }
263
360
  dispatch(session) {
264
- if (session.active || session.paused || session.controls)
361
+ if (this.closed || session.active || session.paused || session.controls)
265
362
  return;
266
363
  const id = session.tasks.shift();
267
364
  if (!id)
@@ -277,7 +374,13 @@ export class Coordinator {
277
374
  task.state = 'running';
278
375
  task.nativeActive = true;
279
376
  try {
280
- session.driver ??= this.factory({ ...session.input, sessionId: session.id, token: session.token });
377
+ session.driver ??= this.factory({ ...session.input, sessionId: session.id, token: session.token,
378
+ onApproval: async (request, signal) => {
379
+ const active = session.active ? this.task(session.active) : undefined;
380
+ if (this.closed || !active || active.stopping || !active.nativeActive || terminal(active.state))
381
+ throw new AgentError('REQUEST_EXPIRED', 'The native permission request is no longer pending.');
382
+ return this.approvals.register(active.id, session.id, request, signal);
383
+ } });
281
384
  const driver = await session.driver;
282
385
  if (driver.selectedHarness) {
283
386
  const harness = dashboardHarness(driver.selectedHarness);
@@ -289,6 +392,7 @@ export class Coordinator {
289
392
  if (task.stopping)
290
393
  return;
291
394
  const text = recovering ? await driver.resume() : await driver.turn(prompt);
395
+ this.approvals.retireTask(task.id);
292
396
  if (task.stopping)
293
397
  return;
294
398
  if (Buffer.byteLength(text) > 1024 * 1024)
@@ -312,6 +416,7 @@ export class Coordinator {
312
416
  this.continueParent(task);
313
417
  }
314
418
  catch (error) {
419
+ this.approvals.retireTask(task.id);
315
420
  if (task.stopping)
316
421
  return;
317
422
  task.failedAt = this.now();
@@ -350,6 +455,19 @@ export class Coordinator {
350
455
  void this.execute(task, prompt);
351
456
  }
352
457
  touch(task, at = this.now()) { task.updatedAt = at; }
458
+ pendingApprovals(task) {
459
+ return [...this.approvals.pendingFor(task.id), ...[...task.children].flatMap(id => this.pendingApprovals(this.task(id)))];
460
+ }
461
+ approvalChanged(task) {
462
+ if (!task.stopping && task.nativeActive)
463
+ task.state = this.approvals.pendingFor(task.id).length ? 'awaiting_approval' : 'running';
464
+ this.touch(task);
465
+ let current = task;
466
+ while (current) {
467
+ this.notify(current);
468
+ current = current.parentId ? this.task(current.parentId) : undefined;
469
+ }
470
+ }
353
471
  notify(task) { for (const resolve of task.changed)
354
472
  resolve(); task.changed.clear(); }
355
473
  task(id) { const task = this.tasks.get(id); if (!task)
@@ -1 +1 @@
1
- {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/runtime/coordinator.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { waitForChange } from './observation.js';\nimport { AgentError, errorInfo } from '../errors.js';\nimport { terminal, type DriverFactory, type Observation, type Receipt, type Session, type SessionInput, type Task, type Delivery } from './types.js';\nimport { dashboardHarness, dashboardTitle, type DashboardSnapshot } from './dashboard.js';\nimport { resolveDashboardWorkspace } from './dashboard-workspace.js';\n\nexport class Coordinator {\n private sessions = new Map<string, Session>();\n private tasks = new Map<string, Task>();\n private dashboardHistory?: Task[];\n constructor(private readonly factory: DriverFactory, private readonly now: () => number = Date.now) {}\n\n parentContext(token: string) {\n const session = [...this.sessions.values()].find(session => session.token === token);\n const task = session?.active ? this.task(session.active) : undefined;\n if (!session || !task || task.stopping || terminal(task.state))\n throw new AgentError('INVALID_PARENT', 'The parent context is no longer active.');\n return {taskId: task.id, reference: session.input.reference, cwd: session.input.cwd};\n }\n\n run(input: SessionInput): Receipt {\n this.validateAdmission(undefined, input.prompt, input.parentToken);\n const selected = 'kind' in input.reference ? input.reference.harness.kind : undefined;\n const session: Session = { id: `ses_${randomUUID()}`, token: randomUUID(), input,\n tasks: [], paused: false, commands: Promise.resolve(), controls: 0, harness: dashboardHarness(selected),\n workspace: resolveDashboardWorkspace(input.cwd) };\n this.sessions.set(session.id, session);\n return this.admit(session, input.prompt, false, input.parentToken);\n }\n\n async send(id: string, prompt: string, delivery: Delivery, parentToken?: string): Promise<Receipt> {\n const session = this.session(id);\n const operation = async (): Promise<Receipt> => {\n if (!['queue', 'steer', 'interrupt'].includes(delivery)) throw new AgentError('INVALID_ARGUMENT', 'Unknown delivery mode.');\n this.validateAdmission(session, prompt, parentToken, delivery !== 'queue');\n if (delivery === 'queue') return this.admit(session, prompt, false, parentToken);\n const task = session.active ? this.task(session.active) : undefined;\n if (delivery === 'steer') {\n if (!task || terminal(task.state) || task.stopping) throw new AgentError('NO_ACTIVE_TASK', 'There is no active task accepting steering.');\n if (!task.nativeActive) {\n void this.execute(task, prompt);\n return {version: 1, type: 'accepted', sessionId: id, taskId: task.id, delivery: 'steer'};\n }\n try {\n await (await session.driver!).steer(prompt);\n this.touch(task);\n return {version: 1, type: 'accepted', sessionId: id, taskId: task.id, delivery: 'steer'};\n } catch (error) {\n if (!(error instanceof AgentError) || error.code !== 'UNSUPPORTED_DELIVERY') throw error;\n }\n }\n if (task && (!terminal(task.state) || task.stopUnconfirmed || task.state === 'failed')) await this.stop(task, 'interrupted');\n session.paused = false;\n const receipt = this.admit(session, prompt, true, parentToken);\n return {...receipt, requestedDelivery: delivery, delivery: 'interrupt'};\n };\n return this.command(session, operation);\n }\n\n async observe(id: string, after?: string, readerToken?: string, signal?: AbortSignal): Promise<Observation> {\n const task = this.task(id);\n const position = after ? task.responses.findIndex(response => response.responseId === after) : -1;\n if (after && position === -1) throw new AgentError('UNKNOWN_RESPONSE', 'The response does not belong to this task.');\n for (;;) {\n const response = task.responses[position + 1];\n if (response) {\n if (terminal(response.state)) this.acknowledge(task, readerToken);\n return response;\n }\n if (terminal(task.state)) {\n this.acknowledge(task, readerToken);\n return { version: 1, type: 'terminal', taskId: id,\n sessionId: task.sessionId, state: task.state, ...(task.error ? {error:task.error} : {}) };\n }\n await waitForChange(task.changed, signal);\n }\n }\n\n private acknowledge(task: Task, readerToken?: string) {\n if (!readerToken || !task.parentId || task.stopUnconfirmed) return;\n const parent = this.task(task.parentId);\n if (this.session(parent.sessionId).token === readerToken && parent.nativeActive)\n parent.inbox = parent.inbox.filter(result => result.taskId !== task.id);\n }\n\n status(id: string, full = false) {\n const task = this.task(id), response = task.responses.at(-1);\n return { version: 1, type: 'status', taskId: id, sessionId: task.sessionId, state: task.state,\n ...(task.error ? {error: task.error} : {}), ...(response ? { response: {\n responseId: response.responseId, text: full ? response.text : response.text.slice(0, 4000),\n truncated: !full && response.text.length > 4000 }} : {}) };\n }\n\n async dashboard(): Promise<DashboardSnapshot> {\n // New sessions join the next snapshot; every serialized row has resolved context.\n const admitted = [...this.sessions.values()];\n const workspaces = new Map(await Promise.all(admitted.map(async session =>\n [session.id, await session.workspace] as const)));\n const current: Task[] = [];\n for (const session of admitted) {\n const id = session.active ?? session.tasks[0];\n if (!id) continue;\n const task = this.task(id);\n if (task.state === 'failed' || !terminal(task.state)) current.push(task);\n }\n // Map insertion order records admission order; stable sorting preserves its reversed ties.\n this.dashboardHistory ??= [...this.tasks.values()].reverse().filter(task => terminal(task.state))\n .sort((first, second) => second.finishedAt! - first.finishedAt!);\n const visible = new Set(current.map(task => task.id));\n const tasks = [...current, ...this.dashboardHistory.filter(task => workspaces.has(task.sessionId) && !visible.has(task.id))];\n const sessions = tasks.map(task => ({sessionId: task.sessionId, taskId: task.id,\n harness: this.session(task.sessionId).harness, title: task.title, state: task.state,\n workspace: workspaces.get(task.sessionId)!, updatedAt: task.updatedAt,\n ...(task.dispatchedAt === undefined ? {} : {dispatchedAt: task.dispatchedAt}),\n ...(task.failedAt === undefined ? {} : {failedAt: task.failedAt}),\n ...(task.finishedAt === undefined ? {} : {finishedAt: task.finishedAt})}));\n return {version: 1, type: 'dashboard', history: true, grouping: true, sessions};\n }\n\n private finish(task: Task, state: 'completed' | 'failed' | 'cancelled' | 'interrupted', at = this.now(), updatedAt = at) {\n task.state = state;\n task.finishedAt = at;\n task.updatedAt = updatedAt;\n this.dashboardHistory = undefined;\n }\n\n queue(id: string) {\n const session = this.session(id);\n const summary = (task: Task) => ({taskId: task.id, state: task.state, description: task.prompt.slice(0, 120)});\n return {version: 1, type: 'queue', sessionId: id, paused: session.paused,\n ...(session.active ? {active: summary(this.task(session.active))} : {}),\n tasks: session.tasks.map(id => summary(this.task(id)))};\n }\n\n async resume(id: string): Promise<Receipt> {\n const session = this.session(id);\n return this.command(session, async () => {\n const task = session.active ? this.task(session.active) : undefined;\n if (!task || task.state !== 'failed') throw new AgentError('NOT_FAILED', 'This session has no failed task to resume.');\n if (task.stopUnconfirmed || task.stopPromise) throw new AgentError('CANCEL_FAILED', 'Confirm cancellation of the affected executions before recovery.');\n task.stopping = false; task.error = undefined; task.failedAt = undefined; task.finishedAt = undefined; session.paused = false;\n this.dashboardHistory = undefined;\n void this.execute(task, '', true);\n return {version: 1, type: 'started', sessionId: id, taskId: task.id, state: task.state, resumed: true};\n });\n }\n\n async close() {\n await Promise.allSettled([...this.sessions.values()].map(async session => (await session.driver)?.close()));\n }\n\n async cancel(id: string): Promise<Receipt> {\n const task = this.task(id);\n return this.command(this.session(task.sessionId), async () => {\n if (!terminal(task.state) || task.stopUnconfirmed) await this.stop(task, 'cancelled');\n else if (task.state === 'failed') {\n const session = this.session(task.sessionId);\n if (session.active === task.id) { session.active = undefined; session.paused = false; }\n }\n return {version: 1, type: 'cancelled', taskId: id, sessionId: task.sessionId, state: task.state};\n });\n }\n\n private command<T>(session: Session, operation: () => Promise<T>): Promise<T> {\n session.controls++;\n const result = session.commands.then(operation, operation).finally(() => {\n session.controls--;\n this.dispatch(session);\n });\n session.commands = result.catch(() => undefined);\n return result;\n }\n\n private stop(task: Task, outcome: 'cancelled' | 'interrupted'): Promise<void> {\n if (task.stopPromise) return task.stopPromise;\n task.stopPromise = this.finishStop(task, outcome).finally(() => {\n task.stopPromise = undefined;\n this.dispatch(this.session(task.sessionId));\n });\n return task.stopPromise;\n }\n\n private async finishStop(task: Task, outcome: 'cancelled' | 'interrupted') {\n const session = this.session(task.sessionId);\n task.stopping = true;\n session.tasks = session.tasks.filter(id => id !== task.id);\n try {\n const stops = [...task.children].map(id => this.task(id)).filter(child => !terminal(child.state) || child.stopUnconfirmed).map(child => this.stop(child, 'cancelled'));\n if (task.nativeActive && session.driver) stops.push(session.driver.then(async driver => {\n await driver.interrupt(); task.nativeActive = false;\n }));\n const outcomes = await Promise.allSettled(stops);\n if (outcomes.some(outcome => outcome.status === 'rejected')) throw new Error('Cancellation unconfirmed');\n } catch {\n task.failedAt = this.now();\n this.finish(task, 'failed', task.failedAt); task.error = {code:'CANCEL_FAILED', message:'Native execution could not be confirmed stopped.'};\n task.stopUnconfirmed = true;\n session.paused = true; this.notify(task);\n throw new AgentError('CANCEL_FAILED', task.error.message);\n }\n task.nativeActive = false; this.finish(task, outcome); task.stopUnconfirmed = false; task.error = undefined;\n if (session.active === task.id) { session.active = undefined; session.paused = false; }\n this.notify(task); this.deliver(task);\n }\n\n private admit(session: Session, prompt: string, front = false, parentToken?: string): Receipt {\n const parent = this.validateAdmission(session, prompt, parentToken, front);\n const blockedByTaskId = session.paused ? session.active : undefined;\n const task: Task = { id: `tsk_${randomUUID()}`, sessionId: session.id, prompt, title: dashboardTitle(prompt),\n parentId: parent?.id, state: 'queued', responses: [], children: new Set(), inbox: [], nativeActive: false,\n stopping: false, updatedAt: this.now(), changed: new Set() };\n this.tasks.set(task.id, task);\n parent?.children.add(task.id);\n if (front) session.tasks.unshift(task.id); else session.tasks.push(task.id);\n this.dispatch(session);\n return {version: 1, type: 'started', sessionId: session.id, taskId: task.id, state: task.state,\n ...(blockedByTaskId ? {paused: true, blockedByTaskId} : {})};\n }\n\n private validateAdmission(session: Session | undefined, prompt: string, parentToken?: string, replacement = false) {\n if (typeof prompt !== 'string' || !prompt.trim() || Buffer.byteLength(prompt) > 1024 * 1024)\n throw new AgentError('INVALID_ARGUMENT', 'Prompt must contain text and cannot exceed 1 MiB.');\n if (!replacement && session && session.tasks.length >= 100) throw new AgentError('QUEUE_FULL', 'The session already has 100 queued tasks.');\n const parent = parentToken ? this.task(this.parentContext(parentToken).taskId) : undefined;\n let depth = 0, ancestor = parent;\n while (ancestor) {\n if (ancestor.sessionId === session?.id) throw new AgentError('INVALID_PARENT', 'A managed task cannot queue work in its own or an ancestor session.');\n depth++; ancestor = ancestor.parentId ? this.task(ancestor.parentId) : undefined;\n }\n if (depth > 8) throw new AgentError('DELEGATION_LIMIT', 'Maximum delegation depth is 8.');\n return parent;\n }\n\n private dispatch(session: Session) {\n if (session.active || session.paused || session.controls) return;\n const id = session.tasks.shift();\n if (!id) return;\n session.active = id;\n void this.execute(this.task(id), this.task(id).prompt);\n }\n\n private async execute(task: Task, prompt: string, recovering = false) {\n const session = this.session(task.sessionId);\n const dispatchedAt = this.now();\n task.dispatchedAt ??= dispatchedAt;\n this.touch(task, dispatchedAt);\n task.state = 'running'; task.nativeActive = true;\n try {\n session.driver ??= this.factory({...session.input, sessionId: session.id, token: session.token});\n const driver = await session.driver;\n if (driver.selectedHarness) {\n const harness = dashboardHarness(driver.selectedHarness);\n if (session.harness !== harness) { session.harness = harness; this.touch(task); }\n }\n if (task.stopping) return;\n const text = recovering ? await driver.resume() : await driver.turn(prompt);\n if (task.stopping) return;\n if (Buffer.byteLength(text) > 1024 * 1024) throw new AgentError('OUTPUT_TOO_LARGE', 'The response exceeds 1 MiB.');\n task.nativeActive = false;\n task.state = this.pending(task) ? 'waiting' : 'completed';\n const respondedAt = this.now();\n if (task.state === 'completed') this.finish(task, 'completed', respondedAt);\n else this.touch(task, respondedAt);\n task.responses.push({version: 1, type: 'response', sessionId: session.id, taskId: task.id,\n responseId: `rsp_${randomUUID()}`, state: task.state, text});\n this.notify(task);\n if (task.state === 'completed') {\n session.active = undefined;\n this.deliver(task);\n this.dispatch(session);\n } else this.continueParent(task);\n } catch (error) {\n if (task.stopping) return;\n task.failedAt = this.now();\n task.nativeActive = false;\n task.stopping = true;\n const stopped = await Promise.allSettled([...task.children].map(id => this.task(id)).filter(child => !terminal(child.state) || child.stopUnconfirmed).map(child => this.stop(child, 'cancelled')));\n task.stopUnconfirmed = stopped.some(result => result.status === 'rejected');\n this.finish(task, 'failed', task.failedAt, this.now()); task.error = task.stopUnconfirmed\n ? {code:'CANCEL_FAILED', message:'Descendant execution could not be confirmed stopped.'} : errorInfo(error);\n session.paused = true; this.notify(task); this.deliver(task);\n }\n }\n\n private pending(task: Task) {\n return task.inbox.length > 0 || [...task.children].some(id => !terminal(this.task(id).state) || this.task(id).stopUnconfirmed);\n }\n\n private deliver(child: Task) {\n if (!child.parentId || child.stopUnconfirmed) return;\n const parent = this.task(child.parentId);\n if (parent.stopping || terminal(parent.state)) return;\n parent.inbox.push({taskId: child.id, state: child.state,\n text: child.error?.message ?? child.responses.at(-1)?.text ?? child.state});\n // Let an attached child command acknowledge delivery through its native tool output first.\n setImmediate(() => this.continueParent(parent));\n }\n\n private continueParent(task: Task) {\n if (task.nativeActive || task.stopping || terminal(task.state) || !task.inbox.length) return;\n const results = task.inbox.splice(0);\n const prompt = 'Delegated task outcomes (continue the current task):\\n' +\n results.map(result => `${result.taskId} [${result.state}]:\\n${result.text}`).join('\\n\\n');\n void this.execute(task, prompt);\n }\n\n private touch(task: Task, at = this.now()) { task.updatedAt = at; }\n private notify(task: Task) { for (const resolve of task.changed) resolve(); task.changed.clear(); }\n private task(id: string) { const task = this.tasks.get(id); if (!task) throw new AgentError('UNKNOWN_TASK', 'Task is unavailable in this coordinator.'); return task; }\n private session(id: string) { const session = this.sessions.get(id); if (!session) throw new AgentError('UNKNOWN_SESSION', 'Session is unavailable in this coordinator.'); return session; }\n}\n"]}
1
+ {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/runtime/coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAiH,MAAM,YAAY,CAAC;AACrJ,OAAO,EAAE,gBAAgB,EAAE,cAAc,EACoD,MAAM,gBAAgB,CAAC;AACpH,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,OAAO,WAAW;IAMO,OAAO;IAAkC,GAAG;IALjE,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IACtC,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;IAChC,gBAAgB,CAAU;IAC1B,MAAM,GAAG,KAAK,CAAC;IACf,SAAS,GAAG,IAAI,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpF,YAA6B,OAAsB,EAAmB,GAAG,GAAiB,IAAI,CAAC,GAAG;uBAArE,OAAO;mBAAkC,GAAG;IAA4B,CAAC;IAEtG,aAAa,CAAC,KAAa;QACzB,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QACrF,MAAM,IAAI,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrE,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YAC5D,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,yCAAyC,CAAC,CAAC;QACpF,OAAO,EAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,EAAC,CAAC;IACvF,CAAC;IAED,GAAG,CAAC,KAAmB;QACrB,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QACtF,MAAM,OAAO,GAAY,EAAE,EAAE,EAAE,OAAO,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK;YAC9E,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,gBAAgB,CAAC,QAAQ,CAAC;YACvG,SAAS,EAAE,yBAAyB,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAU,EAAE,MAAc,EAAE,QAAkB,EAAE,WAAoB;QAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,KAAK,IAAsB,EAAE;YAC7C,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,wBAAwB,CAAC,CAAC;YAC5H,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC;YAC3E,IAAI,QAAQ,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YACjF,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACpE,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ;oBAAE,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,6CAA6C,CAAC,CAAC;gBAC1I,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;oBACvB,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;oBAChC,OAAO,EAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAC,CAAC;gBAC3F,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,CAAC,MAAM,OAAO,CAAC,MAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC5C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACjB,OAAO,EAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAC,CAAC;gBAC3F,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB;wBAAE,MAAM,KAAK,CAAC;gBAC3F,CAAC;YACH,CAAC;YACD,IAAI,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC;gBAAE,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YAC7H,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;YACvB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YAC/D,OAAO,EAAC,GAAG,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAC,CAAC;QAC1E,CAAC,CAAC;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU,EAAE,KAAc,EAAE,WAAoB,EAAE,MAAoB;QAClF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClG,IAAI,KAAK,IAAI,QAAQ,KAAK,CAAC,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,4CAA4C,CAAC,CAAC;QACrH,SAAS,CAAC;YACR,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;YAC9C,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;gBAClE,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;gBACpC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE;oBAC/C,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAC,KAAK,EAAC,IAAI,CAAC,KAAK,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9F,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC7C,IAAI,QAAQ,CAAC,MAAM;gBAAE,OAAO,EAAC,OAAO,EAAC,CAAC,EAAC,IAAI,EAAC,mBAAmB,EAAC,MAAM,EAAC,EAAE;oBACvE,SAAS,EAAC,IAAI,CAAC,SAAS,EAAC,KAAK,EAAC,IAAI,CAAC,KAAK,EAAC,QAAQ,EAAC,CAAC;YACtD,MAAM,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,IAAU,EAAE,WAAoB;QAClD,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe;YAAE,OAAO;QACnE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,WAAW,IAAI,MAAM,CAAC,YAAY;YAC7E,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,IAAI,GAAG,KAAK;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC7C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK;YAC3F,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAC,QAAQ,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACtC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE;oBACrE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;oBAC1F,SAAS,EAAE,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI;iBAAE,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACjE,CAAC;IAED,OAAO,CAAC,EAAU,EAAE,OAAgB,EAAE,WAAoB;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3C,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,MAAc,CAAC;YACnB,IAAI,CAAC;gBAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;YAAC,CAAC;YACxD,MAAM,CAAC;gBAAC,MAAM,IAAI,UAAU,CAAC,wBAAwB,EAAC,mDAAmD,CAAC,CAAC;YAAC,CAAC;YAC7G,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC;YAClD,OAAO,QAAQ,IAAI,QAAQ,KAAK,MAAM;gBAAE,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC;YAChF,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,UAAU,CAAC,wBAAwB,EAAC,oEAAoE,CAAC,CAAC;QACrI,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,SAAS;QACb,kFAAkF;QAClF,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAC,OAAO,EAAC,EAAE,CACxE,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,SAAS,CAAU,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,OAAO,GAAW,EAAE,CAAC;QAC3B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,CAAC,EAAE;gBAAE,SAAS;YAClB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,CAAC;QACD,2FAA2F;QAC3F,IAAI,CAAC,gBAAgB,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC9F,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAW,GAAG,KAAK,CAAC,UAAW,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7H,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAE,CAAC,CAAC,CAAC;QAC7F,OAAO,EAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAC,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,EAAU,EAAE,aAAa,GAAG,IAAI,EAAE,eAAwB;QAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,OAAO;YACL,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC;YACxC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAC,QAAQ,EAAE;oBACxB,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,GAAG,CAAC,QAAQ,CAAC,UAAU,KAAK,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAC,CAAC;iBAC1E,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACR,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1C,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1F,KAAK,EAAE;gBACL,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;aACjF;YACD,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,KAAK;SAC/C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,EAAU;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC;QAC1C,+EAA+E;QAC/E,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAC1G,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,cAAc,GAAG,CAAC,SAAkB,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;eAC1F,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAE,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAC,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC;YACjF,OAAO,EAAE,KAAK,GAAG,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,KAAK,EAAC,CAAC,CAAC,CAAC;QACxE,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC;eAChG,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE;YACxE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO;YACxD,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ;YACzD,SAAS,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;gBAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACtC,OAAO,EAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAE,EAAC,CAAC;YAC7F,CAAC,CAAC;YACF,WAAW,EAAE,OAAO,CAAC,MAAM;SAC5B,CAAC;IACJ,CAAC;IAEO,YAAY,CAAC,IAAU,EAAE,SAA6B;QAC5D,OAAO,EAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;YAChD,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK;YACnF,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS;YACpC,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAC,YAAY,EAAE,IAAI,CAAC,YAAY,EAAC,CAAC;YAC7E,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAC,CAAC;YACjE,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAC,CAAC,EAAC,CAAC;IAC7E,CAAC;IAEO,oBAAoB,CAAC,IAAU;QACrC,OAAO,EAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO;YAC/F,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAC,CAAC;IAC1C,CAAC;IAEO,MAAM,CAAC,IAAU,EAAE,KAA2D,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,GAAG,EAAE;QACrH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,EAAU;QACd,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,CAAC,IAAU,EAAE,EAAE,CAAC,CAAC,EAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAC,CAAC,CAAC;QAC/G,OAAO,EAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM;YACtE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;YACtC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACpE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ;gBAAE,MAAM,IAAI,UAAU,CAAC,YAAY,EAAE,4CAA4C,CAAC,CAAC;YACvH,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,WAAW;gBAAE,MAAM,IAAI,UAAU,CAAC,eAAe,EAAE,kEAAkE,CAAC,CAAC;YACxJ,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YAAC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;YAAC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;YAC9H,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;YAClC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;YAClC,OAAO,EAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC;QACzG,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACxF,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAC,OAAO,EAAC,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC9G,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,EAAE;YAC3D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe;gBAAE,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;iBACjF,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC7C,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;oBAAC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;oBAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;gBAAC,CAAC;YACzF,CAAC;YACD,OAAO,EAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAC,CAAC;QACnG,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,OAAO,CAAI,OAAgB,EAAE,SAA2B;QAC9D,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACtE,OAAO,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,IAAI,CAAC,IAAU,EAAE,OAAoC;QAC3D,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC;QAC9C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YAC7D,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,IAAU,EAAE,OAAoC;QACvE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;YACvK,IAAI,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAC,MAAM,EAAC,EAAE;oBACrF,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;oBAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBACtD,CAAC,CAAC,CAAC,CAAC;YACJ,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACjD,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC3G,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAAC,IAAI,CAAC,KAAK,GAAG,EAAC,IAAI,EAAC,eAAe,EAAE,OAAO,EAAC,kDAAkD,EAAC,CAAC;YAC5I,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,IAAI,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAAC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QAC5G,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;YAAC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;YAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;QAAC,CAAC;QACvF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAEO,KAAK,CAAC,OAAgB,EAAE,MAAc,EAAE,KAAK,GAAG,KAAK,EAAE,WAAoB;QACjF,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;QAC3E,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,MAAM,IAAI,GAAS,EAAE,EAAE,EAAE,OAAO,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC;YAC1G,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK;YACzG,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;QAC/D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC9B,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;YAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,EAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK;YAC5F,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAC,MAAM,EAAE,IAAI,EAAE,eAAe,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAC,CAAC;IACjE,CAAC;IAEO,iBAAiB,CAAC,OAA4B,EAAE,MAAc,EAAE,WAAoB,EAAE,WAAW,GAAG,KAAK;QAC/G,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,UAAU,CAAC,yBAAyB,EAAC,mCAAmC,CAAC,CAAC;QACrG,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,IAAI;YACzF,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,mDAAmD,CAAC,CAAC;QAChG,IAAI,CAAC,WAAW,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG;YAAE,MAAM,IAAI,UAAU,CAAC,YAAY,EAAE,2CAA2C,CAAC,CAAC;QAC5I,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3F,IAAI,KAAK,GAAG,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;QACjC,OAAO,QAAQ,EAAE,CAAC;YAChB,IAAI,QAAQ,CAAC,SAAS,KAAK,OAAO,EAAE,EAAE;gBAAE,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,qEAAqE,CAAC,CAAC;YACtJ,KAAK,EAAE,CAAC;YAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACnF,CAAC;QACD,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,gCAAgC,CAAC,CAAC;QAC1F,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,QAAQ,CAAC,OAAgB;QAC/B,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ;YAAE,OAAO;QAChF,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC;QACpB,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACzD,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,IAAU,EAAE,MAAc,EAAE,UAAU,GAAG,KAAK;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACjD,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,EAAC,GAAG,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK;gBAC5F,UAAU,EAAE,KAAK,EAAE,OAAO,EAAC,MAAM,EAAE,EAAE;oBACnC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBACtE,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;wBAC7F,MAAM,IAAI,UAAU,CAAC,iBAAiB,EAAC,qDAAqD,CAAC,CAAC;oBAChG,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAC,OAAO,CAAC,EAAE,EAAC,OAAO,EAAC,MAAM,CAAC,CAAC;gBACtE,CAAC,EAAC,CAAC,CAAC;YACN,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC;YACpC,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;gBAC3B,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBACzD,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;oBAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;oBAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAAC,CAAC;YACnF,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO;YAC1B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5E,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO;YAC1B,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;gBAAE,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,6BAA6B,CAAC,CAAC;YACnH,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;YAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW;gBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;;gBACvE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACnC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;gBACvF,UAAU,EAAE,OAAO,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClB,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;gBAC/B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC3B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACnB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;;gBAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO;YAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC3B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;YACnM,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;YAC5E,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,eAAe;gBACvF,CAAC,CAAC,EAAC,IAAI,EAAC,eAAe,EAAE,OAAO,EAAC,sDAAsD,EAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC9G,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAEO,OAAO,CAAC,IAAU;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;IACjI,CAAC;IAEO,OAAO,CAAC,KAAW;QACzB,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,eAAe;YAAE,OAAO;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,OAAO;QACtD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK;YACrD,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,KAAK,EAAC,CAAC,CAAC;QAC9E,2FAA2F;QAC3F,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IAEO,cAAc,CAAC,IAAU;QAC/B,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO;QAC7F,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,wDAAwD;YACrE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5F,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC;IAEO,KAAK,CAAC,IAAU,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC;IAC3D,gBAAgB,CAAC,IAAU;QACjC,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5H,CAAC;IACO,eAAe,CAAC,IAAU;QAChC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY;YAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC;QAClI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,OAAO,GAAqB,IAAI,CAAC;QACrC,OAAO,OAAO,EAAE,CAAC;YAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAAC,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAAC,CAAC;IACjH,CAAC;IACO,MAAM,CAAC,IAAU,IAAI,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3F,IAAI,CAAC,EAAU,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,UAAU,CAAC,cAAc,EAAE,0CAA0C,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IAC/J,OAAO,CAAC,EAAU,IAAI,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,UAAU,CAAC,iBAAiB,EAAE,6CAA6C,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC;CAC7L","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { waitForChange } from './observation.js';\nimport { AgentError, errorInfo } from '../errors.js';\nimport { terminal, type DriverFactory, type Observation, type Receipt, type Session, type SessionInput, type Task, type Delivery } from './types.js';\nimport { dashboardHarness, dashboardTitle, type DashboardDetail, type DashboardRelatedTask,\n type DashboardRow, type DashboardSession, type DashboardSnapshot, type DashboardWorkspace } from './dashboard.js';\nimport { resolveDashboardWorkspace } from './dashboard-workspace.js';\nimport { ApprovalRegistry } from './approval-registry.js';\n\nexport class Coordinator {\n private sessions = new Map<string, Session>();\n private tasks = new Map<string, Task>();\n private dashboardHistory?: Task[];\n private closed = false;\n private approvals = new ApprovalRegistry(id => this.approvalChanged(this.task(id)));\n constructor(private readonly factory: DriverFactory, private readonly now: () => number = Date.now) {}\n\n parentContext(token: string) {\n const session = [...this.sessions.values()].find(session => session.token === token);\n const task = session?.active ? this.task(session.active) : undefined;\n if (!session || !task || task.stopping || terminal(task.state))\n throw new AgentError('INVALID_PARENT', 'The parent context is no longer active.');\n return {taskId: task.id, reference: session.input.reference, cwd: session.input.cwd};\n }\n\n run(input: SessionInput): Receipt {\n this.validateAdmission(undefined, input.prompt, input.parentToken);\n const selected = 'kind' in input.reference ? input.reference.harness.kind : undefined;\n const session: Session = { id: `ses_${randomUUID()}`, token: randomUUID(), input,\n tasks: [], paused: false, commands: Promise.resolve(), controls: 0, harness: dashboardHarness(selected),\n workspace: resolveDashboardWorkspace(input.cwd) };\n this.sessions.set(session.id, session);\n return this.admit(session, input.prompt, false, input.parentToken);\n }\n\n async send(id: string, prompt: string, delivery: Delivery, parentToken?: string): Promise<Receipt> {\n const session = this.session(id);\n const operation = async (): Promise<Receipt> => {\n if (!['queue', 'steer', 'interrupt'].includes(delivery)) throw new AgentError('INVALID_ARGUMENT', 'Unknown delivery mode.');\n this.validateAdmission(session, prompt, parentToken, delivery !== 'queue');\n if (delivery === 'queue') return this.admit(session, prompt, false, parentToken);\n const task = session.active ? this.task(session.active) : undefined;\n if (delivery === 'steer') {\n if (!task || terminal(task.state) || task.stopping) throw new AgentError('NO_ACTIVE_TASK', 'There is no active task accepting steering.');\n if (!task.nativeActive) {\n void this.execute(task, prompt);\n return {version: 1, type: 'accepted', sessionId: id, taskId: task.id, delivery: 'steer'};\n }\n try {\n await (await session.driver!).steer(prompt);\n this.touch(task);\n return {version: 1, type: 'accepted', sessionId: id, taskId: task.id, delivery: 'steer'};\n } catch (error) {\n if (!(error instanceof AgentError) || error.code !== 'UNSUPPORTED_DELIVERY') throw error;\n }\n }\n if (task && (!terminal(task.state) || task.stopUnconfirmed || task.state === 'failed')) await this.stop(task, 'interrupted');\n session.paused = false;\n const receipt = this.admit(session, prompt, true, parentToken);\n return {...receipt, requestedDelivery: delivery, delivery: 'interrupt'};\n };\n return this.command(session, operation);\n }\n\n async observe(id: string, after?: string, readerToken?: string, signal?: AbortSignal): Promise<Observation> {\n const task = this.task(id);\n const position = after ? task.responses.findIndex(response => response.responseId === after) : -1;\n if (after && position === -1) throw new AgentError('UNKNOWN_RESPONSE', 'The response does not belong to this task.');\n for (;;) {\n const response = task.responses[position + 1];\n if (response) {\n if (terminal(response.state)) this.acknowledge(task, readerToken);\n return response;\n }\n if (terminal(task.state)) {\n this.acknowledge(task, readerToken);\n return { version: 1, type: 'terminal', taskId: id,\n sessionId: task.sessionId, state: task.state, ...(task.error ? {error:task.error} : {}) };\n }\n const requests = this.pendingApprovals(task);\n if (requests.length) return {version:1,type:'approval_required',taskId:id,\n sessionId:task.sessionId,state:task.state,requests};\n await waitForChange(task.changed, signal);\n }\n }\n\n private acknowledge(task: Task, readerToken?: string) {\n if (!readerToken || !task.parentId || task.stopUnconfirmed) return;\n const parent = this.task(task.parentId);\n if (this.session(parent.sessionId).token === readerToken && parent.nativeActive)\n parent.inbox = parent.inbox.filter(result => result.taskId !== task.id);\n }\n\n status(id: string, full = false) {\n const task = this.task(id), response = task.responses.at(-1);\n const requests = this.pendingApprovals(task);\n return { version: 1, type: 'status', taskId: id, sessionId: task.sessionId, state: task.state,\n ...(requests.length ? {requests} : {}),\n ...(task.error ? {error: task.error} : {}), ...(response ? { response: {\n responseId: response.responseId, text: full ? response.text : response.text.slice(0, 4000),\n truncated: !full && response.text.length > 4000 }} : {}) };\n }\n\n respond(id: string, content: unknown, parentToken?: string) {\n const request = this.approvals.request(id);\n if (parentToken !== undefined) {\n let caller: string;\n try { caller = this.parentContext(parentToken).taskId; }\n catch { throw new AgentError('INVALID_APPROVAL_OWNER','The caller cannot answer this permission request.'); }\n let ancestor = this.task(request.taskId).parentId;\n while (ancestor && ancestor !== caller) ancestor = this.task(ancestor).parentId;\n if (!ancestor) throw new AgentError('INVALID_APPROVAL_OWNER','Only an active strict ancestor can answer this permission request.');\n }\n return this.approvals.respond(id,content);\n }\n\n async dashboard(): Promise<DashboardSnapshot> {\n // New sessions join the next snapshot; every serialized row has resolved context.\n const admitted = [...this.sessions.values()];\n const workspaces = new Map(await Promise.all(admitted.map(async session =>\n [session.id, await session.workspace] as const)));\n const current: Task[] = [];\n for (const session of admitted) {\n const id = session.active ?? session.tasks[0];\n if (!id) continue;\n const task = this.task(id);\n if (task.state === 'failed' || !terminal(task.state)) current.push(task);\n }\n // Map insertion order records admission order; stable sorting preserves its reversed ties.\n this.dashboardHistory ??= [...this.tasks.values()].reverse().filter(task => terminal(task.state))\n .sort((first, second) => second.finishedAt! - first.finishedAt!);\n const visible = new Set(current.map(task => task.id));\n const tasks = [...current, ...this.dashboardHistory.filter(task => workspaces.has(task.sessionId) && !visible.has(task.id))];\n const sessions = tasks.map(task => this.dashboardRow(task, workspaces.get(task.sessionId)!));\n return {version: 1, type: 'dashboard', history: true, grouping: true, sessions};\n }\n\n async dashboardDetail(id: string, includePrompt = true, knownResponseId?: string): Promise<DashboardDetail> {\n const task = this.task(id);\n const session = this.session(task.sessionId);\n const workspace = await session.workspace;\n const response = task.responses.at(-1);\n return {\n version: 1,\n type: 'dashboard-detail',\n task: this.dashboardRow(task, workspace),\n ...(includePrompt ? {prompt: task.prompt} : {}),\n ...(response ? {response: {\n responseId: response.responseId,\n ...(response.responseId === knownResponseId ? {} : {text: response.text}),\n }} : {}),\n ...(task.error ? {error: task.error} : {}),\n children: [...task.children].map(childId => this.dashboardRelatedTask(this.task(childId))),\n queue: {\n paused: session.paused,\n tasks: session.tasks.map(taskId => this.dashboardRelatedTask(this.task(taskId))),\n },\n stopUnconfirmed: task.stopUnconfirmed ?? false,\n };\n }\n\n async dashboardSession(id: string): Promise<DashboardSession> {\n const session = this.session(this.task(id).sessionId);\n const workspace = await session.workspace;\n // Collect all metadata after discovery, without another asynchronous boundary.\n const retained = [...this.tasks.values()];\n const tasks = retained.filter(task => task.sessionId === session.id);\n const childIds = new Set(tasks.flatMap(task => [...task.children]));\n const childSessions = new Set(retained.filter(task => childIds.has(task.id)).map(task => task.sessionId));\n const latest = new Map<string, string>();\n const titles = new Map<string, string>();\n for (const task of retained) {\n latest.set(task.sessionId, task.id);\n if (!titles.has(task.sessionId)) titles.set(task.sessionId, task.title);\n }\n const representative = (candidate: Session) => this.task(candidate.active ?? candidate.tasks[0]\n ?? latest.get(candidate.id)!);\n const requests = tasks.map((task, index) => ({...this.dashboardRow(task, workspace),\n ordinal: index + 1, stopUnconfirmed: task.stopUnconfirmed ?? false}));\n requests.sort((first, second) => Number(second.state === 'queued') - Number(first.state === 'queued')\n || second.ordinal - first.ordinal);\n return {\n version: 1, type: 'dashboard-session', taskId: id, sessionId: session.id,\n title: titles.get(session.id)!, harness: session.harness,\n state: representative(session).state, workspace, requests,\n subagents: [...childSessions].map(sessionId => {\n const child = this.session(sessionId);\n return {...this.dashboardRelatedTask(representative(child)), title: titles.get(child.id)!};\n }),\n queuePaused: session.paused,\n };\n }\n\n private dashboardRow(task: Task, workspace: DashboardWorkspace): DashboardRow {\n return {sessionId: task.sessionId, taskId: task.id,\n harness: this.session(task.sessionId).harness, title: task.title, state: task.state,\n workspace, updatedAt: task.updatedAt,\n ...(task.dispatchedAt === undefined ? {} : {dispatchedAt: task.dispatchedAt}),\n ...(task.failedAt === undefined ? {} : {failedAt: task.failedAt}),\n ...(task.finishedAt === undefined ? {} : {finishedAt: task.finishedAt})};\n }\n\n private dashboardRelatedTask(task: Task): DashboardRelatedTask {\n return {taskId: task.id, sessionId: task.sessionId, harness: this.session(task.sessionId).harness,\n title: task.title, state: task.state};\n }\n\n private finish(task: Task, state: 'completed' | 'failed' | 'cancelled' | 'interrupted', at = this.now(), updatedAt = at) {\n task.state = state;\n task.finishedAt = at;\n task.updatedAt = updatedAt;\n this.dashboardHistory = undefined;\n }\n\n queue(id: string) {\n const session = this.session(id);\n const summary = (task: Task) => ({taskId: task.id, state: task.state, description: task.prompt.slice(0, 120)});\n return {version: 1, type: 'queue', sessionId: id, paused: session.paused,\n ...(session.active ? {active: summary(this.task(session.active))} : {}),\n tasks: session.tasks.map(id => summary(this.task(id)))};\n }\n\n async resume(id: string): Promise<Receipt> {\n const session = this.session(id);\n return this.command(session, async () => {\n const task = session.active ? this.task(session.active) : undefined;\n if (!task || task.state !== 'failed') throw new AgentError('NOT_FAILED', 'This session has no failed task to resume.');\n if (task.stopUnconfirmed || task.stopPromise) throw new AgentError('CANCEL_FAILED', 'Confirm cancellation of the affected executions before recovery.');\n task.stopping = false; task.error = undefined; task.failedAt = undefined; task.finishedAt = undefined; session.paused = false;\n this.dashboardHistory = undefined;\n void this.execute(task, '', true);\n return {version: 1, type: 'started', sessionId: id, taskId: task.id, state: task.state, resumed: true};\n });\n }\n\n async close() {\n this.closed = true;\n for (const task of this.tasks.values()) if (!terminal(task.state)) task.stopping = true;\n this.approvals.close();\n await Promise.allSettled([...this.sessions.values()].map(async session => (await session.driver)?.close()));\n }\n\n async cancel(id: string): Promise<Receipt> {\n const task = this.task(id);\n return this.command(this.session(task.sessionId), async () => {\n if (!terminal(task.state) || task.stopUnconfirmed) await this.stop(task, 'cancelled');\n else if (task.state === 'failed') {\n const session = this.session(task.sessionId);\n if (session.active === task.id) { session.active = undefined; session.paused = false; }\n }\n return {version: 1, type: 'cancelled', taskId: id, sessionId: task.sessionId, state: task.state};\n });\n }\n\n private command<T>(session: Session, operation: () => Promise<T>): Promise<T> {\n session.controls++;\n const result = session.commands.then(operation, operation).finally(() => {\n session.controls--;\n this.dispatch(session);\n });\n session.commands = result.catch(() => undefined);\n return result;\n }\n\n private stop(task: Task, outcome: 'cancelled' | 'interrupted'): Promise<void> {\n if (task.stopPromise) return task.stopPromise;\n task.stopPromise = this.finishStop(task, outcome).finally(() => {\n task.stopPromise = undefined;\n this.dispatch(this.session(task.sessionId));\n });\n return task.stopPromise;\n }\n\n private async finishStop(task: Task, outcome: 'cancelled' | 'interrupted') {\n const session = this.session(task.sessionId);\n task.stopping = true;\n this.approvals.retireTask(task.id);\n session.tasks = session.tasks.filter(id => id !== task.id);\n try {\n const stops = [...task.children].map(id => this.task(id)).filter(child => !terminal(child.state) || child.stopUnconfirmed).map(child => this.stop(child, 'cancelled'));\n if (task.nativeActive && session.driver) stops.push(session.driver.then(async driver => {\n await driver.interrupt(); task.nativeActive = false;\n }));\n const outcomes = await Promise.allSettled(stops);\n if (outcomes.some(outcome => outcome.status === 'rejected')) throw new Error('Cancellation unconfirmed');\n } catch {\n task.failedAt = this.now();\n this.finish(task, 'failed', task.failedAt); task.error = {code:'CANCEL_FAILED', message:'Native execution could not be confirmed stopped.'};\n task.stopUnconfirmed = true;\n session.paused = true; this.notify(task);\n throw new AgentError('CANCEL_FAILED', task.error.message);\n }\n task.nativeActive = false; this.finish(task, outcome); task.stopUnconfirmed = false; task.error = undefined;\n if (session.active === task.id) { session.active = undefined; session.paused = false; }\n this.notify(task); this.deliver(task);\n }\n\n private admit(session: Session, prompt: string, front = false, parentToken?: string): Receipt {\n const parent = this.validateAdmission(session, prompt, parentToken, front);\n const blockedByTaskId = session.paused ? session.active : undefined;\n const task: Task = { id: `tsk_${randomUUID()}`, sessionId: session.id, prompt, title: dashboardTitle(prompt),\n parentId: parent?.id, state: 'queued', responses: [], children: new Set(), inbox: [], nativeActive: false,\n stopping: false, updatedAt: this.now(), changed: new Set() };\n this.tasks.set(task.id, task);\n parent?.children.add(task.id);\n if (front) session.tasks.unshift(task.id); else session.tasks.push(task.id);\n this.dispatch(session);\n return {version: 1, type: 'started', sessionId: session.id, taskId: task.id, state: task.state,\n ...(blockedByTaskId ? {paused: true, blockedByTaskId} : {})};\n }\n\n private validateAdmission(session: Session | undefined, prompt: string, parentToken?: string, replacement = false) {\n if (this.closed) throw new AgentError('COORDINATOR_UNAVAILABLE','The coordinator is shutting down.');\n if (typeof prompt !== 'string' || !prompt.trim() || Buffer.byteLength(prompt) > 1024 * 1024)\n throw new AgentError('INVALID_ARGUMENT', 'Prompt must contain text and cannot exceed 1 MiB.');\n if (!replacement && session && session.tasks.length >= 100) throw new AgentError('QUEUE_FULL', 'The session already has 100 queued tasks.');\n const parent = parentToken ? this.task(this.parentContext(parentToken).taskId) : undefined;\n let depth = 0, ancestor = parent;\n while (ancestor) {\n if (ancestor.sessionId === session?.id) throw new AgentError('INVALID_PARENT', 'A managed task cannot queue work in its own or an ancestor session.');\n depth++; ancestor = ancestor.parentId ? this.task(ancestor.parentId) : undefined;\n }\n if (depth > 8) throw new AgentError('DELEGATION_LIMIT', 'Maximum delegation depth is 8.');\n return parent;\n }\n\n private dispatch(session: Session) {\n if (this.closed || session.active || session.paused || session.controls) return;\n const id = session.tasks.shift();\n if (!id) return;\n session.active = id;\n void this.execute(this.task(id), this.task(id).prompt);\n }\n\n private async execute(task: Task, prompt: string, recovering = false) {\n const session = this.session(task.sessionId);\n const dispatchedAt = this.now();\n task.dispatchedAt ??= dispatchedAt;\n this.touch(task, dispatchedAt);\n task.state = 'running'; task.nativeActive = true;\n try {\n session.driver ??= this.factory({...session.input, sessionId: session.id, token: session.token,\n onApproval: async (request,signal) => {\n const active = session.active ? this.task(session.active) : undefined;\n if (this.closed || !active || active.stopping || !active.nativeActive || terminal(active.state))\n throw new AgentError('REQUEST_EXPIRED','The native permission request is no longer pending.');\n return this.approvals.register(active.id,session.id,request,signal);\n }});\n const driver = await session.driver;\n if (driver.selectedHarness) {\n const harness = dashboardHarness(driver.selectedHarness);\n if (session.harness !== harness) { session.harness = harness; this.touch(task); }\n }\n if (task.stopping) return;\n const text = recovering ? await driver.resume() : await driver.turn(prompt);\n this.approvals.retireTask(task.id);\n if (task.stopping) return;\n if (Buffer.byteLength(text) > 1024 * 1024) throw new AgentError('OUTPUT_TOO_LARGE', 'The response exceeds 1 MiB.');\n task.nativeActive = false;\n task.state = this.pending(task) ? 'waiting' : 'completed';\n const respondedAt = this.now();\n if (task.state === 'completed') this.finish(task, 'completed', respondedAt);\n else this.touch(task, respondedAt);\n task.responses.push({version: 1, type: 'response', sessionId: session.id, taskId: task.id,\n responseId: `rsp_${randomUUID()}`, state: task.state, text});\n this.notify(task);\n if (task.state === 'completed') {\n session.active = undefined;\n this.deliver(task);\n this.dispatch(session);\n } else this.continueParent(task);\n } catch (error) {\n this.approvals.retireTask(task.id);\n if (task.stopping) return;\n task.failedAt = this.now();\n task.nativeActive = false;\n task.stopping = true;\n const stopped = await Promise.allSettled([...task.children].map(id => this.task(id)).filter(child => !terminal(child.state) || child.stopUnconfirmed).map(child => this.stop(child, 'cancelled')));\n task.stopUnconfirmed = stopped.some(result => result.status === 'rejected');\n this.finish(task, 'failed', task.failedAt, this.now()); task.error = task.stopUnconfirmed\n ? {code:'CANCEL_FAILED', message:'Descendant execution could not be confirmed stopped.'} : errorInfo(error);\n session.paused = true; this.notify(task); this.deliver(task);\n }\n }\n\n private pending(task: Task) {\n return task.inbox.length > 0 || [...task.children].some(id => !terminal(this.task(id).state) || this.task(id).stopUnconfirmed);\n }\n\n private deliver(child: Task) {\n if (!child.parentId || child.stopUnconfirmed) return;\n const parent = this.task(child.parentId);\n if (parent.stopping || terminal(parent.state)) return;\n parent.inbox.push({taskId: child.id, state: child.state,\n text: child.error?.message ?? child.responses.at(-1)?.text ?? child.state});\n // Let an attached child command acknowledge delivery through its native tool output first.\n setImmediate(() => this.continueParent(parent));\n }\n\n private continueParent(task: Task) {\n if (task.nativeActive || task.stopping || terminal(task.state) || !task.inbox.length) return;\n const results = task.inbox.splice(0);\n const prompt = 'Delegated task outcomes (continue the current task):\\n' +\n results.map(result => `${result.taskId} [${result.state}]:\\n${result.text}`).join('\\n\\n');\n void this.execute(task, prompt);\n }\n\n private touch(task: Task, at = this.now()) { task.updatedAt = at; }\n private pendingApprovals(task: Task): import('./types.js').ApprovalRequest[] {\n return [...this.approvals.pendingFor(task.id), ...[...task.children].flatMap(id => this.pendingApprovals(this.task(id)))];\n }\n private approvalChanged(task: Task) {\n if (!task.stopping && task.nativeActive) task.state = this.approvals.pendingFor(task.id).length ? 'awaiting_approval' : 'running';\n this.touch(task);\n let current: Task | undefined = task;\n while (current) { this.notify(current); current = current.parentId ? this.task(current.parentId) : undefined; }\n }\n private notify(task: Task) { for (const resolve of task.changed) resolve(); task.changed.clear(); }\n private task(id: string) { const task = this.tasks.get(id); if (!task) throw new AgentError('UNKNOWN_TASK', 'Task is unavailable in this coordinator.'); return task; }\n private session(id: string) { const session = this.sessions.get(id); if (!session) throw new AgentError('UNKNOWN_SESSION', 'Session is unavailable in this coordinator.'); return session; }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ /** Removes terminal instructions while retaining whitespace for the caller to normalize. */
2
+ export declare function sanitizeDashboardTerminalText(text: string): string;
@@ -0,0 +1,7 @@
1
+ import stripAnsi from 'strip-ansi';
2
+ const unsafeControls = /[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f]/gu;
3
+ /** Removes terminal instructions while retaining whitespace for the caller to normalize. */
4
+ export function sanitizeDashboardTerminalText(text) {
5
+ return stripAnsi(text).replace(unsafeControls, '');
6
+ }
7
+ //# sourceMappingURL=dashboard-sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-sanitize.js","sourceRoot":"","sources":["../../src/runtime/dashboard-sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,MAAM,cAAc,GAAG,yDAAyD,CAAC;AAEjF,4FAA4F;AAC5F,MAAM,UAAU,6BAA6B,CAAC,IAAY;IACxD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AACrD,CAAC","sourcesContent":["import stripAnsi from 'strip-ansi';\n\nconst unsafeControls = /[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f-\\u009f]/gu;\n\n/** Removes terminal instructions while retaining whitespace for the caller to normalize. */\nexport function sanitizeDashboardTerminalText(text: string): string {\n return stripAnsi(text).replace(unsafeControls, '');\n}\n"]}
@@ -1,6 +1,7 @@
1
+ import type { ErrorInfo } from '../errors.js';
1
2
  import type { HarnessKind } from '../sdk/types.js';
2
3
  import type { TaskState } from './types.js';
3
- export type DashboardHarness = 'codex' | 'claude' | 'fx' | 'pending';
4
+ export type DashboardHarness = 'codex' | 'claude' | 'fx' | 'opencode' | 'copilot' | 'cursor' | 'pending';
4
5
  export interface DashboardWorkspace {
5
6
  directory: string;
6
7
  repository?: string;
@@ -24,5 +25,46 @@ export interface DashboardSnapshot {
24
25
  grouping: true;
25
26
  sessions: DashboardRow[];
26
27
  }
28
+ export interface DashboardRelatedTask {
29
+ taskId: string;
30
+ sessionId: string;
31
+ harness: DashboardHarness;
32
+ title: string;
33
+ state: TaskState;
34
+ }
35
+ export interface DashboardRequest extends DashboardRow {
36
+ ordinal: number;
37
+ stopUnconfirmed: boolean;
38
+ }
39
+ export interface DashboardSession {
40
+ version: 1;
41
+ type: 'dashboard-session';
42
+ taskId: string;
43
+ sessionId: string;
44
+ title: string;
45
+ harness: DashboardHarness;
46
+ state: TaskState;
47
+ workspace: DashboardWorkspace;
48
+ requests: DashboardRequest[];
49
+ subagents: DashboardRelatedTask[];
50
+ queuePaused: boolean;
51
+ }
52
+ export interface DashboardDetail {
53
+ version: 1;
54
+ type: 'dashboard-detail';
55
+ task: DashboardRow;
56
+ prompt?: string;
57
+ response?: {
58
+ responseId: string;
59
+ text?: string;
60
+ };
61
+ error?: ErrorInfo;
62
+ children: DashboardRelatedTask[];
63
+ queue: {
64
+ paused: boolean;
65
+ tasks: DashboardRelatedTask[];
66
+ };
67
+ stopUnconfirmed: boolean;
68
+ }
27
69
  export declare function dashboardHarness(kind?: HarnessKind): DashboardHarness;
28
70
  export declare function dashboardTitle(prompt: string): string;
@@ -1,14 +1,13 @@
1
- import { stripVTControlCharacters } from 'node:util';
1
+ import { sanitizeDashboardTerminalText } from './dashboard-sanitize.js';
2
2
  export function dashboardHarness(kind) {
3
3
  if (kind === 'claudeCode')
4
4
  return 'claude';
5
5
  return kind ?? 'pending';
6
6
  }
7
7
  export function dashboardTitle(prompt) {
8
- const plain = stripVTControlCharacters(prompt);
8
+ const plain = sanitizeDashboardTerminalText(prompt);
9
9
  for (const line of plain.split(/\r\n?|\n/u)) {
10
10
  const normalized = line
11
- .replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f]/gu, '')
12
11
  .replace(/\s+/gu, ' ')
13
12
  .trim();
14
13
  if (normalized)
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/runtime/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAgCrD,MAAM,UAAU,gBAAgB,CAAC,IAAkB;IACjD,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,QAAQ,CAAC;IAC3C,OAAO,IAAI,IAAI,SAAS,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,KAAK,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI;aACpB,OAAO,CAAC,yDAAyD,EAAE,EAAE,CAAC;aACtE,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;aACrB,IAAI,EAAE,CAAC;QACV,IAAI,UAAU;YAAE,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC","sourcesContent":["import { stripVTControlCharacters } from 'node:util';\nimport type { HarnessKind } from '../sdk/types.js';\nimport type { TaskState } from './types.js';\n\nexport type DashboardHarness = 'codex' | 'claude' | 'fx' | 'pending';\n\nexport interface DashboardWorkspace {\n directory: string;\n repository?: string;\n}\n\nexport interface DashboardRow {\n sessionId: string;\n taskId: string;\n harness: DashboardHarness;\n title: string;\n state: TaskState;\n workspace: DashboardWorkspace;\n updatedAt: number;\n dispatchedAt?: number;\n failedAt?: number;\n finishedAt?: number;\n}\n\nexport interface DashboardSnapshot {\n version: 1;\n type: 'dashboard';\n history: true;\n grouping: true;\n sessions: DashboardRow[];\n}\n\nexport function dashboardHarness(kind?: HarnessKind): DashboardHarness {\n if (kind === 'claudeCode') return 'claude';\n return kind ?? 'pending';\n}\n\nexport function dashboardTitle(prompt: string): string {\n const plain = stripVTControlCharacters(prompt);\n for (const line of plain.split(/\\r\\n?|\\n/u)) {\n const normalized = line\n .replace(/[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f-\\u009f]/gu, '')\n .replace(/\\s+/gu, ' ')\n .trim();\n if (normalized) return [...normalized].slice(0, 120).join('');\n }\n return '(untitled)';\n}\n"]}
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/runtime/dashboard.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,6BAA6B,EAAC,MAAM,yBAAyB,CAAC;AAsEtE,MAAM,UAAU,gBAAgB,CAAC,IAAkB;IACjD,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,QAAQ,CAAC;IAC3C,OAAO,IAAI,IAAI,SAAS,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,KAAK,GAAG,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACpD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI;aACpB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;aACrB,IAAI,EAAE,CAAC;QACV,IAAI,UAAU;YAAE,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC","sourcesContent":["import type { ErrorInfo } from '../errors.js';\nimport type { HarnessKind } from '../sdk/types.js';\nimport {sanitizeDashboardTerminalText} from './dashboard-sanitize.ts';\nimport type { TaskState } from './types.js';\n\nexport type DashboardHarness = 'codex' | 'claude' | 'fx' | 'opencode' | 'copilot' | 'cursor' | 'pending';\n\nexport interface DashboardWorkspace {\n directory: string;\n repository?: string;\n}\n\nexport interface DashboardRow {\n sessionId: string;\n taskId: string;\n harness: DashboardHarness;\n title: string;\n state: TaskState;\n workspace: DashboardWorkspace;\n updatedAt: number;\n dispatchedAt?: number;\n failedAt?: number;\n finishedAt?: number;\n}\n\nexport interface DashboardSnapshot {\n version: 1;\n type: 'dashboard';\n history: true;\n grouping: true;\n sessions: DashboardRow[];\n}\n\nexport interface DashboardRelatedTask {\n taskId: string;\n sessionId: string;\n harness: DashboardHarness;\n title: string;\n state: TaskState;\n}\n\nexport interface DashboardRequest extends DashboardRow {\n ordinal: number;\n stopUnconfirmed: boolean;\n}\n\nexport interface DashboardSession {\n version: 1;\n type: 'dashboard-session';\n taskId: string;\n sessionId: string;\n title: string;\n harness: DashboardHarness;\n state: TaskState;\n workspace: DashboardWorkspace;\n requests: DashboardRequest[];\n subagents: DashboardRelatedTask[];\n queuePaused: boolean;\n}\n\nexport interface DashboardDetail {\n version: 1;\n type: 'dashboard-detail';\n task: DashboardRow;\n prompt?: string;\n response?: {responseId: string; text?: string};\n error?: ErrorInfo;\n children: DashboardRelatedTask[];\n queue: {paused: boolean; tasks: DashboardRelatedTask[]};\n stopUnconfirmed: boolean;\n}\n\nexport function dashboardHarness(kind?: HarnessKind): DashboardHarness {\n if (kind === 'claudeCode') return 'claude';\n return kind ?? 'pending';\n}\n\nexport function dashboardTitle(prompt: string): string {\n const plain = sanitizeDashboardTerminalText(prompt);\n for (const line of plain.split(/\\r\\n?|\\n/u)) {\n const normalized = line\n .replace(/\\s+/gu, ' ')\n .trim();\n if (normalized) return [...normalized].slice(0, 120).join('');\n }\n return '(untitled)';\n}\n"]}
@@ -1,13 +1,23 @@
1
1
  import { loadDefinition } from '../config/loader.js';
2
2
  import { AgentError } from '../errors.js';
3
3
  export function harnessReference(kind, model, effort) {
4
+ if ((kind === 'opencode' || kind === 'copilot' || kind === 'cursor') && !model?.trim()) {
5
+ throw new AgentError('INVALID_CONFIG', `${kind} requires --model with an explicit nonempty model identifier.`);
6
+ }
7
+ if ((kind === 'opencode' || kind === 'copilot' || kind === 'cursor') && effort !== undefined) {
8
+ throw new AgentError('INVALID_ARGUMENT', `${kind} does not support --effort.`);
9
+ }
4
10
  if (kind === 'claudeCode') {
5
11
  if (effort !== undefined && effort !== 'low' && effort !== 'medium' && effort !== 'high' && effort !== 'xhigh' && effort !== 'max') {
6
12
  throw new AgentError('INVALID_ARGUMENT', 'Claude effort must be low, medium, high, xhigh, or max.');
7
13
  }
8
14
  return { kind: 'harness', harness: { kind, model, effort, fast: false } };
9
15
  }
10
- return { kind: 'harness', harness: kind === 'fx' ? { kind, model, effort } : { kind, model, effort, fast: false } };
16
+ if (kind === 'fx')
17
+ return { kind: 'harness', harness: { kind, model, effort } };
18
+ if (kind === 'codex')
19
+ return { kind: 'harness', harness: { kind, model, effort, fast: false } };
20
+ return { kind: 'harness', harness: { kind, model: model } };
11
21
  }
12
22
  /** Generic sessions do not import user definitions or add a specialist role. */
13
23
  export async function loadExecutionDefinition(reference) {
@@ -1 +1 @@
1
- {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/runtime/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAK1C,MAAM,UAAU,gBAAgB,CAAC,IAAiB,EAAE,KAAc,EAAE,MAAe;IACjF,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACnI,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,yDAAyD,CAAC,CAAC;QACtG,CAAC;QACD,OAAO,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAC,EAAC,CAAC;IACxE,CAAC;IACD,OAAO,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAC,CAAC,CAAC,CAAC,EAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAC,EAAC,CAAC;AAChH,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,SAA6B;IACzE,IAAI,MAAM,IAAI,SAAS;QAAE,OAAO,cAAc,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACpF,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;IACzF,OAAO,EAAC,IAAI,EAAE,WAAW,EAAE,kBAAkB,IAAI,WAAW,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAC,CAAC;AAC9G,CAAC","sourcesContent":["import { loadDefinition } from '../config/loader.js';\nimport { AgentError } from '../errors.js';\nimport type { ExecutionDefinition } from '../adapters/types.js';\nimport type { HarnessKind } from '../sdk/types.js';\nimport type { ExecutionReference, HarnessReference } from './types.js';\n\nexport function harnessReference(kind: HarnessKind, model?: string, effort?: string): HarnessReference {\n if (kind === 'claudeCode') {\n if (effort !== undefined && effort !== 'low' && effort !== 'medium' && effort !== 'high' && effort !== 'xhigh' && effort !== 'max') {\n throw new AgentError('INVALID_ARGUMENT', 'Claude effort must be low, medium, high, xhigh, or max.');\n }\n return {kind: 'harness', harness: {kind, model, effort, fast: false}};\n }\n return {kind: 'harness', harness: kind === 'fx' ? {kind, model, effort} : {kind, model, effort, fast: false}};\n}\n\n/** Generic sessions do not import user definitions or add a specialist role. */\nexport async function loadExecutionDefinition(reference: ExecutionReference): Promise<ExecutionDefinition> {\n if ('file' in reference) return loadDefinition(reference.file, reference.subagents);\n const name = reference.harness.kind === 'claudeCode' ? 'claude' : reference.harness.kind;\n return {name, description: `Run the native ${name} harness.`, instructions: '', harness: reference.harness};\n}\n"]}
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/runtime/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAK1C,MAAM,UAAU,gBAAgB,CAAC,IAAiB,EAAE,KAAc,EAAE,MAAe;IACjF,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;QACvF,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,GAAG,IAAI,+DAA+D,CAAC,CAAC;IACjH,CAAC;IACD,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,CAAC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC7F,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,GAAG,IAAI,6BAA6B,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACnI,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,yDAAyD,CAAC,CAAC;QACtG,CAAC;QACD,OAAO,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAC,EAAC,CAAC;IACxE,CAAC;IACD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAC,EAAC,CAAC;IAC5E,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAC,EAAC,CAAC;IAC5F,OAAO,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAC,IAAI,EAAE,KAAK,EAAE,KAAM,EAAC,EAAC,CAAC;AAC3D,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,SAA6B;IACzE,IAAI,MAAM,IAAI,SAAS;QAAE,OAAO,cAAc,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACpF,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;IACzF,OAAO,EAAC,IAAI,EAAE,WAAW,EAAE,kBAAkB,IAAI,WAAW,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAC,CAAC;AAC9G,CAAC","sourcesContent":["import { loadDefinition } from '../config/loader.js';\nimport { AgentError } from '../errors.js';\nimport type { ExecutionDefinition } from '../adapters/types.js';\nimport type { HarnessKind } from '../sdk/types.js';\nimport type { ExecutionReference, HarnessReference } from './types.js';\n\nexport function harnessReference(kind: HarnessKind, model?: string, effort?: string): HarnessReference {\n if ((kind === 'opencode' || kind === 'copilot' || kind === 'cursor') && !model?.trim()) {\n throw new AgentError('INVALID_CONFIG', `${kind} requires --model with an explicit nonempty model identifier.`);\n }\n if ((kind === 'opencode' || kind === 'copilot' || kind === 'cursor') && effort !== undefined) {\n throw new AgentError('INVALID_ARGUMENT', `${kind} does not support --effort.`);\n }\n if (kind === 'claudeCode') {\n if (effort !== undefined && effort !== 'low' && effort !== 'medium' && effort !== 'high' && effort !== 'xhigh' && effort !== 'max') {\n throw new AgentError('INVALID_ARGUMENT', 'Claude effort must be low, medium, high, xhigh, or max.');\n }\n return {kind: 'harness', harness: {kind, model, effort, fast: false}};\n }\n if (kind === 'fx') return {kind: 'harness', harness: {kind, model, effort}};\n if (kind === 'codex') return {kind: 'harness', harness: {kind, model, effort, fast: false}};\n return {kind: 'harness', harness: {kind, model: model!}};\n}\n\n/** Generic sessions do not import user definitions or add a specialist role. */\nexport async function loadExecutionDefinition(reference: ExecutionReference): Promise<ExecutionDefinition> {\n if ('file' in reference) return loadDefinition(reference.file, reference.subagents);\n const name = reference.harness.kind === 'claudeCode' ? 'claude' : reference.harness.kind;\n return {name, description: `Run the native ${name} harness.`, instructions: '', harness: reference.harness};\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { HarnessKind } from '../sdk/types.js';
2
2
  import type { AdapterOptions, ExecutionDefinition, NativeSession } from '../adapters/types.js';
3
3
  import { type AccessConfig } from '../config/access.js';
4
- export declare function selectNative(agent: ExecutionDefinition, cwd: string, env: NodeJS.ProcessEnv, settings: AccessConfig, open?: (options: AdapterOptions) => Promise<NativeSession>, selected?: (kind: HarnessKind) => void): Promise<NativeSession>;
4
+ import type { ApprovalHandler } from '../approvals/types.js';
5
+ export declare function selectNative(agent: ExecutionDefinition, cwd: string, env: NodeJS.ProcessEnv, settings: AccessConfig, open?: (options: AdapterOptions) => Promise<NativeSession>, selected?: (kind: HarnessKind) => void, onApproval?: ApprovalHandler): Promise<NativeSession>;