@vetala/vetala 0.2.2-dev → 0.3.0-dev

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.
@@ -0,0 +1,431 @@
1
+ import * as readline from "node:readline";
2
+ import { loadConfig } from "./config.js";
3
+ import { Agent, isAgentInterruptedError } from "./agent.js";
4
+ import { ApprovalManager } from "./approvals.js";
5
+ import { IpcTerminalUI } from "./ipc-ui.js";
6
+ import { PathPolicy } from "./path-policy.js";
7
+ import { SessionStore } from "./session-store.js";
8
+ import { SkillRuntime } from "./skills/runtime.js";
9
+ import { createToolRegistry } from "./tools/index.js";
10
+ import { detectRuntimeHostProfile } from "./runtime-profile.js";
11
+ async function main() {
12
+ // Parse workspace from args
13
+ const args = process.argv.slice(2);
14
+ let workspace = process.cwd();
15
+ for (let i = 0; i < args.length; i++) {
16
+ if (args[i] === "--workspace" && i + 1 < args.length) {
17
+ workspace = args[i + 1];
18
+ }
19
+ }
20
+ let config = await loadConfig();
21
+ const store = new SessionStore();
22
+ const runtimeProfile = detectRuntimeHostProfile();
23
+ const ui = new IpcTerminalUI(runtimeProfile);
24
+ // Load or create a session
25
+ let session;
26
+ try {
27
+ const sessions = await store.listSessions();
28
+ const matching = sessions.find((s) => s.workspaceRoot === workspace);
29
+ if (matching) {
30
+ session = await store.loadSession(matching.id);
31
+ }
32
+ else {
33
+ session = await store.createSession(workspace, config.defaultProvider, config.defaultModel);
34
+ }
35
+ }
36
+ catch {
37
+ session = await store.createSession(workspace, config.defaultProvider, config.defaultModel);
38
+ }
39
+ // Send the initial ready message with dashboard data
40
+ ui.sendReady(session);
41
+ ui.sendStatus("Ready");
42
+ const skills = new SkillRuntime({
43
+ getSession: () => session,
44
+ sessionStore: store
45
+ });
46
+ // Set up stdin reader for IPC commands from the Haskell TUI
47
+ const rl = readline.createInterface({
48
+ input: process.stdin,
49
+ terminal: false
50
+ });
51
+ let activeAgent = null;
52
+ // Pending approval resolution
53
+ let pendingApprovalResolve = null;
54
+ const pendingSelects = new Map();
55
+ const pendingInputs = new Map();
56
+ const requestApprovalDecision = (request) => {
57
+ return new Promise((resolve) => {
58
+ pendingApprovalResolve = resolve;
59
+ ui.sendApprovalPrompt(request.label);
60
+ });
61
+ };
62
+ const requestSelect = (title, options) => {
63
+ return new Promise((resolve) => {
64
+ const id = Math.random().toString();
65
+ pendingSelects.set(id, resolve);
66
+ ui.sendPromptSelect(id, title, options);
67
+ });
68
+ };
69
+ const requestTextInput = (title, placeholder) => {
70
+ return new Promise((resolve) => {
71
+ const id = Math.random().toString();
72
+ pendingInputs.set(id, resolve);
73
+ ui.sendPromptInput(id, title, placeholder);
74
+ });
75
+ };
76
+ const createTools = () => createToolRegistry({
77
+ includeWebSearch: config.searchProviderName !== "disabled",
78
+ skillRuntime: skills
79
+ });
80
+ let queuedNextPrompt = null;
81
+ const runPrompt = async (prompt, forceRun = false) => {
82
+ const trimmed = prompt.trim();
83
+ if (!trimmed)
84
+ return;
85
+ // Busy guard: if agent is running, ask user what to do
86
+ if (activeAgent && !forceRun) {
87
+ const choice = await requestSelect(`Current turn is still running. What to do with: "${trimmed.slice(0, 60)}"?`, ["Send now (stop current turn)", "Send after current turn", "Cancel"]);
88
+ if (choice === 0) {
89
+ // Force: interrupt current, then queue to run it
90
+ queuedNextPrompt = trimmed;
91
+ ui.info("Stopping the current turn and sending next prompt.");
92
+ ui.sendStatus("Stopping current turn");
93
+ activeAgent.requestStop();
94
+ }
95
+ else if (choice === 1) {
96
+ // Queue
97
+ queuedNextPrompt = trimmed;
98
+ ui.info(`Queued next prompt: ${trimmed.slice(0, 80)}`);
99
+ ui.sendStatus("Queued next prompt");
100
+ }
101
+ // else cancel: do nothing
102
+ return;
103
+ }
104
+ // If it's a slash command, handle simply
105
+ if (trimmed.startsWith("/")) {
106
+ await handleCommand(trimmed);
107
+ return;
108
+ }
109
+ ui.sendStatus("Running agent");
110
+ const approvals = new ApprovalManager(session, store, null, requestApprovalDecision);
111
+ const agent = new Agent({
112
+ config,
113
+ session,
114
+ sessionStore: store,
115
+ approvals,
116
+ pathPolicy: new PathPolicy(session.workspaceRoot, approvals),
117
+ runtimeProfile,
118
+ skills,
119
+ tools: createTools(),
120
+ ui
121
+ });
122
+ activeAgent = agent;
123
+ try {
124
+ await agent.runTurn(trimmed, true);
125
+ ui.sendStatus(queuedNextPrompt ? "Running queued prompt" : "Ready");
126
+ }
127
+ catch (error) {
128
+ if (isAgentInterruptedError(error)) {
129
+ ui.sendStatus(queuedNextPrompt ? "Running queued prompt" : "Interrupted");
130
+ }
131
+ else {
132
+ ui.error(error instanceof Error ? error.message : String(error));
133
+ ui.sendStatus("Failed");
134
+ }
135
+ }
136
+ finally {
137
+ activeAgent = null;
138
+ const next = queuedNextPrompt;
139
+ if (next) {
140
+ queuedNextPrompt = null;
141
+ void runPrompt(next, true);
142
+ }
143
+ }
144
+ };
145
+ const applyModelSelection = async (provider, model, reasoningEffort) => {
146
+ const { getProviderDefinition } = await import("./providers/index.js");
147
+ const { saveProviderDefaults, saveProviderPersistentAuth, withProviderStoredAuth, withProviderSessionAuth, loadConfig: reloadConfig, providerConfigFor } = await import("./config.js");
148
+ const def = getProviderDefinition(provider);
149
+ await store.updateModel(session, provider, model);
150
+ await saveProviderDefaults(provider, model, def.supportsReasoningEffort ? { reasoningEffort } : {});
151
+ session.provider = provider;
152
+ session.model = model;
153
+ const nextConfig = await reloadConfig();
154
+ const nextProfile = providerConfigFor(nextConfig, session.provider);
155
+ if (nextProfile.authSource === "missing" || nextProfile.authSource === "stored_hash") {
156
+ const authLabel = def.auth.inputLabel;
157
+ const keyVal = await requestTextInput(`Enter ${authLabel} for ${def.label} / ${model}`, "");
158
+ if (!keyVal.trim()) {
159
+ ui.warn(`Credential entry cancelled. Model settings saved, but no usable ${def.label} credential is active.`);
160
+ ui.sendReady(session);
161
+ ui.sendStatus("Ready");
162
+ return;
163
+ }
164
+ const retIdx = await requestSelect("Keep credential:", [
165
+ "Keep for all sessions until /logout",
166
+ "This session only",
167
+ "Cancel"
168
+ ]);
169
+ if (retIdx === 0) {
170
+ await saveProviderPersistentAuth(session.provider, def.auth.defaultMode, keyVal.trim());
171
+ config = withProviderStoredAuth(nextConfig, session.provider, def.auth.defaultMode, keyVal.trim());
172
+ }
173
+ else if (retIdx === 1) {
174
+ config = withProviderSessionAuth(nextConfig, session.provider, def.auth.defaultMode, keyVal.trim());
175
+ }
176
+ else {
177
+ ui.warn("API key setup cancelled.");
178
+ ui.sendReady(session);
179
+ ui.sendStatus("Ready");
180
+ return;
181
+ }
182
+ }
183
+ else {
184
+ config = nextConfig;
185
+ }
186
+ ui.info(`Provider set to ${def.label} / ${model}`);
187
+ ui.sendReady(session);
188
+ ui.sendStatus("Ready");
189
+ };
190
+ const handleCommand = async (commandLine) => {
191
+ const [command, ...args] = commandLine.slice(1).split(/\s+/);
192
+ switch (command) {
193
+ case "help":
194
+ ui.info([
195
+ "/help", "/model", "/undo", "/skill", "/tools",
196
+ "/history", "/resume <session-id>", "/new",
197
+ "/approve", "/config", "/logout", "/clear", "/exit"
198
+ ].join("\n"));
199
+ break;
200
+ case "clear":
201
+ ui.sendClear();
202
+ ui.sendStatus("Ready");
203
+ break;
204
+ case "history":
205
+ ui.info(session.messages
206
+ .slice(-20)
207
+ .map((msg) => {
208
+ const label = msg.role.padEnd(9, " ");
209
+ const content = (msg.content ?? "[tool call]").replace(/\s+/g, " ").slice(0, 140);
210
+ return `${label} ${content}`;
211
+ })
212
+ .join("\n") || "(empty session)");
213
+ break;
214
+ case "tools":
215
+ ui.info(createTools()
216
+ .list()
217
+ .map((tool) => `${tool.readOnly ? "ro" : "rw"} ${tool.name} - ${tool.description}`)
218
+ .join("\n"));
219
+ break;
220
+ case "config":
221
+ ui.printConfig(config);
222
+ break;
223
+ case "undo": {
224
+ const { undoLastEdit } = await import("./edit-history.js");
225
+ const approvals = new ApprovalManager(session, store, null, requestApprovalDecision);
226
+ const result = await undoLastEdit(session, store, (req) => approvals.requestApproval(req));
227
+ ui.info(result.content);
228
+ ui.sendStatus(result.isError ? "Undo blocked" : "Ready");
229
+ break;
230
+ }
231
+ case "skill":
232
+ case "skills": {
233
+ if (args.length === 0) {
234
+ const available = await skills.listSkills();
235
+ const pinned = new Set((await skills.pinnedSkills()).map((s) => s.name));
236
+ ui.info(available.length > 0
237
+ ? available.map((s) => `${pinned.has(s.name) ? "*" : "-"} ${s.name} - ${s.description}`).join("\n")
238
+ : "(no skills available)");
239
+ break;
240
+ }
241
+ const [sub, ...rest] = args;
242
+ if (sub === "use" || sub === "pin") {
243
+ if (!rest[0]) {
244
+ ui.warn("Usage: /skill use <name>");
245
+ break;
246
+ }
247
+ const skill = await skills.pinSkill(rest[0]);
248
+ ui.info(`Pinned skill: ${skill.name}`);
249
+ }
250
+ else if (sub === "drop" || sub === "unpin") {
251
+ if (!rest[0]) {
252
+ ui.warn("Usage: /skill drop <name>");
253
+ break;
254
+ }
255
+ const skill = await skills.unpinSkill(rest[0]);
256
+ ui.info(`Unpinned skill: ${skill.name}`);
257
+ }
258
+ else if (sub === "clear") {
259
+ const cleared = await skills.clearPinnedSkills();
260
+ ui.info(`Cleared ${cleared} pinned skills.`);
261
+ }
262
+ break;
263
+ }
264
+ case "resume": {
265
+ if (!args[0]) {
266
+ const sessions = await store.listSessions();
267
+ if (sessions.length === 0) {
268
+ ui.info("(no sessions)");
269
+ break;
270
+ }
271
+ const items = sessions.slice(0, 10).map(s => `${s.id.slice(0, 8)} ${s.provider}/${s.model} ${s.workspaceRoot}`);
272
+ const idx = await requestSelect("Select session to resume", [...items, "Cancel"]);
273
+ if (idx < sessions.length) {
274
+ const s = sessions[idx];
275
+ if (s) {
276
+ session = await store.loadSession(s.id);
277
+ activeAgent = null;
278
+ ui.sendClear();
279
+ ui.sendStatus(`Resumed ${session.id.slice(0, 8)}`);
280
+ ui.sendReady(session);
281
+ }
282
+ }
283
+ else {
284
+ ui.sendStatus("Ready");
285
+ }
286
+ break;
287
+ }
288
+ session = await store.loadSession(args[0]);
289
+ ui.sendClear();
290
+ ui.sendStatus(`Resumed ${session.id.slice(0, 8)}`);
291
+ ui.sendReady(session);
292
+ break;
293
+ }
294
+ case "new": {
295
+ session = await store.createSession(session.workspaceRoot, config.defaultProvider, config.defaultModel);
296
+ ui.sendClear();
297
+ ui.sendStatus(`Created ${session.id.slice(0, 8)}`);
298
+ ui.sendReady(session);
299
+ break;
300
+ }
301
+ case "approve":
302
+ ui.info([
303
+ `web access: ${session.approvals.webAccess ? "granted" : "not granted"}`,
304
+ `path grants: ${session.approvals.outOfTreeRoots.join(", ") || "(none)"}`,
305
+ `session grants: ${session.approvals.sessionActionKeys.join(", ") || "(none)"}`
306
+ ].join("\n"));
307
+ break;
308
+ case "logout": {
309
+ const { clearProviderSavedAuth } = await import("./config.js");
310
+ await clearProviderSavedAuth(session.provider);
311
+ ui.info(`Cleared saved credential for ${session.provider}.`);
312
+ ui.sendStatus("Logged out");
313
+ break;
314
+ }
315
+ case "model": {
316
+ const { listProviders, getProviderDefinition } = await import("./providers/index.js");
317
+ const providers = listProviders();
318
+ const items = [...providers.map((p) => p.name === session.provider ? `${p.label} (current)` : p.label), "Cancel"];
319
+ const pIdx = await requestSelect("Select provider", items);
320
+ if (pIdx >= providers.length || pIdx < 0) {
321
+ ui.sendStatus("Ready");
322
+ break;
323
+ }
324
+ const nextProvider = providers[pIdx].name;
325
+ const def = getProviderDefinition(nextProvider);
326
+ let nextModel = nextProvider === session.provider ? session.model : def.defaultModel;
327
+ if (nextProvider === "sarvam") {
328
+ const smodels = [...def.suggestedModels, "Cancel"];
329
+ const mIdx = await requestSelect("Select Sarvam model", smodels);
330
+ if (mIdx >= def.suggestedModels.length) {
331
+ ui.sendStatus("Ready");
332
+ break;
333
+ }
334
+ nextModel = def.suggestedModels[mIdx];
335
+ }
336
+ else if (nextProvider === "openrouter") {
337
+ const mName = await requestTextInput("Enter OpenRouter model id", nextModel);
338
+ if (!mName.trim()) {
339
+ ui.sendStatus("Ready");
340
+ break;
341
+ }
342
+ nextModel = mName.trim();
343
+ }
344
+ else {
345
+ const mName = await requestTextInput(`Enter model for ${def.label}`, nextModel);
346
+ if (!mName.trim()) {
347
+ ui.sendStatus("Ready");
348
+ break;
349
+ }
350
+ nextModel = mName.trim();
351
+ }
352
+ let nextReasoning = null;
353
+ if (def.supportsReasoningEffort) {
354
+ const rItems = ["None", "Low", "Medium", "High", "Cancel"];
355
+ const vals = [null, "low", "medium", "high", null];
356
+ const rIdx = await requestSelect("Select reasoning effort", rItems);
357
+ if (rIdx >= 4) {
358
+ ui.sendStatus("Ready");
359
+ break;
360
+ }
361
+ nextReasoning = vals[rIdx];
362
+ }
363
+ await applyModelSelection(nextProvider, nextModel, nextReasoning);
364
+ break;
365
+ }
366
+ default:
367
+ ui.warn(`Unknown command: /${command}`);
368
+ }
369
+ };
370
+ // Listen for JSON commands from the Haskell TUI
371
+ rl.on("line", async (line) => {
372
+ let cmd;
373
+ try {
374
+ cmd = JSON.parse(line);
375
+ }
376
+ catch {
377
+ return; // Skip malformed lines
378
+ }
379
+ switch (cmd.tag) {
380
+ case "input":
381
+ if (cmd.data?.text && typeof cmd.data.text === "string") {
382
+ await runPrompt(cmd.data.text);
383
+ }
384
+ break;
385
+ case "trust":
386
+ // Trust acknowledged, nothing to do on backend side
387
+ break;
388
+ case "approval":
389
+ if (pendingApprovalResolve && cmd.data?.scope) {
390
+ const scope = cmd.data.scope;
391
+ const resolve = pendingApprovalResolve;
392
+ pendingApprovalResolve = null;
393
+ resolve(scope);
394
+ }
395
+ break;
396
+ case "submitSelect":
397
+ if (cmd.data?.id && typeof cmd.data.index === "number") {
398
+ const id = cmd.data.id;
399
+ const resolve = pendingSelects.get(id);
400
+ if (resolve) {
401
+ pendingSelects.delete(id);
402
+ resolve(cmd.data.index);
403
+ }
404
+ }
405
+ break;
406
+ case "submitInput":
407
+ if (cmd.data?.id && typeof cmd.data.value === "string") {
408
+ const id = cmd.data.id;
409
+ const resolve = pendingInputs.get(id);
410
+ if (resolve) {
411
+ pendingInputs.delete(id);
412
+ resolve(cmd.data.value);
413
+ }
414
+ }
415
+ break;
416
+ case "interrupt":
417
+ activeAgent?.requestStop();
418
+ break;
419
+ case "exit":
420
+ process.exit(0);
421
+ }
422
+ });
423
+ rl.on("close", () => {
424
+ process.exit(0);
425
+ });
426
+ }
427
+ main().catch((error) => {
428
+ process.stderr.write(`IPC backend error: ${error}\n`);
429
+ process.exit(1);
430
+ });
431
+ //# sourceMappingURL=ipc-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc-backend.js","sourceRoot":"","sources":["../../src/ipc-backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { TerminalUI } from "./terminal-ui.js";
2
+ import type { EffectiveConfig, RuntimeHostProfile, SessionState, ToolCall } from "./types.js";
3
+ import type { Ora } from "ora";
4
+ export declare class IpcTerminalUI extends TerminalUI {
5
+ constructor(runtimeProfile: RuntimeHostProfile);
6
+ /** Send the initial dashboard / ready message */
7
+ sendReady(session: SessionState): void;
8
+ printBanner(): void;
9
+ printStartup(_session: SessionState): void;
10
+ printTrustPrompt(workspaceRoot: string): void;
11
+ promptLabel(): string;
12
+ info(message: string): void;
13
+ activity(message: string): void;
14
+ warn(message: string): void;
15
+ error(message: string): void;
16
+ startSpinner(label: string): Ora;
17
+ appendAssistantText(text: string): void;
18
+ printAssistantMessage(message: string): void;
19
+ endAssistantTurn(): void;
20
+ printToolCall(toolCall: ToolCall): void;
21
+ printToolResult(summary: string, isError: boolean): void;
22
+ printConfig(config: EffectiveConfig): void;
23
+ sendApprovalPrompt(label: string): void;
24
+ sendPromptSelect(id: string, title: string, options: string[]): void;
25
+ sendPromptInput(id: string, title: string, placeholder: string): void;
26
+ sendStatus(text: string): void;
27
+ sendClear(): void;
28
+ }
@@ -0,0 +1,125 @@
1
+ import { TerminalUI } from "./terminal-ui.js";
2
+ import { formatRuntimeHostSummary, formatRuntimeTerminalSummary } from "./runtime-profile.js";
3
+ function sendIPC(tag, data = {}) {
4
+ const msg = JSON.stringify({ tag, data });
5
+ process.stdout.write(msg + "\n");
6
+ }
7
+ export class IpcTerminalUI extends TerminalUI {
8
+ constructor(runtimeProfile) {
9
+ super(runtimeProfile);
10
+ }
11
+ /** Send the initial dashboard / ready message */
12
+ sendReady(session) {
13
+ sendIPC("ready", {
14
+ provider: session.provider,
15
+ model: session.model,
16
+ workspace: session.workspaceRoot,
17
+ sessionId: session.id,
18
+ updatedAt: session.updatedAt
19
+ });
20
+ }
21
+ printBanner() { }
22
+ printStartup(_session) { }
23
+ printTrustPrompt(workspaceRoot) {
24
+ sendIPC("prompt", { promptType: "trust", workspace: workspaceRoot });
25
+ }
26
+ promptLabel() {
27
+ return "";
28
+ }
29
+ info(message) {
30
+ sendIPC("entry", { kind: "info", text: message });
31
+ }
32
+ activity(message) {
33
+ sendIPC("activity", { label: message });
34
+ }
35
+ warn(message) {
36
+ sendIPC("entry", { kind: "warn", text: message });
37
+ }
38
+ error(message) {
39
+ sendIPC("entry", { kind: "error", text: message });
40
+ }
41
+ startSpinner(label) {
42
+ sendIPC("spinner", { label, active: true });
43
+ let spinning = true;
44
+ const fakeSpinner = {
45
+ get isSpinning() {
46
+ return spinning;
47
+ },
48
+ stop() {
49
+ spinning = false;
50
+ sendIPC("spinner", { label: null, active: false });
51
+ return fakeSpinner;
52
+ }
53
+ };
54
+ return fakeSpinner;
55
+ }
56
+ appendAssistantText(text) {
57
+ sendIPC("chunk", { text });
58
+ }
59
+ printAssistantMessage(message) {
60
+ // Flush any streaming buffer first, then push a complete entry
61
+ sendIPC("flush", {});
62
+ sendIPC("entry", { kind: "assistant", text: message });
63
+ }
64
+ endAssistantTurn() {
65
+ sendIPC("flush", {});
66
+ }
67
+ printToolCall(toolCall) {
68
+ let renderedArgs = "{}";
69
+ try {
70
+ const parsed = JSON.parse(toolCall.function.arguments);
71
+ if (Object.keys(parsed).length > 0) {
72
+ renderedArgs = JSON.stringify(parsed, null, 2);
73
+ }
74
+ }
75
+ catch {
76
+ renderedArgs = toolCall.function.arguments.trim() || "{}";
77
+ }
78
+ sendIPC("flush", {});
79
+ sendIPC("entry", {
80
+ kind: "tool",
81
+ text: `⬢ ${toolCall.function.name}\n${renderedArgs}`
82
+ });
83
+ }
84
+ printToolResult(summary, isError) {
85
+ sendIPC("flush", {});
86
+ sendIPC("entry", {
87
+ kind: isError ? "error" : "tool",
88
+ text: `↳ ${summary}`
89
+ });
90
+ }
91
+ printConfig(config) {
92
+ sendIPC("entry", {
93
+ kind: "info",
94
+ text: [
95
+ `config: ${config.configPath}`,
96
+ `data: ${config.dataPath}`,
97
+ `provider: ${config.defaultProvider}`,
98
+ `auth: ${config.authMode} (${config.authSource})`,
99
+ `sha256: ${config.authFingerprint?.slice(0, 12) ?? "(none)"}`,
100
+ `model: ${config.defaultModel}`,
101
+ `reason: ${config.reasoningEffort ?? "(none)"}`,
102
+ `search: ${config.searchProviderName}`,
103
+ `base: ${config.baseUrl}`,
104
+ `host: ${formatRuntimeHostSummary(this.runtimeProfile)}`,
105
+ `term: ${formatRuntimeTerminalSummary(this.runtimeProfile)}`
106
+ ].join("\n")
107
+ });
108
+ }
109
+ sendApprovalPrompt(label) {
110
+ sendIPC("prompt", { promptType: "approval", label });
111
+ }
112
+ sendPromptSelect(id, title, options) {
113
+ sendIPC("prompt", { promptType: "select", id, title, options });
114
+ }
115
+ sendPromptInput(id, title, placeholder) {
116
+ sendIPC("prompt", { promptType: "input", id, title, placeholder });
117
+ }
118
+ sendStatus(text) {
119
+ sendIPC("status", { text });
120
+ }
121
+ sendClear() {
122
+ sendIPC("clear", {});
123
+ }
124
+ }
125
+ //# sourceMappingURL=ipc-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc-ui.js","sourceRoot":"","sources":["../../src/ipc-ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAS9F,SAAS,OAAO,CAAC,GAAW,EAAE,OAAgC,EAAE;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,OAAO,aAAc,SAAQ,UAAU;IACzC,YAAY,cAAkC;QAC1C,KAAK,CAAC,cAAc,CAAC,CAAC;IAC1B,CAAC;IAED,iDAAiD;IACjD,SAAS,CAAC,OAAqB;QAC3B,OAAO,CAAC,OAAO,EAAE;YACb,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,SAAS,EAAE,OAAO,CAAC,aAAa;YAChC,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC/B,CAAC,CAAC;IACP,CAAC;IAGQ,WAAW,KAAW,CAAC;IAEvB,YAAY,CAAC,QAAsB,IAAU,CAAC;IAE9C,gBAAgB,CAAC,aAAqB;QAC3C,OAAO,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;IACzE,CAAC;IAEQ,WAAW;QAChB,OAAO,EAAE,CAAC;IACd,CAAC;IAEQ,IAAI,CAAC,OAAe;QACzB,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IAEQ,QAAQ,CAAC,OAAe;QAC7B,OAAO,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5C,CAAC;IAEQ,IAAI,CAAC,OAAe;QACzB,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IAEQ,KAAK,CAAC,OAAe;QAC1B,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;IAEQ,YAAY,CAAC,KAAa;QAC/B,OAAO,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5C,IAAI,QAAQ,GAAG,IAAI,CAAC;QACpB,MAAM,WAAW,GAAG;YAChB,IAAI,UAAU;gBACV,OAAO,QAAQ,CAAC;YACpB,CAAC;YACD,IAAI;gBACA,QAAQ,GAAG,KAAK,CAAC;gBACjB,OAAO,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;gBACnD,OAAO,WAAW,CAAC;YACvB,CAAC;SACJ,CAAC;QAEF,OAAO,WAAkB,CAAC;IAC9B,CAAC;IAEQ,mBAAmB,CAAC,IAAY;QACrC,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/B,CAAC;IAEQ,qBAAqB,CAAC,OAAe;QAC1C,+DAA+D;QAC/D,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACrB,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;IAEQ,gBAAgB;QACrB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACzB,CAAC;IAEQ,aAAa,CAAC,QAAkB;QACrC,IAAI,YAAY,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACvD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACnD,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;QAC9D,CAAC;QAED,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACrB,OAAO,CAAC,OAAO,EAAE;YACb,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,MAAM,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY,EAAE;SACxD,CAAC,CAAC;IACP,CAAC;IAEQ,eAAe,CAAC,OAAe,EAAE,OAAgB;QACtD,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACrB,OAAO,CAAC,OAAO,EAAE;YACb,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;YAChC,IAAI,EAAE,MAAM,OAAO,EAAE;SACxB,CAAC,CAAC;IACP,CAAC;IAEQ,WAAW,CAAC,MAAuB;QACxC,OAAO,CAAC,OAAO,EAAE;YACb,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE;gBACF,YAAY,MAAM,CAAC,UAAU,EAAE;gBAC/B,YAAY,MAAM,CAAC,QAAQ,EAAE;gBAC7B,aAAa,MAAM,CAAC,eAAe,EAAE;gBACrC,YAAY,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,UAAU,GAAG;gBACpD,YAAY,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,QAAQ,EAAE;gBAC9D,YAAY,MAAM,CAAC,YAAY,EAAE;gBACjC,YAAY,MAAM,CAAC,eAAe,IAAI,QAAQ,EAAE;gBAChD,YAAY,MAAM,CAAC,kBAAkB,EAAE;gBACvC,YAAY,MAAM,CAAC,OAAO,EAAE;gBAC5B,YAAY,wBAAwB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE;gBAC3D,YAAY,4BAA4B,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE;aAClE,CAAC,IAAI,CAAC,IAAI,CAAC;SACf,CAAC,CAAC;IACP,CAAC;IAGD,kBAAkB,CAAC,KAAa;QAC5B,OAAO,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,gBAAgB,CAAC,EAAU,EAAE,KAAa,EAAE,OAAiB;QACzD,OAAO,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,eAAe,CAAC,EAAU,EAAE,KAAa,EAAE,WAAmB;QAC1D,OAAO,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,UAAU,CAAC,IAAY;QACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,SAAS;QACL,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACzB,CAAC;CACJ"}