@kairos-sdk/core 0.5.0 → 0.6.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.
Files changed (44) hide show
  1. package/README.md +131 -16
  2. package/dist/{chunk-KIFT5LA7.js → chunk-2ZHNO37N.js} +49 -5
  3. package/dist/chunk-2ZHNO37N.js.map +1 -0
  4. package/dist/chunk-GG4B4TYG.js +153 -0
  5. package/dist/chunk-GG4B4TYG.js.map +1 -0
  6. package/dist/{chunk-5GAY7CSJ.js → chunk-PCNW5ZUD.js} +2 -2
  7. package/dist/chunk-SC6CLQZB.js +144 -0
  8. package/dist/chunk-SC6CLQZB.js.map +1 -0
  9. package/dist/chunk-SQS4QHDH.js +44 -0
  10. package/dist/chunk-SQS4QHDH.js.map +1 -0
  11. package/dist/{chunk-EVOAYH2K.js → chunk-STG7Z2SS.js} +2 -2
  12. package/dist/{chunk-HBGZTUUZ.js → chunk-YOQTEVDB.js} +5 -7
  13. package/dist/chunk-YOQTEVDB.js.map +1 -0
  14. package/dist/cli.cjs +702 -40
  15. package/dist/cli.cjs.map +1 -1
  16. package/dist/cli.js +262 -7
  17. package/dist/cli.js.map +1 -1
  18. package/dist/index.cjs +417 -39
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.cts +86 -4
  21. package/dist/index.d.ts +86 -4
  22. package/dist/index.js +19 -5
  23. package/dist/mcp-server.cjs +139 -24
  24. package/dist/mcp-server.cjs.map +1 -1
  25. package/dist/mcp-server.js +90 -19
  26. package/dist/mcp-server.js.map +1 -1
  27. package/dist/pack-builder-RTQWXGIS.js +9 -0
  28. package/dist/pack-builder-RTQWXGIS.js.map +1 -0
  29. package/dist/pack-exporter-KFNLSP5V.js +7 -0
  30. package/dist/pack-exporter-KFNLSP5V.js.map +1 -0
  31. package/dist/pack-validator-HZPB2XJ3.js +7 -0
  32. package/dist/pack-validator-HZPB2XJ3.js.map +1 -0
  33. package/dist/{reader-B5mV20H6.d.ts → reader-CfWGpL4V.d.cts} +2 -1
  34. package/dist/{reader-B5mV20H6.d.cts → reader-CfWGpL4V.d.ts} +2 -1
  35. package/dist/standalone.cjs +44 -4
  36. package/dist/standalone.cjs.map +1 -1
  37. package/dist/standalone.d.cts +1 -1
  38. package/dist/standalone.d.ts +1 -1
  39. package/dist/standalone.js +2 -2
  40. package/package.json +12 -5
  41. package/dist/chunk-HBGZTUUZ.js.map +0 -1
  42. package/dist/chunk-KIFT5LA7.js.map +0 -1
  43. /package/dist/{chunk-5GAY7CSJ.js.map → chunk-PCNW5ZUD.js.map} +0 -0
  44. /package/dist/{chunk-EVOAYH2K.js.map → chunk-STG7Z2SS.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mcp-server.ts","../src/library/file-library.ts","../src/utils/uuid.ts","../src/utils/thresholds.ts","../src/library/scorer.ts","../src/library/cluster.ts","../src/validation/registry.ts","../src/providers/n8n/types.ts","../src/validation/validator.ts","../src/providers/n8n/stripper.ts","../src/errors/base.ts","../src/errors/api-error.ts","../src/errors/provider-error.ts","../src/errors/guard-error.ts","../src/utils/retry.ts","../src/providers/n8n/api-client.ts","../src/generation/prompt-builder.ts","../src/generation/prompts/v1.ts","../src/validation/rule-metadata.ts","../src/telemetry/reader.ts","../src/telemetry/event-reader.ts","../src/telemetry/pattern-analyzer.ts","../src/validation/node-syncer.ts","../src/telemetry/collector.ts","../src/telemetry/types.ts","../src/utils/logger.ts","../src/utils/workflow-type.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * Kairos MCP Server — decomposed architecture.\n *\n * The host LLM (Claude, GPT, Gemini, whatever) generates the workflow.\n * Kairos provides the knowledge (system prompt, library, failure patterns)\n * and guardrails (validator, deployer). Zero Anthropic API key needed.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { z } from 'zod'\nimport { FileLibrary } from './library/file-library.js'\nimport { N8nValidator } from './validation/validator.js'\nimport { N8nFieldStripper } from './providers/n8n/stripper.js'\nimport { N8nApiClient } from './providers/n8n/api-client.js'\nimport { PromptBuilder } from './generation/prompt-builder.js'\nimport { TelemetryReader } from './telemetry/reader.js'\nimport { PatternAnalyzer } from './telemetry/pattern-analyzer.js'\nimport { NodeSyncer, type SyncResult } from './validation/node-syncer.js'\nimport { TelemetryCollector } from './telemetry/collector.js'\nimport { nullLogger } from './utils/logger.js'\nimport { GuardError } from './errors/guard-error.js'\nimport { generateUUID } from './utils/uuid.js'\nimport { inferWorkflowType } from './utils/workflow-type.js'\nimport type { N8nWorkflow } from './types/workflow.js'\nimport { readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { homedir } from 'node:os'\nimport { fileURLToPath } from 'node:url'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8')) as { version: string }\n\nconst library = new FileLibrary()\nlet _validator = new N8nValidator()\n// Accessor so kairos_sync can swap the registry without callers closing over the old instance\nfunction getValidator(): N8nValidator { return _validator }\nconst nodeSyncer = new NodeSyncer()\nlet lastSync: SyncResult | null = null\nconst AUTO_SYNC_TIMEOUT_MS = 5_000 // cap how long kairos_prompt waits for n8n node sync\nconst stripper = new N8nFieldStripper()\nconst promptBuilder = new PromptBuilder(getMcpPatternsPath())\n\nfunction getMcpTelemetry(): TelemetryCollector | null {\n const val = process.env['KAIROS_TELEMETRY']\n if (!val || val === 'false') return null\n return val === 'true' ? new TelemetryCollector() : new TelemetryCollector(val)\n}\n\n/**\n * Derive the patterns.json path from KAIROS_TELEMETRY so the MCP server's\n * PromptBuilder reads from the same location that PatternAnalyzer.fromEnv() writes to.\n */\nfunction getMcpPatternsPath(): string {\n const val = process.env['KAIROS_TELEMETRY']\n if (val && val !== 'false' && val !== 'true') {\n return join(val, '..', 'patterns.json')\n }\n return join(homedir(), '.kairos', 'patterns.json')\n}\n\nconst mcpTelemetry = getMcpTelemetry()\n\ninterface McpBuildSession {\n description: string\n startTime: number\n validateAttempts: number\n warnedRules: number[]\n workflowType: string | null\n}\nconst mcpSessions = new Map<string, McpBuildSession>()\nconst SESSION_TTL_MS = 60 * 60 * 1000 // 1 hour: abandon sessions not completed by deploy\n\nfunction evictStaleSessions(): void {\n const cutoff = Date.now() - SESSION_TTL_MS\n for (const [id, session] of mcpSessions) {\n if (session.startTime < cutoff) mcpSessions.delete(id)\n }\n}\n\nfunction getTelemetryReader(): TelemetryReader | null {\n try {\n return new TelemetryReader()\n } catch {\n return null\n }\n}\n\nfunction isAllowed(action: 'deploy' | 'activate' | 'delete'): boolean {\n const key = `KAIROS_MCP_ALLOW_${action.toUpperCase()}`\n return process.env[key] === 'true'\n}\n\ntype McpTextContent = { type: 'text'; text: string }\ntype McpToolResult = { content: McpTextContent[]; isError?: true }\n\nfunction mcpText(text: string): McpToolResult { return { content: [{ type: 'text', text }] } }\nfunction mcpError(text: string): McpToolResult { return { content: [{ type: 'text', text }], isError: true } }\n\n/**\n * Returns an error result if KAIROS_MCP_SECRET is set and the provided secret\n * doesn't match. Returns null if auth passes (no secret configured, or correct secret).\n */\nfunction checkMcpAuth(provided: string | undefined): McpToolResult | null {\n const expected = process.env['KAIROS_MCP_SECRET']\n if (!expected) return null\n if (provided === expected) return null\n return mcpError(JSON.stringify({ error: 'Unauthorized: missing or incorrect kairos_secret' }))\n}\n\nfunction getApiClient(): N8nApiClient {\n const baseUrl = process.env['N8N_BASE_URL']\n const apiKey = process.env['N8N_API_KEY']\n if (!baseUrl || !apiKey) {\n throw new GuardError('N8N_BASE_URL and N8N_API_KEY environment variables are required for n8n operations')\n }\n return new N8nApiClient(baseUrl, apiKey, nullLogger)\n}\n\nasync function autoSync(): Promise<SyncResult | null> {\n if (lastSync) return lastSync\n const baseUrl = process.env['N8N_BASE_URL']\n const apiKey = process.env['N8N_API_KEY']\n if (!baseUrl || !apiKey) return null\n try {\n const client = new N8nApiClient(baseUrl, apiKey, nullLogger)\n const nodeTypes = await client.getNodeTypes()\n if (nodeTypes.length === 0) return null\n lastSync = nodeSyncer.sync(nodeTypes)\n _validator = new N8nValidator(lastSync.registry)\n return lastSync\n } catch {\n return null\n }\n}\n\nconst server = new McpServer({\n name: 'kairos',\n version: pkg.version,\n})\n\n// ── Core generation tools (no API key needed) ──────────────────────────────\n\nserver.tool(\n 'kairos_prompt',\n 'Get the specialized n8n workflow generation context. Returns a system prompt with node catalog, connection rules, validation rules, plus library matches and failure patterns for the given description. Feed this to yourself as context, then generate the workflow JSON.',\n {\n description: z.string().describe('Plain-English description of the workflow to build'),\n name: z.string().optional().describe('Optional workflow name override'),\n },\n async ({ description, name }) => {\n evictStaleSessions()\n\n const baseUrl = process.env['N8N_BASE_URL']\n const apiKey = process.env['N8N_API_KEY']\n if (!baseUrl || !apiKey) {\n return mcpError(JSON.stringify({ error: 'N8N_BASE_URL and N8N_API_KEY are required. Kairos needs to sync your n8n instance\\'s node types to generate accurate workflows.' }))\n }\n\n const runId = generateUUID()\n const workflowType = inferWorkflowType(description)\n\n // Start sync in background — race against timeout so slow n8n instances don't block the prompt\n const syncPromise = autoSync()\n const syncTimeout = new Promise<null>((resolve) => setTimeout(() => resolve(null), AUTO_SYNC_TIMEOUT_MS))\n\n await library.initialize()\n const [syncResult, matches, failureRates] = await Promise.all([\n Promise.race([syncPromise, syncTimeout]),\n library.search(description),\n (async () => {\n const reader = getTelemetryReader()\n return reader ? reader.getFailureRates() : []\n })(),\n ])\n\n const request = { description, ...(name ? { name } : {}) }\n const built = promptBuilder.build(request, matches, failureRates, syncResult?.catalogText)\n\n if (mcpTelemetry) {\n mcpSessions.set(runId, {\n description,\n startTime: Date.now(),\n validateAttempts: 0,\n warnedRules: promptBuilder.getWarnedRules(),\n workflowType,\n })\n await mcpTelemetry.emit('build_start', { description, model: 'mcp-decomposed', dryRun: false }, runId)\n }\n\n const systemText = built.system.map(block => block.text).join('\\n\\n---\\n\\n')\n\n return mcpText(JSON.stringify({\n kairos_run_id: runId,\n mode: built.mode,\n matchCount: matches.length,\n topMatchScore: matches[0]?.score ?? null,\n nodeCatalog: syncResult ? 'synced' : 'static',\n nodeCount: syncResult?.nodeCount ?? null,\n ...(syncResult ? {} : { syncWarning: 'Could not sync node types from your n8n instance. Using static fallback catalog — generated workflows may not match your exact n8n setup.' }),\n systemPrompt: systemText,\n userMessage: built.userMessage,\n outputFormat: {\n description: 'Generate a JSON object with this exact structure. The workflow field contains the n8n workflow. credentialsNeeded lists services requiring credentials.',\n schema: {\n workflow: {\n name: 'string — descriptive workflow name',\n nodes: 'array — n8n node objects with id (UUID v4), type, typeVersion, name, position, parameters',\n connections: 'object — keyed by source node NAME, maps to target nodes',\n settings: 'object — include executionOrder: \"v1\"',\n },\n credentialsNeeded: [{\n service: 'string — e.g. \"Slack\"',\n credentialType: 'string — e.g. \"slackOAuth2Api\"',\n description: 'string — what the user needs to set up',\n }],\n },\n },\n }, null, 2))\n },\n)\n\nserver.tool(\n 'kairos_validate',\n 'Validate n8n workflow JSON against 34 structural rules. Returns pass/fail with specific issues. If validation fails, fix the issues and call this again. Errors block deployment; warnings are advisory.',\n {\n workflow: z.string().describe('The workflow JSON string to validate'),\n kairos_run_id: z.string().optional().describe('Run ID from kairos_prompt — enables telemetry correlation'),\n },\n async ({ workflow: workflowStr, kairos_run_id }) => {\n let parsed: N8nWorkflow\n try {\n parsed = JSON.parse(workflowStr) as N8nWorkflow\n } catch (e) {\n return mcpText(JSON.stringify({ valid: false, error: `Invalid JSON: ${e instanceof Error ? e.message : String(e)}` }, null, 2))\n }\n\n const result = getValidator().validate(parsed)\n const errors = result.issues.filter(i => i.severity === 'error')\n const warnings = result.issues.filter(i => i.severity === 'warn')\n\n if (mcpTelemetry && kairos_run_id) {\n const session = mcpSessions.get(kairos_run_id)\n if (session) {\n session.validateAttempts++\n await mcpTelemetry.emit('generation_attempt', {\n description: session.description,\n attempt: session.validateAttempts,\n temperature: 0,\n durationMs: 0,\n tokensInput: 0,\n tokensOutput: 0,\n validationPassed: result.valid,\n issueCount: result.issues.length,\n issues: result.issues.map(i => ({ rule: i.rule, severity: i.severity, message: i.message, nodeId: i.nodeId ?? null })),\n workflowType: session.workflowType,\n }, kairos_run_id)\n }\n }\n\n return mcpText(JSON.stringify({\n valid: result.valid,\n errorCount: errors.length,\n warningCount: warnings.length,\n errors: errors.map(i => ({ rule: i.rule, message: i.message, nodeId: i.nodeId ?? null })),\n warnings: warnings.map(i => ({ rule: i.rule, message: i.message, nodeId: i.nodeId ?? null })),\n deployable: errors.length === 0,\n }, null, 2))\n },\n)\n\nserver.tool(\n 'kairos_deploy',\n 'Deploy a validated workflow to n8n. Pass the workflow JSON that passed kairos_validate. Strips server-assigned fields automatically. Requires N8N_BASE_URL and N8N_API_KEY.',\n {\n workflow: z.string().describe('The validated workflow JSON string to deploy'),\n activate: z.boolean().default(false).describe('Activate the workflow immediately after deployment'),\n kairos_run_id: z.string().optional().describe('Run ID from kairos_prompt — enables telemetry correlation'),\n kairos_secret: z.string().optional().describe('Required when KAIROS_MCP_SECRET env var is set'),\n },\n async ({ workflow: workflowStr, activate, kairos_run_id, kairos_secret }) => {\n const authError = checkMcpAuth(kairos_secret)\n if (authError) return authError\n\n if (!isAllowed('deploy')) {\n return mcpError(JSON.stringify({ error: 'Deploy is disabled. Set KAIROS_MCP_ALLOW_DEPLOY=true to enable.' }))\n }\n\n let parsed: N8nWorkflow\n try {\n parsed = JSON.parse(workflowStr) as N8nWorkflow\n } catch (e) {\n return mcpError(JSON.stringify({ error: `Invalid JSON: ${e instanceof Error ? e.message : String(e)}` }))\n }\n\n const validation = getValidator().validate(parsed)\n const errors = validation.issues.filter(i => i.severity === 'error')\n if (errors.length > 0) {\n return mcpError(JSON.stringify({\n error: 'Workflow has validation errors — fix them before deploying',\n errors: errors.map(i => ({ rule: i.rule, message: i.message })),\n }, null, 2))\n }\n\n const client = getApiClient()\n const stripped = stripper.stripForCreate(parsed)\n const response = await client.createWorkflow(stripped)\n\n if (activate) {\n if (!isAllowed('activate')) {\n return mcpText(JSON.stringify({\n workflowId: response.id,\n name: response.name,\n activated: false,\n warning: 'Workflow deployed but activation is disabled. Set KAIROS_MCP_ALLOW_ACTIVATE=true to enable.',\n url: `${process.env['N8N_BASE_URL']}/workflow/${response.id}`,\n }, null, 2))\n }\n await client.activateWorkflow(response.id)\n }\n\n const session = kairos_run_id ? mcpSessions.get(kairos_run_id) : undefined\n\n // Warn when kairos_run_id is provided but no matching session exists — telemetry will be skipped\n const missingSessionWarning = (kairos_run_id && !session)\n ? `\\n\\nNote: kairos_run_id \"${kairos_run_id}\" was provided but no active session was found. This usually means kairos_deploy was called without a prior kairos_prompt call, or the session expired. Telemetry and pattern learning for this build were skipped.`\n : ''\n\n // Save to library (n8nWorkflowId enables dedup on future redeployment)\n await library.initialize()\n await library.save(parsed, {\n description: session?.description ?? parsed.name,\n generationMode: 'scratch',\n generationAttempts: session?.validateAttempts ?? 1,\n n8nWorkflowId: response.id,\n })\n\n if (mcpTelemetry && kairos_run_id && session) {\n await mcpTelemetry.emit('build_complete', {\n description: session.description,\n success: true,\n totalAttempts: session.validateAttempts,\n totalDurationMs: Date.now() - session.startTime,\n totalTokensInput: 0,\n totalTokensOutput: 0,\n workflowName: response.name,\n workflowId: response.id,\n dryRun: false,\n credentialsNeeded: 0,\n warnedRules: session.warnedRules,\n workflowType: session.workflowType,\n }, kairos_run_id)\n mcpSessions.delete(kairos_run_id)\n PatternAnalyzer.fromEnv().analyzeAndSave().catch(() => {})\n }\n\n return mcpText(JSON.stringify({\n workflowId: response.id,\n name: response.name,\n activated: activate,\n url: `${process.env['N8N_BASE_URL']}/workflow/${response.id}`,\n }, null, 2) + missingSessionWarning)\n },\n)\n\nserver.tool(\n 'kairos_replace',\n 'Replace an existing n8n workflow with a new version. Validates before updating. Use kairos_prompt → kairos_validate → kairos_replace for iteration on existing workflows.',\n {\n workflow_id: z.string().describe('The n8n workflow ID to replace'),\n workflow: z.string().describe('The validated workflow JSON string'),\n kairos_run_id: z.string().optional().describe('Run ID from kairos_prompt — enables telemetry correlation'),\n kairos_secret: z.string().optional().describe('Required when KAIROS_MCP_SECRET env var is set'),\n },\n async ({ workflow_id, workflow: workflowStr, kairos_run_id, kairos_secret }) => {\n const authError = checkMcpAuth(kairos_secret)\n if (authError) return authError\n\n let parsed: N8nWorkflow\n try {\n parsed = JSON.parse(workflowStr) as N8nWorkflow\n } catch (e) {\n return mcpError(JSON.stringify({ error: `Invalid JSON: ${e instanceof Error ? e.message : String(e)}` }))\n }\n\n const validation = getValidator().validate(parsed)\n const errors = validation.issues.filter(i => i.severity === 'error')\n if (errors.length > 0) {\n return mcpError(JSON.stringify({\n error: 'Workflow has validation errors — fix them before replacing',\n errors: errors.map(i => ({ rule: i.rule, message: i.message })),\n }, null, 2))\n }\n\n const client = getApiClient()\n const stripped = stripper.stripForUpdate(parsed)\n const response = await client.updateWorkflow(workflow_id, stripped)\n\n const session = kairos_run_id ? mcpSessions.get(kairos_run_id) : undefined\n const missingSessionWarning = (kairos_run_id && !session)\n ? `\\n\\nNote: kairos_run_id \"${kairos_run_id}\" was provided but no active session was found.`\n : ''\n\n // Save to library — D4 dedup updates the existing entry rather than creating a duplicate\n await library.initialize()\n await library.save(parsed, {\n description: session?.description ?? parsed.name,\n generationMode: 'scratch',\n generationAttempts: session?.validateAttempts ?? 1,\n n8nWorkflowId: workflow_id,\n })\n\n if (mcpTelemetry && kairos_run_id && session) {\n await mcpTelemetry.emit('build_complete', {\n description: session.description,\n success: true,\n totalAttempts: session.validateAttempts,\n totalDurationMs: Date.now() - session.startTime,\n totalTokensInput: 0,\n totalTokensOutput: 0,\n workflowName: response.name,\n workflowId: response.id,\n dryRun: false,\n credentialsNeeded: 0,\n warnedRules: session.warnedRules,\n workflowType: session.workflowType,\n }, kairos_run_id)\n mcpSessions.delete(kairos_run_id)\n PatternAnalyzer.fromEnv().analyzeAndSave().catch(() => {})\n }\n\n return mcpText(JSON.stringify({\n workflowId: response.id,\n name: response.name,\n url: `${process.env['N8N_BASE_URL']}/workflow/${response.id}`,\n }, null, 2) + missingSessionWarning)\n },\n)\n\nserver.tool(\n 'kairos_search',\n 'Search the local workflow library for similar past builds. Returns matching workflows with scores, useful for finding examples and reusing patterns.',\n {\n query: z.string().describe('Search query — a workflow description or keywords'),\n limit: z.number().default(5).describe('Maximum number of results'),\n },\n async ({ query, limit }) => {\n await library.initialize()\n const matches = await library.search(query)\n\n return mcpText(JSON.stringify(\n matches.slice(0, limit).map(m => ({\n id: m.workflow.id,\n score: Number(m.score.toFixed(3)),\n mode: m.mode,\n description: m.workflow.description,\n nodeCount: m.workflow.workflow.nodes.length,\n nodes: m.workflow.workflow.nodes.map(n => n.name),\n n8nWorkflowId: m.workflow.n8nWorkflowId ?? null,\n failurePatterns: m.workflow.failurePatterns ?? [],\n })),\n null,\n 2,\n ))\n },\n)\n\nserver.tool(\n 'kairos_sync',\n 'Sync the node catalog from your live n8n instance. Fetches all installed node types and versions so Kairos knows exactly what your n8n supports. Automatically called by kairos_prompt when n8n credentials are set, but you can call this manually to force a refresh.',\n {},\n async () => {\n const baseUrl = process.env['N8N_BASE_URL']\n const apiKey = process.env['N8N_API_KEY']\n if (!baseUrl || !apiKey) {\n return mcpError(JSON.stringify({ error: 'N8N_BASE_URL and N8N_API_KEY are required for sync.' }))\n }\n\n lastSync = null\n const result = await autoSync()\n if (!result) {\n return mcpError(JSON.stringify({ error: 'Failed to fetch node types from n8n. Check your credentials and that your instance is running.' }))\n }\n\n return mcpText(JSON.stringify({\n synced: true,\n nodeCount: result.nodeCount,\n newNodes: result.newNodes,\n message: `Synced ${result.nodeCount} node types from your n8n instance (${result.newNodes} not in default catalog).`,\n }, null, 2))\n },\n)\n\nserver.tool(\n 'kairos_patterns',\n 'Analyze telemetry data and return failure patterns, build stats, and credential breakdowns. Useful for understanding what goes wrong most often and how to prevent it.',\n {\n days: z.number().default(30).describe('Number of days of telemetry to analyze'),\n limit: z.number().optional().describe('Maximum number of failure patterns to return'),\n },\n async ({ days, limit }) => {\n const analyzer = PatternAnalyzer.fromEnv()\n const analysis = await analyzer.analyzeAndSave(days)\n\n if (limit !== undefined && limit > 0) {\n analysis.topFailureRules = analysis.topFailureRules.slice(0, limit)\n }\n\n return mcpText(JSON.stringify(analysis, null, 2))\n },\n)\n\nserver.tool(\n 'kairos_library',\n 'Browse the local Kairos workflow library. Returns saved workflow metadata. Use the optional query to search, or omit it to list all entries.',\n {\n query: z.string().optional().describe('Optional search query — omit to list all entries'),\n limit: z.number().default(20).describe('Maximum entries to return'),\n },\n async ({ query, limit }) => {\n await library.initialize()\n\n if (query) {\n const matches = await library.search(query)\n return mcpText(JSON.stringify(\n matches.slice(0, limit).map(m => ({\n id: m.workflow.id,\n description: m.workflow.description,\n score: Number(m.score.toFixed(3)),\n mode: m.mode,\n nodeCount: m.workflow.workflow.nodes.length,\n nodes: m.workflow.workflow.nodes.map(n => n.name),\n deployCount: m.workflow.deployCount,\n n8nWorkflowId: m.workflow.n8nWorkflowId ?? null,\n createdAt: m.workflow.createdAt,\n })),\n null, 2,\n ))\n }\n\n const all = await library.list()\n return mcpText(JSON.stringify(\n all.slice(0, limit).map(w => ({\n id: w.id,\n description: w.description,\n nodeCount: w.workflow.nodes.length,\n nodes: w.workflow.nodes.map(n => n.name),\n deployCount: w.deployCount,\n n8nWorkflowId: w.n8nWorkflowId ?? null,\n timesRetrieved: w.timesRetrieved ?? 0,\n createdAt: w.createdAt,\n })),\n null, 2,\n ))\n },\n)\n\nserver.tool(\n 'kairos_outcome',\n 'Record the outcome of a workflow build against a library entry. Trains the pattern learning system to know what works and what fails over time.',\n {\n library_id: z.string().describe('The Kairos library entry ID (returned by kairos_deploy, kairos_replace, or kairos_library)'),\n attempts: z.number().describe('Number of generation+validation attempts before success'),\n first_try_pass: z.boolean().describe('Whether the first attempt passed validation'),\n failed_rules: z.array(z.number()).describe('Validation rule IDs that failed during generation'),\n mode: z.enum(['direct', 'reference']).describe('How the library entry was used during generation'),\n },\n async ({ library_id, attempts, first_try_pass, failed_rules, mode }) => {\n await library.initialize()\n await library.recordOutcome(library_id, {\n attempts,\n firstTryPass: first_try_pass,\n failedRules: failed_rules,\n mode,\n })\n return mcpText(JSON.stringify({ recorded: true, libraryId: library_id }))\n },\n)\n\n// ── n8n management tools (need N8N_BASE_URL + N8N_API_KEY) ─────────────────\n\nserver.tool(\n 'kairos_list',\n 'List all workflows deployed on the connected n8n instance.',\n {},\n async () => {\n const client = getApiClient()\n const workflows = await client.listWorkflows()\n\n return mcpText(JSON.stringify(workflows, null, 2))\n },\n)\n\nserver.tool(\n 'kairos_get',\n 'Get the full JSON definition of a specific workflow by ID.',\n {\n workflow_id: z.string().describe('The n8n workflow ID'),\n },\n async ({ workflow_id }) => {\n const client = getApiClient()\n const workflow = await client.getWorkflow(workflow_id)\n\n return mcpText(JSON.stringify(workflow, null, 2))\n },\n)\n\nserver.tool(\n 'kairos_activate',\n 'Activate a deployed workflow so it starts running on triggers.',\n {\n workflow_id: z.string().describe('The n8n workflow ID to activate'),\n },\n async ({ workflow_id }) => {\n if (!isAllowed('activate')) {\n return mcpError(JSON.stringify({ error: 'Activate is disabled. Set KAIROS_MCP_ALLOW_ACTIVATE=true to enable.' }))\n }\n\n const client = getApiClient()\n await client.activateWorkflow(workflow_id)\n\n return mcpText(`Activated workflow ${workflow_id}`)\n },\n)\n\nserver.tool(\n 'kairos_deactivate',\n 'Deactivate a running workflow.',\n {\n workflow_id: z.string().describe('The n8n workflow ID to deactivate'),\n },\n async ({ workflow_id }) => {\n const client = getApiClient()\n await client.deactivateWorkflow(workflow_id)\n\n return mcpText(`Deactivated workflow ${workflow_id}`)\n },\n)\n\nserver.tool(\n 'kairos_delete',\n 'Delete a workflow from n8n. This is irreversible.',\n {\n workflow_id: z.string().describe('The n8n workflow ID to delete'),\n kairos_secret: z.string().optional().describe('Required when KAIROS_MCP_SECRET env var is set'),\n },\n async ({ workflow_id, kairos_secret }) => {\n const authError = checkMcpAuth(kairos_secret)\n if (authError) return authError\n\n if (!isAllowed('delete')) {\n return mcpError(JSON.stringify({ error: 'Delete is disabled. Set KAIROS_MCP_ALLOW_DELETE=true to enable.' }))\n }\n\n const client = getApiClient()\n await client.deleteWorkflow(workflow_id)\n\n return mcpText(`Deleted workflow ${workflow_id}`)\n },\n)\n\nserver.tool(\n 'kairos_executions',\n 'List recent executions for a workflow, showing status and timing.',\n {\n workflow_id: z.string().optional().describe('Filter to a specific workflow ID (omit for all)'),\n limit: z.number().default(20).describe('Maximum number of executions to return'),\n },\n async ({ workflow_id, limit }) => {\n const client = getApiClient()\n const executions = await client.getExecutions(workflow_id, { limit })\n\n return mcpText(JSON.stringify(executions, null, 2))\n },\n)\n\nasync function main() {\n if (!process.env['ANTHROPIC_API_KEY']) {\n process.stderr.write(\n '[kairos-mcp] WARNING: ANTHROPIC_API_KEY is not set — kairos_prompt will fail. Set it before using workflow generation tools.\\n',\n )\n }\n const transport = new StdioServerTransport()\n await server.connect(transport)\n}\n\nmain().catch((err: unknown) => {\n console.error('Kairos MCP server failed to start:', err)\n process.exit(1)\n})\n","import { readFile, writeFile, rename, mkdir, stat, readdir, unlink, open } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\nimport type { N8nWorkflow } from '../types/workflow.js'\nimport type {\n IWorkflowLibrary,\n WorkflowMatch,\n StoredWorkflow,\n WorkflowMetadataInput,\n LibraryFilters,\n SearchOptions,\n OutcomeData,\n} from './types.js'\nimport { generateUUID } from '../utils/uuid.js'\nimport { scoreToMode } from '../utils/thresholds.js'\nimport { hybridScore } from './scorer.js'\nimport { clusterWorkflows, rerank } from './cluster.js'\n\nexport function tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2)\n}\n\nexport function buildSearchCorpus(w: StoredWorkflow): string {\n const nodeTokens = w.workflow.nodes.map((n) => {\n const bare = n.type.split('.').pop() ?? ''\n const spaced = bare.replace(/([A-Z])/g, ' $1').trim().toLowerCase()\n return `${bare} ${spaced}`\n })\n return `${w.description} ${w.workflow.name} ${w.tags.join(' ')} ${nodeTokens.join(' ')}`\n}\n\nconst _rawSize = parseInt(process.env['KAIROS_LIBRARY_SIZE'] ?? '500', 10)\nconst MAX_LIBRARY_SIZE = Number.isFinite(_rawSize) && _rawSize >= 10 ? _rawSize : 500\n\nfunction evictionScore(m: StoredWorkflowMeta): number {\n return (m.deployCount ?? 0) * 3 + (m.timesRetrieved ?? 0) + (m.outcomeStats?.totalUses ?? 0)\n}\n\n/**\n * Internal per-file format: everything from StoredWorkflow except the workflow field,\n * plus two cache fields used to rebuild search corpus without loading workflow files.\n */\ntype StoredWorkflowMeta = Omit<StoredWorkflow, 'workflow'> & {\n workflowName: string // n8n workflow name (copied at save time for search)\n cachedNodeTypes: string[] // full node type strings (e.g. \"n8n-nodes-base.slack\")\n}\n\nfunction isValidMeta(item: unknown): item is StoredWorkflowMeta {\n return (\n typeof item === 'object' &&\n item !== null &&\n typeof (item as Record<string, unknown>).id === 'string' &&\n typeof (item as Record<string, unknown>).description === 'string' &&\n typeof (item as Record<string, unknown>).workflowName === 'string' &&\n Array.isArray((item as Record<string, unknown>).cachedNodeTypes)\n )\n}\n\nfunction isValidOldEntry(item: unknown): item is StoredWorkflow {\n return (\n typeof item === 'object' &&\n item !== null &&\n typeof (item as Record<string, unknown>).id === 'string' &&\n typeof (item as Record<string, unknown>).description === 'string' &&\n typeof (item as Record<string, unknown>).workflow === 'object' &&\n (item as Record<string, unknown>).workflow !== null &&\n Array.isArray(\n ((item as Record<string, unknown>).workflow as Record<string, unknown>).nodes,\n )\n )\n}\n\nexport class FileLibrary implements IWorkflowLibrary {\n private readonly dir: string\n private meta: StoredWorkflowMeta[] = []\n private initPromise: Promise<void> | null = null\n private writeQueue: Promise<void> = Promise.resolve()\n\n constructor(dir?: string) {\n this.dir = dir ?? join(homedir(), '.kairos', 'library')\n }\n\n private get workflowsDir(): string {\n return join(this.dir, 'workflows')\n }\n\n private workflowFilePath(id: string): string {\n return join(this.workflowsDir, `${id}.json`)\n }\n\n async initialize(): Promise<void> {\n if (!this.initPromise) {\n this.initPromise = this.doInitialize()\n }\n return this.initPromise\n }\n\n private async doInitialize(): Promise<void> {\n await mkdir(this.dir, { recursive: true })\n const indexPath = join(this.dir, 'index.json')\n\n // New format has a 'workflows/' subdirectory; old format does not\n let workflowsDirExists = false\n try {\n await stat(this.workflowsDir)\n workflowsDirExists = true\n } catch {\n // Directory absent — old format or fresh start\n }\n\n if (workflowsDirExists) {\n // New per-file format: index.json holds lightweight meta only\n try {\n const raw = await readFile(indexPath, 'utf-8')\n const parsed: unknown = JSON.parse(raw)\n if (Array.isArray(parsed)) {\n this.meta = parsed.filter(isValidMeta)\n }\n } catch {\n this.meta = []\n }\n await this.scanForOrphansAndCleanup()\n } else {\n // Attempt to read old monolithic format\n try {\n const raw = await readFile(indexPath, 'utf-8')\n const parsed: unknown = JSON.parse(raw)\n if (Array.isArray(parsed) && parsed.length > 0 && isValidOldEntry(parsed[0])) {\n await this.migrateFromMonolithic(parsed.filter(isValidOldEntry))\n return\n }\n } catch {\n // No index.json — fresh start\n }\n this.meta = []\n await mkdir(this.workflowsDir, { recursive: true })\n }\n }\n\n private async scanForOrphansAndCleanup(): Promise<void> {\n let entries: string[]\n try {\n entries = await readdir(this.workflowsDir)\n } catch {\n return\n }\n\n const indexedIds = new Set(this.meta.map((m) => m.id))\n const orphanIds: string[] = []\n\n for (const filename of entries) {\n if (filename.endsWith('.tmp')) {\n // Leftover from an interrupted atomic rename — safe to delete\n await unlink(join(this.workflowsDir, filename)).catch(() => {})\n continue\n }\n if (!filename.endsWith('.json')) continue\n const id = filename.slice(0, -5)\n if (!indexedIds.has(id)) {\n orphanIds.push(id)\n }\n }\n\n if (orphanIds.length > 0) {\n // Log but do not delete — caller can decide what to do\n console.warn(`[FileLibrary] Found ${orphanIds.length} orphaned workflow file(s) not in index: ${orphanIds.join(', ')}`)\n }\n }\n\n /**\n * One-time transparent migration from v0.4.x monolithic index.json.\n * Splits each stored workflow into a per-file workflow JSON and a lightweight\n * meta entry. Rewrites index.json in the new format.\n */\n private async migrateFromMonolithic(oldEntries: StoredWorkflow[]): Promise<void> {\n await mkdir(this.workflowsDir, { recursive: true })\n\n const newMeta: StoredWorkflowMeta[] = []\n for (const entry of oldEntries) {\n const wfPath = this.workflowFilePath(entry.id)\n const tmpPath = `${wfPath}.tmp`\n await writeFile(tmpPath, JSON.stringify(entry.workflow), 'utf-8')\n await rename(tmpPath, wfPath)\n\n const { workflow, ...metaFields } = entry\n newMeta.push({\n ...metaFields,\n workflowName: workflow.name,\n cachedNodeTypes: workflow.nodes.map((n) => n.type),\n })\n }\n\n this.meta = newMeta\n // Write new lightweight index.json (no workflow fields)\n await this.persistNow()\n }\n\n private async loadWorkflowFile(id: string): Promise<N8nWorkflow | null> {\n try {\n const raw = await readFile(this.workflowFilePath(id), 'utf-8')\n return JSON.parse(raw) as N8nWorkflow\n } catch {\n return null\n }\n }\n\n private async writeWorkflowFile(id: string, workflow: N8nWorkflow): Promise<void> {\n const wfPath = this.workflowFilePath(id)\n const tmpPath = `${wfPath}.tmp`\n await writeFile(tmpPath, JSON.stringify(workflow), 'utf-8')\n await rename(tmpPath, wfPath)\n }\n\n /**\n * Build a lightweight StoredWorkflow shell from a meta entry for use in\n * scoring / clustering. Only node.type is populated in each node — no other\n * node fields are used by hybridScore or clusterWorkflows.\n */\n private makeSearchShell(m: StoredWorkflowMeta): StoredWorkflow {\n return {\n ...m,\n workflow: {\n name: m.workflowName,\n nodes: m.cachedNodeTypes.map((type) => ({\n id: '',\n name: '',\n type,\n typeVersion: 1,\n position: [0, 0] as [number, number],\n parameters: {},\n })),\n connections: {},\n },\n } as StoredWorkflow\n }\n\n async search(description: string, options?: SearchOptions): Promise<WorkflowMatch[]> {\n const filteredMeta = this.meta.filter((m) => m.trustLevel !== 'blocked')\n if (filteredMeta.length === 0) return []\n\n const limit = options?.limit ?? 3\n const queryTokens = tokenize(description)\n if (queryTokens.length === 0) return []\n\n // Build lightweight shells — no file I/O, all data comes from cached meta\n const shells = filteredMeta.map((m) => this.makeSearchShell(m))\n\n const docTokenArrays = shells.map((w) => tokenize(buildSearchCorpus(w)))\n const docTokenSets = docTokenArrays.map((tokens) => new Set(tokens))\n\n const docCount = shells.length\n const idf = new Map<string, number>()\n const idfCeiling = Math.log(docCount + 1) + 1 // max IDF when term appears in 0 docs\n const allTokens = new Set(queryTokens)\n for (const token of allTokens) {\n const docsWithToken = docTokenSets.filter((d) => d.has(token)).length\n const rawIdf = Math.log((docCount + 1) / (docsWithToken + 1)) + 1\n idf.set(token, rawIdf / idfCeiling) // normalize to [0, 1] regardless of corpus size\n }\n\n const scored = hybridScore(queryTokens, description, shells, docTokenArrays, idf)\n .filter((m) => m.score > 0)\n .sort((a, b) => b.score - a.score)\n\n const clusters = clusterWorkflows(shells)\n const reranked = rerank(scored, clusters).slice(0, limit)\n\n if (reranked.length === 0) return []\n\n // Update timesRetrieved in meta before persisting\n for (const r of reranked) {\n const m = this.meta.find((m) => m.id === r.workflow.id)\n if (m) m.timesRetrieved = (m.timesRetrieved ?? 0) + 1\n }\n this.persist()\n\n // Lazy-load full workflow files for the top matches only\n const results = await Promise.all(\n reranked.map(async (r) => {\n const m = this.meta.find((meta) => meta.id === r.workflow.id)!\n const workflow = await this.loadWorkflowFile(r.workflow.id)\n if (!workflow) return null\n return {\n workflow: { ...m, workflow } as StoredWorkflow,\n score: r.score,\n mode: scoreToMode(r.score),\n } as WorkflowMatch\n }),\n )\n\n return results.filter((r): r is WorkflowMatch => r !== null)\n }\n\n async save(workflow: N8nWorkflow, metadata: WorkflowMetadataInput): Promise<string> {\n // Prefer matching by n8nWorkflowId when redeploying — prevents duplicate library entries\n const existingByN8nId = metadata.n8nWorkflowId\n ? this.meta.find((m) => m.n8nWorkflowId === metadata.n8nWorkflowId)\n : undefined\n\n // Fall back to description dedup for newly saved workflows\n const normalizedDesc = metadata.description.trim().toLowerCase()\n const existing = existingByN8nId\n ?? this.meta.find((m) => m.description.trim().toLowerCase() === normalizedDesc)\n\n if (existing) {\n existing.description = metadata.description // update description on redeploy\n existing.workflowName = workflow.name\n existing.cachedNodeTypes = workflow.nodes.map((n) => n.type)\n if (metadata.n8nWorkflowId) existing.n8nWorkflowId = metadata.n8nWorkflowId\n if (metadata.generationAttempts != null) {\n existing.generationAttempts = metadata.generationAttempts\n }\n if (metadata.failurePatterns?.length) {\n existing.failurePatterns = this.deduplicateFailurePatterns(metadata.failurePatterns)!\n }\n if (metadata.tags?.length) {\n existing.tags = [...new Set([...existing.tags, ...metadata.tags])]\n }\n await this.writeWorkflowFile(existing.id, workflow)\n await this.persist()\n return existing.id\n }\n\n const id = generateUUID()\n\n // Write workflow file first (data before index entry — crash-safe WAL pattern)\n await this.writeWorkflowFile(id, workflow)\n\n const failurePatterns = this.deduplicateFailurePatterns(metadata.failurePatterns)\n const meta: StoredWorkflowMeta = {\n id,\n description: metadata.description,\n tags: metadata.tags ?? [],\n platform: metadata.platform ?? 'n8n',\n deployCount: 0,\n createdAt: new Date().toISOString(),\n workflowName: workflow.name,\n cachedNodeTypes: workflow.nodes.map((n) => n.type),\n ...(failurePatterns?.length ? { failurePatterns } : {}),\n ...(metadata.sourceWorkflowIds?.length ? { sourceWorkflowIds: metadata.sourceWorkflowIds } : {}),\n ...(metadata.generationMode ? { generationMode: metadata.generationMode } : {}),\n ...(metadata.topMatchScore != null ? { topMatchScore: metadata.topMatchScore } : {}),\n ...(metadata.generationAttempts != null ? { generationAttempts: metadata.generationAttempts } : {}),\n ...(metadata.credentialsNeeded?.length ? { credentialsNeeded: metadata.credentialsNeeded } : {}),\n ...(metadata.sourceKind ? { sourceKind: metadata.sourceKind } : {}),\n ...(metadata.sourceId ? { sourceId: metadata.sourceId } : {}),\n ...(metadata.sourceUrl ? { sourceUrl: metadata.sourceUrl } : {}),\n ...(metadata.trustLevel ? { trustLevel: metadata.trustLevel } : {}),\n ...(metadata.n8nWorkflowId ? { n8nWorkflowId: metadata.n8nWorkflowId } : {}),\n }\n\n this.meta.push(meta)\n if (this.meta.length > MAX_LIBRARY_SIZE) {\n // Evict by composite usage score ascending; always keep the newly-added entry\n this.meta.sort((a, b) => {\n if (a.id === id) return -1\n if (b.id === id) return 1\n return evictionScore(b) - evictionScore(a)\n })\n this.meta = this.meta.slice(0, MAX_LIBRARY_SIZE)\n }\n\n await this.persist()\n return id\n }\n\n async recordDeployment(id: string, n8nWorkflowId?: string): Promise<void> {\n const m = this.meta.find((m) => m.id === id)\n if (m) {\n m.deployCount++\n m.lastDeployedAt = new Date().toISOString()\n if (n8nWorkflowId) m.n8nWorkflowId = n8nWorkflowId\n await this.persist()\n }\n }\n\n async recordOutcome(id: string, outcome: OutcomeData): Promise<void> {\n const m = this.meta.find((m) => m.id === id)\n if (!m) return\n\n if (outcome.mode === 'direct') {\n m.timesUsedAsDirect = (m.timesUsedAsDirect ?? 0) + 1\n } else {\n m.timesUsedAsReference = (m.timesUsedAsReference ?? 0) + 1\n }\n\n const stats = m.outcomeStats ?? { totalUses: 0, totalAttempts: 0, firstTryPasses: 0, failedRules: {} }\n stats.totalUses++\n stats.totalAttempts += outcome.attempts\n if (outcome.firstTryPass) stats.firstTryPasses++\n for (const rule of outcome.failedRules) {\n const key = String(rule)\n stats.failedRules[key] = (stats.failedRules[key] ?? 0) + 1\n }\n m.outcomeStats = stats\n\n await this.persist()\n }\n\n async drain(): Promise<void> {\n await this.writeQueue\n }\n\n async get(id: string): Promise<StoredWorkflow | null> {\n const m = this.meta.find((m) => m.id === id)\n if (!m) return null\n const workflow = await this.loadWorkflowFile(id)\n if (!workflow) return null\n return { ...m, workflow } as StoredWorkflow\n }\n\n async list(filters?: LibraryFilters): Promise<StoredWorkflow[]> {\n let filtered = this.meta\n if (filters?.platform) {\n filtered = filtered.filter((m) => m.platform === filters.platform)\n }\n if (filters?.tags && filters.tags.length > 0) {\n filtered = filtered.filter((m) => filters.tags!.some((t) => m.tags.includes(t)))\n }\n\n const results = await Promise.all(\n filtered.map(async (m) => {\n const workflow = await this.loadWorkflowFile(m.id)\n if (!workflow) return null\n return { ...m, workflow } as StoredWorkflow\n }),\n )\n\n return results.filter((r): r is StoredWorkflow => r !== null)\n }\n\n private deduplicateFailurePatterns(\n patterns?: Array<{ rule: number; message: string }>,\n ): StoredWorkflow['failurePatterns'] | undefined {\n if (!patterns?.length) return undefined\n const map = new Map<number, { rule: number; message: string; occurrences: number }>()\n for (const fp of patterns) {\n const existing = map.get(fp.rule)\n if (existing) {\n existing.occurrences++\n } else {\n map.set(fp.rule, { rule: fp.rule, message: fp.message, occurrences: 1 })\n }\n }\n return [...map.values()]\n }\n\n // ── Cross-process file locking ────────────────────────────────────────────\n // Uses O_EXCL (exclusive create) which is atomic on POSIX and Windows NTFS.\n // Protects the read-modify-write cycle in persist() from concurrent writers\n // in separate OS processes (e.g. MCP server + CLI running simultaneously).\n\n private get lockPath(): string {\n return join(this.dir, '.index.lock')\n }\n\n private async acquireLock(timeoutMs = 3_000): Promise<() => Promise<void>> {\n const deadline = Date.now() + timeoutMs\n let delayMs = 10\n\n while (true) {\n try {\n // O_EXCL: fail if the file already exists — atomic on POSIX + NTFS\n const fh = await open(this.lockPath, 'wx')\n await fh.writeFile(String(process.pid))\n await fh.close()\n return async () => { await unlink(this.lockPath).catch(() => {}) }\n } catch {\n // Lock file exists — check if it's stale\n try {\n const content = await readFile(this.lockPath, 'utf-8')\n const lockPid = parseInt(content.trim(), 10)\n const fileStat = await stat(this.lockPath)\n const ageMs = Date.now() - fileStat.mtimeMs\n\n if (ageMs > 10_000) {\n // Lock is over 10 seconds old — definitely stale\n await unlink(this.lockPath).catch(() => {})\n continue\n }\n\n if (!isNaN(lockPid)) {\n try {\n process.kill(lockPid, 0) // throws ESRCH if PID is dead\n } catch {\n await unlink(this.lockPath).catch(() => {})\n continue\n }\n }\n } catch {\n // Lock file was removed between our read and check — retry immediately\n continue\n }\n\n if (Date.now() > deadline) {\n // Can't acquire within timeout — proceed with a warning (degraded mode)\n return async () => {}\n }\n await new Promise<void>((r) => setTimeout(r, delayMs))\n delayMs = Math.min(delayMs * 1.5, 200)\n }\n }\n }\n\n /**\n * Direct write used only during migration (before writeQueue is needed).\n */\n private async persistNow(): Promise<void> {\n const releaseLock = await this.acquireLock()\n try {\n const indexPath = join(this.dir, 'index.json')\n const tmpPath = `${indexPath}.tmp`\n await writeFile(tmpPath, JSON.stringify(this.meta, null, 2), 'utf-8')\n await rename(tmpPath, indexPath)\n } finally {\n await releaseLock()\n }\n }\n\n private persist(): Promise<void> {\n this.writeQueue = this.writeQueue.then(async () => {\n const releaseLock = await this.acquireLock()\n try {\n const indexPath = join(this.dir, 'index.json')\n\n // Re-read disk state to preserve concurrent additions from other processes\n let onDisk: StoredWorkflowMeta[] = []\n try {\n const raw = await readFile(indexPath, 'utf-8')\n const parsed: unknown = JSON.parse(raw)\n if (Array.isArray(parsed)) {\n onDisk = parsed.filter(isValidMeta)\n }\n } catch { /* index.json doesn't exist yet */ }\n\n // Our in-memory state wins for IDs we manage; add any entries added by other processes\n const ourIds = new Set(this.meta.map((m) => m.id))\n const external = onDisk.filter((m) => !ourIds.has(m.id))\n let merged = [...this.meta, ...external]\n if (merged.length > MAX_LIBRARY_SIZE) {\n merged.sort((a, b) => evictionScore(b) - evictionScore(a))\n merged = merged.slice(0, MAX_LIBRARY_SIZE)\n }\n\n const tmpPath = `${indexPath}.tmp`\n await writeFile(tmpPath, JSON.stringify(merged, null, 2), 'utf-8')\n await rename(tmpPath, indexPath)\n } finally {\n await releaseLock()\n }\n })\n return this.writeQueue\n }\n}\n","export function generateUUID(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n // Fallback for environments without crypto.randomUUID (Node < 15.7)\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0\n return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16)\n })\n}\n","export const DIRECT_THRESHOLD = 0.92\nexport const REFERENCE_THRESHOLD = 0.72\n\nexport function scoreToMode(score: number): 'direct' | 'reference' | 'scratch' {\n if (score >= DIRECT_THRESHOLD) return 'direct'\n if (score >= REFERENCE_THRESHOLD) return 'reference'\n return 'scratch'\n}\n","import type { StoredWorkflow } from './types.js'\n\nfunction loadWeights() {\n const raw = {\n tfidf: parseFloat(process.env['KAIROS_WEIGHT_TFIDF'] ?? ''),\n nodeFingerprint: parseFloat(process.env['KAIROS_WEIGHT_JACCARD'] ?? ''),\n outcome: parseFloat(process.env['KAIROS_WEIGHT_OUTCOME'] ?? ''),\n deploy: parseFloat(process.env['KAIROS_WEIGHT_DEPLOY'] ?? ''),\n }\n const defaults = { tfidf: 0.35, nodeFingerprint: 0.30, outcome: 0.20, deploy: 0.15 }\n const anySet = Object.values(raw).some((v) => !isNaN(v) && v >= 0)\n if (!anySet) return defaults\n\n // Use provided values (default 0 for unspecified), then normalize to sum=1\n const w = {\n tfidf: !isNaN(raw.tfidf) && raw.tfidf >= 0 ? raw.tfidf : defaults.tfidf,\n nodeFingerprint: !isNaN(raw.nodeFingerprint) && raw.nodeFingerprint >= 0 ? raw.nodeFingerprint : defaults.nodeFingerprint,\n outcome: !isNaN(raw.outcome) && raw.outcome >= 0 ? raw.outcome : defaults.outcome,\n deploy: !isNaN(raw.deploy) && raw.deploy >= 0 ? raw.deploy : defaults.deploy,\n }\n const total = w.tfidf + w.nodeFingerprint + w.outcome + w.deploy\n if (total <= 0) return defaults\n return {\n tfidf: w.tfidf / total,\n nodeFingerprint: w.nodeFingerprint / total,\n outcome: w.outcome / total,\n deploy: w.deploy / total,\n }\n}\n\nconst WEIGHTS = loadWeights()\n\nconst NODE_KEYWORDS: Record<string, string[]> = {\n slack: ['slack', 'slackApi'],\n email: ['gmail', 'sendEmail', 'emailSend', 'emailReadImap'],\n webhook: ['webhook', 'webhookTrigger'],\n schedule: ['scheduleTrigger', 'cron'],\n http: ['httpRequest'],\n sheets: ['googleSheets'],\n github: ['github', 'githubTrigger'],\n telegram: ['telegram', 'telegramTrigger'],\n ai: ['agent', 'openAi', 'lmChatOpenAi', 'lmChatAnthropic', 'chainLlm', 'chainSummarization'],\n memory: ['memoryBufferWindow', 'memoryXata', 'memoryPostgres'],\n vector: ['vectorStoreInMemory', 'vectorStorePinecone', 'vectorStoreQdrant'],\n database: ['postgres', 'mySql', 'redis', 'mongoDb'],\n airtable: ['airtable'],\n notion: ['notion'],\n s3: ['awsS3'],\n code: ['code'],\n merge: ['merge'],\n switch: ['switch'],\n if: ['if'],\n wait: ['wait'],\n rss: ['rssFeedRead', 'rssFeedReadTrigger'],\n form: ['formTrigger'],\n set: ['set'],\n split: ['splitInBatches'],\n filter: ['filter'],\n telegram_trigger: ['telegramTrigger'],\n stripe: ['stripe'],\n}\n\nfunction extractQueryFingerprint(description: string): Set<string> {\n const lower = description.toLowerCase()\n const matches = new Set<string>()\n\n for (const [keyword, nodeTypes] of Object.entries(NODE_KEYWORDS)) {\n if (lower.includes(keyword)) {\n for (const nt of nodeTypes) matches.add(nt)\n }\n }\n\n if (/\\bevery\\b|\\bdaily\\b|\\bhourly\\b|\\bweekly\\b|\\bmonthly\\b|\\bcron\\b|\\bschedule\\b|\\bat \\d/.test(lower)) {\n matches.add('scheduleTrigger')\n }\n if (/\\bwebhook\\b|\\breceive\\b.*\\bpost\\b|\\bpost\\b.*\\brequest\\b/.test(lower)) {\n matches.add('webhook')\n }\n if (/\\bchat\\b|\\bchatbot\\b|\\bconversation\\b/.test(lower)) {\n matches.add('chatTrigger')\n }\n if (/\\bai\\b|\\bllm\\b|\\bgpt\\b|\\bclaude\\b|\\bagent\\b|\\bsummariz/.test(lower)) {\n matches.add('agent')\n }\n\n return matches\n}\n\nfunction extractWorkflowFingerprint(w: StoredWorkflow): Set<string> {\n const fp = new Set<string>()\n for (const node of w.workflow.nodes) {\n const bare = node.type.split('.').pop() ?? ''\n fp.add(bare)\n }\n return fp\n}\n\nfunction jaccardSimilarity(a: Set<string>, b: Set<string>): number {\n if (a.size === 0 && b.size === 0) return 0\n let intersection = 0\n for (const item of a) {\n if (b.has(item)) intersection++\n }\n const union = a.size + b.size - intersection\n return union > 0 ? intersection / union : 0\n}\n\nfunction outcomeScore(w: StoredWorkflow): number {\n const stats = w.outcomeStats\n if (!stats || stats.totalUses === 0) return 0.5\n\n const passRate = stats.firstTryPasses / stats.totalUses\n const avgAttempts = stats.totalAttempts / stats.totalUses\n const attemptPenalty = Math.max(0, 1 - (avgAttempts - 1) * 0.3)\n\n return passRate * 0.6 + attemptPenalty * 0.4\n}\n\nfunction deployScore(w: StoredWorkflow): number {\n return 1 + Math.log(w.deployCount + 1) * 0.1\n}\n\nexport interface ScoredEntry {\n workflow: StoredWorkflow\n score: number\n signals: {\n tfidf: number\n nodeFingerprint: number\n outcome: number\n deploy: number\n }\n}\n\nexport function hybridScore(\n queryTokens: string[],\n queryDescription: string,\n workflows: StoredWorkflow[],\n docTokenArrays: string[][],\n idf: Map<string, number>,\n): ScoredEntry[] {\n const queryFp = extractQueryFingerprint(queryDescription)\n const ceiling = queryTokens.reduce((sum, qt) => sum + (idf.get(qt) ?? 0), 0) || 1\n\n return workflows.map((w, i) => {\n const docTokens = docTokenArrays[i]!\n let tfidfRaw = 0\n const docFreq = new Map<string, number>()\n for (const t of docTokens) {\n docFreq.set(t, (docFreq.get(t) ?? 0) + 1)\n }\n for (const qt of queryTokens) {\n const tf = docTokens.length > 0 ? (docFreq.get(qt) ?? 0) / docTokens.length : 0\n const idfVal = idf.get(qt) ?? 0\n tfidfRaw += tf * idfVal\n }\n const tfidf = Math.min(tfidfRaw / ceiling, 1)\n\n const workflowFp = extractWorkflowFingerprint(w)\n const nodeFingerprint = queryFp.size > 0 ? jaccardSimilarity(queryFp, workflowFp) : 0\n\n const outcome = outcomeScore(w)\n const deploy = Math.min(deployScore(w), 1.5) / 1.5\n\n const score = Math.min(\n WEIGHTS.tfidf * tfidf +\n WEIGHTS.nodeFingerprint * nodeFingerprint +\n WEIGHTS.outcome * outcome +\n WEIGHTS.deploy * deploy,\n 1,\n )\n\n return {\n workflow: w,\n score,\n signals: { tfidf, nodeFingerprint, outcome, deploy },\n }\n })\n}\n","import type { StoredWorkflow } from './types.js'\n\nexport interface WorkflowCluster {\n pattern: string\n fingerprint: string[]\n members: StoredWorkflow[]\n avgFirstTryPassRate: number\n avgAttempts: number\n commonFailedRules: Array<{ rule: number; frequency: number }>\n}\n\nfunction getFingerprint(w: StoredWorkflow): string[] {\n return w.workflow.nodes\n .map((n) => n.type.split('.').pop() ?? '')\n .sort()\n}\n\nfunction fingerprintKey(fp: string[]): string {\n return fp.join('|')\n}\n\nfunction describePattern(fp: string[]): string {\n const triggers = fp.filter((n) => /trigger/i.test(n))\n const outputs = fp.filter((n) => /slack|gmail|email|telegram|sheets|airtable|notion/i.test(n))\n const ai = fp.filter((n) => /agent|openai|anthropic|chain|memory/i.test(n))\n const core = fp.filter((n) => /httpRequest|code|merge|switch|if|set|filter/i.test(n))\n\n const parts: string[] = []\n if (triggers.length > 0) parts.push(triggers[0]!)\n if (ai.length > 0) parts.push('AI')\n if (core.length > 0) parts.push(core.slice(0, 2).join('+'))\n if (outputs.length > 0) parts.push(outputs[0]!)\n\n return parts.length > 0 ? parts.join(' → ') : fp.slice(0, 3).join(' → ')\n}\n\nexport function clusterWorkflows(workflows: StoredWorkflow[]): WorkflowCluster[] {\n const groups = new Map<string, StoredWorkflow[]>()\n\n for (const w of workflows) {\n const fp = getFingerprint(w)\n const key = fingerprintKey(fp)\n\n const existing = groups.get(key)\n if (existing) {\n existing.push(w)\n } else {\n groups.set(key, [w])\n }\n }\n\n const clusters: WorkflowCluster[] = []\n\n for (const [, members] of groups) {\n if (members.length === 0) continue\n\n const fp = getFingerprint(members[0]!)\n const withStats = members.filter((m) => m.outcomeStats && m.outcomeStats.totalUses > 0)\n\n let avgFirstTryPassRate = 0\n let avgAttempts = 0\n\n if (withStats.length > 0) {\n avgFirstTryPassRate = withStats.reduce((sum, m) => {\n const s = m.outcomeStats!\n return sum + s.firstTryPasses / s.totalUses\n }, 0) / withStats.length\n\n avgAttempts = withStats.reduce((sum, m) => {\n const s = m.outcomeStats!\n return sum + s.totalAttempts / s.totalUses\n }, 0) / withStats.length\n }\n\n const ruleCounts = new Map<number, number>()\n let totalFailureInstances = 0\n for (const m of withStats) {\n const rules = m.outcomeStats!.failedRules\n for (const [rule, count] of Object.entries(rules)) {\n const r = parseInt(rule, 10)\n ruleCounts.set(r, (ruleCounts.get(r) ?? 0) + count)\n totalFailureInstances += count\n }\n }\n\n const commonFailedRules = [...ruleCounts.entries()]\n .map(([rule, count]) => ({\n rule,\n frequency: totalFailureInstances > 0 ? count / totalFailureInstances : 0,\n }))\n .filter((r) => r.frequency >= 0.1)\n .sort((a, b) => b.frequency - a.frequency)\n\n clusters.push({\n pattern: describePattern(fp),\n fingerprint: fp,\n members,\n avgFirstTryPassRate,\n avgAttempts,\n commonFailedRules,\n })\n }\n\n return clusters.sort((a, b) => b.members.length - a.members.length)\n}\n\nconst NOVELTY_BOOST = 0.05 // reward for being first representative of a cluster\nconst NOVELTY_PENALTY = 0.03 // penalty for being a duplicate cluster in the top results\n\nexport function rerank(\n candidates: Array<{ workflow: StoredWorkflow; score: number }>,\n clusters: WorkflowCluster[],\n): Array<{ workflow: StoredWorkflow; score: number; clusterPattern?: string }> {\n const clusterMap = new Map<string, WorkflowCluster>()\n for (const cluster of clusters) {\n for (const member of cluster.members) {\n clusterMap.set(member.id, cluster)\n }\n }\n\n // Pass 1: apply outcome/failure boosts, sort by score\n const pass1 = candidates\n .map((c) => {\n const cluster = clusterMap.get(c.workflow.id)\n let boost = 0\n\n if (cluster && cluster.avgFirstTryPassRate > 0) {\n boost = (cluster.avgFirstTryPassRate - 0.5) * 0.1\n }\n\n if (cluster && cluster.commonFailedRules.length > 0) {\n boost -= cluster.commonFailedRules.length * 0.02\n }\n\n return {\n workflow: c.workflow,\n score: Math.max(0, Math.min(1, c.score + boost)),\n cluster,\n }\n })\n .sort((a, b) => b.score - a.score)\n\n // Pass 2: novelty boost — reward the first representative of each cluster pattern,\n // penalize subsequent results from the same cluster to promote diversity\n const seenFingerprints = new Set<string>()\n return pass1.map((c) => {\n const fpKey = c.cluster ? fingerprintKey(c.cluster.fingerprint) : null\n let noveltyAdjust = 0\n\n if (fpKey !== null) {\n if (!seenFingerprints.has(fpKey)) {\n seenFingerprints.add(fpKey)\n noveltyAdjust = NOVELTY_BOOST\n } else {\n noveltyAdjust = -NOVELTY_PENALTY\n }\n }\n\n return {\n workflow: c.workflow,\n score: Math.max(0, Math.min(1, c.score + noveltyAdjust)),\n ...(c.cluster ? { clusterPattern: c.cluster.pattern } : {}),\n }\n }).sort((a, b) => b.score - a.score)\n}\n","export interface NodeDefinition {\n type: string\n safeTypeVersions: number[]\n requiredParams: string[]\n credentialType?: string\n isTrigger?: boolean\n}\n\nexport const DEFAULT_REGISTRY: NodeDefinition[] = [\n // Trigger nodes\n { type: 'n8n-nodes-base.manualTrigger', safeTypeVersions: [1], requiredParams: [], isTrigger: true },\n { type: 'n8n-nodes-base.scheduleTrigger', safeTypeVersions: [1, 1.1, 1.2], requiredParams: [], isTrigger: true },\n { type: 'n8n-nodes-base.webhook', safeTypeVersions: [1, 1.1, 2], requiredParams: ['httpMethod', 'path'], isTrigger: true },\n { type: 'n8n-nodes-base.formTrigger', safeTypeVersions: [1, 2, 2.1, 2.2], requiredParams: [], isTrigger: true },\n { type: 'n8n-nodes-base.emailReadImap', safeTypeVersions: [2], requiredParams: [], credentialType: 'imap', isTrigger: true },\n { type: 'n8n-nodes-base.errorTrigger', safeTypeVersions: [1], requiredParams: [], isTrigger: true },\n { type: 'n8n-nodes-base.executeWorkflowTrigger', safeTypeVersions: [1, 1.1], requiredParams: [], isTrigger: true },\n { type: 'n8n-nodes-base.gmailTrigger', safeTypeVersions: [1, 1.1, 1.2], requiredParams: [], credentialType: 'gmailOAuth2', isTrigger: true },\n { type: 'n8n-nodes-base.googleDriveTrigger', safeTypeVersions: [1], requiredParams: [], credentialType: 'googleDriveOAuth2Api', isTrigger: true },\n { type: 'n8n-nodes-base.googleSheetsTrigger', safeTypeVersions: [1], requiredParams: [], credentialType: 'googleSheetsTriggerOAuth2Api', isTrigger: true },\n { type: 'n8n-nodes-base.slackTrigger', safeTypeVersions: [1], requiredParams: [], credentialType: 'slackApi', isTrigger: true },\n { type: 'n8n-nodes-base.telegramTrigger', safeTypeVersions: [1, 1.1, 1.2], requiredParams: [], credentialType: 'telegramApi', isTrigger: true },\n { type: 'n8n-nodes-base.githubTrigger', safeTypeVersions: [1], requiredParams: [], credentialType: 'githubApi', isTrigger: true },\n { type: 'n8n-nodes-base.stripeTrigger', safeTypeVersions: [1], requiredParams: [], credentialType: 'stripeApi', isTrigger: true },\n { type: 'n8n-nodes-base.airtableTrigger', safeTypeVersions: [1], requiredParams: [], credentialType: 'airtableTokenApi', isTrigger: true },\n { type: 'n8n-nodes-base.notionTrigger', safeTypeVersions: [1], requiredParams: [], credentialType: 'notionApi', isTrigger: true },\n { type: '@n8n/n8n-nodes-langchain.chatTrigger', safeTypeVersions: [1, 1.1], requiredParams: [], isTrigger: true },\n\n // Core logic nodes\n { type: 'n8n-nodes-base.code', safeTypeVersions: [1, 2], requiredParams: [] },\n { type: 'n8n-nodes-base.httpRequest', safeTypeVersions: [1, 2, 3, 4, 4.1, 4.2], requiredParams: ['url'] },\n { type: 'n8n-nodes-base.set', safeTypeVersions: [1, 2, 3, 3.1, 3.2, 3.3, 3.4], requiredParams: [] },\n { type: 'n8n-nodes-base.if', safeTypeVersions: [1, 2, 2.1, 2.2], requiredParams: [] },\n { type: 'n8n-nodes-base.switch', safeTypeVersions: [1, 2, 3, 3.1, 3.2], requiredParams: [] },\n { type: 'n8n-nodes-base.filter', safeTypeVersions: [1, 2, 2.1, 2.2], requiredParams: [] },\n { type: 'n8n-nodes-base.merge', safeTypeVersions: [1, 2, 2.1, 3], requiredParams: [] },\n { type: 'n8n-nodes-base.splitInBatches', safeTypeVersions: [1, 2, 3], requiredParams: [] },\n { type: 'n8n-nodes-base.wait', safeTypeVersions: [1, 1.1], requiredParams: [] },\n { type: 'n8n-nodes-base.executeWorkflow', safeTypeVersions: [1, 1.1, 1.2], requiredParams: [] },\n { type: 'n8n-nodes-base.respondToWebhook', safeTypeVersions: [1, 1.1], requiredParams: [] },\n { type: 'n8n-nodes-base.noOp', safeTypeVersions: [1], requiredParams: [] },\n { type: 'n8n-nodes-base.stopAndError', safeTypeVersions: [1], requiredParams: [] },\n { type: 'n8n-nodes-base.splitOut', safeTypeVersions: [1], requiredParams: [] },\n { type: 'n8n-nodes-base.aggregate', safeTypeVersions: [1], requiredParams: [] },\n { type: 'n8n-nodes-base.stickyNote', safeTypeVersions: [1], requiredParams: [] },\n\n // Email / messaging\n { type: 'n8n-nodes-base.emailSend', safeTypeVersions: [1, 2, 2.1], requiredParams: [], credentialType: 'smtp' },\n { type: 'n8n-nodes-base.slack', safeTypeVersions: [1, 2, 2.1, 2.2], requiredParams: [], credentialType: 'slackOAuth2Api' },\n { type: 'n8n-nodes-base.telegram', safeTypeVersions: [1, 1.1, 1.2], requiredParams: [], credentialType: 'telegramApi' },\n { type: 'n8n-nodes-base.discord', safeTypeVersions: [1, 2], requiredParams: [], credentialType: 'discordWebhookApi' },\n\n // Google\n { type: 'n8n-nodes-base.gmail', safeTypeVersions: [1, 2, 2.1], requiredParams: [], credentialType: 'gmailOAuth2' },\n { type: 'n8n-nodes-base.googleSheets', safeTypeVersions: [1, 2, 3, 4, 4.1, 4.2, 4.3, 4.4, 4.5], requiredParams: [], credentialType: 'googleSheetsOAuth2Api' },\n { type: 'n8n-nodes-base.googleDrive', safeTypeVersions: [1, 2, 3], requiredParams: [], credentialType: 'googleDriveOAuth2Api' },\n { type: 'n8n-nodes-base.googleCalendar', safeTypeVersions: [1, 1.1, 1.2, 1.3], requiredParams: [], credentialType: 'googleCalendarOAuth2Api' },\n\n // Project management / CRM\n { type: 'n8n-nodes-base.notion', safeTypeVersions: [1, 2, 2.1, 2.2], requiredParams: [], credentialType: 'notionApi' },\n { type: 'n8n-nodes-base.airtable', safeTypeVersions: [1, 2, 2.1], requiredParams: [], credentialType: 'airtableTokenApi' },\n { type: 'n8n-nodes-base.github', safeTypeVersions: [1, 1.1], requiredParams: [], credentialType: 'githubApi' },\n { type: 'n8n-nodes-base.jira', safeTypeVersions: [1], requiredParams: [], credentialType: 'jiraSoftwareCloudApi' },\n { type: 'n8n-nodes-base.hubspot', safeTypeVersions: [1, 2, 2.1], requiredParams: [], credentialType: 'hubspotOAuth2Api' },\n\n // Databases\n { type: 'n8n-nodes-base.postgres', safeTypeVersions: [1, 2, 2.1, 2.2, 2.3, 2.4, 2.5], requiredParams: [], credentialType: 'postgres' },\n { type: 'n8n-nodes-base.mySql', safeTypeVersions: [1, 2, 2.1, 2.2, 2.3, 2.4], requiredParams: [], credentialType: 'mySql' },\n { type: 'n8n-nodes-base.redis', safeTypeVersions: [1], requiredParams: [], credentialType: 'redis' },\n { type: 'n8n-nodes-base.supabase', safeTypeVersions: [1], requiredParams: [], credentialType: 'supabaseApi' },\n\n // Cloud\n { type: 'n8n-nodes-base.awsS3', safeTypeVersions: [1, 2], requiredParams: [], credentialType: 'aws' },\n\n // Payment / commerce\n { type: 'n8n-nodes-base.stripe', safeTypeVersions: [1], requiredParams: [], credentialType: 'stripeApi' },\n\n // AI / LangChain root nodes\n { type: '@n8n/n8n-nodes-langchain.agent', safeTypeVersions: [1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9], requiredParams: [] },\n { type: '@n8n/n8n-nodes-langchain.chainLlm', safeTypeVersions: [1, 1.1, 1.2, 1.3, 1.4, 1.5], requiredParams: [] },\n { type: '@n8n/n8n-nodes-langchain.chainRetrievalQa', safeTypeVersions: [1, 1.1, 1.2, 1.3, 1.4], requiredParams: [] },\n { type: '@n8n/n8n-nodes-langchain.openAi', safeTypeVersions: [1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8], requiredParams: [], credentialType: 'openAiApi' },\n { type: '@n8n/n8n-nodes-langchain.anthropic', safeTypeVersions: [1], requiredParams: [], credentialType: 'anthropicApi' },\n { type: '@n8n/n8n-nodes-langchain.informationExtractor', safeTypeVersions: [1], requiredParams: [] },\n { type: '@n8n/n8n-nodes-langchain.textClassifier', safeTypeVersions: [1], requiredParams: [] },\n\n // AI / LangChain sub-nodes (models)\n { type: '@n8n/n8n-nodes-langchain.lmChatOpenAi', safeTypeVersions: [1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7], requiredParams: [], credentialType: 'openAiApi' },\n { type: '@n8n/n8n-nodes-langchain.lmChatAnthropic', safeTypeVersions: [1, 1.1, 1.2, 1.3], requiredParams: [], credentialType: 'anthropicApi' },\n { type: '@n8n/n8n-nodes-langchain.lmChatGoogleGemini', safeTypeVersions: [1], requiredParams: [], credentialType: 'googlePalmApi' },\n\n // AI / LangChain sub-nodes (memory, tools, etc.)\n { type: '@n8n/n8n-nodes-langchain.memoryBufferWindow', safeTypeVersions: [1, 1.1, 1.2, 1.3], requiredParams: [] },\n { type: '@n8n/n8n-nodes-langchain.toolWorkflow', safeTypeVersions: [1, 1.1, 1.2, 1.3], requiredParams: [] },\n { type: '@n8n/n8n-nodes-langchain.toolCode', safeTypeVersions: [1, 1.1], requiredParams: [] },\n { type: '@n8n/n8n-nodes-langchain.toolHttpRequest', safeTypeVersions: [1, 1.1], requiredParams: [] },\n { type: '@n8n/n8n-nodes-langchain.toolCalculator', safeTypeVersions: [1], requiredParams: [] },\n]\n\nexport class NodeRegistry {\n private readonly byType: Map<string, NodeDefinition>\n\n constructor(definitions: NodeDefinition[] = DEFAULT_REGISTRY) {\n this.byType = new Map(definitions.map((d) => [d.type, d]))\n }\n\n get(type: string): NodeDefinition | undefined {\n return this.byType.get(type)\n }\n\n isTrigger(type: string): boolean {\n return this.byType.get(type)?.isTrigger === true\n }\n\n isKnown(type: string): boolean {\n return this.byType.has(type)\n }\n\n isVersionSafe(type: string, version: number): boolean {\n const def = this.byType.get(type)\n if (!def) return true\n return def.safeTypeVersions.includes(version)\n }\n\n // Returns true when the version is a positive integer greater than the highest\n // known safe version — indicates a newer release rather than a bad value.\n isVersionNewer(type: string, version: number): boolean {\n const def = this.byType.get(type)\n if (!def || def.safeTypeVersions.length === 0) return false\n const max = Math.max(...def.safeTypeVersions)\n return Number.isInteger(version) && version > max\n }\n\n getRequiredParams(type: string): string[] {\n return this.byType.get(type)?.requiredParams ?? []\n }\n}\n","import type { N8nNode, N8nConnections, N8nSettings, Tag } from '../../types/workflow.js'\n\nexport interface N8nWorkflowResponse {\n id: string\n name: string\n active: boolean\n nodes: N8nNode[]\n connections: N8nConnections\n settings?: N8nSettings\n tags?: Tag[]\n createdAt: string\n updatedAt: string\n versionId?: string\n meta?: Record<string, unknown>\n pinData?: Record<string, unknown>\n staticData?: unknown\n triggerCount?: number\n shared?: boolean\n isArchived?: boolean\n}\n\nexport interface N8nWorkflowListResponse {\n data: N8nWorkflowResponse[]\n nextCursor: string | null\n}\n\nexport interface N8nExecutionResponse {\n id: string\n workflowId: string\n status: 'success' | 'error' | 'waiting' | 'running' | 'canceled'\n startedAt: string\n stoppedAt?: string\n mode: string\n data?: unknown\n workflowData?: unknown\n}\n\nexport interface N8nExecutionListResponse {\n data: N8nExecutionResponse[]\n nextCursor: string | null\n}\n\nexport interface N8nTagResponse {\n id: string\n name: string\n createdAt?: string\n updatedAt?: string\n}\n\nexport interface N8nTagListResponse {\n data: N8nTagResponse[]\n nextCursor: string | null\n}\n\nexport interface N8nNodeTypeInfo {\n name: string\n displayName: string\n version: number | number[]\n description?: string\n group?: string[]\n credentials?: Array<{ name: string; required?: boolean }>\n}\n\nexport interface N8nNodeTypeListResponse {\n data: N8nNodeTypeInfo[]\n}\n\nexport const FORBIDDEN_ON_CREATE = [\n 'id',\n 'createdAt',\n 'updatedAt',\n 'versionId',\n 'meta',\n 'isArchived',\n 'activeVersionId',\n 'activeVersion',\n 'active',\n 'pinData',\n 'triggerCount',\n 'shared',\n 'staticData',\n] as const\n\nexport const FORBIDDEN_ON_UPDATE = FORBIDDEN_ON_CREATE.filter((f) => f !== 'id')\n\nexport type ForbiddenField = (typeof FORBIDDEN_ON_CREATE)[number]\n","import type { N8nWorkflow, N8nNode } from '../types/workflow.js'\nimport type { ValidationIssue, ValidationResult } from './types.js'\nimport { NodeRegistry, DEFAULT_REGISTRY } from './registry.js'\nimport { FORBIDDEN_ON_CREATE } from '../providers/n8n/types.js'\n\nconst AI_CONNECTION_TYPES = [\n 'ai_languageModel',\n 'ai_memory',\n 'ai_tool',\n 'ai_outputParser',\n 'ai_embedding',\n 'ai_document',\n 'ai_textSplitter',\n 'ai_retriever',\n 'ai_vectorStore',\n]\n\nconst TRIGGER_TYPE_PATTERNS = [/trigger/i, /Trigger$/]\n\nconst NODE_TYPE_PATTERN = /^(@[a-z0-9-]+\\/[a-z0-9-]+\\.|n8n-nodes-[a-z0-9-]+\\.)[a-zA-Z][a-zA-Z0-9-]+$/\n\nexport class N8nValidator {\n private readonly registry: NodeRegistry\n\n constructor(registry: NodeRegistry = new NodeRegistry(DEFAULT_REGISTRY)) {\n this.registry = registry\n }\n\n validate(workflow: N8nWorkflow): ValidationResult {\n const issues: ValidationIssue[] = []\n\n this.checkRule1(workflow, issues)\n this.checkRule2(workflow, issues)\n this.checkRule3(workflow, issues)\n this.checkRule4(workflow, issues)\n this.checkRule5(workflow, issues)\n this.checkRule6(workflow, issues)\n this.checkRule7(workflow, issues)\n this.checkRule8(workflow, issues)\n this.checkRule9(workflow, issues)\n this.checkRule10(workflow, issues)\n this.checkRule11(workflow, issues)\n this.checkRule12(workflow, issues)\n this.checkRule13(workflow, issues)\n this.checkRule14(workflow, issues)\n this.checkRule15(workflow, issues)\n this.checkRule16(workflow, issues)\n this.checkRule17(workflow, issues)\n this.checkRule18(workflow, issues)\n this.checkRule19(workflow, issues)\n this.checkRule20(workflow, issues)\n this.checkRule21(workflow, issues)\n this.checkRule22(workflow, issues)\n this.checkRule23(workflow, issues)\n this.checkRule24(workflow, issues)\n this.checkRule25(workflow, issues)\n this.checkRule26(workflow, issues)\n this.checkRule27(workflow, issues)\n this.checkRule28(workflow, issues)\n this.checkRule29(workflow, issues)\n this.checkRule30(workflow, issues)\n this.checkRule31(workflow, issues)\n this.checkRule32(workflow, issues)\n this.checkRule33(workflow, issues)\n this.checkRule34(workflow, issues)\n\n // Enrich issues with nodeType by looking up nodeId\n if (Array.isArray(workflow.nodes)) {\n const nodeById = new Map(workflow.nodes.map(n => [n.id, n.type]))\n for (const issue of issues) {\n if (issue.nodeId && !issue.nodeType) {\n const nt = nodeById.get(issue.nodeId)\n if (nt) issue.nodeType = nt\n }\n }\n }\n\n const errors = issues.filter((i) => i.severity === 'error')\n return { valid: errors.length === 0, issues }\n }\n\n private err(issues: ValidationIssue[], rule: number, message: string, nodeId?: string, nodeType?: string): void {\n const issue: ValidationIssue = { rule, severity: 'error', message }\n if (nodeId !== undefined) issue.nodeId = nodeId\n if (nodeType !== undefined) issue.nodeType = nodeType\n issues.push(issue)\n }\n\n private warn(issues: ValidationIssue[], rule: number, message: string, nodeId?: string, nodeType?: string): void {\n const issue: ValidationIssue = { rule, severity: 'warn', message }\n if (nodeId !== undefined) issue.nodeId = nodeId\n if (nodeType !== undefined) issue.nodeType = nodeType\n issues.push(issue)\n }\n\n private isTriggerNode(node: N8nNode): boolean {\n if (this.registry.isTrigger(node.type)) return true\n return TRIGGER_TYPE_PATTERNS.some((p) => p.test(node.type))\n }\n\n // Rule 1: name is a non-empty string\n private checkRule1(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (typeof w.name !== 'string' || w.name.trim() === '') {\n this.err(issues, 1, 'Workflow name is required and must be a non-empty string')\n }\n }\n\n // Rule 2: nodes is an array with at least one element\n private checkRule2(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes) || w.nodes.length === 0) {\n this.err(issues, 2, 'Workflow must have at least one node')\n }\n }\n\n // Rule 3: every node has a non-empty id\n private checkRule3(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (typeof node.id !== 'string' || node.id.trim() === '') {\n this.err(issues, 3, `Node \"${node.name ?? 'unknown'}\" is missing a valid id`, node.id)\n }\n }\n }\n\n // Rule 4: node ids are unique\n private checkRule4(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n const seen = new Set<string>()\n for (const node of w.nodes) {\n if (!node.id) continue\n if (seen.has(node.id)) {\n this.err(issues, 4, `Duplicate node id: \"${node.id}\"`, node.id)\n }\n seen.add(node.id)\n }\n }\n\n // Rule 5: every node has a non-empty type string\n private checkRule5(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (typeof node.type !== 'string' || node.type.trim() === '') {\n this.err(issues, 5, `Node \"${node.name ?? node.id}\" is missing a type`, node.id)\n }\n }\n }\n\n // Rule 6: every node has a positive typeVersion number\n private checkRule6(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (typeof node.typeVersion !== 'number' || node.typeVersion <= 0) {\n this.err(issues, 6, `Node \"${node.name}\" has invalid typeVersion: ${String(node.typeVersion)}`, node.id)\n }\n }\n }\n\n // Rule 7: every node has a valid [x, y] position\n private checkRule7(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n const pos = node.position\n if (\n !Array.isArray(pos) ||\n pos.length !== 2 ||\n typeof pos[0] !== 'number' ||\n typeof pos[1] !== 'number'\n ) {\n this.err(issues, 7, `Node \"${node.name}\" has invalid position (must be [x, y])`, node.id)\n }\n }\n }\n\n // Rule 8: every node has a non-empty name\n private checkRule8(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (typeof node.name !== 'string' || node.name.trim() === '') {\n this.err(issues, 8, `Node with id \"${node.id}\" is missing a name`, node.id)\n }\n }\n }\n\n // Rule 9: connections is a plain object\n private checkRule9(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (typeof w.connections !== 'object' || w.connections === null || Array.isArray(w.connections)) {\n this.err(issues, 9, 'connections must be a plain object (use {} for single-node workflows)')\n }\n }\n\n // Rule 10: every connection target node name exists in nodes\n private checkRule10(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes) || typeof w.connections !== 'object' || w.connections === null) return\n const nodeNames = new Set(w.nodes.map((n) => n.name))\n for (const [sourceName, outputs] of Object.entries(w.connections)) {\n if (!nodeNames.has(sourceName)) {\n this.err(issues, 10, `Connection source \"${sourceName}\" does not exist in nodes`)\n continue\n }\n if (typeof outputs !== 'object' || outputs === null) continue\n for (const portGroup of Object.values(outputs)) {\n if (!Array.isArray(portGroup)) continue\n for (const targets of portGroup) {\n if (!Array.isArray(targets)) continue\n for (const target of targets) {\n const t = target as { node?: string }\n if (typeof t?.node === 'string' && !nodeNames.has(t.node)) {\n this.err(issues, 10, `Connection target \"${t.node}\" does not exist in nodes`)\n }\n }\n }\n }\n }\n }\n\n // Rule 11 (WARN): every non-trigger node has at least one incoming connection\n private checkRule11(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes) || typeof w.connections !== 'object' || w.connections === null) return\n const reachable = new Set<string>()\n // Track nodes that are sources of ai_* connections — they are purposefully\n // connectionless on main; they feed the agent as sub-nodes.\n const aiSubNodeSources = new Set<string>()\n for (const [sourceName, outputs] of Object.entries(w.connections)) {\n if (typeof outputs !== 'object' || outputs === null) continue\n let hasAiPort = false\n for (const [portName, portGroup] of Object.entries(outputs)) {\n if (!Array.isArray(portGroup)) continue\n const isAiPort = portName.startsWith('ai_')\n if (isAiPort) hasAiPort = true\n for (const targets of portGroup) {\n if (!Array.isArray(targets)) continue\n for (const target of targets) {\n const t = target as { node?: string }\n if (typeof t?.node === 'string') reachable.add(t.node)\n }\n }\n }\n if (hasAiPort) aiSubNodeSources.add(sourceName)\n }\n for (const node of w.nodes) {\n if (node.type.includes('stickyNote')) continue\n if (this.isTriggerNode(node)) continue\n if (aiSubNodeSources.has(node.name)) continue\n if (!reachable.has(node.name)) {\n this.warn(issues, 11, `Node \"${node.name}\" has no incoming connections and may never execute`, node.id)\n }\n }\n }\n\n // Rule 12: forbidden fields absent from workflow root\n private checkRule12(w: N8nWorkflow, issues: ValidationIssue[]): void {\n const wObj = w as unknown as Record<string, unknown>\n for (const field of FORBIDDEN_ON_CREATE) {\n if (field in wObj) {\n this.err(issues, 12, `Forbidden field \"${field}\" present in workflow — remove it before deploying`)\n }\n }\n }\n\n // Rule 13: settings, if present, is a plain object\n private checkRule13(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (w.settings !== undefined) {\n if (typeof w.settings !== 'object' || w.settings === null || Array.isArray(w.settings)) {\n this.err(issues, 13, 'workflow.settings must be a plain object')\n }\n }\n }\n\n // Rule 14: at least one trigger node is present\n private checkRule14(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n const hasTrigger = w.nodes.some((n) => this.isTriggerNode(n))\n if (!hasTrigger) {\n this.err(issues, 14, 'Workflow must contain at least one trigger node')\n }\n }\n\n // Rule 15: node type string matches expected format\n private checkRule15(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (typeof node.type !== 'string') continue\n if (!NODE_TYPE_PATTERN.test(node.type)) {\n this.err(issues, 15, `Node \"${node.name}\" has malformed type string: \"${node.type}\"`, node.id)\n }\n }\n }\n\n // Rule 16: node names are unique within the workflow\n private checkRule16(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n const seen = new Set<string>()\n for (const node of w.nodes) {\n if (!node.name) continue\n if (seen.has(node.name)) {\n this.err(issues, 16, `Duplicate node name: \"${node.name}\"`, node.id)\n }\n seen.add(node.name)\n }\n }\n\n // Rule 17: credentials shape — each entry has id and name\n private checkRule17(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (!node.credentials) continue\n for (const [credType, credRef] of Object.entries(node.credentials)) {\n if (typeof credRef !== 'object' || credRef === null) {\n this.err(issues, 17, `Node \"${node.name}\" credential \"${credType}\" must be an object with id and name`, node.id)\n continue\n }\n const ref = credRef as unknown as Record<string, unknown>\n if (\n typeof ref['id'] !== 'string' || ref['id'].trim() === '' ||\n typeof ref['name'] !== 'string' || ref['name'].trim() === ''\n ) {\n this.err(issues, 17, `Node \"${node.name}\" credential \"${credType}\" must have non-empty string id and name fields`, node.id)\n }\n }\n }\n }\n\n // Rule 18 (ERROR): AI connections must originate from sub-nodes, not the agent/chain root\n private checkRule18(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (typeof w.connections !== 'object' || w.connections === null) return\n const agentTypes = new Set([\n '@n8n/n8n-nodes-langchain.agent',\n '@n8n/n8n-nodes-langchain.chainLlm',\n '@n8n/n8n-nodes-langchain.chainRetrievalQa',\n '@n8n/n8n-nodes-langchain.chainSummarization',\n ])\n if (!Array.isArray(w.nodes)) return\n const nodesByName = new Map(w.nodes.map((n) => [n.name, n]))\n\n for (const [sourceName, outputs] of Object.entries(w.connections)) {\n const sourceNode = nodesByName.get(sourceName)\n if (!sourceNode) continue\n if (!agentTypes.has(sourceNode.type)) continue\n if (typeof outputs !== 'object' || outputs === null) continue\n for (const connType of AI_CONNECTION_TYPES) {\n if (connType in outputs) {\n this.err(\n issues,\n 18,\n `Node \"${sourceName}\" uses AI connection type \"${connType}\" as a SOURCE — AI sub-nodes should be the source, not the agent/chain root`,\n sourceNode.id,\n )\n }\n }\n }\n }\n\n // Rule 19 (WARN): typeVersion is within known safe range for registered node types.\n // In lenient mode (KAIROS_REGISTRY_STRICT != 'true'), versions higher than the known\n // max are allowed — they likely represent newer n8n releases Kairos hasn't catalogued yet.\n private checkRule19(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n const strict = process.env['KAIROS_REGISTRY_STRICT'] === 'true'\n for (const node of w.nodes) {\n if (typeof node.type !== 'string' || typeof node.typeVersion !== 'number') continue\n if (this.registry.isVersionSafe(node.type, node.typeVersion)) continue\n // In lenient mode (default), a version that is simply higher than our known max\n // is likely a newer n8n release — skip the warning.\n if (!strict && this.registry.isVersionNewer(node.type, node.typeVersion)) continue\n this.warn(\n issues,\n 19,\n `Node \"${node.name}\" uses typeVersion ${node.typeVersion} for type \"${node.type}\" which is not in the known safe list`,\n node.id,\n )\n }\n }\n\n // Rule 20 (WARN): cycle detection — no node should be reachable from itself\n // Exempts splitInBatches loops which are an intentional n8n pattern\n private checkRule20(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes) || typeof w.connections !== 'object' || w.connections === null) return\n\n const splitBatchNodes = new Set(\n w.nodes.filter((n) => n.type.includes('splitInBatches')).map((n) => n.name),\n )\n\n const adj = new Map<string, string[]>()\n for (const [sourceName, outputs] of Object.entries(w.connections)) {\n if (typeof outputs !== 'object' || outputs === null) continue\n const targets: string[] = []\n for (const portGroup of Object.values(outputs)) {\n if (!Array.isArray(portGroup)) continue\n for (const conns of portGroup) {\n if (!Array.isArray(conns)) continue\n for (const conn of conns) {\n const t = conn as { node?: string }\n if (typeof t?.node === 'string') {\n if (splitBatchNodes.has(t.node)) continue\n targets.push(t.node)\n }\n }\n }\n }\n adj.set(sourceName, targets)\n }\n\n const WHITE = 0, GRAY = 1, BLACK = 2\n const color = new Map<string, number>()\n for (const node of w.nodes) color.set(node.name, WHITE)\n\n const dfs = (name: string): boolean => {\n color.set(name, GRAY)\n for (const neighbor of adj.get(name) ?? []) {\n const c = color.get(neighbor)\n if (c === GRAY) return true\n if (c === WHITE && dfs(neighbor)) return true\n }\n color.set(name, BLACK)\n return false\n }\n\n for (const node of w.nodes) {\n if (color.get(node.name) === WHITE && dfs(node.name)) {\n this.warn(issues, 20, 'Workflow contains a connection cycle — this may cause infinite loops')\n return\n }\n }\n }\n\n // Rule 21 (WARN): webhook with responseMode=\"responseNode\" must have respondToWebhook node\n private checkRule21(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n\n const webhooksNeedingResponse = w.nodes.filter((n) => {\n if (!n.type.includes('webhook')) return false\n const params = n.parameters as Record<string, unknown> | undefined\n return params?.responseMode === 'responseNode'\n })\n\n if (webhooksNeedingResponse.length === 0) return\n\n const hasRespondNode = w.nodes.some((n) => n.type.includes('respondToWebhook'))\n if (!hasRespondNode) {\n for (const wh of webhooksNeedingResponse) {\n this.warn(\n issues,\n 21,\n `Webhook \"${wh.name}\" uses responseMode \"responseNode\" but no respondToWebhook node exists in the workflow`,\n wh.id,\n )\n }\n }\n }\n\n // Rule 22 (WARN): check requiredParams from registry\n private checkRule22(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (typeof node.type !== 'string') continue\n const required = this.registry.getRequiredParams(node.type)\n if (required.length === 0) continue\n const params = (node.parameters ?? {}) as Record<string, unknown>\n for (const param of required) {\n const value = params[param]\n if (value === undefined || value === null || value === '') {\n this.warn(\n issues,\n 22,\n `Node \"${node.name}\" (${node.type}) is missing required parameter \"${param}\"`,\n node.id,\n )\n }\n }\n }\n }\n\n // Rule 23 (WARN): unknown node types not in registry\n private checkRule23(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (typeof node.type !== 'string') continue\n if (node.type.includes('stickyNote')) continue\n if (!NODE_TYPE_PATTERN.test(node.type)) continue\n if (!this.registry.isKnown(node.type)) {\n this.warn(\n issues,\n 23,\n `Node \"${node.name}\" uses unknown type \"${node.type}\" — it may not exist in n8n`,\n node.id,\n )\n }\n }\n }\n\n // Rule 24 (WARN): deprecated accessor syntax in expressions\n private checkRule24(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n const deprecated = /\\$node\\s*\\[/\n for (const node of w.nodes) {\n for (const expr of this.extractExpressions(node.parameters)) {\n if (deprecated.test(expr)) {\n this.warn(\n issues,\n 24,\n `Node \"${node.name}\" uses deprecated accessor $node[\"...\"] — use $('NodeName').item.json.field instead`,\n node.id,\n )\n break\n }\n }\n }\n }\n\n // Rule 25 (WARN): wrong item index assumptions in expressions\n private checkRule25(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n const itemIndex = /\\$json\\s*\\.\\s*items\\s*\\[/\n for (const node of w.nodes) {\n for (const expr of this.extractExpressions(node.parameters)) {\n if (itemIndex.test(expr)) {\n this.warn(\n issues,\n 25,\n `Node \"${node.name}\" accesses $json.items[n] — n8n flattens items automatically, use $json.field directly`,\n node.id,\n )\n break\n }\n }\n }\n }\n\n // Rule 26 (WARN): missing .first() or .all() on node references\n private checkRule26(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n const bareRef = /\\$\\(\\s*'[^']+'\\s*\\)\\s*\\.json/\n for (const node of w.nodes) {\n for (const expr of this.extractExpressions(node.parameters)) {\n if (bareRef.test(expr)) {\n this.warn(\n issues,\n 26,\n `Node \"${node.name}\" references $('NodeName').json without .first() or .all() — use $('NodeName').first().json.field`,\n node.id,\n )\n break\n }\n }\n }\n }\n\n private extractExpressions(params: Record<string, unknown>): string[] {\n const expressions: string[] = []\n const walk = (val: unknown): void => {\n if (typeof val === 'string') {\n if (val.includes('={{') || val.includes('$node') || val.includes(\"$('\")) {\n expressions.push(val)\n }\n } else if (Array.isArray(val)) {\n for (const item of val) walk(item)\n } else if (val !== null && typeof val === 'object') {\n for (const v of Object.values(val as Record<string, unknown>)) walk(v)\n }\n }\n walk(params)\n return expressions\n }\n\n // Rule 27 (WARN): httpRequest URL is a placeholder\n private checkRule27(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n const PLACEHOLDER_RE = [\n /^https?:\\/\\/example\\.com/i,\n /your[-_]?(api[-_]?)?url/i,\n /^https?:\\/\\/$/,\n /^<.+>$/,\n /placeholder/i,\n ]\n for (const node of w.nodes) {\n if (node.type !== 'n8n-nodes-base.httpRequest') continue\n const params = node.parameters as Record<string, unknown> | undefined\n const url = params?.['url']\n if (typeof url !== 'string' || url.trim() === '') continue\n if (PLACEHOLDER_RE.some((re) => re.test(url.trim()))) {\n this.warn(\n issues,\n 27,\n `Node \"${node.name}\" httpRequest URL appears to be a placeholder: \"${url}\" — replace with your actual endpoint`,\n node.id,\n )\n }\n }\n }\n\n // Rule 28 (WARN): code node with empty or comment-only code\n private checkRule28(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (node.type !== 'n8n-nodes-base.code') continue\n const params = node.parameters as Record<string, unknown> | undefined\n const jsCode = typeof params?.['jsCode'] === 'string' ? params['jsCode'] : ''\n const pythonCode = typeof params?.['pythonCode'] === 'string' ? params['pythonCode'] : ''\n const code = jsCode || pythonCode\n const stripped = code\n .replace(/\\/\\/[^\\n]*/g, '')\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n .replace(/#[^\\n]*/g, '')\n .trim()\n if (!stripped) {\n this.warn(issues, 28, `Node \"${node.name}\" code node has no executable code`, node.id)\n }\n }\n }\n\n // Rule 29 (WARN): slack node message operation missing channel\n private checkRule29(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (node.type !== 'n8n-nodes-base.slack') continue\n const params = node.parameters as Record<string, unknown> | undefined\n const resource = params?.['resource'] as string | undefined\n const operation = params?.['operation'] as string | undefined\n const isMessageOp = resource === 'message' || operation === 'sendMessage' || operation === 'post'\n if (!isMessageOp) continue\n const channel = params?.['channel'] ?? params?.['channelId']\n const rlValue = typeof channel === 'object' && channel !== null\n ? (channel as Record<string, unknown>)['value']\n : undefined\n const isEmpty = channel === undefined || channel === null ||\n (typeof channel === 'string' && channel.trim() === '') ||\n (typeof channel === 'object' && (!rlValue || (typeof rlValue === 'string' && rlValue.trim() === '')))\n if (isEmpty) {\n this.warn(issues, 29, `Node \"${node.name}\" Slack message has no channel specified`, node.id)\n }\n }\n }\n\n // Rule 30 (WARN): gmail node send operation missing recipient\n private checkRule30(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (node.type !== 'n8n-nodes-base.gmail') continue\n const params = node.parameters as Record<string, unknown> | undefined\n const operation = params?.['operation'] as string | undefined\n if (operation !== 'send') continue\n const to = params?.['to'] ?? params?.['toList']\n const isEmpty = to === undefined || to === null ||\n (typeof to === 'string' && to.trim() === '') ||\n (Array.isArray(to) && to.length === 0)\n if (isEmpty) {\n this.warn(issues, 30, `Node \"${node.name}\" gmail send has no recipient (to) specified`, node.id)\n }\n }\n }\n\n // Rule 31 (WARN): if node with empty conditions\n private checkRule31(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (node.type !== 'n8n-nodes-base.if') continue\n const params = node.parameters as Record<string, unknown> | undefined\n const conditions = params?.['conditions']\n if (conditions === undefined || conditions === null) {\n this.warn(issues, 31, `Node \"${node.name}\" if node has no conditions defined`, node.id)\n continue\n }\n // typeVersion 2.x: { combinator, conditions: [...] }\n if (typeof conditions === 'object' && !Array.isArray(conditions)) {\n const conds = (conditions as Record<string, unknown>)['conditions']\n if (!Array.isArray(conds) || conds.length === 0) {\n this.warn(issues, 31, `Node \"${node.name}\" if node conditions array is empty`, node.id)\n }\n } else if (Array.isArray(conditions) && conditions.length === 0) {\n this.warn(issues, 31, `Node \"${node.name}\" if node conditions array is empty`, node.id)\n }\n }\n }\n\n // Rule 32 (WARN): set node with no assignments\n private checkRule32(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (node.type !== 'n8n-nodes-base.set') continue\n const params = node.parameters as Record<string, unknown> | undefined\n // typeVersion 3.x: assignments.assignments[]\n const assignmentsObj = params?.['assignments'] as Record<string, unknown> | undefined\n const assignmentsArr = assignmentsObj?.['assignments']\n // typeVersion 1.x: values.string[] / values.number[] etc.\n const valuesObj = params?.['values'] as Record<string, unknown> | undefined\n const hasV1 = valuesObj && Object.values(valuesObj).some((v) => Array.isArray(v) && v.length > 0)\n const hasV3 = Array.isArray(assignmentsArr) && assignmentsArr.length > 0\n if (!hasV1 && !hasV3) {\n this.warn(\n issues,\n 32,\n `Node \"${node.name}\" set node has no fields defined — it will pass data through unchanged`,\n node.id,\n )\n }\n }\n }\n\n // Rule 33 (WARN): scheduleTrigger with no schedule rules\n private checkRule33(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (node.type !== 'n8n-nodes-base.scheduleTrigger') continue\n const params = node.parameters as Record<string, unknown> | undefined\n const rule = params?.['rule'] as Record<string, unknown> | undefined\n const intervals = rule?.['interval']\n if (!Array.isArray(intervals) || intervals.length === 0) {\n this.warn(issues, 33, `Node \"${node.name}\" scheduleTrigger has no schedule rules defined`, node.id)\n }\n }\n }\n\n // Rule 34 (WARN): webhook path contains spaces, starts with slash, or looks like a full URL\n private checkRule34(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (node.type !== 'n8n-nodes-base.webhook') continue\n const params = node.parameters as Record<string, unknown> | undefined\n const path = params?.['path']\n if (typeof path !== 'string') continue\n if (/\\s/.test(path)) {\n this.warn(\n issues,\n 34,\n `Node \"${node.name}\" webhook path contains spaces: \"${path}\" — use hyphens or underscores instead`,\n node.id,\n )\n } else if (/^https?:\\/\\//i.test(path)) {\n this.warn(\n issues,\n 34,\n `Node \"${node.name}\" webhook path looks like a full URL — it should be a relative path (e.g. \"my-hook\")`,\n node.id,\n )\n } else if (path.startsWith('/')) {\n this.warn(\n issues,\n 34,\n `Node \"${node.name}\" webhook path starts with \"/\" — n8n adds the leading slash automatically`,\n node.id,\n )\n }\n }\n }\n}\n","import type { N8nWorkflow } from '../../types/workflow.js'\nimport { FORBIDDEN_ON_CREATE, FORBIDDEN_ON_UPDATE } from './types.js'\n\nexport class N8nFieldStripper {\n stripForCreate(workflow: N8nWorkflow): N8nWorkflow {\n return this.strip(workflow, FORBIDDEN_ON_CREATE as readonly string[])\n }\n\n stripForUpdate(workflow: N8nWorkflow): N8nWorkflow {\n return this.strip(workflow, FORBIDDEN_ON_UPDATE as readonly string[])\n }\n\n private strip(workflow: N8nWorkflow, forbidden: readonly string[]): N8nWorkflow {\n const result = { ...workflow } as unknown as Record<string, unknown>\n for (const field of forbidden) {\n delete result[field]\n }\n return result as unknown as N8nWorkflow\n }\n}\n","export class KairosError extends Error {\n constructor(message: string, public readonly cause?: unknown) {\n super(message)\n this.name = 'KairosError'\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n}\n","import { KairosError } from './base.js'\n\nexport class ApiError extends KairosError {\n constructor(\n message: string,\n public readonly statusCode: number,\n cause?: unknown,\n ) {\n super(message, cause)\n this.name = 'ApiError'\n }\n}\n","import { KairosError } from './base.js'\n\nexport class ProviderError extends KairosError {\n constructor(message: string, cause?: unknown) {\n super(message, cause)\n this.name = 'ProviderError'\n }\n}\n","import { KairosError } from './base.js'\n\nexport class GuardError extends KairosError {\n constructor(message: string) {\n super(message)\n this.name = 'GuardError'\n }\n}\n","// ECONNRESET/ETIMEDOUT/ECONNREFUSED mean the request never completed — safe to retry.\n// Walks the .cause chain up to 4 levels because Node's fetch wraps errors:\n// ProviderError → TypeError(\"fetch failed\") → SystemError { code: 'ECONNRESET' }\nexport function isTransientNetworkError(err: unknown): boolean {\n const TRANSIENT_CODES = new Set(['ECONNRESET', 'ETIMEDOUT', 'ECONNREFUSED', 'ENOTFOUND', 'ECONNABORTED'])\n let current: unknown = err\n for (let i = 0; i < 4; i++) {\n if (current === null || typeof current !== 'object') break\n const code = (current as { code?: string }).code\n if (typeof code === 'string' && TRANSIENT_CODES.has(code)) return true\n current = (current as { cause?: unknown }).cause\n }\n return false\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n maxAttempts: number,\n delayMs: number,\n shouldRetry?: (err: unknown) => boolean,\n): Promise<T> {\n let lastError: unknown\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n if (attempt > 0) {\n const jitter = Math.random() * delayMs * 0.5\n await new Promise((resolve) => setTimeout(resolve, delayMs * 2 ** (attempt - 1) + jitter))\n }\n try {\n return await fn()\n } catch (err) {\n lastError = err\n if (shouldRetry && !shouldRetry(err)) throw err\n }\n }\n throw lastError\n}\n\nexport function fetchWithTimeout(url: string, init: RequestInit, timeoutMs: number): Promise<Response> {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), timeoutMs)\n return fetch(url, { ...init, signal: controller.signal }).finally(() => clearTimeout(timer))\n}\n","import type { N8nWorkflow, Tag } from '../../types/workflow.js'\nimport type { WorkflowListItem, ExecutionSummary, ExecutionDetail } from '../../types/result.js'\nimport type { ExecutionFilter } from '../../types/options.js'\nimport type { ILogger } from '../../utils/logger.js'\nimport { ApiError } from '../../errors/api-error.js'\nimport { ProviderError } from '../../errors/provider-error.js'\nimport { GuardError } from '../../errors/guard-error.js'\nimport { withRetry, fetchWithTimeout, isTransientNetworkError } from '../../utils/retry.js'\nimport type {\n N8nWorkflowResponse,\n N8nWorkflowListResponse,\n N8nExecutionResponse,\n N8nExecutionListResponse,\n N8nTagResponse,\n N8nTagListResponse,\n N8nNodeTypeInfo,\n N8nNodeTypeListResponse,\n} from './types.js'\n\nconst EXECUTION_LIMIT_CAP = 100\nconst N8N_API_PAGE_SIZE = 250\nconst REQUEST_TIMEOUT_MS = 30_000\nconst RETRY_ATTEMPTS = 3\nconst RETRY_DELAY_MS = 1000\n\nexport class N8nApiClient {\n constructor(\n private readonly baseUrl: string,\n private readonly apiKey: string,\n private readonly logger: ILogger,\n ) {\n if (!baseUrl || typeof baseUrl !== 'string') {\n throw new GuardError('N8nApiClient: baseUrl must be a non-empty string')\n }\n try {\n new URL(baseUrl)\n } catch {\n throw new GuardError(`N8nApiClient: baseUrl is not a valid URL: \"${baseUrl}\"`)\n }\n if (!apiKey || typeof apiKey !== 'string') {\n throw new GuardError('N8nApiClient: apiKey must be a non-empty string')\n }\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl.replace(/\\/$/, '')}/api/v1${path}`\n this.logger.debug(`n8n ${method} ${path}`)\n\n const isSafe = method === 'GET'\n\n // Non-safe (mutating) requests retry only on transient connection errors — these mean\n // the request never reached the server, so re-sending is safe.\n if (!isSafe) {\n return withRetry(\n () => this.singleRequest<T>(url, method, path, body),\n 2,\n RETRY_DELAY_MS,\n isTransientNetworkError,\n )\n }\n\n return withRetry(\n () => this.singleRequest<T>(url, method, path, body),\n RETRY_ATTEMPTS,\n RETRY_DELAY_MS,\n (err) => err instanceof ProviderError || (err instanceof ApiError && err.statusCode === 429),\n )\n }\n\n private async singleRequest<T>(url: string, method: string, path: string, body?: unknown): Promise<T> {\n let response: Response\n try {\n response = await fetchWithTimeout(url, {\n method,\n headers: {\n 'X-N8N-API-KEY': this.apiKey,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n }, REQUEST_TIMEOUT_MS)\n } catch (err) {\n throw new ProviderError(`Network error calling n8n API: ${path}`, err)\n }\n\n if (!response.ok) {\n let errorBody: unknown\n try {\n errorBody = await response.json()\n } catch {\n errorBody = await response.text().catch(() => '')\n }\n this.logger.error(`n8n API error ${response.status} on ${method} ${path}`, {\n status: response.status,\n body: String(errorBody),\n })\n throw new ApiError(\n `n8n API returned ${response.status} for ${method} ${path}: ${JSON.stringify(errorBody)}`,\n response.status,\n errorBody,\n )\n }\n\n if (response.status === 204) return undefined as T\n return response.json() as Promise<T>\n }\n\n async createWorkflow(workflow: N8nWorkflow): Promise<N8nWorkflowResponse> {\n return this.request<N8nWorkflowResponse>('POST', '/workflows', workflow)\n }\n\n async updateWorkflow(id: string, workflow: N8nWorkflow): Promise<N8nWorkflowResponse> {\n return this.request<N8nWorkflowResponse>('PUT', `/workflows/${id}`, workflow)\n }\n\n async getWorkflow(id: string): Promise<N8nWorkflowResponse> {\n return this.request<N8nWorkflowResponse>('GET', `/workflows/${id}`)\n }\n\n async listWorkflows(): Promise<WorkflowListItem[]> {\n const all: WorkflowListItem[] = []\n let path = `/workflows?limit=${N8N_API_PAGE_SIZE}`\n\n for (;;) {\n const response: N8nWorkflowListResponse = await this.request<N8nWorkflowListResponse>('GET', path)\n for (const w of response.data) {\n all.push({\n id: w.id,\n name: w.name,\n active: w.active,\n createdAt: w.createdAt,\n updatedAt: w.updatedAt,\n ...(w.tags !== undefined ? { tags: w.tags } : {}),\n })\n }\n if (!response.nextCursor) break\n path = `/workflows?limit=${N8N_API_PAGE_SIZE}&cursor=${response.nextCursor}`\n }\n\n return all\n }\n\n async deleteWorkflow(id: string): Promise<void> {\n await this.request<void>('DELETE', `/workflows/${id}`)\n }\n\n async activateWorkflow(id: string): Promise<void> {\n await this.request<void>('POST', `/workflows/${id}/activate`)\n }\n\n async deactivateWorkflow(id: string): Promise<void> {\n await this.request<void>('POST', `/workflows/${id}/deactivate`)\n }\n\n async getExecutions(workflowId?: string, filter?: ExecutionFilter): Promise<ExecutionSummary[]> {\n const params = new URLSearchParams()\n if (workflowId) params.set('workflowId', workflowId)\n if (filter?.status) params.set('status', filter.status)\n const limit = Math.min(filter?.limit ?? 20, EXECUTION_LIMIT_CAP)\n params.set('limit', String(limit))\n if (filter?.cursor) params.set('cursor', filter.cursor)\n\n const qs = params.toString()\n const response = await this.request<N8nExecutionListResponse>('GET', `/executions${qs ? `?${qs}` : ''}`)\n return response.data.map(this.mapExecution)\n }\n\n async getExecution(id: string): Promise<ExecutionDetail> {\n const response = await this.request<N8nExecutionResponse>('GET', `/executions/${id}`)\n return { ...this.mapExecution(response), data: response.data, workflowData: response.workflowData }\n }\n\n async listTags(): Promise<Tag[]> {\n const all: Tag[] = []\n let path = `/tags?limit=${N8N_API_PAGE_SIZE}`\n\n for (;;) {\n const response: N8nTagListResponse = await this.request<N8nTagListResponse>('GET', path)\n for (const t of response.data) {\n all.push({ id: t.id, name: t.name })\n }\n if (!response.nextCursor) break\n path = `/tags?limit=${N8N_API_PAGE_SIZE}&cursor=${response.nextCursor}`\n }\n\n return all\n }\n\n async createTag(name: string): Promise<Tag> {\n const response = await this.request<N8nTagResponse>('POST', '/tags', { name })\n return { id: response.id, name: response.name }\n }\n\n async tagWorkflow(workflowId: string, tagIds: string[]): Promise<void> {\n await this.request<void>('PUT', `/workflows/${workflowId}/tags`, tagIds.map((id) => ({ id })))\n }\n\n async untagWorkflow(workflowId: string, tagIds: string[]): Promise<void> {\n const current = await this.getWorkflow(workflowId)\n const remaining = (current.tags ?? [])\n .filter((t) => !tagIds.includes(t.id))\n .map((t) => ({ id: t.id }))\n await this.request<void>('PUT', `/workflows/${workflowId}/tags`, remaining)\n }\n\n async getNodeTypes(): Promise<N8nNodeTypeInfo[]> {\n try {\n const response = await this.request<N8nNodeTypeListResponse>('GET', '/node-types')\n return response.data ?? response as unknown as N8nNodeTypeInfo[]\n } catch {\n return []\n }\n }\n\n async triggerManual(workflowId: string): Promise<string> {\n const raw = await this.request<Record<string, unknown>>('POST', `/workflows/${workflowId}/run`)\n const inner = raw['data'] as Record<string, unknown> | undefined\n const execId = inner?.['executionId'] ?? raw['executionId']\n if (execId === undefined || execId === null) {\n throw new ProviderError(\n `n8n trigger response missing executionId — got: ${JSON.stringify(raw)}`,\n )\n }\n return String(execId)\n }\n\n async triggerWebhookTest(path: string): Promise<number> {\n const cleanPath = path.startsWith('/') ? path : `/${path}`\n const url = `${this.baseUrl.replace(/\\/$/, '')}/webhook-test${cleanPath}`\n this.logger.debug(`n8n POST webhook-test ${cleanPath}`)\n try {\n const response = await fetchWithTimeout(\n url,\n { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({}) },\n REQUEST_TIMEOUT_MS,\n )\n return response.status\n } catch (err) {\n throw new ProviderError(`Webhook test request failed for path \"${path}\"`, err)\n }\n }\n\n private mapExecution(e: N8nExecutionResponse): ExecutionSummary {\n return {\n id: e.id,\n workflowId: e.workflowId,\n status: e.status,\n startedAt: e.startedAt,\n ...(e.stoppedAt !== undefined ? { stoppedAt: e.stoppedAt } : {}),\n mode: e.mode,\n }\n }\n}\n","import { readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\nimport type { WorkflowMatch } from '../library/types.js'\nimport type { RuleFailureRate } from '../telemetry/reader.js'\nimport type { PatternAnalysis, Pattern } from '../telemetry/pattern-analyzer.js'\nimport type { DesignRequest, BuiltPrompt, SystemPromptBlock } from './types.js'\nimport { SYSTEM_PROMPT_V1 } from './prompts/v1.js'\nimport { scoreToMode } from '../utils/thresholds.js'\nimport { RULE_MITIGATIONS, RULE_EXAMPLES } from '../validation/rule-metadata.js'\n\nconst CRITICAL_SCORE_THRESHOLD = 0.15\n\ntype PromptProfile = 'minimal' | 'standard' | 'rich'\n\nfunction resolveProfile(): PromptProfile {\n const env = process.env['KAIROS_PROMPT_PROFILE']\n if (env === 'minimal' || env === 'standard' || env === 'rich') return env\n return 'standard'\n}\n\nconst PROACTIVE_EXPRESSION_GUIDANCE = `## Expression Syntax Quick Reference\\n\\nAlways use these patterns in expressions:\\n- Access node data: $('NodeName').item.json.field (not $node[\"NodeName\"].json)\\n- Access JSON field: $json.field (not $json.items[0].field)\\n- Single item: $('NodeName').first().json.field\\n- All items: $('NodeName').all()`\n\nexport class PromptBuilder {\n private readonly patternsPath: string\n private readonly profile: PromptProfile\n private _lastActivePatterns: Pattern[] | null = null\n\n constructor(patternsPath?: string, profile?: PromptProfile) {\n this.patternsPath = patternsPath ?? join(homedir(), '.kairos', 'patterns.json')\n this.profile = profile ?? resolveProfile()\n }\n\n private resolveMaxPatterns(): number {\n if (this.profile === 'minimal') return 3\n if (this.profile === 'rich') return 15\n return 10\n }\n\n build(request: DesignRequest, matches: WorkflowMatch[], globalFailureRates: RuleFailureRate[] = [], dynamicCatalog?: string): BuiltPrompt {\n const mode = this.resolveMode(matches)\n const system = this.buildSystem(matches, mode, globalFailureRates, dynamicCatalog, request.description)\n const userMessage = this.buildUserMessage(request, matches, mode)\n return { system, userMessage, mode, matches }\n }\n\n buildCorrectionMessage(\n request: DesignRequest,\n matches: WorkflowMatch[],\n allIssues: string[],\n attempt: number,\n failingRuleIds?: number[],\n ): string {\n const base = this.buildUserMessage(request, matches, this.resolveMode(matches))\n\n let examplesSection = ''\n if (failingRuleIds && failingRuleIds.length > 0) {\n const uniqueRules = [...new Set(failingRuleIds)]\n const exampleLines: string[] = []\n for (const rule of uniqueRules) {\n const ex = RULE_EXAMPLES[rule]\n if (ex) {\n exampleLines.push(`Rule ${rule}:\\n Bad: ${ex.bad}\\n Good: ${ex.good}`)\n }\n }\n if (exampleLines.length > 0) {\n examplesSection = `\\n\\n## Concrete Fix Examples\\n${exampleLines.join('\\n\\n')}`\n }\n }\n\n return `${base}\n\nIMPORTANT: A previous generation attempt (attempt ${attempt}) failed validation with these issues:\n${allIssues.join('\\n')}\n\nFix ALL of the above issues in your new response. Do not repeat any of these mistakes.${examplesSection}`\n }\n\n private resolveMode(matches: WorkflowMatch[]): 'direct' | 'reference' | 'scratch' {\n if (matches.length === 0) return 'scratch'\n const top = matches[0]\n if (!top) return 'scratch'\n return scoreToMode(top.score)\n }\n\n private buildSystem(matches: WorkflowMatch[], mode: 'direct' | 'reference' | 'scratch', globalFailureRates: RuleFailureRate[] = [], dynamicCatalog?: string, description?: string): SystemPromptBlock[] {\n let basePrompt = SYSTEM_PROMPT_V1\n if (dynamicCatalog) {\n basePrompt = basePrompt.replace(\n /## NODE CATALOG — exact type strings and safe typeVersions[\\s\\S]*?(?=## PRE-DELIVERY SELF-CHECK)/,\n dynamicCatalog + '\\n\\n',\n )\n }\n\n const blocks: SystemPromptBlock[] = [\n {\n type: 'text',\n text: basePrompt,\n cache_control: { type: 'ephemeral' },\n },\n ]\n\n if (this.profile !== 'minimal') {\n if (mode === 'reference' && matches.length > 0) {\n const refText = matches\n .slice(0, 3)\n .map((m) => {\n const nodes = m.workflow.workflow.nodes\n .map((n) => ` - ${n.name} (${n.type} v${n.typeVersion})`)\n .join('\\n')\n return `Reference workflow: \"${m.workflow.description}\" (similarity: ${m.score.toFixed(2)})\\nNodes:\\n${nodes}`\n })\n .join('\\n\\n')\n\n blocks.push({\n type: 'text',\n text: `## Similar Workflows From Library (for reference only — adapt, do not copy verbatim)\\n\\n${refText}`,\n })\n }\n\n if (mode === 'direct' && matches[0]) {\n const match = matches[0]\n const json = JSON.stringify(match.workflow.workflow, null, 2)\n if (json.length > 30_000) {\n const nodes = match.workflow.workflow.nodes\n .map((n) => ` - ${n.name} (${n.type} v${n.typeVersion})`)\n .join('\\n')\n blocks.push({\n type: 'text',\n text: `## Closely Matched Workflow (score: ${match.score.toFixed(2)}) — too large for full JSON, using reference:\\nNodes:\\n${nodes}`,\n })\n } else {\n blocks.push({\n type: 'text',\n text: `## Closely Matched Workflow (score: ${match.score.toFixed(2)}) — adapt this structure:\\n\\n${json}`,\n })\n }\n }\n\n if (mode === 'scratch' && matches.length > 0 && matches[0]!.score >= 0.40) {\n const hint = matches[0]!\n const nodeTypes = hint.workflow.workflow.nodes.map((n) => n.type.split('.').pop()).join(', ')\n blocks.push({\n type: 'text',\n text: `## Weak Structural Hint\\nA loosely similar workflow (score: ${hint.score.toFixed(2)}) used these node types: ${nodeTypes}`,\n })\n }\n }\n\n const warnings = this.buildFailureWarnings(matches, globalFailureRates, description)\n if (warnings) {\n blocks.push({ type: 'text', text: warnings })\n }\n\n if (this.profile === 'rich') {\n const expressionRules = new Set([24, 25, 26])\n const expressionAlreadyCovered = (this._lastActivePatterns ?? []).some(p => expressionRules.has(p.rule))\n if (!expressionAlreadyCovered) {\n blocks.push({ type: 'text', text: PROACTIVE_EXPRESSION_GUIDANCE })\n }\n }\n\n return blocks\n }\n\n private loadPatterns(): Pattern[] {\n try {\n const raw = readFileSync(this.patternsPath, 'utf-8')\n const analysis = JSON.parse(raw) as PatternAnalysis\n const patterns = analysis.topFailureRules ?? []\n return patterns.filter(p => typeof p.pipelineStage === 'string' && typeof p.state === 'string')\n } catch {\n return []\n }\n }\n\n getWarnedRules(): number[] {\n const patterns = this._lastActivePatterns ?? this.getActivePatterns(this.resolveMaxPatterns())\n return patterns.map(p => p.rule)\n }\n\n private getActivePatterns(maxCount = 10, description?: string): Pattern[] {\n const all = this.loadPatterns()\n .filter(p => p.state !== 'resolved' && p.confidence > 0)\n\n const regressed = all.filter(p => p.regressed).sort((a, b) => b.compositeScore - a.compositeScore)\n const confirmed = all.filter(p => !p.regressed && p.state === 'confirmed').sort((a, b) => b.compositeScore - a.compositeScore)\n const drafts = all.filter(p => !p.regressed && p.state !== 'confirmed').sort((a, b) => b.compositeScore - a.compositeScore)\n\n const ordered = [...regressed, ...confirmed, ...drafts]\n\n if (this.profile === 'minimal' && description) {\n return this.rankByRelevance(ordered, description).slice(0, maxCount)\n }\n\n return ordered.slice(0, maxCount)\n }\n\n private rankByRelevance(patterns: Pattern[], description: string): Pattern[] {\n const lower = description.toLowerCase()\n const STAGE_KEYWORDS: Record<string, string[]> = {\n credential_injection: ['credential', 'auth', 'api key', 'token', 'oauth', 'smtp', 'imap', 'password', 'secret'],\n connection_wiring: ['connect', 'link', 'wire', 'chain', 'merge', 'branch', 'join'],\n expression_syntax: ['expression', 'variable', 'json', 'field', 'data', '$json', 'item'],\n workflow_structure: ['trigger', 'webhook', 'schedule', 'structure', 'workflow'],\n node_generation: ['node', 'generate', 'create', 'build', 'send', 'fetch', 'email', 'slack', 'http'],\n }\n\n return patterns\n .map(p => {\n const keywords = STAGE_KEYWORDS[p.pipelineStage] ?? []\n const relevanceBoost = keywords.some(kw => lower.includes(kw)) ? 1 : 0\n return { pattern: p, sort: relevanceBoost * 10 + p.compositeScore }\n })\n .sort((a, b) => b.sort - a.sort)\n .map(x => x.pattern)\n }\n\n private buildFailureWarnings(matches: WorkflowMatch[], globalFailureRates: RuleFailureRate[], description?: string): string | null {\n const richPatterns = this.getActivePatterns(this.resolveMaxPatterns(), description)\n this._lastActivePatterns = richPatterns\n\n if (richPatterns.length > 0) {\n return this.buildStageGroupedWarnings(richPatterns, matches)\n }\n\n return this.buildLegacyWarnings(matches, globalFailureRates)\n }\n\n private buildStageGroupedWarnings(patterns: Pattern[], matches: WorkflowMatch[]): string | null {\n const stageLabels: Record<string, string> = {\n credential_injection: 'CREDENTIAL FORMATTING',\n connection_wiring: 'CONNECTION WIRING',\n node_generation: 'NODE GENERATION',\n workflow_structure: 'WORKFLOW STRUCTURE',\n expression_syntax: 'EXPRESSION SYNTAX',\n }\n\n const byStage = new Map<string, Pattern[]>()\n for (const p of patterns) {\n const list = byStage.get(p.pipelineStage) ?? []\n list.push(p)\n byStage.set(p.pipelineStage, list)\n }\n\n const sections: string[] = []\n for (const [stage, stagePatterns] of byStage) {\n const label = stageLabels[stage] ?? stage\n\n const byMitigation = new Map<string, Pattern[]>()\n for (const p of stagePatterns) {\n const key = p.mitigation ?? `rule_${p.rule}`\n const list = byMitigation.get(key) ?? []\n list.push(p)\n byMitigation.set(key, list)\n }\n\n const lines: string[] = []\n for (const group of byMitigation.values()) {\n if (group.length === 1) {\n const p = group[0]!\n const urgency = p.regressed ? 'CRITICAL REGRESSION: ' : (p.compositeScore ?? 0) >= CRITICAL_SCORE_THRESHOLD ? 'CRITICAL: ' : ''\n const statePrefix = p.state === 'confirmed' ? '[CONFIRMED] ' : ''\n const trendSuffix = p.trend === 'worsening' ? ' (GETTING WORSE)' : p.trend === 'improving' ? ' (improving)' : ''\n const remedy = p.mitigation ?? RULE_MITIGATIONS[p.rule]\n const remedyStr = remedy ? `\\n Fix: ${remedy}` : ''\n const ex = RULE_EXAMPLES[p.rule]\n const exampleStr = ex ? `\\n Bad: ${ex.bad}\\n Good: ${ex.good}` : ''\n lines.push(`- ${urgency}${statePrefix}Rule ${p.rule}${trendSuffix}: ${p.exampleMessages[0] ?? 'No example'}${remedyStr}${exampleStr}`)\n } else {\n const ruleNums = group.map(p => p.rule).join(', ')\n const totalFailures = group.reduce((s, p) => s + p.failureCount, 0)\n const hasConfirmed = group.some(p => p.state === 'confirmed')\n const statePrefix = hasConfirmed ? '[CONFIRMED] ' : ''\n const remedy = group[0]!.mitigation\n const remedyStr = remedy ? `\\n Fix: ${remedy}` : ''\n lines.push(`- ${statePrefix}Rules ${ruleNums} (${totalFailures} failures combined): same root cause${remedyStr}`)\n }\n }\n sections.push(`### ${label}\\n${lines.join('\\n')}`)\n }\n\n for (const match of matches) {\n const fps = match.workflow.failurePatterns\n if (!fps?.length) continue\n const coveredRules = new Set(patterns.map(p => p.rule))\n const extra = fps.filter(fp => !coveredRules.has(fp.rule))\n for (const fp of extra) {\n const remedy = RULE_MITIGATIONS[fp.rule]\n const remedyStr = remedy ? ` — Fix: ${remedy}` : ''\n sections.push(`- Rule ${fp.rule}: \"${fp.message}\"${remedyStr} (seen in similar workflows)`)\n }\n }\n\n if (sections.length === 0) return null\n\n return `## Known Failure Patterns — AVOID THESE\\n\\nGrouped by generation stage. Fix these BEFORE outputting your response:\\n\\n${sections.join('\\n\\n')}`\n }\n\n private buildLegacyWarnings(matches: WorkflowMatch[], globalFailureRates: RuleFailureRate[]): string | null {\n const lines: string[] = []\n\n for (const match of matches) {\n const patterns = match.workflow.failurePatterns\n if (!patterns?.length) continue\n for (const fp of patterns) {\n const remedy = RULE_MITIGATIONS[fp.rule]\n const remedyStr = remedy ? ` — Fix: ${remedy}` : ''\n lines.push(`- Rule ${fp.rule}: \"${fp.message}\"${remedyStr} (seen ${fp.occurrences}x in similar workflows)`)\n }\n }\n\n const highFreqRules = globalFailureRates.filter((r) => r.rate >= 0.15)\n for (const rule of highFreqRules) {\n const remedy = RULE_MITIGATIONS[rule.rule]\n const remedyStr = remedy ? ` — Fix: ${remedy}` : ''\n lines.push(`- Rule ${rule.rule}: \"${rule.commonMessage}\"${remedyStr} (fails in ${Math.round(rule.rate * 100)}% of all builds)`)\n }\n\n if (lines.length === 0) return null\n\n const unique = [...new Set(lines)]\n return `## Known Failure Patterns — AVOID THESE\\n\\nPrevious builds frequently failed the following validation rules. Ensure your output does NOT repeat these mistakes:\\n${unique.join('\\n')}`\n }\n\n private buildUserMessage(request: DesignRequest, _matches: WorkflowMatch[], _mode: string): string {\n const namePart = request.name ? `\\nWorkflow name: \"${request.name}\"` : ''\n return `Build a workflow that: ${request.description}${namePart}`\n }\n}\n","export const SYSTEM_PROMPT_V1 = `You are a workflow generation engine for n8n. Your only output is a generate_workflow tool call containing valid n8n workflow JSON. You never respond with prose, explanations, or markdown. If you cannot fulfill the request, set the error field in the tool call.\n\n## HARD RULES — violating any of these causes immediate deployment failure\n\n### Forbidden fields — NEVER include these in the workflow object:\nid, active, createdAt, updatedAt, versionId, meta, isArchived, activeVersionId, activeVersion, pinData, triggerCount, shared, staticData\n\n### Required top-level structure:\n{\n \"name\": \"<descriptive name>\",\n \"nodes\": [...],\n \"connections\": {...},\n \"settings\": {\n \"saveExecutionProgress\": true,\n \"saveManualExecutions\": true,\n \"saveDataErrorExecution\": \"all\",\n \"saveDataSuccessExecution\": \"all\",\n \"executionTimeout\": 3600,\n \"timezone\": \"UTC\",\n \"executionOrder\": \"v1\"\n }\n}\n\n### Node IDs:\n- Every node.id must be a valid UUID v4 (random hex, format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx)\n- Never reuse IDs, never use sequential fake IDs like \"node-1\"\n\n### Credentials:\n- Each credential is keyed by its type string, with an object value containing id and name:\n \"credentials\": { \"slackOAuth2Api\": { \"id\": \"placeholder-id\", \"name\": \"My Slack Credential\" } }\n- Use \"placeholder-id\" as the id — users replace this with their real credential ID from n8n after deployment\n- The credentialsNeeded field in your response declares what credentials the user must configure\n- Never put API keys or tokens directly in node parameters when a credential type exists\n\n### Node names:\n- All node names must be unique within the workflow\n- Use descriptive names: \"Fetch Open Invoices\" not \"HTTP Request 2\"\n\n### Positioning:\n- Trigger node: [250, 300]\n- Each subsequent step: x + 220 minimum\n- Parallel branches: offset y by ±150\n- AI sub-nodes: place below their root node (y + 200)\n\n---\n\n## CONNECTION RULES — the most common source of errors\n\n### Standard connections (main data flow):\n\"NodeA\": { \"main\": [ [ { \"node\": \"NodeB\", \"type\": \"main\", \"index\": 0 } ] ] }\n\n### AI connections — CRITICAL: the SUB-NODE is the SOURCE, NOT the agent/chain:\n\"OpenAI Chat Model\": { \"ai_languageModel\": [ [ { \"node\": \"AI Agent\", \"type\": \"ai_languageModel\", \"index\": 0 } ] ] }\n\"Simple Memory\": { \"ai_memory\": [ [ { \"node\": \"AI Agent\", \"type\": \"ai_memory\", \"index\": 0 } ] ] }\n\"Calculator Tool\": { \"ai_tool\": [ [ { \"node\": \"AI Agent\", \"type\": \"ai_tool\", \"index\": 0 } ] ] }\n\nThe AI Agent node does NOT appear in connections as a source for ai_* types.\nEvery AI Agent must have at least one ai_languageModel sub-node connected.\n\n### IF node — two output ports (0 = true, 1 = false):\n\"IF Check\": { \"main\": [ [{ \"node\": \"True Path\", \"type\": \"main\", \"index\": 0 }], [{ \"node\": \"False Path\", \"type\": \"main\", \"index\": 0 }] ] }\n\n### SplitInBatches — two output ports (0 = done/finished, 1 = loop body per batch):\nConnect output 0 to the node that runs AFTER all batches complete.\nConnect output 1 to the processing chain for each batch. The last node in the chain loops back to SplitInBatches via main input.\n\n### Webhook + RespondToWebhook pattern:\nWhen webhook responseMode is \"responseNode\", you MUST include a respondToWebhook node in the flow.\n\"Webhook\": { \"main\": [[{ \"node\": \"Process Data\", \"type\": \"main\", \"index\": 0 }]] }\n\"Process Data\": { \"main\": [[{ \"node\": \"Respond to Webhook\", \"type\": \"main\", \"index\": 0 }]] }\n\n### Triggers have no incoming connections.\n### Connection keys are NODE NAMES, never node IDs.\n\n### Nested parameters:\nNode parameters like conditions, assignments, and rule intervals MUST include all required nested fields. Do not leave nested objects empty or partially filled.\n\n---\n\n## EXPRESSION SYNTAX — how to reference upstream node data\n\n### Accessing a field from an upstream node:\n- CORRECT: $('NodeName').item.json.field\n- WRONG: $node[\"NodeName\"].json.field ← deprecated accessor, fails at runtime (Rule 24)\n\n### Accessing array items from $json:\n- CORRECT: $json.field ← n8n auto-flattens items; each item is already a flat object\n- WRONG: $json.items[0].field ← do not index into items[] (Rule 25)\n\n### Calling node data — always qualify with .first() or .all():\n- CORRECT: $('NodeName').first().json.field ← single item\n- CORRECT: $('NodeName').all() ← array of all items\n- WRONG: $('NodeName').json ← throws at runtime without .first() or .all() (Rule 26)\n\n---\n\n## NODE CATALOG — exact type strings and safe typeVersions\n\n### Triggers (always at least one required):\nn8n-nodes-base.manualTrigger typeVersion: 1 — testing only\nn8n-nodes-base.scheduleTrigger typeVersion: 1.2 — params: rule.interval[{field, ...}]\nn8n-nodes-base.webhook typeVersion: 2 — params: httpMethod, path, responseMode\nn8n-nodes-base.formTrigger typeVersion: 2.2\nn8n-nodes-base.emailReadImap typeVersion: 2 — cred: imap\nn8n-nodes-base.errorTrigger typeVersion: 1\nn8n-nodes-base.executeWorkflowTrigger typeVersion: 1.1\nn8n-nodes-base.gmailTrigger typeVersion: 1.2 — cred: gmailOAuth2\nn8n-nodes-base.slackTrigger typeVersion: 1 — cred: slackApi\nn8n-nodes-base.telegramTrigger typeVersion: 1.2 — cred: telegramApi\nn8n-nodes-base.githubTrigger typeVersion: 1 — cred: githubApi\nn8n-nodes-base.airtableTrigger typeVersion: 1 — cred: airtableTokenApi\nn8n-nodes-base.notionTrigger typeVersion: 1 — cred: notionApi\n@n8n/n8n-nodes-langchain.chatTrigger typeVersion: 1.1 — pairs with AI Agent\n\n### Core logic:\nn8n-nodes-base.code typeVersion: 2 — params: mode, jsCode\nn8n-nodes-base.httpRequest typeVersion: 4.2 — params: method, url, [sendBody, jsonBody, sendHeaders, headerParameters]\nn8n-nodes-base.set typeVersion: 3.4 — params: assignments.assignments[{id, name, value, type}]\nn8n-nodes-base.if typeVersion: 2.2 — params: conditions.conditions[{id, leftValue, rightValue, operator}], combinator\nn8n-nodes-base.switch typeVersion: 3.2 — multi-branch routing\nn8n-nodes-base.filter typeVersion: 2.2 — params: conditions (same as IF), 1 output\nn8n-nodes-base.merge typeVersion: 3 — modes: append/combine/chooseBranch\nn8n-nodes-base.splitInBatches typeVersion: 3 — output 0=done, output 1=loop body\nn8n-nodes-base.wait typeVersion: 1.1\nn8n-nodes-base.executeWorkflow typeVersion: 1.2\nn8n-nodes-base.respondToWebhook typeVersion: 1.1 — required when webhook responseMode is \"responseNode\"\nn8n-nodes-base.noOp typeVersion: 1\nn8n-nodes-base.splitOut typeVersion: 1\nn8n-nodes-base.aggregate typeVersion: 1\nn8n-nodes-base.stickyNote typeVersion: 1 — never connected, canvas annotation only\n\n### Email / messaging:\nn8n-nodes-base.emailSend typeVersion: 2.1 — cred: smtp\nn8n-nodes-base.slack typeVersion: 2.2 — cred: slackOAuth2Api — params: resource, operation, select, channelId{__rl}, text\nn8n-nodes-base.telegram typeVersion: 1.2 — cred: telegramApi\nn8n-nodes-base.discord typeVersion: 2 — cred: discordWebhookApi\n\n### Google:\nn8n-nodes-base.gmail typeVersion: 2.1 — cred: gmailOAuth2 — params: resource, operation\nn8n-nodes-base.googleSheets typeVersion: 4.5 — cred: googleSheetsOAuth2Api — params: resource, operation, documentId{__rl}, sheetName{__rl}\nn8n-nodes-base.googleDrive typeVersion: 3 — cred: googleDriveOAuth2Api\nn8n-nodes-base.googleCalendar typeVersion: 1.3 — cred: googleCalendarOAuth2Api\n\n### Productivity:\nn8n-nodes-base.notion typeVersion: 2.2 — cred: notionApi\nn8n-nodes-base.airtable typeVersion: 2.1 — cred: airtableTokenApi\nn8n-nodes-base.github typeVersion: 1.1 — cred: githubApi\nn8n-nodes-base.jira typeVersion: 1 — cred: jiraSoftwareCloudApi\nn8n-nodes-base.hubspot typeVersion: 2.1 — cred: hubspotOAuth2Api\n\n### Databases:\nn8n-nodes-base.postgres typeVersion: 2.5 — cred: postgres\nn8n-nodes-base.mySql typeVersion: 2.4 — cred: mySql\nn8n-nodes-base.redis typeVersion: 1 — cred: redis\nn8n-nodes-base.supabase typeVersion: 1 — cred: supabaseApi\nn8n-nodes-base.awsS3 typeVersion: 2 — cred: aws\n\n### AI — Root nodes (sit on main data flow, receive ai_* connections as TARGETS):\n@n8n/n8n-nodes-langchain.agent typeVersion: 1.9 — params: promptType, text (if define), options.systemMessage\n@n8n/n8n-nodes-langchain.chainLlm typeVersion: 1.5\n@n8n/n8n-nodes-langchain.chainRetrievalQa typeVersion: 1.4\n@n8n/n8n-nodes-langchain.openAi typeVersion: 1.8 — cred: openAiApi — standalone node, calls OpenAI directly without sub-nodes\n@n8n/n8n-nodes-langchain.anthropic typeVersion: 1 — cred: anthropicApi — standalone node, calls Anthropic directly without sub-nodes\n\n### AI — Sub-nodes (sources of ai_* connections, wire INTO root nodes above):\n@n8n/n8n-nodes-langchain.lmChatOpenAi typeVersion: 1.7 — cred: openAiApi — ai_languageModel — use with agent/chain, NOT standalone\n@n8n/n8n-nodes-langchain.lmChatAnthropic typeVersion: 1.3 — cred: anthropicApi — ai_languageModel — use with agent/chain, NOT standalone\n@n8n/n8n-nodes-langchain.lmChatGoogleGemini typeVersion: 1 — cred: googlePalmApi — ai_languageModel\n@n8n/n8n-nodes-langchain.memoryBufferWindow typeVersion: 1.3 — — ai_memory\n@n8n/n8n-nodes-langchain.toolWorkflow typeVersion: 2 — — ai_tool\n@n8n/n8n-nodes-langchain.toolCode typeVersion: 1.1 — — ai_tool\n@n8n/n8n-nodes-langchain.toolHttpRequest typeVersion: 1.1 — — ai_tool\n@n8n/n8n-nodes-langchain.toolCalculator typeVersion: 1 — — ai_tool\n\n### Resource locator (__rl) format (Google / Slack / Notion modern nodes):\n{ \"__rl\": true, \"mode\": \"id\", \"value\": \"ACTUAL_ID\" }\n{ \"__rl\": true, \"mode\": \"name\", \"value\": \"#channel-name\" }\n\n### App node parameter pattern:\n{ \"resource\": \"message\", \"operation\": \"send\", ...operation-specific fields }\n\n### Schedule Trigger — daily at 9am example:\n{ \"rule\": { \"interval\": [{ \"field\": \"days\", \"daysInterval\": 1, \"triggerAtHour\": 9, \"triggerAtMinute\": 0 }] } }\nCron: { \"rule\": { \"interval\": [{ \"field\": \"cronExpression\", \"expression\": \"0 9 * * 1-5\" }] } }\n\n---\n\n## PRE-DELIVERY SELF-CHECK (do this before calling the tool):\n1. Every connection source/target name exists in nodes array\n2. No duplicate node names\n3. No duplicate node IDs\n4. No forbidden fields at the workflow root\n5. At least one trigger node present\n6. Every AI Agent has an ai_languageModel sub-node\n7. settings block is complete with executionOrder: \"v1\"\n8. No deprecated $node[\"NodeName\"].json — use $('NodeName').item.json.field\n9. No $json.items[0] array indexing — access fields directly as $json.field\n10. No bare $('NodeName').json — always use .first().json.field or .all()\n11. httpRequest URL is a real endpoint (not \"example.com\" or \"YOUR_URL\")\n12. code nodes contain actual logic — not empty or comment-only\n13. Slack message nodes have a channel specified (channelId or channel)\n14. Gmail send nodes have a recipient (to field non-empty)\n15. if nodes have at least one condition in conditions.conditions[]\n16. set nodes have at least one entry in assignments.assignments[]\n17. scheduleTrigger has at least one rule in rule.interval[]\n18. webhook path is relative (no spaces, no leading slash, no http://)\n\n---\n\nRespond ONLY with a generate_workflow tool call. No prose. No markdown outside the tool call.\nIf the request is impossible or unclear, set the error field instead of generating a workflow.`\n","export type PipelineStage = 'node_generation' | 'credential_injection' | 'connection_wiring' | 'workflow_structure' | 'expression_syntax'\n\nexport const VALIDATOR_RULE_IDS: number[] = Array.from({ length: 34 }, (_, i) => i + 1)\n\nexport const RULE_PIPELINE_STAGES: Record<number, PipelineStage> = {\n 1: 'node_generation',\n 2: 'node_generation',\n 3: 'node_generation',\n 4: 'node_generation',\n 5: 'node_generation',\n 6: 'node_generation',\n 7: 'node_generation',\n 8: 'node_generation',\n 9: 'connection_wiring',\n 10: 'connection_wiring',\n 11: 'connection_wiring',\n 12: 'workflow_structure',\n 13: 'node_generation',\n 14: 'workflow_structure',\n 15: 'node_generation',\n 16: 'node_generation',\n 17: 'credential_injection',\n 18: 'connection_wiring',\n 19: 'node_generation',\n 20: 'connection_wiring',\n 21: 'workflow_structure',\n 22: 'workflow_structure',\n 23: 'node_generation',\n 24: 'expression_syntax',\n 25: 'expression_syntax',\n 26: 'expression_syntax',\n 27: 'node_generation',\n 28: 'node_generation',\n 29: 'node_generation',\n 30: 'node_generation',\n 31: 'node_generation',\n 32: 'node_generation',\n 33: 'node_generation',\n 34: 'node_generation',\n}\n\nexport interface RuleExample {\n bad: string\n good: string\n}\n\nexport const RULE_EXAMPLES: Record<number, RuleExample> = {\n 17: {\n bad: '\"credentials\": { \"slackOAuth2Api\": \"my-token\" }',\n good: '\"credentials\": { \"slackOAuth2Api\": { \"id\": \"placeholder-id\", \"name\": \"My Slack OAuth\" } }',\n },\n 24: {\n bad: '$node[\"Fetch Data\"].json.email',\n good: \"$('Fetch Data').item.json.email\",\n },\n 25: {\n bad: '$json.items[0].email',\n good: '$json.email',\n },\n 26: {\n bad: \"$('Fetch Data').json.email\",\n good: \"$('Fetch Data').first().json.email\",\n },\n 27: {\n bad: '\"url\": \"https://example.com/api/data\"',\n good: '\"url\": \"https://api.yourservice.com/v1/endpoint\"',\n },\n 28: {\n bad: '\"jsCode\": \"// TODO: implement this\"',\n good: '\"jsCode\": \"return items.map(item => ({ json: { result: item.json.value * 2 } }))\"',\n },\n 29: {\n bad: '\"channelId\": \"\"',\n good: '\"channelId\": { \"__rl\": true, \"value\": \"C0123456789\", \"mode\": \"id\" }',\n },\n 30: {\n bad: '\"operation\": \"send\", \"to\": \"\"',\n good: '\"operation\": \"send\", \"to\": \"recipient@example.com\"',\n },\n 31: {\n bad: '\"conditions\": { \"combinator\": \"and\", \"conditions\": [] }',\n good: '\"conditions\": { \"combinator\": \"and\", \"conditions\": [{ \"leftValue\": \"={{ $json.status }}\", \"rightValue\": \"active\", \"operator\": { \"type\": \"string\", \"operation\": \"equals\" } }] }',\n },\n 32: {\n bad: '\"assignments\": { \"assignments\": [] }',\n good: '\"assignments\": { \"assignments\": [{ \"id\": \"f1\", \"name\": \"status\", \"value\": \"processed\", \"type\": \"string\" }] }',\n },\n 33: {\n bad: '\"rule\": { \"interval\": [] }',\n good: '\"rule\": { \"interval\": [{ \"field\": \"cronExpression\", \"expression\": \"0 9 * * 1-5\" }] }',\n },\n 34: {\n bad: '\"path\": \"/my webhook\"',\n good: '\"path\": \"my-webhook\"',\n },\n}\n\nexport const RULE_MITIGATIONS: Record<number, string> = {\n 1: 'Provide a non-empty workflow name string',\n 2: 'Include at least one node in the nodes array',\n 3: 'Every node must have a unique UUID v4 string as its id field',\n 4: 'Ensure all node ids are unique — no two nodes can share the same id',\n 5: 'Every node must have a non-empty type string',\n 6: 'Every node must have a positive integer typeVersion',\n 7: 'Every node must have a position array of exactly [x, y] numbers',\n 8: 'Every node must have a non-empty name string',\n 9: 'connections must be a plain object (use {} if no connections)',\n 10: 'Every node name in connections (source and target) must exactly match a name in the nodes array',\n 11: 'Every non-trigger node should have at least one incoming connection',\n 12: 'Remove forbidden fields: id, active, createdAt, updatedAt, versionId, meta, tags — these are server-assigned',\n 13: 'workflow.settings must be a plain object if present',\n 14: 'Include at least one trigger node (e.g. scheduleTrigger, webhookTrigger, manualTrigger, or service-specific)',\n 15: 'Node type strings must be fully qualified: \"n8n-nodes-base.httpRequest\" not just \"httpRequest\"',\n 16: 'All node names must be unique within the workflow',\n 17: 'Each credential entry must be keyed by credential type with an object value: { \"slackOAuth2Api\": { \"id\": \"placeholder-id\", \"name\": \"My Credential\" } } — the key is the credential type, the value has id and name strings',\n 18: 'AI sub-nodes (languageModel, memory, tool) must be the CONNECTION SOURCE pointing TO the agent — not the reverse',\n 19: 'Use known safe typeVersion values for each node type',\n 20: 'Remove connection cycles — ensure no node can reach itself through the connection graph',\n 21: 'When using webhook with responseMode \"responseNode\", include a respondToWebhook node in the flow',\n 22: 'Ensure all required parameters are set for each node type (e.g. webhook needs httpMethod and path)',\n 23: 'Use node types that exist in the n8n registry — check with kairos_sync',\n 24: 'Use modern accessor syntax: $(\"NodeName\").item.json.field instead of deprecated $node[\"NodeName\"].json.field',\n 25: 'Access item fields directly with $json.field — n8n flattens items automatically, do not use $json.items[0]',\n 26: 'Use $(\"NodeName\").first().json.field or $(\"NodeName\").all() — bare $(\"NodeName\").json without .first() or .all() throws at runtime',\n 27: 'Replace placeholder URLs with your actual API endpoint — do not use \"example.com\" or \"YOUR_URL\" patterns',\n 28: 'Add executable code to the code node — empty or comment-only code nodes do nothing at runtime',\n 29: 'Set the channel parameter for Slack message operations (channelId with __rl object, or channel as string)',\n 30: 'Set the to parameter for Gmail send operations with at least one recipient email address',\n 31: 'Add at least one condition to the if node — conditions.conditions array must be non-empty',\n 32: 'Add field assignments to the set node — assignments.assignments array must be non-empty for typeVersion 3.x',\n 33: 'Add at least one schedule rule to scheduleTrigger — rule.interval array must have at least one entry',\n 34: 'Webhook path must be a relative path without spaces, leading slashes, or protocol prefixes (e.g. \"my-hook\")',\n}\n","import { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { readTelemetryEvents } from './event-reader.js'\n\nexport interface RuleFailureRate {\n rule: number\n failureCount: number\n totalBuilds: number\n rate: number\n commonMessage: string\n}\n\nexport class TelemetryReader {\n private readonly dir: string\n private cache: RuleFailureRate[] | null = null\n private cacheTime = 0\n\n constructor(dir?: string) {\n this.dir = dir ?? join(homedir(), '.kairos', 'telemetry')\n }\n\n async getFailureRates(days = 30): Promise<RuleFailureRate[]> {\n const now = Date.now()\n if (this.cache && now - this.cacheTime < 5 * 60 * 1000) {\n return this.cache\n }\n\n const events = await this.readRecentEvents(days)\n\n const buildSessions = new Set(\n events\n .filter((e) => e.eventType === 'build_complete')\n .map((e) => e.runId ?? e.sessionId),\n )\n const MIN_BUILDS_FOR_RATES = 3\n if (buildSessions.size < MIN_BUILDS_FOR_RATES) return []\n\n const ruleSessions = new Map<number, { sessions: Set<string>; messages: Map<string, number> }>()\n\n for (const event of events) {\n if (event.eventType !== 'generation_attempt') continue\n const eventKey = event.runId ?? event.sessionId\n if (!buildSessions.has(eventKey)) continue\n const data = event.data as { validationPassed?: boolean; issues?: Array<{ rule: number; message: string }> }\n if (data.validationPassed || !data.issues) continue\n\n for (const issue of data.issues) {\n const entry = ruleSessions.get(issue.rule) ?? { sessions: new Set(), messages: new Map() }\n entry.sessions.add(eventKey)\n entry.messages.set(issue.message, (entry.messages.get(issue.message) ?? 0) + 1)\n ruleSessions.set(issue.rule, entry)\n }\n }\n\n const rates: RuleFailureRate[] = []\n for (const [rule, entry] of ruleSessions) {\n let topMessage = ''\n let topCount = 0\n for (const [msg, count] of entry.messages) {\n if (count > topCount) {\n topMessage = msg\n topCount = count\n }\n }\n rates.push({\n rule,\n failureCount: entry.sessions.size,\n totalBuilds: buildSessions.size,\n rate: entry.sessions.size / buildSessions.size,\n commonMessage: topMessage,\n })\n }\n\n rates.sort((a, b) => b.rate - a.rate)\n this.cache = rates\n this.cacheTime = now\n return rates\n }\n\n private async readRecentEvents(days: number) {\n return readTelemetryEvents(this.dir, days)\n }\n}\n","import { readdir } from 'node:fs/promises'\nimport { createReadStream } from 'node:fs'\nimport { join } from 'node:path'\nimport { createInterface } from 'node:readline'\n\nexport interface RawTelemetryEvent {\n eventType: string\n sessionId: string\n runId?: string\n data: Record<string, unknown>\n fileDate: string\n}\n\nexport async function readTelemetryEvents(dir: string, days: number): Promise<RawTelemetryEvent[]> {\n let files: string[]\n try {\n files = await readdir(dir)\n } catch {\n return []\n }\n\n const cutoff = new Date()\n cutoff.setDate(cutoff.getDate() - days)\n const cutoffStr = cutoff.toISOString().slice(0, 10)\n\n const todayStr = new Date().toISOString().slice(0, 10)\n const datePattern = /^\\d{4}-\\d{2}-\\d{2}\\.jsonl$/\n const recentFiles = files\n .filter(f => datePattern.test(f) && f >= cutoffStr && f <= `${todayStr}.jsonl`)\n .sort()\n\n const events: RawTelemetryEvent[] = []\n for (const file of recentFiles) {\n const fileDate = file.replace('.jsonl', '')\n try {\n const rl = createInterface({\n input: createReadStream(join(dir, file), 'utf-8'),\n crlfDelay: Infinity,\n })\n for await (const line of rl) {\n if (!line.trim()) continue\n try {\n events.push({ ...JSON.parse(line), fileDate })\n } catch { /* skip malformed */ }\n }\n } catch { /* skip unreadable */ }\n }\n return events\n}\n","import { writeFile, readFile as fsReadFile, appendFile, mkdir, rename } from 'node:fs/promises'\nimport { readTelemetryEvents } from './event-reader.js'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\nimport { RULE_MITIGATIONS, RULE_PIPELINE_STAGES, VALIDATOR_RULE_IDS, type PipelineStage } from '../validation/rule-metadata.js'\n\nexport interface CredentialFailure {\n type: string\n count: number\n}\n\nexport type PatternState = 'draft' | 'confirmed' | 'resolved'\nexport type PatternTrend = 'new' | 'worsening' | 'stable' | 'improving'\nexport type { PipelineStage } from '../validation/rule-metadata.js'\n\nexport interface ScoringFactors {\n rawConfidence: number\n impact: number\n recency: number\n stickinessBoost: number\n}\n\nexport interface Pattern {\n rule: number\n failureCount: number\n confidence: number\n compositeScore: number\n scoringFactors: ScoringFactors\n state: PatternState\n trend: PatternTrend\n pipelineStage: PipelineStage\n exampleMessages: string[]\n mitigation: string | null\n resolvedAt?: string\n regressed?: boolean\n workflowTypeBreakdown?: Record<string, number>\n}\n\nexport interface DriftAlert {\n type: 'stale_pattern' | 'uncovered_rule' | 'missing_mitigation' | 'missing_stage_mapping'\n rule: number\n message: string\n}\n\nexport interface DriftReport {\n healthy: boolean\n alerts: DriftAlert[]\n coveredRules: number\n totalRules: number\n}\n\nexport interface WarningEffectiveness {\n rule: number\n timesWarned: number\n timesWarnedAndPassed: number\n timesWarnedAndFailed: number\n effectivenessRate: number\n}\n\nexport interface SessionSummary {\n sessionId: string\n date: string\n description: string\n workflowType: string | null\n attempts: number\n success: boolean\n failedRules: number[]\n workflowName: string | null\n}\n\nexport interface PatternAnalysis {\n schemaVersion: number\n generatedAt: string\n summary: {\n totalBuilds: number\n totalAttempts: number\n firstTryPassRate: number\n correctionRate: number\n singleAttemptFailRate: number\n avgDurationMs: number\n totalTokensInput: number\n totalTokensOutput: number\n attemptDistribution?: Record<number, number>\n }\n topFailureRules: Pattern[]\n failingCredentialTypes: CredentialFailure[]\n drift: DriftReport\n warningEffectiveness: WarningEffectiveness[]\n ruleCoOccurrence?: Array<{ rules: [number, number]; count: number }>\n}\n\nconst PATTERN_SCHEMA_VERSION = 2\n\n\nexport class PatternAnalyzer {\n private readonly telemetryDir: string\n private readonly outputDir: string\n private _cachedEvents: Awaited<ReturnType<typeof readTelemetryEvents>> | null = null\n private _cachedPreviousPatterns: Pattern[] | null = null\n\n constructor(telemetryDir?: string) {\n const defaultDir = join(homedir(), '.kairos', 'telemetry')\n this.telemetryDir = telemetryDir ?? defaultDir\n this.outputDir = telemetryDir\n ? join(telemetryDir, '..')\n : join(homedir(), '.kairos')\n }\n\n private async loadPreviousPatterns(): Promise<Pattern[]> {\n if (this._cachedPreviousPatterns !== null) return this._cachedPreviousPatterns\n try {\n const raw = await fsReadFile(join(this.outputDir, 'patterns.json'), 'utf-8')\n const prev = JSON.parse(raw) as PatternAnalysis & { schemaVersion?: number }\n const version = prev.schemaVersion ?? 0\n const patterns = prev.topFailureRules ?? []\n this._cachedPreviousPatterns = version === PATTERN_SCHEMA_VERSION\n ? patterns\n : this.migratePatterns(patterns, version)\n } catch {\n this._cachedPreviousPatterns = []\n }\n return this._cachedPreviousPatterns\n }\n\n private migratePatterns(patterns: Pattern[], fromVersion: number): Pattern[] {\n let migrated = patterns\n if (fromVersion < 1) {\n migrated = migrated.map(p => ({\n ...p,\n compositeScore: p.compositeScore ?? 0,\n scoringFactors: p.scoringFactors ?? { rawConfidence: 0, impact: 0, recency: 0, stickinessBoost: 0 },\n pipelineStage: p.pipelineStage ?? ('node_generation' as PipelineStage),\n }))\n }\n if (fromVersion < 2) {\n migrated = migrated.map(p => {\n const sf = p.scoringFactors ?? { rawConfidence: 0, impact: 0, recency: 0, stickinessBoost: 0 }\n return {\n ...p,\n scoringFactors: {\n ...sf,\n stickinessBoost: sf.stickinessBoost ?? (sf as unknown as Record<string, number>)['validationBoost'] ?? 0,\n },\n }\n })\n }\n return migrated\n }\n\n async analyze(days = 30): Promise<PatternAnalysis> {\n const previousPatterns = await this.loadPreviousPatterns()\n const events = await this.readAllEvents(days)\n this._cachedEvents = events\n\n const starts = events.filter(e => e.eventType === 'build_start')\n const attempts = events.filter(e => e.eventType === 'generation_attempt')\n\n const passed = attempts.filter(a =>\n (a.data as { validationPassed?: boolean }).validationPassed === true\n )\n const failed = attempts.filter(a =>\n (a.data as { validationPassed?: boolean }).validationPassed === false\n )\n\n const ruleFailures = new Map<number, { count: number; sessions: Set<string>; recencyWeights: number[]; allMessages: string[]; workflowTypes: Map<string, number> }>()\n const credentialFailures = new Map<string, number>()\n\n for (const a of failed) {\n const weight = this.recencyWeight(a.fileDate)\n const buildId = a.runId ?? a.sessionId\n const data = a.data as { issues?: Array<{ rule: number; severity?: string; message: string }>; workflowType?: string | null }\n for (const issue of data.issues ?? []) {\n if (issue.severity === 'warn') continue\n const entry = ruleFailures.get(issue.rule) ?? { count: 0, sessions: new Set<string>(), recencyWeights: [], allMessages: [], workflowTypes: new Map<string, number>() }\n entry.count++\n entry.sessions.add(buildId)\n entry.recencyWeights.push(weight)\n entry.allMessages.push(issue.message)\n if (data.workflowType) {\n entry.workflowTypes.set(data.workflowType, (entry.workflowTypes.get(data.workflowType) ?? 0) + 1)\n }\n ruleFailures.set(issue.rule, entry)\n\n if (issue.rule === 17) {\n const credPatterns = [\n /credential\\s+\"([^\"]+)\"/,\n /credentialType[:\\s]+\"?([^\"'\\s]+)\"?/,\n /missing\\s+credential\\s+(?:for\\s+)?[\"']?([^\"'\\s]+)/i,\n ]\n let credType = 'unknown'\n for (const re of credPatterns) {\n const m = issue.message.match(re)\n if (m?.[1]) { credType = m[1]; break }\n }\n credentialFailures.set(credType, (credentialFailures.get(credType) ?? 0) + 1)\n }\n }\n }\n\n // Event-weighted midpoint: find date where ~50% of failed events occurred before it\n const failedByDate = new Map<string, number>()\n for (const a of failed) {\n failedByDate.set(a.fileDate, (failedByDate.get(a.fileDate) ?? 0) + 1)\n }\n const sortedFailDates = [...failedByDate.entries()].sort((a, b) => a[0].localeCompare(b[0]))\n const hasTrendData = sortedFailDates.length >= 3\n let midDate = ''\n if (hasTrendData) {\n const halfTotal = failed.length / 2\n let cumulative = 0\n for (const [date, count] of sortedFailDates) {\n cumulative += count\n if (cumulative >= halfTotal) { midDate = date; break }\n }\n }\n const ruleTrends = new Map<number, { older: number; newer: number }>()\n if (hasTrendData) {\n for (const a of failed) {\n const data = a.data as { issues?: Array<{ rule: number }> }\n const isNewer = a.fileDate > midDate\n for (const issue of data.issues ?? []) {\n const entry = ruleTrends.get(issue.rule) ?? { older: 0, newer: 0 }\n if (isNewer) entry.newer++\n else entry.older++\n ruleTrends.set(issue.rule, entry)\n }\n }\n }\n\n const sessions = new Map<string, typeof attempts>()\n for (const a of attempts) {\n const buildId = a.runId ?? a.sessionId\n const list = sessions.get(buildId) ?? []\n list.push(a)\n sessions.set(buildId, list)\n }\n\n let firstTryPass = 0\n let correctionNeeded = 0\n let singleAttemptFail = 0\n for (const sessionAttempts of sessions.values()) {\n const lastAttempt = sessionAttempts[sessionAttempts.length - 1]!\n const lastPassed = (lastAttempt.data as { validationPassed?: boolean }).validationPassed === true\n\n if (sessionAttempts.length === 1 && lastPassed) {\n firstTryPass++\n } else if (sessionAttempts.length > 1 && lastPassed) {\n correctionNeeded++\n } else {\n singleAttemptFail++\n }\n }\n\n const durations = attempts\n .map(a => (a.data as { durationMs?: number }).durationMs)\n .filter((d): d is number => typeof d === 'number' && d > 0)\n const avgDuration = durations.length > 0\n ? durations.reduce((s, d) => s + d, 0) / durations.length\n : 0\n\n const totalInput = attempts.reduce((s, a) =>\n s + ((a.data as { tokensInput?: number }).tokensInput ?? 0), 0)\n const totalOutput = attempts.reduce((s, a) =>\n s + ((a.data as { tokensOutput?: number }).tokensOutput ?? 0), 0)\n\n const totalSessions = Math.max(sessions.size, 1)\n\n // Stickiness: rules that persist across consecutive failed attempts within a build (LLM can't self-correct)\n const stickinessCount = new Map<number, number>()\n for (const sessionAttempts of sessions.values()) {\n if (sessionAttempts.length < 2) continue\n for (let i = 0; i < sessionAttempts.length - 1; i++) {\n const curr = sessionAttempts[i]!.data as { validationPassed?: boolean; issues?: Array<{ rule: number }> }\n const next = sessionAttempts[i + 1]!.data as { validationPassed?: boolean; issues?: Array<{ rule: number }> }\n if (curr.validationPassed !== false || next.validationPassed !== false) continue\n const currRules = new Set((curr.issues ?? []).map(iss => iss.rule))\n const nextRules = new Set((next.issues ?? []).map(iss => iss.rule))\n for (const rule of currRules) {\n if (nextRules.has(rule)) {\n stickinessCount.set(rule, (stickinessCount.get(rule) ?? 0) + 1)\n }\n }\n }\n }\n\n const CONFIRMED_THRESHOLD = 3\n const BUILDS_SINCE_LAST_FAILURE_THRESHOLD = 5\n const RESOLVED_TTL_DAYS = 90\n\n const activePatterns: Pattern[] = [...ruleFailures.entries()]\n .map(([rule, entry]) => {\n const t = ruleTrends.get(rule) ?? { older: 0, newer: 0 }\n const rawConfidence = Math.min(entry.sessions.size / totalSessions, 1)\n const state = (entry.count >= CONFIRMED_THRESHOLD ? 'confirmed' : 'draft') as PatternState\n const avgRecency = entry.recencyWeights.length > 0\n ? entry.recencyWeights.reduce((s, w) => s + w, 0) / entry.recencyWeights.length\n : 1\n const stickiness = stickinessCount.get(rule) ?? 0\n const { compositeScore, factors } = this.computeCompositeScore(rawConfidence, entry.count, state, avgRecency, stickiness)\n\n const pattern: Pattern = {\n rule,\n failureCount: entry.count,\n confidence: Math.round(rawConfidence * 1000) / 1000,\n compositeScore,\n scoringFactors: factors,\n state,\n trend: this.classifyTrend(t.older, t.newer),\n pipelineStage: RULE_PIPELINE_STAGES[rule] ?? 'node_generation' as PipelineStage,\n exampleMessages: this.deduplicateMessages(entry.allMessages),\n mitigation: RULE_MITIGATIONS[rule] ?? null,\n }\n\n if (entry.workflowTypes.size > 0) {\n pattern.workflowTypeBreakdown = Object.fromEntries(entry.workflowTypes)\n }\n\n return pattern\n })\n .sort((a, b) => b.compositeScore - a.compositeScore)\n\n const activeRules = new Set(activePatterns.map(p => p.rule))\n\n // Detect regressions: previously resolved rules that are failing again\n for (const p of activePatterns) {\n const prev = previousPatterns.find(pp => pp.rule === p.rule)\n if (prev?.state === 'resolved') {\n p.trend = 'worsening' as PatternTrend\n p.regressed = true\n }\n }\n\n // Per-rule last failure date for resolved threshold\n const ruleLastFailureDate = new Map<number, string>()\n for (const a of failed) {\n const data = a.data as { issues?: Array<{ rule: number }> }\n for (const issue of data.issues ?? []) {\n const existing = ruleLastFailureDate.get(issue.rule)\n if (!existing || a.fileDate > existing) {\n ruleLastFailureDate.set(issue.rule, a.fileDate)\n }\n }\n }\n\n // Newly resolved: previously confirmed, no longer failing, enough builds since last failure\n const newlyResolved: Pattern[] = previousPatterns\n .filter(p => {\n if (p.state !== 'confirmed' || activeRules.has(p.rule)) return false\n const lastFailDate = ruleLastFailureDate.get(p.rule) ?? ''\n const buildsSince = starts.filter(s => s.fileDate > lastFailDate).length\n return buildsSince >= BUILDS_SINCE_LAST_FAILURE_THRESHOLD\n })\n .map(p => ({\n ...p,\n state: 'resolved' as PatternState,\n trend: 'improving' as PatternTrend,\n pipelineStage: p.pipelineStage ?? RULE_PIPELINE_STAGES[p.rule] ?? 'node_generation' as PipelineStage,\n confidence: 0,\n compositeScore: 0,\n scoringFactors: { rawConfidence: 0, impact: 0, recency: 0, stickinessBoost: 0 },\n failureCount: 0,\n resolvedAt: new Date().toISOString(),\n }))\n\n // Carry forward resolved patterns within TTL\n const ttlCutoff = new Date()\n ttlCutoff.setDate(ttlCutoff.getDate() - RESOLVED_TTL_DAYS)\n const ttlCutoffStr = ttlCutoff.toISOString()\n\n const carriedResolved: Pattern[] = previousPatterns\n .filter(p => p.state === 'resolved' && !activeRules.has(p.rule)\n && (!p.resolvedAt || p.resolvedAt >= ttlCutoffStr))\n .map(p => ({ ...p }))\n\n // Carry forward confirmed patterns not yet meeting resolved threshold\n const newlyResolvedRules = new Set(newlyResolved.map(p => p.rule))\n const pendingResolution: Pattern[] = previousPatterns\n .filter(p => p.state === 'confirmed' && !activeRules.has(p.rule)\n && !newlyResolvedRules.has(p.rule))\n .map(p => ({ ...p }))\n\n const deduped = [\n ...newlyResolved,\n ...carriedResolved.filter(p => !newlyResolvedRules.has(p.rule)),\n ...pendingResolution,\n ]\n\n const patterns = [...activePatterns, ...deduped]\n\n const credTypes: CredentialFailure[] = [...credentialFailures.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([type, count]) => ({ type, count }))\n\n const drift = this.detectDrift(patterns)\n\n // Warning effectiveness: track how often warned rules were prevented\n const warnEffMap = new Map<number, { warned: number; passed: number; failed: number }>()\n const buildCompletes = events.filter(e => e.eventType === 'build_complete')\n for (const bc of buildCompletes) {\n const bcData = bc.data as { warnedRules?: number[] }\n const warned = bcData.warnedRules ?? []\n if (warned.length === 0) continue\n\n const sessionFailedRules = new Set<number>()\n const sessionAttempts = sessions.get(bc.runId ?? bc.sessionId) ?? []\n for (const a of sessionAttempts) {\n const ad = a.data as { validationPassed?: boolean; issues?: Array<{ rule: number }> }\n if (ad.validationPassed === false) {\n for (const issue of ad.issues ?? []) {\n sessionFailedRules.add(issue.rule)\n }\n }\n }\n\n for (const rule of warned) {\n const entry = warnEffMap.get(rule) ?? { warned: 0, passed: 0, failed: 0 }\n entry.warned++\n if (sessionFailedRules.has(rule)) entry.failed++\n else entry.passed++\n warnEffMap.set(rule, entry)\n }\n }\n\n const warningEffectiveness: WarningEffectiveness[] = [...warnEffMap.entries()]\n .map(([rule, e]) => ({\n rule,\n timesWarned: e.warned,\n timesWarnedAndPassed: e.passed,\n timesWarnedAndFailed: e.failed,\n effectivenessRate: e.warned > 0 ? Math.round((e.passed / e.warned) * 1000) / 1000 : 0,\n }))\n .sort((a, b) => b.timesWarned - a.timesWarned)\n\n // A-3: Rule co-occurrence\n const coOccurrenceMap = new Map<string, number>()\n for (const a of failed) {\n const data = a.data as { issues?: Array<{ rule: number }> }\n const rules = [...new Set((data.issues ?? []).map(i => i.rule))].sort((x, y) => x - y)\n for (let i = 0; i < rules.length; i++) {\n for (let j = i + 1; j < rules.length; j++) {\n const key = `${rules[i]},${rules[j]}`\n coOccurrenceMap.set(key, (coOccurrenceMap.get(key) ?? 0) + 1)\n }\n }\n }\n const ruleCoOccurrence = [...coOccurrenceMap.entries()]\n .filter(([, count]) => count >= 3)\n .map(([key, count]) => {\n const [a, b] = key.split(',').map(Number)\n return { rules: [a!, b!] as [number, number], count }\n })\n .sort((a, b) => b.count - a.count)\n\n // A-5: Session depth (attempt distribution)\n const attemptDistribution: Record<number, number> = {}\n for (const sessionAttempts of sessions.values()) {\n const depth = sessionAttempts.length\n attemptDistribution[depth] = (attemptDistribution[depth] ?? 0) + 1\n }\n\n return {\n schemaVersion: PATTERN_SCHEMA_VERSION,\n generatedAt: new Date().toISOString(),\n summary: {\n totalBuilds: starts.length,\n totalAttempts: attempts.length,\n firstTryPassRate: Math.round((firstTryPass / totalSessions) * 1000) / 1000,\n correctionRate: Math.round((correctionNeeded / totalSessions) * 1000) / 1000,\n singleAttemptFailRate: Math.round((singleAttemptFail / totalSessions) * 1000) / 1000,\n avgDurationMs: Math.round(avgDuration),\n totalTokensInput: totalInput,\n totalTokensOutput: totalOutput,\n attemptDistribution,\n },\n topFailureRules: patterns,\n failingCredentialTypes: credTypes,\n drift,\n warningEffectiveness,\n ruleCoOccurrence,\n }\n }\n\n async analyzeAndSave(days = 30): Promise<PatternAnalysis> {\n const analysis = await this.analyze(days)\n await mkdir(this.outputDir, { recursive: true })\n const outputPath = join(this.outputDir, 'patterns.json')\n const tmpPath = `${outputPath}.tmp`\n await writeFile(tmpPath, JSON.stringify(analysis, null, 2), 'utf-8')\n await rename(tmpPath, outputPath)\n this._cachedPreviousPatterns = null // invalidate so next loadPreviousPatterns reads fresh file\n\n const historySummary = {\n timestamp: analysis.generatedAt,\n totalBuilds: analysis.summary.totalBuilds,\n firstTryPassRate: analysis.summary.firstTryPassRate,\n correctionRate: analysis.summary.correctionRate,\n singleAttemptFailRate: analysis.summary.singleAttemptFailRate,\n activePatternCount: analysis.topFailureRules.filter(p => p.state !== 'resolved').length,\n topRules: analysis.topFailureRules.filter(p => p.state !== 'resolved').slice(0, 5)\n .map(p => ({ rule: p.rule, compositeScore: p.compositeScore, state: p.state })),\n }\n const historyPath = join(this.outputDir, 'pattern-history.jsonl')\n await appendFile(historyPath, JSON.stringify(historySummary) + '\\n', 'utf-8')\n\n const sessions = await this.buildSessionSummaries(days)\n const sessionHistoryPath = join(this.outputDir, 'session-history.json')\n const sessionHistoryTmp = `${sessionHistoryPath}.tmp`\n await writeFile(sessionHistoryTmp, JSON.stringify(sessions, null, 2), 'utf-8')\n await rename(sessionHistoryTmp, sessionHistoryPath)\n\n return analysis\n }\n\n async getSessions(limit = 20): Promise<SessionSummary[]> {\n try {\n const raw = await fsReadFile(join(this.outputDir, 'session-history.json'), 'utf-8')\n const all = JSON.parse(raw) as SessionSummary[]\n return all.slice(-limit)\n } catch { return [] }\n }\n\n private async buildSessionSummaries(days = 30): Promise<SessionSummary[]> {\n const events = this._cachedEvents ?? await this.readAllEvents(days)\n const buildCompletes = events.filter(e => e.eventType === 'build_complete')\n const attemptsByBuild = new Map<string, typeof events>()\n for (const e of events.filter(e => e.eventType === 'generation_attempt')) {\n const buildId = e.runId ?? e.sessionId\n const list = attemptsByBuild.get(buildId) ?? []\n list.push(e)\n attemptsByBuild.set(buildId, list)\n }\n\n const summaries: SessionSummary[] = buildCompletes.map(bc => {\n const data = bc.data as {\n description?: string\n success?: boolean\n totalAttempts?: number\n workflowName?: string | null\n workflowType?: string | null\n }\n\n const sessionAttempts = attemptsByBuild.get(bc.runId ?? bc.sessionId) ?? []\n const failedRules = Array.from(new Set(\n sessionAttempts.flatMap(a => {\n const ad = a.data as { validationPassed?: boolean; issues?: Array<{ rule: number }> }\n if (ad.validationPassed !== false) return []\n return (ad.issues ?? []).map(i => i.rule)\n })\n ))\n\n return {\n sessionId: bc.runId ?? bc.sessionId,\n date: bc.fileDate,\n description: data.description ?? '',\n workflowType: data.workflowType ?? null,\n attempts: data.totalAttempts ?? 1,\n success: data.success ?? false,\n failedRules,\n workflowName: data.workflowName ?? null,\n }\n })\n\n return summaries.sort((a, b) => a.date.localeCompare(b.date))\n }\n\n async getHistory(limit = 20): Promise<unknown[]> {\n try {\n const raw = await fsReadFile(join(this.outputDir, 'pattern-history.jsonl'), 'utf-8')\n return raw.trim().split('\\n').filter(Boolean).map(l => JSON.parse(l)).slice(-limit)\n } catch { return [] }\n }\n\n static fromEnv(): PatternAnalyzer {\n const dir = process.env['KAIROS_TELEMETRY']\n return dir && dir !== 'true' && dir !== 'false'\n ? new PatternAnalyzer(dir)\n : new PatternAnalyzer()\n }\n\n private detectDrift(patterns: Pattern[]): DriftReport {\n const VALIDATOR_RULES = VALIDATOR_RULE_IDS\n const validatorRuleSet = new Set(VALIDATOR_RULES)\n const alerts: DriftAlert[] = []\n\n for (const p of patterns) {\n if (p.state !== 'resolved' && !validatorRuleSet.has(p.rule)) {\n alerts.push({\n type: 'stale_pattern',\n rule: p.rule,\n message: `Pattern references Rule ${p.rule} which does not exist in the current validator (rules 1-34)`,\n })\n }\n }\n\n for (const rule of VALIDATOR_RULES) {\n if (!(rule in RULE_MITIGATIONS)) {\n alerts.push({\n type: 'missing_mitigation',\n rule,\n message: `Rule ${rule} has no mitigation text — if it fails, the system can't advise the LLM how to fix it`,\n })\n }\n if (!(rule in RULE_PIPELINE_STAGES)) {\n alerts.push({\n type: 'missing_stage_mapping',\n rule,\n message: `Rule ${rule} has no pipeline stage mapping — failures won't be grouped correctly`,\n })\n }\n }\n\n const coveredRules = VALIDATOR_RULES.filter(r => r in RULE_MITIGATIONS && r in RULE_PIPELINE_STAGES).length\n\n return {\n healthy: alerts.length === 0,\n alerts,\n coveredRules,\n totalRules: VALIDATOR_RULES.length,\n }\n }\n\n private computeCompositeScore(\n rawConfidence: number,\n sampleSize: number,\n state: PatternState,\n avgRecency: number,\n stickiness: number,\n ): { compositeScore: number; factors: ScoringFactors } {\n const stateWeights: Record<PatternState, number> = { draft: 0.3, confirmed: 0.8, resolved: 0.1 }\n const stateWeight = stateWeights[state]\n const impact = (1 - Math.exp(-sampleSize / 5)) * stateWeight\n const stickinessBoost = Math.min(0.15, stickiness * 0.05)\n const compositeScore = Math.min(Math.round((rawConfidence * impact * avgRecency * (1 + stickinessBoost)) * 1000) / 1000, 1)\n\n return {\n compositeScore,\n factors: {\n rawConfidence: Math.round(rawConfidence * 1000) / 1000,\n impact: Math.round(impact * 1000) / 1000,\n recency: Math.round(avgRecency * 1000) / 1000,\n stickinessBoost: Math.round(stickinessBoost * 1000) / 1000,\n },\n }\n }\n\n private classifyTrend(older: number, newer: number): PatternTrend {\n const total = older + newer\n if (total === 0) return 'stable'\n if (older === 0) return 'new'\n const newerRatio = newer / total\n if (newerRatio >= 0.65) return 'worsening'\n if (newerRatio <= 0.35) return 'improving'\n return 'stable'\n }\n\n private deduplicateMessages(messages: string[], maxCount = 3): string[] {\n const normalize = (msg: string) =>\n msg\n .replace(/[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}/gi, '...')\n .replace(/\\bnode\\s+\"[^\"]+\"/g, 'node \"...\"')\n .replace(/\\s+/g, ' ')\n .trim()\n\n const seen = new Set<string>()\n const unique: string[] = []\n for (const msg of messages) {\n const key = normalize(msg)\n if (!seen.has(key) && unique.length < maxCount) {\n seen.add(key)\n unique.push(msg)\n }\n }\n return unique\n }\n\n private recencyWeight(fileDate: string, halfLifeDays = 30): number {\n const daysAgo = Math.max(0, (Date.now() - new Date(fileDate + 'T12:00:00Z').getTime()) / (1000 * 60 * 60 * 24))\n return Math.max(0.1, Math.exp(-Math.LN2 * daysAgo / halfLifeDays))\n }\n\n private async readAllEvents(days: number) {\n return readTelemetryEvents(this.telemetryDir, days)\n }\n}\n","import type { N8nNodeTypeInfo } from '../providers/n8n/types.js'\nimport type { NodeDefinition } from './registry.js'\nimport { NodeRegistry, DEFAULT_REGISTRY } from './registry.js'\n\nconst TRIGGER_PATTERNS = [/trigger/i, /Trigger$/]\n\nexport interface SyncResult {\n registry: NodeRegistry\n catalogText: string\n nodeCount: number\n newNodes: number\n}\n\nexport class NodeSyncer {\n private readonly baseRegistry: Map<string, NodeDefinition>\n\n constructor() {\n this.baseRegistry = new Map(DEFAULT_REGISTRY.map(d => [d.type, d]))\n }\n\n sync(liveNodes: N8nNodeTypeInfo[]): SyncResult {\n const merged = new Map(this.baseRegistry)\n let newNodes = 0\n\n for (const node of liveNodes) {\n const versions = Array.isArray(node.version) ? node.version : [node.version]\n const isTrigger = TRIGGER_PATTERNS.some(p => p.test(node.name))\n const credentialType = node.credentials?.[0]?.name\n\n const existing = merged.get(node.name)\n if (existing) {\n const allVersions = new Set([...existing.safeTypeVersions, ...versions])\n merged.set(node.name, {\n ...existing,\n safeTypeVersions: [...allVersions].sort((a, b) => a - b),\n })\n } else {\n newNodes++\n merged.set(node.name, {\n type: node.name,\n safeTypeVersions: versions.sort((a, b) => a - b),\n requiredParams: [],\n ...(credentialType ? { credentialType } : {}),\n ...(isTrigger ? { isTrigger: true } : {}),\n })\n }\n }\n\n const definitions = [...merged.values()]\n const registry = new NodeRegistry(definitions)\n const catalogText = this.buildCatalog(definitions)\n\n return { registry, catalogText, nodeCount: definitions.length, newNodes }\n }\n\n private buildCatalog(definitions: NodeDefinition[]): string {\n const triggers = definitions.filter(d => d.isTrigger)\n const regular = definitions.filter(d => !d.isTrigger)\n\n const formatEntry = (d: NodeDefinition): string => {\n const versions = d.safeTypeVersions.join(', ')\n const cred = d.credentialType ? ` — cred: ${d.credentialType}` : ''\n return `${d.type} typeVersion: ${versions}${cred}`\n }\n\n const triggerLines = triggers.map(formatEntry).join('\\n')\n const regularLines = regular.map(formatEntry).join('\\n')\n\n return `## NODE CATALOG — synced from your n8n instance (${definitions.length} node types)\n\n### Triggers:\n${triggerLines}\n\n### Regular nodes:\n${regularLines}`\n }\n}\n","import { appendFile, mkdir } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\nimport { generateUUID } from '../utils/uuid.js'\nimport type { TelemetryEvent } from './types.js'\nimport { TELEMETRY_SCHEMA_VERSION } from './types.js'\n\nexport class TelemetryCollector {\n private readonly dir: string\n readonly sessionId: string\n private dirReady: Promise<void> | null = null\n\n constructor(dir?: string) {\n this.dir = dir ?? join(homedir(), '.kairos', 'telemetry')\n this.sessionId = generateUUID()\n }\n\n async emit(eventType: TelemetryEvent['eventType'], data: Record<string, unknown>, runId?: string): Promise<void> {\n const event: TelemetryEvent = {\n schemaVersion: TELEMETRY_SCHEMA_VERSION,\n timestamp: new Date().toISOString(),\n sessionId: this.sessionId,\n ...(runId ? { runId } : {}),\n eventType,\n data,\n }\n\n if (!this.dirReady) {\n this.dirReady = mkdir(this.dir, { recursive: true }).then(() => {})\n }\n await this.dirReady\n const filename = new Date().toISOString().slice(0, 10) + '.jsonl'\n const filepath = join(this.dir, filename)\n await appendFile(filepath, JSON.stringify(event) + '\\n', 'utf-8')\n }\n}\n","import type { ValidationIssue } from '../errors/validation-error.js'\n\nexport interface TelemetryEvent {\n schemaVersion: number\n timestamp: string\n sessionId: string\n runId?: string\n eventType: 'build_start' | 'generation_attempt' | 'build_complete'\n data: Record<string, unknown>\n}\n\nexport const TELEMETRY_SCHEMA_VERSION = 2\n\nexport interface AttemptMetadata {\n attempt: number\n temperature: number\n durationMs: number\n tokensInput: number\n tokensOutput: number\n validationPassed: boolean\n issues: ValidationIssue[]\n}\n\nexport interface BuildStartData {\n description: string\n model: string\n dryRun: boolean\n}\n\nexport interface GenerationAttemptData {\n description: string\n attempt: number\n temperature: number\n durationMs: number\n tokensInput: number\n tokensOutput: number\n validationPassed: boolean\n issueCount: number\n issues: Array<{ rule: number; severity: 'error' | 'warn'; message: string; nodeId?: string | null; nodeType?: string | null }>\n workflowType?: string | null\n}\n\nexport interface BuildCompleteData {\n description: string\n success: boolean\n totalAttempts: number\n totalDurationMs: number\n totalTokensInput: number\n totalTokensOutput: number\n workflowName: string | null\n workflowId: string | null\n dryRun: boolean\n credentialsNeeded: number\n warnedRules: number[]\n workflowType?: string | null\n}\n","export interface ILogger {\n debug(msg: string, meta?: Record<string, unknown>): void\n info(msg: string, meta?: Record<string, unknown>): void\n warn(msg: string, meta?: Record<string, unknown>): void\n error(msg: string, meta?: Record<string, unknown>): void\n}\n\nexport const nullLogger: ILogger = {\n debug() {},\n info() {},\n warn() {},\n error() {},\n}\n\nconst LEVEL_RANK = { debug: 0, info: 1, warn: 2, error: 3 } as const\ntype LogLevel = keyof typeof LEVEL_RANK\n\nexport interface CreateLoggerOptions {\n level?: LogLevel\n json?: boolean\n destination?: { write(s: string): void }\n}\n\nexport function createLogger(opts: CreateLoggerOptions = {}): ILogger {\n const minRank = LEVEL_RANK[opts.level ?? 'info']\n const json = opts.json ?? false\n const dest = opts.destination ?? { write: (s: string) => process.stderr.write(s) }\n\n function emit(level: LogLevel, msg: string, meta?: Record<string, unknown>) {\n if (LEVEL_RANK[level] < minRank) return\n if (json) {\n const entry: Record<string, unknown> = { level, timestamp: new Date().toISOString(), msg, ...meta }\n dest.write(JSON.stringify(entry) + '\\n')\n } else {\n const metaStr = meta && Object.keys(meta).length > 0\n ? ' ' + Object.entries(meta).map(([k, v]) => `${k}=${JSON.stringify(v)}`).join(' ')\n : ''\n dest.write(`[${level.toUpperCase()}] ${msg}${metaStr}\\n`)\n }\n }\n\n return {\n debug: (msg, meta) => emit('debug', msg, meta),\n info: (msg, meta) => emit('info', msg, meta),\n warn: (msg, meta) => emit('warn', msg, meta),\n error: (msg, meta) => emit('error', msg, meta),\n }\n}\n","const TYPE_KEYWORDS: Array<[string, string]> = [\n ['gmail', 'email'],\n ['imap', 'email'],\n ['smtp', 'email'],\n [' email', 'email'],\n ['slack', 'slack'],\n ['telegram', 'messaging'],\n ['discord', 'messaging'],\n [' sms', 'messaging'],\n ['twilio', 'messaging'],\n ['webhook', 'webhook'],\n ['google sheets', 'data'],\n ['spreadsheet', 'data'],\n ['airtable', 'data'],\n ['notion', 'data'],\n ['github', 'devops'],\n ['gitlab', 'devops'],\n ['schedule', 'schedule'],\n [' cron', 'schedule'],\n ['daily', 'schedule'],\n ['weekly', 'schedule'],\n ['hourly', 'schedule'],\n ['every day', 'schedule'],\n ['every hour', 'schedule'],\n ['every morning', 'schedule'],\n ['postgres', 'database'],\n ['mysql', 'database'],\n ['supabase', 'database'],\n ['redis', 'database'],\n [' database', 'database'],\n [' llm', 'ai'],\n [' gpt', 'ai'],\n ['claude', 'ai'],\n [' agent', 'ai'],\n ['langchain', 'ai'],\n [' ai ', 'ai'],\n [' ai', 'ai'],\n ['http request', 'api'],\n ['rest api', 'api'],\n [' api', 'api'],\n]\n\nexport function inferWorkflowType(description: string): string | null {\n const lower = ' ' + description.toLowerCase()\n for (const [keyword, type] of TYPE_KEYWORDS) {\n if (lower.includes(keyword)) return type\n }\n return null\n}\n"],"mappings":"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","names":["m","import_node_path","import_node_os","import_node_os","import_node_path","import_promises","import_node_fs","import_node_path","import_promises","import_node_path","import_node_os","fsReadFile","e","import_promises","import_node_path","import_node_os","import_node_fs","import_node_path","import_node_os"]}
1
+ {"version":3,"sources":["../src/mcp-server.ts","../src/library/file-library.ts","../src/utils/uuid.ts","../src/utils/thresholds.ts","../src/library/scorer.ts","../src/library/cluster.ts","../src/validation/registry.ts","../src/providers/n8n/types.ts","../src/validation/validator.ts","../src/providers/n8n/stripper.ts","../src/errors/base.ts","../src/errors/api-error.ts","../src/errors/provider-error.ts","../src/errors/guard-error.ts","../src/utils/retry.ts","../src/providers/n8n/api-client.ts","../src/generation/prompt-builder.ts","../src/generation/prompts/v1.ts","../src/validation/rule-metadata.ts","../src/telemetry/reader.ts","../src/telemetry/event-reader.ts","../src/telemetry/pattern-analyzer.ts","../src/validation/node-syncer.ts","../src/telemetry/collector.ts","../src/telemetry/types.ts","../src/utils/logger.ts","../src/utils/workflow-type.ts","../src/utils/node-catalog-cache.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * Kairos MCP Server — decomposed architecture.\n *\n * The host LLM (Claude, GPT, Gemini, whatever) generates the workflow.\n * Kairos provides the knowledge (system prompt, library, failure patterns)\n * and guardrails (validator, deployer). Zero Anthropic API key needed.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'\nimport { createServer } from 'node:http'\nimport { z } from 'zod'\nimport { FileLibrary } from './library/file-library.js'\nimport { N8nValidator } from './validation/validator.js'\nimport { N8nFieldStripper } from './providers/n8n/stripper.js'\nimport { N8nApiClient } from './providers/n8n/api-client.js'\nimport { PromptBuilder } from './generation/prompt-builder.js'\nimport { TelemetryReader } from './telemetry/reader.js'\nimport { PatternAnalyzer } from './telemetry/pattern-analyzer.js'\nimport { NodeSyncer, type SyncResult } from './validation/node-syncer.js'\nimport { TelemetryCollector } from './telemetry/collector.js'\nimport { nullLogger } from './utils/logger.js'\nimport { GuardError } from './errors/guard-error.js'\nimport { generateUUID } from './utils/uuid.js'\nimport { inferWorkflowType } from './utils/workflow-type.js'\nimport type { N8nWorkflow } from './types/workflow.js'\nimport { readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { homedir } from 'node:os'\nimport { fileURLToPath } from 'node:url'\nimport { readCatalogCache, writeCatalogCache } from './utils/node-catalog-cache.js'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8')) as { version: string }\n\nconst library = new FileLibrary()\nlet _validator = new N8nValidator()\n// Accessor so kairos_sync can swap the registry without callers closing over the old instance\nfunction getValidator(): N8nValidator { return _validator }\nconst nodeSyncer = new NodeSyncer()\nlet lastSync: SyncResult | null = null\nconst AUTO_SYNC_TIMEOUT_MS = 5_000 // cap how long kairos_prompt waits for n8n node sync\nconst stripper = new N8nFieldStripper()\nconst promptBuilder = new PromptBuilder(getMcpPatternsPath())\n\nfunction getMcpTelemetry(): TelemetryCollector | null {\n const val = process.env['KAIROS_TELEMETRY']\n if (!val || val === 'false') return null\n return val === 'true' ? new TelemetryCollector() : new TelemetryCollector(val)\n}\n\n/**\n * Derive the patterns.json path from KAIROS_TELEMETRY so the MCP server's\n * PromptBuilder reads from the same location that PatternAnalyzer.fromEnv() writes to.\n */\nfunction getMcpPatternsPath(): string {\n const val = process.env['KAIROS_TELEMETRY']\n if (val && val !== 'false' && val !== 'true') {\n return join(val, '..', 'patterns.json')\n }\n return join(homedir(), '.kairos', 'patterns.json')\n}\n\nconst mcpTelemetry = getMcpTelemetry()\n\ninterface McpBuildSession {\n description: string\n startTime: number\n validateAttempts: number\n warnedRules: number[]\n workflowType: string | null\n matchCount: number\n}\nconst mcpSessions = new Map<string, McpBuildSession>()\nconst SESSION_TTL_MS = 60 * 60 * 1000 // 1 hour: abandon sessions not completed by deploy\n\nfunction evictStaleSessions(): void {\n const cutoff = Date.now() - SESSION_TTL_MS\n for (const [id, session] of mcpSessions) {\n if (session.startTime < cutoff) mcpSessions.delete(id)\n }\n}\n\nfunction getTelemetryReader(): TelemetryReader | null {\n try {\n return new TelemetryReader()\n } catch {\n return null\n }\n}\n\ntype McpMode = 'readonly' | 'validate' | 'deploy'\n\nfunction getMcpMode(): McpMode {\n const mode = process.env['KAIROS_MCP_MODE']?.toLowerCase()\n if (mode === 'readonly' || mode === 'validate') return mode\n return 'deploy'\n}\n\nfunction isAllowed(action: 'deploy' | 'activate' | 'delete'): boolean {\n // readonly and validate modes block all write ops — mode restriction overrides ALLOW_* flags\n const mode = getMcpMode()\n if (mode === 'readonly' || mode === 'validate') return false\n // deploy mode (default): require explicit opt-in via ALLOW_* flags (preserves existing behavior)\n const key = `KAIROS_MCP_ALLOW_${action.toUpperCase()}`\n return process.env[key] === 'true'\n}\n\ntype McpTextContent = { type: 'text'; text: string }\ntype McpToolResult = { content: McpTextContent[]; isError?: true }\n\nfunction mcpText(text: string): McpToolResult { return { content: [{ type: 'text', text }] } }\nfunction mcpError(text: string): McpToolResult { return { content: [{ type: 'text', text }], isError: true } }\n\n/**\n * Returns an error result if KAIROS_MCP_SECRET is set and the provided secret\n * doesn't match. Returns null if auth passes (no secret configured, or correct secret).\n */\nfunction checkMcpAuth(provided: string | undefined): McpToolResult | null {\n const expected = process.env['KAIROS_MCP_SECRET']\n if (!expected) return null\n if (provided === expected) return null\n return mcpError(JSON.stringify({ error: 'Unauthorized: missing or incorrect kairos_secret' }))\n}\n\nfunction getApiClient(): N8nApiClient {\n const baseUrl = process.env['N8N_BASE_URL']\n const apiKey = process.env['N8N_API_KEY']\n if (!baseUrl || !apiKey) {\n throw new GuardError('N8N_BASE_URL and N8N_API_KEY environment variables are required for n8n operations')\n }\n return new N8nApiClient(baseUrl, apiKey, nullLogger)\n}\n\nfunction getCatalogCachePath(): string {\n const telemetry = process.env['KAIROS_TELEMETRY']\n const base = telemetry ? join(telemetry, '..') : join(homedir(), '.kairos')\n return join(base, 'node-catalog-cache.json')\n}\n\nasync function autoSync(): Promise<SyncResult | null> {\n if (lastSync) return lastSync\n\n // Try disk cache before hitting the network\n const cachePath = getCatalogCachePath()\n const cached = await readCatalogCache(cachePath)\n if (cached) {\n lastSync = cached\n _validator = new N8nValidator(lastSync.registry)\n return lastSync\n }\n\n const baseUrl = process.env['N8N_BASE_URL']\n const apiKey = process.env['N8N_API_KEY']\n if (!baseUrl || !apiKey) return null\n try {\n const client = new N8nApiClient(baseUrl, apiKey, nullLogger)\n const nodeTypes = await client.getNodeTypes()\n if (nodeTypes.length === 0) return null\n lastSync = nodeSyncer.sync(nodeTypes)\n _validator = new N8nValidator(lastSync.registry)\n writeCatalogCache(cachePath, lastSync).catch(() => {})\n return lastSync\n } catch {\n return null\n }\n}\n\nconst server = new McpServer({\n name: 'kairos',\n version: pkg.version,\n})\n\n// ── Core generation tools (no API key needed) ──────────────────────────────\n\nserver.tool(\n 'kairos_prompt',\n 'Get the specialized n8n workflow generation context. Returns a system prompt with node catalog, connection rules, validation rules, plus library matches and failure patterns for the given description. Feed this to yourself as context, then generate the workflow JSON.',\n {\n description: z.string().describe('Plain-English description of the workflow to build'),\n name: z.string().optional().describe('Optional workflow name override'),\n },\n async ({ description, name }) => {\n evictStaleSessions()\n\n const runId = generateUUID()\n const workflowType = inferWorkflowType(description)\n const hasN8nCreds = !!(process.env['N8N_BASE_URL'] && process.env['N8N_API_KEY'])\n\n // Start sync in background — race against timeout so slow n8n instances don't block the prompt\n const syncPromise = autoSync()\n const syncTimeout = new Promise<null>((resolve) => setTimeout(() => resolve(null), AUTO_SYNC_TIMEOUT_MS))\n\n await library.initialize()\n const [syncResult, matches, failureRates] = await Promise.all([\n Promise.race([syncPromise, syncTimeout]),\n library.search(description),\n (async () => {\n const reader = getTelemetryReader()\n return reader ? reader.getFailureRates() : []\n })(),\n ])\n\n const request = { description, ...(name ? { name } : {}) }\n const built = promptBuilder.build(request, matches, failureRates, syncResult?.catalogText)\n\n if (mcpTelemetry) {\n mcpSessions.set(runId, {\n description,\n startTime: Date.now(),\n validateAttempts: 0,\n warnedRules: promptBuilder.getWarnedRules(),\n workflowType,\n matchCount: matches.length,\n })\n await mcpTelemetry.emit('build_start', { description, model: 'mcp-decomposed', dryRun: false }, runId)\n }\n\n const systemText = built.system.map(block => block.text).join('\\n\\n---\\n\\n')\n\n return mcpText(JSON.stringify({\n kairos_run_id: runId,\n mode: built.mode,\n matchCount: matches.length,\n topMatchScore: matches[0]?.score ?? null,\n nodeCatalog: syncResult ? 'synced' : 'static',\n nodeCount: syncResult?.nodeCount ?? null,\n ...(syncResult ? {} : {\n syncWarning: hasN8nCreds\n ? 'Could not sync node types from your n8n instance. Using static fallback catalog — generated workflows may not match your exact n8n setup.'\n : 'N8N_BASE_URL and N8N_API_KEY are not set. Using static fallback catalog — node types may not match your n8n instance. Set these env vars to enable accurate generation and deployment.',\n }),\n systemPrompt: systemText,\n userMessage: built.userMessage,\n outputFormat: {\n description: 'Generate a JSON object with this exact structure. The workflow field contains the n8n workflow. credentialsNeeded lists services requiring credentials.',\n schema: {\n workflow: {\n name: 'string — descriptive workflow name',\n nodes: 'array — n8n node objects with id (UUID v4), type, typeVersion, name, position, parameters',\n connections: 'object — keyed by source node NAME, maps to target nodes',\n settings: 'object — include executionOrder: \"v1\"',\n },\n credentialsNeeded: [{\n service: 'string — e.g. \"Slack\"',\n credentialType: 'string — e.g. \"slackOAuth2Api\"',\n description: 'string — what the user needs to set up',\n }],\n },\n },\n }, null, 2))\n },\n)\n\nserver.tool(\n 'kairos_validate',\n 'Validate n8n workflow JSON against 34 structural rules. Returns pass/fail with specific issues. If validation fails, fix the issues and call this again. Errors block deployment; warnings are advisory.',\n {\n workflow: z.string().describe('The workflow JSON string to validate'),\n kairos_run_id: z.string().optional().describe('Run ID from kairos_prompt — enables telemetry correlation'),\n },\n async ({ workflow: workflowStr, kairos_run_id }) => {\n let parsed: N8nWorkflow\n try {\n parsed = JSON.parse(workflowStr) as N8nWorkflow\n } catch (e) {\n return mcpText(JSON.stringify({ valid: false, error: `Invalid JSON: ${e instanceof Error ? e.message : String(e)}` }, null, 2))\n }\n\n const result = getValidator().validate(parsed)\n const errors = result.issues.filter(i => i.severity === 'error')\n const warnings = result.issues.filter(i => i.severity === 'warn')\n\n if (mcpTelemetry && kairos_run_id) {\n const session = mcpSessions.get(kairos_run_id)\n if (session) {\n session.validateAttempts++\n await mcpTelemetry.emit('generation_attempt', {\n description: session.description,\n attempt: session.validateAttempts,\n temperature: 0,\n durationMs: 0,\n tokensInput: 0,\n tokensOutput: 0,\n validationPassed: result.valid,\n issueCount: result.issues.length,\n issues: result.issues.map(i => ({ rule: i.rule, severity: i.severity, message: i.message, nodeId: i.nodeId ?? null })),\n workflowType: session.workflowType,\n }, kairos_run_id)\n }\n }\n\n return mcpText(JSON.stringify({\n valid: result.valid,\n errorCount: errors.length,\n warningCount: warnings.length,\n errors: errors.map(i => ({ rule: i.rule, message: i.message, nodeId: i.nodeId ?? null })),\n warnings: warnings.map(i => ({ rule: i.rule, message: i.message, nodeId: i.nodeId ?? null })),\n deployable: errors.length === 0,\n }, null, 2))\n },\n)\n\nserver.tool(\n 'kairos_deploy',\n 'Deploy a validated workflow to n8n. Pass the workflow JSON that passed kairos_validate. Strips server-assigned fields automatically. Requires N8N_BASE_URL and N8N_API_KEY.',\n {\n workflow: z.string().describe('The validated workflow JSON string to deploy'),\n activate: z.boolean().default(false).describe('Activate the workflow immediately after deployment'),\n description: z.string().optional().describe('The original user intent / description for this workflow — used to improve library search quality over time'),\n kairos_run_id: z.string().optional().describe('Run ID from kairos_prompt — enables telemetry correlation'),\n kairos_secret: z.string().optional().describe('Required when KAIROS_MCP_SECRET env var is set'),\n },\n async ({ workflow: workflowStr, activate, description: userDescription, kairos_run_id, kairos_secret }) => {\n const authError = checkMcpAuth(kairos_secret)\n if (authError) return authError\n\n if (!isAllowed('deploy')) {\n return mcpError(JSON.stringify({ error: 'Deploy is disabled. Set KAIROS_MCP_ALLOW_DEPLOY=true to enable.' }))\n }\n\n let parsed: N8nWorkflow\n try {\n parsed = JSON.parse(workflowStr) as N8nWorkflow\n } catch (e) {\n return mcpError(JSON.stringify({ error: `Invalid JSON: ${e instanceof Error ? e.message : String(e)}` }))\n }\n\n const validation = getValidator().validate(parsed)\n const errors = validation.issues.filter(i => i.severity === 'error')\n if (errors.length > 0) {\n return mcpError(JSON.stringify({\n error: 'Workflow has validation errors — fix them before deploying',\n errors: errors.map(i => ({ rule: i.rule, message: i.message })),\n }, null, 2))\n }\n\n const client = getApiClient()\n const stripped = stripper.stripForCreate(parsed)\n const response = await client.createWorkflow(stripped)\n\n if (activate) {\n if (!isAllowed('activate')) {\n return mcpText(JSON.stringify({\n workflowId: response.id,\n name: response.name,\n activated: false,\n warning: 'Workflow deployed but activation is disabled. Set KAIROS_MCP_ALLOW_ACTIVATE=true to enable.',\n url: `${process.env['N8N_BASE_URL']}/workflow/${response.id}`,\n }, null, 2))\n }\n await client.activateWorkflow(response.id)\n }\n\n const session = kairos_run_id ? mcpSessions.get(kairos_run_id) : undefined\n\n // Warn when kairos_run_id is provided but no matching session exists — telemetry will be skipped\n const missingSessionWarning = (kairos_run_id && !session)\n ? `\\n\\nNote: kairos_run_id \"${kairos_run_id}\" was provided but no active session was found. This usually means kairos_deploy was called without a prior kairos_prompt call, or the session expired. Telemetry and pattern learning for this build were skipped.`\n : ''\n\n // Save to library (n8nWorkflowId enables dedup on future redeployment)\n await library.initialize()\n await library.save(parsed, {\n description: session?.description ?? userDescription ?? parsed.name,\n generationMode: session && session.matchCount > 0 ? 'reference' : 'scratch',\n generationAttempts: session?.validateAttempts ?? 1,\n n8nWorkflowId: response.id,\n })\n\n if (mcpTelemetry && kairos_run_id && session) {\n await mcpTelemetry.emit('build_complete', {\n description: session.description,\n success: true,\n totalAttempts: session.validateAttempts,\n totalDurationMs: Date.now() - session.startTime,\n totalTokensInput: 0,\n totalTokensOutput: 0,\n workflowName: response.name,\n workflowId: response.id,\n dryRun: false,\n credentialsNeeded: 0,\n warnedRules: session.warnedRules,\n workflowType: session.workflowType,\n }, kairos_run_id)\n mcpSessions.delete(kairos_run_id)\n PatternAnalyzer.fromEnv().analyzeAndSave().catch(() => {})\n }\n\n return mcpText(JSON.stringify({\n workflowId: response.id,\n name: response.name,\n activated: activate,\n url: `${process.env['N8N_BASE_URL']}/workflow/${response.id}`,\n }, null, 2) + missingSessionWarning)\n },\n)\n\nserver.tool(\n 'kairos_replace',\n 'Replace an existing n8n workflow with a new version. Validates before updating. Use kairos_prompt → kairos_validate → kairos_replace for iteration on existing workflows.',\n {\n workflow_id: z.string().describe('The n8n workflow ID to replace'),\n workflow: z.string().describe('The validated workflow JSON string'),\n description: z.string().optional().describe('The original user intent / description for this workflow — used to improve library search quality over time'),\n kairos_run_id: z.string().optional().describe('Run ID from kairos_prompt — enables telemetry correlation'),\n kairos_secret: z.string().optional().describe('Required when KAIROS_MCP_SECRET env var is set'),\n },\n async ({ workflow_id, workflow: workflowStr, description: userDescription, kairos_run_id, kairos_secret }) => {\n const authError = checkMcpAuth(kairos_secret)\n if (authError) return authError\n\n if (!isAllowed('deploy')) {\n return mcpError(JSON.stringify({ error: 'Replace is disabled. Set KAIROS_MCP_ALLOW_DEPLOY=true or KAIROS_MCP_MODE=deploy to enable.' }))\n }\n\n let parsed: N8nWorkflow\n try {\n parsed = JSON.parse(workflowStr) as N8nWorkflow\n } catch (e) {\n return mcpError(JSON.stringify({ error: `Invalid JSON: ${e instanceof Error ? e.message : String(e)}` }))\n }\n\n const validation = getValidator().validate(parsed)\n const errors = validation.issues.filter(i => i.severity === 'error')\n if (errors.length > 0) {\n return mcpError(JSON.stringify({\n error: 'Workflow has validation errors — fix them before replacing',\n errors: errors.map(i => ({ rule: i.rule, message: i.message })),\n }, null, 2))\n }\n\n const client = getApiClient()\n const stripped = stripper.stripForUpdate(parsed)\n const response = await client.updateWorkflow(workflow_id, stripped)\n\n const session = kairos_run_id ? mcpSessions.get(kairos_run_id) : undefined\n const missingSessionWarning = (kairos_run_id && !session)\n ? `\\n\\nNote: kairos_run_id \"${kairos_run_id}\" was provided but no active session was found.`\n : ''\n\n // Save to library — D4 dedup updates the existing entry rather than creating a duplicate\n await library.initialize()\n await library.save(parsed, {\n description: session?.description ?? userDescription ?? parsed.name,\n generationMode: session && session.matchCount > 0 ? 'reference' : 'scratch',\n generationAttempts: session?.validateAttempts ?? 1,\n n8nWorkflowId: workflow_id,\n })\n\n if (mcpTelemetry && kairos_run_id && session) {\n await mcpTelemetry.emit('build_complete', {\n description: session.description,\n success: true,\n totalAttempts: session.validateAttempts,\n totalDurationMs: Date.now() - session.startTime,\n totalTokensInput: 0,\n totalTokensOutput: 0,\n workflowName: response.name,\n workflowId: response.id,\n dryRun: false,\n credentialsNeeded: 0,\n warnedRules: session.warnedRules,\n workflowType: session.workflowType,\n }, kairos_run_id)\n mcpSessions.delete(kairos_run_id)\n PatternAnalyzer.fromEnv().analyzeAndSave().catch(() => {})\n }\n\n return mcpText(JSON.stringify({\n workflowId: response.id,\n name: response.name,\n url: `${process.env['N8N_BASE_URL']}/workflow/${response.id}`,\n }, null, 2) + missingSessionWarning)\n },\n)\n\nserver.tool(\n 'kairos_search',\n 'Search the local workflow library for similar past builds. Returns matching workflows with scores, useful for finding examples and reusing patterns.',\n {\n query: z.string().describe('Search query — a workflow description or keywords'),\n limit: z.number().default(5).describe('Maximum number of results'),\n },\n async ({ query, limit }) => {\n await library.initialize()\n const matches = await library.search(query)\n\n return mcpText(JSON.stringify(\n matches.slice(0, limit).map(m => ({\n id: m.workflow.id,\n score: Number(m.score.toFixed(3)),\n mode: m.mode,\n description: m.workflow.description,\n nodeCount: m.workflow.workflow.nodes.length,\n nodes: m.workflow.workflow.nodes.map(n => n.name),\n n8nWorkflowId: m.workflow.n8nWorkflowId ?? null,\n failurePatterns: m.workflow.failurePatterns ?? [],\n })),\n null,\n 2,\n ))\n },\n)\n\nserver.tool(\n 'kairos_sync',\n 'Sync the node catalog from your live n8n instance. Fetches all installed node types and versions so Kairos knows exactly what your n8n supports. Automatically called by kairos_prompt when n8n credentials are set, but you can call this manually to force a refresh.',\n {},\n async () => {\n const baseUrl = process.env['N8N_BASE_URL']\n const apiKey = process.env['N8N_API_KEY']\n if (!baseUrl || !apiKey) {\n return mcpError(JSON.stringify({ error: 'N8N_BASE_URL and N8N_API_KEY are required for sync.' }))\n }\n\n lastSync = null\n const result = await autoSync()\n if (!result) {\n return mcpError(JSON.stringify({ error: 'Failed to fetch node types from n8n. Check your credentials and that your instance is running.' }))\n }\n\n return mcpText(JSON.stringify({\n synced: true,\n nodeCount: result.nodeCount,\n newNodes: result.newNodes,\n message: `Synced ${result.nodeCount} node types from your n8n instance (${result.newNodes} not in default catalog).`,\n }, null, 2))\n },\n)\n\nserver.tool(\n 'kairos_patterns',\n 'Analyze telemetry data and return failure patterns, build stats, and credential breakdowns. Useful for understanding what goes wrong most often and how to prevent it.',\n {\n days: z.number().default(30).describe('Number of days of telemetry to analyze'),\n limit: z.number().optional().describe('Maximum number of failure patterns to return'),\n },\n async ({ days, limit }) => {\n const analyzer = PatternAnalyzer.fromEnv()\n const analysis = await analyzer.analyzeAndSave(days)\n\n if (limit !== undefined && limit > 0) {\n analysis.topFailureRules = analysis.topFailureRules.slice(0, limit)\n }\n\n return mcpText(JSON.stringify(analysis, null, 2))\n },\n)\n\nserver.tool(\n 'kairos_library',\n 'Browse the local Kairos workflow library. Returns saved workflow metadata. Use the optional query to search, or omit it to list all entries.',\n {\n query: z.string().optional().describe('Optional search query — omit to list all entries'),\n limit: z.number().default(20).describe('Maximum entries to return'),\n },\n async ({ query, limit }) => {\n await library.initialize()\n\n if (query) {\n const matches = await library.search(query)\n return mcpText(JSON.stringify(\n matches.slice(0, limit).map(m => ({\n id: m.workflow.id,\n description: m.workflow.description,\n score: Number(m.score.toFixed(3)),\n mode: m.mode,\n nodeCount: m.workflow.workflow.nodes.length,\n nodes: m.workflow.workflow.nodes.map(n => n.name),\n deployCount: m.workflow.deployCount,\n n8nWorkflowId: m.workflow.n8nWorkflowId ?? null,\n createdAt: m.workflow.createdAt,\n })),\n null, 2,\n ))\n }\n\n const all = await library.list()\n return mcpText(JSON.stringify(\n all.slice(0, limit).map(w => ({\n id: w.id,\n description: w.description,\n nodeCount: w.workflow.nodes.length,\n nodes: w.workflow.nodes.map(n => n.name),\n deployCount: w.deployCount,\n n8nWorkflowId: w.n8nWorkflowId ?? null,\n timesRetrieved: w.timesRetrieved ?? 0,\n createdAt: w.createdAt,\n })),\n null, 2,\n ))\n },\n)\n\nserver.tool(\n 'kairos_outcome',\n 'Record the outcome of a workflow build against a library entry. Trains the pattern learning system to know what works and what fails over time.',\n {\n library_id: z.string().describe('The Kairos library entry ID (returned by kairos_deploy, kairos_replace, or kairos_library)'),\n attempts: z.number().describe('Number of generation+validation attempts before success'),\n first_try_pass: z.boolean().describe('Whether the first attempt passed validation'),\n failed_rules: z.array(z.number()).describe('Validation rule IDs that failed during generation'),\n mode: z.enum(['direct', 'reference']).describe('How the library entry was used during generation'),\n },\n async ({ library_id, attempts, first_try_pass, failed_rules, mode }) => {\n await library.initialize()\n await library.recordOutcome(library_id, {\n attempts,\n firstTryPass: first_try_pass,\n failedRules: failed_rules,\n mode,\n })\n return mcpText(JSON.stringify({ recorded: true, libraryId: library_id }))\n },\n)\n\n// ── n8n management tools (need N8N_BASE_URL + N8N_API_KEY) ─────────────────\n\nserver.tool(\n 'kairos_list',\n 'List all workflows deployed on the connected n8n instance.',\n {},\n async () => {\n const client = getApiClient()\n const workflows = await client.listWorkflows()\n\n return mcpText(JSON.stringify(workflows, null, 2))\n },\n)\n\nserver.tool(\n 'kairos_get',\n 'Get the full JSON definition of a specific workflow by ID.',\n {\n workflow_id: z.string().describe('The n8n workflow ID'),\n },\n async ({ workflow_id }) => {\n const client = getApiClient()\n const workflow = await client.getWorkflow(workflow_id)\n\n return mcpText(JSON.stringify(workflow, null, 2))\n },\n)\n\nserver.tool(\n 'kairos_activate',\n 'Activate a deployed workflow so it starts running on triggers.',\n {\n workflow_id: z.string().describe('The n8n workflow ID to activate'),\n },\n async ({ workflow_id }) => {\n if (!isAllowed('activate')) {\n return mcpError(JSON.stringify({ error: 'Activate is disabled. Set KAIROS_MCP_ALLOW_ACTIVATE=true to enable.' }))\n }\n\n const client = getApiClient()\n await client.activateWorkflow(workflow_id)\n\n return mcpText(`Activated workflow ${workflow_id}`)\n },\n)\n\nserver.tool(\n 'kairos_deactivate',\n 'Deactivate a running workflow.',\n {\n workflow_id: z.string().describe('The n8n workflow ID to deactivate'),\n },\n async ({ workflow_id }) => {\n const client = getApiClient()\n await client.deactivateWorkflow(workflow_id)\n\n return mcpText(`Deactivated workflow ${workflow_id}`)\n },\n)\n\nserver.tool(\n 'kairos_delete',\n 'Delete a workflow from n8n. This is irreversible.',\n {\n workflow_id: z.string().describe('The n8n workflow ID to delete'),\n kairos_secret: z.string().optional().describe('Required when KAIROS_MCP_SECRET env var is set'),\n },\n async ({ workflow_id, kairos_secret }) => {\n const authError = checkMcpAuth(kairos_secret)\n if (authError) return authError\n\n if (!isAllowed('delete')) {\n return mcpError(JSON.stringify({ error: 'Delete is disabled. Set KAIROS_MCP_ALLOW_DELETE=true to enable.' }))\n }\n\n const client = getApiClient()\n await client.deleteWorkflow(workflow_id)\n\n return mcpText(`Deleted workflow ${workflow_id}`)\n },\n)\n\nserver.tool(\n 'kairos_executions',\n 'List recent executions for a workflow, showing status and timing.',\n {\n workflow_id: z.string().optional().describe('Filter to a specific workflow ID (omit for all)'),\n limit: z.number().default(20).describe('Maximum number of executions to return'),\n },\n async ({ workflow_id, limit }) => {\n const client = getApiClient()\n const executions = await client.getExecutions(workflow_id, { limit })\n\n return mcpText(JSON.stringify(executions, null, 2))\n },\n)\n\nasync function main() {\n if (!process.env['ANTHROPIC_API_KEY']) {\n process.stderr.write(\n '[kairos-mcp] WARNING: ANTHROPIC_API_KEY is not set — kairos_prompt will fail. Set it before using workflow generation tools.\\n',\n )\n }\n\n const useHttp = process.argv.includes('--http')\n\n if (useHttp) {\n const port = parseInt(process.env['KAIROS_MCP_PORT'] ?? '3000', 10)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transport = new StreamableHTTPServerTransport() as any\n await server.connect(transport)\n\n const httpServer = createServer(async (req, res) => {\n if (req.method === 'GET' || req.method === 'POST' || req.method === 'DELETE') {\n await transport.handleRequest(req, res)\n } else {\n res.writeHead(405, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify({ error: 'Method not allowed' }))\n }\n })\n\n httpServer.listen(port, () => {\n process.stderr.write(`[kairos-mcp] HTTP transport listening on port ${port}\\n`)\n })\n } else {\n const transport = new StdioServerTransport()\n await server.connect(transport)\n }\n}\n\nmain().catch((err: unknown) => {\n console.error('Kairos MCP server failed to start:', err)\n process.exit(1)\n})\n","import { readFile, writeFile, rename, mkdir, stat, readdir, unlink, open } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\nimport type { N8nWorkflow } from '../types/workflow.js'\nimport type {\n IWorkflowLibrary,\n WorkflowMatch,\n StoredWorkflow,\n WorkflowMetadataInput,\n LibraryFilters,\n SearchOptions,\n OutcomeData,\n} from './types.js'\nimport { generateUUID } from '../utils/uuid.js'\nimport { scoreToMode } from '../utils/thresholds.js'\nimport { hybridScore } from './scorer.js'\nimport { clusterWorkflows, rerank } from './cluster.js'\n\nexport function tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2)\n}\n\nexport function buildSearchCorpus(w: StoredWorkflow): string {\n const nodeTokens = w.workflow.nodes.map((n) => {\n const bare = n.type.split('.').pop() ?? ''\n const spaced = bare.replace(/([A-Z])/g, ' $1').trim().toLowerCase()\n return `${bare} ${spaced}`\n })\n return `${w.description} ${w.workflow.name} ${w.tags.join(' ')} ${nodeTokens.join(' ')}`\n}\n\nconst _rawSize = parseInt(process.env['KAIROS_LIBRARY_SIZE'] ?? '500', 10)\nconst MAX_LIBRARY_SIZE = Number.isFinite(_rawSize) && _rawSize >= 10 ? _rawSize : 500\n\nfunction evictionScore(m: StoredWorkflowMeta): number {\n return (m.deployCount ?? 0) * 3 + (m.timesRetrieved ?? 0) + (m.outcomeStats?.totalUses ?? 0)\n}\n\n/**\n * Internal per-file format: everything from StoredWorkflow except the workflow field,\n * plus two cache fields used to rebuild search corpus without loading workflow files.\n */\ntype StoredWorkflowMeta = Omit<StoredWorkflow, 'workflow'> & {\n workflowName: string // n8n workflow name (copied at save time for search)\n cachedNodeTypes: string[] // full node type strings (e.g. \"n8n-nodes-base.slack\")\n}\n\nfunction isValidMeta(item: unknown): item is StoredWorkflowMeta {\n return (\n typeof item === 'object' &&\n item !== null &&\n typeof (item as Record<string, unknown>).id === 'string' &&\n typeof (item as Record<string, unknown>).description === 'string' &&\n typeof (item as Record<string, unknown>).workflowName === 'string' &&\n Array.isArray((item as Record<string, unknown>).cachedNodeTypes)\n )\n}\n\nfunction isValidOldEntry(item: unknown): item is StoredWorkflow {\n return (\n typeof item === 'object' &&\n item !== null &&\n typeof (item as Record<string, unknown>).id === 'string' &&\n typeof (item as Record<string, unknown>).description === 'string' &&\n typeof (item as Record<string, unknown>).workflow === 'object' &&\n (item as Record<string, unknown>).workflow !== null &&\n Array.isArray(\n ((item as Record<string, unknown>).workflow as Record<string, unknown>).nodes,\n )\n )\n}\n\nexport class FileLibrary implements IWorkflowLibrary {\n private readonly dir: string\n private meta: StoredWorkflowMeta[] = []\n private initPromise: Promise<void> | null = null\n private writeQueue: Promise<void> = Promise.resolve()\n\n constructor(dir?: string) {\n this.dir = dir ?? join(homedir(), '.kairos', 'library')\n }\n\n private get workflowsDir(): string {\n return join(this.dir, 'workflows')\n }\n\n private workflowFilePath(id: string): string {\n return join(this.workflowsDir, `${id}.json`)\n }\n\n async initialize(): Promise<void> {\n if (!this.initPromise) {\n this.initPromise = this.doInitialize()\n }\n return this.initPromise\n }\n\n private async doInitialize(): Promise<void> {\n await mkdir(this.dir, { recursive: true })\n const indexPath = join(this.dir, 'index.json')\n\n // New format has a 'workflows/' subdirectory; old format does not\n let workflowsDirExists = false\n try {\n await stat(this.workflowsDir)\n workflowsDirExists = true\n } catch {\n // Directory absent — old format or fresh start\n }\n\n if (workflowsDirExists) {\n // New per-file format: index.json holds lightweight meta only\n try {\n const raw = await readFile(indexPath, 'utf-8')\n const parsed: unknown = JSON.parse(raw)\n if (Array.isArray(parsed)) {\n this.meta = parsed.filter(isValidMeta)\n }\n } catch {\n this.meta = []\n }\n await this.scanForOrphansAndCleanup()\n } else {\n // Attempt to read old monolithic format\n try {\n const raw = await readFile(indexPath, 'utf-8')\n const parsed: unknown = JSON.parse(raw)\n if (Array.isArray(parsed) && parsed.length > 0 && isValidOldEntry(parsed[0])) {\n await this.migrateFromMonolithic(parsed.filter(isValidOldEntry))\n return\n }\n } catch {\n // No index.json — fresh start\n }\n this.meta = []\n await mkdir(this.workflowsDir, { recursive: true })\n }\n }\n\n private async scanForOrphansAndCleanup(): Promise<void> {\n let entries: string[]\n try {\n entries = await readdir(this.workflowsDir)\n } catch {\n return\n }\n\n const indexedIds = new Set(this.meta.map((m) => m.id))\n const orphanIds: string[] = []\n\n for (const filename of entries) {\n if (filename.endsWith('.tmp')) {\n // Leftover from an interrupted atomic rename — safe to delete\n await unlink(join(this.workflowsDir, filename)).catch(() => {})\n continue\n }\n if (!filename.endsWith('.json')) continue\n const id = filename.slice(0, -5)\n if (!indexedIds.has(id)) {\n orphanIds.push(id)\n }\n }\n\n if (orphanIds.length > 0) {\n // Log but do not delete — caller can decide what to do\n console.warn(`[FileLibrary] Found ${orphanIds.length} orphaned workflow file(s) not in index: ${orphanIds.join(', ')}`)\n }\n }\n\n /**\n * One-time transparent migration from v0.4.x monolithic index.json.\n * Splits each stored workflow into a per-file workflow JSON and a lightweight\n * meta entry. Rewrites index.json in the new format.\n */\n private async migrateFromMonolithic(oldEntries: StoredWorkflow[]): Promise<void> {\n await mkdir(this.workflowsDir, { recursive: true })\n\n const newMeta: StoredWorkflowMeta[] = []\n for (const entry of oldEntries) {\n const wfPath = this.workflowFilePath(entry.id)\n const tmpPath = `${wfPath}.tmp`\n await writeFile(tmpPath, JSON.stringify(entry.workflow), 'utf-8')\n await rename(tmpPath, wfPath)\n\n const { workflow, ...metaFields } = entry\n newMeta.push({\n ...metaFields,\n workflowName: workflow.name,\n cachedNodeTypes: workflow.nodes.map((n) => n.type),\n })\n }\n\n this.meta = newMeta\n // Write new lightweight index.json (no workflow fields)\n await this.persistNow()\n }\n\n private async loadWorkflowFile(id: string): Promise<N8nWorkflow | null> {\n try {\n const raw = await readFile(this.workflowFilePath(id), 'utf-8')\n return JSON.parse(raw) as N8nWorkflow\n } catch {\n return null\n }\n }\n\n private async writeWorkflowFile(id: string, workflow: N8nWorkflow): Promise<void> {\n const wfPath = this.workflowFilePath(id)\n const tmpPath = `${wfPath}.tmp`\n await writeFile(tmpPath, JSON.stringify(workflow), 'utf-8')\n await rename(tmpPath, wfPath)\n }\n\n /**\n * Build a lightweight StoredWorkflow shell from a meta entry for use in\n * scoring / clustering. Only node.type is populated in each node — no other\n * node fields are used by hybridScore or clusterWorkflows.\n */\n private makeSearchShell(m: StoredWorkflowMeta): StoredWorkflow {\n return {\n ...m,\n workflow: {\n name: m.workflowName,\n nodes: m.cachedNodeTypes.map((type) => ({\n id: '',\n name: '',\n type,\n typeVersion: 1,\n position: [0, 0] as [number, number],\n parameters: {},\n })),\n connections: {},\n },\n } as StoredWorkflow\n }\n\n async search(description: string, options?: SearchOptions): Promise<WorkflowMatch[]> {\n const filteredMeta = this.meta.filter((m) => m.trustLevel !== 'blocked')\n if (filteredMeta.length === 0) return []\n\n const limit = options?.limit ?? 3\n const queryTokens = tokenize(description)\n if (queryTokens.length === 0) return []\n\n // Build lightweight shells — no file I/O, all data comes from cached meta\n const shells = filteredMeta.map((m) => this.makeSearchShell(m))\n\n const docTokenArrays = shells.map((w) => tokenize(buildSearchCorpus(w)))\n const docTokenSets = docTokenArrays.map((tokens) => new Set(tokens))\n\n const docCount = shells.length\n const idf = new Map<string, number>()\n const idfCeiling = Math.log(docCount + 1) + 1 // max IDF when term appears in 0 docs\n const allTokens = new Set(queryTokens)\n for (const token of allTokens) {\n const docsWithToken = docTokenSets.filter((d) => d.has(token)).length\n const rawIdf = Math.log((docCount + 1) / (docsWithToken + 1)) + 1\n idf.set(token, rawIdf / idfCeiling) // normalize to [0, 1] regardless of corpus size\n }\n\n const scored = hybridScore(queryTokens, description, shells, docTokenArrays, idf)\n .filter((m) => m.score > 0)\n .sort((a, b) => b.score - a.score)\n\n const clusters = clusterWorkflows(shells)\n const reranked = rerank(scored, clusters).slice(0, limit)\n\n if (reranked.length === 0) return []\n\n // Update timesRetrieved in meta before persisting\n for (const r of reranked) {\n const m = this.meta.find((m) => m.id === r.workflow.id)\n if (m) m.timesRetrieved = (m.timesRetrieved ?? 0) + 1\n }\n this.persist()\n\n // Lazy-load full workflow files for the top matches only\n const results = await Promise.all(\n reranked.map(async (r) => {\n const m = this.meta.find((meta) => meta.id === r.workflow.id)!\n const workflow = await this.loadWorkflowFile(r.workflow.id)\n if (!workflow) return null\n return {\n workflow: { ...m, workflow } as StoredWorkflow,\n score: r.score,\n mode: scoreToMode(r.score),\n } as WorkflowMatch\n }),\n )\n\n return results.filter((r): r is WorkflowMatch => r !== null)\n }\n\n async save(workflow: N8nWorkflow, metadata: WorkflowMetadataInput): Promise<string> {\n // Prefer matching by n8nWorkflowId when redeploying — prevents duplicate library entries\n const existingByN8nId = metadata.n8nWorkflowId\n ? this.meta.find((m) => m.n8nWorkflowId === metadata.n8nWorkflowId)\n : undefined\n\n // Fall back to description dedup for newly saved workflows\n const normalizedDesc = metadata.description.trim().toLowerCase()\n const existing = existingByN8nId\n ?? this.meta.find((m) => m.description.trim().toLowerCase() === normalizedDesc)\n\n if (existing) {\n existing.description = metadata.description // update description on redeploy\n existing.workflowName = workflow.name\n existing.cachedNodeTypes = workflow.nodes.map((n) => n.type)\n if (metadata.n8nWorkflowId) existing.n8nWorkflowId = metadata.n8nWorkflowId\n if (metadata.generationAttempts != null) {\n existing.generationAttempts = metadata.generationAttempts\n }\n if (metadata.failurePatterns?.length) {\n existing.failurePatterns = this.deduplicateFailurePatterns(metadata.failurePatterns)!\n }\n if (metadata.tags?.length) {\n existing.tags = [...new Set([...existing.tags, ...metadata.tags])]\n }\n await this.writeWorkflowFile(existing.id, workflow)\n await this.persist()\n return existing.id\n }\n\n const id = generateUUID()\n\n // Write workflow file first (data before index entry — crash-safe WAL pattern)\n await this.writeWorkflowFile(id, workflow)\n\n const failurePatterns = this.deduplicateFailurePatterns(metadata.failurePatterns)\n const meta: StoredWorkflowMeta = {\n id,\n description: metadata.description,\n tags: metadata.tags ?? [],\n platform: metadata.platform ?? 'n8n',\n deployCount: 0,\n createdAt: new Date().toISOString(),\n workflowName: workflow.name,\n cachedNodeTypes: workflow.nodes.map((n) => n.type),\n ...(failurePatterns?.length ? { failurePatterns } : {}),\n ...(metadata.sourceWorkflowIds?.length ? { sourceWorkflowIds: metadata.sourceWorkflowIds } : {}),\n ...(metadata.generationMode ? { generationMode: metadata.generationMode } : {}),\n ...(metadata.topMatchScore != null ? { topMatchScore: metadata.topMatchScore } : {}),\n ...(metadata.generationAttempts != null ? { generationAttempts: metadata.generationAttempts } : {}),\n ...(metadata.credentialsNeeded?.length ? { credentialsNeeded: metadata.credentialsNeeded } : {}),\n ...(metadata.sourceKind ? { sourceKind: metadata.sourceKind } : {}),\n ...(metadata.sourceId ? { sourceId: metadata.sourceId } : {}),\n ...(metadata.sourceUrl ? { sourceUrl: metadata.sourceUrl } : {}),\n ...(metadata.trustLevel ? { trustLevel: metadata.trustLevel } : {}),\n ...(metadata.n8nWorkflowId ? { n8nWorkflowId: metadata.n8nWorkflowId } : {}),\n }\n\n this.meta.push(meta)\n if (this.meta.length > MAX_LIBRARY_SIZE) {\n // Evict by composite usage score ascending; always keep the newly-added entry\n this.meta.sort((a, b) => {\n if (a.id === id) return -1\n if (b.id === id) return 1\n return evictionScore(b) - evictionScore(a)\n })\n this.meta = this.meta.slice(0, MAX_LIBRARY_SIZE)\n }\n\n await this.persist()\n return id\n }\n\n async recordDeployment(id: string, n8nWorkflowId?: string): Promise<void> {\n const m = this.meta.find((m) => m.id === id)\n if (m) {\n m.deployCount++\n m.lastDeployedAt = new Date().toISOString()\n if (n8nWorkflowId) m.n8nWorkflowId = n8nWorkflowId\n await this.persist()\n }\n }\n\n async recordOutcome(id: string, outcome: OutcomeData): Promise<void> {\n const m = this.meta.find((m) => m.id === id)\n if (!m) return\n\n if (outcome.mode === 'direct') {\n m.timesUsedAsDirect = (m.timesUsedAsDirect ?? 0) + 1\n } else {\n m.timesUsedAsReference = (m.timesUsedAsReference ?? 0) + 1\n }\n\n const stats = m.outcomeStats ?? { totalUses: 0, totalAttempts: 0, firstTryPasses: 0, failedRules: {} }\n stats.totalUses++\n stats.totalAttempts += outcome.attempts\n if (outcome.firstTryPass) stats.firstTryPasses++\n for (const rule of outcome.failedRules) {\n const key = String(rule)\n stats.failedRules[key] = (stats.failedRules[key] ?? 0) + 1\n }\n m.outcomeStats = stats\n\n await this.persist()\n }\n\n async drain(): Promise<void> {\n await this.writeQueue\n }\n\n async get(id: string): Promise<StoredWorkflow | null> {\n const m = this.meta.find((m) => m.id === id)\n if (!m) return null\n const workflow = await this.loadWorkflowFile(id)\n if (!workflow) return null\n return { ...m, workflow } as StoredWorkflow\n }\n\n async list(filters?: LibraryFilters): Promise<StoredWorkflow[]> {\n let filtered = this.meta\n if (filters?.platform) {\n filtered = filtered.filter((m) => m.platform === filters.platform)\n }\n if (filters?.tags && filters.tags.length > 0) {\n filtered = filtered.filter((m) => filters.tags!.some((t) => m.tags.includes(t)))\n }\n\n const results = await Promise.all(\n filtered.map(async (m) => {\n const workflow = await this.loadWorkflowFile(m.id)\n if (!workflow) return null\n return { ...m, workflow } as StoredWorkflow\n }),\n )\n\n return results.filter((r): r is StoredWorkflow => r !== null)\n }\n\n private deduplicateFailurePatterns(\n patterns?: Array<{ rule: number; message: string }>,\n ): StoredWorkflow['failurePatterns'] | undefined {\n if (!patterns?.length) return undefined\n const map = new Map<number, { rule: number; message: string; occurrences: number }>()\n for (const fp of patterns) {\n const existing = map.get(fp.rule)\n if (existing) {\n existing.occurrences++\n } else {\n map.set(fp.rule, { rule: fp.rule, message: fp.message, occurrences: 1 })\n }\n }\n return [...map.values()]\n }\n\n // ── Cross-process file locking ────────────────────────────────────────────\n // Uses O_EXCL (exclusive create) which is atomic on POSIX and Windows NTFS.\n // Protects the read-modify-write cycle in persist() from concurrent writers\n // in separate OS processes (e.g. MCP server + CLI running simultaneously).\n\n private get lockPath(): string {\n return join(this.dir, '.index.lock')\n }\n\n private async acquireLock(timeoutMs = 3_000): Promise<() => Promise<void>> {\n const deadline = Date.now() + timeoutMs\n let delayMs = 10\n\n while (true) {\n try {\n // O_EXCL: fail if the file already exists — atomic on POSIX + NTFS\n const fh = await open(this.lockPath, 'wx')\n await fh.writeFile(String(process.pid))\n await fh.close()\n return async () => { await unlink(this.lockPath).catch(() => {}) }\n } catch {\n // Lock file exists — check if it's stale\n try {\n const content = await readFile(this.lockPath, 'utf-8')\n const lockPid = parseInt(content.trim(), 10)\n const fileStat = await stat(this.lockPath)\n const ageMs = Date.now() - fileStat.mtimeMs\n\n if (ageMs > 10_000) {\n // Lock is over 10 seconds old — definitely stale\n await unlink(this.lockPath).catch(() => {})\n continue\n }\n\n if (!isNaN(lockPid)) {\n try {\n process.kill(lockPid, 0) // throws ESRCH if PID is dead\n } catch {\n await unlink(this.lockPath).catch(() => {})\n continue\n }\n }\n } catch {\n // Lock file was removed between our read and check — retry immediately\n continue\n }\n\n if (Date.now() > deadline) {\n // Can't acquire within timeout — proceed with a warning (degraded mode)\n return async () => {}\n }\n await new Promise<void>((r) => setTimeout(r, delayMs))\n delayMs = Math.min(delayMs * 1.5, 200)\n }\n }\n }\n\n /**\n * Direct write used only during migration (before writeQueue is needed).\n */\n private async persistNow(): Promise<void> {\n const releaseLock = await this.acquireLock()\n try {\n const indexPath = join(this.dir, 'index.json')\n const tmpPath = `${indexPath}.tmp`\n await writeFile(tmpPath, JSON.stringify(this.meta, null, 2), 'utf-8')\n await rename(tmpPath, indexPath)\n } finally {\n await releaseLock()\n }\n }\n\n private persist(): Promise<void> {\n this.writeQueue = this.writeQueue.then(async () => {\n const releaseLock = await this.acquireLock()\n try {\n const indexPath = join(this.dir, 'index.json')\n\n // Re-read disk state to preserve concurrent additions from other processes\n let onDisk: StoredWorkflowMeta[] = []\n try {\n const raw = await readFile(indexPath, 'utf-8')\n const parsed: unknown = JSON.parse(raw)\n if (Array.isArray(parsed)) {\n onDisk = parsed.filter(isValidMeta)\n }\n } catch { /* index.json doesn't exist yet */ }\n\n // Our in-memory state wins for IDs we manage; add any entries added by other processes\n const ourIds = new Set(this.meta.map((m) => m.id))\n const external = onDisk.filter((m) => !ourIds.has(m.id))\n let merged = [...this.meta, ...external]\n if (merged.length > MAX_LIBRARY_SIZE) {\n merged.sort((a, b) => evictionScore(b) - evictionScore(a))\n merged = merged.slice(0, MAX_LIBRARY_SIZE)\n }\n\n const tmpPath = `${indexPath}.tmp`\n await writeFile(tmpPath, JSON.stringify(merged, null, 2), 'utf-8')\n await rename(tmpPath, indexPath)\n } finally {\n await releaseLock()\n }\n })\n return this.writeQueue\n }\n}\n","export function generateUUID(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n // Fallback for environments without crypto.randomUUID (Node < 15.7)\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0\n return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16)\n })\n}\n","export const DIRECT_THRESHOLD = 0.92\nexport const REFERENCE_THRESHOLD = 0.72\n\nexport function scoreToMode(score: number): 'direct' | 'reference' | 'scratch' {\n if (score >= DIRECT_THRESHOLD) return 'direct'\n if (score >= REFERENCE_THRESHOLD) return 'reference'\n return 'scratch'\n}\n","import type { StoredWorkflow } from './types.js'\n\nfunction loadWeights() {\n const raw = {\n tfidf: parseFloat(process.env['KAIROS_WEIGHT_TFIDF'] ?? ''),\n nodeFingerprint: parseFloat(process.env['KAIROS_WEIGHT_JACCARD'] ?? ''),\n outcome: parseFloat(process.env['KAIROS_WEIGHT_OUTCOME'] ?? ''),\n deploy: parseFloat(process.env['KAIROS_WEIGHT_DEPLOY'] ?? ''),\n }\n const defaults = { tfidf: 0.35, nodeFingerprint: 0.30, outcome: 0.20, deploy: 0.15 }\n const anySet = Object.values(raw).some((v) => !isNaN(v) && v >= 0)\n if (!anySet) return defaults\n\n // Use provided values (default 0 for unspecified), then normalize to sum=1\n const w = {\n tfidf: !isNaN(raw.tfidf) && raw.tfidf >= 0 ? raw.tfidf : defaults.tfidf,\n nodeFingerprint: !isNaN(raw.nodeFingerprint) && raw.nodeFingerprint >= 0 ? raw.nodeFingerprint : defaults.nodeFingerprint,\n outcome: !isNaN(raw.outcome) && raw.outcome >= 0 ? raw.outcome : defaults.outcome,\n deploy: !isNaN(raw.deploy) && raw.deploy >= 0 ? raw.deploy : defaults.deploy,\n }\n const total = w.tfidf + w.nodeFingerprint + w.outcome + w.deploy\n if (total <= 0) return defaults\n return {\n tfidf: w.tfidf / total,\n nodeFingerprint: w.nodeFingerprint / total,\n outcome: w.outcome / total,\n deploy: w.deploy / total,\n }\n}\n\nconst WEIGHTS = loadWeights()\n\nconst NODE_KEYWORDS: Record<string, string[]> = {\n slack: ['slack', 'slackApi'],\n email: ['gmail', 'sendEmail', 'emailSend', 'emailReadImap'],\n webhook: ['webhook', 'webhookTrigger'],\n schedule: ['scheduleTrigger', 'cron'],\n http: ['httpRequest'],\n sheets: ['googleSheets'],\n github: ['github', 'githubTrigger'],\n telegram: ['telegram', 'telegramTrigger'],\n ai: ['agent', 'openAi', 'lmChatOpenAi', 'lmChatAnthropic', 'chainLlm', 'chainSummarization'],\n memory: ['memoryBufferWindow', 'memoryXata', 'memoryPostgres'],\n vector: ['vectorStoreInMemory', 'vectorStorePinecone', 'vectorStoreQdrant'],\n database: ['postgres', 'mySql', 'redis', 'mongoDb'],\n airtable: ['airtable'],\n notion: ['notion'],\n s3: ['awsS3'],\n code: ['code'],\n merge: ['merge'],\n switch: ['switch'],\n if: ['if'],\n wait: ['wait'],\n rss: ['rssFeedRead', 'rssFeedReadTrigger'],\n form: ['formTrigger'],\n set: ['set'],\n split: ['splitInBatches'],\n filter: ['filter'],\n telegram_trigger: ['telegramTrigger'],\n stripe: ['stripe'],\n}\n\nfunction extractQueryFingerprint(description: string): Set<string> {\n const lower = description.toLowerCase()\n const matches = new Set<string>()\n\n for (const [keyword, nodeTypes] of Object.entries(NODE_KEYWORDS)) {\n if (lower.includes(keyword)) {\n for (const nt of nodeTypes) matches.add(nt)\n }\n }\n\n if (/\\bevery\\b|\\bdaily\\b|\\bhourly\\b|\\bweekly\\b|\\bmonthly\\b|\\bcron\\b|\\bschedule\\b|\\bat \\d/.test(lower)) {\n matches.add('scheduleTrigger')\n }\n if (/\\bwebhook\\b|\\breceive\\b.*\\bpost\\b|\\bpost\\b.*\\brequest\\b/.test(lower)) {\n matches.add('webhook')\n }\n if (/\\bchat\\b|\\bchatbot\\b|\\bconversation\\b/.test(lower)) {\n matches.add('chatTrigger')\n }\n if (/\\bai\\b|\\bllm\\b|\\bgpt\\b|\\bclaude\\b|\\bagent\\b|\\bsummariz/.test(lower)) {\n matches.add('agent')\n }\n\n return matches\n}\n\nfunction extractWorkflowFingerprint(w: StoredWorkflow): Set<string> {\n const fp = new Set<string>()\n for (const node of w.workflow.nodes) {\n const bare = node.type.split('.').pop() ?? ''\n fp.add(bare)\n }\n return fp\n}\n\nfunction jaccardSimilarity(a: Set<string>, b: Set<string>): number {\n if (a.size === 0 && b.size === 0) return 0\n let intersection = 0\n for (const item of a) {\n if (b.has(item)) intersection++\n }\n const union = a.size + b.size - intersection\n return union > 0 ? intersection / union : 0\n}\n\nfunction outcomeScore(w: StoredWorkflow): number {\n const stats = w.outcomeStats\n if (!stats || stats.totalUses === 0) return 0.5\n\n const passRate = stats.firstTryPasses / stats.totalUses\n const avgAttempts = stats.totalAttempts / stats.totalUses\n const attemptPenalty = Math.max(0, 1 - (avgAttempts - 1) * 0.3)\n\n return passRate * 0.6 + attemptPenalty * 0.4\n}\n\nfunction deployScore(w: StoredWorkflow): number {\n return 1 + Math.log(w.deployCount + 1) * 0.1\n}\n\nexport interface ScoredEntry {\n workflow: StoredWorkflow\n score: number\n signals: {\n tfidf: number\n nodeFingerprint: number\n outcome: number\n deploy: number\n }\n}\n\nexport function hybridScore(\n queryTokens: string[],\n queryDescription: string,\n workflows: StoredWorkflow[],\n docTokenArrays: string[][],\n idf: Map<string, number>,\n): ScoredEntry[] {\n const queryFp = extractQueryFingerprint(queryDescription)\n const ceiling = queryTokens.reduce((sum, qt) => sum + (idf.get(qt) ?? 0), 0) || 1\n\n return workflows.map((w, i) => {\n const docTokens = docTokenArrays[i]!\n let tfidfRaw = 0\n const docFreq = new Map<string, number>()\n for (const t of docTokens) {\n docFreq.set(t, (docFreq.get(t) ?? 0) + 1)\n }\n for (const qt of queryTokens) {\n const tf = docTokens.length > 0 ? (docFreq.get(qt) ?? 0) / docTokens.length : 0\n const idfVal = idf.get(qt) ?? 0\n tfidfRaw += tf * idfVal\n }\n const tfidf = Math.min(tfidfRaw / ceiling, 1)\n\n const workflowFp = extractWorkflowFingerprint(w)\n const nodeFingerprint = queryFp.size > 0 ? jaccardSimilarity(queryFp, workflowFp) : 0\n\n const outcome = outcomeScore(w)\n const deploy = Math.min(deployScore(w), 1.5) / 1.5\n\n const score = Math.min(\n WEIGHTS.tfidf * tfidf +\n WEIGHTS.nodeFingerprint * nodeFingerprint +\n WEIGHTS.outcome * outcome +\n WEIGHTS.deploy * deploy,\n 1,\n )\n\n return {\n workflow: w,\n score,\n signals: { tfidf, nodeFingerprint, outcome, deploy },\n }\n })\n}\n","import type { StoredWorkflow } from './types.js'\n\nexport interface WorkflowCluster {\n pattern: string\n fingerprint: string[]\n members: StoredWorkflow[]\n avgFirstTryPassRate: number\n avgAttempts: number\n commonFailedRules: Array<{ rule: number; frequency: number }>\n}\n\nfunction getFingerprint(w: StoredWorkflow): string[] {\n return w.workflow.nodes\n .map((n) => n.type.split('.').pop() ?? '')\n .sort()\n}\n\nfunction fingerprintKey(fp: string[]): string {\n return fp.join('|')\n}\n\nfunction describePattern(fp: string[]): string {\n const triggers = fp.filter((n) => /trigger/i.test(n))\n const outputs = fp.filter((n) => /slack|gmail|email|telegram|sheets|airtable|notion/i.test(n))\n const ai = fp.filter((n) => /agent|openai|anthropic|chain|memory/i.test(n))\n const core = fp.filter((n) => /httpRequest|code|merge|switch|if|set|filter/i.test(n))\n\n const parts: string[] = []\n if (triggers.length > 0) parts.push(triggers[0]!)\n if (ai.length > 0) parts.push('AI')\n if (core.length > 0) parts.push(core.slice(0, 2).join('+'))\n if (outputs.length > 0) parts.push(outputs[0]!)\n\n return parts.length > 0 ? parts.join(' → ') : fp.slice(0, 3).join(' → ')\n}\n\nexport function clusterWorkflows(workflows: StoredWorkflow[]): WorkflowCluster[] {\n const groups = new Map<string, StoredWorkflow[]>()\n\n for (const w of workflows) {\n const fp = getFingerprint(w)\n const key = fingerprintKey(fp)\n\n const existing = groups.get(key)\n if (existing) {\n existing.push(w)\n } else {\n groups.set(key, [w])\n }\n }\n\n const clusters: WorkflowCluster[] = []\n\n for (const [, members] of groups) {\n if (members.length === 0) continue\n\n const fp = getFingerprint(members[0]!)\n const withStats = members.filter((m) => m.outcomeStats && m.outcomeStats.totalUses > 0)\n\n let avgFirstTryPassRate = 0\n let avgAttempts = 0\n\n if (withStats.length > 0) {\n avgFirstTryPassRate = withStats.reduce((sum, m) => {\n const s = m.outcomeStats!\n return sum + s.firstTryPasses / s.totalUses\n }, 0) / withStats.length\n\n avgAttempts = withStats.reduce((sum, m) => {\n const s = m.outcomeStats!\n return sum + s.totalAttempts / s.totalUses\n }, 0) / withStats.length\n }\n\n const ruleCounts = new Map<number, number>()\n let totalFailureInstances = 0\n for (const m of withStats) {\n const rules = m.outcomeStats!.failedRules\n for (const [rule, count] of Object.entries(rules)) {\n const r = parseInt(rule, 10)\n ruleCounts.set(r, (ruleCounts.get(r) ?? 0) + count)\n totalFailureInstances += count\n }\n }\n\n const commonFailedRules = [...ruleCounts.entries()]\n .map(([rule, count]) => ({\n rule,\n frequency: totalFailureInstances > 0 ? count / totalFailureInstances : 0,\n }))\n .filter((r) => r.frequency >= 0.1)\n .sort((a, b) => b.frequency - a.frequency)\n\n clusters.push({\n pattern: describePattern(fp),\n fingerprint: fp,\n members,\n avgFirstTryPassRate,\n avgAttempts,\n commonFailedRules,\n })\n }\n\n return clusters.sort((a, b) => b.members.length - a.members.length)\n}\n\nconst NOVELTY_BOOST = 0.05 // reward for being first representative of a cluster\nconst NOVELTY_PENALTY = 0.03 // penalty for being a duplicate cluster in the top results\n\nexport function rerank(\n candidates: Array<{ workflow: StoredWorkflow; score: number }>,\n clusters: WorkflowCluster[],\n): Array<{ workflow: StoredWorkflow; score: number; clusterPattern?: string }> {\n const clusterMap = new Map<string, WorkflowCluster>()\n for (const cluster of clusters) {\n for (const member of cluster.members) {\n clusterMap.set(member.id, cluster)\n }\n }\n\n // Pass 1: apply outcome/failure boosts, sort by score\n const pass1 = candidates\n .map((c) => {\n const cluster = clusterMap.get(c.workflow.id)\n let boost = 0\n\n if (cluster && cluster.avgFirstTryPassRate > 0) {\n boost = (cluster.avgFirstTryPassRate - 0.5) * 0.1\n }\n\n if (cluster && cluster.commonFailedRules.length > 0) {\n boost -= cluster.commonFailedRules.length * 0.02\n }\n\n return {\n workflow: c.workflow,\n score: Math.max(0, Math.min(1, c.score + boost)),\n cluster,\n }\n })\n .sort((a, b) => b.score - a.score)\n\n // Pass 2: novelty boost — reward the first representative of each cluster pattern,\n // penalize subsequent results from the same cluster to promote diversity\n const seenFingerprints = new Set<string>()\n return pass1.map((c) => {\n const fpKey = c.cluster ? fingerprintKey(c.cluster.fingerprint) : null\n let noveltyAdjust = 0\n\n if (fpKey !== null) {\n if (!seenFingerprints.has(fpKey)) {\n seenFingerprints.add(fpKey)\n noveltyAdjust = NOVELTY_BOOST\n } else {\n noveltyAdjust = -NOVELTY_PENALTY\n }\n }\n\n return {\n workflow: c.workflow,\n score: Math.max(0, Math.min(1, c.score + noveltyAdjust)),\n ...(c.cluster ? { clusterPattern: c.cluster.pattern } : {}),\n }\n }).sort((a, b) => b.score - a.score)\n}\n","export interface NodeDefinition {\n type: string\n safeTypeVersions: number[]\n requiredParams: string[]\n credentialType?: string\n isTrigger?: boolean\n}\n\nexport const DEFAULT_REGISTRY: NodeDefinition[] = [\n // Trigger nodes\n { type: 'n8n-nodes-base.manualTrigger', safeTypeVersions: [1], requiredParams: [], isTrigger: true },\n { type: 'n8n-nodes-base.scheduleTrigger', safeTypeVersions: [1, 1.1, 1.2], requiredParams: [], isTrigger: true },\n { type: 'n8n-nodes-base.webhook', safeTypeVersions: [1, 1.1, 2], requiredParams: ['httpMethod', 'path'], isTrigger: true },\n { type: 'n8n-nodes-base.formTrigger', safeTypeVersions: [1, 2, 2.1, 2.2], requiredParams: [], isTrigger: true },\n { type: 'n8n-nodes-base.emailReadImap', safeTypeVersions: [2], requiredParams: [], credentialType: 'imap', isTrigger: true },\n { type: 'n8n-nodes-base.errorTrigger', safeTypeVersions: [1], requiredParams: [], isTrigger: true },\n { type: 'n8n-nodes-base.executeWorkflowTrigger', safeTypeVersions: [1, 1.1], requiredParams: [], isTrigger: true },\n { type: 'n8n-nodes-base.gmailTrigger', safeTypeVersions: [1, 1.1, 1.2], requiredParams: [], credentialType: 'gmailOAuth2', isTrigger: true },\n { type: 'n8n-nodes-base.googleDriveTrigger', safeTypeVersions: [1], requiredParams: [], credentialType: 'googleDriveOAuth2Api', isTrigger: true },\n { type: 'n8n-nodes-base.googleSheetsTrigger', safeTypeVersions: [1], requiredParams: [], credentialType: 'googleSheetsTriggerOAuth2Api', isTrigger: true },\n { type: 'n8n-nodes-base.slackTrigger', safeTypeVersions: [1], requiredParams: [], credentialType: 'slackApi', isTrigger: true },\n { type: 'n8n-nodes-base.telegramTrigger', safeTypeVersions: [1, 1.1, 1.2], requiredParams: [], credentialType: 'telegramApi', isTrigger: true },\n { type: 'n8n-nodes-base.githubTrigger', safeTypeVersions: [1], requiredParams: [], credentialType: 'githubApi', isTrigger: true },\n { type: 'n8n-nodes-base.stripeTrigger', safeTypeVersions: [1], requiredParams: [], credentialType: 'stripeApi', isTrigger: true },\n { type: 'n8n-nodes-base.airtableTrigger', safeTypeVersions: [1], requiredParams: [], credentialType: 'airtableTokenApi', isTrigger: true },\n { type: 'n8n-nodes-base.notionTrigger', safeTypeVersions: [1], requiredParams: [], credentialType: 'notionApi', isTrigger: true },\n { type: '@n8n/n8n-nodes-langchain.chatTrigger', safeTypeVersions: [1, 1.1], requiredParams: [], isTrigger: true },\n\n // Core logic nodes\n { type: 'n8n-nodes-base.code', safeTypeVersions: [1, 2], requiredParams: [] },\n { type: 'n8n-nodes-base.httpRequest', safeTypeVersions: [1, 2, 3, 4, 4.1, 4.2], requiredParams: ['url'] },\n { type: 'n8n-nodes-base.set', safeTypeVersions: [1, 2, 3, 3.1, 3.2, 3.3, 3.4], requiredParams: [] },\n { type: 'n8n-nodes-base.if', safeTypeVersions: [1, 2, 2.1, 2.2], requiredParams: [] },\n { type: 'n8n-nodes-base.switch', safeTypeVersions: [1, 2, 3, 3.1, 3.2], requiredParams: [] },\n { type: 'n8n-nodes-base.filter', safeTypeVersions: [1, 2, 2.1, 2.2], requiredParams: [] },\n { type: 'n8n-nodes-base.merge', safeTypeVersions: [1, 2, 2.1, 3], requiredParams: [] },\n { type: 'n8n-nodes-base.splitInBatches', safeTypeVersions: [1, 2, 3], requiredParams: [] },\n { type: 'n8n-nodes-base.wait', safeTypeVersions: [1, 1.1], requiredParams: [] },\n { type: 'n8n-nodes-base.executeWorkflow', safeTypeVersions: [1, 1.1, 1.2], requiredParams: [] },\n { type: 'n8n-nodes-base.respondToWebhook', safeTypeVersions: [1, 1.1], requiredParams: [] },\n { type: 'n8n-nodes-base.noOp', safeTypeVersions: [1], requiredParams: [] },\n { type: 'n8n-nodes-base.stopAndError', safeTypeVersions: [1], requiredParams: [] },\n { type: 'n8n-nodes-base.splitOut', safeTypeVersions: [1], requiredParams: [] },\n { type: 'n8n-nodes-base.aggregate', safeTypeVersions: [1], requiredParams: [] },\n { type: 'n8n-nodes-base.stickyNote', safeTypeVersions: [1], requiredParams: [] },\n\n // Email / messaging\n { type: 'n8n-nodes-base.emailSend', safeTypeVersions: [1, 2, 2.1], requiredParams: [], credentialType: 'smtp' },\n { type: 'n8n-nodes-base.slack', safeTypeVersions: [1, 2, 2.1, 2.2], requiredParams: [], credentialType: 'slackOAuth2Api' },\n { type: 'n8n-nodes-base.telegram', safeTypeVersions: [1, 1.1, 1.2], requiredParams: [], credentialType: 'telegramApi' },\n { type: 'n8n-nodes-base.discord', safeTypeVersions: [1, 2], requiredParams: [], credentialType: 'discordWebhookApi' },\n\n // Google\n { type: 'n8n-nodes-base.gmail', safeTypeVersions: [1, 2, 2.1], requiredParams: [], credentialType: 'gmailOAuth2' },\n { type: 'n8n-nodes-base.googleSheets', safeTypeVersions: [1, 2, 3, 4, 4.1, 4.2, 4.3, 4.4, 4.5], requiredParams: [], credentialType: 'googleSheetsOAuth2Api' },\n { type: 'n8n-nodes-base.googleDrive', safeTypeVersions: [1, 2, 3], requiredParams: [], credentialType: 'googleDriveOAuth2Api' },\n { type: 'n8n-nodes-base.googleCalendar', safeTypeVersions: [1, 1.1, 1.2, 1.3], requiredParams: [], credentialType: 'googleCalendarOAuth2Api' },\n\n // Project management / CRM\n { type: 'n8n-nodes-base.notion', safeTypeVersions: [1, 2, 2.1, 2.2], requiredParams: [], credentialType: 'notionApi' },\n { type: 'n8n-nodes-base.airtable', safeTypeVersions: [1, 2, 2.1], requiredParams: [], credentialType: 'airtableTokenApi' },\n { type: 'n8n-nodes-base.github', safeTypeVersions: [1, 1.1], requiredParams: [], credentialType: 'githubApi' },\n { type: 'n8n-nodes-base.jira', safeTypeVersions: [1], requiredParams: [], credentialType: 'jiraSoftwareCloudApi' },\n { type: 'n8n-nodes-base.hubspot', safeTypeVersions: [1, 2, 2.1], requiredParams: [], credentialType: 'hubspotOAuth2Api' },\n\n // Databases\n { type: 'n8n-nodes-base.postgres', safeTypeVersions: [1, 2, 2.1, 2.2, 2.3, 2.4, 2.5], requiredParams: [], credentialType: 'postgres' },\n { type: 'n8n-nodes-base.mySql', safeTypeVersions: [1, 2, 2.1, 2.2, 2.3, 2.4], requiredParams: [], credentialType: 'mySql' },\n { type: 'n8n-nodes-base.redis', safeTypeVersions: [1], requiredParams: [], credentialType: 'redis' },\n { type: 'n8n-nodes-base.supabase', safeTypeVersions: [1], requiredParams: [], credentialType: 'supabaseApi' },\n\n // Cloud\n { type: 'n8n-nodes-base.awsS3', safeTypeVersions: [1, 2], requiredParams: [], credentialType: 'aws' },\n\n // Payment / commerce\n { type: 'n8n-nodes-base.stripe', safeTypeVersions: [1], requiredParams: [], credentialType: 'stripeApi' },\n\n // AI / LangChain root nodes\n { type: '@n8n/n8n-nodes-langchain.agent', safeTypeVersions: [1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9], requiredParams: [] },\n { type: '@n8n/n8n-nodes-langchain.chainLlm', safeTypeVersions: [1, 1.1, 1.2, 1.3, 1.4, 1.5], requiredParams: [] },\n { type: '@n8n/n8n-nodes-langchain.chainRetrievalQa', safeTypeVersions: [1, 1.1, 1.2, 1.3, 1.4], requiredParams: [] },\n { type: '@n8n/n8n-nodes-langchain.openAi', safeTypeVersions: [1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8], requiredParams: [], credentialType: 'openAiApi' },\n { type: '@n8n/n8n-nodes-langchain.anthropic', safeTypeVersions: [1], requiredParams: [], credentialType: 'anthropicApi' },\n { type: '@n8n/n8n-nodes-langchain.informationExtractor', safeTypeVersions: [1], requiredParams: [] },\n { type: '@n8n/n8n-nodes-langchain.textClassifier', safeTypeVersions: [1], requiredParams: [] },\n\n // AI / LangChain sub-nodes (models)\n { type: '@n8n/n8n-nodes-langchain.lmChatOpenAi', safeTypeVersions: [1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7], requiredParams: [], credentialType: 'openAiApi' },\n { type: '@n8n/n8n-nodes-langchain.lmChatAnthropic', safeTypeVersions: [1, 1.1, 1.2, 1.3], requiredParams: [], credentialType: 'anthropicApi' },\n { type: '@n8n/n8n-nodes-langchain.lmChatGoogleGemini', safeTypeVersions: [1], requiredParams: [], credentialType: 'googlePalmApi' },\n\n // AI / LangChain sub-nodes (memory, tools, etc.)\n { type: '@n8n/n8n-nodes-langchain.memoryBufferWindow', safeTypeVersions: [1, 1.1, 1.2, 1.3], requiredParams: [] },\n { type: '@n8n/n8n-nodes-langchain.toolWorkflow', safeTypeVersions: [1, 1.1, 1.2, 1.3], requiredParams: [] },\n { type: '@n8n/n8n-nodes-langchain.toolCode', safeTypeVersions: [1, 1.1], requiredParams: [] },\n { type: '@n8n/n8n-nodes-langchain.toolHttpRequest', safeTypeVersions: [1, 1.1], requiredParams: [] },\n { type: '@n8n/n8n-nodes-langchain.toolCalculator', safeTypeVersions: [1], requiredParams: [] },\n]\n\nexport class NodeRegistry {\n private readonly byType: Map<string, NodeDefinition>\n\n constructor(definitions: NodeDefinition[] = DEFAULT_REGISTRY) {\n this.byType = new Map(definitions.map((d) => [d.type, d]))\n }\n\n get(type: string): NodeDefinition | undefined {\n return this.byType.get(type)\n }\n\n isTrigger(type: string): boolean {\n return this.byType.get(type)?.isTrigger === true\n }\n\n isKnown(type: string): boolean {\n return this.byType.has(type)\n }\n\n isVersionSafe(type: string, version: number): boolean {\n const def = this.byType.get(type)\n if (!def) return true\n return def.safeTypeVersions.includes(version)\n }\n\n // Returns true when the version is a positive integer greater than the highest\n // known safe version — indicates a newer release rather than a bad value.\n isVersionNewer(type: string, version: number): boolean {\n const def = this.byType.get(type)\n if (!def || def.safeTypeVersions.length === 0) return false\n const max = Math.max(...def.safeTypeVersions)\n return Number.isInteger(version) && version > max\n }\n\n getRequiredParams(type: string): string[] {\n return this.byType.get(type)?.requiredParams ?? []\n }\n}\n","import type { N8nNode, N8nConnections, N8nSettings, Tag } from '../../types/workflow.js'\n\nexport interface N8nWorkflowResponse {\n id: string\n name: string\n active: boolean\n nodes: N8nNode[]\n connections: N8nConnections\n settings?: N8nSettings\n tags?: Tag[]\n createdAt: string\n updatedAt: string\n versionId?: string\n meta?: Record<string, unknown>\n pinData?: Record<string, unknown>\n staticData?: unknown\n triggerCount?: number\n shared?: boolean\n isArchived?: boolean\n}\n\nexport interface N8nWorkflowListResponse {\n data: N8nWorkflowResponse[]\n nextCursor: string | null\n}\n\nexport interface N8nExecutionResponse {\n id: string\n workflowId: string\n status: 'success' | 'error' | 'waiting' | 'running' | 'canceled'\n startedAt: string\n stoppedAt?: string\n mode: string\n data?: unknown\n workflowData?: unknown\n}\n\nexport interface N8nExecutionListResponse {\n data: N8nExecutionResponse[]\n nextCursor: string | null\n}\n\nexport interface N8nTagResponse {\n id: string\n name: string\n createdAt?: string\n updatedAt?: string\n}\n\nexport interface N8nTagListResponse {\n data: N8nTagResponse[]\n nextCursor: string | null\n}\n\nexport interface N8nNodeTypeInfo {\n name: string\n displayName: string\n version: number | number[]\n description?: string\n group?: string[]\n credentials?: Array<{ name: string; required?: boolean }>\n}\n\nexport interface N8nNodeTypeListResponse {\n data: N8nNodeTypeInfo[]\n}\n\nexport const FORBIDDEN_ON_CREATE = [\n 'id',\n 'createdAt',\n 'updatedAt',\n 'versionId',\n 'meta',\n 'isArchived',\n 'activeVersionId',\n 'activeVersion',\n 'active',\n 'pinData',\n 'triggerCount',\n 'shared',\n 'staticData',\n] as const\n\nexport const FORBIDDEN_ON_UPDATE = FORBIDDEN_ON_CREATE.filter((f) => f !== 'id')\n\nexport type ForbiddenField = (typeof FORBIDDEN_ON_CREATE)[number]\n","import type { N8nWorkflow, N8nNode } from '../types/workflow.js'\nimport type { ValidationIssue, ValidationResult } from './types.js'\nimport { NodeRegistry, DEFAULT_REGISTRY } from './registry.js'\nimport { FORBIDDEN_ON_CREATE } from '../providers/n8n/types.js'\n\nconst AI_CONNECTION_TYPES = [\n 'ai_languageModel',\n 'ai_memory',\n 'ai_tool',\n 'ai_outputParser',\n 'ai_embedding',\n 'ai_document',\n 'ai_textSplitter',\n 'ai_retriever',\n 'ai_vectorStore',\n]\n\nconst TRIGGER_TYPE_PATTERNS = [/trigger/i, /Trigger$/]\n\nconst NODE_TYPE_PATTERN = /^(@[a-z0-9-]+\\/[a-z0-9-]+\\.|n8n-nodes-[a-z0-9-]+\\.)[a-zA-Z][a-zA-Z0-9-]+$/\n\nexport class N8nValidator {\n private readonly registry: NodeRegistry\n\n constructor(registry: NodeRegistry = new NodeRegistry(DEFAULT_REGISTRY)) {\n this.registry = registry\n }\n\n validate(workflow: N8nWorkflow): ValidationResult {\n const issues: ValidationIssue[] = []\n\n this.checkRule1(workflow, issues)\n this.checkRule2(workflow, issues)\n this.checkRule3(workflow, issues)\n this.checkRule4(workflow, issues)\n this.checkRule5(workflow, issues)\n this.checkRule6(workflow, issues)\n this.checkRule7(workflow, issues)\n this.checkRule8(workflow, issues)\n this.checkRule9(workflow, issues)\n this.checkRule10(workflow, issues)\n this.checkRule11(workflow, issues)\n this.checkRule12(workflow, issues)\n this.checkRule13(workflow, issues)\n this.checkRule14(workflow, issues)\n this.checkRule15(workflow, issues)\n this.checkRule16(workflow, issues)\n this.checkRule17(workflow, issues)\n this.checkRule18(workflow, issues)\n this.checkRule19(workflow, issues)\n this.checkRule20(workflow, issues)\n this.checkRule21(workflow, issues)\n this.checkRule22(workflow, issues)\n this.checkRule23(workflow, issues)\n this.checkRule24(workflow, issues)\n this.checkRule25(workflow, issues)\n this.checkRule26(workflow, issues)\n this.checkRule27(workflow, issues)\n this.checkRule28(workflow, issues)\n this.checkRule29(workflow, issues)\n this.checkRule30(workflow, issues)\n this.checkRule31(workflow, issues)\n this.checkRule32(workflow, issues)\n this.checkRule33(workflow, issues)\n this.checkRule34(workflow, issues)\n this.checkRule35(workflow, issues)\n\n // Enrich issues with nodeType by looking up nodeId\n if (Array.isArray(workflow.nodes)) {\n const nodeById = new Map(workflow.nodes.map(n => [n.id, n.type]))\n for (const issue of issues) {\n if (issue.nodeId && !issue.nodeType) {\n const nt = nodeById.get(issue.nodeId)\n if (nt) issue.nodeType = nt\n }\n }\n }\n\n const errors = issues.filter((i) => i.severity === 'error')\n return { valid: errors.length === 0, issues }\n }\n\n private err(issues: ValidationIssue[], rule: number, message: string, nodeId?: string, nodeType?: string): void {\n const issue: ValidationIssue = { rule, severity: 'error', message }\n if (nodeId !== undefined) issue.nodeId = nodeId\n if (nodeType !== undefined) issue.nodeType = nodeType\n issues.push(issue)\n }\n\n private warn(issues: ValidationIssue[], rule: number, message: string, nodeId?: string, nodeType?: string): void {\n const issue: ValidationIssue = { rule, severity: 'warn', message }\n if (nodeId !== undefined) issue.nodeId = nodeId\n if (nodeType !== undefined) issue.nodeType = nodeType\n issues.push(issue)\n }\n\n private isTriggerNode(node: N8nNode): boolean {\n if (this.registry.isTrigger(node.type)) return true\n return TRIGGER_TYPE_PATTERNS.some((p) => p.test(node.type))\n }\n\n // Rule 1: name is a non-empty string\n private checkRule1(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (typeof w.name !== 'string' || w.name.trim() === '') {\n this.err(issues, 1, 'Workflow name is required and must be a non-empty string')\n }\n }\n\n // Rule 2: nodes is an array with at least one element\n private checkRule2(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes) || w.nodes.length === 0) {\n this.err(issues, 2, 'Workflow must have at least one node')\n }\n }\n\n // Rule 3: every node has a non-empty id\n private checkRule3(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (typeof node.id !== 'string' || node.id.trim() === '') {\n this.err(issues, 3, `Node \"${node.name ?? 'unknown'}\" is missing a valid id`, node.id)\n }\n }\n }\n\n // Rule 4: node ids are unique\n private checkRule4(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n const seen = new Set<string>()\n for (const node of w.nodes) {\n if (!node.id) continue\n if (seen.has(node.id)) {\n this.err(issues, 4, `Duplicate node id: \"${node.id}\"`, node.id)\n }\n seen.add(node.id)\n }\n }\n\n // Rule 5: every node has a non-empty type string\n private checkRule5(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (typeof node.type !== 'string' || node.type.trim() === '') {\n this.err(issues, 5, `Node \"${node.name ?? node.id}\" is missing a type`, node.id)\n }\n }\n }\n\n // Rule 6: every node has a positive typeVersion number\n private checkRule6(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (typeof node.typeVersion !== 'number' || node.typeVersion <= 0) {\n this.err(issues, 6, `Node \"${node.name}\" has invalid typeVersion: ${String(node.typeVersion)}`, node.id)\n }\n }\n }\n\n // Rule 7: every node has a valid [x, y] position\n private checkRule7(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n const pos = node.position\n if (\n !Array.isArray(pos) ||\n pos.length !== 2 ||\n typeof pos[0] !== 'number' ||\n typeof pos[1] !== 'number'\n ) {\n this.err(issues, 7, `Node \"${node.name}\" has invalid position (must be [x, y])`, node.id)\n }\n }\n }\n\n // Rule 8: every node has a non-empty name\n private checkRule8(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (typeof node.name !== 'string' || node.name.trim() === '') {\n this.err(issues, 8, `Node with id \"${node.id}\" is missing a name`, node.id)\n }\n }\n }\n\n // Rule 9: connections is a plain object\n private checkRule9(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (typeof w.connections !== 'object' || w.connections === null || Array.isArray(w.connections)) {\n this.err(issues, 9, 'connections must be a plain object (use {} for single-node workflows)')\n }\n }\n\n // Rule 10: every connection target node name exists in nodes\n private checkRule10(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes) || typeof w.connections !== 'object' || w.connections === null) return\n const nodeNames = new Set(w.nodes.map((n) => n.name))\n for (const [sourceName, outputs] of Object.entries(w.connections)) {\n if (!nodeNames.has(sourceName)) {\n this.err(issues, 10, `Connection source \"${sourceName}\" does not exist in nodes`)\n continue\n }\n if (typeof outputs !== 'object' || outputs === null) continue\n for (const portGroup of Object.values(outputs)) {\n if (!Array.isArray(portGroup)) continue\n for (const targets of portGroup) {\n if (!Array.isArray(targets)) continue\n for (const target of targets) {\n const t = target as { node?: string }\n if (typeof t?.node === 'string' && !nodeNames.has(t.node)) {\n this.err(issues, 10, `Connection target \"${t.node}\" does not exist in nodes`)\n }\n }\n }\n }\n }\n }\n\n // Rule 11 (WARN): every non-trigger node has at least one incoming connection\n private checkRule11(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes) || typeof w.connections !== 'object' || w.connections === null) return\n const reachable = new Set<string>()\n // Track nodes that are sources of ai_* connections — they are purposefully\n // connectionless on main; they feed the agent as sub-nodes.\n const aiSubNodeSources = new Set<string>()\n for (const [sourceName, outputs] of Object.entries(w.connections)) {\n if (typeof outputs !== 'object' || outputs === null) continue\n let hasAiPort = false\n for (const [portName, portGroup] of Object.entries(outputs)) {\n if (!Array.isArray(portGroup)) continue\n const isAiPort = portName.startsWith('ai_')\n if (isAiPort) hasAiPort = true\n for (const targets of portGroup) {\n if (!Array.isArray(targets)) continue\n for (const target of targets) {\n const t = target as { node?: string }\n if (typeof t?.node === 'string') reachable.add(t.node)\n }\n }\n }\n if (hasAiPort) aiSubNodeSources.add(sourceName)\n }\n for (const node of w.nodes) {\n if (node.type.includes('stickyNote')) continue\n if (this.isTriggerNode(node)) continue\n if (aiSubNodeSources.has(node.name)) continue\n if (!reachable.has(node.name)) {\n this.warn(issues, 11, `Node \"${node.name}\" has no incoming connections and may never execute`, node.id)\n }\n }\n }\n\n // Rule 12: forbidden fields absent from workflow root\n private checkRule12(w: N8nWorkflow, issues: ValidationIssue[]): void {\n const wObj = w as unknown as Record<string, unknown>\n for (const field of FORBIDDEN_ON_CREATE) {\n if (field in wObj) {\n this.err(issues, 12, `Forbidden field \"${field}\" present in workflow — remove it before deploying`)\n }\n }\n }\n\n // Rule 13: settings, if present, is a plain object\n private checkRule13(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (w.settings !== undefined) {\n if (typeof w.settings !== 'object' || w.settings === null || Array.isArray(w.settings)) {\n this.err(issues, 13, 'workflow.settings must be a plain object')\n }\n }\n }\n\n // Rule 14: at least one trigger node is present\n private checkRule14(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n const hasTrigger = w.nodes.some((n) => this.isTriggerNode(n))\n if (!hasTrigger) {\n this.err(issues, 14, 'Workflow must contain at least one trigger node')\n }\n }\n\n // Rule 15: node type string matches expected format\n private checkRule15(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (typeof node.type !== 'string') continue\n if (!NODE_TYPE_PATTERN.test(node.type)) {\n this.err(issues, 15, `Node \"${node.name}\" has malformed type string: \"${node.type}\"`, node.id)\n }\n }\n }\n\n // Rule 16: node names are unique within the workflow\n private checkRule16(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n const seen = new Set<string>()\n for (const node of w.nodes) {\n if (!node.name) continue\n if (seen.has(node.name)) {\n this.err(issues, 16, `Duplicate node name: \"${node.name}\"`, node.id)\n }\n seen.add(node.name)\n }\n }\n\n // Rule 17: credentials shape — each entry has id and name\n private checkRule17(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (!node.credentials) continue\n for (const [credType, credRef] of Object.entries(node.credentials)) {\n if (typeof credRef !== 'object' || credRef === null) {\n this.err(issues, 17, `Node \"${node.name}\" credential \"${credType}\" must be an object with id and name`, node.id)\n continue\n }\n const ref = credRef as unknown as Record<string, unknown>\n if (\n typeof ref['id'] !== 'string' || ref['id'].trim() === '' ||\n typeof ref['name'] !== 'string' || ref['name'].trim() === ''\n ) {\n this.err(issues, 17, `Node \"${node.name}\" credential \"${credType}\" must have non-empty string id and name fields`, node.id)\n }\n }\n }\n }\n\n // Rule 18 (ERROR): AI connections must originate from sub-nodes, not the agent/chain root\n private checkRule18(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (typeof w.connections !== 'object' || w.connections === null) return\n const agentTypes = new Set([\n '@n8n/n8n-nodes-langchain.agent',\n '@n8n/n8n-nodes-langchain.chainLlm',\n '@n8n/n8n-nodes-langchain.chainRetrievalQa',\n '@n8n/n8n-nodes-langchain.chainSummarization',\n ])\n if (!Array.isArray(w.nodes)) return\n const nodesByName = new Map(w.nodes.map((n) => [n.name, n]))\n\n for (const [sourceName, outputs] of Object.entries(w.connections)) {\n const sourceNode = nodesByName.get(sourceName)\n if (!sourceNode) continue\n if (!agentTypes.has(sourceNode.type)) continue\n if (typeof outputs !== 'object' || outputs === null) continue\n for (const connType of AI_CONNECTION_TYPES) {\n if (connType in outputs) {\n this.err(\n issues,\n 18,\n `Node \"${sourceName}\" uses AI connection type \"${connType}\" as a SOURCE — AI sub-nodes should be the source, not the agent/chain root`,\n sourceNode.id,\n )\n }\n }\n }\n }\n\n // Rule 19 (WARN): typeVersion is within known safe range for registered node types.\n // In lenient mode (KAIROS_REGISTRY_STRICT != 'true'), versions higher than the known\n // max are allowed — they likely represent newer n8n releases Kairos hasn't catalogued yet.\n private checkRule19(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n const strict = process.env['KAIROS_REGISTRY_STRICT'] === 'true'\n for (const node of w.nodes) {\n if (typeof node.type !== 'string' || typeof node.typeVersion !== 'number') continue\n if (this.registry.isVersionSafe(node.type, node.typeVersion)) continue\n // In lenient mode (default), a version that is simply higher than our known max\n // is likely a newer n8n release — skip the warning.\n if (!strict && this.registry.isVersionNewer(node.type, node.typeVersion)) continue\n this.warn(\n issues,\n 19,\n `Node \"${node.name}\" uses typeVersion ${node.typeVersion} for type \"${node.type}\" which is not in the known safe list`,\n node.id,\n )\n }\n }\n\n // Rule 20 (WARN): cycle detection — no node should be reachable from itself\n // Exempts splitInBatches loops which are an intentional n8n pattern\n private checkRule20(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes) || typeof w.connections !== 'object' || w.connections === null) return\n\n const splitBatchNodes = new Set(\n w.nodes.filter((n) => n.type.includes('splitInBatches')).map((n) => n.name),\n )\n\n const adj = new Map<string, string[]>()\n for (const [sourceName, outputs] of Object.entries(w.connections)) {\n if (typeof outputs !== 'object' || outputs === null) continue\n const targets: string[] = []\n for (const portGroup of Object.values(outputs)) {\n if (!Array.isArray(portGroup)) continue\n for (const conns of portGroup) {\n if (!Array.isArray(conns)) continue\n for (const conn of conns) {\n const t = conn as { node?: string }\n if (typeof t?.node === 'string') {\n if (splitBatchNodes.has(t.node)) continue\n targets.push(t.node)\n }\n }\n }\n }\n adj.set(sourceName, targets)\n }\n\n const WHITE = 0, GRAY = 1, BLACK = 2\n const color = new Map<string, number>()\n for (const node of w.nodes) color.set(node.name, WHITE)\n\n const dfs = (name: string): boolean => {\n color.set(name, GRAY)\n for (const neighbor of adj.get(name) ?? []) {\n const c = color.get(neighbor)\n if (c === GRAY) return true\n if (c === WHITE && dfs(neighbor)) return true\n }\n color.set(name, BLACK)\n return false\n }\n\n for (const node of w.nodes) {\n if (color.get(node.name) === WHITE && dfs(node.name)) {\n this.warn(issues, 20, 'Workflow contains a connection cycle — this may cause infinite loops')\n return\n }\n }\n }\n\n // Rule 21 (WARN): webhook with responseMode=\"responseNode\" must have respondToWebhook node\n private checkRule21(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n\n const webhooksNeedingResponse = w.nodes.filter((n) => {\n if (!n.type.includes('webhook')) return false\n const params = n.parameters as Record<string, unknown> | undefined\n return params?.responseMode === 'responseNode'\n })\n\n if (webhooksNeedingResponse.length === 0) return\n\n const hasRespondNode = w.nodes.some((n) => n.type.includes('respondToWebhook'))\n if (!hasRespondNode) {\n for (const wh of webhooksNeedingResponse) {\n this.warn(\n issues,\n 21,\n `Webhook \"${wh.name}\" uses responseMode \"responseNode\" but no respondToWebhook node exists in the workflow`,\n wh.id,\n )\n }\n }\n }\n\n // Rule 22 (WARN): check requiredParams from registry\n private checkRule22(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (typeof node.type !== 'string') continue\n const required = this.registry.getRequiredParams(node.type)\n if (required.length === 0) continue\n const params = (node.parameters ?? {}) as Record<string, unknown>\n for (const param of required) {\n const value = params[param]\n if (value === undefined || value === null || value === '') {\n this.warn(\n issues,\n 22,\n `Node \"${node.name}\" (${node.type}) is missing required parameter \"${param}\"`,\n node.id,\n )\n }\n }\n }\n }\n\n // Rule 23 (WARN): unknown node types not in registry\n private checkRule23(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (typeof node.type !== 'string') continue\n if (node.type.includes('stickyNote')) continue\n if (!NODE_TYPE_PATTERN.test(node.type)) continue\n if (!this.registry.isKnown(node.type)) {\n this.warn(\n issues,\n 23,\n `Node \"${node.name}\" uses unknown type \"${node.type}\" — it may not exist in n8n`,\n node.id,\n )\n }\n }\n }\n\n // Rule 24 (WARN): deprecated accessor syntax in expressions\n private checkRule24(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n const deprecated = /\\$node\\s*\\[/\n for (const node of w.nodes) {\n for (const expr of this.extractExpressions(node.parameters)) {\n if (deprecated.test(expr)) {\n this.warn(\n issues,\n 24,\n `Node \"${node.name}\" uses deprecated accessor $node[\"...\"] — use $('NodeName').item.json.field instead`,\n node.id,\n )\n break\n }\n }\n }\n }\n\n // Rule 25 (WARN): wrong item index assumptions in expressions\n private checkRule25(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n const itemIndex = /\\$json\\s*\\.\\s*items\\s*\\[/\n for (const node of w.nodes) {\n for (const expr of this.extractExpressions(node.parameters)) {\n if (itemIndex.test(expr)) {\n this.warn(\n issues,\n 25,\n `Node \"${node.name}\" accesses $json.items[n] — n8n flattens items automatically, use $json.field directly`,\n node.id,\n )\n break\n }\n }\n }\n }\n\n // Rule 26 (WARN): missing .first() or .all() on node references\n private checkRule26(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n const bareRef = /\\$\\(\\s*'[^']+'\\s*\\)\\s*\\.json/\n for (const node of w.nodes) {\n for (const expr of this.extractExpressions(node.parameters)) {\n if (bareRef.test(expr)) {\n this.warn(\n issues,\n 26,\n `Node \"${node.name}\" references $('NodeName').json without .first() or .all() — use $('NodeName').first().json.field`,\n node.id,\n )\n break\n }\n }\n }\n }\n\n private extractExpressions(params: Record<string, unknown>): string[] {\n const expressions: string[] = []\n const walk = (val: unknown): void => {\n if (typeof val === 'string') {\n if (val.includes('={{') || val.includes('$node') || val.includes(\"$('\")) {\n expressions.push(val)\n }\n } else if (Array.isArray(val)) {\n for (const item of val) walk(item)\n } else if (val !== null && typeof val === 'object') {\n for (const v of Object.values(val as Record<string, unknown>)) walk(v)\n }\n }\n walk(params)\n return expressions\n }\n\n // Rule 27 (WARN): httpRequest URL is a placeholder\n private checkRule27(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n const PLACEHOLDER_RE = [\n /^https?:\\/\\/example\\.com/i,\n /your[-_]?(api[-_]?)?url/i,\n /^https?:\\/\\/$/,\n /^<.+>$/,\n /placeholder/i,\n ]\n for (const node of w.nodes) {\n if (node.type !== 'n8n-nodes-base.httpRequest') continue\n const params = node.parameters as Record<string, unknown> | undefined\n const url = params?.['url']\n if (typeof url !== 'string' || url.trim() === '') continue\n if (PLACEHOLDER_RE.some((re) => re.test(url.trim()))) {\n this.warn(\n issues,\n 27,\n `Node \"${node.name}\" httpRequest URL appears to be a placeholder: \"${url}\" — replace with your actual endpoint`,\n node.id,\n )\n }\n }\n }\n\n // Rule 28 (WARN): code node with empty or comment-only code\n private checkRule28(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (node.type !== 'n8n-nodes-base.code') continue\n const params = node.parameters as Record<string, unknown> | undefined\n const jsCode = typeof params?.['jsCode'] === 'string' ? params['jsCode'] : ''\n const pythonCode = typeof params?.['pythonCode'] === 'string' ? params['pythonCode'] : ''\n const code = jsCode || pythonCode\n const stripped = code\n .replace(/\\/\\/[^\\n]*/g, '')\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n .replace(/#[^\\n]*/g, '')\n .trim()\n if (!stripped) {\n this.warn(issues, 28, `Node \"${node.name}\" code node has no executable code`, node.id)\n }\n }\n }\n\n // Rule 29 (WARN): slack node message operation missing channel\n private checkRule29(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (node.type !== 'n8n-nodes-base.slack') continue\n const params = node.parameters as Record<string, unknown> | undefined\n const resource = params?.['resource'] as string | undefined\n const operation = params?.['operation'] as string | undefined\n const isMessageOp = resource === 'message' || operation === 'sendMessage' || operation === 'post'\n if (!isMessageOp) continue\n const channel = params?.['channel'] ?? params?.['channelId']\n const rlValue = typeof channel === 'object' && channel !== null\n ? (channel as Record<string, unknown>)['value']\n : undefined\n const isEmpty = channel === undefined || channel === null ||\n (typeof channel === 'string' && channel.trim() === '') ||\n (typeof channel === 'object' && (!rlValue || (typeof rlValue === 'string' && rlValue.trim() === '')))\n if (isEmpty) {\n this.warn(issues, 29, `Node \"${node.name}\" Slack message has no channel specified`, node.id)\n }\n }\n }\n\n // Rule 30 (WARN): gmail node send operation missing recipient\n private checkRule30(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (node.type !== 'n8n-nodes-base.gmail') continue\n const params = node.parameters as Record<string, unknown> | undefined\n const operation = params?.['operation'] as string | undefined\n if (operation !== 'send') continue\n const to = params?.['to'] ?? params?.['toList']\n const isEmpty = to === undefined || to === null ||\n (typeof to === 'string' && to.trim() === '') ||\n (Array.isArray(to) && to.length === 0)\n if (isEmpty) {\n this.warn(issues, 30, `Node \"${node.name}\" gmail send has no recipient (to) specified`, node.id)\n }\n }\n }\n\n // Rule 31 (WARN): if node with empty conditions\n private checkRule31(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (node.type !== 'n8n-nodes-base.if') continue\n const params = node.parameters as Record<string, unknown> | undefined\n const conditions = params?.['conditions']\n if (conditions === undefined || conditions === null) {\n this.warn(issues, 31, `Node \"${node.name}\" if node has no conditions defined`, node.id)\n continue\n }\n // typeVersion 2.x: { combinator, conditions: [...] }\n if (typeof conditions === 'object' && !Array.isArray(conditions)) {\n const conds = (conditions as Record<string, unknown>)['conditions']\n if (!Array.isArray(conds) || conds.length === 0) {\n this.warn(issues, 31, `Node \"${node.name}\" if node conditions array is empty`, node.id)\n }\n } else if (Array.isArray(conditions) && conditions.length === 0) {\n this.warn(issues, 31, `Node \"${node.name}\" if node conditions array is empty`, node.id)\n }\n }\n }\n\n // Rule 32 (WARN): set node with no assignments\n private checkRule32(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (node.type !== 'n8n-nodes-base.set') continue\n const params = node.parameters as Record<string, unknown> | undefined\n // typeVersion 3.x: assignments.assignments[]\n const assignmentsObj = params?.['assignments'] as Record<string, unknown> | undefined\n const assignmentsArr = assignmentsObj?.['assignments']\n // typeVersion 1.x: values.string[] / values.number[] etc.\n const valuesObj = params?.['values'] as Record<string, unknown> | undefined\n const hasV1 = valuesObj && Object.values(valuesObj).some((v) => Array.isArray(v) && v.length > 0)\n const hasV3 = Array.isArray(assignmentsArr) && assignmentsArr.length > 0\n if (!hasV1 && !hasV3) {\n this.warn(\n issues,\n 32,\n `Node \"${node.name}\" set node has no fields defined — it will pass data through unchanged`,\n node.id,\n )\n }\n }\n }\n\n // Rule 33 (WARN): scheduleTrigger with no schedule rules\n private checkRule33(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (node.type !== 'n8n-nodes-base.scheduleTrigger') continue\n const params = node.parameters as Record<string, unknown> | undefined\n const rule = params?.['rule'] as Record<string, unknown> | undefined\n const intervals = rule?.['interval']\n if (!Array.isArray(intervals) || intervals.length === 0) {\n this.warn(issues, 33, `Node \"${node.name}\" scheduleTrigger has no schedule rules defined`, node.id)\n }\n }\n }\n\n // Rule 35 (WARN): email-sending node with no duplicate-prevention signal\n private checkRule35(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n\n const sendNodes = w.nodes.filter(node => {\n if (node.type === 'n8n-nodes-base.gmail') {\n const op = (node.parameters as Record<string, unknown> | undefined)?.['operation'] as string | undefined\n // Default operation on Gmail node is send; also flag explicit send/reply\n return !op || op === 'send' || op === 'sendEmail' || op === 'reply'\n }\n return (\n node.type === 'n8n-nodes-base.emailSend' ||\n node.type === 'n8n-nodes-base.sendEmail'\n )\n })\n\n if (sendNodes.length === 0) return\n\n // Look for idempotency signals anywhere in the workflow JSON\n const workflowText = JSON.stringify(w).toLowerCase()\n const IDEMPOTENCY_SIGNALS = [\n 'sent_at', 'last_sent', 'last_reminder', 'processed_at',\n 'already_sent', 'email_sent', 'notified_at', 'reminder_sent',\n 'contacted_at', 'dedupe', 'idempotent',\n ]\n const hasIdempotencySignal = IDEMPOTENCY_SIGNALS.some(s => workflowText.includes(s))\n\n if (!hasIdempotencySignal) {\n for (const node of sendNodes) {\n this.warn(\n issues,\n 35,\n `Node \"${node.name}\" sends email but no duplicate-prevention signal detected — ` +\n `add a sent_at timestamp field, a prior-send IF check, or a deduplication key to avoid repeat sends`,\n node.id,\n )\n }\n }\n }\n\n // Rule 34 (WARN): webhook path contains spaces, starts with slash, or looks like a full URL\n private checkRule34(w: N8nWorkflow, issues: ValidationIssue[]): void {\n if (!Array.isArray(w.nodes)) return\n for (const node of w.nodes) {\n if (node.type !== 'n8n-nodes-base.webhook') continue\n const params = node.parameters as Record<string, unknown> | undefined\n const path = params?.['path']\n if (typeof path !== 'string') continue\n if (/\\s/.test(path)) {\n this.warn(\n issues,\n 34,\n `Node \"${node.name}\" webhook path contains spaces: \"${path}\" — use hyphens or underscores instead`,\n node.id,\n )\n } else if (/^https?:\\/\\//i.test(path)) {\n this.warn(\n issues,\n 34,\n `Node \"${node.name}\" webhook path looks like a full URL — it should be a relative path (e.g. \"my-hook\")`,\n node.id,\n )\n } else if (path.startsWith('/')) {\n this.warn(\n issues,\n 34,\n `Node \"${node.name}\" webhook path starts with \"/\" — n8n adds the leading slash automatically`,\n node.id,\n )\n }\n }\n }\n}\n","import type { N8nWorkflow } from '../../types/workflow.js'\nimport { FORBIDDEN_ON_CREATE, FORBIDDEN_ON_UPDATE } from './types.js'\n\nexport class N8nFieldStripper {\n stripForCreate(workflow: N8nWorkflow): N8nWorkflow {\n return this.strip(workflow, FORBIDDEN_ON_CREATE as readonly string[])\n }\n\n stripForUpdate(workflow: N8nWorkflow): N8nWorkflow {\n return this.strip(workflow, FORBIDDEN_ON_UPDATE as readonly string[])\n }\n\n private strip(workflow: N8nWorkflow, forbidden: readonly string[]): N8nWorkflow {\n const result = { ...workflow } as unknown as Record<string, unknown>\n for (const field of forbidden) {\n delete result[field]\n }\n return result as unknown as N8nWorkflow\n }\n}\n","export class KairosError extends Error {\n constructor(message: string, public readonly cause?: unknown) {\n super(message)\n this.name = 'KairosError'\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n}\n","import { KairosError } from './base.js'\n\nexport class ApiError extends KairosError {\n constructor(\n message: string,\n public readonly statusCode: number,\n cause?: unknown,\n ) {\n super(message, cause)\n this.name = 'ApiError'\n }\n}\n","import { KairosError } from './base.js'\n\nexport class ProviderError extends KairosError {\n constructor(message: string, cause?: unknown) {\n super(message, cause)\n this.name = 'ProviderError'\n }\n}\n","import { KairosError } from './base.js'\n\nexport class GuardError extends KairosError {\n constructor(message: string) {\n super(message)\n this.name = 'GuardError'\n }\n}\n","// ECONNRESET/ETIMEDOUT/ECONNREFUSED mean the request never completed — safe to retry.\n// Walks the .cause chain up to 4 levels because Node's fetch wraps errors:\n// ProviderError → TypeError(\"fetch failed\") → SystemError { code: 'ECONNRESET' }\nexport function isTransientNetworkError(err: unknown): boolean {\n const TRANSIENT_CODES = new Set(['ECONNRESET', 'ETIMEDOUT', 'ECONNREFUSED', 'ENOTFOUND', 'ECONNABORTED'])\n let current: unknown = err\n for (let i = 0; i < 4; i++) {\n if (current === null || typeof current !== 'object') break\n const code = (current as { code?: string }).code\n if (typeof code === 'string' && TRANSIENT_CODES.has(code)) return true\n current = (current as { cause?: unknown }).cause\n }\n return false\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n maxAttempts: number,\n delayMs: number,\n shouldRetry?: (err: unknown) => boolean,\n): Promise<T> {\n let lastError: unknown\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n if (attempt > 0) {\n const jitter = Math.random() * delayMs * 0.5\n await new Promise((resolve) => setTimeout(resolve, delayMs * 2 ** (attempt - 1) + jitter))\n }\n try {\n return await fn()\n } catch (err) {\n lastError = err\n if (shouldRetry && !shouldRetry(err)) throw err\n }\n }\n throw lastError\n}\n\nexport function fetchWithTimeout(url: string, init: RequestInit, timeoutMs: number): Promise<Response> {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), timeoutMs)\n return fetch(url, { ...init, signal: controller.signal }).finally(() => clearTimeout(timer))\n}\n","import type { N8nWorkflow, Tag } from '../../types/workflow.js'\nimport type { WorkflowListItem, ExecutionSummary, ExecutionDetail } from '../../types/result.js'\nimport type { ExecutionFilter } from '../../types/options.js'\nimport type { ILogger } from '../../utils/logger.js'\nimport { ApiError } from '../../errors/api-error.js'\nimport { ProviderError } from '../../errors/provider-error.js'\nimport { GuardError } from '../../errors/guard-error.js'\nimport { withRetry, fetchWithTimeout, isTransientNetworkError } from '../../utils/retry.js'\nimport type {\n N8nWorkflowResponse,\n N8nWorkflowListResponse,\n N8nExecutionResponse,\n N8nExecutionListResponse,\n N8nTagResponse,\n N8nTagListResponse,\n N8nNodeTypeInfo,\n N8nNodeTypeListResponse,\n} from './types.js'\n\nconst EXECUTION_LIMIT_CAP = 100\nconst N8N_API_PAGE_SIZE = 250\nconst REQUEST_TIMEOUT_MS = 30_000\nconst RETRY_ATTEMPTS = 3\nconst RETRY_DELAY_MS = 1000\n\nexport class N8nApiClient {\n constructor(\n private readonly baseUrl: string,\n private readonly apiKey: string,\n private readonly logger: ILogger,\n ) {\n if (!baseUrl || typeof baseUrl !== 'string') {\n throw new GuardError('N8nApiClient: baseUrl must be a non-empty string')\n }\n try {\n new URL(baseUrl)\n } catch {\n throw new GuardError(`N8nApiClient: baseUrl is not a valid URL: \"${baseUrl}\"`)\n }\n if (!apiKey || typeof apiKey !== 'string') {\n throw new GuardError('N8nApiClient: apiKey must be a non-empty string')\n }\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl.replace(/\\/$/, '')}/api/v1${path}`\n this.logger.debug(`n8n ${method} ${path}`)\n\n const isSafe = method === 'GET'\n\n // Non-safe (mutating) requests retry only on transient connection errors — these mean\n // the request never reached the server, so re-sending is safe.\n if (!isSafe) {\n return withRetry(\n () => this.singleRequest<T>(url, method, path, body),\n 2,\n RETRY_DELAY_MS,\n isTransientNetworkError,\n )\n }\n\n return withRetry(\n () => this.singleRequest<T>(url, method, path, body),\n RETRY_ATTEMPTS,\n RETRY_DELAY_MS,\n (err) => err instanceof ProviderError || (err instanceof ApiError && err.statusCode === 429),\n )\n }\n\n private async singleRequest<T>(url: string, method: string, path: string, body?: unknown): Promise<T> {\n let response: Response\n try {\n response = await fetchWithTimeout(url, {\n method,\n headers: {\n 'X-N8N-API-KEY': this.apiKey,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n }, REQUEST_TIMEOUT_MS)\n } catch (err) {\n throw new ProviderError(`Network error calling n8n API: ${path}`, err)\n }\n\n if (!response.ok) {\n let errorBody: unknown\n try {\n errorBody = await response.json()\n } catch {\n errorBody = await response.text().catch(() => '')\n }\n this.logger.error(`n8n API error ${response.status} on ${method} ${path}`, {\n status: response.status,\n body: String(errorBody),\n })\n throw new ApiError(\n `n8n API returned ${response.status} for ${method} ${path}: ${JSON.stringify(errorBody)}`,\n response.status,\n errorBody,\n )\n }\n\n if (response.status === 204) return undefined as T\n return response.json() as Promise<T>\n }\n\n async createWorkflow(workflow: N8nWorkflow): Promise<N8nWorkflowResponse> {\n return this.request<N8nWorkflowResponse>('POST', '/workflows', workflow)\n }\n\n async updateWorkflow(id: string, workflow: N8nWorkflow): Promise<N8nWorkflowResponse> {\n return this.request<N8nWorkflowResponse>('PUT', `/workflows/${id}`, workflow)\n }\n\n async getWorkflow(id: string): Promise<N8nWorkflowResponse> {\n return this.request<N8nWorkflowResponse>('GET', `/workflows/${id}`)\n }\n\n async listWorkflows(): Promise<WorkflowListItem[]> {\n const all: WorkflowListItem[] = []\n let path = `/workflows?limit=${N8N_API_PAGE_SIZE}`\n\n for (;;) {\n const response: N8nWorkflowListResponse = await this.request<N8nWorkflowListResponse>('GET', path)\n for (const w of response.data) {\n all.push({\n id: w.id,\n name: w.name,\n active: w.active,\n createdAt: w.createdAt,\n updatedAt: w.updatedAt,\n ...(w.tags !== undefined ? { tags: w.tags } : {}),\n })\n }\n if (!response.nextCursor) break\n path = `/workflows?limit=${N8N_API_PAGE_SIZE}&cursor=${response.nextCursor}`\n }\n\n return all\n }\n\n async deleteWorkflow(id: string): Promise<void> {\n await this.request<void>('DELETE', `/workflows/${id}`)\n }\n\n async activateWorkflow(id: string): Promise<void> {\n await this.request<void>('POST', `/workflows/${id}/activate`)\n }\n\n async deactivateWorkflow(id: string): Promise<void> {\n await this.request<void>('POST', `/workflows/${id}/deactivate`)\n }\n\n async getExecutions(workflowId?: string, filter?: ExecutionFilter): Promise<ExecutionSummary[]> {\n const params = new URLSearchParams()\n if (workflowId) params.set('workflowId', workflowId)\n if (filter?.status) params.set('status', filter.status)\n const limit = Math.min(filter?.limit ?? 20, EXECUTION_LIMIT_CAP)\n params.set('limit', String(limit))\n if (filter?.cursor) params.set('cursor', filter.cursor)\n\n const qs = params.toString()\n const response = await this.request<N8nExecutionListResponse>('GET', `/executions${qs ? `?${qs}` : ''}`)\n return response.data.map(this.mapExecution)\n }\n\n async getExecution(id: string): Promise<ExecutionDetail> {\n const response = await this.request<N8nExecutionResponse>('GET', `/executions/${id}`)\n return { ...this.mapExecution(response), data: response.data, workflowData: response.workflowData }\n }\n\n async listTags(): Promise<Tag[]> {\n const all: Tag[] = []\n let path = `/tags?limit=${N8N_API_PAGE_SIZE}`\n\n for (;;) {\n const response: N8nTagListResponse = await this.request<N8nTagListResponse>('GET', path)\n for (const t of response.data) {\n all.push({ id: t.id, name: t.name })\n }\n if (!response.nextCursor) break\n path = `/tags?limit=${N8N_API_PAGE_SIZE}&cursor=${response.nextCursor}`\n }\n\n return all\n }\n\n async createTag(name: string): Promise<Tag> {\n const response = await this.request<N8nTagResponse>('POST', '/tags', { name })\n return { id: response.id, name: response.name }\n }\n\n async tagWorkflow(workflowId: string, tagIds: string[]): Promise<void> {\n await this.request<void>('PUT', `/workflows/${workflowId}/tags`, tagIds.map((id) => ({ id })))\n }\n\n async untagWorkflow(workflowId: string, tagIds: string[]): Promise<void> {\n const current = await this.getWorkflow(workflowId)\n const remaining = (current.tags ?? [])\n .filter((t) => !tagIds.includes(t.id))\n .map((t) => ({ id: t.id }))\n await this.request<void>('PUT', `/workflows/${workflowId}/tags`, remaining)\n }\n\n async getNodeTypes(): Promise<N8nNodeTypeInfo[]> {\n try {\n const response = await this.request<N8nNodeTypeListResponse>('GET', '/node-types')\n return response.data ?? response as unknown as N8nNodeTypeInfo[]\n } catch {\n return []\n }\n }\n\n async triggerManual(workflowId: string): Promise<string> {\n const raw = await this.request<Record<string, unknown>>('POST', `/workflows/${workflowId}/run`)\n const inner = raw['data'] as Record<string, unknown> | undefined\n const execId = inner?.['executionId'] ?? raw['executionId']\n if (execId === undefined || execId === null) {\n throw new ProviderError(\n `n8n trigger response missing executionId — got: ${JSON.stringify(raw)}`,\n )\n }\n return String(execId)\n }\n\n async triggerWebhookTest(path: string): Promise<number> {\n const cleanPath = path.startsWith('/') ? path : `/${path}`\n const url = `${this.baseUrl.replace(/\\/$/, '')}/webhook-test${cleanPath}`\n this.logger.debug(`n8n POST webhook-test ${cleanPath}`)\n try {\n const response = await fetchWithTimeout(\n url,\n { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({}) },\n REQUEST_TIMEOUT_MS,\n )\n return response.status\n } catch (err) {\n throw new ProviderError(`Webhook test request failed for path \"${path}\"`, err)\n }\n }\n\n private mapExecution(e: N8nExecutionResponse): ExecutionSummary {\n return {\n id: e.id,\n workflowId: e.workflowId,\n status: e.status,\n startedAt: e.startedAt,\n ...(e.stoppedAt !== undefined ? { stoppedAt: e.stoppedAt } : {}),\n mode: e.mode,\n }\n }\n}\n","import { readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\nimport type { WorkflowMatch } from '../library/types.js'\nimport type { RuleFailureRate } from '../telemetry/reader.js'\nimport type { PatternAnalysis, Pattern } from '../telemetry/pattern-analyzer.js'\nimport type { DesignRequest, BuiltPrompt, SystemPromptBlock } from './types.js'\nimport { SYSTEM_PROMPT_V1 } from './prompts/v1.js'\nimport { scoreToMode } from '../utils/thresholds.js'\nimport { RULE_MITIGATIONS, RULE_EXAMPLES } from '../validation/rule-metadata.js'\n\nconst CRITICAL_SCORE_THRESHOLD = 0.15\n\ntype PromptProfile = 'minimal' | 'standard' | 'rich'\n\nfunction resolveProfile(): PromptProfile {\n const env = process.env['KAIROS_PROMPT_PROFILE']\n if (env === 'minimal' || env === 'standard' || env === 'rich') return env\n return 'standard'\n}\n\nconst PROACTIVE_EXPRESSION_GUIDANCE = `## Expression Syntax Quick Reference\\n\\nAlways use these patterns in expressions:\\n- Access node data: $('NodeName').item.json.field (not $node[\"NodeName\"].json)\\n- Access JSON field: $json.field (not $json.items[0].field)\\n- Single item: $('NodeName').first().json.field\\n- All items: $('NodeName').all()`\n\nexport class PromptBuilder {\n private readonly patternsPath: string\n private readonly profile: PromptProfile\n private _lastActivePatterns: Pattern[] | null = null\n\n constructor(patternsPath?: string, profile?: PromptProfile) {\n this.patternsPath = patternsPath ?? join(homedir(), '.kairos', 'patterns.json')\n this.profile = profile ?? resolveProfile()\n }\n\n private resolveMaxPatterns(): number {\n if (this.profile === 'minimal') return 3\n if (this.profile === 'rich') return 15\n return 10\n }\n\n build(request: DesignRequest, matches: WorkflowMatch[], globalFailureRates: RuleFailureRate[] = [], dynamicCatalog?: string): BuiltPrompt {\n const mode = this.resolveMode(matches)\n const system = this.buildSystem(matches, mode, globalFailureRates, dynamicCatalog, request.description)\n const userMessage = this.buildUserMessage(request, matches, mode)\n return { system, userMessage, mode, matches }\n }\n\n buildCorrectionMessage(\n request: DesignRequest,\n matches: WorkflowMatch[],\n allIssues: string[],\n attempt: number,\n failingRuleIds?: number[],\n ): string {\n const base = this.buildUserMessage(request, matches, this.resolveMode(matches))\n\n let examplesSection = ''\n if (failingRuleIds && failingRuleIds.length > 0) {\n const uniqueRules = [...new Set(failingRuleIds)]\n const exampleLines: string[] = []\n for (const rule of uniqueRules) {\n const ex = RULE_EXAMPLES[rule]\n if (ex) {\n exampleLines.push(`Rule ${rule}:\\n Bad: ${ex.bad}\\n Good: ${ex.good}`)\n }\n }\n if (exampleLines.length > 0) {\n examplesSection = `\\n\\n## Concrete Fix Examples\\n${exampleLines.join('\\n\\n')}`\n }\n }\n\n return `${base}\n\nIMPORTANT: A previous generation attempt (attempt ${attempt}) failed validation with these issues:\n${allIssues.join('\\n')}\n\nFix ALL of the above issues in your new response. Do not repeat any of these mistakes.${examplesSection}`\n }\n\n private resolveMode(matches: WorkflowMatch[]): 'direct' | 'reference' | 'scratch' {\n if (matches.length === 0) return 'scratch'\n const top = matches[0]\n if (!top) return 'scratch'\n return scoreToMode(top.score)\n }\n\n private buildSystem(matches: WorkflowMatch[], mode: 'direct' | 'reference' | 'scratch', globalFailureRates: RuleFailureRate[] = [], dynamicCatalog?: string, description?: string): SystemPromptBlock[] {\n let basePrompt = SYSTEM_PROMPT_V1\n if (dynamicCatalog) {\n basePrompt = basePrompt.replace(\n /## NODE CATALOG — exact type strings and safe typeVersions[\\s\\S]*?(?=## PRE-DELIVERY SELF-CHECK)/,\n dynamicCatalog + '\\n\\n',\n )\n }\n\n const blocks: SystemPromptBlock[] = [\n {\n type: 'text',\n text: basePrompt,\n cache_control: { type: 'ephemeral' },\n },\n ]\n\n if (this.profile !== 'minimal') {\n if (mode === 'reference' && matches.length > 0) {\n const refText = matches\n .slice(0, 3)\n .map((m) => {\n const nodes = m.workflow.workflow.nodes\n .map((n) => ` - ${n.name} (${n.type} v${n.typeVersion})`)\n .join('\\n')\n return `Reference workflow: \"${m.workflow.description}\" (similarity: ${m.score.toFixed(2)})\\nNodes:\\n${nodes}`\n })\n .join('\\n\\n')\n\n blocks.push({\n type: 'text',\n text: `## Similar Workflows From Library (for reference only — adapt, do not copy verbatim)\\n\\n${refText}`,\n })\n }\n\n if (mode === 'direct' && matches[0]) {\n const match = matches[0]\n const json = JSON.stringify(match.workflow.workflow, null, 2)\n if (json.length > 30_000) {\n const nodes = match.workflow.workflow.nodes\n .map((n) => ` - ${n.name} (${n.type} v${n.typeVersion})`)\n .join('\\n')\n blocks.push({\n type: 'text',\n text: `## Closely Matched Workflow (score: ${match.score.toFixed(2)}) — too large for full JSON, using reference:\\nNodes:\\n${nodes}`,\n })\n } else {\n blocks.push({\n type: 'text',\n text: `## Closely Matched Workflow (score: ${match.score.toFixed(2)}) — adapt this structure:\\n\\n${json}`,\n })\n }\n }\n\n if (mode === 'scratch' && matches.length > 0 && matches[0]!.score >= 0.40) {\n const hint = matches[0]!\n const nodeTypes = hint.workflow.workflow.nodes.map((n) => n.type.split('.').pop()).join(', ')\n blocks.push({\n type: 'text',\n text: `## Weak Structural Hint\\nA loosely similar workflow (score: ${hint.score.toFixed(2)}) used these node types: ${nodeTypes}`,\n })\n }\n }\n\n const warnings = this.buildFailureWarnings(matches, globalFailureRates, description)\n if (warnings) {\n blocks.push({ type: 'text', text: warnings })\n }\n\n if (this.profile === 'rich') {\n const expressionRules = new Set([24, 25, 26])\n const expressionAlreadyCovered = (this._lastActivePatterns ?? []).some(p => expressionRules.has(p.rule))\n if (!expressionAlreadyCovered) {\n blocks.push({ type: 'text', text: PROACTIVE_EXPRESSION_GUIDANCE })\n }\n }\n\n return blocks\n }\n\n private loadPatterns(): Pattern[] {\n try {\n const raw = readFileSync(this.patternsPath, 'utf-8')\n const analysis = JSON.parse(raw) as PatternAnalysis\n const patterns = analysis.topFailureRules ?? []\n return patterns.filter(p => typeof p.pipelineStage === 'string' && typeof p.state === 'string')\n } catch {\n return []\n }\n }\n\n getWarnedRules(): number[] {\n const patterns = this._lastActivePatterns ?? this.getActivePatterns(this.resolveMaxPatterns())\n return patterns.map(p => p.rule)\n }\n\n private getActivePatterns(maxCount = 10, description?: string): Pattern[] {\n const all = this.loadPatterns()\n .filter(p => p.state !== 'resolved' && p.confidence > 0)\n\n const regressed = all.filter(p => p.regressed).sort((a, b) => b.compositeScore - a.compositeScore)\n const confirmed = all.filter(p => !p.regressed && p.state === 'confirmed').sort((a, b) => b.compositeScore - a.compositeScore)\n const drafts = all.filter(p => !p.regressed && p.state !== 'confirmed').sort((a, b) => b.compositeScore - a.compositeScore)\n\n const ordered = [...regressed, ...confirmed, ...drafts]\n\n if (this.profile === 'minimal' && description) {\n return this.rankByRelevance(ordered, description).slice(0, maxCount)\n }\n\n return ordered.slice(0, maxCount)\n }\n\n private rankByRelevance(patterns: Pattern[], description: string): Pattern[] {\n const lower = description.toLowerCase()\n const STAGE_KEYWORDS: Record<string, string[]> = {\n credential_injection: ['credential', 'auth', 'api key', 'token', 'oauth', 'smtp', 'imap', 'password', 'secret'],\n connection_wiring: ['connect', 'link', 'wire', 'chain', 'merge', 'branch', 'join'],\n expression_syntax: ['expression', 'variable', 'json', 'field', 'data', '$json', 'item'],\n workflow_structure: ['trigger', 'webhook', 'schedule', 'structure', 'workflow'],\n node_generation: ['node', 'generate', 'create', 'build', 'send', 'fetch', 'email', 'slack', 'http'],\n }\n\n return patterns\n .map(p => {\n const keywords = STAGE_KEYWORDS[p.pipelineStage] ?? []\n const relevanceBoost = keywords.some(kw => lower.includes(kw)) ? 1 : 0\n return { pattern: p, sort: relevanceBoost * 10 + p.compositeScore }\n })\n .sort((a, b) => b.sort - a.sort)\n .map(x => x.pattern)\n }\n\n private buildFailureWarnings(matches: WorkflowMatch[], globalFailureRates: RuleFailureRate[], description?: string): string | null {\n const richPatterns = this.getActivePatterns(this.resolveMaxPatterns(), description)\n this._lastActivePatterns = richPatterns\n\n if (richPatterns.length > 0) {\n return this.buildStageGroupedWarnings(richPatterns, matches)\n }\n\n return this.buildLegacyWarnings(matches, globalFailureRates)\n }\n\n private buildStageGroupedWarnings(patterns: Pattern[], matches: WorkflowMatch[]): string | null {\n const stageLabels: Record<string, string> = {\n credential_injection: 'CREDENTIAL FORMATTING',\n connection_wiring: 'CONNECTION WIRING',\n node_generation: 'NODE GENERATION',\n workflow_structure: 'WORKFLOW STRUCTURE',\n expression_syntax: 'EXPRESSION SYNTAX',\n }\n\n const byStage = new Map<string, Pattern[]>()\n for (const p of patterns) {\n const list = byStage.get(p.pipelineStage) ?? []\n list.push(p)\n byStage.set(p.pipelineStage, list)\n }\n\n const sections: string[] = []\n for (const [stage, stagePatterns] of byStage) {\n const label = stageLabels[stage] ?? stage\n\n const byMitigation = new Map<string, Pattern[]>()\n for (const p of stagePatterns) {\n const key = p.mitigation ?? `rule_${p.rule}`\n const list = byMitigation.get(key) ?? []\n list.push(p)\n byMitigation.set(key, list)\n }\n\n const lines: string[] = []\n for (const group of byMitigation.values()) {\n if (group.length === 1) {\n const p = group[0]!\n const urgency = p.regressed ? 'CRITICAL REGRESSION: ' : (p.compositeScore ?? 0) >= CRITICAL_SCORE_THRESHOLD ? 'CRITICAL: ' : ''\n const statePrefix = p.state === 'confirmed' ? '[CONFIRMED] ' : ''\n const trendSuffix = p.trend === 'worsening' ? ' (GETTING WORSE)' : p.trend === 'improving' ? ' (improving)' : ''\n const remedy = p.mitigation ?? RULE_MITIGATIONS[p.rule]\n const remedyStr = remedy ? `\\n Fix: ${remedy}` : ''\n const ex = RULE_EXAMPLES[p.rule]\n const exampleStr = ex ? `\\n Bad: ${ex.bad}\\n Good: ${ex.good}` : ''\n lines.push(`- ${urgency}${statePrefix}Rule ${p.rule}${trendSuffix}: ${p.exampleMessages[0] ?? 'No example'}${remedyStr}${exampleStr}`)\n } else {\n const ruleNums = group.map(p => p.rule).join(', ')\n const totalFailures = group.reduce((s, p) => s + p.failureCount, 0)\n const hasConfirmed = group.some(p => p.state === 'confirmed')\n const statePrefix = hasConfirmed ? '[CONFIRMED] ' : ''\n const remedy = group[0]!.mitigation\n const remedyStr = remedy ? `\\n Fix: ${remedy}` : ''\n lines.push(`- ${statePrefix}Rules ${ruleNums} (${totalFailures} failures combined): same root cause${remedyStr}`)\n }\n }\n sections.push(`### ${label}\\n${lines.join('\\n')}`)\n }\n\n for (const match of matches) {\n const fps = match.workflow.failurePatterns\n if (!fps?.length) continue\n const coveredRules = new Set(patterns.map(p => p.rule))\n const extra = fps.filter(fp => !coveredRules.has(fp.rule))\n for (const fp of extra) {\n const remedy = RULE_MITIGATIONS[fp.rule]\n const remedyStr = remedy ? ` — Fix: ${remedy}` : ''\n sections.push(`- Rule ${fp.rule}: \"${fp.message}\"${remedyStr} (seen in similar workflows)`)\n }\n }\n\n if (sections.length === 0) return null\n\n return `## Known Failure Patterns — AVOID THESE\\n\\nGrouped by generation stage. Fix these BEFORE outputting your response:\\n\\n${sections.join('\\n\\n')}`\n }\n\n private buildLegacyWarnings(matches: WorkflowMatch[], globalFailureRates: RuleFailureRate[]): string | null {\n const lines: string[] = []\n\n for (const match of matches) {\n const patterns = match.workflow.failurePatterns\n if (!patterns?.length) continue\n for (const fp of patterns) {\n const remedy = RULE_MITIGATIONS[fp.rule]\n const remedyStr = remedy ? ` — Fix: ${remedy}` : ''\n lines.push(`- Rule ${fp.rule}: \"${fp.message}\"${remedyStr} (seen ${fp.occurrences}x in similar workflows)`)\n }\n }\n\n const highFreqRules = globalFailureRates.filter((r) => r.rate >= 0.15)\n for (const rule of highFreqRules) {\n const remedy = RULE_MITIGATIONS[rule.rule]\n const remedyStr = remedy ? ` — Fix: ${remedy}` : ''\n lines.push(`- Rule ${rule.rule}: \"${rule.commonMessage}\"${remedyStr} (fails in ${Math.round(rule.rate * 100)}% of all builds)`)\n }\n\n if (lines.length === 0) return null\n\n const unique = [...new Set(lines)]\n return `## Known Failure Patterns — AVOID THESE\\n\\nPrevious builds frequently failed the following validation rules. Ensure your output does NOT repeat these mistakes:\\n${unique.join('\\n')}`\n }\n\n private buildUserMessage(request: DesignRequest, _matches: WorkflowMatch[], _mode: string): string {\n const namePart = request.name ? `\\nWorkflow name: \"${request.name}\"` : ''\n return `Build a workflow that: ${request.description}${namePart}`\n }\n}\n","export const SYSTEM_PROMPT_V1 = `You are a workflow generation engine for n8n. Your only output is a generate_workflow tool call containing valid n8n workflow JSON. You never respond with prose, explanations, or markdown. If you cannot fulfill the request, set the error field in the tool call.\n\n## HARD RULES — violating any of these causes immediate deployment failure\n\n### Forbidden fields — NEVER include these in the workflow object:\nid, active, createdAt, updatedAt, versionId, meta, isArchived, activeVersionId, activeVersion, pinData, triggerCount, shared, staticData\n\n### Required top-level structure:\n{\n \"name\": \"<descriptive name>\",\n \"nodes\": [...],\n \"connections\": {...},\n \"settings\": {\n \"saveExecutionProgress\": true,\n \"saveManualExecutions\": true,\n \"saveDataErrorExecution\": \"all\",\n \"saveDataSuccessExecution\": \"all\",\n \"executionTimeout\": 3600,\n \"timezone\": \"UTC\",\n \"executionOrder\": \"v1\"\n }\n}\n\n### Node IDs:\n- Every node.id must be a valid UUID v4 (random hex, format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx)\n- Never reuse IDs, never use sequential fake IDs like \"node-1\"\n\n### Credentials:\n- Each credential is keyed by its type string, with an object value containing id and name:\n \"credentials\": { \"slackOAuth2Api\": { \"id\": \"placeholder-id\", \"name\": \"My Slack Credential\" } }\n- Use \"placeholder-id\" as the id — users replace this with their real credential ID from n8n after deployment\n- The credentialsNeeded field in your response declares what credentials the user must configure\n- Never put API keys or tokens directly in node parameters when a credential type exists\n\n### Node names:\n- All node names must be unique within the workflow\n- Use descriptive names: \"Fetch Open Invoices\" not \"HTTP Request 2\"\n\n### Positioning:\n- Trigger node: [250, 300]\n- Each subsequent step: x + 220 minimum\n- Parallel branches: offset y by ±150\n- AI sub-nodes: place below their root node (y + 200)\n\n---\n\n## CONNECTION RULES — the most common source of errors\n\n### Standard connections (main data flow):\n\"NodeA\": { \"main\": [ [ { \"node\": \"NodeB\", \"type\": \"main\", \"index\": 0 } ] ] }\n\n### AI connections — CRITICAL: the SUB-NODE is the SOURCE, NOT the agent/chain:\n\"OpenAI Chat Model\": { \"ai_languageModel\": [ [ { \"node\": \"AI Agent\", \"type\": \"ai_languageModel\", \"index\": 0 } ] ] }\n\"Simple Memory\": { \"ai_memory\": [ [ { \"node\": \"AI Agent\", \"type\": \"ai_memory\", \"index\": 0 } ] ] }\n\"Calculator Tool\": { \"ai_tool\": [ [ { \"node\": \"AI Agent\", \"type\": \"ai_tool\", \"index\": 0 } ] ] }\n\nThe AI Agent node does NOT appear in connections as a source for ai_* types.\nEvery AI Agent must have at least one ai_languageModel sub-node connected.\n\n### IF node — two output ports (0 = true, 1 = false):\n\"IF Check\": { \"main\": [ [{ \"node\": \"True Path\", \"type\": \"main\", \"index\": 0 }], [{ \"node\": \"False Path\", \"type\": \"main\", \"index\": 0 }] ] }\n\n### SplitInBatches — two output ports (0 = done/finished, 1 = loop body per batch):\nConnect output 0 to the node that runs AFTER all batches complete.\nConnect output 1 to the processing chain for each batch. The last node in the chain loops back to SplitInBatches via main input.\n\n### Webhook + RespondToWebhook pattern:\nWhen webhook responseMode is \"responseNode\", you MUST include a respondToWebhook node in the flow.\n\"Webhook\": { \"main\": [[{ \"node\": \"Process Data\", \"type\": \"main\", \"index\": 0 }]] }\n\"Process Data\": { \"main\": [[{ \"node\": \"Respond to Webhook\", \"type\": \"main\", \"index\": 0 }]] }\n\n### Triggers have no incoming connections.\n### Connection keys are NODE NAMES, never node IDs.\n\n### Nested parameters:\nNode parameters like conditions, assignments, and rule intervals MUST include all required nested fields. Do not leave nested objects empty or partially filled.\n\n---\n\n## EXPRESSION SYNTAX — how to reference upstream node data\n\n### Accessing a field from an upstream node:\n- CORRECT: $('NodeName').item.json.field\n- WRONG: $node[\"NodeName\"].json.field ← deprecated accessor, fails at runtime (Rule 24)\n\n### Accessing array items from $json:\n- CORRECT: $json.field ← n8n auto-flattens items; each item is already a flat object\n- WRONG: $json.items[0].field ← do not index into items[] (Rule 25)\n\n### Calling node data — always qualify with .first() or .all():\n- CORRECT: $('NodeName').first().json.field ← single item\n- CORRECT: $('NodeName').all() ← array of all items\n- WRONG: $('NodeName').json ← throws at runtime without .first() or .all() (Rule 26)\n\n---\n\n## NODE CATALOG — exact type strings and safe typeVersions\n\n### Triggers (always at least one required):\nn8n-nodes-base.manualTrigger typeVersion: 1 — testing only\nn8n-nodes-base.scheduleTrigger typeVersion: 1.2 — params: rule.interval[{field, ...}]\nn8n-nodes-base.webhook typeVersion: 2 — params: httpMethod, path, responseMode\nn8n-nodes-base.formTrigger typeVersion: 2.2\nn8n-nodes-base.emailReadImap typeVersion: 2 — cred: imap\nn8n-nodes-base.errorTrigger typeVersion: 1\nn8n-nodes-base.executeWorkflowTrigger typeVersion: 1.1\nn8n-nodes-base.gmailTrigger typeVersion: 1.2 — cred: gmailOAuth2\nn8n-nodes-base.slackTrigger typeVersion: 1 — cred: slackApi\nn8n-nodes-base.telegramTrigger typeVersion: 1.2 — cred: telegramApi\nn8n-nodes-base.githubTrigger typeVersion: 1 — cred: githubApi\nn8n-nodes-base.airtableTrigger typeVersion: 1 — cred: airtableTokenApi\nn8n-nodes-base.notionTrigger typeVersion: 1 — cred: notionApi\n@n8n/n8n-nodes-langchain.chatTrigger typeVersion: 1.1 — pairs with AI Agent\n\n### Core logic:\nn8n-nodes-base.code typeVersion: 2 — params: mode, jsCode\nn8n-nodes-base.httpRequest typeVersion: 4.2 — params: method, url, [sendBody, jsonBody, sendHeaders, headerParameters]\nn8n-nodes-base.set typeVersion: 3.4 — params: assignments.assignments[{id, name, value, type}]\nn8n-nodes-base.if typeVersion: 2.2 — params: conditions.conditions[{id, leftValue, rightValue, operator}], combinator\nn8n-nodes-base.switch typeVersion: 3.2 — multi-branch routing\nn8n-nodes-base.filter typeVersion: 2.2 — params: conditions (same as IF), 1 output\nn8n-nodes-base.merge typeVersion: 3 — modes: append/combine/chooseBranch\nn8n-nodes-base.splitInBatches typeVersion: 3 — output 0=done, output 1=loop body\nn8n-nodes-base.wait typeVersion: 1.1\nn8n-nodes-base.executeWorkflow typeVersion: 1.2\nn8n-nodes-base.respondToWebhook typeVersion: 1.1 — required when webhook responseMode is \"responseNode\"\nn8n-nodes-base.noOp typeVersion: 1\nn8n-nodes-base.splitOut typeVersion: 1\nn8n-nodes-base.aggregate typeVersion: 1\nn8n-nodes-base.stickyNote typeVersion: 1 — never connected, canvas annotation only\n\n### Email / messaging:\nn8n-nodes-base.emailSend typeVersion: 2.1 — cred: smtp\nn8n-nodes-base.slack typeVersion: 2.2 — cred: slackOAuth2Api — params: resource, operation, select, channelId{__rl}, text\nn8n-nodes-base.telegram typeVersion: 1.2 — cred: telegramApi\nn8n-nodes-base.discord typeVersion: 2 — cred: discordWebhookApi\n\n### Google:\nn8n-nodes-base.gmail typeVersion: 2.1 — cred: gmailOAuth2 — params: resource, operation\nn8n-nodes-base.googleSheets typeVersion: 4.5 — cred: googleSheetsOAuth2Api — params: resource, operation, documentId{__rl}, sheetName{__rl}\nn8n-nodes-base.googleDrive typeVersion: 3 — cred: googleDriveOAuth2Api\nn8n-nodes-base.googleCalendar typeVersion: 1.3 — cred: googleCalendarOAuth2Api\n\n### Productivity:\nn8n-nodes-base.notion typeVersion: 2.2 — cred: notionApi\nn8n-nodes-base.airtable typeVersion: 2.1 — cred: airtableTokenApi\nn8n-nodes-base.github typeVersion: 1.1 — cred: githubApi\nn8n-nodes-base.jira typeVersion: 1 — cred: jiraSoftwareCloudApi\nn8n-nodes-base.hubspot typeVersion: 2.1 — cred: hubspotOAuth2Api\n\n### Databases:\nn8n-nodes-base.postgres typeVersion: 2.5 — cred: postgres\nn8n-nodes-base.mySql typeVersion: 2.4 — cred: mySql\nn8n-nodes-base.redis typeVersion: 1 — cred: redis\nn8n-nodes-base.supabase typeVersion: 1 — cred: supabaseApi\nn8n-nodes-base.awsS3 typeVersion: 2 — cred: aws\n\n### AI — Root nodes (sit on main data flow, receive ai_* connections as TARGETS):\n@n8n/n8n-nodes-langchain.agent typeVersion: 1.9 — params: promptType, text (if define), options.systemMessage\n@n8n/n8n-nodes-langchain.chainLlm typeVersion: 1.5\n@n8n/n8n-nodes-langchain.chainRetrievalQa typeVersion: 1.4\n@n8n/n8n-nodes-langchain.openAi typeVersion: 1.8 — cred: openAiApi — standalone node, calls OpenAI directly without sub-nodes\n@n8n/n8n-nodes-langchain.anthropic typeVersion: 1 — cred: anthropicApi — standalone node, calls Anthropic directly without sub-nodes\n\n### AI — Sub-nodes (sources of ai_* connections, wire INTO root nodes above):\n@n8n/n8n-nodes-langchain.lmChatOpenAi typeVersion: 1.7 — cred: openAiApi — ai_languageModel — use with agent/chain, NOT standalone\n@n8n/n8n-nodes-langchain.lmChatAnthropic typeVersion: 1.3 — cred: anthropicApi — ai_languageModel — use with agent/chain, NOT standalone\n@n8n/n8n-nodes-langchain.lmChatGoogleGemini typeVersion: 1 — cred: googlePalmApi — ai_languageModel\n@n8n/n8n-nodes-langchain.memoryBufferWindow typeVersion: 1.3 — — ai_memory\n@n8n/n8n-nodes-langchain.toolWorkflow typeVersion: 2 — — ai_tool\n@n8n/n8n-nodes-langchain.toolCode typeVersion: 1.1 — — ai_tool\n@n8n/n8n-nodes-langchain.toolHttpRequest typeVersion: 1.1 — — ai_tool\n@n8n/n8n-nodes-langchain.toolCalculator typeVersion: 1 — — ai_tool\n\n### Resource locator (__rl) format (Google / Slack / Notion modern nodes):\n{ \"__rl\": true, \"mode\": \"id\", \"value\": \"ACTUAL_ID\" }\n{ \"__rl\": true, \"mode\": \"name\", \"value\": \"#channel-name\" }\n\n### App node parameter pattern:\n{ \"resource\": \"message\", \"operation\": \"send\", ...operation-specific fields }\n\n### Schedule Trigger — daily at 9am example:\n{ \"rule\": { \"interval\": [{ \"field\": \"days\", \"daysInterval\": 1, \"triggerAtHour\": 9, \"triggerAtMinute\": 0 }] } }\nCron: { \"rule\": { \"interval\": [{ \"field\": \"cronExpression\", \"expression\": \"0 9 * * 1-5\" }] } }\n\n---\n\n## PRE-DELIVERY SELF-CHECK (do this before calling the tool):\n1. Every connection source/target name exists in nodes array\n2. No duplicate node names\n3. No duplicate node IDs\n4. No forbidden fields at the workflow root\n5. At least one trigger node present\n6. Every AI Agent has an ai_languageModel sub-node\n7. settings block is complete with executionOrder: \"v1\"\n8. No deprecated $node[\"NodeName\"].json — use $('NodeName').item.json.field\n9. No $json.items[0] array indexing — access fields directly as $json.field\n10. No bare $('NodeName').json — always use .first().json.field or .all()\n11. httpRequest URL is a real endpoint (not \"example.com\" or \"YOUR_URL\")\n12. code nodes contain actual logic — not empty or comment-only\n13. Slack message nodes have a channel specified (channelId or channel)\n14. Gmail send nodes have a recipient (to field non-empty)\n15. if nodes have at least one condition in conditions.conditions[]\n16. set nodes have at least one entry in assignments.assignments[]\n17. scheduleTrigger has at least one rule in rule.interval[]\n18. webhook path is relative (no spaces, no leading slash, no http://)\n\n---\n\nRespond ONLY with a generate_workflow tool call. No prose. No markdown outside the tool call.\nIf the request is impossible or unclear, set the error field instead of generating a workflow.`\n","export type PipelineStage = 'node_generation' | 'credential_injection' | 'connection_wiring' | 'workflow_structure' | 'expression_syntax'\n\nexport const VALIDATOR_RULE_IDS: number[] = Array.from({ length: 35 }, (_, i) => i + 1)\n\nexport const RULE_PIPELINE_STAGES: Record<number, PipelineStage> = {\n 1: 'node_generation',\n 2: 'node_generation',\n 3: 'node_generation',\n 4: 'node_generation',\n 5: 'node_generation',\n 6: 'node_generation',\n 7: 'node_generation',\n 8: 'node_generation',\n 9: 'connection_wiring',\n 10: 'connection_wiring',\n 11: 'connection_wiring',\n 12: 'workflow_structure',\n 13: 'node_generation',\n 14: 'workflow_structure',\n 15: 'node_generation',\n 16: 'node_generation',\n 17: 'credential_injection',\n 18: 'connection_wiring',\n 19: 'node_generation',\n 20: 'connection_wiring',\n 21: 'workflow_structure',\n 22: 'workflow_structure',\n 23: 'node_generation',\n 24: 'expression_syntax',\n 25: 'expression_syntax',\n 26: 'expression_syntax',\n 27: 'node_generation',\n 28: 'node_generation',\n 29: 'node_generation',\n 30: 'node_generation',\n 31: 'node_generation',\n 32: 'node_generation',\n 33: 'node_generation',\n 34: 'node_generation',\n 35: 'node_generation',\n}\n\nexport interface RuleExample {\n bad: string\n good: string\n}\n\nexport const RULE_EXAMPLES: Record<number, RuleExample> = {\n 17: {\n bad: '\"credentials\": { \"slackOAuth2Api\": \"my-token\" }',\n good: '\"credentials\": { \"slackOAuth2Api\": { \"id\": \"placeholder-id\", \"name\": \"My Slack OAuth\" } }',\n },\n 24: {\n bad: '$node[\"Fetch Data\"].json.email',\n good: \"$('Fetch Data').item.json.email\",\n },\n 25: {\n bad: '$json.items[0].email',\n good: '$json.email',\n },\n 26: {\n bad: \"$('Fetch Data').json.email\",\n good: \"$('Fetch Data').first().json.email\",\n },\n 27: {\n bad: '\"url\": \"https://example.com/api/data\"',\n good: '\"url\": \"https://api.yourservice.com/v1/endpoint\"',\n },\n 28: {\n bad: '\"jsCode\": \"// TODO: implement this\"',\n good: '\"jsCode\": \"return items.map(item => ({ json: { result: item.json.value * 2 } }))\"',\n },\n 29: {\n bad: '\"channelId\": \"\"',\n good: '\"channelId\": { \"__rl\": true, \"value\": \"C0123456789\", \"mode\": \"id\" }',\n },\n 30: {\n bad: '\"operation\": \"send\", \"to\": \"\"',\n good: '\"operation\": \"send\", \"to\": \"recipient@example.com\"',\n },\n 31: {\n bad: '\"conditions\": { \"combinator\": \"and\", \"conditions\": [] }',\n good: '\"conditions\": { \"combinator\": \"and\", \"conditions\": [{ \"leftValue\": \"={{ $json.status }}\", \"rightValue\": \"active\", \"operator\": { \"type\": \"string\", \"operation\": \"equals\" } }] }',\n },\n 32: {\n bad: '\"assignments\": { \"assignments\": [] }',\n good: '\"assignments\": { \"assignments\": [{ \"id\": \"f1\", \"name\": \"status\", \"value\": \"processed\", \"type\": \"string\" }] }',\n },\n 33: {\n bad: '\"rule\": { \"interval\": [] }',\n good: '\"rule\": { \"interval\": [{ \"field\": \"cronExpression\", \"expression\": \"0 9 * * 1-5\" }] }',\n },\n 34: {\n bad: '\"path\": \"/my webhook\"',\n good: '\"path\": \"my-webhook\"',\n },\n 35: {\n bad: '\"type\": \"n8n-nodes-base.gmail\", \"parameters\": { \"operation\": \"send\" } // no sent_at tracking',\n good: 'Add a Set node after send that writes \"sent_at\": \"={{ $now }}\" back to the sheet, or an IF node that checks sent_at before sending',\n },\n}\n\nexport const RULE_MITIGATIONS: Record<number, string> = {\n 1: 'Provide a non-empty workflow name string',\n 2: 'Include at least one node in the nodes array',\n 3: 'Every node must have a unique UUID v4 string as its id field',\n 4: 'Ensure all node ids are unique — no two nodes can share the same id',\n 5: 'Every node must have a non-empty type string',\n 6: 'Every node must have a positive integer typeVersion',\n 7: 'Every node must have a position array of exactly [x, y] numbers',\n 8: 'Every node must have a non-empty name string',\n 9: 'connections must be a plain object (use {} if no connections)',\n 10: 'Every node name in connections (source and target) must exactly match a name in the nodes array',\n 11: 'Every non-trigger node should have at least one incoming connection',\n 12: 'Remove forbidden fields: id, active, createdAt, updatedAt, versionId, meta, tags — these are server-assigned',\n 13: 'workflow.settings must be a plain object if present',\n 14: 'Include at least one trigger node (e.g. scheduleTrigger, webhookTrigger, manualTrigger, or service-specific)',\n 15: 'Node type strings must be fully qualified: \"n8n-nodes-base.httpRequest\" not just \"httpRequest\"',\n 16: 'All node names must be unique within the workflow',\n 17: 'Each credential entry must be keyed by credential type with an object value: { \"slackOAuth2Api\": { \"id\": \"placeholder-id\", \"name\": \"My Credential\" } } — the key is the credential type, the value has id and name strings',\n 18: 'AI sub-nodes (languageModel, memory, tool) must be the CONNECTION SOURCE pointing TO the agent — not the reverse',\n 19: 'Use known safe typeVersion values for each node type',\n 20: 'Remove connection cycles — ensure no node can reach itself through the connection graph',\n 21: 'When using webhook with responseMode \"responseNode\", include a respondToWebhook node in the flow',\n 22: 'Ensure all required parameters are set for each node type (e.g. webhook needs httpMethod and path)',\n 23: 'Use node types that exist in the n8n registry — check with kairos_sync',\n 24: 'Use modern accessor syntax: $(\"NodeName\").item.json.field instead of deprecated $node[\"NodeName\"].json.field',\n 25: 'Access item fields directly with $json.field — n8n flattens items automatically, do not use $json.items[0]',\n 26: 'Use $(\"NodeName\").first().json.field or $(\"NodeName\").all() — bare $(\"NodeName\").json without .first() or .all() throws at runtime',\n 27: 'Replace placeholder URLs with your actual API endpoint — do not use \"example.com\" or \"YOUR_URL\" patterns',\n 28: 'Add executable code to the code node — empty or comment-only code nodes do nothing at runtime',\n 29: 'Set the channel parameter for Slack message operations (channelId with __rl object, or channel as string)',\n 30: 'Set the to parameter for Gmail send operations with at least one recipient email address',\n 31: 'Add at least one condition to the if node — conditions.conditions array must be non-empty',\n 32: 'Add field assignments to the set node — assignments.assignments array must be non-empty for typeVersion 3.x',\n 33: 'Add at least one schedule rule to scheduleTrigger — rule.interval array must have at least one entry',\n 34: 'Webhook path must be a relative path without spaces, leading slashes, or protocol prefixes (e.g. \"my-hook\")',\n 35: 'Add duplicate-prevention to email-sending workflows: a sent_at timestamp field updated after each send, or an IF node that checks prior-send status before sending',\n}\n","import { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { readTelemetryEvents } from './event-reader.js'\n\nexport interface RuleFailureRate {\n rule: number\n failureCount: number\n totalBuilds: number\n rate: number\n commonMessage: string\n}\n\nexport class TelemetryReader {\n private readonly dir: string\n private cache: RuleFailureRate[] | null = null\n private cacheTime = 0\n\n constructor(dir?: string) {\n this.dir = dir ?? join(homedir(), '.kairos', 'telemetry')\n }\n\n async getFailureRates(days = 30): Promise<RuleFailureRate[]> {\n const now = Date.now()\n if (this.cache && now - this.cacheTime < 5 * 60 * 1000) {\n return this.cache\n }\n\n const events = await this.readRecentEvents(days)\n\n const buildSessions = new Set(\n events\n .filter((e) => e.eventType === 'build_complete')\n .map((e) => e.runId ?? e.sessionId),\n )\n const MIN_BUILDS_FOR_RATES = 3\n if (buildSessions.size < MIN_BUILDS_FOR_RATES) return []\n\n const ruleSessions = new Map<number, { sessions: Set<string>; messages: Map<string, number> }>()\n\n for (const event of events) {\n if (event.eventType !== 'generation_attempt') continue\n const eventKey = event.runId ?? event.sessionId\n if (!buildSessions.has(eventKey)) continue\n const data = event.data as { validationPassed?: boolean; issues?: Array<{ rule: number; message: string }> }\n if (data.validationPassed || !data.issues) continue\n\n for (const issue of data.issues) {\n const entry = ruleSessions.get(issue.rule) ?? { sessions: new Set(), messages: new Map() }\n entry.sessions.add(eventKey)\n entry.messages.set(issue.message, (entry.messages.get(issue.message) ?? 0) + 1)\n ruleSessions.set(issue.rule, entry)\n }\n }\n\n const rates: RuleFailureRate[] = []\n for (const [rule, entry] of ruleSessions) {\n let topMessage = ''\n let topCount = 0\n for (const [msg, count] of entry.messages) {\n if (count > topCount) {\n topMessage = msg\n topCount = count\n }\n }\n rates.push({\n rule,\n failureCount: entry.sessions.size,\n totalBuilds: buildSessions.size,\n rate: entry.sessions.size / buildSessions.size,\n commonMessage: topMessage,\n })\n }\n\n rates.sort((a, b) => b.rate - a.rate)\n this.cache = rates\n this.cacheTime = now\n return rates\n }\n\n private async readRecentEvents(days: number) {\n return readTelemetryEvents(this.dir, days)\n }\n}\n","import { readdir } from 'node:fs/promises'\nimport { createReadStream } from 'node:fs'\nimport { join } from 'node:path'\nimport { createInterface } from 'node:readline'\n\nexport interface RawTelemetryEvent {\n eventType: string\n sessionId: string\n runId?: string\n data: Record<string, unknown>\n fileDate: string\n}\n\nexport async function readTelemetryEvents(dir: string, days: number): Promise<RawTelemetryEvent[]> {\n let files: string[]\n try {\n files = await readdir(dir)\n } catch {\n return []\n }\n\n const cutoff = new Date()\n cutoff.setDate(cutoff.getDate() - days)\n const cutoffStr = cutoff.toISOString().slice(0, 10)\n\n const todayStr = new Date().toISOString().slice(0, 10)\n const datePattern = /^\\d{4}-\\d{2}-\\d{2}\\.jsonl$/\n const recentFiles = files\n .filter(f => datePattern.test(f) && f >= cutoffStr && f <= `${todayStr}.jsonl`)\n .sort()\n\n const events: RawTelemetryEvent[] = []\n for (const file of recentFiles) {\n const fileDate = file.replace('.jsonl', '')\n try {\n const rl = createInterface({\n input: createReadStream(join(dir, file), 'utf-8'),\n crlfDelay: Infinity,\n })\n for await (const line of rl) {\n if (!line.trim()) continue\n try {\n events.push({ ...JSON.parse(line), fileDate })\n } catch { /* skip malformed */ }\n }\n } catch { /* skip unreadable */ }\n }\n return events\n}\n","import { writeFile, readFile as fsReadFile, appendFile, mkdir, rename } from 'node:fs/promises'\nimport { readTelemetryEvents } from './event-reader.js'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\nimport { RULE_MITIGATIONS, RULE_PIPELINE_STAGES, VALIDATOR_RULE_IDS, type PipelineStage } from '../validation/rule-metadata.js'\n\nexport interface CredentialFailure {\n type: string\n count: number\n}\n\nexport type PatternState = 'draft' | 'confirmed' | 'resolved'\nexport type PatternTrend = 'new' | 'worsening' | 'stable' | 'improving'\nexport type { PipelineStage } from '../validation/rule-metadata.js'\n\nexport interface ScoringFactors {\n rawConfidence: number\n impact: number\n recency: number\n stickinessBoost: number\n}\n\nexport interface Pattern {\n rule: number\n failureCount: number\n confidence: number\n compositeScore: number\n scoringFactors: ScoringFactors\n state: PatternState\n trend: PatternTrend\n pipelineStage: PipelineStage\n exampleMessages: string[]\n mitigation: string | null\n resolvedAt?: string\n regressed?: boolean\n workflowTypeBreakdown?: Record<string, number>\n}\n\nexport interface DriftAlert {\n type: 'stale_pattern' | 'uncovered_rule' | 'missing_mitigation' | 'missing_stage_mapping'\n rule: number\n message: string\n}\n\nexport interface DriftReport {\n healthy: boolean\n alerts: DriftAlert[]\n coveredRules: number\n totalRules: number\n}\n\nexport interface WarningEffectiveness {\n rule: number\n timesWarned: number\n timesWarnedAndPassed: number\n timesWarnedAndFailed: number\n effectivenessRate: number\n}\n\nexport interface SessionSummary {\n sessionId: string\n date: string\n description: string\n workflowType: string | null\n attempts: number\n success: boolean\n failedRules: number[]\n workflowName: string | null\n}\n\nexport interface PatternAnalysis {\n schemaVersion: number\n generatedAt: string\n summary: {\n totalBuilds: number\n totalAttempts: number\n firstTryPassRate: number\n correctionRate: number\n singleAttemptFailRate: number\n avgDurationMs: number\n totalTokensInput: number\n totalTokensOutput: number\n attemptDistribution?: Record<number, number>\n }\n topFailureRules: Pattern[]\n failingCredentialTypes: CredentialFailure[]\n drift: DriftReport\n warningEffectiveness: WarningEffectiveness[]\n ruleCoOccurrence?: Array<{ rules: [number, number]; count: number }>\n}\n\nconst PATTERN_SCHEMA_VERSION = 2\n\n\nexport class PatternAnalyzer {\n private readonly telemetryDir: string\n private readonly outputDir: string\n private _cachedEvents: Awaited<ReturnType<typeof readTelemetryEvents>> | null = null\n private _cachedPreviousPatterns: Pattern[] | null = null\n\n constructor(telemetryDir?: string) {\n const defaultDir = join(homedir(), '.kairos', 'telemetry')\n this.telemetryDir = telemetryDir ?? defaultDir\n this.outputDir = telemetryDir\n ? join(telemetryDir, '..')\n : join(homedir(), '.kairos')\n }\n\n private async loadPreviousPatterns(): Promise<Pattern[]> {\n if (this._cachedPreviousPatterns !== null) return this._cachedPreviousPatterns\n try {\n const raw = await fsReadFile(join(this.outputDir, 'patterns.json'), 'utf-8')\n const prev = JSON.parse(raw) as PatternAnalysis & { schemaVersion?: number }\n const version = prev.schemaVersion ?? 0\n const patterns = prev.topFailureRules ?? []\n this._cachedPreviousPatterns = version === PATTERN_SCHEMA_VERSION\n ? patterns\n : this.migratePatterns(patterns, version)\n } catch {\n this._cachedPreviousPatterns = []\n }\n return this._cachedPreviousPatterns\n }\n\n private migratePatterns(patterns: Pattern[], fromVersion: number): Pattern[] {\n let migrated = patterns\n if (fromVersion < 1) {\n migrated = migrated.map(p => ({\n ...p,\n compositeScore: p.compositeScore ?? 0,\n scoringFactors: p.scoringFactors ?? { rawConfidence: 0, impact: 0, recency: 0, stickinessBoost: 0 },\n pipelineStage: p.pipelineStage ?? ('node_generation' as PipelineStage),\n }))\n }\n if (fromVersion < 2) {\n migrated = migrated.map(p => {\n const sf = p.scoringFactors ?? { rawConfidence: 0, impact: 0, recency: 0, stickinessBoost: 0 }\n return {\n ...p,\n scoringFactors: {\n ...sf,\n stickinessBoost: sf.stickinessBoost ?? (sf as unknown as Record<string, number>)['validationBoost'] ?? 0,\n },\n }\n })\n }\n return migrated\n }\n\n async analyze(days = 30): Promise<PatternAnalysis> {\n const previousPatterns = await this.loadPreviousPatterns()\n const events = await this.readAllEvents(days)\n this._cachedEvents = events\n\n const starts = events.filter(e => e.eventType === 'build_start')\n const attempts = events.filter(e => e.eventType === 'generation_attempt')\n\n const _passed = attempts.filter(a =>\n (a.data as { validationPassed?: boolean }).validationPassed === true\n )\n const failed = attempts.filter(a =>\n (a.data as { validationPassed?: boolean }).validationPassed === false\n )\n\n const ruleFailures = new Map<number, { count: number; sessions: Set<string>; recencyWeights: number[]; allMessages: string[]; workflowTypes: Map<string, number> }>()\n const credentialFailures = new Map<string, number>()\n\n for (const a of failed) {\n const weight = this.recencyWeight(a.fileDate)\n const buildId = a.runId ?? a.sessionId\n const data = a.data as { issues?: Array<{ rule: number; severity?: string; message: string }>; workflowType?: string | null }\n for (const issue of data.issues ?? []) {\n if (issue.severity === 'warn') continue\n const entry = ruleFailures.get(issue.rule) ?? { count: 0, sessions: new Set<string>(), recencyWeights: [], allMessages: [], workflowTypes: new Map<string, number>() }\n entry.count++\n entry.sessions.add(buildId)\n entry.recencyWeights.push(weight)\n entry.allMessages.push(issue.message)\n if (data.workflowType) {\n entry.workflowTypes.set(data.workflowType, (entry.workflowTypes.get(data.workflowType) ?? 0) + 1)\n }\n ruleFailures.set(issue.rule, entry)\n\n if (issue.rule === 17) {\n const credPatterns = [\n /credential\\s+\"([^\"]+)\"/,\n /credentialType[:\\s]+\"?([^\"'\\s]+)\"?/,\n /missing\\s+credential\\s+(?:for\\s+)?[\"']?([^\"'\\s]+)/i,\n ]\n let credType = 'unknown'\n for (const re of credPatterns) {\n const m = issue.message.match(re)\n if (m?.[1]) { credType = m[1]; break }\n }\n credentialFailures.set(credType, (credentialFailures.get(credType) ?? 0) + 1)\n }\n }\n }\n\n // Event-weighted midpoint: find date where ~50% of failed events occurred before it\n const failedByDate = new Map<string, number>()\n for (const a of failed) {\n failedByDate.set(a.fileDate, (failedByDate.get(a.fileDate) ?? 0) + 1)\n }\n const sortedFailDates = [...failedByDate.entries()].sort((a, b) => a[0].localeCompare(b[0]))\n const hasTrendData = sortedFailDates.length >= 3\n let midDate = ''\n if (hasTrendData) {\n const halfTotal = failed.length / 2\n let cumulative = 0\n for (const [date, count] of sortedFailDates) {\n cumulative += count\n if (cumulative >= halfTotal) { midDate = date; break }\n }\n }\n const ruleTrends = new Map<number, { older: number; newer: number }>()\n if (hasTrendData) {\n for (const a of failed) {\n const data = a.data as { issues?: Array<{ rule: number }> }\n const isNewer = a.fileDate > midDate\n for (const issue of data.issues ?? []) {\n const entry = ruleTrends.get(issue.rule) ?? { older: 0, newer: 0 }\n if (isNewer) entry.newer++\n else entry.older++\n ruleTrends.set(issue.rule, entry)\n }\n }\n }\n\n const sessions = new Map<string, typeof attempts>()\n for (const a of attempts) {\n const buildId = a.runId ?? a.sessionId\n const list = sessions.get(buildId) ?? []\n list.push(a)\n sessions.set(buildId, list)\n }\n\n let firstTryPass = 0\n let correctionNeeded = 0\n let singleAttemptFail = 0\n for (const sessionAttempts of sessions.values()) {\n const lastAttempt = sessionAttempts[sessionAttempts.length - 1]!\n const lastPassed = (lastAttempt.data as { validationPassed?: boolean }).validationPassed === true\n\n if (sessionAttempts.length === 1 && lastPassed) {\n firstTryPass++\n } else if (sessionAttempts.length > 1 && lastPassed) {\n correctionNeeded++\n } else {\n singleAttemptFail++\n }\n }\n\n const durations = attempts\n .map(a => (a.data as { durationMs?: number }).durationMs)\n .filter((d): d is number => typeof d === 'number' && d > 0)\n const avgDuration = durations.length > 0\n ? durations.reduce((s, d) => s + d, 0) / durations.length\n : 0\n\n const totalInput = attempts.reduce((s, a) =>\n s + ((a.data as { tokensInput?: number }).tokensInput ?? 0), 0)\n const totalOutput = attempts.reduce((s, a) =>\n s + ((a.data as { tokensOutput?: number }).tokensOutput ?? 0), 0)\n\n const totalSessions = Math.max(sessions.size, 1)\n\n // Stickiness: rules that persist across consecutive failed attempts within a build (LLM can't self-correct)\n const stickinessCount = new Map<number, number>()\n for (const sessionAttempts of sessions.values()) {\n if (sessionAttempts.length < 2) continue\n for (let i = 0; i < sessionAttempts.length - 1; i++) {\n const curr = sessionAttempts[i]!.data as { validationPassed?: boolean; issues?: Array<{ rule: number }> }\n const next = sessionAttempts[i + 1]!.data as { validationPassed?: boolean; issues?: Array<{ rule: number }> }\n if (curr.validationPassed !== false || next.validationPassed !== false) continue\n const currRules = new Set((curr.issues ?? []).map(iss => iss.rule))\n const nextRules = new Set((next.issues ?? []).map(iss => iss.rule))\n for (const rule of currRules) {\n if (nextRules.has(rule)) {\n stickinessCount.set(rule, (stickinessCount.get(rule) ?? 0) + 1)\n }\n }\n }\n }\n\n const CONFIRMED_THRESHOLD = 3\n const BUILDS_SINCE_LAST_FAILURE_THRESHOLD = 5\n const RESOLVED_TTL_DAYS = 90\n\n const activePatterns: Pattern[] = [...ruleFailures.entries()]\n .map(([rule, entry]) => {\n const t = ruleTrends.get(rule) ?? { older: 0, newer: 0 }\n const rawConfidence = Math.min(entry.sessions.size / totalSessions, 1)\n const state = (entry.count >= CONFIRMED_THRESHOLD ? 'confirmed' : 'draft') as PatternState\n const avgRecency = entry.recencyWeights.length > 0\n ? entry.recencyWeights.reduce((s, w) => s + w, 0) / entry.recencyWeights.length\n : 1\n const stickiness = stickinessCount.get(rule) ?? 0\n const { compositeScore, factors } = this.computeCompositeScore(rawConfidence, entry.count, state, avgRecency, stickiness)\n\n const pattern: Pattern = {\n rule,\n failureCount: entry.count,\n confidence: Math.round(rawConfidence * 1000) / 1000,\n compositeScore,\n scoringFactors: factors,\n state,\n trend: this.classifyTrend(t.older, t.newer),\n pipelineStage: RULE_PIPELINE_STAGES[rule] ?? 'node_generation' as PipelineStage,\n exampleMessages: this.deduplicateMessages(entry.allMessages),\n mitigation: RULE_MITIGATIONS[rule] ?? null,\n }\n\n if (entry.workflowTypes.size > 0) {\n pattern.workflowTypeBreakdown = Object.fromEntries(entry.workflowTypes)\n }\n\n return pattern\n })\n .sort((a, b) => b.compositeScore - a.compositeScore)\n\n const activeRules = new Set(activePatterns.map(p => p.rule))\n\n // Detect regressions: previously resolved rules that are failing again\n for (const p of activePatterns) {\n const prev = previousPatterns.find(pp => pp.rule === p.rule)\n if (prev?.state === 'resolved') {\n p.trend = 'worsening' as PatternTrend\n p.regressed = true\n }\n }\n\n // Per-rule last failure date for resolved threshold\n const ruleLastFailureDate = new Map<number, string>()\n for (const a of failed) {\n const data = a.data as { issues?: Array<{ rule: number }> }\n for (const issue of data.issues ?? []) {\n const existing = ruleLastFailureDate.get(issue.rule)\n if (!existing || a.fileDate > existing) {\n ruleLastFailureDate.set(issue.rule, a.fileDate)\n }\n }\n }\n\n // Newly resolved: previously confirmed, no longer failing, enough builds since last failure\n const newlyResolved: Pattern[] = previousPatterns\n .filter(p => {\n if (p.state !== 'confirmed' || activeRules.has(p.rule)) return false\n const lastFailDate = ruleLastFailureDate.get(p.rule) ?? ''\n const buildsSince = starts.filter(s => s.fileDate > lastFailDate).length\n return buildsSince >= BUILDS_SINCE_LAST_FAILURE_THRESHOLD\n })\n .map(p => ({\n ...p,\n state: 'resolved' as PatternState,\n trend: 'improving' as PatternTrend,\n pipelineStage: p.pipelineStage ?? RULE_PIPELINE_STAGES[p.rule] ?? 'node_generation' as PipelineStage,\n confidence: 0,\n compositeScore: 0,\n scoringFactors: { rawConfidence: 0, impact: 0, recency: 0, stickinessBoost: 0 },\n failureCount: 0,\n resolvedAt: new Date().toISOString(),\n }))\n\n // Carry forward resolved patterns within TTL\n const ttlCutoff = new Date()\n ttlCutoff.setDate(ttlCutoff.getDate() - RESOLVED_TTL_DAYS)\n const ttlCutoffStr = ttlCutoff.toISOString()\n\n const carriedResolved: Pattern[] = previousPatterns\n .filter(p => p.state === 'resolved' && !activeRules.has(p.rule)\n && (!p.resolvedAt || p.resolvedAt >= ttlCutoffStr))\n .map(p => ({ ...p }))\n\n // Carry forward confirmed patterns not yet meeting resolved threshold\n const newlyResolvedRules = new Set(newlyResolved.map(p => p.rule))\n const pendingResolution: Pattern[] = previousPatterns\n .filter(p => p.state === 'confirmed' && !activeRules.has(p.rule)\n && !newlyResolvedRules.has(p.rule))\n .map(p => ({ ...p }))\n\n const deduped = [\n ...newlyResolved,\n ...carriedResolved.filter(p => !newlyResolvedRules.has(p.rule)),\n ...pendingResolution,\n ]\n\n const patterns = [...activePatterns, ...deduped]\n\n const credTypes: CredentialFailure[] = [...credentialFailures.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([type, count]) => ({ type, count }))\n\n const drift = this.detectDrift(patterns)\n\n // Warning effectiveness: track how often warned rules were prevented\n const warnEffMap = new Map<number, { warned: number; passed: number; failed: number }>()\n const buildCompletes = events.filter(e => e.eventType === 'build_complete')\n for (const bc of buildCompletes) {\n const bcData = bc.data as { warnedRules?: number[] }\n const warned = bcData.warnedRules ?? []\n if (warned.length === 0) continue\n\n const sessionFailedRules = new Set<number>()\n const sessionAttempts = sessions.get(bc.runId ?? bc.sessionId) ?? []\n for (const a of sessionAttempts) {\n const ad = a.data as { validationPassed?: boolean; issues?: Array<{ rule: number }> }\n if (ad.validationPassed === false) {\n for (const issue of ad.issues ?? []) {\n sessionFailedRules.add(issue.rule)\n }\n }\n }\n\n for (const rule of warned) {\n const entry = warnEffMap.get(rule) ?? { warned: 0, passed: 0, failed: 0 }\n entry.warned++\n if (sessionFailedRules.has(rule)) entry.failed++\n else entry.passed++\n warnEffMap.set(rule, entry)\n }\n }\n\n const warningEffectiveness: WarningEffectiveness[] = [...warnEffMap.entries()]\n .map(([rule, e]) => ({\n rule,\n timesWarned: e.warned,\n timesWarnedAndPassed: e.passed,\n timesWarnedAndFailed: e.failed,\n effectivenessRate: e.warned > 0 ? Math.round((e.passed / e.warned) * 1000) / 1000 : 0,\n }))\n .sort((a, b) => b.timesWarned - a.timesWarned)\n\n // A-3: Rule co-occurrence\n const coOccurrenceMap = new Map<string, number>()\n for (const a of failed) {\n const data = a.data as { issues?: Array<{ rule: number }> }\n const rules = [...new Set((data.issues ?? []).map(i => i.rule))].sort((x, y) => x - y)\n for (let i = 0; i < rules.length; i++) {\n for (let j = i + 1; j < rules.length; j++) {\n const key = `${rules[i]},${rules[j]}`\n coOccurrenceMap.set(key, (coOccurrenceMap.get(key) ?? 0) + 1)\n }\n }\n }\n const ruleCoOccurrence = [...coOccurrenceMap.entries()]\n .filter(([, count]) => count >= 3)\n .map(([key, count]) => {\n const [a, b] = key.split(',').map(Number)\n return { rules: [a!, b!] as [number, number], count }\n })\n .sort((a, b) => b.count - a.count)\n\n // A-5: Session depth (attempt distribution)\n const attemptDistribution: Record<number, number> = {}\n for (const sessionAttempts of sessions.values()) {\n const depth = sessionAttempts.length\n attemptDistribution[depth] = (attemptDistribution[depth] ?? 0) + 1\n }\n\n return {\n schemaVersion: PATTERN_SCHEMA_VERSION,\n generatedAt: new Date().toISOString(),\n summary: {\n totalBuilds: starts.length,\n totalAttempts: attempts.length,\n firstTryPassRate: Math.round((firstTryPass / totalSessions) * 1000) / 1000,\n correctionRate: Math.round((correctionNeeded / totalSessions) * 1000) / 1000,\n singleAttemptFailRate: Math.round((singleAttemptFail / totalSessions) * 1000) / 1000,\n avgDurationMs: Math.round(avgDuration),\n totalTokensInput: totalInput,\n totalTokensOutput: totalOutput,\n attemptDistribution,\n },\n topFailureRules: patterns,\n failingCredentialTypes: credTypes,\n drift,\n warningEffectiveness,\n ruleCoOccurrence,\n }\n }\n\n async analyzeAndSave(days = 30): Promise<PatternAnalysis> {\n const analysis = await this.analyze(days)\n await mkdir(this.outputDir, { recursive: true })\n const outputPath = join(this.outputDir, 'patterns.json')\n const tmpPath = `${outputPath}.tmp`\n await writeFile(tmpPath, JSON.stringify(analysis, null, 2), 'utf-8')\n await rename(tmpPath, outputPath)\n this._cachedPreviousPatterns = null // invalidate so next loadPreviousPatterns reads fresh file\n\n const historySummary = {\n timestamp: analysis.generatedAt,\n totalBuilds: analysis.summary.totalBuilds,\n firstTryPassRate: analysis.summary.firstTryPassRate,\n correctionRate: analysis.summary.correctionRate,\n singleAttemptFailRate: analysis.summary.singleAttemptFailRate,\n activePatternCount: analysis.topFailureRules.filter(p => p.state !== 'resolved').length,\n topRules: analysis.topFailureRules.filter(p => p.state !== 'resolved').slice(0, 5)\n .map(p => ({ rule: p.rule, compositeScore: p.compositeScore, state: p.state })),\n }\n const historyPath = join(this.outputDir, 'pattern-history.jsonl')\n await appendFile(historyPath, JSON.stringify(historySummary) + '\\n', 'utf-8')\n\n const sessions = await this.buildSessionSummaries(days)\n const sessionHistoryPath = join(this.outputDir, 'session-history.json')\n const sessionHistoryTmp = `${sessionHistoryPath}.tmp`\n await writeFile(sessionHistoryTmp, JSON.stringify(sessions, null, 2), 'utf-8')\n await rename(sessionHistoryTmp, sessionHistoryPath)\n\n return analysis\n }\n\n async getSessions(limit = 20): Promise<SessionSummary[]> {\n try {\n const raw = await fsReadFile(join(this.outputDir, 'session-history.json'), 'utf-8')\n const all = JSON.parse(raw) as SessionSummary[]\n return all.slice(-limit)\n } catch { return [] }\n }\n\n private async buildSessionSummaries(days = 30): Promise<SessionSummary[]> {\n const events = this._cachedEvents ?? await this.readAllEvents(days)\n const buildCompletes = events.filter(e => e.eventType === 'build_complete')\n const attemptsByBuild = new Map<string, typeof events>()\n for (const e of events.filter(e => e.eventType === 'generation_attempt')) {\n const buildId = e.runId ?? e.sessionId\n const list = attemptsByBuild.get(buildId) ?? []\n list.push(e)\n attemptsByBuild.set(buildId, list)\n }\n\n const summaries: SessionSummary[] = buildCompletes.map(bc => {\n const data = bc.data as {\n description?: string\n success?: boolean\n totalAttempts?: number\n workflowName?: string | null\n workflowType?: string | null\n }\n\n const sessionAttempts = attemptsByBuild.get(bc.runId ?? bc.sessionId) ?? []\n const failedRules = Array.from(new Set(\n sessionAttempts.flatMap(a => {\n const ad = a.data as { validationPassed?: boolean; issues?: Array<{ rule: number }> }\n if (ad.validationPassed !== false) return []\n return (ad.issues ?? []).map(i => i.rule)\n })\n ))\n\n return {\n sessionId: bc.runId ?? bc.sessionId,\n date: bc.fileDate,\n description: data.description ?? '',\n workflowType: data.workflowType ?? null,\n attempts: data.totalAttempts ?? 1,\n success: data.success ?? false,\n failedRules,\n workflowName: data.workflowName ?? null,\n }\n })\n\n return summaries.sort((a, b) => a.date.localeCompare(b.date))\n }\n\n async getHistory(limit = 20): Promise<unknown[]> {\n try {\n const raw = await fsReadFile(join(this.outputDir, 'pattern-history.jsonl'), 'utf-8')\n return raw.trim().split('\\n').filter(Boolean).map(l => JSON.parse(l)).slice(-limit)\n } catch { return [] }\n }\n\n static fromEnv(): PatternAnalyzer {\n const dir = process.env['KAIROS_TELEMETRY']\n return dir && dir !== 'true' && dir !== 'false'\n ? new PatternAnalyzer(dir)\n : new PatternAnalyzer()\n }\n\n private detectDrift(patterns: Pattern[]): DriftReport {\n const VALIDATOR_RULES = VALIDATOR_RULE_IDS\n const validatorRuleSet = new Set(VALIDATOR_RULES)\n const alerts: DriftAlert[] = []\n\n for (const p of patterns) {\n if (p.state !== 'resolved' && !validatorRuleSet.has(p.rule)) {\n alerts.push({\n type: 'stale_pattern',\n rule: p.rule,\n message: `Pattern references Rule ${p.rule} which does not exist in the current validator (rules 1-34)`,\n })\n }\n }\n\n for (const rule of VALIDATOR_RULES) {\n if (!(rule in RULE_MITIGATIONS)) {\n alerts.push({\n type: 'missing_mitigation',\n rule,\n message: `Rule ${rule} has no mitigation text — if it fails, the system can't advise the LLM how to fix it`,\n })\n }\n if (!(rule in RULE_PIPELINE_STAGES)) {\n alerts.push({\n type: 'missing_stage_mapping',\n rule,\n message: `Rule ${rule} has no pipeline stage mapping — failures won't be grouped correctly`,\n })\n }\n }\n\n const coveredRules = VALIDATOR_RULES.filter(r => r in RULE_MITIGATIONS && r in RULE_PIPELINE_STAGES).length\n\n return {\n healthy: alerts.length === 0,\n alerts,\n coveredRules,\n totalRules: VALIDATOR_RULES.length,\n }\n }\n\n private computeCompositeScore(\n rawConfidence: number,\n sampleSize: number,\n state: PatternState,\n avgRecency: number,\n stickiness: number,\n ): { compositeScore: number; factors: ScoringFactors } {\n const stateWeights: Record<PatternState, number> = { draft: 0.3, confirmed: 0.8, resolved: 0.1 }\n const stateWeight = stateWeights[state]\n const impact = (1 - Math.exp(-sampleSize / 5)) * stateWeight\n const stickinessBoost = Math.min(0.15, stickiness * 0.05)\n const compositeScore = Math.min(Math.round((rawConfidence * impact * avgRecency * (1 + stickinessBoost)) * 1000) / 1000, 1)\n\n return {\n compositeScore,\n factors: {\n rawConfidence: Math.round(rawConfidence * 1000) / 1000,\n impact: Math.round(impact * 1000) / 1000,\n recency: Math.round(avgRecency * 1000) / 1000,\n stickinessBoost: Math.round(stickinessBoost * 1000) / 1000,\n },\n }\n }\n\n private classifyTrend(older: number, newer: number): PatternTrend {\n const total = older + newer\n if (total === 0) return 'stable'\n if (older === 0) return 'new'\n const newerRatio = newer / total\n if (newerRatio >= 0.65) return 'worsening'\n if (newerRatio <= 0.35) return 'improving'\n return 'stable'\n }\n\n private deduplicateMessages(messages: string[], maxCount = 3): string[] {\n const normalize = (msg: string) =>\n msg\n .replace(/[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}/gi, '...')\n .replace(/\\bnode\\s+\"[^\"]+\"/g, 'node \"...\"')\n .replace(/\\s+/g, ' ')\n .trim()\n\n const seen = new Set<string>()\n const unique: string[] = []\n for (const msg of messages) {\n const key = normalize(msg)\n if (!seen.has(key) && unique.length < maxCount) {\n seen.add(key)\n unique.push(msg)\n }\n }\n return unique\n }\n\n private recencyWeight(fileDate: string, halfLifeDays = 30): number {\n const daysAgo = Math.max(0, (Date.now() - new Date(fileDate + 'T12:00:00Z').getTime()) / (1000 * 60 * 60 * 24))\n return Math.max(0.1, Math.exp(-Math.LN2 * daysAgo / halfLifeDays))\n }\n\n private async readAllEvents(days: number) {\n return readTelemetryEvents(this.telemetryDir, days)\n }\n}\n","import type { N8nNodeTypeInfo } from '../providers/n8n/types.js'\nimport type { NodeDefinition } from './registry.js'\nimport { NodeRegistry, DEFAULT_REGISTRY } from './registry.js'\n\nconst TRIGGER_PATTERNS = [/trigger/i, /Trigger$/]\n\nexport interface SyncResult {\n registry: NodeRegistry\n catalogText: string\n nodeCount: number\n newNodes: number\n}\n\nexport class NodeSyncer {\n private readonly baseRegistry: Map<string, NodeDefinition>\n\n constructor() {\n this.baseRegistry = new Map(DEFAULT_REGISTRY.map(d => [d.type, d]))\n }\n\n sync(liveNodes: N8nNodeTypeInfo[]): SyncResult {\n const merged = new Map(this.baseRegistry)\n let newNodes = 0\n\n for (const node of liveNodes) {\n const versions = Array.isArray(node.version) ? node.version : [node.version]\n const isTrigger = TRIGGER_PATTERNS.some(p => p.test(node.name))\n const credentialType = node.credentials?.[0]?.name\n\n const existing = merged.get(node.name)\n if (existing) {\n const allVersions = new Set([...existing.safeTypeVersions, ...versions])\n merged.set(node.name, {\n ...existing,\n safeTypeVersions: [...allVersions].sort((a, b) => a - b),\n })\n } else {\n newNodes++\n merged.set(node.name, {\n type: node.name,\n safeTypeVersions: versions.sort((a, b) => a - b),\n requiredParams: [],\n ...(credentialType ? { credentialType } : {}),\n ...(isTrigger ? { isTrigger: true } : {}),\n })\n }\n }\n\n const definitions = [...merged.values()]\n const registry = new NodeRegistry(definitions)\n const catalogText = this.buildCatalog(definitions)\n\n return { registry, catalogText, nodeCount: definitions.length, newNodes }\n }\n\n private buildCatalog(definitions: NodeDefinition[]): string {\n const triggers = definitions.filter(d => d.isTrigger)\n const regular = definitions.filter(d => !d.isTrigger)\n\n const formatEntry = (d: NodeDefinition): string => {\n const versions = d.safeTypeVersions.join(', ')\n const cred = d.credentialType ? ` — cred: ${d.credentialType}` : ''\n return `${d.type} typeVersion: ${versions}${cred}`\n }\n\n const triggerLines = triggers.map(formatEntry).join('\\n')\n const regularLines = regular.map(formatEntry).join('\\n')\n\n return `## NODE CATALOG — synced from your n8n instance (${definitions.length} node types)\n\n### Triggers:\n${triggerLines}\n\n### Regular nodes:\n${regularLines}`\n }\n}\n","import { appendFile, mkdir } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\nimport { generateUUID } from '../utils/uuid.js'\nimport type { TelemetryEvent } from './types.js'\nimport { TELEMETRY_SCHEMA_VERSION } from './types.js'\n\nexport class TelemetryCollector {\n private readonly dir: string\n readonly sessionId: string\n private dirReady: Promise<void> | null = null\n\n constructor(dir?: string) {\n this.dir = dir ?? join(homedir(), '.kairos', 'telemetry')\n this.sessionId = generateUUID()\n }\n\n async emit(eventType: TelemetryEvent['eventType'], data: Record<string, unknown>, runId?: string): Promise<void> {\n const event: TelemetryEvent = {\n schemaVersion: TELEMETRY_SCHEMA_VERSION,\n timestamp: new Date().toISOString(),\n sessionId: this.sessionId,\n ...(runId ? { runId } : {}),\n eventType,\n data,\n }\n\n if (!this.dirReady) {\n this.dirReady = mkdir(this.dir, { recursive: true }).then(() => {})\n }\n await this.dirReady\n const filename = new Date().toISOString().slice(0, 10) + '.jsonl'\n const filepath = join(this.dir, filename)\n await appendFile(filepath, JSON.stringify(event) + '\\n', 'utf-8')\n }\n}\n","import type { ValidationIssue } from '../errors/validation-error.js'\n\nexport interface TelemetryEvent {\n schemaVersion: number\n timestamp: string\n sessionId: string\n runId?: string\n eventType: 'build_start' | 'generation_attempt' | 'build_complete'\n data: Record<string, unknown>\n}\n\nexport const TELEMETRY_SCHEMA_VERSION = 2\n\nexport interface AttemptMetadata {\n attempt: number\n temperature: number\n durationMs: number\n tokensInput: number\n tokensOutput: number\n validationPassed: boolean\n issues: ValidationIssue[]\n}\n\nexport interface BuildStartData {\n description: string\n model: string\n dryRun: boolean\n}\n\nexport interface GenerationAttemptData {\n description: string\n attempt: number\n temperature: number\n durationMs: number\n tokensInput: number\n tokensOutput: number\n validationPassed: boolean\n issueCount: number\n issues: Array<{ rule: number; severity: 'error' | 'warn'; message: string; nodeId?: string | null; nodeType?: string | null }>\n workflowType?: string | null\n}\n\nexport interface BuildCompleteData {\n description: string\n success: boolean\n totalAttempts: number\n totalDurationMs: number\n totalTokensInput: number\n totalTokensOutput: number\n workflowName: string | null\n workflowId: string | null\n dryRun: boolean\n credentialsNeeded: number\n warnedRules: number[]\n workflowType?: string | null\n}\n","export interface ILogger {\n debug(msg: string, meta?: Record<string, unknown>): void\n info(msg: string, meta?: Record<string, unknown>): void\n warn(msg: string, meta?: Record<string, unknown>): void\n error(msg: string, meta?: Record<string, unknown>): void\n}\n\nexport const nullLogger: ILogger = {\n debug() {},\n info() {},\n warn() {},\n error() {},\n}\n\nconst LEVEL_RANK = { debug: 0, info: 1, warn: 2, error: 3 } as const\ntype LogLevel = keyof typeof LEVEL_RANK\n\nexport interface CreateLoggerOptions {\n level?: LogLevel\n json?: boolean\n destination?: { write(s: string): void }\n}\n\nexport function createLogger(opts: CreateLoggerOptions = {}): ILogger {\n const minRank = LEVEL_RANK[opts.level ?? 'info']\n const json = opts.json ?? false\n const dest = opts.destination ?? { write: (s: string) => process.stderr.write(s) }\n\n function emit(level: LogLevel, msg: string, meta?: Record<string, unknown>) {\n if (LEVEL_RANK[level] < minRank) return\n if (json) {\n const entry: Record<string, unknown> = { level, timestamp: new Date().toISOString(), msg, ...meta }\n dest.write(JSON.stringify(entry) + '\\n')\n } else {\n const metaStr = meta && Object.keys(meta).length > 0\n ? ' ' + Object.entries(meta).map(([k, v]) => `${k}=${JSON.stringify(v)}`).join(' ')\n : ''\n dest.write(`[${level.toUpperCase()}] ${msg}${metaStr}\\n`)\n }\n }\n\n return {\n debug: (msg, meta) => emit('debug', msg, meta),\n info: (msg, meta) => emit('info', msg, meta),\n warn: (msg, meta) => emit('warn', msg, meta),\n error: (msg, meta) => emit('error', msg, meta),\n }\n}\n","const TYPE_KEYWORDS: Array<[string, string]> = [\n ['gmail', 'email'],\n ['imap', 'email'],\n ['smtp', 'email'],\n [' email', 'email'],\n ['slack', 'slack'],\n ['telegram', 'messaging'],\n ['discord', 'messaging'],\n [' sms', 'messaging'],\n ['twilio', 'messaging'],\n ['webhook', 'webhook'],\n ['google sheets', 'data'],\n ['spreadsheet', 'data'],\n ['airtable', 'data'],\n ['notion', 'data'],\n ['github', 'devops'],\n ['gitlab', 'devops'],\n ['schedule', 'schedule'],\n [' cron', 'schedule'],\n ['daily', 'schedule'],\n ['weekly', 'schedule'],\n ['hourly', 'schedule'],\n ['every day', 'schedule'],\n ['every hour', 'schedule'],\n ['every morning', 'schedule'],\n ['postgres', 'database'],\n ['mysql', 'database'],\n ['supabase', 'database'],\n ['redis', 'database'],\n [' database', 'database'],\n [' llm', 'ai'],\n [' gpt', 'ai'],\n ['claude', 'ai'],\n [' agent', 'ai'],\n ['langchain', 'ai'],\n [' ai ', 'ai'],\n [' ai', 'ai'],\n ['http request', 'api'],\n ['rest api', 'api'],\n [' api', 'api'],\n]\n\nexport function inferWorkflowType(description: string): string | null {\n const lower = ' ' + description.toLowerCase()\n for (const [keyword, type] of TYPE_KEYWORDS) {\n if (lower.includes(keyword)) return type\n }\n return null\n}\n","import { readFile, writeFile, mkdir } from 'node:fs/promises'\nimport { dirname } from 'node:path'\nimport type { SyncResult } from '../validation/node-syncer.js'\n\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000 // 24 hours\n\ninterface CachedCatalog {\n cachedAt: number\n syncResult: SyncResult\n}\n\nexport async function readCatalogCache(cachePath: string): Promise<SyncResult | null> {\n try {\n const raw = await readFile(cachePath, 'utf-8')\n const cached = JSON.parse(raw) as CachedCatalog\n if (Date.now() - cached.cachedAt > CACHE_TTL_MS) return null\n return cached.syncResult\n } catch {\n return null\n }\n}\n\nexport async function writeCatalogCache(cachePath: string, syncResult: SyncResult): Promise<void> {\n try {\n await mkdir(dirname(cachePath), { recursive: true })\n const payload: CachedCatalog = { cachedAt: Date.now(), syncResult }\n await writeFile(cachePath, JSON.stringify(payload), 'utf-8')\n } catch {\n // Cache write failure is non-fatal — next startup will just re-fetch\n }\n}\n\nexport function isCacheExpired(cachedAt: number, ttlMs = CACHE_TTL_MS): boolean {\n return Date.now() - cachedAt > ttlMs\n}\n"],"mappings":"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","names":["m","import_node_path","import_node_os","import_node_os","import_node_path","import_promises","import_node_fs","import_node_path","import_promises","import_node_path","import_node_os","fsReadFile","e","import_promises","import_node_path","import_node_os","import_node_fs","import_node_path","import_node_os","import_promises","import_node_path"]}