pi-fabric 0.1.0

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 (203) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +635 -0
  3. package/THIRD_PARTY_NOTICES.md +9 -0
  4. package/dist/activity/store.d.ts +27 -0
  5. package/dist/activity/store.d.ts.map +1 -0
  6. package/dist/activity/store.js +474 -0
  7. package/dist/activity/store.js.map +1 -0
  8. package/dist/activity/types.d.ts +101 -0
  9. package/dist/activity/types.d.ts.map +1 -0
  10. package/dist/activity/types.js +2 -0
  11. package/dist/activity/types.js.map +1 -0
  12. package/dist/actors/context.d.ts +13 -0
  13. package/dist/actors/context.d.ts.map +1 -0
  14. package/dist/actors/context.js +155 -0
  15. package/dist/actors/context.js.map +1 -0
  16. package/dist/actors/manager.d.ts +33 -0
  17. package/dist/actors/manager.d.ts.map +1 -0
  18. package/dist/actors/manager.js +751 -0
  19. package/dist/actors/manager.js.map +1 -0
  20. package/dist/actors/types.d.ts +67 -0
  21. package/dist/actors/types.d.ts.map +1 -0
  22. package/dist/actors/types.js +2 -0
  23. package/dist/actors/types.js.map +1 -0
  24. package/dist/capture/catalog.d.ts +23 -0
  25. package/dist/capture/catalog.d.ts.map +1 -0
  26. package/dist/capture/catalog.js +53 -0
  27. package/dist/capture/catalog.js.map +1 -0
  28. package/dist/capture/interceptor.d.ts +13 -0
  29. package/dist/capture/interceptor.d.ts.map +1 -0
  30. package/dist/capture/interceptor.js +130 -0
  31. package/dist/capture/interceptor.js.map +1 -0
  32. package/dist/commands/fabric.d.ts +14 -0
  33. package/dist/commands/fabric.d.ts.map +1 -0
  34. package/dist/commands/fabric.js +237 -0
  35. package/dist/commands/fabric.js.map +1 -0
  36. package/dist/config.d.ts +89 -0
  37. package/dist/config.d.ts.map +1 -0
  38. package/dist/config.js +255 -0
  39. package/dist/config.js.map +1 -0
  40. package/dist/core/action-registry.d.ts +71 -0
  41. package/dist/core/action-registry.d.ts.map +1 -0
  42. package/dist/core/action-registry.js +273 -0
  43. package/dist/core/action-registry.js.map +1 -0
  44. package/dist/core/approval-controller.d.ts +11 -0
  45. package/dist/core/approval-controller.d.ts.map +1 -0
  46. package/dist/core/approval-controller.js +45 -0
  47. package/dist/core/approval-controller.js.map +1 -0
  48. package/dist/core/pi-tools.d.ts +4 -0
  49. package/dist/core/pi-tools.d.ts.map +1 -0
  50. package/dist/core/pi-tools.js +11 -0
  51. package/dist/core/pi-tools.js.map +1 -0
  52. package/dist/core/tool-ownership.d.ts +12 -0
  53. package/dist/core/tool-ownership.d.ts.map +1 -0
  54. package/dist/core/tool-ownership.js +41 -0
  55. package/dist/core/tool-ownership.js.map +1 -0
  56. package/dist/execution-service.d.ts +41 -0
  57. package/dist/execution-service.d.ts.map +1 -0
  58. package/dist/execution-service.js +210 -0
  59. package/dist/execution-service.js.map +1 -0
  60. package/dist/fabric-state.d.ts +38 -0
  61. package/dist/fabric-state.d.ts.map +1 -0
  62. package/dist/fabric-state.js +275 -0
  63. package/dist/fabric-state.js.map +1 -0
  64. package/dist/index.d.ts +4 -0
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +491 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/mesh/store.d.ts +68 -0
  69. package/dist/mesh/store.d.ts.map +1 -0
  70. package/dist/mesh/store.js +387 -0
  71. package/dist/mesh/store.js.map +1 -0
  72. package/dist/protocol.d.ts +62 -0
  73. package/dist/protocol.d.ts.map +1 -0
  74. package/dist/protocol.js +3 -0
  75. package/dist/protocol.js.map +1 -0
  76. package/dist/providers/agents-provider.d.ts +15 -0
  77. package/dist/providers/agents-provider.d.ts.map +1 -0
  78. package/dist/providers/agents-provider.js +393 -0
  79. package/dist/providers/agents-provider.js.map +1 -0
  80. package/dist/providers/captured-tools-provider.d.ts +23 -0
  81. package/dist/providers/captured-tools-provider.d.ts.map +1 -0
  82. package/dist/providers/captured-tools-provider.js +170 -0
  83. package/dist/providers/captured-tools-provider.js.map +1 -0
  84. package/dist/providers/mcp-provider.d.ts +15 -0
  85. package/dist/providers/mcp-provider.d.ts.map +1 -0
  86. package/dist/providers/mcp-provider.js +289 -0
  87. package/dist/providers/mcp-provider.js.map +1 -0
  88. package/dist/providers/mesh-provider.d.ts +13 -0
  89. package/dist/providers/mesh-provider.d.ts.map +1 -0
  90. package/dist/providers/mesh-provider.js +175 -0
  91. package/dist/providers/mesh-provider.js.map +1 -0
  92. package/dist/providers/pi-tools-provider.d.ts +14 -0
  93. package/dist/providers/pi-tools-provider.d.ts.map +1 -0
  94. package/dist/providers/pi-tools-provider.js +200 -0
  95. package/dist/providers/pi-tools-provider.js.map +1 -0
  96. package/dist/runtime/guest-types.d.ts +3 -0
  97. package/dist/runtime/guest-types.d.ts.map +1 -0
  98. package/dist/runtime/guest-types.js +313 -0
  99. package/dist/runtime/guest-types.js.map +1 -0
  100. package/dist/runtime/quickjs-runtime.d.ts +18 -0
  101. package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
  102. package/dist/runtime/quickjs-runtime.js +538 -0
  103. package/dist/runtime/quickjs-runtime.js.map +1 -0
  104. package/dist/runtime/type-checker.d.ts +10 -0
  105. package/dist/runtime/type-checker.d.ts.map +1 -0
  106. package/dist/runtime/type-checker.js +71 -0
  107. package/dist/runtime/type-checker.js.map +1 -0
  108. package/dist/subagents/budget-ledger.d.ts +61 -0
  109. package/dist/subagents/budget-ledger.d.ts.map +1 -0
  110. package/dist/subagents/budget-ledger.js +92 -0
  111. package/dist/subagents/budget-ledger.js.map +1 -0
  112. package/dist/subagents/manager.d.ts +27 -0
  113. package/dist/subagents/manager.d.ts.map +1 -0
  114. package/dist/subagents/manager.js +497 -0
  115. package/dist/subagents/manager.js.map +1 -0
  116. package/dist/subagents/semaphore.d.ts +7 -0
  117. package/dist/subagents/semaphore.d.ts.map +1 -0
  118. package/dist/subagents/semaphore.js +54 -0
  119. package/dist/subagents/semaphore.js.map +1 -0
  120. package/dist/subagents/transports/localterm-transport.d.ts +7 -0
  121. package/dist/subagents/transports/localterm-transport.d.ts.map +1 -0
  122. package/dist/subagents/transports/localterm-transport.js +54 -0
  123. package/dist/subagents/transports/localterm-transport.js.map +1 -0
  124. package/dist/subagents/transports/process-transport.d.ts +7 -0
  125. package/dist/subagents/transports/process-transport.d.ts.map +1 -0
  126. package/dist/subagents/transports/process-transport.js +17 -0
  127. package/dist/subagents/transports/process-transport.js.map +1 -0
  128. package/dist/subagents/transports/process-utils.d.ts +16 -0
  129. package/dist/subagents/transports/process-utils.d.ts.map +1 -0
  130. package/dist/subagents/transports/process-utils.js +57 -0
  131. package/dist/subagents/transports/process-utils.js.map +1 -0
  132. package/dist/subagents/transports/screen-transport.d.ts +7 -0
  133. package/dist/subagents/transports/screen-transport.d.ts.map +1 -0
  134. package/dist/subagents/transports/screen-transport.js +33 -0
  135. package/dist/subagents/transports/screen-transport.js.map +1 -0
  136. package/dist/subagents/transports/tmux-transport.d.ts +7 -0
  137. package/dist/subagents/transports/tmux-transport.d.ts.map +1 -0
  138. package/dist/subagents/transports/tmux-transport.js +41 -0
  139. package/dist/subagents/transports/tmux-transport.js.map +1 -0
  140. package/dist/subagents/types.d.ts +132 -0
  141. package/dist/subagents/types.d.ts.map +1 -0
  142. package/dist/subagents/types.js +2 -0
  143. package/dist/subagents/types.js.map +1 -0
  144. package/dist/subagents/worktree-manager.d.ts +12 -0
  145. package/dist/subagents/worktree-manager.d.ts.map +1 -0
  146. package/dist/subagents/worktree-manager.js +53 -0
  147. package/dist/subagents/worktree-manager.js.map +1 -0
  148. package/dist/ui/controller.d.ts +14 -0
  149. package/dist/ui/controller.d.ts.map +1 -0
  150. package/dist/ui/controller.js +153 -0
  151. package/dist/ui/controller.js.map +1 -0
  152. package/dist/ui/dashboard.d.ts +36 -0
  153. package/dist/ui/dashboard.d.ts.map +1 -0
  154. package/dist/ui/dashboard.js +620 -0
  155. package/dist/ui/dashboard.js.map +1 -0
  156. package/dist/ui/fabric-render.d.ts +28 -0
  157. package/dist/ui/fabric-render.d.ts.map +1 -0
  158. package/dist/ui/fabric-render.js +280 -0
  159. package/dist/ui/fabric-render.js.map +1 -0
  160. package/dist/ui/format.d.ts +7 -0
  161. package/dist/ui/format.d.ts.map +1 -0
  162. package/dist/ui/format.js +57 -0
  163. package/dist/ui/format.js.map +1 -0
  164. package/dist/ui/highlight.d.ts +13 -0
  165. package/dist/ui/highlight.d.ts.map +1 -0
  166. package/dist/ui/highlight.js +337 -0
  167. package/dist/ui/highlight.js.map +1 -0
  168. package/dist/ui/settings.d.ts +21 -0
  169. package/dist/ui/settings.d.ts.map +1 -0
  170. package/dist/ui/settings.js +480 -0
  171. package/dist/ui/settings.js.map +1 -0
  172. package/dist/ui/snapshot.d.ts +5 -0
  173. package/dist/ui/snapshot.d.ts.map +1 -0
  174. package/dist/ui/snapshot.js +120 -0
  175. package/dist/ui/snapshot.js.map +1 -0
  176. package/dist/ui/types.d.ts +57 -0
  177. package/dist/ui/types.d.ts.map +1 -0
  178. package/dist/ui/types.js +11 -0
  179. package/dist/ui/types.js.map +1 -0
  180. package/dist/ui/widget.d.ts +16 -0
  181. package/dist/ui/widget.d.ts.map +1 -0
  182. package/dist/ui/widget.js +199 -0
  183. package/dist/ui/widget.js.map +1 -0
  184. package/dist/util.d.ts +2 -0
  185. package/dist/util.d.ts.map +1 -0
  186. package/dist/util.js +10 -0
  187. package/dist/util.js.map +1 -0
  188. package/dist/worker.d.ts +3 -0
  189. package/dist/worker.d.ts.map +1 -0
  190. package/dist/worker.js +478 -0
  191. package/dist/worker.js.map +1 -0
  192. package/package.json +87 -0
  193. package/skills/fabric-advisor/SKILL.md +53 -0
  194. package/skills/fabric-ambient/SKILL.md +84 -0
  195. package/skills/fabric-council/SKILL.md +37 -0
  196. package/skills/fabric-exec/SKILL.md +39 -0
  197. package/skills/fabric-exec/references/agents.md +78 -0
  198. package/skills/fabric-exec/references/mcp.md +46 -0
  199. package/skills/fabric-exec/references/mesh.md +42 -0
  200. package/skills/fabric-rlm/SKILL.md +84 -0
  201. package/skills/fabric-supervisor/SKILL.md +63 -0
  202. package/skills/fabric-swarm/SKILL.md +85 -0
  203. package/skills/fabric-workflow/SKILL.md +69 -0
@@ -0,0 +1,497 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { Semaphore } from "./semaphore.js";
7
+ import { LocaltermTransport } from "./transports/localterm-transport.js";
8
+ import { ProcessTransport } from "./transports/process-transport.js";
9
+ import { ScreenTransport } from "./transports/screen-transport.js";
10
+ import { TmuxTransport } from "./transports/tmux-transport.js";
11
+ import { WorktreeManager } from "./worktree-manager.js";
12
+ import { activeBudgetState, appendBudgetLedger, clearOwnedBudgetEnv, initBudgetLedger, readBudgetLedger, } from "./budget-ledger.js";
13
+ const STATUS_POLL_MS = 100;
14
+ const TRANSPORT_EXIT_GRACE_MS = 1_000;
15
+ const MAX_NAME_LENGTH = 60;
16
+ const terminalStatuses = new Set(["completed", "failed", "stopped", "timed_out"]);
17
+ const delay = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
18
+ const safeName = (value) => value
19
+ .replace(/[\r\n\t]+/g, " ")
20
+ .trim()
21
+ .slice(0, MAX_NAME_LENGTH) || "Fabric subagent";
22
+ const readRecord = (filePath) => {
23
+ try {
24
+ const parsed = JSON.parse(fs.readFileSync(filePath, "utf8"));
25
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed))
26
+ return undefined;
27
+ return parsed;
28
+ }
29
+ catch {
30
+ return undefined;
31
+ }
32
+ };
33
+ const readNestedAgents = (runDirectory) => {
34
+ const nestedRoot = path.join(runDirectory, "nested");
35
+ let entries;
36
+ try {
37
+ entries = fs.readdirSync(nestedRoot);
38
+ }
39
+ catch {
40
+ return [];
41
+ }
42
+ const agents = [];
43
+ for (const entry of entries) {
44
+ const record = readRecord(path.join(nestedRoot, entry, "status.json"));
45
+ if (record)
46
+ agents.push(record);
47
+ }
48
+ return agents;
49
+ };
50
+ const writeRecord = (filePath, record) => {
51
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
52
+ const temporaryPath = `${filePath}.${process.pid}.tmp`;
53
+ fs.writeFileSync(temporaryPath, JSON.stringify(record, null, 2), {
54
+ encoding: "utf8",
55
+ mode: 0o600,
56
+ });
57
+ fs.renameSync(temporaryPath, filePath);
58
+ };
59
+ const failedRecord = (managed, status, error) => {
60
+ const now = Date.now();
61
+ return {
62
+ id: managed.id,
63
+ name: managed.name,
64
+ task: managed.task,
65
+ status,
66
+ transport: managed.transport.kind,
67
+ cwd: managed.cwd,
68
+ startedAt: now,
69
+ updatedAt: now,
70
+ finishedAt: now,
71
+ turns: 0,
72
+ toolCalls: 0,
73
+ text: "",
74
+ error,
75
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0 },
76
+ ...(managed.model ? { model: managed.model } : {}),
77
+ ...(managed.thinking ? { thinking: managed.thinking } : {}),
78
+ ...(managed.actorId ? { actorId: managed.actorId } : {}),
79
+ ...(managed.actorName ? { actorName: managed.actorName } : {}),
80
+ ...(managed.transport.sessionId ? { sessionId: managed.transport.sessionId } : {}),
81
+ ...(managed.transport.attachCommand ? { attachCommand: managed.transport.attachCommand } : {}),
82
+ ...(managed.branch ? { branch: managed.branch } : {}),
83
+ ...(managed.worktree ? { worktree: managed.worktree } : {}),
84
+ };
85
+ };
86
+ export class SubagentManager {
87
+ cwd;
88
+ config;
89
+ #runs = new Map();
90
+ #semaphore;
91
+ #worktrees = new WorktreeManager();
92
+ #runRoot;
93
+ #workerPath;
94
+ #fabricExtensionPath;
95
+ #piBinary;
96
+ #currentDepth;
97
+ #fullCodeMode;
98
+ #transports;
99
+ #onBackgroundComplete;
100
+ #budget;
101
+ #budgetOwned;
102
+ #closing = false;
103
+ constructor(cwd, config, options = {}) {
104
+ this.cwd = cwd;
105
+ this.config = config;
106
+ this.#semaphore = new Semaphore(config.maxConcurrent);
107
+ this.#runRoot =
108
+ options.runRoot ?? process.env.PI_FABRIC_RUN_ROOT ?? fs.mkdtempSync(path.join(os.tmpdir(), "pi-fabric-runs-"));
109
+ this.#workerPath =
110
+ options.workerPath ?? fileURLToPath(new URL("../worker.js", import.meta.url));
111
+ this.#fabricExtensionPath =
112
+ options.fabricExtensionPath ?? fileURLToPath(new URL("../index.js", import.meta.url));
113
+ this.#piBinary = options.piBinary ?? process.env.PI_FABRIC_PI_BINARY ?? "pi";
114
+ this.#onBackgroundComplete = options.onBackgroundComplete;
115
+ this.#currentDepth = Math.max(0, Number(process.env.PI_FABRIC_DEPTH ?? "0") || 0);
116
+ this.#fullCodeMode = options.fullCodeMode ?? true;
117
+ const inheritedBudget = activeBudgetState();
118
+ this.#budget =
119
+ inheritedBudget ??
120
+ (this.#currentDepth === 0 && config.budgetUsd > 0
121
+ ? initBudgetLedger(config.budgetUsd)
122
+ : undefined);
123
+ this.#budgetOwned =
124
+ !inheritedBudget && this.#currentDepth === 0 && config.budgetUsd > 0;
125
+ const adapters = [
126
+ new ProcessTransport(),
127
+ new TmuxTransport(),
128
+ new ScreenTransport(),
129
+ new LocaltermTransport(),
130
+ ];
131
+ this.#transports = new Map(adapters.map((adapter) => [adapter.kind, adapter]));
132
+ }
133
+ async spawn(request, signal) {
134
+ if (!this.config.enabled)
135
+ throw new Error("Subagents are disabled in Fabric configuration");
136
+ if (this.#currentDepth >= this.config.maxDepth) {
137
+ throw new Error(`Fabric subagent depth limit reached (${this.config.maxDepth})`);
138
+ }
139
+ if (!request.task.trim())
140
+ throw new Error("Subagent task must not be empty");
141
+ if (this.#budget) {
142
+ const spent = readBudgetLedger(this.#budget.file).cost;
143
+ if (spent >= this.#budget.budget) {
144
+ throw new Error(`Fabric recursion budget exceeded: spent $${spent.toFixed(6)} of $${this.#budget.budget.toFixed(6)}. Increase subagents.budgetUsd or simplify the task.`);
145
+ }
146
+ }
147
+ const release = await this.#semaphore.acquire(signal);
148
+ const id = randomUUID().replaceAll("-", "");
149
+ const name = safeName(request.name ?? request.task.split("\n", 1)[0] ?? "Fabric subagent");
150
+ const runDirectory = path.join(this.#runRoot, id);
151
+ fs.mkdirSync(runDirectory, { recursive: true });
152
+ const taskFile = path.join(runDirectory, "task.txt");
153
+ const statusFile = path.join(runDirectory, "status.json");
154
+ const logFile = path.join(runDirectory, "events.jsonl");
155
+ const schemaFile = request.schema ? path.join(runDirectory, "schema.json") : undefined;
156
+ fs.writeFileSync(taskFile, request.task, { encoding: "utf8", mode: 0o600 });
157
+ if (schemaFile) {
158
+ fs.writeFileSync(schemaFile, JSON.stringify(request.schema, null, 2), {
159
+ encoding: "utf8",
160
+ mode: 0o600,
161
+ });
162
+ }
163
+ let agentCwd = this.cwd;
164
+ let branch;
165
+ let worktree;
166
+ if (request.worktree) {
167
+ try {
168
+ const lease = await this.#worktrees.create(id, this.cwd, name);
169
+ agentCwd = lease.path;
170
+ branch = lease.branch;
171
+ worktree = lease.path;
172
+ }
173
+ catch (error) {
174
+ release();
175
+ throw error;
176
+ }
177
+ }
178
+ try {
179
+ const adapter = await this.#resolveTransport(request.transport ?? this.config.transport);
180
+ const tools = this.#childTools(request);
181
+ const timeoutMs = Math.max(1_000, Math.min(request.timeoutMs ?? this.config.timeoutMs, 3_600_000));
182
+ const workerArguments = [
183
+ "--id",
184
+ id,
185
+ "--name",
186
+ name,
187
+ "--task-file",
188
+ taskFile,
189
+ "--status-file",
190
+ statusFile,
191
+ "--log-file",
192
+ logFile,
193
+ "--cwd",
194
+ agentCwd,
195
+ "--pi-binary",
196
+ this.#piBinary,
197
+ "--timeout-ms",
198
+ String(timeoutMs),
199
+ "--depth",
200
+ String(this.#currentDepth + 1),
201
+ "--full-code-mode",
202
+ String(request.recursive === true && this.#fullCodeMode),
203
+ "--extensions",
204
+ String(request.recursive ? true : (request.extensions ?? this.config.extensions)),
205
+ "--tools",
206
+ JSON.stringify(tools),
207
+ "--granted-risks",
208
+ JSON.stringify(request.recursive ? ["agent"] : []),
209
+ "--transport",
210
+ adapter.kind,
211
+ ...(request.recursive ? ["--fabric-extension", this.#fabricExtensionPath] : []),
212
+ ...(request.model ? ["--model", request.model] : []),
213
+ ...(request.thinking ? ["--thinking", request.thinking] : []),
214
+ ...(request.systemPrompt ? ["--system-prompt", request.systemPrompt] : []),
215
+ ...(request.sessionFile ? ["--session-file", request.sessionFile] : []),
216
+ ...(request.actorId ? ["--actor-id", request.actorId] : []),
217
+ ...(request.actorName ? ["--actor-name", request.actorName] : []),
218
+ ...(request.meshRoot ? ["--mesh-root", request.meshRoot] : []),
219
+ "--run-root",
220
+ path.join(runDirectory, "nested"),
221
+ ...(schemaFile ? ["--schema-file", schemaFile] : []),
222
+ ...(branch ? ["--branch", branch] : []),
223
+ ...(worktree ? ["--worktree", worktree] : []),
224
+ ];
225
+ const transport = await adapter.launch({
226
+ id,
227
+ name,
228
+ cwd: agentCwd,
229
+ workerPath: this.#workerPath,
230
+ workerArguments,
231
+ });
232
+ let resolveResult;
233
+ const result = new Promise((resolve) => {
234
+ resolveResult = resolve;
235
+ });
236
+ if (!resolveResult)
237
+ throw new Error("Failed to create subagent result promise");
238
+ if (signal?.aborted) {
239
+ await transport.stop();
240
+ throw new Error("Subagent launch aborted");
241
+ }
242
+ const managed = {
243
+ id,
244
+ name,
245
+ task: request.task,
246
+ cwd: agentCwd,
247
+ statusFile,
248
+ runDirectory,
249
+ transport,
250
+ result,
251
+ resolve: resolveResult,
252
+ release,
253
+ abortSignal: signal,
254
+ abortHandler: undefined,
255
+ ...(request.model ? { model: request.model } : {}),
256
+ ...(request.thinking ? { thinking: request.thinking } : {}),
257
+ ...(request.actorId ? { actorId: request.actorId } : {}),
258
+ ...(request.actorName ? { actorName: request.actorName } : {}),
259
+ ...(branch ? { branch } : {}),
260
+ ...(worktree ? { worktree } : {}),
261
+ settled: false,
262
+ background: false,
263
+ };
264
+ if (signal) {
265
+ managed.abortHandler = () => void this.stop(id);
266
+ signal.addEventListener("abort", managed.abortHandler, { once: true });
267
+ }
268
+ this.#runs.set(id, managed);
269
+ void this.#monitor(managed, timeoutMs);
270
+ return this.#handleInfo(managed, "running");
271
+ }
272
+ catch (error) {
273
+ release();
274
+ if (worktree)
275
+ await this.#worktrees.cleanup(id, true).catch(() => false);
276
+ throw error;
277
+ }
278
+ }
279
+ async run(request, signal) {
280
+ const handle = await this.spawn(request, signal);
281
+ return this.wait(handle.id);
282
+ }
283
+ async wait(id) {
284
+ const managed = this.#requireRun(id);
285
+ managed.background = false;
286
+ return managed.result;
287
+ }
288
+ detachSignal(id) {
289
+ const managed = this.#requireRun(id);
290
+ if (managed.abortSignal && managed.abortHandler) {
291
+ managed.abortSignal.removeEventListener("abort", managed.abortHandler);
292
+ }
293
+ managed.abortSignal = undefined;
294
+ managed.abortHandler = undefined;
295
+ managed.background = true;
296
+ }
297
+ status(id) {
298
+ const managed = this.#requireRun(id);
299
+ const record = readRecord(managed.statusFile);
300
+ if (!record)
301
+ return this.#handleInfo(managed, "running");
302
+ return this.#withTransportMetadata(record, managed);
303
+ }
304
+ list() {
305
+ return [...this.#runs.keys()].map((id) => this.status(id));
306
+ }
307
+ async stop(id) {
308
+ const managed = this.#requireRun(id);
309
+ if (managed.settled)
310
+ return managed.result;
311
+ managed.background = false;
312
+ const existing = readRecord(managed.statusFile);
313
+ if (existing && terminalStatuses.has(existing.status)) {
314
+ const result = this.#withTransportMetadata(existing, managed);
315
+ this.#settle(managed, result);
316
+ return result;
317
+ }
318
+ await managed.transport.stop();
319
+ const record = failedRecord(managed, "stopped", "Subagent stopped");
320
+ writeRecord(managed.statusFile, record);
321
+ this.#settle(managed, record);
322
+ return record;
323
+ }
324
+ async cleanup(id, deleteBranch = false) {
325
+ const managed = this.#requireRun(id);
326
+ if (!managed.settled)
327
+ throw new Error("Cannot clean up a running subagent");
328
+ const cleaned = await this.#worktrees.cleanup(id, deleteBranch);
329
+ if (!this.config.retainRuns) {
330
+ fs.rmSync(managed.runDirectory, { recursive: true, force: true });
331
+ }
332
+ this.#runs.delete(id);
333
+ return { cleaned: cleaned || !fs.existsSync(managed.runDirectory) };
334
+ }
335
+ async close() {
336
+ this.#closing = true;
337
+ const running = [...this.#runs.values()].filter((managed) => !managed.settled);
338
+ await Promise.allSettled(running.map((managed) => this.stop(managed.id)));
339
+ await Promise.allSettled(running.map((managed) => this.#waitForTransportExit(managed)));
340
+ if (!this.config.retainRuns) {
341
+ fs.rmSync(this.#runRoot, { recursive: true, force: true });
342
+ }
343
+ if (this.#budgetOwned && this.#budget) {
344
+ fs.rmSync(path.dirname(this.#budget.file), { recursive: true, force: true });
345
+ clearOwnedBudgetEnv();
346
+ }
347
+ }
348
+ async #waitForTransportExit(managed) {
349
+ const deadline = Date.now() + TRANSPORT_EXIT_GRACE_MS * 5;
350
+ while (Date.now() < deadline && (await managed.transport.isAlive())) {
351
+ await delay(STATUS_POLL_MS);
352
+ }
353
+ }
354
+ async #monitor(managed, timeoutMs) {
355
+ const deadline = Date.now() + timeoutMs + TRANSPORT_EXIT_GRACE_MS;
356
+ let firstObservedDeadAt;
357
+ while (!managed.settled) {
358
+ const record = readRecord(managed.statusFile);
359
+ if (record && terminalStatuses.has(record.status)) {
360
+ this.#settle(managed, this.#withTransportMetadata(record, managed));
361
+ return;
362
+ }
363
+ if (Date.now() >= deadline) {
364
+ await managed.transport.stop();
365
+ const timedOut = failedRecord(managed, "timed_out", `Subagent timed out after ${timeoutMs}ms`);
366
+ writeRecord(managed.statusFile, timedOut);
367
+ this.#settle(managed, timedOut);
368
+ return;
369
+ }
370
+ const alive = await managed.transport.isAlive();
371
+ if (!alive) {
372
+ firstObservedDeadAt ??= Date.now();
373
+ if (Date.now() - firstObservedDeadAt >= TRANSPORT_EXIT_GRACE_MS) {
374
+ const failed = failedRecord(managed, "failed", "Subagent transport exited without a result");
375
+ writeRecord(managed.statusFile, failed);
376
+ this.#settle(managed, failed);
377
+ return;
378
+ }
379
+ }
380
+ else {
381
+ firstObservedDeadAt = undefined;
382
+ }
383
+ await delay(STATUS_POLL_MS);
384
+ }
385
+ }
386
+ #settle(managed, result) {
387
+ if (managed.settled)
388
+ return;
389
+ managed.settled = true;
390
+ if (managed.abortSignal && managed.abortHandler) {
391
+ managed.abortSignal.removeEventListener("abort", managed.abortHandler);
392
+ }
393
+ managed.release();
394
+ if (this.#budget) {
395
+ appendBudgetLedger(this.#budget.file, {
396
+ id: result.id,
397
+ depth: this.#currentDepth + 1,
398
+ cost: result.usage.cost,
399
+ tokens: result.usage.input +
400
+ result.usage.output +
401
+ result.usage.cacheRead +
402
+ result.usage.cacheWrite,
403
+ ts: Date.now(),
404
+ });
405
+ const summary = this.#budgetSummary();
406
+ if (summary)
407
+ result.budget = summary;
408
+ }
409
+ managed.resolve(result);
410
+ if (managed.background &&
411
+ !this.#closing &&
412
+ this.config.notifyOnComplete &&
413
+ this.#onBackgroundComplete) {
414
+ try {
415
+ this.#onBackgroundComplete(result);
416
+ }
417
+ catch { /* completion callback must not break the manager */ }
418
+ }
419
+ }
420
+ #childTools(request) {
421
+ const tools = [...(request.tools ?? this.config.defaultTools)].filter((tool) => tool !== "fabric_exec");
422
+ if (request.recursive)
423
+ tools.push("fabric_exec");
424
+ return [...new Set(tools)];
425
+ }
426
+ #budgetSummary() {
427
+ if (!this.#budget)
428
+ return undefined;
429
+ const { cost, tokens } = readBudgetLedger(this.#budget.file);
430
+ return {
431
+ limit: this.#budget.budget,
432
+ spent: cost,
433
+ remaining: Math.max(0, this.#budget.budget - cost),
434
+ tokens,
435
+ };
436
+ }
437
+ async #resolveTransport(requested) {
438
+ if (requested !== "auto") {
439
+ const adapter = this.#transports.get(requested);
440
+ if (!adapter || !(await adapter.available())) {
441
+ throw new Error(`Fabric subagent transport is unavailable: ${requested}`);
442
+ }
443
+ return adapter;
444
+ }
445
+ for (const kind of ["localterm", "tmux", "screen", "process"]) {
446
+ const adapter = this.#transports.get(kind);
447
+ if (adapter && (await adapter.available()))
448
+ return adapter;
449
+ }
450
+ throw new Error("No Fabric subagent transport is available");
451
+ }
452
+ #requireRun(id) {
453
+ const managed = this.#runs.get(id);
454
+ if (!managed)
455
+ throw new Error(`Unknown Fabric subagent: ${id}`);
456
+ return managed;
457
+ }
458
+ #handleInfo(managed, status) {
459
+ return {
460
+ id: managed.id,
461
+ name: managed.name,
462
+ status,
463
+ transport: managed.transport.kind,
464
+ cwd: managed.cwd,
465
+ ...(managed.model ? { model: managed.model } : {}),
466
+ ...(managed.thinking ? { thinking: managed.thinking } : {}),
467
+ ...(managed.actorId ? { actorId: managed.actorId } : {}),
468
+ ...(managed.actorName ? { actorName: managed.actorName } : {}),
469
+ ...(managed.transport.sessionId ? { sessionId: managed.transport.sessionId } : {}),
470
+ ...(managed.transport.attachCommand
471
+ ? { attachCommand: managed.transport.attachCommand }
472
+ : {}),
473
+ ...(managed.branch ? { branch: managed.branch } : {}),
474
+ ...(managed.worktree ? { worktree: managed.worktree } : {}),
475
+ };
476
+ }
477
+ #withTransportMetadata(record, managed) {
478
+ const nestedAgents = readNestedAgents(managed.runDirectory);
479
+ const budget = this.#budgetSummary();
480
+ return {
481
+ ...record,
482
+ ...(nestedAgents.length > 0 ? { nestedAgents } : {}),
483
+ ...(budget ? { budget } : {}),
484
+ ...(managed.model ? { model: managed.model } : {}),
485
+ ...(managed.thinking ? { thinking: managed.thinking } : {}),
486
+ ...(managed.actorId ? { actorId: managed.actorId } : {}),
487
+ ...(managed.actorName ? { actorName: managed.actorName } : {}),
488
+ ...(managed.transport.sessionId ? { sessionId: managed.transport.sessionId } : {}),
489
+ ...(managed.transport.attachCommand
490
+ ? { attachCommand: managed.transport.attachCommand }
491
+ : {}),
492
+ ...(managed.branch ? { branch: managed.branch } : {}),
493
+ ...(managed.worktree ? { worktree: managed.worktree } : {}),
494
+ };
495
+ }
496
+ }
497
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/subagents/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAU/D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,uBAAuB,GAAG,KAAK,CAAC;AACtC,MAAM,eAAe,GAAG,EAAE,CAAC;AAyB3B,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;AAElF,MAAM,KAAK,GAAG,CAAC,YAAoB,EAAiB,EAAE,CACpD,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;AAE9D,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAU,EAAE,CACzC,KAAK;KACF,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC;KAC1B,IAAI,EAAE;KACN,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,IAAI,iBAAiB,CAAC;AAEpD,MAAM,UAAU,GAAG,CAAC,QAAgB,EAAiC,EAAE;IACrE,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QACtE,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,SAAS,CAAC;QAC7F,OAAO,MAA2B,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,YAAoB,EAAuB,EAAE;IACrE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACrD,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;QACvE,IAAI,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAE,MAAyB,EAAQ,EAAE;IACxE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,aAAa,GAAG,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;IACvD,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QAC/D,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IACH,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CACnB,OAGC,EACD,MAA0C,EAC1C,KAAa,EACM,EAAE;IACrB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM;QACN,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI;QACjC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,UAAU,EAAE,GAAG;QACf,KAAK,EAAE,CAAC;QACR,SAAS,EAAE,CAAC;QACZ,IAAI,EAAE,EAAE;QACR,KAAK;QACL,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;QACpE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,OAAO,eAAe;IAiBf;IACA;IAjBF,KAAK,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC3C,UAAU,CAAY;IACtB,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACnC,QAAQ,CAAS;IACjB,WAAW,CAAS;IACpB,oBAAoB,CAAS;IAC7B,SAAS,CAAS;IAClB,aAAa,CAAS;IACtB,aAAa,CAAU;IACvB,WAAW,CAAyD;IACpE,qBAAqB,CAAoD;IACzE,OAAO,CAAgC;IACvC,YAAY,CAAU;IAC/B,QAAQ,GAAG,KAAK,CAAC;IAEjB,YACW,GAAW,EACX,MAA4B,EACrC,UAOI,EAAE;QATG,QAAG,GAAH,GAAG,CAAQ;QACX,WAAM,GAAN,MAAM,CAAsB;QAUrC,IAAI,CAAC,UAAU,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACtD,IAAI,CAAC,QAAQ;YACX,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACjH,IAAI,CAAC,WAAW;YACd,OAAO,CAAC,UAAU,IAAI,aAAa,CAAC,IAAI,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAChF,IAAI,CAAC,oBAAoB;YACvB,OAAO,CAAC,mBAAmB,IAAI,aAAa,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxF,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC;QAC7E,IAAI,CAAC,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;QAC1D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAClF,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC;QAClD,MAAM,eAAe,GAAG,iBAAiB,EAAE,CAAC;QAC5C,IAAI,CAAC,OAAO;YACV,eAAe;gBACf,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,GAAG,CAAC;oBAC/C,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC;oBACpC,CAAC,CAAC,SAAS,CAAC,CAAC;QACjB,IAAI,CAAC,YAAY;YACf,CAAC,eAAe,IAAI,IAAI,CAAC,aAAa,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;QACvE,MAAM,QAAQ,GAA+B;YAC3C,IAAI,gBAAgB,EAAE;YACtB,IAAI,aAAa,EAAE;YACnB,IAAI,eAAe,EAAE;YACrB,IAAI,kBAAkB,EAAE;SACzB,CAAC;QACF,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAA2B,EAAE,MAAoB;QAC3D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAC5F,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAC7E,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;YACvD,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CACb,4CAA4C,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,sDAAsD,CACzJ,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC;QAC3F,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClD,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QACrD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QACxD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvF,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5E,IAAI,UAAU,EAAE,CAAC;YACf,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;gBACpE,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;QACL,CAAC;QAED,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC;QACxB,IAAI,MAA0B,CAAC;QAC/B,IAAI,QAA4B,CAAC;QACjC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC/D,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC;gBACtB,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;gBACtB,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC;YACxB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACzF,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,KAAK,EACL,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAChE,CAAC;YACF,MAAM,eAAe,GAAG;gBACtB,MAAM;gBACN,EAAE;gBACF,QAAQ;gBACR,IAAI;gBACJ,aAAa;gBACb,QAAQ;gBACR,eAAe;gBACf,UAAU;gBACV,YAAY;gBACZ,OAAO;gBACP,OAAO;gBACP,QAAQ;gBACR,aAAa;gBACb,IAAI,CAAC,SAAS;gBACd,cAAc;gBACd,MAAM,CAAC,SAAS,CAAC;gBACjB,SAAS;gBACT,MAAM,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;gBAC9B,kBAAkB;gBAClB,MAAM,CAAC,OAAO,CAAC,SAAS,KAAK,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC;gBACxD,cAAc;gBACd,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACjF,SAAS;gBACT,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;gBACrB,iBAAiB;gBACjB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClD,aAAa;gBACb,OAAO,CAAC,IAAI;gBACZ,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/E,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpD,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1E,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjE,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9D,YAAY;gBACZ,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC;gBACjC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9C,CAAC;YACF,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC;gBACrC,EAAE;gBACF,IAAI;gBACJ,GAAG,EAAE,QAAQ;gBACb,UAAU,EAAE,IAAI,CAAC,WAAW;gBAC5B,eAAe;aAChB,CAAC,CAAC;YACH,IAAI,aAAgE,CAAC;YACrE,MAAM,MAAM,GAAG,IAAI,OAAO,CAAoB,CAAC,OAAO,EAAE,EAAE;gBACxD,aAAa,GAAG,OAAO,CAAC;YAC1B,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,aAAa;gBAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAChF,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBACpB,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC7C,CAAC;YACD,MAAM,OAAO,GAAoB;gBAC/B,EAAE;gBACF,IAAI;gBACJ,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,GAAG,EAAE,QAAQ;gBACb,UAAU;gBACV,YAAY;gBACZ,SAAS;gBACT,MAAM;gBACN,OAAO,EAAE,aAAa;gBACtB,OAAO;gBACP,WAAW,EAAE,MAAM;gBACnB,YAAY,EAAE,SAAS;gBACvB,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClD,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxD,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9D,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjC,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,KAAK;aAClB,CAAC;YACF,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACzE,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAC5B,KAAK,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACvC,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;YACV,IAAI,QAAQ;gBAAE,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;YACzE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAA2B,EAAE,MAAoB;QACzD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAU;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC;QAC3B,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IAED,YAAY,CAAC,EAAU;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YAChD,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;QAChC,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;QACjC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,EAAU;QACf,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAU;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC;QAC3C,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC;QAC3B,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACtD,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAsB,CAAC;YACnF,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC9B,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;QACpE,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU,EAAE,YAAY,GAAG,KAAK;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC5B,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtB,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/E,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1E,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACxF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC5B,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACtC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7E,mBAAmB,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,OAAwB;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,uBAAuB,GAAG,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,IAAI,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YACpE,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAwB,EAAE,SAAiB;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,uBAAuB,CAAC;QAClE,IAAI,mBAAuC,CAAC;QAC5C,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC9C,IAAI,MAAM,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAsB,CAAC,CAAC;gBACzF,OAAO;YACT,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,YAAY,CAC3B,OAAO,EACP,WAAW,EACX,4BAA4B,SAAS,IAAI,CAC1C,CAAC;gBACF,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAC1C,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAChC,OAAO;YACT,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YAChD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,mBAAmB,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;gBACnC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,mBAAmB,IAAI,uBAAuB,EAAE,CAAC;oBAChE,MAAM,MAAM,GAAG,YAAY,CACzB,OAAO,EACP,QAAQ,EACR,4CAA4C,CAC7C,CAAC;oBACF,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;oBACxC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;oBAC9B,OAAO;gBACT,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,mBAAmB,GAAG,SAAS,CAAC;YAClC,CAAC;YACD,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,CAAC,OAAwB,EAAE,MAAyB;QACzD,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO;QAC5B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QACvB,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YAChD,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;gBACpC,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,KAAK,EAAE,IAAI,CAAC,aAAa,GAAG,CAAC;gBAC7B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;gBACvB,MAAM,EACJ,MAAM,CAAC,KAAK,CAAC,KAAK;oBAClB,MAAM,CAAC,KAAK,CAAC,MAAM;oBACnB,MAAM,CAAC,KAAK,CAAC,SAAS;oBACtB,MAAM,CAAC,KAAK,CAAC,UAAU;gBACzB,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;aACf,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACtC,IAAI,OAAO;gBAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC;QACvC,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACxB,IACE,OAAO,CAAC,UAAU;YAClB,CAAC,IAAI,CAAC,QAAQ;YACd,IAAI,CAAC,MAAM,CAAC,gBAAgB;YAC5B,IAAI,CAAC,qBAAqB,EAC1B,CAAC;YACD,IAAI,CAAC;gBACH,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC,CAAC,oDAAoD,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,WAAW,CAAC,OAA2B;QACrC,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CACnE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,aAAa,CACjC,CAAC;QACF,IAAI,OAAO,CAAC,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QACpC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;YAC1B,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YAClD,MAAM;SACP,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,SAAkC;QACxD,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,6CAA6C,SAAS,EAAE,CAAC,CAAC;YAC5E,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAU,EAAE,CAAC;YACvE,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;gBAAE,OAAO,OAAO,CAAC;QAC7D,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,WAAW,CAAC,EAAU;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;QAChE,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,WAAW,CAAC,OAAwB,EAAE,MAAoC;QACxE,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM;YACN,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI;YACjC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClF,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa;gBACjC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,SAAS,CAAC,aAAa,EAAE;gBACpD,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,CAAC;IACJ,CAAC;IAED,sBAAsB,CAAC,MAAyB,EAAE,OAAwB;QACxE,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACrC,OAAO;YACL,GAAG,MAAM;YACT,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClF,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa;gBACjC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,SAAS,CAAC,aAAa,EAAE;gBACpD,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ export declare class Semaphore {
2
+ #private;
3
+ readonly limit: number;
4
+ constructor(limit: number);
5
+ acquire(signal?: AbortSignal): Promise<() => void>;
6
+ }
7
+ //# sourceMappingURL=semaphore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semaphore.d.ts","sourceRoot":"","sources":["../../src/subagents/semaphore.ts"],"names":[],"mappings":"AAOA,qBAAa,SAAS;;IAIR,QAAQ,CAAC,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM;IAIlC,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;CAyCnD"}
@@ -0,0 +1,54 @@
1
+ export class Semaphore {
2
+ limit;
3
+ #active = 0;
4
+ #waiters = [];
5
+ constructor(limit) {
6
+ this.limit = limit;
7
+ if (!Number.isInteger(limit) || limit < 1)
8
+ throw new Error("Semaphore limit must be positive");
9
+ }
10
+ acquire(signal) {
11
+ if (signal?.aborted)
12
+ return Promise.reject(new Error("Operation aborted"));
13
+ if (this.#active < this.limit) {
14
+ this.#active++;
15
+ return Promise.resolve(this.#releaseFunction());
16
+ }
17
+ return new Promise((resolve, reject) => {
18
+ const waiter = {
19
+ resolve,
20
+ reject,
21
+ signal,
22
+ abortHandler: undefined,
23
+ };
24
+ if (signal) {
25
+ waiter.abortHandler = () => {
26
+ const index = this.#waiters.indexOf(waiter);
27
+ if (index >= 0)
28
+ this.#waiters.splice(index, 1);
29
+ reject(new Error("Operation aborted"));
30
+ };
31
+ signal.addEventListener("abort", waiter.abortHandler, { once: true });
32
+ }
33
+ this.#waiters.push(waiter);
34
+ });
35
+ }
36
+ #releaseFunction() {
37
+ let released = false;
38
+ return () => {
39
+ if (released)
40
+ return;
41
+ released = true;
42
+ const waiter = this.#waiters.shift();
43
+ if (waiter) {
44
+ if (waiter.signal && waiter.abortHandler) {
45
+ waiter.signal.removeEventListener("abort", waiter.abortHandler);
46
+ }
47
+ waiter.resolve(this.#releaseFunction());
48
+ return;
49
+ }
50
+ this.#active--;
51
+ };
52
+ }
53
+ }
54
+ //# sourceMappingURL=semaphore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semaphore.js","sourceRoot":"","sources":["../../src/subagents/semaphore.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,SAAS;IAIC;IAHrB,OAAO,GAAG,CAAC,CAAC;IACH,QAAQ,GAAsB,EAAE,CAAC;IAE1C,YAAqB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;QAChC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACjG,CAAC;IAED,OAAO,CAAC,MAAoB;QAC1B,IAAI,MAAM,EAAE,OAAO;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC3E,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,MAAM,GAAoB;gBAC9B,OAAO;gBACP,MAAM;gBACN,MAAM;gBACN,YAAY,EAAE,SAAS;aACxB,CAAC;YACF,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,YAAY,GAAG,GAAG,EAAE;oBACzB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBAC5C,IAAI,KAAK,IAAI,CAAC;wBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;oBAC/C,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBACzC,CAAC,CAAC;gBACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACxE,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB;QACd,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,OAAO,GAAG,EAAE;YACV,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACrC,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;oBACzC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;gBAClE,CAAC;gBACD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBACxC,OAAO;YACT,CAAC;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import type { SubagentTransportAdapter, SubagentTransportHandle, SubagentTransportLaunch } from "../types.js";
2
+ export declare class LocaltermTransport implements SubagentTransportAdapter {
3
+ readonly kind: "localterm";
4
+ available(): Promise<boolean>;
5
+ launch(request: SubagentTransportLaunch): Promise<SubagentTransportHandle>;
6
+ }
7
+ //# sourceMappingURL=localterm-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localterm-transport.d.ts","sourceRoot":"","sources":["../../../src/subagents/transports/localterm-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,aAAa,CAAC;AAWrB,qBAAa,kBAAmB,YAAW,wBAAwB;IACjE,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;IAE/B,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAU7B,MAAM,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAmCjF"}