n8n/packages/editor-ui/src/Interface.ts
Michael Kret 4d222ac19d
feat(AI Transform Node): New node (#10405)
Co-authored-by: Giulio Andreini <g.andreini@gmail.com>
Co-authored-by: Shireen Missi <94372015+ShireenMissi@users.noreply.github.com>
2024-08-14 16:20:02 +03:00

1853 lines
40 KiB
TypeScript

import type {
AI_NODE_CREATOR_VIEW,
CREDENTIAL_EDIT_MODAL_KEY,
SignInType,
FAKE_DOOR_FEATURES,
TRIGGER_NODE_CREATOR_VIEW,
REGULAR_NODE_CREATOR_VIEW,
AI_OTHERS_NODE_CREATOR_VIEW,
ROLE,
} from '@/constants';
import type { IMenuItem, NodeCreatorTag } from 'n8n-design-system';
import type {
GenericValue,
IConnections,
ICredentialsDecrypted,
ICredentialsEncrypted,
ICredentialType,
IDataObject,
INode,
INodeIssues,
INodeParameters,
INodeTypeDescription,
IPinData,
IRunExecutionData,
IRun,
IRunData,
ITaskData,
IWorkflowSettings as IWorkflowSettingsWorkflow,
WorkflowExecuteMode,
PublicInstalledPackage,
INodeTypeNameVersion,
ILoadOptions,
INodeCredentials,
INodeListSearchItems,
NodeParameterValueType,
IDisplayOptions,
ExecutionSummary,
FeatureFlags,
ExecutionStatus,
ITelemetryTrackProperties,
IUserManagementSettings,
WorkflowSettings,
IUserSettings,
IN8nUISettings,
BannerName,
INodeExecutionData,
INodeProperties,
NodeConnectionType,
INodeCredentialsDetails,
StartNodeData,
} from 'n8n-workflow';
import type { BulkCommand, Undoable } from '@/models/history';
import type { PartialBy, TupleToUnion } from '@/utils/typeHelpers';
import type { Component } from 'vue';
import type { Scope } from '@n8n/permissions';
import type { NotificationOptions as ElementNotificationOptions } from 'element-plus';
import type { ProjectSharingData } from '@/types/projects.types';
import type { Connection } from '@jsplumb/core';
import type { BaseTextKey } from './plugins/i18n';
export * from 'n8n-design-system/types';
declare global {
interface Window {
posthog?: {
init(
key: string,
options?: {
api_host?: string;
autocapture?: boolean;
disable_session_recording?: boolean;
debug?: boolean;
bootstrap?: {
distinctId?: string;
isIdentifiedID?: boolean;
featureFlags: FeatureFlags;
};
session_recording?: {
maskAllInputs?: boolean;
maskInputFn?: ((text: string, element?: HTMLElement) => string) | null;
};
},
): void;
isFeatureEnabled?(flagName: string): boolean;
getFeatureFlag?(flagName: string): boolean | string;
identify?(
id: string,
userProperties?: Record<string, string | number>,
userPropertiesOnce?: Record<string, string>,
): void;
reset?(resetDeviceId?: boolean): void;
onFeatureFlags?(callback: (keys: string[], map: FeatureFlags) => void): void;
reloadFeatureFlags?(): void;
capture?(event: string, properties: IDataObject): void;
register?(metadata: IDataObject): void;
people?: {
set?(metadata: IDataObject): void;
};
debug?(): void;
};
analytics?: {
identify(userId: string): void;
track(event: string, properties?: ITelemetryTrackProperties): void;
page(category: string, name: string, properties?: ITelemetryTrackProperties): void;
};
featureFlags?: {
getAll: () => FeatureFlags;
getVariant: (name: string) => string | boolean | undefined;
override: (name: string, value: string) => void;
};
// eslint-disable-next-line @typescript-eslint/naming-convention
Cypress: unknown;
Sentry?: {
captureException: (error: Error, metadata?: unknown) => void;
};
}
}
/** String that represents a timestamp in the ISO8601 format, i.e. YYYY-MM-DDTHH:MM:SS.sssZ */
export type Iso8601String = string;
export type EndpointStyle = {
width?: number;
height?: number;
fill?: string;
stroke?: string;
outlineStroke?: string;
lineWidth?: number;
hover?: boolean;
showOutputLabel?: boolean;
size?: string;
hoverMessage?: string;
};
export interface IUpdateInformation<T extends NodeParameterValueType = NodeParameterValueType> {
name: string;
key?: string;
value: T;
node?: string;
oldValue?: string | number;
type?: 'optionsOrderChanged';
}
export interface INodeUpdatePropertiesInformation {
name: string; // Node-Name
properties: {
position: XYPosition;
[key: string]: IDataObject | XYPosition;
};
}
export type XYPosition = [number, number];
export interface INodeUi extends INode {
position: XYPosition;
color?: string;
notes?: string;
issues?: INodeIssues;
name: string;
pinData?: IDataObject;
}
export interface INodeTypesMaxCount {
[key: string]: {
exist: number;
max: number;
nodeNames: string[];
};
}
export interface INodeTranslationHeaders {
data: {
[key: string]: {
displayName: string;
description: string;
};
};
}
export interface IAiDataContent {
data: INodeExecutionData[] | null;
inOut: 'input' | 'output';
type: NodeConnectionType;
metadata: {
executionTime: number;
startTime: number;
};
}
export interface IAiData {
data: IAiDataContent[];
node: string;
runIndex: number;
}
export interface IStartRunData {
workflowData: IWorkflowData;
startNodes?: StartNodeData[];
destinationNode?: string;
runData?: IRunData;
}
export interface ITableData {
columns: string[];
data: GenericValue[][];
hasJson: { [key: string]: boolean };
}
// Simple version of n8n-workflow.Workflow
export interface IWorkflowData {
id?: string;
name?: string;
active?: boolean;
nodes: INode[];
connections: IConnections;
settings?: IWorkflowSettings;
tags?: string[];
pinData?: IPinData;
versionId?: string;
meta?: WorkflowMetadata;
}
export interface IWorkflowDataUpdate {
id?: string;
name?: string;
nodes?: INode[];
connections?: IConnections;
settings?: IWorkflowSettings;
active?: boolean;
tags?: ITag[] | string[]; // string[] when store or requested, ITag[] from API response
pinData?: IPinData;
versionId?: string;
meta?: WorkflowMetadata;
}
export interface IWorkflowToShare extends IWorkflowDataUpdate {
meta: WorkflowMetadata;
}
export interface NewWorkflowResponse {
name: string;
onboardingFlowEnabled?: boolean;
defaultSettings: IWorkflowSettings;
}
export interface IWorkflowTemplateNode
extends Pick<
INodeUi,
'name' | 'type' | 'position' | 'parameters' | 'typeVersion' | 'webhookId' | 'id' | 'disabled'
> {
// The credentials in a template workflow have a different type than in a regular workflow
credentials?: IWorkflowTemplateNodeCredentials;
}
export interface IWorkflowTemplateNodeCredentials {
[key: string]: string | INodeCredentialsDetails;
}
export interface IWorkflowTemplate {
id: number;
name: string;
workflow: Pick<IWorkflowData, 'connections' | 'settings' | 'pinData'> & {
nodes: IWorkflowTemplateNode[];
};
}
export interface INewWorkflowData {
name: string;
onboardingFlowEnabled: boolean;
}
export interface WorkflowMetadata {
onboardingId?: string;
templateId?: string;
instanceId?: string;
templateCredsSetupCompleted?: boolean;
}
// Almost identical to cli.Interfaces.ts
export interface IWorkflowDb {
id: string;
name: string;
active: boolean;
createdAt: number | string;
updatedAt: number | string;
nodes: INodeUi[];
connections: IConnections;
settings?: IWorkflowSettings;
tags?: ITag[] | string[]; // string[] when store or requested, ITag[] from API response
pinData?: IPinData;
sharedWithProjects?: ProjectSharingData[];
homeProject?: ProjectSharingData;
scopes?: Scope[];
versionId: string;
usedCredentials?: IUsedCredential[];
meta?: WorkflowMetadata;
}
// Identical to cli.Interfaces.ts
export interface IWorkflowShortResponse {
id: string;
name: string;
active: boolean;
createdAt: number | string;
updatedAt: number | string;
tags: ITag[];
}
export interface IWorkflowsShareResponse {
id: string;
createdAt: number | string;
updatedAt: number | string;
sharedWithProjects?: ProjectSharingData[];
homeProject?: ProjectSharingData;
}
// Identical or almost identical to cli.Interfaces.ts
export interface IActivationError {
time: number;
error: {
message: string;
};
}
export interface IShareCredentialsPayload {
shareWithIds: string[];
}
export interface IShareWorkflowsPayload {
shareWithIds: string[];
}
export interface ICredentialsResponse extends ICredentialsEncrypted {
id: string;
createdAt: Iso8601String;
updatedAt: Iso8601String;
sharedWithProjects?: ProjectSharingData[];
homeProject?: ProjectSharingData;
currentUserHasAccess?: boolean;
scopes?: Scope[];
ownedBy?: Pick<IUserResponse, 'id' | 'firstName' | 'lastName' | 'email'>;
}
export interface ICredentialsBase {
createdAt: Iso8601String;
updatedAt: Iso8601String;
}
export interface ICredentialsDecryptedResponse extends ICredentialsBase, ICredentialsDecrypted {
id: string;
}
export interface IExecutionBase {
id?: string;
finished: boolean;
mode: WorkflowExecuteMode;
status: ExecutionStatus;
retryOf?: string;
retrySuccessId?: string;
startedAt: Date;
stoppedAt?: Date;
workflowId?: string; // To be able to filter executions easily //
}
export interface IExecutionFlatted extends IExecutionBase {
data: string;
workflowData: IWorkflowDb;
}
export interface IExecutionFlattedResponse extends IExecutionFlatted {
id: string;
}
export interface IExecutionPushResponse {
executionId?: string;
waitingForWebhook?: boolean;
}
export interface IExecutionResponse extends IExecutionBase {
id: string;
data?: IRunExecutionData;
workflowData: IWorkflowDb;
executedNode?: string;
}
export type ExecutionSummaryWithScopes = ExecutionSummary & { scopes: Scope[] };
export interface IExecutionsListResponse {
count: number;
results: ExecutionSummaryWithScopes[];
estimated: boolean;
}
export interface IExecutionsCurrentSummaryExtended {
id: string;
finished?: boolean;
status: ExecutionStatus;
mode: WorkflowExecuteMode;
retryOf?: string | null;
retrySuccessId?: string | null;
startedAt: Date;
stoppedAt?: Date;
workflowId: string;
workflowName?: string;
}
export interface IExecutionsStopData {
finished?: boolean;
mode: WorkflowExecuteMode;
startedAt: Date;
stoppedAt: Date;
status: ExecutionStatus;
}
export interface IExecutionDeleteFilter {
deleteBefore?: Date;
filters?: ExecutionsQueryFilter;
ids?: string[];
}
export type IPushData =
| PushDataExecutionFinished
| PushDataExecutionStarted
| PushDataExecuteAfter
| PushDataExecuteBefore
| PushDataNodeDescriptionUpdated
| PushDataConsoleMessage
| PushDataReloadNodeType
| PushDataRemoveNodeType
| PushDataTestWebhook
| PushDataExecutionRecovered
| PushDataWorkerStatusMessage
| PushDataActiveWorkflowAdded
| PushDataActiveWorkflowRemoved
| PushDataWorkflowFailedToActivate;
export type PushDataActiveWorkflowAdded = {
data: IActiveWorkflowAdded;
type: 'workflowActivated';
};
export type PushDataActiveWorkflowRemoved = {
data: IActiveWorkflowRemoved;
type: 'workflowDeactivated';
};
export type PushDataWorkflowFailedToActivate = {
data: IWorkflowFailedToActivate;
type: 'workflowFailedToActivate';
};
export type PushDataExecutionRecovered = {
data: IPushDataExecutionRecovered;
type: 'executionRecovered';
};
export type PushDataExecutionFinished = {
data: IPushDataExecutionFinished;
type: 'executionFinished';
};
export type PushDataExecutionStarted = {
data: IPushDataExecutionStarted;
type: 'executionStarted';
};
export type PushDataExecuteAfter = {
data: IPushDataNodeExecuteAfter;
type: 'nodeExecuteAfter';
};
export type PushDataExecuteBefore = {
data: IPushDataNodeExecuteBefore;
type: 'nodeExecuteBefore';
};
export type PushDataNodeDescriptionUpdated = {
data: {};
type: 'nodeDescriptionUpdated';
};
export type PushDataConsoleMessage = {
data: IPushDataConsoleMessage;
type: 'sendConsoleMessage';
};
export type PushDataReloadNodeType = {
data: IPushDataReloadNodeType;
type: 'reloadNodeType';
};
export type PushDataRemoveNodeType = {
data: IPushDataRemoveNodeType;
type: 'removeNodeType';
};
export type PushDataTestWebhook = {
data: IPushDataTestWebhook;
type: 'testWebhookDeleted' | 'testWebhookReceived';
};
export type PushDataWorkerStatusMessage = {
data: IPushDataWorkerStatusMessage;
type: 'sendWorkerStatusMessage';
};
export interface IPushDataExecutionStarted {
executionId: string;
mode: WorkflowExecuteMode;
startedAt: Date;
retryOf?: string;
workflowId: string;
workflowName?: string;
}
export interface IPushDataExecutionRecovered {
executionId: string;
}
export interface IPushDataExecutionFinished {
data: IRun;
executionId: string;
retryOf?: string;
}
export interface IActiveWorkflowAdded {
workflowId: string;
}
export interface IActiveWorkflowRemoved {
workflowId: string;
}
export interface IWorkflowFailedToActivate {
workflowId: string;
errorMessage: string;
}
export interface IPushDataUnsavedExecutionFinished {
executionId: string;
data: { finished: true; stoppedAt: Date };
}
export interface IPushDataExecutionStarted {
executionId: string;
}
export interface IPushDataNodeExecuteAfter {
data: ITaskData;
executionId: string;
nodeName: string;
}
export interface IPushDataNodeExecuteBefore {
executionId: string;
nodeName: string;
}
export interface IPushDataReloadNodeType {
name: string;
version: number;
}
export interface IPushDataRemoveNodeType {
name: string;
version: number;
}
export interface IPushDataTestWebhook {
executionId: string;
workflowId: string;
}
export interface IPushDataConsoleMessage {
source: string;
messages: string[];
}
export interface WorkerJobStatusSummary {
jobId: string;
executionId: string;
retryOf?: string;
startedAt: Date;
mode: WorkflowExecuteMode;
workflowName: string;
workflowId: string;
status: ExecutionStatus;
}
export interface IPushDataWorkerStatusPayload {
workerId: string;
runningJobsSummary: WorkerJobStatusSummary[];
freeMem: number;
totalMem: number;
uptime: number;
loadAvg: number[];
cpus: string;
arch: string;
platform: NodeJS.Platform;
hostname: string;
interfaces: Array<{
family: 'IPv4' | 'IPv6';
address: string;
internal: boolean;
}>;
version: string;
}
export interface IPushDataWorkerStatusMessage {
workerId: string;
status: IPushDataWorkerStatusPayload;
}
export type IPersonalizationSurveyAnswersV1 = {
codingSkill?: string | null;
companyIndustry?: string[] | null;
companySize?: string | null;
otherCompanyIndustry?: string | null;
otherWorkArea?: string | null;
workArea?: string[] | string | null;
};
export type IPersonalizationSurveyAnswersV2 = {
version: 'v2';
automationGoal?: string | null;
codingSkill?: string | null;
companyIndustryExtended?: string[] | null;
companySize?: string | null;
companyType?: string | null;
customerType?: string | null;
mspFocus?: string[] | null;
mspFocusOther?: string | null;
otherAutomationGoal?: string | null;
otherCompanyIndustryExtended?: string[] | null;
};
export type IPersonalizationSurveyAnswersV3 = {
version: 'v3';
automationGoal?: string | null;
otherAutomationGoal?: string | null;
companyIndustryExtended?: string[] | null;
otherCompanyIndustryExtended?: string[] | null;
companySize?: string | null;
companyType?: string | null;
automationGoalSm?: string[] | null;
automationGoalSmOther?: string | null;
usageModes?: string[] | null;
email?: string | null;
};
export type IPersonalizationSurveyAnswersV4 = {
version: 'v4';
automationGoalDevops?: string[] | null;
automationGoalDevopsOther?: string | null;
companyIndustryExtended?: string[] | null;
otherCompanyIndustryExtended?: string[] | null;
companySize?: string | null;
companyType?: string | null;
automationGoalSm?: string[] | null;
automationGoalSmOther?: string | null;
usageModes?: string[] | null;
email?: string | null;
role?: string | null;
roleOther?: string | null;
reportedSource?: string | null;
reportedSourceOther?: string | null;
};
export type IPersonalizationLatestVersion = IPersonalizationSurveyAnswersV4;
export type IPersonalizationSurveyVersions =
| IPersonalizationSurveyAnswersV1
| IPersonalizationSurveyAnswersV2
| IPersonalizationSurveyAnswersV3
| IPersonalizationSurveyAnswersV4;
export type Roles = typeof ROLE;
export type IRole = Roles[keyof Roles];
export type InvitableRoleName = Roles['Member' | 'Admin'];
export interface IUserResponse {
id: string;
firstName?: string;
lastName?: string;
email?: string;
createdAt?: string;
role?: IRole;
globalScopes?: Scope[];
personalizationAnswers?: IPersonalizationSurveyVersions | null;
isPending: boolean;
signInType?: SignInType;
settings?: IUserSettings;
}
export interface CurrentUserResponse extends IUserResponse {
featureFlags?: FeatureFlags;
}
export interface IUser extends IUserResponse {
isDefaultUser: boolean;
isPendingUser: boolean;
inviteAcceptUrl?: string;
fullName?: string;
createdAt?: string;
mfaEnabled: boolean;
}
export interface IVersionNotificationSettings {
enabled: boolean;
endpoint: string;
infoUrl: string;
}
export interface IUserListAction {
label: string;
value: string;
guard?: (user: IUser) => boolean;
}
export interface IN8nPrompts {
message?: string;
title?: string;
showContactPrompt?: boolean;
}
export const enum UserManagementAuthenticationMethod {
Email = 'email',
Ldap = 'ldap',
Saml = 'saml',
}
export interface IPermissionGroup {
loginStatus?: ILogInStatus[];
role?: IRole[];
}
export interface IPermissionAllowGroup extends IPermissionGroup {
shouldAllow?: () => boolean;
}
export interface IPermissionDenyGroup extends IPermissionGroup {
shouldDeny?: () => boolean;
}
export interface IPermissions {
allow?: IPermissionAllowGroup;
deny?: IPermissionDenyGroup;
}
export interface IUserPermissions {
[category: string]: {
[permission: string]: IPermissions;
};
}
export interface ITemplatesCollection {
id: number;
name: string;
nodes: ITemplatesNode[];
workflows: Array<{ id: number }>;
}
interface ITemplatesImage {
id: number;
url: string;
}
interface ITemplatesCollectionExtended extends ITemplatesCollection {
description: string | null;
image: ITemplatesImage[];
categories: ITemplatesCategory[];
createdAt: string;
}
export interface ITemplatesCollectionFull extends ITemplatesCollectionExtended {
full: true;
}
export interface ITemplatesCollectionResponse extends ITemplatesCollectionExtended {
workflows: ITemplatesWorkflow[];
}
/**
* A template without the actual workflow definition
*/
export interface ITemplatesWorkflow {
id: number;
createdAt: string;
name: string;
nodes: ITemplatesNode[];
totalViews: number;
user: {
username: string;
};
}
export interface ITemplatesWorkflowInfo {
nodeCount: number;
nodeTypes: {
[key: string]: {
count: number;
};
};
}
export type TemplateSearchFacet = {
field_name: string;
sampled: boolean;
stats: {
total_values: number;
};
counts: Array<{
count: number;
highlighted: string;
value: string;
}>;
};
export interface ITemplatesWorkflowResponse extends ITemplatesWorkflow, IWorkflowTemplate {
description: string | null;
image: ITemplatesImage[];
categories: ITemplatesCategory[];
workflowInfo: ITemplatesWorkflowInfo;
}
/**
* A template with also the full workflow definition
*/
export interface ITemplatesWorkflowFull extends ITemplatesWorkflowResponse {
full: true;
}
export interface ITemplatesQuery {
categories: string[];
search: string;
}
export interface ITemplatesCategory {
id: number;
name: string;
}
export type WorkflowCallerPolicyDefaultOption = 'any' | 'none' | 'workflowsFromAList';
export interface IWorkflowSettings extends IWorkflowSettingsWorkflow {
errorWorkflow?: string;
saveManualExecutions?: boolean;
timezone?: string;
executionTimeout?: number;
maxExecutionTimeout?: number;
callerIds?: string;
callerPolicy?: WorkflowSettings.CallerPolicy;
executionOrder: NonNullable<IWorkflowSettingsWorkflow['executionOrder']>;
}
export interface ITimeoutHMS {
hours: number;
minutes: number;
seconds: number;
}
export type WorkflowTitleStatus = 'EXECUTING' | 'IDLE' | 'ERROR' | 'DEBUG';
export type ExtractActionKeys<T> = T extends SimplifiedNodeType ? T['name'] : never;
export type ActionsRecord<T extends SimplifiedNodeType[]> = {
[K in ExtractActionKeys<T[number]>]: ActionTypeDescription[];
};
export type SimplifiedNodeType = Pick<
INodeTypeDescription,
| 'displayName'
| 'description'
| 'name'
| 'group'
| 'icon'
| 'iconUrl'
| 'iconColor'
| 'badgeIconUrl'
| 'codex'
| 'defaults'
| 'outputs'
> & {
tag?: string;
};
export interface SubcategoryItemProps {
description?: string;
iconType?: string;
icon?: string;
iconProps?: {
color?: string;
};
panelClass?: string;
title?: string;
subcategory?: string;
defaults?: INodeParameters;
forceIncludeNodes?: string[];
sections?: string[];
}
export interface ViewItemProps {
title: string;
description: string;
icon: string;
tag?: NodeCreatorTag;
borderless?: boolean;
}
export interface LabelItemProps {
key: string;
}
export interface LinkItemProps {
url: string;
key: string;
newTab?: boolean;
title: string;
description: string;
icon: string;
tag?: NodeCreatorTag;
}
export interface ActionTypeDescription extends SimplifiedNodeType {
displayOptions?: IDisplayOptions;
values?: IDataObject;
actionKey: string;
codex: {
label: string;
categories: string[];
};
}
export interface CategoryItemProps {
name: string;
count: number;
}
export interface CreateElementBase {
uuid?: string;
key: string;
}
export interface NodeCreateElement extends CreateElementBase {
type: 'node';
subcategory: string;
properties: SimplifiedNodeType;
}
export interface CategoryCreateElement extends CreateElementBase {
type: 'category';
subcategory: string;
properties: CategoryItemProps;
}
export interface SubcategoryCreateElement extends CreateElementBase {
type: 'subcategory';
properties: SubcategoryItemProps;
}
export interface SectionCreateElement extends CreateElementBase {
type: 'section';
title: string;
children: INodeCreateElement[];
}
export interface ViewCreateElement extends CreateElementBase {
type: 'view';
properties: ViewItemProps;
}
export interface LabelCreateElement extends CreateElementBase {
type: 'label';
subcategory: string;
properties: LabelItemProps;
}
export interface LinkCreateElement extends CreateElementBase {
type: 'link';
properties: LinkItemProps;
}
export interface ActionCreateElement extends CreateElementBase {
type: 'action';
subcategory: string;
properties: ActionTypeDescription;
}
export type INodeCreateElement =
| NodeCreateElement
| CategoryCreateElement
| SubcategoryCreateElement
| SectionCreateElement
| ViewCreateElement
| LabelCreateElement
| ActionCreateElement
| LinkCreateElement;
export interface SubcategorizedNodeTypes {
[subcategory: string]: INodeCreateElement[];
}
export interface ITag {
id: string;
name: string;
usageCount?: number;
createdAt?: string;
updatedAt?: string;
}
export interface ITagRow {
tag?: ITag;
usage?: string;
create?: boolean;
disable?: boolean;
update?: boolean;
delete?: boolean;
canDelete?: boolean;
}
export interface IVersion {
name: string;
nodes: IVersionNode[];
createdAt: string;
description: string;
documentationUrl: string;
hasBreakingChange: boolean;
hasSecurityFix: boolean;
hasSecurityIssue: boolean;
securityIssueFixVersion: string;
}
export interface IVersionNode {
name: string;
displayName: string;
icon: string;
iconUrl?: string;
defaults: INodeParameters;
iconData: {
type: string;
icon?: string;
fileBuffer?: string;
};
typeVersion?: number;
}
export interface ITemplatesNode extends IVersionNode {
id: number;
categories?: ITemplatesCategory[];
}
export interface INodeMetadata {
parametersLastUpdatedAt?: number;
pristine: boolean;
}
export interface IUsedCredential {
id: string;
name: string;
credentialType: string;
currentUserHasAccess: boolean;
homeProject?: ProjectSharingData;
sharedWithProjects?: ProjectSharingData[];
}
export interface WorkflowsState {
activeExecutions: IExecutionsCurrentSummaryExtended[];
activeWorkflows: string[];
activeWorkflowExecution: ExecutionSummary | null;
currentWorkflowExecutions: ExecutionSummary[];
activeExecutionId: string | null;
executingNode: string[];
executionWaitingForWebhook: boolean;
finishedExecutionsCount: number;
nodeMetadata: NodeMetadataMap;
subWorkflowExecutionError: Error | null;
usedCredentials: Record<string, IUsedCredential>;
workflow: IWorkflowDb;
workflowExecutionData: IExecutionResponse | null;
workflowExecutionPairedItemMappings: { [itemId: string]: Set<string> };
workflowsById: IWorkflowsMap;
chatMessages: string[];
isInDebugMode?: boolean;
}
export interface RootState {
baseUrl: string;
restEndpoint: string;
defaultLocale: string;
endpointForm: string;
endpointFormTest: string;
endpointFormWaiting: string;
endpointWebhook: string;
endpointWebhookTest: string;
pushConnectionActive: boolean;
timezone: string;
executionTimeout: number;
maxExecutionTimeout: number;
versionCli: string;
oauthCallbackUrls: object;
n8nMetadata: {
[key: string]: string | number | undefined;
};
pushRef: string;
urlBaseWebhook: string;
urlBaseEditor: string;
instanceId: string;
isNpmAvailable: boolean;
binaryDataMode: 'default' | 'filesystem' | 's3';
}
export interface NodeMetadataMap {
[nodeName: string]: INodeMetadata;
}
export interface IRootState {
activeExecutions: IExecutionsCurrentSummaryExtended[];
activeWorkflows: string[];
activeActions: string[];
activeCredentialType: string | null;
baseUrl: string;
defaultLocale: string;
endpointForm: string;
endpointFormTest: string;
endpointFormWaiting: string;
endpointWebhook: string;
endpointWebhookTest: string;
executionId: string | null;
executingNode: string[];
executionWaitingForWebhook: boolean;
pushConnectionActive: boolean;
saveDataErrorExecution: string;
saveDataSuccessExecution: string;
saveManualExecutions: boolean;
timezone: string;
stateIsDirty: boolean;
executionTimeout: number;
maxExecutionTimeout: number;
versionCli: string;
oauthCallbackUrls: object;
n8nMetadata: object;
workflowExecutionData: IExecutionResponse | null;
workflowExecutionPairedItemMappings: { [itemId: string]: Set<string> };
lastSelectedNode: string | null;
lastSelectedNodeOutputIndex: number | null;
nodeViewOffsetPosition: XYPosition;
nodeViewMoveInProgress: boolean;
selectedNodes: INodeUi[];
pushRef: string;
urlBaseEditor: string;
urlBaseWebhook: string;
workflow: IWorkflowDb;
workflowsById: IWorkflowsMap;
sidebarMenuItems: IMenuItem[];
instanceId: string;
nodeMetadata: NodeMetadataMap;
isNpmAvailable: boolean;
subworkflowExecutionError: Error | null;
binaryDataMode: string;
}
export interface CommunityPackageMap {
[name: string]: PublicInstalledPackage;
}
export interface ICredentialTypeMap {
[name: string]: ICredentialType;
}
export interface ICredentialMap {
[name: string]: ICredentialsResponse;
}
export interface ICredentialsState {
credentialTypes: ICredentialTypeMap;
credentials: ICredentialMap;
}
export interface ITagsState {
tags: { [id: string]: ITag };
loading: boolean;
fetchedAll: boolean;
fetchedUsageCount: boolean;
}
export type Modals = {
[CREDENTIAL_EDIT_MODAL_KEY]: NewCredentialsModal;
[key: string]: ModalState;
};
export type ModalKey = keyof Modals;
export type ModalState = {
open: boolean;
mode?: string | null;
data?: Record<string, unknown>;
activeId?: string | null;
curlCommand?: string;
httpNodeParameters?: string;
};
export interface NewCredentialsModal extends ModalState {
showAuthSelector?: boolean;
}
export type IRunDataDisplayMode = 'table' | 'json' | 'binary' | 'schema' | 'html' | 'ai';
export type NodePanelType = 'input' | 'output';
export interface TargetItem {
nodeName: string;
itemIndex: number;
runIndex: number;
outputIndex: number;
}
export interface NDVState {
activeNodeName: string | null;
mainPanelDimensions: { [key: string]: { [key: string]: number } };
pushRef: string;
input: {
displayMode: IRunDataDisplayMode;
nodeName?: string;
run?: number;
branch?: number;
data: {
isEmpty: boolean;
};
};
output: {
branch?: number;
displayMode: IRunDataDisplayMode;
data: {
isEmpty: boolean;
};
editMode: {
enabled: boolean;
value: string;
};
};
focusedMappableInput: string;
focusedInputPath: string;
mappingTelemetry: { [key: string]: string | number | boolean };
hoveringItem: null | TargetItem;
expressionOutputItemIndex: number;
draggable: {
isDragging: boolean;
type: string;
data: string;
dimensions: DOMRect | null;
activeTarget: { id: string; stickyPosition: null | XYPosition } | null;
};
isMappingOnboarded: boolean;
isTableHoverOnboarded: boolean;
isAutocompleteOnboarded: boolean;
highlightDraggables: boolean;
}
export interface NotificationOptions extends Partial<ElementNotificationOptions> {
message: string | ElementNotificationOptions['message'];
}
export type IFakeDoor = {
id: FAKE_DOOR_FEATURES;
featureName: BaseTextKey;
icon?: string;
infoText?: BaseTextKey;
actionBoxTitle: BaseTextKey;
actionBoxDescription: BaseTextKey;
actionBoxButtonLabel?: BaseTextKey;
linkURL: string;
uiLocations: IFakeDoorLocation[];
};
export type IFakeDoorLocation =
| 'settings'
| 'settings/users'
| 'credentialsModal'
| 'workflowShareModal';
export type NodeFilterType =
| typeof REGULAR_NODE_CREATOR_VIEW
| typeof TRIGGER_NODE_CREATOR_VIEW
| typeof AI_NODE_CREATOR_VIEW
| typeof AI_OTHERS_NODE_CREATOR_VIEW;
export type NodeCreatorOpenSource =
| ''
| 'context_menu'
| 'no_trigger_execution_tooltip'
| 'plus_endpoint'
| 'add_input_endpoint'
| 'trigger_placeholder_button'
| 'tab'
| 'node_connection_action'
| 'node_connection_drop'
| 'notice_error_message'
| 'add_node_button';
export interface INodeCreatorState {
itemsFilter: string;
showScrim: boolean;
rootViewHistory: NodeFilterType[];
selectedView: NodeFilterType;
openSource: NodeCreatorOpenSource;
}
export interface ISettingsState {
initialized: boolean;
settings: IN8nUISettings;
userManagement: IUserManagementSettings;
templatesEndpointHealthy: boolean;
api: {
enabled: boolean;
latestVersion: number;
path: string;
swaggerUi: {
enabled: boolean;
};
};
ldap: {
loginLabel: string;
loginEnabled: boolean;
};
saml: {
loginLabel: string;
loginEnabled: boolean;
};
mfa: {
enabled: boolean;
};
saveDataErrorExecution: WorkflowSettings.SaveDataExecution;
saveDataSuccessExecution: WorkflowSettings.SaveDataExecution;
saveManualExecutions: boolean;
saveDataProgressExecution: boolean;
}
export type NodeTypesByTypeNameAndVersion = {
[nodeType: string]: {
[version: number]: INodeTypeDescription;
};
};
export interface INodeTypesState {
nodeTypes: NodeTypesByTypeNameAndVersion;
}
export interface ITemplateState {
categories: ITemplatesCategory[];
collections: { [id: string]: ITemplatesCollection };
workflows: { [id: string]: ITemplatesWorkflow | ITemplatesWorkflowFull };
workflowSearches: {
[search: string]: {
workflowIds: string[];
totalWorkflows: number;
loadingMore?: boolean;
categories?: ITemplatesCategory[];
};
};
collectionSearches: {
[search: string]: {
collectionIds: string[];
};
};
currentSessionId: string;
previousSessionId: string;
currentN8nPath: string;
}
export interface IVersionsState {
versionNotificationSettings: IVersionNotificationSettings;
nextVersions: IVersion[];
currentVersion: IVersion | undefined;
}
export interface IWorkflowsState {
currentWorkflowExecutions: ExecutionSummary[];
activeWorkflowExecution: ExecutionSummary | null;
finishedExecutionsCount: number;
}
export interface IWorkflowsMap {
[name: string]: IWorkflowDb;
}
export interface CommunityNodesState {
availablePackageCount: number;
installedPackages: CommunityPackageMap;
}
export interface IRestApiContext {
baseUrl: string;
pushRef: string;
}
export interface IZoomConfig {
scale: number;
offset: XYPosition;
origin?: XYPosition;
}
export interface IBounds {
minX: number;
minY: number;
maxX: number;
maxY: number;
}
export type ILogInStatus = 'LoggedIn' | 'LoggedOut';
export interface IInviteResponse {
user: {
id: string;
email: string;
emailSent: boolean;
inviteAcceptUrl: string;
};
error?: string;
}
export interface ITab {
value: string | number;
label?: string;
href?: string;
icon?: string;
align?: 'right';
tooltip?: string;
}
export interface ITabBarItem {
value: string;
label: string;
disabled?: boolean;
}
export interface IResourceLocatorResultExpanded extends INodeListSearchItems {
linkAlt?: string;
}
export interface CurlToJSONResponse {
'parameters.url': string;
'parameters.authentication': string;
'parameters.method': string;
'parameters.sendHeaders': boolean;
'parameters.headerParameters.parameters.0.name': string;
'parameters.headerParameters.parameters.0.value': string;
'parameters.sendQuery': boolean;
'parameters.sendBody': boolean;
}
export interface HistoryState {
redoStack: Undoable[];
undoStack: Undoable[];
currentBulkAction: BulkCommand | null;
bulkInProgress: boolean;
}
export type Basic = string | number | boolean;
export type Primitives = Basic | bigint | symbol;
export type Optional<T> = T | undefined | null;
export type SchemaType =
| 'string'
| 'number'
| 'boolean'
| 'bigint'
| 'symbol'
| 'array'
| 'object'
| 'function'
| 'null'
| 'undefined';
export interface ILdapSyncData {
id: number;
startedAt: string;
endedAt: string;
created: number;
updated: number;
disabled: number;
scanned: number;
status: string;
error: string;
runMode: string;
}
export interface ILdapSyncTable {
status: string;
endedAt: string;
runTime: string;
runMode: string;
details: string;
}
export interface ILdapConfig {
loginEnabled: boolean;
loginLabel: string;
connectionUrl: string;
allowUnauthorizedCerts: boolean;
connectionSecurity: string;
connectionPort: number;
baseDn: string;
bindingAdminDn: string;
bindingAdminPassword: string;
firstNameAttribute: string;
lastNameAttribute: string;
emailAttribute: string;
loginIdAttribute: string;
ldapIdAttribute: string;
userFilter: string;
synchronizationEnabled: boolean;
synchronizationInterval: number; // minutes
searchPageSize: number;
searchTimeout: number;
}
export type Schema = { type: SchemaType; key?: string; value: string | Schema[]; path: string };
export type UsageState = {
loading: boolean;
data: {
usage: {
executions: {
limit: number; // -1 for unlimited, from license
value: number;
warningThreshold: number; // hardcoded value in BE
};
};
license: {
planId: string; // community
planName: string; // defaults to Community
};
managementToken?: string;
};
};
export type NodeAuthenticationOption = {
name: string;
value: string;
displayOptions?: IDisplayOptions;
};
export declare namespace DynamicNodeParameters {
interface BaseRequest {
path: string;
nodeTypeAndVersion: INodeTypeNameVersion;
currentNodeParameters: INodeParameters;
methodName?: string;
credentials?: INodeCredentials;
}
interface OptionsRequest extends BaseRequest {
loadOptions?: ILoadOptions;
}
interface ResourceLocatorResultsRequest extends BaseRequest {
methodName: string;
filter?: string;
paginationToken?: string;
}
interface ResourceMapperFieldsRequest extends BaseRequest {
methodName: string;
}
interface ActionResultRequest extends BaseRequest {
handler: string;
payload: IDataObject | string | undefined;
}
}
export interface EnvironmentVariable {
id: string;
key: string;
value: string;
}
export type ExecutionFilterMetadata = {
key: string;
value: string;
};
export type ExecutionFilterType = {
status: string;
workflowId: string;
startDate: string | Date;
endDate: string | Date;
tags: string[];
metadata: ExecutionFilterMetadata[];
};
export type ExecutionsQueryFilter = {
status?: ExecutionStatus[];
workflowId?: string;
finished?: boolean;
waitTill?: boolean;
metadata?: Array<{ key: string; value: string }>;
startedAfter?: string;
startedBefore?: string;
};
export type SamlAttributeMapping = {
email: string;
firstName: string;
lastName: string;
userPrincipalName: string;
};
export type SamlLoginBinding = 'post' | 'redirect';
export type SamlSignatureConfig = {
prefix: 'ds';
location: {
reference: '/samlp:Response/saml:Issuer';
action: 'after';
};
};
export type SamlPreferencesLoginEnabled = {
loginEnabled: boolean;
};
export type SamlPreferences = {
mapping?: SamlAttributeMapping;
metadata?: string;
metadataUrl?: string;
ignoreSSL?: boolean;
loginBinding?: SamlLoginBinding;
acsBinding?: SamlLoginBinding;
authnRequestsSigned?: boolean;
loginLabel?: string;
wantAssertionsSigned?: boolean;
wantMessageSigned?: boolean;
signatureConfig?: SamlSignatureConfig;
} & PartialBy<SamlPreferencesLoginEnabled, 'loginEnabled'>;
export type SamlPreferencesExtractedData = {
entityID: string;
returnUrl: string;
};
export type SshKeyTypes = ['ed25519', 'rsa'];
export type SourceControlPreferences = {
connected: boolean;
repositoryUrl: string;
branchName: string;
branches: string[];
branchReadOnly: boolean;
branchColor: string;
publicKey?: string;
keyGeneratorType?: TupleToUnion<SshKeyTypes>;
currentBranch?: string;
};
export interface SourceControlStatus {
ahead: number;
behind: number;
conflicted: string[];
created: string[];
current: string;
deleted: string[];
detached: boolean;
files: Array<{
path: string;
index: string;
working_dir: string;
}>;
modified: string[];
not_added: string[];
renamed: string[];
staged: string[];
tracking: null;
}
export interface SourceControlAggregatedFile {
conflict: boolean;
file: string;
id: string;
location: string;
name: string;
status: string;
type: string;
updatedAt?: string;
}
export declare namespace Cloud {
export interface PlanData {
planId: number;
monthlyExecutionsLimit: number;
activeWorkflowsLimit: number;
credentialsLimit: number;
isActive: boolean;
displayName: string;
expirationDate: string;
metadata: PlanMetadata;
}
export interface PlanMetadata {
version: 'v1';
group: 'opt-out' | 'opt-in' | 'trial';
slug: 'pro-1' | 'pro-2' | 'starter' | 'trial-1';
trial?: Trial;
}
interface Trial {
length: number;
gracePeriod: number;
}
export type UserAccount = {
confirmed: boolean;
username: string;
email: string;
hasEarlyAccess?: boolean;
role?: string;
};
}
export interface CloudPlanState {
initialized: boolean;
data: Cloud.PlanData | null;
usage: InstanceUsage | null;
loadingPlan: boolean;
}
export interface InstanceUsage {
timeframe?: string;
executions: number;
activeWorkflows: number;
}
export type CloudPlanAndUsageData = Cloud.PlanData & { usage: InstanceUsage };
export interface ExternalSecretsProviderSecret {
key: string;
}
export type ExternalSecretsProviderData = Record<string, IUpdateInformation['value']>;
export type ExternalSecretsProviderProperty = INodeProperties;
export type ExternalSecretsProviderState = 'connected' | 'tested' | 'initializing' | 'error';
export interface ExternalSecretsProvider {
icon: string;
name: string;
displayName: string;
connected: boolean;
connectedAt: string | false;
state: ExternalSecretsProviderState;
data?: ExternalSecretsProviderData;
properties?: ExternalSecretsProviderProperty[];
}
export type CloudUpdateLinkSourceType =
| 'advanced-permissions'
| 'canvas-nav'
| 'custom-data-filter'
| 'workflow_sharing'
| 'credential_sharing'
| 'settings-n8n-api'
| 'audit-logs'
| 'ldap'
| 'log-streaming'
| 'source-control'
| 'sso'
| 'usage_page'
| 'settings-users'
| 'variables'
| 'community-nodes'
| 'workflow-history'
| 'worker-view'
| 'external-secrets'
| 'rbac'
| 'debug';
export type UTMCampaign =
| 'upgrade-custom-data-filter'
| 'upgrade-canvas-nav'
| 'upgrade-workflow-sharing'
| 'upgrade-credentials-sharing'
| 'upgrade-api'
| 'upgrade-audit-logs'
| 'upgrade-ldap'
| 'upgrade-log-streaming'
| 'upgrade-source-control'
| 'upgrade-sso'
| 'open'
| 'upgrade-users'
| 'upgrade-variables'
| 'upgrade-community-nodes'
| 'upgrade-workflow-history'
| 'upgrade-advanced-permissions'
| 'upgrade-worker-view'
| 'upgrade-external-secrets'
| 'upgrade-rbac'
| 'upgrade-debug';
export type N8nBanners = {
[key in BannerName]: {
priority: number;
component: Component;
};
};
export type AddedNode = {
type: string;
openDetail?: boolean;
isAutoAdd?: boolean;
} & Partial<INodeUi>;
export type AddedNodeConnection = {
from: { nodeIndex: number; outputIndex?: number; type?: NodeConnectionType };
to: { nodeIndex: number; inputIndex?: number; type?: NodeConnectionType };
};
export type AddedNodesAndConnections = {
nodes: AddedNode[];
connections: AddedNodeConnection[];
};
export type ToggleNodeCreatorOptions = {
createNodeActive: boolean;
source?: NodeCreatorOpenSource;
nodeCreatorView?: NodeFilterType;
};
export type AppliedThemeOption = 'light' | 'dark';
export type ThemeOption = AppliedThemeOption | 'system';
export type NewConnectionInfo = {
sourceId: string;
index: number;
eventSource: NodeCreatorOpenSource;
connection?: Connection;
nodeCreatorView?: NodeFilterType;
outputType?: NodeConnectionType;
endpointUuid?: string;
};
export type EnterpriseEditionFeatureKey =
| 'AdvancedExecutionFilters'
| 'Sharing'
| 'Ldap'
| 'LogStreaming'
| 'Variables'
| 'Saml'
| 'SourceControl'
| 'ExternalSecrets'
| 'AuditLogs'
| 'DebugInEditor'
| 'WorkflowHistory'
| 'WorkerView'
| 'AdvancedPermissions';
export type EnterpriseEditionFeatureValue = keyof Omit<IN8nUISettings['enterprise'], 'projects'>;
export interface IN8nPromptResponse {
updated: boolean;
}