export type JsonValue = null | boolean | number | string | readonly JsonValue[] | { readonly [key: string]: JsonValue; }; export declare const resourceNameMaxLength = 80; export type ResourceNameIssue = 'controlCharacter' | 'empty' | 'specialCharacter' | 'tooLong'; export declare function resourceNameIssue(value: string): ResourceNameIssue | undefined; export interface PortDefinition { readonly description?: string; readonly jsonSchema: JsonValue; readonly nullable: boolean; } export interface InputPortDefinition extends PortDefinition { readonly value?: JsonValue; } export interface NodeSource { readonly kind: 'node'; readonly nodeId: string; readonly output: string; } export interface FlowSource { readonly input: string; readonly kind: 'flow'; } export interface BindingSource { readonly bindingId: string; readonly kind: 'binding'; } export type InputMapping = { readonly kind: 'sources'; readonly sources: readonly (BindingSource | FlowSource | NodeSource)[]; } | { readonly kind: 'value'; readonly value: JsonValue; }; export interface OutputMapping { readonly sources: readonly (FlowSource | NodeSource)[]; } interface GraphNodeBase { readonly concurrency: number; readonly description?: string; readonly inputs: Readonly>; readonly name?: string; readonly timeoutMs?: number; } export interface SubflowNode extends GraphNodeBase { readonly kind: 'subflow'; readonly subflowId: string; } export interface ValueNode extends GraphNodeBase { readonly kind: 'value'; readonly values: Readonly>; } export type ConditionOperator = '!=' | '<' | '<=' | '==' | '>' | '>=' | 'contains' | 'endsWith' | 'hasKey' | 'hasValue' | 'isEmpty' | 'isFalse' | 'isNotEmpty' | 'isNotNull' | 'isNull' | 'isTrue' | 'notContains' | 'notHasKey' | 'notHasValue' | 'startsWith'; export interface ConditionExpression { readonly input: string; readonly operator: ConditionOperator; readonly value?: JsonValue; } export interface ConditionCase { readonly expressions: readonly ConditionExpression[]; readonly output: string; readonly relation: 'all' | 'any'; } export interface ConditionNode extends GraphNodeBase { readonly cases: readonly ConditionCase[]; readonly defaultOutput?: string; readonly input: InputPortDefinition & { readonly handle: string; }; readonly kind: 'condition'; } export type ManagedTaskExecutor = { readonly kind: 'connector'; readonly action: string; readonly connectionId?: string; } | { readonly kind: 'llm'; readonly mode: 'chat' | 'json'; }; export interface ConnectorCapability { readonly action: string; readonly connectionId: string; readonly kind: 'connector'; } interface TaskDefinitionBase { readonly inputs: Readonly>; readonly name: string; readonly outputs: Readonly>; } export interface InlineTaskDefinition extends TaskDefinitionBase { readonly capabilities?: readonly ConnectorCapability[]; readonly moduleId: string; } export interface ManagedTaskDefinition extends TaskDefinitionBase { readonly executor: ManagedTaskExecutor; } export type TaskDefinition = InlineTaskDefinition | ManagedTaskDefinition; export type TaskNode = GraphNodeBase & { readonly kind: 'task'; } & ({ readonly task: InlineTaskDefinition; readonly taskId?: never; } | { readonly task?: never; readonly taskId: string; }); export interface Graph { readonly nodes: Readonly>; } export type TriggerSchedule = { readonly expression: string; readonly timezone: string; readonly type: 'cron'; } | { readonly type: 'every'; readonly unit: 'day' | 'hour' | 'minute' | 'month' | 'week'; readonly value: number; }; interface TriggerKeySnapshotBase { readonly configSchema: JsonValue; readonly definitionVersion: number; readonly description: string; readonly displayName: string; readonly key: string; readonly name: string; readonly payloadSchema: JsonValue; readonly provider: string; } export type IntegrationEndpointMethod = 'DELETE' | 'GET' | 'HEAD' | 'PATCH' | 'POST' | 'PUT'; export type IntegrationBodyFormat = 'form' | 'json' | 'multipart' | 'text'; export interface IntegrationEndpointDeclaration { readonly body: { readonly allowArray: boolean; readonly allowEmpty: boolean; readonly formats: readonly IntegrationBodyFormat[]; }; readonly methods: readonly IntegrationEndpointMethod[]; readonly successStatus: number; } export type TriggerKeySnapshot = (TriggerKeySnapshotBase & { readonly type: 'poll'; }) | (TriggerKeySnapshotBase & { readonly endpoint: IntegrationEndpointDeclaration; readonly type: 'integration'; }); export interface WebhookInputDefinition extends InputPortDefinition { readonly handle: string; } export interface WebhookOptions { readonly allowedMethods?: readonly string[]; readonly allowedOrigins?: readonly string[]; readonly noResponseBody?: boolean; readonly responseData?: string; readonly responseHeaders?: Readonly>; readonly responseStatusCode?: number; } interface TriggerNodeBase { readonly description?: string; readonly name: string; } export type TriggerNode = (TriggerNodeBase & { readonly inputsDef: readonly WebhookInputDefinition[]; readonly kind: 'webhook'; readonly options?: WebhookOptions; }) | (TriggerNodeBase & { readonly cronTimes: readonly TriggerSchedule[]; readonly kind: 'cron'; }) | (TriggerNodeBase & { readonly bindingId: string; readonly config: Readonly>; readonly definition: TriggerKeySnapshot & { readonly type: 'poll'; }; readonly kind: 'poll'; readonly pollTimes: readonly TriggerSchedule[]; }) | (TriggerNodeBase & { readonly bindingId: string; readonly config: Readonly>; readonly definition: TriggerKeySnapshot & { readonly type: 'integration'; }; readonly kind: 'integration'; }); export type GraphNode = ConditionNode | SubflowNode | TaskNode | TriggerNode | ValueNode; export interface ProjectDocument { readonly bindings: Readonly>; readonly flows: Readonly>; readonly subflows: Readonly>; readonly name: string; readonly outputs: Readonly>; }>>; readonly tasks: Readonly>; } export interface CodeModule { readonly imports: readonly string[]; readonly name: string; readonly source: string; } export interface RevisionContent { readonly document: ProjectDocument; readonly modelVersion: 1; readonly modules: Readonly>; } export type GraphTarget = { readonly id: string; readonly kind: 'flow'; } | { readonly id: string; readonly kind: 'subflow'; }; export interface GraphEdge { readonly source: string; readonly sourceHandle: string; readonly target: string; readonly targetHandle: string; } export type ChangeOperation = { readonly binding: ProjectDocument['bindings'][string]; readonly bindingId: string; readonly kind: 'binding.create'; } | { readonly binding: ProjectDocument['bindings'][string]; readonly bindingId: string; readonly kind: 'binding.replace'; } | { readonly bindingId: string; readonly kind: 'binding.delete'; } | { readonly flow: ProjectDocument['flows'][string]; readonly flowId: string; readonly kind: 'flow.create'; } | { readonly flowId: string; readonly kind: 'flow.delete'; } | { readonly flowId: string; readonly kind: 'flow.rename'; readonly name: string; } | { readonly kind: 'graph.edge.connect'; readonly edge: GraphEdge; readonly target: GraphTarget; } | { readonly kind: 'graph.edge.disconnect'; readonly edge: GraphEdge; readonly target: GraphTarget; } | { readonly kind: 'graph.node.create'; readonly node: GraphNode; readonly nodeId: string; readonly target: GraphTarget; } | { readonly kind: 'graph.node.delete'; readonly nodeId: string; readonly target: GraphTarget; } | { readonly kind: 'graph.node.replace'; readonly node: GraphNode; readonly nodeId: string; readonly target: GraphTarget; } | { readonly kind: 'module.create'; readonly module: CodeModule; readonly moduleId: string; } | { readonly kind: 'module.delete'; readonly moduleId: string; } | { readonly kind: 'module.rename'; readonly moduleId: string; readonly name: string; } | { readonly imports: readonly string[]; readonly kind: 'module.source.replace'; readonly moduleId: string; readonly source: string; } | { readonly kind: 'subflow.create'; readonly subflow: ProjectDocument['subflows'][string]; readonly subflowId: string; } | { readonly definition: Omit; readonly kind: 'subflow.definition.replace'; readonly subflowId: string; } | { readonly kind: 'subflow.delete'; readonly subflowId: string; } | { readonly kind: 'task.create'; readonly task: ProjectDocument['tasks'][string]; readonly taskId: string; } | { readonly kind: 'task.delete'; readonly taskId: string; } | { readonly kind: 'task.replace'; readonly task: ProjectDocument['tasks'][string]; readonly taskId: string; }; export declare class ProjectChangeError extends Error { } export declare function applyProjectChanges(content: RevisionContent, operations: readonly ChangeOperation[]): RevisionContent; export {};