@markusylisiurunen/tau 0.3.2 → 0.3.3
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.
- package/README.md +13 -55
- package/dist/core/cli.js +2 -2
- package/dist/core/cli.js.map +1 -1
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/schema.js +0 -159
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/{async/telegram.js → telegram/adapter.js} +229 -329
- package/dist/core/telegram/adapter.js.map +1 -0
- package/dist/core/telegram/cli.js +148 -0
- package/dist/core/telegram/cli.js.map +1 -0
- package/dist/core/telegram/config.js +241 -0
- package/dist/core/telegram/config.js.map +1 -0
- package/dist/core/telegram/index.js +4 -0
- package/dist/core/telegram/index.js.map +1 -0
- package/dist/core/telegram/runtime.js +96 -0
- package/dist/core/telegram/runtime.js.map +1 -0
- package/dist/core/{async → telegram}/session_manager.js +22 -22
- package/dist/core/telegram/session_manager.js.map +1 -0
- package/dist/core/telegram/workspace.js.map +1 -0
- package/dist/core/version.js +1 -1
- package/dist/main.js +7 -7
- package/dist/main.js.map +1 -1
- package/package.json +1 -1
- package/dist/core/async/cli.js +0 -557
- package/dist/core/async/cli.js.map +0 -1
- package/dist/core/async/cron.js +0 -370
- package/dist/core/async/cron.js.map +0 -1
- package/dist/core/async/daemon_runtime.js +0 -120
- package/dist/core/async/daemon_runtime.js.map +0 -1
- package/dist/core/async/http_protocol.js +0 -177
- package/dist/core/async/http_protocol.js.map +0 -1
- package/dist/core/async/http_server.js +0 -278
- package/dist/core/async/http_server.js.map +0 -1
- package/dist/core/async/index.js +0 -10
- package/dist/core/async/index.js.map +0 -1
- package/dist/core/async/server_config.js +0 -420
- package/dist/core/async/server_config.js.map +0 -1
- package/dist/core/async/session_manager.js.map +0 -1
- package/dist/core/async/telegram.js.map +0 -1
- package/dist/core/async/workspace.js.map +0 -1
- /package/dist/core/{async → telegram}/workspace.js +0 -0
package/dist/core/async/cli.js
DELETED
|
@@ -1,557 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { createDefaultConfigDeps } from "../config/deps.js";
|
|
3
|
-
import { getGoogleApiKey, getMistralApiKey, loadConfig } from "../config/schema.js";
|
|
4
|
-
import { AsyncDaemonRuntimeError, startAsyncDaemonRuntime } from "./daemon_runtime.js";
|
|
5
|
-
import { AsyncDaemonConfigError, loadAsyncDaemonConfig } from "./server_config.js";
|
|
6
|
-
import { createAsyncSessionManager, } from "./session_manager.js";
|
|
7
|
-
import { cleanupWorkspaceRootsOnStartup } from "./workspace.js";
|
|
8
|
-
export class AsyncCliError extends Error {
|
|
9
|
-
constructor(message) {
|
|
10
|
-
super(message);
|
|
11
|
-
this.name = "AsyncCliError";
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
const AsyncOptionNames = ["project", "target", "url", "token", "config-file"];
|
|
15
|
-
const AsyncOptionNameSet = new Set(AsyncOptionNames);
|
|
16
|
-
const CronSubcommands = new Set(["list", "runs", "run"]);
|
|
17
|
-
function requireTrimmedValue(value, message) {
|
|
18
|
-
if (typeof value !== "string") {
|
|
19
|
-
throw new AsyncCliError(message);
|
|
20
|
-
}
|
|
21
|
-
const trimmed = value.trim();
|
|
22
|
-
if (!trimmed) {
|
|
23
|
-
throw new AsyncCliError(message);
|
|
24
|
-
}
|
|
25
|
-
return trimmed;
|
|
26
|
-
}
|
|
27
|
-
function parsePromptText(tokens, message) {
|
|
28
|
-
const prompt = tokens.join(" ").trim();
|
|
29
|
-
if (!prompt) {
|
|
30
|
-
throw new AsyncCliError(message);
|
|
31
|
-
}
|
|
32
|
-
return prompt;
|
|
33
|
-
}
|
|
34
|
-
function parseLongOptionToken(arg) {
|
|
35
|
-
const match = /^--([a-z-]+)(?:=(.*))?$/.exec(arg);
|
|
36
|
-
if (!match) {
|
|
37
|
-
throw new AsyncCliError(`unknown option: ${arg}`);
|
|
38
|
-
}
|
|
39
|
-
const name = match[1] ?? "";
|
|
40
|
-
if (!AsyncOptionNameSet.has(name)) {
|
|
41
|
-
throw new AsyncCliError(`unknown option: ${arg}`);
|
|
42
|
-
}
|
|
43
|
-
return {
|
|
44
|
-
name: name,
|
|
45
|
-
flag: `--${name}`,
|
|
46
|
-
inlineValue: match[2],
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
function parseValue(args) {
|
|
50
|
-
if (args.inlineValue !== undefined) {
|
|
51
|
-
const value = requireTrimmedValue(args.inlineValue, `missing value for ${args.flag}`);
|
|
52
|
-
return { value, nextIndex: args.index };
|
|
53
|
-
}
|
|
54
|
-
const next = args.argv[args.index + 1];
|
|
55
|
-
if (!next || next.startsWith("-")) {
|
|
56
|
-
throw new AsyncCliError(`missing value for ${args.flag}`);
|
|
57
|
-
}
|
|
58
|
-
const value = requireTrimmedValue(next, `missing value for ${args.flag}`);
|
|
59
|
-
return { value, nextIndex: args.index + 1 };
|
|
60
|
-
}
|
|
61
|
-
function parseAsyncArgs(argv) {
|
|
62
|
-
let help = false;
|
|
63
|
-
let projectId;
|
|
64
|
-
let targetId;
|
|
65
|
-
let url;
|
|
66
|
-
let token;
|
|
67
|
-
let configFilePath;
|
|
68
|
-
let forcePrompt = false;
|
|
69
|
-
const positional = [];
|
|
70
|
-
for (let i = 0; i < argv.length; i += 1) {
|
|
71
|
-
const arg = argv[i];
|
|
72
|
-
if (forcePrompt) {
|
|
73
|
-
positional.push(arg);
|
|
74
|
-
continue;
|
|
75
|
-
}
|
|
76
|
-
if (arg === "--") {
|
|
77
|
-
forcePrompt = true;
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
if (arg === "--help" || arg === "-h") {
|
|
81
|
-
help = true;
|
|
82
|
-
continue;
|
|
83
|
-
}
|
|
84
|
-
if (arg.startsWith("-")) {
|
|
85
|
-
const optionToken = parseLongOptionToken(arg);
|
|
86
|
-
const parsed = parseValue({
|
|
87
|
-
flag: optionToken.flag,
|
|
88
|
-
inlineValue: optionToken.inlineValue,
|
|
89
|
-
argv,
|
|
90
|
-
index: i,
|
|
91
|
-
});
|
|
92
|
-
i = parsed.nextIndex;
|
|
93
|
-
switch (optionToken.name) {
|
|
94
|
-
case "project":
|
|
95
|
-
projectId = parsed.value;
|
|
96
|
-
break;
|
|
97
|
-
case "target":
|
|
98
|
-
targetId = parsed.value;
|
|
99
|
-
break;
|
|
100
|
-
case "url":
|
|
101
|
-
url = parsed.value;
|
|
102
|
-
break;
|
|
103
|
-
case "token":
|
|
104
|
-
token = parsed.value;
|
|
105
|
-
break;
|
|
106
|
-
case "config-file":
|
|
107
|
-
configFilePath = parsed.value;
|
|
108
|
-
break;
|
|
109
|
-
}
|
|
110
|
-
continue;
|
|
111
|
-
}
|
|
112
|
-
positional.push(arg);
|
|
113
|
-
}
|
|
114
|
-
const shared = {
|
|
115
|
-
help,
|
|
116
|
-
...(projectId === undefined ? {} : { projectId }),
|
|
117
|
-
...(targetId === undefined ? {} : { targetId }),
|
|
118
|
-
...(url === undefined ? {} : { url }),
|
|
119
|
-
...(token === undefined ? {} : { token }),
|
|
120
|
-
...(configFilePath === undefined ? {} : { configFilePath }),
|
|
121
|
-
};
|
|
122
|
-
const toCreateArgs = () => ({
|
|
123
|
-
...shared,
|
|
124
|
-
command: "create",
|
|
125
|
-
prompt: parsePromptText(positional, "missing prompt text"),
|
|
126
|
-
});
|
|
127
|
-
const first = positional[0];
|
|
128
|
-
if (!first) {
|
|
129
|
-
if (shared.help) {
|
|
130
|
-
return { ...shared, command: "list" };
|
|
131
|
-
}
|
|
132
|
-
throw new AsyncCliError("missing async command or prompt");
|
|
133
|
-
}
|
|
134
|
-
if (forcePrompt) {
|
|
135
|
-
return toCreateArgs();
|
|
136
|
-
}
|
|
137
|
-
if (first === "daemon") {
|
|
138
|
-
if (positional.length === 1) {
|
|
139
|
-
return { ...shared, command: "daemon" };
|
|
140
|
-
}
|
|
141
|
-
return toCreateArgs();
|
|
142
|
-
}
|
|
143
|
-
if (first === "list") {
|
|
144
|
-
if (positional.length === 1) {
|
|
145
|
-
return { ...shared, command: "list" };
|
|
146
|
-
}
|
|
147
|
-
return toCreateArgs();
|
|
148
|
-
}
|
|
149
|
-
if (first === "status") {
|
|
150
|
-
if (positional.length === 1) {
|
|
151
|
-
throw new AsyncCliError("missing session id for status");
|
|
152
|
-
}
|
|
153
|
-
if (positional.length === 2) {
|
|
154
|
-
return {
|
|
155
|
-
...shared,
|
|
156
|
-
command: "status",
|
|
157
|
-
sessionId: requireTrimmedValue(positional[1], "missing session id for status"),
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
return toCreateArgs();
|
|
161
|
-
}
|
|
162
|
-
if (first === "logs") {
|
|
163
|
-
if (positional.length === 1) {
|
|
164
|
-
throw new AsyncCliError("missing session id for logs");
|
|
165
|
-
}
|
|
166
|
-
if (positional.length === 2) {
|
|
167
|
-
return {
|
|
168
|
-
...shared,
|
|
169
|
-
command: "logs",
|
|
170
|
-
sessionId: requireTrimmedValue(positional[1], "missing session id for logs"),
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
return toCreateArgs();
|
|
174
|
-
}
|
|
175
|
-
if (first === "send") {
|
|
176
|
-
const sessionId = requireTrimmedValue(positional[1], "missing session id for send");
|
|
177
|
-
if (positional.length === 2) {
|
|
178
|
-
throw new AsyncCliError("missing message text for send");
|
|
179
|
-
}
|
|
180
|
-
return {
|
|
181
|
-
...shared,
|
|
182
|
-
command: "send",
|
|
183
|
-
sessionId,
|
|
184
|
-
text: parsePromptText(positional.slice(2), "missing message text for send"),
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
if (first === "interrupt") {
|
|
188
|
-
if (positional.length === 1) {
|
|
189
|
-
throw new AsyncCliError("missing session id for interrupt");
|
|
190
|
-
}
|
|
191
|
-
if (positional.length === 2) {
|
|
192
|
-
return {
|
|
193
|
-
...shared,
|
|
194
|
-
command: "interrupt",
|
|
195
|
-
sessionId: requireTrimmedValue(positional[1], "missing session id for interrupt"),
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
return toCreateArgs();
|
|
199
|
-
}
|
|
200
|
-
if (first === "cron") {
|
|
201
|
-
const missingCronSubcommandMessage = "missing cron subcommand. use: cron list | cron runs [jobId] | cron run <jobId>";
|
|
202
|
-
const subcommandRaw = requireTrimmedValue(positional[1], missingCronSubcommandMessage);
|
|
203
|
-
if (!CronSubcommands.has(subcommandRaw)) {
|
|
204
|
-
throw new AsyncCliError(`unknown cron subcommand '${subcommandRaw}'`);
|
|
205
|
-
}
|
|
206
|
-
if (subcommandRaw === "list") {
|
|
207
|
-
if (positional.length !== 2) {
|
|
208
|
-
throw new AsyncCliError("usage: tau async cron list");
|
|
209
|
-
}
|
|
210
|
-
return {
|
|
211
|
-
...shared,
|
|
212
|
-
command: "cron-list",
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
if (subcommandRaw === "runs") {
|
|
216
|
-
if (positional.length > 3) {
|
|
217
|
-
throw new AsyncCliError("usage: tau async cron runs [jobId]");
|
|
218
|
-
}
|
|
219
|
-
const cronJobId = positional.length === 3
|
|
220
|
-
? requireTrimmedValue(positional[2], "usage: tau async cron runs [jobId]")
|
|
221
|
-
: undefined;
|
|
222
|
-
return {
|
|
223
|
-
...shared,
|
|
224
|
-
command: "cron-runs",
|
|
225
|
-
...(cronJobId === undefined ? {} : { cronJobId }),
|
|
226
|
-
};
|
|
227
|
-
}
|
|
228
|
-
const cronJobId = requireTrimmedValue(positional[2], "missing cron job id for run");
|
|
229
|
-
if (positional.length !== 3) {
|
|
230
|
-
throw new AsyncCliError("usage: tau async cron run <jobId>");
|
|
231
|
-
}
|
|
232
|
-
return {
|
|
233
|
-
...shared,
|
|
234
|
-
command: "cron-run",
|
|
235
|
-
cronJobId,
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
return toCreateArgs();
|
|
239
|
-
}
|
|
240
|
-
function getTrimmedEnvValue(key, env) {
|
|
241
|
-
const value = env[key];
|
|
242
|
-
if (typeof value !== "string") {
|
|
243
|
-
return undefined;
|
|
244
|
-
}
|
|
245
|
-
const trimmed = value.trim();
|
|
246
|
-
return trimmed || undefined;
|
|
247
|
-
}
|
|
248
|
-
function collectDaemonWorkspaceRoots(daemonConfig) {
|
|
249
|
-
const roots = new Set([daemonConfig.workspaceRoot]);
|
|
250
|
-
for (const project of Object.values(daemonConfig.projects)) {
|
|
251
|
-
if (project.workspaceRoot) {
|
|
252
|
-
roots.add(project.workspaceRoot);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
return Array.from(roots);
|
|
256
|
-
}
|
|
257
|
-
function logStartupCleanupSummary(args) {
|
|
258
|
-
for (const result of args.results) {
|
|
259
|
-
if (result.deletedEntries > 0) {
|
|
260
|
-
args.stdout(`[daemon:info] startup workspace cleanup removed ${result.deletedEntries} entries under ${result.workspaceRoot}`);
|
|
261
|
-
}
|
|
262
|
-
for (const failure of result.failures) {
|
|
263
|
-
args.stdout(`[daemon:warn] startup workspace cleanup failed for ${failure.path}: ${failure.cause}`);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
function resolveProjectId(args, config) {
|
|
268
|
-
const configured = config.async?.client?.defaultProjectId?.trim();
|
|
269
|
-
const projectId = args.projectId ?? (configured || undefined);
|
|
270
|
-
if (!projectId) {
|
|
271
|
-
throw new AsyncCliError("missing project id. use --project <id> or set async.client.defaultProjectId");
|
|
272
|
-
}
|
|
273
|
-
return projectId;
|
|
274
|
-
}
|
|
275
|
-
function resolveTarget(config, args) {
|
|
276
|
-
const targets = config.async?.client?.targets ?? {};
|
|
277
|
-
const configuredDefault = config.async?.client?.defaultTarget;
|
|
278
|
-
const targetIds = Object.keys(targets);
|
|
279
|
-
let selectedTargetId = args.targetId;
|
|
280
|
-
if (!selectedTargetId && (args.url === undefined || args.token === undefined)) {
|
|
281
|
-
selectedTargetId = configuredDefault ?? (targetIds.length === 1 ? targetIds[0] : undefined);
|
|
282
|
-
}
|
|
283
|
-
const selectedTarget = selectedTargetId ? targets[selectedTargetId] : undefined;
|
|
284
|
-
if (selectedTargetId && !selectedTarget) {
|
|
285
|
-
throw new AsyncCliError(`unknown async target '${selectedTargetId}'`);
|
|
286
|
-
}
|
|
287
|
-
const url = args.url ?? selectedTarget?.url;
|
|
288
|
-
const token = args.token ?? selectedTarget?.token;
|
|
289
|
-
const timeoutMs = selectedTarget?.timeoutMs;
|
|
290
|
-
if (!url) {
|
|
291
|
-
throw new AsyncCliError("missing async target url. set --url or config.async.client.targets");
|
|
292
|
-
}
|
|
293
|
-
if (!token) {
|
|
294
|
-
throw new AsyncCliError("missing async target token. set --token or config.async.client.targets");
|
|
295
|
-
}
|
|
296
|
-
return { url, token, timeoutMs };
|
|
297
|
-
}
|
|
298
|
-
function buildUrl(baseUrl, path) {
|
|
299
|
-
const base = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
300
|
-
return new URL(path.startsWith("/") ? path.slice(1) : path, base).toString();
|
|
301
|
-
}
|
|
302
|
-
const ErrorEnvelopeSchema = z
|
|
303
|
-
.object({
|
|
304
|
-
error: z.unknown(),
|
|
305
|
-
})
|
|
306
|
-
.transform((payload) => String(payload.error));
|
|
307
|
-
const SuccessEnvelopeSchema = z.object({
|
|
308
|
-
ok: z.literal(true),
|
|
309
|
-
data: z.unknown(),
|
|
310
|
-
});
|
|
311
|
-
function throwRequestFailure(status, payload) {
|
|
312
|
-
const parsedError = ErrorEnvelopeSchema.safeParse(payload);
|
|
313
|
-
if (parsedError.success) {
|
|
314
|
-
throw new AsyncCliError(`request failed (${status}): ${parsedError.data}`);
|
|
315
|
-
}
|
|
316
|
-
throw new AsyncCliError(`request failed (${status})`);
|
|
317
|
-
}
|
|
318
|
-
function parseResponsePayload(text) {
|
|
319
|
-
if (!text.trim()) {
|
|
320
|
-
return undefined;
|
|
321
|
-
}
|
|
322
|
-
try {
|
|
323
|
-
return JSON.parse(text);
|
|
324
|
-
}
|
|
325
|
-
catch {
|
|
326
|
-
return text;
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
async function requestJson(args) {
|
|
330
|
-
const controller = new AbortController();
|
|
331
|
-
const timeoutMs = args.target.timeoutMs ?? 30_000;
|
|
332
|
-
const timeout = setTimeout(() => {
|
|
333
|
-
controller.abort();
|
|
334
|
-
}, timeoutMs);
|
|
335
|
-
timeout.unref?.();
|
|
336
|
-
try {
|
|
337
|
-
const response = await args.fetchImpl(buildUrl(args.target.url, args.path), {
|
|
338
|
-
method: args.method,
|
|
339
|
-
headers: {
|
|
340
|
-
authorization: `Bearer ${args.target.token}`,
|
|
341
|
-
accept: "application/json",
|
|
342
|
-
...(args.body === undefined
|
|
343
|
-
? {}
|
|
344
|
-
: {
|
|
345
|
-
"content-type": "application/json",
|
|
346
|
-
}),
|
|
347
|
-
},
|
|
348
|
-
...(args.body === undefined ? {} : { body: JSON.stringify(args.body) }),
|
|
349
|
-
signal: controller.signal,
|
|
350
|
-
});
|
|
351
|
-
const payload = parseResponsePayload(await response.text());
|
|
352
|
-
if (!response.ok) {
|
|
353
|
-
throwRequestFailure(response.status, payload);
|
|
354
|
-
}
|
|
355
|
-
const successPayload = SuccessEnvelopeSchema.safeParse(payload);
|
|
356
|
-
if (!successPayload.success) {
|
|
357
|
-
throw new AsyncCliError(`unexpected response format (${response.status})`);
|
|
358
|
-
}
|
|
359
|
-
return successPayload.data;
|
|
360
|
-
}
|
|
361
|
-
catch (error) {
|
|
362
|
-
if (error instanceof AsyncCliError) {
|
|
363
|
-
throw error;
|
|
364
|
-
}
|
|
365
|
-
if (error.name === "AbortError") {
|
|
366
|
-
throw new AsyncCliError(`request timed out after ${timeoutMs}ms`);
|
|
367
|
-
}
|
|
368
|
-
throw new AsyncCliError(`request failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
369
|
-
}
|
|
370
|
-
finally {
|
|
371
|
-
clearTimeout(timeout);
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
function toJsonLine(value) {
|
|
375
|
-
return JSON.stringify(value, null, 2);
|
|
376
|
-
}
|
|
377
|
-
export function printAsyncHelp(log = console.log) {
|
|
378
|
-
log([
|
|
379
|
-
"usage:",
|
|
380
|
-
" tau async daemon --config-file <path>",
|
|
381
|
-
" tau async --project <id> <prompt...>",
|
|
382
|
-
" tau async <prompt...>",
|
|
383
|
-
" tau async list",
|
|
384
|
-
" tau async status <id>",
|
|
385
|
-
" tau async logs <id>",
|
|
386
|
-
" tau async send <id> <text...>",
|
|
387
|
-
" tau async interrupt <id>",
|
|
388
|
-
" tau async cron list",
|
|
389
|
-
" tau async cron runs [jobId]",
|
|
390
|
-
" tau async cron run <jobId>",
|
|
391
|
-
"",
|
|
392
|
-
"options:",
|
|
393
|
-
" --project <id> project id for session creation (overrides config).",
|
|
394
|
-
" --config-file <path> daemon config file path (daemon mode only).",
|
|
395
|
-
" --target <id> target id from config.async.client.targets.",
|
|
396
|
-
" --url <url> override async target base URL.",
|
|
397
|
-
" --token <token> override async bearer token.",
|
|
398
|
-
" -- treat remaining args as prompt text.",
|
|
399
|
-
" --help show this help and exit.",
|
|
400
|
-
].join("\n"));
|
|
401
|
-
}
|
|
402
|
-
async function runDaemon(args) {
|
|
403
|
-
let daemonConfig;
|
|
404
|
-
try {
|
|
405
|
-
daemonConfig = loadAsyncDaemonConfig(args.configFilePath);
|
|
406
|
-
}
|
|
407
|
-
catch (error) {
|
|
408
|
-
if (error instanceof AsyncDaemonConfigError) {
|
|
409
|
-
throw new AsyncCliError(error.message);
|
|
410
|
-
}
|
|
411
|
-
throw error;
|
|
412
|
-
}
|
|
413
|
-
const authToken = getTrimmedEnvValue("TAU_ASYNC_AUTH_TOKEN", args.env) ?? daemonConfig.authToken;
|
|
414
|
-
const speechToTextProvider = args.config.speechToText?.provider ?? "mistral";
|
|
415
|
-
const geminiApiKey = getGoogleApiKey(args.config, args.env);
|
|
416
|
-
const mistralApiKey = getMistralApiKey(args.config, args.env);
|
|
417
|
-
if (!authToken) {
|
|
418
|
-
throw new AsyncCliError("missing async auth token. set authToken in daemon config or TAU_ASYNC_AUTH_TOKEN");
|
|
419
|
-
}
|
|
420
|
-
if (!args.createSessionClient) {
|
|
421
|
-
throw new AsyncCliError("missing async session client factory");
|
|
422
|
-
}
|
|
423
|
-
const sessionManager = createAsyncSessionManager({
|
|
424
|
-
projects: daemonConfig.projects,
|
|
425
|
-
workspaceRoot: daemonConfig.workspaceRoot,
|
|
426
|
-
maxSessions: daemonConfig.maxSessions,
|
|
427
|
-
systemMessage: daemonConfig.systemMessage,
|
|
428
|
-
createClient: args.createSessionClient,
|
|
429
|
-
});
|
|
430
|
-
const startupCleanupResults = await cleanupWorkspaceRootsOnStartup(collectDaemonWorkspaceRoots(daemonConfig));
|
|
431
|
-
logStartupCleanupSummary({
|
|
432
|
-
stdout: args.stdout,
|
|
433
|
-
results: startupCleanupResults,
|
|
434
|
-
});
|
|
435
|
-
let runtime;
|
|
436
|
-
try {
|
|
437
|
-
runtime = await startAsyncDaemonRuntime({
|
|
438
|
-
daemonConfig,
|
|
439
|
-
authToken,
|
|
440
|
-
speechToTextProvider,
|
|
441
|
-
geminiApiKey,
|
|
442
|
-
mistralApiKey,
|
|
443
|
-
sessionManager,
|
|
444
|
-
onLog: args.stdout,
|
|
445
|
-
});
|
|
446
|
-
}
|
|
447
|
-
catch (error) {
|
|
448
|
-
if (error instanceof AsyncDaemonRuntimeError) {
|
|
449
|
-
throw new AsyncCliError(error.message);
|
|
450
|
-
}
|
|
451
|
-
throw error;
|
|
452
|
-
}
|
|
453
|
-
args.stdout(`tau async daemon listening on ${runtime.baseUrl}`);
|
|
454
|
-
await new Promise((resolvePromise) => {
|
|
455
|
-
let shuttingDown = false;
|
|
456
|
-
const onSignal = () => {
|
|
457
|
-
if (shuttingDown) {
|
|
458
|
-
return;
|
|
459
|
-
}
|
|
460
|
-
shuttingDown = true;
|
|
461
|
-
process.off("SIGINT", onSignal);
|
|
462
|
-
process.off("SIGTERM", onSignal);
|
|
463
|
-
void runtime.close().then(() => {
|
|
464
|
-
resolvePromise();
|
|
465
|
-
});
|
|
466
|
-
};
|
|
467
|
-
process.on("SIGINT", onSignal);
|
|
468
|
-
process.on("SIGTERM", onSignal);
|
|
469
|
-
});
|
|
470
|
-
}
|
|
471
|
-
export async function runAsyncCommand(argv, options = {}) {
|
|
472
|
-
const parsed = parseAsyncArgs(argv);
|
|
473
|
-
const stdout = options.stdout ?? console.log;
|
|
474
|
-
if (parsed.help) {
|
|
475
|
-
printAsyncHelp(stdout);
|
|
476
|
-
return;
|
|
477
|
-
}
|
|
478
|
-
const cwd = options.cwd ?? process.cwd();
|
|
479
|
-
const env = options.env ?? process.env;
|
|
480
|
-
const config = options.config ?? loadConfig(cwd, createDefaultConfigDeps());
|
|
481
|
-
if (parsed.command === "daemon") {
|
|
482
|
-
if (!parsed.configFilePath) {
|
|
483
|
-
throw new AsyncCliError("missing --config-file <path> for daemon mode");
|
|
484
|
-
}
|
|
485
|
-
await runDaemon({
|
|
486
|
-
configFilePath: parsed.configFilePath,
|
|
487
|
-
env,
|
|
488
|
-
config,
|
|
489
|
-
createSessionClient: options.createSessionClient,
|
|
490
|
-
stdout,
|
|
491
|
-
});
|
|
492
|
-
return;
|
|
493
|
-
}
|
|
494
|
-
if (parsed.configFilePath) {
|
|
495
|
-
throw new AsyncCliError("--config-file can only be used with 'tau async daemon'");
|
|
496
|
-
}
|
|
497
|
-
const target = resolveTarget(config, parsed);
|
|
498
|
-
const fetchImpl = options.fetchImpl ?? fetch;
|
|
499
|
-
const request = (() => {
|
|
500
|
-
switch (parsed.command) {
|
|
501
|
-
case "create":
|
|
502
|
-
return {
|
|
503
|
-
method: "POST",
|
|
504
|
-
path: "/v1/sessions",
|
|
505
|
-
body: {
|
|
506
|
-
projectId: resolveProjectId(parsed, config),
|
|
507
|
-
prompt: parsed.prompt,
|
|
508
|
-
},
|
|
509
|
-
};
|
|
510
|
-
case "list":
|
|
511
|
-
return { method: "GET", path: "/v1/sessions" };
|
|
512
|
-
case "status":
|
|
513
|
-
return {
|
|
514
|
-
method: "GET",
|
|
515
|
-
path: `/v1/sessions/${encodeURIComponent(parsed.sessionId)}`,
|
|
516
|
-
};
|
|
517
|
-
case "logs":
|
|
518
|
-
return {
|
|
519
|
-
method: "GET",
|
|
520
|
-
path: `/v1/sessions/${encodeURIComponent(parsed.sessionId)}/logs`,
|
|
521
|
-
};
|
|
522
|
-
case "send":
|
|
523
|
-
return {
|
|
524
|
-
method: "POST",
|
|
525
|
-
path: `/v1/sessions/${encodeURIComponent(parsed.sessionId)}/messages`,
|
|
526
|
-
body: { text: parsed.text },
|
|
527
|
-
};
|
|
528
|
-
case "interrupt":
|
|
529
|
-
return {
|
|
530
|
-
method: "POST",
|
|
531
|
-
path: `/v1/sessions/${encodeURIComponent(parsed.sessionId)}/interrupt`,
|
|
532
|
-
body: {},
|
|
533
|
-
};
|
|
534
|
-
case "cron-list":
|
|
535
|
-
return { method: "GET", path: "/v1/cron/jobs" };
|
|
536
|
-
case "cron-runs": {
|
|
537
|
-
const query = parsed.cronJobId ? `?jobId=${encodeURIComponent(parsed.cronJobId)}` : "";
|
|
538
|
-
return { method: "GET", path: `/v1/cron/runs${query}` };
|
|
539
|
-
}
|
|
540
|
-
case "cron-run":
|
|
541
|
-
return {
|
|
542
|
-
method: "POST",
|
|
543
|
-
path: `/v1/cron/jobs/${encodeURIComponent(parsed.cronJobId)}/run`,
|
|
544
|
-
body: {},
|
|
545
|
-
};
|
|
546
|
-
}
|
|
547
|
-
})();
|
|
548
|
-
const payload = await requestJson({
|
|
549
|
-
target,
|
|
550
|
-
method: request.method,
|
|
551
|
-
path: request.path,
|
|
552
|
-
...(request.body === undefined ? {} : { body: request.body }),
|
|
553
|
-
fetchImpl,
|
|
554
|
-
});
|
|
555
|
-
stdout(toJsonLine(payload));
|
|
556
|
-
}
|
|
557
|
-
//# sourceMappingURL=cli.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/core/async/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAGL,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAEhE,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAkED,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,CAAU,CAAC;AAEvF,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAS,gBAAgB,CAAC,CAAC;AAE7D,MAAM,eAAe,GAAG,IAAI,GAAG,CAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAEjE,SAAS,mBAAmB,CAAC,KAAyB,EAAE,OAAe;IACrE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,MAAgB,EAAE,OAAe;IACxD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAW;IAKvC,MAAM,KAAK,GAAG,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,aAAa,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,aAAa,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO;QACL,IAAI,EAAE,IAAuB;QAC7B,IAAI,EAAE,KAAK,IAAI,EAAE;QACjB,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAA2E;IAI7F,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACtF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,aAAa,CAAC,qBAAqB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1E,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,cAAc,CAAC,IAAc;IACpC,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,SAA6B,CAAC;IAClC,IAAI,QAA4B,CAAC;IACjC,IAAI,GAAuB,CAAC;IAC5B,IAAI,KAAyB,CAAC;IAC9B,IAAI,cAAkC,CAAC;IACvC,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QAErB,IAAI,WAAW,EAAE,CAAC;YAChB,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,WAAW,GAAG,IAAI,CAAC;YACnB,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,IAAI,GAAG,IAAI,CAAC;YACZ,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,WAAW,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,UAAU,CAAC;gBACxB,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,WAAW,EAAE,WAAW,CAAC,WAAW;gBACpC,IAAI;gBACJ,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;YACH,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;YAErB,QAAQ,WAAW,CAAC,IAAI,EAAE,CAAC;gBACzB,KAAK,SAAS;oBACZ,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;oBACzB,MAAM;gBACR,KAAK,QAAQ;oBACX,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;oBACxB,MAAM;gBACR,KAAK,KAAK;oBACR,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;oBACnB,MAAM;gBACR,KAAK,OAAO;oBACV,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;oBACrB,MAAM;gBACR,KAAK,aAAa;oBAChB,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC;oBAC9B,MAAM;YACV,CAAC;YACD,SAAS;QACX,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,MAAM,GAA0B;QACpC,IAAI;QACJ,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACjD,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC/C,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;QACrC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACzC,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC;KAC5D,CAAC;IAEF,MAAM,YAAY,GAAG,GAAoB,EAAE,CAAC,CAAC;QAC3C,GAAG,MAAM;QACT,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,eAAe,CAAC,UAAU,EAAE,qBAAqB,CAAC;KAC3D,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACxC,CAAC;QACD,MAAM,IAAI,aAAa,CAAC,iCAAiC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QAC1C,CAAC;QACD,OAAO,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACxC,CAAC;QACD,OAAO,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,aAAa,CAAC,+BAA+B,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO;gBACL,GAAG,MAAM;gBACT,OAAO,EAAE,QAAQ;gBACjB,SAAS,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,+BAA+B,CAAC;aAC/E,CAAC;QACJ,CAAC;QAED,OAAO,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,aAAa,CAAC,6BAA6B,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO;gBACL,GAAG,MAAM;gBACT,OAAO,EAAE,MAAM;gBACf,SAAS,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,6BAA6B,CAAC;aAC7E,CAAC;QACJ,CAAC;QAED,OAAO,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,6BAA6B,CAAC,CAAC;QAEpF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,aAAa,CAAC,+BAA+B,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO;YACL,GAAG,MAAM;YACT,OAAO,EAAE,MAAM;YACf,SAAS;YACT,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,+BAA+B,CAAC;SAC5E,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QAC1B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,aAAa,CAAC,kCAAkC,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO;gBACL,GAAG,MAAM;gBACT,OAAO,EAAE,WAAW;gBACpB,SAAS,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,kCAAkC,CAAC;aAClF,CAAC;QACJ,CAAC;QAED,OAAO,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,MAAM,4BAA4B,GAChC,gFAAgF,CAAC;QACnF,MAAM,aAAa,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC;QAEvF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,aAAa,CAAC,4BAA4B,aAAa,GAAG,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;YAC7B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,aAAa,CAAC,4BAA4B,CAAC,CAAC;YACxD,CAAC;YAED,OAAO;gBACL,GAAG,MAAM;gBACT,OAAO,EAAE,WAAW;aACrB,CAAC;QACJ,CAAC;QAED,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;YAC7B,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,aAAa,CAAC,oCAAoC,CAAC,CAAC;YAChE,CAAC;YAED,MAAM,SAAS,GACb,UAAU,CAAC,MAAM,KAAK,CAAC;gBACrB,CAAC,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,oCAAoC,CAAC;gBAC1E,CAAC,CAAC,SAAS,CAAC;YAEhB,OAAO;gBACL,GAAG,MAAM;gBACT,OAAO,EAAE,WAAW;gBACpB,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;aAClD,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,6BAA6B,CAAC,CAAC;QAEpF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,aAAa,CAAC,mCAAmC,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO;YACL,GAAG,MAAM;YACT,OAAO,EAAE,UAAU;YACnB,SAAS;SACV,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW,EAAE,GAAsB;IAC7D,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,IAAI,SAAS,CAAC;AAC9B,CAAC;AAED,SAAS,2BAA2B,CAClC,YAAsD;IAEtD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAS,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC;IAE5D,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,wBAAwB,CAAC,IAGjC;IACC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,MAAM,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CACT,mDAAmD,MAAM,CAAC,cAAc,kBAAkB,MAAM,CAAC,aAAa,EAAE,CACjH,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CACT,sDAAsD,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,KAAK,EAAE,CACvF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAqB,EAAE,MAAc;IAC7D,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,aAAa,CACrB,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CAAC,MAAc,EAAE,IAAqB;IAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;IACpD,MAAM,iBAAiB,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC;IAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEvC,IAAI,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC;IACrC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,EAAE,CAAC;QAC9E,gBAAgB,GAAG,iBAAiB,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,cAAc,GAAG,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChF,IAAI,gBAAgB,IAAI,CAAC,cAAc,EAAE,CAAC;QACxC,MAAM,IAAI,aAAa,CAAC,yBAAyB,gBAAgB,GAAG,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,cAAc,EAAE,GAAG,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,cAAc,EAAE,KAAK,CAAC;IAClD,MAAM,SAAS,GAAG,cAAc,EAAE,SAAS,CAAC;IAE5C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,aAAa,CAAC,oEAAoE,CAAC,CAAC;IAChG,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,aAAa,CACrB,wEAAwE,CACzE,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAE,IAAY;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC;IAC7D,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,mBAAmB,GAAG,CAAC;KAC1B,MAAM,CAAC;IACN,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE;CACnB,CAAC;KACD,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAEjD,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACnB,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;CAClB,CAAC,CAAC;AAEH,SAAS,mBAAmB,CAAC,MAAc,EAAE,OAAgB;IAC3D,MAAM,WAAW,GAAG,mBAAmB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,aAAa,CAAC,mBAAmB,MAAM,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,IAAI,aAAa,CAAC,mBAAmB,MAAM,GAAG,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAM1B;IACC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC;IAElD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;QAC9B,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC,EAAE,SAAS,CAAC,CAAC;IACd,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IAElB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;YAC1E,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC5C,MAAM,EAAE,kBAAkB;gBAC1B,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS;oBACzB,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC;wBACE,cAAc,EAAE,kBAAkB;qBACnC,CAAC;aACP;YACD,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvE,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAE5D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,mBAAmB,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,cAAc,GAAG,qBAAqB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,aAAa,CAAC,+BAA+B,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7E,CAAC;QAED,OAAO,cAAc,CAAC,IAAI,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;YACnC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAK,KAA2B,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACvD,MAAM,IAAI,aAAa,CAAC,2BAA2B,SAAS,IAAI,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,IAAI,aAAa,CACrB,mBAAmB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC5E,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAA8B,OAAO,CAAC,GAAG;IACtE,GAAG,CACD;QACE,QAAQ;QACR,yCAAyC;QACzC,wCAAwC;QACxC,yBAAyB;QACzB,kBAAkB;QAClB,yBAAyB;QACzB,uBAAuB;QACvB,iCAAiC;QACjC,4BAA4B;QAC5B,uBAAuB;QACvB,+BAA+B;QAC/B,8BAA8B;QAC9B,EAAE;QACF,UAAU;QACV,6EAA6E;QAC7E,qEAAqE;QACrE,qEAAqE;QACrE,yDAAyD;QACzD,sDAAsD;QACtD,8DAA8D;QAC9D,kDAAkD;KACnD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAMxB;IACC,IAAI,YAAsD,CAAC;IAC3D,IAAI,CAAC;QACH,YAAY,GAAG,qBAAqB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,sBAAsB,EAAE,CAAC;YAC5C,MAAM,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,sBAAsB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,SAAS,CAAC;IACjG,MAAM,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,IAAI,SAAS,CAAC;IAC7E,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAE9D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,aAAa,CACrB,kFAAkF,CACnF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC9B,MAAM,IAAI,aAAa,CAAC,sCAAsC,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,cAAc,GAAG,yBAAyB,CAAC;QAC/C,QAAQ,EAAE,YAAY,CAAC,QAAQ;QAC/B,aAAa,EAAE,YAAY,CAAC,aAAa;QACzC,WAAW,EAAE,YAAY,CAAC,WAAW;QACrC,aAAa,EAAE,YAAY,CAAC,aAAa;QACzC,YAAY,EAAE,IAAI,CAAC,mBAAmB;KACvC,CAAC,CAAC;IAEH,MAAM,qBAAqB,GAAG,MAAM,8BAA8B,CAChE,2BAA2B,CAAC,YAAY,CAAC,CAC1C,CAAC;IACF,wBAAwB,CAAC;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,qBAAqB;KAC/B,CAAC,CAAC;IAEH,IAAI,OAA4D,CAAC;IAEjE,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,uBAAuB,CAAC;YACtC,YAAY;YACZ,SAAS;YACT,oBAAoB;YACpB,YAAY;YACZ,aAAa;YACb,cAAc;YACd,KAAK,EAAE,IAAI,CAAC,MAAM;SACnB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,uBAAuB,EAAE,CAAC;YAC7C,MAAM,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,iCAAiC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAEhE,MAAM,IAAI,OAAO,CAAO,CAAC,cAAc,EAAE,EAAE;QACzC,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,YAAY,GAAG,IAAI,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEjC,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC7B,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAc,EACd,UAAkC,EAAE;IAEpC,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC;IAE7C,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,cAAc,CAAC,MAAM,CAAC,CAAC;QACvB,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC,GAAG,EAAE,uBAAuB,EAAE,CAAC,CAAC;IAE5E,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAC3B,MAAM,IAAI,aAAa,CAAC,8CAA8C,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,SAAS,CAAC;YACd,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,GAAG;YACH,MAAM;YACN,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;YAChD,MAAM;SACP,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,MAAM,IAAI,aAAa,CAAC,wDAAwD,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAE7C,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE;QACpB,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,KAAK,QAAQ;gBACX,OAAO;oBACL,MAAM,EAAE,MAAe;oBACvB,IAAI,EAAE,cAAc;oBACpB,IAAI,EAAE;wBACJ,SAAS,EAAE,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC;wBAC3C,MAAM,EAAE,MAAM,CAAC,MAAM;qBACtB;iBACF,CAAC;YACJ,KAAK,MAAM;gBACT,OAAO,EAAE,MAAM,EAAE,KAAc,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;YAC1D,KAAK,QAAQ;gBACX,OAAO;oBACL,MAAM,EAAE,KAAc;oBACtB,IAAI,EAAE,gBAAgB,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;iBAC7D,CAAC;YACJ,KAAK,MAAM;gBACT,OAAO;oBACL,MAAM,EAAE,KAAc;oBACtB,IAAI,EAAE,gBAAgB,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO;iBAClE,CAAC;YACJ,KAAK,MAAM;gBACT,OAAO;oBACL,MAAM,EAAE,MAAe;oBACvB,IAAI,EAAE,gBAAgB,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW;oBACrE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;iBAC5B,CAAC;YACJ,KAAK,WAAW;gBACd,OAAO;oBACL,MAAM,EAAE,MAAe;oBACvB,IAAI,EAAE,gBAAgB,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY;oBACtE,IAAI,EAAE,EAAE;iBACT,CAAC;YACJ,KAAK,WAAW;gBACd,OAAO,EAAE,MAAM,EAAE,KAAc,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;YAC3D,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvF,OAAO,EAAE,MAAM,EAAE,KAAc,EAAE,IAAI,EAAE,gBAAgB,KAAK,EAAE,EAAE,CAAC;YACnE,CAAC;YACD,KAAK,UAAU;gBACb,OAAO;oBACL,MAAM,EAAE,MAAe;oBACvB,IAAI,EAAE,iBAAiB,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM;oBACjE,IAAI,EAAE,EAAE;iBACT,CAAC;QACN,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC;QAChC,MAAM;QACN,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAC7D,SAAS;KACV,CAAC,CAAC;IACH,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9B,CAAC"}
|