{"version":3,"file":"main.module.mjs","sources":["../../../node_modules/.pnpm/eventemitter3@5.0.1/node_modules/eventemitter3/index.js","../src/utils/misc.ts","../src/client/errors.ts","../src/client/WsClient.ts","../src/builtins.ts","../src/workflow/errors.ts","../src/utils/Disposable.ts","../src/client/Client.ts","../src/workflow/InvokedWorkflow.ts","../src/pipeline/types.ts","../src/workflow/Workflow.ts","../src/plugins/Plugin.ts","../src/plugins/LoginAuthPlugin.ts","../src/pipeline/base.ts","../src/pipeline/efficient.ts","../src/utils/arrayBuffer.ts","../src/utils/tools.ts","../src/main.ts"],"sourcesContent":["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n  , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n  Events.prototype = Object.create(null);\n\n  //\n  // This hack is needed because the `__proto__` property is still inherited in\n  // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n  //\n  if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n  this.fn = fn;\n  this.context = context;\n  this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('The listener must be a function');\n  }\n\n  var listener = new EE(fn, context || emitter, once)\n    , evt = prefix ? prefix + event : event;\n\n  if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n  else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n  else emitter._events[evt] = [emitter._events[evt], listener];\n\n  return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n  if (--emitter._eventsCount === 0) emitter._events = new Events();\n  else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n  this._events = new Events();\n  this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n  var names = []\n    , events\n    , name;\n\n  if (this._eventsCount === 0) return names;\n\n  for (name in (events = this._events)) {\n    if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n  }\n\n  if (Object.getOwnPropertySymbols) {\n    return names.concat(Object.getOwnPropertySymbols(events));\n  }\n\n  return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n  var evt = prefix ? prefix + event : event\n    , handlers = this._events[evt];\n\n  if (!handlers) return [];\n  if (handlers.fn) return [handlers.fn];\n\n  for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n    ee[i] = handlers[i].fn;\n  }\n\n  return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n  var evt = prefix ? prefix + event : event\n    , listeners = this._events[evt];\n\n  if (!listeners) return 0;\n  if (listeners.fn) return 1;\n  return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return false;\n\n  var listeners = this._events[evt]\n    , len = arguments.length\n    , args\n    , i;\n\n  if (listeners.fn) {\n    if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n    switch (len) {\n      case 1: return listeners.fn.call(listeners.context), true;\n      case 2: return listeners.fn.call(listeners.context, a1), true;\n      case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n      case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n      case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n      case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n    }\n\n    for (i = 1, args = new Array(len -1); i < len; i++) {\n      args[i - 1] = arguments[i];\n    }\n\n    listeners.fn.apply(listeners.context, args);\n  } else {\n    var length = listeners.length\n      , j;\n\n    for (i = 0; i < length; i++) {\n      if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n      switch (len) {\n        case 1: listeners[i].fn.call(listeners[i].context); break;\n        case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n        case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n        case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n        default:\n          if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n            args[j - 1] = arguments[j];\n          }\n\n          listeners[i].fn.apply(listeners[i].context, args);\n      }\n    }\n  }\n\n  return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n  return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n  return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return this;\n  if (!fn) {\n    clearEvent(this, evt);\n    return this;\n  }\n\n  var listeners = this._events[evt];\n\n  if (listeners.fn) {\n    if (\n      listeners.fn === fn &&\n      (!once || listeners.once) &&\n      (!context || listeners.context === context)\n    ) {\n      clearEvent(this, evt);\n    }\n  } else {\n    for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n      if (\n        listeners[i].fn !== fn ||\n        (once && !listeners[i].once) ||\n        (context && listeners[i].context !== context)\n      ) {\n        events.push(listeners[i]);\n      }\n    }\n\n    //\n    // Reset the array, or remove it completely if we have no more listeners.\n    //\n    if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n    else clearEvent(this, evt);\n  }\n\n  return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n  var evt;\n\n  if (event) {\n    evt = prefix ? prefix + event : event;\n    if (this._events[evt]) clearEvent(this, evt);\n  } else {\n    this._events = new Events();\n    this._eventsCount = 0;\n  }\n\n  return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n  module.exports = EventEmitter;\n}\n","export const uuidv4 = () =>\n  \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n    const r = (Math.random() * 16) | 0,\n      v = c === \"x\" ? r : (r & 0x3) | 0x8;\n    return v.toString(16);\n  });\n\nexport const isNone = (x: any): x is null | undefined =>\n  x === null || x === undefined;\nexport const debounce = <F extends (...args: any[]) => any>(\n  fn: F,\n  wait_ms: number,\n): ((...args: Parameters<F>) => void) => {\n  let timeout: any = null;\n  return (...args: Parameters<F>): void => {\n    if (timeout) clearTimeout(timeout);\n    timeout = setTimeout(() => fn(...args), wait_ms);\n  };\n};\n","import { ComfyUIClientResponseTypes } from \"./response.types\";\n\nexport class ClientError extends Error {\n  constructor(message: string) {\n    super(message);\n  }\n}\n\n// 等待 prompt 执行超时\nexport class PromptTimeoutError extends ClientError {\n  constructor(prompt_id: string, timeout_ms: number) {\n    super(`Prompt ${prompt_id} timed out after ${timeout_ms} ms`);\n  }\n}\n\n// enqueue prompt 错误\nexport class PromptEnqueueError extends ClientError {\n  constructor(resp: ComfyUIClientResponseTypes.QueuePromptError) {\n    const { error, node_errors } = resp;\n    const message =\n      typeof error === \"string\" ? error : error.errors?.[0].message;\n    const details_message = node_errors ? JSON.stringify(node_errors) : \"\";\n    super(`Failed to enqueue prompt: ${message}, details: ${details_message}`);\n  }\n}\n\n// client enqueue 参数错误\nexport class ClientEnqueueError extends ClientError {\n  constructor(err_msg: string) {\n    super(`Client enqueue error: ${err_msg}`);\n  }\n}\n\n// prompt_id 错误，没有找到对应的 prompt 在 history 中\nexport class PromptNotFoundError extends ClientError {\n  constructor(prompt_id: string) {\n    super(`Prompt [${prompt_id}] not found in history`);\n  }\n}\n\n// task 数据类型错误，可能是 comfyui api 版本变动\nexport class TaskDataTypeError extends ClientError {\n  constructor(task_data: any) {\n    // 此数据类型与预期不符，请尝试更新 comfyui version\n    super(\n      `Task data type error, please try updating comfyui version: ${JSON.stringify(task_data)}`,\n    );\n  }\n}\n// prompt 执行失败，状态不是 success\nexport class PromptExecutionFailedError extends ClientError {\n  constructor(prompt_id: string, status: string) {\n    super(`Prompt ${prompt_id} execution failed with status: ${status}`);\n  }\n}\n\n// client 请求执行失败\nexport class ClientRequestError extends ClientError {\n  constructor(err_msg: string) {\n    super(`Client request error: ${err_msg}`);\n  }\n}\n\n// client polling timeout\nexport class PollingTimeoutError extends ClientError {\n  constructor(timeout_ms: number) {\n    super(`Polling timed out after ${timeout_ms} ms`);\n  }\n}\n\n// client web socket timeout\nexport class WebSocketTimeoutError extends ClientError {\n  constructor(timeout_ms: number) {\n    super(`WebSocket timed out after ${timeout_ms} ms`);\n  }\n}\n\n// connect 参数错误\nexport class ConnectError extends ClientError {\n  constructor(err_msg: string) {\n    super(`Connect error: ${err_msg}`);\n  }\n}\n\n// 解析 ws 数据错误\nexport class WebSocketParseError extends ClientError {\n  constructor(err_msg: string) {\n    super(`WebSocket parse error: ${err_msg}`);\n  }\n}\n\n// http errors\nexport class HttpError extends Error {\n  status: number;\n  json: any;\n\n  constructor(message: string, status: number, json?: any) {\n    super(message);\n    this.name = \"HttpError\";\n    this.status = status;\n    this.json = json;\n  }\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport { ComfyUIClientEvents } from \"./ws.types\";\nimport { uuidv4 } from \"../utils/misc\";\nimport { IComfyApiConfig } from \"./types\";\nimport {\n  ConnectError,\n  HttpError,\n  PollingTimeoutError,\n  WebSocketParseError,\n  WebSocketTimeoutError,\n} from \"./errors\";\n\n/**\n * A client for interacting with the ComfyUI API server using WebSockets.\n *\n * NOTE: CORS policy: Request header field comfy-user is not allowed by Access-Control-Allow-Headers in preflight response. Please config.use empty string in browser.\n *\n * @example\n * ```typescript\n * const client = new WsClient({\n *  api_host: \"YOUR_API_HOST\"\n * });\n *\n * // Connect to the server\n * client.connect();\n *\n * // Listen for status updates\n * client.on(\"status\", (status) => {\n *   console.log(\"Status:\", status);\n * });\n *\n * // when done, close the client\n * client.close();\n */\nexport class WsClient {\n  static DEFAULT_API_HOST = \"127.0.0.1:8188\";\n  static DEFAULT_API_BASE = \"\";\n  static DEFAULT_USER = \"\";\n  static IS_BROWSER = typeof window !== \"undefined\";\n\n  static readBinaryData(buf: ArrayBuffer) {\n    const view = new DataView(buf);\n    const eventType = view.getUint32(0);\n    const imageType = view.getUint32(1);\n\n    switch (eventType) {\n      case 3: {\n        const decoder = new TextDecoder();\n        const data = buf.slice(4);\n        const nodeIdLength = view.getUint32(4);\n        return [\n          {\n            type: \"progress_text\",\n            data: {\n              nodeId: decoder.decode(data.slice(4, 4 + nodeIdLength)),\n              text: decoder.decode(data.slice(4 + nodeIdLength)),\n            },\n          },\n        ] as const;\n      }\n\n      case 1: {\n        const mimeTypes = {\n          1: \"image/jpeg\",\n          2: \"image/png\",\n        } as any;\n\n        const mime = mimeTypes[imageType] || \"image/png\";\n        const image = buf.slice(8);\n\n        const imageBlob = new Blob([image], {\n          type: mime,\n        });\n\n        return [\n          {\n            type: \"b_preview\",\n            data: imageBlob,\n          },\n        ] as const;\n      }\n\n      case 4: {\n        // PREVIEW_IMAGE_WITH_METADATA\n        const decoder4 = new TextDecoder();\n        const metadataLength = view.getUint32(4);\n        const metadataBytes = buf.slice(8, 8 + metadataLength);\n        const metadata = JSON.parse(decoder4.decode(metadataBytes));\n        const imageData4 = buf.slice(8 + metadataLength);\n\n        let imageMime4 = metadata.image_type;\n\n        const imageBlob4 = new Blob([imageData4], {\n          type: imageMime4,\n        });\n\n        return [\n          {\n            type: \"b_preview_with_metadata\",\n            data: {\n              blob: imageBlob4,\n              nodeId: metadata.node_id,\n              displayNodeId: metadata.display_node_id,\n              parentNodeId: metadata.parent_node_id,\n              realNodeId: metadata.real_node_id,\n              promptId: metadata.prompt_id,\n            },\n          },\n          {\n            type: \"b_preview\",\n            data: imageBlob4,\n          },\n        ] as const;\n      }\n      default:\n        throw new WebSocketParseError(\n          `Unknown binary websocket message of type ${eventType}`,\n        );\n    }\n  }\n\n  api_host: string;\n  api_base: string;\n  clientId?: string;\n  socket?: WebSocket | null;\n  WebSocket: typeof WebSocket;\n  ssl: boolean;\n  user: string;\n  fetch: typeof fetch;\n\n  events: EventEmitter<ComfyUIClientEvents & Record<string & {}, any>> =\n    new EventEmitter();\n\n  protected socket_callbacks: Record<string, any> = {};\n\n  get registered() {\n    return this.events.eventNames();\n  }\n\n  constructor(config: IComfyApiConfig) {\n    this.api_host = config.api_host ?? WsClient.DEFAULT_API_HOST;\n    this.api_base = config.api_base ?? WsClient.DEFAULT_API_BASE;\n    this.clientId = config.clientId ?? uuidv4();\n    this.WebSocket = config.WebSocket ?? globalThis.WebSocket;\n    this.ssl = config.ssl ?? false;\n    this.user = config.user ?? WsClient.DEFAULT_USER;\n    if (!globalThis.fetch) {\n      throw new ConnectError(\"fetch is not defined\");\n    }\n    this.fetch = config.fetch ?? globalThis.fetch.bind(globalThis);\n\n    if (!this.WebSocket) {\n      console.warn(\"No WebSocket implementation available, WebSocket disabled\");\n    }\n  }\n\n  /**\n   * Returns the headers for the API request.\n   *\n   * @param {RequestInit} [options] - (Optional) Additional options for the request.\n   * @return {HeadersInit} The headers for the API request.\n   */\n  apiHeaders(options?: RequestInit) {\n    const headers: HeadersInit = {\n      ...(this.user\n        ? {\n            \"Comfy-User\": this.user,\n          }\n        : {}),\n      // \"User-Agent\": `ComfyUIClient/${version}`,\n      Accept: \"*/*\",\n      ...(options?.headers ?? {}),\n    };\n    return headers;\n  }\n\n  /**\n   * Generates the URL for the API endpoint based on the provided route.\n   *\n   * @param {string} route - The route for the API endpoint.\n   * @return {string} The generated URL for the API endpoint.\n   */\n  apiURL(route: string): string {\n    const url = new URL(`http${this.ssl ? \"s\" : \"\"}://${this.api_host}`);\n    let [pathname, query] = (this.api_base + route).split(\"?\");\n    url.pathname = pathname;\n    url.pathname = url.pathname.replace(/\\/+/g, \"/\");\n    if (query) {\n      url.search = query;\n    }\n    if (this.clientId) {\n      url.searchParams.set(\"clientId\", this.clientId);\n    }\n    return url.toString();\n  }\n\n  internalURL(route: string): string {\n    return this.apiURL(`/internal${route}`);\n  }\n\n  /**\n   * Generates a URL for viewing a specific file with the given filename, subfolder, and type.\n   *\n   * @param {string} filename - The name of the file to view.\n   * @param {string} subfolder - The subfolder where the file is located.\n   * @param {string} type - The type of the file.\n   * @return {string} The URL for viewing the file.\n   */\n  viewURL(filename: string, subfolder: string, type: string): string {\n    const query = new URLSearchParams({\n      filename,\n      subfolder,\n      type,\n    }).toString();\n    return `http${this.ssl ? \"s\" : \"\"}://${this.api_host}${\n      this.api_base\n    }/view?${query}`;\n  }\n\n  /**\n   * Generates the WebSocket URL based on the current API host and SSL configuration.\n   *\n   * @return {string} The generated WebSocket URL.\n   */\n  wsURL(): string {\n    const url = new URL(`ws${this.ssl ? \"s\" : \"\"}://${this.api_host}`);\n    url.pathname = \"/ws\";\n    if (this.clientId) {\n      url.searchParams.set(\"clientId\", this.clientId);\n    }\n    return url.toString();\n  }\n\n  /**\n   * Fetches API data based on the provided route and options.\n   *\n   * NOTE: CORS policy: Request header field comfy-user is not allowed by Access-Control-Allow-Headers in preflight response. Please use empty string in browser.\n   *\n   * @param {string} route - The route for the API request.\n   * @param {RequestInit} [options] - (Optional) Additional options for the request.\n   * @return {Promise<Response>} A promise that resolves to the API response.\n   */\n  async fetchApi(route: string, options?: RequestInit): Promise<Response> {\n    const url = this.apiURL(route);\n    const res = await this.fetch(url, {\n      ...options,\n      headers: this.apiHeaders(options),\n    });\n    const { status, statusText } = res;\n\n    if (status < 200 || status >= 400) {\n      throw new HttpError(\n        `Endpoint Bad Request (${status} ${statusText}): ${url}`,\n        status,\n        await res.json(),\n      );\n    }\n\n    return res;\n  }\n\n  /**\n   * Adds an event listener for the specified event type.\n   *\n   * @param {keyof ComfyUIClientEvents | (string & {})} type - The type of event to listen for.\n   * @param {(...args: any) => void} callback - The callback function to be executed when the event is triggered.\n   * @param {any} options - (Optional) Additional options for the event listener.\n   * @return {() => void} A function that removes the event listener when called.\n   */\n  addEventListener<T extends EventEmitter.EventNames<ComfyUIClientEvents>>(\n    type: T,\n    callback: EventEmitter.EventListener<ComfyUIClientEvents, T>,\n    options?: any,\n  ) {\n    this.events.on(type as any, callback as any, options);\n\n    return () => {\n      this.events.off(type as any, callback as any);\n    };\n  }\n\n  /**\n   * Adds an event listener for the specified event type.\n   *\n   * @param {keyof ComfyUIClientEvents | (string & {})} type - The type of event to listen for.\n   * @param {(...args: any) => void} callback - The callback function to be executed when the event is triggered.\n   * @param {any} options - (Optional) Additional options for the event listener.\n   * @return {() => void} A function that removes the event listener when called.\n   */\n  on<T extends EventEmitter.EventNames<ComfyUIClientEvents>>(\n    type: T,\n    callback: EventEmitter.EventListener<ComfyUIClientEvents, T>,\n    options?: any,\n  ) {\n    return this.addEventListener(type, callback, options);\n  }\n\n  /**\n   * Adds an event listener for the specified event type.\n   *\n   * @param {keyof ComfyUIClientEvents | (string & {})} type - The type of event to listen for.\n   * @param {(...args: any) => void} callback - The callback function to be executed when the event is triggered.\n   * @param {any} options - (Optional) Additional options for the event listener.\n   * @return {() => void} A function that removes the event listener when called.\n   */\n  once<T extends EventEmitter.EventNames<ComfyUIClientEvents>>(\n    type: T,\n    callback: EventEmitter.EventListener<ComfyUIClientEvents, T>,\n    options?: any,\n  ) {\n    this.events.once(type as any, callback as any, options);\n\n    return () => {\n      this.events.off(type as any, callback as any);\n    };\n  }\n\n  protected _polling_timer: any = null;\n  protected _polling_interval = 1000;\n  /**\n   * Poll status for colab and other things that don't support websockets.\n   */\n  private startPollingQueue() {\n    if (this._polling_timer) {\n      return;\n    }\n    // FIXME: 优化点\n    // 这里不需要一直 polling ，只有有任务的时候才需要 polling\n    this._polling_timer = setInterval(async () => {\n      try {\n        const resp = await this.fetchApi(\"/prompt\");\n        const status = await resp.json();\n        this.events.emit(\"status\", status);\n      } catch (error) {\n        this.events.emit(\"status\", null);\n      }\n    }, this._polling_interval);\n  }\n\n  protected addSocketCallback<K extends keyof WebSocketEventMap>(\n    socket: WebSocket,\n    type: K,\n    listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any,\n    options?: boolean | AddEventListenerOptions,\n  ) {\n    this.socket_callbacks[type] = listener;\n    socket.addEventListener(type, listener, options);\n    return () => {\n      delete this.socket_callbacks[type];\n      socket.removeEventListener(type, listener, options);\n    };\n  }\n\n  /**\n   * Removes all event listeners from the given WebSocket and clears the socket_callbacks object.\n   */\n  protected removeSocketCallbacks() {\n    if (this.socket) {\n      for (const type in this.socket_callbacks) {\n        const listener = this.socket_callbacks[type];\n        this.socket.removeEventListener(type, listener);\n      }\n    }\n    this.socket_callbacks = {};\n  }\n\n  /**\n   * Creates and connects a WebSocket for realtime updates\n   * @param {boolean} isReconnect If the socket is connection is a reconnect attempt\n   */\n  private createSocket(isReconnect = false) {\n    if (this.socket) {\n      return;\n    }\n    if (!this.WebSocket) {\n      throw new ConnectError(\n        \"WebSocket is not defined, please provide a WebSocket implementation\",\n      );\n    }\n    if (this.closed) {\n      return;\n    }\n\n    let opened = false;\n\n    this.socket = new this.WebSocket(this.wsURL());\n    this.socket.binaryType = \"arraybuffer\";\n\n    this.addSocketCallback(this.socket, \"open\", () => {\n      opened = true;\n      if (isReconnect) {\n        this.events.emit(\"reconnected\");\n      } else {\n        this.events.emit(\"connected\");\n      }\n    });\n\n    this.addSocketCallback(this.socket, \"error\", (ev: Event) => {\n      // Expose websocket errors as unhandled events\n      // Allows for catching 404 and other network errors\n      const err = ev as ErrorEvent;\n      const is404Error = err.message?.includes(\"404\");\n\n      this.events.emit(\"connection_error\", {\n        type: \"404\",\n        message: err.message,\n      });\n\n      if (this.socket) this.socket.close();\n\n      if (!is404Error && !isReconnect && !opened) {\n        this.startPollingQueue();\n      }\n    });\n\n    this.addSocketCallback(this.socket, \"close\", () => {\n      setTimeout(() => {\n        this.socket = null;\n        this.createSocket(true);\n      }, 300);\n      if (opened) {\n        this.events.emit(\"status\", null);\n        this.events.emit(\"reconnecting\");\n      }\n    });\n\n    const isBinaryData = (event: MessageEvent) => {\n      if (typeof event.data === \"string\") {\n        return false;\n      }\n      if (ArrayBuffer && event.data instanceof ArrayBuffer) {\n        return true;\n      }\n      if (Buffer && Buffer.isBuffer(event.data)) {\n        return true;\n      }\n      return false;\n    };\n\n    this.addSocketCallback(this.socket, \"message\", async (event) => {\n      this.events.emit(\"message\", event);\n\n      if (isBinaryData(event)) {\n        const binaryEvents = WsClient.readBinaryData(event.data);\n        for (const ev of binaryEvents) {\n          switch (ev.type) {\n            case \"b_preview\": {\n              // TODO add types\n              this.events.emit(\"b_preview\", ev.data);\n              this.events.emit(\"image_data\", {\n                image: await ev.data.arrayBuffer(),\n                mime: ev.data.type,\n              });\n              break;\n            }\n            case \"b_preview_with_metadata\": {\n              // TODO add types\n              this.events.emit(\"b_preview_with_metadata\", ev.data);\n              this.events.emit(\"image_data\", {\n                image: await ev.data.blob.arrayBuffer(),\n                mime: ev.data.blob.type,\n              });\n              break;\n            }\n            case \"progress_text\": {\n              // TODO add types\n              this.events.emit(\"progress_text\", ev.data);\n              break;\n            }\n            default:\n              return;\n          }\n        }\n      } else {\n        const msg = JSON.parse(event.data);\n\n        switch (msg.type) {\n          case \"status\":\n            if (msg.data.sid) {\n              this.clientId = msg.data.sid;\n            }\n            this.events.emit(\"status\", msg.data.status);\n            break;\n          case \"progress\":\n            this.events.emit(\"progress\", msg.data);\n            break;\n          case \"executing\":\n            this.events.emit(\"executing\", msg.data);\n            break;\n          case \"executed\":\n            this.events.emit(\"executed\", msg.data);\n            break;\n          case \"execution_start\":\n            this.events.emit(\"execution_start\", msg.data);\n            break;\n          case \"execution_error\":\n            this.events.emit(\"execution_error\", msg.data);\n            break;\n          case \"execution_cached\":\n            this.events.emit(\"execution_cached\", msg.data);\n            break;\n          case \"execution_interrupted\":\n            this.events.emit(\"execution_interrupted\", msg.data);\n            break;\n          default:\n            this.events.emit(msg.type, msg.data);\n            break;\n        }\n\n        const is_unhandled_message =\n          msg.type !== \"message\" &&\n          this.registered.includes(msg.type) === false;\n        if (is_unhandled_message) {\n          this.events.emit(\"unhandled\", msg);\n        }\n      }\n    });\n  }\n\n  /**\n   * Initializes sockets and realtime updates\n   *\n   * @deprecated move to client.connect()\n   */\n  init() {\n    this.createSocket();\n  }\n\n  closed = false;\n  /**\n   * Closes the WebSocket connection and cleans up event listeners\n   */\n  close() {\n    if (this.closed) {\n      return;\n    }\n    this.closed = true;\n    this.events.emit(\"close\");\n\n    this.disconnect();\n    this.events.removeAllListeners();\n  }\n\n  /**\n   * Connects to the WebSocket server by creating a new socket connection.\n   *\n   * @param {Object} options - The options for connecting to the server.\n   * @param {Object} options.polling - The options for polling.\n   * @param {boolean} options.polling.enabled - Whether polling is enabled.\n   * @param {number} [options.polling.interval] - The interval for polling.\n   * @param {Object} options.websocket - The options for the WebSocket connection.\n   * @param {boolean} options.websocket.enabled - Whether the WebSocket connection is enabled.\n   * @param {number} [options.timeout_ms] - The timeout for the connection in milliseconds.\n   * @return {Promise<boolean>} - A promise that resolves to true if the connection was successful, false otherwise.\n   */\n  connect({\n    polling = {\n      enabled: false,\n    },\n    websocket = {\n      enabled: true,\n    },\n    timeout_ms = 15 * 1000,\n  }: {\n    polling?: {\n      enabled: boolean;\n      interval?: number;\n    };\n    websocket?: {\n      enabled: boolean;\n    };\n    timeout_ms?: number;\n  } = {}) {\n    if (polling?.enabled) {\n      this._polling_interval = polling.interval ?? this._polling_interval;\n      this.startPollingQueue();\n      return new Promise(async (resolve, reject) => {\n        const timer = setTimeout(() => {\n          reject(new PollingTimeoutError(timeout_ms));\n        }, timeout_ms);\n        // ping to ok or fail\n        const resp = await this.fetchApi(\"/system_stats\");\n        resolve(resp.ok && resp.status === 200);\n        clearTimeout(timer);\n      });\n    }\n    if (websocket?.enabled) {\n      this.createSocket();\n      return new Promise((resolve, reject) => {\n        const timer = setTimeout(() => {\n          reject(new WebSocketTimeoutError(timeout_ms));\n        }, timeout_ms);\n        this.once(\"connected\", () => {\n          resolve(true);\n          clearTimeout(timer);\n        });\n      });\n    }\n    throw new ConnectError(\"You must enable either polling or websocket\");\n  }\n\n  /**\n   * Disconnects the WebSocket connection and cleans up event listeners.\n   */\n  disconnect() {\n    if (!this.socket) {\n      process.nextTick(this._disconnectPolling.bind(this));\n    } else {\n      this._disconnectSocket();\n    }\n    this._disconnectPolling();\n  }\n\n  /**\n   * Disconnects the WebSocket connection and cleans up event listeners.\n   *\n   * @return {void} This function does not return anything.\n   */\n  _disconnectSocket() {\n    const { socket } = this;\n    if (!socket) return;\n    this.socket = null;\n    try {\n      if (socket.readyState === socket.OPEN) {\n        socket.close(1000, \"Client closed\");\n      }\n    } catch (error) {\n      // pass\n    }\n    this.removeSocketCallbacks();\n    if (\"removeAllListeners\" in socket) {\n      (socket.removeAllListeners as any)?.();\n    }\n  }\n\n  /**\n   * Disconnects the polling timer and sets it to null.\n   *\n   * @return {void}\n   */\n  _disconnectPolling() {\n    if (this._polling_timer !== null) {\n      clearInterval(this._polling_timer);\n      this._polling_timer = null;\n    }\n  }\n}\n","import { WorkflowOutputResolver } from \"./client/types\";\nimport { isNone } from \"./utils/misc\";\nimport { WorkflowOutput } from \"./workflow/types\";\n\nexport const RESOLVERS = {\n  image: ((acc, output, { client }) => {\n    if (output === null || output === undefined) {\n      return acc;\n    }\n\n    const output_images: {\n      filename?: string;\n      subfolder?: string;\n      type: string;\n    }[] = (output?.images || []) as any;\n\n    const images_url = output_images\n      .map((image) => {\n        const { filename, subfolder, type } = image;\n        const type_should_be = [\n          // SaveImage node output as \"output\"\n          \"output\",\n          // PreviewImage node output as \"temp\"\n          \"temp\",\n        ];\n        if (\n          isNone(filename) ||\n          isNone(subfolder) ||\n          !type_should_be.includes(type)\n        ) {\n          return null;\n        }\n        return client.viewURL(filename, subfolder, type);\n      })\n      .filter(Boolean) as string[];\n\n    const images = images_url.map((image) => ({\n      type: \"url\" as const,\n      data: image,\n    }));\n    return {\n      ...acc,\n      images: [...acc.images, ...images],\n    };\n  }) as WorkflowOutputResolver<WorkflowOutput>,\n};\n","import { ComfyUiWsTypes } from \"../client/ws.types\";\nimport { InvokedWorkflow } from \"./InvokedWorkflow\";\nimport { IWorkflow } from \"./types\";\nimport { Workflow } from \"./Workflow\";\n\nexport class WorkflowError extends Error {\n  constructor(\n    message: string,\n    readonly task_id: string,\n    readonly workflow?: IWorkflow,\n    readonly invoked?: InvokedWorkflow,\n  ) {\n    super(message);\n  }\n}\n\nexport class WorkflowExecutionError extends WorkflowError {\n  constructor(\n    readonly payload: ComfyUiWsTypes.Messages.ExecutionError,\n    task_id: string,\n    workflow?: IWorkflow,\n    invoked?: InvokedWorkflow<any>,\n  ) {\n    const { exception_message, exception_type } = payload;\n    super(\n      `Execution error: ${exception_message} (${exception_type})`,\n      task_id,\n      workflow,\n      invoked,\n    );\n  }\n}\n\nexport class ClientConnectionError extends Error {\n  constructor(type: string, message: string) {\n    super(`Client connection error (${type}): ${message}`);\n  }\n}\n\n// --- guard errors ---\nexport class WorkflowGuardError extends Error {\n  readonly workflow: IWorkflow;\n\n  constructor(\n    message: string,\n    readonly invoked: InvokedWorkflow<any>,\n  ) {\n    super(message);\n    this.workflow = invoked.workflow;\n  }\n}\n\n// \"This workflow is already enqueued\"\nexport class WorkflowEnqueuedError extends WorkflowGuardError {\n  constructor(invoked: InvokedWorkflow<any>) {\n    super(\"This workflow is already enqueued\", invoked);\n  }\n}\n\n// 工作流没有被 enqueued，或者执行状态还未更新，缺少 task_id\nexport class WorkflowTaskIdError extends WorkflowGuardError {\n  constructor(invoked: InvokedWorkflow<any>) {\n    super(\n      \"This workflow is not enqueued and the execution status cannot be interrupted\",\n      invoked,\n    );\n  }\n}\n\n// 工作流已经 disposed 或者已经 结束\nexport class WorkflowDoneError extends WorkflowGuardError {\n  constructor(invoked: InvokedWorkflow<any>) {\n    const { is_done, is_disposed } = invoked;\n    const message = is_done\n      ? \"This workflow has already finished\"\n      : \"This workflow has been disposed\";\n    super(message, invoked);\n  }\n}\n\n// ws 没有连接\nexport class WorkflowWsError extends WorkflowGuardError {\n  constructor(invoked: InvokedWorkflow<any>) {\n    super(\"WebSocket is not connected\", invoked);\n  }\n}\n\n// 无法获取 任务状态\nexport class WorkflowTaskStatusError extends WorkflowGuardError {\n  constructor(invoked: InvokedWorkflow<any>) {\n    const { task_id } = invoked;\n    super(\n      task_id\n        ? `Cannot get task status for task ${task_id}`\n        : \"Cannot get task status\",\n      invoked,\n    );\n  }\n}\n\n// 执行被 interrupted\nexport class WorkflowInterruptedError extends WorkflowGuardError {\n  constructor(invoked: InvokedWorkflow<any>) {\n    super(\"Execution has been interrupted\", invoked);\n  }\n}\n\n// 参数错误\nexport class WorkflowArgumentError extends WorkflowGuardError {\n  constructor(invoked: InvokedWorkflow<any>, message: string) {\n    super(message, invoked);\n  }\n}\n","export class Disposable {\n  protected _disposed = false;\n  protected _disposed_cbs = [] as any[];\n  public dispose() {\n    if (this._disposed) {\n      return;\n    }\n    this._disposed = true;\n\n    this._disposed_cbs.forEach((cb) => {\n      if (typeof cb === \"function\") {\n        cb();\n      }\n    });\n  }\n  public _connect(cb: () => void) {\n    if (this._disposed) {\n      cb();\n      return;\n    }\n    this._disposed_cbs.push(cb);\n  }\n}\n","import type { Plugin } from \"../plugins/Plugin\";\nimport { WsClient } from \"./WsClient\";\nimport { RESOLVERS } from \"../builtins\";\nimport {\n  WorkflowOutputResolver,\n  EnqueueOptions,\n  IComfyApiConfig,\n  PromptBody,\n  PromptQueueItem,\n  ModelFolderInfo,\n  ModelFile,\n  LogsRawResponse,\n} from \"./types\";\nimport { ComfyUIClientResponseTypes } from \"./response.types\";\nimport { WorkflowOutput } from \"../workflow/types\";\nimport { WorkflowExecutionError } from \"../workflow/errors\";\nimport {\n  ClientEnqueueError,\n  ClientRequestError,\n  PromptEnqueueError,\n  PromptExecutionFailedError,\n  PromptNotFoundError,\n  PromptTimeoutError,\n  TaskDataTypeError,\n} from \"./errors\";\nimport { Disposable } from \"../utils/Disposable\";\n\n/**\n * The Client class provides a high-level interface for interacting with the ComfyUI API.\n *\n * @extends WsClient\n *\n * @example\n * ```typescript\n * const client = new Client({\n *  api_host: \"YOUR_API_HOST\",\n *  clientId: \"YOUR_CLIENT_ID\",\n * });\n *\n * const extensions = await client.getEmbeddings();\n * console.log(extensions);\n * ```\n */\nexport class Client extends WsClient {\n  // NOTE: useless ... just for debug\n  private _plugins = [] as Plugin[];\n\n  constructor(\n    config: Omit<IComfyApiConfig, \"fetch\" | \"WebSocket\"> & {\n      // NOTE: This is written to reduce type issues... because sometimes `as any` is unavoidable\n      fetch?: any;\n      WebSocket?: any;\n    },\n  ) {\n    super(config);\n  }\n\n  /**\n   * Use a plugin by calling its install method on this instance.\n   *\n   * @param {Plugin} plugin - The plugin to install.\n   */\n  use(plugin: Plugin) {\n    plugin.install(this);\n    this._plugins.push(plugin);\n  }\n\n  /**\n   * Gets a list of extension urls\n   * @returns An array of script urls to import\n   */\n  async getExtensions(): Promise<string[]> {\n    const invoke = async () => {\n      const resp = await this.fetchApi(\"/extensions\", { cache: \"no-store\" });\n      return await resp.json();\n    };\n    return invoke();\n  }\n\n  /**\n   * Gets a list of embedding names\n   * @returns An array of script urls to import\n   */\n  async getEmbeddings(): Promise<string[]> {\n    const invoke = async () => {\n      const resp = await this.fetchApi(\"/embeddings\", { cache: \"no-store\" });\n      return await resp.json();\n    };\n    return invoke();\n  }\n\n  /**\n   * Loads node object definitions for the graph\n   * @returns {Promise<ComfyUIClientResponseTypes.ObjectInfo>} The object info for the graph\n   */\n  async getNodeDefs(): Promise<ComfyUIClientResponseTypes.ObjectInfo> {\n    const invoke = async () => {\n      const resp = await this.fetchApi(\"/object_info\", { cache: \"no-store\" });\n      const node_defs = await resp.json();\n      return node_defs;\n    };\n    return invoke();\n  }\n\n  /**\n   *\n   * @param {number} queue_index The index at which to queue the prompt, passing -1 will insert the prompt at the front of the queue\n   * @param {Object} options\n   * @param {Object} options.prompt The prompt to queue\n   * @param {Object} options.workflow This png info to be added to resulting image\n   * @returns {Promise<ComfyUIClientResponseTypes.QueuePrompt>} The response from the server\n   */\n  async queuePrompt(\n    queue_index: number,\n    { prompt, workflow }: { prompt: any; workflow: any },\n  ): Promise<ComfyUIClientResponseTypes.QueuePrompt> {\n    const body: Record<string, unknown> = {\n      client_id: this.clientId,\n      prompt,\n      extra_data: { extra_pnginfo: { workflow } },\n    };\n\n    if (queue_index === -1) {\n      body.front = true;\n    } else if (queue_index !== 0) {\n      body.number = queue_index;\n    }\n\n    const res = await this.fetchApi(\"/prompt\", {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify(body),\n    });\n\n    if (res.status !== 200) {\n      const error_resp = await res.text();\n      try {\n        const error_data = JSON.parse(error_resp);\n        throw new PromptEnqueueError(error_data);\n      } catch (error) {\n        throw new PromptEnqueueError({ error: error_resp, node_errors: {} });\n      }\n    }\n\n    return await res.json();\n  }\n\n  /**\n   * Loads a list of items (queue or history)\n   * @param {\"queue\" | \"history\"} type The type of items to load, queue or history\n   * @returns The items of the specified type grouped by their status\n   */\n  async getItems(type: \"history\"): ReturnType<Client[\"getHistory\"]>;\n  async getItems(type: \"queue\"): ReturnType<Client[\"getQueue\"]>;\n  async getItems(type: \"queue\" | \"history\"): Promise<any> {\n    if (type === \"queue\") {\n      return this.getQueue();\n    }\n    return this.getHistory();\n  }\n\n  /**\n   * Gets the current state of the queue\n   * @returns The currently running and queued items\n   */\n  async getQueue(): Promise<{\n    Running: Array<PromptBody>;\n    Pending: Array<PromptBody>;\n  }> {\n    try {\n      const res = await this.fetchApi(\"/queue\");\n      const data = await res.json();\n      return {\n        Running: data.queue_running,\n        Pending: data.queue_pending,\n      };\n    } catch (error) {\n      console.error(error);\n      return { Running: [], Pending: [] };\n    }\n  }\n\n  /**\n   * Gets the prompt execution history\n   * @returns Prompt history including node outputs\n   */\n  async getHistory(\n    max_items = 200,\n    options?: {\n      offset?: number;\n    },\n  ): Promise<{\n    History: Array<PromptQueueItem>;\n  }> {\n    const { offset } = options || {};\n    // Validate offset parameter\n    if (offset !== undefined && (offset < 0 || !Number.isInteger(offset))) {\n      throw new Error(\n        `Invalid offset parameter: ${offset}. Must be a non-negative integer.`,\n      );\n    }\n    const params = new URLSearchParams({ max_items: max_items.toString() });\n    if (offset !== undefined) {\n      params.set(\"offset\", offset.toString());\n    }\n    try {\n      const res = await this.fetchApi(`/history?${params.toString()}`);\n      return { History: Object.values(await res.json()) };\n    } catch (error) {\n      console.error(error);\n      return { History: [] };\n    }\n  }\n\n  /**\n   * Gets system & device stats\n   * @returns {ComfyUIClientResponseTypes.SystemStatsRoot} System stats such as python version, OS, per device info\n   */\n\n  async getSystemStats(): Promise<ComfyUIClientResponseTypes.SystemStatsRoot> {\n    const res = await this.fetchApi(\"/system_stats\");\n    return res.json();\n  }\n\n  /**\n   * Sends a POST request to the API\n   * @param {string} type The endpoint to post to\n   * @param {any} body Optional POST data\n   */\n  private async postApi(type: string, body: any) {\n    await this.fetchApi(\"/\" + type, {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n      body: body ? JSON.stringify(body) : undefined,\n    });\n  }\n\n  /**\n   * Deletes an item from the specified list\n   * @param {\"queue\" | \"history\"} type The type of item to delete, queue or history\n   * @param {any} id The id of the item to delete\n   */\n  async deleteItem(type: \"queue\" | \"history\", id: any) {\n    await this.postApi(type, { delete: [id] });\n  }\n\n  /**\n   * Clears the specified list\n   * @param {\"queue\" | \"history\"} type The type of list to clear, queue or history\n   */\n  async clearItems(type: \"queue\" | \"history\") {\n    await this.postApi(type, { clear: true });\n  }\n\n  /**\n   * Interrupts the execution of the running prompt. If runningPromptId is provided,\n   * it is included in the payload as a helpful hint to the backend.\n   * @param {string | null} [runningPromptId] Optional Running Prompt ID to interrupt\n   */\n  async interrupt(runningPromptId: string | null = null) {\n    await this.postApi(\n      \"interrupt\",\n      runningPromptId ? { prompt_id: runningPromptId } : undefined,\n    );\n  }\n\n  /**\n   * Free up memory by unloading models and freeing memory\n   */\n  async free(params?: { unload_models?: boolean; free_memory?: boolean }) {\n    await this.postApi(\"free\", params);\n  }\n\n  /**\n   * Gets user configuration data and where data should be stored\n   * @returns { Promise<{ storage: \"server\" | \"browser\", users?: Promise<string, unknown>, migrated?: boolean }> }\n   */\n  async getUserConfig() {\n    return (await this.fetchApi(\"/users\")).json();\n  }\n\n  /**\n   * Creates a new user\n   * @param { string } username\n   * @returns The fetch response\n   */\n  async createUser(username: string): Promise<Response> {\n    return this.fetchApi(\"/users\", {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify({ username }),\n    });\n  }\n\n  /**\n   * Gets all setting values for the current user\n   * @returns { Promise<string, unknown> } A dictionary of id -> value\n   */\n  async getSettings(): Promise<Record<string, unknown>> {\n    return (await this.fetchApi(\"/settings\")).json();\n  }\n\n  /**\n   * Gets a setting for the current user\n   * @param { string } id The id of the setting to fetch\n   * @returns { Promise<unknown> } The setting value\n   */\n  async getSetting(id: string): Promise<unknown> {\n    return (await this.fetchApi(`/settings/${encodeURIComponent(id)}`)).json();\n  }\n\n  /**\n   * Stores a dictionary of settings for the current user\n   * @param { Record<string, unknown> } settings Dictionary of setting id -> value to save\n   * @returns { Promise<void> }\n   */\n  async storeSettings(settings: Record<string, unknown>): Promise<Response> {\n    return this.fetchApi(`/settings`, {\n      method: \"POST\",\n      body: JSON.stringify(settings),\n    });\n  }\n\n  /**\n   * Stores a setting for the current user\n   * @param { string } id The id of the setting to update\n   * @param { unknown } value The value of the setting\n   * @returns { Promise<void> }\n   */\n  async storeSetting(id: string, value: unknown): Promise<Response> {\n    return this.fetchApi(`/settings/${encodeURIComponent(id)}`, {\n      method: \"POST\",\n      body: JSON.stringify(value),\n    });\n  }\n\n  /**\n   * Gets a user data file for the current user\n   * @param { string } file The name of the userdata file to load\n   * @param { RequestInit } [options]\n   * @returns { Promise<unknown> } The fetch response object\n   */\n  async getUserData(file: string, options?: RequestInit): Promise<Response> {\n    return this.fetchApi(`/userdata/${encodeURIComponent(file)}`, options);\n  }\n\n  /**\n   * Stores a user data file for the current user\n   * @param { string } file The name of the userdata file to save\n   * @param { any } data The data to save to the file\n   * @param { RequestInit & { stringify?: boolean, throwOnError?: boolean } } [options]\n   * @returns { Promise<void> }\n   */\n  async storeUserData(\n    file: string,\n    data: any,\n    options?: RequestInit & { stringify?: boolean; throwOnError?: boolean },\n  ): Promise<void> {\n    const resp = await this.fetchApi(`/userdata/${encodeURIComponent(file)}`, {\n      method: \"POST\",\n      body: options?.stringify ? JSON.stringify(data) : data,\n      ...options,\n    });\n    if (resp.status !== 200) {\n      const error = await resp.text();\n      throw new ClientRequestError(\n        `Error storing user data file '${file}': ${resp.status} ${error}`,\n      );\n    }\n  }\n\n  // ----------------- experiment apis -----------------\n\n  /**\n   * Gets a list of model folder keys (eg ['checkpoints', 'loras', ...])\n   * @returns The list of model folder keys\n   */\n  async getModelFolders(): Promise<ModelFolderInfo[]> {\n    const res = await this.fetchApi(`/experiment/models`);\n    if (res.status === 404) {\n      return [];\n    }\n    const folderBlacklist = [\"configs\", \"custom_nodes\"];\n    return (await res.json()).filter(\n      (folder: ModelFolderInfo) => !folderBlacklist.includes(folder.name),\n    );\n  }\n\n  /**\n   * Gets a list of models in the specified folder\n   * @param {string} folder The folder to list models from, such as 'checkpoints'\n   * @returns The list of model filenames within the specified folder\n   */\n  async getModels(folder: string): Promise<ModelFile[]> {\n    const res = await this.fetchApi(`/experiment/models/${folder}`);\n    if (res.status === 404) {\n      return [];\n    }\n    return await res.json();\n  }\n\n  /**\n   * Gets the metadata for a model\n   * @param {string} folder The folder containing the model\n   * @param {string} model The model to get metadata for\n   * @returns The metadata for the model\n   */\n  async viewMetadata(folder: string, model: string) {\n    const res = await this.fetchApi(\n      `/view_metadata/${folder}?filename=${encodeURIComponent(model)}`,\n    );\n    const rawResponse = await res.text();\n    if (!rawResponse) {\n      return null;\n    }\n    try {\n      return JSON.parse(rawResponse);\n    } catch (error) {\n      console.error(\n        \"Error viewing metadata\",\n        res.status,\n        res.statusText,\n        rawResponse,\n        error,\n      );\n      return null;\n    }\n  }\n\n  // ----------------- get logs -----------------\n\n  async getLogs(): Promise<string> {\n    const resp = await this.fetchApi(this.internalURL(\"/logs\"));\n    // NOTE: this api will return a JSON string\n    return await resp.json();\n  }\n\n  async getRawLogs(): Promise<LogsRawResponse> {\n    const resp = await this.fetchApi(this.internalURL(\"/logs/raw\"));\n    return await resp.json();\n  }\n\n  // ----------------- get status ++ -----------------\n\n  /**\n   * Retrieves the list of samplers from the node definitions.\n   *\n   * @return {Promise<string[]>} A promise that resolves to an array of strings representing the sampler names.\n   */\n  async getSamplers() {\n    const node_config = await this.getNodeDefs();\n    // find KSampler node\n    const node = node_config[\"KSampler\"];\n    const sampler_name = node?.input?.required?.[\"sampler_name\"]?.[0] || [];\n    return sampler_name as string[];\n  }\n\n  /**\n   * Retrieves the list of schedulers from the node definitions.\n   *\n   * @return {Promise<string[]>} A promise that resolves to an array of strings representing the scheduler names.\n   */\n  async getSchedulers() {\n    const node_config = await this.getNodeDefs();\n    // find Scheduler node\n    const node = node_config[\"KSampler\"];\n    const scheduler_name = node?.input?.required?.[\"scheduler\"]?.[0] || [];\n    return scheduler_name as string[];\n  }\n\n  /**\n   * Retrieves the list of model names from the node definitions.\n   *\n   * @return {Promise<string[]>} A promise that resolves to an array of strings representing the model names.\n   */\n  async getSDModels() {\n    const node_config = await this.getNodeDefs();\n    // find CheckpointLoaderSimple node\n    const node = node_config[\"CheckpointLoaderSimple\"];\n    const model_name = node?.input?.required?.[\"ckpt_name\"]?.[0] || [];\n    return model_name as string[];\n  }\n\n  /**\n   * Retrieves the list of model names from the node definitions.\n   *\n   * @return {Promise<string[]>} A promise that resolves to an array of strings representing the model names.\n   */\n  async getCNetModels() {\n    const node_config = await this.getNodeDefs();\n    // find ControlNetLoader node\n    const node = node_config[\"ControlNetLoader\"];\n    const model_name = node?.input?.required?.[\"control_net_name\"]?.[0] || [];\n    return model_name as string[];\n  }\n\n  /**\n   * Retrieves the list of model names from the node definitions for the UpscaleModelLoader node.\n   *\n   * @return {Promise<string[]>} A promise that resolves to an array of strings representing the model names.\n   */\n  async getUpscaleModels() {\n    const node_config = await this.getNodeDefs();\n    // find UpscaleModelLoader node\n    const node = node_config[\"UpscaleModelLoader\"];\n    const model_name = node?.input?.required?.[\"model_name\"]?.[0] || [];\n    return model_name as string[];\n  }\n\n  /**\n   * Retrieves the list of hypernetwork names from the node definitions.\n   *\n   * @return {Promise<string[]>} A promise that resolves to an array of strings representing the hypernetwork names.\n   */\n  async getHyperNetworks() {\n    const node_config = await this.getNodeDefs();\n    // find HypernetworkLoader node\n    const node = node_config[\"HypernetworkLoader\"];\n    const model_name = node?.input?.required?.[\"hypernetwork_name\"]?.[0] || [];\n    return model_name as string[];\n  }\n\n  /**\n   * Retrieves the list of LoRAs from the node definitions.\n   *\n   * @return {Promise<string[]>} A promise that resolves to an array of strings representing the LoRAs.\n   */\n  async getLoRAs() {\n    const node_config = await this.getNodeDefs();\n    // find LoraLoader node\n    const node = node_config[\"LoraLoader\"];\n    const model_name = node?.input?.required?.[\"lora_name\"]?.[0] || [];\n    return model_name as string[];\n  }\n\n  /**\n   * Retrieves the list of VAE names from the node definitions.\n   *\n   * @return {Promise<string[]>} A promise that resolves to an array of strings representing the VAE names.\n   */\n  async getVAEs() {\n    const node_config = await this.getNodeDefs();\n    // find VAELoader node\n    const node = node_config[\"VAELoader\"];\n    const model_name = node?.input?.required?.[\"vae_name\"]?.[0] || [];\n    return model_name as string[];\n  }\n\n  // ----------------- Prompt ++ -----------------\n\n  /**\n   * Retrieves the status of a prompt based on the provided prompt ID.\n   *\n   * @param {string} prompt_id - The ID of the prompt to check status for.\n   * @return {Object} Object containing the running, pending, and done status of the prompt.\n   */\n  async getPromptStatus(prompt_id: string) {\n    const { Running, Pending } = await this.getQueue();\n    const getId = (task: any) => {\n      if (!task) return null;\n      // old version\n      if (\"prompt\" in task) return task.prompt?.[1];\n      // v4 v5\n      if (Array.isArray(task)) return task[1];\n      throw new TaskDataTypeError(task);\n    };\n    const running = Running.some((task) => getId(task) === prompt_id);\n    const pending = Pending.some((task) => getId(task) === prompt_id);\n    const done = !running && !pending;\n    return {\n      running,\n      pending,\n      done,\n    };\n  }\n\n  /**\n   * Retrieves the outputs of a prompt with the given ID from the history.\n   *\n   * @param {string} prompt_id - The ID of the prompt to retrieve the outputs for.\n   * @return {Promise<Record<string, any>>} A promise that resolves to the outputs of the prompt.\n   * @throws {Error} If the prompt with the given ID is not found in the history or if it failed with a non-\"success\" status.\n   */\n  async getPromptOutputs(prompt_id: string) {\n    const { History: history } = await this.getHistory();\n    const item = history.find((item) => item.prompt[1] === prompt_id);\n    if (!item) throw new PromptNotFoundError(prompt_id);\n\n    const status = item.status?.status_str ?? \"error\";\n    if (status === \"error\")\n      throw new PromptExecutionFailedError(prompt_id, status ?? \"error\");\n\n    return item.outputs;\n  }\n\n  /**\n   * Retrieves the result of a prompt with the given ID, resolved using the provided resolver.\n   *\n   * @param {string} prompt_id - The ID of the prompt to retrieve the result for.\n   * @param {WorkflowOutputResolver<T>} resolver - The resolver to use when resolving the prompt result.\n   * @return {Promise<WorkflowOutput<T>>} A promise that resolves to the result of the prompt.\n   */\n  async getPromptResult<T>(\n    prompt_id: string,\n    resolver: WorkflowOutputResolver<T>,\n  ): Promise<WorkflowOutput<T>>;\n  async getPromptResult(prompt_id: string): Promise<WorkflowOutput>;\n  async getPromptResult(\n    prompt_id: string,\n    resolver?: any,\n  ): Promise<WorkflowOutput> {\n    const outputs = await this.getPromptOutputs(prompt_id);\n    if (typeof resolver !== \"function\") {\n      resolver = RESOLVERS.image;\n    }\n    return Object.entries(outputs).reduce(\n      (acc, [node_id, output]) =>\n        resolver(acc, output, {\n          client: this,\n          prompt_id,\n          node_id,\n        }),\n      {\n        images: [],\n        prompt_id,\n        data: null,\n      } as WorkflowOutput,\n    );\n  }\n\n  /**\n   * Asynchronously waits for the prompt with the provided ID to be done.\n   *\n   * @param {string} prompt_id - The ID of the prompt to wait for.\n   * @param {number} [polling_ms=1000] - The number of milliseconds to wait between checks.\n   * @param {number} [timeout_ms=5 * 60 * 1000] - The maximum number of milliseconds to wait. defaults to 5 minutes. must be greater than 1000ms.\n   * @return {void}\n   */\n  async waitForPrompt(\n    prompt_id: string,\n    polling_ms = 1000,\n    timeout_ms = 5 * 60 * 1000,\n  ) {\n    const start = Date.now();\n    let prompt_status = await this.getPromptStatus(prompt_id);\n    while (!prompt_status.done) {\n      if (timeout_ms >= 0) {\n        if (Date.now() - start > timeout_ms) {\n          throw new PromptTimeoutError(prompt_id, timeout_ms);\n        }\n      }\n\n      await new Promise((resolve) => setTimeout(resolve, polling_ms));\n      prompt_status = await this.getPromptStatus(prompt_id);\n    }\n  }\n\n  /**\n   * Asynchronously waits for the prompt with the provided ID to be done,\n   * using a WebSocket connection to receive updates.\n   *\n   * @param {string} prompt_id - The ID of the prompt to wait for.\n   * @param {WorkflowOutputResolver<T>} resolver - A function to resolve the output of the prompt.\n   * @param {number} [timeout_ms=5 * 60 * 1000] - The maximum number of milliseconds to wait. defaults to 5 minutes. must be greater than 1000ms.\n   * @return {Promise<WorkflowOutput<T>>} A promise that resolves with the output of the prompt.\n   */\n  async waitForPromptWebSocket<T>(\n    prompt_id: string,\n    resolver: WorkflowOutputResolver<T>,\n    timeout_ms = 5 * 60 * 1000,\n  ) {\n    const output: WorkflowOutput<T> = {\n      images: [],\n      prompt_id,\n      data: null as T,\n    };\n    const disposable = new Disposable();\n    return new Promise<WorkflowOutput<T>>((resolve, reject) => {\n      let is_current_ws_executing = false;\n      disposable._connect(\n        this.on(\"executing\", (data) => {\n          is_current_ws_executing = data?.prompt_id === prompt_id;\n        }),\n      );\n      disposable._connect(\n        this.on(\"image_data\", (data) => {\n          if (!is_current_ws_executing) return;\n          output.images.push({\n            type: \"buff\",\n            data: data.image,\n            mime: data.mime,\n          });\n        }),\n      );\n      disposable._connect(\n        this.on(\"executed\", (data) => {\n          const {\n            prompt_id: current_prompt_id,\n            output: executed_output,\n            node: node_id,\n          } = data;\n          if (current_prompt_id !== prompt_id) {\n            return;\n          }\n          const resolved = resolver(output, executed_output, {\n            client: this,\n            prompt_id,\n            node_id,\n          });\n          resolve(resolved);\n        }),\n      );\n      disposable._connect(\n        this.on(\"execution_error\", (data) => {\n          reject(new WorkflowExecutionError(data, prompt_id));\n        }),\n      );\n      const timer = setTimeout(() => {\n        reject(new PromptTimeoutError(prompt_id, timeout_ms));\n      }, timeout_ms);\n      disposable._connect(() => clearTimeout(timer));\n    }).finally(() => {\n      disposable.dispose();\n    });\n  }\n\n  /**\n   * Asynchronously enqueues a prompt with optional workflow and random seed.\n   *\n   * @param {Record<string, unknown>} prompt - The prompt to enqueue.\n   * @param {Object} [options] - The options for enqueueing the prompt.\n   * @param {Record<string, unknown>} [options.workflow] - The workflow for the prompt.\n   * @return {Promise<ComfyUIClientResponseTypes.QueuePromptSuccess>} A promise that resolves with the enqueued prompt response.\n   * @throws {Error} If there is an error in the response.\n   */\n  async _enqueue_prompt(\n    prompt: Record<string, unknown>,\n    options?: {\n      workflow?: Record<string, unknown>;\n    },\n  ) {\n    const resp = await this.queuePrompt(0, {\n      prompt,\n      workflow: options?.workflow,\n    });\n    if (\"error\" in resp) throw new PromptEnqueueError(resp);\n    return resp;\n  }\n\n  /**\n   * Asynchronously runs a prompt with the provided options.\n   *\n   * This function does not use WebSocket, but uses polling to get the result\n   * So if your workflow contains custom ws events, this function will not be able to get these events\n   *\n   * @param {Record<string, unknown>} prompt - The prompt to run.\n   * @param {Object} options - The options for running the prompt.\n   * @param {Record<string, unknown>} options.workflow - The workflow for the prompt, It will be added to the png info of the generated image.\n   * @param {number} [options.polling_ms=1000] - The number of milliseconds to polling query prompt result.\n   * @param {number} [options.timeout_ms=5 * 60 * 1000] - The number of milliseconds to wait for the prompt result. must be greater than 1000.\n   * @return {Promise<WorkflowOutput>} A promise that resolves with the prompt result.\n   *\n   * @deprecated Use `enqueue_polling` instead\n   */\n  async runPrompt(\n    prompt: Record<string, unknown>,\n    options?: {\n      workflow?: Record<string, unknown>;\n      polling_ms?: number;\n      timeout_ms?: number;\n    },\n  ) {\n    const resp = await this._enqueue_prompt(prompt, options);\n    const prompt_id = resp.prompt_id;\n    await this.waitForPrompt(\n      prompt_id,\n      options?.polling_ms,\n      options?.timeout_ms,\n    );\n    return await this.getPromptResult(prompt_id, RESOLVERS.image);\n  }\n\n  /**\n   * Asynchronously enqueues a prompt and waits for the corresponding prompt websocket.\n   *\n   * This function does not use WebSocket, but uses polling to get the result\n   * So if your workflow contains custom ws events, this function will not be able to get these events\n   *\n   * @param {Record<string, unknown>} prompt - The prompt to enqueue.\n   * @param {EnqueueOptions<T>} [options] - The options for enqueueing the prompt.\n   * @return {Promise<WorkflowOutput<T>>} A promise that resolves with the prompt result.\n   */\n  async enqueue_polling<T>(\n    prompt: Record<string, unknown>,\n    options?: EnqueueOptions<T>,\n  ): Promise<WorkflowOutput<T>>;\n  async enqueue_polling(\n    prompt: Record<string, unknown>,\n    options?: EnqueueOptions,\n  ): Promise<WorkflowOutput>;\n  async enqueue_polling(\n    prompt: Record<string, unknown>,\n    options?: any,\n  ): Promise<WorkflowOutput> {\n    if (typeof options?.progress === \"function\") {\n      throw new ClientEnqueueError(\n        \"progress option is not supported in polling mode\",\n      );\n    }\n\n    const resp = await this._enqueue_prompt(prompt, options);\n    const prompt_id = resp.prompt_id;\n    await this.waitForPrompt(\n      prompt_id,\n      options?.polling_ms,\n      options?.timeout_ms,\n    );\n    return await this.getPromptResult(\n      prompt_id,\n      options?.resolver ?? RESOLVERS.image,\n    );\n  }\n\n  /**\n   * Enqueues a prompt and waits for the corresponding prompt websocket.\n   *\n   * @param {Record<string, unknown>} prompt - The prompt to enqueue.\n   * @param {EnqueueOptions<T>} [options] - The options for enqueueing the prompt.\n   * @return {Promise<WorkflowOutput>} A promise that resolves with the prompt result.\n   */\n  async enqueue<T>(\n    prompt: Record<string, unknown>,\n    options?: EnqueueOptions<T>,\n  ): Promise<WorkflowOutput<T>>;\n  async enqueue(\n    prompt: Record<string, unknown>,\n    options?: EnqueueOptions,\n  ): Promise<WorkflowOutput>;\n  async enqueue(prompt: Record<string, unknown>, options?: any) {\n    const resp = await this._enqueue_prompt(prompt, options);\n    const prompt_id = resp.prompt_id;\n\n    const off_progress = this.on_progress(options?.progress, prompt_id);\n    try {\n      return await this.waitForPromptWebSocket(\n        prompt_id,\n        options?.resolver ?? RESOLVERS.image,\n        options?.timeout_ms,\n      );\n    } finally {\n      off_progress();\n    }\n  }\n\n  /**\n   * Listens for progress updates for a specific task.\n   *\n   * @param {EnqueueOptions[\"progress\"]} fn - The progress callback function.\n   * @param {string} task_id - The ID of the task to listen for progress updates.\n   * @return {Function} A function that can be used to remove the progress listener.\n   */\n  on_progress(fn: EnqueueOptions[\"progress\"], task_id: string) {\n    if (!fn) return () => {};\n    return this.on(\"progress\", (_data) => {\n      const data = {\n        // old api response type:\n        ...(\"progress\" in _data ? { ...(_data as any).progress } : {}),\n        // new api: https://github.com/StableCanvas/comfyui-client/issues/6\n        ..._data,\n      };\n      if (data.prompt_id === task_id) {\n        fn(data);\n      }\n    });\n  }\n}\n","import { Client } from \"../client/Client\";\nimport { WorkflowOutputResolver } from \"../client/types\";\nimport type { WorkflowOutput, IWorkflow } from \"./types\";\nimport { RESOLVERS } from \"../builtins\";\nimport { ComfyUIClientEvents, ComfyUiWsTypes } from \"../client/ws.types\";\nimport EventEmitter from \"eventemitter3\";\nimport { Disposable } from \"../utils/Disposable\";\nimport {\n  WorkflowArgumentError,\n  WorkflowDoneError,\n  WorkflowEnqueuedError,\n  WorkflowExecutionError,\n  WorkflowInterruptedError,\n  WorkflowTaskIdError,\n  WorkflowTaskStatusError,\n  WorkflowWsError,\n} from \"./errors\";\nimport { debounce } from \"../utils/misc\";\nimport { ConnectError } from \"../client/errors\";\n\nexport class InvokedWorkflow<T = unknown> extends Disposable {\n  protected _task_id?: string;\n\n  protected _result: WorkflowOutput<T> = {\n    images: [],\n    prompt_id: \"\",\n  };\n\n  is_done = false;\n  enqueued = false;\n\n  workflow: IWorkflow;\n  client: Client;\n  resolver: WorkflowOutputResolver<T>;\n\n  /**\n   * 因为 comfyui 的 websocket events 顺序混乱，在 execution_success 立马结束也可能导致事件丢失\n   *\n   * Because the order of comfyui's websocket events is chaotic, the execution_success event may end immediately, causing events to be lost\n   */\n  delay_done_ms = 500;\n\n  /**\n   *  The current task is being executed via WebSocket; this flag is used to determine whether the current `image_data` originates from this task.\n   */\n  is_current_ws_executing = false;\n\n  constructor(\n    readonly options: {\n      workflow: IWorkflow;\n      client: Client;\n      resolver?: WorkflowOutputResolver<T>;\n      progress?: (p: ComfyUiWsTypes.Messages.Progress) => void;\n      on_error?: (e: Error) => void;\n    },\n  ) {\n    super();\n    const { workflow, client, resolver } = options;\n    this.workflow = workflow;\n    this.client = client;\n    this.resolver = resolver || (RESOLVERS.image as any);\n  }\n\n  public get is_disposed() {\n    return this._disposed;\n  }\n\n  public get task_id() {\n    return this._task_id;\n  }\n\n  protected _enqueue_guard() {\n    if (this.enqueued) throw new WorkflowEnqueuedError(this);\n    this.enqueued = true;\n  }\n\n  protected _task_id_guard() {\n    if (!this._task_id) throw new WorkflowTaskIdError(this);\n    return this._task_id;\n  }\n\n  protected _done_guard() {\n    if (this._disposed || this.is_done) throw new WorkflowDoneError(this);\n  }\n\n  protected _ws_guard() {\n    if (this.client.closed)\n      throw new ConnectError(\n        \"The WebSocket connection has been closed. Please ensure that the client is connected.\",\n      );\n    if (this.client.socket === null) throw new WorkflowWsError(this);\n  }\n\n  protected is_owner_event(...args: any[]) {\n    const [data] = (args as any[]) || [];\n    const { _task_id: task_id } = this;\n    if (!task_id) return false;\n    if (typeof data !== \"object\" || data === null) return false;\n    if (!(\"prompt_id\" in data) || data.prompt_id !== task_id) return false;\n    return true;\n  }\n\n  /**\n   * Adds an event listener for the specified event type.\n   */\n  on<T extends EventEmitter.EventNames<ComfyUIClientEvents>>(\n    type: T,\n    callback: EventEmitter.EventListener<ComfyUIClientEvents, T>,\n    options?: any,\n  ) {\n    this._done_guard();\n    const { client } = this;\n    const off = client.on(type, (...args) => {\n      if (type === \"image_data\" || type === \"b_preview\") {\n        if (!this.is_current_ws_executing) return;\n      } else if (!this.is_owner_event(...args)) return;\n      callback(...args);\n    });\n    this._connect(off);\n    return off;\n  }\n\n  /**\n   * Adds an once event listener for the specified event type.\n   */\n  once<T extends EventEmitter.EventNames<ComfyUIClientEvents>>(\n    type: T,\n    callback: EventEmitter.EventListener<ComfyUIClientEvents, T>,\n    options?: any,\n  ) {\n    this._done_guard();\n    const { client } = this;\n    const off = client.on(type, (...args) => {\n      if (type === \"image_data\" || type === \"b_preview\") {\n        if (!this.is_current_ws_executing) return;\n      } else if (!this.is_owner_event(...args)) return;\n      callback(...args);\n      off();\n    });\n    this._connect(off);\n    return off;\n  }\n\n  /**\n   * Initiates the workflow by enqueuing the prompt and setting up the task ID.\n   *\n   * @return {void}\n   */\n  public async enqueue() {\n    this._enqueue_guard();\n\n    const { client, workflow } = this;\n    const { prompt, workflow: wf } = workflow;\n\n    const { prompt_id } = await client._enqueue_prompt(prompt, {\n      workflow: wf,\n    });\n    this._task_id = prompt_id;\n\n    this.hook_progress();\n    this.hook_image_data();\n    this.hook_executing();\n  }\n\n  protected async hook_progress() {\n    const { progress } = this.options;\n    const { _task_id: _task_id } = this;\n    if (!progress) return;\n    if (typeof progress !== \"function\") {\n      throw new WorkflowArgumentError(\n        this,\n        \"options.progress hook must be a function\",\n      );\n    }\n    if (typeof _task_id !== \"string\") throw new WorkflowTaskIdError(this);\n    const off_progress = this.client.on_progress(progress, _task_id);\n    this._connect(off_progress);\n  }\n\n  protected async hook_executing() {\n    const { client } = this;\n    const task_id = this._task_id_guard();\n    this._connect(\n      client.on(\"executing\", (data) => {\n        this.is_current_ws_executing = data?.prompt_id === task_id;\n      }),\n    );\n  }\n\n  protected async hook_image_data() {\n    const { client } = this;\n    this._connect(\n      client.on(\"image_data\", (data) => {\n        if (this.is_current_ws_executing === false) return;\n\n        this._result.images.push({\n          type: \"buff\",\n          data: data.image,\n          mime: data.mime,\n        });\n      }),\n    );\n  }\n\n  protected resolve_to_result(data: ComfyUiWsTypes.Messages.Executed) {\n    const { client, resolver } = this;\n    const { output, prompt_id, node } = data;\n\n    this._result = resolver(this._result, output, {\n      client,\n      prompt_id: prompt_id,\n      node_id: node,\n    });\n  }\n\n  /**\n   * Retrieves the execution status of the workflow.\n   *\n   * @return {Promise<status>} A promise that resolves with the execution status of the workflow.\n   */\n  public async query() {\n    const task_id = this._task_id_guard();\n    return this.client.getPromptStatus(task_id);\n  }\n\n  /**\n   * Interrupts the execution of the workflow if it is currently enqueued.\n   * Throws an error if the workflow is not enqueued or if the execution status cannot be interrupted.\n   *\n   * @return {Promise<void>} A promise that resolves when the interrupt is successful or rejects with an error.\n   * @throws {Error} If the workflow is not enqueued or if the execution status cannot be interrupted.\n   */\n  public async interrupt() {\n    const id = this._task_id_guard();\n    const { pending, running, done } = await this.query();\n    if (done) return;\n    if (pending) {\n      this.client.deleteItem(\"queue\", id);\n      return;\n    }\n    if (running) {\n      return this.client.interrupt(id);\n    }\n    throw new WorkflowTaskStatusError(this);\n  }\n\n  protected async collect_result() {\n    const { client, resolver } = this;\n    const task_id = this._task_id_guard();\n    const result = await client.getPromptResult(\n      task_id,\n      resolver ?? RESOLVERS.image,\n    );\n    this._result.images = [...this._result.images, ...result.images];\n    this._result.data = this._result.data ?? result.data;\n    return this._result;\n  }\n\n  protected when_interrupted(\n    cb: (data: ComfyUiWsTypes.Messages.ExecutionInterrupted) => any,\n  ) {\n    const task_id = this._task_id_guard();\n    this._connect(\n      this.client.on(\"execution_interrupted\", (data) => {\n        if (data.prompt_id === task_id) {\n          cb(data);\n        }\n      }),\n    );\n  }\n\n  protected when_execution_error(\n    cb: (data: ComfyUiWsTypes.Messages.ExecutionError) => any,\n  ) {\n    const task_id = this._task_id_guard();\n    this._connect(\n      this.client.on(\"execution_error\", (data) => {\n        if (data.prompt_id === task_id) {\n          cb(data);\n        }\n      }),\n    );\n  }\n\n  /**\n   * Listen for the start event of the workflow.\n   * @param {Function} cb - The callback function that will be called when the workflow starts.\n   * @return {Function} A function that can be used to remove the listener.\n   */\n  public on_start(cb: () => void) {\n    const task_id = this._task_id_guard();\n    return this._connect(\n      this.client.on(\"execution_start\", (data) => {\n        if (data.prompt_id === task_id) cb();\n      }),\n    );\n  }\n\n  /**\n   * Waits for the workflow to complete and returns the result.\n   *\n   * *This function does not rely on WebSocket Events, so it will lose events output by WebSocket node\n   *\n   * @param {Object} options - options for waiting\n   * @param {number} [options.polling_ms=1000] - polling interval in milliseconds\n   * @return {Promise} promise that resolves with the result of the workflow\n   */\n  public async wait_polling({ polling_ms }: { polling_ms?: number } = {}) {\n    this._done_guard();\n    const task_id = this._task_id_guard();\n\n    const { client } = this;\n    return new Promise<WorkflowOutput>(async (resolve, reject) => {\n      const done = () => {\n        this.is_done = true;\n        this.dispose();\n      };\n\n      // NOTE: 这里监听如果 client 没有开启 ws 是拿不到的，但是其实可以 client 开启 ws 同时这里仍然使用 polling 来同步状态，所以，这里也监听这个状态\n      this.when_interrupted((data) => {\n        reject(new WorkflowInterruptedError(this));\n        done();\n      });\n      this.when_execution_error((data) => {\n        reject(new WorkflowExecutionError(data, task_id, this.workflow, this));\n        done();\n      });\n\n      try {\n        await client.waitForPrompt(task_id, polling_ms ?? 1000);\n        const result = await this.collect_result();\n        resolve(result);\n      } catch (error) {\n        reject(error);\n      } finally {\n        done();\n      }\n    }).catch((err) => {\n      this.options.on_error?.(err);\n      return Promise.reject(err);\n    });\n  }\n\n  /**\n   * Waits for the workflow to complete and returns the result.\n   *\n   * @return {Promise<WorkflowOutput>} promise that resolves with the result of the workflow\n   */\n  public async wait() {\n    this._done_guard();\n    this._ws_guard();\n\n    const task_id = this._task_id_guard();\n\n    return new Promise<WorkflowOutput>((resolve, reject) => {\n      const done = () => {\n        this.is_done = true;\n        this.dispose();\n      };\n      const maybe_done = debounce(async () => {\n        // NOTE: Because we are performing a delayed query for \"done,\" it's possible that multiple checks will be initiated. Therefore, we need to determine here whether it has already been done. #23\n        if (this.is_done) return;\n        try {\n          const status = await this.query();\n          if (!status.done) {\n            return;\n          }\n          resolve(this._result);\n          done();\n        } catch (error) {\n          reject(error);\n          done();\n        }\n      }, this.delay_done_ms);\n      this.when_interrupted((data) => {\n        reject(new WorkflowInterruptedError(this));\n        done();\n      });\n      this.when_execution_error((data) => {\n        reject(new WorkflowExecutionError(data, task_id, this.workflow, this));\n        done();\n      });\n      // NOTE: The implication here is that if something else triggers the `dispose` method, then this should also guarantee that the promise is resolved.\n      this._connect(maybe_done);\n      this._connect(\n        this.client.on(\"executed\", async (data) => {\n          if (data.prompt_id !== task_id) return;\n          this.resolve_to_result(data);\n          maybe_done();\n        }),\n      );\n      this._connect(\n        this.client.on(\"execution_success\", async (data) => {\n          if (data.prompt_id !== task_id) return;\n          maybe_done();\n        }),\n      );\n    }).catch((err) => {\n      this.options.on_error?.(err);\n      return Promise.reject(err);\n    });\n  }\n}\n","import { Client } from \"../client/Client\";\n\nexport namespace NSPipeline {\n  export const samplers = [\n    \"euler\",\n    \"euler_cfg_pp\",\n    \"euler_ancestral\",\n    \"euler_ancestral_cfg_pp\",\n    \"heun\",\n    \"heunpp2\",\n    \"exp_heun_2_x0\",\n    \"exp_heun_2_x0_sde\",\n    \"dpm_2\",\n    \"dpm_2_ancestral\",\n    \"lms\",\n    \"dpm_fast\",\n    \"dpm_adaptive\",\n    \"dpmpp_2s_ancestral\",\n    \"dpmpp_2s_ancestral_cfg_pp\",\n    \"dpmpp_sde\",\n    \"dpmpp_sde_gpu\",\n    \"dpmpp_2m\",\n    \"dpmpp_2m_cfg_pp\",\n    \"dpmpp_2m_sde\",\n    \"dpmpp_2m_sde_gpu\",\n    \"dpmpp_2m_sde_heun\",\n    \"dpmpp_2m_sde_heun_gpu\",\n    \"dpmpp_3m_sde\",\n    \"dpmpp_3m_sde_gpu\",\n    \"ddpm\",\n    \"lcm\",\n    \"ipndm\",\n    \"ipndm_v\",\n    \"deis\",\n    \"res_multistep\",\n    \"res_multistep_cfg_pp\",\n    \"res_multistep_ancestral\",\n    \"res_multistep_ancestral_cfg_pp\",\n    \"gradient_estimation\",\n    \"gradient_estimation_cfg_pp\",\n    \"er_sde\",\n    \"seeds_2\",\n    \"seeds_3\",\n    \"sa_solver\",\n    \"sa_solver_pece\",\n    \"ddim\",\n    \"uni_pc\",\n    \"uni_pc_bh2\",\n  ] as const;\n  export const schedulers = [\n    \"simple\",\n    \"sgm_uniform\",\n    \"karras\",\n    \"exponential\",\n    \"ddim_uniform\",\n    \"beta\",\n    \"normal\",\n    \"linear_quadratic\",\n    \"kl_optimal\",\n  ] as const;\n\n  export type PipeContext = {\n    seed: number;\n    steps: number;\n    cfg: number;\n    sampler_name: (typeof samplers)[number] | ({} & string);\n    scheduler: (typeof schedulers)[number] | ({} & string);\n    denoise: number;\n    width: number;\n    height: number;\n    batch_size: number;\n    ckpt_name: string;\n    positive: string;\n    negative: string;\n\n    /**\n     * NOTE: dependence custom node: `ETN_LoadImageBase64` and `ETN_LoadMaskBase64`\n     */\n    input_image: Buffer | null;\n    input_mask: Buffer | null;\n    grow_mask_by: number;\n\n    client: Client | null;\n  };\n}\n","import { Client } from \"../client/Client\";\nimport { InvokedWorkflow } from \"./InvokedWorkflow\";\nimport { WorkflowOutputResolver } from \"../client/types\";\nimport { ComfyUINodeTypes } from \"../schema/comfyui.node.types\";\nimport { WorkflowOutput, WorkflowPromptNode } from \"./types\";\nimport { IWorkflow } from \"./types\";\nimport { ComfyUiWsTypes } from \"../client/ws.types\";\n\nconst deepClone: <T>(obj: T) => T = globalThis.structuredClone\n  ? globalThis.structuredClone\n  : (x) => JSON.parse(JSON.stringify(x));\n\nexport type NodeOutput = [string, number];\n\nexport type NodeClassInputs = Record<\n  string,\n  string | boolean | number | null | undefined | NodeOutput\n>;\n\n// { k: { [k:string]: unknown } } => { k: any }\ntype InputsFormat<T> = {\n  [K in keyof T]: T[K] extends { [k: string]: unknown }\n    ? NodeOutput\n    : T[K] | NodeOutput;\n};\n\nexport interface ComfyUINodeClass<\n  INP extends NodeClassInputs = NodeClassInputs,\n> {\n  (inputs: INP): NodeOutput[];\n}\n\nexport type BuiltinNodeClasses = {\n  [K in keyof Required<ComfyUINodeTypes.NodeTypes>]: Required<\n    Required<ComfyUINodeTypes.NodeTypes>[K]\n  > extends {\n    inputs: infer INP;\n  }\n    ? ComfyUINodeClass<InputsFormat<INP> & NodeClassInputs>\n    : ComfyUINodeClass<NodeClassInputs>;\n};\n\nexport type InvokeOptions<T> = {\n  resolver?: WorkflowOutputResolver<T>;\n  progress?: (p: ComfyUiWsTypes.Messages.Progress) => void;\n  polling_ms?: number;\n};\n\n/**\n * A class for creating a workflow using a fluent API.\n *\n * @example\n * ```typescript\n  const workflow = new Workflow();\n  const {\n    KSampler,\n    CheckpointLoaderSimple,\n    EmptyLatentImage,\n    CLIPTextEncode,\n    VAEDecode,\n    SaveImage,\n    NODE1,\n  } = workflow.classes;\n\n  const seed = Math.floor(Math.random() * 2 ** 32);\n  const pos = \"best quality, 1girl\";\n  const neg = \"worst quality, bad anatomy, embedding:NG_DeepNegative_V1_75T\";\n  const model1_name = \"lofi_v5.baked.fp16.safetensors\";\n  const model2_name = \"case-h-beta.baked.fp16.safetensors\";\n  const sampler_settings = {\n    seed,\n    steps: 35,\n    cfg: 4,\n    sampler_name: \"dpmpp_2m_sde_gpu\",\n    scheduler: \"karras\",\n    denoise: 1,\n  };\n\n  const [model1, clip1, vae1] = CheckpointLoaderSimple({\n    ckpt_name: model1_name,\n  });\n  const [model2, clip2, vae2] = CheckpointLoaderSimple({\n    ckpt_name: model2_name,\n  });\n\n  const dress_case = [\n    \"white yoga\",\n    \"black office\",\n    \"pink sportswear\",\n    \"cosplay\",\n  ];\n\n  const generate_pipeline = (model, clip, vae, pos, neg) => {\n    const [latent_image] = EmptyLatentImage({\n      width: 640,\n      height: 960,\n      batch_size: 1,\n    });\n    const [positive] = CLIPTextEncode({ text: pos, clip });\n    const [negative] = CLIPTextEncode({ text: neg, clip });\n    const [samples] = KSampler({\n      ...sampler_settings,\n      model,\n      positive,\n      negative,\n      latent_image,\n    });\n    const [image] = VAEDecode({ samples, vae });\n    return image;\n  };\n\n  for (const cloth of dress_case) {\n    const input_pos = `${pos}, ${cloth} dress`;\n    const image = generate_pipeline(model1, clip1, vae1, input_pos, neg);\n    SaveImage({\n      images: image,\n      filename_prefix: `${cloth}-lofi-v5`,\n    });\n\n    const input_pos2 = `${pos}, ${cloth} dress`;\n    const image2 = generate_pipeline(model2, clip2, vae2, input_pos2, neg);\n    SaveImage({\n      images: image2,\n      filename_prefix: `${cloth}-case-h-beta`,\n    });\n  }\n\n  return workflow;\n * ```\n */\nexport class Workflow {\n  protected _workflow: IWorkflow = {\n    prompt: {},\n  };\n  protected _last_node_id = 0;\n\n  public classes = this._createClassesProxy() as BuiltinNodeClasses &\n    Record<string, ComfyUINodeClass>;\n\n  protected _createClassesProxy() {\n    const source = {};\n    return new Proxy(source, {\n      get: (target, p, receiver) => {\n        if (p in target) {\n          return (target as any)[p];\n        }\n        return (inputs: Record<string, any>) => {\n          return this.node(p as any, inputs);\n        };\n      },\n    });\n  }\n\n  public node<\n    T extends keyof ComfyUINodeTypes.NodeTypes | (string & {}),\n    C extends T extends keyof ComfyUINodeTypes.NodeTypes\n      ? Required<Required<ComfyUINodeTypes.NodeTypes>[T]>\n      : unknown,\n  >(\n    node_name: T,\n    inputs: C extends { inputs: infer INP } ? INP : Record<string, unknown>,\n  ): Iterable<NodeOutput>;\n  public node(\n    node_name: string,\n    inputs: Record<string, unknown>,\n  ): Iterable<NodeOutput> {\n    const node: WorkflowPromptNode = {\n      class_type: node_name,\n      inputs,\n    } as any;\n    const id = (++this._last_node_id).toString();\n    this._workflow.prompt[id] = node;\n\n    function* outputs() {\n      let i = 0;\n      while (true) {\n        yield [id, i++] as NodeOutput;\n      }\n    }\n\n    const gen = outputs() as any;\n\n    for (let index = 0; index < 24; index++) {\n      gen[index] = [id, index] as NodeOutput;\n    }\n\n    return gen;\n  }\n\n  /**\n   * Resets the workflow by clearing the prompt and setting the workflow to undefined.\n   */\n  public reset() {\n    this._workflow.prompt = {};\n    this._workflow.workflow = undefined;\n    this._last_node_id = 0;\n  }\n\n  /**\n   * Returns the current workflow object.\n   *\n   * @return {IWorkflow} The current workflow object.\n   *\n   * @deprecated use `workflow` instead\n   */\n  public end() {\n    return this.workflow();\n  }\n\n  /**\n   * Returns the current workflow object.\n   *\n   * @return {IWorkflow} The current workflow object.\n   */\n  public workflow() {\n    return deepClone(this._workflow);\n  }\n\n  /**\n   * Guard function to check if the client's WebSocket is connected before attempting to invoke the workflow.\n   *\n   * @throws {Error} If the WebSocket is not connected.\n   *\n   * @param {Client} client - The client to check.\n   *\n   * @private\n   */\n  protected _ws_connected_guard(client: Client) {\n    if (!client.socket || client.socket.readyState !== client.WebSocket.OPEN) {\n      const current_state = {\n        [client.WebSocket.CLOSED]: \"CLOSED\",\n        [client.WebSocket.CONNECTING]: \"CONNECTING\",\n        [client.WebSocket.OPEN]: \"OPEN\",\n        [client.WebSocket.CLOSING]: \"CLOSING\",\n        [-1]: \"UNKNOWN\",\n      }[client.socket?.readyState ?? -1];\n      throw new Error(\n        `WebSocket is not connected, cannot invoke workflow. readyState=${current_state}`,\n      );\n    }\n  }\n\n  /**\n   * Invokes the workflow with the provided client and options.\n   *\n   * @param {Client} client - The client to use for the invocation.\n   * @param {InvokeOptions<T>} [options] - Optional invoke options.\n   * @return {Promise<WorkflowOutput<T>>} A promise resolving to the workflow output.\n   */\n  public invoke<T>(\n    client: Client,\n    options?: InvokeOptions<T>,\n  ): Promise<WorkflowOutput<T>>;\n  public invoke(\n    client: Client,\n    options?: InvokeOptions<unknown>,\n  ): Promise<WorkflowOutput<unknown>>;\n  public async invoke(\n    client: Client,\n    options?: InvokeOptions<unknown>,\n  ): Promise<WorkflowOutput<unknown>> {\n    this._ws_connected_guard(client);\n    const invoked = this.instance(client, options);\n    await invoked.enqueue();\n    const result = invoked.wait();\n    return result;\n  }\n\n  /**\n   * Creates a new invoked workflow instance.\n   *\n   * @param {Client} client - The client used to run the prompt.\n   * @param {InvokeOptions<T>} [options] - Optional invoke options.\n   * @return {InvokedWorkflow<T>} The invoked workflow instance.\n   */\n  public instance<T>(\n    client: Client,\n    options?: InvokeOptions<T>,\n  ): InvokedWorkflow<T>;\n  public instance(\n    client: Client,\n    options?: InvokeOptions<unknown>,\n  ): InvokedWorkflow;\n  public instance(\n    client: Client,\n    options?: InvokeOptions<unknown>,\n  ): InvokedWorkflow {\n    const workflow = this.workflow();\n    const invoked = new InvokedWorkflow({\n      workflow,\n      client,\n      resolver: options?.resolver,\n      progress: options?.progress,\n    });\n    return invoked;\n  }\n\n  /**\n   * Invokes a workflow using the provided client with polling.\n   *\n   * @param {Client} client - The client used to run the prompt.\n   * @param {InvokeOptions<T>} [options] - The options for invoking the workflow.\n   * @return {Promise<WorkflowOutput<T>>} A promise that resolves with the result of the prompt.\n   */\n  public invoke_polling<T>(\n    client: Client,\n    options?: InvokeOptions<T>,\n  ): Promise<WorkflowOutput<T>>;\n  public invoke_polling(\n    client: Client,\n    options?: InvokeOptions<unknown>,\n  ): Promise<WorkflowOutput>;\n  public invoke_polling(client: Client, options?: InvokeOptions<unknown>) {\n    if (typeof options?.progress === \"function\") {\n      throw new Error(\"progress option is not supported in polling mode\");\n    }\n    const { prompt, workflow } = this.workflow();\n    return client.enqueue_polling(prompt, {\n      workflow,\n      resolver: options?.resolver,\n      polling_ms: options?.polling_ms,\n    });\n  }\n}\n","import { Client } from \"../client/Client\";\n\ntype FnHook<\n  N extends keyof Client = keyof Client,\n  Fn extends Client[N] = Client[N],\n> = Fn extends (...args: any) => any\n  ? {\n      type: \"function\";\n      name: N;\n      fn: (original: Fn, ...args: Parameters<Fn>) => ReturnType<Fn>;\n    }\n  : never;\n\ntype PluginHook<\n  N extends keyof Client = keyof Client,\n  Fn extends Client[N] = Client[N],\n> = FnHook<N, Fn>;\n\nexport class Plugin {\n  private hooks = [] as PluginHook[];\n\n  public install(instance: Client) {\n    for (const hook of this.hooks) {\n      const ins = instance as any;\n      const original = ins[hook.name].bind(instance);\n      ins[hook.name] = (...args: Parameters<typeof original>) => {\n        return (hook.fn as any).bind(instance)(original, ...args);\n      };\n    }\n  }\n\n  protected addHook<\n    N extends keyof Client = keyof Client,\n    Fn extends Client[N] = Client[N],\n  >(hook: PluginHook<N, Fn>) {\n    this.hooks.push(hook);\n  }\n}\n","import { Plugin } from \"./Plugin\";\n\n/**\n * Provide api-auth support for this https://github.com/liusida/ComfyUI-Login/tree/main extension\n */\nexport class LoginAuthPlugin extends Plugin {\n  constructor(\n    readonly options: {\n      token: string;\n    },\n  ) {\n    super();\n\n    this.addHook({\n      type: \"function\",\n      name: \"apiURL\",\n      fn: (original, ...args) => {\n        const url = original(...args);\n        const urlObj = new URL(url);\n        urlObj.searchParams.set(\"token\", this.options.token);\n        return urlObj.toString();\n      },\n    });\n\n    this.addHook({\n      type: \"function\",\n      name: \"wsURL\",\n      fn: (original, ...args) => {\n        const url = original(...args);\n        const urlObj = new URL(url);\n        urlObj.searchParams.set(\"token\", this.options.token);\n        return urlObj.toString();\n      },\n    });\n  }\n}\n","import EventEmitter from \"eventemitter3\";\nimport { Client } from \"../client/Client\";\nimport { Workflow } from \"../workflow/Workflow\";\nimport { WorkflowOutput } from \"../workflow/types\";\nimport { NSPipeline } from \"./types\";\nimport { ComfyUIClientEvents } from \"../client/ws.types\";\nimport { Disposable } from \"../utils/Disposable\";\nimport { InvokedWorkflow } from \"../workflow/InvokedWorkflow\";\n\ntype PipeContext = NSPipeline.PipeContext;\n\n/**\n * pipe to create a workflow\n */\nexport class BasePipe<\n  CTX extends PipeContext = PipeContext,\n> extends Disposable {\n  /**\n   * Generates a random seed value.\n   *\n   * @return {number} A random integer seed value between 0 and MAX_SAFE_INTEGER.\n   */\n  static nextSeed() {\n    return Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);\n  }\n  static defaultContext: PipeContext = {\n    seed: BasePipe.nextSeed(),\n    steps: 35,\n    cfg: 4,\n    sampler_name: \"dpmpp_2m_sde_gpu\",\n    scheduler: \"karras\",\n    denoise: 1,\n    width: 512,\n    height: 512,\n    batch_size: 1,\n    ckpt_name: \"\",\n\n    input_image: null,\n    input_mask: null,\n    grow_mask_by: 6,\n\n    positive: \"\",\n    negative: \"\",\n\n    client: null,\n  };\n  protected context: CTX;\n  protected _workflow = new Workflow();\n  protected _invoked?: Promise<InvokedWorkflow>;\n\n  constructor(context?: Partial<CTX>) {\n    super();\n    this.context = {\n      ...BasePipe.defaultContext,\n      ...context,\n    } as CTX;\n  }\n\n  protected update(ctx: Record<string, any>) {\n    Object.assign(this.context, ctx);\n  }\n\n  /**\n   * Updates the context with the provided image buffer.\n   *\n   * @param {Buffer} image - The image buffer to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  image(image: Buffer) {\n    this.update({\n      input_image: image,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided mask buffer.\n   *\n   * @param {Buffer} image - The mask buffer to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  mask(image: Buffer) {\n    this.update({\n      input_mask: image,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided model checkpoint name.\n   *\n   * @param {string} ckpt_name - The name of the model checkpoint to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  model(ckpt_name: string) {\n    this.update({\n      ckpt_name,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided width and height, and returns the current instance of the class for method chaining.\n   *\n   * @param {number} w - The width to update the context with.\n   * @param {number} h - The height to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  size(w: number, h: number) {\n    this.update({\n      width: w,\n      height: h,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided text as the positive prompt.\n   *\n   * @param {string} text - The text to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  prompt(text: string) {\n    this.update({\n      positive: text,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided text as the negative prompt.\n   *\n   * @param {string} text - The text to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  negative(text: string) {\n    this.update({\n      negative: text,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided steps and returns the current instance of the class for method chaining.\n   *\n   * @param {number} steps - The number of steps to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  steps(steps: number) {\n    this.update({\n      steps,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided cfg value.\n   *\n   * @param {number} cfg - The cfg value to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  cfg(cfg: number) {\n    this.update({\n      cfg,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided seed value or generates a random seed value if none is provided.\n   *\n   * @param {number} [seed=BasePipe.nextSeed()] - The seed value to update the context with. If not provided, a random seed value will be generated.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  seed(seed = BasePipe.nextSeed()) {\n    this.update({\n      seed,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided denoise value and returns the current instance of the class for method chaining.\n   *\n   * @param {number} denoise - The denoise value to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  denoise(denoise: number) {\n    this.update({\n      denoise,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided scheduler value and returns the current instance of the class for method chaining.\n   *\n   * @param {PipeContext[\"scheduler\"]} scheduler - The scheduler value to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  scheduler(scheduler: PipeContext[\"scheduler\"]) {\n    this.update({\n      scheduler,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided sampler name and returns the current instance of the class for method chaining.\n   *\n   * @param {PipeContext[\"sampler_name\"]} sampler_name - The sampler name to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  sampler(sampler_name: PipeContext[\"sampler_name\"]) {\n    this.update({\n      sampler_name,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided batch size and returns the current instance of the class for method chaining.\n   *\n   * @param {number} batch_size - The batch size to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  batch_size(batch_size: number) {\n    this.update({\n      batch_size,\n    });\n    return this;\n  }\n\n  /**\n   * Updates the context with the provided client and returns the current instance of the class for method chaining.\n   *\n   * @param {Client} client - The client to update the context with.\n   * @return {this} The current instance of the class for method chaining.\n   */\n  with(client: Client) {\n    this.update({\n      client,\n    });\n    return this;\n  }\n\n  /**\n   * Adds an event listener for the specified event type.\n   */\n  on<T extends EventEmitter.EventNames<ComfyUIClientEvents>>(\n    type: T,\n    callback: EventEmitter.EventListener<ComfyUIClientEvents, T>,\n    options?: any,\n  ) {\n    const { _invoked: invoked } = this;\n    if (!invoked) {\n      throw new Error(\"workflow not invoked\");\n    }\n    invoked.then((instance) => {\n      instance.on(type, callback, options);\n    });\n    return this;\n  }\n\n  /**\n   * Adds an once event listener for the specified event type.\n   */\n  once<T extends EventEmitter.EventNames<ComfyUIClientEvents>>(\n    type: T,\n    callback: EventEmitter.EventListener<ComfyUIClientEvents, T>,\n    options?: any,\n  ) {\n    const { _invoked: invoked } = this;\n    if (!invoked) {\n      throw new Error(\"workflow not invoked\");\n    }\n    invoked.then((instance) => {\n      instance.once(type, callback, options);\n    });\n    return this;\n  }\n\n  protected build_latent(vae: any) {\n    const { context, _workflow: workflow } = this;\n    const cls = workflow.classes;\n    const { width, height, batch_size } = context;\n    const { input_image, input_mask, grow_mask_by } = this.context;\n    if (!input_image) {\n      return cls.EmptyLatentImage({\n        width,\n        height,\n        batch_size,\n      })[0];\n    }\n    const pixels = cls.ETN_LoadImageBase64({\n      image: input_image.toString(\"base64\"),\n    })[0];\n    if (!input_mask) {\n      return cls.VAEEncode({\n        pixels,\n        vae,\n      })[0];\n    }\n    const mask = cls.ETN_LoadMaskBase64({\n      mask: input_mask.toString(\"base64\"),\n    })[0];\n    return cls.VAEEncodeForInpaint({\n      pixels,\n      vae,\n      mask,\n      grow_mask_by,\n    })[0];\n  }\n\n  protected build() {\n    const { context, _workflow: workflow } = this;\n    const cls = workflow.classes;\n    const {\n      seed,\n      steps,\n      cfg,\n      scheduler,\n      denoise,\n      ckpt_name,\n      positive,\n      negative,\n      sampler_name,\n    } = context;\n    const [model, clip, vae] = cls.CheckpointLoaderSimple({\n      ckpt_name,\n    });\n    const enc = (text: string) => cls.CLIPTextEncode({ text, clip })[0];\n    const [samples] = cls.KSampler({\n      seed,\n      steps,\n      cfg,\n      sampler_name,\n      scheduler,\n      denoise,\n      model,\n      positive: enc(positive),\n      negative: enc(negative),\n      latent_image: this.build_latent(vae),\n    });\n\n    return { samples, vae, cls };\n  }\n\n  protected _save(filename_prefix?: string) {\n    const { samples, vae, cls } = this.build();\n\n    const images = cls.VAEDecode({ samples, vae })[0];\n    if (filename_prefix) {\n      cls.SaveImage({\n        filename_prefix,\n        images,\n      });\n    } else {\n      cls.SaveImageWebsocket({\n        images,\n      });\n    }\n  }\n\n  protected async read_response(res: WorkflowOutput<unknown>) {\n    const images = [] as {\n      data: ArrayBuffer;\n      mime: string;\n    }[];\n    for (const img of res.images) {\n      switch (img.type) {\n        case \"buff\": {\n          images.push({\n            data: img.data,\n            mime: img.mime,\n          });\n          break;\n        }\n        case \"url\": {\n          const { data: url } = img;\n          const resp = await fetch(url);\n          const mime = resp.headers.get(\"content-type\") ?? \"image/png\";\n          const blob = await resp.blob();\n          images.push({\n            data: await blob.arrayBuffer(),\n            mime,\n          });\n          break;\n        }\n      }\n    }\n    return images;\n  }\n\n  /**\n   * Saves the workflow by invoking the workflow instance and enqueuing it.\n   *\n   * @param {string} [filename_prefix] - The prefix for the saved filename. if not provided, the workflow will be saved as a websocket connection.\n   * @return {this} - Returns the instance of the class for method chaining.\n   * @throws {Error} - Throws an error if the client is not defined.\n   */\n  save(filename_prefix?: string) {\n    const {\n      context: { client },\n      _workflow: workflow,\n    } = this;\n    if (!client) {\n      throw new Error(\"client is not defined\");\n    }\n    this._save(filename_prefix);\n    this._invoked = (async () => {\n      const instance = workflow.instance(client);\n      instance._connect(() => this.dispose());\n      await instance.enqueue();\n      return instance;\n    })();\n    return this;\n  }\n\n  /**\n   * Waits for the workflow to complete and returns the result and the images.\n   *\n   * @return {Promise<{result: WorkflowOutput<unknown>, images: {data: ArrayBuffer, mime: string}[]}>} - A promise that resolves to an object containing the result of the workflow and the images.\n   * @throws {Error} - Throws an error if the workflow has not been invoked.\n   */\n  async wait() {\n    const { _invoked: invoked } = this;\n    if (!invoked) {\n      throw new Error(\"workflow not invoked\");\n    }\n    const result = await (await invoked).wait();\n    const images = await this.read_response(result);\n    return {\n      result,\n      images,\n    };\n  }\n\n  /**\n   * Waits for the workflow to complete and returns the result and the images.\n   *\n   * *This function does not rely on WebSocket Events, so it maybe will lose events output by WebSocket node\n   *\n   * @return {Promise<{result: WorkflowOutput<unknown>, images: {data: ArrayBuffer, mime: string}[]}>} - A promise that resolves to an object containing the result of the workflow and the images.\n   * @throws {Error} - Throws an error if the workflow has not been invoked.\n   */\n  async wait_polling() {\n    const { _invoked: invoked } = this;\n    if (!invoked) {\n      throw new Error(\"workflow not invoked\");\n    }\n    const result = await (await invoked).wait_polling();\n    const images = await this.read_response(result);\n    return {\n      result,\n      images,\n    };\n  }\n}\n","import { BasePipe } from \"./base\";\nimport { NSPipeline } from \"./types\";\n\ninterface EfficientPipeContext extends NSPipeline.PipeContext {\n  vae_name: string;\n  clip_skip: number;\n  token_normalization: \"none\" | \"mean\" | \"length\" | \"length+mean\";\n  weight_interpretation:\n    | \"comfy\"\n    | \"A1111\"\n    | \"compel\"\n    | \"comfy++\"\n    | \"down_weight\";\n\n  loras: {\n    name: string;\n    weight: number;\n    model_strength: number;\n    clip_strength: number;\n  }[];\n  control_net_blocks: {\n    image: Buffer;\n    name: string;\n    strength: number;\n    start: number;\n    end: number;\n  }[];\n}\n\n/**\n * pipe to create a workflow\n *\n * required https://github.com/jags111/efficiency-nodes-comfyui\n */\nexport class EfficientPipe extends BasePipe<EfficientPipeContext> {\n  static defaultContext: EfficientPipeContext = {\n    ...BasePipe.defaultContext,\n    vae_name: \"Baked VAE\",\n    clip_skip: -2,\n    token_normalization: \"none\",\n    weight_interpretation: \"A1111\",\n\n    loras: [],\n    control_net_blocks: [],\n  };\n\n  constructor(context?: Partial<EfficientPipeContext>) {\n    super();\n    this.context = {\n      ...EfficientPipe.defaultContext,\n      ...context,\n    } as EfficientPipeContext;\n  }\n\n  /**\n   * Adds a LoRA (Low-Rank Adaptation) to the EfficientPipe context.\n   *\n   * @param {string} name - The name of the LoRA.\n   * @param {object} options - Optional configuration for the LoRA.\n   * @param {number} [options.weight=1] - The weight of the LoRA.\n   * @param {number} [options.strength=1] - The strength of the LoRA.\n   * @param {number} [options.clip_strength=1] - The clip strength of the LoRA.\n   * @return {EfficientPipe} The EfficientPipe instance for chaining.\n   */\n  lora(\n    name: string,\n    {\n      weight = 1,\n      strength = 1,\n      clip_strength = 1,\n    }: { weight?: number; strength?: number; clip_strength?: number } = {},\n  ) {\n    this.context.loras.push({\n      name,\n      weight,\n      model_strength: strength,\n      clip_strength,\n    });\n    return this;\n  }\n\n  /**\n   * Adds a control net block to the EfficientPipe context.\n   *\n   * @param {string} name - The name of the control net block.\n   * @param {Buffer} image - The image data of the control net block.\n   * @param {object} options - Optional configuration for the control net block.\n   * @param {number} [options.strength=1] - The strength of the control net block.\n   * @param {number} [options.start=0] - The start value of the control net block.\n   * @param {number} [options.end=1] - The end value of the control net block.\n   * @return {EfficientPipe} The EfficientPipe instance for chaining.\n   */\n  cnet(\n    name: string,\n    image: Buffer,\n    {\n      strength = 1,\n      start = 0,\n      end = 1,\n    }: {\n      strength?: number;\n      start?: number;\n      end?: number;\n    } = {},\n  ) {\n    this.context.control_net_blocks.push({\n      image,\n      name,\n      strength,\n      start,\n      end,\n    });\n    return this;\n  }\n\n  protected build_lora_stack() {\n    const { loras } = this.context;\n    if (loras.length === 0) {\n      return undefined;\n    }\n    const { _workflow: workflow } = this;\n    const cls = workflow.classes;\n    const params: any = {\n      lora_count: loras.length,\n    };\n    for (let idx = 0; idx < 50; idx++) {\n      const lora = loras[idx];\n      if (!lora) {\n        params[`lora_name_${idx}`] = \"None\";\n        params[`lora_wt_${idx}`] = 1;\n        params[`model_str_${idx}`] = 1;\n        params[`clip_str_${idx}`] = 1;\n        continue;\n      }\n      const { name, weight, model_strength, clip_strength } = lora;\n      params[`lora_name_${idx}`] = name;\n      params[`lora_wt_${idx}`] = weight;\n      params[`model_str_${idx}`] = model_strength;\n      params[`clip_str_${idx}`] = clip_strength;\n    }\n\n    const [stack] = cls[\"LoRA Stacker\"]({\n      input_mode: \"advanced\",\n      ...params,\n    });\n    return stack;\n  }\n\n  protected build_cnet_block(\n    {\n      image,\n      name,\n      strength,\n      start,\n      end,\n    }: EfficientPipeContext[\"control_net_blocks\"][number],\n    stack: any,\n  ) {\n    const { _workflow: workflow } = this;\n    const { ControlNetLoader, ETN_LoadImageBase64 } = workflow.classes;\n    const cls = workflow.classes;\n    const [model] = ControlNetLoader({\n      control_net_name: name,\n    });\n    const [img] = ETN_LoadImageBase64({\n      image: image.toString(\"base64\"),\n    });\n    const [stack_out] = cls[\"Control Net Stacker\"]({\n      control_net: model,\n      image: img,\n      strength,\n      start_percent: start,\n      end_percent: end,\n      cnet_stack: stack,\n    });\n    return stack_out;\n  }\n\n  protected build_cnet_stack() {\n    const { control_net_blocks } = this.context;\n    if (control_net_blocks.length === 0) {\n      return undefined;\n    }\n    let stack = undefined as any;\n    for (const cnet of control_net_blocks) {\n      stack = this.build_cnet_block(cnet, stack);\n    }\n    return stack;\n  }\n\n  protected build() {\n    const { context, _workflow: workflow } = this;\n    const cls = workflow.classes;\n    const {\n      seed,\n      steps,\n      cfg,\n      scheduler,\n      denoise,\n      ckpt_name,\n      positive,\n      negative,\n      sampler_name,\n      vae_name,\n      clip_skip,\n      token_normalization,\n      weight_interpretation,\n      width,\n      height,\n      batch_size,\n    } = context;\n    const [model, cond_pos, cond_neg, latent, vae, clip, deps] = cls[\n      \"Efficient Loader\"\n    ]({\n      ckpt_name,\n      vae_name,\n      clip_skip,\n      token_normalization,\n      weight_interpretation,\n      empty_latent_height: height,\n      empty_latent_width: width,\n      batch_size,\n      positive,\n      negative,\n\n      lora_stack: this.build_lora_stack(),\n      cnet_stack: this.build_cnet_stack(),\n\n      // NOTE: All lora loads use stack instead of here\n      lora_name: \"None\",\n      lora_model_strength: 1,\n      lora_clip_strength: 1,\n    });\n\n    const [samples] = cls.KSampler({\n      seed,\n      steps,\n      cfg,\n      sampler_name,\n      scheduler,\n      denoise,\n      model,\n      positive: cond_pos,\n      negative: cond_neg,\n      latent_image: this.build_latent(vae),\n    });\n\n    return { samples, vae, cls };\n  }\n}\n","/**\n * [0,0,0] => \"AAAA=\"\n * @param arrayBuffer - The ArrayBuffer to convert to base64.\n * @returns The base64 representation of the ArrayBuffer.\n */\nexport const arrayBufferToBase64 = (arrayBuffer: ArrayBuffer): string => {\n  const bytes = new Uint8Array(arrayBuffer);\n  let binary = \"\";\n  for (let i = 0; i < bytes.byteLength; i++) {\n    binary += String.fromCharCode(bytes[i]);\n  }\n  return globalThis.btoa(binary);\n};\n","import { WorkflowOutput } from \"../workflow/types\";\nimport { arrayBufferToBase64 as a2b } from \"./arrayBuffer\";\n\nconst b64pkg = (b64: string, type: string) => `data:${type};base64,${b64}`;\nconst url2mime = (url: string) =>\n  url.toLowerCase().endsWith(\".png\") ? \"image/png\" : \"image/jpeg\";\n\nexport const outToB64Urls = (\n  result: WorkflowOutput,\n  {\n    fetch = globalThis.fetch,\n  }: {\n    fetch?: typeof globalThis.fetch;\n  } = {},\n): Promise<string[]> =>\n  Promise.all(\n    result.images.map((x) => {\n      switch (x.type) {\n        case \"buff\":\n          return b64pkg(a2b(x.data), x.mime || \"image/png\");\n        case \"url\":\n          return fetch(x.data)\n            .then((res) => res.blob())\n            .then(async (blob) =>\n              b64pkg(a2b(await blob.arrayBuffer()), url2mime(x.data)),\n            );\n        default:\n          // @ts-ignore\n          throw new Error(`Unknown image type: ${x.type}`);\n      }\n    }),\n  );\n","export * from \"./client/WsClient\";\nexport * from \"./client/Client\";\nexport * from \"./workflow/Workflow\";\nexport * from \"./plugins/Plugin\";\nexport * as plugins from \"./plugins\";\nexport * as builtins from \"./builtins\";\nexport * from \"./pipeline\";\n\nexport * from \"./utils/tools\";\n\nexport * from \"./client/types\";\nexport * from \"./client/ws.types\";\nexport * from \"./client/response.types\";\n\nexport * from \"./workflow/types\";\nexport * from \"./pipeline/types\";\n\nexport * from \"./client/errors\";\nexport * from \"./workflow/errors\";\n\nimport { WsClient } from \"./client/WsClient\";\nimport { Client } from \"./client/Client\";\nimport { Workflow } from \"./workflow/Workflow\";\nimport { Plugin } from \"./plugins/Plugin\";\n\n/**\n * @deprecated use `Client` instead\n */\nexport const ComfyUIApiClient = Client;\n\n/**\n * @deprecated use `WsClient` instead\n */\nexport const ComfyUIWsClient = WsClient;\n\n/**\n * @deprecated use `Workflow` instead\n */\nexport const ComfyUIWorkflow = Workflow;\n\n/**\n * @deprecated use `Plugin` instead\n */\nexport const ClientPlugin = Plugin;\n"],"names":["has","Object","prototype","hasOwnProperty","prefix","Events","EE","fn","context","once","this","addListener","emitter","event","TypeError","listener","evt","_events","push","_eventsCount","clearEvent","EventEmitter","create","__proto__","eventNames","events","name","names","call","slice","getOwnPropertySymbols","concat","listeners","handlers","i","l","length","ee","Array","listenerCount","emit","a1","a2","a3","a4","a5","args","len","arguments","removeListener","undefined","apply","j","on","removeAllListeners","off","prefixed","module","exports","isNone","x","ClientError","_Error","message","_inheritsLoose","_wrapNativeSuper","Error","PromptTimeoutError","_ClientError","prompt_id","timeout_ms","PromptEnqueueError","_ClientError2","resp","_error$errors","error","node_errors","errors","details_message","JSON","stringify","ClientEnqueueError","_ClientError3","err_msg","PromptNotFoundError","_ClientError4","TaskDataTypeError","_ClientError5","task_data","PromptExecutionFailedError","_ClientError6","status","ClientRequestError","_ClientError7","PollingTimeoutError","_ClientError8","WebSocketTimeoutError","_ClientError9","ConnectError","_ClientError0","WebSocketParseError","_ClientError1","HttpError","_Error2","json","_this","pact","state","value","s","_Pact","_settle","bind","v","then","observer","o","onFulfilled","onRejected","result","e","_iteratorSymbol","Symbol","iterator","thenable","WsClient","config","_config$api_host","_config$api_base","_config$clientId","_config$WebSocket","_config$ssl","_config$user","_config$fetch","api_host","api_base","clientId","socket","WebSocket","ssl","user","fetch","socket_callbacks","_polling_timer","_polling_interval","closed","DEFAULT_API_HOST","DEFAULT_API_BASE","replace","c","r","Math","random","toString","globalThis","DEFAULT_USER","console","warn","readBinaryData","buf","view","DataView","eventType","getUint32","imageType","decoder","TextDecoder","data","nodeIdLength","type","nodeId","decode","text","mime","image","Blob","decoder4","metadataLength","metadataBytes","metadata","parse","imageData4","imageBlob4","image_type","blob","node_id","displayNodeId","display_node_id","parentNodeId","parent_node_id","realNodeId","real_node_id","promptId","_proto","apiHeaders","options","_options$headers","_extends","Accept","headers","apiURL","route","url","URL","_split","split","query","pathname","search","searchParams","set","internalURL","viewURL","filename","subfolder","URLSearchParams","wsURL","fetchApi","Promise","resolve","res","statusText","_temp","_res$json","_result","_exit","reject","addEventListener","callback","_this2","_this3","startPollingQueue","_this4","setInterval","_temp2","_catch","addSocketCallback","_this5","removeEventListener","removeSocketCallbacks","createSocket","isReconnect","_this7","_this6","opened","binaryType","ev","_err$message","err","is404Error","includes","close","setTimeout","_exit2","isBinaryData","ArrayBuffer","Buffer","isBuffer","target","body","check","_isSettledPact","_cycle","_fixup","step","done","values","array","_forOf","discriminant","cases","awaitBody","test","testValue","outer","dispatchIndex","fallthroughCheck","_resumeAfterTest","_switch","_this7$events3","_emit3","arrayBuffer","_ev$data$arrayBuffer","_this7$events4","_emit4","_ev$data$blob$arrayBu","msg","sid","registered","init","disconnect","connect","_temp3","_this9","_polling$interval","_this8","_ref","_ref$polling","polling","enabled","_ref$websocket","websocket","_ref$timeout_ms","interval","timer","ok","clearTimeout","_disconnectSocket","process","nextTick","_disconnectPolling","readyState","OPEN","clearInterval","_createClass","key","get","IS_BROWSER","window","RESOLVERS","acc","output","client","images","map","filter","Boolean","WorkflowError","task_id","workflow","invoked","WorkflowExecutionError","_WorkflowError2","payload","exception_message","exception_type","ClientConnectionError","WorkflowGuardError","_Error3","WorkflowEnqueuedError","_WorkflowGuardError2","WorkflowTaskIdError","_WorkflowGuardError3","WorkflowDoneError","_WorkflowGuardError4","is_done","WorkflowWsError","_WorkflowGuardError5","WorkflowTaskStatusError","_WorkflowGuardError6","WorkflowInterruptedError","_WorkflowGuardError7","WorkflowArgumentError","_WorkflowGuardError8","Disposable","_disposed","_disposed_cbs","dispose","forEach","cb","_connect","recover","Client","_WsClient","_plugins","use","plugin","install","getExtensions","cache","invoke","getEmbeddings","getNodeDefs","queuePrompt","queue_index","prompt","client_id","extra_data","extra_pnginfo","front","number","method","error_resp","error_data","getItems","getQueue","getHistory","Running","queue_running","Pending","queue_pending","max_items","offset","Number","isInteger","params","_res$json2","History","getSystemStats","postApi","deleteItem","id","delete","clearItems","clear","interrupt","runningPromptId","free","getUserConfig","_this13$fetchApi","createUser","username","getSettings","_this15$fetchApi","getSetting","encodeURIComponent","_this16$fetchApi","storeSettings","settings","storeSetting","getUserData","file","storeUserData","getModelFolders","folderBlacklist","_res$json3","folder","getModels","viewMetadata","model","rawResponse","getLogs","getRawLogs","getSamplers","node_config","_node$input","node","input","required","getSchedulers","_node$input2","getSDModels","_node$input3","getCNetModels","_node$input4","getUpscaleModels","_node$input5","getHyperNetworks","_node$input6","getLoRAs","_node$input7","getVAEs","_node$input8","getPromptStatus","_ref3","getId","task","_task$prompt","isArray","running","some","pending","getPromptOutputs","_ref4","_item$status$status_s","_item$status","item","find","status_str","outputs","getPromptResult","resolver","_this36","entries","reduce","_ref5","waitForPrompt","polling_ms","_this37","start","Date","now","prompt_status","_for","shouldContinue","stage","_resumeAfterBody","_this37$getPromptStat","waitForPromptWebSocket","_this38","disposable","is_current_ws_executing","resolved","_enqueue_prompt","runPrompt","_this40","enqueue_polling","_this41","progress","_options$resolver","enqueue","_this42","off_progress","on_progress","finalizer","_options$resolver2","_finallyRethrows","_wasThrown","_result4","_data","NSPipeline","InvokedWorkflow","_Disposable","_task_id","enqueued","delay_done_ms","_enqueue_guard","_task_id_guard","_done_guard","_ws_guard","is_owner_event","_ref2","hook_progress","hook_image_data","hook_executing","resolve_to_result","collect_result","_this0","_this0$_result$data","when_interrupted","when_execution_error","on_start","wait_polling","_this1","on_error","wait","_this10","maybe_done","wait_ms","timeout","_arguments","debounce","deepClone","structuredClone","Workflow","_workflow","_last_node_id","classes","_createClassesProxy","Proxy","p","receiver","inputs","node_name","_marked","_regenerator","m","class_type","w","_context","n","a","gen","index","reset","end","_ws_connected_guard","_client$WebSocket$CLO","_client$socket$readyS","_client$socket","current_state","CLOSED","CONNECTING","CLOSING","instance","invoke_polling","_this$workflow","Plugin","hooks","_loop","_step","hook","ins","original","_iterator","_createForOfIteratorHelperLoose","addHook","_Plugin","LoginAuthPlugin","urlObj","token","samplers","schedulers","BasePipe","_invoked","defaultContext","nextSeed","floor","MAX_SAFE_INTEGER","update","ctx","assign","input_image","mask","input_mask","ckpt_name","size","h","width","height","positive","negative","steps","cfg","seed","denoise","scheduler","sampler","sampler_name","batch_size","build_latent","vae","cls","_this$context","grow_mask_by","EmptyLatentImage","pixels","ETN_LoadImageBase64","VAEEncode","ETN_LoadMaskBase64","VAEEncodeForInpaint","build","_cls$CheckpointLoader","CheckpointLoaderSimple","clip","enc","CLIPTextEncode","samples","KSampler","latent_image","_save","filename_prefix","_this$build","VAEDecode","SaveImage","SaveImageWebsocket","read_response","next","_forTo","img","_resp$headers$get","_push","_blob$arrayBuffer","save","_invoked2","EfficientPipe","_BasePipe","lora","_ref$weight","weight","_ref$strength","strength","_ref$clip_strength","clip_strength","loras","model_strength","cnet","_ref2$strength","_ref2$start","_ref2$end","control_net_blocks","build_lora_stack","lora_count","idx","input_mode","build_cnet_block","stack","_workflow$classes","ControlNetLoader","control_net_name","_ETN_LoadImageBase","control_net","start_percent","end_percent","cnet_stack","build_cnet_stack","_cls$EfficientLoader","vae_name","clip_skip","token_normalization","weight_interpretation","empty_latent_height","empty_latent_width","lora_stack","lora_name","lora_model_strength","lora_clip_strength","cond_pos","cond_neg","arrayBufferToBase64","bytes","Uint8Array","binary","byteLength","String","fromCharCode","btoa","b64pkg","b64","outToB64Urls","_ref$fetch","all","a2b","toLowerCase","endsWith","ComfyUIApiClient","ComfyUIWsClient","ComfyUIWorkflow","ClientPlugin"],"mappings":"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"}