aitu-app 0.9.0 → 0.9.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 (59) hide show
  1. package/README.md +3 -3
  2. package/assets/{CanvasAudioPlayer-cp00LGgR.js → CanvasAudioPlayer-C_USx5uz.js} +1 -1
  3. package/assets/{ComicCreator-CAmJF3JX.js → ComicCreator-qGQaXp7h.js} +2 -2
  4. package/assets/DeferredAIInputBar-CPykEFYX.css +1 -0
  5. package/assets/DeferredAIInputBar-LmZGQCLT.js +107 -0
  6. package/assets/{DrawnixDeferredFeatures-DIznfzB7.js → DrawnixDeferredFeatures-Hy_-quZ1.js} +1 -1
  7. package/assets/{KnowledgeBaseContent-CxilHI-j.js → KnowledgeBaseContent-DSKNA70H.js} +8 -8
  8. package/assets/{MVCreator-ZrinzYPm.js → MVCreator-C3iClDLU.js} +12 -10
  9. package/assets/{ModelBenchmarkWorkbench-DbesnX6E.js → ModelBenchmarkWorkbench-BxwdcZ0q.js} +2 -2
  10. package/assets/{MusicAnalyzer-BzXD1qYH.js → MusicAnalyzer-f_T6_YPJ.js} +2 -2
  11. package/assets/{ParametersDropdown-DBQCDv3g.js → ParametersDropdown-CTSN3ClD.js} +1 -1
  12. package/assets/{PromptHistoryTool-CUCIE0Ld.js → PromptHistoryTool-DV-8RSdz.js} +2 -2
  13. package/assets/{ResizableDivider-CdfJF8GW.js → ResizableDivider-CUQBmPpx.js} +1 -1
  14. package/assets/TaskQueuePanel-CtjY1W4t.js +1 -0
  15. package/assets/{VideoAnalyzer-wtxorxD3.js → VideoAnalyzer-BBVBSONO.js} +3 -3
  16. package/assets/{VideoAnalyzer-C90c84gt.js → VideoAnalyzer-BmAjGvN8.js} +1 -1
  17. package/assets/{ai-chat-B5qFht2H.js → ai-chat-BO5vbKZW.js} +5 -5
  18. package/assets/{ai-generation-preferences-service-CvWbMxv3.js → ai-generation-preferences-service-ZmPTR-wz.js} +1 -1
  19. package/assets/{batch-image-generation-Bo3h_Eop.js → batch-image-generation-BLBSv-t6.js} +6 -6
  20. package/assets/{diagram-engines-C9ewAq_o.js → diagram-engines-CSzW_-6N.js} +2 -2
  21. package/assets/{editor-engines-CvxZrFyB.js → editor-engines-C573k8UM.js} +1 -1
  22. package/assets/{index-Dw6PsLbq.js → index-BT-rxxI3.js} +2 -2
  23. package/assets/{index-BCqdmg38.js → index-Dw_8lcIi.js} +1 -1
  24. package/assets/{index-BSlnQdcy.js → index-IHNaVKGH.js} +1 -1
  25. package/assets/{index-CjBeKr1R.js → index-N8asYyaz.js} +1 -1
  26. package/assets/{index-CylhK_f5.js → index-jxwTv7c1.js} +1 -1
  27. package/assets/{index.es-BKVY-J2g.js → index.es-BLXvmueB.js} +1 -1
  28. package/assets/{jspdf.es.min-BM9ML7Zw.js → jspdf.es.min-DxWvbkh4.js} +2 -2
  29. package/assets/{markdown-to-drawnix-COS1iVyq.js → markdown-to-drawnix-BVFYnimo.js} +2 -2
  30. package/assets/{mermaid-to-drawnix-oplawQO0.js → mermaid-to-drawnix-nGs2aeZ7.js} +2 -2
  31. package/assets/{model-benchmark-launcher-DD4vN0Ca.js → model-benchmark-launcher-DAWoSySc.js} +1 -1
  32. package/assets/{photo-wall-splitter-CbKqFOIV.js → photo-wall-splitter-CCUURzGk.js} +1 -1
  33. package/assets/{prompt-utils-7t-jk6n6.js → prompt-utils-MF_LILNU.js} +1 -1
  34. package/assets/{settings-dialog-D2yEWl8J.js → settings-dialog-Ac7R-_CG.js} +1 -1
  35. package/assets/{skill-dsl-parser-C-utRXFg.js → skill-dsl-parser-Do9iAYbB.js} +1 -1
  36. package/assets/{startup-app-DxX-P1pm.js → startup-app-eD_rQhSh.js} +531 -527
  37. package/assets/{task-sync-Dr7Nza2v.js → task-sync-BJVOunRa.js} +1 -1
  38. package/assets/{tool-windows-BIjc1zsU.js → tool-windows-CmgL3thd.js} +17 -17
  39. package/assets/ttd-dialog-B12v0SVY.js +6 -0
  40. package/assets/{ttd-dialog-submit-shortcut-yUk15rsg.js → ttd-dialog-submit-shortcut-C2lJygXA.js} +1 -1
  41. package/assets/useCharacters-BAKE4TeJ.js +2 -0
  42. package/assets/{useMediaViewer-CEvHYype.js → useMediaViewer-BGw5RkSR.js} +1 -1
  43. package/assets/{useWorkflowSubmission-Cxhdsl2b.js → useWorkflowSubmission-iAPmKke9.js} +6 -6
  44. package/assets/{video-recovery-service-CB8hyRf5.js → video-recovery-service-CW7bErP2.js} +1 -1
  45. package/assets/{workflow-generation-utils-JoRODaP7.js → workflow-generation-utils-DhIVnOHO.js} +2 -2
  46. package/assets/workflow-submission-service-Ce0cpj8E.js +4 -0
  47. package/changelog.json +18 -13
  48. package/idle-prefetch-manifest.json +306 -306
  49. package/manifest.json +3 -3
  50. package/package.json +1 -1
  51. package/precache-manifest.json +6 -6
  52. package/sw.js +1 -1
  53. package/version.json +6 -3
  54. package/assets/DeferredAIInputBar-CzMATNng.js +0 -107
  55. package/assets/DeferredAIInputBar-D_e6qG1y.css +0 -1
  56. package/assets/TaskQueuePanel-oLG4DAzJ.js +0 -1
  57. package/assets/ttd-dialog-CNSSc4wk.js +0 -6
  58. package/assets/useCharacters-DzXMuknh.js +0 -2
  59. package/assets/workflow-submission-service-BIGFW4s4.js +0 -4
@@ -0,0 +1,4 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./startup-app-CKHrOmQ0.css","./ai-chat-DyV67c_f.css","./editor-engines-B8u8agiX.css","./tool-windows-CegtMid1.css"])))=>i.map(i=>d[i]);
2
+ import{_ as w}from"./startup-runtime-DTmhLESk.js";import{g9 as W,aR as x,aT as R,c as M,d as P,b as T,bw as C,bv as F,bt as D,bu as J,bP as X,dH as $,dG as Q,kI as B,bg as E,kJ as G,a9 as L,j1 as q,kK as U,fQ as N,hZ as Z,bz as S,fK as j,dB as _,ax as b,hd as H,kL as Y,kM as z}from"./startup-app-eD_rQhSh.js";import{w as k}from"./tool-windows-CmgL3thd.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-BO5vbKZW.js").then(o=>o.$),__vite__mapDeps([0,1]),import.meta.url),w(()=>import("./ai-chat-BO5vbKZW.js").then(o=>o.a0),__vite__mapDeps([0,1]),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=W.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("./startup-app-eD_rQhSh.js").then(g=>g.nY);return{parseMarkdownToCards:l}},__vite__mapDeps([0]),import.meta.url),{insertCardsToCanvas:n}=await w(async()=>{const{insertCardsToCanvas:l}=await import("./startup-app-eD_rQhSh.js").then(g=>g.nZ);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),K=Math.ceil(p.length/3);i=[i[0],i[1]+K*140+s]}else x.insertText(t,i,u),i=[i[0],i[1]+100+s];c++;break}case"image":await P(t,u,i,!1,{width:400,height:400},!1,!0),i=[i[0],i[1]+400+s],c++;break;case"video":await M(t,u,i),i=[i[0],i[1]+300+s],c++;break;case"audio":await R(t,u,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 P(t,l,n,!1,{width:400,height:400},!1,!0),n=[n[0],n[1]+400+s],i++;break;case"video":await M(t,l,n),n=[n[0],n[1]+300+s],i++;break;case"audio":await R(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-jxwTv7c1.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(()=>{W.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-IHNaVKGH.js");return{parseMarkdownToDrawnix:d}},__vite__mapDeps([0,2]),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(()=>{W.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-CmgL3thd.js").then(s=>s.Y);return{createGridImageTask:a}},__vite__mapDeps([0,1,3]),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-CmgL3thd.js").then(s=>s.Z);return{createInspirationBoardTask:a}},__vite__mapDeps([0,1,3]),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("./startup-app-eD_rQhSh.js").then(n=>n.n$);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-CmgL3thd.js").then(s=>s.$);return{createLongVideoTask:a}},__vite__mapDeps([0,1,3]),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-CmgL3thd.js").then(o=>o._);return{analyzeWithAI:s}},__vite__mapDeps([0,1,3]),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("./startup-app-eD_rQhSh.js").then(o=>o.nT);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-BO5vbKZW.js").then(o=>o._);return{createVideoTask:s}},__vite__mapDeps([0,1]),import.meta.url),a=await r(e);return a.success?{success:!0,data:a.data,type:"video",taskId:a.taskId,taskIds:(t=a.data)==null?void 0:t.taskIds}:(console.error("[SWCapabilities] Video task creation failed:",a.error),{success:!1,error:a.error||"视频生成任务创建失败",type:"error"})}catch(r){return console.error("[SWCapabilities] Video generation error:",r),{success:!1,error:`视频生成失败: ${r.message}`,type:"error"}}}getInsertionPoint(e){const t=e.appState,r=(t==null?void 0:t.lastSelectedElementIds)||[];if(r.length>0){const a=r.map(s=>e.children.find(o=>o.id===s)).filter(Boolean);if(a.length>0)try{const s=C(e,a,!1);return[s.x+s.width/2,s.y+s.height+50]}catch{}}if(e.children&&e.children.length>0){let a=0,s=100;for(const o of e.children)try{const n=C(e,[o],!1),i=n.y+n.height;i>a&&(a=i,s=n.x+n.width/2)}catch{}return[s,a+50]}return[100,100]}insertElementsToCanvas(e,t){try{const r=this.getInsertionPoint(e);return e.insertFragment({elements:JSON.parse(JSON.stringify(t))},r,F.paste),requestAnimationFrame(()=>{T(e,r)}),{success:!0,elementsCount:t.length}}catch(r){return{success:!1,error:r.message}}}insertElementsToCanvasAtPoint(e,t,r){try{return e.insertFragment({elements:JSON.parse(JSON.stringify(t))},r,F.paste),requestAnimationFrame(()=>{T(e,r)}),{success:!0,elementsCount:t.length}}catch(a){return console.error("[SWCapabilities] insertElementsToCanvasAtPoint failed:",a),{success:!1,error:a.message}}}getViewportCenter(e){try{const r=D.getBoardContainer(e).getBoundingClientRect(),a=e.viewport.zoom,s=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=C(e,a,!1),n=D.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);X.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 L.waitForInitialization(),!q("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 L.waitForInitialization(),!q("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
+
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,23 @@
1
1
  {
2
2
  "versions": [
3
+ {
4
+ "version": "0.9.2",
5
+ "date": "2026-05-04",
6
+ "changes": {
7
+ "features": [
8
+ "优化长提示词输入框展开体验",
9
+ "add image generate-again prefill"
10
+ ],
11
+ "fixes": [
12
+ "优化参考图描述和提示词优先级协议",
13
+ "allow hand panning while drawing",
14
+ "address regenerate prefill review findings"
15
+ ],
16
+ "improvements": []
17
+ },
18
+ "type": "minor",
19
+ "highlights": "优化长提示词输入框展开体验"
20
+ },
3
21
  {
4
22
  "version": "0.7.0",
5
23
  "date": "2026-05-03",
@@ -769,19 +787,6 @@
769
787
  },
770
788
  "type": "patch",
771
789
  "highlights": "优化启动加载与延迟功能挂载"
772
- },
773
- {
774
- "version": "0.6.36",
775
- "date": "2026-04-20",
776
- "changes": {
777
- "features": [],
778
- "fixes": [],
779
- "improvements": [
780
- "Add HTML boot loading overlay"
781
- ]
782
- },
783
- "type": "patch",
784
- "highlights": "构建修复与稳定性改进"
785
790
  }
786
791
  ]
787
792
  }