aitu-app 0.6.76 → 0.6.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/assets/CanvasAudioPlayer-DutgwdiU.js +2 -0
- package/assets/ChatDrawer-E6Fog16I.js +11 -0
- package/assets/{ChatMessagesArea-CZkiRzmW.js → ChatMessagesArea-Bgwiz_XP.js} +3 -3
- package/assets/DeferredAIInputBar-CPkD8Cv9.js +8 -0
- package/assets/DeferredAIInputBar-szBPHiNW.css +1 -0
- package/assets/DrawnixDeferredFeatures-Cul76-88.js +2 -0
- package/assets/{KnowledgeBaseContent-Dan2DUqY.js → KnowledgeBaseContent-DcX5Jofx.js} +6 -6
- package/assets/{MVCreator-Dzjl2fXA.js → MVCreator-DllHozYg.js} +8 -8
- package/assets/{ModelBenchmarkWorkbench-oy2wue1u.js → ModelBenchmarkWorkbench-Dv9SNYTi.js} +2 -2
- package/assets/MusicAnalyzer-CHcQ5t4P.js +1 -0
- package/assets/{MusicAnalyzer-BO44f-db.js → MusicAnalyzer-DDeT6g3c.js} +2 -2
- package/assets/ResizableDivider-CaG9JQbJ.js +1 -0
- package/assets/TaskQueuePanel-BNhNzGp5.js +1 -0
- package/assets/{VideoAnalyzer-iiJpoWb6.js → VideoAnalyzer-BSLz1FaI.js} +2 -2
- package/assets/ai-generation-preferences-service-BF7QkuJp.js +1 -0
- package/assets/arc-BU2KKCa_.js +1 -0
- package/assets/arc-DmGoDCEL.js +1 -0
- package/assets/{batch-image-generation-B2R0hJW_.js → batch-image-generation-Bg68r_Ql.js} +5 -5
- package/assets/{blockDiagram-38ab4fdb-BmWPnNuS.js → blockDiagram-38ab4fdb-BCGEnMME.js} +1 -1
- package/assets/{blockDiagram-38ab4fdb-trArAOFP.js → blockDiagram-38ab4fdb-CsZR5uC5.js} +1 -1
- package/assets/board-utils-CpAtoKn2.js +1 -0
- package/assets/{browser-Dya3c6_X.js → browser-DpICcNby.js} +1 -1
- package/assets/{c4Diagram-3d4e48cf-Cvj3RMOv.js → c4Diagram-3d4e48cf-9fuiuFdV.js} +1 -1
- package/assets/{c4Diagram-3d4e48cf-CqJrO4Za.js → c4Diagram-3d4e48cf-WM4wd_GR.js} +1 -1
- package/assets/{canvas-insertion-Dq3gR9Nw.js → canvas-insertion-CdUQF7IV.js} +3 -3
- package/assets/channel-CZjE-WNp.js +1 -0
- package/assets/channel-SXZD6bG3.js +1 -0
- package/assets/classDiagram-70f12bd4-CBVHTwQu.js +2 -0
- package/assets/{classDiagram-70f12bd4-DvrRZ41d.js → classDiagram-70f12bd4-DcYDedz1.js} +2 -2
- package/assets/classDiagram-v2-f2320105-CsxWGkSy.js +2 -0
- package/assets/classDiagram-v2-f2320105-jpCwaHEd.js +2 -0
- package/assets/{clipper-B4i11tN1.js → clipper-jvd5rF5a.js} +1 -1
- package/assets/clone-C4mvvMDb.js +1 -0
- package/assets/{createText-2e5e7dd3-D7dXlVes.js → createText-2e5e7dd3-CkXS3l7I.js} +2 -2
- package/assets/{createText-2e5e7dd3-B8gnT5hD.js → createText-2e5e7dd3-x5lOIwut.js} +1 -1
- package/assets/edges-e0da2a9e-CbrF4nbD.js +4 -0
- package/assets/{edges-e0da2a9e-CyRAzEMi.js → edges-e0da2a9e-Ch6PBwWs.js} +2 -2
- package/assets/{erDiagram-9861fffd-D8yYsjoN.js → erDiagram-9861fffd-Bq07elcI.js} +3 -3
- package/assets/{erDiagram-9861fffd-BHbAa_Ka.js → erDiagram-9861fffd-DSlNVuAZ.js} +4 -4
- package/assets/{flowDb-956e92f1-DAqb8wjP.js → flowDb-956e92f1-BqPCJlZp.js} +3 -3
- package/assets/{flowDb-956e92f1-f30uG4pp.js → flowDb-956e92f1-Ti5YC4Vv.js} +3 -3
- package/assets/{flowDiagram-66a62f08-C4Gz9mOM.js → flowDiagram-66a62f08-CPDuG3rY.js} +3 -3
- package/assets/{flowDiagram-66a62f08-CBXypoEi.js → flowDiagram-66a62f08-D3GSABFi.js} +1 -1
- package/assets/flowDiagram-v2-96b9c2cf-BCcJ-cre.js +1 -0
- package/assets/flowDiagram-v2-96b9c2cf-DCVaFEgV.js +1 -0
- package/assets/{flowchart-elk-definition-4a651766-CSm5diF6.js → flowchart-elk-definition-4a651766-BH09NeLA.js} +1 -1
- package/assets/{flowchart-elk-definition-4a651766-BHB7pRxm.js → flowchart-elk-definition-4a651766-BLaLPCDV.js} +1 -1
- package/assets/{ganttDiagram-c361ad54-CU9a9DsJ.js → ganttDiagram-c361ad54-DL9ZeaEc.js} +4 -4
- package/assets/ganttDiagram-c361ad54-Sp9M1KHP.js +257 -0
- package/assets/{gitGraphDiagram-72cf32ee-B2zj8Xnu.js → gitGraphDiagram-72cf32ee-BSf1fsDV.js} +1 -1
- package/assets/{gitGraphDiagram-72cf32ee-BWOgrFeh.js → gitGraphDiagram-72cf32ee-BWwmRKo-.js} +1 -1
- package/assets/{graph-Bnmq4jgf.js → graph--nPw8zXQ.js} +1 -1
- package/assets/graph-g-2U7grQ.js +1 -0
- package/assets/{index-3862675e-CQLKy6RO.js → index-3862675e-BXwbZ2pz.js} +1 -1
- package/assets/{index-3862675e-BSxxidV_.js → index-3862675e-D6Zy95zZ.js} +1 -1
- package/assets/index-3eqA7Bag.js +1 -0
- package/assets/{index-D1ORCZqJ.js → index-7Q-aiwln.js} +2 -2
- package/assets/index-B2dttXd7.js +1 -0
- package/assets/index-B7V7-Vxz.js +1 -0
- package/assets/index-BHPTfCZM.js +1 -0
- package/assets/{index-vvV37Q1S.js → index-BP77pG9S.js} +4 -4
- package/assets/index-BPR_DyGD.js +1 -0
- package/assets/index-BWrcsh8u.js +1 -0
- package/assets/{index-D4qm_1m5.js → index-BXzGHPXz.js} +1 -1
- package/assets/index-BaCHOxhI.js +1 -0
- package/assets/{index-BoglETHF.js → index-Bq8mPedC.js} +2 -2
- package/assets/index-BqHZCcen.js +2 -0
- package/assets/index-Bti3m-iW.js +1 -0
- package/assets/{index-sPNG1_UN.js → index-BwSnJN93.js} +5 -5
- package/assets/{index-D5qxbeGT.js → index-C3qD42ws.js} +1 -1
- package/assets/{index-VzDb_AHs.js → index-C5eu4uSl.js} +5 -5
- package/assets/index-CLJUfzvO.js +1 -0
- package/assets/index-CfgvFFx3.js +271 -0
- package/assets/index-CmyOpFTN.js +1 -0
- package/assets/index-D4pIkh3S.js +1 -0
- package/assets/index-D7b5fX1d.js +1 -0
- package/assets/index-DH12_HTj.js +13 -0
- package/assets/index-DI0OV6F8.js +7 -0
- package/assets/index-DIiIUyb-.js +1 -0
- package/assets/index-DcZrElEK.js +2 -0
- package/assets/index-DllL1sx1.js +1 -0
- package/assets/index-DqMndQiP.js +1 -0
- package/assets/index-Dz8sghkK.js +1 -0
- package/assets/index-QkP3EC02.js +1 -0
- package/assets/index-TkfyNewx.js +1 -0
- package/assets/index-ZrVeQUWo.js +1 -0
- package/assets/index-eZfwJ9bV.js +3 -0
- package/assets/{index-VarwiJlL.js → index-gQ7LgvSv.js} +1 -1
- package/assets/{infoDiagram-f8f76790-d-BYTW2w.js → infoDiagram-f8f76790-DpFqCCNv.js} +3 -3
- package/assets/{infoDiagram-f8f76790-BMsVq8O_.js → infoDiagram-f8f76790-G2JpJJP7.js} +3 -3
- package/assets/{journeyDiagram-49397b02-DCtCkoaC.js → journeyDiagram-49397b02-BdESGMrv.js} +1 -1
- package/assets/{journeyDiagram-49397b02-CBqb8-ml.js → journeyDiagram-49397b02-DLLTobRM.js} +1 -1
- package/assets/{layout-DKqEkE_W.js → layout-CVkuImk4.js} +1 -1
- package/assets/layout-WSR0vNPO.js +1 -0
- package/assets/line-D3bnG227.js +1 -0
- package/assets/line-DQuMJveY.js +1 -0
- package/assets/{linear-C6OQYT56.js → linear-CciP-97N.js} +1 -1
- package/assets/linear-Z6vFvuwc.js +1 -0
- package/assets/{main-i0s2IJTn.css → main-8DNjLY6L.css} +1 -1
- package/assets/main-BFEkxCOK.js +56 -0
- package/assets/{mermaid.core-CI-VJEiw.js → mermaid.core-CwZQb0ud.js} +5 -5
- package/assets/{mindmap-definition-fc14e90a-k_RSypuP.js → mindmap-definition-fc14e90a-BnJ8OOTI.js} +1 -1
- package/assets/{mindmap-definition-fc14e90a-DrtlQLES.js → mindmap-definition-fc14e90a-CxQMydCW.js} +1 -1
- package/assets/model-benchmark-launcher-Ct3lYXVq.js +1 -0
- package/assets/photo-wall-splitter-BZ88W5Zy.js +1 -0
- package/assets/{pieDiagram-8a3498a8-CdknGxKY.js → pieDiagram-8a3498a8-BSDdkTeu.js} +5 -5
- package/assets/{pieDiagram-8a3498a8-Bpr5V3o5.js → pieDiagram-8a3498a8-D6VtAoja.js} +4 -4
- package/assets/ppt-generation-FzjP_rp0.js +48 -0
- package/assets/{quadrantDiagram-120e2f19-Dx3qoKDx.js → quadrantDiagram-120e2f19-BbFV0VXY.js} +3 -3
- package/assets/{quadrantDiagram-120e2f19-pVIXp9i6.js → quadrantDiagram-120e2f19-C8k2xuBd.js} +3 -3
- package/assets/{requirementDiagram-deff3bca-hM4oekUG.js → requirementDiagram-deff3bca-C3xMdzJV.js} +1 -1
- package/assets/{requirementDiagram-deff3bca-DD6NY75P.js → requirementDiagram-deff3bca-CpjqKjYZ.js} +1 -1
- package/assets/{sankeyDiagram-04a897e0-BsvEG71N.js → sankeyDiagram-04a897e0-BBJJgsFv.js} +5 -5
- package/assets/{sankeyDiagram-04a897e0-C9uf1jU5.js → sankeyDiagram-04a897e0-Bjvig9bW.js} +4 -4
- package/assets/{sequenceDiagram-704730f1-CNEBmz1G.js → sequenceDiagram-704730f1-DX1MmBN_.js} +4 -4
- package/assets/{sequenceDiagram-704730f1-Bpg54z74.js → sequenceDiagram-704730f1-PFC_9IFI.js} +4 -4
- package/assets/settings-dialog-CQM4v791.js +1 -0
- package/assets/{skill-dsl-parser-DS3VOBFI.js → skill-dsl-parser-syNWYxFu.js} +10 -10
- package/assets/{stateDiagram-587899a1-BN2ZP-3x.js → stateDiagram-587899a1-Dc3mI_B_.js} +1 -1
- package/assets/stateDiagram-587899a1-SFMUVAam.js +1 -0
- package/assets/{stateDiagram-v2-d93cdb3a-BtV1Ziy9.js → stateDiagram-v2-d93cdb3a-DmnBjHpC.js} +1 -1
- package/assets/{stateDiagram-v2-d93cdb3a-BLwIM8s1.js → stateDiagram-v2-d93cdb3a-P4Yt2p_j.js} +1 -1
- package/assets/{styles-6aaf32cf-aFVlX_lA.js → styles-6aaf32cf-C3jnr3hV.js} +1 -1
- package/assets/{styles-6aaf32cf-CGp3i5qu.js → styles-6aaf32cf-b6AdP7fu.js} +1 -1
- package/assets/{styles-9a916d00-BK7pejCH.js → styles-9a916d00-BUiD9iBe.js} +4 -4
- package/assets/{styles-9a916d00-CSwFWVnr.js → styles-9a916d00-ii0XTdIm.js} +1 -1
- package/assets/styles-c10674c1-Bt89Yy8Q.js +116 -0
- package/assets/styles-c10674c1-DbTSpy3W.js +116 -0
- package/assets/{svgDrawCommon-08f97a94-Cr4rWU-W.js → svgDrawCommon-08f97a94-BK6lD4D6.js} +1 -1
- package/assets/{svgDrawCommon-08f97a94-DypvMDvH.js → svgDrawCommon-08f97a94-D4gIV05W.js} +1 -1
- package/assets/{timeline-definition-85554ec2-D3-lXEL5.js → timeline-definition-85554ec2-Bl2y548G.js} +1 -1
- package/assets/{timeline-definition-85554ec2-DIwHE15c.js → timeline-definition-85554ec2-CWKg_JxG.js} +3 -3
- package/assets/{tool-windows-B-a9r3G3.css → tool-windows-CUNbW1Tz.css} +1 -1
- package/assets/tool-windows-DOIu9TAD.js +2975 -0
- package/assets/ttd-dialog-DI4kQSg8.js +99 -0
- package/assets/{useCharacters-DsZ779l-.js → useCharacters-Chv4Ky7x.js} +3 -3
- package/assets/useWorkflowSubmission-BizuDmuw.js +70 -0
- package/assets/video-analyze-6v3Y-rUE.js +1 -0
- package/assets/{video-generation-C7qCz-ZF.js → video-generation-DnmTlWnm.js} +2 -2
- package/assets/video-recovery-service-BeRoh0s2.js +1 -0
- package/assets/workflow-generation-utils-me381Cax.js +3 -0
- package/assets/workflow-submission-service-YOpo7g37.js +4 -0
- package/assets/{xychartDiagram-e933f94c-B17Evxfw.js → xychartDiagram-e933f94c-CJX9_9WF.js} +4 -4
- package/assets/{xychartDiagram-e933f94c-Dln5PJtU.js → xychartDiagram-e933f94c-Cep8CQEH.js} +3 -3
- package/changelog.json +50 -0
- package/idle-prefetch-manifest.json +300 -316
- package/manifest.json +3 -3
- package/package.json +1 -1
- package/precache-manifest.json +8 -8
- package/sw.js +5 -5
- package/version.json +19 -3
- package/assets/CanvasAudioPlayer-DwM6PU4W.js +0 -2
- package/assets/ChatDrawer-BQTaa6r6.js +0 -11
- package/assets/DeferredAIInputBar-BmPgFhXr.css +0 -1
- package/assets/DeferredAIInputBar-ObyfJQ0O.js +0 -7
- package/assets/DrawnixDeferredFeatures-CFHVLxc5.js +0 -2
- package/assets/ModelDropdown-CQTTHEI7.css +0 -1
- package/assets/ModelDropdown-DjvIvi8O.js +0 -1
- package/assets/MusicAnalyzer-BU5l2wPR.js +0 -1
- package/assets/ResizableDivider-CBgTphcS.js +0 -1
- package/assets/TaskQueuePanel-CTDuSScf.js +0 -1
- package/assets/ai-generation-preferences-service-CqwXb9Cs.js +0 -5
- package/assets/arc-BBE0LXa1.js +0 -1
- package/assets/arc-h476db6P.js +0 -1
- package/assets/channel-DMTz1UNN.js +0 -1
- package/assets/channel-DQOY3XLe.js +0 -1
- package/assets/classDiagram-70f12bd4-5ACx619h.js +0 -2
- package/assets/classDiagram-v2-f2320105-4zQ4jrwi.js +0 -2
- package/assets/classDiagram-v2-f2320105-CB4rof84.js +0 -2
- package/assets/clone-fuaXEdc-.js +0 -1
- package/assets/edges-e0da2a9e-DZalSm7f.js +0 -4
- package/assets/flowDiagram-v2-96b9c2cf-C-DFFh54.js +0 -1
- package/assets/flowDiagram-v2-96b9c2cf-CWjydvHB.js +0 -1
- package/assets/ganttDiagram-c361ad54-DDnbMkWm.js +0 -257
- package/assets/graph-BsYIlc-B.js +0 -1
- package/assets/index-B10kMZoq.js +0 -1
- package/assets/index-B2_XRj3U.js +0 -1
- package/assets/index-B4lLv-Sz.js +0 -1
- package/assets/index-BFZNUUCR.js +0 -1
- package/assets/index-BTSYG2Vy.js +0 -1
- package/assets/index-BY5Kvjqg.js +0 -1
- package/assets/index-Blf7J5yW.js +0 -1
- package/assets/index-BoQA7VaE.js +0 -3
- package/assets/index-BzqQ69oU.js +0 -1
- package/assets/index-CD2D1BYc.js +0 -2
- package/assets/index-CLRs5cWt.js +0 -1
- package/assets/index-CLU4LJjR.js +0 -1
- package/assets/index-CPDfMZkS.js +0 -1
- package/assets/index-CPfhqyDz.js +0 -316
- package/assets/index-CU4ySaQE.js +0 -1
- package/assets/index-CsCwwmYY.js +0 -1
- package/assets/index-Cyz_w8KS.js +0 -7
- package/assets/index-D489cJtb.js +0 -1
- package/assets/index-D6DebbcI.js +0 -1
- package/assets/index-DDtPG6Km.js +0 -1
- package/assets/index-DKhTnUBU.js +0 -1
- package/assets/index-DMIwLDS8.js +0 -13
- package/assets/index-DgsUJgRJ.js +0 -1
- package/assets/index-oT8mbA3U.js +0 -2
- package/assets/layout-B1ePJO5V.js +0 -1
- package/assets/line-C_jmJ6v1.js +0 -1
- package/assets/line-DfhCgsyz.js +0 -1
- package/assets/linear-ChY5Iu43.js +0 -1
- package/assets/main-LCg1nQGB.js +0 -69
- package/assets/model-benchmark-launcher-B2MsZXmV.js +0 -1
- package/assets/model-benchmark-service-CkIRp-Sq.js +0 -1
- package/assets/model-selection-BvdXmVGX.js +0 -1
- package/assets/photo-wall-splitter-CVrfkWnh.js +0 -1
- package/assets/prompt-optimize-dialog-DLdL2_a1.css +0 -1
- package/assets/settings-dialog-CAhU3cfG.js +0 -1
- package/assets/stateDiagram-587899a1-CMylUAYu.js +0 -1
- package/assets/styles-c10674c1-KfJINP7I.js +0 -116
- package/assets/styles-c10674c1-cccyjRUz.js +0 -116
- package/assets/tool-windows-CtLXQDGF.js +0 -2847
- package/assets/ttd-dialog-BRg3XE5k.js +0 -99
- package/assets/use-runtime-models-BH9r4Yc1.js +0 -1
- package/assets/use-runtime-models-BgWWl4Ng.css +0 -1
- package/assets/useWorkflowSubmission-BeJQ3BuO.js +0 -70
- package/assets/video-analyze-aDVIfgUi.js +0 -1
- package/assets/video-recovery-service-Dy0xiPr8.js +0 -1
- package/assets/workflow-generation-utils-CpMilOwA.js +0 -3
- package/assets/workflow-submission-service-CmBBMIis.js +0 -4
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./tool-windows-B-a9r3G3.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{hL as Q,kR as Y,kS as re,kT as J,kU as de,kV as fe,r as S,y as me,h0 as X,h1 as Z,h2 as oe,hD as $,cx as ge,he as ee,_ as O}from"./tool-windows-CtLXQDGF.js";import{w as F}from"./workflow-submission-service-CmBBMIis.js";import{S as ke,d as te}from"./skill-dsl-parser-DS3VOBFI.js";import{a as we}from"./main-LCg1nQGB.js";function Se(s){if(!s||typeof s!="string")return console.warn("[ExternalSkillParser] SKILL.md 内容为空"),null;const e=s.trim();if(!e.startsWith("---"))return console.warn("[ExternalSkillParser] SKILL.md 缺少 YAML front matter(未以 --- 开头)"),null;const t=e.indexOf("---",3);if(t===-1)return console.warn("[ExternalSkillParser] SKILL.md YAML front matter 未闭合(缺少结束 ---)"),null;const r=e.substring(3,t).trim(),o=e.substring(t+3).trim(),i=ye(r),n=i.name,d=i.description||"";return n?{name:n,description:d,body:o}:(console.warn("[ExternalSkillParser] SKILL.md 缺少必填字段 name"),null)}function ye(s){const e={},t=s.split(`
|
|
3
|
-
`);for(const r of t){const o=r.trim();if(!o||o.startsWith("#"))continue;const i=o.indexOf(":");if(i===-1)continue;const n=o.substring(0,i).trim();let d=o.substring(i+1).trim();(d.startsWith('"')&&d.endsWith('"')||d.startsWith("'")&&d.endsWith("'"))&&(d=d.slice(1,-1)),n&&(e[n]=d)}return e}function Qe(s){try{const e=JSON.parse(s);if(!e.plugins||!Array.isArray(e.plugins))return console.warn("[ExternalSkillParser] marketplace.json 缺少 plugins 数组"),null;const t=new Map,r=[];for(const o of e.plugins){const i={name:o.name||"",description:o.description||"",skills:[]};if(Array.isArray(o.skills))for(const n of o.skills){const d=he(n);i.skills.push(d),t.set(d,o.name||"")}r.push(i)}return{name:e.name||"",metadata:e.metadata?{description:e.metadata.description,version:e.metadata.version}:void 0,plugins:r,skillCategoryMap:t}}catch(e){return console.warn("[ExternalSkillParser] marketplace.json 解析失败:",e),null}}function he(s){let e=s.trim();return e.startsWith("./")&&(e=e.substring(2)),e.startsWith("skills/")&&(e=e.substring(7)),e.endsWith("/")&&(e=e.slice(0,-1)),e}function We(s,e){if(!e||e.size===0)return s;let t=s;for(const[r,o]of e){const i=new RegExp("`"+xe(r)+"`","g");t=t.replace(i,`\`${r}\`
|
|
4
|
-
|
|
5
|
-
<details><summary>${r}</summary>
|
|
6
|
-
|
|
7
|
-
${o}
|
|
8
|
-
|
|
9
|
-
</details>`)}return t}function xe(s){return s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ye(s,e,t,r){const o=[];for(const i of s){const n=Se(i.skillMdContent);if(!n){console.warn(`[ExternalSkillParser] 跳过无效 Skill: ${i.dirName}`);continue}let d=n.body;i.references&&i.references.size>0&&(d=We(d,i.references));const k=(t==null?void 0:t.skillCategoryMap.get(n.name))||(t==null?void 0:t.skillCategoryMap.get(i.dirName));o.push({id:`${e}:${n.name}`,name:n.name,description:n.description,type:ke,content:d,source:e,sourceUrl:r,category:k})}return o}function be(s,e){if(e!=="image"||!s||s.trim().length===0)return s;let t=s;return t=t.replace(/```bash\n[\s\S]*?```/g,o=>/npx|bun|scripts\/|\.ts\b|\.js\b|mkdir|cp |mv |rm |cat /i.test(o)?"> *(此步骤在 aitu 中自动处理)*":o),t=t.replace(/(?:Select|Check|Use|Call)\s+(?:available\s+)?image\s+generation\s+skill[s]?[^.\n]*/gi,"调用 generate_image 工具生成图片"),t=t.replace(/(?:If\s+)?(?:multiple\s+)?(?:image\s+generation\s+)?skills?\s+available,?\s*ask\s+(?:user\s+)?preference[^.\n]*/gi,""),t=t.replace(/Call\s+(?:skill\s+)?with\s+prompt\s+file[^.\n]*/gi,"调用 generate_image 工具,传入构建好的 prompt"),t=t.replace(/If\s+image\s+generation\s+skill\s+supports[^.\n]*/gi,""),t=t.replace(/(?:Use\s+)?AskUserQuestion\s+(?:with\s+)?(?:ALL\s+)?(?:questions?\s+)?(?:in\s+ONE\s+call)?[^.\n]*/gi,"自动选择最合适的参数组合"),t=t.replace(/\*\*(?:Use\s+)?AskUserQuestion\*\*[^.\n]*/gi,"**自动选择**最合适的参数组合"),t=t.replace(/ask\s+(?:the\s+)?user\s+with\s+AskUserQuestion[^.\n]*/gi,"自动选择最合适的参数"),t=t.replace(/\bDo\s+NOT\s+split\s+into\s+separate\s+AskUserQuestion\s+calls[^.\n]*/gi,""),t=t.replace(/\*\*Important\*\*:\s*Do NOT split into separate AskUserQuestion[^.\n]*/gi,""),t=t.replace(/\*\*(?:Save|Write)\s+(?:source\s+)?(?:content|to\s+file)\*\*[^.\n]*(?:\n\s*-[^\n]*)*/gi,"> *(文件保存步骤在 aitu 中自动跳过)*"),t=t.replace(/(?:Save|Write)\s+(?:to|the)\s+(?:file|disk|output)[^.\n]*/gi,""),t=t.replace(/\*\*Check\s+for\s+existing\s+file\*\*[^.\n]*(?:\n\s*-[^\n]*)*/gi,""),t=t.replace(/If\s+exists?:\s*Rename\s+to[^\n]*/gi,""),t=t.replace(/\*\*Backup\s+rule\*\*[^\n]*/gi,""),t=t.replace(/output\s+path[,:]?\s*(?:files?\s+created)?[^.\n]*/gi,""),t=t.replace(/(?:^|\n)(?:[│├└─\s]+[^\n]+\n)+/gm,`
|
|
10
|
-
`),t=t.replace(/\n{4,}/g,`
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
`),t+=`
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## 执行指引(aitu 环境适配)
|
|
18
|
-
|
|
19
|
-
**你必须严格按照以上 Skill 工作流指令执行。** 在 aitu 环境中,执行规则如下:
|
|
20
|
-
|
|
21
|
-
1. **内容分析**:基于用户输入内容,按照 Skill 中的步骤进行深入分析,提取关键信息
|
|
22
|
-
2. **参数选择**:自动选择最合适的布局(layout)和样式(style),无需询问用户
|
|
23
|
-
3. **Prompt 构建**:严格按照 Skill 中的模板和规则,结合 Reference 中的布局定义和样式定义,构建完整、详细的图片生成 prompt
|
|
24
|
-
4. **图片生成**:将构建好的完整 prompt 作为参数,调用 \`generate_image\` 工具生成图片
|
|
25
|
-
5. **禁止**:不要仅输出文字描述而不生成图片,必须实际调用 \`generate_image\` 工具
|
|
26
|
-
|
|
27
|
-
**重要**:你的最终目标是调用 \`generate_image\` 工具生成一张高质量的图片,而非输出文本分析。
|
|
28
|
-
`,t}function Ie(s){if(!/\[(?:Intro|Verse|Chorus|Pre-Chorus|Bridge|Outro|Hook|Fade|Instrumental|Interlude)/i.test(s))return{lyrics:s};const e=s.split(`
|
|
29
|
-
`);let t,r;const o=[];for(const i of e){const n=i.trim();if(!t&&/^#\s+(.+)/.test(n)){t=n.replace(/^#\s+/,"").trim();continue}if(!r&&/^(?:标签|tags)\s*[::]\s*(.+)/i.test(n)){r=n.replace(/^(?:标签|tags)\s*[::]\s*/i,"").trim();continue}o.push(i)}for(;o.length>0&&o[0].trim()==="";)o.shift();for(;o.length>0&&o[o.length-1].trim()==="";)o.pop();return{title:t,tags:r,lyrics:o.join(`
|
|
30
|
-
`)}}function K(){return`wf-${Date.now()}-${Math.random().toString(36).substring(2,8)}`}function _e(s,e=[]){const{generationType:t,modelId:r,modelRef:o,isModelExplicit:i,prompt:n,userInstruction:d,rawInput:k,count:c,size:m,duration:v,extraParams:a,selection:l}=s,p=[],f=K(),x=`wf_batch_${f}`;for(let u=0;u<c;u++){const _=`${f}-step-${u+1}`,y={mode:"queue",batchId:x,batchIndex:u+1,batchTotal:c,globalIndex:u+1};if(t==="image"){const g={prompt:n,model:r,modelRef:o,workflowId:f,batchId:x,batchIndex:u+1,batchTotal:c,globalIndex:u+1};m&&(g.size=m),e.length>0&&(g.referenceImages=e),a&&(g.params=a),p.push({id:_,mcp:"generate_image",args:g,options:y,description:c>1?`生成图片 (${u+1}/${c})`:"生成图片",status:"pending"})}else if(t==="video"){const g={prompt:n,model:r,modelRef:o,seconds:v||"5",workflowId:f,batchId:x,batchIndex:u+1,batchTotal:c,globalIndex:u+1};m&&(g.size=m),e.length>0&&(g.referenceImages=e),a&&(g.params=a),p.push({id:_,mcp:"generate_video",args:g,options:y,description:c>1?`生成视频 (${u+1}/${c})`:"生成视频",status:"pending"})}else if(t==="audio"){const g=typeof(a==null?void 0:a.sunoAction)=="string"?a.sunoAction:"music",w=g==="lyrics",b={prompt:n,model:r,modelRef:o,sunoAction:g,workflowId:f,batchId:x,batchIndex:u+1,batchTotal:c,globalIndex:u+1};if(!w&&n){const I=Ie(n);(I.title||I.tags)&&(b.prompt=I.lyrics,I.title&&!(a!=null&&a.title)&&(b.title=I.title),I.tags&&!(a!=null&&a.tags)&&(b.tags=I.tags))}a&&(b.params=a,a.notifyHook&&(b.notifyHook=a.notifyHook),!w&&a.mv&&(b.mv=a.mv),!w&&a.title&&(b.title=a.title),!w&&a.tags&&(b.tags=a.tags),!w&&a.continueClipId&&(b.continueClipId=a.continueClipId),!w&&a.continueAt!==void 0&&a.continueAt!==null&&a.continueAt!==""&&(b.continueAt=Number(a.continueAt))),p.push({id:_,mcp:"generate_audio",args:b,options:y,description:c>1?`${w?"生成歌词":"生成音频"} (${u+1}/${c})`:w?"生成歌词":"生成音频",status:"pending"})}else{const g={prompt:n,model:r,modelRef:o,rawInput:k,workflowId:f,batchId:x,batchIndex:u+1,batchTotal:c,globalIndex:u+1};e.length>0&&(g.referenceImages=e),a&&(g.params=a),p.push({id:_,mcp:"generate_text",args:g,options:y,description:"生成文本",status:"pending"})}}const W=t==="audio"&&p.every(u=>u.args.sunoAction==="lyrics");return{id:f,name:t==="image"?"图片生成":t==="video"?"视频生成":t==="text"?"文本生成":W?"歌词生成":"音频生成",description:`使用 ${r} 模型${c>1?`生成 ${c} 个`:"生成"}${t==="image"?"图片":t==="video"?"视频":t==="text"?"文本":W?"歌词":"音频"}`,scenarioType:"direct_generation",generationType:t,steps:p,metadata:{prompt:n,userInstruction:d,rawInput:k,modelId:r,modelRef:o,isModelExplicit:i,count:c,size:m,duration:v,referenceImages:e.length>0?e:void 0,selection:l},createdAt:Date.now()}}function ve(s,e=[]){const{generationType:t,modelId:r,modelRef:o,isModelExplicit:i,prompt:n,userInstruction:d,rawInput:k,count:c,size:m,duration:v,extraParams:a,selection:l}=s,p=K(),f={userInstruction:d,rawInput:k,model:{id:r,type:t==="agent"?"text":t,isExplicit:i},params:{count:c,size:m,duration:v,...a},selection:l,finalPrompt:n},x=[...l.images||[],...l.graphics||[]];let W=fe();x.length>0&&(W+=Y(x.length,l.imageDimensions));const u=re(f),_=[{role:"system",content:W},{role:"user",content:u}],y=[{id:`${p}-step-analyze`,mcp:"ai_analyze",args:{context:f,messages:_,referenceImages:x.length>0?x:void 0,textModel:r,modelRef:o},options:{mode:"async"},description:"AI 分析用户意图",status:"pending"}];return{id:p,name:"AI 智能生成",description:"AI 分析用户请求并执行相应操作",scenarioType:"agent_flow",generationType:t,steps:y,metadata:{prompt:n,userInstruction:d,rawInput:k,modelId:r,modelRef:o,isModelExplicit:i,count:c,size:m,duration:v,referenceImages:e.length>0?e:void 0,selection:l},createdAt:Date.now()}}function Te(s){const e=[];for(const t of s){const r=Q.getTool(t);if(!r)continue;const o=r.inputSchema.properties||{},i=r.inputSchema.required||[],n=r.promptGuidance,d=Object.entries(o).map(([c,m])=>{var W;const a=i.includes(c)?"(必填)":"(可选)",l=[];m.type&&l.push(`类型: ${m.type}`),m.enum&&Array.isArray(m.enum)&&l.push(`可选值: ${m.enum.map(u=>`"${u}"`).join(" | ")}`),m.default!==void 0&&l.push(`默认: "${m.default}"`);const p=l.length>0?` [${l.join(", ")}]`:"",f=(W=n==null?void 0:n.parameterGuidance)==null?void 0:W[c],x=f?`
|
|
31
|
-
💡 ${f}`:"";return` - **${c}**${a}: ${m.description||"无描述"}${p}${x}`}).join(`
|
|
32
|
-
`);let k=`### ${r.name}
|
|
33
|
-
${r.description}
|
|
34
|
-
|
|
35
|
-
**参数:**
|
|
36
|
-
${d||" 无参数"}`;n!=null&&n.whenToUse&&(k+=`
|
|
37
|
-
|
|
38
|
-
**使用场景:** ${n.whenToUse}`),e.push(k)}return e.length>0?e.join(`
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
`):""}async function Ke(s,e,t=[],r){const{generationType:o,modelRef:i,modelId:n,isModelExplicit:d,prompt:k,userInstruction:c,rawInput:m,count:v,size:a,duration:l,selection:p}=s,f=K(),x=e.id,W=e.name,u=e.type==="system"?e.description:e.content,_=c||k||m,y={input:_,count:v,size:a,model:n},g=te.parse(u,y,f,_);if(g)return{id:f,name:W,description:`使用「${W}」Skill 生成内容`,scenarioType:"skill_flow",skillId:x,generationType:o,steps:g.steps,metadata:{prompt:k,userInstruction:c,rawInput:m,modelId:n,modelRef:i,isModelExplicit:d,count:v,size:a,duration:l,referenceImages:t.length>0?t:void 0,selection:p,parseMethod:"regex"},createdAt:Date.now()};const w=[...p.images||[],...p.graphics||[]],b={userInstruction:c,rawInput:m,model:{id:n,type:o==="agent"?"text":o,isExplicit:d},params:{count:v,size:a,duration:l},selection:p,finalPrompt:k},I=e.type==="external",T=e.type==="user",M=e.outputType==="image"?"image":"text",h=I||T&&M==="image"?be(u,M):u;console.log(`[SkillFlow] Skill="${W}" type=${e.type} outputType=${M} isExternal=${I} contentLen=${(h==null?void 0:h.length)||0}`);const N=te.extractToolNamesFromContent(h),E=N.filter(z=>Q.hasTool(z));M==="image"&&!E.includes("generate_image")&&Q.hasTool("generate_image")&&E.push("generate_image");const R=E.includes("generate_image");if(console.log(`[SkillFlow] referencedTools=[${N.join(",")}] validTools=[${E.join(",")}] hasGenerateImage=${R} → 路径${E.length>0?"B":"C"}`),E.length>0){const z=Te(E);let P=`## 当前激活的 Skill:${W}
|
|
43
|
-
|
|
44
|
-
${h}`;z&&(P+=`
|
|
45
|
-
|
|
46
|
-
## 可用工具
|
|
47
|
-
|
|
48
|
-
${z}`),w.length>0&&(P+=Y(w.length,p.imageDimensions)),P+=`
|
|
49
|
-
|
|
50
|
-
## 响应格式(严格遵守)
|
|
51
|
-
|
|
52
|
-
你的响应必须是一个有效的 JSON 对象:
|
|
53
|
-
{"content": "你的分析内容", "next": [{"mcp": "工具名称", "args": {"参数名": "参数值"}}]}`,R&&(P+=`
|
|
54
|
-
|
|
55
|
-
## 执行要求
|
|
56
|
-
|
|
57
|
-
你必须严格按照以上 Skill 工作流指令执行。最终目标是:
|
|
58
|
-
1. 基于用户输入内容,按照 Skill 中的步骤分析并构建高质量的图片描述 prompt
|
|
59
|
-
2. 调用 generate_image 工具生成图片,将构建好的 prompt 作为参数传入
|
|
60
|
-
3. 不要仅输出文字描述,必须实际调用工具生成图片
|
|
61
|
-
|
|
62
|
-
你的回复必须包含对 generate_image 工具的调用,例如:
|
|
63
|
-
{"content": "分析与 prompt 构建过程", "next": [{"mcp": "generate_image", "args": {"prompt": "完整的图片描述 prompt"}}]}`);const ce=re(b),ue=[{role:"system",content:P},{role:"user",content:ce}],pe=[{id:`${f}-step-analyze`,mcp:"ai_analyze",args:{context:b,messages:ue,referenceImages:w.length>0?w:void 0,textModel:n,modelRef:i},options:{mode:"async"},description:`AI 分析用户意图(Skill: ${W})`,status:"pending"}];return{id:f,name:W,description:`使用「${W}」Skill 生成内容`,scenarioType:"skill_flow",skillId:x,generationType:o,steps:pe,metadata:{prompt:k,userInstruction:c,rawInput:m,modelId:n,isModelExplicit:d,count:v,size:a,duration:l,referenceImages:t.length>0?t:void 0,selection:p,parseMethod:"agent_fallback"},createdAt:Date.now()}}let L=h||"";w.length>0&&(L+=Y(w.length,p.imageDimensions)),R&&(L+=`
|
|
64
|
-
|
|
65
|
-
## 重要执行指引
|
|
66
|
-
|
|
67
|
-
请基于以上 Skill 指令构建详细的图片描述 prompt,并使用以下 JSON 格式回复以调用图片生成工具:
|
|
68
|
-
{"content": "你的分析", "next": [{"mcp": "generate_image", "args": {"prompt": "你构建的完整 prompt"}}]}
|
|
69
|
-
|
|
70
|
-
你必须实际调用 generate_image 工具生成图片,不要仅输出文字描述。`);const U=[{role:"system",content:L},{role:"user",content:_}],j=[{id:`${f}-step-analyze`,mcp:"ai_analyze",args:{context:b,messages:U,referenceImages:w.length>0?w:void 0,textModel:n,modelRef:i},options:{mode:"async"},description:`AI 以「${W}」角色回复`,status:"pending"}];return{id:f,name:W,description:`使用「${W}」Skill 生成内容`,scenarioType:"skill_flow",skillId:x,generationType:o,steps:j,metadata:{prompt:k,userInstruction:c,rawInput:m,modelId:n,modelRef:i,isModelExplicit:d,count:v,size:a,duration:l,referenceImages:t.length>0?t:void 0,selection:p,parseMethod:"agent_fallback"},createdAt:Date.now()}}function Ae(s,e=[]){return s.scenario==="direct_generation"?_e(s,e):ve(s,e)}function Me(s,e=0){try{let t=J(s);if(!t){const i=de(s),n=i.indexOf("{"),d=i.lastIndexOf("}");n>=0&&d>n&&(t=J(i.slice(n,d+1)))}if(!t)return{content:"",steps:[]};const r=typeof t.content=="string"?t.content:"";if(!Array.isArray(t.next)||t.next.length===0)return{content:r,steps:[]};const o=t.next.filter(i=>typeof i.mcp=="string"&&typeof i.args=="object").map((i,n)=>({id:`step-${e+n+1}`,mcp:i.mcp,args:i.args,description:Re(i.mcp,i.args),status:"pending"}));return{content:r,steps:o}}catch{return{content:"",steps:[]}}}function Re(s,e){var t,r,o,i;switch(s){case"generate_image":return`生成图片: ${((t=e.prompt)==null?void 0:t.substring(0,30))||""}...`;case"generate_video":return`生成视频: ${((r=e.prompt)==null?void 0:r.substring(0,30))||""}...`;case"generate_audio":return`生成音频: ${((o=e.prompt)==null?void 0:o.substring(0,30))||""}...`;case"generate_text":return`生成文本: ${((i=e.prompt)==null?void 0:i.substring(0,30))||""}...`;case"ai_analyze":return"AI 分析用户意图";case"format_markdown":return"格式化输出";case"show_result":return"展示结果";default:return`执行 ${s}`}}function Ee(s,e,t,r,o,i){return{...s,steps:s.steps.map(n=>n.id===e?{...n,status:t,result:r!==void 0?r:n.result,error:o,duration:i}:n)}}function $e(s,e){const t=new Set(s.steps.map(o=>o.id)),r=e.filter(o=>!t.has(o.id));return r.length===0?s:{...s,steps:[...s.steps,...r]}}function V(s){const e=s.steps.filter(n=>n.status==="completed").length,t=s.steps.filter(n=>n.status==="failed").length,r=s.steps.find(n=>n.status==="running"),o=s.steps.filter(n=>n.status==="pending").length;let i;return t>0?i="failed":r?i="running":o===0&&e>0?i="completed":i="pending",{status:i,completedSteps:e,totalSteps:s.steps.length,currentStep:r||s.steps.find(n=>n.status==="pending")}}const se={workflow:null,status:"idle",currentStep:null,completedSteps:0,totalSteps:0,error:null};function Ce(){const[s,e]=S.useState(se),t=S.useRef(null),r=S.useRef(!1),o=S.useCallback(l=>{t.current=l,r.current=!1;const p=V(l);e({workflow:l,status:"running",currentStep:p.currentStep||null,completedSteps:p.completedSteps,totalSteps:p.totalSteps,error:null})},[]),i=S.useCallback(l=>{t.current=l,r.current=!1;const p=V(l);let f="running";l.status==="completed"?f="completed":(l.status==="failed"||l.status==="cancelled")&&(f="failed"),e({workflow:l,status:f,currentStep:p.currentStep||null,completedSteps:p.completedSteps,totalSteps:p.totalSteps,error:l.error||null})},[]),n=S.useCallback((l,p,f,x,W)=>{if(r.current)return;const u=t.current;if(!u)return;const _=Ee(u,l,p,f,x,W);t.current=_,e(y=>{const g=V(_);let w="running";return g.status==="completed"?w="completed":g.status==="failed"&&(w="failed"),{...y,workflow:_,status:w,currentStep:g.currentStep||null,completedSteps:g.completedSteps,totalSteps:g.totalSteps,error:x||y.error}})},[]),d=S.useCallback(l=>{if(r.current||l.length===0)return;const p=t.current;if(!p)return;const f=$e(p,l);t.current=f,e(x=>{const W=V(f);return{...x,workflow:f,currentStep:W.currentStep||x.currentStep,totalSteps:W.totalSteps}})},[]),k=S.useCallback(l=>{const p=t.current;if(!p||r.current)return{content:"",steps:[]};const f=p.steps.length,{content:x,steps:W}=Me(l,f);return x&&!p.aiAnalysis&&(t.current={...p,aiAnalysis:x}),W.length>0&&d(W),{content:x,steps:W}},[d]),c=S.useCallback(()=>{t.current=null,r.current=!1,e(se)},[]),m=S.useCallback(()=>{r.current=!0,e(l=>({...l,status:"failed",error:"工作流已中止"}))},[]),v=S.useCallback(()=>{r.current=!1,e(l=>({...l,status:"running",error:null}))},[]),a=S.useCallback(()=>t.current,[]);return{state:s,startWorkflow:o,restoreWorkflow:i,updateStep:n,addSteps:d,addStepsFromAIResponse:k,resetWorkflow:c,abortWorkflow:m,resumeWorkflow:v,getWorkflow:a}}const ie=S.createContext(null),He=({children:s})=>{const e=Ce(),t=S.useMemo(()=>({state:e.state,startWorkflow:e.startWorkflow,restoreWorkflow:e.restoreWorkflow,updateStep:e.updateStep,addSteps:e.addSteps,addStepsFromAIResponse:e.addStepsFromAIResponse,resetWorkflow:e.resetWorkflow,abortWorkflow:e.abortWorkflow,resumeWorkflow:e.resumeWorkflow,getWorkflow:e.getWorkflow}),[e.state,e.startWorkflow,e.restoreWorkflow,e.updateStep,e.addSteps,e.addStepsFromAIResponse,e.resetWorkflow,e.abortWorkflow,e.resumeWorkflow,e.getWorkflow]);return me.jsxDEV(ie.Provider,{value:t,children:s},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/contexts/WorkflowContext.tsx",lineNumber:78,columnNumber:5},void 0)};function Pe(){const s=S.useContext(ie);if(!s)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return s}function De(){const s=Pe();return{startWorkflow:s.startWorkflow,restoreWorkflow:s.restoreWorkflow,updateStep:s.updateStep,addSteps:s.addSteps,addStepsFromAIResponse:s.addStepsFromAIResponse,resetWorkflow:s.resetWorkflow,abortWorkflow:s.abortWorkflow,resumeWorkflow:s.resumeWorkflow,getWorkflow:s.getWorkflow}}const Le=20,ne=2e3,ze=3e4;function ae(s){const e=new Map;if(!s)return e;for(const t of s){const r=t.result;r!=null&&r.taskId&&e.set(r.taskId,t.id)}return e}function le(s){var e;return s.status===Z.PROCESSING?{status:"running"}:s.status===Z.COMPLETED&&s.result?{status:"completed",result:{...s.result,taskId:s.id}}:s.status===Z.FAILED?{status:"failed",error:typeof s.error=="string"?s.error:((e=s.error)==null?void 0:e.message)||"Task failed"}:null}function Fe(s,e,t,r,o,i){const n=t.getWorkflow(),k=ae(n==null?void 0:n.steps).get(s.id);if(!k)return!1;const c=s.type!==oe.IMAGE&&(n==null?void 0:n.generationType)!=="image";e.status==="running"&&t.resumeWorkflow(),t.updateStep(k,e.status,e.result,e.error);const m=t.getWorkflow();if(m){const v=D(m);r.current(v);const a=o.current,l=i.current;c&&a&&l&&$.updateWorkflow(a,l,v)}return!0}function Ne(s,e,t,r,o,i){var d;const n=o.current;if(!n||s.type===oe.IMAGE)return!1;for(const k of n.children){if(!ge(k))continue;const c=k;if(c.workflow.generationType==="image")continue;const v=ae((d=c.workflow)==null?void 0:d.steps).get(s.id);if(!v)continue;const a=c.workflow.steps.map(p=>p.id!==v?p:{...p,status:e.status,...e.result!==void 0&&{result:e.result},...e.error!==void 0&&{error:e.error}}),l={...c.workflow,steps:a};if(e.status==="running"&&delete l.error,$.updateWorkflow(n,c.id,l),i.current=c.id,r.current(l),t.restoreWorkflow){const p={id:l.id,name:l.name||"",description:"",scenarioType:"direct_generation",generationType:l.generationType,status:e.status==="running"?"running":"failed",steps:a.map(f=>({id:f.id,mcp:f.mcp||"",args:f.args||{},description:f.description||"",status:f.status,result:f.result,error:f.error,duration:f.duration,options:f.options})),createdAt:l.createdAt||Date.now(),metadata:{prompt:l.prompt||"",userInstruction:"",rawInput:"",modelId:"",isModelExplicit:!1,count:l.count||1,selection:{texts:[],images:[],videos:[],graphics:[]}},aiAnalysis:l.aiAnalysis};t.restoreWorkflow(p)}return!0}return!1}function q(s,e,t,r,o){const i=s.task,n=le(i);return n?!!(Fe(i,n,e,t,r,o)||Ne(i,n,e,t,r,o)):!1}function Oe(s){const{workflowControl:e,boardRef:t,workZoneIdRef:r}=s,o=S.useRef(s.updateWorkflowMessage);S.useEffect(()=>{o.current=s.updateWorkflowMessage},[s.updateWorkflowMessage]);const i=S.useRef(new Map),n=S.useRef(null),d=S.useRef(0),k=S.useRef(!1);S.useEffect(()=>{const c=a=>{const l=i.current;if(!l.has(a.task.id)&&l.size>=Le){const p=l.keys().next().value;p&&l.delete(p)}l.set(a.task.id,a)},m=()=>{const a=new Map;for(const[l,p]of i.current.entries())q(p,e,o,t,r)||a.set(l,p);i.current=a,(a.size===0||Date.now()-d.current>ze)&&(n.current&&(clearInterval(n.current),n.current=null),i.current=new Map)};if(!k.current){k.current=!0;const a=X.getAllTasks();for(const l of a){const p=le(l);p&&(p.status==="completed"||p.status==="failed")&&q({task:l},e,o,t,r)}}const v=X.observeTaskUpdates().subscribe(a=>{if(a.type!=="taskUpdated")return;if(a.task.status===Z.PROCESSING&&i.current.has(a.task.id)){c(a),n.current||(d.current=Date.now(),n.current=setInterval(m,ne));return}q(a,e,o,t,r)?i.current.delete(a.task.id):(c(a),n.current||(d.current=Date.now(),n.current=setInterval(m,ne)))});return()=>{v.unsubscribe(),n.current&&(clearInterval(n.current),n.current=null),i.current=new Map}},[e,t,r])}let G=null;const Ue=new Promise(s=>{G=s});function D(s,e,t,r){var i;const o=s.metadata||{};return{id:s.id,name:s.name,generationType:s.generationType,prompt:o.prompt||((i=e==null?void 0:e.aiContext)==null?void 0:i.finalPrompt)||"",aiAnalysis:s.aiAnalysis,count:o.count,createdAt:s.createdAt,steps:s.steps.map(n=>({id:n.id,description:n.description,status:n.status,mcp:n.mcp,args:n.args,result:n.result,error:n.error,duration:n.duration,options:n.options})),retryContext:e,postProcessingStatus:t,insertedCount:r}}async function je(s,e){const{operation:t,params:r}=e;try{const{insertImageFromUrl:o}=await O(async()=>{const{insertImageFromUrl:c}=await import("./tool-windows-CtLXQDGF.js").then(m=>m.oP);return{insertImageFromUrl:c}},__vite__mapDeps([0]),import.meta.url),{insertVideoFromUrl:i}=await O(async()=>{const{insertVideoFromUrl:c}=await import("./tool-windows-CtLXQDGF.js").then(m=>m.oX);return{insertVideoFromUrl:c}},__vite__mapDeps([0]),import.meta.url),{insertAudioFromUrl:n}=await O(async()=>{const{insertAudioFromUrl:c}=await import("./tool-windows-CtLXQDGF.js").then(m=>m.oQ);return{insertAudioFromUrl:c}},__vite__mapDeps([0]),import.meta.url),{getSmartInsertionPoint:d}=await O(async()=>{const{getSmartInsertionPoint:c}=await import("./tool-windows-CtLXQDGF.js").then(m=>m.oO);return{getSmartInsertionPoint:c}},__vite__mapDeps([0]),import.meta.url),k=r.position?[r.position.x,r.position.y]:d(s)||[100,100];if(t==="canvas_insert"&&r.items)for(const c of r.items)c.type==="image"&&c.url?await o(s,c.url,k):c.type==="video"&&c.url?await i(s,c.url,k):c.type==="audio"&&c.url&&await n(s,c.url,c,k);else t==="insert_image"&&r.url?await o(s,r.url,k):t==="insert_video"&&r.url?await i(s,r.url,k):t==="insert_audio"&&r.url&&await n(s,r.url,r,k)}catch(o){console.error("[useWorkflowSubmission] Failed to insert to canvas:",o)}}function Ve(s){const{boardRef:e,workZoneIdRef:t}=s,r=De(),o=we(),i=S.useRef(o.sendWorkflowMessage),n=S.useRef(o.updateWorkflowMessage);S.useEffect(()=>{i.current=o.sendWorkflowMessage,n.current=o.updateWorkflowMessage},[o.sendWorkflowMessage,o.updateWorkflowMessage]),Oe({workflowControl:r,updateWorkflowMessage:o.updateWorkflowMessage,boardRef:e,workZoneIdRef:t});const d=S.useRef(null),k=S.useRef([]),c=S.useRef(!1),m=S.useRef(null),v=S.useCallback(u=>u!=="image",[]),a=S.useCallback(async()=>{if(!c.current){c.current=!0;try{await F.recoverWorkflows()}catch(u){console.warn("[useWorkflowSubmission] Failed to recover workflows:",u)}finally{G==null||G()}}},[]);S.useEffect(()=>{F.init(),F.registerCanvasHandler(async(_,y)=>({success:!0}));const u=F.subscribeToAllEvents(_=>{var y,g,w,b,I,T,A,M,C;if(_.type==="recovered"&&_.workflow){const h=_.workflow,N=h.status==="running"||h.status==="pending",E=h.status==="failed"&&h.updatedAt&&Date.now()-h.updatedAt<300*1e3;if(!N&&!E)return;(y=r.restoreWorkflow)==null||y.call(r,h);const R=ee.get(),L={aiContext:{rawInput:((g=h.context)==null?void 0:g.userInput)||"",userInstruction:((w=h.context)==null?void 0:w.userInput)||"",model:{id:((b=h.context)==null?void 0:b.model)||"",type:h.generationType==="video"?"video":h.generationType==="audio"?"audio":"image",isExplicit:!0},defaultModels:{image:R.imageModelName||"gemini-3-pro-image-preview-vip",video:R.videoModelName||"veo3.1",audio:R.audioModelName||"suno_music"},params:{count:(I=h.metadata)==null?void 0:I.count,size:(T=h.metadata)==null?void 0:T.size,duration:(A=h.metadata)==null?void 0:A.duration},selection:{texts:[],images:[],videos:[],graphics:[]},finalPrompt:((M=h.metadata)==null?void 0:M.prompt)||""},referenceImages:((C=h.context)==null?void 0:C.referenceImages)||[],textModel:R.textModelName},B=D(h,L);n.current(B);const U=e.current,j=t.current;v(h.generationType)&&j&&U&&$.updateWorkflow(U,j,B);const z=F.subscribeToWorkflow(h.id,async H=>{var P;await((P=m.current)==null?void 0:P.call(m,H,h,L))});k.current.push(z)}});return k.current.push(u),a(),()=>{k.current.forEach(_=>_.unsubscribe()),k.current=[]}},[]);const l=S.useCallback(async(u,_,y)=>{const g=e.current,w=t.current,b=v(_.generationType);switch(u.type){case"step":{r.updateStep(u.stepId,u.status,u.result,u.error,u.duration);const I=r.getWorkflow();if(I){const T=D(I,y);n.current(T),b&&w&&g&&$.updateWorkflow(g,w,T)}break}case"completed":{const I=r.getWorkflow();let T=!1;I&&I.steps.forEach(M=>{const C=M.result,h=C==null?void 0:C.taskId;h&&(T=!0),(M.status==="running"||M.status==="pending")&&!h&&r.updateStep(M.id,"completed")});const A=r.getWorkflow();if(A){const M=D(A,y);if(n.current(M),b&&w&&g){if($.updateWorkflow(g,w,M),A.steps.some(h=>h.status==="pending"||h.status==="running"))break;if(!T)setTimeout(()=>{$.removeWorkZone(g,w)},1500);else{const{workflowCompletionService:h}=await O(async()=>{const{workflowCompletionService:E}=await import("./tool-windows-CtLXQDGF.js").then(R=>R.oY);return{workflowCompletionService:E}},__vite__mapDeps([0]),import.meta.url);A.steps.every(E=>{const R=E.result;return R!=null&&R.taskId?h.isPostProcessingCompleted(R.taskId):!0})&&setTimeout(()=>{$.removeWorkZone(g,w)},1500)}}}break}case"failed":{r.abortWorkflow();const I=r.getWorkflow();if(I){const T=D(I,y);n.current(T),b&&w&&g&&$.updateWorkflow(g,w,T)}break}case"steps_added":{const I=u;r.addSteps(I.steps.map(A=>({id:A.id,mcp:A.mcp,args:A.args,description:A.description,status:A.status})));const T=r.getWorkflow();if(T){const A=D(T,y);n.current(A),b&&w&&g&&$.updateWorkflow(g,w,A)}break}case"canvas_insert":{g&&je(g,u);break}}},[r,e,t,v]);S.useEffect(()=>{m.current=l},[l]);const p=S.useCallback(async(u,_,y,g)=>{const w=g||Ae(u,_);r.startWorkflow(w);const b=ee.get(),I=b.textModelName,T=y||{aiContext:{rawInput:u.rawInput||u.userInstruction,userInstruction:u.userInstruction,model:{id:u.modelId,type:u.generationType,isExplicit:u.isModelExplicit},defaultModels:{image:b.imageModelName||"gemini-3-pro-image-preview-vip",video:b.videoModelName||"veo3.1",audio:b.audioModelName||"suno_music"},params:{count:u.count,size:u.size,duration:u.duration},selection:u.selection||{texts:[],images:[],videos:[],graphics:[]},finalPrompt:u.prompt},referenceImages:_,textModel:I};d.current=T;const A=D(w,T);return await i.current({context:T.aiContext,workflow:A,textModel:I,autoOpen:!1}),{workflowId:w.id,usedSW:!1}},[r]),f=S.useCallback(async u=>{await F.cancel(u),r.abortWorkflow()},[r]),x=S.useCallback(async(u,_)=>{const y=u.retryContext;if(!y){console.error("[useWorkflowSubmission] No retry context available");return}const g={prompt:u.prompt,userInstruction:y.aiContext.userInstruction,rawInput:y.aiContext.rawInput,modelId:y.aiContext.model.id,isModelExplicit:y.aiContext.model.isExplicit,generationType:y.aiContext.model.type,count:u.count||1,size:y.aiContext.params.size,duration:y.aiContext.params.duration,scenario:y.aiContext.model.type==="agent"?"agent_flow":"direct_generation",selection:y.aiContext.selection,parseResult:{},hasExtraContent:!1};await p(g,y.referenceImages||[],y)},[p]),W=S.useCallback(()=>d.current,[]);return{submitWorkflow:p,cancelWorkflow:f,retryWorkflow:x,getRetryContext:W}}const Je=Object.freeze(Object.defineProperty({__proto__:null,toWorkflowMessageData:D,useWorkflowSubmission:Ve,workflowRecoveryPromise:Ue},Symbol.toStringTag,{value:"Module"}));export{He as W,Qe as a,Ye as b,Ve as c,Ke as d,Ae as e,Je as f,Se as p,De as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{lG as i,lH as r,h0 as d,h2 as u}from"./tool-windows-CtLXQDGF.js";function l(e){const o=e.prompt||r;if(!e.videoData&&!e.youtubeUrl&&!e.videoCacheUrl)return{success:!1,error:"需要提供 videoData、videoCacheUrl 或 youtubeUrl",type:"error"};const t=d.createTask({prompt:e.taskLabel||"视频分析",model:e.model,modelRef:e.modelRef||null,mimeType:e.mimeType||"video/mp4",youtubeUrl:e.youtubeUrl,videoData:e.videoData,videoCacheUrl:e.videoCacheUrl,videoAnalyzerAction:"analyze",videoAnalyzerPrompt:o,videoAnalyzerSource:e.videoAnalyzerSource,videoAnalyzerSourceLabel:e.videoAnalyzerSourceLabel,videoAnalyzerSourceSnapshot:e.videoAnalyzerSourceSnapshot,autoInsertToCanvas:!1},u.CHAT);return{success:!0,data:{taskId:t.id,prompt:e.taskLabel||"视频分析",model:e.model},type:"text",taskId:t.id,task:t}}const c={name:"video_analyze",description:"分析视频内容,返回结构化的镜头拆解、脚本提取、风格分析等数据",supportedModes:["async","queue"],inputSchema:{type:"object",properties:{videoData:{type:"string",description:"base64 编码的视频数据(不含 data: 前缀),≤20MB"},mimeType:{type:"string",description:"视频 MIME 类型,默认 video/mp4",default:"video/mp4"},youtubeUrl:{type:"string",description:"YouTube 视频 URL"},videoCacheUrl:{type:"string",description:"本地缓存的视频 URL(队列模式)"},prompt:{type:"string",description:"自定义分析 prompt(可选,有内置默认值)"},model:{type:"string",description:"模型 ID,默认使用当前文本模型"}},required:[]},execute:async(e,o)=>(o==null?void 0:o.mode)==="queue"?l(e):i(e)};export{c as v};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{at as f,aP as u}from"./tool-windows-CtLXQDGF.js";async function h(e){if(!e||!e.children)return 0;let n=0;for(const c of e.children){const r=c.url;if(r&&r.startsWith("blob:")&&r.includes("#merged-video-")){const s=r.indexOf("#merged-video-");if(s===-1)continue;const i=r.substring(s+1),d=i.indexOf("#",1),o=d>0?i.substring(0,d):i;try{const t=await f.getCachedBlob(o);if(t){const a=`${URL.createObjectURL(t)}#${o}`,l=e.children.indexOf(c);u.setNode(e,{url:a},[l]),n++}else console.warn("[VideoRecovery] Cache not found for taskId:",o)}catch(t){console.error("[VideoRecovery] Failed to recover video:",o,t)}}}return n}function x(e){e&&requestAnimationFrame(async()=>{try{await h(e)}catch(n){console.error("[VideoRecovery] Initialization failed:",n)}})}export{x as initVideoRecoveryService,h as recoverExpiredVideoUrls};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./tool-windows-B-a9r3G3.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{at as z,kN as A,i2 as D,_ as b}from"./tool-windows-CtLXQDGF.js";async function O(t,e,i){if(t.size===0)throw new Error("Invalid frame blob: size is 0");const l=`/__aitu_cache__/video-frame_${e}_${i}`;return await z.cacheMediaFromBlob(l,t,"image",{metadata:{source:"video-frame",shotId:e,frameType:i}}),l}async function H(t,e,i){const l=URL.createObjectURL(t),c=document.createElement("video");c.muted=!0,c.preload="auto";try{await new Promise((m,h)=>{c.onloadedmetadata=()=>m(),c.onerror=()=>h(new Error("Failed to load video")),c.src=l});const a=document.createElement("canvas"),d=a.getContext("2d"),r=Math.min(1,320/c.videoWidth);a.width=Math.round(c.videoWidth*r),a.height=Math.round(c.videoHeight*r);const n=[];for(let m=0;m<e.length;m++){i==null||i(m,e.length);try{const h=await S(c,a,d,e[m]);n.push(h)}catch{n.push(null)}}return i==null||i(e.length,e.length),n}finally{URL.revokeObjectURL(l),c.src=""}}async function Z(t,e,i,l){const c=l||i,a=document.createElement("video");a.muted=!0,a.preload="auto",a.crossOrigin="anonymous";try{await new Promise((E,v)=>{a.onloadedmetadata=()=>E(),a.onerror=()=>v(new Error("Failed to load video")),a.src=t});const d=document.createElement("canvas"),s=d.getContext("2d"),n=Math.min(1,1280/a.videoWidth);d.width=Math.round(a.videoWidth*n),d.height=Math.round(a.videoHeight*n);const m=c==="first"?Math.min(.1,a.duration):Math.max(0,a.duration-.1),h=await S(a,d,s,m);return await O(h,e,i)}catch(d){return console.debug("[video-frame-cache] extractFrameFromUrl failed:",d),null}finally{a.src=""}}function S(t,e,i,l){return new Promise((c,a)=>{const d=Math.min(Math.max(0,l),t.duration||0);t.currentTime=d;const s=()=>{t.removeEventListener("seeked",s),i.drawImage(t,0,0,e.width,e.height),e.toBlob(r=>{r&&r.size>0?c(r):a(new Error("toBlob returned empty"))},"image/jpeg",.85)};t.addEventListener("seeked",s)})}function G(t){const{model:e,firstFrameUrl:i,lastFrameUrl:l,extraReferenceUrls:c=[],characterReferenceUrls:a=[]}=t,d=D(e),s=[],r=n=>{!n||s.includes(n)||s.push(n)};if(d.imageUpload.mode==="frames"){r(i),r(l);const n=s.length>0?s.slice(0,d.imageUpload.maxCount):void 0,m=a.length>0?a:void 0;return{referenceImages:n,unusedCharacterReferenceUrls:m}}for(const n of a)if(r(n),s.length>=d.imageUpload.maxCount)break;r(i);for(const n of c)if(r(n),s.length>=d.imageUpload.maxCount)break;return{referenceImages:s.length>0?s:void 0}}async function Y(t,e){return A(t,{interval:1e3,timeout:1800*1e3,signal:e})}function j(t){return Math.max(2,String(Math.max(t,0)).length)}function T(t,e){return String(t).padStart(e,"0")}function M(t,e,i){const l=T(t+1,i);return e==="first"?`${l}.首帧`:e==="last"?`${l}.尾帧`:`${l}.视频`}function P(t){return["#!/bin/sh","set -eu","",'cd "$(dirname "$0")"',"",`MANIFEST_FILE=${JSON.stringify(t)}`,"",'if [ ! -f "$MANIFEST_FILE" ]; then',' echo "未找到 $MANIFEST_FILE"'," exit 1","fi","","download_if_missing() {",' file_name="$1"',' source_url="$2"',' if [ -s "$file_name" ]; then',' echo "[skip] $file_name"'," return 0"," fi",' echo "[download] $file_name"',' curl -L --fail --retry 3 --retry-delay 1 --output "$file_name.part" "$source_url"',' mv "$file_name.part" "$file_name"',"}","","emit_entries() {"," if command -v node >/dev/null 2>&1; then",` node -e 'const fs=require("fs"); const manifest=JSON.parse(fs.readFileSync(process.argv[1],"utf8")); for (const entry of manifest.downloadEntries||[]) { if (entry?.fileName && entry?.url) process.stdout.write(String(entry.fileName)+"\\t"+String(entry.url)+"\\n"); }' "$MANIFEST_FILE"`," return 0"," fi",""," if command -v python3 >/dev/null 2>&1; then",` python3 - "$MANIFEST_FILE" <<'PY'`,"import json, sys","with open(sys.argv[1], 'r', encoding='utf-8') as fh:"," manifest = json.load(fh)","for entry in manifest.get('downloadEntries', []):"," file_name = entry.get('fileName')"," url = entry.get('url')"," if file_name and url:",' print(f"{file_name}\\t{url}")',"PY"," return 0"," fi","",' echo "需要 node 或 python3 来解析 $MANIFEST_FILE" >&2'," return 1","}","",'TMP_ENTRIES_FILE="$(mktemp -t workflow-download-entries.XXXXXX)"',`trap 'rm -f "$TMP_ENTRIES_FILE"' EXIT INT TERM`,"",'emit_entries > "$TMP_ENTRIES_FILE"',"","while IFS=' ' read -r file_name source_url; do",' [ -n "${file_name:-}" ] || continue',' [ -n "${source_url:-}" ] || continue',' download_if_missing "$file_name" "$source_url"','done < "$TMP_ENTRIES_FILE"',"",'echo "下载完成"',""].join(`
|
|
3
|
-
`)}function X(t){return t.map(e=>({...e,generated_first_frame_url:void 0,generated_last_frame_url:void 0,generated_video_url:void 0,suppressed_generated_urls:void 0}))}function V(t){return t.map(e=>({...e,referenceImageUrl:void 0}))}function q(t,e){return{shots:X(t),characters:V(e)}}function K(t){return t.flatMap((e,i)=>{const l=[];return e.generated_first_frame_url&&l.push({url:e.generated_first_frame_url,type:"image",kind:"first",shotIndex:i}),e.generated_last_frame_url&&l.push({url:e.generated_last_frame_url,type:"image",kind:"last",shotIndex:i}),e.generated_video_url&&l.push({url:e.generated_video_url,type:"video",kind:"video",shotIndex:i}),l})}async function Q(t){const{recordId:e,fileNamePrefix:i,zipBaseName:l,scriptMarkdown:c,recordMeta:a,shots:d,assets:s,audioAsset:r,onProgress:n}=t,m=new Date().toISOString(),h=j(d.length),E=T(0,h),{default:v}=await b(async()=>{const{default:o}=await import("./tool-windows-CtLXQDGF.js").then(u=>u.j);return{default:o}},__vite__mapDeps([0]),import.meta.url),{downloadFromBlob:N,getFileExtension:F,normalizeImageDataUrl:U,processBatchWithConcurrency:L}=await b(async()=>{const{downloadFromBlob:o,getFileExtension:u,normalizeImageDataUrl:p,processBatchWithConcurrency:_}=await import("./tool-windows-CtLXQDGF.js").then(w=>w.oK);return{downloadFromBlob:o,getFileExtension:u,normalizeImageDataUrl:p,processBatchWithConcurrency:_}},__vite__mapDeps([0]),import.meta.url),$=new v,f={exportedAt:m,record:a,files:{script:`${E}.脚本.md`,music:null,manifest:`${E}.manifest.json`,downloadScript:`${E}.补全下载.sh`},shots:d.map((o,u)=>({index:u+1,id:o.id,label:o.label||`镜头 ${u+1}`,startTime:o.startTime,endTime:o.endTime,files:{first:null,last:null,video:null}})),errors:[],downloadEntries:[]};if($.file(f.files.script,c),n==null||n(s.length>0||r?8:40),r!=null&&r.url){const o=r.plannedFileName||`${E}.音乐.mp3`;f.downloadEntries.push({fileName:o,url:r.url});try{const u=await fetch(r.url,{referrerPolicy:"no-referrer"});if(!u.ok)throw new Error(`HTTP ${u.status}`);const p=await u.blob(),_=F(r.url,p.type)||r.fallbackExtension||"mp3",w=o.replace(/\.[^.]+$/,`.${_}`);$.file(w,p),f.files.music=w,w!==o&&(f.downloadEntries[f.downloadEntries.length-1].fileName=w)}catch(u){f.files.music=o,f.errors.push(r.downloadErrorMessage||"音乐下载失败"),console.error("[workflow-export] Failed to export audio asset:",r.url,u)}}else r!=null&&r.missingErrorMessage&&f.errors.push(r.missingErrorMessage);await L(s,async(o,u)=>{const p=o.type==="image"?U(o.url):o.url,_=f.shots[o.shotIndex],w=o.type==="image"?"png":"mp4",I=`${M(o.shotIndex,o.kind,h)}.${w}`;f.downloadEntries.push({fileName:I,url:p});try{const g=await fetch(p,{referrerPolicy:"no-referrer"});if(!g.ok)throw new Error(`HTTP ${g.status}`);const x=await g.blob(),B=F(p,x.type)||w,y=`${M(o.shotIndex,o.kind,h)}.${B}`;$.file(y,x),_.files[o.kind]=y,y!==I&&(f.downloadEntries[f.downloadEntries.length-1].fileName=y)}catch(g){const x=(_==null?void 0:_.label)||`镜头 ${o.shotIndex+1}`;f.errors.push(`${x} ${o.kind} 下载失败`),_.files[o.kind]=I,console.error("[workflow-export] Failed to export asset:",p,g)}finally{const g=u+1,x=s.length>0?Math.round(g/s.length*62):62;n==null||n(8+x)}},3),$.file(f.files.downloadScript,P(f.files.manifest),{unixPermissions:493}),$.file(f.files.manifest,JSON.stringify(f,null,2));const W=await $.generateAsync({type:"blob"},o=>n==null?void 0:n(70+Math.round(o.percent*.3))),R=e.replace(/[^a-zA-Z0-9_-]/g,""),C=m.slice(0,19).replace(/[:T]/g,"-"),k=`${l}_${R||i}_${C}.zip`;return N(W,k),n==null||n(100),{assetCount:s.length,zipFileName:k}}export{K as a,Z as b,O as c,G as d,H as e,Q as f,q as r,Y as w};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./tool-windows-B-a9r3G3.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{hD as T,_ as h,aH as W,aw as R,eI as F,dj as M,gf as _,bE as C,W as P,P as D,G as J,l as K,kF as $,kG as X,kH as B,h2 as E,kI as G,kJ as q,hI as U,kK as L,kL as N,h0 as S,kM as j,h1 as I,iE as b,kN as Z,kO as H,kP as p,kQ as z}from"./tool-windows-CtLXQDGF.js";let v=null;function de(m){v=m}class Q{async execute(e){const{operation:t,args:r}=e;switch(t){case"canvas_insert":return this.handleCanvasInsert(r);case"insert_to_canvas":return this.handleInsertToCanvas(r);case"insert_mermaid":return this.handleMermaid(r);case"insert_mindmap":return this.handleMindmap(r);case"insert_svg":return this.handleSvg(r);case"generate_grid_image":return this.handleGridImage(r);case"generate_inspiration_board":return this.handleInspirationBoard(r);case"split_image":return this.handleSplitImage(r);case"generate_long_video":return this.handleLongVideo(r);case"ai_analyze":return this.handleAIAnalyze(r);case"generate_image":return this.handleGenerateImage(r);case"generate_video":return this.handleGenerateVideo(r);case"generate_audio":return this.handleGenerateAudio(r);default:return{success:!1,error:`Unknown operation: ${t}`,type:"error"}}}async handleGenerateAudio(e){return{success:!1,error:"SW 暂不支持直接处理音频生成,请回退到主线程执行",type:"audio"}}findWorkZoneForMCP(e,t){var a;const r=T.getAllWorkZones(e);if(r.length===0)return null;for(const o of r)if((a=o.workflow.steps)==null?void 0:a.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:s,verticalGap:a=50}=e;if(!r||r.length===0)return{success:!1,error:"没有要插入的内容",type:"error"};try{const{parseMarkdownToCards:o}=await h(async()=>{const{parseMarkdownToCards:d}=await import("./tool-windows-CtLXQDGF.js").then(g=>g.oR);return{parseMarkdownToCards:d}},__vite__mapDeps([0]),import.meta.url),{insertCardsToCanvas:n}=await h(async()=>{const{insertCardsToCanvas:d}=await import("./tool-windows-CtLXQDGF.js").then(g=>g.oS);return{insertCardsToCanvas:d}},__vite__mapDeps([0]),import.meta.url);let i=s||this.getInsertionPoint(t),c=0;for(const d of r){const{type:g,content:u,metadata:y}=d;switch(g){case"text":{const w=o(u);if(w&&w.length>0){const x=Math.round(window.innerWidth*.5);n(t,w,i,x);const A=Math.min(w.length,3),Y=Math.ceil(w.length/3);i=[i[0],i[1]+Y*140+a]}else W.insertText(t,i,u),i=[i[0],i[1]+100+a];c++;break}case"image":await M(t,u,i,!1,{width:400,height:400},!1,!0),i=[i[0],i[1]+400+a],c++;break;case"video":await F(t,u,i),i=[i[0],i[1]+300+a],c++;break;case"audio":await R(t,u,y,i,!1,!0),i=[i[0],i[1]+160+a],c++;break;case"svg":{const x={url:this.svgToDataUrl(u),width:400,height:400};W.insertImage(t,x,i),i=[i[0],i[1]+400+a],c++;break}}}const l=s||this.getInsertionPoint(t);return requestAnimationFrame(()=>{_(t,l)}),window.dispatchEvent(new CustomEvent("ai-generation-complete",{detail:{type:"text",success:!0}})),{success:!0,data:{insertedCount:c},type:"canvas"}}catch(o){return{success:!1,error:o.message||"插入失败",type:"error"}}}async handleCanvasInsert(e){const t=v;if(!t)return{success:!1,error:"画布未初始化",type:"error"};const{items:r,startPoint:s,verticalGap:a=50,horizontalGap:o=20}=e;if(!r||r.length===0)return{success:!1,error:"没有要插入的内容",type:"error"};try{let n=s||this.getInsertionPoint(t),i=0;for(const c of r){const{type:l,content:d,metadata:g}=c;switch(l){case"image":await M(t,d,n,!1,{width:400,height:400},!1,!0),n=[n[0],n[1]+400+a],i++;break;case"video":await F(t,d,n),n=[n[0],n[1]+300+a],i++;break;case"audio":await R(t,d,g,n,!1,!0),n=[n[0],n[1]+160+a],i++;break;case"text":W.insertText(t,n,d),n=[n[0],n[1]+100+a],i++;break;case"svg":const y={url:this.svgToDataUrl(d),width:400,height:400};W.insertImage(t,y,n),n=[n[0],n[1]+400+a],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:s}=await h(async()=>{const{parseMermaidToDrawnix:d}=await import("./index-VzDb_AHs.js").then(g=>g.aq);return{parseMermaidToDrawnix:d}},__vite__mapDeps([0]),import.meta.url),a=this.extractCodeBlock(r,"mermaid");let o;try{o=await s(a)}catch{o=await s(a.replace(/"/g,"'"))}const{elements:n}=o;if(!n||n.length===0)return{success:!1,error:"Mermaid 解析未生成元素",type:"error"};const i=this.findWorkZoneForMCP(t,"insert_mermaid"),c=this.getViewportCenter(t),l=this.insertElementsToCanvasAtPoint(t,n,c);return l.success&&(requestAnimationFrame(()=>{this.centerInsertedElementsInViewport(t,n.length)}),i&&setTimeout(()=>{T.removeWorkZone(t,i.id),window.dispatchEvent(new CustomEvent("ai-generation-complete",{detail:{type:"mermaid",success:!0}}))},100)),{success:l.success,data:{elementsCount:l.elementsCount},type:"canvas",error:l.error}}catch(s){return console.error("[SWCapabilities] Mermaid conversion failed:",s),{success:!1,error:`Mermaid 转换失败: ${s.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:s}=await h(async()=>{const{parseMarkdownToDrawnix:l}=await import("./index-D5qxbeGT.js");return{parseMarkdownToDrawnix:l}},__vite__mapDeps([0]),import.meta.url),a=this.extractCodeBlock(r,"markdown");let o;try{o=await s(a)}catch{o=await s(a.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(()=>{T.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(s){return console.error("[SWCapabilities] ❌ Mindmap conversion failed:",s),{success:!1,error:`思维导图转换失败: ${s.message}`,type:"error"}}}async handleSvg(e){const t=v;if(!t)return{success:!1,error:"画布未初始化",type:"error"};const{svg:r,width:s=400,startPoint:a}=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(s,100),800),l=i.height/i.width,d=c*l,g=this.svgToDataUrl(n);let u=a||this.getInsertionPoint(t);u=[u[0]-c/2,u[1]];const y={url:g,width:c,height:d};W.insertImage(t,y,u);const w=[u[0]+c/2,u[1]+d/2];return requestAnimationFrame(()=>{_(t,w)}),{success:!0,data:{width:c,height:d},type:"canvas"}}catch(o){return{success:!1,error:`SVG 插入失败: ${o.message}`,type:"error"}}}async handleGridImage(e){try{const{createGridImageTask:t}=await h(async()=>{const{createGridImageTask:s}=await import("./tool-windows-CtLXQDGF.js").then(a=>a.o_);return{createGridImageTask:s}},__vite__mapDeps([0]),import.meta.url),r=await t(e);return{success:r.success,data:r.data,type:r.type,taskId:r.taskId,error:r.error}}catch(t){return{success:!1,error:`宫格图生成失败: ${t.message}`,type:"error"}}}async handleInspirationBoard(e){try{const{createInspirationBoardTask:t}=await h(async()=>{const{createInspirationBoardTask:s}=await import("./tool-windows-CtLXQDGF.js").then(a=>a.o$);return{createInspirationBoardTask:s}},__vite__mapDeps([0]),import.meta.url),r=await t(e);return{success:r.success,data:r.data,type:r.type,taskId:r.taskId,error:r.error}}catch(t){return{success:!1,error:`灵感图生成失败: ${t.message}`,type:"error"}}}async handleSplitImage(e){const t=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:s}=await h(async()=>{const{splitAndInsertImages:o}=await import("./tool-windows-CtLXQDGF.js").then(n=>n.oV);return{splitAndInsertImages:o}},__vite__mapDeps([0]),import.meta.url),a=await s(t,r,{scrollToResult:!0});return{success:a.success,data:{count:a.count},type:"canvas",error:a.error}}catch(s){return{success:!1,error:`图片拆分失败: ${s.message}`,type:"error"}}}async handleLongVideo(e){try{const{createLongVideoTask:t}=await h(async()=>{const{createLongVideoTask:s}=await import("./tool-windows-CtLXQDGF.js").then(a=>a.p1);return{createLongVideoTask:s}},__vite__mapDeps([0]),import.meta.url),r=await t(e);return{success:r.success,data:r.data,type:r.type,taskId:r.taskId,error:r.error}}catch(t){return{success:!1,error:`长视频生成失败: ${t.message}`,type:"error"}}}async handleAIAnalyze(e){var t;try{const{analyzeWithAI:r}=await h(async()=>{const{analyzeWithAI:a}=await import("./tool-windows-CtLXQDGF.js").then(o=>o.p0);return{analyzeWithAI:a}},__vite__mapDeps([0]),import.meta.url),s=await r(e.context,{onChunk:a=>{},onAddSteps:a=>{}},e.modelRef||null);return{success:s.success,data:{response:s.response},type:"text",addSteps:(t=s.generatedSteps)==null?void 0:t.map(a=>({id:a.id,mcp:a.mcp,args:a.args,description:a.description,status:a.status})),error:s.error}}catch(r){return{success:!1,error:`AI 分析失败: ${r.message}`,type:"error"}}}async handleGenerateImage(e){var t;try{const{createImageTask:r}=await h(async()=>{const{createImageTask:a}=await import("./tool-windows-CtLXQDGF.js").then(o=>o.oM);return{createImageTask:a}},__vite__mapDeps([0]),import.meta.url),s=await r(e);return s.success?{success:!0,data:s.data,type:"image",taskId:s.taskId,taskIds:(t=s.data)==null?void 0:t.taskIds}:(console.error("[SWCapabilities] Image task creation failed:",s.error),{success:!1,error:s.error||"图片生成任务创建失败",type:"error"})}catch(r){return console.error("[SWCapabilities] Image generation error:",r),{success:!1,error:`图片生成失败: ${r.message}`,type:"error"}}}async handleGenerateVideo(e){var t;try{const{createVideoTask:r}=await h(async()=>{const{createVideoTask:a}=await import("./video-generation-C7qCz-ZF.js");return{createVideoTask:a}},__vite__mapDeps([0]),import.meta.url),s=await r(e);return s.success?{success:!0,data:s.data,type:"video",taskId:s.taskId,taskIds:(t=s.data)==null?void 0:t.taskIds}:(console.error("[SWCapabilities] Video task creation failed:",s.error),{success:!1,error:s.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 s=r.map(a=>e.children.find(o=>o.id===a)).filter(Boolean);if(s.length>0)try{const a=C(e,s,!1);return[a.x+a.width/2,a.y+a.height+50]}catch{}}if(e.children&&e.children.length>0){let s=0,a=100;for(const o of e.children)try{const n=C(e,[o],!1),i=n.y+n.height;i>s&&(s=i,a=n.x+n.width/2)}catch{}return[a,s+50]}return[100,100]}insertElementsToCanvas(e,t){try{const r=this.getInsertionPoint(e);return e.insertFragment({elements:JSON.parse(JSON.stringify(t))},r,P.paste),requestAnimationFrame(()=>{_(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,P.paste),requestAnimationFrame(()=>{_(e,r)}),{success:!0,elementsCount:t.length}}catch(s){return console.error("[SWCapabilities] insertElementsToCanvasAtPoint failed:",s),{success:!1,error:s.message}}}getViewportCenter(e){try{const r=D.getBoardContainer(e).getBoundingClientRect(),s=e.viewport.zoom,a=J(e);if(!a)return[0,0];const o=a[0]+r.width/(2*s),n=a[1]+r.height/(2*s);return[o,n]}catch(t){return console.warn("[SWCapabilities] Error getting viewport center:",t),[0,0]}}centerInsertedElementsInViewport(e,t){try{const s=e.children.slice(-t);if(s.length===0){console.warn("[SWCapabilities] No inserted elements found to center");return}const a=C(e,s,!1),n=D.getBoardContainer(e).getBoundingClientRect(),i=80,c=n.width-i*2,l=n.height-i*2,d=c/a.width,g=l/a.height;let u=Math.min(d,g);u=Math.min(Math.max(u,.2),1.5);const y=a.x+a.width/2,w=a.y+a.height/2,x=y-n.width/(2*u),A=w-n.height/(2*u);K.updateViewport(e,[x,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"),s=e.match(r);if(s)return s[1].trim();const a=new RegExp(`\`\`\`${t}\\s*([\\s\\S]*?)\\s*\`\`\``,"i"),o=e.match(a);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[,,a,o]=t[1].split(/\s+/).map(Number);if(a&&o)return{width:a,height:o}}const r=e.match(/width=["'](\d+)(?:px)?["']/i),s=e.match(/height=["'](\d+)(?:px)?["']/i);return r&&s?{width:parseInt(r[1]),height:parseInt(s[1])}:{width:400,height:400}}svgToDataUrl(e){return`data:image/svg+xml,${encodeURIComponent(e).replace(/'/g,"%27").replace(/"/g,"%22")}`}}const O=new Q,k=X.WORKFLOWS;class ee{async isAvailable(){try{return(await $()).objectStoreNames.contains(k)}catch{return!1}}async getDB(){return $()}async saveWorkflow(e){try{const t=await this.getDB();if(!t.objectStoreNames.contains(k))return;await new Promise((r,s)=>{const n=t.transaction(k,"readwrite").objectStore(k).put(e);n.onerror=()=>{r()},n.onsuccess=()=>r()})}catch{}}async getWorkflow(e){if(!e)return null;const t=await this.getDB();return new Promise((r,s)=>{const n=t.transaction(k,"readonly").objectStore(k).get(e);n.onerror=()=>s(n.error),n.onsuccess=()=>r(n.result||null)})}async deleteWorkflow(e){if(!e)return;const t=await this.getDB();return new Promise((r,s)=>{const n=t.transaction(k,"readwrite").objectStore(k).delete(e);n.onerror=()=>s(n.error),n.onsuccess=()=>r()})}close(){}}const f=new ee;function te(m){const e=m.steps.find(t=>t.status==="failed");return(e==null?void 0:e.error)||"Unknown error"}function re(m){return m.steps.filter(e=>e.status!=="pending"?!1:e.dependsOn&&e.dependsOn.length>0?e.dependsOn.every(t=>{const r=m.steps.find(s=>s.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 ae(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,params:se(e)}}async function ne(m,e={}){var d,g;const t={prompt:m,...e},r=B(t,E.IMAGE);if(!r.valid)throw new Error(r.errors.join(", "));const s=G(t);if(await q.waitForInitialization(),!U("image",e.modelRef||e.model))throw new Error("未配置 API Key,请在设置中配置");const a=L(),o=Date.now(),n=ae(s.prompt,e);await N.createTask(a,"image",n),S.trackExternalTask({id:a,type:E.IMAGE,status:I.PROCESSING,params:n,createdAt:o,updatedAt:o,startedAt:o,executionPhase:j.SUBMITTING}),(d=e.onTaskCreated)==null||d.call(e,a);const i={taskId:a,prompt:s.prompt,model:e.model,modelRef:e.modelRef||null,size:e.size,resolution:e.resolution,generationMode:e.generationMode,quality:e.quality,referenceImages:e.referenceImages,maskImage:e.maskImage,inputFidelity:e.inputFidelity,background:e.background,outputFormat:e.outputFormat,outputCompression:e.outputCompression,uploadedImages:e.uploadedImages,count:e.count,params:e.params};await(e.forceMainThread?b.getFallbackExecutor():await b.getExecutor()).generateImage(i,{signal:e.signal});const l=await Z(a,{signal:e.signal,onProgress:u=>{S.syncTaskFromStorage(a,u)}});return!l.success||!l.task?{task:l.task||{id:a,type:E.IMAGE,status:I.FAILED,params:{prompt:m},createdAt:Date.now(),updatedAt:Date.now(),error:{code:"GENERATION_ERROR",message:l.error||"图片生成失败"}}}:{task:l.task,url:(g=l.task.result)==null?void 0:g.url}}async function oe(m,e={}){var l,d,g;const t={prompt:m,...e},r=B(t,E.VIDEO);if(!r.valid)throw new Error(r.errors.join(", "));const s=G(t);if(await q.waitForInitialization(),!U("video",e.modelRef||e.model))throw new Error("未配置 API Key,请在设置中配置");const a=L(),o=Date.now();await N.createTask(a,"video",{prompt:s.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}),S.trackExternalTask({id:a,type:E.VIDEO,status:I.PROCESSING,params:{prompt:s.prompt,model:e.model||"veo3",modelRef:e.modelRef||null,size:e.size,params:e.params},createdAt:o,updatedAt:o,startedAt:o,executionPhase:j.SUBMITTING,progress:0}),(l=e.onTaskCreated)==null||l.call(e,a);const n={taskId:a,prompt:s.prompt,model:e.model||"veo3",modelRef:e.modelRef||null,duration:(d=e.duration)==null?void 0:d.toString(),size:e.size||"1280x720",inputReference:e.inputReference,inputReferences:e.inputReferences,referenceImages:e.referenceImages,params:e.params};await(e.forceMainThread?b.getFallbackExecutor():await b.getExecutor()).generateVideo(n,{signal:e.signal});const c=await Z(a,{signal:e.signal,onProgress:u=>{S.syncTaskFromStorage(a,u)}});return!c.success||!c.task?{task:c.task||{id:a,type:E.VIDEO,status:I.FAILED,params:{prompt:m},createdAt:Date.now(),updatedAt:Date.now(),error:{code:"GENERATION_ERROR",message:c.error||"视频生成失败"}}}:{task:c.task,url:(g=c.task.result)==null?void 0:g.url}}class V{constructor(e={}){this.workflows=new Map,this.abortControllers=new Map,this.events$=new H,this.options={stepTimeout:e.stepTimeout??600*1e3,continueOnError:e.continueOnError??!1,onEvent:e.onEvent??(()=>{}),executeMainThreadTool:e.executeMainThreadTool,forceFallbackExecutor:e.forceFallbackExecutor??!1},this.events$.subscribe(t=>{this.options.onEvent(t)})}async submitWorkflow(e){console.log("[WorkflowEngine] submitWorkflow 入口, id:",e.id,"steps:",e.steps.length),this.workflows.set(e.id,e);try{await f.saveWorkflow(e),console.log("[WorkflowEngine] submitWorkflow: IDB 保存完成")}catch(r){console.warn("[WorkflowEngine] submitWorkflow: IDB 保存失败,继续执行:",r)}const t=new AbortController;this.abortControllers.set(e.id,t),console.log("[WorkflowEngine] submitWorkflow: 开始异步执行工作流"),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"),s=t.steps.some(n=>n.status==="running"),a=t.steps.some(n=>n.status==="pending_main_thread");if(!r&&!s&&!a)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){console.log("[WorkflowEngine] executeWorkflow 开始, id:",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)}console.log("[WorkflowEngine] executeWorkflow: 状态已更新为 running"),this.emitEvent({type:"status",workflowId:e,status:"running"}),await this.executeSteps(t,r==null?void 0:r.signal);const s=t.steps.every(o=>o.status==="completed"||o.status==="skipped");t.steps.some(o=>o.status==="failed")&&!this.options.continueOnError?(t.status="failed",t.error=te(t)):s&&(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(s){t.status="failed",t.error=s.message||"Workflow execution failed",t.updatedAt=Date.now(),await f.saveWorkflow(t),this.emitEvent({type:"failed",workflowId:e,error:t.error||"Workflow execution failed"})}finally{this.abortControllers.delete(e)}}async executeSteps(e,t){for(;;){if(t!=null&&t.aborted)throw new Error("Workflow cancelled");const r=re(e);if(r.length===0)break;await Promise.all(r.map(s=>this.executeStep(e,s,t)))}}async executeStep(e,t,r){console.log("[WorkflowEngine] executeStep 开始:",t.mcp,"stepId:",t.id);const s=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()-s,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(a){if(t.status="failed",t.error=a.message||"Step execution failed",t.duration=Date.now()-s,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 a}}async executeToolStep(e,t,r){var s,a,o;switch(console.log("[WorkflowEngine] executeToolStep:",t.mcp,"stepId:",t.id,"forceFallback:",this.options.forceFallbackExecutor),t.mcp){case"generate_image":{const n=await ne(t.args.prompt,{model:t.args.model,modelRef:t.args.modelRef||null,size:t.args.size,referenceImages:t.args.referenceImages,generationMode:t.args.generationMode,maskImage:t.args.maskImage,inputFidelity:t.args.inputFidelity,background:t.args.background,outputFormat:t.args.outputFormat,outputCompression:t.args.outputCompression,count:t.args.count,params:t.args.params,forceMainThread:this.options.forceFallbackExecutor,signal:r,onTaskCreated:i=>{t.result={taskId:i},f.saveWorkflow(e)}});if(n.task.status===I.FAILED)throw new Error(((s=n.task.error)==null?void 0:s.message)||"Image generation failed");t.result={...n.task.result,taskId:n.task.id};break}case"generate_video":{const n=await oe(t.args.prompt,{model:t.args.model,modelRef:t.args.modelRef||null,duration:t.args.seconds??t.args.duration,size:t.args.size,referenceImages:t.args.referenceImages,params:t.args.params,forceMainThread:this.options.forceFallbackExecutor,signal:r,onTaskCreated:i=>{t.result={taskId:i},f.saveWorkflow(e)}});if(n.task.status===I.FAILED)throw new Error(((a=n.task.error)==null?void 0:a.message)||"Video generation failed");t.result={...n.task.result,taskId:n.task.id};break}case"generate_text":{const c=(await b.getFallbackExecutor().generateText({prompt:t.args.prompt,model:t.args.model,modelRef:t.args.modelRef||null,referenceImages:t.args.referenceImages,params:t.args.params},{signal:r})).content;t.result={content:c};const l=`${t.id}-insert-text`;if(!e.steps.find(d=>d.id===l)){const d={id:l,mcp:"insert_to_canvas",args:{items:[{type:"text",content:c}]},description:"将生成文本插入画布",status:"pending"};e.steps.push(d),await f.saveWorkflow(e),this.emitEvent({type:"steps_added",workflowId:e.id,steps:[d]})}break}case"ai_analyze":{const n=b.getFallbackExecutor(),i=t.id,c=await n.aiAnalyze({taskId:i,messages:t.args.messages,prompt:t.args.prompt,referenceImages:t.args.referenceImages,images:t.args.images,textModel:t.args.textModel,model:t.args.model,modelRef:t.args.modelRef||null},{signal:r});if(t.result={content:c.content},c.addSteps&&c.addSteps.length>0){for(const l of c.addSteps)e.steps.find(d=>d.id===l.id)||e.steps.push({id:l.id,mcp:l.mcp,args:l.args,description:l.description,status:l.status});await f.saveWorkflow(e),this.emitEvent({type:"steps_added",workflowId:e.id,steps:e.steps.filter(l=>l.status==="pending")})}else if(c.content&&c.content.trim()){const l=`${t.id}-insert-text`;if(!e.steps.find(d=>d.id===l)){const d=((o=e.metadata)==null?void 0:o.rawInput)||"",g=d.trim()?`# ${d.trim()}
|
|
3
|
-
|
|
4
|
-
`:"",u={id:l,mcp:"insert_to_canvas",args:{items:[{type:"text",content:g+c.content}]},description:"将 AI 回复插入画布",status:"pending"};e.steps.push(u),await f.saveWorkflow(e),this.emitEvent({type:"steps_added",workflowId:e.id,steps:[u]})}}break}case"generate_grid_image":case"generate_inspiration_board":case"split_image":case"generate_long_video":case"insert_mermaid":case"insert_mindmap":case"insert_svg":case"canvas_insert":case"insert_to_canvas":{if(!this.options.executeMainThreadTool)throw new Error(`No main thread tool executor configured for: ${t.mcp}`);const n=await this.options.executeMainThreadTool(t.mcp,t.args);if(!n.success)throw new Error(n.error||`${t.mcp} failed`);t.result=n.result;break}default:throw new Error(`Unknown tool: ${t.mcp}`)}}emitEvent(e){this.events$.next(e)}destroy(){for(const[e,t]of this.abortControllers)t.abort();this.abortControllers.clear(),this.workflows.clear(),this.events$.complete()}}class ie{constructor(){this.events$=new H,this.workflows=new Map,this.initialized=!1,this.fallbackEngine=null,this.pendingCanvasHandler=null}init(){this.initialized||(this.initialized=!0)}destroy(){this.events$.complete(),this.initialized=!1}async recoverWorkflows(){try{let e=[];if(await p.isAvailable()&&(e=await p.getAllWorkflows()),e.length===0)return[];for(const t of e){const r=this.workflows.get(t.id);(!r||t.updatedAt>(r.updatedAt||0))&&(this.workflows.set(t.id,t),t.status==="failed"&&(r==null?void 0:r.status)!=="failed"&&this.events$&&this.events$.next({type:"failed",workflowId:t.id,error:t.error||"Unknown error"}))}return e.filter(t=>t.status==="running"||t.status==="pending")}catch(e){return console.warn("[WorkflowSubmissionService] Failed to recover workflows:",e),[]}}getRunningWorkflows(){return Array.from(this.workflows.values()).filter(e=>e.status==="running"||e.status==="pending")}notifyStepUpdate(e,t,r,s,a,o){const n=this.workflows.get(e);if(n){const i=n.steps.find(c=>c.id===t);i&&(i.status=r,i.result=s,i.error=a,i.duration=o)}this.events$.next({type:"step",workflowId:e,stepId:t,status:r,result:s,error:a,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 s=await O.execute({operation:t,args:r});return{success:s.success,error:s.error}}catch(s){return{success:!1,error:s.message||"Main thread tool execution failed"}}}})),await this.fallbackEngine.resumeWorkflow(e),this.fallbackEngine.getWorkflow(e)!==void 0}createWorkflow(e,t=[]){const r=`wf_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,s=Date.now(),a=e.generationType==="video"?"generate_video":"generate_image",o={prompt:e.prompt,model:e.modelId,modelRef:e.modelRef||null};e.size&&(o.size=e.size),e.count&&e.count>1&&(o.count=e.count),e.duration&&(o.seconds=e.duration),t.length>0&&(o.referenceImages=t),e.extraParams&&(o.params=e.extraParams);const n=[],i=e.count||1;for(let l=0;l<i;l++)n.push({id:`step_${l}_${Math.random().toString(36).substr(2,9)}`,mcp:a,args:{...o,count:1},description:e.generationType==="video"?`生成视频 ${l+1}/${i}`:`生成图片 ${l+1}/${i}`,status:"pending"});return{id:r,name:e.generationType==="video"?"视频生成":"图片生成",steps:n,status:"pending",createdAt:s,updatedAt:s,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(console.log("[WorkflowSubmissionService][submit] 入口 workflowId:",e.id),this.workflows.set(e.id,e),p.invalidateCache(),!await this.tryFallbackEngine(e))throw this.workflows.delete(e.id),new Error("Submit workflow failed")}async tryFallbackEngine(e){try{if(!b.getFallbackExecutor())return console.warn("[WorkflowSubmissionService] tryFallbackEngine: fallback executor 不可用"),!1;console.log("[WorkflowSubmissionService] tryFallbackEngine: 使用降级执行器"),this.fallbackEngine||(this.fallbackEngine=new V({onEvent:s=>this.handleFallbackEngineEvent(s),forceFallbackExecutor:!0,executeMainThreadTool:async(s,a)=>{try{const o=await O.execute({operation:s,args:a});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(s=>({id:s.id,mcp:s.mcp,args:s.args,description:s.description,status:s.status,result:s.result,error:s.error,duration:s.duration,options:s.options})),status:e.status,createdAt:e.createdAt,updatedAt:e.updatedAt,completedAt:e.completedAt,error:e.error,context:e.context};return console.log("[WorkflowSubmissionService] tryFallbackEngine: 提交到主线程引擎, steps:",r.steps.length),await this.fallbackEngine.submitWorkflow(r),console.log("[WorkflowSubmissionService] tryFallbackEngine: 引擎已启动"),!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 s=t.steps.find(a=>a.id===e.stepId);s&&(s.status=e.status,s.result=e.result,s.error=e.error,s.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(s=>({id:s.id,mcp:s.mcp,args:s.args,description:s.description,status:s.status}))});break}}async cancel(e){p.invalidateCache(),this.fallbackEngine&&await this.fallbackEngine.cancelWorkflow(e)}getWorkflow(e){return this.workflows.get(e)}async queryWorkflowStatus(e){try{if(await p.isAvailable()){const t=await p.getWorkflow(e);if(t)return this.workflows.set(e,t),t}}catch(t){console.warn("[WorkflowSubmissionService] Failed to query workflow status:",t)}return this.workflows.get(e)||null}async queryAllWorkflows(){try{if(await p.isAvailable()){const e=await p.getAllWorkflows();for(const t of e)this.workflows.set(t.id,t);return e}}catch(e){console.warn("[WorkflowSubmissionService] Failed to query all workflows:",e)}return Array.from(this.workflows.values())}get events(){return this.events$.asObservable()}subscribeToWorkflow(e,t){return this.events$.pipe(z(r=>r.type==="canvas_insert"?!1:r.workflowId===e)).subscribe(t)}registerCanvasHandler(e){this.pendingCanvasHandler=e}subscribeToToolRequests(e){return this.events$.pipe(z(t=>t.type==="main_thread_tool_request")).subscribe(e)}subscribeToAllEvents(e){return this.events$.subscribe(e)}}const ce=new ie,ue=Object.freeze(Object.defineProperty({__proto__:null,workflowSubmissionService:ce},Symbol.toStringTag,{value:"Module"}));export{ue as a,de as s,ce as w};
|