aitu-app 1.0.1 → 1.0.2

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.
Files changed (100) hide show
  1. package/README.md +3 -3
  2. package/assets/{CanvasAudioPlayer-DgcRAPAw.js → CanvasAudioPlayer-HtUs8HDj.js} +1 -1
  3. package/assets/{ComicCreator-BycaWmuc.js → ComicCreator-DhxXCyJR.js} +2 -2
  4. package/assets/{DeferredAIInputBar-CwJirFC0.js → DeferredAIInputBar-B2R2-2RU.js} +2 -2
  5. package/assets/{DrawnixDeferredFeatures-iBvUtWse.js → DrawnixDeferredFeatures-DHTr0c-V.js} +1 -1
  6. package/assets/{KnowledgeBaseContent-BHBg5nrj.js → KnowledgeBaseContent-CAq5kXdt.js} +3 -3
  7. package/assets/{MVCreator-j2vSDPdb.js → MVCreator-B9uaRsGE.js} +1 -1
  8. package/assets/{ModelBenchmarkWorkbench-Dq5hRRXu.js → ModelBenchmarkWorkbench-CK33zizl.js} +1 -1
  9. package/assets/{MusicAnalyzer-BLhUXQSA.js → MusicAnalyzer-D2NTonEA.js} +1 -1
  10. package/assets/{PromptHistoryTool-DJngTSmU.js → PromptHistoryTool-q6vOxFr6.js} +1 -1
  11. package/assets/{ResizableDivider-AjiNRzA1.js → ResizableDivider-BvT-DCEo.js} +1 -1
  12. package/assets/{TaskQueuePanel-YDHmXxWX.js → TaskQueuePanel-PayswYlG.js} +1 -1
  13. package/assets/{VideoAnalyzer-Qb6tEi0u.js → VideoAnalyzer-DnowtohS.js} +1 -1
  14. package/assets/{VideoAnalyzer-BjWgocHv.js → VideoAnalyzer-DoaGlK92.js} +1 -1
  15. package/assets/{ai-chat-D2kHVW04.js → ai-chat-BnWVpTEI.js} +9 -9
  16. package/assets/{batch-image-generation-A6_tinN3.js → batch-image-generation-CkmX4dem.js} +1 -1
  17. package/assets/{bootstrap-Cz9TDvTq.js → bootstrap-CQRLkOtk.js} +6 -6
  18. package/assets/{clean-confirm-DD8itIZV.js → clean-confirm-CIViVQ8s.js} +1 -1
  19. package/assets/{diagram-engines-BjFHXhwN.js → diagram-engines-DpAsX7pc.js} +2 -2
  20. package/assets/{editor-engines-FCgCX6kJ.js → editor-engines-9_72Ghfn.js} +1 -1
  21. package/assets/{external-skill-service-DuwhmKoU.js → external-skill-service-BN8ZCtPn.js} +1 -1
  22. package/assets/{frame-size-matcher-D5rWn72p.js → frame-size-matcher-9rxQ-bAY.js} +1 -1
  23. package/assets/{index-DkwucWUB.js → index-291TeU7i.js} +1 -1
  24. package/assets/{index-CHHy4efO.js → index-BJ-vS89P.js} +1 -1
  25. package/assets/{index-D0v91lhB.js → index-BSZAS0wO.js} +1 -1
  26. package/assets/{index-BECWJUV2.js → index-C7DAD_xK.js} +1 -1
  27. package/assets/{index-7TrMzH1l.js → index-CIgiIDgZ.js} +1 -1
  28. package/assets/{index-CBf-BvIi.js → index-CpHWUe__.js} +1 -1
  29. package/assets/{index-DeHXjhMn.js → index-D1LQ9eQM.js} +1 -1
  30. package/assets/{index-DsGlObqC.js → index-DRGxmFyd.js} +1 -1
  31. package/assets/{index-DUugpXxH.js → index-DmtcRYr8.js} +1 -1
  32. package/assets/{index.es-Dgi90kXH.js → index.es-Ch45-H39.js} +1 -1
  33. package/assets/{jspdf.es.min-Bm9veIPK.js → jspdf.es.min-bNprb1JY.js} +2 -2
  34. package/assets/{link-popup-Dw0GTx0j.js → link-popup-B6ReK6iq.js} +1 -1
  35. package/assets/{markdown-to-drawnix-CDain2y9.js → markdown-to-drawnix-BqT-3zQO.js} +2 -2
  36. package/assets/{mermaid-to-drawnix-Ddpp0aQq.js → mermaid-to-drawnix-CSctnpU0.js} +2 -2
  37. package/assets/{model-benchmark-launcher-DLwj4o8h.js → model-benchmark-launcher-DNMp2MLQ.js} +1 -1
  38. package/assets/{photo-wall-splitter-D2Ji--gy.js → photo-wall-splitter-DhBTEpdG.js} +1 -1
  39. package/assets/{popup-toolbar-mBe3Bjaq.js → popup-toolbar-BChsudwW.js} +3 -3
  40. package/assets/{prompt-utils-CatisMlq.js → prompt-utils-BX0pRV-Z.js} +1 -1
  41. package/assets/{quick-creation-toolbar-jRI3BBKS.js → quick-creation-toolbar-3-AYFpEF.js} +1 -1
  42. package/assets/{settings-dialog-BOrvJdPV.js → settings-dialog-Ccemaout.js} +1 -1
  43. package/assets/{size-picker-Blua_9Dv.js → size-picker-DTrdjyLh.js} +1 -1
  44. package/assets/{skill-dsl-parser-1E3u-6mw.js → skill-dsl-parser-ZR--uu5h.js} +1 -1
  45. package/assets/{startup-app-BXcHjIQM.js → startup-app-CH3QzBb4.js} +1 -1
  46. package/assets/{task-sync-CPtlvCdr.js → task-sync-C5XXOQ5m.js} +1 -1
  47. package/assets/{tool-windows-CSaRGLIT.js → tool-windows-Bf_pMml-.js} +5 -5
  48. package/assets/{ttd-dialog-RLopc37W.js → ttd-dialog-CohjwODB.js} +2 -2
  49. package/assets/{ttd-dialog-submit-shortcut-C9_wsIZ5.js → ttd-dialog-submit-shortcut-BVB8O_wE.js} +1 -1
  50. package/assets/{useCharacters-BCCGOiPW.js → useCharacters-CFlPvydq.js} +1 -1
  51. package/assets/{useWorkflowSubmission-Bo-icE0J.js → useWorkflowSubmission-CKkOEcAT.js} +2 -2
  52. package/assets/{video-merge-webcodecs-BWAut6ma.js → video-merge-webcodecs-BInWo9HA.js} +1 -1
  53. package/assets/{video-recovery-service-L4OR1un7.js → video-recovery-service-DITdD0pC.js} +1 -1
  54. package/assets/{workflow-generation-utils-CUmdJnGW.js → workflow-generation-utils-e0nRpAgJ.js} +2 -2
  55. package/assets/{workflow-submission-service-kAjrrvI-.js → workflow-submission-service-BqiL_5Cj.js} +1 -1
  56. package/changelog.json +87 -6
  57. package/idle-prefetch-manifest.json +128 -276
  58. package/manifest.json +3 -3
  59. package/package.json +1 -1
  60. package/precache-manifest.json +6 -6
  61. package/sw.js +1 -1
  62. package/version.json +58 -3
  63. package/.DS_Store +0 -0
  64. package/user-manual/gifs//346/200/235/347/273/264/345/257/274/345/233/276/345/210/233/345/273/272/346/274/224/347/244/272.gif +0 -0
  65. package/user-manual/screenshots/ai-step-0.png +0 -0
  66. package/user-manual/screenshots/ai-step-1.png +0 -0
  67. package/user-manual/screenshots/ai-step-2.png +0 -0
  68. package/user-manual/screenshots/ai-step-3.png +0 -0
  69. package/user-manual/screenshots/app-menu.png +0 -0
  70. package/user-manual/screenshots/backup-restore.png +0 -0
  71. package/user-manual/screenshots/canvas-tools.png +0 -0
  72. package/user-manual/screenshots/debug-panel.png +0 -0
  73. package/user-manual/screenshots/drawing-step-0.png +0 -0
  74. package/user-manual/screenshots/drawing-step-1.png +0 -0
  75. package/user-manual/screenshots/drawing-step-2.png +0 -0
  76. package/user-manual/screenshots/edit-selected.png +0 -0
  77. package/user-manual/screenshots/element-selected.png +0 -0
  78. package/user-manual/screenshots/flowchart-step-1.png +0 -0
  79. package/user-manual/screenshots/flowchart-step-2.png +0 -0
  80. package/user-manual/screenshots/flowchart-step-3.png +0 -0
  81. package/user-manual/screenshots/image-preview-empty.png +0 -0
  82. package/user-manual/screenshots/insert-from-library.png +0 -0
  83. package/user-manual/screenshots/insert-tools.png +0 -0
  84. package/user-manual/screenshots/inspiration-step-1.png +0 -0
  85. package/user-manual/screenshots/inspiration-step-2.png +0 -0
  86. package/user-manual/screenshots/media-library.png +0 -0
  87. package/user-manual/screenshots/mindmap-step-1.png +0 -0
  88. package/user-manual/screenshots/mindmap-step-2.png +0 -0
  89. package/user-manual/screenshots/mindmap-toolbar-menu.png +0 -0
  90. package/user-manual/screenshots/project-drawer.png +0 -0
  91. package/user-manual/screenshots/settings-dialog.png +0 -0
  92. package/user-manual/screenshots/shape-step-1.png +0 -0
  93. package/user-manual/screenshots/shape-step-2.png +0 -0
  94. package/user-manual/screenshots/text-step-1.png +0 -0
  95. package/user-manual/screenshots/text-step-2.png +0 -0
  96. package/user-manual/screenshots/toolbox-drawer.png +0 -0
  97. package/user-manual/screenshots/toolbox-entry.png +0 -0
  98. package/user-manual/screenshots/video-entry.png +0 -0
  99. package/user-manual/screenshots/view-navigation.png +0 -0
  100. package/user-manual/screenshots/zoom-menu.png +0 -0
@@ -1,5 +1,5 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ai-chat-BlxYfB4O.css","./tool-windows-DW-CDfPc.css"])))=>i.map(i=>d[i]);
2
- import{_ as Z}from"./startup-runtime-BrfuwjQS.js";import{nF as H,pC as X,pD as le,pE as oe,pF as ke,ny as Se,aL as ye,pG as he,P as y,a8 as We,Q as ne,T as K,nt as ce,aD as ue,ju as xe,aE as se}from"./ai-chat-D2kHVW04.js";import{w as N}from"./workflow-submission-service-kAjrrvI-.js";import{S as re}from"./skill-dsl-parser-1E3u-6mw.js";import{c as ve}from"./external-skill-parser-y-iaYa67.js";import{ak as $,aa as Re}from"./tool-windows-CSaRGLIT.js";function Ie(t){if(!/\[(?:Intro|Verse|Chorus|Pre-Chorus|Bridge|Outro|Hook|Fade|Instrumental|Interlude)/i.test(t))return{lyrics:t};const e=t.split(`
2
+ import{_ as Z}from"./startup-runtime-BrfuwjQS.js";import{nF as H,pC as X,pD as le,pE as oe,pF as ke,ny as Se,aL as ye,pG as he,P as y,a8 as We,Q as ne,T as K,nt as ce,aD as ue,ju as xe,aE as se}from"./ai-chat-BnWVpTEI.js";import{w as N}from"./workflow-submission-service-BqiL_5Cj.js";import{S as re}from"./skill-dsl-parser-ZR--uu5h.js";import{c as ve}from"./external-skill-parser-y-iaYa67.js";import{ak as $,aa as Re}from"./tool-windows-Bf_pMml-.js";function Ie(t){if(!/\[(?:Intro|Verse|Chorus|Pre-Chorus|Bridge|Outro|Hook|Fade|Instrumental|Interlude)/i.test(t))return{lyrics:t};const e=t.split(`
3
3
  `);let o,n;const a=[];for(const l of e){const s=l.trim();if(!o&&/^#\s+(.+)/.test(s)){o=s.replace(/^#\s+/,"").trim();continue}if(!n&&/^(?:标签|tags)\s*[::]\s*(.+)/i.test(s)){n=s.replace(/^(?:标签|tags)\s*[::]\s*/i,"").trim();continue}a.push(l)}for(;a.length>0&&a[0].trim()==="";)a.shift();for(;a.length>0&&a[a.length-1].trim()==="";)a.pop();return{title:o,tags:n,lyrics:a.join(`
4
4
  `)}}function Y(){return`wf-${Date.now()}-${Math.random().toString(36).substring(2,8)}`}const _e=new Set(["generate_image","generate_video","generate_long_video","generate_audio","generate_text"]);function ee(t){return Se(t)}function V(t,e){return e.length===0?t:{...t,knowledgeContextRefs:e}}function be(t,e){return e.length===0?t:t.map(o=>!_e.has(o.mcp)||o.args.knowledgeContextRefs?o:{...o,args:V(o.args,e)})}function Te(t,e,o=!1){return t.map(n=>({...n,args:ye(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:o})}))}function Ce(t,e){return e.length===0?t:t.map(o=>{var l;if(o.args.referenceImages)return o;const n=H.getTool(o.mcp);return o.mcp==="generate_ppt"||!!((l=n==null?void 0:n.inputSchema.properties)!=null&&l.referenceImages)?{...o,args:{...o.args,referenceImages:e}}:o})}function Me(t,e=[]){var I;const{generationType:o,modelId:n,modelRef:a,isModelExplicit:l,prompt:s,userInstruction:g,rawInput:m,count:c,size:p,duration:x,extraParams:u,selection:r,defaultModels:d,defaultModelRefs:h,knowledgeContextRefs:M}=t,_=ee(M),i=[],v=Y(),w=`wf_batch_${v}`;for(let W=0;W<c;W++){const b=`${v}-step-${W+1}`,T={mode:"queue",batchId:w,batchIndex:W+1,batchTotal:c,globalIndex:W+1};if(o==="image"){const f=V({prompt:s,model:n,modelRef:a,workflowId:v,batchId:w,batchIndex:W+1,batchTotal:c,globalIndex:W+1},_);if(p&&(f.size=p),e.length>0){const R=typeof(r==null?void 0:r.maskImage)=="string"&&r.maskImage.trim().length>0&&e.length===1;f.referenceImages=R?[e[0]]:e,R&&(f.generationMode="image_edit",f.maskImage=r.maskImage)}u&&(f.params=u),i.push({id:b,mcp:"generate_image",args:f,options:T,description:c>1?`生成图片 (${W+1}/${c})`:"生成图片",status:"pending"})}else if(o==="video"){const f=V({prompt:s,model:n,modelRef:a,seconds:x||"5",workflowId:v,batchId:w,batchIndex:W+1,batchTotal:c,globalIndex:W+1},_);p&&(f.size=p),e.length>0&&(f.referenceImages=e);const R={...u||{}};n==="happyhorse-1.0-video-edit"&&((I=r==null?void 0:r.videos)!=null&&I[0])&&!R.input_video&&(R.input_video=r.videos[0]),Object.keys(R).length>0&&(f.params=R),i.push({id:b,mcp:"generate_video",args:f,options:T,description:c>1?`生成视频 (${W+1}/${c})`:"生成视频",status:"pending"})}else if(o==="audio"){const f=typeof(u==null?void 0:u.sunoAction)=="string"?u.sunoAction:"music",R=f==="lyrics",C=V({prompt:s,model:n,modelRef:a,sunoAction:f,workflowId:v,batchId:w,batchIndex:W+1,batchTotal:c,globalIndex:W+1},_);if(!R&&s){const S=Ie(s);(S.title||S.tags)&&(C.prompt=S.lyrics,S.title&&!(u!=null&&u.title)&&(C.title=S.title),S.tags&&!(u!=null&&u.tags)&&(C.tags=S.tags))}u&&(C.params=u,u.notifyHook&&(C.notifyHook=u.notifyHook),!R&&u.mv&&(C.mv=u.mv),!R&&u.title&&(C.title=u.title),!R&&u.tags&&(C.tags=u.tags),!R&&u.continueClipId&&(C.continueClipId=u.continueClipId),!R&&u.continueAt!==void 0&&u.continueAt!==null&&u.continueAt!==""&&(C.continueAt=Number(u.continueAt))),i.push({id:b,mcp:"generate_audio",args:C,options:T,description:c>1?`${R?"生成歌词":"生成音频"} (${W+1}/${c})`:R?"生成歌词":"生成音频",status:"pending"})}else{const f=V({prompt:s,model:n,modelRef:a,rawInput:m,workflowId:v,batchId:w,batchIndex:W+1,batchTotal:c,globalIndex:W+1},_);e.length>0&&(f.referenceImages=e),u&&(f.params=u),i.push({id:b,mcp:"generate_text",args:f,options:T,description:"生成文本",status:"pending"})}}const k=o==="audio"&&i.every(W=>W.args.sunoAction==="lyrics");return{id:v,name:o==="image"?"图片生成":o==="video"?"视频生成":o==="text"?"文本生成":k?"歌词生成":"音频生成",description:`使用 ${n} 模型${c>1?`生成 ${c} 个`:"生成"}${o==="image"?"图片":o==="video"?"视频":o==="text"?"文本":k?"歌词":"音频"}`,scenarioType:"direct_generation",generationType:o,steps:i,metadata:{prompt:s,userInstruction:g,rawInput:m,modelId:n,modelRef:a,defaultModels:d,defaultModelRefs:h,isModelExplicit:l,count:c,size:p,duration:x,referenceImages:e.length>0?e:void 0,selection:r,knowledgeContextRefs:_.length>0?_:void 0},createdAt:Date.now()}}function Ae(t,e=[]){const{generationType:o,modelId:n,modelRef:a,isModelExplicit:l,prompt:s,userInstruction:g,rawInput:m,count:c,size:p,duration:x,extraParams:u,selection:r,defaultModels:d,defaultModelRefs:h,knowledgeContextRefs:M}=t,_=ee(M),i=Y(),v={userInstruction:g,rawInput:m,model:{id:n,type:o==="agent"?"text":o,isExplicit:l},params:{count:c,size:p,duration:x,...u},defaultModels:d,defaultModelRefs:h,selection:r,finalPrompt:s,knowledgeContextRefs:_.length>0?_:void 0},w=[...r.images||[],...r.graphics||[]];let k=he();w.length>0&&(k+=X(w.length,r.imageDimensions));const I=le(v),W=[{role:"system",content:k},{role:"user",content:I}],b=[{id:`${i}-step-analyze`,mcp:"ai_analyze",args:{context:v,messages:W,referenceImages:w.length>0?w:void 0,textModel:n,modelRef:a,knowledgeContextRefs:_.length>0?_:void 0},options:{mode:"async"},description:"AI 分析用户意图",status:"pending"}];return{id:i,name:"AI 智能生成",description:"AI 分析用户请求并执行相应操作",scenarioType:"agent_flow",generationType:o,steps:b,metadata:{prompt:s,userInstruction:g,rawInput:m,modelId:n,modelRef:a,isModelExplicit:l,count:c,size:p,duration:x,defaultModels:d,defaultModelRefs:h,referenceImages:e.length>0?e:void 0,selection:r,knowledgeContextRefs:_.length>0?_:void 0},createdAt:Date.now()}}function Ee(t){const e=[];for(const o of t){const n=H.getTool(o);if(!n)continue;const a=n.inputSchema.properties||{},l=n.inputSchema.required||[],s=n.promptGuidance,g=Object.entries(a).map(([c,p])=>{var _;const u=l.includes(c)?"(必填)":"(可选)",r=[];p.type&&r.push(`类型: ${p.type}`),p.enum&&Array.isArray(p.enum)&&r.push(`可选值: ${p.enum.map(i=>`"${i}"`).join(" | ")}`),p.default!==void 0&&r.push(`默认: "${p.default}"`);const d=r.length>0?` [${r.join(", ")}]`:"",h=(_=s==null?void 0:s.parameterGuidance)==null?void 0:_[c],M=h?`
5
5
  💡 ${h}`:"";return` - **${c}**${u}: ${p.description||"无描述"}${d}${M}`}).join(`
@@ -41,4 +41,4 @@ ${O}`),f.length>0&&(j+=X(f.length,d.imageDimensions)),j+=`
41
41
  请基于以上 Skill 指令构建详细的图片描述 prompt,并使用以下 JSON 格式回复以调用图片生成工具:
42
42
  {"content": "你的分析", "next": [{"mcp": "generate_image", "args": {"prompt": "你构建的完整 prompt"}}]}
43
43
 
44
- 你必须实际调用 generate_image 工具生成图片,不要仅输出文字描述。`);const G=[{role:"system",content:U},{role:"user",content:W}],pe=[{id:`${v}-step-analyze`,mcp:"ai_analyze",args:{context:R,messages:G,referenceImages:f.length>0?f:void 0,textModel:s,modelRef:l,knowledgeContextRefs:i.length>0?i:void 0},options:{mode:"async"},description:`AI 以「${k}」角色回复`,status:"pending"}];return{id:v,name:k,description:`使用「${k}」Skill 生成内容`,scenarioType:"skill_flow",skillId:w,generationType:a,steps:pe,metadata:{prompt:m,userInstruction:c,rawInput:p,modelId:s,modelRef:l,defaultModels:h,defaultModelRefs:M,isModelExplicit:g,count:x,size:u,duration:r,referenceImages:o.length>0?o:void 0,selection:d,knowledgeContextRefs:i.length>0?i:void 0,parseMethod:"agent_fallback"},createdAt:Date.now()}}function $e(t,e=[]){return t.scenario==="direct_generation"?Me(t,e):Ae(t,e)}function De(t,e=0){try{let o=oe(t);if(!o){const l=ke(t),s=l.indexOf("{"),g=l.lastIndexOf("}");s>=0&&g>s&&(o=oe(l.slice(s,g+1)))}if(!o)return{content:"",steps:[]};const n=typeof o.content=="string"?o.content:"";if(!Array.isArray(o.next)||o.next.length===0)return{content:n,steps:[]};const a=o.next.filter(l=>typeof l.mcp=="string"&&typeof l.args=="object").map((l,s)=>({id:`step-${e+s+1}`,mcp:l.mcp,args:l.args,description:Pe(l.mcp,l.args),status:"pending"}));return{content:n,steps:a}}catch{return{content:"",steps:[]}}}function Pe(t,e){var o,n,a,l;switch(t){case"generate_image":return`生成图片: ${((o=e.prompt)==null?void 0:o.substring(0,30))||""}...`;case"generate_video":return`生成视频: ${((n=e.prompt)==null?void 0:n.substring(0,30))||""}...`;case"generate_audio":return`生成音频: ${((a=e.prompt)==null?void 0:a.substring(0,30))||""}...`;case"generate_text":return`生成文本: ${((l=e.prompt)==null?void 0:l.substring(0,30))||""}...`;case"ai_analyze":return"AI 分析用户意图";case"format_markdown":return"格式化输出";case"show_result":return"展示结果";default:return`执行 ${t}`}}function Fe(t,e,o,n,a,l){return{...t,steps:t.steps.map(s=>s.id===e?{...s,status:o,result:n!==void 0?n:s.result,error:a,duration:l}:s)}}function ze(t,e){const o=new Set(t.steps.map(a=>a.id)),n=e.filter(a=>!o.has(a.id));return n.length===0?t:{...t,steps:[...t.steps,...n]}}function B(t){const e=t.steps.filter(s=>s.status==="completed").length,o=t.steps.filter(s=>s.status==="failed").length,n=t.steps.find(s=>s.status==="running"),a=t.steps.filter(s=>s.status==="pending").length;let l;return o>0?l="failed":n?l="running":a===0&&e>0?l="completed":l="pending",{status:l,completedSteps:e,totalSteps:t.steps.length,currentStep:n||t.steps.find(s=>s.status==="pending")}}const ae={workflow:null,status:"idle",currentStep:null,completedSteps:0,totalSteps:0,error:null};function Oe(){const[t,e]=y.useState(ae),o=y.useRef(null),n=y.useRef(!1),a=y.useCallback(r=>{o.current=r,n.current=!1;const d=B(r);e({workflow:r,status:"running",currentStep:d.currentStep||null,completedSteps:d.completedSteps,totalSteps:d.totalSteps,error:null})},[]),l=y.useCallback(r=>{o.current=r,n.current=!1;const d=B(r);let h="running";r.status==="completed"?h="completed":(r.status==="failed"||r.status==="cancelled")&&(h="failed"),e({workflow:r,status:h,currentStep:d.currentStep||null,completedSteps:d.completedSteps,totalSteps:d.totalSteps,error:r.error||null})},[]),s=y.useCallback((r,d,h,M,_)=>{if(n.current)return;const i=o.current;if(!i)return;const v=Fe(i,r,d,h,M,_);o.current=v,e(w=>{const k=B(v);let I="running";return k.status==="completed"?I="completed":k.status==="failed"&&(I="failed"),{...w,workflow:v,status:I,currentStep:k.currentStep||null,completedSteps:k.completedSteps,totalSteps:k.totalSteps,error:M||w.error}})},[]),g=y.useCallback(r=>{if(n.current||r.length===0)return;const d=o.current;if(!d)return;const h=ze(d,r);o.current=h,e(M=>{const _=B(h);return{...M,workflow:h,currentStep:_.currentStep||M.currentStep,totalSteps:_.totalSteps}})},[]),m=y.useCallback(r=>{const d=o.current;if(!d||n.current)return{content:"",steps:[]};const h=d.steps.length,{content:M,steps:_}=De(r,h);return M&&!d.aiAnalysis&&(o.current={...d,aiAnalysis:M}),_.length>0&&g(_),{content:M,steps:_}},[g]),c=y.useCallback(()=>{o.current=null,n.current=!1,e(ae)},[]),p=y.useCallback(()=>{n.current=!0,e(r=>({...r,status:"failed",error:"工作流已中止"}))},[]),x=y.useCallback(()=>{n.current=!1,e(r=>({...r,status:"running",error:null}))},[]),u=y.useCallback(()=>o.current,[]);return{state:t,startWorkflow:a,restoreWorkflow:l,updateStep:s,addSteps:g,addStepsFromAIResponse:m,resetWorkflow:c,abortWorkflow:p,resumeWorkflow:x,getWorkflow:u}}const de=y.createContext(null),st=({children:t})=>{const e=Oe(),o=y.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 We.jsx(de.Provider,{value:o,children:t})};function Ne(){const t=y.useContext(de);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function Le(){const t=Ne();return{startWorkflow:t.startWorkflow,restoreWorkflow:t.restoreWorkflow,updateStep:t.updateStep,addSteps:t.addSteps,addStepsFromAIResponse:t.addStepsFromAIResponse,resetWorkflow:t.resetWorkflow,abortWorkflow:t.abortWorkflow,resumeWorkflow:t.resumeWorkflow,getWorkflow:t.getWorkflow}}function P(t,e,o,n){var l;const a=t.metadata||{};return{id:t.id,name:t.name,generationType:t.generationType,prompt:a.prompt||((l=e==null?void 0:e.aiContext)==null?void 0:l.finalPrompt)||"",aiAnalysis:t.aiAnalysis,count:a.count,createdAt:t.createdAt,steps:t.steps.map(s=>({id:s.id,description:s.description,status:s.status,mcp:s.mcp,args:s.args,result:s.result,error:s.error,duration:s.duration,options:s.options})),retryContext:e,postProcessingStatus:o,insertedCount:n}}const Ue=20,ie=2e3,je=3e4;function Ze(t){return t.steps.length>0&&t.steps.every(e=>e.status==="completed")}function fe(t){var e;return t.status===K.PROCESSING?{status:"running",result:{taskId:t.id}}:t.status===K.COMPLETED&&t.result?{status:"completed",result:typeof t.result=="object"&&t.result!==null?{...t.result,taskId:t.id}:{result:t.result,taskId:t.id}}:t.status===K.FAILED?{status:"failed",error:typeof t.error=="string"?t.error:((e=t.error)==null?void 0:e.message)||"Task failed"}:null}function Ve(t,e,o,n,a,l){const s=o.getWorkflow(),g=ce(s,t);if(!g)return!1;const m=t.type!==ue.IMAGE&&(s==null?void 0:s.generationType)!=="image";e.status==="running"&&o.resumeWorkflow(),o.updateStep(g.id,e.status,e.result,e.error);const c=o.getWorkflow();if(c){const p=P(c,void 0,c.generationType==="image"&&Ze(c)?"completed":void 0);n.current(p);const x=a.current,u=l.current;m&&x&&u&&$.updateWorkflow(x,u,p)}return!0}function Ge(t,e,o,n,a,l){const s=a.current;if(!s||t.type===ue.IMAGE)return!1;for(const g of s.children){if(!Re(g))continue;const m=g;if(m.workflow.generationType==="image")continue;const c=ce(m.workflow,t);if(!c)continue;const p=m.workflow.steps.map(u=>u.id!==c.id?u:{...u,status:e.status,...e.result!==void 0&&{result:e.result},...e.error!==void 0&&{error:e.error}}),x={...m.workflow,steps:p};if(e.status==="running"&&delete x.error,$.updateWorkflow(s,m.id,x),l.current=m.id,n.current(x),o.restoreWorkflow){const u={id:x.id,name:x.name||"",description:"",scenarioType:"direct_generation",generationType:x.generationType,status:e.status==="running"?"running":"failed",steps:p.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})),createdAt:x.createdAt||Date.now(),metadata:{prompt:x.prompt||"",userInstruction:"",rawInput:"",modelId:"",isModelExplicit:!1,count:x.count||1,selection:{texts:[],images:[],videos:[],graphics:[]}},aiAnalysis:x.aiAnalysis};o.restoreWorkflow(u)}return!0}return!1}function Q(t,e,o,n,a,l){var m;const s=t.task,g=fe(s);return g?Ve(s,g,e,o,a,l)||Ge(s,g,e,o,a,l)?!0:((m=n.current)==null?void 0:m.call(n,s))??!1:!1}function Be(t){const{workflowControl:e,boardRef:o,workZoneIdRef:n}=t,a=y.useRef(t.updateWorkflowMessage);y.useEffect(()=>{a.current=t.updateWorkflowMessage},[t.updateWorkflowMessage]);const l=y.useRef(t.syncWorkflowTaskUpdate);y.useEffect(()=>{l.current=t.syncWorkflowTaskUpdate},[t.syncWorkflowTaskUpdate]);const s=y.useRef(new Map),g=y.useRef(null),m=y.useRef(0),c=y.useRef(!1);y.useEffect(()=>{const p=r=>{const d=s.current;if(!d.has(r.task.id)&&d.size>=Ue){const h=d.keys().next().value;h&&d.delete(h)}d.set(r.task.id,r)},x=()=>{const r=new Map;for(const[d,h]of s.current.entries())Q(h,e,a,l,o,n)||r.set(d,h);s.current=r,(r.size===0||Date.now()-m.current>je)&&(g.current&&(clearInterval(g.current),g.current=null),s.current=new Map)};if(!c.current){c.current=!0;const r=ne.getAllTasks();for(const d of r){const h=fe(d);h&&(h.status==="completed"||h.status==="failed")&&Q({task:d},e,a,l,o,n)}}const u=ne.observeTaskUpdates().subscribe(r=>{if(r.type!=="taskUpdated")return;if(r.task.status===K.PROCESSING&&s.current.has(r.task.id)){p(r),g.current||(m.current=Date.now(),g.current=setInterval(x,ie));return}Q(r,e,a,l,o,n)?s.current.delete(r.task.id):(p(r),g.current||(m.current=Date.now(),g.current=setInterval(x,ie)))});return()=>{u.unsubscribe(),g.current&&(clearInterval(g.current),g.current=null),s.current=new Map}},[e,o,n])}let q=null;const Ke=new Promise(t=>{q=t});async function qe(t,e){const{operation:o,params:n}=e;try{const{insertImageFromUrl:a}=await Z(async()=>{const{insertImageFromUrl:c}=await import("./ai-chat-D2kHVW04.js").then(p=>p.sS);return{insertImageFromUrl:c}},__vite__mapDeps([0]),import.meta.url),{insertVideoFromUrl:l}=await Z(async()=>{const{insertVideoFromUrl:c}=await import("./ai-chat-D2kHVW04.js").then(p=>p.sT);return{insertVideoFromUrl:c}},__vite__mapDeps([0]),import.meta.url),{insertAudioFromUrl:s}=await Z(async()=>{const{insertAudioFromUrl:c}=await import("./ai-chat-D2kHVW04.js").then(p=>p.sU);return{insertAudioFromUrl:c}},__vite__mapDeps([0]),import.meta.url),{getSmartInsertionPoint:g}=await Z(async()=>{const{getSmartInsertionPoint:c}=await import("./ai-chat-D2kHVW04.js").then(p=>p.sR);return{getSmartInsertionPoint:c}},__vite__mapDeps([0]),import.meta.url),m=n.position?[n.position.x,n.position.y]:g(t)||[100,100];if(o==="canvas_insert"&&n.items)for(const c of n.items)c.type==="image"&&c.url?await a(t,c.url,m,!1,void 0,void 0,void 0,void 0,!0):c.type==="video"&&c.url?await l(t,c.url,m):c.type==="audio"&&c.url&&await s(t,c.url,c,m);else o==="insert_image"&&n.url?await a(t,n.url,m,!1,void 0,void 0,void 0,void 0,!0):o==="insert_video"&&n.url?await l(t,n.url,m):o==="insert_audio"&&n.url&&await s(t,n.url,n,m)}catch(a){console.error("[useWorkflowSubmission] Failed to insert to canvas:",a)}}function He(t){const{boardRef:e,workZoneIdRef:o}=t,n=Le(),a=xe(),l=y.useRef(a.sendWorkflowMessage),s=y.useRef(a.updateWorkflowMessage);y.useEffect(()=>{l.current=a.sendWorkflowMessage,s.current=a.updateWorkflowMessage},[a.sendWorkflowMessage,a.updateWorkflowMessage]),Be({workflowControl:n,updateWorkflowMessage:a.updateWorkflowMessage,syncWorkflowTaskUpdate:a.syncWorkflowTaskUpdate,boardRef:e,workZoneIdRef:o});const g=y.useRef(null),m=y.useRef([]),c=y.useRef(!1),p=y.useRef(null),x=y.useCallback(i=>i!=="image",[]),u=y.useCallback(async()=>{if(!c.current){c.current=!0;try{await N.recoverWorkflows()}catch(i){console.warn("[useWorkflowSubmission] Failed to recover workflows:",i)}finally{q==null||q()}}},[]);y.useEffect(()=>{N.init(),N.registerCanvasHandler(async(v,w)=>({success:!0}));const i=N.subscribeToAllEvents(v=>{var w,k,I,W,b,T,f,R,C;if(v.type==="recovered"&&v.workflow){const S=v.workflow,z=S.status==="running"||S.status==="pending",E=S.status==="failed"&&S.updatedAt&&Date.now()-S.updatedAt<300*1e3;if(!z&&!E)return;(w=n.restoreWorkflow)==null||w.call(n,S);const A=se.get(),F={aiContext:{rawInput:((k=S.context)==null?void 0:k.userInput)||"",userInstruction:((I=S.context)==null?void 0:I.userInput)||"",model:{id:((W=S.context)==null?void 0:W.model)||"",type:S.generationType==="video"?"video":S.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:(b=S.metadata)==null?void 0:b.count,size:(T=S.metadata)==null?void 0:T.size,duration:(f=S.metadata)==null?void 0:f.duration},selection:{texts:[],images:[],videos:[],graphics:[]},finalPrompt:((R=S.metadata)==null?void 0:R.prompt)||""},referenceImages:((C=S.context)==null?void 0:C.referenceImages)||[],textModel:A.textModelName},J=P(S,F);s.current(J);const D=e.current,L=o.current;x(S.generationType)&&L&&D&&$.updateWorkflow(D,L,J);const U=N.subscribeToWorkflow(S.id,async te=>{var G;await((G=p.current)==null?void 0:G.call(p,te,S,F))});m.current.push(U)}});return m.current.push(i),u(),()=>{m.current.forEach(v=>v.unsubscribe()),m.current=[]}},[]);const r=y.useCallback(async(i,v,w)=>{const k=e.current,I=o.current,W=x(v.generationType);switch(i.type){case"step":{n.updateStep(i.stepId,i.status,i.result,i.error,i.duration);const b=n.getWorkflow();if(b){const T=P(b,w);s.current(T),W&&I&&k&&$.updateWorkflow(k,I,T)}break}case"completed":{const b=n.getWorkflow();let T=!1;b&&b.steps.forEach(R=>{const C=R.result,S=C==null?void 0:C.taskId;S&&(T=!0),(R.status==="running"||R.status==="pending")&&!S&&n.updateStep(R.id,"completed")});const f=n.getWorkflow();if(f){const R=P(f,w);if(s.current(R),W&&I&&k){if($.updateWorkflow(k,I,R),f.steps.some(S=>S.status==="pending"||S.status==="running"))break;if(!T)setTimeout(()=>{$.removeWorkZone(k,I)},1500);else{const{workflowCompletionService:S}=await Z(async()=>{const{workflowCompletionService:E}=await import("./tool-windows-CSaRGLIT.js").then(A=>A.b1);return{workflowCompletionService:E}},__vite__mapDeps([0,1]),import.meta.url);f.steps.every(E=>{const A=E.result;return A!=null&&A.taskId?S.isPostProcessingCompleted(A.taskId):!0})&&setTimeout(()=>{$.removeWorkZone(k,I)},1500)}}}break}case"failed":{n.abortWorkflow();const b=n.getWorkflow();if(b){const T=P(b,w);s.current(T),W&&I&&k&&$.updateWorkflow(k,I,T)}break}case"steps_added":{const b=i;n.addSteps(b.steps.map(f=>({id:f.id,mcp:f.mcp,args:f.args,description:f.description,status:f.status})));const T=n.getWorkflow();if(T){const f=P(T,w);s.current(f),W&&I&&k&&$.updateWorkflow(k,I,f)}break}case"canvas_insert":{k&&qe(k,i);break}}},[n,e,o,x]);y.useEffect(()=>{p.current=r},[r]);const d=y.useCallback(async(i,v,w,k,I)=>{var C,S,z;const W=k||$e(i,v);n.startWorkflow(W);const b=se.get(),T=b.textModelName,f=w||{aiContext:{rawInput:i.rawInput||i.userInstruction,userInstruction:i.userInstruction,model:{id:i.modelId,type:i.generationType,isExplicit:i.isModelExplicit},modelRef:i.modelRef,defaultModels:{image:((C=i.defaultModels)==null?void 0:C.image)||b.imageModelName||"gemini-3-pro-image-preview-vip",video:((S=i.defaultModels)==null?void 0:S.video)||b.videoModelName||"veo3.1",audio:((z=i.defaultModels)==null?void 0:z.audio)||b.audioModelName||"suno_music"},defaultModelRefs:i.defaultModelRefs,params:{count:i.count,size:i.size,duration:i.duration},selection:i.selection||{texts:[],images:[],videos:[],graphics:[]},finalPrompt:i.prompt,knowledgeContextRefs:i.knowledgeContextRefs},referenceImages:v,textModel:T};g.current=f;const R=P(W,f);return await l.current({context:f.aiContext,workflow:R,textModel:T,autoOpen:!1,appendToCurrentSession:I==null?void 0:I.appendToCurrentChatSession}),{workflowId:W.id,usedSW:!1}},[n]),h=y.useCallback(async i=>{await N.cancel(i),n.abortWorkflow()},[n]),M=y.useCallback(async(i,v)=>{const w=i.retryContext;if(!w){console.error("[useWorkflowSubmission] No retry context available");return}const k={prompt:i.prompt,userInstruction:w.aiContext.userInstruction,rawInput:w.aiContext.rawInput,modelId:w.aiContext.model.id,modelRef:w.aiContext.modelRef,defaultModels:w.aiContext.defaultModels,defaultModelRefs:w.aiContext.defaultModelRefs,isModelExplicit:w.aiContext.model.isExplicit,generationType:w.aiContext.model.type,count:i.count||1,size:w.aiContext.params.size,duration:w.aiContext.params.duration,scenario:w.aiContext.model.type==="agent"?"agent_flow":"direct_generation",selection:w.aiContext.selection,parseResult:{},hasExtraContent:!1};await d(k,w.referenceImages||[],w)},[d]),_=y.useCallback(()=>g.current,[]);return{submitWorkflow:d,cancelWorkflow:h,retryWorkflow:M,getRetryContext:_}}const rt=Object.freeze(Object.defineProperty({__proto__:null,toWorkflowMessageData:P,useWorkflowSubmission:He,workflowRecoveryPromise:Ke},Symbol.toStringTag,{value:"Module"}));export{st as W,He as a,$e as b,nt as c,rt as d,Le as u};
44
+ 你必须实际调用 generate_image 工具生成图片,不要仅输出文字描述。`);const G=[{role:"system",content:U},{role:"user",content:W}],pe=[{id:`${v}-step-analyze`,mcp:"ai_analyze",args:{context:R,messages:G,referenceImages:f.length>0?f:void 0,textModel:s,modelRef:l,knowledgeContextRefs:i.length>0?i:void 0},options:{mode:"async"},description:`AI 以「${k}」角色回复`,status:"pending"}];return{id:v,name:k,description:`使用「${k}」Skill 生成内容`,scenarioType:"skill_flow",skillId:w,generationType:a,steps:pe,metadata:{prompt:m,userInstruction:c,rawInput:p,modelId:s,modelRef:l,defaultModels:h,defaultModelRefs:M,isModelExplicit:g,count:x,size:u,duration:r,referenceImages:o.length>0?o:void 0,selection:d,knowledgeContextRefs:i.length>0?i:void 0,parseMethod:"agent_fallback"},createdAt:Date.now()}}function $e(t,e=[]){return t.scenario==="direct_generation"?Me(t,e):Ae(t,e)}function De(t,e=0){try{let o=oe(t);if(!o){const l=ke(t),s=l.indexOf("{"),g=l.lastIndexOf("}");s>=0&&g>s&&(o=oe(l.slice(s,g+1)))}if(!o)return{content:"",steps:[]};const n=typeof o.content=="string"?o.content:"";if(!Array.isArray(o.next)||o.next.length===0)return{content:n,steps:[]};const a=o.next.filter(l=>typeof l.mcp=="string"&&typeof l.args=="object").map((l,s)=>({id:`step-${e+s+1}`,mcp:l.mcp,args:l.args,description:Pe(l.mcp,l.args),status:"pending"}));return{content:n,steps:a}}catch{return{content:"",steps:[]}}}function Pe(t,e){var o,n,a,l;switch(t){case"generate_image":return`生成图片: ${((o=e.prompt)==null?void 0:o.substring(0,30))||""}...`;case"generate_video":return`生成视频: ${((n=e.prompt)==null?void 0:n.substring(0,30))||""}...`;case"generate_audio":return`生成音频: ${((a=e.prompt)==null?void 0:a.substring(0,30))||""}...`;case"generate_text":return`生成文本: ${((l=e.prompt)==null?void 0:l.substring(0,30))||""}...`;case"ai_analyze":return"AI 分析用户意图";case"format_markdown":return"格式化输出";case"show_result":return"展示结果";default:return`执行 ${t}`}}function Fe(t,e,o,n,a,l){return{...t,steps:t.steps.map(s=>s.id===e?{...s,status:o,result:n!==void 0?n:s.result,error:a,duration:l}:s)}}function ze(t,e){const o=new Set(t.steps.map(a=>a.id)),n=e.filter(a=>!o.has(a.id));return n.length===0?t:{...t,steps:[...t.steps,...n]}}function B(t){const e=t.steps.filter(s=>s.status==="completed").length,o=t.steps.filter(s=>s.status==="failed").length,n=t.steps.find(s=>s.status==="running"),a=t.steps.filter(s=>s.status==="pending").length;let l;return o>0?l="failed":n?l="running":a===0&&e>0?l="completed":l="pending",{status:l,completedSteps:e,totalSteps:t.steps.length,currentStep:n||t.steps.find(s=>s.status==="pending")}}const ae={workflow:null,status:"idle",currentStep:null,completedSteps:0,totalSteps:0,error:null};function Oe(){const[t,e]=y.useState(ae),o=y.useRef(null),n=y.useRef(!1),a=y.useCallback(r=>{o.current=r,n.current=!1;const d=B(r);e({workflow:r,status:"running",currentStep:d.currentStep||null,completedSteps:d.completedSteps,totalSteps:d.totalSteps,error:null})},[]),l=y.useCallback(r=>{o.current=r,n.current=!1;const d=B(r);let h="running";r.status==="completed"?h="completed":(r.status==="failed"||r.status==="cancelled")&&(h="failed"),e({workflow:r,status:h,currentStep:d.currentStep||null,completedSteps:d.completedSteps,totalSteps:d.totalSteps,error:r.error||null})},[]),s=y.useCallback((r,d,h,M,_)=>{if(n.current)return;const i=o.current;if(!i)return;const v=Fe(i,r,d,h,M,_);o.current=v,e(w=>{const k=B(v);let I="running";return k.status==="completed"?I="completed":k.status==="failed"&&(I="failed"),{...w,workflow:v,status:I,currentStep:k.currentStep||null,completedSteps:k.completedSteps,totalSteps:k.totalSteps,error:M||w.error}})},[]),g=y.useCallback(r=>{if(n.current||r.length===0)return;const d=o.current;if(!d)return;const h=ze(d,r);o.current=h,e(M=>{const _=B(h);return{...M,workflow:h,currentStep:_.currentStep||M.currentStep,totalSteps:_.totalSteps}})},[]),m=y.useCallback(r=>{const d=o.current;if(!d||n.current)return{content:"",steps:[]};const h=d.steps.length,{content:M,steps:_}=De(r,h);return M&&!d.aiAnalysis&&(o.current={...d,aiAnalysis:M}),_.length>0&&g(_),{content:M,steps:_}},[g]),c=y.useCallback(()=>{o.current=null,n.current=!1,e(ae)},[]),p=y.useCallback(()=>{n.current=!0,e(r=>({...r,status:"failed",error:"工作流已中止"}))},[]),x=y.useCallback(()=>{n.current=!1,e(r=>({...r,status:"running",error:null}))},[]),u=y.useCallback(()=>o.current,[]);return{state:t,startWorkflow:a,restoreWorkflow:l,updateStep:s,addSteps:g,addStepsFromAIResponse:m,resetWorkflow:c,abortWorkflow:p,resumeWorkflow:x,getWorkflow:u}}const de=y.createContext(null),st=({children:t})=>{const e=Oe(),o=y.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 We.jsx(de.Provider,{value:o,children:t})};function Ne(){const t=y.useContext(de);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function Le(){const t=Ne();return{startWorkflow:t.startWorkflow,restoreWorkflow:t.restoreWorkflow,updateStep:t.updateStep,addSteps:t.addSteps,addStepsFromAIResponse:t.addStepsFromAIResponse,resetWorkflow:t.resetWorkflow,abortWorkflow:t.abortWorkflow,resumeWorkflow:t.resumeWorkflow,getWorkflow:t.getWorkflow}}function P(t,e,o,n){var l;const a=t.metadata||{};return{id:t.id,name:t.name,generationType:t.generationType,prompt:a.prompt||((l=e==null?void 0:e.aiContext)==null?void 0:l.finalPrompt)||"",aiAnalysis:t.aiAnalysis,count:a.count,createdAt:t.createdAt,steps:t.steps.map(s=>({id:s.id,description:s.description,status:s.status,mcp:s.mcp,args:s.args,result:s.result,error:s.error,duration:s.duration,options:s.options})),retryContext:e,postProcessingStatus:o,insertedCount:n}}const Ue=20,ie=2e3,je=3e4;function Ze(t){return t.steps.length>0&&t.steps.every(e=>e.status==="completed")}function fe(t){var e;return t.status===K.PROCESSING?{status:"running",result:{taskId:t.id}}:t.status===K.COMPLETED&&t.result?{status:"completed",result:typeof t.result=="object"&&t.result!==null?{...t.result,taskId:t.id}:{result:t.result,taskId:t.id}}:t.status===K.FAILED?{status:"failed",error:typeof t.error=="string"?t.error:((e=t.error)==null?void 0:e.message)||"Task failed"}:null}function Ve(t,e,o,n,a,l){const s=o.getWorkflow(),g=ce(s,t);if(!g)return!1;const m=t.type!==ue.IMAGE&&(s==null?void 0:s.generationType)!=="image";e.status==="running"&&o.resumeWorkflow(),o.updateStep(g.id,e.status,e.result,e.error);const c=o.getWorkflow();if(c){const p=P(c,void 0,c.generationType==="image"&&Ze(c)?"completed":void 0);n.current(p);const x=a.current,u=l.current;m&&x&&u&&$.updateWorkflow(x,u,p)}return!0}function Ge(t,e,o,n,a,l){const s=a.current;if(!s||t.type===ue.IMAGE)return!1;for(const g of s.children){if(!Re(g))continue;const m=g;if(m.workflow.generationType==="image")continue;const c=ce(m.workflow,t);if(!c)continue;const p=m.workflow.steps.map(u=>u.id!==c.id?u:{...u,status:e.status,...e.result!==void 0&&{result:e.result},...e.error!==void 0&&{error:e.error}}),x={...m.workflow,steps:p};if(e.status==="running"&&delete x.error,$.updateWorkflow(s,m.id,x),l.current=m.id,n.current(x),o.restoreWorkflow){const u={id:x.id,name:x.name||"",description:"",scenarioType:"direct_generation",generationType:x.generationType,status:e.status==="running"?"running":"failed",steps:p.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})),createdAt:x.createdAt||Date.now(),metadata:{prompt:x.prompt||"",userInstruction:"",rawInput:"",modelId:"",isModelExplicit:!1,count:x.count||1,selection:{texts:[],images:[],videos:[],graphics:[]}},aiAnalysis:x.aiAnalysis};o.restoreWorkflow(u)}return!0}return!1}function Q(t,e,o,n,a,l){var m;const s=t.task,g=fe(s);return g?Ve(s,g,e,o,a,l)||Ge(s,g,e,o,a,l)?!0:((m=n.current)==null?void 0:m.call(n,s))??!1:!1}function Be(t){const{workflowControl:e,boardRef:o,workZoneIdRef:n}=t,a=y.useRef(t.updateWorkflowMessage);y.useEffect(()=>{a.current=t.updateWorkflowMessage},[t.updateWorkflowMessage]);const l=y.useRef(t.syncWorkflowTaskUpdate);y.useEffect(()=>{l.current=t.syncWorkflowTaskUpdate},[t.syncWorkflowTaskUpdate]);const s=y.useRef(new Map),g=y.useRef(null),m=y.useRef(0),c=y.useRef(!1);y.useEffect(()=>{const p=r=>{const d=s.current;if(!d.has(r.task.id)&&d.size>=Ue){const h=d.keys().next().value;h&&d.delete(h)}d.set(r.task.id,r)},x=()=>{const r=new Map;for(const[d,h]of s.current.entries())Q(h,e,a,l,o,n)||r.set(d,h);s.current=r,(r.size===0||Date.now()-m.current>je)&&(g.current&&(clearInterval(g.current),g.current=null),s.current=new Map)};if(!c.current){c.current=!0;const r=ne.getAllTasks();for(const d of r){const h=fe(d);h&&(h.status==="completed"||h.status==="failed")&&Q({task:d},e,a,l,o,n)}}const u=ne.observeTaskUpdates().subscribe(r=>{if(r.type!=="taskUpdated")return;if(r.task.status===K.PROCESSING&&s.current.has(r.task.id)){p(r),g.current||(m.current=Date.now(),g.current=setInterval(x,ie));return}Q(r,e,a,l,o,n)?s.current.delete(r.task.id):(p(r),g.current||(m.current=Date.now(),g.current=setInterval(x,ie)))});return()=>{u.unsubscribe(),g.current&&(clearInterval(g.current),g.current=null),s.current=new Map}},[e,o,n])}let q=null;const Ke=new Promise(t=>{q=t});async function qe(t,e){const{operation:o,params:n}=e;try{const{insertImageFromUrl:a}=await Z(async()=>{const{insertImageFromUrl:c}=await import("./ai-chat-BnWVpTEI.js").then(p=>p.sS);return{insertImageFromUrl:c}},__vite__mapDeps([0]),import.meta.url),{insertVideoFromUrl:l}=await Z(async()=>{const{insertVideoFromUrl:c}=await import("./ai-chat-BnWVpTEI.js").then(p=>p.sT);return{insertVideoFromUrl:c}},__vite__mapDeps([0]),import.meta.url),{insertAudioFromUrl:s}=await Z(async()=>{const{insertAudioFromUrl:c}=await import("./ai-chat-BnWVpTEI.js").then(p=>p.sU);return{insertAudioFromUrl:c}},__vite__mapDeps([0]),import.meta.url),{getSmartInsertionPoint:g}=await Z(async()=>{const{getSmartInsertionPoint:c}=await import("./ai-chat-BnWVpTEI.js").then(p=>p.sR);return{getSmartInsertionPoint:c}},__vite__mapDeps([0]),import.meta.url),m=n.position?[n.position.x,n.position.y]:g(t)||[100,100];if(o==="canvas_insert"&&n.items)for(const c of n.items)c.type==="image"&&c.url?await a(t,c.url,m,!1,void 0,void 0,void 0,void 0,!0):c.type==="video"&&c.url?await l(t,c.url,m):c.type==="audio"&&c.url&&await s(t,c.url,c,m);else o==="insert_image"&&n.url?await a(t,n.url,m,!1,void 0,void 0,void 0,void 0,!0):o==="insert_video"&&n.url?await l(t,n.url,m):o==="insert_audio"&&n.url&&await s(t,n.url,n,m)}catch(a){console.error("[useWorkflowSubmission] Failed to insert to canvas:",a)}}function He(t){const{boardRef:e,workZoneIdRef:o}=t,n=Le(),a=xe(),l=y.useRef(a.sendWorkflowMessage),s=y.useRef(a.updateWorkflowMessage);y.useEffect(()=>{l.current=a.sendWorkflowMessage,s.current=a.updateWorkflowMessage},[a.sendWorkflowMessage,a.updateWorkflowMessage]),Be({workflowControl:n,updateWorkflowMessage:a.updateWorkflowMessage,syncWorkflowTaskUpdate:a.syncWorkflowTaskUpdate,boardRef:e,workZoneIdRef:o});const g=y.useRef(null),m=y.useRef([]),c=y.useRef(!1),p=y.useRef(null),x=y.useCallback(i=>i!=="image",[]),u=y.useCallback(async()=>{if(!c.current){c.current=!0;try{await N.recoverWorkflows()}catch(i){console.warn("[useWorkflowSubmission] Failed to recover workflows:",i)}finally{q==null||q()}}},[]);y.useEffect(()=>{N.init(),N.registerCanvasHandler(async(v,w)=>({success:!0}));const i=N.subscribeToAllEvents(v=>{var w,k,I,W,b,T,f,R,C;if(v.type==="recovered"&&v.workflow){const S=v.workflow,z=S.status==="running"||S.status==="pending",E=S.status==="failed"&&S.updatedAt&&Date.now()-S.updatedAt<300*1e3;if(!z&&!E)return;(w=n.restoreWorkflow)==null||w.call(n,S);const A=se.get(),F={aiContext:{rawInput:((k=S.context)==null?void 0:k.userInput)||"",userInstruction:((I=S.context)==null?void 0:I.userInput)||"",model:{id:((W=S.context)==null?void 0:W.model)||"",type:S.generationType==="video"?"video":S.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:(b=S.metadata)==null?void 0:b.count,size:(T=S.metadata)==null?void 0:T.size,duration:(f=S.metadata)==null?void 0:f.duration},selection:{texts:[],images:[],videos:[],graphics:[]},finalPrompt:((R=S.metadata)==null?void 0:R.prompt)||""},referenceImages:((C=S.context)==null?void 0:C.referenceImages)||[],textModel:A.textModelName},J=P(S,F);s.current(J);const D=e.current,L=o.current;x(S.generationType)&&L&&D&&$.updateWorkflow(D,L,J);const U=N.subscribeToWorkflow(S.id,async te=>{var G;await((G=p.current)==null?void 0:G.call(p,te,S,F))});m.current.push(U)}});return m.current.push(i),u(),()=>{m.current.forEach(v=>v.unsubscribe()),m.current=[]}},[]);const r=y.useCallback(async(i,v,w)=>{const k=e.current,I=o.current,W=x(v.generationType);switch(i.type){case"step":{n.updateStep(i.stepId,i.status,i.result,i.error,i.duration);const b=n.getWorkflow();if(b){const T=P(b,w);s.current(T),W&&I&&k&&$.updateWorkflow(k,I,T)}break}case"completed":{const b=n.getWorkflow();let T=!1;b&&b.steps.forEach(R=>{const C=R.result,S=C==null?void 0:C.taskId;S&&(T=!0),(R.status==="running"||R.status==="pending")&&!S&&n.updateStep(R.id,"completed")});const f=n.getWorkflow();if(f){const R=P(f,w);if(s.current(R),W&&I&&k){if($.updateWorkflow(k,I,R),f.steps.some(S=>S.status==="pending"||S.status==="running"))break;if(!T)setTimeout(()=>{$.removeWorkZone(k,I)},1500);else{const{workflowCompletionService:S}=await Z(async()=>{const{workflowCompletionService:E}=await import("./tool-windows-Bf_pMml-.js").then(A=>A.b1);return{workflowCompletionService:E}},__vite__mapDeps([0,1]),import.meta.url);f.steps.every(E=>{const A=E.result;return A!=null&&A.taskId?S.isPostProcessingCompleted(A.taskId):!0})&&setTimeout(()=>{$.removeWorkZone(k,I)},1500)}}}break}case"failed":{n.abortWorkflow();const b=n.getWorkflow();if(b){const T=P(b,w);s.current(T),W&&I&&k&&$.updateWorkflow(k,I,T)}break}case"steps_added":{const b=i;n.addSteps(b.steps.map(f=>({id:f.id,mcp:f.mcp,args:f.args,description:f.description,status:f.status})));const T=n.getWorkflow();if(T){const f=P(T,w);s.current(f),W&&I&&k&&$.updateWorkflow(k,I,f)}break}case"canvas_insert":{k&&qe(k,i);break}}},[n,e,o,x]);y.useEffect(()=>{p.current=r},[r]);const d=y.useCallback(async(i,v,w,k,I)=>{var C,S,z;const W=k||$e(i,v);n.startWorkflow(W);const b=se.get(),T=b.textModelName,f=w||{aiContext:{rawInput:i.rawInput||i.userInstruction,userInstruction:i.userInstruction,model:{id:i.modelId,type:i.generationType,isExplicit:i.isModelExplicit},modelRef:i.modelRef,defaultModels:{image:((C=i.defaultModels)==null?void 0:C.image)||b.imageModelName||"gemini-3-pro-image-preview-vip",video:((S=i.defaultModels)==null?void 0:S.video)||b.videoModelName||"veo3.1",audio:((z=i.defaultModels)==null?void 0:z.audio)||b.audioModelName||"suno_music"},defaultModelRefs:i.defaultModelRefs,params:{count:i.count,size:i.size,duration:i.duration},selection:i.selection||{texts:[],images:[],videos:[],graphics:[]},finalPrompt:i.prompt,knowledgeContextRefs:i.knowledgeContextRefs},referenceImages:v,textModel:T};g.current=f;const R=P(W,f);return await l.current({context:f.aiContext,workflow:R,textModel:T,autoOpen:!1,appendToCurrentSession:I==null?void 0:I.appendToCurrentChatSession}),{workflowId:W.id,usedSW:!1}},[n]),h=y.useCallback(async i=>{await N.cancel(i),n.abortWorkflow()},[n]),M=y.useCallback(async(i,v)=>{const w=i.retryContext;if(!w){console.error("[useWorkflowSubmission] No retry context available");return}const k={prompt:i.prompt,userInstruction:w.aiContext.userInstruction,rawInput:w.aiContext.rawInput,modelId:w.aiContext.model.id,modelRef:w.aiContext.modelRef,defaultModels:w.aiContext.defaultModels,defaultModelRefs:w.aiContext.defaultModelRefs,isModelExplicit:w.aiContext.model.isExplicit,generationType:w.aiContext.model.type,count:i.count||1,size:w.aiContext.params.size,duration:w.aiContext.params.duration,scenario:w.aiContext.model.type==="agent"?"agent_flow":"direct_generation",selection:w.aiContext.selection,parseResult:{},hasExtraContent:!1};await d(k,w.referenceImages||[],w)},[d]),_=y.useCallback(()=>g.current,[]);return{submitWorkflow:d,cancelWorkflow:h,retryWorkflow:M,getRetryContext:_}}const rt=Object.freeze(Object.defineProperty({__proto__:null,toWorkflowMessageData:P,useWorkflowSubmission:He,workflowRecoveryPromise:Ke},Symbol.toStringTag,{value:"Module"}));export{st as W,He as a,$e as b,nt as c,rt as d,Le as u};
@@ -1,3 +1,3 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ai-chat-BlxYfB4O.css"])))=>i.map(i=>d[i]);
2
2
  import{_ as F}from"./startup-runtime-BrfuwjQS.js";function V(){if(typeof VideoDecoder>"u"||typeof VideoEncoder>"u")throw new Error(`当前浏览器不支持 WebCodecs API。
3
- 请使用 Chrome 94+ 或 Edge 94+ 浏览器。`)}function M(){const i=[{mimeType:"video/mp4;codecs=avc1",extension:"mp4"},{mimeType:"video/webm;codecs=vp9",extension:"webm"},{mimeType:"video/webm;codecs=vp8",extension:"webm"}];for(const e of i)if(MediaRecorder.isTypeSupported(e.mimeType))return e;return console.warn("[WebCodecs] No preferred format supported, using default"),{mimeType:"video/webm",extension:"webm"}}async function k(i,e,n){const d=document.createElement("canvas"),o=d.getContext("2d",{willReadFrequently:!1});if(!o)throw new Error("无法创建 Canvas 2D 上下文");const c=document.createElement("video");c.crossOrigin="anonymous",c.src=i[0],await new Promise((a,t)=>{c.onloadedmetadata=()=>a(),c.onerror=()=>t(new Error("无法加载第一个视频"))}),d.width=c.videoWidth,d.height=c.videoHeight;const b=M(),u=new AudioContext,E=u.createMediaStreamDestination(),$=d.captureStream(30),x=new MediaStream([...$.getVideoTracks(),...E.stream.getAudioTracks()]),p=new MediaRecorder(x,{mimeType:b.mimeType,videoBitsPerSecond:8e6,audioBitsPerSecond:128e3}),v=[];p.ondataavailable=a=>{a.data.size>0&&v.push(a.data)},p.start(),e==null||e(0,"encoding","开始录制视频...");const T=(n==null?void 0:n.transitions)||[],S=(n==null?void 0:n.transitionDuration)??.5;for(let a=0;a<i.length;a++){e==null||e(a/i.length*100,"encoding",`正在处理视频 ${a+1}/${i.length}...`);const t=document.createElement("video");t.crossOrigin="anonymous",t.src=i[a],t.volume=1,await new Promise((r,f)=>{t.onloadedmetadata=()=>r(),t.onerror=()=>f(new Error(`无法加载视频 ${a+1}`))});let m=null;try{m=u.createMediaElementSource(t),m.connect(E)}catch(r){console.warn(`[WebCodecs] Failed to connect audio from video ${a+1}:`,r)}const s=a<T.length?T[a]:"cut",y=s==="dissolve"||s==="fade_to_black";await new Promise(r=>{t.play().catch(w=>{console.warn(`[WebCodecs] Failed to play video ${a+1}:`,w)});const f=()=>{if(t.ended){r();return}let w=1;if(y&&t.duration>0){const R=t.duration-t.currentTime;R<S&&(w=Math.max(0,R/S))}s==="fade_to_black"&&w<1&&(o.fillStyle="#000",o.fillRect(0,0,d.width,d.height)),o.globalAlpha=w,o.drawImage(t,0,0,d.width,d.height),o.globalAlpha=1,requestAnimationFrame(f)};t.onended=()=>r(),f()}),m&&m.disconnect(),t.pause(),t.src="",t.load()}e==null||e(100,"finalizing","正在生成最终视频..."),await new Promise(a=>{p.onstop=()=>a(),p.stop()}),await u.close();const D=b.mimeType.split(";")[0],h=new Blob(v,{type:D}),_=i.length*8;try{const{unifiedCacheService:a}=await F(async()=>{const{unifiedCacheService:y}=await import("./ai-chat-D2kHVW04.js").then(r=>r.sK);return{unifiedCacheService:y}},__vite__mapDeps([0]),import.meta.url),t=`merged-video-${Date.now()}`,m=`/__aitu_cache__/video/${t}.mp4`,s=m;return await a.cacheMediaFromBlob(s,h,"video",{taskId:t}),{blob:h,url:m,duration:_,taskId:t}}catch(a){console.warn("[WebCodecs] Failed to cache video, using blob URL:",a);const t=URL.createObjectURL(h);return{blob:h,url:t,duration:_}}}class l{constructor(){}static getInstance(){return l.instance||(l.instance=new l),l.instance}async mergeVideos(e,n,d){if(e.length===0)throw new Error("没有视频可合并");if(e.length===1){n==null||n(0,"downloading","下载视频...");const c=await(await fetch(e[0])).blob();return{blob:c,url:URL.createObjectURL(c),duration:0}}V();try{n==null||n(0,"downloading",`下载 ${e.length} 个视频...`);const o=[];for(let c=0;c<e.length;c++){n==null||n(c/e.length*100,"downloading",`下载视频 ${c+1}/${e.length}...`);const u=await(await fetch(e[c])).blob();o.push(u)}return await k(e,n,d)}catch(o){throw console.error("[WebCodecs] Merge failed:",o),new Error(`视频合并失败: ${o instanceof Error?o.message:String(o)}`)}}static isSupported(){return typeof VideoDecoder<"u"&&typeof VideoEncoder<"u"}}const A=l.getInstance();async function L(i,e,n){return A.mergeVideos(i,e,n)}export{L as m};
3
+ 请使用 Chrome 94+ 或 Edge 94+ 浏览器。`)}function M(){const i=[{mimeType:"video/mp4;codecs=avc1",extension:"mp4"},{mimeType:"video/webm;codecs=vp9",extension:"webm"},{mimeType:"video/webm;codecs=vp8",extension:"webm"}];for(const e of i)if(MediaRecorder.isTypeSupported(e.mimeType))return e;return console.warn("[WebCodecs] No preferred format supported, using default"),{mimeType:"video/webm",extension:"webm"}}async function k(i,e,n){const d=document.createElement("canvas"),o=d.getContext("2d",{willReadFrequently:!1});if(!o)throw new Error("无法创建 Canvas 2D 上下文");const c=document.createElement("video");c.crossOrigin="anonymous",c.src=i[0],await new Promise((a,t)=>{c.onloadedmetadata=()=>a(),c.onerror=()=>t(new Error("无法加载第一个视频"))}),d.width=c.videoWidth,d.height=c.videoHeight;const b=M(),u=new AudioContext,E=u.createMediaStreamDestination(),$=d.captureStream(30),x=new MediaStream([...$.getVideoTracks(),...E.stream.getAudioTracks()]),p=new MediaRecorder(x,{mimeType:b.mimeType,videoBitsPerSecond:8e6,audioBitsPerSecond:128e3}),v=[];p.ondataavailable=a=>{a.data.size>0&&v.push(a.data)},p.start(),e==null||e(0,"encoding","开始录制视频...");const T=(n==null?void 0:n.transitions)||[],S=(n==null?void 0:n.transitionDuration)??.5;for(let a=0;a<i.length;a++){e==null||e(a/i.length*100,"encoding",`正在处理视频 ${a+1}/${i.length}...`);const t=document.createElement("video");t.crossOrigin="anonymous",t.src=i[a],t.volume=1,await new Promise((r,f)=>{t.onloadedmetadata=()=>r(),t.onerror=()=>f(new Error(`无法加载视频 ${a+1}`))});let m=null;try{m=u.createMediaElementSource(t),m.connect(E)}catch(r){console.warn(`[WebCodecs] Failed to connect audio from video ${a+1}:`,r)}const s=a<T.length?T[a]:"cut",y=s==="dissolve"||s==="fade_to_black";await new Promise(r=>{t.play().catch(w=>{console.warn(`[WebCodecs] Failed to play video ${a+1}:`,w)});const f=()=>{if(t.ended){r();return}let w=1;if(y&&t.duration>0){const R=t.duration-t.currentTime;R<S&&(w=Math.max(0,R/S))}s==="fade_to_black"&&w<1&&(o.fillStyle="#000",o.fillRect(0,0,d.width,d.height)),o.globalAlpha=w,o.drawImage(t,0,0,d.width,d.height),o.globalAlpha=1,requestAnimationFrame(f)};t.onended=()=>r(),f()}),m&&m.disconnect(),t.pause(),t.src="",t.load()}e==null||e(100,"finalizing","正在生成最终视频..."),await new Promise(a=>{p.onstop=()=>a(),p.stop()}),await u.close();const D=b.mimeType.split(";")[0],h=new Blob(v,{type:D}),_=i.length*8;try{const{unifiedCacheService:a}=await F(async()=>{const{unifiedCacheService:y}=await import("./ai-chat-BnWVpTEI.js").then(r=>r.sK);return{unifiedCacheService:y}},__vite__mapDeps([0]),import.meta.url),t=`merged-video-${Date.now()}`,m=`/__aitu_cache__/video/${t}.mp4`,s=m;return await a.cacheMediaFromBlob(s,h,"video",{taskId:t}),{blob:h,url:m,duration:_,taskId:t}}catch(a){console.warn("[WebCodecs] Failed to cache video, using blob URL:",a);const t=URL.createObjectURL(h);return{blob:h,url:t,duration:_}}}class l{constructor(){}static getInstance(){return l.instance||(l.instance=new l),l.instance}async mergeVideos(e,n,d){if(e.length===0)throw new Error("没有视频可合并");if(e.length===1){n==null||n(0,"downloading","下载视频...");const c=await(await fetch(e[0])).blob();return{blob:c,url:URL.createObjectURL(c),duration:0}}V();try{n==null||n(0,"downloading",`下载 ${e.length} 个视频...`);const o=[];for(let c=0;c<e.length;c++){n==null||n(c/e.length*100,"downloading",`下载视频 ${c+1}/${e.length}...`);const u=await(await fetch(e[c])).blob();o.push(u)}return await k(e,n,d)}catch(o){throw console.error("[WebCodecs] Merge failed:",o),new Error(`视频合并失败: ${o instanceof Error?o.message:String(o)}`)}}static isSupported(){return typeof VideoDecoder<"u"&&typeof VideoEncoder<"u"}}const A=l.getInstance();async function L(i,e,n){return A.mergeVideos(i,e,n)}export{L as m};
@@ -1 +1 @@
1
- import{dd as u,bj as v}from"./ai-chat-D2kHVW04.js";import"./startup-runtime-BrfuwjQS.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 u.getCachedBlob(o);if(t){const a=URL.createObjectURL(t),f=`${a}#${o}`,l=e.children.indexOf(c);if(l===-1){URL.revokeObjectURL(a);continue}v.setNode(e,{url:f},[l]),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 y(e){e&&requestAnimationFrame(async()=>{try{await h(e)}catch(n){console.error("[VideoRecovery] Initialization failed:",n)}})}export{y as initVideoRecoveryService,h as recoverExpiredVideoUrls};
1
+ import{dd as u,bj as v}from"./ai-chat-BnWVpTEI.js";import"./startup-runtime-BrfuwjQS.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 u.getCachedBlob(o);if(t){const a=URL.createObjectURL(t),f=`${a}#${o}`,l=e.children.indexOf(c);if(l===-1){URL.revokeObjectURL(a);continue}v.setNode(e,{url:f},[l]),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 y(e){e&&requestAnimationFrame(async()=>{try{await h(e)}catch(n){console.error("[VideoRecovery] Initialization failed:",n)}})}export{y as initVideoRecoveryService,h as recoverExpiredVideoUrls};
@@ -1,3 +1,3 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ai-chat-BlxYfB4O.css"])))=>i.map(i=>d[i]);
2
- import{dd as k,eS as z,r_ as V}from"./ai-chat-D2kHVW04.js";import{_ as b}from"./startup-runtime-BrfuwjQS.js";async function j(e,t,n){if(e.size===0)throw new Error("Invalid frame blob: size is 0");const a=`/__aitu_cache__/video-frame_${t}_${n}`;return await k.cacheMediaFromBlob(a,e,"image",{metadata:{source:"video-frame",shotId:t,frameType:n}}),a}async function ee(e,t,n){const a=URL.createObjectURL(e),s=document.createElement("video");s.muted=!0,s.preload="auto";try{await new Promise((d,p)=>{s.onloadedmetadata=()=>d(),s.onerror=()=>p(new Error("Failed to load video")),s.src=a});const i=document.createElement("canvas"),u=i.getContext("2d"),o=Math.min(1,320/s.videoWidth);i.width=Math.round(s.videoWidth*o),i.height=Math.round(s.videoHeight*o);const l=[];for(let d=0;d<t.length;d++){n==null||n(d,t.length);try{const p=await R(s,i,u,t[d]);l.push(p)}catch{l.push(null)}}return n==null||n(t.length,t.length),l}finally{URL.revokeObjectURL(a),s.src=""}}async function te(e,t,n,a){const s=a||n,i=document.createElement("video");i.muted=!0,i.preload="auto",i.crossOrigin="anonymous";try{await new Promise((E,I)=>{i.onloadedmetadata=()=>E(),i.onerror=()=>I(new Error("Failed to load video")),i.src=e});const u=document.createElement("canvas"),c=u.getContext("2d"),l=Math.min(1,1280/i.videoWidth);u.width=Math.round(i.videoWidth*l),u.height=Math.round(i.videoHeight*l);const d=s==="first"?Math.min(.1,i.duration):Math.max(0,i.duration-.1),p=await R(i,u,c,d);return await j(p,t,n)}catch{return null}finally{i.src=""}}function R(e,t,n,a){return new Promise((s,i)=>{const u=Math.min(Math.max(0,a),e.duration||0);e.currentTime=u;const c=()=>{e.removeEventListener("seeked",c),n.drawImage(e,0,0,t.width,t.height),t.toBlob(o=>{o&&o.size>0?s(o):i(new Error("toBlob returned empty"))},"image/jpeg",.85)};e.addEventListener("seeked",c)})}const P=/(?:^|[^\d])(?:400|401|402|403|404|413|415|422)(?:[^\d]|$)/,X=[/invalid\s*(?:request|parameters?|argument|input|field|payload|schema)/i,/bad\s*request/i,/unprocessable/i,/unsupported\s*(?:model|parameter|size|duration|resolution|format|input|image|media)?/i,/(?:missing|required)\s*(?:parameter|field|argument|input|prompt|model|duration|size)/i,/requires?\s+(?:a\s+)?(?:reference\s+image|input|image)/i,/(?:must|should)\s+be/i,/no\s+(?:task\s+)?id\s+returned|no\s+video\s+url/i,/\b(?:invalid_argument|invalid_parameter|parameter_invalid|validation_error|bad_request|unsupported_model)\b/i,/参数(?:错误|无效|非法|不正确|校验失败|验证失败)/,/请求(?:参数|数据).*?(?:无效|错误|非法|不支持)/,/缺少(?:必填|必要|参数|字段)/,/必须(?:是|为)|仅支持/,/不支持(?:的)?(?:参数|模型|尺寸|时长|分辨率|格式|图片|视频)/,/未返回(?:任务\s*)?ID|未返回有效的视频 URL/,/(?:校验|验证)失败|格式错误|字段错误/,/内容(?:政策|审核|安全)|安全策略|违规|敏感内容|policy|safety/i,/(?:ip|intellectual\s+property|copyright|trademark)\s*(?:infringement|violation)|涉嫌(?:知识产权|版权|商标|IP)(?:侵权|违规)|知识产权侵权/i];function q(e,t){var n,a;return[(n=e==null?void 0:e.error)==null?void 0:n.code,(a=e==null?void 0:e.error)==null?void 0:a.message,t].filter(s=>typeof s=="string"&&s.trim()!=="").join(" ")}function re(e,t){var s,i;const n=q(e,t);return!n||!(P.test(n)||X.some(u=>u.test(n)))?null:((s=e==null?void 0:e.error)==null?void 0:s.message)||t||((i=e==null?void 0:e.error)==null?void 0:i.code)||"不可重试的视频生成错误"}function ne(e){const{model:t,firstFrameUrl:n,lastFrameUrl:a,extraReferenceUrls:s=[],characterReferenceUrls:i=[]}=e,u=V(t),c=[],o=[],l=(d,p)=>{!d||c.includes(d)||(c.push(d),o.push(p))};if(u.imageUpload.mode==="frames"){l(n,"首帧图:只表示视频起始画面状态,视频必须从这张图开始,优先于故事上下文。"),l(a,"尾帧图:只表示视频结束画面状态,视频应自然过渡到这张图,优先于故事上下文。");const d=c.length>0?c.slice(0,u.imageUpload.maxCount):void 0,p=d?o.slice(0,d.length):void 0,E=i.length>0?i:void 0;return{referenceImages:d,referenceImageDescriptions:p,unusedCharacterReferenceUrls:E}}for(const d of i)if(l(d,"角色参考图:仅用于锁定人物身份、脸型、发型、服装、材质和气质,不表示时间顺序、动作或剧情。"),c.length>=u.imageUpload.maxCount)break;l(n,"首帧图:只表示视频起始画面状态,视频必须从这张图开始,优先于故事上下文。");for(const d of s)if(l(d,"全局/补充参考图:仅用于主体、产品、场景、风格或色彩一致性,不表示时间顺序、动作或剧情。"),c.length>=u.imageUpload.maxCount)break;return{referenceImages:c.length>0?c:void 0,referenceImageDescriptions:o.length>0?o:void 0}}async function ie(e,t){return z(e,{interval:1e3,timeout:1800*1e3,signal:t})}function J(e){return Math.max(2,String(Math.max(e,0)).length)}function M(e,t){return String(e).padStart(t,"0")}function T(e,t,n){const a=M(e+1,n);return t==="first"?`${a}.首帧`:t==="last"?`${a}.尾帧`:`${a}.视频`}function Y(e){return["#!/bin/sh","set -eu","",'cd "$(dirname "$0")"',"",`MANIFEST_FILE=${JSON.stringify(e)}`,"",'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 Z(e){return e.map(t=>({...t,generated_first_frame_url:void 0,generated_last_frame_url:void 0,generated_video_url:void 0,suppressed_generated_urls:G(t)}))}function G(e){const t={...e.suppressed_generated_urls||{}};return e.generated_first_frame_url&&(t.first=e.generated_first_frame_url),e.generated_last_frame_url&&(t.last=e.generated_last_frame_url),e.generated_video_url&&(t.video=e.generated_video_url),Object.keys(t).length>0?t:void 0}function H(e){return e.map(t=>({...t,referenceImageUrl:void 0}))}function oe(e,t){return{shots:Z(e),characters:H(t)}}function ae(e){return e.flatMap((t,n)=>{const a=[];return t.generated_first_frame_url&&a.push({url:t.generated_first_frame_url,type:"image",kind:"first",shotIndex:n}),t.generated_last_frame_url&&a.push({url:t.generated_last_frame_url,type:"image",kind:"last",shotIndex:n}),t.generated_video_url&&a.push({url:t.generated_video_url,type:"video",kind:"video",shotIndex:n}),a})}async function le(e){const{recordId:t,fileNamePrefix:n,zipBaseName:a,scriptMarkdown:s,recordMeta:i,shots:u,assets:c,audioAsset:o,onProgress:l}=e,d=new Date().toISOString(),p=J(u.length),E=M(0,p),{default:I}=await b(async()=>{const{default:r}=await import("./office-data-DMEex_0S.js").then(f=>f.j);return{default:r}},[],import.meta.url),{downloadFromBlob:L,getFileExtension:F,normalizeImageDataUrl:U,processBatchWithConcurrency:W}=await b(async()=>{const{downloadFromBlob:r,getFileExtension:f,normalizeImageDataUrl:_,processBatchWithConcurrency:h}=await import("./ai-chat-D2kHVW04.js").then(g=>g.sH);return{downloadFromBlob:r,getFileExtension:f,normalizeImageDataUrl:_,processBatchWithConcurrency:h}},__vite__mapDeps([0]),import.meta.url),{unifiedCacheService:A}=await b(async()=>{const{unifiedCacheService:r}=await import("./ai-chat-D2kHVW04.js").then(f=>f.sK);return{unifiedCacheService:r}},__vite__mapDeps([0]),import.meta.url),N=async r=>{const f=await A.getCachedBlob(r);if(!f)throw new Error("未找到可用缓存,且网络下载失败");return f},w=new I,m={exportedAt:d,record:i,files:{script:`${E}.脚本.md`,music:null,manifest:`${E}.manifest.json`,downloadScript:`${E}.补全下载.sh`},shots:u.map((r,f)=>({index:f+1,id:r.id,label:r.label||`镜头 ${f+1}`,startTime:r.startTime,endTime:r.endTime,files:{first:null,last:null,video:null}})),errors:[],downloadEntries:[]};if(w.file(m.files.script,s),l==null||l(c.length>0||o?8:40),o!=null&&o.url){const r=o.plannedFileName||`${E}.音乐.mp3`;m.downloadEntries.push({fileName:r,url:o.url});try{const f=await N(o.url),_=F(o.url,f.type),h=_!=="bin"?_:o.fallbackExtension||"mp3",g=r.replace(/\.[^.]+$/,`.${h}`);w.file(g,f),m.files.music=g,g!==r&&(m.downloadEntries[m.downloadEntries.length-1].fileName=g)}catch(f){m.files.music=r,m.errors.push(o.downloadErrorMessage||"音乐下载失败"),console.error("[workflow-export] Failed to export audio asset:",o.url,f)}}else o!=null&&o.missingErrorMessage&&m.errors.push(o.missingErrorMessage);await W(c,async(r,f)=>{const _=r.type==="image"?U(r.url):r.url,h=m.shots[r.shotIndex],g=r.type==="image"?"png":"mp4",$=`${T(r.shotIndex,r.kind,p)}.${g}`;m.downloadEntries.push({fileName:$,url:_});try{const v=await N(_),y=F(_,v.type),D=y!=="bin"?y:g,x=`${T(r.shotIndex,r.kind,p)}.${D}`;w.file(x,v),h.files[r.kind]=x,x!==$&&(m.downloadEntries[m.downloadEntries.length-1].fileName=x)}catch(v){const y=(h==null?void 0:h.label)||`镜头 ${r.shotIndex+1}`;m.errors.push(`${y} ${r.kind} 下载失败`),h.files[r.kind]=$,console.error("[workflow-export] Failed to export asset:",_,v)}finally{const v=f+1,y=c.length>0?Math.round(v/c.length*62):62;l==null||l(8+y)}},3),w.file(m.files.downloadScript,Y(m.files.manifest),{unixPermissions:493}),w.file(m.files.manifest,JSON.stringify(m,null,2));const B=await w.generateAsync({type:"blob"},r=>l==null?void 0:l(70+Math.round(r.percent*.3))),C=t.replace(/[^a-zA-Z0-9_-]/g,""),O=d.slice(0,19).replace(/[:T]/g,"-"),S=`${a}_${C||n}_${O}.zip`;return L(B,S),l==null||l(100),{assetCount:c.length,zipFileName:S}}export{ae as a,te as b,j as c,ne as d,ee as e,le as f,re as g,oe as r,ie as w};
2
+ import{dd as k,eS as z,r_ as V}from"./ai-chat-BnWVpTEI.js";import{_ as b}from"./startup-runtime-BrfuwjQS.js";async function j(e,t,n){if(e.size===0)throw new Error("Invalid frame blob: size is 0");const a=`/__aitu_cache__/video-frame_${t}_${n}`;return await k.cacheMediaFromBlob(a,e,"image",{metadata:{source:"video-frame",shotId:t,frameType:n}}),a}async function ee(e,t,n){const a=URL.createObjectURL(e),s=document.createElement("video");s.muted=!0,s.preload="auto";try{await new Promise((d,p)=>{s.onloadedmetadata=()=>d(),s.onerror=()=>p(new Error("Failed to load video")),s.src=a});const i=document.createElement("canvas"),u=i.getContext("2d"),o=Math.min(1,320/s.videoWidth);i.width=Math.round(s.videoWidth*o),i.height=Math.round(s.videoHeight*o);const l=[];for(let d=0;d<t.length;d++){n==null||n(d,t.length);try{const p=await R(s,i,u,t[d]);l.push(p)}catch{l.push(null)}}return n==null||n(t.length,t.length),l}finally{URL.revokeObjectURL(a),s.src=""}}async function te(e,t,n,a){const s=a||n,i=document.createElement("video");i.muted=!0,i.preload="auto",i.crossOrigin="anonymous";try{await new Promise((E,I)=>{i.onloadedmetadata=()=>E(),i.onerror=()=>I(new Error("Failed to load video")),i.src=e});const u=document.createElement("canvas"),c=u.getContext("2d"),l=Math.min(1,1280/i.videoWidth);u.width=Math.round(i.videoWidth*l),u.height=Math.round(i.videoHeight*l);const d=s==="first"?Math.min(.1,i.duration):Math.max(0,i.duration-.1),p=await R(i,u,c,d);return await j(p,t,n)}catch{return null}finally{i.src=""}}function R(e,t,n,a){return new Promise((s,i)=>{const u=Math.min(Math.max(0,a),e.duration||0);e.currentTime=u;const c=()=>{e.removeEventListener("seeked",c),n.drawImage(e,0,0,t.width,t.height),t.toBlob(o=>{o&&o.size>0?s(o):i(new Error("toBlob returned empty"))},"image/jpeg",.85)};e.addEventListener("seeked",c)})}const P=/(?:^|[^\d])(?:400|401|402|403|404|413|415|422)(?:[^\d]|$)/,X=[/invalid\s*(?:request|parameters?|argument|input|field|payload|schema)/i,/bad\s*request/i,/unprocessable/i,/unsupported\s*(?:model|parameter|size|duration|resolution|format|input|image|media)?/i,/(?:missing|required)\s*(?:parameter|field|argument|input|prompt|model|duration|size)/i,/requires?\s+(?:a\s+)?(?:reference\s+image|input|image)/i,/(?:must|should)\s+be/i,/no\s+(?:task\s+)?id\s+returned|no\s+video\s+url/i,/\b(?:invalid_argument|invalid_parameter|parameter_invalid|validation_error|bad_request|unsupported_model)\b/i,/参数(?:错误|无效|非法|不正确|校验失败|验证失败)/,/请求(?:参数|数据).*?(?:无效|错误|非法|不支持)/,/缺少(?:必填|必要|参数|字段)/,/必须(?:是|为)|仅支持/,/不支持(?:的)?(?:参数|模型|尺寸|时长|分辨率|格式|图片|视频)/,/未返回(?:任务\s*)?ID|未返回有效的视频 URL/,/(?:校验|验证)失败|格式错误|字段错误/,/内容(?:政策|审核|安全)|安全策略|违规|敏感内容|policy|safety/i,/(?:ip|intellectual\s+property|copyright|trademark)\s*(?:infringement|violation)|涉嫌(?:知识产权|版权|商标|IP)(?:侵权|违规)|知识产权侵权/i];function q(e,t){var n,a;return[(n=e==null?void 0:e.error)==null?void 0:n.code,(a=e==null?void 0:e.error)==null?void 0:a.message,t].filter(s=>typeof s=="string"&&s.trim()!=="").join(" ")}function re(e,t){var s,i;const n=q(e,t);return!n||!(P.test(n)||X.some(u=>u.test(n)))?null:((s=e==null?void 0:e.error)==null?void 0:s.message)||t||((i=e==null?void 0:e.error)==null?void 0:i.code)||"不可重试的视频生成错误"}function ne(e){const{model:t,firstFrameUrl:n,lastFrameUrl:a,extraReferenceUrls:s=[],characterReferenceUrls:i=[]}=e,u=V(t),c=[],o=[],l=(d,p)=>{!d||c.includes(d)||(c.push(d),o.push(p))};if(u.imageUpload.mode==="frames"){l(n,"首帧图:只表示视频起始画面状态,视频必须从这张图开始,优先于故事上下文。"),l(a,"尾帧图:只表示视频结束画面状态,视频应自然过渡到这张图,优先于故事上下文。");const d=c.length>0?c.slice(0,u.imageUpload.maxCount):void 0,p=d?o.slice(0,d.length):void 0,E=i.length>0?i:void 0;return{referenceImages:d,referenceImageDescriptions:p,unusedCharacterReferenceUrls:E}}for(const d of i)if(l(d,"角色参考图:仅用于锁定人物身份、脸型、发型、服装、材质和气质,不表示时间顺序、动作或剧情。"),c.length>=u.imageUpload.maxCount)break;l(n,"首帧图:只表示视频起始画面状态,视频必须从这张图开始,优先于故事上下文。");for(const d of s)if(l(d,"全局/补充参考图:仅用于主体、产品、场景、风格或色彩一致性,不表示时间顺序、动作或剧情。"),c.length>=u.imageUpload.maxCount)break;return{referenceImages:c.length>0?c:void 0,referenceImageDescriptions:o.length>0?o:void 0}}async function ie(e,t){return z(e,{interval:1e3,timeout:1800*1e3,signal:t})}function J(e){return Math.max(2,String(Math.max(e,0)).length)}function M(e,t){return String(e).padStart(t,"0")}function T(e,t,n){const a=M(e+1,n);return t==="first"?`${a}.首帧`:t==="last"?`${a}.尾帧`:`${a}.视频`}function Y(e){return["#!/bin/sh","set -eu","",'cd "$(dirname "$0")"',"",`MANIFEST_FILE=${JSON.stringify(e)}`,"",'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 Z(e){return e.map(t=>({...t,generated_first_frame_url:void 0,generated_last_frame_url:void 0,generated_video_url:void 0,suppressed_generated_urls:G(t)}))}function G(e){const t={...e.suppressed_generated_urls||{}};return e.generated_first_frame_url&&(t.first=e.generated_first_frame_url),e.generated_last_frame_url&&(t.last=e.generated_last_frame_url),e.generated_video_url&&(t.video=e.generated_video_url),Object.keys(t).length>0?t:void 0}function H(e){return e.map(t=>({...t,referenceImageUrl:void 0}))}function oe(e,t){return{shots:Z(e),characters:H(t)}}function ae(e){return e.flatMap((t,n)=>{const a=[];return t.generated_first_frame_url&&a.push({url:t.generated_first_frame_url,type:"image",kind:"first",shotIndex:n}),t.generated_last_frame_url&&a.push({url:t.generated_last_frame_url,type:"image",kind:"last",shotIndex:n}),t.generated_video_url&&a.push({url:t.generated_video_url,type:"video",kind:"video",shotIndex:n}),a})}async function le(e){const{recordId:t,fileNamePrefix:n,zipBaseName:a,scriptMarkdown:s,recordMeta:i,shots:u,assets:c,audioAsset:o,onProgress:l}=e,d=new Date().toISOString(),p=J(u.length),E=M(0,p),{default:I}=await b(async()=>{const{default:r}=await import("./office-data-DMEex_0S.js").then(f=>f.j);return{default:r}},[],import.meta.url),{downloadFromBlob:L,getFileExtension:F,normalizeImageDataUrl:U,processBatchWithConcurrency:W}=await b(async()=>{const{downloadFromBlob:r,getFileExtension:f,normalizeImageDataUrl:_,processBatchWithConcurrency:h}=await import("./ai-chat-BnWVpTEI.js").then(g=>g.sH);return{downloadFromBlob:r,getFileExtension:f,normalizeImageDataUrl:_,processBatchWithConcurrency:h}},__vite__mapDeps([0]),import.meta.url),{unifiedCacheService:A}=await b(async()=>{const{unifiedCacheService:r}=await import("./ai-chat-BnWVpTEI.js").then(f=>f.sK);return{unifiedCacheService:r}},__vite__mapDeps([0]),import.meta.url),N=async r=>{const f=await A.getCachedBlob(r);if(!f)throw new Error("未找到可用缓存,且网络下载失败");return f},w=new I,m={exportedAt:d,record:i,files:{script:`${E}.脚本.md`,music:null,manifest:`${E}.manifest.json`,downloadScript:`${E}.补全下载.sh`},shots:u.map((r,f)=>({index:f+1,id:r.id,label:r.label||`镜头 ${f+1}`,startTime:r.startTime,endTime:r.endTime,files:{first:null,last:null,video:null}})),errors:[],downloadEntries:[]};if(w.file(m.files.script,s),l==null||l(c.length>0||o?8:40),o!=null&&o.url){const r=o.plannedFileName||`${E}.音乐.mp3`;m.downloadEntries.push({fileName:r,url:o.url});try{const f=await N(o.url),_=F(o.url,f.type),h=_!=="bin"?_:o.fallbackExtension||"mp3",g=r.replace(/\.[^.]+$/,`.${h}`);w.file(g,f),m.files.music=g,g!==r&&(m.downloadEntries[m.downloadEntries.length-1].fileName=g)}catch(f){m.files.music=r,m.errors.push(o.downloadErrorMessage||"音乐下载失败"),console.error("[workflow-export] Failed to export audio asset:",o.url,f)}}else o!=null&&o.missingErrorMessage&&m.errors.push(o.missingErrorMessage);await W(c,async(r,f)=>{const _=r.type==="image"?U(r.url):r.url,h=m.shots[r.shotIndex],g=r.type==="image"?"png":"mp4",$=`${T(r.shotIndex,r.kind,p)}.${g}`;m.downloadEntries.push({fileName:$,url:_});try{const v=await N(_),y=F(_,v.type),D=y!=="bin"?y:g,x=`${T(r.shotIndex,r.kind,p)}.${D}`;w.file(x,v),h.files[r.kind]=x,x!==$&&(m.downloadEntries[m.downloadEntries.length-1].fileName=x)}catch(v){const y=(h==null?void 0:h.label)||`镜头 ${r.shotIndex+1}`;m.errors.push(`${y} ${r.kind} 下载失败`),h.files[r.kind]=$,console.error("[workflow-export] Failed to export asset:",_,v)}finally{const v=f+1,y=c.length>0?Math.round(v/c.length*62):62;l==null||l(8+y)}},3),w.file(m.files.downloadScript,Y(m.files.manifest),{unixPermissions:493}),w.file(m.files.manifest,JSON.stringify(m,null,2));const B=await w.generateAsync({type:"blob"},r=>l==null?void 0:l(70+Math.round(r.percent*.3))),C=t.replace(/[^a-zA-Z0-9_-]/g,""),O=d.slice(0,19).replace(/[:T]/g,"-"),S=`${a}_${C||n}_${O}.zip`;return L(B,S),l==null||l(100),{assetCount:c.length,zipFileName:S}}export{ae as a,te as b,j as c,ne as d,ee as e,le as f,re as g,oe as r,ie as w};
@@ -1,4 +1,4 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ai-chat-BlxYfB4O.css","./editor-engines-B8u8agiX.css","./tool-windows-DW-CDfPc.css"])))=>i.map(i=>d[i]);
2
- import{_ as w}from"./startup-runtime-BrfuwjQS.js";import{bp as W,gO as R,b0 as T,bd as M,fy as J,bl as K,b8 as x,bb as P,ba as F,b9 as D,pv as $,fH as Q,pw as B,aD as E,px as G,fF as q,nC as L,py as U,di as N,g0 as Z,Q as S,b$ as j,T as _,pz as b,eS as H,b_ as Y,pA as k,pB as z}from"./ai-chat-D2kHVW04.js";import{ak as C}from"./tool-windows-CSaRGLIT.js";let v=null;function ge(m){v=m}class ee{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=v;if(!t)return{success:!1,error:"画布未初始化",type:"error"};try{const[{setBoard:r},{generatePPT:a}]=await Promise.all([w(()=>import("./ai-chat-D2kHVW04.js").then(o=>o.t2),__vite__mapDeps([0]),import.meta.url),w(()=>import("./ai-chat-D2kHVW04.js").then(o=>o.t3),__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=C.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=v;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 w(async()=>{const{parseMarkdownToCards:l}=await import("./ai-chat-D2kHVW04.js").then(g=>g.sV);return{parseMarkdownToCards:l}},__vite__mapDeps([0]),import.meta.url),{insertCardsToCanvas:n}=await w(async()=>{const{insertCardsToCanvas:l}=await import("./ai-chat-D2kHVW04.js").then(g=>g.sW);return{insertCardsToCanvas:l}},__vite__mapDeps([0]),import.meta.url);let i=a||this.getInsertionPoint(t),c=0;for(const l of r){const{type:g,content:u,metadata:h}=l;switch(g){case"text":{const p=o(u);if(p&&p.length>0){const I=Math.round(window.innerWidth*.5);n(t,p,i,I);const A=Math.min(p.length,3),X=Math.ceil(p.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 D(t,u,i,!1,{width:400,height:400},!1,!0,!1,!0),i=[i[0],i[1]+400+s],c++;break;case"video":await F(t,u,i),i=[i[0],i[1]+300+s],c++;break;case"audio":await P(t,u,h,i,!1,!0),i=[i[0],i[1]+160+s],c++;break;case"svg":{const I={url:this.svgToDataUrl(u),width:400,height:400};x.insertImage(t,I,i),i=[i[0],i[1]+400+s],c++;break}}}const d=a||this.getInsertionPoint(t);return requestAnimationFrame(()=>{T(t,d)}),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=v;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:d,content:l,metadata:g}=c;switch(d){case"image":await D(t,l,n,!1,{width:400,height:400},!1,!0,!1,!0),n=[n[0],n[1]+400+s],i++;break;case"video":await F(t,l,n),n=[n[0],n[1]+300+s],i++;break;case"audio":await P(t,l,g,n,!1,!0),n=[n[0],n[1]+160+s],i++;break;case"text":x.insertText(t,n,l),n=[n[0],n[1]+100+s],i++;break;case"svg":const h={url:this.svgToDataUrl(l),width:400,height:400};x.insertImage(t,h,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=v;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 w(async()=>{const{parseMermaidToDrawnix:l}=await import("./index-CBf-BvIi.js");return{parseMermaidToDrawnix:l}},__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),d=this.insertElementsToCanvasAtPoint(t,n,c);return d.success&&(requestAnimationFrame(()=>{this.centerInsertedElementsInViewport(t,n.length)}),i&&setTimeout(()=>{C.removeWorkZone(t,i.id),window.dispatchEvent(new CustomEvent("ai-generation-complete",{detail:{type:"mermaid",success:!0}}))},100)),{success:d.success,data:{elementsCount:d.elementsCount},type:"canvas",error:d.error}}catch(a){return console.error("[SWCapabilities] Mermaid conversion failed:",a),{success:!1,error:`Mermaid 转换失败: ${a.message}`,type:"error"}}}async handleMindmap(e){const t=v;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 w(async()=>{const{parseMarkdownToDrawnix:d}=await import("./index-CHHy4efO.js");return{parseMarkdownToDrawnix:d}},__vite__mapDeps([0,1]),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(()=>{C.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=v;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),d=i.height/i.width,l=c*d,g=this.svgToDataUrl(n);let u=s||this.getInsertionPoint(t);u=[u[0]-c/2,u[1]];const h={url:g,width:c,height:l};x.insertImage(t,h,u);const p=[u[0]+c/2,u[1]+l/2];return requestAnimationFrame(()=>{T(t,p)}),{success:!0,data:{width:c,height:l},type:"canvas"}}catch(o){return{success:!1,error:`SVG 插入失败: ${o.message}`,type:"error"}}}async handleGridImage(e){try{const{createGridImageTask:t}=await w(async()=>{const{createGridImageTask:a}=await import("./tool-windows-CSaRGLIT.js").then(s=>s.aX);return{createGridImageTask:a}},__vite__mapDeps([0,2]),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 w(async()=>{const{createInspirationBoardTask:a}=await import("./tool-windows-CSaRGLIT.js").then(s=>s.aY);return{createInspirationBoardTask:a}},__vite__mapDeps([0,2]),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=v;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 w(async()=>{const{splitAndInsertImages:o}=await import("./ai-chat-D2kHVW04.js").then(n=>n.s$);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 w(async()=>{const{createLongVideoTask:a}=await import("./tool-windows-CSaRGLIT.js").then(s=>s.a_);return{createLongVideoTask:a}},__vite__mapDeps([0,2]),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 w(async()=>{const{analyzeWithAI:s}=await import("./tool-windows-CSaRGLIT.js").then(o=>o.aZ);return{analyzeWithAI:s}},__vite__mapDeps([0,2]),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 w(async()=>{const{createImageTask:s}=await import("./ai-chat-D2kHVW04.js").then(o=>o.sP);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 w(async()=>{const{createVideoTask:s}=await import("./ai-chat-D2kHVW04.js").then(o=>o.t0);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=W(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=W(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,R.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,R.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=M.getBoardContainer(e).getBoundingClientRect(),a=e.viewport.zoom,s=J(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=W(e,a,!1),n=M.getBoardContainer(e).getBoundingClientRect(),i=80,c=n.width-i*2,d=n.height-i*2,l=c/s.width,g=d/s.height;let u=Math.min(l,g);u=Math.min(Math.max(u,.2),1.5);const h=s.x+s.width/2,p=s.y+s.height/2,I=h-n.width/(2*u),A=p-n.height/(2*u);K.updateViewport(e,[I,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 ee,y=Q.WORKFLOWS;class te{async isAvailable(){try{return(await $()).objectStoreNames.contains(y)}catch{return!1}}async getDB(){return $()}async saveWorkflow(e){try{const t=await this.getDB();if(!t.objectStoreNames.contains(y))return;await new Promise((r,a)=>{const n=t.transaction(y,"readwrite").objectStore(y).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(y,"readonly").objectStore(y).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(y,"readwrite").objectStore(y).delete(e);n.onerror=()=>a(n.error),n.onsuccess=()=>r()})}close(){}}const f=new te;function re(m){const e=m.steps.find(t=>t.status==="failed");return(e==null?void 0:e.error)||"Unknown error"}function ae(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 se(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 ne(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,assetMetadata:e.assetMetadata,promptMeta:e.promptMeta,params:se(e)}}async function oe(m,e={}){var g,u;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=ne(a.prompt,e),i=N("image",e.modelRef||e.model||null);await Z.createTask(s,"image",n,i),S.trackExternalTask({id:s,type:E.IMAGE,status:_.PROCESSING,params:n,createdAt:o,updatedAt:o,startedAt:o,invocationRoute:i,executionPhase:j.SUBMITTING}),(g=e.onTaskCreated)==null||g.call(e,s);const c={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,assetMetadata:e.assetMetadata,params:e.params};await(e.forceMainThread?b.getFallbackExecutor():await b.getExecutor()).generateImage(c,{signal:e.signal});const l=await H(s,{signal:e.signal,onProgress:h=>{S.syncTaskFromStorage(s,h)}});return!l.success||!l.task?{task:l.task||{id:s,type:E.IMAGE,status:_.FAILED,params:{prompt:m},createdAt:Date.now(),updatedAt:Date.now(),error:{code:"GENERATION_ERROR",message:l.error||"图片生成失败"}}}:{task:l.task,url:(u=l.task.result)==null?void 0:u.url}}async function ie(m,e={}){var l,g,u;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(),n=N("video",e.modelRef||e.model||"veo3");await Z.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},n),S.trackExternalTask({id:s,type:E.VIDEO,status:_.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,invocationRoute:n,executionPhase:j.SUBMITTING,progress:0}),(l=e.onTaskCreated)==null||l.call(e,s);const i={taskId:s,prompt:a.prompt,model:e.model||"veo3",modelRef:e.modelRef||null,duration:(g=e.duration)==null?void 0:g.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(i,{signal:e.signal});const d=await H(s,{signal:e.signal,onProgress:h=>{S.syncTaskFromStorage(s,h)}});return!d.success||!d.task?{task:d.task||{id:s,type:E.VIDEO,status:_.FAILED,params:{prompt:m},createdAt:Date.now(),updatedAt:Date.now(),error:{code:"GENERATION_ERROR",message:d.error||"视频生成失败"}}}:{task:d.task,url:(u=d.task.result)==null?void 0:u.url}}class V{constructor(e={}){this.workflows=new Map,this.abortControllers=new Map,this.events$=new Y,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=re(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=ae(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 oe(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===_.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 ie(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===_.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 d=`${t.id}-insert-text`;if(!e.steps.find(l=>l.id===d)){const l={id:d,mcp:"insert_to_canvas",args:{items:[{type:"text",content:c}]},description:"将生成文本插入画布",status:"pending"};e.steps.push(l),await f.saveWorkflow(e),this.emitEvent({type:"steps_added",workflowId:e.id,steps:[l]})}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 d of c.addSteps)e.steps.find(l=>l.id===d.id)||e.steps.push({id:d.id,mcp:d.mcp,args:d.args,description:d.description,status:d.status});await f.saveWorkflow(e),this.emitEvent({type:"steps_added",workflowId:e.id,steps:e.steps.filter(d=>d.status==="pending")})}else if(c.content&&c.content.trim()){const d=`${t.id}-insert-text`;if(!e.steps.find(l=>l.id===d)){const l=((o=e.metadata)==null?void 0:o.rawInput)||"",g=l.trim()?`# ${l.trim()}
2
+ import{_ as w}from"./startup-runtime-BrfuwjQS.js";import{bp as W,gO as R,b0 as T,bd as M,fy as J,bl as K,b8 as x,bb as P,ba as F,b9 as D,pv as $,fH as Q,pw as B,aD as E,px as G,fF as q,nC as L,py as U,di as N,g0 as Z,Q as S,b$ as j,T as _,pz as b,eS as H,b_ as Y,pA as k,pB as z}from"./ai-chat-BnWVpTEI.js";import{ak as C}from"./tool-windows-Bf_pMml-.js";let v=null;function ge(m){v=m}class ee{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=v;if(!t)return{success:!1,error:"画布未初始化",type:"error"};try{const[{setBoard:r},{generatePPT:a}]=await Promise.all([w(()=>import("./ai-chat-BnWVpTEI.js").then(o=>o.t2),__vite__mapDeps([0]),import.meta.url),w(()=>import("./ai-chat-BnWVpTEI.js").then(o=>o.t3),__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=C.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=v;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 w(async()=>{const{parseMarkdownToCards:l}=await import("./ai-chat-BnWVpTEI.js").then(g=>g.sV);return{parseMarkdownToCards:l}},__vite__mapDeps([0]),import.meta.url),{insertCardsToCanvas:n}=await w(async()=>{const{insertCardsToCanvas:l}=await import("./ai-chat-BnWVpTEI.js").then(g=>g.sW);return{insertCardsToCanvas:l}},__vite__mapDeps([0]),import.meta.url);let i=a||this.getInsertionPoint(t),c=0;for(const l of r){const{type:g,content:u,metadata:h}=l;switch(g){case"text":{const p=o(u);if(p&&p.length>0){const I=Math.round(window.innerWidth*.5);n(t,p,i,I);const A=Math.min(p.length,3),X=Math.ceil(p.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 D(t,u,i,!1,{width:400,height:400},!1,!0,!1,!0),i=[i[0],i[1]+400+s],c++;break;case"video":await F(t,u,i),i=[i[0],i[1]+300+s],c++;break;case"audio":await P(t,u,h,i,!1,!0),i=[i[0],i[1]+160+s],c++;break;case"svg":{const I={url:this.svgToDataUrl(u),width:400,height:400};x.insertImage(t,I,i),i=[i[0],i[1]+400+s],c++;break}}}const d=a||this.getInsertionPoint(t);return requestAnimationFrame(()=>{T(t,d)}),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=v;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:d,content:l,metadata:g}=c;switch(d){case"image":await D(t,l,n,!1,{width:400,height:400},!1,!0,!1,!0),n=[n[0],n[1]+400+s],i++;break;case"video":await F(t,l,n),n=[n[0],n[1]+300+s],i++;break;case"audio":await P(t,l,g,n,!1,!0),n=[n[0],n[1]+160+s],i++;break;case"text":x.insertText(t,n,l),n=[n[0],n[1]+100+s],i++;break;case"svg":const h={url:this.svgToDataUrl(l),width:400,height:400};x.insertImage(t,h,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=v;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 w(async()=>{const{parseMermaidToDrawnix:l}=await import("./index-CpHWUe__.js");return{parseMermaidToDrawnix:l}},__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),d=this.insertElementsToCanvasAtPoint(t,n,c);return d.success&&(requestAnimationFrame(()=>{this.centerInsertedElementsInViewport(t,n.length)}),i&&setTimeout(()=>{C.removeWorkZone(t,i.id),window.dispatchEvent(new CustomEvent("ai-generation-complete",{detail:{type:"mermaid",success:!0}}))},100)),{success:d.success,data:{elementsCount:d.elementsCount},type:"canvas",error:d.error}}catch(a){return console.error("[SWCapabilities] Mermaid conversion failed:",a),{success:!1,error:`Mermaid 转换失败: ${a.message}`,type:"error"}}}async handleMindmap(e){const t=v;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 w(async()=>{const{parseMarkdownToDrawnix:d}=await import("./index-BJ-vS89P.js");return{parseMarkdownToDrawnix:d}},__vite__mapDeps([0,1]),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(()=>{C.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=v;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),d=i.height/i.width,l=c*d,g=this.svgToDataUrl(n);let u=s||this.getInsertionPoint(t);u=[u[0]-c/2,u[1]];const h={url:g,width:c,height:l};x.insertImage(t,h,u);const p=[u[0]+c/2,u[1]+l/2];return requestAnimationFrame(()=>{T(t,p)}),{success:!0,data:{width:c,height:l},type:"canvas"}}catch(o){return{success:!1,error:`SVG 插入失败: ${o.message}`,type:"error"}}}async handleGridImage(e){try{const{createGridImageTask:t}=await w(async()=>{const{createGridImageTask:a}=await import("./tool-windows-Bf_pMml-.js").then(s=>s.aX);return{createGridImageTask:a}},__vite__mapDeps([0,2]),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 w(async()=>{const{createInspirationBoardTask:a}=await import("./tool-windows-Bf_pMml-.js").then(s=>s.aY);return{createInspirationBoardTask:a}},__vite__mapDeps([0,2]),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=v;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 w(async()=>{const{splitAndInsertImages:o}=await import("./ai-chat-BnWVpTEI.js").then(n=>n.s$);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 w(async()=>{const{createLongVideoTask:a}=await import("./tool-windows-Bf_pMml-.js").then(s=>s.a_);return{createLongVideoTask:a}},__vite__mapDeps([0,2]),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 w(async()=>{const{analyzeWithAI:s}=await import("./tool-windows-Bf_pMml-.js").then(o=>o.aZ);return{analyzeWithAI:s}},__vite__mapDeps([0,2]),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 w(async()=>{const{createImageTask:s}=await import("./ai-chat-BnWVpTEI.js").then(o=>o.sP);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 w(async()=>{const{createVideoTask:s}=await import("./ai-chat-BnWVpTEI.js").then(o=>o.t0);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=W(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=W(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,R.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,R.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=M.getBoardContainer(e).getBoundingClientRect(),a=e.viewport.zoom,s=J(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=W(e,a,!1),n=M.getBoardContainer(e).getBoundingClientRect(),i=80,c=n.width-i*2,d=n.height-i*2,l=c/s.width,g=d/s.height;let u=Math.min(l,g);u=Math.min(Math.max(u,.2),1.5);const h=s.x+s.width/2,p=s.y+s.height/2,I=h-n.width/(2*u),A=p-n.height/(2*u);K.updateViewport(e,[I,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 ee,y=Q.WORKFLOWS;class te{async isAvailable(){try{return(await $()).objectStoreNames.contains(y)}catch{return!1}}async getDB(){return $()}async saveWorkflow(e){try{const t=await this.getDB();if(!t.objectStoreNames.contains(y))return;await new Promise((r,a)=>{const n=t.transaction(y,"readwrite").objectStore(y).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(y,"readonly").objectStore(y).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(y,"readwrite").objectStore(y).delete(e);n.onerror=()=>a(n.error),n.onsuccess=()=>r()})}close(){}}const f=new te;function re(m){const e=m.steps.find(t=>t.status==="failed");return(e==null?void 0:e.error)||"Unknown error"}function ae(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 se(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 ne(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,assetMetadata:e.assetMetadata,promptMeta:e.promptMeta,params:se(e)}}async function oe(m,e={}){var g,u;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=ne(a.prompt,e),i=N("image",e.modelRef||e.model||null);await Z.createTask(s,"image",n,i),S.trackExternalTask({id:s,type:E.IMAGE,status:_.PROCESSING,params:n,createdAt:o,updatedAt:o,startedAt:o,invocationRoute:i,executionPhase:j.SUBMITTING}),(g=e.onTaskCreated)==null||g.call(e,s);const c={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,assetMetadata:e.assetMetadata,params:e.params};await(e.forceMainThread?b.getFallbackExecutor():await b.getExecutor()).generateImage(c,{signal:e.signal});const l=await H(s,{signal:e.signal,onProgress:h=>{S.syncTaskFromStorage(s,h)}});return!l.success||!l.task?{task:l.task||{id:s,type:E.IMAGE,status:_.FAILED,params:{prompt:m},createdAt:Date.now(),updatedAt:Date.now(),error:{code:"GENERATION_ERROR",message:l.error||"图片生成失败"}}}:{task:l.task,url:(u=l.task.result)==null?void 0:u.url}}async function ie(m,e={}){var l,g,u;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(),n=N("video",e.modelRef||e.model||"veo3");await Z.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},n),S.trackExternalTask({id:s,type:E.VIDEO,status:_.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,invocationRoute:n,executionPhase:j.SUBMITTING,progress:0}),(l=e.onTaskCreated)==null||l.call(e,s);const i={taskId:s,prompt:a.prompt,model:e.model||"veo3",modelRef:e.modelRef||null,duration:(g=e.duration)==null?void 0:g.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(i,{signal:e.signal});const d=await H(s,{signal:e.signal,onProgress:h=>{S.syncTaskFromStorage(s,h)}});return!d.success||!d.task?{task:d.task||{id:s,type:E.VIDEO,status:_.FAILED,params:{prompt:m},createdAt:Date.now(),updatedAt:Date.now(),error:{code:"GENERATION_ERROR",message:d.error||"视频生成失败"}}}:{task:d.task,url:(u=d.task.result)==null?void 0:u.url}}class V{constructor(e={}){this.workflows=new Map,this.abortControllers=new Map,this.events$=new Y,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=re(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=ae(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 oe(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===_.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 ie(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===_.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 d=`${t.id}-insert-text`;if(!e.steps.find(l=>l.id===d)){const l={id:d,mcp:"insert_to_canvas",args:{items:[{type:"text",content:c}]},description:"将生成文本插入画布",status:"pending"};e.steps.push(l),await f.saveWorkflow(e),this.emitEvent({type:"steps_added",workflowId:e.id,steps:[l]})}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 d of c.addSteps)e.steps.find(l=>l.id===d.id)||e.steps.push({id:d.id,mcp:d.mcp,args:d.args,description:d.description,status:d.status});await f.saveWorkflow(e),this.emitEvent({type:"steps_added",workflowId:e.id,steps:e.steps.filter(d=>d.status==="pending")})}else if(c.content&&c.content.trim()){const d=`${t.id}-insert-text`;if(!e.steps.find(l=>l.id===d)){const l=((o=e.metadata)==null?void 0:o.rawInput)||"",g=l.trim()?`# ${l.trim()}
3
3
 
4
4
  `:"",u={id:d,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 ce{constructor(){this.events$=new Y,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 k.isAvailable()&&(e=await k.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=[]){var l,g;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);const n=e.extraParams?{...e.extraParams}:void 0;e.modelId==="happyhorse-1.0-video-edit"&&((g=(l=e.selection)==null?void 0:l.videos)!=null&&g[0])?o.params={...n||{},input_video:(n==null?void 0:n.input_video)||e.selection.videos[0]}:n&&(o.params=n);const i=[],c=e.count||1;for(let u=0;u<c;u++)i.push({id:`step_${u}_${Math.random().toString(36).substr(2,9)}`,mcp:s,args:{...o,count:1},description:e.generationType==="video"?`生成视频 ${u+1}/${c}`:`生成图片 ${u+1}/${c}`,status:"pending"});return{id:r,name:e.generationType==="video"?"视频生成":"图片生成",steps:i,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),k.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){k.invalidateCache(),this.fallbackEngine&&await this.fallbackEngine.cancelWorkflow(e)}getWorkflow(e){return this.workflows.get(e)}async queryWorkflowStatus(e){try{if(await k.isAvailable()){const t=await k.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 k.isAvailable()){const e=await k.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 le=new ce,fe=Object.freeze(Object.defineProperty({__proto__:null,workflowSubmissionService:le},Symbol.toStringTag,{value:"Module"}));export{fe as a,ge as s,le as w};
package/changelog.json CHANGED
@@ -1,28 +1,109 @@
1
1
  {
2
2
  "versions": [
3
3
  {
4
- "version": "1.0.1",
5
- "date": "2026-06-11",
4
+ "version": "1.0.2",
5
+ "date": "2026-06-27",
6
6
  "changes": {
7
7
  "features": [
8
- "reply to workflow image results"
8
+ "新增 omni-flash 视频模型支持",
9
+ "画布图片选中状态锁定优化",
10
+ "供应商设置增加「图片优先使用异步接口」开关",
11
+ "sync media library batch select functionality across AIInputBar and EnhancedChatInput",
12
+ "reply to workflow image results",
13
+ "添加批量插入功能",
14
+ "为绘图工具添加键盘快捷键调整大小功能",
15
+ "support AI image mask editing",
16
+ "优化长提示词输入框展开体验",
17
+ "add image generate-again prefill",
18
+ "为视频生成 prompt 添加参考图用途说明",
19
+ "支持异步图片生成和生成素材重置",
20
+ "添加目标总时长配置并优化UI与错误处理",
21
+ "优化价格展示增加Bussiness",
22
+ "优化视频工作流批量生成",
23
+ "add image 3d transform panel",
24
+ "在历史记录中显示创建时间并调整排序",
25
+ "新增 HappyHorse 视频模型支持并重构工作流外壳",
26
+ "完善多图生成视觉提示词工作流",
27
+ "优化多图生成提示词预览",
28
+ "支持完整环境备份与覆盖恢复",
29
+ "添加PPT生成参考图片支持并修复React组件卸载问题"
9
30
  ],
10
31
  "fixes": [
11
- "支持无分界线拼图智能拆图"
32
+ "支持无分界线拼图智能拆图",
33
+ "统一图片尺寸计算机制,修复批量插入叠加问题",
34
+ "修复图片尺寸相关问题(真实尺寸更新、批量插入叠加)",
35
+ "补修 MCP 路径 lockReferenceDimensions=true,更新完整审计文档",
36
+ "修复图片生成比例错误和 API 参数兼容性问题 | 修复 buildImageRequestBody 中 size 为比例格式时未转换像素尺寸(所有非1:1比例都生成1:1) | 移除 response_format url 参数(rix API 不支持) | 修复 lockReferenceDimensions 导致非正方形图片被压缩",
37
+ "修复 MJ 运行时模型参数与调度路由",
38
+ "修复异步图片接口开关路由",
39
+ "移除图片接口默认 response_format",
40
+ "异步接口开关持久化 + 图片任务刷新后恢复轮询",
41
+ "split batch media action copy by target context",
42
+ "support bulk media insertion and image generation compatibility",
43
+ "修复批量导入图片弹窗显示异常",
44
+ "修复蒙版画笔导出和预览样式问题",
45
+ "keep send button visible",
46
+ "resume async image tasks after reload",
47
+ "优化参考图描述和提示词优先级协议",
48
+ "allow hand panning while drawing",
49
+ "address regenerate prefill review findings",
50
+ "移除生成视频时重复的提示词构建逻辑",
51
+ "强化爆款视频首尾帧角色一致性",
52
+ "绑定异步任务供应商路由",
53
+ "parallelize character reference generation",
54
+ "pass image transform context to AI",
55
+ "优化页面卡片布局并修复提示词回填逻辑",
56
+ "强化历史收藏入口并放宽 AI 并发",
57
+ "防止复制粘贴事件在可编辑元素中触发",
58
+ "修正任务队列批量序号显示",
59
+ "修复多图生成队列参数并记录经验",
60
+ "优化媒体预览缩放同步",
61
+ "优化媒体预览自适应展示",
62
+ "修复 Milkdown 节点上下文注册顺序",
63
+ "改进部署包关键资源检查逻辑",
64
+ "修复图片生成完成后画布自动插入卡住",
65
+ "改进动态导入错误恢复机制并优化错误处理",
66
+ "guard toImage fetch failures"
12
67
  ],
13
68
  "improvements": [
14
69
  "同步 1.0.0 前端版本元数据",
70
+ "更新版本号至0.9.6并同步构建时间",
71
+ "更新版本号至0.9.2并刷新构建时间",
72
+ "更新应用版本号至0.6.99并同步构建时间",
73
+ "补充视频主体引用经验",
74
+ "更新应用版本号至0.6.95并刷新构建时间",
75
+ "更新应用版本号至0.6.94并刷新构建时间",
76
+ "更新应用版本号至0.6.92并同步构建时间",
77
+ "同步 0.6.91 Web 版本元数据",
78
+ "更新应用版本号至0.6.89",
79
+ "添加 mermaid 依赖用于图表渲染",
80
+ "更新应用版本号至0.6.88并同步构建时间",
81
+ "更新应用版本号至0.6.87并同步构建时间",
15
82
  "修复 PR190 合并阻塞问题",
16
83
  "修复 CI pnpm 缺失导致构建失败",
17
84
  "Disable CDN entry asset rewrites",
18
85
  "修复 PR185 硬边界拆图误判风险",
19
86
  "修复 PR188 文本内容数组归一化",
20
87
  "修复多图生成 JSON 解析和默认模型迁移",
21
- "修复首帧生图窗口复用状态"
88
+ "修复首帧生图窗口复用状态",
89
+ "文档:补充模型分类优先级经验",
90
+ "调整运行时模型分类优先级并补充 category 回归测试",
91
+ "修复:同步聊天抽屉素材库批量选择",
92
+ "更新应用版本到 0.9.8",
93
+ "Refactor canvas batch insertion to viewport flow layout",
94
+ "修复对话输入框内层描边并抽出共享壳",
95
+ "聊天抽屉图片预览收口到列表层",
96
+ "补充首屏壳层与 chunk 守门经验",
97
+ "修复素材库配色与多选架构,补充UI规范和架构说明",
98
+ "修复:蒙版预览缓存不进入素材库",
99
+ "Bump web app version to 0.9.7",
100
+ "Stop idle-prefetch retries from blocking SW updates",
101
+ "Refresh docs, CI, and Docker build",
102
+ "perf(changelog): 限制解析的版本数量以避免内存问题"
22
103
  ]
23
104
  },
24
105
  "type": "patch",
25
- "highlights": "reply to workflow image results"
106
+ "highlights": "新增 omni-flash 视频模型支持"
26
107
  },
27
108
  {
28
109
  "version": "1.0.0",