diff --git a/typescripts/src/common/zh-cn.mts b/typescripts/src/common/zh-cn.mts index 4a84522..e028f31 100644 --- a/typescripts/src/common/zh-cn.mts +++ b/typescripts/src/common/zh-cn.mts @@ -213,4 +213,8 @@ export default { 'Photoshop is not connected': 'Photoshop 未连接', 'select...': '请选择', 'click to edit': '点击编辑', + + // comfy call error + 'ComfyManager not found, cannot reboot': 'Comfy Manager未安装,无法重启', + 'Failed to reboot ComfyUI': '重启ComfyUI失败', } diff --git a/typescripts/src/plugins/common/socket/WorkflowCaller.mts b/typescripts/src/plugins/common/socket/WorkflowCaller.mts index 18ff676..ec2d50e 100644 --- a/typescripts/src/plugins/common/socket/WorkflowCaller.mts +++ b/typescripts/src/plugins/common/socket/WorkflowCaller.mts @@ -5,10 +5,13 @@ import { getStoredWidgetValue } from "../hooks/widgetable.mts"; export interface WorkflowCaller { pageInstanceRun(sid: string, from_sid: string, size?: number): void; - setWidgetValue(workflowAgent: PageStore | null | undefined, params: WorkflowCalleeActions['setWidgetValue']['params']): Promise; - openWorkflow(workflowAgent: PageStore | null | undefined, params: WorkflowCalleeActions['open']['params']): Promise; - saveWorkflow(workflowAgent: PageStore | null | undefined, params: WorkflowCalleeActions['save']['params']): Promise; - logout(workflowAgent: PageStore | null | undefined): Promise; + setWidgetValue(workflowAgent: PageStore | null, params: WorkflowCalleeActions['setWidgetValue']['params']): Promise; + openWorkflow(workflowAgent: PageStore | null, params: WorkflowCalleeActions['open']['params']): Promise; + saveWorkflow(workflowAgent: PageStore | null, params: WorkflowCalleeActions['save']['params']): Promise; + logout(workflowAgent: PageStore | null): Promise; + interrupt(workflowAgentSID: string): Promise; + clearQueue(workflowAgentSID: string): Promise; + reboot(workflowAgentSID: string): Promise; } export interface WorkflowCallerActions { @@ -152,6 +155,37 @@ export function WorkflowCallerSocket(SocketClass: SocketConstructor) { }); }) } + + public async interrupt(workflowAgentSID: string) { + await new Promise((resolve, reject) => { + this.socket.emit('F_workflow', { + action: 'interrupt', + sid: workflowAgentSID + }, (payload: any) => { + resolve(payload); + }); + }) + } + public async clearQueue(workflowAgentSID: string) { + await new Promise((resolve, reject) => { + this.socket.emit('F_workflow', { + action: 'clearQueue', + sid: workflowAgentSID + }, (payload: any) => { + resolve(payload); + }); + }) + } + public async reboot(workflowAgentSID: string) { + return await new Promise((resolve, reject) => { + this.socket.emit('F_workflow', { + action: 'reboot', + sid: workflowAgentSID + }, (payload: WorkflowCalleeActions['reboot']['result']) => { + resolve(payload); + }); + }) + } } } diff --git a/typescripts/src/plugins/common/tsx/icons/StopIcon.tsx b/typescripts/src/plugins/common/tsx/icons/StopIcon.tsx new file mode 100644 index 0000000..7c9ca8c --- /dev/null +++ b/typescripts/src/plugins/common/tsx/icons/StopIcon.tsx @@ -0,0 +1,14 @@ +import React from "react"; + +export default class StopIcon extends React.Component<{ + size?: number, + hollowStyle?: boolean +}> { + render() { + return ( +
+ +
+ ) + } +} diff --git a/typescripts/src/plugins/photoshop/index.d.ts b/typescripts/src/plugins/photoshop/index.d.ts index 104f09f..0a3b71f 100644 --- a/typescripts/src/plugins/photoshop/index.d.ts +++ b/typescripts/src/plugins/photoshop/index.d.ts @@ -37,6 +37,9 @@ declare module "SDPPPInternal" { type: string; subfolder: string; } | undefined>; + interrupt: () => Promise; + clearQueue: () => Promise; + reboot: () => Promise; } export interface SDPPPWebpageInstance { diff --git a/typescripts/src/plugins/photoshop/tsx/WorkflowEditWrap.tsx b/typescripts/src/plugins/photoshop/tsx/WorkflowEditWrap.tsx index 2652012..12263ca 100644 --- a/typescripts/src/plugins/photoshop/tsx/WorkflowEditWrap.tsx +++ b/typescripts/src/plugins/photoshop/tsx/WorkflowEditWrap.tsx @@ -11,6 +11,7 @@ import { useSDPPPContext, useAgentState, } from "./SDPPPInternalBridge" +import StopIcon from "../../common/tsx/icons/StopIcon" // 状态显示组件 const WorkflowStatus = () => { @@ -113,6 +114,16 @@ const RunButton = () => { ); }; +// const TestButtons = () => { +// const { interrupt, clearQueue, reboot } = useSDPPPComfyCaller(); + +// return ( +// { reboot() }}> +// +// +// ) +// } + export function WorkflowEditWrap({ WorkflowEditPhotoshop }: { @@ -134,6 +145,7 @@ export function WorkflowEditWrap({
+ {/* */}
diff --git a/typescripts/src/sdsystem/comfy/socket/WorkflowCallee.mts b/typescripts/src/sdsystem/comfy/socket/WorkflowCallee.mts index 9c80243..0333f7a 100644 --- a/typescripts/src/sdsystem/comfy/socket/WorkflowCallee.mts +++ b/typescripts/src/sdsystem/comfy/socket/WorkflowCallee.mts @@ -1,3 +1,4 @@ +import i18n from "../../../common/i18n.mts"; import { Socket, SocketConstructor } from "../../../common/socket/Socket.mjs"; import { WorkflowCallerActions } from "../../../plugins/common/socket/WorkflowCaller.mjs"; import { pageStore } from "../../common/models/photoshopModels.mjs"; @@ -52,6 +53,19 @@ export interface WorkflowCalleeActions { logout: { params: { } + }, + interrupt: { + params: {} + }, + clearQueue: { + params: {} + }, + reboot: { + params: {}, + result: { + error?: string, + success: boolean + } } } @@ -71,7 +85,10 @@ export function WorkflowCalleeSocket(SocketClass: SocketConstructor) { payload.action == 'setWidgetValue' || payload.action == 'run' || payload.action == 'setNodeTitle' || - payload.action == 'logout' + payload.action == 'logout' || + payload.action == 'interrupt' || + payload.action == 'clearQueue' || + payload.action == 'reboot' ) { try { // @ts-expect-error @@ -253,6 +270,31 @@ export function WorkflowCalleeSocket(SocketClass: SocketConstructor) { node.title = title; node.setProperty('sdppp_widgetable_title', title); } + public async interrupt(params: WorkflowCalleeActions['interrupt']['params']) { + await app.api.interrupt(); + } + public async clearQueue(params: WorkflowCalleeActions['clearQueue']['params']) { + await app.api.clearItems('queue') + + } + public async reboot(params: WorkflowCalleeActions['reboot']['params']) { + const response = await fetch('./api/manager/reboot') + if (response.status == 404) { + return { + error: i18n('ComfyManager not found, cannot reboot'), + success: false + } + } else if (response.status == 200) { + return { + success: true + } + } else { + return { + error: i18n('Failed to reboot ComfyUI') + response.statusText, + success: false + } + } + } } }