@kairos-sdk/core 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +109 -15
- package/dist/{chunk-IADOKKFO.js → chunk-QQJDLS5A.js} +1190 -110
- package/dist/chunk-QQJDLS5A.js.map +1 -0
- package/dist/cli.cjs +1349 -132
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +171 -27
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +1135 -153
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +154 -13
- package/dist/index.d.ts +154 -13
- package/dist/index.js +18 -111
- package/dist/index.js.map +1 -1
- package/package.json +12 -5
- package/dist/chunk-IADOKKFO.js.map +0 -1
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../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/generation/prompts/v1.ts","../src/generation/prompt-builder.ts","../src/generation/designer.ts","../src/telemetry/collector.ts","../src/utils/logger.ts","../src/cli.ts"],"sourcesContent":["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 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","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","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","#!/usr/bin/env node\n\nimport { Kairos } from './client.js'\n\nconst HELP = `\nKairos SDK — LLM-powered n8n workflow generation\n\nUsage:\n kairos build <description> [options]\n kairos list\n kairos get <id>\n kairos activate <id>\n kairos deactivate <id>\n kairos delete <id> --confirm\n\nBuild options:\n --dry-run Generate and validate without deploying\n --name <name> Override the generated workflow name\n --activate Activate the workflow after deployment\n\nEnvironment variables:\n ANTHROPIC_API_KEY Anthropic API key (required)\n N8N_BASE_URL n8n instance URL (required)\n N8N_API_KEY n8n API key (required)\n KAIROS_MODEL Claude model override (default: claude-sonnet-4-6)\n KAIROS_TELEMETRY Set to \"true\" or a directory path to enable telemetry logging\n`\n\nfunction getEnvOrExit(name: string): string {\n const val = process.env[name]\n if (!val) {\n console.error(`Missing required environment variable: ${name}`)\n process.exit(1)\n }\n return val\n}\n\nfunction parseArgs(argv: string[]): { command: string; positional: string[]; flags: Record<string, string | boolean> } {\n const args = argv.slice(2)\n const command = args[0] ?? ''\n const positional: string[] = []\n const flags: Record<string, string | boolean> = {}\n\n for (let i = 1; i < args.length; i++) {\n const arg = args[i]!\n if (arg.startsWith('--')) {\n const key = arg.slice(2)\n const next = args[i + 1]\n if (next && !next.startsWith('--')) {\n flags[key] = next\n i++\n } else {\n flags[key] = true\n }\n } else {\n positional.push(arg)\n }\n }\n\n return { command, positional, flags }\n}\n\nfunction createClient(): Kairos {\n const telemetryEnv = process.env['KAIROS_TELEMETRY']\n let telemetry: boolean | string | undefined\n if (telemetryEnv === 'true') {\n telemetry = true\n } else if (telemetryEnv && telemetryEnv !== 'false') {\n telemetry = telemetryEnv\n }\n\n return new Kairos({\n anthropicApiKey: getEnvOrExit('ANTHROPIC_API_KEY'),\n n8nBaseUrl: getEnvOrExit('N8N_BASE_URL'),\n n8nApiKey: getEnvOrExit('N8N_API_KEY'),\n ...(process.env['KAIROS_MODEL'] ? { model: process.env['KAIROS_MODEL'] } : {}),\n ...(telemetry !== undefined ? { telemetry } : {}),\n logger: {\n debug: () => {},\n info: () => {},\n warn: (msg) => console.error(`[warn] ${msg}`),\n error: (msg) => console.error(`[error] ${msg}`),\n },\n })\n}\n\nasync function handleBuild(positional: string[], flags: Record<string, string | boolean>): Promise<void> {\n const description = positional[0]\n if (!description) {\n console.error('Usage: kairos build <description> [--dry-run] [--name <name>] [--activate]')\n process.exit(1)\n }\n\n const kairos = createClient()\n const start = Date.now()\n\n console.error(`Generating workflow...`)\n\n const result = await kairos.build(description, {\n dryRun: flags['dry-run'] === true,\n ...(typeof flags['name'] === 'string' ? { name: flags['name'] } : {}),\n activate: flags['activate'] === true,\n })\n\n const elapsed = ((Date.now() - start) / 1000).toFixed(1)\n\n console.error(`Done in ${elapsed}s (${result.generationAttempts} attempt${result.generationAttempts > 1 ? 's' : ''})`)\n console.error('')\n\n console.log(JSON.stringify({\n workflowId: result.workflowId,\n name: result.name,\n generationAttempts: result.generationAttempts,\n activationRequired: result.activationRequired,\n dryRun: result.dryRun,\n credentialsNeeded: result.credentialsNeeded,\n }, null, 2))\n}\n\nasync function handleList(): Promise<void> {\n const kairos = createClient()\n const workflows = await kairos.list()\n\n if (workflows.length === 0) {\n console.log('No workflows found.')\n return\n }\n\n for (const w of workflows) {\n const status = w.active ? 'active' : 'inactive'\n console.log(` ${w.id} ${status.padEnd(8)} ${w.name}`)\n }\n console.log(`\\n${workflows.length} workflow(s)`)\n}\n\nasync function handleGet(positional: string[]): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos get <workflow-id>')\n process.exit(1)\n }\n\n const kairos = createClient()\n const workflow = await kairos.get(id)\n console.log(JSON.stringify(workflow, null, 2))\n}\n\nasync function handleActivate(positional: string[]): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos activate <workflow-id>')\n process.exit(1)\n }\n\n const kairos = createClient()\n await kairos.activate(id)\n console.log(`Activated workflow ${id}`)\n}\n\nasync function handleDeactivate(positional: string[]): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos deactivate <workflow-id>')\n process.exit(1)\n }\n\n const kairos = createClient()\n await kairos.deactivate(id)\n console.log(`Deactivated workflow ${id}`)\n}\n\nasync function handleDelete(positional: string[], flags: Record<string, string | boolean>): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos delete <workflow-id> --confirm')\n process.exit(1)\n }\n\n if (flags['confirm'] !== true) {\n console.error('Refusing to delete without --confirm flag.')\n process.exit(1)\n }\n\n const kairos = createClient()\n await kairos.delete(id, { confirm: true })\n console.log(`Deleted workflow ${id}`)\n}\n\nasync function main(): Promise<void> {\n const { command, positional, flags } = parseArgs(process.argv)\n\n if (!command || command === 'help' || flags['help'] === true) {\n console.log(HELP)\n return\n }\n\n switch (command) {\n case 'build':\n await handleBuild(positional, flags)\n break\n case 'list':\n await handleList()\n break\n case 'get':\n await handleGet(positional)\n break\n case 'activate':\n await handleActivate(positional)\n break\n case 'deactivate':\n await handleDeactivate(positional)\n break\n case 'delete':\n await handleDelete(positional, flags)\n break\n default:\n console.error(`Unknown command: ${command}`)\n console.log(HELP)\n process.exit(1)\n }\n}\n\nmain().catch((err) => {\n if (err instanceof Error) {\n console.error(`Error: ${err.message}`)\n if ('issues' in err) {\n const issues = (err as { issues: Array<{ rule: number; message: string }> }).issues\n for (const issue of issues) {\n console.error(` [Rule ${issue.rule}] ${issue.message}`)\n }\n }\n } else {\n console.error(err)\n }\n process.exit(1)\n})\n"],"mappings":"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","names":["Anthropic","result","totalTokensInput","totalTokensOutput"]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/utils/uuid.ts","../src/library/null-library.ts","../src/errors/base.ts","../src/errors/api-error.ts","../src/errors/provider-error.ts","../src/utils/retry.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/generation/prompts/v1.ts","../src/utils/thresholds.ts","../src/generation/prompt-builder.ts","../src/generation/designer.ts","../src/telemetry/collector.ts","../src/telemetry/types.ts","../src/telemetry/reader.ts","../src/utils/logger.ts","../src/library/file-library.ts","../src/library/scorer.ts","../src/library/cluster.ts","../src/templates/safety.ts","../src/templates/syncer.ts","../src/cli.ts"],"sourcesContent":["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, WorkflowMatch, WorkflowMetadataInput } 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 type { DesignResult } from './generation/types.js'\nimport { TelemetryCollector } from './telemetry/collector.js'\nimport { TelemetryReader } from './telemetry/reader.js'\nimport { nullLogger } from './utils/logger.js'\nimport type { ILogger } from './utils/logger.js'\nimport { scoreToMode } from './utils/thresholds.js'\nimport { GuardError } from './errors/guard-error.js'\n\nconst DEFAULT_MODEL = 'claude-sonnet-4-6'\n\nexport class Kairos {\n private readonly provider: N8nProvider | null\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 telemetryReader: TelemetryReader | null\n private readonly model: string\n private saveQueue: Promise<string | null> = Promise.resolve(null)\n\n constructor(options: ClientOptions) {\n const logger = options.logger ?? nullLogger\n this.model = options.model ?? DEFAULT_MODEL\n\n if (options.n8nBaseUrl && options.n8nApiKey) {\n try {\n new URL(options.n8nBaseUrl)\n } catch {\n throw new GuardError(`Invalid n8nBaseUrl: \"${options.n8nBaseUrl}\" — must be a valid URL`)\n }\n const apiClient = new N8nApiClient(options.n8nBaseUrl, options.n8nApiKey, logger)\n const stripper = new N8nFieldStripper()\n this.provider = new N8nProvider(apiClient, stripper)\n } else {\n this.provider = null\n }\n\n const anthropic = new Anthropic({ apiKey: options.anthropicApiKey })\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 this.telemetryReader = new TelemetryReader()\n } else if (typeof options.telemetry === 'string') {\n this.telemetry = new TelemetryCollector(options.telemetry)\n this.telemetryReader = new TelemetryReader(options.telemetry)\n } else {\n this.telemetry = null\n this.telemetryReader = null\n }\n }\n\n private requireProvider(): N8nProvider {\n if (!this.provider) {\n throw new GuardError('n8nBaseUrl and n8nApiKey are required for this operation — set them in the Kairos constructor, or use { dryRun: true } for generation-only mode')\n }\n return this.provider\n }\n\n private validateDescription(description: string): void {\n if (!description || description.trim().length === 0) {\n throw new GuardError('Description is required and must be non-empty')\n }\n }\n\n async build(description: string, options?: BuildOptions): Promise<BuildResult> {\n this.validateDescription(description)\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 if (matches.length > 0) {\n const top = matches[0]!\n this.logger.info(`Library: ${matches.length} match(es), top=\"${top.workflow.description.slice(0, 50)}\" score=${top.score.toFixed(2)} mode=${top.mode}`)\n } else {\n this.logger.info('Library: no matches (scratch mode)')\n }\n\n const globalFailureRates = await this.telemetryReader?.getFailureRates() ?? []\n\n if (globalFailureRates.length > 0) {\n const highFreq = globalFailureRates.filter((r) => r.rate >= 0.15)\n if (highFreq.length > 0) {\n this.logger.info(`Telemetry: ${highFreq.length} high-frequency failure rule(s) will be warned about`)\n }\n }\n\n const designResult = await this.designer.design(\n { description, ...(options?.name ? { name: options.name } : {}) },\n matches,\n globalFailureRates,\n )\n\n await this.emitAttemptTelemetry(description, designResult)\n\n const workflow = options?.name\n ? { ...designResult.workflow, name: options.name }\n : designResult.workflow\n\n this.saveToLibrary(workflow, description, designResult, matches)\n\n if (options?.dryRun) {\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 {\n workflowId: null,\n name: workflow.name,\n workflow,\n credentialsNeeded: designResult.credentialsNeeded,\n activationRequired: true,\n generationAttempts: designResult.attempts,\n dryRun: true,\n }\n }\n\n const provider = this.requireProvider()\n const deployed = await provider.deploy(workflow)\n this.recordDeploy()\n\n if (options?.activate) {\n await provider.activate(deployed.workflowId)\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 {\n workflowId: deployed.workflowId,\n name: deployed.name,\n workflow,\n credentialsNeeded: designResult.credentialsNeeded,\n activationRequired: !options?.activate,\n generationAttempts: designResult.attempts,\n dryRun: false,\n }\n }\n\n async replace(id: string, description: string): Promise<BuildResult> {\n this.validateDescription(description)\n this.logger.info('Kairos.update', { id, description })\n const buildStart = Date.now()\n\n await this.telemetry?.emit('build_start', {\n description,\n model: this.model,\n dryRun: false,\n })\n\n await this.library.initialize()\n const matches = await this.library.search(description)\n const globalFailureRates = await this.telemetryReader?.getFailureRates() ?? []\n\n const designResult = await this.designer.design({ description }, matches, globalFailureRates)\n\n await this.emitAttemptTelemetry(description, designResult)\n\n const provider = this.requireProvider()\n const deployed = await provider.update(id, designResult.workflow)\n\n this.saveToLibrary(designResult.workflow, description, designResult, matches)\n this.recordDeploy()\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 {\n workflowId: deployed.workflowId,\n name: deployed.name,\n workflow: designResult.workflow,\n credentialsNeeded: designResult.credentialsNeeded,\n activationRequired: true,\n generationAttempts: designResult.attempts,\n dryRun: false,\n }\n }\n\n async drain(): Promise<void> {\n await this.saveQueue.catch(() => {})\n }\n\n private async emitAttemptTelemetry(description: string, designResult: DesignResult): Promise<void> {\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\n private recordDeploy(): void {\n this.saveQueue = this.saveQueue\n .then(async (savedId) => {\n if (savedId) {\n await this.library.recordDeployment(savedId)\n }\n return savedId\n })\n .catch((err: unknown) => {\n this.logger.warn('Failed to record deployment (non-fatal)', { err: String(err) })\n return null\n })\n }\n\n private saveToLibrary(\n workflow: N8nWorkflow,\n description: string,\n designResult: DesignResult,\n matches: WorkflowMatch[],\n ): void {\n const failedAttempts = designResult.attemptMetadata.filter((m) => !m.validationPassed)\n const failurePatterns = failedAttempts.flatMap((m) =>\n m.issues.map((i) => ({ rule: i.rule, message: i.message })),\n )\n const topMatch = matches[0]\n const generationMode = topMatch ? scoreToMode(topMatch.score) : 'scratch' as const\n\n const autoTags = Array.from(new Set(\n workflow.nodes.flatMap((n) => {\n const bare = n.type.split('.').pop() ?? ''\n const tags = [bare]\n if (n.type.includes('Trigger') || n.type.includes('trigger')) tags.push(`trigger:${bare}`)\n if (n.type.includes('langchain')) tags.push('ai')\n return tags\n }),\n ))\n\n const metadata: WorkflowMetadataInput = {\n description,\n generationMode,\n generationAttempts: designResult.attempts,\n }\n if (autoTags.length > 0) metadata.tags = autoTags\n if (failurePatterns.length > 0) metadata.failurePatterns = failurePatterns\n if (matches.length > 0) metadata.sourceWorkflowIds = matches.map((m) => m.workflow.id)\n if (topMatch) metadata.topMatchScore = topMatch.score\n if (designResult.credentialsNeeded.length > 0) metadata.credentialsNeeded = designResult.credentialsNeeded\n\n const firstTryPass = designResult.attemptMetadata.length > 0\n && designResult.attemptMetadata[0]!.validationPassed\n const failedRules = Array.from(new Set(\n designResult.attemptMetadata\n .filter((m) => !m.validationPassed)\n .flatMap((m) => m.issues.map((i) => i.rule)),\n ))\n\n this.saveQueue = this.saveQueue\n .then(async () => {\n const savedId = await this.library.save(workflow, metadata)\n\n for (const match of matches) {\n if (match.mode === 'direct' || match.mode === 'reference') {\n await this.library.recordOutcome(match.workflow.id, {\n attempts: designResult.attempts,\n firstTryPass,\n failedRules,\n mode: match.mode,\n })\n }\n }\n\n return savedId\n })\n .catch((err: unknown) => {\n this.logger.warn('Failed to save workflow to library (non-fatal)', { err: String(err) })\n return null\n })\n }\n\n async get(id: string): Promise<N8nWorkflow> {\n return this.requireProvider().get(id)\n }\n\n async list(): Promise<WorkflowListItem[]> {\n return this.requireProvider().list()\n }\n\n async activate(id: string): Promise<void> {\n await this.requireProvider().activate(id)\n }\n\n async deactivate(id: string): Promise<void> {\n await this.requireProvider().deactivate(id)\n }\n\n async delete(id: string, options: DeleteOptions): Promise<void> {\n await this.requireProvider().delete(id, options)\n }\n\n async executions(workflowId?: string, filter?: ExecutionFilter): Promise<ExecutionSummary[]> {\n return this.requireProvider().executions(workflowId, filter)\n }\n\n async execution(id: string): Promise<ExecutionDetail> {\n return this.requireProvider().execution(id)\n }\n\n async listTags(): Promise<Tag[]> {\n return this.requireProvider().listTags()\n }\n\n async createTag(name: string): Promise<Tag> {\n return this.requireProvider().createTag(name)\n }\n\n async tag(workflowId: string, tagIds: string[]): Promise<void> {\n await this.requireProvider().tag(workflowId, tagIds)\n }\n\n async untag(workflowId: string, tagIds: string[]): Promise<void> {\n await this.requireProvider().untag(workflowId, tagIds)\n }\n}\n","export function generateUUID(): string {\n return crypto.randomUUID()\n}\n","import type { IWorkflowLibrary, WorkflowMatch, StoredWorkflow, WorkflowMetadataInput, LibraryFilters, SearchOptions, OutcomeData } 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 recordOutcome(_id: string, _outcome: OutcomeData): 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 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","export 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 { withRetry, fetchWithTimeout } from '../../utils/retry.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\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\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 if (!isSafe) {\n return this.singleRequest<T>(url, method, path, body)\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=250'\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=250&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=250'\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=250&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 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 '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 } 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.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 getRequiredParams(type: string): string[] {\n return this.byType.get(type)?.requiredParams ?? []\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 this.checkRule20(workflow, issues)\n this.checkRule21(workflow, issues)\n this.checkRule22(workflow, issues)\n this.checkRule23(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 (node.type.includes('stickyNote')) continue\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 (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 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 // 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 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 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","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'\nimport type { ValidationIssue } from '../validation/types.js'\n\nexport type { ValidationIssue }\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","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- 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### 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## 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\"\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 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 { WorkflowMatch } from '../library/types.js'\nimport type { RuleFailureRate } from '../telemetry/reader.js'\nimport type { DesignRequest, BuiltPrompt, SystemPromptBlock } from './types.js'\nimport { SYSTEM_PROMPT_V1 } from './prompts/v1.js'\nimport { scoreToMode } from '../utils/thresholds.js'\n\nconst RULE_REMEDIES: 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 12: 'Remove forbidden fields: id, active, createdAt, updatedAt, versionId, meta, tags — these are server-assigned',\n 14: 'Include at least one trigger node (e.g. webhook, scheduleTrigger, manualTrigger)',\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: 'Credentials must be an object with non-empty string id and name fields: { id: \"placeholder-id\", name: \"My Credential\" }',\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}\n\nexport class PromptBuilder {\n build(request: DesignRequest, matches: WorkflowMatch[], globalFailureRates: RuleFailureRate[] = []): BuiltPrompt {\n const mode = this.resolveMode(matches)\n const system = this.buildSystem(matches, mode, globalFailureRates)\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 return scoreToMode(top.score)\n }\n\n private buildSystem(matches: WorkflowMatch[], mode: 'direct' | 'reference' | 'scratch', globalFailureRates: RuleFailureRate[] = []): 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 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 const warnings = this.buildFailureWarnings(matches, globalFailureRates)\n if (warnings) {\n blocks.push({ type: 'text', text: warnings })\n }\n\n return blocks\n }\n\n private buildFailureWarnings(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_REMEDIES[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_REMEDIES[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","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 { RuleFailureRate } from '../telemetry/reader.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: [],\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[], globalFailureRates: RuleFailureRate[] = []): Promise<DesignResult> {\n const attemptMetadata: AttemptMetadata[] = []\n let lastErrors: ValidationIssue[] = []\n let attempts = 0\n const built = this.promptBuilder.build(request, matches, globalFailureRates)\n\n for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {\n attempts = attempt\n const temperature = attempt === MAX_ATTEMPTS ? FINAL_TEMPERATURE : BASE_TEMPERATURE\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 = lastErrors.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: lastErrors.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: validation.issues,\n })\n\n if (validation.valid) {\n return { workflow: parsed.workflow, credentialsNeeded: parsed.credentialsNeeded, attempts, attemptMetadata }\n }\n\n lastErrors = errors\n this.logger.warn(`WorkflowDesigner: validation failed on attempt ${attempt}`, {\n errorCount: errors.length,\n })\n }\n\n const finalIssues = attemptMetadata.at(-1)?.issues ?? lastErrors\n throw new ValidationError(\n `Workflow failed validation after ${MAX_ATTEMPTS} attempts`,\n finalIssues,\n )\n }\n\n private async callClaude(\n system: SystemPromptBlock[],\n userMessage: string,\n temperature: number,\n ): Promise<Anthropic.Message> {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), 120_000)\n try {\n return await this.anthropic.messages.create(\n {\n model: this.model,\n max_tokens: 8192,\n temperature,\n system: system.map((b) => ({ type: b.type, text: b.text, ...(b.cache_control ? { cache_control: b.cache_control } : {}) })),\n messages: [{ role: 'user', content: userMessage }],\n tools: [GENERATE_WORKFLOW_TOOL],\n tool_choice: { type: 'tool', name: 'generate_workflow' },\n },\n { signal: controller.signal },\n )\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err)\n throw new GenerationError(`Anthropic API call failed: ${detail}`, err)\n } finally {\n clearTimeout(timer)\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","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>): Promise<void> {\n const event: TelemetryEvent = {\n schemaVersion: TELEMETRY_SCHEMA_VERSION,\n timestamp: new Date().toISOString(),\n sessionId: this.sessionId,\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 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","import { readFile, readdir } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\nimport type { TelemetryEvent } from './types.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' && !(e.data as { dryRun?: boolean }).dryRun)\n .map((e) => e.sessionId),\n )\n if (buildSessions.size === 0) 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 if (!buildSessions.has(event.sessionId)) 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(event.sessionId)\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): Promise<TelemetryEvent[]> {\n let files: string[]\n try {\n files = await readdir(this.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 datePattern = /^\\d{4}-\\d{2}-\\d{2}\\.jsonl$/\n const recentFiles = files\n .filter((f) => datePattern.test(f) && f >= cutoffStr)\n .sort()\n\n const events: TelemetryEvent[] = []\n for (const file of recentFiles) {\n try {\n const content = await readFile(join(this.dir, file), 'utf-8')\n for (const line of content.split('\\n')) {\n if (!line.trim()) continue\n try {\n events.push(JSON.parse(line) as TelemetryEvent)\n } catch {\n // skip malformed lines\n }\n }\n } catch {\n // skip unreadable files\n }\n }\n return events\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 { readFile, writeFile, rename, 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 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 MAX_LIBRARY_SIZE = 500\n\nexport class FileLibrary implements IWorkflowLibrary {\n private readonly dir: string\n private workflows: StoredWorkflow[] = []\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 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\n const indexPath = join(this.dir, 'index.json')\n try {\n const raw = await readFile(indexPath, 'utf-8')\n const parsed: unknown = JSON.parse(raw)\n if (!Array.isArray(parsed)) {\n this.workflows = []\n } else {\n this.workflows = parsed.filter(\n (item): item is StoredWorkflow =>\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(((item as Record<string, unknown>).workflow as Record<string, unknown>).nodes),\n )\n }\n } catch {\n this.workflows = []\n }\n }\n\n async search(description: string, options?: SearchOptions): Promise<WorkflowMatch[]> {\n const searchable = this.workflows.filter((w) => w.trustLevel !== 'blocked')\n if (searchable.length === 0) return []\n\n const limit = options?.limit ?? 3\n const queryTokens = tokenize(description)\n if (queryTokens.length === 0) return []\n\n const docTokenArrays = searchable.map((w) => tokenize(buildSearchCorpus(w)))\n const docTokenSets = docTokenArrays.map((tokens) => new Set(tokens))\n\n const docCount = searchable.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.has(token)).length\n idf.set(token, Math.log((docCount + 1) / (docsWithToken + 1)) + 1)\n }\n\n const scored = hybridScore(queryTokens, description, searchable, docTokenArrays, idf)\n .filter((m) => m.score > 0)\n .sort((a, b) => b.score - a.score)\n\n const clusters = clusterWorkflows(searchable)\n const reranked = rerank(scored, clusters).slice(0, limit)\n\n const results = reranked.map((m) => {\n return { workflow: m.workflow, score: m.score, mode: scoreToMode(m.score) }\n })\n\n if (results.length > 0) {\n for (const r of results) {\n r.workflow.timesRetrieved = (r.workflow.timesRetrieved ?? 0) + 1\n }\n this.persist()\n }\n\n return results\n }\n\n async save(workflow: N8nWorkflow, metadata: WorkflowMetadataInput): Promise<string> {\n const id = generateUUID()\n const failurePatterns = this.deduplicateFailurePatterns(metadata.failurePatterns)\n const stored: StoredWorkflow = {\n id,\n workflow,\n description: metadata.description,\n tags: metadata.tags ?? [],\n platform: metadata.platform ?? 'n8n',\n deployCount: 0,\n createdAt: new Date().toISOString(),\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 }\n this.workflows.push(stored)\n if (this.workflows.length > MAX_LIBRARY_SIZE) {\n this.workflows.sort((a, b) => (b.deployCount ?? 1) - (a.deployCount ?? 1))\n this.workflows = this.workflows.slice(0, MAX_LIBRARY_SIZE)\n }\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 recordOutcome(id: string, outcome: OutcomeData): Promise<void> {\n const w = this.workflows.find((w) => w.id === id)\n if (!w) return\n\n if (outcome.mode === 'direct') {\n w.timesUsedAsDirect = (w.timesUsedAsDirect ?? 0) + 1\n } else {\n w.timesUsedAsReference = (w.timesUsedAsReference ?? 0) + 1\n }\n\n const stats = w.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 w.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 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 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 private persist(): Promise<void> {\n this.writeQueue = this.writeQueue.then(async () => {\n const indexPath = join(this.dir, 'index.json')\n const tmpPath = `${indexPath}.tmp`\n await writeFile(tmpPath, JSON.stringify(this.workflows, null, 2), 'utf-8')\n await rename(tmpPath, indexPath)\n })\n return this.writeQueue\n }\n}\n","import type { StoredWorkflow } from './types.js'\n\nconst WEIGHTS = {\n tfidf: 0.35,\n nodeFingerprint: 0.30,\n outcome: 0.20,\n deploy: 0.15,\n}\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\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 return 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 ? { clusterPattern: cluster.pattern } : {}),\n }\n })\n .sort((a, b) => b.score - a.score)\n}\n","import type { TrustLevel } from '../library/types.js'\nimport type { N8nWorkflow } from '../types/workflow.js'\n\ninterface SafetyResult {\n trustLevel: TrustLevel\n reasons: string[]\n}\n\nconst BLOCKED_NODE_TYPES = new Set([\n 'n8n-nodes-base.code',\n 'n8n-nodes-base.executeCommand',\n 'n8n-nodes-base.ssh',\n])\n\nconst REVIEW_NODE_TYPES = new Set([\n 'n8n-nodes-base.httpRequest',\n])\n\nconst SECRET_PATTERNS = [\n /sk-[a-zA-Z0-9]{20,}/,\n /ghp_[a-zA-Z0-9]{36}/,\n /xoxb-[0-9]+-[0-9]+-[a-zA-Z0-9]+/,\n /AIza[a-zA-Z0-9_-]{35}/,\n /AKIA[A-Z0-9]{16}/,\n]\n\nexport function assessTemplateSafety(workflow: N8nWorkflow): SafetyResult {\n const reasons: string[] = []\n let worst: TrustLevel = 'safe'\n\n const escalate = (level: TrustLevel, reason: string) => {\n reasons.push(reason)\n if (level === 'blocked') worst = 'blocked'\n else if (level === 'review' && worst === 'safe') worst = 'review'\n }\n\n for (const node of workflow.nodes) {\n if (BLOCKED_NODE_TYPES.has(node.type)) {\n escalate('blocked', `Contains ${node.type} node \"${node.name}\"`)\n }\n\n if (REVIEW_NODE_TYPES.has(node.type)) {\n escalate('review', `Contains ${node.type} node \"${node.name}\"`)\n }\n\n const paramStr = JSON.stringify(node.parameters)\n for (const pattern of SECRET_PATTERNS) {\n if (pattern.test(paramStr)) {\n escalate('blocked', `Node \"${node.name}\" parameters contain a hardcoded secret`)\n break\n }\n }\n }\n\n return { trustLevel: worst, reasons }\n}\n","import type { IWorkflowLibrary, WorkflowMetadataInput } from '../library/types.js'\nimport type { N8nWorkflow, N8nNode } from '../types/workflow.js'\nimport type { ILogger } from '../utils/logger.js'\nimport type { TemplateSearchResponse, TemplateDetailResponse, SyncProgress } from './types.js'\nimport { N8nValidator } from '../validation/validator.js'\nimport { assessTemplateSafety } from './safety.js'\n\nconst N8N_TEMPLATE_API = 'https://api.n8n.io/api/templates'\nconst PAGE_SIZE = 50\nconst DELAY_BETWEEN_FETCHES_MS = 200\n\nconst DEFAULT_SETTINGS: N8nWorkflow['settings'] = {\n executionOrder: 'v1',\n saveManualExecutions: true,\n timezone: 'UTC',\n}\n\nexport interface SyncOptions {\n maxTemplates?: number\n onProgress?: (progress: SyncProgress) => void\n}\n\nexport class TemplateSyncer {\n private readonly validator: N8nValidator\n private readonly logger: ILogger\n\n constructor(\n private readonly library: IWorkflowLibrary,\n logger: ILogger,\n ) {\n this.validator = new N8nValidator()\n this.logger = logger\n }\n\n async sync(options?: SyncOptions): Promise<SyncProgress> {\n const maxTemplates = options?.maxTemplates ?? 500\n\n await this.library.initialize()\n\n const existing = await this.library.list()\n const existingSourceIds = new Set(\n existing\n .filter((w) => w.sourceKind === 'n8n-template' && w.sourceId)\n .map((w) => w.sourceId!),\n )\n\n const progress: SyncProgress = {\n total: 0,\n processed: 0,\n saved: 0,\n skippedPaid: 0,\n skippedDuplicate: 0,\n blocked: 0,\n reviewed: 0,\n }\n\n const templateIds = await this.fetchTemplateIds(maxTemplates, progress)\n\n for (const id of templateIds) {\n if (existingSourceIds.has(String(id))) {\n progress.skippedDuplicate++\n progress.processed++\n options?.onProgress?.(progress)\n continue\n }\n\n try {\n await this.processTemplate(id, progress)\n } catch (err) {\n this.logger.warn(`Failed to process template ${id}`, { err: String(err) })\n }\n\n progress.processed++\n options?.onProgress?.(progress)\n\n await new Promise((resolve) => setTimeout(resolve, DELAY_BETWEEN_FETCHES_MS))\n }\n\n return progress\n }\n\n private async fetchTemplateIds(max: number, progress: SyncProgress): Promise<number[]> {\n const ids: number[] = []\n let page = 1\n\n while (ids.length < max) {\n const url = `${N8N_TEMPLATE_API}/search?page=${page}&rows=${PAGE_SIZE}`\n const response = await fetch(url)\n if (!response.ok) break\n\n const data = (await response.json()) as TemplateSearchResponse\n progress.total = Math.min(data.totalWorkflows, max)\n\n for (const template of data.workflows) {\n if (ids.length >= max) break\n if (template.price && template.price > 0) {\n progress.skippedPaid++\n continue\n }\n ids.push(template.id)\n }\n\n if (data.workflows.length < PAGE_SIZE) break\n page++\n\n await new Promise((resolve) => setTimeout(resolve, DELAY_BETWEEN_FETCHES_MS))\n }\n\n return ids\n }\n\n private async processTemplate(id: number, progress: SyncProgress): Promise<void> {\n const url = `${N8N_TEMPLATE_API}/workflows/${id}`\n const response = await fetch(url)\n if (!response.ok) return\n\n const data = (await response.json()) as TemplateDetailResponse\n const templateMeta = data.workflow\n const rawWorkflow = templateMeta.workflow\n\n if (!rawWorkflow?.nodes?.length) return\n\n const workflow: N8nWorkflow = {\n name: templateMeta.name,\n nodes: rawWorkflow.nodes.filter((n) => n.type && n.name) as N8nNode[],\n connections: rawWorkflow.connections as N8nWorkflow['connections'],\n settings: rawWorkflow.settings\n ? { executionOrder: 'v1' as const, ...rawWorkflow.settings }\n : { ...DEFAULT_SETTINGS },\n }\n\n const validation = this.validator.validate(workflow)\n const validationErrors = validation.issues.filter((i) => i.severity === 'error')\n\n if (validationErrors.length > 0) {\n progress.blocked++\n this.logger.debug(`Template ${id} blocked: ${validationErrors.length} validation errors`)\n return\n }\n\n const safety = assessTemplateSafety(workflow)\n\n if (safety.trustLevel === 'blocked') {\n progress.blocked++\n this.logger.debug(`Template ${id} blocked: ${safety.reasons.join(', ')}`)\n return\n }\n\n if (safety.trustLevel === 'review') {\n progress.reviewed++\n }\n\n const description = this.cleanDescription(templateMeta.description)\n\n const autoTags = Array.from(new Set(\n workflow.nodes.flatMap((n) => {\n const bare = n.type.split('.').pop() ?? ''\n const tags = [bare]\n if (n.type.includes('Trigger') || n.type.includes('trigger')) tags.push(`trigger:${bare}`)\n if (n.type.includes('langchain')) tags.push('ai')\n return tags\n }),\n ))\n\n const metadata: WorkflowMetadataInput = {\n description,\n tags: autoTags,\n sourceKind: 'n8n-template',\n sourceId: String(id),\n sourceUrl: `https://n8n.io/workflows/${id}`,\n trustLevel: safety.trustLevel,\n }\n\n await this.library.save(workflow, metadata)\n progress.saved++\n this.logger.debug(`Template ${id} saved: \"${templateMeta.name}\" (${safety.trustLevel})`)\n }\n\n private cleanDescription(raw: string): string {\n return raw\n .replace(/#{1,6}\\s*/g, '')\n .replace(/\\*{1,2}([^*]+)\\*{1,2}/g, '$1')\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim()\n .slice(0, 500)\n }\n}\n","#!/usr/bin/env node\n\nimport { Kairos } from './client.js'\nimport { FileLibrary } from './library/file-library.js'\nimport { TemplateSyncer } from './templates/syncer.js'\n\nconst HELP = `\nKairos SDK — LLM-powered n8n workflow generation\n\nUsage:\n kairos init First-time setup wizard\n kairos build <description> [options]\n kairos list\n kairos get <id>\n kairos activate <id>\n kairos deactivate <id>\n kairos delete <id> --confirm\n kairos sync-templates [options]\n\nBuild options:\n --dry-run Generate and validate without deploying\n --name <name> Override the generated workflow name\n --activate Activate the workflow after deployment\n\nSync options:\n --max <count> Maximum templates to fetch (default: 500)\n\nEnvironment variables:\n ANTHROPIC_API_KEY Anthropic API key (required)\n N8N_BASE_URL n8n instance URL (required for deploy, optional for --dry-run)\n N8N_API_KEY n8n API key (required for deploy, optional for --dry-run)\n KAIROS_MODEL Claude model override (default: claude-sonnet-4-6)\n KAIROS_TELEMETRY Set to \"true\" or a directory path to enable telemetry logging\n`\n\nfunction getEnvOrExit(name: string): string {\n const val = process.env[name]\n if (!val) {\n console.error(`Missing required environment variable: ${name}`)\n process.exit(1)\n }\n return val\n}\n\nfunction parseArgs(argv: string[]): { command: string; positional: string[]; flags: Record<string, string | boolean> } {\n const args = argv.slice(2)\n const command = args[0] ?? ''\n const positional: string[] = []\n const flags: Record<string, string | boolean> = {}\n\n for (let i = 1; i < args.length; i++) {\n const arg = args[i]!\n if (arg.startsWith('--')) {\n const key = arg.slice(2)\n const next = args[i + 1]\n if (next && !next.startsWith('--')) {\n flags[key] = next\n i++\n } else {\n flags[key] = true\n }\n } else {\n positional.push(arg)\n }\n }\n\n return { command, positional, flags }\n}\n\nconst CLI_LOGGER = {\n debug: () => {},\n info: (msg: string, meta?: Record<string, unknown>) => console.error(meta ? `${msg} ${JSON.stringify(meta)}` : msg),\n warn: (msg: string, meta?: Record<string, unknown>) => console.error(meta ? `[warn] ${msg} ${JSON.stringify(meta)}` : `[warn] ${msg}`),\n error: (msg: string, meta?: Record<string, unknown>) => console.error(meta ? `[error] ${msg} ${JSON.stringify(meta)}` : `[error] ${msg}`),\n}\n\nfunction getTelemetryOption(): boolean | string | undefined {\n const telemetryEnv = process.env['KAIROS_TELEMETRY']\n if (telemetryEnv === 'true') return true\n if (telemetryEnv && telemetryEnv !== 'false') return telemetryEnv\n return undefined\n}\n\nfunction createClient(): Kairos {\n const telemetry = getTelemetryOption()\n return new Kairos({\n anthropicApiKey: getEnvOrExit('ANTHROPIC_API_KEY'),\n n8nBaseUrl: getEnvOrExit('N8N_BASE_URL'),\n n8nApiKey: getEnvOrExit('N8N_API_KEY'),\n ...(process.env['KAIROS_MODEL'] ? { model: process.env['KAIROS_MODEL'] } : {}),\n ...(telemetry !== undefined ? { telemetry } : {}),\n library: new FileLibrary(),\n logger: CLI_LOGGER,\n })\n}\n\nfunction createDryRunClient(): Kairos {\n const telemetry = getTelemetryOption()\n return new Kairos({\n anthropicApiKey: getEnvOrExit('ANTHROPIC_API_KEY'),\n ...(process.env['N8N_BASE_URL'] ? { n8nBaseUrl: process.env['N8N_BASE_URL'] } : {}),\n ...(process.env['N8N_API_KEY'] ? { n8nApiKey: process.env['N8N_API_KEY'] } : {}),\n ...(process.env['KAIROS_MODEL'] ? { model: process.env['KAIROS_MODEL'] } : {}),\n ...(telemetry !== undefined ? { telemetry } : {}),\n library: new FileLibrary(),\n logger: CLI_LOGGER,\n })\n}\n\nasync function handleBuild(positional: string[], flags: Record<string, string | boolean>): Promise<void> {\n const description = positional.join(' ')\n if (!description) {\n console.error('Usage: kairos build <description> [--dry-run] [--name <name>] [--activate]')\n process.exit(1)\n }\n\n const isDryRun = flags['dry-run'] === true\n const kairos = isDryRun ? createDryRunClient() : createClient()\n const start = Date.now()\n\n console.error(`Generating workflow...`)\n\n const result = await kairos.build(description, {\n dryRun: isDryRun,\n ...(typeof flags['name'] === 'string' ? { name: flags['name'] } : {}),\n activate: flags['activate'] === true,\n })\n\n await kairos.drain()\n\n const elapsed = ((Date.now() - start) / 1000).toFixed(1)\n\n console.error(`Done in ${elapsed}s (${result.generationAttempts} attempt${result.generationAttempts > 1 ? 's' : ''})`)\n console.error('')\n\n console.log(JSON.stringify({\n workflowId: result.workflowId,\n name: result.name,\n generationAttempts: result.generationAttempts,\n activationRequired: result.activationRequired,\n dryRun: result.dryRun,\n credentialsNeeded: result.credentialsNeeded,\n ...(result.dryRun ? { workflow: result.workflow } : {}),\n }, null, 2))\n}\n\nasync function handleList(): Promise<void> {\n const kairos = createClient()\n const workflows = await kairos.list()\n await kairos.drain()\n\n if (workflows.length === 0) {\n console.log('No workflows found.')\n return\n }\n\n for (const w of workflows) {\n const status = w.active ? 'active' : 'inactive'\n console.log(` ${w.id} ${status.padEnd(8)} ${w.name}`)\n }\n console.log(`\\n${workflows.length} workflow(s)`)\n}\n\nasync function handleGet(positional: string[]): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos get <workflow-id>')\n process.exit(1)\n }\n\n const kairos = createClient()\n const workflow = await kairos.get(id)\n await kairos.drain()\n console.log(JSON.stringify(workflow, null, 2))\n}\n\nasync function handleActivate(positional: string[]): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos activate <workflow-id>')\n process.exit(1)\n }\n\n const kairos = createClient()\n await kairos.activate(id)\n await kairos.drain()\n console.log(`Activated workflow ${id}`)\n}\n\nasync function handleDeactivate(positional: string[]): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos deactivate <workflow-id>')\n process.exit(1)\n }\n\n const kairos = createClient()\n await kairos.deactivate(id)\n await kairos.drain()\n console.log(`Deactivated workflow ${id}`)\n}\n\nasync function handleDelete(positional: string[], flags: Record<string, string | boolean>): Promise<void> {\n const id = positional[0]\n if (!id) {\n console.error('Usage: kairos delete <workflow-id> --confirm')\n process.exit(1)\n }\n\n if (flags['confirm'] !== true) {\n console.error('Refusing to delete without --confirm flag.')\n process.exit(1)\n }\n\n const kairos = createClient()\n await kairos.delete(id, { confirm: true })\n await kairos.drain()\n console.log(`Deleted workflow ${id}`)\n}\n\nasync function handleSyncTemplates(flags: Record<string, string | boolean>): Promise<void> {\n const max = typeof flags['max'] === 'string' ? parseInt(flags['max'], 10) : 500\n const library = new FileLibrary()\n const logger = {\n debug: () => {},\n info: (msg: string, meta?: Record<string, unknown>) => console.error(meta ? `${msg} ${JSON.stringify(meta)}` : msg),\n warn: (msg: string, meta?: Record<string, unknown>) => console.error(meta ? `[warn] ${msg} ${JSON.stringify(meta)}` : `[warn] ${msg}`),\n error: (msg: string, meta?: Record<string, unknown>) => console.error(meta ? `[error] ${msg} ${JSON.stringify(meta)}` : `[error] ${msg}`),\n }\n const syncer = new TemplateSyncer(library, logger)\n\n console.error(`Syncing up to ${max} templates from n8n community library...`)\n\n const result = await syncer.sync({\n maxTemplates: max,\n onProgress: (p) => {\n if (p.processed % 25 === 0 && p.processed > 0) {\n console.error(` Progress: ${p.processed}/${p.total} processed, ${p.saved} saved`)\n }\n },\n })\n\n console.error('')\n console.error(`Sync complete:`)\n console.error(` Saved: ${result.saved}`)\n console.error(` Blocked: ${result.blocked} (validation errors or unsafe content)`)\n console.error(` Review: ${result.reviewed} (saved but flagged for review)`)\n console.error(` Duplicates: ${result.skippedDuplicate} (already in library)`)\n console.error(` Paid: ${result.skippedPaid} (skipped)`)\n}\n\nasync function handleInit(): Promise<void> {\n const { writeFile, readFile, mkdir } = await import('node:fs/promises')\n const { join } = await import('node:path')\n const { homedir } = await import('node:os')\n const readline = await import('node:readline')\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr })\n const ask = (q: string): Promise<string> => new Promise((resolve) => rl.question(q, resolve))\n\n console.error('')\n console.error(' Kairos SDK — Setup Wizard')\n console.error(' ─────────────────────────')\n console.error('')\n\n const envPath = join(process.cwd(), '.env')\n let existingEnv = ''\n try {\n existingEnv = await readFile(envPath, 'utf-8')\n } catch {}\n\n const has = (key: string) => existingEnv.includes(key) || !!process.env[key]\n\n const lines: string[] = []\n\n if (!has('ANTHROPIC_API_KEY')) {\n const key = await ask(' Anthropic API key (from console.anthropic.com): ')\n if (key.trim()) lines.push(`ANTHROPIC_API_KEY=${key.trim()}`)\n } else {\n console.error(' Anthropic API key: already set')\n }\n\n if (!has('N8N_BASE_URL')) {\n const url = await ask(' n8n instance URL (e.g. https://your-name.app.n8n.cloud): ')\n if (url.trim()) lines.push(`N8N_BASE_URL=${url.trim().replace(/\\/$/, '')}`)\n } else {\n console.error(' n8n base URL: already set')\n }\n\n if (!has('N8N_API_KEY')) {\n const key = await ask(' n8n API key: ')\n if (key.trim()) lines.push(`N8N_API_KEY=${key.trim()}`)\n } else {\n console.error(' n8n API key: already set')\n }\n\n rl.close()\n\n if (lines.length > 0) {\n const newContent = existingEnv\n ? existingEnv.trimEnd() + '\\n' + lines.join('\\n') + '\\n'\n : lines.join('\\n') + '\\n'\n await writeFile(envPath, newContent, 'utf-8')\n console.error(`\\n Saved to ${envPath}`)\n } else {\n console.error('\\n All credentials already configured.')\n }\n\n console.error('')\n console.error(' Seeding template library...')\n\n const library = new FileLibrary()\n const logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n }\n const syncer = new TemplateSyncer(library, logger)\n\n await library.initialize()\n const existing = await library.list()\n\n if (existing.length >= 50) {\n console.error(` Library already has ${existing.length} entries — skipping sync.`)\n } else {\n const result = await syncer.sync({\n maxTemplates: 500,\n onProgress: (p) => {\n if (p.processed % 100 === 0 && p.processed > 0) {\n process.stderr.write(` ${p.processed}/${p.total} processed, ${p.saved} saved...\\r`)\n }\n },\n })\n console.error(` Synced ${result.saved} templates (${result.blocked} blocked, ${result.skippedDuplicate} duplicates)`)\n }\n\n const kairosDir = join(homedir(), '.kairos')\n await mkdir(join(kairosDir, 'telemetry'), { recursive: true })\n\n console.error('')\n console.error(' Setup complete! Try:')\n console.error('')\n console.error(' kairos build \"Send a Slack message when a webhook fires\" --dry-run')\n console.error('')\n}\n\nasync function main(): Promise<void> {\n const { command, positional, flags } = parseArgs(process.argv)\n\n if (!command || command === 'help' || flags['help'] === true) {\n console.log(HELP)\n return\n }\n\n switch (command) {\n case 'init':\n await handleInit()\n break\n case 'build':\n await handleBuild(positional, flags)\n break\n case 'list':\n await handleList()\n break\n case 'get':\n await handleGet(positional)\n break\n case 'activate':\n await handleActivate(positional)\n break\n case 'deactivate':\n await handleDeactivate(positional)\n break\n case 'delete':\n await handleDelete(positional, flags)\n break\n case 'sync-templates':\n await handleSyncTemplates(flags)\n break\n default:\n console.error(`Unknown command: ${command}`)\n console.log(HELP)\n process.exit(1)\n }\n}\n\nmain().catch((err: unknown) => {\n if (err instanceof Error) {\n console.error(`Error: ${err.message}`)\n if ('issues' in err && Array.isArray((err as Record<string, unknown>).issues)) {\n for (const issue of (err as Record<string, unknown>).issues as Array<{ rule: number; message: string }>) {\n console.error(` [Rule ${issue.rule}] ${issue.message}`)\n }\n }\n } else {\n console.error(String(err))\n }\n process.exit(1)\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iBAAsB;;;ACAf,SAAS,eAAuB;AACrC,SAAO,OAAO,WAAW;AAC3B;;;ACEO,IAAM,cAAN,MAA8C;AAAA,EACnD,MAAM,aAA4B;AAAA,EAAC;AAAA,EAEnC,MAAM,OAAO,cAAsB,UAAoD;AACrF,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,KAAK,WAAwB,WAAmD;AACpF,WAAO,aAAa;AAAA,EACtB;AAAA,EAEA,MAAM,iBAAiB,KAA4B;AAAA,EAAC;AAAA,EAEpD,MAAM,cAAc,KAAa,UAAsC;AAAA,EAAC;AAAA,EAExE,MAAM,IAAI,KAA6C;AACrD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,KAAK,UAAsD;AAC/D,WAAO,CAAC;AAAA,EACV;AACF;;;AC1BO,IAAM,cAAN,cAA0B,MAAM;AAAA,EACrC,YAAY,SAAiC,OAAiB;AAC5D,UAAM,OAAO;AAD8B;AAE3C,SAAK,OAAO;AACZ,QAAI,MAAM,mBAAmB;AAC3B,YAAM,kBAAkB,MAAM,KAAK,WAAW;AAAA,IAChD;AAAA,EACF;AAAA,EAN6C;AAO/C;;;ACNO,IAAM,WAAN,cAAuB,YAAY;AAAA,EACxC,YACE,SACgB,YAChB,OACA;AACA,UAAM,SAAS,KAAK;AAHJ;AAIhB,SAAK,OAAO;AAAA,EACd;AAAA,EALkB;AAMpB;;;ACTO,IAAM,gBAAN,cAA4B,YAAY;AAAA,EAC7C,YAAY,SAAiB,OAAiB;AAC5C,UAAM,SAAS,KAAK;AACpB,SAAK,OAAO;AAAA,EACd;AACF;;;ACPA,eAAsB,UACpB,IACA,aACA,SACA,aACY;AACZ,MAAI;AACJ,WAAS,UAAU,GAAG,UAAU,aAAa,WAAW;AACtD,QAAI,UAAU,GAAG;AACf,YAAM,SAAS,KAAK,OAAO,IAAI,UAAU;AACzC,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,UAAU,MAAM,UAAU,KAAK,MAAM,CAAC;AAAA,IAC3F;AACA,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,SAAS,KAAK;AACZ,kBAAY;AACZ,UAAI,eAAe,CAAC,YAAY,GAAG,EAAG,OAAM;AAAA,IAC9C;AAAA,EACF;AACA,QAAM;AACR;AAEO,SAAS,iBAAiB,KAAa,MAAmB,WAAsC;AACrG,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAC5D,SAAO,MAAM,KAAK,EAAE,GAAG,MAAM,QAAQ,WAAW,OAAO,CAAC,EAAE,QAAQ,MAAM,aAAa,KAAK,CAAC;AAC7F;;;ACVA,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAC3B,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AAEhB,IAAM,eAAN,MAAmB;AAAA,EACxB,YACmB,SACA,QACA,QACjB;AAHiB;AACA;AACA;AAAA,EAChB;AAAA,EAHgB;AAAA,EACA;AAAA,EACA;AAAA,EAGnB,MAAc,QAAW,QAAgB,MAAc,MAA4B;AACjF,UAAM,MAAM,GAAG,KAAK,QAAQ,QAAQ,OAAO,EAAE,CAAC,UAAU,IAAI;AAC5D,SAAK,OAAO,MAAM,OAAO,MAAM,IAAI,IAAI,EAAE;AAEzC,UAAM,SAAS,WAAW;AAC1B,QAAI,CAAC,QAAQ;AACX,aAAO,KAAK,cAAiB,KAAK,QAAQ,MAAM,IAAI;AAAA,IACtD;AAEA,WAAO;AAAA,MACL,MAAM,KAAK,cAAiB,KAAK,QAAQ,MAAM,IAAI;AAAA,MACnD;AAAA,MACA;AAAA,MACA,CAAC,QAAQ,eAAe,iBAAkB,eAAe,YAAY,IAAI,eAAe;AAAA,IAC1F;AAAA,EACF;AAAA,EAEA,MAAc,cAAiB,KAAa,QAAgB,MAAc,MAA4B;AACpG,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,iBAAiB,KAAK;AAAA,QACrC;AAAA,QACA,SAAS;AAAA,UACP,iBAAiB,KAAK;AAAA,UACtB,gBAAgB;AAAA,UAChB,QAAQ;AAAA,QACV;AAAA,QACA,GAAI,SAAS,SAAY,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE,IAAI,CAAC;AAAA,MAC7D,GAAG,kBAAkB;AAAA,IACvB,SAAS,KAAK;AACZ,YAAM,IAAI,cAAc,kCAAkC,IAAI,IAAI,GAAG;AAAA,IACvE;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI;AACJ,UAAI;AACF,oBAAY,MAAM,SAAS,KAAK;AAAA,MAClC,QAAQ;AACN,oBAAY,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AAAA,MAClD;AACA,WAAK,OAAO,MAAM,iBAAiB,SAAS,MAAM,OAAO,MAAM,IAAI,IAAI,IAAI;AAAA,QACzE,QAAQ,SAAS;AAAA,QACjB,MAAM,OAAO,SAAS;AAAA,MACxB,CAAC;AACD,YAAM,IAAI;AAAA,QACR,oBAAoB,SAAS,MAAM,QAAQ,MAAM,IAAI,IAAI,KAAK,KAAK,UAAU,SAAS,CAAC;AAAA,QACvF,SAAS;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,IAAK,QAAO;AACpC,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,eAAe,UAAqD;AACxE,WAAO,KAAK,QAA6B,QAAQ,cAAc,QAAQ;AAAA,EACzE;AAAA,EAEA,MAAM,eAAe,IAAY,UAAqD;AACpF,WAAO,KAAK,QAA6B,OAAO,cAAc,EAAE,IAAI,QAAQ;AAAA,EAC9E;AAAA,EAEA,MAAM,YAAY,IAA0C;AAC1D,WAAO,KAAK,QAA6B,OAAO,cAAc,EAAE,EAAE;AAAA,EACpE;AAAA,EAEA,MAAM,gBAA6C;AACjD,UAAM,MAA0B,CAAC;AACjC,QAAI,OAAO;AAEX,eAAS;AACP,YAAM,WAAoC,MAAM,KAAK,QAAiC,OAAO,IAAI;AACjG,iBAAW,KAAK,SAAS,MAAM;AAC7B,YAAI,KAAK;AAAA,UACP,IAAI,EAAE;AAAA,UACN,MAAM,EAAE;AAAA,UACR,QAAQ,EAAE;AAAA,UACV,WAAW,EAAE;AAAA,UACb,WAAW,EAAE;AAAA,UACb,GAAI,EAAE,SAAS,SAAY,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,QACjD,CAAC;AAAA,MACH;AACA,UAAI,CAAC,SAAS,WAAY;AAC1B,aAAO,+BAA+B,SAAS,UAAU;AAAA,IAC3D;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,IAA2B;AAC9C,UAAM,KAAK,QAAc,UAAU,cAAc,EAAE,EAAE;AAAA,EACvD;AAAA,EAEA,MAAM,iBAAiB,IAA2B;AAChD,UAAM,KAAK,QAAc,QAAQ,cAAc,EAAE,WAAW;AAAA,EAC9D;AAAA,EAEA,MAAM,mBAAmB,IAA2B;AAClD,UAAM,KAAK,QAAc,QAAQ,cAAc,EAAE,aAAa;AAAA,EAChE;AAAA,EAEA,MAAM,cAAc,YAAqB,QAAuD;AAC9F,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,WAAY,QAAO,IAAI,cAAc,UAAU;AACnD,QAAI,QAAQ,OAAQ,QAAO,IAAI,UAAU,OAAO,MAAM;AACtD,UAAM,QAAQ,KAAK,IAAI,QAAQ,SAAS,IAAI,mBAAmB;AAC/D,WAAO,IAAI,SAAS,OAAO,KAAK,CAAC;AACjC,QAAI,QAAQ,OAAQ,QAAO,IAAI,UAAU,OAAO,MAAM;AAEtD,UAAM,KAAK,OAAO,SAAS;AAC3B,UAAM,WAAW,MAAM,KAAK,QAAkC,OAAO,cAAc,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AACvG,WAAO,SAAS,KAAK,IAAI,KAAK,YAAY;AAAA,EAC5C;AAAA,EAEA,MAAM,aAAa,IAAsC;AACvD,UAAM,WAAW,MAAM,KAAK,QAA8B,OAAO,eAAe,EAAE,EAAE;AACpF,WAAO,EAAE,GAAG,KAAK,aAAa,QAAQ,GAAG,MAAM,SAAS,MAAM,cAAc,SAAS,aAAa;AAAA,EACpG;AAAA,EAEA,MAAM,WAA2B;AAC/B,UAAM,MAAa,CAAC;AACpB,QAAI,OAAO;AAEX,eAAS;AACP,YAAM,WAA+B,MAAM,KAAK,QAA4B,OAAO,IAAI;AACvF,iBAAW,KAAK,SAAS,MAAM;AAC7B,YAAI,KAAK,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,KAAK,CAAC;AAAA,MACrC;AACA,UAAI,CAAC,SAAS,WAAY;AAC1B,aAAO,0BAA0B,SAAS,UAAU;AAAA,IACtD;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAU,MAA4B;AAC1C,UAAM,WAAW,MAAM,KAAK,QAAwB,QAAQ,SAAS,EAAE,KAAK,CAAC;AAC7E,WAAO,EAAE,IAAI,SAAS,IAAI,MAAM,SAAS,KAAK;AAAA,EAChD;AAAA,EAEA,MAAM,YAAY,YAAoB,QAAiC;AACrE,UAAM,KAAK,QAAc,OAAO,cAAc,UAAU,SAAS,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC;AAAA,EAC/F;AAAA,EAEA,MAAM,cAAc,YAAoB,QAAiC;AACvE,UAAM,UAAU,MAAM,KAAK,YAAY,UAAU;AACjD,UAAM,aAAa,QAAQ,QAAQ,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC,OAAO,SAAS,EAAE,EAAE,CAAC,EACpC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE;AAC5B,UAAM,KAAK,QAAc,OAAO,cAAc,UAAU,SAAS,SAAS;AAAA,EAC5E;AAAA,EAEQ,aAAa,GAA2C;AAC9D,WAAO;AAAA,MACL,IAAI,EAAE;AAAA,MACN,YAAY,EAAE;AAAA,MACd,QAAQ,EAAE;AAAA,MACV,WAAW,EAAE;AAAA,MACb,GAAI,EAAE,cAAc,SAAY,EAAE,WAAW,EAAE,UAAU,IAAI,CAAC;AAAA,MAC9D,MAAM,EAAE;AAAA,IACV;AAAA,EACF;AACF;;;ACzIO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,sBAAsB,oBAAoB,OAAO,CAAC,MAAM,MAAM,IAAI;;;ACnExE,IAAM,mBAAN,MAAuB;AAAA,EAC5B,eAAe,UAAoC;AACjD,WAAO,KAAK,MAAM,UAAU,mBAAwC;AAAA,EACtE;AAAA,EAEA,eAAe,UAAoC;AACjD,WAAO,KAAK,MAAM,UAAU,mBAAwC;AAAA,EACtE;AAAA,EAEQ,MAAM,UAAuB,WAA2C;AAC9E,UAAM,SAAS,EAAE,GAAG,SAAS;AAC7B,eAAW,SAAS,WAAW;AAC7B,aAAO,OAAO,KAAK;AAAA,IACrB;AACA,WAAO;AAAA,EACT;AACF;;;ACjBO,IAAM,aAAN,cAAyB,YAAY;AAAA,EAC1C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;;;ACCO,IAAM,cAAN,MAAuC;AAAA,EAG5C,YACmB,QACA,UACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAJV,WAAW;AAAA,EAOpB,MAAM,OAAO,UAA8C;AACzD,UAAM,WAAW,KAAK,SAAS,eAAe,QAAQ;AACtD,UAAM,WAAW,MAAM,KAAK,OAAO,eAAe,QAAQ;AAC1D,WAAO,EAAE,YAAY,SAAS,IAAI,MAAM,SAAS,KAAK;AAAA,EACxD;AAAA,EAEA,MAAM,OAAO,IAAY,UAA8C;AACrE,UAAM,WAAW,KAAK,SAAS,eAAe,QAAQ;AACtD,UAAM,WAAW,MAAM,KAAK,OAAO,eAAe,IAAI,QAAQ;AAC9D,WAAO,EAAE,YAAY,SAAS,IAAI,MAAM,SAAS,KAAK;AAAA,EACxD;AAAA,EAEA,MAAM,IAAI,IAAkC;AAC1C,UAAM,WAAW,MAAM,KAAK,OAAO,YAAY,EAAE;AACjD,WAAO;AAAA,MACL,MAAM,SAAS;AAAA,MACf,OAAO,SAAS;AAAA,MAChB,aAAa,SAAS;AAAA,MACtB,GAAI,SAAS,aAAa,SAAY,EAAE,UAAU,SAAS,SAAS,IAAI,CAAC;AAAA,MACzE,GAAI,SAAS,SAAS,SAAY,EAAE,MAAM,SAAS,KAAK,IAAI,CAAC;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,MAAM,OAAoC;AACxC,WAAO,KAAK,OAAO,cAAc;AAAA,EACnC;AAAA,EAEA,MAAM,SAAS,IAA2B;AACxC,UAAM,KAAK,OAAO,iBAAiB,EAAE;AAAA,EACvC;AAAA,EAEA,MAAM,WAAW,IAA2B;AAC1C,UAAM,KAAK,OAAO,mBAAmB,EAAE;AAAA,EACzC;AAAA,EAEA,MAAM,OAAO,IAAY,SAAuC;AAC9D,QAAI,QAAQ,YAAY,MAAM;AAC5B,YAAM,IAAI,WAAW,oEAAoE;AAAA,IAC3F;AACA,UAAM,KAAK,OAAO,eAAe,EAAE;AAAA,EACrC;AAAA,EAEA,MAAM,WAAW,YAAqB,QAAuD;AAC3F,WAAO,KAAK,OAAO,cAAc,YAAY,MAAM;AAAA,EACrD;AAAA,EAEA,MAAM,UAAU,IAAsC;AACpD,WAAO,KAAK,OAAO,aAAa,EAAE;AAAA,EACpC;AAAA,EAEA,MAAM,WAA2B;AAC/B,WAAO,KAAK,OAAO,SAAS;AAAA,EAC9B;AAAA,EAEA,MAAM,UAAU,MAA4B;AAC1C,WAAO,KAAK,OAAO,UAAU,IAAI;AAAA,EACnC;AAAA,EAEA,MAAM,IAAI,YAAoB,QAAiC;AAC7D,UAAM,KAAK,OAAO,YAAY,YAAY,MAAM;AAAA,EAClD;AAAA,EAEA,MAAM,MAAM,YAAoB,QAAiC;AAC/D,UAAM,KAAK,OAAO,cAAc,YAAY,MAAM;AAAA,EACpD;AACF;;;ACzEO,IAAM,mBAAqC;AAAA;AAAA,EAEhD,EAAE,MAAM,gCAAgC,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,WAAW,KAAK;AAAA,EACnG,EAAE,MAAM,kCAAkC,kBAAkB,CAAC,GAAG,KAAK,GAAG,GAAG,gBAAgB,CAAC,GAAG,WAAW,KAAK;AAAA,EAC/G,EAAE,MAAM,0BAA0B,kBAAkB,CAAC,GAAG,KAAK,CAAC,GAAG,gBAAgB,CAAC,cAAc,MAAM,GAAG,WAAW,KAAK;AAAA,EACzH,EAAE,MAAM,8BAA8B,kBAAkB,CAAC,GAAG,GAAG,KAAK,GAAG,GAAG,gBAAgB,CAAC,GAAG,WAAW,KAAK;AAAA,EAC9G,EAAE,MAAM,gCAAgC,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,QAAQ,WAAW,KAAK;AAAA,EAC3H,EAAE,MAAM,+BAA+B,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,WAAW,KAAK;AAAA,EAClG,EAAE,MAAM,yCAAyC,kBAAkB,CAAC,GAAG,GAAG,GAAG,gBAAgB,CAAC,GAAG,WAAW,KAAK;AAAA,EACjH,EAAE,MAAM,+BAA+B,kBAAkB,CAAC,GAAG,KAAK,GAAG,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,eAAe,WAAW,KAAK;AAAA,EAC3I,EAAE,MAAM,qCAAqC,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,wBAAwB,WAAW,KAAK;AAAA,EAChJ,EAAE,MAAM,sCAAsC,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,gCAAgC,WAAW,KAAK;AAAA,EACzJ,EAAE,MAAM,+BAA+B,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,YAAY,WAAW,KAAK;AAAA,EAC9H,EAAE,MAAM,kCAAkC,kBAAkB,CAAC,GAAG,KAAK,GAAG,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,eAAe,WAAW,KAAK;AAAA,EAC9I,EAAE,MAAM,gCAAgC,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,aAAa,WAAW,KAAK;AAAA,EAChI,EAAE,MAAM,gCAAgC,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,aAAa,WAAW,KAAK;AAAA,EAChI,EAAE,MAAM,kCAAkC,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,oBAAoB,WAAW,KAAK;AAAA,EACzI,EAAE,MAAM,gCAAgC,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,aAAa,WAAW,KAAK;AAAA,EAChI,EAAE,MAAM,wCAAwC,kBAAkB,CAAC,GAAG,GAAG,GAAG,gBAAgB,CAAC,GAAG,WAAW,KAAK;AAAA;AAAA,EAGhH,EAAE,MAAM,uBAAuB,kBAAkB,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,EAAE;AAAA,EAC5E,EAAE,MAAM,8BAA8B,kBAAkB,CAAC,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,gBAAgB,CAAC,KAAK,EAAE;AAAA,EACxG,EAAE,MAAM,sBAAsB,kBAAkB,CAAC,GAAG,GAAG,GAAG,KAAK,KAAK,KAAK,GAAG,GAAG,gBAAgB,CAAC,EAAE;AAAA,EAClG,EAAE,MAAM,qBAAqB,kBAAkB,CAAC,GAAG,GAAG,KAAK,GAAG,GAAG,gBAAgB,CAAC,EAAE;AAAA,EACpF,EAAE,MAAM,yBAAyB,kBAAkB,CAAC,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,gBAAgB,CAAC,EAAE;AAAA,EAC3F,EAAE,MAAM,yBAAyB,kBAAkB,CAAC,GAAG,GAAG,KAAK,GAAG,GAAG,gBAAgB,CAAC,EAAE;AAAA,EACxF,EAAE,MAAM,wBAAwB,kBAAkB,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,gBAAgB,CAAC,EAAE;AAAA,EACrF,EAAE,MAAM,iCAAiC,kBAAkB,CAAC,GAAG,GAAG,CAAC,GAAG,gBAAgB,CAAC,EAAE;AAAA,EACzF,EAAE,MAAM,uBAAuB,kBAAkB,CAAC,GAAG,GAAG,GAAG,gBAAgB,CAAC,EAAE;AAAA,EAC9E,EAAE,MAAM,kCAAkC,kBAAkB,CAAC,GAAG,KAAK,GAAG,GAAG,gBAAgB,CAAC,EAAE;AAAA,EAC9F,EAAE,MAAM,mCAAmC,kBAAkB,CAAC,GAAG,GAAG,GAAG,gBAAgB,CAAC,EAAE;AAAA,EAC1F,EAAE,MAAM,uBAAuB,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,EAAE;AAAA,EACzE,EAAE,MAAM,+BAA+B,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,EAAE;AAAA,EACjF,EAAE,MAAM,2BAA2B,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,EAAE;AAAA,EAC7E,EAAE,MAAM,4BAA4B,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,EAAE;AAAA,EAC9E,EAAE,MAAM,6BAA6B,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,EAAE;AAAA;AAAA,EAG/E,EAAE,MAAM,4BAA4B,kBAAkB,CAAC,GAAG,GAAG,GAAG,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,OAAO;AAAA,EAC9G,EAAE,MAAM,wBAAwB,kBAAkB,CAAC,GAAG,GAAG,KAAK,GAAG,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,iBAAiB;AAAA,EACzH,EAAE,MAAM,2BAA2B,kBAAkB,CAAC,GAAG,KAAK,GAAG,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,cAAc;AAAA,EACtH,EAAE,MAAM,0BAA0B,kBAAkB,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,oBAAoB;AAAA;AAAA,EAGpH,EAAE,MAAM,wBAAwB,kBAAkB,CAAC,GAAG,GAAG,GAAG,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,cAAc;AAAA,EACjH,EAAE,MAAM,+BAA+B,kBAAkB,CAAC,GAAG,GAAG,GAAG,GAAG,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,wBAAwB;AAAA,EAC5J,EAAE,MAAM,8BAA8B,kBAAkB,CAAC,GAAG,GAAG,CAAC,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,uBAAuB;AAAA,EAC9H,EAAE,MAAM,iCAAiC,kBAAkB,CAAC,GAAG,KAAK,KAAK,GAAG,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,0BAA0B;AAAA;AAAA,EAG7I,EAAE,MAAM,yBAAyB,kBAAkB,CAAC,GAAG,GAAG,KAAK,GAAG,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,YAAY;AAAA,EACrH,EAAE,MAAM,2BAA2B,kBAAkB,CAAC,GAAG,GAAG,GAAG,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,mBAAmB;AAAA,EACzH,EAAE,MAAM,yBAAyB,kBAAkB,CAAC,GAAG,GAAG,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,YAAY;AAAA,EAC7G,EAAE,MAAM,uBAAuB,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,uBAAuB;AAAA,EACjH,EAAE,MAAM,0BAA0B,kBAAkB,CAAC,GAAG,GAAG,GAAG,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,mBAAmB;AAAA;AAAA,EAGxH,EAAE,MAAM,2BAA2B,kBAAkB,CAAC,GAAG,GAAG,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,WAAW;AAAA,EACrI,EAAE,MAAM,wBAAwB,kBAAkB,CAAC,GAAG,GAAG,KAAK,KAAK,KAAK,GAAG,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,QAAQ;AAAA,EAC1H,EAAE,MAAM,wBAAwB,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,QAAQ;AAAA,EACnG,EAAE,MAAM,2BAA2B,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,cAAc;AAAA;AAAA,EAG5G,EAAE,MAAM,wBAAwB,kBAAkB,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,MAAM;AAAA;AAAA,EAGpG,EAAE,MAAM,yBAAyB,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,YAAY;AAAA;AAAA,EAGxG,EAAE,MAAM,kCAAkC,kBAAkB,CAAC,GAAG,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,gBAAgB,CAAC,EAAE;AAAA,EACjI,EAAE,MAAM,qCAAqC,kBAAkB,CAAC,GAAG,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,gBAAgB,CAAC,EAAE;AAAA,EAChH,EAAE,MAAM,6CAA6C,kBAAkB,CAAC,GAAG,KAAK,KAAK,KAAK,GAAG,GAAG,gBAAgB,CAAC,EAAE;AAAA,EACnH,EAAE,MAAM,mCAAmC,kBAAkB,CAAC,GAAG,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,YAAY;AAAA,EAC1J,EAAE,MAAM,sCAAsC,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,eAAe;AAAA,EACxH,EAAE,MAAM,iDAAiD,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,EAAE;AAAA,EACnG,EAAE,MAAM,2CAA2C,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,EAAE;AAAA;AAAA,EAG7F,EAAE,MAAM,yCAAyC,kBAAkB,CAAC,GAAG,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,YAAY;AAAA,EAC3J,EAAE,MAAM,4CAA4C,kBAAkB,CAAC,GAAG,KAAK,KAAK,GAAG,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,eAAe;AAAA,EAC7I,EAAE,MAAM,+CAA+C,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,gBAAgB;AAAA;AAAA,EAGlI,EAAE,MAAM,+CAA+C,kBAAkB,CAAC,GAAG,KAAK,KAAK,GAAG,GAAG,gBAAgB,CAAC,EAAE;AAAA,EAChH,EAAE,MAAM,yCAAyC,kBAAkB,CAAC,GAAG,KAAK,KAAK,GAAG,GAAG,gBAAgB,CAAC,EAAE;AAAA,EAC1G,EAAE,MAAM,qCAAqC,kBAAkB,CAAC,GAAG,GAAG,GAAG,gBAAgB,CAAC,EAAE;AAAA,EAC5F,EAAE,MAAM,4CAA4C,kBAAkB,CAAC,GAAG,GAAG,GAAG,gBAAgB,CAAC,EAAE;AAAA,EACnG,EAAE,MAAM,2CAA2C,kBAAkB,CAAC,CAAC,GAAG,gBAAgB,CAAC,EAAE;AAC/F;AAEO,IAAM,eAAN,MAAmB;AAAA,EACP;AAAA,EAEjB,YAAY,cAAgC,kBAAkB;AAC5D,SAAK,SAAS,IAAI,IAAI,YAAY,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAAA,EAC3D;AAAA,EAEA,IAAI,MAA0C;AAC5C,WAAO,KAAK,OAAO,IAAI,IAAI;AAAA,EAC7B;AAAA,EAEA,UAAU,MAAuB;AAC/B,WAAO,KAAK,OAAO,IAAI,IAAI,GAAG,cAAc;AAAA,EAC9C;AAAA,EAEA,QAAQ,MAAuB;AAC7B,WAAO,KAAK,OAAO,IAAI,IAAI;AAAA,EAC7B;AAAA,EAEA,cAAc,MAAc,SAA0B;AACpD,UAAM,MAAM,KAAK,OAAO,IAAI,IAAI;AAChC,QAAI,CAAC,IAAK,QAAO;AACjB,WAAO,IAAI,iBAAiB,SAAS,OAAO;AAAA,EAC9C;AAAA,EAEA,kBAAkB,MAAwB;AACxC,WAAO,KAAK,OAAO,IAAI,IAAI,GAAG,kBAAkB,CAAC;AAAA,EACnD;AACF;;;AC1HA,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,wBAAwB,CAAC,YAAY,UAAU;AAErD,IAAM,oBAAoB;AAEnB,IAAM,eAAN,MAAmB;AAAA,EACP;AAAA,EAEjB,YAAY,WAAyB,IAAI,aAAa,gBAAgB,GAAG;AACvE,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,SAAS,UAAyC;AAChD,UAAM,SAA4B,CAAC;AAEnC,SAAK,WAAW,UAAU,MAAM;AAChC,SAAK,WAAW,UAAU,MAAM;AAChC,SAAK,WAAW,UAAU,MAAM;AAChC,SAAK,WAAW,UAAU,MAAM;AAChC,SAAK,WAAW,UAAU,MAAM;AAChC,SAAK,WAAW,UAAU,MAAM;AAChC,SAAK,WAAW,UAAU,MAAM;AAChC,SAAK,WAAW,UAAU,MAAM;AAChC,SAAK,WAAW,UAAU,MAAM;AAChC,SAAK,YAAY,UAAU,MAAM;AACjC,SAAK,YAAY,UAAU,MAAM;AACjC,SAAK,YAAY,UAAU,MAAM;AACjC,SAAK,YAAY,UAAU,MAAM;AACjC,SAAK,YAAY,UAAU,MAAM;AACjC,SAAK,YAAY,UAAU,MAAM;AACjC,SAAK,YAAY,UAAU,MAAM;AACjC,SAAK,YAAY,UAAU,MAAM;AACjC,SAAK,YAAY,UAAU,MAAM;AACjC,SAAK,YAAY,UAAU,MAAM;AACjC,SAAK,YAAY,UAAU,MAAM;AACjC,SAAK,YAAY,UAAU,MAAM;AACjC,SAAK,YAAY,UAAU,MAAM;AACjC,SAAK,YAAY,UAAU,MAAM;AAEjC,UAAM,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO;AAC1D,WAAO,EAAE,OAAO,OAAO,WAAW,GAAG,OAAO;AAAA,EAC9C;AAAA,EAEQ,IAAI,QAA2B,MAAc,SAAiB,QAAuB;AAC3F,UAAM,QAAyB,EAAE,MAAM,UAAU,SAAS,QAAQ;AAClE,QAAI,WAAW,OAAW,OAAM,SAAS;AACzC,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA,EAEQ,KAAK,QAA2B,MAAc,SAAiB,QAAuB;AAC5F,UAAM,QAAyB,EAAE,MAAM,UAAU,QAAQ,QAAQ;AACjE,QAAI,WAAW,OAAW,OAAM,SAAS;AACzC,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA,EAEQ,cAAc,MAAwB;AAC5C,QAAI,KAAK,SAAS,UAAU,KAAK,IAAI,EAAG,QAAO;AAC/C,WAAO,sBAAsB,KAAK,CAAC,MAAM,EAAE,KAAK,KAAK,IAAI,CAAC;AAAA,EAC5D;AAAA;AAAA,EAGQ,WAAW,GAAgB,QAAiC;AAClE,QAAI,OAAO,EAAE,SAAS,YAAY,EAAE,KAAK,KAAK,MAAM,IAAI;AACtD,WAAK,IAAI,QAAQ,GAAG,0DAA0D;AAAA,IAChF;AAAA,EACF;AAAA;AAAA,EAGQ,WAAW,GAAgB,QAAiC;AAClE,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,WAAW,GAAG;AACnD,WAAK,IAAI,QAAQ,GAAG,sCAAsC;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA,EAGQ,WAAW,GAAgB,QAAiC;AAClE,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,EAAG;AAC7B,eAAW,QAAQ,EAAE,OAAO;AAC1B,UAAI,OAAO,KAAK,OAAO,YAAY,KAAK,GAAG,KAAK,MAAM,IAAI;AACxD,aAAK,IAAI,QAAQ,GAAG,SAAS,KAAK,QAAQ,SAAS,2BAA2B,KAAK,EAAE;AAAA,MACvF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,WAAW,GAAgB,QAAiC;AAClE,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,EAAG;AAC7B,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,QAAQ,EAAE,OAAO;AAC1B,UAAI,CAAC,KAAK,GAAI;AACd,UAAI,KAAK,IAAI,KAAK,EAAE,GAAG;AACrB,aAAK,IAAI,QAAQ,GAAG,uBAAuB,KAAK,EAAE,KAAK,KAAK,EAAE;AAAA,MAChE;AACA,WAAK,IAAI,KAAK,EAAE;AAAA,IAClB;AAAA,EACF;AAAA;AAAA,EAGQ,WAAW,GAAgB,QAAiC;AAClE,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,EAAG;AAC7B,eAAW,QAAQ,EAAE,OAAO;AAC1B,UAAI,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,KAAK,MAAM,IAAI;AAC5D,aAAK,IAAI,QAAQ,GAAG,SAAS,KAAK,QAAQ,KAAK,EAAE,uBAAuB,KAAK,EAAE;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,WAAW,GAAgB,QAAiC;AAClE,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,EAAG;AAC7B,eAAW,QAAQ,EAAE,OAAO;AAC1B,UAAI,OAAO,KAAK,gBAAgB,YAAY,KAAK,eAAe,GAAG;AACjE,aAAK,IAAI,QAAQ,GAAG,SAAS,KAAK,IAAI,8BAA8B,OAAO,KAAK,WAAW,CAAC,IAAI,KAAK,EAAE;AAAA,MACzG;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,WAAW,GAAgB,QAAiC;AAClE,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,EAAG;AAC7B,eAAW,QAAQ,EAAE,OAAO;AAC1B,YAAM,MAAM,KAAK;AACjB,UACE,CAAC,MAAM,QAAQ,GAAG,KAClB,IAAI,WAAW,KACf,OAAO,IAAI,CAAC,MAAM,YAClB,OAAO,IAAI,CAAC,MAAM,UAClB;AACA,aAAK,IAAI,QAAQ,GAAG,SAAS,KAAK,IAAI,2CAA2C,KAAK,EAAE;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,WAAW,GAAgB,QAAiC;AAClE,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,EAAG;AAC7B,eAAW,QAAQ,EAAE,OAAO;AAC1B,UAAI,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,KAAK,MAAM,IAAI;AAC5D,aAAK,IAAI,QAAQ,GAAG,iBAAiB,KAAK,EAAE,uBAAuB,KAAK,EAAE;AAAA,MAC5E;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,WAAW,GAAgB,QAAiC;AAClE,QAAI,OAAO,EAAE,gBAAgB,YAAY,EAAE,gBAAgB,QAAQ,MAAM,QAAQ,EAAE,WAAW,GAAG;AAC/F,WAAK,IAAI,QAAQ,GAAG,uEAAuE;AAAA,IAC7F;AAAA,EACF;AAAA;AAAA,EAGQ,YAAY,GAAgB,QAAiC;AACnE,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,KAAK,OAAO,EAAE,gBAAgB,YAAY,EAAE,gBAAgB,KAAM;AAC5F,UAAM,YAAY,IAAI,IAAI,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACpD,eAAW,CAAC,YAAY,OAAO,KAAK,OAAO,QAAQ,EAAE,WAAW,GAAG;AACjE,UAAI,CAAC,UAAU,IAAI,UAAU,GAAG;AAC9B,aAAK,IAAI,QAAQ,IAAI,sBAAsB,UAAU,2BAA2B;AAChF;AAAA,MACF;AACA,UAAI,OAAO,YAAY,YAAY,YAAY,KAAM;AACrD,iBAAW,aAAa,OAAO,OAAO,OAAO,GAAG;AAC9C,YAAI,CAAC,MAAM,QAAQ,SAAS,EAAG;AAC/B,mBAAW,WAAW,WAAW;AAC/B,cAAI,CAAC,MAAM,QAAQ,OAAO,EAAG;AAC7B,qBAAW,UAAU,SAAS;AAC5B,kBAAM,IAAI;AACV,gBAAI,OAAO,GAAG,SAAS,YAAY,CAAC,UAAU,IAAI,EAAE,IAAI,GAAG;AACzD,mBAAK,IAAI,QAAQ,IAAI,sBAAsB,EAAE,IAAI,2BAA2B;AAAA,YAC9E;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,YAAY,GAAgB,QAAiC;AACnE,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,KAAK,OAAO,EAAE,gBAAgB,YAAY,EAAE,gBAAgB,KAAM;AAC5F,UAAM,YAAY,oBAAI,IAAY;AAClC,eAAW,CAAC,EAAE,OAAO,KAAK,OAAO,QAAQ,EAAE,WAAW,GAAG;AACvD,UAAI,OAAO,YAAY,YAAY,YAAY,KAAM;AACrD,iBAAW,aAAa,OAAO,OAAO,OAAO,GAAG;AAC9C,YAAI,CAAC,MAAM,QAAQ,SAAS,EAAG;AAC/B,mBAAW,WAAW,WAAW;AAC/B,cAAI,CAAC,MAAM,QAAQ,OAAO,EAAG;AAC7B,qBAAW,UAAU,SAAS;AAC5B,kBAAM,IAAI;AACV,gBAAI,OAAO,GAAG,SAAS,SAAU,WAAU,IAAI,EAAE,IAAI;AAAA,UACvD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,eAAW,QAAQ,EAAE,OAAO;AAC1B,UAAI,KAAK,KAAK,SAAS,YAAY,EAAG;AACtC,UAAI,CAAC,KAAK,cAAc,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,IAAI,GAAG;AAC1D,aAAK,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,uDAAuD,KAAK,EAAE;AAAA,MACxG;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,YAAY,GAAgB,QAAiC;AACnE,UAAM,OAAO;AACb,eAAW,SAAS,qBAAqB;AACvC,UAAI,SAAS,MAAM;AACjB,aAAK,IAAI,QAAQ,IAAI,oBAAoB,KAAK,yDAAoD;AAAA,MACpG;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,YAAY,GAAgB,QAAiC;AACnE,QAAI,EAAE,aAAa,QAAW;AAC5B,UAAI,OAAO,EAAE,aAAa,YAAY,EAAE,aAAa,QAAQ,MAAM,QAAQ,EAAE,QAAQ,GAAG;AACtF,aAAK,IAAI,QAAQ,IAAI,0CAA0C;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,YAAY,GAAgB,QAAiC;AACnE,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,EAAG;AAC7B,UAAM,aAAa,EAAE,MAAM,KAAK,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC;AAC5D,QAAI,CAAC,YAAY;AACf,WAAK,IAAI,QAAQ,IAAI,iDAAiD;AAAA,IACxE;AAAA,EACF;AAAA;AAAA,EAGQ,YAAY,GAAgB,QAAiC;AACnE,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,EAAG;AAC7B,eAAW,QAAQ,EAAE,OAAO;AAC1B,UAAI,OAAO,KAAK,SAAS,SAAU;AACnC,UAAI,CAAC,kBAAkB,KAAK,KAAK,IAAI,GAAG;AACtC,aAAK,IAAI,QAAQ,IAAI,SAAS,KAAK,IAAI,iCAAiC,KAAK,IAAI,KAAK,KAAK,EAAE;AAAA,MAC/F;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,YAAY,GAAgB,QAAiC;AACnE,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,EAAG;AAC7B,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,QAAQ,EAAE,OAAO;AAC1B,UAAI,CAAC,KAAK,KAAM;AAChB,UAAI,KAAK,IAAI,KAAK,IAAI,GAAG;AACvB,aAAK,IAAI,QAAQ,IAAI,yBAAyB,KAAK,IAAI,KAAK,KAAK,EAAE;AAAA,MACrE;AACA,WAAK,IAAI,KAAK,IAAI;AAAA,IACpB;AAAA,EACF;AAAA;AAAA,EAGQ,YAAY,GAAgB,QAAiC;AACnE,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,EAAG;AAC7B,eAAW,QAAQ,EAAE,OAAO;AAC1B,UAAI,CAAC,KAAK,YAAa;AACvB,iBAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,KAAK,WAAW,GAAG;AAClE,YAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AACnD,eAAK,IAAI,QAAQ,IAAI,SAAS,KAAK,IAAI,iBAAiB,QAAQ,wCAAwC,KAAK,EAAE;AAC/G;AAAA,QACF;AACA,cAAM,MAAM;AACZ,YACE,OAAO,IAAI,IAAI,MAAM,YAAY,IAAI,IAAI,EAAE,KAAK,MAAM,MACtD,OAAO,IAAI,MAAM,MAAM,YAAY,IAAI,MAAM,EAAE,KAAK,MAAM,IAC1D;AACA,eAAK,IAAI,QAAQ,IAAI,SAAS,KAAK,IAAI,iBAAiB,QAAQ,mDAAmD,KAAK,EAAE;AAAA,QAC5H;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,YAAY,GAAgB,QAAiC;AACnE,QAAI,OAAO,EAAE,gBAAgB,YAAY,EAAE,gBAAgB,KAAM;AACjE,UAAM,aAAa,oBAAI,IAAI;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,EAAG;AAC7B,UAAM,cAAc,IAAI,IAAI,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAE3D,eAAW,CAAC,YAAY,OAAO,KAAK,OAAO,QAAQ,EAAE,WAAW,GAAG;AACjE,YAAM,aAAa,YAAY,IAAI,UAAU;AAC7C,UAAI,CAAC,WAAY;AACjB,UAAI,CAAC,WAAW,IAAI,WAAW,IAAI,EAAG;AACtC,UAAI,OAAO,YAAY,YAAY,YAAY,KAAM;AACrD,iBAAW,YAAY,qBAAqB;AAC1C,YAAI,YAAY,SAAS;AACvB,eAAK;AAAA,YACH;AAAA,YACA;AAAA,YACA,SAAS,UAAU,8BAA8B,QAAQ;AAAA,YACzD,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,YAAY,GAAgB,QAAiC;AACnE,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,EAAG;AAC7B,eAAW,QAAQ,EAAE,OAAO;AAC1B,UAAI,OAAO,KAAK,SAAS,YAAY,OAAO,KAAK,gBAAgB,SAAU;AAC3E,UAAI,CAAC,KAAK,SAAS,cAAc,KAAK,MAAM,KAAK,WAAW,GAAG;AAC7D,aAAK;AAAA,UACH;AAAA,UACA;AAAA,UACA,SAAS,KAAK,IAAI,sBAAsB,KAAK,WAAW,cAAc,KAAK,IAAI;AAAA,UAC/E,KAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA,EAIQ,YAAY,GAAgB,QAAiC;AACnE,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,KAAK,OAAO,EAAE,gBAAgB,YAAY,EAAE,gBAAgB,KAAM;AAE5F,UAAM,kBAAkB,IAAI;AAAA,MAC1B,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,KAAK,SAAS,gBAAgB,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAC5E;AAEA,UAAM,MAAM,oBAAI,IAAsB;AACtC,eAAW,CAAC,YAAY,OAAO,KAAK,OAAO,QAAQ,EAAE,WAAW,GAAG;AACjE,UAAI,OAAO,YAAY,YAAY,YAAY,KAAM;AACrD,YAAM,UAAoB,CAAC;AAC3B,iBAAW,aAAa,OAAO,OAAO,OAAO,GAAG;AAC9C,YAAI,CAAC,MAAM,QAAQ,SAAS,EAAG;AAC/B,mBAAW,SAAS,WAAW;AAC7B,cAAI,CAAC,MAAM,QAAQ,KAAK,EAAG;AAC3B,qBAAW,QAAQ,OAAO;AACxB,kBAAM,IAAI;AACV,gBAAI,OAAO,GAAG,SAAS,UAAU;AAC/B,kBAAI,gBAAgB,IAAI,EAAE,IAAI,EAAG;AACjC,sBAAQ,KAAK,EAAE,IAAI;AAAA,YACrB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,UAAI,IAAI,YAAY,OAAO;AAAA,IAC7B;AAEA,UAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ;AACnC,UAAM,QAAQ,oBAAI,IAAoB;AACtC,eAAW,QAAQ,EAAE,MAAO,OAAM,IAAI,KAAK,MAAM,KAAK;AAEtD,UAAM,MAAM,CAAC,SAA0B;AACrC,YAAM,IAAI,MAAM,IAAI;AACpB,iBAAW,YAAY,IAAI,IAAI,IAAI,KAAK,CAAC,GAAG;AAC1C,cAAM,IAAI,MAAM,IAAI,QAAQ;AAC5B,YAAI,MAAM,KAAM,QAAO;AACvB,YAAI,MAAM,SAAS,IAAI,QAAQ,EAAG,QAAO;AAAA,MAC3C;AACA,YAAM,IAAI,MAAM,KAAK;AACrB,aAAO;AAAA,IACT;AAEA,eAAW,QAAQ,EAAE,OAAO;AAC1B,UAAI,MAAM,IAAI,KAAK,IAAI,MAAM,SAAS,IAAI,KAAK,IAAI,GAAG;AACpD,aAAK,KAAK,QAAQ,IAAI,2EAAsE;AAC5F;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,YAAY,GAAgB,QAAiC;AACnE,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,EAAG;AAC7B,eAAW,QAAQ,EAAE,OAAO;AAC1B,UAAI,OAAO,KAAK,SAAS,SAAU;AACnC,YAAM,WAAW,KAAK,SAAS,kBAAkB,KAAK,IAAI;AAC1D,UAAI,SAAS,WAAW,EAAG;AAC3B,YAAM,SAAU,KAAK,cAAc,CAAC;AACpC,iBAAW,SAAS,UAAU;AAC5B,cAAM,QAAQ,OAAO,KAAK;AAC1B,YAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,IAAI;AACzD,eAAK;AAAA,YACH;AAAA,YACA;AAAA,YACA,SAAS,KAAK,IAAI,MAAM,KAAK,IAAI,oCAAoC,KAAK;AAAA,YAC1E,KAAK;AAAA,UACP;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,YAAY,GAAgB,QAAiC;AACnE,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,EAAG;AAC7B,eAAW,QAAQ,EAAE,OAAO;AAC1B,UAAI,OAAO,KAAK,SAAS,SAAU;AACnC,UAAI,KAAK,KAAK,SAAS,YAAY,EAAG;AACtC,UAAI,CAAC,kBAAkB,KAAK,KAAK,IAAI,EAAG;AACxC,UAAI,CAAC,KAAK,SAAS,QAAQ,KAAK,IAAI,GAAG;AACrC,aAAK;AAAA,UACH;AAAA,UACA;AAAA,UACA,SAAS,KAAK,IAAI,wBAAwB,KAAK,IAAI;AAAA,UACnD,KAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,YAAY,GAAgB,QAAiC;AACnE,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,EAAG;AAE7B,UAAM,0BAA0B,EAAE,MAAM,OAAO,CAAC,MAAM;AACpD,UAAI,CAAC,EAAE,KAAK,SAAS,SAAS,EAAG,QAAO;AACxC,YAAM,SAAS,EAAE;AACjB,aAAO,QAAQ,iBAAiB;AAAA,IAClC,CAAC;AAED,QAAI,wBAAwB,WAAW,EAAG;AAE1C,UAAM,iBAAiB,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,KAAK,SAAS,kBAAkB,CAAC;AAC9E,QAAI,CAAC,gBAAgB;AACnB,iBAAW,MAAM,yBAAyB;AACxC,aAAK;AAAA,UACH;AAAA,UACA;AAAA,UACA,YAAY,GAAG,IAAI;AAAA,UACnB,GAAG;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACjcO,IAAM,kBAAN,cAA8B,YAAY;AAAA,EAC/C,YAAY,SAAiB,OAAiB;AAC5C,UAAM,SAAS,KAAK;AACpB,SAAK,OAAO;AAAA,EACd;AACF;;;ACLO,IAAM,qBAAN,cAAiC,YAAY;AAAA,EAClD,YAAY,SAAiB,OAAiB;AAC5C,UAAM,SAAS,KAAK;AACpB,SAAK,OAAO;AAAA,EACd;AACF;;;ACFO,IAAM,kBAAN,cAA8B,YAAY;AAAA,EAC/C,YACE,SACgB,QAChB;AACA,UAAM,OAAO;AAFG;AAGhB,SAAK,OAAO;AAAA,EACd;AAAA,EAJkB;AAKpB;;;ACbO,IAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAzB,IAAM,mBAAmB;AACzB,IAAM,sBAAsB;AAE5B,SAAS,YAAY,OAAmD;AAC7E,MAAI,SAAS,iBAAkB,QAAO;AACtC,MAAI,SAAS,oBAAqB,QAAO;AACzC,SAAO;AACT;;;ACDA,IAAM,gBAAwC;AAAA,EAC5C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACzB,MAAM,SAAwB,SAA0B,qBAAwC,CAAC,GAAgB;AAC/G,UAAM,OAAO,KAAK,YAAY,OAAO;AACrC,UAAM,SAAS,KAAK,YAAY,SAAS,MAAM,kBAAkB;AACjE,UAAM,cAAc,KAAK,iBAAiB,SAAS,SAAS,IAAI;AAChE,WAAO,EAAE,QAAQ,aAAa,MAAM,QAAQ;AAAA,EAC9C;AAAA,EAEA,uBACE,SACA,SACA,WACA,SACQ;AACR,UAAM,OAAO,KAAK,iBAAiB,SAAS,SAAS,KAAK,YAAY,OAAO,CAAC;AAC9E,WAAO,GAAG,IAAI;AAAA;AAAA,oDAEkC,OAAO;AAAA,EACzD,UAAU,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,EAGpB;AAAA,EAEQ,YAAY,SAA8D;AAChF,QAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,UAAM,MAAM,QAAQ,CAAC;AACrB,QAAI,CAAC,IAAK,QAAO;AACjB,WAAO,YAAY,IAAI,KAAK;AAAA,EAC9B;AAAA,EAEQ,YAAY,SAA0B,MAA0C,qBAAwC,CAAC,GAAwB;AACvJ,UAAM,SAA8B;AAAA,MAClC;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,eAAe,EAAE,MAAM,YAAY;AAAA,MACrC;AAAA,IACF;AAEA,QAAI,SAAS,eAAe,QAAQ,SAAS,GAAG;AAC9C,YAAM,UAAU,QACb,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,MAAM;AACV,cAAM,QAAQ,EAAE,SAAS,SAAS,MAC/B,IAAI,CAAC,MAAM,OAAO,EAAE,IAAI,KAAK,EAAE,IAAI,KAAK,EAAE,WAAW,GAAG,EACxD,KAAK,IAAI;AACZ,eAAO,wBAAwB,EAAE,SAAS,WAAW,kBAAkB,EAAE,MAAM,QAAQ,CAAC,CAAC;AAAA;AAAA,EAAc,KAAK;AAAA,MAC9G,CAAC,EACA,KAAK,MAAM;AAEd,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA;AAAA,EAA2F,OAAO;AAAA,MAC1G,CAAC;AAAA,IACH;AAEA,QAAI,SAAS,YAAY,QAAQ,CAAC,GAAG;AACnC,YAAM,QAAQ,QAAQ,CAAC;AACvB,YAAM,OAAO,KAAK,UAAU,MAAM,SAAS,UAAU,MAAM,CAAC;AAC5D,UAAI,KAAK,SAAS,KAAQ;AACxB,cAAM,QAAQ,MAAM,SAAS,SAAS,MACnC,IAAI,CAAC,MAAM,OAAO,EAAE,IAAI,KAAK,EAAE,IAAI,KAAK,EAAE,WAAW,GAAG,EACxD,KAAK,IAAI;AACZ,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM,uCAAuC,MAAM,MAAM,QAAQ,CAAC,CAAC;AAAA;AAAA,EAA0D,KAAK;AAAA,QACpI,CAAC;AAAA,MACH,OAAO;AACL,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM,uCAAuC,MAAM,MAAM,QAAQ,CAAC,CAAC;AAAA;AAAA,EAAgC,IAAI;AAAA,QACzG,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,SAAS,aAAa,QAAQ,SAAS,KAAK,QAAQ,CAAC,EAAG,SAAS,KAAM;AACzE,YAAM,OAAO,QAAQ,CAAC;AACtB,YAAM,YAAY,KAAK,SAAS,SAAS,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,EAAE,KAAK,IAAI;AAC5F,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,qCAA+D,KAAK,MAAM,QAAQ,CAAC,CAAC,4BAA4B,SAAS;AAAA,MACjI,CAAC;AAAA,IACH;AAEA,UAAM,WAAW,KAAK,qBAAqB,SAAS,kBAAkB;AACtE,QAAI,UAAU;AACZ,aAAO,KAAK,EAAE,MAAM,QAAQ,MAAM,SAAS,CAAC;AAAA,IAC9C;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB,SAA0B,oBAAsD;AAC3G,UAAM,QAAkB,CAAC;AAEzB,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAW,MAAM,SAAS;AAChC,UAAI,CAAC,UAAU,OAAQ;AACvB,iBAAW,MAAM,UAAU;AACzB,cAAM,SAAS,cAAc,GAAG,IAAI;AACpC,cAAM,YAAY,SAAS,gBAAW,MAAM,KAAK;AACjD,cAAM,KAAK,UAAU,GAAG,IAAI,MAAM,GAAG,OAAO,IAAI,SAAS,UAAU,GAAG,WAAW,yBAAyB;AAAA,MAC5G;AAAA,IACF;AAEA,UAAM,gBAAgB,mBAAmB,OAAO,CAAC,MAAM,EAAE,QAAQ,IAAI;AACrE,eAAW,QAAQ,eAAe;AAChC,YAAM,SAAS,cAAc,KAAK,IAAI;AACtC,YAAM,YAAY,SAAS,gBAAW,MAAM,KAAK;AACjD,YAAM,KAAK,UAAU,KAAK,IAAI,MAAM,KAAK,aAAa,IAAI,SAAS,cAAc,KAAK,MAAM,KAAK,OAAO,GAAG,CAAC,kBAAkB;AAAA,IAChI;AAEA,QAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,UAAM,SAAS,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AACjC,WAAO;AAAA;AAAA;AAAA,EAAoK,OAAO,KAAK,IAAI,CAAC;AAAA,EAC9L;AAAA,EAEQ,iBAAiB,SAAwB,UAA2B,OAAuB;AACjG,UAAM,WAAW,QAAQ,OAAO;AAAA,kBAAqB,QAAQ,IAAI,MAAM;AACvE,WAAO,0BAA0B,QAAQ,WAAW,GAAG,QAAQ;AAAA,EACjE;AACF;;;ACxIA,IAAM,eAAe;AACrB,IAAM,mBAAmB;AACzB,IAAM,oBAAoB;AAE1B,IAAM,yBAAyC;AAAA,EAC7C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,YAAY;AAAA,MACV,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,QACb,YAAY;AAAA,UACV,MAAM,EAAE,MAAM,SAAS;AAAA,UACvB,OAAO,EAAE,MAAM,QAAQ;AAAA,UACvB,aAAa,EAAE,MAAM,SAAS;AAAA,UAC9B,UAAU,EAAE,MAAM,SAAS;AAAA,QAC7B;AAAA,QACA,UAAU,CAAC,QAAQ,SAAS,aAAa;AAAA,MAC3C;AAAA,MACA,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,aAAa;AAAA,QACb,OAAO;AAAA,UACL,MAAM;AAAA,UACN,YAAY;AAAA,YACV,SAAS,EAAE,MAAM,SAAS;AAAA,YAC1B,gBAAgB,EAAE,MAAM,SAAS;AAAA,YACjC,aAAa,EAAE,MAAM,SAAS;AAAA,UAChC;AAAA,UACA,UAAU,CAAC,WAAW,kBAAkB,aAAa;AAAA,QACvD;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC;AAAA,EACb;AACF;AAQO,IAAM,mBAAN,MAAuB;AAAA,EAI5B,YACmB,WACA,OACA,QACjB;AAHiB;AACA;AACA;AAEjB,SAAK,YAAY,IAAI,aAAa;AAClC,SAAK,gBAAgB,IAAI,cAAc;AAAA,EACzC;AAAA,EANmB;AAAA,EACA;AAAA,EACA;AAAA,EANF;AAAA,EACA;AAAA,EAWjB,MAAM,OAAO,SAAwB,SAA0B,qBAAwC,CAAC,GAA0B;AAChI,UAAM,kBAAqC,CAAC;AAC5C,QAAI,aAAgC,CAAC;AACrC,QAAI,WAAW;AACf,UAAM,QAAQ,KAAK,cAAc,MAAM,SAAS,SAAS,kBAAkB;AAE3E,aAAS,UAAU,GAAG,WAAW,cAAc,WAAW;AACxD,iBAAW;AACX,YAAM,cAAc,YAAY,eAAe,oBAAoB;AAEnE,UAAI;AACJ,UAAI,YAAY,GAAG;AACjB,sBAAc,MAAM;AACpB,aAAK,OAAO,MAAM,+BAA+B,EAAE,aAAa,QAAQ,YAAY,CAAC;AAAA,MACvF,OAAO;AACL,cAAM,aAAa,WAAW;AAAA,UAC5B,CAAC,MAAM,WAAW,EAAE,IAAI,KAAK,EAAE,OAAO,GAAG,EAAE,SAAS,WAAW,EAAE,MAAM,MAAM,EAAE;AAAA,QACjF;AACA,sBAAc,KAAK,cAAc,uBAAuB,SAAS,SAAS,YAAY,UAAU,CAAC;AACjG,aAAK,OAAO,MAAM,wCAAwC,OAAO,IAAI,EAAE,YAAY,WAAW,OAAO,CAAC;AAAA,MACxG;AAEA,YAAM,QAAQ,KAAK,IAAI;AACvB,YAAM,UAAU,MAAM,KAAK,WAAW,MAAM,QAAQ,aAAa,WAAW;AAC5E,YAAM,aAAa,KAAK,IAAI,IAAI;AAChC,YAAM,SAAS,KAAK,eAAe,OAAO;AAE1C,UAAI,OAAO,OAAO;AAChB,cAAM,IAAI,gBAAgB,yCAAyC,OAAO,KAAK,EAAE;AAAA,MACnF;AAEA,YAAM,aAAa,KAAK,UAAU,SAAS,OAAO,QAAQ;AAC1D,YAAM,SAAS,WAAW,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO;AAErE,sBAAgB,KAAK;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa,QAAQ,MAAM;AAAA,QAC3B,cAAc,QAAQ,MAAM;AAAA,QAC5B,kBAAkB,WAAW;AAAA,QAC7B,QAAQ,WAAW;AAAA,MACrB,CAAC;AAED,UAAI,WAAW,OAAO;AACpB,eAAO,EAAE,UAAU,OAAO,UAAU,mBAAmB,OAAO,mBAAmB,UAAU,gBAAgB;AAAA,MAC7G;AAEA,mBAAa;AACb,WAAK,OAAO,KAAK,kDAAkD,OAAO,IAAI;AAAA,QAC5E,YAAY,OAAO;AAAA,MACrB,CAAC;AAAA,IACH;AAEA,UAAM,cAAc,gBAAgB,GAAG,EAAE,GAAG,UAAU;AACtD,UAAM,IAAI;AAAA,MACR,oCAAoC,YAAY;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,WACZ,QACA,aACA,aAC4B;AAC5B,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,IAAO;AAC1D,QAAI;AACF,aAAO,MAAM,KAAK,UAAU,SAAS;AAAA,QACnC;AAAA,UACE,OAAO,KAAK;AAAA,UACZ,YAAY;AAAA,UACZ;AAAA,UACA,QAAQ,OAAO,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,GAAI,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,IAAI,CAAC,EAAG,EAAE;AAAA,UAC1H,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,YAAY,CAAC;AAAA,UACjD,OAAO,CAAC,sBAAsB;AAAA,UAC9B,aAAa,EAAE,MAAM,QAAQ,MAAM,oBAAoB;AAAA,QACzD;AAAA,QACA,EAAE,QAAQ,WAAW,OAAO;AAAA,MAC9B;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC9D,YAAM,IAAI,gBAAgB,8BAA8B,MAAM,IAAI,GAAG;AAAA,IACvE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAAA,EAEQ,eAAe,SAA2C;AAChE,UAAM,eAAe,QAAQ,QAAQ;AAAA,MACnC,CAAC,UAA2C,MAAM,SAAS;AAAA,IAC7D;AACA,QAAI,CAAC,cAAc;AACjB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,aAAa;AAE3B,QAAI,OAAO,MAAM,OAAO,MAAM,UAAU;AACtC,aAAO;AAAA,QACL,UAAU,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,aAAa,CAAC,EAAE;AAAA,QACjD,mBAAmB,CAAC;AAAA,QACpB,OAAO,MAAM,OAAO;AAAA,MACtB;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,UAAU,KAAK,OAAO,MAAM,UAAU,MAAM,UAAU;AAC/D,YAAM,IAAI,mBAAmB,oDAAoD;AAAA,IACnF;AAEA,UAAM,WAAW,MAAM,UAAU;AACjC,UAAM,oBAAqB,MAAM,mBAAmB,KAA6C,CAAC;AAElG,WAAO,EAAE,UAAU,kBAAkB;AAAA,EACvC;AACF;;;ACnMA,sBAAkC;AAClC,uBAAqB;AACrB,qBAAwB;;;ACQjB,IAAM,2BAA2B;;;ADHjC,IAAM,qBAAN,MAAyB;AAAA,EACb;AAAA,EACR;AAAA,EACD,WAAiC;AAAA,EAEzC,YAAY,KAAc;AACxB,SAAK,MAAM,WAAO,2BAAK,wBAAQ,GAAG,WAAW,WAAW;AACxD,SAAK,YAAY,aAAa;AAAA,EAChC;AAAA,EAEA,MAAM,KAAK,WAAwC,MAA8C;AAC/F,UAAM,QAAwB;AAAA,MAC5B,eAAe;AAAA,MACf,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,WAAW,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,UAAU;AAClB,WAAK,eAAW,uBAAM,KAAK,KAAK,EAAE,WAAW,KAAK,CAAC,EAAE,KAAK,MAAM;AAAA,MAAC,CAAC;AAAA,IACpE;AACA,UAAM,KAAK;AACX,UAAM,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,IAAI;AACzD,UAAM,eAAW,uBAAK,KAAK,KAAK,QAAQ;AACxC,cAAM,4BAAW,UAAU,KAAK,UAAU,KAAK,IAAI,MAAM,OAAO;AAAA,EAClE;AACF;;;AElCA,IAAAA,mBAAkC;AAClC,IAAAC,oBAAqB;AACrB,IAAAC,kBAAwB;AAWjB,IAAM,kBAAN,MAAsB;AAAA,EACV;AAAA,EACT,QAAkC;AAAA,EAClC,YAAY;AAAA,EAEpB,YAAY,KAAc;AACxB,SAAK,MAAM,WAAO,4BAAK,yBAAQ,GAAG,WAAW,WAAW;AAAA,EAC1D;AAAA,EAEA,MAAM,gBAAgB,OAAO,IAAgC;AAC3D,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,KAAK,SAAS,MAAM,KAAK,YAAY,IAAI,KAAK,KAAM;AACtD,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,SAAS,MAAM,KAAK,iBAAiB,IAAI;AAE/C,UAAM,gBAAgB,IAAI;AAAA,MACxB,OACG,OAAO,CAAC,MAAM,EAAE,cAAc,oBAAoB,CAAE,EAAE,KAA8B,MAAM,EAC1F,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,IAC3B;AACA,QAAI,cAAc,SAAS,EAAG,QAAO,CAAC;AAEtC,UAAM,eAAe,oBAAI,IAAsE;AAE/F,eAAW,SAAS,QAAQ;AAC1B,UAAI,MAAM,cAAc,qBAAsB;AAC9C,UAAI,CAAC,cAAc,IAAI,MAAM,SAAS,EAAG;AACzC,YAAM,OAAO,MAAM;AACnB,UAAI,KAAK,oBAAoB,CAAC,KAAK,OAAQ;AAE3C,iBAAW,SAAS,KAAK,QAAQ;AAC/B,cAAM,QAAQ,aAAa,IAAI,MAAM,IAAI,KAAK,EAAE,UAAU,oBAAI,IAAI,GAAG,UAAU,oBAAI,IAAI,EAAE;AACzF,cAAM,SAAS,IAAI,MAAM,SAAS;AAClC,cAAM,SAAS,IAAI,MAAM,UAAU,MAAM,SAAS,IAAI,MAAM,OAAO,KAAK,KAAK,CAAC;AAC9E,qBAAa,IAAI,MAAM,MAAM,KAAK;AAAA,MACpC;AAAA,IACF;AAEA,UAAM,QAA2B,CAAC;AAClC,eAAW,CAAC,MAAM,KAAK,KAAK,cAAc;AACxC,UAAI,aAAa;AACjB,UAAI,WAAW;AACf,iBAAW,CAAC,KAAK,KAAK,KAAK,MAAM,UAAU;AACzC,YAAI,QAAQ,UAAU;AACpB,uBAAa;AACb,qBAAW;AAAA,QACb;AAAA,MACF;AACA,YAAM,KAAK;AAAA,QACT;AAAA,QACA,cAAc,MAAM,SAAS;AAAA,QAC7B,aAAa,cAAc;AAAA,QAC3B,MAAM,MAAM,SAAS,OAAO,cAAc;AAAA,QAC1C,eAAe;AAAA,MACjB,CAAC;AAAA,IACH;AAEA,UAAM,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AACpC,SAAK,QAAQ;AACb,SAAK,YAAY;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,iBAAiB,MAAyC;AACtE,QAAI;AACJ,QAAI;AACF,cAAQ,UAAM,0BAAQ,KAAK,GAAG;AAAA,IAChC,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,SAAS,oBAAI,KAAK;AACxB,WAAO,QAAQ,OAAO,QAAQ,IAAI,IAAI;AACtC,UAAM,YAAY,OAAO,YAAY,EAAE,MAAM,GAAG,EAAE;AAElD,UAAM,cAAc;AACpB,UAAM,cAAc,MACjB,OAAO,CAAC,MAAM,YAAY,KAAK,CAAC,KAAK,KAAK,SAAS,EACnD,KAAK;AAER,UAAM,SAA2B,CAAC;AAClC,eAAW,QAAQ,aAAa;AAC9B,UAAI;AACF,cAAM,UAAU,UAAM,+BAAS,wBAAK,KAAK,KAAK,IAAI,GAAG,OAAO;AAC5D,mBAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,cAAI,CAAC,KAAK,KAAK,EAAG;AAClB,cAAI;AACF,mBAAO,KAAK,KAAK,MAAM,IAAI,CAAmB;AAAA,UAChD,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;AC1GO,IAAM,aAAsB;AAAA,EACjC,QAAQ;AAAA,EAAC;AAAA,EACT,OAAO;AAAA,EAAC;AAAA,EACR,OAAO;AAAA,EAAC;AAAA,EACR,QAAQ;AAAA,EAAC;AACX;;;AxBOA,IAAM,gBAAgB;AAEf,IAAM,SAAN,MAAa;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,YAAoC,QAAQ,QAAQ,IAAI;AAAA,EAEhE,YAAY,SAAwB;AAClC,UAAM,SAAS,QAAQ,UAAU;AACjC,SAAK,QAAQ,QAAQ,SAAS;AAE9B,QAAI,QAAQ,cAAc,QAAQ,WAAW;AAC3C,UAAI;AACF,YAAI,IAAI,QAAQ,UAAU;AAAA,MAC5B,QAAQ;AACN,cAAM,IAAI,WAAW,wBAAwB,QAAQ,UAAU,8BAAyB;AAAA,MAC1F;AACA,YAAM,YAAY,IAAI,aAAa,QAAQ,YAAY,QAAQ,WAAW,MAAM;AAChF,YAAM,WAAW,IAAI,iBAAiB;AACtC,WAAK,WAAW,IAAI,YAAY,WAAW,QAAQ;AAAA,IACrD,OAAO;AACL,WAAK,WAAW;AAAA,IAClB;AAEA,UAAM,YAAY,IAAI,WAAAC,QAAU,EAAE,QAAQ,QAAQ,gBAAgB,CAAC;AACnE,SAAK,WAAW,IAAI,iBAAiB,WAAW,KAAK,OAAO,MAAM;AAClE,SAAK,YAAY,IAAI,aAAa;AAClC,SAAK,UAAU,QAAQ,WAAW,IAAI,YAAY;AAClD,SAAK,SAAS;AAEd,QAAI,QAAQ,cAAc,MAAM;AAC9B,WAAK,YAAY,IAAI,mBAAmB;AACxC,WAAK,kBAAkB,IAAI,gBAAgB;AAAA,IAC7C,WAAW,OAAO,QAAQ,cAAc,UAAU;AAChD,WAAK,YAAY,IAAI,mBAAmB,QAAQ,SAAS;AACzD,WAAK,kBAAkB,IAAI,gBAAgB,QAAQ,SAAS;AAAA,IAC9D,OAAO;AACL,WAAK,YAAY;AACjB,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,kBAA+B;AACrC,QAAI,CAAC,KAAK,UAAU;AAClB,YAAM,IAAI,WAAW,sJAAiJ;AAAA,IACxK;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,oBAAoB,aAA2B;AACrD,QAAI,CAAC,eAAe,YAAY,KAAK,EAAE,WAAW,GAAG;AACnD,YAAM,IAAI,WAAW,+CAA+C;AAAA,IACtE;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,aAAqB,SAA8C;AAC7E,SAAK,oBAAoB,WAAW;AACpC,SAAK,OAAO,KAAK,gBAAgB,EAAE,aAAa,QAAQ,SAAS,OAAO,CAAC;AACzE,UAAM,aAAa,KAAK,IAAI;AAE5B,UAAM,KAAK,WAAW,KAAK,eAAe;AAAA,MACxC;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,QAAQ,SAAS,UAAU;AAAA,IAC7B,CAAC;AAED,UAAM,KAAK,QAAQ,WAAW;AAC9B,UAAM,UAAU,MAAM,KAAK,QAAQ,OAAO,WAAW;AAErD,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,MAAM,QAAQ,CAAC;AACrB,WAAK,OAAO,KAAK,YAAY,QAAQ,MAAM,oBAAoB,IAAI,SAAS,YAAY,MAAM,GAAG,EAAE,CAAC,WAAW,IAAI,MAAM,QAAQ,CAAC,CAAC,SAAS,IAAI,IAAI,EAAE;AAAA,IACxJ,OAAO;AACL,WAAK,OAAO,KAAK,oCAAoC;AAAA,IACvD;AAEA,UAAM,qBAAqB,MAAM,KAAK,iBAAiB,gBAAgB,KAAK,CAAC;AAE7E,QAAI,mBAAmB,SAAS,GAAG;AACjC,YAAM,WAAW,mBAAmB,OAAO,CAAC,MAAM,EAAE,QAAQ,IAAI;AAChE,UAAI,SAAS,SAAS,GAAG;AACvB,aAAK,OAAO,KAAK,cAAc,SAAS,MAAM,sDAAsD;AAAA,MACtG;AAAA,IACF;AAEA,UAAM,eAAe,MAAM,KAAK,SAAS;AAAA,MACvC,EAAE,aAAa,GAAI,SAAS,OAAO,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC,EAAG;AAAA,MAChE;AAAA,MACA;AAAA,IACF;AAEA,UAAM,KAAK,qBAAqB,aAAa,YAAY;AAEzD,UAAM,WAAW,SAAS,OACtB,EAAE,GAAG,aAAa,UAAU,MAAM,QAAQ,KAAK,IAC/C,aAAa;AAEjB,SAAK,cAAc,UAAU,aAAa,cAAc,OAAO;AAE/D,QAAI,SAAS,QAAQ;AACnB,YAAMC,oBAAmB,aAAa,gBAAgB,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,aAAa,CAAC;AAC3F,YAAMC,qBAAoB,aAAa,gBAAgB,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,cAAc,CAAC;AAE7F,YAAM,KAAK,WAAW,KAAK,kBAAkB;AAAA,QAC3C;AAAA,QACA,SAAS;AAAA,QACT,eAAe,aAAa;AAAA,QAC5B,iBAAiB,KAAK,IAAI,IAAI;AAAA,QAC9B,kBAAAD;AAAA,QACA,mBAAAC;AAAA,QACA,cAAc,SAAS;AAAA,QACvB,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,mBAAmB,aAAa,kBAAkB;AAAA,MACpD,CAAC;AAED,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,MAAM,SAAS;AAAA,QACf;AAAA,QACA,mBAAmB,aAAa;AAAA,QAChC,oBAAoB;AAAA,QACpB,oBAAoB,aAAa;AAAA,QACjC,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,gBAAgB;AACtC,UAAM,WAAW,MAAM,SAAS,OAAO,QAAQ;AAC/C,SAAK,aAAa;AAElB,QAAI,SAAS,UAAU;AACrB,YAAM,SAAS,SAAS,SAAS,UAAU;AAAA,IAC7C;AAEA,UAAM,mBAAmB,aAAa,gBAAgB,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,aAAa,CAAC;AAC3F,UAAM,oBAAoB,aAAa,gBAAgB,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,cAAc,CAAC;AAE7F,UAAM,KAAK,WAAW,KAAK,kBAAkB;AAAA,MAC3C;AAAA,MACA,SAAS;AAAA,MACT,eAAe,aAAa;AAAA,MAC5B,iBAAiB,KAAK,IAAI,IAAI;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,cAAc,SAAS;AAAA,MACvB,YAAY,SAAS;AAAA,MACrB,QAAQ;AAAA,MACR,mBAAmB,aAAa,kBAAkB;AAAA,IACpD,CAAC;AAED,WAAO;AAAA,MACL,YAAY,SAAS;AAAA,MACrB,MAAM,SAAS;AAAA,MACf;AAAA,MACA,mBAAmB,aAAa;AAAA,MAChC,oBAAoB,CAAC,SAAS;AAAA,MAC9B,oBAAoB,aAAa;AAAA,MACjC,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,IAAY,aAA2C;AACnE,SAAK,oBAAoB,WAAW;AACpC,SAAK,OAAO,KAAK,iBAAiB,EAAE,IAAI,YAAY,CAAC;AACrD,UAAM,aAAa,KAAK,IAAI;AAE5B,UAAM,KAAK,WAAW,KAAK,eAAe;AAAA,MACxC;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,QAAQ;AAAA,IACV,CAAC;AAED,UAAM,KAAK,QAAQ,WAAW;AAC9B,UAAM,UAAU,MAAM,KAAK,QAAQ,OAAO,WAAW;AACrD,UAAM,qBAAqB,MAAM,KAAK,iBAAiB,gBAAgB,KAAK,CAAC;AAE7E,UAAM,eAAe,MAAM,KAAK,SAAS,OAAO,EAAE,YAAY,GAAG,SAAS,kBAAkB;AAE5F,UAAM,KAAK,qBAAqB,aAAa,YAAY;AAEzD,UAAM,WAAW,KAAK,gBAAgB;AACtC,UAAM,WAAW,MAAM,SAAS,OAAO,IAAI,aAAa,QAAQ;AAEhE,SAAK,cAAc,aAAa,UAAU,aAAa,cAAc,OAAO;AAC5E,SAAK,aAAa;AAElB,UAAM,mBAAmB,aAAa,gBAAgB,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,aAAa,CAAC;AAC3F,UAAM,oBAAoB,aAAa,gBAAgB,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,cAAc,CAAC;AAE7F,UAAM,KAAK,WAAW,KAAK,kBAAkB;AAAA,MAC3C;AAAA,MACA,SAAS;AAAA,MACT,eAAe,aAAa;AAAA,MAC5B,iBAAiB,KAAK,IAAI,IAAI;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,cAAc,SAAS;AAAA,MACvB,YAAY,SAAS;AAAA,MACrB,QAAQ;AAAA,MACR,mBAAmB,aAAa,kBAAkB;AAAA,IACpD,CAAC;AAED,WAAO;AAAA,MACL,YAAY,SAAS;AAAA,MACrB,MAAM,SAAS;AAAA,MACf,UAAU,aAAa;AAAA,MACvB,mBAAmB,aAAa;AAAA,MAChC,oBAAoB;AAAA,MACpB,oBAAoB,aAAa;AAAA,MACjC,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,UAAU,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACrC;AAAA,EAEA,MAAc,qBAAqB,aAAqB,cAA2C;AACjG,eAAW,QAAQ,aAAa,iBAAiB;AAC/C,YAAM,KAAK,WAAW,KAAK,sBAAsB;AAAA,QAC/C;AAAA,QACA,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK;AAAA,QACjB,aAAa,KAAK;AAAA,QAClB,cAAc,KAAK;AAAA,QACnB,kBAAkB,KAAK;AAAA,QACvB,YAAY,KAAK,OAAO;AAAA,QACxB,QAAQ,KAAK,OAAO,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE,QAAQ,EAAE;AAAA,MACvE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,eAAqB;AAC3B,SAAK,YAAY,KAAK,UACnB,KAAK,OAAO,YAAY;AACvB,UAAI,SAAS;AACX,cAAM,KAAK,QAAQ,iBAAiB,OAAO;AAAA,MAC7C;AACA,aAAO;AAAA,IACT,CAAC,EACA,MAAM,CAAC,QAAiB;AACvB,WAAK,OAAO,KAAK,2CAA2C,EAAE,KAAK,OAAO,GAAG,EAAE,CAAC;AAChF,aAAO;AAAA,IACT,CAAC;AAAA,EACL;AAAA,EAEQ,cACN,UACA,aACA,cACA,SACM;AACN,UAAM,iBAAiB,aAAa,gBAAgB,OAAO,CAAC,MAAM,CAAC,EAAE,gBAAgB;AACrF,UAAM,kBAAkB,eAAe;AAAA,MAAQ,CAAC,MAC9C,EAAE,OAAO,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE,QAAQ,EAAE;AAAA,IAC5D;AACA,UAAM,WAAW,QAAQ,CAAC;AAC1B,UAAM,iBAAiB,WAAW,YAAY,SAAS,KAAK,IAAI;AAEhE,UAAM,WAAW,MAAM,KAAK,IAAI;AAAA,MAC9B,SAAS,MAAM,QAAQ,CAAC,MAAM;AAC5B,cAAM,OAAO,EAAE,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK;AACxC,cAAM,OAAO,CAAC,IAAI;AAClB,YAAI,EAAE,KAAK,SAAS,SAAS,KAAK,EAAE,KAAK,SAAS,SAAS,EAAG,MAAK,KAAK,WAAW,IAAI,EAAE;AACzF,YAAI,EAAE,KAAK,SAAS,WAAW,EAAG,MAAK,KAAK,IAAI;AAChD,eAAO;AAAA,MACT,CAAC;AAAA,IACH,CAAC;AAED,UAAM,WAAkC;AAAA,MACtC;AAAA,MACA;AAAA,MACA,oBAAoB,aAAa;AAAA,IACnC;AACA,QAAI,SAAS,SAAS,EAAG,UAAS,OAAO;AACzC,QAAI,gBAAgB,SAAS,EAAG,UAAS,kBAAkB;AAC3D,QAAI,QAAQ,SAAS,EAAG,UAAS,oBAAoB,QAAQ,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE;AACrF,QAAI,SAAU,UAAS,gBAAgB,SAAS;AAChD,QAAI,aAAa,kBAAkB,SAAS,EAAG,UAAS,oBAAoB,aAAa;AAEzF,UAAM,eAAe,aAAa,gBAAgB,SAAS,KACtD,aAAa,gBAAgB,CAAC,EAAG;AACtC,UAAM,cAAc,MAAM,KAAK,IAAI;AAAA,MACjC,aAAa,gBACV,OAAO,CAAC,MAAM,CAAC,EAAE,gBAAgB,EACjC,QAAQ,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAAA,IAC/C,CAAC;AAED,SAAK,YAAY,KAAK,UACnB,KAAK,YAAY;AAChB,YAAM,UAAU,MAAM,KAAK,QAAQ,KAAK,UAAU,QAAQ;AAE1D,iBAAW,SAAS,SAAS;AAC3B,YAAI,MAAM,SAAS,YAAY,MAAM,SAAS,aAAa;AACzD,gBAAM,KAAK,QAAQ,cAAc,MAAM,SAAS,IAAI;AAAA,YAClD,UAAU,aAAa;AAAA,YACvB;AAAA,YACA;AAAA,YACA,MAAM,MAAM;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AAEA,aAAO;AAAA,IACT,CAAC,EACA,MAAM,CAAC,QAAiB;AACvB,WAAK,OAAO,KAAK,kDAAkD,EAAE,KAAK,OAAO,GAAG,EAAE,CAAC;AACvF,aAAO;AAAA,IACT,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,IAAI,IAAkC;AAC1C,WAAO,KAAK,gBAAgB,EAAE,IAAI,EAAE;AAAA,EACtC;AAAA,EAEA,MAAM,OAAoC;AACxC,WAAO,KAAK,gBAAgB,EAAE,KAAK;AAAA,EACrC;AAAA,EAEA,MAAM,SAAS,IAA2B;AACxC,UAAM,KAAK,gBAAgB,EAAE,SAAS,EAAE;AAAA,EAC1C;AAAA,EAEA,MAAM,WAAW,IAA2B;AAC1C,UAAM,KAAK,gBAAgB,EAAE,WAAW,EAAE;AAAA,EAC5C;AAAA,EAEA,MAAM,OAAO,IAAY,SAAuC;AAC9D,UAAM,KAAK,gBAAgB,EAAE,OAAO,IAAI,OAAO;AAAA,EACjD;AAAA,EAEA,MAAM,WAAW,YAAqB,QAAuD;AAC3F,WAAO,KAAK,gBAAgB,EAAE,WAAW,YAAY,MAAM;AAAA,EAC7D;AAAA,EAEA,MAAM,UAAU,IAAsC;AACpD,WAAO,KAAK,gBAAgB,EAAE,UAAU,EAAE;AAAA,EAC5C;AAAA,EAEA,MAAM,WAA2B;AAC/B,WAAO,KAAK,gBAAgB,EAAE,SAAS;AAAA,EACzC;AAAA,EAEA,MAAM,UAAU,MAA4B;AAC1C,WAAO,KAAK,gBAAgB,EAAE,UAAU,IAAI;AAAA,EAC9C;AAAA,EAEA,MAAM,IAAI,YAAoB,QAAiC;AAC7D,UAAM,KAAK,gBAAgB,EAAE,IAAI,YAAY,MAAM;AAAA,EACrD;AAAA,EAEA,MAAM,MAAM,YAAoB,QAAiC;AAC/D,UAAM,KAAK,gBAAgB,EAAE,MAAM,YAAY,MAAM;AAAA,EACvD;AACF;;;AyB7XA,IAAAC,mBAA4D;AAC5D,IAAAC,oBAAqB;AACrB,IAAAC,kBAAwB;;;ACAxB,IAAM,UAAU;AAAA,EACd,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AACV;AAEA,IAAM,gBAA0C;AAAA,EAC9C,OAAO,CAAC,SAAS,UAAU;AAAA,EAC3B,OAAO,CAAC,SAAS,aAAa,aAAa,eAAe;AAAA,EAC1D,SAAS,CAAC,WAAW,gBAAgB;AAAA,EACrC,UAAU,CAAC,mBAAmB,MAAM;AAAA,EACpC,MAAM,CAAC,aAAa;AAAA,EACpB,QAAQ,CAAC,cAAc;AAAA,EACvB,QAAQ,CAAC,UAAU,eAAe;AAAA,EAClC,UAAU,CAAC,YAAY,iBAAiB;AAAA,EACxC,IAAI,CAAC,SAAS,UAAU,gBAAgB,mBAAmB,YAAY,oBAAoB;AAAA,EAC3F,QAAQ,CAAC,sBAAsB,cAAc,gBAAgB;AAAA,EAC7D,QAAQ,CAAC,uBAAuB,uBAAuB,mBAAmB;AAAA,EAC1E,UAAU,CAAC,YAAY,SAAS,SAAS,SAAS;AAAA,EAClD,UAAU,CAAC,UAAU;AAAA,EACrB,QAAQ,CAAC,QAAQ;AAAA,EACjB,IAAI,CAAC,OAAO;AAAA,EACZ,MAAM,CAAC,MAAM;AAAA,EACb,OAAO,CAAC,OAAO;AAAA,EACf,QAAQ,CAAC,QAAQ;AAAA,EACjB,IAAI,CAAC,IAAI;AAAA,EACT,MAAM,CAAC,MAAM;AAAA,EACb,KAAK,CAAC,eAAe,oBAAoB;AAAA,EACzC,MAAM,CAAC,aAAa;AAAA,EACpB,KAAK,CAAC,KAAK;AAAA,EACX,OAAO,CAAC,gBAAgB;AAAA,EACxB,QAAQ,CAAC,QAAQ;AAAA,EACjB,kBAAkB,CAAC,iBAAiB;AAAA,EACpC,QAAQ,CAAC,QAAQ;AACnB;AAEA,SAAS,wBAAwB,aAAkC;AACjE,QAAM,QAAQ,YAAY,YAAY;AACtC,QAAM,UAAU,oBAAI,IAAY;AAEhC,aAAW,CAAC,SAAS,SAAS,KAAK,OAAO,QAAQ,aAAa,GAAG;AAChE,QAAI,MAAM,SAAS,OAAO,GAAG;AAC3B,iBAAW,MAAM,UAAW,SAAQ,IAAI,EAAE;AAAA,IAC5C;AAAA,EACF;AAEA,MAAI,sFAAsF,KAAK,KAAK,GAAG;AACrG,YAAQ,IAAI,iBAAiB;AAAA,EAC/B;AACA,MAAI,0DAA0D,KAAK,KAAK,GAAG;AACzE,YAAQ,IAAI,SAAS;AAAA,EACvB;AACA,MAAI,wCAAwC,KAAK,KAAK,GAAG;AACvD,YAAQ,IAAI,aAAa;AAAA,EAC3B;AACA,MAAI,yDAAyD,KAAK,KAAK,GAAG;AACxE,YAAQ,IAAI,OAAO;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,SAAS,2BAA2B,GAAgC;AAClE,QAAM,KAAK,oBAAI,IAAY;AAC3B,aAAW,QAAQ,EAAE,SAAS,OAAO;AACnC,UAAM,OAAO,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK;AAC3C,OAAG,IAAI,IAAI;AAAA,EACb;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,GAAgB,GAAwB;AACjE,MAAI,EAAE,SAAS,KAAK,EAAE,SAAS,EAAG,QAAO;AACzC,MAAI,eAAe;AACnB,aAAW,QAAQ,GAAG;AACpB,QAAI,EAAE,IAAI,IAAI,EAAG;AAAA,EACnB;AACA,QAAM,QAAQ,EAAE,OAAO,EAAE,OAAO;AAChC,SAAO,QAAQ,IAAI,eAAe,QAAQ;AAC5C;AAEA,SAAS,aAAa,GAA2B;AAC/C,QAAM,QAAQ,EAAE;AAChB,MAAI,CAAC,SAAS,MAAM,cAAc,EAAG,QAAO;AAE5C,QAAM,WAAW,MAAM,iBAAiB,MAAM;AAC9C,QAAM,cAAc,MAAM,gBAAgB,MAAM;AAChD,QAAM,iBAAiB,KAAK,IAAI,GAAG,KAAK,cAAc,KAAK,GAAG;AAE9D,SAAO,WAAW,MAAM,iBAAiB;AAC3C;AAEA,SAAS,YAAY,GAA2B;AAC9C,SAAO,IAAI,KAAK,IAAI,EAAE,cAAc,CAAC,IAAI;AAC3C;AAaO,SAAS,YACd,aACA,kBACA,WACA,gBACA,KACe;AACf,QAAM,UAAU,wBAAwB,gBAAgB;AACxD,QAAM,UAAU,YAAY,OAAO,CAAC,KAAK,OAAO,OAAO,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC,KAAK;AAEhF,SAAO,UAAU,IAAI,CAAC,GAAG,MAAM;AAC7B,UAAM,YAAY,eAAe,CAAC;AAClC,QAAI,WAAW;AACf,UAAM,UAAU,oBAAI,IAAoB;AACxC,eAAW,KAAK,WAAW;AACzB,cAAQ,IAAI,IAAI,QAAQ,IAAI,CAAC,KAAK,KAAK,CAAC;AAAA,IAC1C;AACA,eAAW,MAAM,aAAa;AAC5B,YAAM,KAAK,UAAU,SAAS,KAAK,QAAQ,IAAI,EAAE,KAAK,KAAK,UAAU,SAAS;AAC9E,YAAM,SAAS,IAAI,IAAI,EAAE,KAAK;AAC9B,kBAAY,KAAK;AAAA,IACnB;AACA,UAAM,QAAQ,KAAK,IAAI,WAAW,SAAS,CAAC;AAE5C,UAAM,aAAa,2BAA2B,CAAC;AAC/C,UAAM,kBAAkB,QAAQ,OAAO,IAAI,kBAAkB,SAAS,UAAU,IAAI;AAEpF,UAAM,UAAU,aAAa,CAAC;AAC9B,UAAM,SAAS,KAAK,IAAI,YAAY,CAAC,GAAG,GAAG,IAAI;AAE/C,UAAM,QAAQ,KAAK;AAAA,MACjB,QAAQ,QAAQ,QAChB,QAAQ,kBAAkB,kBAC1B,QAAQ,UAAU,UAClB,QAAQ,SAAS;AAAA,MACjB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MACA,SAAS,EAAE,OAAO,iBAAiB,SAAS,OAAO;AAAA,IACrD;AAAA,EACF,CAAC;AACH;;;AC/IA,SAAS,eAAe,GAA6B;AACnD,SAAO,EAAE,SAAS,MACf,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,EACxC,KAAK;AACV;AAEA,SAAS,eAAe,IAAsB;AAC5C,SAAO,GAAG,KAAK,GAAG;AACpB;AAEA,SAAS,gBAAgB,IAAsB;AAC7C,QAAM,WAAW,GAAG,OAAO,CAAC,MAAM,WAAW,KAAK,CAAC,CAAC;AACpD,QAAM,UAAU,GAAG,OAAO,CAAC,MAAM,qDAAqD,KAAK,CAAC,CAAC;AAC7F,QAAM,KAAK,GAAG,OAAO,CAAC,MAAM,uCAAuC,KAAK,CAAC,CAAC;AAC1E,QAAM,OAAO,GAAG,OAAO,CAAC,MAAM,+CAA+C,KAAK,CAAC,CAAC;AAEpF,QAAM,QAAkB,CAAC;AACzB,MAAI,SAAS,SAAS,EAAG,OAAM,KAAK,SAAS,CAAC,CAAE;AAChD,MAAI,GAAG,SAAS,EAAG,OAAM,KAAK,IAAI;AAClC,MAAI,KAAK,SAAS,EAAG,OAAM,KAAK,KAAK,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;AAC1D,MAAI,QAAQ,SAAS,EAAG,OAAM,KAAK,QAAQ,CAAC,CAAE;AAE9C,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,UAAK,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE,KAAK,UAAK;AACzE;AAEO,SAAS,iBAAiB,WAAgD;AAC/E,QAAM,SAAS,oBAAI,IAA8B;AAEjD,aAAW,KAAK,WAAW;AACzB,UAAM,KAAK,eAAe,CAAC;AAC3B,UAAM,MAAM,eAAe,EAAE;AAE7B,UAAM,WAAW,OAAO,IAAI,GAAG;AAC/B,QAAI,UAAU;AACZ,eAAS,KAAK,CAAC;AAAA,IACjB,OAAO;AACL,aAAO,IAAI,KAAK,CAAC,CAAC,CAAC;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,WAA8B,CAAC;AAErC,aAAW,CAAC,EAAE,OAAO,KAAK,QAAQ;AAChC,QAAI,QAAQ,WAAW,EAAG;AAE1B,UAAM,KAAK,eAAe,QAAQ,CAAC,CAAE;AACrC,UAAM,YAAY,QAAQ,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,aAAa,YAAY,CAAC;AAEtF,QAAI,sBAAsB;AAC1B,QAAI,cAAc;AAElB,QAAI,UAAU,SAAS,GAAG;AACxB,4BAAsB,UAAU,OAAO,CAAC,KAAK,MAAM;AACjD,cAAM,IAAI,EAAE;AACZ,eAAO,MAAM,EAAE,iBAAiB,EAAE;AAAA,MACpC,GAAG,CAAC,IAAI,UAAU;AAElB,oBAAc,UAAU,OAAO,CAAC,KAAK,MAAM;AACzC,cAAM,IAAI,EAAE;AACZ,eAAO,MAAM,EAAE,gBAAgB,EAAE;AAAA,MACnC,GAAG,CAAC,IAAI,UAAU;AAAA,IACpB;AAEA,UAAM,aAAa,oBAAI,IAAoB;AAC3C,QAAI,wBAAwB;AAC5B,eAAW,KAAK,WAAW;AACzB,YAAM,QAAQ,EAAE,aAAc;AAC9B,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AACjD,cAAM,IAAI,SAAS,MAAM,EAAE;AAC3B,mBAAW,IAAI,IAAI,WAAW,IAAI,CAAC,KAAK,KAAK,KAAK;AAClD,iCAAyB;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,oBAAoB,CAAC,GAAG,WAAW,QAAQ,CAAC,EAC/C,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO;AAAA,MACvB;AAAA,MACA,WAAW,wBAAwB,IAAI,QAAQ,wBAAwB;AAAA,IACzE,EAAE,EACD,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,EAChC,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAE3C,aAAS,KAAK;AAAA,MACZ,SAAS,gBAAgB,EAAE;AAAA,MAC3B,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,SAAS,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,SAAS,EAAE,QAAQ,MAAM;AACpE;AAEO,SAAS,OACd,YACA,UAC6E;AAC7E,QAAM,aAAa,oBAAI,IAA6B;AACpD,aAAW,WAAW,UAAU;AAC9B,eAAW,UAAU,QAAQ,SAAS;AACpC,iBAAW,IAAI,OAAO,IAAI,OAAO;AAAA,IACnC;AAAA,EACF;AAEA,SAAO,WACJ,IAAI,CAAC,MAAM;AACV,UAAM,UAAU,WAAW,IAAI,EAAE,SAAS,EAAE;AAC5C,QAAI,QAAQ;AAEZ,QAAI,WAAW,QAAQ,sBAAsB,GAAG;AAC9C,eAAS,QAAQ,sBAAsB,OAAO;AAAA,IAChD;AAEA,QAAI,WAAW,QAAQ,kBAAkB,SAAS,GAAG;AACnD,eAAS,QAAQ,kBAAkB,SAAS;AAAA,IAC9C;AAEA,WAAO;AAAA,MACL,UAAU,EAAE;AAAA,MACZ,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAE,QAAQ,KAAK,CAAC;AAAA,MAC/C,GAAI,UAAU,EAAE,gBAAgB,QAAQ,QAAQ,IAAI,CAAC;AAAA,IACvD;AAAA,EACF,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACrC;;;AFvHO,SAAS,SAAS,MAAwB;AAC/C,SAAO,KACJ,YAAY,EACZ,QAAQ,gBAAgB,GAAG,EAC3B,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC/B;AAEO,SAAS,kBAAkB,GAA2B;AAC3D,QAAM,aAAa,EAAE,SAAS,MAAM,IAAI,CAAC,MAAM;AAC7C,UAAM,OAAO,EAAE,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK;AACxC,UAAM,SAAS,KAAK,QAAQ,YAAY,KAAK,EAAE,KAAK,EAAE,YAAY;AAClE,WAAO,GAAG,IAAI,IAAI,MAAM;AAAA,EAC1B,CAAC;AACD,SAAO,GAAG,EAAE,WAAW,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE,KAAK,KAAK,GAAG,CAAC,IAAI,WAAW,KAAK,GAAG,CAAC;AACxF;AAEA,IAAM,mBAAmB;AAElB,IAAM,cAAN,MAA8C;AAAA,EAClC;AAAA,EACT,YAA8B,CAAC;AAAA,EAC/B,cAAoC;AAAA,EACpC,aAA4B,QAAQ,QAAQ;AAAA,EAEpD,YAAY,KAAc;AACxB,SAAK,MAAM,WAAO,4BAAK,yBAAQ,GAAG,WAAW,SAAS;AAAA,EACxD;AAAA,EAEA,MAAM,aAA4B;AAChC,QAAI,CAAC,KAAK,aAAa;AACrB,WAAK,cAAc,KAAK,aAAa;AAAA,IACvC;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,eAA8B;AAC1C,cAAM,wBAAM,KAAK,KAAK,EAAE,WAAW,KAAK,CAAC;AAEzC,UAAM,gBAAY,wBAAK,KAAK,KAAK,YAAY;AAC7C,QAAI;AACF,YAAM,MAAM,UAAM,2BAAS,WAAW,OAAO;AAC7C,YAAM,SAAkB,KAAK,MAAM,GAAG;AACtC,UAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAK,YAAY,CAAC;AAAA,MACpB,OAAO;AACL,aAAK,YAAY,OAAO;AAAA,UACtB,CAAC,SACC,OAAO,SAAS,YAChB,SAAS,QACT,OAAQ,KAAiC,OAAO,YAChD,OAAQ,KAAiC,gBAAgB,YACzD,OAAQ,KAAiC,aAAa,YACrD,KAAiC,aAAa,QAC/C,MAAM,QAAU,KAAiC,SAAqC,KAAK;AAAA,QAC/F;AAAA,MACF;AAAA,IACF,QAAQ;AACN,WAAK,YAAY,CAAC;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,aAAqB,SAAmD;AACnF,UAAM,aAAa,KAAK,UAAU,OAAO,CAAC,MAAM,EAAE,eAAe,SAAS;AAC1E,QAAI,WAAW,WAAW,EAAG,QAAO,CAAC;AAErC,UAAM,QAAQ,SAAS,SAAS;AAChC,UAAM,cAAc,SAAS,WAAW;AACxC,QAAI,YAAY,WAAW,EAAG,QAAO,CAAC;AAEtC,UAAM,iBAAiB,WAAW,IAAI,CAAC,MAAM,SAAS,kBAAkB,CAAC,CAAC,CAAC;AAC3E,UAAM,eAAe,eAAe,IAAI,CAAC,WAAW,IAAI,IAAI,MAAM,CAAC;AAEnE,UAAM,WAAW,WAAW;AAC5B,UAAM,MAAM,oBAAI,IAAoB;AACpC,UAAM,YAAY,IAAI,IAAI,WAAW;AACrC,eAAW,SAAS,WAAW;AAC7B,YAAM,gBAAgB,aAAa,OAAO,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,EAAE;AAC/D,UAAI,IAAI,OAAO,KAAK,KAAK,WAAW,MAAM,gBAAgB,EAAE,IAAI,CAAC;AAAA,IACnE;AAEA,UAAM,SAAS,YAAY,aAAa,aAAa,YAAY,gBAAgB,GAAG,EACjF,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,EACzB,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAEnC,UAAM,WAAW,iBAAiB,UAAU;AAC5C,UAAM,WAAW,OAAO,QAAQ,QAAQ,EAAE,MAAM,GAAG,KAAK;AAExD,UAAM,UAAU,SAAS,IAAI,CAAC,MAAM;AAClC,aAAO,EAAE,UAAU,EAAE,UAAU,OAAO,EAAE,OAAO,MAAM,YAAY,EAAE,KAAK,EAAE;AAAA,IAC5E,CAAC;AAED,QAAI,QAAQ,SAAS,GAAG;AACtB,iBAAW,KAAK,SAAS;AACvB,UAAE,SAAS,kBAAkB,EAAE,SAAS,kBAAkB,KAAK;AAAA,MACjE;AACA,WAAK,QAAQ;AAAA,IACf;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,KAAK,UAAuB,UAAkD;AAClF,UAAM,KAAK,aAAa;AACxB,UAAM,kBAAkB,KAAK,2BAA2B,SAAS,eAAe;AAChF,UAAM,SAAyB;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,aAAa,SAAS;AAAA,MACtB,MAAM,SAAS,QAAQ,CAAC;AAAA,MACxB,UAAU,SAAS,YAAY;AAAA,MAC/B,aAAa;AAAA,MACb,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,GAAI,iBAAiB,SAAS,EAAE,gBAAgB,IAAI,CAAC;AAAA,MACrD,GAAI,SAAS,mBAAmB,SAAS,EAAE,mBAAmB,SAAS,kBAAkB,IAAI,CAAC;AAAA,MAC9F,GAAI,SAAS,iBAAiB,EAAE,gBAAgB,SAAS,eAAe,IAAI,CAAC;AAAA,MAC7E,GAAI,SAAS,iBAAiB,OAAO,EAAE,eAAe,SAAS,cAAc,IAAI,CAAC;AAAA,MAClF,GAAI,SAAS,sBAAsB,OAAO,EAAE,oBAAoB,SAAS,mBAAmB,IAAI,CAAC;AAAA,MACjG,GAAI,SAAS,mBAAmB,SAAS,EAAE,mBAAmB,SAAS,kBAAkB,IAAI,CAAC;AAAA,MAC9F,GAAI,SAAS,aAAa,EAAE,YAAY,SAAS,WAAW,IAAI,CAAC;AAAA,MACjE,GAAI,SAAS,WAAW,EAAE,UAAU,SAAS,SAAS,IAAI,CAAC;AAAA,MAC3D,GAAI,SAAS,YAAY,EAAE,WAAW,SAAS,UAAU,IAAI,CAAC;AAAA,MAC9D,GAAI,SAAS,aAAa,EAAE,YAAY,SAAS,WAAW,IAAI,CAAC;AAAA,IACnE;AACA,SAAK,UAAU,KAAK,MAAM;AAC1B,QAAI,KAAK,UAAU,SAAS,kBAAkB;AAC5C,WAAK,UAAU,KAAK,CAAC,GAAG,OAAO,EAAE,eAAe,MAAM,EAAE,eAAe,EAAE;AACzE,WAAK,YAAY,KAAK,UAAU,MAAM,GAAG,gBAAgB;AAAA,IAC3D;AACA,UAAM,KAAK,QAAQ;AACnB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,iBAAiB,IAA2B;AAChD,UAAM,IAAI,KAAK,UAAU,KAAK,CAACC,OAAMA,GAAE,OAAO,EAAE;AAChD,QAAI,GAAG;AACL,QAAE;AACF,QAAE,kBAAiB,oBAAI,KAAK,GAAE,YAAY;AAC1C,YAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,IAAY,SAAqC;AACnE,UAAM,IAAI,KAAK,UAAU,KAAK,CAACA,OAAMA,GAAE,OAAO,EAAE;AAChD,QAAI,CAAC,EAAG;AAER,QAAI,QAAQ,SAAS,UAAU;AAC7B,QAAE,qBAAqB,EAAE,qBAAqB,KAAK;AAAA,IACrD,OAAO;AACL,QAAE,wBAAwB,EAAE,wBAAwB,KAAK;AAAA,IAC3D;AAEA,UAAM,QAAQ,EAAE,gBAAgB,EAAE,WAAW,GAAG,eAAe,GAAG,gBAAgB,GAAG,aAAa,CAAC,EAAE;AACrG,UAAM;AACN,UAAM,iBAAiB,QAAQ;AAC/B,QAAI,QAAQ,aAAc,OAAM;AAChC,eAAW,QAAQ,QAAQ,aAAa;AACtC,YAAM,MAAM,OAAO,IAAI;AACvB,YAAM,YAAY,GAAG,KAAK,MAAM,YAAY,GAAG,KAAK,KAAK;AAAA,IAC3D;AACA,MAAE,eAAe;AAEjB,UAAM,KAAK,QAAQ;AAAA,EACrB;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK;AAAA,EACb;AAAA,EAEA,MAAM,IAAI,IAA4C;AACpD,WAAO,KAAK,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK;AAAA,EACpD;AAAA,EAEA,MAAM,KAAK,SAAqD;AAC9D,QAAI,SAAS,KAAK;AAClB,QAAI,SAAS,UAAU;AACrB,eAAS,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ,QAAQ;AAAA,IAC/D;AACA,QAAI,SAAS,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAC5C,eAAS,OAAO,OAAO,CAAC,MAAM,QAAQ,KAAM,KAAK,CAAC,MAAM,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC;AAAA,IAC7E;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,2BACN,UAC+C;AAC/C,QAAI,CAAC,UAAU,OAAQ,QAAO;AAC9B,UAAM,MAAM,oBAAI,IAAoE;AACpF,eAAW,MAAM,UAAU;AACzB,YAAM,WAAW,IAAI,IAAI,GAAG,IAAI;AAChC,UAAI,UAAU;AACZ,iBAAS;AAAA,MACX,OAAO;AACL,YAAI,IAAI,GAAG,MAAM,EAAE,MAAM,GAAG,MAAM,SAAS,GAAG,SAAS,aAAa,EAAE,CAAC;AAAA,MACzE;AAAA,IACF;AACA,WAAO,CAAC,GAAG,IAAI,OAAO,CAAC;AAAA,EACzB;AAAA,EAEQ,UAAyB;AAC/B,SAAK,aAAa,KAAK,WAAW,KAAK,YAAY;AACjD,YAAM,gBAAY,wBAAK,KAAK,KAAK,YAAY;AAC7C,YAAM,UAAU,GAAG,SAAS;AAC5B,gBAAM,4BAAU,SAAS,KAAK,UAAU,KAAK,WAAW,MAAM,CAAC,GAAG,OAAO;AACzE,gBAAM,yBAAO,SAAS,SAAS;AAAA,IACjC,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AACF;;;AG3NA,IAAM,qBAAqB,oBAAI,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EAChC;AACF,CAAC;AAED,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,qBAAqB,UAAqC;AACxE,QAAM,UAAoB,CAAC;AAC3B,MAAI,QAAoB;AAExB,QAAM,WAAW,CAAC,OAAmB,WAAmB;AACtD,YAAQ,KAAK,MAAM;AACnB,QAAI,UAAU,UAAW,SAAQ;AAAA,aACxB,UAAU,YAAY,UAAU,OAAQ,SAAQ;AAAA,EAC3D;AAEA,aAAW,QAAQ,SAAS,OAAO;AACjC,QAAI,mBAAmB,IAAI,KAAK,IAAI,GAAG;AACrC,eAAS,WAAW,YAAY,KAAK,IAAI,UAAU,KAAK,IAAI,GAAG;AAAA,IACjE;AAEA,QAAI,kBAAkB,IAAI,KAAK,IAAI,GAAG;AACpC,eAAS,UAAU,YAAY,KAAK,IAAI,UAAU,KAAK,IAAI,GAAG;AAAA,IAChE;AAEA,UAAM,WAAW,KAAK,UAAU,KAAK,UAAU;AAC/C,eAAW,WAAW,iBAAiB;AACrC,UAAI,QAAQ,KAAK,QAAQ,GAAG;AAC1B,iBAAS,WAAW,SAAS,KAAK,IAAI,yCAAyC;AAC/E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,YAAY,OAAO,QAAQ;AACtC;;;AChDA,IAAM,mBAAmB;AACzB,IAAM,YAAY;AAClB,IAAM,2BAA2B;AAEjC,IAAM,mBAA4C;AAAA,EAChD,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,UAAU;AACZ;AAOO,IAAM,iBAAN,MAAqB;AAAA,EAI1B,YACmB,SACjB,QACA;AAFiB;AAGjB,SAAK,YAAY,IAAI,aAAa;AAClC,SAAK,SAAS;AAAA,EAChB;AAAA,EALmB;AAAA,EAJF;AAAA,EACA;AAAA,EAUjB,MAAM,KAAK,SAA8C;AACvD,UAAM,eAAe,SAAS,gBAAgB;AAE9C,UAAM,KAAK,QAAQ,WAAW;AAE9B,UAAM,WAAW,MAAM,KAAK,QAAQ,KAAK;AACzC,UAAM,oBAAoB,IAAI;AAAA,MAC5B,SACG,OAAO,CAAC,MAAM,EAAE,eAAe,kBAAkB,EAAE,QAAQ,EAC3D,IAAI,CAAC,MAAM,EAAE,QAAS;AAAA,IAC3B;AAEA,UAAM,WAAyB;AAAA,MAC7B,OAAO;AAAA,MACP,WAAW;AAAA,MACX,OAAO;AAAA,MACP,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAEA,UAAM,cAAc,MAAM,KAAK,iBAAiB,cAAc,QAAQ;AAEtE,eAAW,MAAM,aAAa;AAC5B,UAAI,kBAAkB,IAAI,OAAO,EAAE,CAAC,GAAG;AACrC,iBAAS;AACT,iBAAS;AACT,iBAAS,aAAa,QAAQ;AAC9B;AAAA,MACF;AAEA,UAAI;AACF,cAAM,KAAK,gBAAgB,IAAI,QAAQ;AAAA,MACzC,SAAS,KAAK;AACZ,aAAK,OAAO,KAAK,8BAA8B,EAAE,IAAI,EAAE,KAAK,OAAO,GAAG,EAAE,CAAC;AAAA,MAC3E;AAEA,eAAS;AACT,eAAS,aAAa,QAAQ;AAE9B,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,wBAAwB,CAAC;AAAA,IAC9E;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,iBAAiB,KAAa,UAA2C;AACrF,UAAM,MAAgB,CAAC;AACvB,QAAI,OAAO;AAEX,WAAO,IAAI,SAAS,KAAK;AACvB,YAAM,MAAM,GAAG,gBAAgB,gBAAgB,IAAI,SAAS,SAAS;AACrE,YAAM,WAAW,MAAM,MAAM,GAAG;AAChC,UAAI,CAAC,SAAS,GAAI;AAElB,YAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,eAAS,QAAQ,KAAK,IAAI,KAAK,gBAAgB,GAAG;AAElD,iBAAW,YAAY,KAAK,WAAW;AACrC,YAAI,IAAI,UAAU,IAAK;AACvB,YAAI,SAAS,SAAS,SAAS,QAAQ,GAAG;AACxC,mBAAS;AACT;AAAA,QACF;AACA,YAAI,KAAK,SAAS,EAAE;AAAA,MACtB;AAEA,UAAI,KAAK,UAAU,SAAS,UAAW;AACvC;AAEA,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,wBAAwB,CAAC;AAAA,IAC9E;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,gBAAgB,IAAY,UAAuC;AAC/E,UAAM,MAAM,GAAG,gBAAgB,cAAc,EAAE;AAC/C,UAAM,WAAW,MAAM,MAAM,GAAG;AAChC,QAAI,CAAC,SAAS,GAAI;AAElB,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,eAAe,KAAK;AAC1B,UAAM,cAAc,aAAa;AAEjC,QAAI,CAAC,aAAa,OAAO,OAAQ;AAEjC,UAAM,WAAwB;AAAA,MAC5B,MAAM,aAAa;AAAA,MACnB,OAAO,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI;AAAA,MACvD,aAAa,YAAY;AAAA,MACzB,UAAU,YAAY,WAClB,EAAE,gBAAgB,MAAe,GAAG,YAAY,SAAS,IACzD,EAAE,GAAG,iBAAiB;AAAA,IAC5B;AAEA,UAAM,aAAa,KAAK,UAAU,SAAS,QAAQ;AACnD,UAAM,mBAAmB,WAAW,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO;AAE/E,QAAI,iBAAiB,SAAS,GAAG;AAC/B,eAAS;AACT,WAAK,OAAO,MAAM,YAAY,EAAE,aAAa,iBAAiB,MAAM,oBAAoB;AACxF;AAAA,IACF;AAEA,UAAM,SAAS,qBAAqB,QAAQ;AAE5C,QAAI,OAAO,eAAe,WAAW;AACnC,eAAS;AACT,WAAK,OAAO,MAAM,YAAY,EAAE,aAAa,OAAO,QAAQ,KAAK,IAAI,CAAC,EAAE;AACxE;AAAA,IACF;AAEA,QAAI,OAAO,eAAe,UAAU;AAClC,eAAS;AAAA,IACX;AAEA,UAAM,cAAc,KAAK,iBAAiB,aAAa,WAAW;AAElE,UAAM,WAAW,MAAM,KAAK,IAAI;AAAA,MAC9B,SAAS,MAAM,QAAQ,CAAC,MAAM;AAC5B,cAAM,OAAO,EAAE,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK;AACxC,cAAM,OAAO,CAAC,IAAI;AAClB,YAAI,EAAE,KAAK,SAAS,SAAS,KAAK,EAAE,KAAK,SAAS,SAAS,EAAG,MAAK,KAAK,WAAW,IAAI,EAAE;AACzF,YAAI,EAAE,KAAK,SAAS,WAAW,EAAG,MAAK,KAAK,IAAI;AAChD,eAAO;AAAA,MACT,CAAC;AAAA,IACH,CAAC;AAED,UAAM,WAAkC;AAAA,MACtC;AAAA,MACA,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU,OAAO,EAAE;AAAA,MACnB,WAAW,4BAA4B,EAAE;AAAA,MACzC,YAAY,OAAO;AAAA,IACrB;AAEA,UAAM,KAAK,QAAQ,KAAK,UAAU,QAAQ;AAC1C,aAAS;AACT,SAAK,OAAO,MAAM,YAAY,EAAE,YAAY,aAAa,IAAI,MAAM,OAAO,UAAU,GAAG;AAAA,EACzF;AAAA,EAEQ,iBAAiB,KAAqB;AAC5C,WAAO,IACJ,QAAQ,cAAc,EAAE,EACxB,QAAQ,0BAA0B,IAAI,EACtC,QAAQ,0BAA0B,IAAI,EACtC,QAAQ,WAAW,MAAM,EACzB,KAAK,EACL,MAAM,GAAG,GAAG;AAAA,EACjB;AACF;;;ACrLA,IAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6Bb,SAAS,aAAa,MAAsB;AAC1C,QAAM,MAAM,QAAQ,IAAI,IAAI;AAC5B,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,0CAA0C,IAAI,EAAE;AAC9D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAAS,UAAU,MAAoG;AACrH,QAAM,OAAO,KAAK,MAAM,CAAC;AACzB,QAAM,UAAU,KAAK,CAAC,KAAK;AAC3B,QAAM,aAAuB,CAAC;AAC9B,QAAM,QAA0C,CAAC;AAEjD,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,IAAI,WAAW,IAAI,GAAG;AACxB,YAAM,MAAM,IAAI,MAAM,CAAC;AACvB,YAAM,OAAO,KAAK,IAAI,CAAC;AACvB,UAAI,QAAQ,CAAC,KAAK,WAAW,IAAI,GAAG;AAClC,cAAM,GAAG,IAAI;AACb;AAAA,MACF,OAAO;AACL,cAAM,GAAG,IAAI;AAAA,MACf;AAAA,IACF,OAAO;AACL,iBAAW,KAAK,GAAG;AAAA,IACrB;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,YAAY,MAAM;AACtC;AAEA,IAAM,aAAa;AAAA,EACjB,OAAO,MAAM;AAAA,EAAC;AAAA,EACd,MAAM,CAAC,KAAa,SAAmC,QAAQ,MAAM,OAAO,GAAG,GAAG,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,GAAG;AAAA,EAClH,MAAM,CAAC,KAAa,SAAmC,QAAQ,MAAM,OAAO,UAAU,GAAG,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,UAAU,GAAG,EAAE;AAAA,EACrI,OAAO,CAAC,KAAa,SAAmC,QAAQ,MAAM,OAAO,WAAW,GAAG,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,WAAW,GAAG,EAAE;AAC1I;AAEA,SAAS,qBAAmD;AAC1D,QAAM,eAAe,QAAQ,IAAI,kBAAkB;AACnD,MAAI,iBAAiB,OAAQ,QAAO;AACpC,MAAI,gBAAgB,iBAAiB,QAAS,QAAO;AACrD,SAAO;AACT;AAEA,SAAS,eAAuB;AAC9B,QAAM,YAAY,mBAAmB;AACrC,SAAO,IAAI,OAAO;AAAA,IAChB,iBAAiB,aAAa,mBAAmB;AAAA,IACjD,YAAY,aAAa,cAAc;AAAA,IACvC,WAAW,aAAa,aAAa;AAAA,IACrC,GAAI,QAAQ,IAAI,cAAc,IAAI,EAAE,OAAO,QAAQ,IAAI,cAAc,EAAE,IAAI,CAAC;AAAA,IAC5E,GAAI,cAAc,SAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IAC/C,SAAS,IAAI,YAAY;AAAA,IACzB,QAAQ;AAAA,EACV,CAAC;AACH;AAEA,SAAS,qBAA6B;AACpC,QAAM,YAAY,mBAAmB;AACrC,SAAO,IAAI,OAAO;AAAA,IAChB,iBAAiB,aAAa,mBAAmB;AAAA,IACjD,GAAI,QAAQ,IAAI,cAAc,IAAI,EAAE,YAAY,QAAQ,IAAI,cAAc,EAAE,IAAI,CAAC;AAAA,IACjF,GAAI,QAAQ,IAAI,aAAa,IAAI,EAAE,WAAW,QAAQ,IAAI,aAAa,EAAE,IAAI,CAAC;AAAA,IAC9E,GAAI,QAAQ,IAAI,cAAc,IAAI,EAAE,OAAO,QAAQ,IAAI,cAAc,EAAE,IAAI,CAAC;AAAA,IAC5E,GAAI,cAAc,SAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IAC/C,SAAS,IAAI,YAAY;AAAA,IACzB,QAAQ;AAAA,EACV,CAAC;AACH;AAEA,eAAe,YAAY,YAAsB,OAAwD;AACvG,QAAM,cAAc,WAAW,KAAK,GAAG;AACvC,MAAI,CAAC,aAAa;AAChB,YAAQ,MAAM,4EAA4E;AAC1F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAW,MAAM,SAAS,MAAM;AACtC,QAAM,SAAS,WAAW,mBAAmB,IAAI,aAAa;AAC9D,QAAM,QAAQ,KAAK,IAAI;AAEvB,UAAQ,MAAM,wBAAwB;AAEtC,QAAM,SAAS,MAAM,OAAO,MAAM,aAAa;AAAA,IAC7C,QAAQ;AAAA,IACR,GAAI,OAAO,MAAM,MAAM,MAAM,WAAW,EAAE,MAAM,MAAM,MAAM,EAAE,IAAI,CAAC;AAAA,IACnE,UAAU,MAAM,UAAU,MAAM;AAAA,EAClC,CAAC;AAED,QAAM,OAAO,MAAM;AAEnB,QAAM,YAAY,KAAK,IAAI,IAAI,SAAS,KAAM,QAAQ,CAAC;AAEvD,UAAQ,MAAM,WAAW,OAAO,MAAM,OAAO,kBAAkB,WAAW,OAAO,qBAAqB,IAAI,MAAM,EAAE,GAAG;AACrH,UAAQ,MAAM,EAAE;AAEhB,UAAQ,IAAI,KAAK,UAAU;AAAA,IACzB,YAAY,OAAO;AAAA,IACnB,MAAM,OAAO;AAAA,IACb,oBAAoB,OAAO;AAAA,IAC3B,oBAAoB,OAAO;AAAA,IAC3B,QAAQ,OAAO;AAAA,IACf,mBAAmB,OAAO;AAAA,IAC1B,GAAI,OAAO,SAAS,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,EACvD,GAAG,MAAM,CAAC,CAAC;AACb;AAEA,eAAe,aAA4B;AACzC,QAAM,SAAS,aAAa;AAC5B,QAAM,YAAY,MAAM,OAAO,KAAK;AACpC,QAAM,OAAO,MAAM;AAEnB,MAAI,UAAU,WAAW,GAAG;AAC1B,YAAQ,IAAI,qBAAqB;AACjC;AAAA,EACF;AAEA,aAAW,KAAK,WAAW;AACzB,UAAM,SAAS,EAAE,SAAS,WAAW;AACrC,YAAQ,IAAI,KAAK,EAAE,EAAE,KAAK,OAAO,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE;AAAA,EACzD;AACA,UAAQ,IAAI;AAAA,EAAK,UAAU,MAAM,cAAc;AACjD;AAEA,eAAe,UAAU,YAAqC;AAC5D,QAAM,KAAK,WAAW,CAAC;AACvB,MAAI,CAAC,IAAI;AACP,YAAQ,MAAM,iCAAiC;AAC/C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,aAAa;AAC5B,QAAM,WAAW,MAAM,OAAO,IAAI,EAAE;AACpC,QAAM,OAAO,MAAM;AACnB,UAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAC/C;AAEA,eAAe,eAAe,YAAqC;AACjE,QAAM,KAAK,WAAW,CAAC;AACvB,MAAI,CAAC,IAAI;AACP,YAAQ,MAAM,sCAAsC;AACpD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,aAAa;AAC5B,QAAM,OAAO,SAAS,EAAE;AACxB,QAAM,OAAO,MAAM;AACnB,UAAQ,IAAI,sBAAsB,EAAE,EAAE;AACxC;AAEA,eAAe,iBAAiB,YAAqC;AACnE,QAAM,KAAK,WAAW,CAAC;AACvB,MAAI,CAAC,IAAI;AACP,YAAQ,MAAM,wCAAwC;AACtD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,aAAa;AAC5B,QAAM,OAAO,WAAW,EAAE;AAC1B,QAAM,OAAO,MAAM;AACnB,UAAQ,IAAI,wBAAwB,EAAE,EAAE;AAC1C;AAEA,eAAe,aAAa,YAAsB,OAAwD;AACxG,QAAM,KAAK,WAAW,CAAC;AACvB,MAAI,CAAC,IAAI;AACP,YAAQ,MAAM,8CAA8C;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,MAAM,SAAS,MAAM,MAAM;AAC7B,YAAQ,MAAM,4CAA4C;AAC1D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,aAAa;AAC5B,QAAM,OAAO,OAAO,IAAI,EAAE,SAAS,KAAK,CAAC;AACzC,QAAM,OAAO,MAAM;AACnB,UAAQ,IAAI,oBAAoB,EAAE,EAAE;AACtC;AAEA,eAAe,oBAAoB,OAAwD;AACzF,QAAM,MAAM,OAAO,MAAM,KAAK,MAAM,WAAW,SAAS,MAAM,KAAK,GAAG,EAAE,IAAI;AAC5E,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,SAAS;AAAA,IACb,OAAO,MAAM;AAAA,IAAC;AAAA,IACd,MAAM,CAAC,KAAa,SAAmC,QAAQ,MAAM,OAAO,GAAG,GAAG,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,GAAG;AAAA,IAClH,MAAM,CAAC,KAAa,SAAmC,QAAQ,MAAM,OAAO,UAAU,GAAG,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,UAAU,GAAG,EAAE;AAAA,IACrI,OAAO,CAAC,KAAa,SAAmC,QAAQ,MAAM,OAAO,WAAW,GAAG,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,WAAW,GAAG,EAAE;AAAA,EAC1I;AACA,QAAM,SAAS,IAAI,eAAe,SAAS,MAAM;AAEjD,UAAQ,MAAM,iBAAiB,GAAG,0CAA0C;AAE5E,QAAM,SAAS,MAAM,OAAO,KAAK;AAAA,IAC/B,cAAc;AAAA,IACd,YAAY,CAAC,MAAM;AACjB,UAAI,EAAE,YAAY,OAAO,KAAK,EAAE,YAAY,GAAG;AAC7C,gBAAQ,MAAM,eAAe,EAAE,SAAS,IAAI,EAAE,KAAK,eAAe,EAAE,KAAK,QAAQ;AAAA,MACnF;AAAA,IACF;AAAA,EACF,CAAC;AAED,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,gBAAgB;AAC9B,UAAQ,MAAM,iBAAiB,OAAO,KAAK,EAAE;AAC7C,UAAQ,MAAM,iBAAiB,OAAO,OAAO,wCAAwC;AACrF,UAAQ,MAAM,iBAAiB,OAAO,QAAQ,iCAAiC;AAC/E,UAAQ,MAAM,iBAAiB,OAAO,gBAAgB,uBAAuB;AAC7E,UAAQ,MAAM,iBAAiB,OAAO,WAAW,YAAY;AAC/D;AAEA,eAAe,aAA4B;AACzC,QAAM,EAAE,WAAAC,YAAW,UAAAC,WAAU,OAAAC,OAAM,IAAI,MAAM,OAAO,aAAkB;AACtE,QAAM,EAAE,MAAAC,MAAK,IAAI,MAAM,OAAO,MAAW;AACzC,QAAM,EAAE,SAAAC,SAAQ,IAAI,MAAM,OAAO,IAAS;AAC1C,QAAM,WAAW,MAAM,OAAO,UAAe;AAE7C,QAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,QAAM,MAAM,CAAC,MAA+B,IAAI,QAAQ,CAAC,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;AAE5F,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,kCAA6B;AAC3C,UAAQ,MAAM,0JAA6B;AAC3C,UAAQ,MAAM,EAAE;AAEhB,QAAM,UAAUD,MAAK,QAAQ,IAAI,GAAG,MAAM;AAC1C,MAAI,cAAc;AAClB,MAAI;AACF,kBAAc,MAAMF,UAAS,SAAS,OAAO;AAAA,EAC/C,QAAQ;AAAA,EAAC;AAET,QAAM,MAAM,CAAC,QAAgB,YAAY,SAAS,GAAG,KAAK,CAAC,CAAC,QAAQ,IAAI,GAAG;AAE3E,QAAM,QAAkB,CAAC;AAEzB,MAAI,CAAC,IAAI,mBAAmB,GAAG;AAC7B,UAAM,MAAM,MAAM,IAAI,oDAAoD;AAC1E,QAAI,IAAI,KAAK,EAAG,OAAM,KAAK,qBAAqB,IAAI,KAAK,CAAC,EAAE;AAAA,EAC9D,OAAO;AACL,YAAQ,MAAM,kCAAkC;AAAA,EAClD;AAEA,MAAI,CAAC,IAAI,cAAc,GAAG;AACxB,UAAM,MAAM,MAAM,IAAI,6DAA6D;AACnF,QAAI,IAAI,KAAK,EAAG,OAAM,KAAK,gBAAgB,IAAI,KAAK,EAAE,QAAQ,OAAO,EAAE,CAAC,EAAE;AAAA,EAC5E,OAAO;AACL,YAAQ,MAAM,6BAA6B;AAAA,EAC7C;AAEA,MAAI,CAAC,IAAI,aAAa,GAAG;AACvB,UAAM,MAAM,MAAM,IAAI,iBAAiB;AACvC,QAAI,IAAI,KAAK,EAAG,OAAM,KAAK,eAAe,IAAI,KAAK,CAAC,EAAE;AAAA,EACxD,OAAO;AACL,YAAQ,MAAM,4BAA4B;AAAA,EAC5C;AAEA,KAAG,MAAM;AAET,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,aAAa,cACf,YAAY,QAAQ,IAAI,OAAO,MAAM,KAAK,IAAI,IAAI,OAClD,MAAM,KAAK,IAAI,IAAI;AACvB,UAAMD,WAAU,SAAS,YAAY,OAAO;AAC5C,YAAQ,MAAM;AAAA,aAAgB,OAAO,EAAE;AAAA,EACzC,OAAO;AACL,YAAQ,MAAM,yCAAyC;AAAA,EACzD;AAEA,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,+BAA+B;AAE7C,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,SAAS;AAAA,IACb,OAAO,MAAM;AAAA,IAAC;AAAA,IACd,MAAM,MAAM;AAAA,IAAC;AAAA,IACb,MAAM,MAAM;AAAA,IAAC;AAAA,IACb,OAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AACA,QAAM,SAAS,IAAI,eAAe,SAAS,MAAM;AAEjD,QAAM,QAAQ,WAAW;AACzB,QAAM,WAAW,MAAM,QAAQ,KAAK;AAEpC,MAAI,SAAS,UAAU,IAAI;AACzB,YAAQ,MAAM,yBAAyB,SAAS,MAAM,gCAA2B;AAAA,EACnF,OAAO;AACL,UAAM,SAAS,MAAM,OAAO,KAAK;AAAA,MAC/B,cAAc;AAAA,MACd,YAAY,CAAC,MAAM;AACjB,YAAI,EAAE,YAAY,QAAQ,KAAK,EAAE,YAAY,GAAG;AAC9C,kBAAQ,OAAO,MAAM,KAAK,EAAE,SAAS,IAAI,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa;AAAA,QACrF;AAAA,MACF;AAAA,IACF,CAAC;AACD,YAAQ,MAAM,YAAY,OAAO,KAAK,eAAe,OAAO,OAAO,aAAa,OAAO,gBAAgB,cAAc;AAAA,EACvH;AAEA,QAAM,YAAYG,MAAKC,SAAQ,GAAG,SAAS;AAC3C,QAAMF,OAAMC,MAAK,WAAW,WAAW,GAAG,EAAE,WAAW,KAAK,CAAC;AAE7D,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,wBAAwB;AACtC,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,wEAAwE;AACtF,UAAQ,MAAM,EAAE;AAClB;AAEA,eAAe,OAAsB;AACnC,QAAM,EAAE,SAAS,YAAY,MAAM,IAAI,UAAU,QAAQ,IAAI;AAE7D,MAAI,CAAC,WAAW,YAAY,UAAU,MAAM,MAAM,MAAM,MAAM;AAC5D,YAAQ,IAAI,IAAI;AAChB;AAAA,EACF;AAEA,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,YAAM,WAAW;AACjB;AAAA,IACF,KAAK;AACH,YAAM,YAAY,YAAY,KAAK;AACnC;AAAA,IACF,KAAK;AACH,YAAM,WAAW;AACjB;AAAA,IACF,KAAK;AACH,YAAM,UAAU,UAAU;AAC1B;AAAA,IACF,KAAK;AACH,YAAM,eAAe,UAAU;AAC/B;AAAA,IACF,KAAK;AACH,YAAM,iBAAiB,UAAU;AACjC;AAAA,IACF,KAAK;AACH,YAAM,aAAa,YAAY,KAAK;AACpC;AAAA,IACF,KAAK;AACH,YAAM,oBAAoB,KAAK;AAC/B;AAAA,IACF;AACE,cAAQ,MAAM,oBAAoB,OAAO,EAAE;AAC3C,cAAQ,IAAI,IAAI;AAChB,cAAQ,KAAK,CAAC;AAAA,EAClB;AACF;AAEA,KAAK,EAAE,MAAM,CAAC,QAAiB;AAC7B,MAAI,eAAe,OAAO;AACxB,YAAQ,MAAM,UAAU,IAAI,OAAO,EAAE;AACrC,QAAI,YAAY,OAAO,MAAM,QAAS,IAAgC,MAAM,GAAG;AAC7E,iBAAW,SAAU,IAAgC,QAAoD;AACvG,gBAAQ,MAAM,WAAW,MAAM,IAAI,KAAK,MAAM,OAAO,EAAE;AAAA,MACzD;AAAA,IACF;AAAA,EACF,OAAO;AACL,YAAQ,MAAM,OAAO,GAAG,CAAC;AAAA,EAC3B;AACA,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["import_promises","import_node_path","import_node_os","Anthropic","totalTokensInput","totalTokensOutput","import_promises","import_node_path","import_node_os","w","writeFile","readFile","mkdir","join","homedir"]}
|