@kairos-sdk/core 0.5.0 → 0.5.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.
- package/README.md +10 -1
- package/dist/{chunk-HBGZTUUZ.js → chunk-GVZKMS53.js} +5 -7
- package/dist/chunk-GVZKMS53.js.map +1 -0
- package/dist/{chunk-5GAY7CSJ.js → chunk-MYAGTDQ2.js} +2 -2
- package/dist/{chunk-EVOAYH2K.js → chunk-V2IZBZGB.js} +2 -2
- package/dist/{chunk-KIFT5LA7.js → chunk-VPPWTMRJ.js} +2 -2
- package/dist/chunk-VPPWTMRJ.js.map +1 -0
- package/dist/cli.cjs +55 -37
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +27 -7
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +32 -34
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +4 -4
- package/dist/mcp-server.cjs +92 -21
- package/dist/mcp-server.cjs.map +1 -1
- package/dist/mcp-server.js +90 -19
- package/dist/mcp-server.js.map +1 -1
- package/dist/standalone.cjs +1 -1
- package/dist/standalone.cjs.map +1 -1
- package/dist/standalone.js +2 -2
- package/package.json +12 -5
- package/dist/chunk-HBGZTUUZ.js.map +0 -1
- package/dist/chunk-KIFT5LA7.js.map +0 -1
- /package/dist/{chunk-5GAY7CSJ.js.map → chunk-MYAGTDQ2.js.map} +0 -0
- /package/dist/{chunk-EVOAYH2K.js.map → chunk-V2IZBZGB.js.map} +0 -0
package/dist/cli.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
Kairos
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-GVZKMS53.js";
|
|
5
|
+
import "./chunk-V2IZBZGB.js";
|
|
6
6
|
import {
|
|
7
7
|
TemplateSyncer
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-MYAGTDQ2.js";
|
|
9
9
|
import {
|
|
10
10
|
FileLibrary,
|
|
11
11
|
PatternAnalyzer
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-VPPWTMRJ.js";
|
|
13
13
|
|
|
14
14
|
// src/cli.ts
|
|
15
15
|
var HELP = `
|
|
@@ -32,6 +32,7 @@ Build options:
|
|
|
32
32
|
--dry-run Generate and validate without deploying
|
|
33
33
|
--name <name> Override the generated workflow name
|
|
34
34
|
--activate Activate the workflow after deployment
|
|
35
|
+
--smoke-test After deploy, trigger the workflow and verify it runs without error
|
|
35
36
|
|
|
36
37
|
Patterns options:
|
|
37
38
|
--days <days> Analysis window (default: 30)
|
|
@@ -125,7 +126,7 @@ function createDryRunClient() {
|
|
|
125
126
|
async function handleBuild(positional, flags) {
|
|
126
127
|
const description = positional.join(" ");
|
|
127
128
|
if (!description) {
|
|
128
|
-
console.error("Usage: kairos build <description> [--dry-run] [--name <name>] [--activate]");
|
|
129
|
+
console.error("Usage: kairos build <description> [--dry-run] [--name <name>] [--activate] [--smoke-test]");
|
|
129
130
|
process.exit(1);
|
|
130
131
|
}
|
|
131
132
|
const isDryRun = flags["dry-run"] === true;
|
|
@@ -135,7 +136,8 @@ async function handleBuild(positional, flags) {
|
|
|
135
136
|
const result = await kairos.build(description, {
|
|
136
137
|
dryRun: isDryRun,
|
|
137
138
|
...typeof flags["name"] === "string" ? { name: flags["name"] } : {},
|
|
138
|
-
activate: flags["activate"] === true
|
|
139
|
+
activate: flags["activate"] === true || flags["smoke-test"] === true,
|
|
140
|
+
smokeTest: flags["smoke-test"] === true
|
|
139
141
|
});
|
|
140
142
|
await kairos.drain();
|
|
141
143
|
const elapsed = ((Date.now() - start) / 1e3).toFixed(1);
|
|
@@ -148,7 +150,8 @@ async function handleBuild(positional, flags) {
|
|
|
148
150
|
activationRequired: result.activationRequired,
|
|
149
151
|
dryRun: result.dryRun,
|
|
150
152
|
credentialsNeeded: result.credentialsNeeded,
|
|
151
|
-
...result.dryRun ? { workflow: result.workflow } : {}
|
|
153
|
+
...result.dryRun ? { workflow: result.workflow } : {},
|
|
154
|
+
...result.smokeTest ? { smokeTest: result.smokeTest } : {}
|
|
152
155
|
}, null, 2));
|
|
153
156
|
}
|
|
154
157
|
async function handleReplace(positional) {
|
|
@@ -439,11 +442,28 @@ async function handleInit() {
|
|
|
439
442
|
}
|
|
440
443
|
const kairosDir = join(homedir(), ".kairos");
|
|
441
444
|
await mkdir(join(kairosDir, "telemetry"), { recursive: true });
|
|
445
|
+
const kairosPath = process.execPath ? `${process.execPath.replace(/node$/, "kairos-mcp")}` : "kairos-mcp";
|
|
442
446
|
console.error("");
|
|
443
447
|
console.error(" Setup complete! Try:");
|
|
444
448
|
console.error("");
|
|
445
449
|
console.error(' kairos build "Send a Slack message when a webhook fires" --dry-run');
|
|
446
450
|
console.error("");
|
|
451
|
+
console.error(" \u2500\u2500\u2500 Claude Desktop MCP config \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\u2500\u2500\u2500\u2500\u2500\u2500");
|
|
452
|
+
console.error(" Add this to ~/Library/Application Support/Claude/claude_desktop_config.json:");
|
|
453
|
+
console.error("");
|
|
454
|
+
console.error(" {");
|
|
455
|
+
console.error(' "mcpServers": {');
|
|
456
|
+
console.error(' "kairos": {');
|
|
457
|
+
console.error(` "command": "${kairosPath}",`);
|
|
458
|
+
console.error(' "env": {');
|
|
459
|
+
console.error(` "ANTHROPIC_API_KEY": "${process.env["ANTHROPIC_API_KEY"] ? "<set>" : "your-key-here"}",`);
|
|
460
|
+
console.error(` "N8N_BASE_URL": "${process.env["N8N_BASE_URL"] ?? "https://your-n8n-instance"}",`);
|
|
461
|
+
console.error(` "N8N_API_KEY": "${process.env["N8N_API_KEY"] ? "<set>" : "your-n8n-api-key"}"`);
|
|
462
|
+
console.error(" }");
|
|
463
|
+
console.error(" }");
|
|
464
|
+
console.error(" }");
|
|
465
|
+
console.error(" }");
|
|
466
|
+
console.error("");
|
|
447
467
|
}
|
|
448
468
|
async function main() {
|
|
449
469
|
const { command, positional, flags } = parseArgs(process.argv);
|
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'\nimport { FileLibrary } from './library/file-library.js'\nimport { TemplateSyncer } from './templates/syncer.js'\nimport { PatternAnalyzer } from './telemetry/pattern-analyzer.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 replace <n8n-id> <description>\n kairos patterns [options]\n kairos sessions [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\nPatterns options:\n --days <days> Analysis window (default: 30)\n --json Output raw JSON instead of summary\n\nSessions options:\n --limit <n> Number of recent sessions to show (default: 20)\n --json Output raw JSON instead of summary\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 KAIROS_PROMPT_PROFILE minimal | standard | rich (default: standard)\n minimal: base prompt only, no library context, top 3 patterns\n standard: full library context, top 10 patterns (default)\n rich: full library context, top 15 patterns, proactive expression guidance\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 handleReplace(positional: string[]): Promise<void> {\n const id = positional[0]\n const description = positional.slice(1).join(' ')\n\n if (!id || !description) {\n console.error('Usage: kairos replace <n8n-workflow-id> <description>')\n process.exit(1)\n }\n\n const kairos = createClient()\n const start = Date.now()\n console.error(`Replacing workflow ${id}...`)\n\n const result = await kairos.replace(id, description)\n await kairos.drain()\n\n const elapsed = ((Date.now() - start) / 1000).toFixed(1)\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 }, 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 maxRaw = typeof flags['max'] === 'string' ? parseInt(flags['max'], 10) : NaN\n const max = Number.isNaN(maxRaw) ? 500 : maxRaw\n const library = new FileLibrary()\n const syncer = new TemplateSyncer(library, CLI_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 handlePatterns(flags: Record<string, string | boolean>): Promise<void> {\n const daysRaw = typeof flags['days'] === 'string' ? parseInt(flags['days'], 10) : NaN\n const days = Number.isNaN(daysRaw) ? 30 : daysRaw\n const analyzer = PatternAnalyzer.fromEnv()\n\n const analysis = await analyzer.analyzeAndSave(days)\n\n if (flags['json'] === true) {\n console.log(JSON.stringify(analysis, null, 2))\n return\n }\n\n console.log(`\\nKairos Pattern Analysis (last ${days} days)`)\n console.log('─'.repeat(45))\n console.log(` Builds: ${analysis.summary.totalBuilds}`)\n console.log(` Attempts: ${analysis.summary.totalAttempts}`)\n console.log(` First-try pass: ${(analysis.summary.firstTryPassRate * 100).toFixed(1)}%`)\n console.log(` Correction rate: ${(analysis.summary.correctionRate * 100).toFixed(1)}%`)\n if (analysis.summary.singleAttemptFailRate !== undefined) {\n console.log(` Single-attempt failures: ${(analysis.summary.singleAttemptFailRate * 100).toFixed(1)}%`)\n }\n console.log(` Avg duration: ${(analysis.summary.avgDurationMs / 1000).toFixed(1)}s`)\n\n const active = analysis.topFailureRules.filter(p => p.state !== 'resolved')\n const resolved = analysis.topFailureRules.filter(p => p.state === 'resolved')\n\n if (active.length > 0) {\n console.log(`\\nActive Failure Patterns:`)\n for (const p of active) {\n const regressionTag = p.regressed ? '[REGRESSION] ' : ''\n const stateTag = p.state === 'confirmed' ? '[CONFIRMED]' : '[DRAFT]'\n const trendIcon = p.trend === 'improving' ? ' ^' : p.trend === 'worsening' ? ' v' : p.trend === 'new' ? ' *' : ''\n const stage = p.pipelineStage.replace(/_/g, ' ')\n const scoreStr = p.compositeScore.toFixed(3)\n console.log(` Rule ${p.rule} ${regressionTag}${stateTag}${trendIcon} — score ${scoreStr} | ${p.failureCount} failures (${(p.confidence * 100).toFixed(1)}%) [${stage}]`)\n const f = p.scoringFactors\n console.log(` Factors: confidence=${f.rawConfidence} × impact=${f.impact} × recency=${f.recency} + boost=${f.stickinessBoost}`)\n if (p.mitigation) console.log(` Fix: ${p.mitigation}`)\n if (p.exampleMessages.length > 0) console.log(` e.g. ${p.exampleMessages[0]}`)\n if (p.workflowTypeBreakdown) {\n const topType = Object.entries(p.workflowTypeBreakdown).sort((a, b) => b[1] - a[1])[0]\n if (topType) console.log(` Top workflow type: ${topType[0]} (${topType[1]} failures)`)\n }\n }\n } else {\n console.log(`\\nNo active failure patterns.`)\n }\n\n if (resolved.length > 0) {\n console.log(`\\nResolved Patterns:`)\n for (const p of resolved) {\n console.log(` Rule ${p.rule} — previously confirmed, 0 failures in current window`)\n }\n }\n\n if (analysis.failingCredentialTypes.length > 0) {\n console.log(`\\nFailing Credential Types:`)\n for (const c of analysis.failingCredentialTypes) {\n console.log(` ${c.type}: ${c.count} failures`)\n }\n }\n\n if (analysis.warningEffectiveness && analysis.warningEffectiveness.length > 0) {\n console.log(`\\nWarning Effectiveness:`)\n for (const w of analysis.warningEffectiveness) {\n console.log(` Rule ${w.rule}: warned ${w.timesWarned}x, prevented ${w.timesWarnedAndPassed}x (${Math.round(w.effectivenessRate * 100)}% effective)`)\n }\n }\n\n const drift = analysis.drift\n if (drift) {\n console.log(`\\nDrift Detection: ${drift.healthy ? 'HEALTHY' : 'ALERTS FOUND'}`)\n console.log(` Coverage: ${drift.coveredRules}/${drift.totalRules} rules have mitigations + stage mappings`)\n if (drift.alerts.length > 0) {\n for (const a of drift.alerts) {\n console.log(` [${a.type}] Rule ${a.rule}: ${a.message}`)\n }\n }\n }\n\n console.log(`\\nPatterns saved to ~/.kairos/patterns.json`)\n}\n\nasync function handleSessions(flags: Record<string, string | boolean>): Promise<void> {\n const limitRaw = typeof flags['limit'] === 'string' ? parseInt(flags['limit'], 10) : NaN\n const limit = Number.isNaN(limitRaw) ? 20 : limitRaw\n const analyzer = PatternAnalyzer.fromEnv()\n const sessions = await analyzer.getSessions(limit)\n\n if (flags['json'] === true) {\n console.log(JSON.stringify(sessions, null, 2))\n return\n }\n\n if (sessions.length === 0) {\n console.log('No session history found. Run kairos patterns first to generate session data.')\n return\n }\n\n console.log(`\\nRecent Sessions (last ${sessions.length})`)\n console.log('─'.repeat(60))\n\n for (const s of [...sessions].reverse()) {\n const status = s.success ? '✓' : '✗'\n const typeTag = s.workflowType ? ` [${s.workflowType}]` : ''\n const attemptsStr = s.attempts > 1 ? ` (${s.attempts} attempts)` : ''\n const nameStr = s.workflowName ? ` ${s.workflowName}` : ` ${s.description.slice(0, 50)}`\n const rulesStr = s.failedRules.length > 0 ? ` — rules ${s.failedRules.join(', ')} failed` : ''\n console.log(`${s.date} ${status}${nameStr}${attemptsStr}${typeTag}${rulesStr}`)\n }\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' || 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 'replace':\n await handleReplace(positional)\n break\n case 'patterns':\n await handlePatterns(flags)\n break\n case 'sessions':\n await handleSessions(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":"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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'\nimport { PatternAnalyzer } from './telemetry/pattern-analyzer.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 replace <n8n-id> <description>\n kairos patterns [options]\n kairos sessions [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 --smoke-test After deploy, trigger the workflow and verify it runs without error\n\nPatterns options:\n --days <days> Analysis window (default: 30)\n --json Output raw JSON instead of summary\n\nSessions options:\n --limit <n> Number of recent sessions to show (default: 20)\n --json Output raw JSON instead of summary\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 KAIROS_PROMPT_PROFILE minimal | standard | rich (default: standard)\n minimal: base prompt only, no library context, top 3 patterns\n standard: full library context, top 10 patterns (default)\n rich: full library context, top 15 patterns, proactive expression guidance\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] [--smoke-test]')\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 || flags['smoke-test'] === true,\n smokeTest: flags['smoke-test'] === 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 ...(result.smokeTest ? { smokeTest: result.smokeTest } : {}),\n }, null, 2))\n}\n\nasync function handleReplace(positional: string[]): Promise<void> {\n const id = positional[0]\n const description = positional.slice(1).join(' ')\n\n if (!id || !description) {\n console.error('Usage: kairos replace <n8n-workflow-id> <description>')\n process.exit(1)\n }\n\n const kairos = createClient()\n const start = Date.now()\n console.error(`Replacing workflow ${id}...`)\n\n const result = await kairos.replace(id, description)\n await kairos.drain()\n\n const elapsed = ((Date.now() - start) / 1000).toFixed(1)\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 }, 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 maxRaw = typeof flags['max'] === 'string' ? parseInt(flags['max'], 10) : NaN\n const max = Number.isNaN(maxRaw) ? 500 : maxRaw\n const library = new FileLibrary()\n const syncer = new TemplateSyncer(library, CLI_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 handlePatterns(flags: Record<string, string | boolean>): Promise<void> {\n const daysRaw = typeof flags['days'] === 'string' ? parseInt(flags['days'], 10) : NaN\n const days = Number.isNaN(daysRaw) ? 30 : daysRaw\n const analyzer = PatternAnalyzer.fromEnv()\n\n const analysis = await analyzer.analyzeAndSave(days)\n\n if (flags['json'] === true) {\n console.log(JSON.stringify(analysis, null, 2))\n return\n }\n\n console.log(`\\nKairos Pattern Analysis (last ${days} days)`)\n console.log('─'.repeat(45))\n console.log(` Builds: ${analysis.summary.totalBuilds}`)\n console.log(` Attempts: ${analysis.summary.totalAttempts}`)\n console.log(` First-try pass: ${(analysis.summary.firstTryPassRate * 100).toFixed(1)}%`)\n console.log(` Correction rate: ${(analysis.summary.correctionRate * 100).toFixed(1)}%`)\n if (analysis.summary.singleAttemptFailRate !== undefined) {\n console.log(` Single-attempt failures: ${(analysis.summary.singleAttemptFailRate * 100).toFixed(1)}%`)\n }\n console.log(` Avg duration: ${(analysis.summary.avgDurationMs / 1000).toFixed(1)}s`)\n\n const active = analysis.topFailureRules.filter(p => p.state !== 'resolved')\n const resolved = analysis.topFailureRules.filter(p => p.state === 'resolved')\n\n if (active.length > 0) {\n console.log(`\\nActive Failure Patterns:`)\n for (const p of active) {\n const regressionTag = p.regressed ? '[REGRESSION] ' : ''\n const stateTag = p.state === 'confirmed' ? '[CONFIRMED]' : '[DRAFT]'\n const trendIcon = p.trend === 'improving' ? ' ^' : p.trend === 'worsening' ? ' v' : p.trend === 'new' ? ' *' : ''\n const stage = p.pipelineStage.replace(/_/g, ' ')\n const scoreStr = p.compositeScore.toFixed(3)\n console.log(` Rule ${p.rule} ${regressionTag}${stateTag}${trendIcon} — score ${scoreStr} | ${p.failureCount} failures (${(p.confidence * 100).toFixed(1)}%) [${stage}]`)\n const f = p.scoringFactors\n console.log(` Factors: confidence=${f.rawConfidence} × impact=${f.impact} × recency=${f.recency} + boost=${f.stickinessBoost}`)\n if (p.mitigation) console.log(` Fix: ${p.mitigation}`)\n if (p.exampleMessages.length > 0) console.log(` e.g. ${p.exampleMessages[0]}`)\n if (p.workflowTypeBreakdown) {\n const topType = Object.entries(p.workflowTypeBreakdown).sort((a, b) => b[1] - a[1])[0]\n if (topType) console.log(` Top workflow type: ${topType[0]} (${topType[1]} failures)`)\n }\n }\n } else {\n console.log(`\\nNo active failure patterns.`)\n }\n\n if (resolved.length > 0) {\n console.log(`\\nResolved Patterns:`)\n for (const p of resolved) {\n console.log(` Rule ${p.rule} — previously confirmed, 0 failures in current window`)\n }\n }\n\n if (analysis.failingCredentialTypes.length > 0) {\n console.log(`\\nFailing Credential Types:`)\n for (const c of analysis.failingCredentialTypes) {\n console.log(` ${c.type}: ${c.count} failures`)\n }\n }\n\n if (analysis.warningEffectiveness && analysis.warningEffectiveness.length > 0) {\n console.log(`\\nWarning Effectiveness:`)\n for (const w of analysis.warningEffectiveness) {\n console.log(` Rule ${w.rule}: warned ${w.timesWarned}x, prevented ${w.timesWarnedAndPassed}x (${Math.round(w.effectivenessRate * 100)}% effective)`)\n }\n }\n\n const drift = analysis.drift\n if (drift) {\n console.log(`\\nDrift Detection: ${drift.healthy ? 'HEALTHY' : 'ALERTS FOUND'}`)\n console.log(` Coverage: ${drift.coveredRules}/${drift.totalRules} rules have mitigations + stage mappings`)\n if (drift.alerts.length > 0) {\n for (const a of drift.alerts) {\n console.log(` [${a.type}] Rule ${a.rule}: ${a.message}`)\n }\n }\n }\n\n console.log(`\\nPatterns saved to ~/.kairos/patterns.json`)\n}\n\nasync function handleSessions(flags: Record<string, string | boolean>): Promise<void> {\n const limitRaw = typeof flags['limit'] === 'string' ? parseInt(flags['limit'], 10) : NaN\n const limit = Number.isNaN(limitRaw) ? 20 : limitRaw\n const analyzer = PatternAnalyzer.fromEnv()\n const sessions = await analyzer.getSessions(limit)\n\n if (flags['json'] === true) {\n console.log(JSON.stringify(sessions, null, 2))\n return\n }\n\n if (sessions.length === 0) {\n console.log('No session history found. Run kairos patterns first to generate session data.')\n return\n }\n\n console.log(`\\nRecent Sessions (last ${sessions.length})`)\n console.log('─'.repeat(60))\n\n for (const s of [...sessions].reverse()) {\n const status = s.success ? '✓' : '✗'\n const typeTag = s.workflowType ? ` [${s.workflowType}]` : ''\n const attemptsStr = s.attempts > 1 ? ` (${s.attempts} attempts)` : ''\n const nameStr = s.workflowName ? ` ${s.workflowName}` : ` ${s.description.slice(0, 50)}`\n const rulesStr = s.failedRules.length > 0 ? ` — rules ${s.failedRules.join(', ')} failed` : ''\n console.log(`${s.date} ${status}${nameStr}${attemptsStr}${typeTag}${rulesStr}`)\n }\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 const kairosPath = process.execPath\n ? `${process.execPath.replace(/node$/, 'kairos-mcp')}`\n : 'kairos-mcp'\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 console.error(' ─── Claude Desktop MCP config ───────────────────────────────')\n console.error(' Add this to ~/Library/Application Support/Claude/claude_desktop_config.json:')\n console.error('')\n console.error(' {')\n console.error(' \"mcpServers\": {')\n console.error(' \"kairos\": {')\n console.error(` \"command\": \"${kairosPath}\",`)\n console.error(' \"env\": {')\n console.error(` \"ANTHROPIC_API_KEY\": \"${process.env['ANTHROPIC_API_KEY'] ? '<set>' : 'your-key-here'}\",`)\n console.error(` \"N8N_BASE_URL\": \"${process.env['N8N_BASE_URL'] ?? 'https://your-n8n-instance'}\",`)\n console.error(` \"N8N_API_KEY\": \"${process.env['N8N_API_KEY'] ? '<set>' : 'your-n8n-api-key'}\"`)\n console.error(' }')\n console.error(' }')\n console.error(' }')\n console.error(' }')\n console.error('')\n}\n\nasync function main(): Promise<void> {\n const { command, positional, flags } = parseArgs(process.argv)\n\n if (!command || command === 'help' || 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 'replace':\n await handleReplace(positional)\n break\n case 'patterns':\n await handlePatterns(flags)\n break\n case 'sessions':\n await handleSessions(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":"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","names":[]}
|
package/dist/index.cjs
CHANGED
|
@@ -537,6 +537,36 @@ var N8nProvider = class {
|
|
|
537
537
|
}
|
|
538
538
|
};
|
|
539
539
|
|
|
540
|
+
// src/errors/generation-error.ts
|
|
541
|
+
var GenerationError = class extends KairosError {
|
|
542
|
+
constructor(message, cause) {
|
|
543
|
+
super(message, cause);
|
|
544
|
+
this.name = "GenerationError";
|
|
545
|
+
}
|
|
546
|
+
};
|
|
547
|
+
|
|
548
|
+
// src/errors/response-parse-error.ts
|
|
549
|
+
var ResponseParseError = class extends KairosError {
|
|
550
|
+
constructor(message, cause) {
|
|
551
|
+
super(message, cause);
|
|
552
|
+
this.name = "ResponseParseError";
|
|
553
|
+
}
|
|
554
|
+
};
|
|
555
|
+
|
|
556
|
+
// src/errors/validation-error.ts
|
|
557
|
+
var ValidationError = class extends KairosError {
|
|
558
|
+
constructor(message, issues, attemptMetadata, warnedRules) {
|
|
559
|
+
super(message);
|
|
560
|
+
this.issues = issues;
|
|
561
|
+
this.attemptMetadata = attemptMetadata;
|
|
562
|
+
this.warnedRules = warnedRules;
|
|
563
|
+
this.name = "ValidationError";
|
|
564
|
+
}
|
|
565
|
+
issues;
|
|
566
|
+
attemptMetadata;
|
|
567
|
+
warnedRules;
|
|
568
|
+
};
|
|
569
|
+
|
|
540
570
|
// src/validation/registry.ts
|
|
541
571
|
var DEFAULT_REGISTRY = [
|
|
542
572
|
// Trigger nodes
|
|
@@ -1311,36 +1341,6 @@ var N8nValidator = class {
|
|
|
1311
1341
|
}
|
|
1312
1342
|
};
|
|
1313
1343
|
|
|
1314
|
-
// src/errors/generation-error.ts
|
|
1315
|
-
var GenerationError = class extends KairosError {
|
|
1316
|
-
constructor(message, cause) {
|
|
1317
|
-
super(message, cause);
|
|
1318
|
-
this.name = "GenerationError";
|
|
1319
|
-
}
|
|
1320
|
-
};
|
|
1321
|
-
|
|
1322
|
-
// src/errors/response-parse-error.ts
|
|
1323
|
-
var ResponseParseError = class extends KairosError {
|
|
1324
|
-
constructor(message, cause) {
|
|
1325
|
-
super(message, cause);
|
|
1326
|
-
this.name = "ResponseParseError";
|
|
1327
|
-
}
|
|
1328
|
-
};
|
|
1329
|
-
|
|
1330
|
-
// src/errors/validation-error.ts
|
|
1331
|
-
var ValidationError = class extends KairosError {
|
|
1332
|
-
constructor(message, issues, attemptMetadata, warnedRules) {
|
|
1333
|
-
super(message);
|
|
1334
|
-
this.issues = issues;
|
|
1335
|
-
this.attemptMetadata = attemptMetadata;
|
|
1336
|
-
this.warnedRules = warnedRules;
|
|
1337
|
-
this.name = "ValidationError";
|
|
1338
|
-
}
|
|
1339
|
-
issues;
|
|
1340
|
-
attemptMetadata;
|
|
1341
|
-
warnedRules;
|
|
1342
|
-
};
|
|
1343
|
-
|
|
1344
1344
|
// src/generation/prompt-builder.ts
|
|
1345
1345
|
var import_node_fs = require("fs");
|
|
1346
1346
|
var import_node_path = require("path");
|
|
@@ -2345,7 +2345,7 @@ var PatternAnalyzer = class _PatternAnalyzer {
|
|
|
2345
2345
|
this._cachedEvents = events;
|
|
2346
2346
|
const starts = events.filter((e) => e.eventType === "build_start");
|
|
2347
2347
|
const attempts = events.filter((e) => e.eventType === "generation_attempt");
|
|
2348
|
-
const
|
|
2348
|
+
const _passed = attempts.filter(
|
|
2349
2349
|
(a) => a.data.validationPassed === true
|
|
2350
2350
|
);
|
|
2351
2351
|
const failed = attempts.filter(
|
|
@@ -2839,7 +2839,6 @@ var DEFAULT_MODEL = process.env["KAIROS_MODEL"] ?? "claude-sonnet-4-6";
|
|
|
2839
2839
|
var Kairos = class {
|
|
2840
2840
|
provider;
|
|
2841
2841
|
designer;
|
|
2842
|
-
validator;
|
|
2843
2842
|
library;
|
|
2844
2843
|
logger;
|
|
2845
2844
|
telemetry;
|
|
@@ -2865,7 +2864,6 @@ var Kairos = class {
|
|
|
2865
2864
|
const anthropic = new import_sdk.default({ apiKey: options.anthropicApiKey });
|
|
2866
2865
|
const patternsPath = typeof options.telemetry === "string" ? (0, import_node_path6.join)(options.telemetry, "..", "patterns.json") : (0, import_node_path6.join)((0, import_node_os5.homedir)(), ".kairos", "patterns.json");
|
|
2867
2866
|
this.designer = new WorkflowDesigner(anthropic, this.model, logger, patternsPath);
|
|
2868
|
-
this.validator = new N8nValidator();
|
|
2869
2867
|
this.library = options.library ?? new NullLibrary();
|
|
2870
2868
|
this.logger = logger;
|
|
2871
2869
|
if (options.telemetry === true) {
|
|
@@ -2962,7 +2960,6 @@ var Kairos = class {
|
|
|
2962
2960
|
}
|
|
2963
2961
|
await this.emitAttemptTelemetry(description, designResult, workflowType, runId);
|
|
2964
2962
|
const workflow = options?.name ? { ...designResult.workflow, name: options.name } : designResult.workflow;
|
|
2965
|
-
this.saveToLibrary(workflow, description, designResult, matches);
|
|
2966
2963
|
if (options?.dryRun) {
|
|
2967
2964
|
const totalTokensInput2 = designResult.attemptMetadata.reduce((s, m) => s + m.tokensInput, 0);
|
|
2968
2965
|
const totalTokensOutput2 = designResult.attemptMetadata.reduce((s, m) => s + m.tokensOutput, 0);
|
|
@@ -2998,6 +2995,7 @@ var Kairos = class {
|
|
|
2998
2995
|
if (options?.activate) {
|
|
2999
2996
|
await provider.activate(deployed.workflowId);
|
|
3000
2997
|
}
|
|
2998
|
+
this.saveToLibrary(workflow, description, designResult, matches, deployed.workflowId);
|
|
3001
2999
|
let smokeTestResult;
|
|
3002
3000
|
if (options?.smokeTest) {
|
|
3003
3001
|
smokeTestResult = await provider.smokeTest(deployed.workflowId, workflow).catch((err) => {
|