@agentled/cli 0.1.1

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 (46) hide show
  1. package/README.md +79 -0
  2. package/dist/client.d.ts +35 -0
  3. package/dist/client.js +107 -0
  4. package/dist/client.js.map +1 -0
  5. package/dist/commands/ai.d.ts +2 -0
  6. package/dist/commands/ai.js +34 -0
  7. package/dist/commands/ai.js.map +1 -0
  8. package/dist/commands/apps.d.ts +2 -0
  9. package/dist/commands/apps.js +53 -0
  10. package/dist/commands/apps.js.map +1 -0
  11. package/dist/commands/auth.d.ts +2 -0
  12. package/dist/commands/auth.js +247 -0
  13. package/dist/commands/auth.js.map +1 -0
  14. package/dist/commands/chat.d.ts +12 -0
  15. package/dist/commands/chat.js +34 -0
  16. package/dist/commands/chat.js.map +1 -0
  17. package/dist/commands/do.d.ts +13 -0
  18. package/dist/commands/do.js +80 -0
  19. package/dist/commands/do.js.map +1 -0
  20. package/dist/commands/executions.d.ts +2 -0
  21. package/dist/commands/executions.js +143 -0
  22. package/dist/commands/executions.js.map +1 -0
  23. package/dist/commands/knowledge.d.ts +2 -0
  24. package/dist/commands/knowledge.js +97 -0
  25. package/dist/commands/knowledge.js.map +1 -0
  26. package/dist/commands/onboarding.d.ts +12 -0
  27. package/dist/commands/onboarding.js +86 -0
  28. package/dist/commands/onboarding.js.map +1 -0
  29. package/dist/commands/workflows.d.ts +2 -0
  30. package/dist/commands/workflows.js +429 -0
  31. package/dist/commands/workflows.js.map +1 -0
  32. package/dist/commands/workspace.d.ts +2 -0
  33. package/dist/commands/workspace.js +156 -0
  34. package/dist/commands/workspace.js.map +1 -0
  35. package/dist/index.d.ts +15 -0
  36. package/dist/index.js +50 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/utils/browser-auth.d.ts +24 -0
  39. package/dist/utils/browser-auth.js +172 -0
  40. package/dist/utils/browser-auth.js.map +1 -0
  41. package/dist/utils/output.d.ts +11 -0
  42. package/dist/utils/output.js +56 -0
  43. package/dist/utils/output.js.map +1 -0
  44. package/llms-full.txt +494 -0
  45. package/llms.txt +20 -0
  46. package/package.json +53 -0
package/dist/index.js ADDED
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Agentled CLI — Zero context-window cost access to workflows, apps, and knowledge.
4
+ *
5
+ * Usage:
6
+ * agentled auth login --key wsk_...
7
+ * agentled workflows list
8
+ * agentled apps test web-scraping scrape --input '{"url": "..."}'
9
+ *
10
+ * Environment variables:
11
+ * AGENTLED_API_KEY — Workspace API key (wsk_*)
12
+ * AGENTLED_URL — Base URL (default: https://www.agentled.app)
13
+ * AGENTLED_WORKSPACE — Saved workspace id, alias, or name to target
14
+ */
15
+ import { Command } from 'commander';
16
+ import { registerAuthCommands } from './commands/auth.js';
17
+ import { registerWorkflowCommands } from './commands/workflows.js';
18
+ import { registerExecutionCommands } from './commands/executions.js';
19
+ import { registerAppCommands } from './commands/apps.js';
20
+ import { registerKnowledgeCommands } from './commands/knowledge.js';
21
+ import { registerAiCommands } from './commands/ai.js';
22
+ import { registerWorkspaceCommands } from './commands/workspace.js';
23
+ import { registerDoCommand } from './commands/do.js';
24
+ import { registerChatCommands } from './commands/chat.js';
25
+ import { registerOnboardingCommands } from './commands/onboarding.js';
26
+ const program = new Command();
27
+ program
28
+ .name('agentled')
29
+ .description('Agentled CLI — manage workflows, apps, and knowledge. Optimized for AI agents.')
30
+ .version('0.1.1')
31
+ .option('--workspace <workspace>', 'Use a saved workspace by id, alias, or name for this command');
32
+ program.hook('preAction', (_thisCommand, actionCommand) => {
33
+ const workspace = actionCommand.optsWithGlobals().workspace;
34
+ if (workspace) {
35
+ process.env.AGENTLED_WORKSPACE = workspace;
36
+ }
37
+ });
38
+ // Register all command groups
39
+ registerAuthCommands(program);
40
+ registerWorkflowCommands(program);
41
+ registerExecutionCommands(program);
42
+ registerAppCommands(program);
43
+ registerKnowledgeCommands(program);
44
+ registerAiCommands(program);
45
+ registerWorkspaceCommands(program);
46
+ registerDoCommand(program);
47
+ registerChatCommands(program);
48
+ registerOnboardingCommands(program);
49
+ program.parse();
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,gFAAgF,CAAC;KAC7F,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,yBAAyB,EAAE,8DAA8D,CAAC,CAAC;AAEvG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,EAAE;IACtD,MAAM,SAAS,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC,SAAS,CAAC;IAC5D,IAAI,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAC/C,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8BAA8B;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACnC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACnC,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACnC,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC3B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,0BAA0B,CAAC,OAAO,CAAC,CAAC;AAEpC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Browser-based authentication for `agentled auth login`.
3
+ *
4
+ * 1. Starts a temporary HTTP server on localhost
5
+ * 2. Opens the browser to /cli/authorize?port=...&state=...
6
+ * 3. Waits for the callback with a signed JWT code
7
+ * 4. Exchanges the code for the raw API key via /api/cli/exchange
8
+ *
9
+ * Uses only Node.js built-ins (http, crypto, child_process).
10
+ */
11
+ export interface BrowserLoginResult {
12
+ apiKey: string;
13
+ workspaceId: string;
14
+ workspaceName: string;
15
+ userId?: string;
16
+ userEmail?: string;
17
+ userName?: string;
18
+ isNewUser: boolean;
19
+ baseUrl: string;
20
+ }
21
+ /**
22
+ * Run the browser-based login flow.
23
+ */
24
+ export declare function browserLogin(baseUrl: string): Promise<BrowserLoginResult>;
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Browser-based authentication for `agentled auth login`.
3
+ *
4
+ * 1. Starts a temporary HTTP server on localhost
5
+ * 2. Opens the browser to /cli/authorize?port=...&state=...
6
+ * 3. Waits for the callback with a signed JWT code
7
+ * 4. Exchanges the code for the raw API key via /api/cli/exchange
8
+ *
9
+ * Uses only Node.js built-ins (http, crypto, child_process).
10
+ */
11
+ /* eslint-disable no-console */
12
+ import * as http from 'node:http';
13
+ import * as crypto from 'node:crypto';
14
+ import { spawn } from 'node:child_process';
15
+ import * as net from 'node:net';
16
+ const TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
17
+ const PORT_RANGE_START = 9876;
18
+ const PORT_RANGE_END = 9999;
19
+ /**
20
+ * Find an available port in the range.
21
+ */
22
+ function findFreePort(start, end) {
23
+ return new Promise((resolve, reject) => {
24
+ const tryPort = (port) => {
25
+ if (port > end) {
26
+ reject(new Error(`No free port found in range ${start}-${end}`));
27
+ return;
28
+ }
29
+ const server = net.createServer();
30
+ server.once('error', () => tryPort(port + 1));
31
+ server.once('listening', () => {
32
+ server.close(() => resolve(port));
33
+ });
34
+ server.listen(port, '127.0.0.1');
35
+ };
36
+ tryPort(start);
37
+ });
38
+ }
39
+ /**
40
+ * Open a URL in the user's default browser.
41
+ * Uses spawn with argument arrays to avoid shell injection.
42
+ */
43
+ function openBrowser(targetUrl) {
44
+ const platform = process.platform;
45
+ let cmd;
46
+ let args;
47
+ if (platform === 'darwin') {
48
+ cmd = 'open';
49
+ args = [targetUrl];
50
+ }
51
+ else if (platform === 'win32') {
52
+ cmd = 'cmd';
53
+ args = ['/c', 'start', '', targetUrl];
54
+ }
55
+ else {
56
+ cmd = 'xdg-open';
57
+ args = [targetUrl];
58
+ }
59
+ const child = spawn(cmd, args, { stdio: 'ignore', detached: true });
60
+ child.unref();
61
+ child.on('error', () => {
62
+ // Silently fail — the URL is printed to the terminal as fallback
63
+ });
64
+ }
65
+ const SUCCESS_HTML = `<!DOCTYPE html>
66
+ <html>
67
+ <head><title>Agentled CLI</title></head>
68
+ <body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0; background: #f9fafb;">
69
+ <div style="text-align: center; padding: 2rem;">
70
+ <div style="width: 48px; height: 48px; margin: 0 auto 1rem; background: #d1fae5; border-radius: 50%; display: flex; align-items: center; justify-content: center;">
71
+ <svg width="24" height="24" fill="none" viewBox="0 0 24 24" stroke="#059669" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"/></svg>
72
+ </div>
73
+ <h1 style="font-size: 1.25rem; font-weight: 600; color: #111827; margin: 0 0 0.5rem;">Authentication Successful</h1>
74
+ <p style="color: #6b7280; font-size: 0.875rem;">You can close this tab and return to the CLI.</p>
75
+ </div>
76
+ </body>
77
+ </html>`;
78
+ function escapeHtml(s) {
79
+ return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
80
+ }
81
+ const ERROR_HTML = (msg) => `<!DOCTYPE html>
82
+ <html>
83
+ <head><title>Agentled CLI</title></head>
84
+ <body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0; background: #f9fafb;">
85
+ <div style="text-align: center; padding: 2rem;">
86
+ <h1 style="font-size: 1.25rem; font-weight: 600; color: #991b1b;">Authentication Failed</h1>
87
+ <p style="color: #6b7280; font-size: 0.875rem;">${escapeHtml(msg)}</p>
88
+ </div>
89
+ </body>
90
+ </html>`;
91
+ /**
92
+ * Run the browser-based login flow.
93
+ */
94
+ export async function browserLogin(baseUrl) {
95
+ const state = crypto.randomBytes(16).toString('hex');
96
+ const port = await findFreePort(PORT_RANGE_START, PORT_RANGE_END);
97
+ return new Promise((resolve, reject) => {
98
+ let settled = false;
99
+ const server = http.createServer(async (req, res) => {
100
+ if (settled)
101
+ return;
102
+ const parsed = new URL(req.url || '', `http://127.0.0.1:${port}`);
103
+ if (parsed.pathname !== '/callback') {
104
+ res.writeHead(404);
105
+ res.end('Not found');
106
+ return;
107
+ }
108
+ const callbackState = parsed.searchParams.get('state') || '';
109
+ const code = parsed.searchParams.get('code') || '';
110
+ // Verify state (CSRF protection)
111
+ if (callbackState !== state) {
112
+ res.writeHead(400, { 'Content-Type': 'text/html' });
113
+ res.end(ERROR_HTML('State mismatch. Possible CSRF attack.'));
114
+ return;
115
+ }
116
+ if (!code) {
117
+ res.writeHead(400, { 'Content-Type': 'text/html' });
118
+ res.end(ERROR_HTML('No authorization code received.'));
119
+ return;
120
+ }
121
+ // Serve success page immediately
122
+ res.writeHead(200, { 'Content-Type': 'text/html' });
123
+ res.end(SUCCESS_HTML);
124
+ // Exchange code for API key
125
+ try {
126
+ const exchangeRes = await fetch(`${baseUrl}/api/cli/exchange`, {
127
+ method: 'POST',
128
+ headers: { 'Content-Type': 'application/json' },
129
+ body: JSON.stringify({ code }),
130
+ });
131
+ if (!exchangeRes.ok) {
132
+ const data = await exchangeRes.json().catch(() => ({}));
133
+ throw new Error(data.error || `HTTP ${exchangeRes.status}`);
134
+ }
135
+ const result = await exchangeRes.json();
136
+ settled = true;
137
+ cleanup();
138
+ resolve(result);
139
+ }
140
+ catch (err) {
141
+ settled = true;
142
+ cleanup();
143
+ reject(new Error(`Code exchange failed: ${err.message}`));
144
+ }
145
+ });
146
+ // Timeout handler
147
+ const timer = setTimeout(() => {
148
+ if (!settled) {
149
+ settled = true;
150
+ cleanup();
151
+ reject(new Error('Login timed out. No response from browser within 5 minutes.'));
152
+ }
153
+ }, TIMEOUT_MS);
154
+ function cleanup() {
155
+ clearTimeout(timer);
156
+ server.close();
157
+ }
158
+ server.listen(port, '127.0.0.1', () => {
159
+ const authorizeUrl = `${baseUrl}/en/cli/authorize?port=${port}&state=${encodeURIComponent(state)}`;
160
+ console.error(`Opening browser to authenticate...`);
161
+ console.error(`If the browser doesn't open, visit:\n ${authorizeUrl}\n`);
162
+ openBrowser(authorizeUrl);
163
+ });
164
+ server.on('error', (err) => {
165
+ if (!settled) {
166
+ settled = true;
167
+ reject(new Error(`Failed to start local server: ${err.message}`));
168
+ }
169
+ });
170
+ });
171
+ }
172
+ //# sourceMappingURL=browser-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-auth.js","sourceRoot":"","sources":["../../src/utils/browser-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Output formatting utilities.
3
+ *
4
+ * Default: JSON (optimized for AI agent parsing)
5
+ * --format table: Human-readable tables
6
+ * --format minimal: Compact single-line output for piping
7
+ */
8
+ export type OutputFormat = 'json' | 'table' | 'minimal';
9
+ export declare function formatOutput(data: any, format?: OutputFormat): string;
10
+ export declare function printOutput(data: any, format?: OutputFormat): void;
11
+ export declare function printError(message: string): void;
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Output formatting utilities.
3
+ *
4
+ * Default: JSON (optimized for AI agent parsing)
5
+ * --format table: Human-readable tables
6
+ * --format minimal: Compact single-line output for piping
7
+ */
8
+ export function formatOutput(data, format = 'json') {
9
+ switch (format) {
10
+ case 'json':
11
+ return JSON.stringify(data, null, 2);
12
+ case 'minimal':
13
+ if (Array.isArray(data)) {
14
+ return data.map(item => {
15
+ if (typeof item === 'object' && item !== null) {
16
+ return item.id || item.name || JSON.stringify(item);
17
+ }
18
+ return String(item);
19
+ }).join('\n');
20
+ }
21
+ if (typeof data === 'object' && data !== null) {
22
+ return Object.entries(data)
23
+ .map(([k, v]) => `${k}=${typeof v === 'object' ? JSON.stringify(v) : v}`)
24
+ .join('\n');
25
+ }
26
+ return String(data);
27
+ case 'table':
28
+ if (Array.isArray(data) && data.length > 0) {
29
+ const keys = Object.keys(data[0]);
30
+ const widths = keys.map(k => Math.max(k.length, ...data.map(row => String(row[k] ?? '').length)));
31
+ // Cap column widths
32
+ const maxWidth = 40;
33
+ const cappedWidths = widths.map(w => Math.min(w, maxWidth));
34
+ const header = keys.map((k, i) => k.padEnd(cappedWidths[i])).join(' ');
35
+ const separator = cappedWidths.map(w => '-'.repeat(w)).join(' ');
36
+ const rows = data.map(row => keys.map((k, i) => {
37
+ const val = String(row[k] ?? '');
38
+ return val.length > maxWidth
39
+ ? val.slice(0, maxWidth - 3) + '...'
40
+ : val.padEnd(cappedWidths[i]);
41
+ }).join(' '));
42
+ return [header, separator, ...rows].join('\n');
43
+ }
44
+ return formatOutput(data, 'json');
45
+ default:
46
+ return JSON.stringify(data, null, 2);
47
+ }
48
+ }
49
+ export function printOutput(data, format = 'json') {
50
+ console.log(formatOutput(data, format));
51
+ }
52
+ export function printError(message) {
53
+ console.error(`Error: ${message}`);
54
+ process.exit(1);
55
+ }
56
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,UAAU,YAAY,CAAC,IAAS,EAAE,SAAuB,MAAM;IACjE,QAAQ,MAAM,EAAE,CAAC;QACb,KAAK,MAAM;YACP,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAEzC,KAAK,SAAS;YACV,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBACnB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;wBAC5C,OAAO,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oBACxD,CAAC;oBACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;gBACxB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC5C,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;qBACtB,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;qBACxE,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;YACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QAExB,KAAK,OAAO;YACR,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACxB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CACtE,CAAC;gBACF,oBAAoB;gBACpB,MAAM,QAAQ,GAAG,EAAE,CAAC;gBACpB,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAE5D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxE,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CACxB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oBACd,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;oBACjC,OAAO,GAAG,CAAC,MAAM,GAAG,QAAQ;wBACxB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,KAAK;wBACpC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAChB,CAAC;gBACF,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnD,CAAC;YACD,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEtC;YACI,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAS,EAAE,SAAuB,MAAM;IAChE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACtC,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}