@kairos-sdk/core 0.1.1 → 0.2.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.
package/dist/cli.js CHANGED
@@ -1,29 +1,36 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- Kairos
4
- } from "./chunk-IADOKKFO.js";
3
+ FileLibrary,
4
+ Kairos,
5
+ TemplateSyncer
6
+ } from "./chunk-QQJDLS5A.js";
5
7
 
6
8
  // src/cli.ts
7
9
  var HELP = `
8
10
  Kairos SDK \u2014 LLM-powered n8n workflow generation
9
11
 
10
12
  Usage:
13
+ kairos init First-time setup wizard
11
14
  kairos build <description> [options]
12
15
  kairos list
13
16
  kairos get <id>
14
17
  kairos activate <id>
15
18
  kairos deactivate <id>
16
19
  kairos delete <id> --confirm
20
+ kairos sync-templates [options]
17
21
 
18
22
  Build options:
19
23
  --dry-run Generate and validate without deploying
20
24
  --name <name> Override the generated workflow name
21
25
  --activate Activate the workflow after deployment
22
26
 
27
+ Sync options:
28
+ --max <count> Maximum templates to fetch (default: 500)
29
+
23
30
  Environment variables:
24
31
  ANTHROPIC_API_KEY Anthropic API key (required)
25
- N8N_BASE_URL n8n instance URL (required)
26
- N8N_API_KEY n8n API key (required)
32
+ N8N_BASE_URL n8n instance URL (required for deploy, optional for --dry-run)
33
+ N8N_API_KEY n8n API key (required for deploy, optional for --dry-run)
27
34
  KAIROS_MODEL Claude model override (default: claude-sonnet-4-6)
28
35
  KAIROS_TELEMETRY Set to "true" or a directory path to enable telemetry logging
29
36
  `;
@@ -57,44 +64,59 @@ function parseArgs(argv) {
57
64
  }
58
65
  return { command, positional, flags };
59
66
  }
60
- function createClient() {
67
+ var CLI_LOGGER = {
68
+ debug: () => {
69
+ },
70
+ info: (msg, meta) => console.error(meta ? `${msg} ${JSON.stringify(meta)}` : msg),
71
+ warn: (msg, meta) => console.error(meta ? `[warn] ${msg} ${JSON.stringify(meta)}` : `[warn] ${msg}`),
72
+ error: (msg, meta) => console.error(meta ? `[error] ${msg} ${JSON.stringify(meta)}` : `[error] ${msg}`)
73
+ };
74
+ function getTelemetryOption() {
61
75
  const telemetryEnv = process.env["KAIROS_TELEMETRY"];
62
- let telemetry;
63
- if (telemetryEnv === "true") {
64
- telemetry = true;
65
- } else if (telemetryEnv && telemetryEnv !== "false") {
66
- telemetry = telemetryEnv;
67
- }
76
+ if (telemetryEnv === "true") return true;
77
+ if (telemetryEnv && telemetryEnv !== "false") return telemetryEnv;
78
+ return void 0;
79
+ }
80
+ function createClient() {
81
+ const telemetry = getTelemetryOption();
68
82
  return new Kairos({
69
83
  anthropicApiKey: getEnvOrExit("ANTHROPIC_API_KEY"),
70
84
  n8nBaseUrl: getEnvOrExit("N8N_BASE_URL"),
71
85
  n8nApiKey: getEnvOrExit("N8N_API_KEY"),
72
86
  ...process.env["KAIROS_MODEL"] ? { model: process.env["KAIROS_MODEL"] } : {},
73
87
  ...telemetry !== void 0 ? { telemetry } : {},
74
- logger: {
75
- debug: () => {
76
- },
77
- info: () => {
78
- },
79
- warn: (msg) => console.error(`[warn] ${msg}`),
80
- error: (msg) => console.error(`[error] ${msg}`)
81
- }
88
+ library: new FileLibrary(),
89
+ logger: CLI_LOGGER
90
+ });
91
+ }
92
+ function createDryRunClient() {
93
+ const telemetry = getTelemetryOption();
94
+ return new Kairos({
95
+ anthropicApiKey: getEnvOrExit("ANTHROPIC_API_KEY"),
96
+ ...process.env["N8N_BASE_URL"] ? { n8nBaseUrl: process.env["N8N_BASE_URL"] } : {},
97
+ ...process.env["N8N_API_KEY"] ? { n8nApiKey: process.env["N8N_API_KEY"] } : {},
98
+ ...process.env["KAIROS_MODEL"] ? { model: process.env["KAIROS_MODEL"] } : {},
99
+ ...telemetry !== void 0 ? { telemetry } : {},
100
+ library: new FileLibrary(),
101
+ logger: CLI_LOGGER
82
102
  });
83
103
  }
84
104
  async function handleBuild(positional, flags) {
85
- const description = positional[0];
105
+ const description = positional.join(" ");
86
106
  if (!description) {
87
107
  console.error("Usage: kairos build <description> [--dry-run] [--name <name>] [--activate]");
88
108
  process.exit(1);
89
109
  }
90
- const kairos = createClient();
110
+ const isDryRun = flags["dry-run"] === true;
111
+ const kairos = isDryRun ? createDryRunClient() : createClient();
91
112
  const start = Date.now();
92
113
  console.error(`Generating workflow...`);
93
114
  const result = await kairos.build(description, {
94
- dryRun: flags["dry-run"] === true,
115
+ dryRun: isDryRun,
95
116
  ...typeof flags["name"] === "string" ? { name: flags["name"] } : {},
96
117
  activate: flags["activate"] === true
97
118
  });
119
+ await kairos.drain();
98
120
  const elapsed = ((Date.now() - start) / 1e3).toFixed(1);
99
121
  console.error(`Done in ${elapsed}s (${result.generationAttempts} attempt${result.generationAttempts > 1 ? "s" : ""})`);
100
122
  console.error("");
@@ -104,12 +126,14 @@ async function handleBuild(positional, flags) {
104
126
  generationAttempts: result.generationAttempts,
105
127
  activationRequired: result.activationRequired,
106
128
  dryRun: result.dryRun,
107
- credentialsNeeded: result.credentialsNeeded
129
+ credentialsNeeded: result.credentialsNeeded,
130
+ ...result.dryRun ? { workflow: result.workflow } : {}
108
131
  }, null, 2));
109
132
  }
110
133
  async function handleList() {
111
134
  const kairos = createClient();
112
135
  const workflows = await kairos.list();
136
+ await kairos.drain();
113
137
  if (workflows.length === 0) {
114
138
  console.log("No workflows found.");
115
139
  return;
@@ -129,6 +153,7 @@ async function handleGet(positional) {
129
153
  }
130
154
  const kairos = createClient();
131
155
  const workflow = await kairos.get(id);
156
+ await kairos.drain();
132
157
  console.log(JSON.stringify(workflow, null, 2));
133
158
  }
134
159
  async function handleActivate(positional) {
@@ -139,6 +164,7 @@ async function handleActivate(positional) {
139
164
  }
140
165
  const kairos = createClient();
141
166
  await kairos.activate(id);
167
+ await kairos.drain();
142
168
  console.log(`Activated workflow ${id}`);
143
169
  }
144
170
  async function handleDeactivate(positional) {
@@ -149,6 +175,7 @@ async function handleDeactivate(positional) {
149
175
  }
150
176
  const kairos = createClient();
151
177
  await kairos.deactivate(id);
178
+ await kairos.drain();
152
179
  console.log(`Deactivated workflow ${id}`);
153
180
  }
154
181
  async function handleDelete(positional, flags) {
@@ -163,8 +190,120 @@ async function handleDelete(positional, flags) {
163
190
  }
164
191
  const kairos = createClient();
165
192
  await kairos.delete(id, { confirm: true });
193
+ await kairos.drain();
166
194
  console.log(`Deleted workflow ${id}`);
167
195
  }
196
+ async function handleSyncTemplates(flags) {
197
+ const max = typeof flags["max"] === "string" ? parseInt(flags["max"], 10) : 500;
198
+ const library = new FileLibrary();
199
+ const logger = {
200
+ debug: () => {
201
+ },
202
+ info: (msg, meta) => console.error(meta ? `${msg} ${JSON.stringify(meta)}` : msg),
203
+ warn: (msg, meta) => console.error(meta ? `[warn] ${msg} ${JSON.stringify(meta)}` : `[warn] ${msg}`),
204
+ error: (msg, meta) => console.error(meta ? `[error] ${msg} ${JSON.stringify(meta)}` : `[error] ${msg}`)
205
+ };
206
+ const syncer = new TemplateSyncer(library, logger);
207
+ console.error(`Syncing up to ${max} templates from n8n community library...`);
208
+ const result = await syncer.sync({
209
+ maxTemplates: max,
210
+ onProgress: (p) => {
211
+ if (p.processed % 25 === 0 && p.processed > 0) {
212
+ console.error(` Progress: ${p.processed}/${p.total} processed, ${p.saved} saved`);
213
+ }
214
+ }
215
+ });
216
+ console.error("");
217
+ console.error(`Sync complete:`);
218
+ console.error(` Saved: ${result.saved}`);
219
+ console.error(` Blocked: ${result.blocked} (validation errors or unsafe content)`);
220
+ console.error(` Review: ${result.reviewed} (saved but flagged for review)`);
221
+ console.error(` Duplicates: ${result.skippedDuplicate} (already in library)`);
222
+ console.error(` Paid: ${result.skippedPaid} (skipped)`);
223
+ }
224
+ async function handleInit() {
225
+ const { writeFile, readFile, mkdir } = await import("fs/promises");
226
+ const { join } = await import("path");
227
+ const { homedir } = await import("os");
228
+ const readline = await import("readline");
229
+ const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
230
+ const ask = (q) => new Promise((resolve) => rl.question(q, resolve));
231
+ console.error("");
232
+ console.error(" Kairos SDK \u2014 Setup Wizard");
233
+ console.error(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");
234
+ console.error("");
235
+ const envPath = join(process.cwd(), ".env");
236
+ let existingEnv = "";
237
+ try {
238
+ existingEnv = await readFile(envPath, "utf-8");
239
+ } catch {
240
+ }
241
+ const has = (key) => existingEnv.includes(key) || !!process.env[key];
242
+ const lines = [];
243
+ if (!has("ANTHROPIC_API_KEY")) {
244
+ const key = await ask(" Anthropic API key (from console.anthropic.com): ");
245
+ if (key.trim()) lines.push(`ANTHROPIC_API_KEY=${key.trim()}`);
246
+ } else {
247
+ console.error(" Anthropic API key: already set");
248
+ }
249
+ if (!has("N8N_BASE_URL")) {
250
+ const url = await ask(" n8n instance URL (e.g. https://your-name.app.n8n.cloud): ");
251
+ if (url.trim()) lines.push(`N8N_BASE_URL=${url.trim().replace(/\/$/, "")}`);
252
+ } else {
253
+ console.error(" n8n base URL: already set");
254
+ }
255
+ if (!has("N8N_API_KEY")) {
256
+ const key = await ask(" n8n API key: ");
257
+ if (key.trim()) lines.push(`N8N_API_KEY=${key.trim()}`);
258
+ } else {
259
+ console.error(" n8n API key: already set");
260
+ }
261
+ rl.close();
262
+ if (lines.length > 0) {
263
+ const newContent = existingEnv ? existingEnv.trimEnd() + "\n" + lines.join("\n") + "\n" : lines.join("\n") + "\n";
264
+ await writeFile(envPath, newContent, "utf-8");
265
+ console.error(`
266
+ Saved to ${envPath}`);
267
+ } else {
268
+ console.error("\n All credentials already configured.");
269
+ }
270
+ console.error("");
271
+ console.error(" Seeding template library...");
272
+ const library = new FileLibrary();
273
+ const logger = {
274
+ debug: () => {
275
+ },
276
+ info: () => {
277
+ },
278
+ warn: () => {
279
+ },
280
+ error: () => {
281
+ }
282
+ };
283
+ const syncer = new TemplateSyncer(library, logger);
284
+ await library.initialize();
285
+ const existing = await library.list();
286
+ if (existing.length >= 50) {
287
+ console.error(` Library already has ${existing.length} entries \u2014 skipping sync.`);
288
+ } else {
289
+ const result = await syncer.sync({
290
+ maxTemplates: 500,
291
+ onProgress: (p) => {
292
+ if (p.processed % 100 === 0 && p.processed > 0) {
293
+ process.stderr.write(` ${p.processed}/${p.total} processed, ${p.saved} saved...\r`);
294
+ }
295
+ }
296
+ });
297
+ console.error(` Synced ${result.saved} templates (${result.blocked} blocked, ${result.skippedDuplicate} duplicates)`);
298
+ }
299
+ const kairosDir = join(homedir(), ".kairos");
300
+ await mkdir(join(kairosDir, "telemetry"), { recursive: true });
301
+ console.error("");
302
+ console.error(" Setup complete! Try:");
303
+ console.error("");
304
+ console.error(' kairos build "Send a Slack message when a webhook fires" --dry-run');
305
+ console.error("");
306
+ }
168
307
  async function main() {
169
308
  const { command, positional, flags } = parseArgs(process.argv);
170
309
  if (!command || command === "help" || flags["help"] === true) {
@@ -172,6 +311,9 @@ async function main() {
172
311
  return;
173
312
  }
174
313
  switch (command) {
314
+ case "init":
315
+ await handleInit();
316
+ break;
175
317
  case "build":
176
318
  await handleBuild(positional, flags);
177
319
  break;
@@ -190,6 +332,9 @@ async function main() {
190
332
  case "delete":
191
333
  await handleDelete(positional, flags);
192
334
  break;
335
+ case "sync-templates":
336
+ await handleSyncTemplates(flags);
337
+ break;
193
338
  default:
194
339
  console.error(`Unknown command: ${command}`);
195
340
  console.log(HELP);
@@ -199,14 +344,13 @@ async function main() {
199
344
  main().catch((err) => {
200
345
  if (err instanceof Error) {
201
346
  console.error(`Error: ${err.message}`);
202
- if ("issues" in err) {
203
- const issues = err.issues;
204
- for (const issue of issues) {
347
+ if ("issues" in err && Array.isArray(err.issues)) {
348
+ for (const issue of err.issues) {
205
349
  console.error(` [Rule ${issue.rule}] ${issue.message}`);
206
350
  }
207
351
  }
208
352
  } else {
209
- console.error(err);
353
+ console.error(String(err));
210
354
  }
211
355
  process.exit(1);
212
356
  });
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Kairos } from './client.js'\n\nconst HELP = `\nKairos SDK — LLM-powered n8n workflow generation\n\nUsage:\n kairos build <description> [options]\n kairos list\n kairos get <id>\n kairos activate <id>\n kairos deactivate <id>\n kairos delete <id> --confirm\n\nBuild options:\n --dry-run Generate and validate without deploying\n --name <name> Override the generated workflow name\n --activate Activate the workflow after deployment\n\nEnvironment variables:\n ANTHROPIC_API_KEY Anthropic API key (required)\n N8N_BASE_URL n8n instance URL (required)\n N8N_API_KEY n8n API key (required)\n KAIROS_MODEL Claude model override (default: claude-sonnet-4-6)\n KAIROS_TELEMETRY Set to \"true\" or a directory path to enable telemetry logging\n`\n\nfunction getEnvOrExit(name: string): string {\n const val = process.env[name]\n if (!val) {\n console.error(`Missing required environment variable: ${name}`)\n process.exit(1)\n }\n return val\n}\n\nfunction parseArgs(argv: string[]): { command: string; positional: string[]; flags: Record<string, string | boolean> } {\n const args = argv.slice(2)\n const command = args[0] ?? ''\n const positional: string[] = []\n const flags: Record<string, string | boolean> = {}\n\n for (let i = 1; i < args.length; i++) {\n const arg = args[i]!\n if (arg.startsWith('--')) {\n const key = arg.slice(2)\n const next = args[i + 1]\n if (next && !next.startsWith('--')) {\n flags[key] = next\n i++\n } else {\n flags[key] = true\n }\n } else {\n positional.push(arg)\n }\n }\n\n return { command, positional, flags }\n}\n\nfunction createClient(): Kairos {\n const telemetryEnv = process.env['KAIROS_TELEMETRY']\n let telemetry: boolean | string | undefined\n if (telemetryEnv === 'true') {\n telemetry = true\n } else if (telemetryEnv && telemetryEnv !== 'false') {\n telemetry = telemetryEnv\n }\n\n return new Kairos({\n anthropicApiKey: getEnvOrExit('ANTHROPIC_API_KEY'),\n n8nBaseUrl: getEnvOrExit('N8N_BASE_URL'),\n n8nApiKey: getEnvOrExit('N8N_API_KEY'),\n ...(process.env['KAIROS_MODEL'] ? { model: process.env['KAIROS_MODEL'] } : {}),\n ...(telemetry !== undefined ? { telemetry } : {}),\n logger: {\n debug: () => {},\n info: () => {},\n warn: (msg) => console.error(`[warn] ${msg}`),\n error: (msg) => console.error(`[error] ${msg}`),\n },\n })\n}\n\nasync function handleBuild(positional: string[], flags: Record<string, string | boolean>): Promise<void> {\n const description = positional[0]\n if (!description) {\n console.error('Usage: kairos build <description> [--dry-run] [--name <name>] [--activate]')\n process.exit(1)\n }\n\n const kairos = createClient()\n const start = Date.now()\n\n console.error(`Generating workflow...`)\n\n const result = await kairos.build(description, {\n dryRun: flags['dry-run'] === true,\n ...(typeof flags['name'] === 'string' ? { name: flags['name'] } : {}),\n activate: flags['activate'] === true,\n })\n\n const elapsed = ((Date.now() - start) / 1000).toFixed(1)\n\n console.error(`Done in ${elapsed}s (${result.generationAttempts} attempt${result.generationAttempts > 1 ? 's' : ''})`)\n console.error('')\n\n console.log(JSON.stringify({\n workflowId: result.workflowId,\n name: result.name,\n generationAttempts: result.generationAttempts,\n activationRequired: result.activationRequired,\n dryRun: result.dryRun,\n credentialsNeeded: result.credentialsNeeded,\n }, null, 2))\n}\n\nasync function handleList(): Promise<void> {\n const kairos = createClient()\n const workflows = await kairos.list()\n\n if (workflows.length === 0) {\n console.log('No workflows found.')\n return\n }\n\n for (const w of workflows) {\n const status = w.active ? 'active' : 'inactive'\n console.log(` ${w.id} ${status.padEnd(8)} ${w.name}`)\n }\n console.log(`\\n${workflows.length} workflow(s)`)\n}\n\nasync function handleGet(positional: string[]): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos get <workflow-id>')\n process.exit(1)\n }\n\n const kairos = createClient()\n const workflow = await kairos.get(id)\n console.log(JSON.stringify(workflow, null, 2))\n}\n\nasync function handleActivate(positional: string[]): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos activate <workflow-id>')\n process.exit(1)\n }\n\n const kairos = createClient()\n await kairos.activate(id)\n console.log(`Activated workflow ${id}`)\n}\n\nasync function handleDeactivate(positional: string[]): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos deactivate <workflow-id>')\n process.exit(1)\n }\n\n const kairos = createClient()\n await kairos.deactivate(id)\n console.log(`Deactivated workflow ${id}`)\n}\n\nasync function handleDelete(positional: string[], flags: Record<string, string | boolean>): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos delete <workflow-id> --confirm')\n process.exit(1)\n }\n\n if (flags['confirm'] !== true) {\n console.error('Refusing to delete without --confirm flag.')\n process.exit(1)\n }\n\n const kairos = createClient()\n await kairos.delete(id, { confirm: true })\n console.log(`Deleted workflow ${id}`)\n}\n\nasync function main(): Promise<void> {\n const { command, positional, flags } = parseArgs(process.argv)\n\n if (!command || command === 'help' || flags['help'] === true) {\n console.log(HELP)\n return\n }\n\n switch (command) {\n case 'build':\n await handleBuild(positional, flags)\n break\n case 'list':\n await handleList()\n break\n case 'get':\n await handleGet(positional)\n break\n case 'activate':\n await handleActivate(positional)\n break\n case 'deactivate':\n await handleDeactivate(positional)\n break\n case 'delete':\n await handleDelete(positional, flags)\n break\n default:\n console.error(`Unknown command: ${command}`)\n console.log(HELP)\n process.exit(1)\n }\n}\n\nmain().catch((err) => {\n if (err instanceof Error) {\n console.error(`Error: ${err.message}`)\n if ('issues' in err) {\n const issues = (err as { issues: Array<{ rule: number; message: string }> }).issues\n for (const issue of issues) {\n console.error(` [Rule ${issue.rule}] ${issue.message}`)\n }\n }\n } else {\n console.error(err)\n }\n process.exit(1)\n})\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Kairos } from './client.js'\nimport { FileLibrary } from './library/file-library.js'\nimport { TemplateSyncer } from './templates/syncer.js'\n\nconst HELP = `\nKairos SDK — LLM-powered n8n workflow generation\n\nUsage:\n kairos init First-time setup wizard\n kairos build <description> [options]\n kairos list\n kairos get <id>\n kairos activate <id>\n kairos deactivate <id>\n kairos delete <id> --confirm\n kairos sync-templates [options]\n\nBuild options:\n --dry-run Generate and validate without deploying\n --name <name> Override the generated workflow name\n --activate Activate the workflow after deployment\n\nSync options:\n --max <count> Maximum templates to fetch (default: 500)\n\nEnvironment variables:\n ANTHROPIC_API_KEY Anthropic API key (required)\n N8N_BASE_URL n8n instance URL (required for deploy, optional for --dry-run)\n N8N_API_KEY n8n API key (required for deploy, optional for --dry-run)\n KAIROS_MODEL Claude model override (default: claude-sonnet-4-6)\n KAIROS_TELEMETRY Set to \"true\" or a directory path to enable telemetry logging\n`\n\nfunction getEnvOrExit(name: string): string {\n const val = process.env[name]\n if (!val) {\n console.error(`Missing required environment variable: ${name}`)\n process.exit(1)\n }\n return val\n}\n\nfunction parseArgs(argv: string[]): { command: string; positional: string[]; flags: Record<string, string | boolean> } {\n const args = argv.slice(2)\n const command = args[0] ?? ''\n const positional: string[] = []\n const flags: Record<string, string | boolean> = {}\n\n for (let i = 1; i < args.length; i++) {\n const arg = args[i]!\n if (arg.startsWith('--')) {\n const key = arg.slice(2)\n const next = args[i + 1]\n if (next && !next.startsWith('--')) {\n flags[key] = next\n i++\n } else {\n flags[key] = true\n }\n } else {\n positional.push(arg)\n }\n }\n\n return { command, positional, flags }\n}\n\nconst CLI_LOGGER = {\n debug: () => {},\n info: (msg: string, meta?: Record<string, unknown>) => console.error(meta ? `${msg} ${JSON.stringify(meta)}` : msg),\n warn: (msg: string, meta?: Record<string, unknown>) => console.error(meta ? `[warn] ${msg} ${JSON.stringify(meta)}` : `[warn] ${msg}`),\n error: (msg: string, meta?: Record<string, unknown>) => console.error(meta ? `[error] ${msg} ${JSON.stringify(meta)}` : `[error] ${msg}`),\n}\n\nfunction getTelemetryOption(): boolean | string | undefined {\n const telemetryEnv = process.env['KAIROS_TELEMETRY']\n if (telemetryEnv === 'true') return true\n if (telemetryEnv && telemetryEnv !== 'false') return telemetryEnv\n return undefined\n}\n\nfunction createClient(): Kairos {\n const telemetry = getTelemetryOption()\n return new Kairos({\n anthropicApiKey: getEnvOrExit('ANTHROPIC_API_KEY'),\n n8nBaseUrl: getEnvOrExit('N8N_BASE_URL'),\n n8nApiKey: getEnvOrExit('N8N_API_KEY'),\n ...(process.env['KAIROS_MODEL'] ? { model: process.env['KAIROS_MODEL'] } : {}),\n ...(telemetry !== undefined ? { telemetry } : {}),\n library: new FileLibrary(),\n logger: CLI_LOGGER,\n })\n}\n\nfunction createDryRunClient(): Kairos {\n const telemetry = getTelemetryOption()\n return new Kairos({\n anthropicApiKey: getEnvOrExit('ANTHROPIC_API_KEY'),\n ...(process.env['N8N_BASE_URL'] ? { n8nBaseUrl: process.env['N8N_BASE_URL'] } : {}),\n ...(process.env['N8N_API_KEY'] ? { n8nApiKey: process.env['N8N_API_KEY'] } : {}),\n ...(process.env['KAIROS_MODEL'] ? { model: process.env['KAIROS_MODEL'] } : {}),\n ...(telemetry !== undefined ? { telemetry } : {}),\n library: new FileLibrary(),\n logger: CLI_LOGGER,\n })\n}\n\nasync function handleBuild(positional: string[], flags: Record<string, string | boolean>): Promise<void> {\n const description = positional.join(' ')\n if (!description) {\n console.error('Usage: kairos build <description> [--dry-run] [--name <name>] [--activate]')\n process.exit(1)\n }\n\n const isDryRun = flags['dry-run'] === true\n const kairos = isDryRun ? createDryRunClient() : createClient()\n const start = Date.now()\n\n console.error(`Generating workflow...`)\n\n const result = await kairos.build(description, {\n dryRun: isDryRun,\n ...(typeof flags['name'] === 'string' ? { name: flags['name'] } : {}),\n activate: flags['activate'] === true,\n })\n\n await kairos.drain()\n\n const elapsed = ((Date.now() - start) / 1000).toFixed(1)\n\n console.error(`Done in ${elapsed}s (${result.generationAttempts} attempt${result.generationAttempts > 1 ? 's' : ''})`)\n console.error('')\n\n console.log(JSON.stringify({\n workflowId: result.workflowId,\n name: result.name,\n generationAttempts: result.generationAttempts,\n activationRequired: result.activationRequired,\n dryRun: result.dryRun,\n credentialsNeeded: result.credentialsNeeded,\n ...(result.dryRun ? { workflow: result.workflow } : {}),\n }, null, 2))\n}\n\nasync function handleList(): Promise<void> {\n const kairos = createClient()\n const workflows = await kairos.list()\n await kairos.drain()\n\n if (workflows.length === 0) {\n console.log('No workflows found.')\n return\n }\n\n for (const w of workflows) {\n const status = w.active ? 'active' : 'inactive'\n console.log(` ${w.id} ${status.padEnd(8)} ${w.name}`)\n }\n console.log(`\\n${workflows.length} workflow(s)`)\n}\n\nasync function handleGet(positional: string[]): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos get <workflow-id>')\n process.exit(1)\n }\n\n const kairos = createClient()\n const workflow = await kairos.get(id)\n await kairos.drain()\n console.log(JSON.stringify(workflow, null, 2))\n}\n\nasync function handleActivate(positional: string[]): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos activate <workflow-id>')\n process.exit(1)\n }\n\n const kairos = createClient()\n await kairos.activate(id)\n await kairos.drain()\n console.log(`Activated workflow ${id}`)\n}\n\nasync function handleDeactivate(positional: string[]): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos deactivate <workflow-id>')\n process.exit(1)\n }\n\n const kairos = createClient()\n await kairos.deactivate(id)\n await kairos.drain()\n console.log(`Deactivated workflow ${id}`)\n}\n\nasync function handleDelete(positional: string[], flags: Record<string, string | boolean>): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos delete <workflow-id> --confirm')\n process.exit(1)\n }\n\n if (flags['confirm'] !== true) {\n console.error('Refusing to delete without --confirm flag.')\n process.exit(1)\n }\n\n const kairos = createClient()\n await kairos.delete(id, { confirm: true })\n await kairos.drain()\n console.log(`Deleted workflow ${id}`)\n}\n\nasync function handleSyncTemplates(flags: Record<string, string | boolean>): Promise<void> {\n const max = typeof flags['max'] === 'string' ? parseInt(flags['max'], 10) : 500\n const library = new FileLibrary()\n const logger = {\n debug: () => {},\n info: (msg: string, meta?: Record<string, unknown>) => console.error(meta ? `${msg} ${JSON.stringify(meta)}` : msg),\n warn: (msg: string, meta?: Record<string, unknown>) => console.error(meta ? `[warn] ${msg} ${JSON.stringify(meta)}` : `[warn] ${msg}`),\n error: (msg: string, meta?: Record<string, unknown>) => console.error(meta ? `[error] ${msg} ${JSON.stringify(meta)}` : `[error] ${msg}`),\n }\n const syncer = new TemplateSyncer(library, logger)\n\n console.error(`Syncing up to ${max} templates from n8n community library...`)\n\n const result = await syncer.sync({\n maxTemplates: max,\n onProgress: (p) => {\n if (p.processed % 25 === 0 && p.processed > 0) {\n console.error(` Progress: ${p.processed}/${p.total} processed, ${p.saved} saved`)\n }\n },\n })\n\n console.error('')\n console.error(`Sync complete:`)\n console.error(` Saved: ${result.saved}`)\n console.error(` Blocked: ${result.blocked} (validation errors or unsafe content)`)\n console.error(` Review: ${result.reviewed} (saved but flagged for review)`)\n console.error(` Duplicates: ${result.skippedDuplicate} (already in library)`)\n console.error(` Paid: ${result.skippedPaid} (skipped)`)\n}\n\nasync function handleInit(): Promise<void> {\n const { writeFile, readFile, mkdir } = await import('node:fs/promises')\n const { join } = await import('node:path')\n const { homedir } = await import('node:os')\n const readline = await import('node:readline')\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr })\n const ask = (q: string): Promise<string> => new Promise((resolve) => rl.question(q, resolve))\n\n console.error('')\n console.error(' Kairos SDK — Setup Wizard')\n console.error(' ─────────────────────────')\n console.error('')\n\n const envPath = join(process.cwd(), '.env')\n let existingEnv = ''\n try {\n existingEnv = await readFile(envPath, 'utf-8')\n } catch {}\n\n const has = (key: string) => existingEnv.includes(key) || !!process.env[key]\n\n const lines: string[] = []\n\n if (!has('ANTHROPIC_API_KEY')) {\n const key = await ask(' Anthropic API key (from console.anthropic.com): ')\n if (key.trim()) lines.push(`ANTHROPIC_API_KEY=${key.trim()}`)\n } else {\n console.error(' Anthropic API key: already set')\n }\n\n if (!has('N8N_BASE_URL')) {\n const url = await ask(' n8n instance URL (e.g. https://your-name.app.n8n.cloud): ')\n if (url.trim()) lines.push(`N8N_BASE_URL=${url.trim().replace(/\\/$/, '')}`)\n } else {\n console.error(' n8n base URL: already set')\n }\n\n if (!has('N8N_API_KEY')) {\n const key = await ask(' n8n API key: ')\n if (key.trim()) lines.push(`N8N_API_KEY=${key.trim()}`)\n } else {\n console.error(' n8n API key: already set')\n }\n\n rl.close()\n\n if (lines.length > 0) {\n const newContent = existingEnv\n ? existingEnv.trimEnd() + '\\n' + lines.join('\\n') + '\\n'\n : lines.join('\\n') + '\\n'\n await writeFile(envPath, newContent, 'utf-8')\n console.error(`\\n Saved to ${envPath}`)\n } else {\n console.error('\\n All credentials already configured.')\n }\n\n console.error('')\n console.error(' Seeding template library...')\n\n const library = new FileLibrary()\n const logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n }\n const syncer = new TemplateSyncer(library, logger)\n\n await library.initialize()\n const existing = await library.list()\n\n if (existing.length >= 50) {\n console.error(` Library already has ${existing.length} entries — skipping sync.`)\n } else {\n const result = await syncer.sync({\n maxTemplates: 500,\n onProgress: (p) => {\n if (p.processed % 100 === 0 && p.processed > 0) {\n process.stderr.write(` ${p.processed}/${p.total} processed, ${p.saved} saved...\\r`)\n }\n },\n })\n console.error(` Synced ${result.saved} templates (${result.blocked} blocked, ${result.skippedDuplicate} duplicates)`)\n }\n\n const kairosDir = join(homedir(), '.kairos')\n await mkdir(join(kairosDir, 'telemetry'), { recursive: true })\n\n console.error('')\n console.error(' Setup complete! Try:')\n console.error('')\n console.error(' kairos build \"Send a Slack message when a webhook fires\" --dry-run')\n console.error('')\n}\n\nasync function main(): Promise<void> {\n const { command, positional, flags } = parseArgs(process.argv)\n\n if (!command || command === 'help' || flags['help'] === true) {\n console.log(HELP)\n return\n }\n\n switch (command) {\n case 'init':\n await handleInit()\n break\n case 'build':\n await handleBuild(positional, flags)\n break\n case 'list':\n await handleList()\n break\n case 'get':\n await handleGet(positional)\n break\n case 'activate':\n await handleActivate(positional)\n break\n case 'deactivate':\n await handleDeactivate(positional)\n break\n case 'delete':\n await handleDelete(positional, flags)\n break\n case 'sync-templates':\n await handleSyncTemplates(flags)\n break\n default:\n console.error(`Unknown command: ${command}`)\n console.log(HELP)\n process.exit(1)\n }\n}\n\nmain().catch((err: unknown) => {\n if (err instanceof Error) {\n console.error(`Error: ${err.message}`)\n if ('issues' in err && Array.isArray((err as Record<string, unknown>).issues)) {\n for (const issue of (err as Record<string, unknown>).issues as Array<{ rule: number; message: string }>) {\n console.error(` [Rule ${issue.rule}] ${issue.message}`)\n }\n }\n } else {\n console.error(String(err))\n }\n process.exit(1)\n})\n"],"mappings":";;;;;;;;AAMA,IAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6Bb,SAAS,aAAa,MAAsB;AAC1C,QAAM,MAAM,QAAQ,IAAI,IAAI;AAC5B,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,0CAA0C,IAAI,EAAE;AAC9D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAAS,UAAU,MAAoG;AACrH,QAAM,OAAO,KAAK,MAAM,CAAC;AACzB,QAAM,UAAU,KAAK,CAAC,KAAK;AAC3B,QAAM,aAAuB,CAAC;AAC9B,QAAM,QAA0C,CAAC;AAEjD,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,IAAI,WAAW,IAAI,GAAG;AACxB,YAAM,MAAM,IAAI,MAAM,CAAC;AACvB,YAAM,OAAO,KAAK,IAAI,CAAC;AACvB,UAAI,QAAQ,CAAC,KAAK,WAAW,IAAI,GAAG;AAClC,cAAM,GAAG,IAAI;AACb;AAAA,MACF,OAAO;AACL,cAAM,GAAG,IAAI;AAAA,MACf;AAAA,IACF,OAAO;AACL,iBAAW,KAAK,GAAG;AAAA,IACrB;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,YAAY,MAAM;AACtC;AAEA,IAAM,aAAa;AAAA,EACjB,OAAO,MAAM;AAAA,EAAC;AAAA,EACd,MAAM,CAAC,KAAa,SAAmC,QAAQ,MAAM,OAAO,GAAG,GAAG,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,GAAG;AAAA,EAClH,MAAM,CAAC,KAAa,SAAmC,QAAQ,MAAM,OAAO,UAAU,GAAG,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,UAAU,GAAG,EAAE;AAAA,EACrI,OAAO,CAAC,KAAa,SAAmC,QAAQ,MAAM,OAAO,WAAW,GAAG,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,WAAW,GAAG,EAAE;AAC1I;AAEA,SAAS,qBAAmD;AAC1D,QAAM,eAAe,QAAQ,IAAI,kBAAkB;AACnD,MAAI,iBAAiB,OAAQ,QAAO;AACpC,MAAI,gBAAgB,iBAAiB,QAAS,QAAO;AACrD,SAAO;AACT;AAEA,SAAS,eAAuB;AAC9B,QAAM,YAAY,mBAAmB;AACrC,SAAO,IAAI,OAAO;AAAA,IAChB,iBAAiB,aAAa,mBAAmB;AAAA,IACjD,YAAY,aAAa,cAAc;AAAA,IACvC,WAAW,aAAa,aAAa;AAAA,IACrC,GAAI,QAAQ,IAAI,cAAc,IAAI,EAAE,OAAO,QAAQ,IAAI,cAAc,EAAE,IAAI,CAAC;AAAA,IAC5E,GAAI,cAAc,SAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IAC/C,SAAS,IAAI,YAAY;AAAA,IACzB,QAAQ;AAAA,EACV,CAAC;AACH;AAEA,SAAS,qBAA6B;AACpC,QAAM,YAAY,mBAAmB;AACrC,SAAO,IAAI,OAAO;AAAA,IAChB,iBAAiB,aAAa,mBAAmB;AAAA,IACjD,GAAI,QAAQ,IAAI,cAAc,IAAI,EAAE,YAAY,QAAQ,IAAI,cAAc,EAAE,IAAI,CAAC;AAAA,IACjF,GAAI,QAAQ,IAAI,aAAa,IAAI,EAAE,WAAW,QAAQ,IAAI,aAAa,EAAE,IAAI,CAAC;AAAA,IAC9E,GAAI,QAAQ,IAAI,cAAc,IAAI,EAAE,OAAO,QAAQ,IAAI,cAAc,EAAE,IAAI,CAAC;AAAA,IAC5E,GAAI,cAAc,SAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IAC/C,SAAS,IAAI,YAAY;AAAA,IACzB,QAAQ;AAAA,EACV,CAAC;AACH;AAEA,eAAe,YAAY,YAAsB,OAAwD;AACvG,QAAM,cAAc,WAAW,KAAK,GAAG;AACvC,MAAI,CAAC,aAAa;AAChB,YAAQ,MAAM,4EAA4E;AAC1F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAW,MAAM,SAAS,MAAM;AACtC,QAAM,SAAS,WAAW,mBAAmB,IAAI,aAAa;AAC9D,QAAM,QAAQ,KAAK,IAAI;AAEvB,UAAQ,MAAM,wBAAwB;AAEtC,QAAM,SAAS,MAAM,OAAO,MAAM,aAAa;AAAA,IAC7C,QAAQ;AAAA,IACR,GAAI,OAAO,MAAM,MAAM,MAAM,WAAW,EAAE,MAAM,MAAM,MAAM,EAAE,IAAI,CAAC;AAAA,IACnE,UAAU,MAAM,UAAU,MAAM;AAAA,EAClC,CAAC;AAED,QAAM,OAAO,MAAM;AAEnB,QAAM,YAAY,KAAK,IAAI,IAAI,SAAS,KAAM,QAAQ,CAAC;AAEvD,UAAQ,MAAM,WAAW,OAAO,MAAM,OAAO,kBAAkB,WAAW,OAAO,qBAAqB,IAAI,MAAM,EAAE,GAAG;AACrH,UAAQ,MAAM,EAAE;AAEhB,UAAQ,IAAI,KAAK,UAAU;AAAA,IACzB,YAAY,OAAO;AAAA,IACnB,MAAM,OAAO;AAAA,IACb,oBAAoB,OAAO;AAAA,IAC3B,oBAAoB,OAAO;AAAA,IAC3B,QAAQ,OAAO;AAAA,IACf,mBAAmB,OAAO;AAAA,IAC1B,GAAI,OAAO,SAAS,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,EACvD,GAAG,MAAM,CAAC,CAAC;AACb;AAEA,eAAe,aAA4B;AACzC,QAAM,SAAS,aAAa;AAC5B,QAAM,YAAY,MAAM,OAAO,KAAK;AACpC,QAAM,OAAO,MAAM;AAEnB,MAAI,UAAU,WAAW,GAAG;AAC1B,YAAQ,IAAI,qBAAqB;AACjC;AAAA,EACF;AAEA,aAAW,KAAK,WAAW;AACzB,UAAM,SAAS,EAAE,SAAS,WAAW;AACrC,YAAQ,IAAI,KAAK,EAAE,EAAE,KAAK,OAAO,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE;AAAA,EACzD;AACA,UAAQ,IAAI;AAAA,EAAK,UAAU,MAAM,cAAc;AACjD;AAEA,eAAe,UAAU,YAAqC;AAC5D,QAAM,KAAK,WAAW,CAAC;AACvB,MAAI,CAAC,IAAI;AACP,YAAQ,MAAM,iCAAiC;AAC/C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,aAAa;AAC5B,QAAM,WAAW,MAAM,OAAO,IAAI,EAAE;AACpC,QAAM,OAAO,MAAM;AACnB,UAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAC/C;AAEA,eAAe,eAAe,YAAqC;AACjE,QAAM,KAAK,WAAW,CAAC;AACvB,MAAI,CAAC,IAAI;AACP,YAAQ,MAAM,sCAAsC;AACpD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,aAAa;AAC5B,QAAM,OAAO,SAAS,EAAE;AACxB,QAAM,OAAO,MAAM;AACnB,UAAQ,IAAI,sBAAsB,EAAE,EAAE;AACxC;AAEA,eAAe,iBAAiB,YAAqC;AACnE,QAAM,KAAK,WAAW,CAAC;AACvB,MAAI,CAAC,IAAI;AACP,YAAQ,MAAM,wCAAwC;AACtD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,aAAa;AAC5B,QAAM,OAAO,WAAW,EAAE;AAC1B,QAAM,OAAO,MAAM;AACnB,UAAQ,IAAI,wBAAwB,EAAE,EAAE;AAC1C;AAEA,eAAe,aAAa,YAAsB,OAAwD;AACxG,QAAM,KAAK,WAAW,CAAC;AACvB,MAAI,CAAC,IAAI;AACP,YAAQ,MAAM,8CAA8C;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,MAAM,SAAS,MAAM,MAAM;AAC7B,YAAQ,MAAM,4CAA4C;AAC1D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,aAAa;AAC5B,QAAM,OAAO,OAAO,IAAI,EAAE,SAAS,KAAK,CAAC;AACzC,QAAM,OAAO,MAAM;AACnB,UAAQ,IAAI,oBAAoB,EAAE,EAAE;AACtC;AAEA,eAAe,oBAAoB,OAAwD;AACzF,QAAM,MAAM,OAAO,MAAM,KAAK,MAAM,WAAW,SAAS,MAAM,KAAK,GAAG,EAAE,IAAI;AAC5E,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,SAAS;AAAA,IACb,OAAO,MAAM;AAAA,IAAC;AAAA,IACd,MAAM,CAAC,KAAa,SAAmC,QAAQ,MAAM,OAAO,GAAG,GAAG,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,GAAG;AAAA,IAClH,MAAM,CAAC,KAAa,SAAmC,QAAQ,MAAM,OAAO,UAAU,GAAG,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,UAAU,GAAG,EAAE;AAAA,IACrI,OAAO,CAAC,KAAa,SAAmC,QAAQ,MAAM,OAAO,WAAW,GAAG,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,WAAW,GAAG,EAAE;AAAA,EAC1I;AACA,QAAM,SAAS,IAAI,eAAe,SAAS,MAAM;AAEjD,UAAQ,MAAM,iBAAiB,GAAG,0CAA0C;AAE5E,QAAM,SAAS,MAAM,OAAO,KAAK;AAAA,IAC/B,cAAc;AAAA,IACd,YAAY,CAAC,MAAM;AACjB,UAAI,EAAE,YAAY,OAAO,KAAK,EAAE,YAAY,GAAG;AAC7C,gBAAQ,MAAM,eAAe,EAAE,SAAS,IAAI,EAAE,KAAK,eAAe,EAAE,KAAK,QAAQ;AAAA,MACnF;AAAA,IACF;AAAA,EACF,CAAC;AAED,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,gBAAgB;AAC9B,UAAQ,MAAM,iBAAiB,OAAO,KAAK,EAAE;AAC7C,UAAQ,MAAM,iBAAiB,OAAO,OAAO,wCAAwC;AACrF,UAAQ,MAAM,iBAAiB,OAAO,QAAQ,iCAAiC;AAC/E,UAAQ,MAAM,iBAAiB,OAAO,gBAAgB,uBAAuB;AAC7E,UAAQ,MAAM,iBAAiB,OAAO,WAAW,YAAY;AAC/D;AAEA,eAAe,aAA4B;AACzC,QAAM,EAAE,WAAW,UAAU,MAAM,IAAI,MAAM,OAAO,aAAkB;AACtE,QAAM,EAAE,KAAK,IAAI,MAAM,OAAO,MAAW;AACzC,QAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,IAAS;AAC1C,QAAM,WAAW,MAAM,OAAO,UAAe;AAE7C,QAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,QAAM,MAAM,CAAC,MAA+B,IAAI,QAAQ,CAAC,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;AAE5F,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,kCAA6B;AAC3C,UAAQ,MAAM,0JAA6B;AAC3C,UAAQ,MAAM,EAAE;AAEhB,QAAM,UAAU,KAAK,QAAQ,IAAI,GAAG,MAAM;AAC1C,MAAI,cAAc;AAClB,MAAI;AACF,kBAAc,MAAM,SAAS,SAAS,OAAO;AAAA,EAC/C,QAAQ;AAAA,EAAC;AAET,QAAM,MAAM,CAAC,QAAgB,YAAY,SAAS,GAAG,KAAK,CAAC,CAAC,QAAQ,IAAI,GAAG;AAE3E,QAAM,QAAkB,CAAC;AAEzB,MAAI,CAAC,IAAI,mBAAmB,GAAG;AAC7B,UAAM,MAAM,MAAM,IAAI,oDAAoD;AAC1E,QAAI,IAAI,KAAK,EAAG,OAAM,KAAK,qBAAqB,IAAI,KAAK,CAAC,EAAE;AAAA,EAC9D,OAAO;AACL,YAAQ,MAAM,kCAAkC;AAAA,EAClD;AAEA,MAAI,CAAC,IAAI,cAAc,GAAG;AACxB,UAAM,MAAM,MAAM,IAAI,6DAA6D;AACnF,QAAI,IAAI,KAAK,EAAG,OAAM,KAAK,gBAAgB,IAAI,KAAK,EAAE,QAAQ,OAAO,EAAE,CAAC,EAAE;AAAA,EAC5E,OAAO;AACL,YAAQ,MAAM,6BAA6B;AAAA,EAC7C;AAEA,MAAI,CAAC,IAAI,aAAa,GAAG;AACvB,UAAM,MAAM,MAAM,IAAI,iBAAiB;AACvC,QAAI,IAAI,KAAK,EAAG,OAAM,KAAK,eAAe,IAAI,KAAK,CAAC,EAAE;AAAA,EACxD,OAAO;AACL,YAAQ,MAAM,4BAA4B;AAAA,EAC5C;AAEA,KAAG,MAAM;AAET,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,aAAa,cACf,YAAY,QAAQ,IAAI,OAAO,MAAM,KAAK,IAAI,IAAI,OAClD,MAAM,KAAK,IAAI,IAAI;AACvB,UAAM,UAAU,SAAS,YAAY,OAAO;AAC5C,YAAQ,MAAM;AAAA,aAAgB,OAAO,EAAE;AAAA,EACzC,OAAO;AACL,YAAQ,MAAM,yCAAyC;AAAA,EACzD;AAEA,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,+BAA+B;AAE7C,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,SAAS;AAAA,IACb,OAAO,MAAM;AAAA,IAAC;AAAA,IACd,MAAM,MAAM;AAAA,IAAC;AAAA,IACb,MAAM,MAAM;AAAA,IAAC;AAAA,IACb,OAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AACA,QAAM,SAAS,IAAI,eAAe,SAAS,MAAM;AAEjD,QAAM,QAAQ,WAAW;AACzB,QAAM,WAAW,MAAM,QAAQ,KAAK;AAEpC,MAAI,SAAS,UAAU,IAAI;AACzB,YAAQ,MAAM,yBAAyB,SAAS,MAAM,gCAA2B;AAAA,EACnF,OAAO;AACL,UAAM,SAAS,MAAM,OAAO,KAAK;AAAA,MAC/B,cAAc;AAAA,MACd,YAAY,CAAC,MAAM;AACjB,YAAI,EAAE,YAAY,QAAQ,KAAK,EAAE,YAAY,GAAG;AAC9C,kBAAQ,OAAO,MAAM,KAAK,EAAE,SAAS,IAAI,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa;AAAA,QACrF;AAAA,MACF;AAAA,IACF,CAAC;AACD,YAAQ,MAAM,YAAY,OAAO,KAAK,eAAe,OAAO,OAAO,aAAa,OAAO,gBAAgB,cAAc;AAAA,EACvH;AAEA,QAAM,YAAY,KAAK,QAAQ,GAAG,SAAS;AAC3C,QAAM,MAAM,KAAK,WAAW,WAAW,GAAG,EAAE,WAAW,KAAK,CAAC;AAE7D,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,wBAAwB;AACtC,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,wEAAwE;AACtF,UAAQ,MAAM,EAAE;AAClB;AAEA,eAAe,OAAsB;AACnC,QAAM,EAAE,SAAS,YAAY,MAAM,IAAI,UAAU,QAAQ,IAAI;AAE7D,MAAI,CAAC,WAAW,YAAY,UAAU,MAAM,MAAM,MAAM,MAAM;AAC5D,YAAQ,IAAI,IAAI;AAChB;AAAA,EACF;AAEA,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,YAAM,WAAW;AACjB;AAAA,IACF,KAAK;AACH,YAAM,YAAY,YAAY,KAAK;AACnC;AAAA,IACF,KAAK;AACH,YAAM,WAAW;AACjB;AAAA,IACF,KAAK;AACH,YAAM,UAAU,UAAU;AAC1B;AAAA,IACF,KAAK;AACH,YAAM,eAAe,UAAU;AAC/B;AAAA,IACF,KAAK;AACH,YAAM,iBAAiB,UAAU;AACjC;AAAA,IACF,KAAK;AACH,YAAM,aAAa,YAAY,KAAK;AACpC;AAAA,IACF,KAAK;AACH,YAAM,oBAAoB,KAAK;AAC/B;AAAA,IACF;AACE,cAAQ,MAAM,oBAAoB,OAAO,EAAE;AAC3C,cAAQ,IAAI,IAAI;AAChB,cAAQ,KAAK,CAAC;AAAA,EAClB;AACF;AAEA,KAAK,EAAE,MAAM,CAAC,QAAiB;AAC7B,MAAI,eAAe,OAAO;AACxB,YAAQ,MAAM,UAAU,IAAI,OAAO,EAAE;AACrC,QAAI,YAAY,OAAO,MAAM,QAAS,IAAgC,MAAM,GAAG;AAC7E,iBAAW,SAAU,IAAgC,QAAoD;AACvG,gBAAQ,MAAM,WAAW,MAAM,IAAI,KAAK,MAAM,OAAO,EAAE;AAAA,MACzD;AAAA,IACF;AAAA,EACF,OAAO;AACL,YAAQ,MAAM,OAAO,GAAG,CAAC;AAAA,EAC3B;AACA,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}