import type { LGraphGroup as TLGraphGroup, LGraphNode as TLGraphNode, IWidget, SerializedLGraphNode, LGraph as TLGraph, LGraphCanvas as TLGraphCanvas, LiteGraph as TLiteGraph } from "./litegraph.js"; import type {Constructor, SerializedGraph} from './index.js'; declare global { const LiteGraph: typeof TLiteGraph; const LGraph: typeof TLGraph; const LGraphNode: typeof TLGraphNode; const LGraphCanvas: typeof TLGraphCanvas; const LGraphGroup: typeof TLGraphGroup; } // @rgthree: Types on ComfyApp as needed. export interface ComfyApp { extensions: ComfyExtension[]; async queuePrompt(number?: number, batchCount = 1): Promise; graph: TLGraph; canvas: TLGraphCanvas; clean() : void; registerExtension(extension: ComfyExtension): void; getPreviewFormatParam(): string; getRandParam(): string; loadApiJson(apiData: {}, fileName: string): void; async graphToPrompt(graph?: TLGraph, clean?: boolean): Promise; // workflow: ComfyWorkflowInstance ??? async loadGraphData(graphData: {}, clean?: boolean, restore_view?: boolean, workflow?: any|null): Promise ui: { settings: { addSetting(config: {id: string, name: string, type: () => HTMLElement}) : void; } } // Just marking as any for now. menu?: any; } export interface ComfyWidget extends IWidget { // https://github.com/comfyanonymous/ComfyUI/issues/2193 Changes from SerializedLGraphNode to // LGraphNode... serializeValue(nodeType: TLGraphNode, index: number): Promise; afterQueued(): void; inputEl?: HTMLTextAreaElement; width: number; } export interface ComfyGraphNode extends TLGraphNode { getExtraMenuOptions: (node: TLGraphNode, options: ContextMenuItem[]) => void; onExecuted(message: any): void; } export interface ComfyNode extends TLGraphNode { comfyClass: string; } // @rgthree export interface ComfyNodeConstructor extends Constructor { static title: string; static type?: string; static comfyClass: string; } export type NodeMode = 0|1|2|3|4|undefined; export interface ComfyExtension { /** * The name of the extension */ name: string; /** * Allows any initialisation, e.g. loading resources. Called after the canvas is created but before nodes are added * @param app The ComfyUI app instance */ init?(app: ComfyApp): Promise; /** * Allows any additonal setup, called after the application is fully set up and running * @param app The ComfyUI app instance */ setup?(app: ComfyApp): Promise; /** * Called before nodes are registered with the graph * @param defs The collection of node definitions, add custom ones or edit existing ones * @param app The ComfyUI app instance */ addCustomNodeDefs?(defs: Record, app: ComfyApp): Promise; /** * Allows the extension to add custom widgets * @param app The ComfyUI app instance * @returns An array of {[widget name]: widget data} */ getCustomWidgets?( app: ComfyApp ): Promise< Record { widget?: IWidget; minWidth?: number; minHeight?: number }> >; /** * Allows the extension to add additional handling to the node before it is registered with LGraph * @rgthree changed nodeType from `typeof LGraphNode` to `ComfyNodeConstructor` * @param nodeType The node class (not an instance) * @param nodeData The original node object info config object * @param app The ComfyUI app instance */ beforeRegisterNodeDef?(nodeType: ComfyNodeConstructor, nodeData: ComfyObjectInfo, app: ComfyApp): Promise; /** * Allows the extension to register additional nodes with LGraph after standard nodes are added * @param app The ComfyUI app instance */ // @rgthree - add void for non async registerCustomNodes?(app: ComfyApp): void|Promise; /** * Allows the extension to modify a node that has been reloaded onto the graph. * If you break something in the backend and want to patch workflows in the frontend * This is the place to do this * @param node The node that has been loaded * @param app The ComfyUI app instance */ loadedGraphNode?(node: TLGraphNode, app: ComfyApp); /** * Allows the extension to run code after the constructor of the node * @param node The node that has been created * @param app The ComfyUI app instance */ nodeCreated?(node: TLGraphNode, app: ComfyApp); } export type ComfyObjectInfo = { name: string; display_name?: string; description?: string; category: string; input?: { required?: Record; optional?: Record; hidden?: Record; }; output?: string[]; output_name: string[]; // @rgthree output_node?: boolean; }; export type ComfyObjectInfoConfig = [string | any[]] | [string | any[], any]; // @rgthree type ComfyApiInputLink = [ /** The id string of the connected node. */ string, /** The output index. */ number, ] // @rgthree export type ComfyApiFormatNode = { "inputs": { [input_name: string]: string|number|boolean|ComfyApiInputLink, }, "class_type": string, "_meta": { "title": string, } } // @rgthree export type ComfyApiFormat = { [node_id: string]: ComfyApiFormatNode } // @rgthree export type ComfyApiPrompt = { workflow: SerializedGraph, output: ComfyApiFormat, } // @rgthree export type ComfyApiEventDetailStatus = { exec_info: { queue_remaining: number; }; }; // @rgthree export type ComfyApiEventDetailExecutionStart = { prompt_id: string; }; // @rgthree export type ComfyApiEventDetailExecuting = null | string; // @rgthree export type ComfyApiEventDetailProgress = { node: string; prompt_id: string; max: number; value: number; }; // @rgthree export type ComfyApiEventDetailExecuted = { node: string; prompt_id: string; output: any; }; // @rgthree export type ComfyApiEventDetailCached = { nodes: string[]; prompt_id: string; }; // @rgthree export type ComfyApiEventDetailExecuted = { prompt_id: string; node: string; output: any; }; // @rgthree export type ComfyApiEventDetailError = { prompt_id: string; exception_type: string; exception_message: string; node_id: string; node_type: string; node_id: string; traceback: string; executed: any[]; current_inputs: {[key: string]: (number[]|string[])}; current_outputs: {[key: string]: (number[]|string[])}; }