aitu-app 1.0.0 → 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 (106) hide show
  1. package/README.md +3 -3
  2. package/assets/{CanvasAudioPlayer-DyUPmMV6.js → CanvasAudioPlayer-HtUs8HDj.js} +2 -2
  3. package/assets/ComicCreator-DhxXCyJR.js +43 -0
  4. package/assets/{DeferredAIInputBar-Cq0t7wNK.js → DeferredAIInputBar-B2R2-2RU.js} +3 -3
  5. package/assets/{DrawnixDeferredFeatures-B9y0GPYR.js → DrawnixDeferredFeatures-DHTr0c-V.js} +2 -2
  6. package/assets/{KnowledgeBaseContent-C8zmce09.js → KnowledgeBaseContent-CAq5kXdt.js} +6 -6
  7. package/assets/{MVCreator-Bl8GH4mR.js → MVCreator-B9uaRsGE.js} +16 -16
  8. package/assets/{ModelBenchmarkWorkbench-BwfeZDt-.js → ModelBenchmarkWorkbench-CK33zizl.js} +1 -1
  9. package/assets/{MusicAnalyzer-CdMhl-kU.js → MusicAnalyzer-D2NTonEA.js} +1 -1
  10. package/assets/{PromptHistoryTool-CCxoST3H.js → PromptHistoryTool-q6vOxFr6.js} +1 -1
  11. package/assets/{ResizableDivider-D1jgqdmh.js → ResizableDivider-BvT-DCEo.js} +2 -2
  12. package/assets/{TaskQueuePanel-WF6aq1G7.js → TaskQueuePanel-PayswYlG.js} +1 -1
  13. package/assets/{VideoAnalyzer-BOqRFjZ9.js → VideoAnalyzer-DnowtohS.js} +1 -1
  14. package/assets/{VideoAnalyzer-BrEKSLeh.js → VideoAnalyzer-DoaGlK92.js} +2 -2
  15. package/assets/{ai-chat-DbjmzngX.css → ai-chat-BlxYfB4O.css} +1 -1
  16. package/assets/ai-chat-BnWVpTEI.js +2977 -0
  17. package/assets/{batch-image-generation-DyWeiTsw.js → batch-image-generation-CkmX4dem.js} +5 -5
  18. package/assets/{bootstrap-DadYvnge.js → bootstrap-CQRLkOtk.js} +7 -7
  19. package/assets/{clean-confirm-CpWpcTF5.js → clean-confirm-CIViVQ8s.js} +1 -1
  20. package/assets/{diagram-engines-C0Ljec4Z.js → diagram-engines-DpAsX7pc.js} +3 -3
  21. package/assets/{editor-engines-Dz5Mk5YB.js → editor-engines-9_72Ghfn.js} +1 -1
  22. package/assets/{external-skill-service-BQUJLLLc.js → external-skill-service-BN8ZCtPn.js} +1 -1
  23. package/assets/{frame-size-matcher-2sxA9X-P.js → frame-size-matcher-9rxQ-bAY.js} +1 -1
  24. package/assets/{index-CRuDVxTu.js → index-291TeU7i.js} +1 -1
  25. package/assets/{index-BNtKpMlh.js → index-BJ-vS89P.js} +1 -1
  26. package/assets/{index-Ct7MFvFo.js → index-BSZAS0wO.js} +1 -1
  27. package/assets/{index-BfdBtWT6.js → index-C7DAD_xK.js} +1 -1
  28. package/assets/{index-o8hm5yhT.js → index-CIgiIDgZ.js} +1 -1
  29. package/assets/{index-BwW4Qp-A.js → index-CpHWUe__.js} +1 -1
  30. package/assets/{index-D7UBK5T7.js → index-D1LQ9eQM.js} +1 -1
  31. package/assets/{index-D_Yn26AT.js → index-DRGxmFyd.js} +1 -1
  32. package/assets/{index-CBMgStgL.js → index-DmtcRYr8.js} +1 -1
  33. package/assets/{index.es-CYBRnsv6.js → index.es-Ch45-H39.js} +1 -1
  34. package/assets/{jspdf.es.min-I7TkFvGI.js → jspdf.es.min-bNprb1JY.js} +3 -3
  35. package/assets/{link-popup-fCfgZp17.js → link-popup-B6ReK6iq.js} +1 -1
  36. package/assets/{markdown-to-drawnix-3yksNvbU.js → markdown-to-drawnix-BqT-3zQO.js} +3 -3
  37. package/assets/{mermaid-to-drawnix-C7rF-30X.js → mermaid-to-drawnix-CSctnpU0.js} +3 -3
  38. package/assets/{model-benchmark-launcher-uYoranwQ.js → model-benchmark-launcher-DNMp2MLQ.js} +1 -1
  39. package/assets/{photo-wall-splitter-CfRBAwCy.js → photo-wall-splitter-DhBTEpdG.js} +1 -1
  40. package/assets/{popup-toolbar-tKtYPGvw.js → popup-toolbar-BChsudwW.js} +7 -7
  41. package/assets/{prompt-utils-C_mjEqkz.js → prompt-utils-BX0pRV-Z.js} +1 -1
  42. package/assets/quick-creation-toolbar-3-AYFpEF.js +2 -0
  43. package/assets/{settings-dialog-DfK6bcBd.js → settings-dialog-Ccemaout.js} +1 -1
  44. package/assets/{size-picker-DvMt8S3Z.js → size-picker-DTrdjyLh.js} +1 -1
  45. package/assets/{skill-dsl-parser-CTM4hEIp.js → skill-dsl-parser-ZR--uu5h.js} +1 -1
  46. package/assets/{startup-app-9gZEGv85.js → startup-app-CH3QzBb4.js} +2 -2
  47. package/assets/{task-sync-D7bw59_K.js → task-sync-C5XXOQ5m.js} +1 -1
  48. package/assets/{tool-windows-BnDZa9FH.js → tool-windows-Bf_pMml-.js} +6 -6
  49. package/assets/ttd-dialog-CohjwODB.js +6 -0
  50. package/assets/{ttd-dialog-submit-shortcut-UfHT9Z9k.js → ttd-dialog-submit-shortcut-BVB8O_wE.js} +1 -1
  51. package/assets/{useCharacters-6u0Wuwt4.js → useCharacters-CFlPvydq.js} +1 -1
  52. package/assets/{useWorkflowSubmission-DTWha6Vn.js → useWorkflowSubmission-CKkOEcAT.js} +3 -3
  53. package/assets/{video-merge-webcodecs-Cwy2df91.js → video-merge-webcodecs-BInWo9HA.js} +2 -2
  54. package/assets/{video-recovery-service-CgZ3pA_1.js → video-recovery-service-DITdD0pC.js} +1 -1
  55. package/assets/{workflow-generation-utils-BPT49S-Z.js → workflow-generation-utils-e0nRpAgJ.js} +3 -3
  56. package/assets/{workflow-submission-service-C-6Uf9FA.js → workflow-submission-service-BqiL_5Cj.js} +3 -3
  57. package/changelog.json +105 -6
  58. package/idle-prefetch-manifest.json +136 -288
  59. package/manifest.json +3 -3
  60. package/package.json +1 -1
  61. package/precache-manifest.json +6 -6
  62. package/sw.js +1 -1
  63. package/version.json +63 -3
  64. package/.DS_Store +0 -0
  65. package/assets/ComicCreator-DjOhYrZt.js +0 -43
  66. package/assets/ai-chat-B-XdoWBQ.js +0 -2976
  67. package/assets/quick-creation-toolbar-CrQ0g0kO.js +0 -2
  68. package/assets/ttd-dialog-DS6KiOOa.js +0 -6
  69. package/assets/useMediaViewer-BrBFopM-.js +0 -1
  70. 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
  71. package/user-manual/screenshots/ai-step-0.png +0 -0
  72. package/user-manual/screenshots/ai-step-1.png +0 -0
  73. package/user-manual/screenshots/ai-step-2.png +0 -0
  74. package/user-manual/screenshots/ai-step-3.png +0 -0
  75. package/user-manual/screenshots/app-menu.png +0 -0
  76. package/user-manual/screenshots/backup-restore.png +0 -0
  77. package/user-manual/screenshots/canvas-tools.png +0 -0
  78. package/user-manual/screenshots/debug-panel.png +0 -0
  79. package/user-manual/screenshots/drawing-step-0.png +0 -0
  80. package/user-manual/screenshots/drawing-step-1.png +0 -0
  81. package/user-manual/screenshots/drawing-step-2.png +0 -0
  82. package/user-manual/screenshots/edit-selected.png +0 -0
  83. package/user-manual/screenshots/element-selected.png +0 -0
  84. package/user-manual/screenshots/flowchart-step-1.png +0 -0
  85. package/user-manual/screenshots/flowchart-step-2.png +0 -0
  86. package/user-manual/screenshots/flowchart-step-3.png +0 -0
  87. package/user-manual/screenshots/image-preview-empty.png +0 -0
  88. package/user-manual/screenshots/insert-from-library.png +0 -0
  89. package/user-manual/screenshots/insert-tools.png +0 -0
  90. package/user-manual/screenshots/inspiration-step-1.png +0 -0
  91. package/user-manual/screenshots/inspiration-step-2.png +0 -0
  92. package/user-manual/screenshots/media-library.png +0 -0
  93. package/user-manual/screenshots/mindmap-step-1.png +0 -0
  94. package/user-manual/screenshots/mindmap-step-2.png +0 -0
  95. package/user-manual/screenshots/mindmap-toolbar-menu.png +0 -0
  96. package/user-manual/screenshots/project-drawer.png +0 -0
  97. package/user-manual/screenshots/settings-dialog.png +0 -0
  98. package/user-manual/screenshots/shape-step-1.png +0 -0
  99. package/user-manual/screenshots/shape-step-2.png +0 -0
  100. package/user-manual/screenshots/text-step-1.png +0 -0
  101. package/user-manual/screenshots/text-step-2.png +0 -0
  102. package/user-manual/screenshots/toolbox-drawer.png +0 -0
  103. package/user-manual/screenshots/toolbox-entry.png +0 -0
  104. package/user-manual/screenshots/video-entry.png +0 -0
  105. package/user-manual/screenshots/view-navigation.png +0 -0
  106. package/user-manual/screenshots/zoom-menu.png +0 -0
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ai-chat-DbjmzngX.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 U,nC as q,py as L,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 O}from"./ai-chat-B-XdoWBQ.js";import{ak as C}from"./tool-windows-BnDZa9FH.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-B-XdoWBQ.js").then(o=>o.t1),__vite__mapDeps([0]),import.meta.url),w(()=>import("./ai-chat-B-XdoWBQ.js").then(o=>o.t2),__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-B-XdoWBQ.js").then(g=>g.sU);return{parseMarkdownToCards:l}},__vite__mapDeps([0]),import.meta.url),{insertCardsToCanvas:n}=await w(async()=>{const{insertCardsToCanvas:l}=await import("./ai-chat-B-XdoWBQ.js").then(g=>g.sV);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-BwW4Qp-A.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-BNtKpMlh.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-BnDZa9FH.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-BnDZa9FH.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-B-XdoWBQ.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-BnDZa9FH.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-BnDZa9FH.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-B-XdoWBQ.js").then(o=>o.sO);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-B-XdoWBQ.js").then(o=>o.s$);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 z=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 U.waitForInitialization(),!q("image",e.modelRef||e.model))throw new Error("未配置 API Key,请在设置中配置");const s=L(),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 U.waitForInitialization(),!q("video",e.modelRef||e.model))throw new Error("未配置 API Key,请在设置中配置");const s=L(),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()}
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-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
- `:"",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 z.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 z.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(O(r=>r.type==="canvas_insert"?!1:r.workflowId===e)).subscribe(t)}registerCanvasHandler(e){this.pendingCanvasHandler=e}subscribeToToolRequests(e){return this.events$.pipe(O(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};
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,5 +1,110 @@
1
1
  {
2
2
  "versions": [
3
+ {
4
+ "version": "1.0.2",
5
+ "date": "2026-06-27",
6
+ "changes": {
7
+ "features": [
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组件卸载问题"
30
+ ],
31
+ "fixes": [
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"
67
+ ],
68
+ "improvements": [
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并同步构建时间",
82
+ "修复 PR190 合并阻塞问题",
83
+ "修复 CI pnpm 缺失导致构建失败",
84
+ "Disable CDN entry asset rewrites",
85
+ "修复 PR185 硬边界拆图误判风险",
86
+ "修复 PR188 文本内容数组归一化",
87
+ "修复多图生成 JSON 解析和默认模型迁移",
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): 限制解析的版本数量以避免内存问题"
103
+ ]
104
+ },
105
+ "type": "patch",
106
+ "highlights": "新增 omni-flash 视频模型支持"
107
+ },
3
108
  {
4
109
  "version": "1.0.0",
5
110
  "date": "2026-05-26",
@@ -803,12 +908,6 @@
803
908
  },
804
909
  "type": "patch",
805
910
  "highlights": "将 SW 升级切换改为整包 ready 后再接管"
806
- },
807
- {
808
- "version": "0.6.55",
809
- "date": "2026-04-23",
810
- "type": "patch",
811
- "highlights": "构建修复与稳定性改进"
812
911
  }
813
912
  ]
814
913
  }