import type { ValidationOptions, ValidationResult } from '../validation/index'; import type { PluginRegistry } from '../workflow-builder/plugins/registry'; export interface IDataObject { [key: string]: string | number | boolean | null | undefined | object | IDataObject | Array; } export interface BinaryData { [key: string]: { fileName?: string; mimeType?: string; fileExtension?: string; fileSize?: string; data?: string; }; } export interface Item { json: T; binary?: BinaryData; } export type Items = Array>; export interface CredentialReference { name: string; id: string; } export interface NewCredentialValue { readonly __newCredential: true; readonly name: string; readonly id?: string; } export type OnError = 'stopWorkflow' | 'continueRegularOutput' | 'continueErrorOutput'; export interface WorkflowSettings { timezone?: string; errorWorkflow?: string; saveDataErrorExecution?: 'all' | 'none'; saveDataSuccessExecution?: 'all' | 'none'; saveManualExecutions?: boolean; saveExecutionProgress?: boolean; executionTimeout?: number; executionOrder?: 'v0' | 'v1'; callerPolicy?: 'any' | 'none' | 'workflowsFromAList' | 'workflowsFromSameOwner'; callerIds?: string; [key: string]: unknown; } export type GenericValue = string | object | number | boolean | undefined | null; export interface IConnection { node: string; type: string; index: number; } export type NodeInputConnections = Array; export interface INodeConnections { [key: string]: NodeInputConnections; } export interface IConnections { [key: string]: INodeConnections; } interface ErrorIndexNodeInfo { name?: string; type: string; parameters?: IDataObject; } export declare function resolveErrorOutputIndex(type: string, parameters?: IDataObject): number; export declare function foldLegacyErrorConnections(connections: IConnections, nodes?: readonly ErrorIndexNodeInfo[]): void; export declare function normalizeConnections(connections: IConnections): void; export declare function generateUniqueName(baseName: string, exists: (name: string) => boolean): string; export interface NodeJSON { id: string; name?: string; type: string; typeVersion: number; position: [number, number]; parameters?: IDataObject; credentials?: Record; webhookId?: string; disabled?: boolean; notes?: string; notesInFlow?: boolean; executeOnce?: boolean; retryOnFail?: boolean; maxTries?: number; waitBetweenTries?: number; alwaysOutputData?: boolean; onError?: OnError; extendsCredential?: string; } export interface WorkflowJSON { id?: string; name: string; nodes: NodeJSON[]; connections: IConnections; settings?: WorkflowSettings; pinData?: Record; meta?: { templateId?: string; instanceId?: string; }; } export interface ConnectionTarget { node: string; type: string; index: number; } export interface GraphNode { instance: NodeInstance; connections: Map>; } export interface DeclaredConnection { target: NodeInstance | InputTarget; outputIndex: number; targetInputIndex?: number; connectionType?: string; } export interface InputTarget { readonly _isInputTarget: true; readonly node: NodeInstance; readonly inputIndex: number; } export interface OutputSelector { readonly _isOutputSelector: true; readonly node: NodeInstance; readonly outputIndex: number; to>(target: T | T[] | InputTarget): NodeChain, T>; } export interface ExecutionContext { id: string; mode: 'test' | 'production'; resumeUrl?: string; } export interface WorkflowContext { id?: string; name?: string; active: boolean; } export interface NodeConfig { parameters?: TParams; credentials?: Record; name?: string; position?: [number, number]; webhookId?: string; disabled?: boolean; notes?: string; notesInFlow?: boolean; executeOnce?: boolean; retryOnFail?: boolean; maxTries?: number; waitBetweenTries?: number; alwaysOutputData?: boolean; onError?: OnError; extendsCredential?: string; pinData?: IDataObject[]; output?: IDataObject[]; subnodes?: SubnodeConfig; } export interface StickyNoteConfig { color?: number; position?: [number, number]; width?: number; height?: number; name?: string; } export interface SubnodeConfig { model?: LanguageModelInstance | LanguageModelInstance[] | LanguageModelInstance[][]; memory?: MemoryInstance; tools?: ToolInstance[]; outputParser?: OutputParserInstance; embedding?: EmbeddingInstance | EmbeddingInstance[]; embeddings?: EmbeddingInstance | EmbeddingInstance[]; vectorStore?: VectorStoreInstance; retriever?: RetrieverInstance; documentLoader?: DocumentLoaderInstance | DocumentLoaderInstance[]; textSplitter?: TextSplitterInstance; reranker?: RerankerInstance | RerankerInstance[]; } export interface NodeInstance { readonly type: TType; readonly version: TVersion; readonly config: NodeConfig; readonly id: string; readonly name: string; readonly _outputType?: TOutput; update(config: Partial): NodeInstance; to>(target: T | T[] | InputTarget, outputIndex?: number): NodeChain, T>; to(target: IfElseBuilder, outputIndex?: number): NodeChain, NodeInstance<'n8n-nodes-base.if', string, T>>; to(target: SwitchCaseBuilder, outputIndex?: number): NodeChain, NodeInstance<'n8n-nodes-base.switch', string, T>>; to(target: SplitInBatchesBuilder, outputIndex?: number): NodeChain, NodeInstance>; input(index: number): InputTarget; output(index: number): OutputSelector; onTrue?(target: IfElseTarget): IfElseBuilder; onFalse?(target: IfElseTarget): IfElseBuilder; onCase?(index: number, target: SwitchCaseTarget): SwitchCaseBuilder; onError>(handler: T): this; getConnections(): DeclaredConnection[]; } export interface TriggerInstance extends NodeInstance { readonly isTrigger: true; } export interface NodeChain = NodeInstance, TTail extends NodeInstance = NodeInstance> extends NodeInstance { readonly _isChain: true; readonly head: THead; readonly tail: TTail; readonly allNodes: Array>; to>(target: T | T[] | InputTarget, outputIndex?: number): NodeChain; to(target: IfElseBuilder, outputIndex?: number): NodeChain>; to(target: SwitchCaseBuilder, outputIndex?: number): NodeChain>; to(target: SplitInBatchesBuilder, outputIndex?: number): NodeChain; } export declare function isNodeChain(value: unknown): value is NodeChain, NodeInstance>; export declare function isNodeInstance(value: unknown): value is NodeInstance; export interface SubnodeInstance extends NodeInstance { readonly _subnodeType: TSubnodeType; } export type LanguageModelInstance = SubnodeInstance; export type MemoryInstance = SubnodeInstance; export type ToolInstance = SubnodeInstance; export type OutputParserInstance = SubnodeInstance; export type EmbeddingInstance = SubnodeInstance; export type VectorStoreInstance = SubnodeInstance; export type RetrieverInstance = SubnodeInstance; export type DocumentLoaderInstance = SubnodeInstance; export type TextSplitterInstance = SubnodeInstance; export type RerankerInstance = SubnodeInstance; export interface IfElseConfig { version: number; config?: NodeConfig; } export interface IfElseComposite { readonly ifNode: NodeInstance<'n8n-nodes-base.if', string, unknown>; readonly trueBranch: NodeInstance | Array>; readonly falseBranch: NodeInstance | Array>; } export interface SwitchCaseConfig { version: number; config?: NodeConfig; } export interface SwitchCaseComposite { readonly switchNode: NodeInstance<'n8n-nodes-base.switch', string, unknown>; readonly cases: Array | Array> | null>; } export type IfElseTarget = null | NodeInstance | NodeChain, NodeInstance> | Array | NodeChain, NodeInstance>> | IfElseBuilder | SwitchCaseBuilder | SplitInBatchesBuilder | InputTarget; export type SwitchCaseTarget = null | NodeInstance | NodeChain, NodeInstance> | Array | NodeChain, NodeInstance>> | IfElseBuilder | SwitchCaseBuilder | SplitInBatchesBuilder | InputTarget; export type SplitInBatchesTarget = null | NodeInstance | NodeChain, NodeInstance> | Array | NodeChain, NodeInstance>> | IfElseBuilder | SwitchCaseBuilder | SplitInBatchesBuilder; export interface IfElseBuilder { readonly _isIfElseBuilder: true; readonly ifNode: NodeInstance<'n8n-nodes-base.if', string, TOutput>; readonly trueBranch: IfElseTarget; readonly falseBranch: IfElseTarget; readonly errorBranch?: IfElseTarget; onTrue(target: IfElseTarget): IfElseBuilder; onFalse(target: IfElseTarget): IfElseBuilder; onError(target: IfElseTarget): IfElseBuilder; to>(target: T | T[], outputIndex?: number): NodeChain, T>; } export interface SwitchCaseBuilder { readonly _isSwitchCaseBuilder: true; readonly switchNode: NodeInstance<'n8n-nodes-base.switch', string, TOutput>; readonly caseMapping: Map; onCase(index: number, target: SwitchCaseTarget): SwitchCaseBuilder; to>(target: T | T[], outputIndex?: number): NodeChain, T>; } export interface SplitInBatchesFactoryConfig { version: number | string; config?: NodeConfig; } export interface SplitInBatchesConfig extends NodeConfig { version?: number | string; id?: string; } export interface SplitInBatchesBuilder { readonly sibNode: NodeInstance<'n8n-nodes-base.splitInBatches', string, unknown>; onEachBatch(target: SplitInBatchesTarget): SplitInBatchesBuilder; onDone(target: SplitInBatchesTarget): SplitInBatchesBuilder; } export interface GeneratePinDataOptions { beforeWorkflow?: WorkflowJSON; } export interface ToJSONOptions { tidyUp?: boolean; } export interface WorkflowBuilder { readonly id: string; readonly name: string; add | TriggerInstance | NodeChain | IfElseBuilder | SwitchCaseBuilder>(node: N): WorkflowBuilder; to>(node: N): WorkflowBuilder; to(inputTarget: InputTarget): WorkflowBuilder; to(ifElse: IfElseComposite): WorkflowBuilder; to(switchCase: SwitchCaseComposite): WorkflowBuilder; to(splitInBatches: SplitInBatchesBuilder): WorkflowBuilder; to(ifElseBuilder: IfElseBuilder): WorkflowBuilder; to(switchCaseBuilder: SwitchCaseBuilder): WorkflowBuilder; to(nodes: Array | NodeChain | null>): WorkflowBuilder; onTrue(target: IfElseTarget): WorkflowBuilder; onFalse(target: IfElseTarget): WorkflowBuilder; onCase(index: number, target: SwitchCaseTarget): WorkflowBuilder; settings(settings: WorkflowSettings): WorkflowBuilder; connect(source: NodeInstance, sourceOutput: number, target: NodeInstance, targetInput: number): WorkflowBuilder; getNode(name: string): NodeInstance | undefined; validate(options?: ValidationOptions): ValidationResult; toJSON(options?: ToJSONOptions): WorkflowJSON; toFormat(format: string): T; toString(): string; generatePinData(options?: GeneratePinDataOptions): WorkflowBuilder; regenerateNodeIds(): void; } export interface WorkflowBuilderOptions { settings?: WorkflowSettings; registry?: PluginRegistry; } export interface WorkflowBuilderStatic { (id: string, name: string, options?: WorkflowSettings | WorkflowBuilderOptions): WorkflowBuilder; fromJSON(json: WorkflowJSON): WorkflowBuilder; } export interface NodeInput { type: TType; version: TVersion; config: NodeConfig; output?: IDataObject[]; } export interface TriggerInput { type: TType; version: TVersion; config: NodeConfig; output?: IDataObject[]; } export type WorkflowFn = WorkflowBuilderStatic; export type NodeFn = (input: TNode) => NodeInstance; export type TriggerFn = (input: TTrigger) => TriggerInstance; export type StickyFn = (content: string, nodes?: Array>, config?: StickyNoteConfig) => NodeInstance<'n8n-nodes-base.stickyNote', 'v1', void>; export type PlaceholderFn = (hint: string) => string; export type NewCredentialFn = (name: string, id?: string) => NewCredentialValue; export type IfElseFn = (branches: [ NodeInstance | null, NodeInstance | null ], config?: IfElseConfig) => IfElseComposite; export type SwitchCaseFn = (config?: SwitchCaseConfig) => NodeInstance<'n8n-nodes-base.switch', string, unknown>; export type SplitInBatchesFn = (configOrNode: SplitInBatchesFactoryConfig | NodeInstance<'n8n-nodes-base.splitInBatches', string, unknown>) => SplitInBatchesBuilder; export interface AllItemsContext { $input: { all(): IDataObject[]; first(): IDataObject; last(): IDataObject; itemMatching(index: number): IDataObject; }; $env: IDataObject; $vars: IDataObject; $secrets: IDataObject; $now: Date; $today: Date; $runIndex: number; $execution: ExecutionContext; $workflow: WorkflowContext; (nodeName: string): { json: IDataObject; }; $jmespath: (data: unknown, expr: string) => unknown; } export interface EachItemContext { $input: { item: IDataObject; }; $itemIndex: number; $env: IDataObject; $vars: IDataObject; $secrets: IDataObject; $now: Date; $today: Date; $runIndex: number; $execution: ExecutionContext; $workflow: WorkflowContext; (nodeName: string): { json: IDataObject; }; $jmespath: (data: unknown, expr: string) => unknown; } export interface CodeResult { mode: 'runOnceForAllItems' | 'runOnceForEachItem'; jsCode: string; _outputType?: T; } export type RunOnceForAllItemsFn = (fn: (ctx: AllItemsContext) => Array<{ json: T; }>) => CodeResult; export type RunOnceForEachItemFn = (fn: (ctx: EachItemContext) => { json: T; } | null) => CodeResult; export type FromAIArgumentType = 'string' | 'number' | 'boolean' | 'json'; export {};