import {app} from "../../scripts/app.js"; import {ComfyWidgets} from "../../scripts/widgets.js"; // Node that add notes to your project let terminal_node; let log_mode = false; app.registerExtension({ name: "Comfy.Manager.Terminal", registerCustomNodes() { class TerminalNode { color = "#222222"; bgcolor = "#000000"; groupcolor = LGraphCanvas.node_colors.black.groupcolor; constructor() { this.logs = []; if (!this.properties) { this.properties = {}; this.properties.text=""; } ComfyWidgets.STRING(this, "", ["", {default:this.properties.text, multiline: true}], app) ComfyWidgets.BOOLEAN(this, "mode", ["", {default:true, label_on:'Logging', label_off:'Stop'}], app) ComfyWidgets.INT(this, "lines", ["", {default:500, min:10, max:10000, steps:1}], app) let self = this; Object.defineProperty(this.widgets[1], 'value', { set: (v) => { api.fetchApi(`/manager/terminal?mode=${v}`, {}); log_mode = v; }, get: () => { return log_mode; } }); this.serialize_widgets = false; this.isVirtualNode = true; if(terminal_node) { try { terminal_node.widgets[0].value = 'The output of this node is disabled because another terminal node has appeared.'; } catch {} } terminal_node = this; } } // Load default visibility LiteGraph.registerNodeType( "Terminal Log //CM", Object.assign(TerminalNode, { title_mode: LiteGraph.NORMAL_TITLE, title: "Terminal Log (Manager)", collapsable: true, }) ); TerminalNode.category = "utils"; }, }); import { api } from "../../scripts/api.js"; function terminalFeedback(event) { if(terminal_node) { terminal_node.logs.push(event.detail.data); if(terminal_node.logs.length > terminal_node.widgets[2].value) { terminal_node.logs.shift(); if(terminal_node.logs[0] == '' || terminal_node.logs[0] == '\n') terminal_node.logs.shift(); } terminal_node.widgets[0].value = [...terminal_node.logs].reverse().join('').trim(); } } api.addEventListener("manager-terminal-feedback", terminalFeedback);