@kairos-sdk/core 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  ApiError,
3
3
  DEFAULT_REGISTRY,
4
+ FileLibrary,
4
5
  GenerationError,
5
6
  GuardError,
6
7
  Kairos,
@@ -14,117 +15,16 @@ import {
14
15
  ProviderError,
15
16
  ResponseParseError,
16
17
  TelemetryCollector,
18
+ TelemetryReader,
19
+ TemplateSyncer,
17
20
  ValidationError,
18
- generateUUID,
19
- nullLogger
20
- } from "./chunk-IADOKKFO.js";
21
-
22
- // src/library/file-library.ts
23
- import { readFile, writeFile, mkdir } from "fs/promises";
24
- import { join } from "path";
25
- import { homedir } from "os";
26
- function tokenize(text) {
27
- return text.toLowerCase().replace(/[^a-z0-9\s]/g, " ").split(/\s+/).filter((t) => t.length > 2);
28
- }
29
- function computeTfIdf(queryTokens, docTokens, idf) {
30
- if (docTokens.length === 0) return 0;
31
- let score = 0;
32
- const docFreq = /* @__PURE__ */ new Map();
33
- for (const t of docTokens) {
34
- docFreq.set(t, (docFreq.get(t) ?? 0) + 1);
35
- }
36
- for (const qt of queryTokens) {
37
- const tf = (docFreq.get(qt) ?? 0) / docTokens.length;
38
- const idfVal = idf.get(qt) ?? 0;
39
- score += tf * idfVal;
40
- }
41
- return score;
42
- }
43
- var FileLibrary = class {
44
- dir;
45
- workflows = [];
46
- initialized = false;
47
- constructor(dir) {
48
- this.dir = dir ?? join(homedir(), ".kairos", "library");
49
- }
50
- async initialize() {
51
- if (this.initialized) return;
52
- await mkdir(this.dir, { recursive: true });
53
- const indexPath = join(this.dir, "index.json");
54
- try {
55
- const raw = await readFile(indexPath, "utf-8");
56
- this.workflows = JSON.parse(raw);
57
- } catch {
58
- this.workflows = [];
59
- }
60
- this.initialized = true;
61
- }
62
- async search(description, options) {
63
- if (this.workflows.length === 0) return [];
64
- const limit = options?.limit ?? 3;
65
- const queryTokens = tokenize(description);
66
- if (queryTokens.length === 0) return [];
67
- const docTokenSets = this.workflows.map(
68
- (w) => tokenize(`${w.description} ${w.workflow.name} ${w.tags.join(" ")}`)
69
- );
70
- const docCount = this.workflows.length;
71
- const idf = /* @__PURE__ */ new Map();
72
- const allTokens = new Set(queryTokens);
73
- for (const token of allTokens) {
74
- const docsWithToken = docTokenSets.filter((d) => d.includes(token)).length;
75
- idf.set(token, Math.log((docCount + 1) / (docsWithToken + 1)) + 1);
76
- }
77
- const scored = this.workflows.map((w, i) => ({
78
- workflow: w,
79
- score: computeTfIdf(queryTokens, docTokenSets[i], idf)
80
- })).filter((m) => m.score > 0).sort((a, b) => b.score - a.score).slice(0, limit);
81
- return scored.map((m) => ({
82
- workflow: m.workflow,
83
- score: m.score,
84
- mode: m.score > 0.5 ? "direct" : "reference"
85
- }));
86
- }
87
- async save(workflow, metadata) {
88
- const id = generateUUID();
89
- const stored = {
90
- id,
91
- workflow,
92
- description: metadata.description,
93
- tags: metadata.tags ?? [],
94
- platform: metadata.platform ?? "n8n",
95
- deployCount: 1,
96
- createdAt: (/* @__PURE__ */ new Date()).toISOString()
97
- };
98
- this.workflows.push(stored);
99
- await this.persist();
100
- return id;
101
- }
102
- async recordDeployment(id) {
103
- const w = this.workflows.find((w2) => w2.id === id);
104
- if (w) {
105
- w.deployCount++;
106
- w.lastDeployedAt = (/* @__PURE__ */ new Date()).toISOString();
107
- await this.persist();
108
- }
109
- }
110
- async get(id) {
111
- return this.workflows.find((w) => w.id === id) ?? null;
112
- }
113
- async list(filters) {
114
- let result = this.workflows;
115
- if (filters?.platform) {
116
- result = result.filter((w) => w.platform === filters.platform);
117
- }
118
- if (filters?.tags && filters.tags.length > 0) {
119
- result = result.filter((w) => filters.tags.some((t) => w.tags.includes(t)));
120
- }
121
- return result;
122
- }
123
- async persist() {
124
- const indexPath = join(this.dir, "index.json");
125
- await writeFile(indexPath, JSON.stringify(this.workflows, null, 2), "utf-8");
126
- }
127
- };
21
+ buildSearchCorpus,
22
+ clusterWorkflows,
23
+ hybridScore,
24
+ nullLogger,
25
+ rerank,
26
+ tokenize
27
+ } from "./chunk-QQJDLS5A.js";
128
28
  export {
129
29
  ApiError,
130
30
  DEFAULT_REGISTRY,
@@ -142,7 +42,14 @@ export {
142
42
  ProviderError,
143
43
  ResponseParseError,
144
44
  TelemetryCollector,
45
+ TelemetryReader,
46
+ TemplateSyncer,
145
47
  ValidationError,
146
- nullLogger
48
+ buildSearchCorpus,
49
+ clusterWorkflows,
50
+ hybridScore,
51
+ nullLogger,
52
+ rerank,
53
+ tokenize
147
54
  };
148
55
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/library/file-library.ts"],"sourcesContent":["import { readFile, writeFile, mkdir, readdir } 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} from './types.js'\nimport { generateUUID } from '../utils/uuid.js'\n\nfunction 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\nfunction computeTfIdf(queryTokens: string[], docTokens: string[], idf: Map<string, number>): number {\n if (docTokens.length === 0) return 0\n let score = 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 = (docFreq.get(qt) ?? 0) / docTokens.length\n const idfVal = idf.get(qt) ?? 0\n score += tf * idfVal\n }\n return score\n}\n\nexport class FileLibrary implements IWorkflowLibrary {\n private readonly dir: string\n private workflows: StoredWorkflow[] = []\n private initialized = false\n\n constructor(dir?: string) {\n this.dir = dir ?? join(homedir(), '.kairos', 'library')\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return\n await mkdir(this.dir, { recursive: true })\n\n const indexPath = join(this.dir, 'index.json')\n try {\n const raw = await readFile(indexPath, 'utf-8')\n this.workflows = JSON.parse(raw) as StoredWorkflow[]\n } catch {\n this.workflows = []\n }\n this.initialized = true\n }\n\n async search(description: string, options?: SearchOptions): Promise<WorkflowMatch[]> {\n if (this.workflows.length === 0) return []\n\n const limit = options?.limit ?? 3\n const queryTokens = tokenize(description)\n if (queryTokens.length === 0) return []\n\n const docTokenSets = this.workflows.map((w) =>\n tokenize(`${w.description} ${w.workflow.name} ${w.tags.join(' ')}`),\n )\n\n const docCount = this.workflows.length\n const idf = new Map<string, number>()\n const allTokens = new Set(queryTokens)\n for (const token of allTokens) {\n const docsWithToken = docTokenSets.filter((d) => d.includes(token)).length\n idf.set(token, Math.log((docCount + 1) / (docsWithToken + 1)) + 1)\n }\n\n const scored = this.workflows\n .map((w, i) => ({\n workflow: w,\n score: computeTfIdf(queryTokens, docTokenSets[i]!, idf),\n }))\n .filter((m) => m.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, limit)\n\n return scored.map((m) => ({\n workflow: m.workflow,\n score: m.score,\n mode: m.score > 0.5 ? 'direct' as const : 'reference' as const,\n }))\n }\n\n async save(workflow: N8nWorkflow, metadata: WorkflowMetadataInput): Promise<string> {\n const id = generateUUID()\n const stored: StoredWorkflow = {\n id,\n workflow,\n description: metadata.description,\n tags: metadata.tags ?? [],\n platform: metadata.platform ?? 'n8n',\n deployCount: 1,\n createdAt: new Date().toISOString(),\n }\n this.workflows.push(stored)\n await this.persist()\n return id\n }\n\n async recordDeployment(id: string): Promise<void> {\n const w = this.workflows.find((w) => w.id === id)\n if (w) {\n w.deployCount++\n w.lastDeployedAt = new Date().toISOString()\n await this.persist()\n }\n }\n\n async get(id: string): Promise<StoredWorkflow | null> {\n return this.workflows.find((w) => w.id === id) ?? null\n }\n\n async list(filters?: LibraryFilters): Promise<StoredWorkflow[]> {\n let result = this.workflows\n if (filters?.platform) {\n result = result.filter((w) => w.platform === filters.platform)\n }\n if (filters?.tags && filters.tags.length > 0) {\n result = result.filter((w) => filters.tags!.some((t) => w.tags.includes(t)))\n }\n return result\n }\n\n private async persist(): Promise<void> {\n const indexPath = join(this.dir, 'index.json')\n await writeFile(indexPath, JSON.stringify(this.workflows, null, 2), 'utf-8')\n }\n}\n"],"mappings":"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","names":["w"]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@kairos-sdk/core",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "LLM-powered n8n workflow generation and deployment SDK",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
7
7
  "module": "./dist/index.js",
8
8
  "types": "./dist/index.d.ts",
9
9
  "bin": {
10
- "kairos": "./dist/cli.cjs"
10
+ "kairos": "dist/cli.js"
11
11
  },
12
12
  "exports": {
13
13
  ".": {
@@ -28,6 +28,7 @@
28
28
  "build": "tsup",
29
29
  "dev": "tsup --watch",
30
30
  "test": "vitest run",
31
+ "test:e2e": "vitest run --dir tests/e2e",
31
32
  "test:watch": "vitest",
32
33
  "typecheck": "tsc --noEmit"
33
34
  },
@@ -48,9 +49,7 @@
48
49
  "peerDependencies": {
49
50
  "@anthropic-ai/sdk": ">=0.30.0"
50
51
  },
51
- "dependencies": {
52
- "zod": "^3.22.0"
53
- },
52
+ "dependencies": {},
54
53
  "devDependencies": {
55
54
  "@anthropic-ai/sdk": "^0.36.0",
56
55
  "@types/node": "^20.0.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/uuid.ts","../src/library/null-library.ts","../src/errors/base.ts","../src/errors/api-error.ts","../src/errors/provider-error.ts","../src/providers/n8n/api-client.ts","../src/providers/n8n/types.ts","../src/providers/n8n/stripper.ts","../src/errors/guard-error.ts","../src/providers/n8n/provider.ts","../src/validation/registry.ts","../src/validation/validator.ts","../src/errors/generation-error.ts","../src/errors/response-parse-error.ts","../src/errors/validation-error.ts","../src/telemetry/collector.ts","../src/utils/logger.ts","../src/client.ts","../src/generation/prompts/v1.ts","../src/generation/prompt-builder.ts","../src/generation/designer.ts"],"sourcesContent":["export function generateUUID(): string {\n return crypto.randomUUID()\n}\n","import type { IWorkflowLibrary, WorkflowMatch, StoredWorkflow, WorkflowMetadataInput, LibraryFilters, SearchOptions } from './types.js'\nimport type { N8nWorkflow } from '../types/workflow.js'\nimport { generateUUID } from '../utils/uuid.js'\n\nexport class NullLibrary implements IWorkflowLibrary {\n async initialize(): Promise<void> {}\n\n async search(_description: string, _options?: SearchOptions): Promise<WorkflowMatch[]> {\n return []\n }\n\n async save(_workflow: N8nWorkflow, _metadata: WorkflowMetadataInput): Promise<string> {\n return generateUUID()\n }\n\n async recordDeployment(_id: string): Promise<void> {}\n\n async get(_id: string): Promise<StoredWorkflow | null> {\n return null\n }\n\n async list(_filters?: LibraryFilters): Promise<StoredWorkflow[]> {\n return []\n }\n}\n","export class KairosError extends Error {\n constructor(message: string, public readonly cause?: unknown) {\n super(message)\n this.name = 'KairosError'\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 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 type {\n N8nWorkflowResponse,\n N8nWorkflowListResponse,\n N8nExecutionResponse,\n N8nExecutionListResponse,\n N8nTagResponse,\n N8nTagListResponse,\n} from './types.js'\n\nconst EXECUTION_LIMIT_CAP = 100\n\nexport class N8nApiClient {\n constructor(\n private readonly baseUrl: string,\n private readonly apiKey: string,\n private readonly logger: ILogger,\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 let response: Response\n try {\n response = await fetch(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 })\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 response = await this.request<N8nWorkflowListResponse>('GET', '/workflows?limit=250')\n return response.data.map((w) => ({\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\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 response = await this.request<N8nTagListResponse>('GET', '/tags')\n return response.data.map((t) => ({ id: t.id, name: t.name }))\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 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 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 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] 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 } 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","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","import type { N8nWorkflow, Tag } from '../../types/workflow.js'\nimport type { DeployResult, WorkflowListItem, ExecutionSummary, ExecutionDetail } from '../../types/result.js'\nimport type { DeleteOptions, ExecutionFilter } from '../../types/options.js'\nimport type { IProvider } from '../types.js'\nimport { GuardError } from '../../errors/guard-error.js'\nimport { N8nApiClient } from './api-client.js'\nimport { N8nFieldStripper } from './stripper.js'\n\nexport class N8nProvider implements IProvider {\n readonly platform = 'n8n'\n\n constructor(\n private readonly client: N8nApiClient,\n private readonly stripper: N8nFieldStripper,\n ) {}\n\n async deploy(workflow: N8nWorkflow): Promise<DeployResult> {\n const stripped = this.stripper.stripForCreate(workflow)\n const response = await this.client.createWorkflow(stripped)\n return { workflowId: response.id, name: response.name }\n }\n\n async update(id: string, workflow: N8nWorkflow): Promise<DeployResult> {\n const stripped = this.stripper.stripForUpdate(workflow)\n const response = await this.client.updateWorkflow(id, stripped)\n return { workflowId: response.id, name: response.name }\n }\n\n async get(id: string): Promise<N8nWorkflow> {\n const response = await this.client.getWorkflow(id)\n return {\n name: response.name,\n nodes: response.nodes,\n connections: response.connections,\n ...(response.settings !== undefined ? { settings: response.settings } : {}),\n ...(response.tags !== undefined ? { tags: response.tags } : {}),\n }\n }\n\n async list(): Promise<WorkflowListItem[]> {\n return this.client.listWorkflows()\n }\n\n async activate(id: string): Promise<void> {\n await this.client.activateWorkflow(id)\n }\n\n async deactivate(id: string): Promise<void> {\n await this.client.deactivateWorkflow(id)\n }\n\n async delete(id: string, options: DeleteOptions): Promise<void> {\n if (options.confirm !== true) {\n throw new GuardError('delete() requires { confirm: true } to prevent accidental deletion')\n }\n await this.client.deleteWorkflow(id)\n }\n\n async executions(workflowId?: string, filter?: ExecutionFilter): Promise<ExecutionSummary[]> {\n return this.client.getExecutions(workflowId, filter)\n }\n\n async execution(id: string): Promise<ExecutionDetail> {\n return this.client.getExecution(id)\n }\n\n async listTags(): Promise<Tag[]> {\n return this.client.listTags()\n }\n\n async createTag(name: string): Promise<Tag> {\n return this.client.createTag(name)\n }\n\n async tag(workflowId: string, tagIds: string[]): Promise<void> {\n await this.client.tagWorkflow(workflowId, tagIds)\n }\n\n async untag(workflowId: string, tagIds: string[]): Promise<void> {\n await this.client.untagWorkflow(workflowId, tagIds)\n }\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.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]\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 isVersionSafe(type: string, version: number): boolean {\n const def = this.byType.get(type)\n if (!def) return true // unknown nodes: pass through, don't block\n return def.safeTypeVersions.includes(version)\n }\n}\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\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): void {\n const issue: ValidationIssue = { rule, severity: 'error', message }\n if (nodeId !== undefined) issue.nodeId = nodeId\n issues.push(issue)\n }\n\n private warn(issues: ValidationIssue[], rule: number, message: string, nodeId?: string): void {\n const issue: ValidationIssue = { rule, severity: 'warn', message }\n if (nodeId !== undefined) issue.nodeId = nodeId\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 for (const [, outputs] of Object.entries(w.connections)) {\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') reachable.add(t.node)\n }\n }\n }\n }\n for (const node of w.nodes) {\n if (!this.isTriggerNode(node) && !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 (WARN): AI connections 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.warn(\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 private checkRule19(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' || typeof node.typeVersion !== 'number') continue\n if (!this.registry.isVersionSafe(node.type, node.typeVersion)) {\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}\n","import { KairosError } from './base.js'\n\nexport class GenerationError extends KairosError {\n constructor(message: string, cause?: unknown) {\n super(message, cause)\n this.name = 'GenerationError'\n }\n}\n","import { KairosError } from './base.js'\n\nexport class ResponseParseError extends KairosError {\n constructor(message: string, cause?: unknown) {\n super(message, cause)\n this.name = 'ResponseParseError'\n }\n}\n","import { KairosError } from './base.js'\n\nexport interface ValidationIssue {\n rule: number\n severity: 'error' | 'warn'\n message: string\n nodeId?: string\n}\n\nexport class ValidationError extends KairosError {\n constructor(\n message: string,\n public readonly issues: ValidationIssue[],\n ) {\n super(message)\n this.name = 'ValidationError'\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'\n\nexport class TelemetryCollector {\n private readonly dir: string\n readonly sessionId: string\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>): Promise<void> {\n const event: TelemetryEvent = {\n timestamp: new Date().toISOString(),\n sessionId: this.sessionId,\n eventType,\n data,\n }\n\n await mkdir(this.dir, { recursive: true })\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","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","import Anthropic from '@anthropic-ai/sdk'\nimport type { N8nWorkflow, Tag } from './types/workflow.js'\nimport type { BuildResult, WorkflowListItem, ExecutionSummary, ExecutionDetail } from './types/result.js'\nimport type { ClientOptions, BuildOptions, DeleteOptions, ExecutionFilter } from './types/options.js'\nimport type { IWorkflowLibrary } from './library/types.js'\nimport { NullLibrary } from './library/null-library.js'\nimport { N8nApiClient } from './providers/n8n/api-client.js'\nimport { N8nFieldStripper } from './providers/n8n/stripper.js'\nimport { N8nProvider } from './providers/n8n/provider.js'\nimport { N8nValidator } from './validation/validator.js'\nimport { WorkflowDesigner } from './generation/designer.js'\nimport { TelemetryCollector } from './telemetry/collector.js'\nimport { nullLogger } from './utils/logger.js'\nimport type { ILogger } from './utils/logger.js'\n\nconst DEFAULT_MODEL = 'claude-sonnet-4-6'\n\nexport class Kairos {\n private readonly provider: N8nProvider\n private readonly designer: WorkflowDesigner\n private readonly validator: N8nValidator\n private readonly library: IWorkflowLibrary\n private readonly logger: ILogger\n private readonly telemetry: TelemetryCollector | null\n private readonly model: string\n\n constructor(options: ClientOptions) {\n const logger = options.logger ?? nullLogger\n this.model = options.model ?? DEFAULT_MODEL\n\n const anthropic = new Anthropic({ apiKey: options.anthropicApiKey })\n const apiClient = new N8nApiClient(options.n8nBaseUrl, options.n8nApiKey, logger)\n const stripper = new N8nFieldStripper()\n\n this.provider = new N8nProvider(apiClient, stripper)\n this.designer = new WorkflowDesigner(anthropic, this.model, logger)\n this.validator = new N8nValidator()\n this.library = options.library ?? new NullLibrary()\n this.logger = logger\n\n if (options.telemetry === true) {\n this.telemetry = new TelemetryCollector()\n } else if (typeof options.telemetry === 'string') {\n this.telemetry = new TelemetryCollector(options.telemetry)\n } else {\n this.telemetry = null\n }\n }\n\n async build(description: string, options?: BuildOptions): Promise<BuildResult> {\n this.logger.info('Kairos.build', { description, dryRun: options?.dryRun })\n const buildStart = Date.now()\n\n await this.telemetry?.emit('build_start', {\n description,\n model: this.model,\n dryRun: options?.dryRun ?? false,\n })\n\n await this.library.initialize()\n const matches = await this.library.search(description)\n\n const designResult = await this.designer.design(\n { description, ...(options?.name ? { name: options.name } : {}) },\n matches,\n )\n\n for (const meta of designResult.attemptMetadata) {\n await this.telemetry?.emit('generation_attempt', {\n description,\n attempt: meta.attempt,\n temperature: meta.temperature,\n durationMs: meta.durationMs,\n tokensInput: meta.tokensInput,\n tokensOutput: meta.tokensOutput,\n validationPassed: meta.validationPassed,\n issueCount: meta.issues.length,\n issues: meta.issues.map((i) => ({ rule: i.rule, message: i.message })),\n })\n }\n\n const workflow = options?.name\n ? { ...designResult.workflow, name: options.name }\n : designResult.workflow\n\n if (options?.dryRun) {\n const result: BuildResult = {\n workflowId: null,\n name: workflow.name,\n credentialsNeeded: designResult.credentialsNeeded,\n activationRequired: true,\n generationAttempts: designResult.attempts,\n dryRun: true,\n }\n\n const totalTokensInput = designResult.attemptMetadata.reduce((s, m) => s + m.tokensInput, 0)\n const totalTokensOutput = designResult.attemptMetadata.reduce((s, m) => s + m.tokensOutput, 0)\n\n await this.telemetry?.emit('build_complete', {\n description,\n success: true,\n totalAttempts: designResult.attempts,\n totalDurationMs: Date.now() - buildStart,\n totalTokensInput,\n totalTokensOutput,\n workflowName: workflow.name,\n workflowId: null,\n dryRun: true,\n credentialsNeeded: designResult.credentialsNeeded.length,\n })\n\n return result\n }\n\n const deployed = await this.provider.deploy(workflow)\n\n this.library.save(workflow, { description }).catch((err: unknown) => {\n this.logger.warn('Failed to save workflow to library (non-fatal)', { err: String(err) })\n })\n\n if (options?.activate) {\n await this.provider.activate(deployed.workflowId)\n }\n\n const result: BuildResult = {\n workflowId: deployed.workflowId,\n name: deployed.name,\n credentialsNeeded: designResult.credentialsNeeded,\n activationRequired: !options?.activate,\n generationAttempts: designResult.attempts,\n dryRun: false,\n }\n\n const totalTokensInput = designResult.attemptMetadata.reduce((s, m) => s + m.tokensInput, 0)\n const totalTokensOutput = designResult.attemptMetadata.reduce((s, m) => s + m.tokensOutput, 0)\n\n await this.telemetry?.emit('build_complete', {\n description,\n success: true,\n totalAttempts: designResult.attempts,\n totalDurationMs: Date.now() - buildStart,\n totalTokensInput,\n totalTokensOutput,\n workflowName: deployed.name,\n workflowId: deployed.workflowId,\n dryRun: false,\n credentialsNeeded: designResult.credentialsNeeded.length,\n })\n\n return result\n }\n\n async update(id: string, description: string): Promise<BuildResult> {\n this.logger.info('Kairos.update', { id, description })\n\n const matches = await this.library.search(description)\n const designResult = await this.designer.design({ description }, matches)\n const deployed = await this.provider.update(id, designResult.workflow)\n\n return {\n workflowId: deployed.workflowId,\n name: deployed.name,\n credentialsNeeded: designResult.credentialsNeeded,\n activationRequired: true,\n generationAttempts: designResult.attempts,\n dryRun: false,\n }\n }\n\n async get(id: string): Promise<N8nWorkflow> {\n return this.provider.get(id)\n }\n\n async list(): Promise<WorkflowListItem[]> {\n return this.provider.list()\n }\n\n async activate(id: string): Promise<void> {\n await this.provider.activate(id)\n }\n\n async deactivate(id: string): Promise<void> {\n await this.provider.deactivate(id)\n }\n\n async delete(id: string, options: DeleteOptions): Promise<void> {\n await this.provider.delete(id, options)\n }\n\n async executions(workflowId?: string, filter?: ExecutionFilter): Promise<ExecutionSummary[]> {\n return this.provider.executions(workflowId, filter)\n }\n\n async execution(id: string): Promise<ExecutionDetail> {\n return this.provider.execution(id)\n }\n\n async listTags(): Promise<Tag[]> {\n return this.provider.listTags()\n }\n\n async createTag(name: string): Promise<Tag> {\n return this.provider.createTag(name)\n }\n\n async tag(workflowId: string, tagIds: string[]): Promise<void> {\n await this.provider.tag(workflowId, tagIds)\n }\n\n async untag(workflowId: string, tagIds: string[]): Promise<void> {\n await this.provider.untag(workflowId, tagIds)\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\": \"America/New_York\",\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- Only reference credentials with exact type names (see catalog below)\n- If credential ID is unknown, OMIT the credentials block entirely — never invent credential IDs\n- Never put API keys or tokens in 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### Triggers have no incoming connections.\n### Connection keys are NODE NAMES, never node IDs.\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):\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\n@n8n/n8n-nodes-langchain.anthropic typeVersion: 1 — cred: anthropicApi\n\n### AI — Sub-nodes (sources of ai_* connections):\n@n8n/n8n-nodes-langchain.lmChatOpenAi typeVersion: 1.7 — cred: openAiApi — ai_languageModel\n@n8n/n8n-nodes-langchain.lmChatAnthropic typeVersion: 1.3 — cred: anthropicApi — ai_languageModel\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\"\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","import type { WorkflowMatch } from '../library/types.js'\nimport type { DesignRequest, BuiltPrompt, SystemPromptBlock } from './types.js'\nimport { SYSTEM_PROMPT_V1 } from './prompts/v1.js'\n\nexport class PromptBuilder {\n build(request: DesignRequest, matches: WorkflowMatch[]): BuiltPrompt {\n const mode = this.resolveMode(matches)\n const system = this.buildSystem(matches, mode)\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 ): string {\n const base = this.buildUserMessage(request, matches, this.resolveMode(matches))\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.`\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 if (top.score >= 0.92) return 'direct'\n if (top.score >= 0.72) return 'reference'\n return 'scratch'\n }\n\n private buildSystem(matches: WorkflowMatch[], mode: 'direct' | 'reference' | 'scratch'): SystemPromptBlock[] {\n const blocks: SystemPromptBlock[] = [\n {\n type: 'text',\n text: SYSTEM_PROMPT_V1,\n cache_control: { type: 'ephemeral' },\n },\n ]\n\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 blocks.push({\n type: 'text',\n text: `## Closely Matched Workflow (score: ${match.score.toFixed(2)}) — adapt this structure:\\n\\n${JSON.stringify(match.workflow.workflow, null, 2)}`,\n })\n }\n\n return blocks\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","import Anthropic from '@anthropic-ai/sdk'\nimport type { WorkflowMatch } from '../library/types.js'\nimport type { N8nWorkflow } from '../types/workflow.js'\nimport type { CredentialRequirement } from '../types/result.js'\nimport type { ILogger } from '../utils/logger.js'\nimport { GenerationError } from '../errors/generation-error.js'\nimport { ResponseParseError } from '../errors/response-parse-error.js'\nimport { ValidationError } from '../errors/validation-error.js'\nimport type { ValidationIssue } from '../errors/validation-error.js'\nimport { N8nValidator } from '../validation/validator.js'\nimport { PromptBuilder } from './prompt-builder.js'\nimport type { AttemptMetadata } from '../telemetry/types.js'\nimport type { DesignRequest, DesignResult, SystemPromptBlock } from './types.js'\n\nconst MAX_ATTEMPTS = 3\nconst BASE_TEMPERATURE = 0.2\nconst FINAL_TEMPERATURE = 0.1\n\nconst GENERATE_WORKFLOW_TOOL: Anthropic.Tool = {\n name: 'generate_workflow',\n description: 'Generate a valid n8n workflow JSON object',\n input_schema: {\n type: 'object',\n properties: {\n workflow: {\n type: 'object',\n description: 'The complete n8n workflow object',\n properties: {\n name: { type: 'string' },\n nodes: { type: 'array' },\n connections: { type: 'object' },\n settings: { type: 'object' },\n },\n required: ['name', 'nodes', 'connections'],\n },\n credentialsNeeded: {\n type: 'array',\n description: 'List of credentials the user must configure before activating',\n items: {\n type: 'object',\n properties: {\n service: { type: 'string' },\n credentialType: { type: 'string' },\n description: { type: 'string' },\n },\n required: ['service', 'credentialType', 'description'],\n },\n },\n error: {\n type: 'string',\n description: 'Set this if the request cannot be fulfilled — explain why',\n },\n },\n required: ['workflow'],\n },\n}\n\ninterface ToolUseResult {\n workflow: N8nWorkflow\n credentialsNeeded: CredentialRequirement[]\n error?: string\n}\n\nexport class WorkflowDesigner {\n private readonly validator: N8nValidator\n private readonly promptBuilder: PromptBuilder\n\n constructor(\n private readonly anthropic: Anthropic,\n private readonly model: string,\n private readonly logger: ILogger,\n ) {\n this.validator = new N8nValidator()\n this.promptBuilder = new PromptBuilder()\n }\n\n async design(request: DesignRequest, matches: WorkflowMatch[]): Promise<DesignResult> {\n const allIssues: ValidationIssue[] = []\n const attemptMetadata: AttemptMetadata[] = []\n let attempts = 0\n\n for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {\n attempts = attempt\n const temperature = attempt === MAX_ATTEMPTS ? FINAL_TEMPERATURE : BASE_TEMPERATURE\n const built = this.promptBuilder.build(request, matches)\n\n let userMessage: string\n if (attempt === 1) {\n userMessage = built.userMessage\n this.logger.debug('WorkflowDesigner: attempt 1', { description: request.description })\n } else {\n const issueLines = allIssues.map(\n (i) => `- [Rule ${i.rule}] ${i.message}${i.nodeId ? ` (node: ${i.nodeId})` : ''}`,\n )\n userMessage = this.promptBuilder.buildCorrectionMessage(request, matches, issueLines, attempt - 1)\n this.logger.debug(`WorkflowDesigner: correction attempt ${attempt}`, { issueCount: allIssues.length })\n }\n\n const start = Date.now()\n const message = await this.callClaude(built.system, userMessage, temperature)\n const durationMs = Date.now() - start\n const parsed = this.extractToolUse(message)\n\n if (parsed.error) {\n throw new GenerationError(`Claude declined to generate workflow: ${parsed.error}`)\n }\n\n const validation = this.validator.validate(parsed.workflow)\n const errors = validation.issues.filter((i) => i.severity === 'error')\n\n attemptMetadata.push({\n attempt,\n temperature,\n durationMs,\n tokensInput: message.usage.input_tokens,\n tokensOutput: message.usage.output_tokens,\n validationPassed: validation.valid,\n issues: errors,\n })\n\n if (validation.valid) {\n return { workflow: parsed.workflow, credentialsNeeded: parsed.credentialsNeeded, attempts, attemptMetadata }\n }\n\n allIssues.push(...errors)\n this.logger.warn(`WorkflowDesigner: validation failed on attempt ${attempt}`, {\n newErrors: errors.length,\n totalErrors: allIssues.length,\n })\n }\n\n throw new ValidationError(\n `Workflow failed validation after ${MAX_ATTEMPTS} attempts (${allIssues.length} total errors)`,\n allIssues,\n )\n }\n\n private async callClaude(\n system: SystemPromptBlock[],\n userMessage: string,\n temperature: number,\n ): Promise<Anthropic.Message> {\n try {\n return await this.anthropic.messages.create({\n model: this.model,\n max_tokens: 8192,\n temperature,\n system: system as Anthropic.TextBlockParam[],\n messages: [{ role: 'user', content: userMessage }],\n tools: [GENERATE_WORKFLOW_TOOL],\n tool_choice: { type: 'tool', name: 'generate_workflow' },\n })\n } catch (err) {\n throw new GenerationError('Anthropic API call failed', err)\n }\n }\n\n private extractToolUse(message: Anthropic.Message): ToolUseResult {\n const toolUseBlock = message.content.find(\n (block): block is Anthropic.ToolUseBlock => block.type === 'tool_use',\n )\n if (!toolUseBlock) {\n throw new ResponseParseError(\n 'Claude response contained no tool_use block — forced tool_choice failed unexpectedly',\n )\n }\n\n const input = toolUseBlock.input as Record<string, unknown>\n\n if (typeof input['error'] === 'string') {\n return {\n workflow: { name: '', nodes: [], connections: {} },\n credentialsNeeded: [],\n error: input['error'],\n }\n }\n\n if (!input['workflow'] || typeof input['workflow'] !== 'object') {\n throw new ResponseParseError('generate_workflow tool call missing workflow field')\n }\n\n const workflow = input['workflow'] as N8nWorkflow\n const credentialsNeeded = (input['credentialsNeeded'] as CredentialRequirement[] | undefined) ?? []\n\n return { workflow, credentialsNeeded }\n }\n}\n"],"mappings":"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","names":["result","totalTokensInput","totalTokensOutput"]}