aitu-app 0.6.78 → 0.6.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/assets/CanvasAudioPlayer-CSFENxi6.js +2 -0
- package/assets/ChatDrawer-CWZQP5R5.css +1 -0
- package/assets/ChatDrawer-sVEVW11M.js +11 -0
- package/assets/ChatMessagesArea-Cnb94V8-.js +7 -0
- package/assets/ChatMessagesArea-PlF5AwzD.css +1 -0
- package/assets/DeferredAIInputBar-D99l6sBS.js +8 -0
- package/assets/DrawnixDeferredFeatures-78cIu-ev.js +2 -0
- package/assets/{KnowledgeBaseContent-DcX5Jofx.js → KnowledgeBaseContent-DZ-1fPZa.js} +10 -10
- package/assets/{MVCreator-DllHozYg.js → MVCreator-BV8KDR6E.js} +8 -8
- package/assets/ModelBenchmarkWorkbench-DL6r0Z_5.js +2 -0
- package/assets/MusicAnalyzer-D9Bpmhym.css +1 -0
- package/assets/{MusicAnalyzer-DDeT6g3c.js → MusicAnalyzer-DQtjf36o.js} +2 -2
- package/assets/{MusicAnalyzer-CHcQ5t4P.js → MusicAnalyzer-u_5sy56T.js} +1 -1
- package/assets/PromptHistoryTool-B-ktaOpK.js +2 -0
- package/assets/PromptHistoryTool-BH7hq916.css +1 -0
- package/assets/ResizableDivider-BpUFdkte.js +1 -0
- package/assets/TaskQueuePanel-BLD1r7_I.js +1 -0
- package/assets/{VideoAnalyzer-BSLz1FaI.js → VideoAnalyzer-Bjv9pyDs.js} +2 -2
- package/assets/ai-generation-preferences-service-BSpgVCHz.js +1 -0
- package/assets/arc-CnA_FoJK.js +1 -0
- package/assets/{arc-BU2KKCa_.js → arc-DDvk_-VM.js} +1 -1
- package/assets/{batch-image-generation-Bg68r_Ql.js → batch-image-generation-N-lwbjRE.js} +3 -3
- package/assets/{blockDiagram-38ab4fdb-BCGEnMME.js → blockDiagram-38ab4fdb-B2G4wjZe.js} +6 -6
- package/assets/{blockDiagram-38ab4fdb-CsZR5uC5.js → blockDiagram-38ab4fdb-DBkZWrKk.js} +1 -1
- package/assets/{browser-DpICcNby.js → browser-ZXTF4AKv.js} +1 -1
- package/assets/{c4Diagram-3d4e48cf-9fuiuFdV.js → c4Diagram-3d4e48cf-BFg-wccg.js} +1 -1
- package/assets/{c4Diagram-3d4e48cf-WM4wd_GR.js → c4Diagram-3d4e48cf-CmyNnfip.js} +1 -1
- package/assets/{canvas-insertion-CdUQF7IV.js → canvas-insertion-CKIoVZ9a.js} +1 -1
- package/assets/channel-BQh3J7kz.js +1 -0
- package/assets/channel-CPsF_uSp.js +1 -0
- package/assets/{classDiagram-70f12bd4-DcYDedz1.js → classDiagram-70f12bd4-BoP-e23u.js} +2 -2
- package/assets/{classDiagram-70f12bd4-CBVHTwQu.js → classDiagram-70f12bd4-UTHJc2XA.js} +1 -1
- package/assets/classDiagram-v2-f2320105-BeBc2H-D.js +2 -0
- package/assets/{classDiagram-v2-f2320105-jpCwaHEd.js → classDiagram-v2-f2320105-Bjwz5ljW.js} +1 -1
- package/assets/{clipper-jvd5rF5a.js → clipper-NoHaeWV4.js} +1 -1
- package/assets/clone-CA2KqVCK.js +1 -0
- package/assets/createText-2e5e7dd3-Bsu7vT-L.js +8 -0
- package/assets/{createText-2e5e7dd3-x5lOIwut.js → createText-2e5e7dd3-DrWUfa-s.js} +1 -1
- package/assets/{edges-e0da2a9e-CbrF4nbD.js → edges-e0da2a9e-B9sYOHRt.js} +1 -1
- package/assets/{edges-e0da2a9e-Ch6PBwWs.js → edges-e0da2a9e-DX4IQMED.js} +1 -1
- package/assets/{erDiagram-9861fffd-DSlNVuAZ.js → erDiagram-9861fffd-B-LfsIMf.js} +1 -1
- package/assets/{erDiagram-9861fffd-Bq07elcI.js → erDiagram-9861fffd-DPdud_LA.js} +1 -1
- package/assets/{flowDb-956e92f1-Ti5YC4Vv.js → flowDb-956e92f1-C3xKlizM.js} +1 -1
- package/assets/{flowDb-956e92f1-BqPCJlZp.js → flowDb-956e92f1-Ck5oiEta.js} +1 -1
- package/assets/{flowDiagram-66a62f08-CPDuG3rY.js → flowDiagram-66a62f08-Bkt2NoHM.js} +4 -4
- package/assets/{flowDiagram-66a62f08-D3GSABFi.js → flowDiagram-66a62f08-CJnxo6dI.js} +1 -1
- package/assets/flowDiagram-v2-96b9c2cf-MnwxRDMO.js +1 -0
- package/assets/flowDiagram-v2-96b9c2cf-U7nNPvdl.js +1 -0
- package/assets/{flowchart-elk-definition-4a651766-BH09NeLA.js → flowchart-elk-definition-4a651766-2XkrsdKI.js} +2 -2
- package/assets/{flowchart-elk-definition-4a651766-BLaLPCDV.js → flowchart-elk-definition-4a651766-ec8y1a8S.js} +1 -1
- package/assets/{ganttDiagram-c361ad54-DL9ZeaEc.js → ganttDiagram-c361ad54-1TA0mZY_.js} +3 -3
- package/assets/{ganttDiagram-c361ad54-Sp9M1KHP.js → ganttDiagram-c361ad54-D-OrVtXV.js} +3 -3
- package/assets/{gitGraphDiagram-72cf32ee-BWwmRKo-.js → gitGraphDiagram-72cf32ee-Blt3RsBD.js} +1 -1
- package/assets/{gitGraphDiagram-72cf32ee-BSf1fsDV.js → gitGraphDiagram-72cf32ee-CKf6xgO1.js} +1 -1
- package/assets/{graph-g-2U7grQ.js → graph-CUYgHJmb.js} +1 -1
- package/assets/{graph--nPw8zXQ.js → graph-WeSRtsZO.js} +1 -1
- package/assets/{index-ZrVeQUWo.js → index--MqiaN5t.js} +1 -1
- package/assets/{index-C5eu4uSl.js → index-0b_TeH8L.js} +11 -11
- package/assets/{index-3862675e-BXwbZ2pz.js → index-3862675e-C2ipEQC8.js} +1 -1
- package/assets/{index-3862675e-D6Zy95zZ.js → index-3862675e-CeX6VlsU.js} +1 -1
- package/assets/{index-CLJUfzvO.js → index-B-J0JJak.js} +1 -1
- package/assets/{index-TkfyNewx.js → index-B7Hj7g41.js} +1 -1
- package/assets/{index-eZfwJ9bV.js → index-BS_v5cOh.js} +1 -1
- package/assets/index-Btk31p7r.js +1 -0
- package/assets/{index-DH12_HTj.js → index-C-Samsu3.js} +2 -2
- package/assets/index-C-llNX01.js +1 -0
- package/assets/index-C8c9icsH.js +2 -0
- package/assets/{index-D7b5fX1d.js → index-CAn2jfNg.js} +1 -1
- package/assets/{index-Dz8sghkK.js → index-CK2zt94U.js} +1 -1
- package/assets/{index-CfgvFFx3.js → index-CP51k4n6.js} +17 -17
- package/assets/{index-DI0OV6F8.js → index-CXBhIy30.js} +1 -1
- package/assets/index-C_Mj1wbj.js +2 -0
- package/assets/{index-BwSnJN93.js → index-CbfE0MBd.js} +1 -1
- package/assets/{index-C3qD42ws.js → index-CjeDxq0c.js} +1 -1
- package/assets/{index-DqMndQiP.js → index-Ct7OFnWK.js} +1 -1
- package/assets/{index-BaCHOxhI.js → index-CxxUIkx1.js} +1 -1
- package/assets/{index-B2dttXd7.js → index-D2Kc-3MO.js} +1 -1
- package/assets/{index-Bq8mPedC.js → index-DK0XEByD.js} +1 -1
- package/assets/{index-DllL1sx1.js → index-DQcV2DYj.js} +1 -1
- package/assets/{index-BP77pG9S.js → index-DSKRBuhn.js} +73 -73
- package/assets/{index-BXzGHPXz.js → index-DXqL8NRE.js} +2 -2
- package/assets/{index-B7V7-Vxz.js → index-DcLrRIlS.js} +1 -1
- package/assets/{index-D4pIkh3S.js → index-DdA-dF0D.js} +1 -1
- package/assets/{index-QkP3EC02.js → index-DdxTnVj5.js} +1 -1
- package/assets/{index-CmyOpFTN.js → index-DmrnShhc.js} +1 -1
- package/assets/{index-Bti3m-iW.js → index-QO0uGVDP.js} +1 -1
- package/assets/{index-BPR_DyGD.js → index-aIKXDB1M.js} +1 -1
- package/assets/{index-DIiIUyb-.js → index-n6JhNACm.js} +1 -1
- package/assets/{index-BWrcsh8u.js → index-qbS_W7PW.js} +1 -1
- package/assets/index-v7iKPBEu.css +1 -0
- package/assets/{infoDiagram-f8f76790-DpFqCCNv.js → infoDiagram-f8f76790-DEWQ3NXc.js} +1 -1
- package/assets/{infoDiagram-f8f76790-G2JpJJP7.js → infoDiagram-f8f76790-u_qjHFCm.js} +3 -3
- package/assets/{journeyDiagram-49397b02-DLLTobRM.js → journeyDiagram-49397b02-C8A30CBr.js} +1 -1
- package/assets/{journeyDiagram-49397b02-BdESGMrv.js → journeyDiagram-49397b02-hQJfqZih.js} +1 -1
- package/assets/{layout-WSR0vNPO.js → layout-CFKTKeqQ.js} +1 -1
- package/assets/{layout-CVkuImk4.js → layout-DvRyabpG.js} +1 -1
- package/assets/{line-D3bnG227.js → line-C72F34Po.js} +1 -1
- package/assets/{line-DQuMJveY.js → line-W5R41tQ1.js} +1 -1
- package/assets/{linear-CciP-97N.js → linear-7FXykgHM.js} +1 -1
- package/assets/{linear-Z6vFvuwc.js → linear-CVyOPUvz.js} +1 -1
- package/assets/main-BO0HWBB1.js +42 -0
- package/assets/{main-8DNjLY6L.css → main-DAuE07rf.css} +1 -1
- package/assets/{mermaid.core-CwZQb0ud.js → mermaid.core-2VcXhn43.js} +4 -4
- package/assets/{mindmap-definition-fc14e90a-BnJ8OOTI.js → mindmap-definition-fc14e90a-CcVXKGg4.js} +1 -1
- package/assets/{mindmap-definition-fc14e90a-CxQMydCW.js → mindmap-definition-fc14e90a-DRDYXe84.js} +2 -2
- package/assets/model-benchmark-launcher-C2qBiDlM.js +1 -0
- package/assets/{photo-wall-splitter-BZ88W5Zy.js → photo-wall-splitter-CFntSOdS.js} +1 -1
- package/assets/{pieDiagram-8a3498a8-BSDdkTeu.js → pieDiagram-8a3498a8-Be9dl9pU.js} +1 -1
- package/assets/{pieDiagram-8a3498a8-D6VtAoja.js → pieDiagram-8a3498a8-DXZOJYBv.js} +5 -5
- package/assets/ppt-generation-B5fKT_by.js +48 -0
- package/assets/{quadrantDiagram-120e2f19-C8k2xuBd.js → quadrantDiagram-120e2f19-DoU7aQSp.js} +3 -3
- package/assets/{quadrantDiagram-120e2f19-BbFV0VXY.js → quadrantDiagram-120e2f19-l5K9mx26.js} +1 -1
- package/assets/{requirementDiagram-deff3bca-C3xMdzJV.js → requirementDiagram-deff3bca-DN_87Wxe.js} +1 -1
- package/assets/{requirementDiagram-deff3bca-CpjqKjYZ.js → requirementDiagram-deff3bca-DOooq7kx.js} +1 -1
- package/assets/retry-image-BmIVuAVu.js +6 -0
- package/assets/{sankeyDiagram-04a897e0-Bjvig9bW.js → sankeyDiagram-04a897e0-BB33nO6_.js} +1 -1
- package/assets/{sankeyDiagram-04a897e0-BBJJgsFv.js → sankeyDiagram-04a897e0-CCa0hwml.js} +2 -2
- package/assets/{sequenceDiagram-704730f1-PFC_9IFI.js → sequenceDiagram-704730f1-CNhXZiix.js} +1 -1
- package/assets/{sequenceDiagram-704730f1-DX1MmBN_.js → sequenceDiagram-704730f1-ZqQ1QrY-.js} +1 -1
- package/assets/settings-dialog-BFuWTeQR.js +1 -0
- package/assets/{skill-dsl-parser-syNWYxFu.js → skill-dsl-parser-b-aB3P5u.js} +1 -1
- package/assets/{stateDiagram-587899a1-Dc3mI_B_.js → stateDiagram-587899a1-BBlOIJr7.js} +1 -1
- package/assets/{stateDiagram-587899a1-SFMUVAam.js → stateDiagram-587899a1-BhomZ0AN.js} +1 -1
- package/assets/{stateDiagram-v2-d93cdb3a-P4Yt2p_j.js → stateDiagram-v2-d93cdb3a-BpJsgMa0.js} +1 -1
- package/assets/stateDiagram-v2-d93cdb3a-CuOn9du2.js +1 -0
- package/assets/{styles-6aaf32cf-C3jnr3hV.js → styles-6aaf32cf-C2WEewoA.js} +1 -1
- package/assets/{styles-6aaf32cf-b6AdP7fu.js → styles-6aaf32cf-CTtf8moq.js} +1 -1
- package/assets/{styles-9a916d00-BUiD9iBe.js → styles-9a916d00-44Xi2-39.js} +1 -1
- package/assets/{styles-9a916d00-ii0XTdIm.js → styles-9a916d00-DUU3VgNe.js} +4 -4
- package/assets/{styles-c10674c1-DbTSpy3W.js → styles-c10674c1--AhWSGg7.js} +1 -1
- package/assets/styles-c10674c1-DS-wE3tK.js +116 -0
- package/assets/{svgDrawCommon-08f97a94-D4gIV05W.js → svgDrawCommon-08f97a94-CXcvtSSy.js} +1 -1
- package/assets/{svgDrawCommon-08f97a94-BK6lD4D6.js → svgDrawCommon-08f97a94-Dyqh4V2s.js} +1 -1
- package/assets/{timeline-definition-85554ec2-Bl2y548G.js → timeline-definition-85554ec2-k788753O.js} +1 -1
- package/assets/{timeline-definition-85554ec2-CWKg_JxG.js → timeline-definition-85554ec2-sw6-UuBe.js} +1 -1
- package/assets/tool-windows-BEnZdJqF.js +2948 -0
- package/assets/{tool-windows-CUNbW1Tz.css → tool-windows-D61Le6TE.css} +1 -1
- package/assets/ttd-dialog-BJzXAZ0l.js +99 -0
- package/assets/useCharacters-DRBoWvvj.css +1 -0
- package/assets/useCharacters-gsV4K8Hn.js +2 -0
- package/assets/{useWorkflowSubmission-BizuDmuw.js → useWorkflowSubmission-XRR21P6Y.js} +10 -10
- package/assets/{video-analyze-6v3Y-rUE.js → video-analyze-CpbnpSiI.js} +1 -1
- package/assets/{video-generation-DnmTlWnm.js → video-generation-BXhS7x-a.js} +2 -2
- package/assets/video-recovery-service-6G2lkWcu.js +1 -0
- package/assets/workflow-generation-utils-CYxtSHl0.js +3 -0
- package/assets/workflow-submission-service-DygSzydV.js +4 -0
- package/assets/{xychartDiagram-e933f94c-CJX9_9WF.js → xychartDiagram-e933f94c-CvTTDwPb.js} +3 -3
- package/assets/{xychartDiagram-e933f94c-Cep8CQEH.js → xychartDiagram-e933f94c-Ga9zi9ha.js} +1 -1
- package/changelog.json +45 -0
- package/idle-prefetch-manifest.json +310 -306
- package/manifest.json +3 -3
- package/package.json +1 -1
- package/precache-manifest.json +10 -10
- package/sitemap.xml +37 -0
- package/sw-debug/app.js +269 -156
- package/sw-debug/backup-restore.js +235 -103
- package/sw-debug/crypto-helper.js +116 -120
- package/sw-debug/duplex-client.js +33 -19
- package/sw-debug/gist-management.js +938 -655
- package/sw-debug/sw-communication.js +87 -50
- package/sw.js +5 -5
- package/version.json +7 -17
- package/assets/CanvasAudioPlayer-DutgwdiU.js +0 -2
- package/assets/ChatDrawer-0jNvKIoI.css +0 -1
- package/assets/ChatDrawer-E6Fog16I.js +0 -11
- package/assets/ChatMessagesArea-Bgwiz_XP.js +0 -250
- package/assets/ChatMessagesArea-DyR_wHFQ.css +0 -1
- package/assets/DeferredAIInputBar-CPkD8Cv9.js +0 -8
- package/assets/DrawnixDeferredFeatures-Cul76-88.js +0 -2
- package/assets/ModelBenchmarkWorkbench-Dv9SNYTi.js +0 -2
- package/assets/MusicAnalyzer-DhtRGpAp.css +0 -1
- package/assets/ResizableDivider-CaG9JQbJ.js +0 -1
- package/assets/TaskQueuePanel-BNhNzGp5.js +0 -1
- package/assets/ai-generation-preferences-service-BF7QkuJp.js +0 -1
- package/assets/arc-DmGoDCEL.js +0 -1
- package/assets/channel-CZjE-WNp.js +0 -1
- package/assets/channel-SXZD6bG3.js +0 -1
- package/assets/classDiagram-v2-f2320105-CsxWGkSy.js +0 -2
- package/assets/clone-C4mvvMDb.js +0 -1
- package/assets/createText-2e5e7dd3-CkXS3l7I.js +0 -5
- package/assets/flowDiagram-v2-96b9c2cf-BCcJ-cre.js +0 -1
- package/assets/flowDiagram-v2-96b9c2cf-DCVaFEgV.js +0 -1
- package/assets/index-3eqA7Bag.js +0 -1
- package/assets/index-7Q-aiwln.js +0 -4
- package/assets/index-B1XP5g7P.css +0 -1
- package/assets/index-BHPTfCZM.js +0 -1
- package/assets/index-BqHZCcen.js +0 -2
- package/assets/index-DcZrElEK.js +0 -2
- package/assets/index-gQ7LgvSv.js +0 -12
- package/assets/main-BFEkxCOK.js +0 -56
- package/assets/model-benchmark-launcher-Ct3lYXVq.js +0 -1
- package/assets/ppt-generation-FzjP_rp0.js +0 -48
- package/assets/settings-dialog-CQM4v791.js +0 -1
- package/assets/stateDiagram-v2-d93cdb3a-DmnBjHpC.js +0 -1
- package/assets/styles-c10674c1-Bt89Yy8Q.js +0 -116
- package/assets/tool-windows-DOIu9TAD.js +0 -2975
- package/assets/ttd-dialog-DI4kQSg8.js +0 -99
- package/assets/useCharacters-Chv4Ky7x.js +0 -7
- package/assets/useCharacters-OrDbG69o.css +0 -1
- package/assets/video-recovery-service-BeRoh0s2.js +0 -1
- package/assets/workflow-generation-utils-me381Cax.js +0 -3
- package/assets/workflow-submission-service-YOpo7g37.js +0 -4
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Y as t,eW as as,bB as M,T as k,eX as ts,$ as s,eY as rs,eZ as is,aJ as ns,e_ as us,e$ as cs,f0 as ls,f1 as os,cq as ds,f2 as ms,cr as fs,Z as ps,f3 as hs,f4 as Ns,bK as xs,f5 as ks,f6 as ge,c6 as Ke,c7 as we,bZ as gs,aZ as bs,a_ as vs,aQ as te,f7 as W,f8 as js,f9 as ys,aq as Q,bF as qs,fa as Ts,aR as Es,fb as ws,fc as Ye,_ as be,bo as Ds,aW as je,fd as _s,fe as Vs,bj as Is,ff as ye,fg as Y,fh as qe,y as Te}from"./tool-windows-BEnZdJqF.js";import{R as Ee}from"./retry-image-BmIVuAVu.js";/* empty css */const Us=({taskType:e,taskStatus:a,realProgress:h,startedAt:N,mediaUrl:l,isImageLoading:m=!1,onImageLoaded:V,onImageError:y,estimatedDuration:v=is})=>{const[S,p]=t.useState(1),D=t.useRef(null),{displayProgress:c}=as({taskType:e,taskStatus:a,startedAt:N,realProgress:h,mediaUrl:l,isImageLoading:m,estimatedDuration:v}),i=90,n=80,j=.5,b=1.2;if(t.useEffect(()=>{const B=D.current;if(!B)return;const ee=()=>{const{width:H,height:se}=B.getBoundingClientRect(),U=se-10,O=H-20,F=U/i,E=O/n,Z=Math.min(F,E,b);p(Math.max(Z,j))};ee();const I=new ResizeObserver(ee);return I.observe(B),()=>I.disconnect()},[]),a!==M.PROCESSING)return null;const f=c??0,x=e===k.IMAGE?ts(f,!!l,m):e===k.AUDIO?f<10?"提交任务...":f<45?"生成旋律...":f<85?"渲染音轨...":"整理结果...":f<10?"准备中...":f<50?"生成中...":f<90?"渲染中...":"即将完成...",g=["task-progress-overlay",e===k.VIDEO||e===k.AUDIO?"task-progress-overlay--video":"",l&&m?"task-progress-overlay--loading":""].filter(Boolean).join(" ");return s.jsxDEV("div",{ref:D,className:g,children:[s.jsxDEV("div",{className:"task-progress-overlay__backdrop"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskProgressOverlay.tsx",lineNumber:142,columnNumber:7},void 0),s.jsxDEV("div",{className:"task-progress-overlay__pulse"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskProgressOverlay.tsx",lineNumber:143,columnNumber:7},void 0),s.jsxDEV("div",{className:"task-progress-overlay__dots"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskProgressOverlay.tsx",lineNumber:144,columnNumber:7},void 0),s.jsxDEV("div",{className:"task-progress-overlay__content",style:{transform:`scale(${S})`},children:s.jsxDEV(rs,{progress:f,progressMode:"determinate",statusText:x,tone:l&&m?"loading":"default",className:"task-progress-overlay__progress"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskProgressOverlay.tsx",lineNumber:151,columnNumber:9},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskProgressOverlay.tsx",lineNumber:147,columnNumber:7},void 0),s.jsxDEV("div",{className:"task-progress-overlay__bar",children:s.jsxDEV("div",{className:"task-progress-overlay__bar-fill",style:{width:`${f}%`}},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskProgressOverlay.tsx",lineNumber:162,columnNumber:9},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskProgressOverlay.tsx",lineNumber:161,columnNumber:7},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskProgressOverlay.tsx",lineNumber:140,columnNumber:5},void 0)},Cs=500;function Ss(e){if(typeof e!="number"||!Number.isFinite(e)||e<=0)return null;const a=Math.round(e),h=Math.floor(a/60),N=a%60;return`${h}:${String(N).padStart(2,"0")}`}function fe(e){return typeof e=="string"&&e.trim()?e.trim():void 0}function Rs(e){if(!e)return!1;const a=e.toLowerCase();return a==="kling_video"||a.startsWith("kling-v")}function Ls(e){if(e==="text2video")return"文生视频";if(e==="image2video")return"图生视频"}function As(e){return e==="std"?"std 高性能":e==="pro"?"pro 高表现":e}function De(e){const a=e.params.videoAnalyzerAction;return a==="analyze"||a==="rewrite"?a:null}function Ms(e){const a=De(e);if(a==="analyze")return fe(e.params.videoAnalyzerSourceLabel)||null;if(a==="rewrite"){const h=fe(e.params.prompt);return h?h.replace(/^改编脚本:\s*/,""):null}return null}function Ps(e){const a=De(e);return a==="analyze"?"视频分析":a==="rewrite"?"脚本改编":null}function Os(e){switch(e){case M.PENDING:case M.PROCESSING:return"primary";case M.COMPLETED:return"success";case M.FAILED:return"danger";case M.CANCELLED:return"default";default:return"default"}}function zs(e){switch(e){case M.PENDING:case M.PROCESSING:return"处理中";case M.COMPLETED:return"已完成";case M.FAILED:return"失败";case M.CANCELLED:return"已取消";default:return"未知"}}const Ze=ns.memo(({task:e,selectionMode:a=!1,isSelected:h=!1,isCompact:N,onSelectionChange:l,onRetry:m,onDelete:V,onDownload:y,onInsert:v,onCopy:S,onPreviewOpen:p,onEdit:D,onExtractCharacter:c})=>{var J,Ne,he,_e,Ve,Ie,Ue,Ce,Se,Re,Le,Ae,Me,Pe,Oe,ze,He,$e,Fe,Ge,We,Be,Xe;const[i,n]=t.useState(null),[j,b]=t.useState(!1),f=t.useRef(null),x=e.status===M.COMPLETED,g=e.status===M.FAILED,B=e.status===M.CANCELLED,ee=g||B,I=N!==void 0?N:j;t.useEffect(()=>{if(N!==void 0)return;const d=f.current;if(!d)return;const ae=new ResizeObserver(xe=>{for(const ke of xe){const ss=ke.contentRect.width;b(ss<Cs)}});return ae.observe(d),()=>ae.disconnect()},[N]);const H=((J=e.params.storyboard)==null?void 0:J.enabled)===!0,se=x&&e.type===k.VIDEO&&us(e.remoteId)&&cs(e.params.model)&&!H,U=e.type===k.CHARACTER,O=e.type===k.AUDIO,F=e.type===k.CHAT,E=O&&ls(e.result),Z=e.type===k.IMAGE||e.type===k.VIDEO||e.type===k.AUDIO&&!E,ue=os(e.result),oe=ds(e.result,e.params.title||e.params.prompt),de=ms(ue),ce=fs(e.result),re=De(e),X=Ms(e),me=Ps(e),G=U?x&&((Ne=e.result)!=null&&Ne.characterUsername)?`@${e.result.characterUsername}`:"角色创建中...":F?((he=e.result)==null?void 0:he.title)||e.params.prompt||((_e=e.result)==null?void 0:_e.chatResponse):E?oe||de||e.params.prompt:((Ve=e.result)==null?void 0:Ve.title)||e.params.title||e.params.prompt,z=e.params.params&&typeof e.params.params=="object"?e.params.params:null,u=e.type===k.AUDIO&&!E?Ss((Ie=e.result)==null?void 0:Ie.duration):null,q=e.type===k.VIDEO&&Rs(e.params.model),A=fe(z==null?void 0:z.model_name)||((Ue=e.params.model)!=null&&Ue.toLowerCase().startsWith("kling-v")?e.params.model:void 0),_=As(fe(z==null?void 0:z.mode)),$=fe(z==null?void 0:z.klingAction2),ne=Ls($);fe(z==null?void 0:z.cfg_scale);const ie=E?void 0:((Se=(Ce=e.result)==null?void 0:Ce.urls)==null?void 0:Se[0])||((Re=e.result)==null?void 0:Re.url),r=e.type===k.IMAGE&&ie?ps(ie):ie,{isCached:o,cacheWarning:T}=hs(U||O?void 0:r),w=Z&&!O&&!o?T||((Le=e.result)==null?void 0:Le.cacheWarning):void 0,K=w?`${w.message}${w.expiresHint?`
|
|
2
|
+
${w.expiresHint}`:""}`:"",R=E?0:((Me=(Ae=e.result)==null?void 0:Ae.urls)==null?void 0:Me.length)||((Pe=e.result)!=null&&Pe.url?1:0),P=t.useMemo(()=>JSON.stringify({taskId:e.id,taskType:e.type,taskStatus:e.status,hasMultipleResults:R>1}),[R,e.id,e.status,e.type]),C=O?E||(Oe=e.result)==null?void 0:Oe.previewImageUrl:r,L=Ns(C,e.type===k.IMAGE?"image":void 0,"small");t.useEffect(()=>{if(x&&C&&e.type===k.IMAGE){const d=new Image;d.onload=()=>{n({width:d.naturalWidth,height:d.naturalHeight})},d.onerror=()=>{n(null)},d.src=C}},[x,C,e.type]);const pe=d=>{const ae=d.target;ae.closest("button")||ae.closest(".t-checkbox")||ae.closest("a")||ae.closest(".task-item__preview")||(a?l==null||l(e.id,!h):x&&r&&Z&&(p==null||p()))},le=d=>{d.stopPropagation(),x&&r&&Z&&(p==null||p())};return s.jsxDEV("div",{ref:f,className:`task-item ${a?"task-item--selection-mode":""} ${h?"task-item--selected":""} ${I?"task-item--compact":"task-item--wide"} task-item--${e.status.toLowerCase()}`,onClick:pe,children:[a&&s.jsxDEV("div",{className:"task-item__checkbox",children:s.jsxDEV(xs,{checked:h,onChange:d=>l==null?void 0:l(e.id,d)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:516,columnNumber:13},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:515,columnNumber:11},void 0),(x||g||e.status===M.PROCESSING)&&(C||U||F||e.type===k.VIDEO||e.type===k.IMAGE||e.type===k.AUDIO)&&s.jsxDEV("div",{className:"task-item__preview-wrapper",children:s.jsxDEV("div",{className:"task-item__preview","data-track":"task_click_preview",onClick:le,children:g?s.jsxDEV("div",{className:"task-item__preview-failed",children:[s.jsxDEV(ks,{size:"24px"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:542,columnNumber:21},void 0),s.jsxDEV("span",{children:"生成失败"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:543,columnNumber:21},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:541,columnNumber:19},void 0):e.status===M.PROCESSING?F?s.jsxDEV("div",{className:"task-item__preview-placeholder",children:s.jsxDEV("span",{children:re==="analyze"?`视频分析中 ${Math.round(e.progress??0)}%`:re==="rewrite"?`脚本改编中 ${Math.round(e.progress??0)}%`:"生成文本中"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:548,columnNumber:23},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:547,columnNumber:21},void 0):s.jsxDEV(Us,{taskType:e.type,taskStatus:e.status,realProgress:e.progress,startedAt:e.startedAt,mediaUrl:C},e.startedAt,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:558,columnNumber:21},void 0):s.jsxDEV(s.Fragment,{children:[e.type===k.IMAGE&&r?s.jsxDEV(s.Fragment,{children:[s.jsxDEV(Ee,{src:L||r,alt:"Generated",maxRetries:5,fallback:s.jsxDEV("div",{className:"task-item__preview-placeholder",children:s.jsxDEV("span",{children:"图片加载失败"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:578,columnNumber:31},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:577,columnNumber:29},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:572,columnNumber:25},void 0),R>1&&s.jsxDEV("span",{className:"task-item__multi-badge",children:[R,"张"]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:583,columnNumber:27},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:571,columnNumber:23},void 0):O&&C?s.jsxDEV(s.Fragment,{children:[s.jsxDEV(Ee,{src:C,alt:G||"音频封面",maxRetries:3,fallback:s.jsxDEV("div",{className:"task-item__preview-placeholder",children:[s.jsxDEV(ge,{size:"24px"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:596,columnNumber:31},void 0),s.jsxDEV("span",{children:"音频封面"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:597,columnNumber:31},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:595,columnNumber:29},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:590,columnNumber:25},void 0),s.jsxDEV("div",{className:"task-item__video-play-overlay",children:s.jsxDEV(ge,{size:"28px"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:602,columnNumber:27},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:601,columnNumber:25},void 0),R>1&&s.jsxDEV("span",{className:"task-item__multi-badge",children:[R,"首"]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:605,columnNumber:27},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:589,columnNumber:23},void 0):E?s.jsxDEV("div",{className:"task-item__preview-placeholder",children:[s.jsxDEV(Ke,{size:"24px"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:612,columnNumber:25},void 0),s.jsxDEV("span",{children:"歌词"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:613,columnNumber:25},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:611,columnNumber:23},void 0):F?s.jsxDEV("div",{className:"task-item__preview-placeholder",children:s.jsxDEV("span",{children:"文本"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:617,columnNumber:25},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:616,columnNumber:23},void 0):U&&((ze=e.result)!=null&&ze.characterProfileUrl)?s.jsxDEV("div",{className:"task-item__character-preview",children:s.jsxDEV(Ee,{src:e.result.characterProfileUrl,alt:`@${e.result.characterUsername}`,maxRetries:5,fallback:s.jsxDEV("div",{className:"task-item__character-fallback",children:s.jsxDEV(we,{size:"32px"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:627,columnNumber:31},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:626,columnNumber:29},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:621,columnNumber:25},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:620,columnNumber:23},void 0):r?s.jsxDEV(s.Fragment,{children:[s.jsxDEV(gs,{src:r,poster:(He=e.result)==null?void 0:He.previewImageUrl,alt:G||"视频预览",thumbnailSize:"small",videoProps:{muted:!0,playsInline:!0,preload:"metadata"}},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:634,columnNumber:25},void 0),s.jsxDEV("div",{className:"task-item__video-play-overlay",children:s.jsxDEV(ge,{size:"32px"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:647,columnNumber:27},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:646,columnNumber:25},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:633,columnNumber:23},void 0):s.jsxDEV("div",{className:"task-item__preview-placeholder",children:e.type===k.IMAGE?s.jsxDEV(bs,{size:"24px"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:653,columnNumber:27},void 0):e.type===k.VIDEO?s.jsxDEV(vs,{size:"24px"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:655,columnNumber:27},void 0):s.jsxDEV(s.Fragment,{children:[s.jsxDEV(ge,{size:"24px"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:658,columnNumber:29},void 0),s.jsxDEV("span",{children:"音频"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:659,columnNumber:29},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:657,columnNumber:27},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:651,columnNumber:23},void 0),w&&s.jsxDEV(te,{content:K,showArrow:!1,children:s.jsxDEV("span",{className:"task-item__cache-warning-badge",children:"需下载"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:666,columnNumber:25},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:665,columnNumber:23},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:568,columnNumber:19},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:534,columnNumber:15},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:533,columnNumber:13},void 0),s.jsxDEV("div",{className:"task-item__body",children:[s.jsxDEV("div",{className:"task-item__prompt-area",children:[s.jsxDEV(te,{content:e.params.prompt,showArrow:!1,children:s.jsxDEV("div",{className:"task-item__prompt",children:G},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:680,columnNumber:15},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:679,columnNumber:13},void 0),F&&X&&s.jsxDEV(te,{content:X,showArrow:!1,children:s.jsxDEV("div",{className:"task-item__subtitle",children:X},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:684,columnNumber:17},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:683,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:678,columnNumber:11},void 0),s.jsxDEV("div",{className:"task-item__info-area",children:[s.jsxDEV("div",{className:"task-item__content-row",children:[s.jsxDEV("div",{className:"task-item__meta",children:[s.jsxDEV("div",{className:"task-item__tags",children:[s.jsxDEV(W,{theme:Os(e.status),variant:"light",className:"task-item__status-tag",children:zs(e.status)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:695,columnNumber:19},void 0),e.params.model&&s.jsxDEV(W,{variant:"outline",className:"task-item__model-tag",children:e.params.model},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:705,columnNumber:21},void 0),F&&me&&s.jsxDEV(W,{variant:"outline",children:me},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:710,columnNumber:21},void 0),q&&A&&s.jsxDEV(W,{variant:"outline",children:A},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:713,columnNumber:21},void 0),q&&_&&s.jsxDEV(W,{variant:"outline",children:_},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:716,columnNumber:21},void 0),q&&ne&&s.jsxDEV(W,{variant:"outline",children:ne},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:719,columnNumber:21},void 0),e.type===k.VIDEO&&e.params.seconds&&s.jsxDEV(W,{variant:"outline",children:[e.params.seconds,"s"]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:724,columnNumber:21},void 0),e.type===k.VIDEO&&e.params.size&&s.jsxDEV(W,{variant:"outline",children:e.params.size},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:727,columnNumber:21},void 0),u&&s.jsxDEV(W,{variant:"outline",children:u},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:730,columnNumber:21},void 0),e.type===k.AUDIO&&e.params.mv&&!E&&s.jsxDEV(W,{variant:"outline",children:e.params.mv},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:735,columnNumber:23},void 0),e.type===k.AUDIO&&e.params.tags&&!E&&s.jsxDEV(W,{variant:"outline",children:(($e=String(e.params.tags).split(",")[0])==null?void 0:$e.trim())||"音频"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:740,columnNumber:23},void 0),E&&s.jsxDEV(W,{variant:"outline",children:"歌词"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:745,columnNumber:36},void 0),E&&ce[0]&&s.jsxDEV(W,{variant:"outline",children:ce[0]},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:747,columnNumber:21},void 0),e.params.batchId&&typeof e.params.batchIndex=="number"&&typeof e.params.batchTotal=="number"&&s.jsxDEV(W,{variant:"outline",children:["批量 ",e.params.batchIndex+1,"/",e.params.batchTotal]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:752,columnNumber:23},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:693,columnNumber:17},void 0),s.jsxDEV("div",{className:"task-item__details",children:[s.jsxDEV("span",{className:"task-item__time",children:js(e.createdAt)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:760,columnNumber:19},void 0),e.startedAt&&s.jsxDEV("span",{className:"task-item__duration",children:["·"," ",ys((e.completedAt||Date.now())-e.startedAt)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:764,columnNumber:21},void 0),(()=>{var xe,ke;const d=(i==null?void 0:i.width)||((xe=e.result)==null?void 0:xe.width)||e.params.width,ae=(i==null?void 0:i.height)||((ke=e.result)==null?void 0:ke.height)||e.params.height;return d&&ae?s.jsxDEV("span",{className:"task-item__size",children:[" ","· ",d,"x",ae]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:782,columnNumber:25},void 0):null})(),u&&s.jsxDEV("span",{className:"task-item__size",children:[" · ",u]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:791,columnNumber:21},void 0),x&&((Fe=e.result)==null?void 0:Fe.url)&&!E&&s.jsxDEV("a",{href:e.result.url,target:"_blank",rel:"noopener noreferrer",className:"task-item__link","data-track":"task_click_open_link",onClick:d=>d.stopPropagation(),children:"· 打开链接"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:797,columnNumber:21},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:759,columnNumber:17},void 0),(e.type===k.VIDEO||e.type===k.AUDIO||e.type===k.CHAT&&typeof e.progress=="number")&&e.status===M.PROCESSING&&s.jsxDEV("div",{className:"task-item__progress-container",children:s.jsxDEV("div",{className:"task-item__progress-bar",children:s.jsxDEV("div",{className:`task-item__progress-fill task-item__progress-fill--${e.status}`,style:{width:`${e.progress??0}%`}},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:818,columnNumber:25},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:817,columnNumber:23},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:816,columnNumber:21},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:692,columnNumber:15},void 0),s.jsxDEV("div",{className:"task-item__actions",children:[s.jsxDEV("div",{className:"task-item__secondary-actions",children:[x&&((Ge=e.result)==null?void 0:Ge.url)&&!U&&s.jsxDEV(te,{content:"下载",children:s.jsxDEV(Q,{size:"small",variant:"text",icon:s.jsxDEV(qs,{},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:835,columnNumber:31},void 0),"data-track":"task_click_download","data-track-params":P,onClick:d=>{d.stopPropagation(),y==null||y(e.id)}},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:832,columnNumber:23},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:831,columnNumber:21},void 0),x&&E&&ue&&s.jsxDEV(te,{content:"复制歌词",children:s.jsxDEV(Q,{size:"small",variant:"text",icon:s.jsxDEV(Ke,{},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:851,columnNumber:31},void 0),onClick:d=>{d.stopPropagation(),S==null||S(e.id)}},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:848,columnNumber:23},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:847,columnNumber:21},void 0),!U&&!O&&!F&&s.jsxDEV(te,{content:"编辑",children:s.jsxDEV(Q,{size:"small",variant:"text",icon:s.jsxDEV(Ts,{},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:865,columnNumber:31},void 0),onClick:d=>{d.stopPropagation(),D==null||D(e.id)}},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:862,columnNumber:23},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:861,columnNumber:21},void 0),se&&s.jsxDEV(te,{content:"角色",children:s.jsxDEV(Q,{size:"small",variant:"text",icon:s.jsxDEV(we,{},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:879,columnNumber:31},void 0),onClick:d=>{d.stopPropagation(),c==null||c(e.id)}},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:876,columnNumber:23},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:875,columnNumber:21},void 0),s.jsxDEV(te,{content:"删除",children:s.jsxDEV(Q,{size:"small",variant:"text",className:"task-item__delete-btn",icon:s.jsxDEV(Es,{},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:893,columnNumber:29},void 0),onClick:d=>{d.stopPropagation(),V==null||V(e.id)}},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:889,columnNumber:21},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:888,columnNumber:19},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:829,columnNumber:17},void 0),x&&((((We=e.result)==null?void 0:We.url)||((Be=e.result)==null?void 0:Be.chatResponse))&&!U||E)&&s.jsxDEV(Q,{size:"small",theme:"primary",className:"task-item__primary-action","data-track":"task_click_insert","data-track-params":P,onClick:d=>{d.stopPropagation(),v==null||v(e.id)},children:"插入"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:907,columnNumber:21},void 0),ee&&s.jsxDEV(Q,{size:"small",theme:"primary",className:"task-item__primary-action","data-track":"task_click_retry","data-track-params":P,onClick:d=>{d.stopPropagation(),m==null||m(e.id)},children:"重试"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:923,columnNumber:19},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:827,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:691,columnNumber:13},void 0),g&&e.error&&s.jsxDEV("div",{className:"task-item__error",children:s.jsxDEV("div",{className:"task-item__error-message",children:[e.error.message,((Xe=e.error.details)==null?void 0:Xe.originalError)&&s.jsxDEV(te,{content:s.jsxDEV("div",{className:"task-item__error-details-tooltip",children:[s.jsxDEV("div",{className:"task-item__error-details-title",children:"详细错误:"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:949,columnNumber:27},void 0),s.jsxDEV("div",{className:"task-item__error-details-content",children:e.error.details.originalError},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:952,columnNumber:27},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:948,columnNumber:25},void 0),theme:"light",placement:"bottom",children:s.jsxDEV("span",{className:"task-item__error-details-link",onClick:d=>d.stopPropagation(),children:"[详情]"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:960,columnNumber:23},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:946,columnNumber:21},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:943,columnNumber:17},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:942,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:690,columnNumber:11},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:676,columnNumber:9},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/TaskItem.tsx",lineNumber:504,columnNumber:7},void 0)},(e,a)=>{var h,N;return e.task.id===a.task.id&&e.task.status===a.task.status&&e.task.progress===a.task.progress&&((h=e.task.error)==null?void 0:h.message)===((N=a.task.error)==null?void 0:N.message)&&e.task.result===a.task.result&&e.isSelected===a.isSelected&&e.selectionMode===a.selectionMode&&e.isCompact===a.isCompact}),Hs=new Set,$s=140,Je=0,Fs=3,Qe=375,Gs=20,Zs=({tasks:e,selectionMode:a=!1,selectedTaskIds:h,onSelectionChange:N,onRetry:l,onDelete:m,onDownload:V,onInsert:y,onCopy:v,onEdit:S,onPreviewOpen:p,onExtractCharacter:D,className:c="",emptyContent:i,isCompact:n,hasMore:j=!1,isLoadingMore:b=!1,onLoadMore:f,totalCount:x,loadedCount:g,allLoadedText:B,allLoadedHint:ee})=>{const I=h??Hs,H=t.useRef(null),se=t.useRef(null),U=t.useRef(null),O=t.useRef(0),[F,E]=t.useState(()=>typeof window<"u"&&window.innerWidth<Qe),[Z,ue]=t.useState(!1),oe=n!==void 0?n:F,de=u=>{let q=u;for(;q;){const _=getComputedStyle(q).overflowY;if((_==="auto"||_==="scroll")&&q.scrollHeight>q.clientHeight)return q;q=q.parentElement}return null};t.useEffect(()=>{if(!j||!f)return;const u=H.current;if(!u)return;const q=setTimeout(()=>{const _=u.scrollHeight>u.clientHeight?u:de(u);if(U.current=_,!_)return;const $=()=>{const{scrollTop:ne,scrollHeight:ie,clientHeight:r}=_,o=ie-ne-r,T=Date.now();T-O.current<500||o<300&&j&&!b&&(O.current=T,f())};_.addEventListener("scroll",$,{passive:!0}),$(),u.__loadMoreCleanup=()=>{_.removeEventListener("scroll",$)}},150);return()=>{var A;clearTimeout(q),(A=u.__loadMoreCleanup)==null||A.call(u)}},[j,b,f,e.length]),t.useEffect(()=>{const u=H.current;if(!u)return;const q=setTimeout(()=>{const _=u.scrollHeight>u.clientHeight?u:de(u);if(U.current=_,!_)return;const $=()=>{ue(_.scrollTop>_.clientHeight)};_.addEventListener("scroll",$),$(),u.__scrollCleanup=()=>{_.removeEventListener("scroll",$)}},100);return()=>{var A;clearTimeout(q),(A=u.__scrollCleanup)==null||A.call(u)}},[e.length]);const ce=()=>{const u=U.current||H.current;u&&(u.scrollTop=0)};t.useEffect(()=>{if(n!==void 0)return;const u=H.current;if(!u)return;const q=u,A=$=>{const ne=$??q.getBoundingClientRect().width;E(ne<Qe)},_=new ResizeObserver($=>{A($[0].contentRect.width)});return _.observe(q),A(),()=>{_.disconnect()}},[n,H.current]);const re=e.length>Gs,X=ws({count:re?e.length:0,getScrollElement:()=>H.current,estimateSize:()=>$s+Je,overscan:Fs,enabled:re,measureElement:u=>u.offsetHeight});if(e.length===0)return s.jsxDEV("div",{className:`virtual-task-list virtual-task-list--empty ${c}`,children:i},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:280,columnNumber:7},void 0);const me=e.length||g||0,G=()=>s.jsxDEV(s.Fragment,{children:[b&&s.jsxDEV("div",{className:"virtual-task-list__loading-more",children:[s.jsxDEV("span",{className:"virtual-task-list__loading-spinner"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:297,columnNumber:11},void 0),s.jsxDEV("span",{children:"加载中..."},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:298,columnNumber:11},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:296,columnNumber:9},void 0),j&&!b&&x!==void 0&&x>0&&s.jsxDEV("div",{className:"virtual-task-list__pagination-info",children:["已加载 ",me," / ",x]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:306,columnNumber:11},void 0),!j&&e.length>0&&x!==void 0&&x>50&&s.jsxDEV("div",{className:"virtual-task-list__no-more",children:ee?s.jsxDEV(te,{content:ee,children:s.jsxDEV("span",{children:B||`已加载全部 ${x} 个任务`},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:318,columnNumber:17},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:317,columnNumber:15},void 0):B||`已加载全部 ${x} 个任务`},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:315,columnNumber:11},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:293,columnNumber:5},void 0);if(!re)return s.jsxDEV("div",{ref:se,className:`virtual-task-list-container ${c}`,style:{height:"100%",position:"relative",display:"flex",flexDirection:"column"},children:[s.jsxDEV("div",{ref:H,className:"virtual-task-list-scrollarea",style:{flex:1,overflow:"auto"},children:[e.map(u=>s.jsxDEV(Ze,{task:u,selectionMode:a,isSelected:I.has(u.id),isCompact:oe,onSelectionChange:N,onRetry:l,onDelete:m,onDownload:V,onInsert:y,onEdit:S,onPreviewOpen:()=>p==null?void 0:p(u.id),onExtractCharacter:D},u.id,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:349,columnNumber:13},void 0)),s.jsxDEV(G,{},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:365,columnNumber:11},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:343,columnNumber:9},void 0),Z&&s.jsxDEV(Q,{shape:"circle",variant:"base",theme:"default",icon:s.jsxDEV(Ye,{},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:373,columnNumber:19},void 0),onClick:ce,className:"virtual-task-list__back-to-top"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:369,columnNumber:11},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:333,columnNumber:7},void 0);const z=X.getVirtualItems();return s.jsxDEV("div",{ref:se,className:`virtual-task-list-container ${c}`,style:{height:"100%",width:"100%",position:"relative",display:"flex",flexDirection:"column"},children:[s.jsxDEV("div",{ref:H,className:"virtual-task-list-scrollarea",style:{flex:1,width:"100%",overflow:"auto"},children:[s.jsxDEV("div",{style:{height:`${X.getTotalSize()}px`,width:"100%",position:"relative"},children:z.map(u=>{const q=e[u.index];return q?s.jsxDEV("div",{"data-index":u.index,ref:A=>{A&&X.measureElement(A)},style:{position:"absolute",top:0,left:0,width:"100%",transform:`translateY(${u.start}px)`,paddingBottom:`${Je}px`},children:s.jsxDEV(Ze,{task:q,selectionMode:a,isSelected:I.has(q.id),isCompact:oe,onSelectionChange:N,onRetry:l,onDelete:m,onDownload:V,onInsert:y,onCopy:v,onEdit:S,onPreviewOpen:()=>p==null?void 0:p(q.id),onExtractCharacter:D},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:435,columnNumber:17},void 0)},q.id,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:418,columnNumber:15},void 0):null})},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:406,columnNumber:9},void 0),s.jsxDEV(G,{},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:454,columnNumber:9},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:397,columnNumber:7},void 0),Z&&s.jsxDEV(Q,{shape:"circle",variant:"base",theme:"default",icon:s.jsxDEV(Ye,{},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:462,columnNumber:17},void 0),onClick:ce,className:"virtual-task-list__back-to-top"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:458,columnNumber:9},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/task-queue/VirtualTaskList.tsx",lineNumber:386,columnNumber:5},void 0)};function Ws(e,a){const[h,N]=t.useState(a||null),[l,m]=t.useState(!1),[V,y]=t.useState(!0),[v,S]=t.useState(null),p=t.useRef("none"),D=t.useCallback(async()=>{if(y(!0),!a){N(null),m(!1),y(!1);return}const c=await be.getCachedUrl(a);c?(v&&v!==c&&URL.revokeObjectURL(v),S(c),N(c),m(!0)):a?(N(a),m(!1)):(N(null),m(!1)),y(!1)},[a,v]);return t.useEffect(()=>{D(),a&&(p.current=be.getCacheStatus(a))},[e,a]),t.useEffect(()=>be.subscribe(()=>{if(!a)return;const i=be.getCacheStatus(a),n=p.current;i!==n&&(p.current=i,(i==="cached"||i==="none")&&D())}),[a,D]),t.useEffect(()=>()=>{v&&URL.revokeObjectURL(v)},[v]),{url:h,isFromCache:l,isLoading:V}}const es=1,ve=3,Bs=({videoUrl:e,videoDuration:a,onConfirm:h,onCancel:N,disabled:l=!1})=>{const m=t.useRef(null),V=t.useRef(null),y=t.useRef(null),v=t.useRef(null),S=t.useRef(0),[p,D]=t.useState(!0),[c,i]=t.useState(a),[n,j]=t.useState(0),[b,f]=t.useState(Math.min(ve,a)),[x,g]=t.useState(0),[B,ee]=t.useState(""),[I,H]=t.useState(!1),[se,U]=t.useState(null),[O,F]=t.useState([]),[E,Z]=t.useState(!1),ue=b-n,oe=c>0?ue/c*100:100,de=c>0?n/c*100:0;t.useEffect(()=>(e&&(D(!0),ee(""),F([]),H(!1),U(null)),()=>{v.current!==null&&cancelAnimationFrame(v.current)}),[e]);const ce=()=>{const r=m.current;if(r){const o=r.duration;i(o),H(!0),f(Math.min(ve,o))}},re=t.useCallback(async()=>{const r=m.current;if(!(!r||!I||c<=0||E)){Z(!0);try{const T=Math.max(4,Math.ceil(c*2)),w=c/T,K=[],R=document.createElement("canvas"),P=R.getContext("2d");if(!P)return;const C=50,L=r.videoWidth/r.videoHeight||16/9,pe=Math.round(C*L);R.width=pe,R.height=C;for(let le=0;le<T;le++){const J=Math.min((le+.5)*w,c-.01);await new Promise(Ne=>{const he=()=>{r.removeEventListener("seeked",he),Ne()};r.addEventListener("seeked",he),r.currentTime=J}),P.drawImage(r,0,0,pe,C),K.push(R.toDataURL("image/jpeg",.5))}F(K),r.currentTime=n}catch(o){console.warn("Failed to generate frame strip:",o)}finally{Z(!1)}}},[I,c,E,n]);t.useEffect(()=>{if(I&&c>0&&O.length===0&&!E){const r=setTimeout(()=>{re()},100);return()=>clearTimeout(r)}},[I,c,O.length,E,re]);const X=t.useCallback(()=>{const r=m.current,o=V.current;if(!r||!o)return;const T=o.getContext("2d");if(T)try{o.width=r.videoWidth,o.height=r.videoHeight,T.drawImage(r,0,0,o.width,o.height);const w=o.toDataURL("image/jpeg",.8);ee(w),D(!1)}catch(w){console.warn("Failed to generate frame image:",w)}},[]),me=t.useCallback(()=>{const r=m.current;r&&p&&(r.currentTime===0||Math.abs(r.currentTime-n)<.1)&&X()},[p,n,X]),G=t.useCallback(r=>{const o=m.current;!o||!I||Math.abs(r-S.current)<.1||(S.current=r,o.readyState>=2&&(o.currentTime=r))},[I]),z=t.useCallback(()=>{X()},[X]);t.useEffect(()=>{if(I&&c>0){g(n);const r=m.current;r&&r.readyState>=2&&(r.currentTime=n)}},[I,c]);const u=t.useCallback(r=>{const o=y.current;if(!o)return 0;const T=o.getBoundingClientRect(),w=r.clientX-T.left;return Math.max(0,Math.min(1,w/T.width))*c},[c]),q=r=>{if(l||!I)return;r.preventDefault(),r.stopPropagation(),U("left");const o=b,T=K=>{const R=u(K),P=o-es,C=Math.max(0,o-ve),L=Math.max(C,Math.min(P,R));j(L),g(L),G(L)},w=()=>{U(null),document.removeEventListener("mousemove",T),document.removeEventListener("mouseup",w),G(n)};document.addEventListener("mousemove",T),document.addEventListener("mouseup",w)},A=r=>{if(l||!I)return;r.preventDefault(),r.stopPropagation(),U("right");const o=n,T=K=>{const R=u(K),P=o+es,C=Math.min(c,o+ve),L=Math.max(P,Math.min(C,R));f(L),g(L),G(L)},w=()=>{U(null),document.removeEventListener("mousemove",T),document.removeEventListener("mouseup",w),G(b)};document.addEventListener("mousemove",T),document.addEventListener("mouseup",w)},_=r=>{if(l||!I)return;r.preventDefault(),U("center");const o=y.current;if(!o)return;const T=o.getBoundingClientRect(),w=r.clientX,K=n,R=b-n,P=L=>{const le=(L.clientX-w)/T.width*c;let J=K+le;J=Math.max(0,Math.min(c-R,J)),j(J),f(J+R),g(J),G(J)},C=()=>{U(null),document.removeEventListener("mousemove",P),document.removeEventListener("mouseup",C),G(n)};document.addEventListener("mousemove",P),document.addEventListener("mouseup",C)},$=r=>{if(l||!I||se||r.target.closest(".character-time-selector__range"))return;const T=y.current;if(!T)return;const w=T.getBoundingClientRect(),R=(r.clientX-w.left)/w.width*c,P=b-n,C=P/2;let L=R-C;L=Math.max(0,Math.min(c-P,L)),j(L),f(L+P),g(L),G(L)},ne=()=>{h(Math.round(n),Math.round(b))},ie=r=>r.toFixed(1)+"s";return s.jsxDEV("div",{className:`character-time-selector ${se?"is-dragging":""}`,children:[s.jsxDEV("video",{ref:m,src:e,style:{display:"none"},muted:!0,playsInline:!0,preload:"auto",crossOrigin:"anonymous",onLoadedMetadata:ce,onSeeked:z,onCanPlay:me},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:382,columnNumber:7},void 0),s.jsxDEV("canvas",{ref:V,style:{display:"none"}},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:396,columnNumber:7},void 0),s.jsxDEV("div",{className:"character-time-selector__preview",children:[p?s.jsxDEV("div",{className:"character-time-selector__loading",children:[s.jsxDEV("div",{className:"character-time-selector__spinner"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:402,columnNumber:13},void 0),s.jsxDEV("span",{children:"加载中..."},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:403,columnNumber:13},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:401,columnNumber:11},void 0):B?s.jsxDEV("img",{src:B,alt:"Video frame",className:"character-time-selector__frame"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:406,columnNumber:11},void 0):s.jsxDEV("div",{className:"character-time-selector__placeholder",children:"视频帧加载失败"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:412,columnNumber:11},void 0),s.jsxDEV("div",{className:"character-time-selector__time-badge",children:ie(x)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:416,columnNumber:9},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:399,columnNumber:7},void 0),s.jsxDEV("div",{className:"character-time-selector__timeline",ref:y,onClick:$,children:[O.length>0?s.jsxDEV("div",{className:"character-time-selector__frame-strip",children:O.map((r,o)=>s.jsxDEV("img",{src:r,alt:"",className:"character-time-selector__frame-thumb",draggable:!1},o,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:431,columnNumber:15},void 0))},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:429,columnNumber:11},void 0):E?s.jsxDEV("div",{className:"character-time-selector__frame-strip character-time-selector__frame-strip--loading",children:s.jsxDEV("div",{className:"character-time-selector__strip-shimmer"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:442,columnNumber:13},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:441,columnNumber:11},void 0):s.jsxDEV("div",{className:"character-time-selector__timeline-bg"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:445,columnNumber:11},void 0),s.jsxDEV("div",{className:`character-time-selector__range ${se?"dragging":""}`,style:{left:`${de}%`,width:`${oe}%`},children:[s.jsxDEV("div",{className:"character-time-selector__handle character-time-selector__handle--left",onMouseDown:q},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:457,columnNumber:11},void 0),s.jsxDEV("div",{className:"character-time-selector__range-content",onMouseDown:_,children:s.jsxDEV("span",{className:"character-time-selector__range-label",children:[ie(n)," - ",ie(b)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:466,columnNumber:13},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:462,columnNumber:11},void 0),s.jsxDEV("div",{className:"character-time-selector__handle character-time-selector__handle--right",onMouseDown:A},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:471,columnNumber:11},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:449,columnNumber:9},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:422,columnNumber:7},void 0),s.jsxDEV("div",{className:"character-time-selector__info",children:[s.jsxDEV("span",{children:["API参数: ",Math.round(n),", ",Math.round(b)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:480,columnNumber:9},void 0),s.jsxDEV("span",{children:["时长: ",ue.toFixed(1),"s"]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:481,columnNumber:9},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:479,columnNumber:7},void 0),s.jsxDEV("div",{className:"character-time-selector__actions",children:[s.jsxDEV(Q,{variant:"outline",onClick:N,disabled:l,children:"取消"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:486,columnNumber:9},void 0),s.jsxDEV(Q,{theme:"primary",onClick:ne,disabled:l||!I,children:"创建角色"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:493,columnNumber:9},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:485,columnNumber:7},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterTimeRangeSelector.tsx",lineNumber:380,columnNumber:5},void 0)},Js=({visible:e,task:a,onClose:h,onCreateStart:N,onCreateComplete:l})=>{var j;const{createTask:m,tasks:V}=Ds(),[y,v]=t.useState(!1),{url:S}=Ws((a==null?void 0:a.id)??"",(j=a==null?void 0:a.result)==null?void 0:j.url),p=t.useMemo(()=>a!=null&&a.params.seconds?parseFloat(a.params.seconds.toString()):10,[a==null?void 0:a.params.seconds]),D=t.useMemo(()=>a?V.some(b=>b.type===k.CHARACTER&&b.params.sourceLocalTaskId===a.id&&(b.status===M.PENDING||b.status===M.PROCESSING)):!1,[a,V]),c=t.useCallback(async(b,f)=>{if(!a||!a.remoteId){je.error("无效的任务数据");return}v(!0),N==null||N();try{const x=_s(b,f),g=Vs(a.params.model),B=m({prompt:a.params.prompt||"角色提取",model:g,sourceVideoTaskId:a.remoteId,characterTimestamps:x,sourceLocalTaskId:a.id},k.CHARACTER);je.success("角色创建任务已加入队列"),l==null||l(B.id),h()}catch(x){console.error("Failed to create character task:",x);const g=x.message||"创建任务失败";je.error(g)}finally{v(!1)}},[a,m,N,l,h]),i=()=>{y||h()},n=()=>{y||h()};return!a||!S?null:s.jsxDEV(Is,{visible:e,header:"角色",onClose:i,footer:null,width:560,className:"character-create-dialog",closeOnOverlayClick:!y,closeOnEscKeydown:!y,children:[s.jsxDEV("div",{className:"character-create-dialog__description",children:["从视频中提取角色,创建后可通过 ",s.jsxDEV("code",{children:"@username"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterCreateDialog.tsx",lineNumber:130,columnNumber:25},void 0)," 在提示词中引用"]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterCreateDialog.tsx",lineNumber:129,columnNumber:7},void 0),D&&s.jsxDEV("div",{className:"character-create-dialog__warning",children:"此视频已有一个角色正在创建中"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterCreateDialog.tsx",lineNumber:135,columnNumber:9},void 0),s.jsxDEV(Bs,{videoUrl:S,videoDuration:p,onConfirm:c,onCancel:n,disabled:y||D},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterCreateDialog.tsx",lineNumber:141,columnNumber:7},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterCreateDialog.tsx",lineNumber:119,columnNumber:5},void 0)},Qs=({characterId:e,profilePictureUrl:a,alt:h="Character",className:N,onClick:l})=>{const[m,V]=t.useState(a||null),[y,v]=t.useState(!1),[S,p]=t.useState(!0);t.useEffect(()=>{let i=!1;return(async()=>{p(!0),v(!1);const j=await ye.getCachedUrl(e);if(!i){if(j){V(j),p(!1);return}a?(V(a),ye.cacheAvatar(e,a).catch(()=>{})):v(!0),p(!1)}})(),()=>{i=!0}},[e,a]);const D=async()=>{if(m===a){const i=await ye.getCachedUrl(e);if(i&&i!==m){V(i);return}}v(!0)},c=()=>{p(!1)};return y||!m?s.jsxDEV("div",{className:N,onClick:l,style:l?{cursor:"pointer"}:void 0,children:s.jsxDEV(we,{},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterAvatar.tsx",lineNumber:101,columnNumber:9},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterAvatar.tsx",lineNumber:100,columnNumber:7},void 0):s.jsxDEV("img",{src:m,alt:h,className:N,onError:D,onLoad:c,onClick:l,style:{display:S?"none":"block",cursor:l?"pointer":void 0}},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/character/CharacterAvatar.tsx",lineNumber:107,columnNumber:5},void 0)};function ea(){const[e,a]=t.useState([]),[h,N]=t.useState(!0),l=t.useRef(new Map);t.useEffect(()=>{const i=Y.getCharacters$().subscribe(n=>{a(n),N(!1)});return Y.init(),()=>i.unsubscribe()},[]),t.useEffect(()=>{h||(async()=>{const n=Y.getPendingCharacters();for(const j of n)l.current.get(j.id)||m(j)})()},[h]);const m=t.useCallback(async i=>{if(!l.current.get(i.id)){l.current.set(i.id,!0);try{const n=await qe.resumePolling(i.id,{onStatusChange:async j=>{await Y.updateCharacterStatus(i.id,j)}});await Y.updateCharacter(i.id,{username:n.username,profilePictureUrl:n.profile_picture_url,permalink:n.permalink,status:"completed",completedAt:Date.now()})}catch(n){console.error("[useCharacters] Character polling failed:",n),await Y.updateCharacterStatus(i.id,"failed",n.message)}finally{l.current.delete(i.id)}}},[]),V=t.useCallback(async i=>{var j;const n=Date.now();Te.track("character_extract_start",{videoTaskId:i.videoTaskId,hasTimestamps:!!((j=i.characterTimestamps)!=null&&j.length)});try{const f=(await qe.createCharacter(i)).id,x={id:f,username:"",profilePictureUrl:"",sourceTaskId:i.localTaskId||"",sourceVideoId:i.videoTaskId,sourcePrompt:i.sourcePrompt,characterTimestamps:i.characterTimestamps,status:"processing",createdAt:Date.now()};return await Y.saveCharacter(x),l.current.set(f,!0),qe.resumePolling(f,{onStatusChange:async g=>{await Y.updateCharacterStatus(f,g)}}).then(async g=>{await Y.updateCharacter(f,{username:g.username,profilePictureUrl:g.profile_picture_url,permalink:g.permalink,status:"completed",completedAt:Date.now()}),Te.track("character_extract_success",{characterId:f,username:g.username,duration:Date.now()-n})}).catch(async g=>{console.error("[useCharacters] Character creation failed:",g),await Y.updateCharacterStatus(f,"failed",g.message),Te.track("character_extract_failed",{characterId:f,error:g.message,duration:Date.now()-n})}).finally(()=>{l.current.delete(f)}),x}catch(b){throw console.error("[useCharacters] Failed to create character:",b),b}},[]),y=t.useCallback(async i=>(l.current.delete(i),Y.deleteCharacter(i)),[]),v=t.useCallback(async()=>{await Y.init()},[]),S=t.useCallback(i=>e.find(n=>n.id===i),[e]),p=t.useCallback(i=>e.some(n=>n.sourceTaskId===i&&(n.status==="pending"||n.status==="processing")),[e]),D=e.filter(i=>i.status==="completed"),c=e.filter(i=>i.status==="pending"||i.status==="processing");return{characters:e,completedCharacters:D,pendingCharacters:c,isLoading:h,createCharacter:V,deleteCharacter:y,refreshCharacters:v,getCharacterById:S,isCreatingCharacterForTask:p}}export{Qs as C,Ze as T,Zs as V,Js as a,ea as u};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./tool-windows-
|
|
2
|
-
import{
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./tool-windows-D61Le6TE.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{aE as H,dB as K,dC as re,dD as X,dE as fe,dF as me,dG as ge,Y as w,$ as ke,X as ee,bB as V,T as ie,dH as D,dI as we,q as te,am as U}from"./tool-windows-BEnZdJqF.js";import{w as z}from"./workflow-submission-service-DygSzydV.js";import{S as Se,a as se}from"./skill-dsl-parser-b-aB3P5u.js";import{u as ye}from"./main-BO0HWBB1.js";function he(s){if(!s||typeof s!="string")return console.warn("[ExternalSkillParser] SKILL.md 内容为空"),null;const e=s.trim();if(!e.startsWith("---"))return console.warn("[ExternalSkillParser] SKILL.md 缺少 YAML front matter(未以 --- 开头)"),null;const t=e.indexOf("---",3);if(t===-1)return console.warn("[ExternalSkillParser] SKILL.md YAML front matter 未闭合(缺少结束 ---)"),null;const n=e.substring(3,t).trim(),r=e.substring(t+3).trim(),i=We(n),o=i.name,f=i.description||"";return o?{name:o,description:f,body:r}:(console.warn("[ExternalSkillParser] SKILL.md 缺少必填字段 name"),null)}function We(s){const e={},t=s.split(`
|
|
3
3
|
`);for(const n of t){const r=n.trim();if(!r||r.startsWith("#"))continue;const i=r.indexOf(":");if(i===-1)continue;const o=r.substring(0,i).trim();let f=r.substring(i+1).trim();(f.startsWith('"')&&f.endsWith('"')||f.startsWith("'")&&f.endsWith("'"))&&(f=f.slice(1,-1)),o&&(e[o]=f)}return e}function Je(s){try{const e=JSON.parse(s);if(!e.plugins||!Array.isArray(e.plugins))return console.warn("[ExternalSkillParser] marketplace.json 缺少 plugins 数组"),null;const t=new Map,n=[];for(const r of e.plugins){const i={name:r.name||"",description:r.description||"",skills:[]};if(Array.isArray(r.skills))for(const o of r.skills){const f=xe(o);i.skills.push(f),t.set(f,r.name||"")}n.push(i)}return{name:e.name||"",metadata:e.metadata?{description:e.metadata.description,version:e.metadata.version}:void 0,plugins:n,skillCategoryMap:t}}catch(e){return console.warn("[ExternalSkillParser] marketplace.json 解析失败:",e),null}}function xe(s){let e=s.trim();return e.startsWith("./")&&(e=e.substring(2)),e.startsWith("skills/")&&(e=e.substring(7)),e.endsWith("/")&&(e=e.slice(0,-1)),e}function be(s,e){if(!e||e.size===0)return s;let t=s;for(const[n,r]of e){const i=new RegExp("`"+Ie(n)+"`","g");t=t.replace(i,`\`${n}\`
|
|
4
4
|
|
|
5
5
|
<details><summary>${n}</summary>
|
|
@@ -25,9 +25,9 @@ ${r}
|
|
|
25
25
|
5. **禁止**:不要仅输出文字描述而不生成图片,必须实际调用 \`generate_image\` 工具
|
|
26
26
|
|
|
27
27
|
**重要**:你的最终目标是调用 \`generate_image\` 工具生成一张高质量的图片,而非输出文本分析。
|
|
28
|
-
`,t}function
|
|
28
|
+
`,t}function _e(s){if(!/\[(?:Intro|Verse|Chorus|Pre-Chorus|Bridge|Outro|Hook|Fade|Instrumental|Interlude)/i.test(s))return{lyrics:s};const e=s.split(`
|
|
29
29
|
`);let t,n;const r=[];for(const i of e){const o=i.trim();if(!t&&/^#\s+(.+)/.test(o)){t=o.replace(/^#\s+/,"").trim();continue}if(!n&&/^(?:标签|tags)\s*[::]\s*(.+)/i.test(o)){n=o.replace(/^(?:标签|tags)\s*[::]\s*/i,"").trim();continue}r.push(i)}for(;r.length>0&&r[0].trim()==="";)r.shift();for(;r.length>0&&r[r.length-1].trim()==="";)r.pop();return{title:t,tags:n,lyrics:r.join(`
|
|
30
|
-
`)}}function J(){return`wf-${Date.now()}-${Math.random().toString(36).substring(2,8)}`}function
|
|
30
|
+
`)}}function J(){return`wf-${Date.now()}-${Math.random().toString(36).substring(2,8)}`}function ve(s,e,t=!1){return s.map(n=>({...n,args:me(n.mcp,{...n.args},{defaultModels:e.defaultModels,defaultModelRefs:e.defaultModelRefs,contextModel:{id:e.modelId,type:e.generationType==="agent"?"text":e.generationType},contextModelRef:e.modelRef,overrideSpecifiedModel:t})}))}function Te(s,e=[]){const{generationType:t,modelId:n,modelRef:r,isModelExplicit:i,prompt:o,userInstruction:f,rawInput:g,count:c,size:m,duration:T,extraParams:a,selection:l,defaultModels:p,defaultModelRefs:k}=s,_=[],I=J(),u=`wf_batch_${I}`;for(let d=0;d<c;d++){const S=`${I}-step-${d+1}`,M={mode:"queue",batchId:u,batchIndex:d+1,batchTotal:c,globalIndex:d+1};if(t==="image"){const b={prompt:o,model:n,modelRef:r,workflowId:I,batchId:u,batchIndex:d+1,batchTotal:c,globalIndex:d+1};m&&(b.size=m),e.length>0&&(b.referenceImages=e),a&&(b.params=a),_.push({id:S,mcp:"generate_image",args:b,options:M,description:c>1?`生成图片 (${d+1}/${c})`:"生成图片",status:"pending"})}else if(t==="video"){const b={prompt:o,model:n,modelRef:r,seconds:T||"5",workflowId:I,batchId:u,batchIndex:d+1,batchTotal:c,globalIndex:d+1};m&&(b.size=m),e.length>0&&(b.referenceImages=e),a&&(b.params=a),_.push({id:S,mcp:"generate_video",args:b,options:M,description:c>1?`生成视频 (${d+1}/${c})`:"生成视频",status:"pending"})}else if(t==="audio"){const b=typeof(a==null?void 0:a.sunoAction)=="string"?a.sunoAction:"music",y=b==="lyrics",W={prompt:o,model:n,modelRef:r,sunoAction:b,workflowId:I,batchId:u,batchIndex:d+1,batchTotal:c,globalIndex:d+1};if(!y&&o){const v=_e(o);(v.title||v.tags)&&(W.prompt=v.lyrics,v.title&&!(a!=null&&a.title)&&(W.title=v.title),v.tags&&!(a!=null&&a.tags)&&(W.tags=v.tags))}a&&(W.params=a,a.notifyHook&&(W.notifyHook=a.notifyHook),!y&&a.mv&&(W.mv=a.mv),!y&&a.title&&(W.title=a.title),!y&&a.tags&&(W.tags=a.tags),!y&&a.continueClipId&&(W.continueClipId=a.continueClipId),!y&&a.continueAt!==void 0&&a.continueAt!==null&&a.continueAt!==""&&(W.continueAt=Number(a.continueAt))),_.push({id:S,mcp:"generate_audio",args:W,options:M,description:c>1?`${y?"生成歌词":"生成音频"} (${d+1}/${c})`:y?"生成歌词":"生成音频",status:"pending"})}else{const b={prompt:o,model:n,modelRef:r,rawInput:g,workflowId:I,batchId:u,batchIndex:d+1,batchTotal:c,globalIndex:d+1};e.length>0&&(b.referenceImages=e),a&&(b.params=a),_.push({id:S,mcp:"generate_text",args:b,options:M,description:"生成文本",status:"pending"})}}const x=t==="audio"&&_.every(d=>d.args.sunoAction==="lyrics");return{id:I,name:t==="image"?"图片生成":t==="video"?"视频生成":t==="text"?"文本生成":x?"歌词生成":"音频生成",description:`使用 ${n} 模型${c>1?`生成 ${c} 个`:"生成"}${t==="image"?"图片":t==="video"?"视频":t==="text"?"文本":x?"歌词":"音频"}`,scenarioType:"direct_generation",generationType:t,steps:_,metadata:{prompt:o,userInstruction:f,rawInput:g,modelId:n,modelRef:r,defaultModels:p,defaultModelRefs:k,isModelExplicit:i,count:c,size:m,duration:T,referenceImages:e.length>0?e:void 0,selection:l},createdAt:Date.now()}}function Re(s,e=[]){const{generationType:t,modelId:n,modelRef:r,isModelExplicit:i,prompt:o,userInstruction:f,rawInput:g,count:c,size:m,duration:T,extraParams:a,selection:l,defaultModels:p,defaultModelRefs:k}=s,_=J(),I={userInstruction:f,rawInput:g,model:{id:n,type:t==="agent"?"text":t,isExplicit:i},params:{count:c,size:m,duration:T,...a},defaultModels:p,defaultModelRefs:k,selection:l,finalPrompt:o},u=[...l.images||[],...l.graphics||[]];let x=ge();u.length>0&&(x+=K(u.length,l.imageDimensions));const d=re(I),S=[{role:"system",content:x},{role:"user",content:d}],M=[{id:`${_}-step-analyze`,mcp:"ai_analyze",args:{context:I,messages:S,referenceImages:u.length>0?u:void 0,textModel:n,modelRef:r},options:{mode:"async"},description:"AI 分析用户意图",status:"pending"}];return{id:_,name:"AI 智能生成",description:"AI 分析用户请求并执行相应操作",scenarioType:"agent_flow",generationType:t,steps:M,metadata:{prompt:o,userInstruction:f,rawInput:g,modelId:n,modelRef:r,isModelExplicit:i,count:c,size:m,duration:T,defaultModels:p,defaultModelRefs:k,referenceImages:e.length>0?e:void 0,selection:l},createdAt:Date.now()}}function Ae(s){const e=[];for(const t of s){const n=H.getTool(t);if(!n)continue;const r=n.inputSchema.properties||{},i=n.inputSchema.required||[],o=n.promptGuidance,f=Object.entries(r).map(([c,m])=>{var I;const a=i.includes(c)?"(必填)":"(可选)",l=[];m.type&&l.push(`类型: ${m.type}`),m.enum&&Array.isArray(m.enum)&&l.push(`可选值: ${m.enum.map(u=>`"${u}"`).join(" | ")}`),m.default!==void 0&&l.push(`默认: "${m.default}"`);const p=l.length>0?` [${l.join(", ")}]`:"",k=(I=o==null?void 0:o.parameterGuidance)==null?void 0:I[c],_=k?`
|
|
31
31
|
💡 ${k}`:"";return` - **${c}**${a}: ${m.description||"无描述"}${p}${_}`}).join(`
|
|
32
32
|
`);let g=`### ${n.name}
|
|
33
33
|
${n.description}
|
|
@@ -39,18 +39,18 @@ ${f||" 无参数"}`;o!=null&&o.whenToUse&&(g+=`
|
|
|
39
39
|
|
|
40
40
|
---
|
|
41
41
|
|
|
42
|
-
`):""}async function et(s,e,t=[],n){const{generationType:r,modelRef:i,modelId:o,isModelExplicit:f,prompt:g,userInstruction:c,rawInput:m,count:T,size:a,duration:l,selection:p,defaultModels:k,defaultModelRefs:_}=s,I=J(),u=e.id,x=e.name,d=e.type==="system"?e.description:e.content,S=c||g||m,M={input:S,count:T,size:a,model:o},b=se.parse(d,M,I,S);if(b){const P=
|
|
42
|
+
`):""}async function et(s,e,t=[],n){const{generationType:r,modelRef:i,modelId:o,isModelExplicit:f,prompt:g,userInstruction:c,rawInput:m,count:T,size:a,duration:l,selection:p,defaultModels:k,defaultModelRefs:_}=s,I=J(),u=e.id,x=e.name,d=e.type==="system"?e.description:e.content,S=c||g||m,M={input:S,count:T,size:a,model:o},b=se.parse(d,M,I,S);if(b){const P=ve(b.steps,s,!0);return{id:I,name:x,description:`使用「${x}」Skill 生成内容`,scenarioType:"skill_flow",skillId:u,generationType:r,steps:P,metadata:{prompt:g,userInstruction:c,rawInput:m,modelId:o,modelRef:i,defaultModels:k,defaultModelRefs:_,isModelExplicit:f,count:T,size:a,duration:l,referenceImages:t.length>0?t:void 0,selection:p,parseMethod:"regex"},createdAt:Date.now()}}const y=[...p.images||[],...p.graphics||[]],W={userInstruction:c,rawInput:m,model:{id:o,type:r==="agent"?"text":r,isExplicit:f},params:{count:T,size:a,duration:l},defaultModels:k,defaultModelRefs:_,selection:p,finalPrompt:g},v=e.type==="external",R=e.type==="user",h=e.outputType==="image"?"image":"text",E=v||R&&h==="image"?Me(d,h):d,$=se.extractToolNamesFromContent(E).filter(P=>H.hasTool(P));h==="image"&&!$.includes("generate_image")&&H.hasTool("generate_image")&&$.push("generate_image");const F=$.includes("generate_image");if($.length>0){const P=Ae($);let O=`## 当前激活的 Skill:${x}
|
|
43
43
|
|
|
44
|
-
${
|
|
44
|
+
${E}`;P&&(O+=`
|
|
45
45
|
|
|
46
46
|
## 可用工具
|
|
47
47
|
|
|
48
|
-
${P}`),
|
|
48
|
+
${P}`),y.length>0&&(O+=K(y.length,p.imageDimensions)),O+=`
|
|
49
49
|
|
|
50
50
|
## 响应格式(严格遵守)
|
|
51
51
|
|
|
52
52
|
你的响应必须是一个有效的 JSON 对象:
|
|
53
|
-
{"content": "你的分析内容", "next": [{"mcp": "工具名称", "args": {"参数名": "参数值"}}]}`,
|
|
53
|
+
{"content": "你的分析内容", "next": [{"mcp": "工具名称", "args": {"参数名": "参数值"}}]}`,F&&(O+=`
|
|
54
54
|
|
|
55
55
|
## 执行要求
|
|
56
56
|
|
|
@@ -60,11 +60,11 @@ ${P}`),h.length>0&&(O+=H(h.length,p.imageDimensions)),O+=`
|
|
|
60
60
|
3. 不要仅输出文字描述,必须实际调用工具生成图片
|
|
61
61
|
|
|
62
62
|
你的回复必须包含对 generate_image 工具的调用,例如:
|
|
63
|
-
{"content": "分析与 prompt 构建过程", "next": [{"mcp": "generate_image", "args": {"prompt": "完整的图片描述 prompt"}}]}`);const ue=re(W),de=[{role:"system",content:O},{role:"user",content:ue}],pe=[{id:`${I}-step-analyze`,mcp:"ai_analyze",args:{context:W,messages:de,referenceImages:
|
|
63
|
+
{"content": "分析与 prompt 构建过程", "next": [{"mcp": "generate_image", "args": {"prompt": "完整的图片描述 prompt"}}]}`);const ue=re(W),de=[{role:"system",content:O},{role:"user",content:ue}],pe=[{id:`${I}-step-analyze`,mcp:"ai_analyze",args:{context:W,messages:de,referenceImages:y.length>0?y:void 0,textModel:o,modelRef:i},options:{mode:"async"},description:`AI 分析用户意图(Skill: ${x})`,status:"pending"}];return{id:I,name:x,description:`使用「${x}」Skill 生成内容`,scenarioType:"skill_flow",skillId:u,generationType:r,steps:pe,metadata:{prompt:g,userInstruction:c,rawInput:m,modelId:o,modelRef:i,defaultModels:k,defaultModelRefs:_,isModelExplicit:f,count:T,size:a,duration:l,referenceImages:t.length>0?t:void 0,selection:p,parseMethod:"agent_fallback"},createdAt:Date.now()}}let N=E||"";y.length>0&&(N+=K(y.length,p.imageDimensions)),F&&(N+=`
|
|
64
64
|
|
|
65
65
|
## 重要执行指引
|
|
66
66
|
|
|
67
67
|
请基于以上 Skill 指令构建详细的图片描述 prompt,并使用以下 JSON 格式回复以调用图片生成工具:
|
|
68
68
|
{"content": "你的分析", "next": [{"mcp": "generate_image", "args": {"prompt": "你构建的完整 prompt"}}]}
|
|
69
69
|
|
|
70
|
-
你必须实际调用 generate_image 工具生成图片,不要仅输出文字描述。`);const B=[{role:"system",content:F},{role:"user",content:S}],Q=[{id:`${I}-step-analyze`,mcp:"ai_analyze",args:{context:W,messages:B,referenceImages:h.length>0?h:void 0,textModel:o,modelRef:i},options:{mode:"async"},description:`AI 以「${x}」角色回复`,status:"pending"}];return{id:I,name:x,description:`使用「${x}」Skill 生成内容`,scenarioType:"skill_flow",skillId:u,generationType:r,steps:Q,metadata:{prompt:g,userInstruction:c,rawInput:m,modelId:o,modelRef:i,defaultModels:k,defaultModelRefs:_,isModelExplicit:f,count:T,size:a,duration:l,referenceImages:t.length>0?t:void 0,selection:p,parseMethod:"agent_fallback"},createdAt:Date.now()}}function Ce(s,e=[]){return s.scenario==="direct_generation"?Te(s,e):Re(s,e)}function Ee(s,e=0){try{let t=X(s);if(!t){const i=fe(s),o=i.indexOf("{"),f=i.lastIndexOf("}");o>=0&&f>o&&(t=X(i.slice(o,f+1)))}if(!t)return{content:"",steps:[]};const n=typeof t.content=="string"?t.content:"";if(!Array.isArray(t.next)||t.next.length===0)return{content:n,steps:[]};const r=t.next.filter(i=>typeof i.mcp=="string"&&typeof i.args=="object").map((i,o)=>({id:`step-${e+o+1}`,mcp:i.mcp,args:i.args,description:$e(i.mcp,i.args),status:"pending"}));return{content:n,steps:r}}catch{return{content:"",steps:[]}}}function $e(s,e){var t,n,r,i;switch(s){case"generate_image":return`生成图片: ${((t=e.prompt)==null?void 0:t.substring(0,30))||""}...`;case"generate_video":return`生成视频: ${((n=e.prompt)==null?void 0:n.substring(0,30))||""}...`;case"generate_audio":return`生成音频: ${((r=e.prompt)==null?void 0:r.substring(0,30))||""}...`;case"generate_text":return`生成文本: ${((i=e.prompt)==null?void 0:i.substring(0,30))||""}...`;case"ai_analyze":return"AI 分析用户意图";case"format_markdown":return"格式化输出";case"show_result":return"展示结果";default:return`执行 ${s}`}}function Pe(s,e,t,n,r,i){return{...s,steps:s.steps.map(o=>o.id===e?{...o,status:t,result:n!==void 0?n:o.result,error:r,duration:i}:o)}}function De(s,e){const t=new Set(s.steps.map(r=>r.id)),n=e.filter(r=>!t.has(r.id));return n.length===0?s:{...s,steps:[...s.steps,...n]}}function j(s){const e=s.steps.filter(o=>o.status==="completed").length,t=s.steps.filter(o=>o.status==="failed").length,n=s.steps.find(o=>o.status==="running"),r=s.steps.filter(o=>o.status==="pending").length;let i;return t>0?i="failed":n?i="running":r===0&&e>0?i="completed":i="pending",{status:i,completedSteps:e,totalSteps:s.steps.length,currentStep:n||s.steps.find(o=>o.status==="pending")}}const ne={workflow:null,status:"idle",currentStep:null,completedSteps:0,totalSteps:0,error:null};function Le(){const[s,e]=w.useState(ne),t=w.useRef(null),n=w.useRef(!1),r=w.useCallback(l=>{t.current=l,n.current=!1;const p=j(l);e({workflow:l,status:"running",currentStep:p.currentStep||null,completedSteps:p.completedSteps,totalSteps:p.totalSteps,error:null})},[]),i=w.useCallback(l=>{t.current=l,n.current=!1;const p=j(l);let k="running";l.status==="completed"?k="completed":(l.status==="failed"||l.status==="cancelled")&&(k="failed"),e({workflow:l,status:k,currentStep:p.currentStep||null,completedSteps:p.completedSteps,totalSteps:p.totalSteps,error:l.error||null})},[]),o=w.useCallback((l,p,k,_,I)=>{if(n.current)return;const u=t.current;if(!u)return;const x=Pe(u,l,p,k,_,I);t.current=x,e(d=>{const S=j(x);let M="running";return S.status==="completed"?M="completed":S.status==="failed"&&(M="failed"),{...d,workflow:x,status:M,currentStep:S.currentStep||null,completedSteps:S.completedSteps,totalSteps:S.totalSteps,error:_||d.error}})},[]),f=w.useCallback(l=>{if(n.current||l.length===0)return;const p=t.current;if(!p)return;const k=De(p,l);t.current=k,e(_=>{const I=j(k);return{..._,workflow:k,currentStep:I.currentStep||_.currentStep,totalSteps:I.totalSteps}})},[]),g=w.useCallback(l=>{const p=t.current;if(!p||n.current)return{content:"",steps:[]};const k=p.steps.length,{content:_,steps:I}=Ee(l,k);return _&&!p.aiAnalysis&&(t.current={...p,aiAnalysis:_}),I.length>0&&f(I),{content:_,steps:I}},[f]),c=w.useCallback(()=>{t.current=null,n.current=!1,e(ne)},[]),m=w.useCallback(()=>{n.current=!0,e(l=>({...l,status:"failed",error:"工作流已中止"}))},[]),T=w.useCallback(()=>{n.current=!1,e(l=>({...l,status:"running",error:null}))},[]),a=w.useCallback(()=>t.current,[]);return{state:s,startWorkflow:r,restoreWorkflow:i,updateStep:o,addSteps:f,addStepsFromAIResponse:g,resetWorkflow:c,abortWorkflow:m,resumeWorkflow:T,getWorkflow:a}}const ae=w.createContext(null),tt=({children:s})=>{const e=Le(),t=w.useMemo(()=>({state:e.state,startWorkflow:e.startWorkflow,restoreWorkflow:e.restoreWorkflow,updateStep:e.updateStep,addSteps:e.addSteps,addStepsFromAIResponse:e.addStepsFromAIResponse,resetWorkflow:e.resetWorkflow,abortWorkflow:e.abortWorkflow,resumeWorkflow:e.resumeWorkflow,getWorkflow:e.getWorkflow}),[e.state,e.startWorkflow,e.restoreWorkflow,e.updateStep,e.addSteps,e.addStepsFromAIResponse,e.resetWorkflow,e.abortWorkflow,e.resumeWorkflow,e.getWorkflow]);return ke.jsxDEV(ae.Provider,{value:t,children:s},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/contexts/WorkflowContext.tsx",lineNumber:78,columnNumber:5},void 0)};function ze(){const s=w.useContext(ae);if(!s)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return s}function Fe(){const s=ze();return{startWorkflow:s.startWorkflow,restoreWorkflow:s.restoreWorkflow,updateStep:s.updateStep,addSteps:s.addSteps,addStepsFromAIResponse:s.addStepsFromAIResponse,resetWorkflow:s.resetWorkflow,abortWorkflow:s.abortWorkflow,resumeWorkflow:s.resumeWorkflow,getWorkflow:s.getWorkflow}}const Ne=20,oe=2e3,Oe=3e4;function le(s){const e=new Map;if(!s)return e;for(const t of s){const n=t.result;n!=null&&n.taskId&&e.set(n.taskId,t.id)}return e}function ce(s){var e;return s.status===V.PROCESSING?{status:"running"}:s.status===V.COMPLETED&&s.result?{status:"completed",result:{...s.result,taskId:s.id}}:s.status===V.FAILED?{status:"failed",error:typeof s.error=="string"?s.error:((e=s.error)==null?void 0:e.message)||"Task failed"}:null}function Ue(s,e,t,n,r,i){const o=t.getWorkflow(),g=le(o==null?void 0:o.steps).get(s.id);if(!g)return!1;const c=s.type!==ie.IMAGE&&(o==null?void 0:o.generationType)!=="image";e.status==="running"&&t.resumeWorkflow(),t.updateStep(g,e.status,e.result,e.error);const m=t.getWorkflow();if(m){const T=L(m);n.current(T);const a=r.current,l=i.current;c&&a&&l&&D.updateWorkflow(a,l,T)}return!0}function je(s,e,t,n,r,i){var f;const o=r.current;if(!o||s.type===ie.IMAGE)return!1;for(const g of o.children){if(!we(g))continue;const c=g;if(c.workflow.generationType==="image")continue;const T=le((f=c.workflow)==null?void 0:f.steps).get(s.id);if(!T)continue;const a=c.workflow.steps.map(p=>p.id!==T?p:{...p,status:e.status,...e.result!==void 0&&{result:e.result},...e.error!==void 0&&{error:e.error}}),l={...c.workflow,steps:a};if(e.status==="running"&&delete l.error,D.updateWorkflow(o,c.id,l),i.current=c.id,n.current(l),t.restoreWorkflow){const p={id:l.id,name:l.name||"",description:"",scenarioType:"direct_generation",generationType:l.generationType,status:e.status==="running"?"running":"failed",steps:a.map(k=>({id:k.id,mcp:k.mcp||"",args:k.args||{},description:k.description||"",status:k.status,result:k.result,error:k.error,duration:k.duration,options:k.options})),createdAt:l.createdAt||Date.now(),metadata:{prompt:l.prompt||"",userInstruction:"",rawInput:"",modelId:"",isModelExplicit:!1,count:l.count||1,selection:{texts:[],images:[],videos:[],graphics:[]}},aiAnalysis:l.aiAnalysis};t.restoreWorkflow(p)}return!0}return!1}function K(s,e,t,n,r){const i=s.task,o=ce(i);return o?!!(Ue(i,o,e,t,n,r)||je(i,o,e,t,n,r)):!1}function Ve(s){const{workflowControl:e,boardRef:t,workZoneIdRef:n}=s,r=w.useRef(s.updateWorkflowMessage);w.useEffect(()=>{r.current=s.updateWorkflowMessage},[s.updateWorkflowMessage]);const i=w.useRef(new Map),o=w.useRef(null),f=w.useRef(0),g=w.useRef(!1);w.useEffect(()=>{const c=a=>{const l=i.current;if(!l.has(a.task.id)&&l.size>=Ne){const p=l.keys().next().value;p&&l.delete(p)}l.set(a.task.id,a)},m=()=>{const a=new Map;for(const[l,p]of i.current.entries())K(p,e,r,t,n)||a.set(l,p);i.current=a,(a.size===0||Date.now()-f.current>Oe)&&(o.current&&(clearInterval(o.current),o.current=null),i.current=new Map)};if(!g.current){g.current=!0;const a=ee.getAllTasks();for(const l of a){const p=ce(l);p&&(p.status==="completed"||p.status==="failed")&&K({task:l},e,r,t,n)}}const T=ee.observeTaskUpdates().subscribe(a=>{if(a.type!=="taskUpdated")return;if(a.task.status===V.PROCESSING&&i.current.has(a.task.id)){c(a),o.current||(f.current=Date.now(),o.current=setInterval(m,oe));return}K(a,e,r,t,n)?i.current.delete(a.task.id):(c(a),o.current||(f.current=Date.now(),o.current=setInterval(m,oe)))});return()=>{T.unsubscribe(),o.current&&(clearInterval(o.current),o.current=null),i.current=new Map}},[e,t,n])}let Z=null;const Ze=new Promise(s=>{Z=s});function L(s,e,t,n){var i;const r=s.metadata||{};return{id:s.id,name:s.name,generationType:s.generationType,prompt:r.prompt||((i=e==null?void 0:e.aiContext)==null?void 0:i.finalPrompt)||"",aiAnalysis:s.aiAnalysis,count:r.count,createdAt:s.createdAt,steps:s.steps.map(o=>({id:o.id,description:o.description,status:o.status,mcp:o.mcp,args:o.args,result:o.result,error:o.error,duration:o.duration,options:o.options})),retryContext:e,postProcessingStatus:t,insertedCount:n}}async function Ge(s,e){const{operation:t,params:n}=e;try{const{insertImageFromUrl:r}=await U(async()=>{const{insertImageFromUrl:c}=await import("./tool-windows-DOIu9TAD.js").then(m=>m.pn);return{insertImageFromUrl:c}},__vite__mapDeps([0]),import.meta.url),{insertVideoFromUrl:i}=await U(async()=>{const{insertVideoFromUrl:c}=await import("./tool-windows-DOIu9TAD.js").then(m=>m.pv);return{insertVideoFromUrl:c}},__vite__mapDeps([0]),import.meta.url),{insertAudioFromUrl:o}=await U(async()=>{const{insertAudioFromUrl:c}=await import("./tool-windows-DOIu9TAD.js").then(m=>m.po);return{insertAudioFromUrl:c}},__vite__mapDeps([0]),import.meta.url),{getSmartInsertionPoint:f}=await U(async()=>{const{getSmartInsertionPoint:c}=await import("./tool-windows-DOIu9TAD.js").then(m=>m.pm);return{getSmartInsertionPoint:c}},__vite__mapDeps([0]),import.meta.url),g=n.position?[n.position.x,n.position.y]:f(s)||[100,100];if(t==="canvas_insert"&&n.items)for(const c of n.items)c.type==="image"&&c.url?await r(s,c.url,g):c.type==="video"&&c.url?await i(s,c.url,g):c.type==="audio"&&c.url&&await o(s,c.url,c,g);else t==="insert_image"&&n.url?await r(s,n.url,g):t==="insert_video"&&n.url?await i(s,n.url,g):t==="insert_audio"&&n.url&&await o(s,n.url,n,g)}catch(r){console.error("[useWorkflowSubmission] Failed to insert to canvas:",r)}}function qe(s){const{boardRef:e,workZoneIdRef:t}=s,n=Fe(),r=ye(),i=w.useRef(r.sendWorkflowMessage),o=w.useRef(r.updateWorkflowMessage);w.useEffect(()=>{i.current=r.sendWorkflowMessage,o.current=r.updateWorkflowMessage},[r.sendWorkflowMessage,r.updateWorkflowMessage]),Ve({workflowControl:n,updateWorkflowMessage:r.updateWorkflowMessage,boardRef:e,workZoneIdRef:t});const f=w.useRef(null),g=w.useRef([]),c=w.useRef(!1),m=w.useRef(null),T=w.useCallback(u=>u!=="image",[]),a=w.useCallback(async()=>{if(!c.current){c.current=!0;try{await N.recoverWorkflows()}catch(u){console.warn("[useWorkflowSubmission] Failed to recover workflows:",u)}finally{Z==null||Z()}}},[]);w.useEffect(()=>{N.init(),N.registerCanvasHandler(async(x,d)=>({success:!0}));const u=N.subscribeToAllEvents(x=>{var d,S,M,b,h,W,v,R,E;if(x.type==="recovered"&&x.workflow){const y=x.workflow,G=y.status==="running"||y.status==="pending",C=y.status==="failed"&&y.updatedAt&&Date.now()-y.updatedAt<300*1e3;if(!G&&!C)return;(d=n.restoreWorkflow)==null||d.call(n,y);const A=te.get(),$={aiContext:{rawInput:((S=y.context)==null?void 0:S.userInput)||"",userInstruction:((M=y.context)==null?void 0:M.userInput)||"",model:{id:((b=y.context)==null?void 0:b.model)||"",type:y.generationType==="video"?"video":y.generationType==="audio"?"audio":"image",isExplicit:!0},defaultModels:{image:A.imageModelName||"gemini-3-pro-image-preview-vip",video:A.videoModelName||"veo3.1",audio:A.audioModelName||"suno_music"},defaultModelRefs:void 0,params:{count:(h=y.metadata)==null?void 0:h.count,size:(W=y.metadata)==null?void 0:W.size,duration:(v=y.metadata)==null?void 0:v.duration},selection:{texts:[],images:[],videos:[],graphics:[]},finalPrompt:((R=y.metadata)==null?void 0:R.prompt)||""},referenceImages:((E=y.context)==null?void 0:E.referenceImages)||[],textModel:A.textModelName},z=L(y,$);o.current(z);const F=e.current,q=t.current;T(y.generationType)&&q&&F&&D.updateWorkflow(F,q,z);const B=N.subscribeToWorkflow(y.id,async Q=>{var P;await((P=m.current)==null?void 0:P.call(m,Q,y,$))});g.current.push(B)}});return g.current.push(u),a(),()=>{g.current.forEach(x=>x.unsubscribe()),g.current=[]}},[]);const l=w.useCallback(async(u,x,d)=>{const S=e.current,M=t.current,b=T(x.generationType);switch(u.type){case"step":{n.updateStep(u.stepId,u.status,u.result,u.error,u.duration);const h=n.getWorkflow();if(h){const W=L(h,d);o.current(W),b&&M&&S&&D.updateWorkflow(S,M,W)}break}case"completed":{const h=n.getWorkflow();let W=!1;h&&h.steps.forEach(R=>{const E=R.result,y=E==null?void 0:E.taskId;y&&(W=!0),(R.status==="running"||R.status==="pending")&&!y&&n.updateStep(R.id,"completed")});const v=n.getWorkflow();if(v){const R=L(v,d);if(o.current(R),b&&M&&S){if(D.updateWorkflow(S,M,R),v.steps.some(y=>y.status==="pending"||y.status==="running"))break;if(!W)setTimeout(()=>{D.removeWorkZone(S,M)},1500);else{const{workflowCompletionService:y}=await U(async()=>{const{workflowCompletionService:C}=await import("./tool-windows-DOIu9TAD.js").then(A=>A.pw);return{workflowCompletionService:C}},__vite__mapDeps([0]),import.meta.url);v.steps.every(C=>{const A=C.result;return A!=null&&A.taskId?y.isPostProcessingCompleted(A.taskId):!0})&&setTimeout(()=>{D.removeWorkZone(S,M)},1500)}}}break}case"failed":{n.abortWorkflow();const h=n.getWorkflow();if(h){const W=L(h,d);o.current(W),b&&M&&S&&D.updateWorkflow(S,M,W)}break}case"steps_added":{const h=u;n.addSteps(h.steps.map(v=>({id:v.id,mcp:v.mcp,args:v.args,description:v.description,status:v.status})));const W=n.getWorkflow();if(W){const v=L(W,d);o.current(v),b&&M&&S&&D.updateWorkflow(S,M,v)}break}case"canvas_insert":{S&&Ge(S,u);break}}},[n,e,t,T]);w.useEffect(()=>{m.current=l},[l]);const p=w.useCallback(async(u,x,d,S)=>{var R,E,y;const M=S||Ce(u,x);n.startWorkflow(M);const b=te.get(),h=b.textModelName,W=d||{aiContext:{rawInput:u.rawInput||u.userInstruction,userInstruction:u.userInstruction,model:{id:u.modelId,type:u.generationType,isExplicit:u.isModelExplicit},modelRef:u.modelRef,defaultModels:{image:((R=u.defaultModels)==null?void 0:R.image)||b.imageModelName||"gemini-3-pro-image-preview-vip",video:((E=u.defaultModels)==null?void 0:E.video)||b.videoModelName||"veo3.1",audio:((y=u.defaultModels)==null?void 0:y.audio)||b.audioModelName||"suno_music"},defaultModelRefs:u.defaultModelRefs,params:{count:u.count,size:u.size,duration:u.duration},selection:u.selection||{texts:[],images:[],videos:[],graphics:[]},finalPrompt:u.prompt},referenceImages:x,textModel:h};f.current=W;const v=L(M,W);return await i.current({context:W.aiContext,workflow:v,textModel:h,autoOpen:!1}),{workflowId:M.id,usedSW:!1}},[n]),k=w.useCallback(async u=>{await N.cancel(u),n.abortWorkflow()},[n]),_=w.useCallback(async(u,x)=>{const d=u.retryContext;if(!d){console.error("[useWorkflowSubmission] No retry context available");return}const S={prompt:u.prompt,userInstruction:d.aiContext.userInstruction,rawInput:d.aiContext.rawInput,modelId:d.aiContext.model.id,modelRef:d.aiContext.modelRef,defaultModels:d.aiContext.defaultModels,defaultModelRefs:d.aiContext.defaultModelRefs,isModelExplicit:d.aiContext.model.isExplicit,generationType:d.aiContext.model.type,count:u.count||1,size:d.aiContext.params.size,duration:d.aiContext.params.duration,scenario:d.aiContext.model.type==="agent"?"agent_flow":"direct_generation",selection:d.aiContext.selection,parseResult:{},hasExtraContent:!1};await p(S,d.referenceImages||[],d)},[p]),I=w.useCallback(()=>f.current,[]);return{submitWorkflow:p,cancelWorkflow:k,retryWorkflow:_,getRetryContext:I}}const st=Object.freeze(Object.defineProperty({__proto__:null,toWorkflowMessageData:L,useWorkflowSubmission:qe,workflowRecoveryPromise:Ze},Symbol.toStringTag,{value:"Module"}));export{tt as W,Je as a,Xe as b,qe as c,et as d,Ce as e,st as f,he as p,Fe as u};
|
|
70
|
+
你必须实际调用 generate_image 工具生成图片,不要仅输出文字描述。`);const q=[{role:"system",content:N},{role:"user",content:S}],Q=[{id:`${I}-step-analyze`,mcp:"ai_analyze",args:{context:W,messages:q,referenceImages:y.length>0?y:void 0,textModel:o,modelRef:i},options:{mode:"async"},description:`AI 以「${x}」角色回复`,status:"pending"}];return{id:I,name:x,description:`使用「${x}」Skill 生成内容`,scenarioType:"skill_flow",skillId:u,generationType:r,steps:Q,metadata:{prompt:g,userInstruction:c,rawInput:m,modelId:o,modelRef:i,defaultModels:k,defaultModelRefs:_,isModelExplicit:f,count:T,size:a,duration:l,referenceImages:t.length>0?t:void 0,selection:p,parseMethod:"agent_fallback"},createdAt:Date.now()}}function Ce(s,e=[]){return s.scenario==="direct_generation"?Te(s,e):Re(s,e)}function Ee(s,e=0){try{let t=X(s);if(!t){const i=fe(s),o=i.indexOf("{"),f=i.lastIndexOf("}");o>=0&&f>o&&(t=X(i.slice(o,f+1)))}if(!t)return{content:"",steps:[]};const n=typeof t.content=="string"?t.content:"";if(!Array.isArray(t.next)||t.next.length===0)return{content:n,steps:[]};const r=t.next.filter(i=>typeof i.mcp=="string"&&typeof i.args=="object").map((i,o)=>({id:`step-${e+o+1}`,mcp:i.mcp,args:i.args,description:$e(i.mcp,i.args),status:"pending"}));return{content:n,steps:r}}catch{return{content:"",steps:[]}}}function $e(s,e){var t,n,r,i;switch(s){case"generate_image":return`生成图片: ${((t=e.prompt)==null?void 0:t.substring(0,30))||""}...`;case"generate_video":return`生成视频: ${((n=e.prompt)==null?void 0:n.substring(0,30))||""}...`;case"generate_audio":return`生成音频: ${((r=e.prompt)==null?void 0:r.substring(0,30))||""}...`;case"generate_text":return`生成文本: ${((i=e.prompt)==null?void 0:i.substring(0,30))||""}...`;case"ai_analyze":return"AI 分析用户意图";case"format_markdown":return"格式化输出";case"show_result":return"展示结果";default:return`执行 ${s}`}}function Pe(s,e,t,n,r,i){return{...s,steps:s.steps.map(o=>o.id===e?{...o,status:t,result:n!==void 0?n:o.result,error:r,duration:i}:o)}}function De(s,e){const t=new Set(s.steps.map(r=>r.id)),n=e.filter(r=>!t.has(r.id));return n.length===0?s:{...s,steps:[...s.steps,...n]}}function j(s){const e=s.steps.filter(o=>o.status==="completed").length,t=s.steps.filter(o=>o.status==="failed").length,n=s.steps.find(o=>o.status==="running"),r=s.steps.filter(o=>o.status==="pending").length;let i;return t>0?i="failed":n?i="running":r===0&&e>0?i="completed":i="pending",{status:i,completedSteps:e,totalSteps:s.steps.length,currentStep:n||s.steps.find(o=>o.status==="pending")}}const ne={workflow:null,status:"idle",currentStep:null,completedSteps:0,totalSteps:0,error:null};function Le(){const[s,e]=w.useState(ne),t=w.useRef(null),n=w.useRef(!1),r=w.useCallback(l=>{t.current=l,n.current=!1;const p=j(l);e({workflow:l,status:"running",currentStep:p.currentStep||null,completedSteps:p.completedSteps,totalSteps:p.totalSteps,error:null})},[]),i=w.useCallback(l=>{t.current=l,n.current=!1;const p=j(l);let k="running";l.status==="completed"?k="completed":(l.status==="failed"||l.status==="cancelled")&&(k="failed"),e({workflow:l,status:k,currentStep:p.currentStep||null,completedSteps:p.completedSteps,totalSteps:p.totalSteps,error:l.error||null})},[]),o=w.useCallback((l,p,k,_,I)=>{if(n.current)return;const u=t.current;if(!u)return;const x=Pe(u,l,p,k,_,I);t.current=x,e(d=>{const S=j(x);let M="running";return S.status==="completed"?M="completed":S.status==="failed"&&(M="failed"),{...d,workflow:x,status:M,currentStep:S.currentStep||null,completedSteps:S.completedSteps,totalSteps:S.totalSteps,error:_||d.error}})},[]),f=w.useCallback(l=>{if(n.current||l.length===0)return;const p=t.current;if(!p)return;const k=De(p,l);t.current=k,e(_=>{const I=j(k);return{..._,workflow:k,currentStep:I.currentStep||_.currentStep,totalSteps:I.totalSteps}})},[]),g=w.useCallback(l=>{const p=t.current;if(!p||n.current)return{content:"",steps:[]};const k=p.steps.length,{content:_,steps:I}=Ee(l,k);return _&&!p.aiAnalysis&&(t.current={...p,aiAnalysis:_}),I.length>0&&f(I),{content:_,steps:I}},[f]),c=w.useCallback(()=>{t.current=null,n.current=!1,e(ne)},[]),m=w.useCallback(()=>{n.current=!0,e(l=>({...l,status:"failed",error:"工作流已中止"}))},[]),T=w.useCallback(()=>{n.current=!1,e(l=>({...l,status:"running",error:null}))},[]),a=w.useCallback(()=>t.current,[]);return{state:s,startWorkflow:r,restoreWorkflow:i,updateStep:o,addSteps:f,addStepsFromAIResponse:g,resetWorkflow:c,abortWorkflow:m,resumeWorkflow:T,getWorkflow:a}}const ae=w.createContext(null),tt=({children:s})=>{const e=Le(),t=w.useMemo(()=>({state:e.state,startWorkflow:e.startWorkflow,restoreWorkflow:e.restoreWorkflow,updateStep:e.updateStep,addSteps:e.addSteps,addStepsFromAIResponse:e.addStepsFromAIResponse,resetWorkflow:e.resetWorkflow,abortWorkflow:e.abortWorkflow,resumeWorkflow:e.resumeWorkflow,getWorkflow:e.getWorkflow}),[e.state,e.startWorkflow,e.restoreWorkflow,e.updateStep,e.addSteps,e.addStepsFromAIResponse,e.resetWorkflow,e.abortWorkflow,e.resumeWorkflow,e.getWorkflow]);return ke.jsxDEV(ae.Provider,{value:t,children:s},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/contexts/WorkflowContext.tsx",lineNumber:78,columnNumber:5},void 0)};function Ne(){const s=w.useContext(ae);if(!s)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return s}function ze(){const s=Ne();return{startWorkflow:s.startWorkflow,restoreWorkflow:s.restoreWorkflow,updateStep:s.updateStep,addSteps:s.addSteps,addStepsFromAIResponse:s.addStepsFromAIResponse,resetWorkflow:s.resetWorkflow,abortWorkflow:s.abortWorkflow,resumeWorkflow:s.resumeWorkflow,getWorkflow:s.getWorkflow}}const Fe=20,oe=2e3,Oe=3e4;function le(s){const e=new Map;if(!s)return e;for(const t of s){const n=t.result;n!=null&&n.taskId&&e.set(n.taskId,t.id)}return e}function ce(s){var e;return s.status===V.PROCESSING?{status:"running"}:s.status===V.COMPLETED&&s.result?{status:"completed",result:{...s.result,taskId:s.id}}:s.status===V.FAILED?{status:"failed",error:typeof s.error=="string"?s.error:((e=s.error)==null?void 0:e.message)||"Task failed"}:null}function Ue(s,e,t,n,r,i){const o=t.getWorkflow(),g=le(o==null?void 0:o.steps).get(s.id);if(!g)return!1;const c=s.type!==ie.IMAGE&&(o==null?void 0:o.generationType)!=="image";e.status==="running"&&t.resumeWorkflow(),t.updateStep(g,e.status,e.result,e.error);const m=t.getWorkflow();if(m){const T=L(m);n.current(T);const a=r.current,l=i.current;c&&a&&l&&D.updateWorkflow(a,l,T)}return!0}function je(s,e,t,n,r,i){var f;const o=r.current;if(!o||s.type===ie.IMAGE)return!1;for(const g of o.children){if(!we(g))continue;const c=g;if(c.workflow.generationType==="image")continue;const T=le((f=c.workflow)==null?void 0:f.steps).get(s.id);if(!T)continue;const a=c.workflow.steps.map(p=>p.id!==T?p:{...p,status:e.status,...e.result!==void 0&&{result:e.result},...e.error!==void 0&&{error:e.error}}),l={...c.workflow,steps:a};if(e.status==="running"&&delete l.error,D.updateWorkflow(o,c.id,l),i.current=c.id,n.current(l),t.restoreWorkflow){const p={id:l.id,name:l.name||"",description:"",scenarioType:"direct_generation",generationType:l.generationType,status:e.status==="running"?"running":"failed",steps:a.map(k=>({id:k.id,mcp:k.mcp||"",args:k.args||{},description:k.description||"",status:k.status,result:k.result,error:k.error,duration:k.duration,options:k.options})),createdAt:l.createdAt||Date.now(),metadata:{prompt:l.prompt||"",userInstruction:"",rawInput:"",modelId:"",isModelExplicit:!1,count:l.count||1,selection:{texts:[],images:[],videos:[],graphics:[]}},aiAnalysis:l.aiAnalysis};t.restoreWorkflow(p)}return!0}return!1}function Y(s,e,t,n,r){const i=s.task,o=ce(i);return o?!!(Ue(i,o,e,t,n,r)||je(i,o,e,t,n,r)):!1}function Ve(s){const{workflowControl:e,boardRef:t,workZoneIdRef:n}=s,r=w.useRef(s.updateWorkflowMessage);w.useEffect(()=>{r.current=s.updateWorkflowMessage},[s.updateWorkflowMessage]);const i=w.useRef(new Map),o=w.useRef(null),f=w.useRef(0),g=w.useRef(!1);w.useEffect(()=>{const c=a=>{const l=i.current;if(!l.has(a.task.id)&&l.size>=Fe){const p=l.keys().next().value;p&&l.delete(p)}l.set(a.task.id,a)},m=()=>{const a=new Map;for(const[l,p]of i.current.entries())Y(p,e,r,t,n)||a.set(l,p);i.current=a,(a.size===0||Date.now()-f.current>Oe)&&(o.current&&(clearInterval(o.current),o.current=null),i.current=new Map)};if(!g.current){g.current=!0;const a=ee.getAllTasks();for(const l of a){const p=ce(l);p&&(p.status==="completed"||p.status==="failed")&&Y({task:l},e,r,t,n)}}const T=ee.observeTaskUpdates().subscribe(a=>{if(a.type!=="taskUpdated")return;if(a.task.status===V.PROCESSING&&i.current.has(a.task.id)){c(a),o.current||(f.current=Date.now(),o.current=setInterval(m,oe));return}Y(a,e,r,t,n)?i.current.delete(a.task.id):(c(a),o.current||(f.current=Date.now(),o.current=setInterval(m,oe)))});return()=>{T.unsubscribe(),o.current&&(clearInterval(o.current),o.current=null),i.current=new Map}},[e,t,n])}let Z=null;const Ze=new Promise(s=>{Z=s});function L(s,e,t,n){var i;const r=s.metadata||{};return{id:s.id,name:s.name,generationType:s.generationType,prompt:r.prompt||((i=e==null?void 0:e.aiContext)==null?void 0:i.finalPrompt)||"",aiAnalysis:s.aiAnalysis,count:r.count,createdAt:s.createdAt,steps:s.steps.map(o=>({id:o.id,description:o.description,status:o.status,mcp:o.mcp,args:o.args,result:o.result,error:o.error,duration:o.duration,options:o.options})),retryContext:e,postProcessingStatus:t,insertedCount:n}}async function Ge(s,e){const{operation:t,params:n}=e;try{const{insertImageFromUrl:r}=await U(async()=>{const{insertImageFromUrl:c}=await import("./tool-windows-BEnZdJqF.js").then(m=>m.pf);return{insertImageFromUrl:c}},__vite__mapDeps([0]),import.meta.url),{insertVideoFromUrl:i}=await U(async()=>{const{insertVideoFromUrl:c}=await import("./tool-windows-BEnZdJqF.js").then(m=>m.pn);return{insertVideoFromUrl:c}},__vite__mapDeps([0]),import.meta.url),{insertAudioFromUrl:o}=await U(async()=>{const{insertAudioFromUrl:c}=await import("./tool-windows-BEnZdJqF.js").then(m=>m.pg);return{insertAudioFromUrl:c}},__vite__mapDeps([0]),import.meta.url),{getSmartInsertionPoint:f}=await U(async()=>{const{getSmartInsertionPoint:c}=await import("./tool-windows-BEnZdJqF.js").then(m=>m.pe);return{getSmartInsertionPoint:c}},__vite__mapDeps([0]),import.meta.url),g=n.position?[n.position.x,n.position.y]:f(s)||[100,100];if(t==="canvas_insert"&&n.items)for(const c of n.items)c.type==="image"&&c.url?await r(s,c.url,g):c.type==="video"&&c.url?await i(s,c.url,g):c.type==="audio"&&c.url&&await o(s,c.url,c,g);else t==="insert_image"&&n.url?await r(s,n.url,g):t==="insert_video"&&n.url?await i(s,n.url,g):t==="insert_audio"&&n.url&&await o(s,n.url,n,g)}catch(r){console.error("[useWorkflowSubmission] Failed to insert to canvas:",r)}}function Be(s){const{boardRef:e,workZoneIdRef:t}=s,n=ze(),r=ye(),i=w.useRef(r.sendWorkflowMessage),o=w.useRef(r.updateWorkflowMessage);w.useEffect(()=>{i.current=r.sendWorkflowMessage,o.current=r.updateWorkflowMessage},[r.sendWorkflowMessage,r.updateWorkflowMessage]),Ve({workflowControl:n,updateWorkflowMessage:r.updateWorkflowMessage,boardRef:e,workZoneIdRef:t});const f=w.useRef(null),g=w.useRef([]),c=w.useRef(!1),m=w.useRef(null),T=w.useCallback(u=>u!=="image",[]),a=w.useCallback(async()=>{if(!c.current){c.current=!0;try{await z.recoverWorkflows()}catch(u){console.warn("[useWorkflowSubmission] Failed to recover workflows:",u)}finally{Z==null||Z()}}},[]);w.useEffect(()=>{z.init(),z.registerCanvasHandler(async(x,d)=>({success:!0}));const u=z.subscribeToAllEvents(x=>{var d,S,M,b,y,W,v,R,C;if(x.type==="recovered"&&x.workflow){const h=x.workflow,G=h.status==="running"||h.status==="pending",E=h.status==="failed"&&h.updatedAt&&Date.now()-h.updatedAt<300*1e3;if(!G&&!E)return;(d=n.restoreWorkflow)==null||d.call(n,h);const A=te.get(),$={aiContext:{rawInput:((S=h.context)==null?void 0:S.userInput)||"",userInstruction:((M=h.context)==null?void 0:M.userInput)||"",model:{id:((b=h.context)==null?void 0:b.model)||"",type:h.generationType==="video"?"video":h.generationType==="audio"?"audio":"image",isExplicit:!0},defaultModels:{image:A.imageModelName||"gemini-3-pro-image-preview-vip",video:A.videoModelName||"veo3.1",audio:A.audioModelName||"suno_music"},defaultModelRefs:void 0,params:{count:(y=h.metadata)==null?void 0:y.count,size:(W=h.metadata)==null?void 0:W.size,duration:(v=h.metadata)==null?void 0:v.duration},selection:{texts:[],images:[],videos:[],graphics:[]},finalPrompt:((R=h.metadata)==null?void 0:R.prompt)||""},referenceImages:((C=h.context)==null?void 0:C.referenceImages)||[],textModel:A.textModelName},F=L(h,$);o.current(F);const N=e.current,B=t.current;T(h.generationType)&&B&&N&&D.updateWorkflow(N,B,F);const q=z.subscribeToWorkflow(h.id,async Q=>{var P;await((P=m.current)==null?void 0:P.call(m,Q,h,$))});g.current.push(q)}});return g.current.push(u),a(),()=>{g.current.forEach(x=>x.unsubscribe()),g.current=[]}},[]);const l=w.useCallback(async(u,x,d)=>{const S=e.current,M=t.current,b=T(x.generationType);switch(u.type){case"step":{n.updateStep(u.stepId,u.status,u.result,u.error,u.duration);const y=n.getWorkflow();if(y){const W=L(y,d);o.current(W),b&&M&&S&&D.updateWorkflow(S,M,W)}break}case"completed":{const y=n.getWorkflow();let W=!1;y&&y.steps.forEach(R=>{const C=R.result,h=C==null?void 0:C.taskId;h&&(W=!0),(R.status==="running"||R.status==="pending")&&!h&&n.updateStep(R.id,"completed")});const v=n.getWorkflow();if(v){const R=L(v,d);if(o.current(R),b&&M&&S){if(D.updateWorkflow(S,M,R),v.steps.some(h=>h.status==="pending"||h.status==="running"))break;if(!W)setTimeout(()=>{D.removeWorkZone(S,M)},1500);else{const{workflowCompletionService:h}=await U(async()=>{const{workflowCompletionService:E}=await import("./tool-windows-BEnZdJqF.js").then(A=>A.po);return{workflowCompletionService:E}},__vite__mapDeps([0]),import.meta.url);v.steps.every(E=>{const A=E.result;return A!=null&&A.taskId?h.isPostProcessingCompleted(A.taskId):!0})&&setTimeout(()=>{D.removeWorkZone(S,M)},1500)}}}break}case"failed":{n.abortWorkflow();const y=n.getWorkflow();if(y){const W=L(y,d);o.current(W),b&&M&&S&&D.updateWorkflow(S,M,W)}break}case"steps_added":{const y=u;n.addSteps(y.steps.map(v=>({id:v.id,mcp:v.mcp,args:v.args,description:v.description,status:v.status})));const W=n.getWorkflow();if(W){const v=L(W,d);o.current(v),b&&M&&S&&D.updateWorkflow(S,M,v)}break}case"canvas_insert":{S&&Ge(S,u);break}}},[n,e,t,T]);w.useEffect(()=>{m.current=l},[l]);const p=w.useCallback(async(u,x,d,S)=>{var R,C,h;const M=S||Ce(u,x);n.startWorkflow(M);const b=te.get(),y=b.textModelName,W=d||{aiContext:{rawInput:u.rawInput||u.userInstruction,userInstruction:u.userInstruction,model:{id:u.modelId,type:u.generationType,isExplicit:u.isModelExplicit},modelRef:u.modelRef,defaultModels:{image:((R=u.defaultModels)==null?void 0:R.image)||b.imageModelName||"gemini-3-pro-image-preview-vip",video:((C=u.defaultModels)==null?void 0:C.video)||b.videoModelName||"veo3.1",audio:((h=u.defaultModels)==null?void 0:h.audio)||b.audioModelName||"suno_music"},defaultModelRefs:u.defaultModelRefs,params:{count:u.count,size:u.size,duration:u.duration},selection:u.selection||{texts:[],images:[],videos:[],graphics:[]},finalPrompt:u.prompt},referenceImages:x,textModel:y};f.current=W;const v=L(M,W);return await i.current({context:W.aiContext,workflow:v,textModel:y,autoOpen:!1}),{workflowId:M.id,usedSW:!1}},[n]),k=w.useCallback(async u=>{await z.cancel(u),n.abortWorkflow()},[n]),_=w.useCallback(async(u,x)=>{const d=u.retryContext;if(!d){console.error("[useWorkflowSubmission] No retry context available");return}const S={prompt:u.prompt,userInstruction:d.aiContext.userInstruction,rawInput:d.aiContext.rawInput,modelId:d.aiContext.model.id,modelRef:d.aiContext.modelRef,defaultModels:d.aiContext.defaultModels,defaultModelRefs:d.aiContext.defaultModelRefs,isModelExplicit:d.aiContext.model.isExplicit,generationType:d.aiContext.model.type,count:u.count||1,size:d.aiContext.params.size,duration:d.aiContext.params.duration,scenario:d.aiContext.model.type==="agent"?"agent_flow":"direct_generation",selection:d.aiContext.selection,parseResult:{},hasExtraContent:!1};await p(S,d.referenceImages||[],d)},[p]),I=w.useCallback(()=>f.current,[]);return{submitWorkflow:p,cancelWorkflow:k,retryWorkflow:_,getRetryContext:I}}const st=Object.freeze(Object.defineProperty({__proto__:null,toWorkflowMessageData:L,useWorkflowSubmission:Be,workflowRecoveryPromise:Ze},Symbol.toStringTag,{value:"Module"}));export{tt as W,Je as a,Xe as b,Be as c,et as d,Ce as e,st as f,he as p,ze as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{U as i,W as r,X as d,T as u}from"./tool-windows-BEnZdJqF.js";function n(e){const o=e.prompt||r;if(!e.videoData&&!e.youtubeUrl&&!e.videoCacheUrl)return{success:!1,error:"需要提供 videoData、videoCacheUrl 或 youtubeUrl",type:"error"};const t=d.createTask({prompt:e.taskLabel||"视频分析",model:e.model,modelRef:e.modelRef||null,mimeType:e.mimeType||"video/mp4",youtubeUrl:e.youtubeUrl,videoData:e.videoData,videoCacheUrl:e.videoCacheUrl,videoAnalyzerAction:"analyze",videoAnalyzerPrompt:o,videoAnalyzerSource:e.videoAnalyzerSource,videoAnalyzerSourceLabel:e.videoAnalyzerSourceLabel,videoAnalyzerSourceSnapshot:e.videoAnalyzerSourceSnapshot,autoInsertToCanvas:!1},u.CHAT);return{success:!0,data:{taskId:t.id,prompt:e.taskLabel||"视频分析",model:e.model},type:"text",taskId:t.id,task:t}}const c={name:"video_analyze",description:"分析视频内容,返回结构化的镜头拆解、脚本提取、风格分析等数据",supportedModes:["async","queue"],inputSchema:{type:"object",properties:{videoData:{type:"string",description:"base64 编码的视频数据(不含 data: 前缀),≤20MB"},mimeType:{type:"string",description:"视频 MIME 类型,默认 video/mp4",default:"video/mp4"},youtubeUrl:{type:"string",description:"YouTube 视频 URL"},videoCacheUrl:{type:"string",description:"本地缓存的视频 URL(队列模式)"},prompt:{type:"string",description:"自定义分析 prompt(可选,有内置默认值)"},model:{type:"string",description:"模型 ID,默认使用当前文本模型"}},required:[]},execute:async(e,o)=>(o==null?void 0:o.mode)==="queue"?n(e):i(e)};export{c as v};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{k as u,V as s,n as v,o as h,q as z,t as w,T as k,v as x,u as I,w as _,x as b}from"./tool-windows-
|
|
1
|
+
import{k as u,V as s,n as v,o as h,q as z,t as w,T as k,v as x,u as I,w as _,x as b}from"./tool-windows-BEnZdJqF.js";function y(){const e=z.get();return(e==null?void 0:e.videoModelName)||u()}function T(){const e=new Set;return Object.values(s).forEach(t=>{t.durationOptions.forEach(o=>e.add(o.value))}),Array.from(e).sort((t,o)=>parseInt(t)-parseInt(o))}function V(){const e=new Set;return Object.values(s).forEach(t=>{t.sizeOptions.forEach(o=>e.add(o.value))}),Array.from(e)}async function O(e){const{prompt:t,model:o="veo3",modelRef:n,seconds:i="8",size:a="1280x720",referenceImages:d,params:c}=e,l=x(t);if(l)return l;try{const r=o,m=I("video",r,n||null);if(!m||m.kind!=="video")return{success:!1,error:`未找到可用的视频适配器: ${r}`,type:"error"};const p=i?Number(i):void 0,g=await m.generateVideo(_("video",n||r),{prompt:t,size:a,model:r,modelRef:n||null,duration:Number.isFinite(p)?p:void 0,referenceImages:d,params:c}),f=g.url;return f?{success:!0,data:{url:f,format:g.format||"mp4",prompt:t,model:o,seconds:i,size:a},type:"video"}:{success:!1,error:"API 未返回有效的视频 URL",type:"error"}}catch(r){return console.error("[VideoGenerationTool] Generation failed:",r),b(r,"视频生成失败")}}function S(e){const t=e.model||"veo3",o=s[t]||s.veo3,n=w(e.referenceImages);return{taskType:k.VIDEO,resultType:"video",getDefaultModel:y,logPrefix:"VideoGenerationTool",buildTaskPayload:()=>({prompt:e.prompt,size:e.size||"16x9",duration:parseInt(e.seconds||o.defaultDuration,10),model:t,modelRef:e.modelRef||null,uploadedImages:n&&n.length>0?n:void 0,referenceImages:e.referenceImages&&e.referenceImages.length>0?e.referenceImages:void 0,params:e.params,promptMeta:e.promptMeta}),buildResultData:()=>({size:e.size||"16x9",duration:parseInt(e.seconds||o.defaultDuration,10)})}}const A={name:"generate_video",description:`生成视频工具。根据用户的文字描述生成视频。
|
|
2
2
|
|
|
3
3
|
使用场景:
|
|
4
4
|
- 用户想要创建、生成视频
|
|
@@ -10,4 +10,4 @@ import{k as u,V as s,n as v,o as h,q as z,t as w,T as k,v as x,u as I,w as _,x a
|
|
|
10
10
|
- 用户想要生成静态图片(使用 generate_image 工具)
|
|
11
11
|
- 用户只是在聊天,没有生成视频的意图
|
|
12
12
|
|
|
13
|
-
当前使用模型:${y()}`,inputSchema:{type:"object",properties:{prompt:{type:"string",description:"视频描述提示词,详细描述想要生成的视频内容、动作、场景、风格等"},model:{type:"string",description:`视频生成模型,默认使用 ${u()}`,default:u()},seconds:{type:"string",description:"视频时长(秒),不同模型支持的时长不同",enum:T(),default:"8"},size:{type:"string",description:"视频尺寸",enum:V(),default:"1280x720"},referenceImages:{type:"array",description:"参考图片 URL 列表,用于图生视频",items:{type:"string"}},params:{type:"object",description:"额外模型参数,Kling 可用字段包括 model_name、klingAction2、mode、cfg_scale、negative_prompt 与 camera_*;其中 cfg_scale 取值 0 到 1,camera_* 取值 -10 到 10 且需为整数",properties:{model_name:{type:"string",enum:["kling-v3","kling-v2-6","kling-v2-1","kling-v1-6","kling-v1-5"]},klingAction2:{type:"string",enum:["text2video","image2video"]},mode:{type:"string",enum:["std","pro"]},cfg_scale:{type:"number",description:"Kling 自由度,取值范围 0 到 1"},negative_prompt:{type:"string"},camera_control_type:{type:"string"},camera_horizontal:{type:"number",description:"Kling 水平运镜,取值范围 -10 到 10,且必须为整数"},camera_vertical:{type:"number",description:"Kling 垂直运镜,取值范围 -10 到 10,且必须为整数"},camera_pan:{type:"number",description:"Kling 水平摇镜,取值范围 -10 到 10,且必须为整数"},camera_tilt:{type:"number",description:"Kling 垂直摇镜,取值范围 -10 到 10,且必须为整数"},camera_roll:{type:"number",description:"Kling 旋转运镜,取值范围 -10 到 10,且必须为整数"},camera_zoom:{type:"number",description:"Kling 变焦,取值范围 -10 到 10,且必须为整数"}}},count:{type:"number",description:"生成数量,1-10 之间,默认为 1",default:1}},required:["prompt"]},supportedModes:["async","queue"],promptGuidance:{whenToUse:"当用户想要生成视频、动画或动态内容时使用。适用于:将图片变成视频、创建短视频、生成动态场景等。关键词:视频、动画、动起来、动态。",parameterGuidance:{prompt:"将用户描述扩展为详细的英文视频提示词,包含:主体动作(walking, flying, spinning)、场景描述、镜头运动(camera pan, zoom in, tracking shot)、氛围(cinematic, dreamy)、时间节奏(slow motion, timelapse)。",model:"默认使用 veo3,支持高质量视频生成。可选其他模型如需特定效果。",seconds:"根据内容复杂度选择:简单动作用 5-8 秒,复杂场景用 8-10 秒。默认 8 秒。",size:"横屏视频用 1280x720 或 1920x1080,竖屏用 720x1280,正方形用 1024x1024。",referenceImages:'当用户提供图片并想让它"动起来"时使用,传入图片 URL 实现图生视频。',count:'用户明确要求批量生成时使用,如 "+3 生成视频" 则 count=3。'},bestPractices:["prompt 使用英文能获得更好的生成效果",'描述具体的动作和运动,如 "a cat walking slowly" 而非 "a cat"','添加镜头运动描述如 "camera slowly pans right"、"zoom in smoothly"','描述氛围和风格如 "cinematic lighting"、"slow motion"、"dreamy atmosphere"','对于图生视频,描述图片中元素如何运动,如 "the waves start to move"',"避免过于复杂的场景变化,每个视频专注一个主要动作"],examples:[{input:"生成一个猫咪走路的视频",args:{prompt:"A fluffy orange cat walking gracefully across a sunny room, soft natural lighting, camera tracking shot following the cat, gentle movements, high quality, cinematic",seconds:"8",size:"1280x720"}},{input:"让这张日落图片动起来",args:{prompt:"Beautiful sunset scene with moving clouds drifting slowly across the sky, sun rays shifting, gentle wind effect on trees, time-lapse style, warm golden hour lighting, peaceful atmosphere",referenceImages:["[图片1]"],seconds:"8"},explanation:"图生视频使用 referenceImages 传递原图,prompt 描述期望的动态效果"},{input:"赛博朋克城市夜景动画",args:{prompt:"Cyberpunk city at night with flying cars moving through neon-lit streets, holographic advertisements flickering, rain falling, camera slowly panning across the skyline, atmospheric fog, cinematic sci-fi mood",seconds:"10",size:"1920x1080"}},{input:"生成一个产品旋转展示视频",args:{prompt:"Product showcase video, sleek modern headphones rotating 360 degrees on a white pedestal, smooth continuous rotation, professional studio lighting, minimal clean background, commercial quality",seconds:"8",size:"1280x720"}}],warnings:["视频生成时间较长(通常 1-3 分钟),请耐心等待","避免描述突然的场景切换或多个不连贯的动作","图生视频时,确保参考图片清晰且主体明确"]},execute:async(e,t)=>{
|
|
13
|
+
当前使用模型:${y()}`,inputSchema:{type:"object",properties:{prompt:{type:"string",description:"视频描述提示词,详细描述想要生成的视频内容、动作、场景、风格等"},model:{type:"string",description:`视频生成模型,默认使用 ${u()}`,default:u()},seconds:{type:"string",description:"视频时长(秒),不同模型支持的时长不同",enum:T(),default:"8"},size:{type:"string",description:"视频尺寸",enum:V(),default:"1280x720"},referenceImages:{type:"array",description:"参考图片 URL 列表,用于图生视频",items:{type:"string"}},params:{type:"object",description:"额外模型参数,Kling 可用字段包括 model_name、klingAction2、mode、cfg_scale、negative_prompt 与 camera_*;其中 cfg_scale 取值 0 到 1,camera_* 取值 -10 到 10 且需为整数",properties:{model_name:{type:"string",enum:["kling-v3","kling-v2-6","kling-v2-1","kling-v1-6","kling-v1-5"]},klingAction2:{type:"string",enum:["text2video","image2video"]},mode:{type:"string",enum:["std","pro"]},cfg_scale:{type:"number",description:"Kling 自由度,取值范围 0 到 1"},negative_prompt:{type:"string"},camera_control_type:{type:"string"},camera_horizontal:{type:"number",description:"Kling 水平运镜,取值范围 -10 到 10,且必须为整数"},camera_vertical:{type:"number",description:"Kling 垂直运镜,取值范围 -10 到 10,且必须为整数"},camera_pan:{type:"number",description:"Kling 水平摇镜,取值范围 -10 到 10,且必须为整数"},camera_tilt:{type:"number",description:"Kling 垂直摇镜,取值范围 -10 到 10,且必须为整数"},camera_roll:{type:"number",description:"Kling 旋转运镜,取值范围 -10 到 10,且必须为整数"},camera_zoom:{type:"number",description:"Kling 变焦,取值范围 -10 到 10,且必须为整数"}}},count:{type:"number",description:"生成数量,1-10 之间,默认为 1",default:1}},required:["prompt"]},supportedModes:["async","queue"],promptGuidance:{whenToUse:"当用户想要生成视频、动画或动态内容时使用。适用于:将图片变成视频、创建短视频、生成动态场景等。关键词:视频、动画、动起来、动态。",parameterGuidance:{prompt:"将用户描述扩展为详细的英文视频提示词,包含:主体动作(walking, flying, spinning)、场景描述、镜头运动(camera pan, zoom in, tracking shot)、氛围(cinematic, dreamy)、时间节奏(slow motion, timelapse)。",model:"默认使用 veo3,支持高质量视频生成。可选其他模型如需特定效果。",seconds:"根据内容复杂度选择:简单动作用 5-8 秒,复杂场景用 8-10 秒。默认 8 秒。",size:"横屏视频用 1280x720 或 1920x1080,竖屏用 720x1280,正方形用 1024x1024。",referenceImages:'当用户提供图片并想让它"动起来"时使用,传入图片 URL 实现图生视频。',count:'用户明确要求批量生成时使用,如 "+3 生成视频" 则 count=3。'},bestPractices:["prompt 使用英文能获得更好的生成效果",'描述具体的动作和运动,如 "a cat walking slowly" 而非 "a cat"','添加镜头运动描述如 "camera slowly pans right"、"zoom in smoothly"','描述氛围和风格如 "cinematic lighting"、"slow motion"、"dreamy atmosphere"','对于图生视频,描述图片中元素如何运动,如 "the waves start to move"',"避免过于复杂的场景变化,每个视频专注一个主要动作"],examples:[{input:"生成一个猫咪走路的视频",args:{prompt:"A fluffy orange cat walking gracefully across a sunny room, soft natural lighting, camera tracking shot following the cat, gentle movements, high quality, cinematic",seconds:"8",size:"1280x720"}},{input:"让这张日落图片动起来",args:{prompt:"Beautiful sunset scene with moving clouds drifting slowly across the sky, sun rays shifting, gentle wind effect on trees, time-lapse style, warm golden hour lighting, peaceful atmosphere",referenceImages:["[图片1]"],seconds:"8"},explanation:"图生视频使用 referenceImages 传递原图,prompt 描述期望的动态效果"},{input:"赛博朋克城市夜景动画",args:{prompt:"Cyberpunk city at night with flying cars moving through neon-lit streets, holographic advertisements flickering, rain falling, camera slowly panning across the skyline, atmospheric fog, cinematic sci-fi mood",seconds:"10",size:"1920x1080"}},{input:"生成一个产品旋转展示视频",args:{prompt:"Product showcase video, sleek modern headphones rotating 360 degrees on a white pedestal, smooth continuous rotation, professional studio lighting, minimal clean background, commercial quality",seconds:"8",size:"1280x720"}}],warnings:["视频生成时间较长(通常 1-3 分钟),请耐心等待","避免描述突然的场景切换或多个不连贯的动作","图生视频时,确保参考图片清晰且主体明确"]},execute:async(e,t)=>{const o=e,n=(t==null?void 0:t.mode)||"async";let i=o.size;if(o.size){const d=o.model||"veo3",c=s[d]||s.veo3,l=c.sizeOptions.map(r=>r.value);i=v(o.size,l,c.defaultSize)}const a={...o,size:i};return n==="queue"?h(a,t||{},S(a)):O(a)}};async function E(e,t){return await A.execute(e,{...t,mode:"queue"})}export{E as createVideoTask,y as getCurrentVideoModel,A as videoGenerationTool};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as f,N as u}from"./tool-windows-BEnZdJqF.js";async function h(e){if(!e||!e.children)return 0;let n=0;for(const c of e.children){const r=c.url;if(r&&r.startsWith("blob:")&&r.includes("#merged-video-")){const s=r.indexOf("#merged-video-");if(s===-1)continue;const i=r.substring(s+1),d=i.indexOf("#",1),o=d>0?i.substring(0,d):i;try{const t=await f.getCachedBlob(o);if(t){const l=`${URL.createObjectURL(t)}#${o}`,a=e.children.indexOf(c);u.setNode(e,{url:l},[a]),n++}else console.warn("[VideoRecovery] Cache not found for taskId:",o)}catch(t){console.error("[VideoRecovery] Failed to recover video:",o,t)}}}return n}function x(e){e&&requestAnimationFrame(async()=>{try{await h(e)}catch(n){console.error("[VideoRecovery] Initialization failed:",n)}})}export{x as initVideoRecoveryService,h as recoverExpiredVideoUrls};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./tool-windows-D61Le6TE.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{_ as z,c3 as A,c4 as D,am as M}from"./tool-windows-BEnZdJqF.js";async function O(t,e,i){if(t.size===0)throw new Error("Invalid frame blob: size is 0");const l=`/__aitu_cache__/video-frame_${e}_${i}`;return await z.cacheMediaFromBlob(l,t,"image",{metadata:{source:"video-frame",shotId:e,frameType:i}}),l}async function H(t,e,i){const l=URL.createObjectURL(t),c=document.createElement("video");c.muted=!0,c.preload="auto";try{await new Promise((m,h)=>{c.onloadedmetadata=()=>m(),c.onerror=()=>h(new Error("Failed to load video")),c.src=l});const a=document.createElement("canvas"),d=a.getContext("2d"),r=Math.min(1,320/c.videoWidth);a.width=Math.round(c.videoWidth*r),a.height=Math.round(c.videoHeight*r);const n=[];for(let m=0;m<e.length;m++){i==null||i(m,e.length);try{const h=await S(c,a,d,e[m]);n.push(h)}catch{n.push(null)}}return i==null||i(e.length,e.length),n}finally{URL.revokeObjectURL(l),c.src=""}}async function Z(t,e,i,l){const c=l||i,a=document.createElement("video");a.muted=!0,a.preload="auto",a.crossOrigin="anonymous";try{await new Promise((E,v)=>{a.onloadedmetadata=()=>E(),a.onerror=()=>v(new Error("Failed to load video")),a.src=t});const d=document.createElement("canvas"),s=d.getContext("2d"),n=Math.min(1,1280/a.videoWidth);d.width=Math.round(a.videoWidth*n),d.height=Math.round(a.videoHeight*n);const m=c==="first"?Math.min(.1,a.duration):Math.max(0,a.duration-.1),h=await S(a,d,s,m);return await O(h,e,i)}catch{return null}finally{a.src=""}}function S(t,e,i,l){return new Promise((c,a)=>{const d=Math.min(Math.max(0,l),t.duration||0);t.currentTime=d;const s=()=>{t.removeEventListener("seeked",s),i.drawImage(t,0,0,e.width,e.height),e.toBlob(r=>{r&&r.size>0?c(r):a(new Error("toBlob returned empty"))},"image/jpeg",.85)};t.addEventListener("seeked",s)})}function G(t){const{model:e,firstFrameUrl:i,lastFrameUrl:l,extraReferenceUrls:c=[],characterReferenceUrls:a=[]}=t,d=D(e),s=[],r=n=>{!n||s.includes(n)||s.push(n)};if(d.imageUpload.mode==="frames"){r(i),r(l);const n=s.length>0?s.slice(0,d.imageUpload.maxCount):void 0,m=a.length>0?a:void 0;return{referenceImages:n,unusedCharacterReferenceUrls:m}}for(const n of a)if(r(n),s.length>=d.imageUpload.maxCount)break;r(i);for(const n of c)if(r(n),s.length>=d.imageUpload.maxCount)break;return{referenceImages:s.length>0?s:void 0}}async function Y(t,e){return A(t,{interval:1e3,timeout:1800*1e3,signal:e})}function j(t){return Math.max(2,String(Math.max(t,0)).length)}function T(t,e){return String(t).padStart(e,"0")}function b(t,e,i){const l=T(t+1,i);return e==="first"?`${l}.首帧`:e==="last"?`${l}.尾帧`:`${l}.视频`}function P(t){return["#!/bin/sh","set -eu","",'cd "$(dirname "$0")"',"",`MANIFEST_FILE=${JSON.stringify(t)}`,"",'if [ ! -f "$MANIFEST_FILE" ]; then',' echo "未找到 $MANIFEST_FILE"'," exit 1","fi","","download_if_missing() {",' file_name="$1"',' source_url="$2"',' if [ -s "$file_name" ]; then',' echo "[skip] $file_name"'," return 0"," fi",' echo "[download] $file_name"',' curl -L --fail --retry 3 --retry-delay 1 --output "$file_name.part" "$source_url"',' mv "$file_name.part" "$file_name"',"}","","emit_entries() {"," if command -v node >/dev/null 2>&1; then",` node -e 'const fs=require("fs"); const manifest=JSON.parse(fs.readFileSync(process.argv[1],"utf8")); for (const entry of manifest.downloadEntries||[]) { if (entry?.fileName && entry?.url) process.stdout.write(String(entry.fileName)+"\\t"+String(entry.url)+"\\n"); }' "$MANIFEST_FILE"`," return 0"," fi",""," if command -v python3 >/dev/null 2>&1; then",` python3 - "$MANIFEST_FILE" <<'PY'`,"import json, sys","with open(sys.argv[1], 'r', encoding='utf-8') as fh:"," manifest = json.load(fh)","for entry in manifest.get('downloadEntries', []):"," file_name = entry.get('fileName')"," url = entry.get('url')"," if file_name and url:",' print(f"{file_name}\\t{url}")',"PY"," return 0"," fi","",' echo "需要 node 或 python3 来解析 $MANIFEST_FILE" >&2'," return 1","}","",'TMP_ENTRIES_FILE="$(mktemp -t workflow-download-entries.XXXXXX)"',`trap 'rm -f "$TMP_ENTRIES_FILE"' EXIT INT TERM`,"",'emit_entries > "$TMP_ENTRIES_FILE"',"","while IFS=' ' read -r file_name source_url; do",' [ -n "${file_name:-}" ] || continue',' [ -n "${source_url:-}" ] || continue',' download_if_missing "$file_name" "$source_url"','done < "$TMP_ENTRIES_FILE"',"",'echo "下载完成"',""].join(`
|
|
3
|
+
`)}function X(t){return t.map(e=>({...e,generated_first_frame_url:void 0,generated_last_frame_url:void 0,generated_video_url:void 0,suppressed_generated_urls:void 0}))}function V(t){return t.map(e=>({...e,referenceImageUrl:void 0}))}function q(t,e){return{shots:X(t),characters:V(e)}}function K(t){return t.flatMap((e,i)=>{const l=[];return e.generated_first_frame_url&&l.push({url:e.generated_first_frame_url,type:"image",kind:"first",shotIndex:i}),e.generated_last_frame_url&&l.push({url:e.generated_last_frame_url,type:"image",kind:"last",shotIndex:i}),e.generated_video_url&&l.push({url:e.generated_video_url,type:"video",kind:"video",shotIndex:i}),l})}async function Q(t){const{recordId:e,fileNamePrefix:i,zipBaseName:l,scriptMarkdown:c,recordMeta:a,shots:d,assets:s,audioAsset:r,onProgress:n}=t,m=new Date().toISOString(),h=j(d.length),E=T(0,h),{default:v}=await M(async()=>{const{default:o}=await import("./tool-windows-BEnZdJqF.js").then(u=>u.j);return{default:o}},__vite__mapDeps([0]),import.meta.url),{downloadFromBlob:N,getFileExtension:F,normalizeImageDataUrl:L,processBatchWithConcurrency:U}=await M(async()=>{const{downloadFromBlob:o,getFileExtension:u,normalizeImageDataUrl:p,processBatchWithConcurrency:_}=await import("./tool-windows-BEnZdJqF.js").then(w=>w.pa);return{downloadFromBlob:o,getFileExtension:u,normalizeImageDataUrl:p,processBatchWithConcurrency:_}},__vite__mapDeps([0]),import.meta.url),$=new v,f={exportedAt:m,record:a,files:{script:`${E}.脚本.md`,music:null,manifest:`${E}.manifest.json`,downloadScript:`${E}.补全下载.sh`},shots:d.map((o,u)=>({index:u+1,id:o.id,label:o.label||`镜头 ${u+1}`,startTime:o.startTime,endTime:o.endTime,files:{first:null,last:null,video:null}})),errors:[],downloadEntries:[]};if($.file(f.files.script,c),n==null||n(s.length>0||r?8:40),r!=null&&r.url){const o=r.plannedFileName||`${E}.音乐.mp3`;f.downloadEntries.push({fileName:o,url:r.url});try{const u=await fetch(r.url,{referrerPolicy:"no-referrer"});if(!u.ok)throw new Error(`HTTP ${u.status}`);const p=await u.blob(),_=F(r.url,p.type)||r.fallbackExtension||"mp3",w=o.replace(/\.[^.]+$/,`.${_}`);$.file(w,p),f.files.music=w,w!==o&&(f.downloadEntries[f.downloadEntries.length-1].fileName=w)}catch(u){f.files.music=o,f.errors.push(r.downloadErrorMessage||"音乐下载失败"),console.error("[workflow-export] Failed to export audio asset:",r.url,u)}}else r!=null&&r.missingErrorMessage&&f.errors.push(r.missingErrorMessage);await U(s,async(o,u)=>{const p=o.type==="image"?L(o.url):o.url,_=f.shots[o.shotIndex],w=o.type==="image"?"png":"mp4",I=`${b(o.shotIndex,o.kind,h)}.${w}`;f.downloadEntries.push({fileName:I,url:p});try{const g=await fetch(p,{referrerPolicy:"no-referrer"});if(!g.ok)throw new Error(`HTTP ${g.status}`);const x=await g.blob(),B=F(p,x.type)||w,y=`${b(o.shotIndex,o.kind,h)}.${B}`;$.file(y,x),_.files[o.kind]=y,y!==I&&(f.downloadEntries[f.downloadEntries.length-1].fileName=y)}catch(g){const x=(_==null?void 0:_.label)||`镜头 ${o.shotIndex+1}`;f.errors.push(`${x} ${o.kind} 下载失败`),_.files[o.kind]=I,console.error("[workflow-export] Failed to export asset:",p,g)}finally{const g=u+1,x=s.length>0?Math.round(g/s.length*62):62;n==null||n(8+x)}},3),$.file(f.files.downloadScript,P(f.files.manifest),{unixPermissions:493}),$.file(f.files.manifest,JSON.stringify(f,null,2));const W=await $.generateAsync({type:"blob"},o=>n==null?void 0:n(70+Math.round(o.percent*.3))),R=e.replace(/[^a-zA-Z0-9_-]/g,""),C=m.slice(0,19).replace(/[:T]/g,"-"),k=`${l}_${R||i}_${C}.zip`;return N(W,k),n==null||n(100),{assetCount:s.length,zipFileName:k}}export{K as a,Z as b,O as c,G as d,H as e,Q as f,q as r,Y as w};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./tool-windows-D61Le6TE.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{am as h,dH as S,D as x,h as R,e as M,d as P,s as T,g as C,eo as F,O as D,ep as Y,Q as J,eq as $,er as K,es as B,T as E,et as G,eu as q,bD as L,ev as U,ew as N,X as W,ex as Z,bB as I,ey as b,c3 as j,ez as H,eA as p,eB as z}from"./tool-windows-BEnZdJqF.js";let y=null;function de(m){y=m}class Q{async execute(e){const{operation:t,args:r}=e;switch(t){case"canvas_insert":return this.handleCanvasInsert(r);case"insert_to_canvas":return this.handleInsertToCanvas(r);case"insert_mermaid":return this.handleMermaid(r);case"insert_mindmap":return this.handleMindmap(r);case"insert_svg":return this.handleSvg(r);case"generate_grid_image":return this.handleGridImage(r);case"generate_inspiration_board":return this.handleInspirationBoard(r);case"split_image":return this.handleSplitImage(r);case"generate_long_video":return this.handleLongVideo(r);case"ai_analyze":return this.handleAIAnalyze(r);case"generate_image":return this.handleGenerateImage(r);case"generate_video":return this.handleGenerateVideo(r);case"generate_audio":return this.handleGenerateAudio(r);case"generate_ppt":return this.handleGeneratePPT(r);default:return{success:!1,error:`Unknown operation: ${t}`,type:"error"}}}async handleGeneratePPT(e){const t=y;if(!t)return{success:!1,error:"画布未初始化",type:"error"};try{const[{setBoard:r},{generatePPT:a}]=await Promise.all([h(()=>import("./index-D2Kc-3MO.js"),__vite__mapDeps([0]),import.meta.url),h(()=>import("./ppt-generation-B5fKT_by.js"),__vite__mapDeps([0]),import.meta.url)]);r(t);const s=await a(e);return{success:s.success,data:s.data,error:s.error,type:s.type}}catch(r){return{success:!1,error:r.message||"PPT 生成失败",type:"error"}}}async handleGenerateAudio(e){return{success:!1,error:"SW 暂不支持直接处理音频生成,请回退到主线程执行",type:"audio"}}findWorkZoneForMCP(e,t){var s;const r=S.getAllWorkZones(e);if(r.length===0)return null;for(const o of r)if((s=o.workflow.steps)==null?void 0:s.some(i=>i.mcp===t))return o;return r.sort((o,n)=>(n.createdAt||0)-(o.createdAt||0))[0]||null}async handleInsertToCanvas(e){const t=y;if(!t)return{success:!1,error:"画布未初始化",type:"error"};const{items:r,startPoint:a,verticalGap:s=50}=e;if(!r||r.length===0)return{success:!1,error:"没有要插入的内容",type:"error"};try{const{parseMarkdownToCards:o}=await h(async()=>{const{parseMarkdownToCards:d}=await import("./tool-windows-BEnZdJqF.js").then(g=>g.ph);return{parseMarkdownToCards:d}},__vite__mapDeps([0]),import.meta.url),{insertCardsToCanvas:n}=await h(async()=>{const{insertCardsToCanvas:d}=await import("./tool-windows-BEnZdJqF.js").then(g=>g.pi);return{insertCardsToCanvas:d}},__vite__mapDeps([0]),import.meta.url);let i=a||this.getInsertionPoint(t),c=0;for(const d of r){const{type:g,content:u,metadata:v}=d;switch(g){case"text":{const w=o(u);if(w&&w.length>0){const _=Math.round(window.innerWidth*.5);n(t,w,i,_);const A=Math.min(w.length,3),X=Math.ceil(w.length/3);i=[i[0],i[1]+X*140+s]}else x.insertText(t,i,u),i=[i[0],i[1]+100+s];c++;break}case"image":await P(t,u,i,!1,{width:400,height:400},!1,!0),i=[i[0],i[1]+400+s],c++;break;case"video":await M(t,u,i),i=[i[0],i[1]+300+s],c++;break;case"audio":await R(t,u,v,i,!1,!0),i=[i[0],i[1]+160+s],c++;break;case"svg":{const _={url:this.svgToDataUrl(u),width:400,height:400};x.insertImage(t,_,i),i=[i[0],i[1]+400+s],c++;break}}}const l=a||this.getInsertionPoint(t);return requestAnimationFrame(()=>{T(t,l)}),window.dispatchEvent(new CustomEvent("ai-generation-complete",{detail:{type:"text",success:!0}})),{success:!0,data:{insertedCount:c},type:"canvas"}}catch(o){return{success:!1,error:o.message||"插入失败",type:"error"}}}async handleCanvasInsert(e){const t=y;if(!t)return{success:!1,error:"画布未初始化",type:"error"};const{items:r,startPoint:a,verticalGap:s=50,horizontalGap:o=20}=e;if(!r||r.length===0)return{success:!1,error:"没有要插入的内容",type:"error"};try{let n=a||this.getInsertionPoint(t),i=0;for(const c of r){const{type:l,content:d,metadata:g}=c;switch(l){case"image":await P(t,d,n,!1,{width:400,height:400},!1,!0),n=[n[0],n[1]+400+s],i++;break;case"video":await M(t,d,n),n=[n[0],n[1]+300+s],i++;break;case"audio":await R(t,d,g,n,!1,!0),n=[n[0],n[1]+160+s],i++;break;case"text":x.insertText(t,n,d),n=[n[0],n[1]+100+s],i++;break;case"svg":const v={url:this.svgToDataUrl(d),width:400,height:400};x.insertImage(t,v,n),n=[n[0],n[1]+400+s],i++;break}}return{success:!0,data:{insertedCount:i},type:"canvas"}}catch(n){return{success:!1,error:n.message||"插入失败",type:"error"}}}async handleMermaid(e){const t=y;if(!t)return{success:!1,error:"画布未初始化",type:"error"};const{mermaid:r}=e;if(!r)return{success:!1,error:"缺少 mermaid 参数",type:"error"};try{const{parseMermaidToDrawnix:a}=await h(async()=>{const{parseMermaidToDrawnix:d}=await import("./index-0b_TeH8L.js").then(g=>g.aq);return{parseMermaidToDrawnix:d}},__vite__mapDeps([0]),import.meta.url),s=this.extractCodeBlock(r,"mermaid");let o;try{o=await a(s)}catch{o=await a(s.replace(/"/g,"'"))}const{elements:n}=o;if(!n||n.length===0)return{success:!1,error:"Mermaid 解析未生成元素",type:"error"};const i=this.findWorkZoneForMCP(t,"insert_mermaid"),c=this.getViewportCenter(t),l=this.insertElementsToCanvasAtPoint(t,n,c);return l.success&&(requestAnimationFrame(()=>{this.centerInsertedElementsInViewport(t,n.length)}),i&&setTimeout(()=>{S.removeWorkZone(t,i.id),window.dispatchEvent(new CustomEvent("ai-generation-complete",{detail:{type:"mermaid",success:!0}}))},100)),{success:l.success,data:{elementsCount:l.elementsCount},type:"canvas",error:l.error}}catch(a){return console.error("[SWCapabilities] Mermaid conversion failed:",a),{success:!1,error:`Mermaid 转换失败: ${a.message}`,type:"error"}}}async handleMindmap(e){const t=y;if(!t)return console.error("[SWCapabilities] ❌ handleMindmap: 画布未初始化"),{success:!1,error:"画布未初始化",type:"error"};const{markdown:r}=e;if(!r)return console.error("[SWCapabilities] ❌ handleMindmap: 缺少 markdown 参数"),{success:!1,error:"缺少 markdown 参数",type:"error"};try{const{parseMarkdownToDrawnix:a}=await h(async()=>{const{parseMarkdownToDrawnix:l}=await import("./index-CjeDxq0c.js");return{parseMarkdownToDrawnix:l}},__vite__mapDeps([0]),import.meta.url),s=this.extractCodeBlock(r,"markdown");let o;try{o=await a(s)}catch{o=await a(s.replace(/"/g,"'"))}if(!o)return{success:!1,error:"Markdown 解析未生成元素",type:"error"};o.points=[[0,0]];const n=this.findWorkZoneForMCP(t,"insert_mindmap"),i=this.getViewportCenter(t),c=this.insertElementsToCanvasAtPoint(t,[o],i);return c.success?(requestAnimationFrame(()=>{this.centerInsertedElementsInViewport(t,1)}),n&&setTimeout(()=>{S.removeWorkZone(t,n.id),window.dispatchEvent(new CustomEvent("ai-generation-complete",{detail:{type:"mindmap",success:!0}}))},100)):console.error("[SWCapabilities] ❌ Mindmap insert failed:",c.error),{success:c.success,data:{type:"mindmap",elementsCount:c.elementsCount},type:"canvas",error:c.error}}catch(a){return console.error("[SWCapabilities] ❌ Mindmap conversion failed:",a),{success:!1,error:`思维导图转换失败: ${a.message}`,type:"error"}}}async handleSvg(e){const t=y;if(!t)return{success:!1,error:"画布未初始化",type:"error"};const{svg:r,width:a=400,startPoint:s}=e;if(!r)return{success:!1,error:"缺少 svg 参数",type:"error"};try{const o=this.extractSvgCode(r),n=this.normalizeSvg(o),i=this.parseSvgDimensions(n),c=Math.min(Math.max(a,100),800),l=i.height/i.width,d=c*l,g=this.svgToDataUrl(n);let u=s||this.getInsertionPoint(t);u=[u[0]-c/2,u[1]];const v={url:g,width:c,height:d};x.insertImage(t,v,u);const w=[u[0]+c/2,u[1]+d/2];return requestAnimationFrame(()=>{T(t,w)}),{success:!0,data:{width:c,height:d},type:"canvas"}}catch(o){return{success:!1,error:`SVG 插入失败: ${o.message}`,type:"error"}}}async handleGridImage(e){try{const{createGridImageTask:t}=await h(async()=>{const{createGridImageTask:a}=await import("./tool-windows-BEnZdJqF.js").then(s=>s.pq);return{createGridImageTask:a}},__vite__mapDeps([0]),import.meta.url),r=await t(e);return{success:r.success,data:r.data,type:r.type,taskId:r.taskId,error:r.error}}catch(t){return{success:!1,error:`宫格图生成失败: ${t.message}`,type:"error"}}}async handleInspirationBoard(e){try{const{createInspirationBoardTask:t}=await h(async()=>{const{createInspirationBoardTask:a}=await import("./tool-windows-BEnZdJqF.js").then(s=>s.pr);return{createInspirationBoardTask:a}},__vite__mapDeps([0]),import.meta.url),r=await t(e);return{success:r.success,data:r.data,type:r.type,taskId:r.taskId,error:r.error}}catch(t){return{success:!1,error:`灵感图生成失败: ${t.message}`,type:"error"}}}async handleSplitImage(e){const t=y;if(!t)return{success:!1,error:"画布未初始化",type:"error"};const{imageUrl:r}=e;if(!r)return{success:!1,error:"缺少 imageUrl 参数",type:"error"};try{const{splitAndInsertImages:a}=await h(async()=>{const{splitAndInsertImages:o}=await import("./tool-windows-BEnZdJqF.js").then(n=>n.pl);return{splitAndInsertImages:o}},__vite__mapDeps([0]),import.meta.url),s=await a(t,r,{scrollToResult:!0});return{success:s.success,data:{count:s.count},type:"canvas",error:s.error}}catch(a){return{success:!1,error:`图片拆分失败: ${a.message}`,type:"error"}}}async handleLongVideo(e){try{const{createLongVideoTask:t}=await h(async()=>{const{createLongVideoTask:a}=await import("./tool-windows-BEnZdJqF.js").then(s=>s.pt);return{createLongVideoTask:a}},__vite__mapDeps([0]),import.meta.url),r=await t(e);return{success:r.success,data:r.data,type:r.type,taskId:r.taskId,error:r.error}}catch(t){return{success:!1,error:`长视频生成失败: ${t.message}`,type:"error"}}}async handleAIAnalyze(e){var t;try{const{analyzeWithAI:r}=await h(async()=>{const{analyzeWithAI:s}=await import("./tool-windows-BEnZdJqF.js").then(o=>o.ps);return{analyzeWithAI:s}},__vite__mapDeps([0]),import.meta.url),a=await r(e.context,{onChunk:s=>{},onAddSteps:s=>{}},e.modelRef||null);return{success:a.success,data:{response:a.response},type:"text",addSteps:(t=a.generatedSteps)==null?void 0:t.map(s=>({id:s.id,mcp:s.mcp,args:s.args,description:s.description,status:s.status})),error:a.error}}catch(r){return{success:!1,error:`AI 分析失败: ${r.message}`,type:"error"}}}async handleGenerateImage(e){var t;try{const{createImageTask:r}=await h(async()=>{const{createImageTask:s}=await import("./tool-windows-BEnZdJqF.js").then(o=>o.pc);return{createImageTask:s}},__vite__mapDeps([0]),import.meta.url),a=await r(e);return a.success?{success:!0,data:a.data,type:"image",taskId:a.taskId,taskIds:(t=a.data)==null?void 0:t.taskIds}:(console.error("[SWCapabilities] Image task creation failed:",a.error),{success:!1,error:a.error||"图片生成任务创建失败",type:"error"})}catch(r){return console.error("[SWCapabilities] Image generation error:",r),{success:!1,error:`图片生成失败: ${r.message}`,type:"error"}}}async handleGenerateVideo(e){var t;try{const{createVideoTask:r}=await h(async()=>{const{createVideoTask:s}=await import("./video-generation-BXhS7x-a.js");return{createVideoTask:s}},__vite__mapDeps([0]),import.meta.url),a=await r(e);return a.success?{success:!0,data:a.data,type:"video",taskId:a.taskId,taskIds:(t=a.data)==null?void 0:t.taskIds}:(console.error("[SWCapabilities] Video task creation failed:",a.error),{success:!1,error:a.error||"视频生成任务创建失败",type:"error"})}catch(r){return console.error("[SWCapabilities] Video generation error:",r),{success:!1,error:`视频生成失败: ${r.message}`,type:"error"}}}getInsertionPoint(e){const t=e.appState,r=(t==null?void 0:t.lastSelectedElementIds)||[];if(r.length>0){const a=r.map(s=>e.children.find(o=>o.id===s)).filter(Boolean);if(a.length>0)try{const s=C(e,a,!1);return[s.x+s.width/2,s.y+s.height+50]}catch{}}if(e.children&&e.children.length>0){let a=0,s=100;for(const o of e.children)try{const n=C(e,[o],!1),i=n.y+n.height;i>a&&(a=i,s=n.x+n.width/2)}catch{}return[s,a+50]}return[100,100]}insertElementsToCanvas(e,t){try{const r=this.getInsertionPoint(e);return e.insertFragment({elements:JSON.parse(JSON.stringify(t))},r,F.paste),requestAnimationFrame(()=>{T(e,r)}),{success:!0,elementsCount:t.length}}catch(r){return{success:!1,error:r.message}}}insertElementsToCanvasAtPoint(e,t,r){try{return e.insertFragment({elements:JSON.parse(JSON.stringify(t))},r,F.paste),requestAnimationFrame(()=>{T(e,r)}),{success:!0,elementsCount:t.length}}catch(a){return console.error("[SWCapabilities] insertElementsToCanvasAtPoint failed:",a),{success:!1,error:a.message}}}getViewportCenter(e){try{const r=D.getBoardContainer(e).getBoundingClientRect(),a=e.viewport.zoom,s=Y(e);if(!s)return[0,0];const o=s[0]+r.width/(2*a),n=s[1]+r.height/(2*a);return[o,n]}catch(t){return console.warn("[SWCapabilities] Error getting viewport center:",t),[0,0]}}centerInsertedElementsInViewport(e,t){try{const a=e.children.slice(-t);if(a.length===0){console.warn("[SWCapabilities] No inserted elements found to center");return}const s=C(e,a,!1),n=D.getBoardContainer(e).getBoundingClientRect(),i=80,c=n.width-i*2,l=n.height-i*2,d=c/s.width,g=l/s.height;let u=Math.min(d,g);u=Math.min(Math.max(u,.2),1.5);const v=s.x+s.width/2,w=s.y+s.height/2,_=v-n.width/(2*u),A=w-n.height/(2*u);J.updateViewport(e,[_,A],u)}catch(r){console.warn("[SWCapabilities] Error centering inserted elements:",r)}}extractCodeBlock(e,t){const r=new RegExp(`\`\`\`${t}\\s*\\n([\\s\\S]*?)\\n\\s*\`\`\``,"i"),a=e.match(r);if(a)return a[1].trim();const s=new RegExp(`\`\`\`${t}\\s*([\\s\\S]*?)\\s*\`\`\``,"i"),o=e.match(s);if(o)return o[1].trim();const n=new RegExp(`^${t}\\s*\\n`,"i");return n.test(e.trim())?e.trim().replace(n,"").trim():e.trim()}extractSvgCode(e){let t=this.extractCodeBlock(e,"svg");if(t===e&&(t=this.extractCodeBlock(e,"xml")),t===e&&!t.trim().startsWith("<svg")){const r=t.match(/<svg[\s\S]*?<\/svg>/i);r&&(t=r[0])}return t.trim()}normalizeSvg(e){let t=e.trim();return t.includes("xmlns=")||(t=t.replace("<svg",'<svg xmlns="http://www.w3.org/2000/svg"')),t}parseSvgDimensions(e){const t=e.match(/viewBox=["']([^"']+)["']/i);if(t){const[,,s,o]=t[1].split(/\s+/).map(Number);if(s&&o)return{width:s,height:o}}const r=e.match(/width=["'](\d+)(?:px)?["']/i),a=e.match(/height=["'](\d+)(?:px)?["']/i);return r&&a?{width:parseInt(r[1]),height:parseInt(a[1])}:{width:400,height:400}}svgToDataUrl(e){return`data:image/svg+xml,${encodeURIComponent(e).replace(/'/g,"%27").replace(/"/g,"%22")}`}}const O=new Q,k=K.WORKFLOWS;class ee{async isAvailable(){try{return(await $()).objectStoreNames.contains(k)}catch{return!1}}async getDB(){return $()}async saveWorkflow(e){try{const t=await this.getDB();if(!t.objectStoreNames.contains(k))return;await new Promise((r,a)=>{const n=t.transaction(k,"readwrite").objectStore(k).put(e);n.onerror=()=>{r()},n.onsuccess=()=>r()})}catch{}}async getWorkflow(e){if(!e)return null;const t=await this.getDB();return new Promise((r,a)=>{const n=t.transaction(k,"readonly").objectStore(k).get(e);n.onerror=()=>a(n.error),n.onsuccess=()=>r(n.result||null)})}async deleteWorkflow(e){if(!e)return;const t=await this.getDB();return new Promise((r,a)=>{const n=t.transaction(k,"readwrite").objectStore(k).delete(e);n.onerror=()=>a(n.error),n.onsuccess=()=>r()})}close(){}}const f=new ee;function te(m){const e=m.steps.find(t=>t.status==="failed");return(e==null?void 0:e.error)||"Unknown error"}function re(m){return m.steps.filter(e=>e.status!=="pending"?!1:e.dependsOn&&e.dependsOn.length>0?e.dependsOn.every(t=>{const r=m.steps.find(a=>a.id===t);return(r==null?void 0:r.status)==="completed"}):!0)}function ae(m){const e={...m.params||{}};return m.resolution!==void 0&&e.resolution===void 0&&(e.resolution=m.resolution),m.quality!==void 0&&e.quality===void 0&&(e.quality=m.quality),typeof m.count=="number"&&Number.isFinite(m.count)&&e.n===void 0&&(e.n=m.count),Object.keys(e).length>0?e:void 0}function se(m,e){return{prompt:m,model:e.model,modelRef:e.modelRef||null,size:e.size,resolution:e.resolution,quality:e.quality,generationMode:e.generationMode,referenceImages:e.referenceImages&&e.referenceImages.length>0?e.referenceImages:void 0,maskImage:e.maskImage,inputFidelity:e.inputFidelity,background:e.background,outputFormat:e.outputFormat,outputCompression:e.outputCompression,uploadedImages:e.uploadedImages&&e.uploadedImages.length>0?e.uploadedImages:void 0,count:e.count,promptMeta:e.promptMeta,params:ae(e)}}async function ne(m,e={}){var d,g;const t={prompt:m,...e},r=B(t,E.IMAGE);if(!r.valid)throw new Error(r.errors.join(", "));const a=G(t);if(await q.waitForInitialization(),!L("image",e.modelRef||e.model))throw new Error("未配置 API Key,请在设置中配置");const s=U(),o=Date.now(),n=se(a.prompt,e);await N.createTask(s,"image",n),W.trackExternalTask({id:s,type:E.IMAGE,status:I.PROCESSING,params:n,createdAt:o,updatedAt:o,startedAt:o,executionPhase:Z.SUBMITTING}),(d=e.onTaskCreated)==null||d.call(e,s);const i={taskId:s,prompt:a.prompt,model:e.model,modelRef:e.modelRef||null,size:e.size,resolution:e.resolution,generationMode:e.generationMode,quality:e.quality,referenceImages:e.referenceImages,maskImage:e.maskImage,inputFidelity:e.inputFidelity,background:e.background,outputFormat:e.outputFormat,outputCompression:e.outputCompression,uploadedImages:e.uploadedImages,count:e.count,params:e.params};await(e.forceMainThread?b.getFallbackExecutor():await b.getExecutor()).generateImage(i,{signal:e.signal});const l=await j(s,{signal:e.signal,onProgress:u=>{W.syncTaskFromStorage(s,u)}});return!l.success||!l.task?{task:l.task||{id:s,type:E.IMAGE,status:I.FAILED,params:{prompt:m},createdAt:Date.now(),updatedAt:Date.now(),error:{code:"GENERATION_ERROR",message:l.error||"图片生成失败"}}}:{task:l.task,url:(g=l.task.result)==null?void 0:g.url}}async function oe(m,e={}){var l,d,g;const t={prompt:m,...e},r=B(t,E.VIDEO);if(!r.valid)throw new Error(r.errors.join(", "));const a=G(t);if(await q.waitForInitialization(),!L("video",e.modelRef||e.model))throw new Error("未配置 API Key,请在设置中配置");const s=U(),o=Date.now();await N.createTask(s,"video",{prompt:a.prompt,model:e.model||"veo3",modelRef:e.modelRef||null,duration:typeof e.duration=="string"?parseInt(e.duration,10):e.duration,size:e.size,params:e.params,promptMeta:e.promptMeta}),W.trackExternalTask({id:s,type:E.VIDEO,status:I.PROCESSING,params:{prompt:a.prompt,model:e.model||"veo3",modelRef:e.modelRef||null,size:e.size,params:e.params,promptMeta:e.promptMeta},createdAt:o,updatedAt:o,startedAt:o,executionPhase:Z.SUBMITTING,progress:0}),(l=e.onTaskCreated)==null||l.call(e,s);const n={taskId:s,prompt:a.prompt,model:e.model||"veo3",modelRef:e.modelRef||null,duration:(d=e.duration)==null?void 0:d.toString(),size:e.size||"1280x720",inputReference:e.inputReference,inputReferences:e.inputReferences,referenceImages:e.referenceImages,params:e.params};await(e.forceMainThread?b.getFallbackExecutor():await b.getExecutor()).generateVideo(n,{signal:e.signal});const c=await j(s,{signal:e.signal,onProgress:u=>{W.syncTaskFromStorage(s,u)}});return!c.success||!c.task?{task:c.task||{id:s,type:E.VIDEO,status:I.FAILED,params:{prompt:m},createdAt:Date.now(),updatedAt:Date.now(),error:{code:"GENERATION_ERROR",message:c.error||"视频生成失败"}}}:{task:c.task,url:(g=c.task.result)==null?void 0:g.url}}class V{constructor(e={}){this.workflows=new Map,this.abortControllers=new Map,this.events$=new H,this.options={stepTimeout:e.stepTimeout??600*1e3,continueOnError:e.continueOnError??!1,onEvent:e.onEvent??(()=>{}),executeMainThreadTool:e.executeMainThreadTool,forceFallbackExecutor:e.forceFallbackExecutor??!1},this.events$.subscribe(t=>{this.options.onEvent(t)})}async submitWorkflow(e){this.workflows.set(e.id,e);try{await f.saveWorkflow(e)}catch(r){console.warn("[WorkflowEngine] submitWorkflow: IDB 保存失败,继续执行:",r)}const t=new AbortController;this.abortControllers.set(e.id,t),this.executeWorkflow(e.id).catch(r=>{console.error(`[WorkflowEngine] Workflow ${e.id} execution error:`,r)})}async cancelWorkflow(e){const t=this.workflows.get(e);if(!t)return;const r=this.abortControllers.get(e);r==null||r.abort(),t.status="cancelled",t.updatedAt=Date.now(),await f.saveWorkflow(t),this.emitEvent({type:"status",workflowId:e,status:"cancelled"})}getWorkflow(e){return this.workflows.get(e)}async resumeWorkflow(e){if(this.workflows.has(e))return;const t=await f.getWorkflow(e);if(!t)return;const r=t.steps.some(n=>n.status==="pending"),a=t.steps.some(n=>n.status==="running"),s=t.steps.some(n=>n.status==="pending_main_thread");if(!r&&!a&&!s)return;t.steps.forEach(n=>{n.status==="running"&&(n.status="pending")}),this.workflows.set(e,t);const o=new AbortController;this.abortControllers.set(e,o),this.executeWorkflow(e).catch(n=>{console.error("[WorkflowEngine] Resume workflow failed:",e,n)})}async executeWorkflow(e){const t=this.workflows.get(e);if(!t){console.warn("[WorkflowEngine] executeWorkflow: 工作流不存在:",e);return}const r=this.abortControllers.get(e);try{t.status="running",t.updatedAt=Date.now();try{await f.saveWorkflow(t)}catch(o){console.warn("[WorkflowEngine] executeWorkflow: IDB 保存失败,继续:",o)}this.emitEvent({type:"status",workflowId:e,status:"running"}),await this.executeSteps(t,r==null?void 0:r.signal);const a=t.steps.every(o=>o.status==="completed"||o.status==="skipped");t.steps.some(o=>o.status==="failed")&&!this.options.continueOnError?(t.status="failed",t.error=te(t)):a&&(t.status="completed",t.completedAt=Date.now()),t.updatedAt=Date.now(),await f.saveWorkflow(t),t.status==="completed"?this.emitEvent({type:"completed",workflowId:e,workflow:t}):t.status==="failed"&&this.emitEvent({type:"failed",workflowId:e,error:t.error||"Unknown error"})}catch(a){t.status="failed",t.error=a.message||"Workflow execution failed",t.updatedAt=Date.now(),await f.saveWorkflow(t),this.emitEvent({type:"failed",workflowId:e,error:t.error||"Workflow execution failed"})}finally{this.abortControllers.delete(e)}}async executeSteps(e,t){for(;;){if(t!=null&&t.aborted)throw new Error("Workflow cancelled");const r=re(e);if(r.length===0)break;await Promise.all(r.map(a=>this.executeStep(e,a,t)))}}async executeStep(e,t,r){const a=Date.now();t.status="running",e.updatedAt=Date.now(),await f.saveWorkflow(e),this.emitEvent({type:"step",workflowId:e.id,stepId:t.id,status:"running"});try{await this.executeToolStep(e,t,r),t.status="completed",t.duration=Date.now()-a,e.updatedAt=Date.now(),await f.saveWorkflow(e),this.emitEvent({type:"step",workflowId:e.id,stepId:t.id,status:"completed",result:t.result,duration:t.duration})}catch(s){if(t.status="failed",t.error=s.message||"Step execution failed",t.duration=Date.now()-a,e.updatedAt=Date.now(),await f.saveWorkflow(e),this.emitEvent({type:"step",workflowId:e.id,stepId:t.id,status:"failed",error:t.error,duration:t.duration}),!this.options.continueOnError)throw s}}async executeToolStep(e,t,r){var a,s,o;switch(t.mcp){case"generate_image":{const n=await ne(t.args.prompt,{model:t.args.model,modelRef:t.args.modelRef||null,size:t.args.size,referenceImages:t.args.referenceImages,generationMode:t.args.generationMode,maskImage:t.args.maskImage,inputFidelity:t.args.inputFidelity,background:t.args.background,outputFormat:t.args.outputFormat,outputCompression:t.args.outputCompression,count:t.args.count,promptMeta:t.args.promptMeta,params:t.args.params,forceMainThread:this.options.forceFallbackExecutor,signal:r,onTaskCreated:i=>{t.result={taskId:i},f.saveWorkflow(e)}});if(n.task.status===I.FAILED)throw new Error(((a=n.task.error)==null?void 0:a.message)||"Image generation failed");t.result={...n.task.result,taskId:n.task.id};break}case"generate_video":{const n=await oe(t.args.prompt,{model:t.args.model,modelRef:t.args.modelRef||null,duration:t.args.seconds??t.args.duration,size:t.args.size,referenceImages:t.args.referenceImages,promptMeta:t.args.promptMeta,params:t.args.params,forceMainThread:this.options.forceFallbackExecutor,signal:r,onTaskCreated:i=>{t.result={taskId:i},f.saveWorkflow(e)}});if(n.task.status===I.FAILED)throw new Error(((s=n.task.error)==null?void 0:s.message)||"Video generation failed");t.result={...n.task.result,taskId:n.task.id};break}case"generate_text":{const c=(await b.getFallbackExecutor().generateText({prompt:t.args.prompt,model:t.args.model,modelRef:t.args.modelRef||null,referenceImages:t.args.referenceImages,params:t.args.params},{signal:r})).content;t.result={content:c};const l=`${t.id}-insert-text`;if(!e.steps.find(d=>d.id===l)){const d={id:l,mcp:"insert_to_canvas",args:{items:[{type:"text",content:c}]},description:"将生成文本插入画布",status:"pending"};e.steps.push(d),await f.saveWorkflow(e),this.emitEvent({type:"steps_added",workflowId:e.id,steps:[d]})}break}case"ai_analyze":{const n=b.getFallbackExecutor(),i=t.id,c=await n.aiAnalyze({taskId:i,messages:t.args.messages,prompt:t.args.prompt,referenceImages:t.args.referenceImages,images:t.args.images,textModel:t.args.textModel,model:t.args.model,modelRef:t.args.modelRef||null},{signal:r});if(t.result={content:c.content},c.addSteps&&c.addSteps.length>0){for(const l of c.addSteps)e.steps.find(d=>d.id===l.id)||e.steps.push({id:l.id,mcp:l.mcp,args:l.args,description:l.description,status:l.status});await f.saveWorkflow(e),this.emitEvent({type:"steps_added",workflowId:e.id,steps:e.steps.filter(l=>l.status==="pending")})}else if(c.content&&c.content.trim()){const l=`${t.id}-insert-text`;if(!e.steps.find(d=>d.id===l)){const d=((o=e.metadata)==null?void 0:o.rawInput)||"",g=d.trim()?`# ${d.trim()}
|
|
3
|
+
|
|
4
|
+
`:"",u={id:l,mcp:"insert_to_canvas",args:{items:[{type:"text",content:g+c.content}]},description:"将 AI 回复插入画布",status:"pending"};e.steps.push(u),await f.saveWorkflow(e),this.emitEvent({type:"steps_added",workflowId:e.id,steps:[u]})}}break}case"generate_grid_image":case"generate_inspiration_board":case"generate_ppt":case"split_image":case"generate_long_video":case"insert_mermaid":case"insert_mindmap":case"insert_svg":case"canvas_insert":case"insert_to_canvas":{if(!this.options.executeMainThreadTool)throw new Error(`No main thread tool executor configured for: ${t.mcp}`);const n=await this.options.executeMainThreadTool(t.mcp,t.args);if(!n.success)throw new Error(n.error||`${t.mcp} failed`);t.result=n.result;break}default:throw new Error(`Unknown tool: ${t.mcp}`)}}emitEvent(e){this.events$.next(e)}destroy(){for(const[e,t]of this.abortControllers)t.abort();this.abortControllers.clear(),this.workflows.clear(),this.events$.complete()}}class ie{constructor(){this.events$=new H,this.workflows=new Map,this.initialized=!1,this.fallbackEngine=null,this.pendingCanvasHandler=null}init(){this.initialized||(this.initialized=!0)}destroy(){this.events$.complete(),this.initialized=!1}async recoverWorkflows(){try{let e=[];if(await p.isAvailable()&&(e=await p.getAllWorkflows()),e.length===0)return[];for(const t of e){const r=this.workflows.get(t.id);(!r||t.updatedAt>(r.updatedAt||0))&&(this.workflows.set(t.id,t),t.status==="failed"&&(r==null?void 0:r.status)!=="failed"&&this.events$&&this.events$.next({type:"failed",workflowId:t.id,error:t.error||"Unknown error"}))}return e.filter(t=>t.status==="running"||t.status==="pending")}catch(e){return console.warn("[WorkflowSubmissionService] Failed to recover workflows:",e),[]}}getRunningWorkflows(){return Array.from(this.workflows.values()).filter(e=>e.status==="running"||e.status==="pending")}notifyStepUpdate(e,t,r,a,s,o){const n=this.workflows.get(e);if(n){const i=n.steps.find(c=>c.id===t);i&&(i.status=r,i.result=a,i.error=s,i.duration=o)}this.events$.next({type:"step",workflowId:e,stepId:t,status:r,result:a,error:s,duration:o})}notifyWorkflowCompleted(e,t){this.workflows.set(e,t),this.events$.next({type:"completed",workflowId:e,workflow:t})}notifyWorkflowFailed(e,t){const r=this.workflows.get(e);r&&(r.status="failed",r.error=t),this.events$.next({type:"failed",workflowId:e,error:t})}isWorkflowManagedByFallback(e){return this.fallbackEngine?this.fallbackEngine.getWorkflow(e)!==void 0:!1}getWorkflowFromFallback(e){if(!this.fallbackEngine)return;const t=this.fallbackEngine.getWorkflow(e);if(t)return{id:t.id,name:t.name,steps:t.steps.map(r=>({id:r.id,mcp:r.mcp,args:r.args,description:r.description,status:r.status,result:r.result,error:r.error,duration:r.duration,options:r.options})),status:t.status,createdAt:t.createdAt,updatedAt:t.updatedAt,completedAt:t.completedAt,error:t.error,context:t.context}}async resumeWorkflowWithFallback(e){return this.fallbackEngine||(this.fallbackEngine=new V({onEvent:t=>this.handleFallbackEngineEvent(t),executeMainThreadTool:async(t,r)=>{try{const a=await O.execute({operation:t,args:r});return{success:a.success,error:a.error}}catch(a){return{success:!1,error:a.message||"Main thread tool execution failed"}}}})),await this.fallbackEngine.resumeWorkflow(e),this.fallbackEngine.getWorkflow(e)!==void 0}createWorkflow(e,t=[]){const r=`wf_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,a=Date.now(),s=e.generationType==="video"?"generate_video":"generate_image",o={prompt:e.prompt,model:e.modelId,modelRef:e.modelRef||null};e.size&&(o.size=e.size),e.count&&e.count>1&&(o.count=e.count),e.duration&&(o.seconds=e.duration),t.length>0&&(o.referenceImages=t),e.extraParams&&(o.params=e.extraParams);const n=[],i=e.count||1;for(let l=0;l<i;l++)n.push({id:`step_${l}_${Math.random().toString(36).substr(2,9)}`,mcp:s,args:{...o,count:1},description:e.generationType==="video"?`生成视频 ${l+1}/${i}`:`生成图片 ${l+1}/${i}`,status:"pending"});return{id:r,name:e.generationType==="video"?"视频生成":"图片生成",steps:n,status:"pending",createdAt:a,updatedAt:a,context:{userInput:e.userInstruction,model:e.modelId,modelRef:e.modelRef||null,params:{count:e.count,size:e.size,duration:e.duration},referenceImages:t}}}async submit(e){if(this.workflows.set(e.id,e),p.invalidateCache(),!await this.tryFallbackEngine(e))throw this.workflows.delete(e.id),new Error("Submit workflow failed")}async tryFallbackEngine(e){try{if(!b.getFallbackExecutor())return console.warn("[WorkflowSubmissionService] tryFallbackEngine: fallback executor 不可用"),!1;this.fallbackEngine||(this.fallbackEngine=new V({onEvent:a=>this.handleFallbackEngineEvent(a),forceFallbackExecutor:!0,executeMainThreadTool:async(a,s)=>{try{const o=await O.execute({operation:a,args:s});return{success:o.success,result:o.data,error:o.error}}catch(o){return{success:!1,error:o.message||"Main thread tool execution failed"}}}}));const r={id:e.id,name:e.name,steps:e.steps.map(a=>({id:a.id,mcp:a.mcp,args:a.args,description:a.description,status:a.status,result:a.result,error:a.error,duration:a.duration,options:a.options})),status:e.status,createdAt:e.createdAt,updatedAt:e.updatedAt,completedAt:e.completedAt,error:e.error,context:e.context};return await this.fallbackEngine.submitWorkflow(r),!0}catch(t){return console.error("[WorkflowSubmissionService] Fallback engine error:",t),!1}}handleFallbackEngineEvent(e){switch(e.type){case"status":this.events$.next({type:"status",workflowId:e.workflowId,status:e.status});break;case"step":this.events$.next({type:"step",workflowId:e.workflowId,stepId:e.stepId,status:e.status,result:e.result,error:e.error,duration:e.duration});const t=this.workflows.get(e.workflowId);if(t){const a=t.steps.find(s=>s.id===e.stepId);a&&(a.status=e.status,a.result=e.result,a.error=e.error,a.duration=e.duration),t.updatedAt=Date.now()}break;case"completed":this.events$.next({type:"completed",workflowId:e.workflowId,workflow:e.workflow}),this.workflows.set(e.workflowId,e.workflow);break;case"failed":this.events$.next({type:"failed",workflowId:e.workflowId,error:e.error});const r=this.workflows.get(e.workflowId);r&&(r.status="failed",r.error=e.error,r.updatedAt=Date.now());break;case"steps_added":this.events$.next({type:"steps_added",workflowId:e.workflowId,steps:e.steps.map(a=>({id:a.id,mcp:a.mcp,args:a.args,description:a.description,status:a.status}))});break}}async cancel(e){p.invalidateCache(),this.fallbackEngine&&await this.fallbackEngine.cancelWorkflow(e)}getWorkflow(e){return this.workflows.get(e)}async queryWorkflowStatus(e){try{if(await p.isAvailable()){const t=await p.getWorkflow(e);if(t)return this.workflows.set(e,t),t}}catch(t){console.warn("[WorkflowSubmissionService] Failed to query workflow status:",t)}return this.workflows.get(e)||null}async queryAllWorkflows(){try{if(await p.isAvailable()){const e=await p.getAllWorkflows();for(const t of e)this.workflows.set(t.id,t);return e}}catch(e){console.warn("[WorkflowSubmissionService] Failed to query all workflows:",e)}return Array.from(this.workflows.values())}get events(){return this.events$.asObservable()}subscribeToWorkflow(e,t){return this.events$.pipe(z(r=>r.type==="canvas_insert"?!1:r.workflowId===e)).subscribe(t)}registerCanvasHandler(e){this.pendingCanvasHandler=e}subscribeToToolRequests(e){return this.events$.pipe(z(t=>t.type==="main_thread_tool_request")).subscribe(e)}subscribeToAllEvents(e){return this.events$.subscribe(e)}}const ce=new ie,ue=Object.freeze(Object.defineProperty({__proto__:null,workflowSubmissionService:ce},Symbol.toStringTag,{value:"Module"}));export{ue as a,de as s,ce as w};
|