aitu-app 0.6.63 → 0.6.64
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-Du5kXrAd.js → CanvasAudioPlayer-B2W5__ni.js} +1 -1
- package/assets/{ChatDrawer-CqZHx7x_.js → ChatDrawer-M1q92KNU.js} +2 -2
- package/assets/{ChatMessagesArea-AG3RXe34.js → ChatMessagesArea-D9LNDmbK.js} +2 -2
- package/assets/{DeferredAIInputBar-CNAPl6C2.js → DeferredAIInputBar-CKhI8Jhd.js} +2 -2
- package/assets/{DrawnixDeferredFeatures-BrhbEEBa.js → DrawnixDeferredFeatures-DxyxvT2y.js} +1 -1
- package/assets/{KnowledgeBaseContent-3hE8vBra.js → KnowledgeBaseContent-C_JxGQXg.js} +3 -3
- package/assets/{MVCreator-2NIxaaSL.js → MVCreator-DOt6pxq2.js} +1 -1
- package/assets/{ModelBenchmarkWorkbench-CacNyFbi.js → ModelBenchmarkWorkbench-3j77ocpe.js} +1 -1
- package/assets/{ModelDropdown-3MjTl1AO.js → ModelDropdown-CHYgRb1r.js} +1 -1
- package/assets/{MusicAnalyzer-Mmu92A4Y.js → MusicAnalyzer-BTXks5oV.js} +1 -1
- package/assets/{MusicAnalyzer-Drf2j8jn.js → MusicAnalyzer-Dr-DPePj.js} +1 -1
- package/assets/{ResizableDivider-B_67th7H.js → ResizableDivider-P1jpoJ3i.js} +1 -1
- package/assets/{TaskQueuePanel-VfjKIooN.js → TaskQueuePanel-D6NtMAbm.js} +1 -1
- package/assets/{VideoAnalyzer-DNWjNcIx.js → VideoAnalyzer-BHZMqLIa.js} +1 -1
- package/assets/{ai-generation-preferences-service-Ch1XhjkZ.js → ai-generation-preferences-service-CabuQA69.js} +1 -1
- package/assets/{arc-DE4qRd9D.js → arc-BajUk0_Z.js} +1 -1
- package/assets/{arc-DJ5Mb9x1.js → arc-Z9PGo_2L.js} +1 -1
- package/assets/{batch-image-generation-Bk8HSFol.js → batch-image-generation-RKz5tz-Y.js} +1 -1
- package/assets/{blockDiagram-38ab4fdb-B62iB8ti.js → blockDiagram-38ab4fdb-BsEJDcLK.js} +1 -1
- package/assets/{blockDiagram-38ab4fdb-D2MnfN1Q.js → blockDiagram-38ab4fdb-Cfmk3_6A.js} +1 -1
- package/assets/{c4Diagram-3d4e48cf-CgUaipiZ.js → c4Diagram-3d4e48cf-D2OyfHpd.js} +1 -1
- package/assets/{c4Diagram-3d4e48cf-DHV35ltP.js → c4Diagram-3d4e48cf-K-ewbsK1.js} +1 -1
- package/assets/{canvas-insertion-ZEZkcXvB.js → canvas-insertion-CYbFgP4L.js} +1 -1
- package/assets/channel-6DAc0JPc.js +1 -0
- package/assets/channel-WrMsNCbC.js +1 -0
- package/assets/{classDiagram-70f12bd4-C6X-VZXt.js → classDiagram-70f12bd4-BGEF352u.js} +1 -1
- package/assets/{classDiagram-70f12bd4-OH5sF1K-.js → classDiagram-70f12bd4-Gn3MZjEL.js} +1 -1
- package/assets/{classDiagram-v2-f2320105-otk4V9KH.js → classDiagram-v2-f2320105-C_aAfIgL.js} +1 -1
- package/assets/{classDiagram-v2-f2320105-D1I5s2af.js → classDiagram-v2-f2320105-DYPMFlcT.js} +1 -1
- package/assets/{clipper-BWlMmsTH.js → clipper-ByL4oIbZ.js} +1 -1
- package/assets/clone-keJVIubx.js +1 -0
- package/assets/{createText-2e5e7dd3-DuiUpOXV.js → createText-2e5e7dd3-C0UgSBh5.js} +1 -1
- package/assets/{createText-2e5e7dd3-D78Dn_q8.js → createText-2e5e7dd3-CoA6JNKB.js} +1 -1
- package/assets/{edges-e0da2a9e-Br3GgeJK.js → edges-e0da2a9e-DmyL0L_b.js} +1 -1
- package/assets/{edges-e0da2a9e-Dio4S9-4.js → edges-e0da2a9e-qdTreft0.js} +1 -1
- package/assets/{erDiagram-9861fffd-BYkBBs0M.js → erDiagram-9861fffd-Bjyf78Da.js} +1 -1
- package/assets/{erDiagram-9861fffd-DuZccGHy.js → erDiagram-9861fffd-DYWtVkXG.js} +1 -1
- package/assets/{flowDb-956e92f1-BvHxN76x.js → flowDb-956e92f1-Clfuqh48.js} +1 -1
- package/assets/{flowDb-956e92f1-D6cTY_st.js → flowDb-956e92f1-vnfymslR.js} +1 -1
- package/assets/{flowDiagram-66a62f08-Bh5LanWu.js → flowDiagram-66a62f08-54OX2XOH.js} +1 -1
- package/assets/{flowDiagram-66a62f08-rCNbZEwY.js → flowDiagram-66a62f08-lS8fOa4T.js} +1 -1
- package/assets/flowDiagram-v2-96b9c2cf-Bw7qAcFu.js +1 -0
- package/assets/flowDiagram-v2-96b9c2cf-DGyrUMgR.js +1 -0
- package/assets/{flowchart-elk-definition-4a651766-llVLlxyE.js → flowchart-elk-definition-4a651766-CXdElD40.js} +1 -1
- package/assets/{flowchart-elk-definition-4a651766-CIShIr5E.js → flowchart-elk-definition-4a651766-D4UghemK.js} +1 -1
- package/assets/{ganttDiagram-c361ad54-j2pPvoOi.js → ganttDiagram-c361ad54-Bl7rQCLW.js} +1 -1
- package/assets/{ganttDiagram-c361ad54-CUtUP4cJ.js → ganttDiagram-c361ad54-CwAjbWcn.js} +1 -1
- package/assets/{gitGraphDiagram-72cf32ee-hQmVrZTT.js → gitGraphDiagram-72cf32ee-B-ykaDuR.js} +1 -1
- package/assets/{gitGraphDiagram-72cf32ee-BijhDF7a.js → gitGraphDiagram-72cf32ee-ChvlaDvG.js} +1 -1
- package/assets/{graph-CVdXivUk.js → graph-Bq1HvHkL.js} +1 -1
- package/assets/{graph-iERr38Mn.js → graph-DM094zt_.js} +1 -1
- package/assets/{index-3862675e-BCU8UapW.js → index-3862675e-CA0xjB9W.js} +1 -1
- package/assets/{index-3862675e-BdD6mhWW.js → index-3862675e-DGrSmeWu.js} +1 -1
- package/assets/{index-CxqCKbLy.js → index-AFp_qpAI.js} +1 -1
- package/assets/{index-q02ppfIX.js → index-B4dceFKj.js} +1 -1
- package/assets/{index-BmNN2uGW.js → index-B67KSDhv.js} +1 -1
- package/assets/{index-ByxyNkwM.js → index-BC221_MJ.js} +1 -1
- package/assets/{index-nPSeKWRU.js → index-BGFWA6Zt.js} +1 -1
- package/assets/{index-DCjrDHEd.js → index-BH3jS3gm.js} +1 -1
- package/assets/{index-B-bas2QJ.js → index-BKTLxghO.js} +1 -1
- package/assets/{index-CW9BeyEu.js → index-Bks4xBST.js} +1 -1
- package/assets/{index-CvlBHvN3.js → index-BmEFRKV7.js} +1 -1
- package/assets/{index-DuFyvKRm.js → index-C3h-b0UN.js} +1 -1
- package/assets/{index-CmOEsqBQ.js → index-C5Onm0uO.js} +1 -1
- package/assets/{index-DYtXgeSz.js → index-CGelrSXy.js} +1 -1
- package/assets/{index-vw8fjMik.js → index-CKBsqCzR.js} +1 -1
- package/assets/{index-DjGrNkrV.js → index-CKjzms_e.js} +1 -1
- package/assets/{index-CxUWaNUo.js → index-CMLI8gQy.js} +1 -1
- package/assets/{index-CkjuY786.js → index-CVEllvWf.js} +1 -1
- package/assets/{index-BUZUbTWS.js → index-CW_ala_3.js} +1 -1
- package/assets/{index-BxdH1-er.js → index-Ci5Z3DWY.js} +1 -1
- package/assets/{index-BeRhCeQu.js → index-CtNjfEqK.js} +1 -1
- package/assets/{index-BakDREx4.js → index-CvbEsbIE.js} +1 -1
- package/assets/{index-BnaNWg7x.js → index-DM-iV9Y8.js} +2 -2
- package/assets/{index-DMfHKITi.js → index-DTqVJVfv.js} +1 -1
- package/assets/{index-BdSFouqR.js → index-DZtf3zC8.js} +1 -1
- package/assets/{index-ByECpktB.js → index-D_LadtY8.js} +1 -1
- package/assets/{index-UeGDfQIX.js → index-DiSWR48t.js} +1 -1
- package/assets/{index-D0O0qYML.js → index-DsFroXrj.js} +1 -1
- package/assets/{index-BN7eABQE.js → index-DxqCsnoj.js} +1 -1
- package/assets/{index-B_eFETCZ.js → index-Jvh12pKI.js} +1 -1
- package/assets/{index-CMQMxwMb.js → index-gHdnUGOu.js} +3 -3
- package/assets/{index-CE0NChcB.js → index-kKjFXTNL.js} +1 -1
- package/assets/{index-D4R9cQ86.js → index-v1v0x1ci.js} +3 -3
- package/assets/{infoDiagram-f8f76790-Cmv7jbWa.js → infoDiagram-f8f76790-C-wYgjah.js} +1 -1
- package/assets/{infoDiagram-f8f76790-D0DSz5Ue.js → infoDiagram-f8f76790-Cu-3eq4R.js} +1 -1
- package/assets/{journeyDiagram-49397b02-D6HU8bXU.js → journeyDiagram-49397b02-BG8aYQK6.js} +1 -1
- package/assets/{journeyDiagram-49397b02-Db00D03K.js → journeyDiagram-49397b02-DXPaY9vn.js} +1 -1
- package/assets/{layout-CPj4wl_r.js → layout-DvIBYRXu.js} +1 -1
- package/assets/{layout-DGJFFi9s.js → layout-SoDWNnQD.js} +1 -1
- package/assets/{line-D_WC7vRh.js → line-Bxc-zIvZ.js} +1 -1
- package/assets/{line-CpXi5g86.js → line-CFFXuH78.js} +1 -1
- package/assets/{linear-n85WiAhX.js → linear-BF0xIQKP.js} +1 -1
- package/assets/{linear-UpmxQM2f.js → linear-DQ3XkjOP.js} +1 -1
- package/assets/{main-DX4kRYQX.js → main-8GBlYJSO.js} +8 -8
- package/assets/{mermaid.core-N7WwfYcf.js → mermaid.core-BGyfnsLl.js} +3 -3
- package/assets/{mindmap-definition-fc14e90a-C8U6pdZ2.js → mindmap-definition-fc14e90a-CrYWIUXi.js} +1 -1
- package/assets/{mindmap-definition-fc14e90a-D2hbUBx2.js → mindmap-definition-fc14e90a-DOkI3ebm.js} +1 -1
- package/assets/{model-benchmark-launcher-BrOG9Vlm.js → model-benchmark-launcher-DtJmU6Wc.js} +1 -1
- package/assets/{model-benchmark-service-DDklUBjC.js → model-benchmark-service-B0QCqInK.js} +1 -1
- package/assets/{model-selection-BaH65gMK.js → model-selection-CbzU26xQ.js} +1 -1
- package/assets/{photo-wall-splitter-QuaIbsZ1.js → photo-wall-splitter-BPzdMtA1.js} +1 -1
- package/assets/{pieDiagram-8a3498a8-BPHw5PxR.js → pieDiagram-8a3498a8-ChLZxjKv.js} +1 -1
- package/assets/{pieDiagram-8a3498a8-DKV5uwrs.js → pieDiagram-8a3498a8-DAWd9-jL.js} +1 -1
- package/assets/{quadrantDiagram-120e2f19-pe-wI-U4.js → quadrantDiagram-120e2f19-CBBovNE2.js} +1 -1
- package/assets/{quadrantDiagram-120e2f19-DQdaeBYM.js → quadrantDiagram-120e2f19-DSvfgE7I.js} +1 -1
- package/assets/{requirementDiagram-deff3bca-DYepoptc.js → requirementDiagram-deff3bca-De51fyhT.js} +1 -1
- package/assets/{requirementDiagram-deff3bca-QX4OaNTO.js → requirementDiagram-deff3bca-ke6SiEw1.js} +1 -1
- package/assets/{sankeyDiagram-04a897e0-DJkKTFXr.js → sankeyDiagram-04a897e0-BxiqkhtK.js} +1 -1
- package/assets/{sankeyDiagram-04a897e0-1bYf2R8i.js → sankeyDiagram-04a897e0-Clr8_HiZ.js} +1 -1
- package/assets/{sequenceDiagram-704730f1-B52OA1Y3.js → sequenceDiagram-704730f1-Bc8zPHLG.js} +1 -1
- package/assets/{sequenceDiagram-704730f1-B4QsYTCd.js → sequenceDiagram-704730f1-BfBUJmAu.js} +1 -1
- package/assets/{settings-dialog-Bueh6yYA.js → settings-dialog-C9BMj8Zj.js} +1 -1
- package/assets/{skill-dsl-parser-CPpdtdC1.js → skill-dsl-parser-BxkJ9Ixc.js} +1 -1
- package/assets/{stateDiagram-587899a1-D221rMST.js → stateDiagram-587899a1-DAil8S_m.js} +1 -1
- package/assets/{stateDiagram-587899a1-X7bhoHKe.js → stateDiagram-587899a1-Vop8VRn5.js} +1 -1
- package/assets/{stateDiagram-v2-d93cdb3a-D9VdRPIN.js → stateDiagram-v2-d93cdb3a-8b1lkei5.js} +1 -1
- package/assets/{stateDiagram-v2-d93cdb3a-CGMASaM9.js → stateDiagram-v2-d93cdb3a-BHm8pPuv.js} +1 -1
- package/assets/{styles-6aaf32cf-D_xcN1dm.js → styles-6aaf32cf-BlD8JxQr.js} +1 -1
- package/assets/{styles-6aaf32cf-DHTzglnJ.js → styles-6aaf32cf-C4CEUYqK.js} +1 -1
- package/assets/{styles-9a916d00-w5Yn3LRO.js → styles-9a916d00-C6tkW5rH.js} +1 -1
- package/assets/{styles-9a916d00-BVoYXPeR.js → styles-9a916d00-Oss0YMv5.js} +1 -1
- package/assets/{styles-c10674c1-xX_gtHzZ.js → styles-c10674c1-D4YQTLGD.js} +1 -1
- package/assets/{styles-c10674c1-C3cgfc7I.js → styles-c10674c1-D6N_fge5.js} +1 -1
- package/assets/{svgDrawCommon-08f97a94-DFof-iml.js → svgDrawCommon-08f97a94-BOSx1sQS.js} +1 -1
- package/assets/{svgDrawCommon-08f97a94-DxU2UGYh.js → svgDrawCommon-08f97a94-RZvmFGZL.js} +1 -1
- package/assets/{timeline-definition-85554ec2-CzV_JohE.js → timeline-definition-85554ec2-BL5y0l6c.js} +1 -1
- package/assets/{timeline-definition-85554ec2-FPml3o0r.js → timeline-definition-85554ec2-BY6Jx-ZP.js} +1 -1
- package/assets/{tool-windows-hjm6YiPY.js → tool-windows-C4D0lII2.js} +137 -137
- package/assets/{ttd-dialog-CqISZ7cy.js → ttd-dialog-qD0QkDID.js} +4 -4
- package/assets/{use-runtime-models-C0uyCfar.js → use-runtime-models-BLwgp0M1.js} +1 -1
- package/assets/{useCharacters-BGdX9007.js → useCharacters-945b6dqW.js} +1 -1
- package/assets/{useWorkflowSubmission-BmFQdWt3.js → useWorkflowSubmission-Z0u0KCNN.js} +2 -2
- package/assets/{video-analyze-DszumYAr.js → video-analyze-Co9na7Gr.js} +1 -1
- package/assets/{video-generation-DEL-kJgF.js → video-generation-x2UMMPYg.js} +1 -1
- package/assets/{video-recovery-service-C9y_bfU1.js → video-recovery-service-BsV5nlEP.js} +1 -1
- package/assets/{workflow-generation-utils-Da12qXTb.js → workflow-generation-utils-CZULSJWQ.js} +2 -2
- package/assets/{workflow-submission-service-BuFuRV_m.js → workflow-submission-service-C-eCWm_8.js} +1 -1
- package/assets/{xychartDiagram-e933f94c-C41tCiSk.js → xychartDiagram-e933f94c-CNjZprqQ.js} +1 -1
- package/assets/{xychartDiagram-e933f94c-HanO46iU.js → xychartDiagram-e933f94c-DjIBec-i.js} +1 -1
- package/changelog.json +16 -0
- package/idle-prefetch-manifest.json +6 -6
- package/manifest.json +3 -3
- package/package.json +1 -1
- package/precache-manifest.json +304 -304
- package/sw.js +5 -5
- package/version.json +7 -3
- package/assets/channel-B5QZCgOy.js +0 -1
- package/assets/channel-CU3dhzIS.js +0 -1
- package/assets/clone-BAOxFbud.js +0 -1
- package/assets/flowDiagram-v2-96b9c2cf-BEdEe3Ip.js +0 -1
- package/assets/flowDiagram-v2-96b9c2cf-CVItVSoD.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as l,hs as ne,al as v,br as re,bs as le,as as V,ar as ce,y as t,kX as ie,hM as oe,bx as de,fF as R,bu as q,bt as J,bW as ue}from"./tool-windows-
|
|
1
|
+
import{r as l,hs as ne,al as v,br as re,bs as le,as as V,ar as ce,y as t,kX as ie,hM as oe,bx as de,fF as R,bu as q,bt as J,bW as ue}from"./tool-windows-C4D0lII2.js";const me=({images:o,onImagesChange:m,language:F="zh",disabled:f=!1,multiple:g=!0,maxCount:h=10,label:z,slotLabels:p,onError:c})=>{const[B,b]=l.useState(!1),[S,C]=l.useState(!1),[M,A]=l.useState(0),[j,I]=l.useState(null),N=l.useRef(null),P=l.useRef(null),{addAsset:L}=ne(),u={zh:{local:"本地",library:"素材库",dragHint:"拖拽图片到此处",pasteHint:"或 Ctrl+V 粘贴",invalidFile:"请上传图片文件",fileTooLarge:"图片大小不能超过 25MB",someFilesInvalid:"部分文件格式不支持或超过25MB限制",loadFailed:"加载图片失败",maxCountReached:"最多上传 {count} 张图片"},en:{local:"Local",library:"Library",dragHint:"Drop images here",pasteHint:"or Ctrl+V to paste",invalidFile:"Please upload image files",fileTooLarge:"Image size cannot exceed 25MB",someFilesInvalid:"Some files are not supported or exceed 25MB limit",loadFailed:"Failed to load image",maxCountReached:"Maximum {count} images allowed"}}[F],$=l.useCallback(e=>e.type.startsWith("image/")?e.size>25*1024*1024?(v.error(u.fileTooLarge),!1):!0:(v.error(u.invalidFile),!1),[u]),T=l.useCallback((e,a)=>new Promise((s,r)=>{const i=new FileReader;i.onload=()=>{s({url:i.result,name:a,file:(e instanceof File,e)})},i.onerror=r,i.readAsDataURL(e)}),[]),x=l.useCallback(async(e,a)=>{const r=Array.from(e).filter($);if(r.length===0)return;g&&o.length+r.length>h&&(v.warning(u.maxCountReached.replace("{count}",String(h))),r.splice(h-o.length));const i=[];for(const n of r)try{let d=n;if(n.size>10*1024*1024){const _=re(n.size/1048576),y=v.loading({content:F==="zh"?`正在压缩图片 (${(n.size/1024/1024).toFixed(1)}MB)...`:`Compressing image (${(n.size/1024/1024).toFixed(1)}MB)...`,duration:0,placement:"top"});try{d=await le(n,_.targetSizeMB),v.close(y),v.success({content:F==="zh"?`压缩完成: ${(n.size/1024/1024).toFixed(1)}MB → ${(d.size/1024/1024).toFixed(1)}MB`:`Compressed: ${(n.size/1024/1024).toFixed(1)}MB → ${(d.size/1024/1024).toFixed(1)}MB`,duration:2})}catch(D){v.close(y),console.error("[ReferenceImageUpload] Compression failed:",D),c==null||c(F==="zh"?"图片压缩失败":"Image compression failed");continue}}i.push({blob:d,name:n.name})}catch(d){console.error("[ReferenceImageUpload] Error processing file:",d),c==null||c(u.loadFailed);continue}if(i.length!==0){i.forEach(({blob:n,name:d})=>{L(n,V.IMAGE,ce.LOCAL,d).catch(_=>{console.warn("[ReferenceImageUpload] Failed to add asset to library:",_)})});try{const n=await Promise.all(i.map(({blob:d,name:_})=>T(d,_)));if(p&&a!==void 0){const d=[...o];d[a]=n[0],m(d.filter(Boolean))}else m(g?[...o,...n]:n.slice(0,1));c==null||c(null)}catch(n){console.error("[ReferenceImageUpload] Failed to process files:",n),c==null||c(u.loadFailed)}}},[o,g,h,p,F,$,T,L,m,c,u]),K=l.useCallback(e=>{const a=e.target.files;a&&a.length>0&&x(a,p?M:void 0),e.target.value=""},[x,p,M]),Q=l.useCallback(async e=>{try{const s=await(await fetch(e.url)).blob(),r=new FileReader;r.onload=()=>{const i={url:r.result,name:e.name};if(p){const n=[...o];n[M]=i,m(n.filter(Boolean))}else if(g){if(o.length>=h){v.warning(u.maxCountReached.replace("{count}",String(h)));return}m([...o,i])}else m([i]);b(!1),c==null||c(null)},r.readAsDataURL(s)}catch(a){console.error("[ReferenceImageUpload] Failed to convert asset to base64:",a),c==null||c(u.loadFailed),b(!1)}},[o,g,h,p,M,m,c,u]),U=l.useCallback(e=>{e.preventDefault(),e.stopPropagation(),f||C(!0)},[f]),O=l.useCallback(e=>{var s;e.preventDefault(),e.stopPropagation();const a=(s=N.current)==null?void 0:s.getBoundingClientRect();if(a){const{clientX:r,clientY:i}=e;(r<a.left||r>a.right||i<a.top||i>a.bottom)&&C(!1)}},[]),H=l.useCallback(e=>{e.preventDefault(),e.stopPropagation()},[]),X=l.useCallback((e,a)=>{if(e.preventDefault(),e.stopPropagation(),C(!1),f)return;const s=e.dataTransfer.files;s&&s.length>0&&x(s,a)},[f,x]);l.useEffect(()=>{const e=async a=>{var _;if(f)return;const s=document.activeElement,r=N.current;if(!r||!(r.contains(s)||s===document.body||(s==null?void 0:s.tagName)==="BODY"))return;const n=(_=a.clipboardData)==null?void 0:_.items;if(!n)return;const d=[];for(let y=0;y<n.length;y++){const D=n[y];if(D.type.startsWith("image/")){const Y=D.getAsFile();Y&&d.push(Y)}}d.length>0&&(a.preventDefault(),x(d))};return document.addEventListener("paste",e),()=>{document.removeEventListener("paste",e)}},[f,x]);const Z=l.useCallback(e=>{const a=o.filter((s,r)=>r!==e);I(null),m(a)},[o,m]),G=l.useCallback(e=>{var a;e!==void 0&&A(e),(a=P.current)==null||a.click()},[]),W=l.useCallback(e=>{e!==void 0&&A(e),b(!0)},[]),E=l.useCallback((e,a)=>{const s=a.currentTarget.getBoundingClientRect(),r=s.left+s.width/2,i=s.top-10;I({url:e,x:r,y:i})},[]),ee=l.useCallback(()=>{I(null)},[]),k=e=>t.jsx("div",{className:`reference-image-upload__placeholder ${S?"reference-image-upload__placeholder--dragging":""}`,onDragEnter:U,onDragLeave:O,onDragOver:H,onDrop:a=>X(a,e),children:t.jsxs("div",{className:"reference-image-upload__buttons",children:[t.jsx(R,{variant:"outline",icon:t.jsx(q,{size:16}),onClick:()=>G(e),disabled:f,"data-track":"reference_image_upload_local",className:"reference-image-upload__btn",children:u.local}),t.jsx(R,{variant:"outline",icon:t.jsx(J,{size:16}),onClick:()=>W(e),disabled:f,"data-track":"reference_image_upload_library",className:"reference-image-upload__btn",children:u.library})]})}),w=(e,a)=>t.jsxs("div",{className:"reference-image-upload__preview",onMouseEnter:s=>E(e.url,s),onMouseLeave:ee,children:[t.jsx("img",{src:e.url,alt:e.name,className:"reference-image-upload__image"}),t.jsx("button",{type:"button",className:"reference-image-upload__remove",onClick:()=>Z(a),disabled:f,"data-track":"reference_image_upload_remove",children:t.jsx(ue,{size:14})}),p&&p[a]&&t.jsx("div",{className:"reference-image-upload__slot-label",children:p[a]})]},a),ae=()=>p?t.jsx("div",{className:"reference-image-upload__slots",children:p.map((e,a)=>{const s=o[a];return t.jsxs("div",{className:"reference-image-upload__slot",children:[t.jsx("div",{className:"reference-image-upload__slot-title",children:e}),s?w(s,a):t.jsx("div",{className:`reference-image-upload__slot-placeholder ${S?"reference-image-upload__slot-placeholder--dragging":""}`,onDragEnter:U,onDragLeave:O,onDragOver:H,onDrop:r=>X(r,a),children:t.jsxs("div",{className:"reference-image-upload__slot-buttons",children:[t.jsx(R,{variant:"outline",icon:t.jsx(q,{size:16}),onClick:()=>G(a),disabled:f,"data-track":"reference_image_upload_slot_local",className:"reference-image-upload__slot-btn",children:u.local}),t.jsx(R,{variant:"outline",icon:t.jsx(J,{size:16}),onClick:()=>W(a),disabled:f,"data-track":"reference_image_upload_slot_library",className:"reference-image-upload__slot-btn",children:u.library})]})})]},a)})}):null,te=()=>{const e=g&&o.length<h;return t.jsxs("div",{className:"reference-image-upload__grid",children:[o.map((a,s)=>w(a,s)),e&&k(),o.length===0&&!e&&k()]})},se=()=>o.length>0?t.jsxs("div",{className:"reference-image-upload__single",children:[w(o[0],0),t.jsx("div",{className:"reference-image-upload__replace",children:k()})]}):k();return t.jsxs(t.Fragment,{children:[j&&ie.createPortal(t.jsx("div",{className:"reference-image-upload__hover-preview",style:{left:`${j.x}px`,top:`${j.y}px`,transform:"translate(-50%, -100%)"},children:t.jsx("img",{src:j.url,alt:"Preview"})}),document.body),t.jsxs("div",{ref:N,className:`reference-image-upload ${f?"reference-image-upload--disabled":""}`,tabIndex:0,children:[z&&t.jsx("div",{className:"reference-image-upload__label",children:z}),t.jsx("input",{ref:P,type:"file",accept:"image/*",multiple:g&&!p,onChange:K,className:"reference-image-upload__input",disabled:f}),p?ae():g?te():se(),B&&t.jsx(oe,{isOpen:B,onClose:()=>b(!1),mode:de.SELECT,filterType:V.IMAGE,onSelect:Q})]})]})};export{me as R};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r,ie as ct,y as t,am as ce,fF as j,dp as ot,al as u,bV as b,jD as ts,i9 as ye,jE as ss,jF as dt,aI as tt,hW as je,jG as as,fP as ne,eK as rs,bL as ls,jH as is,at as st,h1 as p,h0 as z,h8 as at,dj as rt,jI as ut,jJ as ns,jK as cs,jL as os,ho as ds,ig as us,ih as ms,jM as ps,ia as hs,jN as fs,jO as gs,jP as xs,ii as vs,jQ as Cs,jR as ys,jS as se,ij as js,d2 as _s,fR as ws,cX as lt,jT as it,jU as ie,g$ as Ce,eI as Is,jV as nt,jW as bs,jX as ks,aw as Ss,jY as Ds,jZ as Ns}from"./tool-windows-hjm6YiPY.js";import{T as Es,C as Us,u as mt,V as Ms,a as $s}from"./useCharacters-BGdX9007.js";/* empty css */import"./main-DX4kRYQX.js";const Ts=30,Ls=({onPreviewOpen:l,onDownload:f,className:o})=>{const[d,L]=r.useState([]),[P,_]=r.useState(!0),[k,S]=r.useState(!1),[q,R]=r.useState(!1),x=r.useRef(0),O=r.useRef(null),E=r.useCallback(async m=>{try{return await ct.getArchivedTasks(m,Ts)}catch{return{tasks:[],hasMore:!1}}},[]);r.useEffect(()=>{let m=!1;return _(!0),x.current=0,E(0).then(C=>{m||(L(C.tasks),R(C.hasMore),x.current=C.tasks.length,_(!1))}),()=>{m=!0}},[E]);const V=r.useCallback(async()=>{if(k||!q)return;S(!0);const m=await E(x.current);L(C=>[...C,...m.tasks]),R(m.hasMore),x.current+=m.tasks.length,S(!1)},[k,q,E]);return r.useEffect(()=>{const m=O.current;if(!m)return;const C=()=>{m.scrollHeight-m.scrollTop-m.clientHeight<200&&V()};return m.addEventListener("scroll",C,{passive:!0}),()=>m.removeEventListener("scroll",C)},[V]),P?t.jsxs("div",{className:"task-queue-panel__empty",children:[t.jsx(ce,{size:"small"}),t.jsx("div",{className:"task-queue-panel__empty-text",children:"加载历史任务..."})]}):d.length===0?t.jsxs("div",{className:"task-queue-panel__empty",children:[t.jsx("div",{className:"task-queue-panel__empty-icon",children:"📦"}),t.jsx("div",{className:"task-queue-panel__empty-text",children:"暂无历史任务"})]}):t.jsxs("div",{ref:O,className:o,style:{overflow:"auto",height:"100%"},children:[d.map(m=>t.jsx(Es,{task:m,onPreviewOpen:l?()=>l(m.id):void 0,onDownload:f},m.id)),q&&t.jsx("div",{style:{padding:"12px",textAlign:"center"},children:k?t.jsx(ce,{size:"small"}):t.jsx(j,{size:"small",variant:"text",theme:"default",onClick:V,children:"加载更多"})})]})},Ps=({character:l,onDelete:f,onSelect:o,compact:d=!1})=>{const[L,P]=r.useState(!1),_=l.status==="processing"||l.status==="pending",k=l.status==="failed",S=l.status==="completed",q=r.useCallback(async m=>{if(m.stopPropagation(),!l.username)return;const C=`@${l.username}`;try{await ot(C),u.success(`已复制: ${C}`)}catch(v){console.error("Failed to copy:",v),u.error("复制失败")}},[l.username]),R=r.useCallback(()=>{S&&o&&o(l)},[S,o,l]),x=r.useCallback(m=>{m.stopPropagation(),f==null||f(l.id)},[f,l.id]),O=r.useCallback(m=>{m.stopPropagation(),S&&l.profilePictureUrl&&P(!0)},[S,l.profilePictureUrl]),E=()=>l.profilePictureUrl||S?t.jsx(b,{content:"点击查看大图",children:t.jsx(Us,{characterId:l.id,profilePictureUrl:l.profilePictureUrl,alt:l.username||"Character",className:"character-card__avatar-img",onClick:O})}):t.jsx("div",{className:"character-card__avatar-placeholder",children:t.jsx(dt,{})}),V=()=>_?t.jsxs("div",{className:"character-card__status character-card__status--processing",children:[t.jsx(ce,{size:"small"}),t.jsx("span",{children:"创建中..."})]}):k?t.jsxs("div",{className:"character-card__status character-card__status--failed",children:["创建失败: ",l.error||"未知错误"]}):null;return d?t.jsxs("div",{className:`character-card character-card--compact ${_?"character-card--loading":""} ${k?"character-card--failed":""}`,onClick:R,children:[t.jsx("div",{className:"character-card__avatar",children:E()}),t.jsx("span",{className:"character-card__username-text",children:l.username||"创建中..."})]}):t.jsxs("div",{className:`character-card ${_?"character-card--loading":""} ${k?"character-card--failed":""}`,onClick:R,children:[t.jsx("div",{className:"character-card__avatar",children:E()}),t.jsxs("div",{className:"character-card__info",children:[S&&l.username?t.jsx(b,{content:"点击复制",children:t.jsxs("div",{className:"character-card__username",onClick:q,children:["@",l.username,t.jsx(ts,{className:"character-card__username-copy"})]})}):t.jsx("div",{className:"character-card__username",style:{cursor:"default"},children:_?"创建中...":"角色"}),l.id&&t.jsx(b,{content:l.id,placement:"bottom",children:t.jsx("div",{className:"character-card__source",children:l.id})}),V()]}),t.jsx("div",{className:"character-card__actions",children:t.jsx(b,{content:"删除角色",children:t.jsx(j,{size:"small",variant:"text",theme:"danger",icon:t.jsx(ye,{}),"data-track":"character_click_delete",onClick:x})})}),l.profilePictureUrl&&t.jsx(ss,{visible:L,onClose:()=>P(!1),items:[{url:l.profilePictureUrl,type:"image",title:`@${l.username||"Character"}`}]})]})},zs=({onSelect:l,completedOnly:f=!1,maxItems:o,showHeader:d=!0,title:L="角色列表"})=>{const{characters:P,completedCharacters:_,pendingCharacters:k,isLoading:S,deleteCharacter:q,refreshCharacters:R}=mt(),[x,O]=tt.useState(null),E=tt.useMemo(()=>{let v=f?_:P;return v=[...v].sort((oe,de)=>de.createdAt-oe.createdAt),o&&v.length>o&&(v=v.slice(0,o)),v},[f,P,_,o]),V=r.useCallback(v=>{O(v)},[]),m=r.useCallback(async()=>{if(!x)return;await q(x)?u.success("角色已删除"):u.error("删除失败"),O(null)},[x,q]),C=r.useCallback(async()=>{await R(),u.success("已刷新")},[R]);return S?t.jsxs("div",{className:"character-list__loading",children:[t.jsx(ce,{size:"small"}),t.jsx("span",{children:"加载中..."})]}):E.length===0?t.jsxs("div",{className:"character-list",children:[d&&t.jsxs("div",{className:"character-list__header",children:[t.jsx("h4",{children:L}),t.jsx(j,{size:"small",variant:"text",icon:t.jsx(je,{}),"data-track":"character_click_refresh",onClick:C})]}),t.jsxs("div",{className:"character-list__empty",children:[t.jsx("div",{className:"character-list__empty-icon",children:t.jsx(as,{})}),t.jsx("div",{children:"暂无角色"}),t.jsx("div",{style:{fontSize:"12px",marginTop:"4px",color:"#999"},children:"从已完成的 Sora-2 视频中提取角色"})]})]}):t.jsxs("div",{className:"character-list",children:[d&&t.jsxs("div",{className:"character-list__header",children:[t.jsxs("h4",{children:[L,k.length>0&&t.jsxs("span",{style:{fontWeight:"normal",fontSize:"12px",color:"#666",marginLeft:"8px"},children:["(",k.length," 创建中)"]})]}),t.jsx(j,{size:"small",variant:"text",icon:t.jsx(je,{}),"data-track":"character_click_refresh",onClick:C})]}),t.jsx("div",{className:"character-list__items",children:E.map(v=>t.jsx(Ps,{character:v,onDelete:V,onSelect:l},v.id))}),t.jsx(ne,{open:!!x,title:"确认删除",description:"确定要删除此角色吗?删除后将无法在提示词中使用该角色。",confirmText:"删除",cancelText:"取消",danger:!0,onOpenChange:v=>{v||O(null)},onConfirm:m})]})},{TabPanel:te}=ut,qs="task-queue-drawer-width";function Rs(l){var f,o,d;return Array.isArray((f=l.result)==null?void 0:f.urls)&&l.result.urls.length>0?l.result.urls.length:(o=l.result)!=null&&o.url||(d=l.result)!=null&&d.chatResponse||se(l)?1:0}function Os(l){const f=Rs(l);return{taskId:l.id,taskType:l.type,taskStatus:l.status,model:typeof l.params.model=="string"&&l.params.model.trim()?l.params.model:void 0,resultCount:f||void 0,hasMultipleResults:f>1}}const Bs=({expanded:l,onClose:f,onTaskAction:o})=>{const{tasks:d,activeTasks:L,completedTasks:P,failedTasks:_,cancelledTasks:k,isLoading:S,isLoadingMore:q,hasMore:R,totalCount:x,loadedCount:O,loadMore:E,retryTask:V,deleteTask:m,clearCompleted:C,clearFailed:v,batchDeleteTasks:oe,batchRetryTasks:de,batchCancelTasks:pt}=rs(),{board:H,openDialog:_e}=ls(),{characters:we}=mt(),[A,ht]=r.useState("all"),[ft,ue]=r.useState(!1),[Ie,gt]=r.useState("completed"),[ae,xt]=r.useState(""),[D,X]=r.useState("all"),[As,be]=r.useState(null),[vt,me]=r.useState(!1),[Ct,yt]=r.useState(0),[jt,_t]=r.useState("single"),[ke,pe]=r.useState(!1),[Se,he]=r.useState(""),[wt,fe]=r.useState(!1),[ge,De]=r.useState(null),[Ne,xe]=r.useState(null),[B,ee]=r.useState(!1),[g,Q]=r.useState(new Set),[It,ve]=r.useState(!1),[Ee,Ue]=r.useState(null),{isConfigured:bt}=is(),[re,Me]=r.useState(!1),[kt,le]=r.useState(0),$e=D==="character";r.useEffect(()=>{st.initCacheStatus()},[]),r.useEffect(()=>{if(!l)return;let s=!1;return ct.getArchivedTaskCount().then(e=>{s||Ue(e)}).catch(()=>{s||Ue(0)}),()=>{s=!0}},[l,A]);const W=r.useMemo(()=>{let s;switch(A){case"all":s=d;break;case"active":s=L;break;case"completed":s=P;break;case"failed":s=_;break;case"cancelled":s=k;break;case"archived":return[];default:s=d}if(D!=="all"&&D!=="character"&&(s=s.filter(e=>e.type===(D==="image"?p.IMAGE:D==="audio"?p.AUDIO:D==="text"?p.CHAT:p.VIDEO))),ae.trim()){const e=ae.toLowerCase().trim();s=s.filter(a=>{var c,y,w,I,K;return a.params.prompt.toLowerCase().includes(e)||String(((c=a.result)==null?void 0:c.title)||"").toLowerCase().includes(e)||String(((y=a.result)==null?void 0:y.lyricsTitle)||"").toLowerCase().includes(e)||String(((w=a.result)==null?void 0:w.lyricsText)||"").toLowerCase().includes(e)||String(((I=a.result)==null?void 0:I.chatResponse)||"").toLowerCase().includes(e)||(((K=a.result)==null?void 0:K.lyricsTags)||[]).some(n=>String(n).toLowerCase().includes(e))})}return[...s].sort((e,a)=>a.createdAt-e.createdAt)},[A,d,L,P,_,k,D,ae]),St=s=>{gt(s),ue(!0)},Dt=()=>{Ie==="completed"?C():v(),ue(!1)},Nt=s=>{V(s),o==null||o("retry",s)},Et=s=>{De(s),fe(!0)},Ut=()=>{ge&&(m(ge),o==null||o("delete",ge)),fe(!1),De(null)},Mt=()=>{B?(ee(!1),Q(new Set)):ee(!0)},$t=(s,e)=>{Q(a=>{const c=new Set(a);return e?c.add(s):c.delete(s),c})},Tt=()=>{const s=W.map(e=>e.id);Q(new Set(s))},Lt=()=>{Q(new Set)},Pt=()=>{g.size!==0&&ve(!0)},zt=()=>{oe(Array.from(g)),Q(new Set),ee(!1),ve(!1),u.success(`已删除 ${g.size} 个任务`)},qt=()=>{const s=Array.from(g).filter(e=>{const a=d.find(c=>c.id===e);return(a==null?void 0:a.status)===z.FAILED||(a==null?void 0:a.status)===z.CANCELLED});if(s.length===0){u.warning("没有可重试的任务");return}de(s),Q(new Set),ee(!1),u.success(`已重试 ${s.length} 个任务`)},Te=r.useMemo(()=>Array.from(g).filter(s=>{const e=d.find(a=>a.id===s);return(e==null?void 0:e.status)===z.FAILED||(e==null?void 0:e.status)===z.CANCELLED}).length,[g,d]),Le=r.useMemo(()=>Array.from(g).filter(s=>{const e=d.find(a=>a.id===s);return(e==null?void 0:e.status)===z.PENDING||(e==null?void 0:e.status)===z.PROCESSING}).length,[g,d]),Pe=r.useMemo(()=>Array.from(g).filter(s=>{const e=d.find(a=>a.id===s);return(e==null?void 0:e.status)===z.COMPLETED&&((e==null?void 0:e.type)===p.IMAGE||(e==null?void 0:e.type)===p.VIDEO)}).length,[g,d]),Y=r.useMemo(()=>({all:d.length,image:d.filter(s=>s.type===p.IMAGE).length,video:d.filter(s=>s.type===p.VIDEO).length,audio:d.filter(s=>s.type===p.AUDIO).length,text:d.filter(s=>s.type===p.CHAT).length,character:we.length}),[d,we]),Rt=()=>{const s=Array.from(g).filter(e=>{const a=d.find(c=>c.id===e);return(a==null?void 0:a.status)===z.PENDING||(a==null?void 0:a.status)===z.PROCESSING});if(s.length===0){u.warning("没有可取消的进行中任务");return}pt(s),Q(new Set),ee(!1),u.success(`已取消 ${s.length} 个任务`)},Ot=async()=>{const s=Array.from(g).filter(e=>{const a=d.find(c=>c.id===e);return(a==null?void 0:a.status)===z.COMPLETED&&((a==null?void 0:a.type)===p.IMAGE||(a==null?void 0:a.type)===p.VIDEO)});if(!(s.length===0||re)){Me(!0),le(0);try{const e=await ys.syncMultipleTasks(s,(a,c)=>{le(Math.round(a/c*100))});console.log("[TaskQueuePanel] Batch sync result:",e),le(100),e.succeeded>0&&u.success(`已同步 ${e.succeeded} 个任务`),e.failed>0&&u.warning(`${e.failed} 个任务同步失败`)}catch(e){console.error("[TaskQueuePanel] Batch sync failed:",e),u.error("同步失败,请稍后重试")}finally{Me(!1),le(0)}}},ze=async s=>{const e=d.find(c=>c.id===s);if(e&&se(e)){u.info("歌词任务支持复制或插入画布");return}if(!e)return;const a=js(e);if(a.length!==0)try{const c=await _s(a);c.openedCount>0&&c.downloadedCount===0?u.success(c.openedCount>1?`已打开 ${c.openedCount} 个链接,请在新标签页下载`:"资源不支持直接下载,已打开链接"):u.success(e.type===p.AUDIO?a.length>1?"多条音频已开始下载":"音频下载成功":a.length>1?"多图已开始下载":"下载成功"),ws.track("generation_result_download",{...Os(e),downloadedCount:c.downloadedCount,openedCount:c.openedCount}),o==null||o("download",s)}catch(c){console.error("Download failed:",c),u.error("下载失败,请稍后重试")}},At=async s=>{const e=d.find(c=>c.id===s);if(!e||!se(e)){u.warning("暂无可复制的歌词");return}const a=it(e);if(!a.trim()){u.warning("暂无可复制的歌词");return}try{await ot(a),u.success("歌词已复制"),o==null||o("copy",s)}catch(c){console.error("Failed to copy lyrics:",c),u.error("复制失败,请稍后重试")}},Vt=async s=>{var a,c,y,w,I,K,n,Z,F,J,N,U;const e=d.find(i=>i.id===s);if(!e||!H){console.warn("Cannot insert: task result or board not available"),u.warning("无法插入:白板未就绪");return}if(!((a=e.result)!=null&&a.url)&&!((y=(c=e.result)==null?void 0:c.urls)!=null&&y.length)&&!se(e)){const i=e.type===p.CHAT?(w=e.result)==null?void 0:w.chatResponse:void 0;if(i!=null&&i.trim()){const h=(e.params.prompt||"").slice(0,20)||void 0;await ie({items:[{type:"text",content:i,label:h}]}),u.success("文本已插入到白板"),Ce.markAsInserted(s,"manual"),o==null||o("insert",s);return}console.warn("Cannot insert: task result is empty"),u.warning("无法插入:任务结果为空");return}try{const i=e.result;if(e.type===p.IMAGE){const h=(I=i.urls)!=null&&I.length?i.urls:[i.url];for(const M of h)await rt(H,at(M));u.success(h.length>1?"多图已插入到白板":"图片已插入到白板")}else if(e.type===p.VIDEO)await Is(H,i.url),u.success("视频已插入到白板");else if(e.type===p.AUDIO){if(se(e)){const G=nt(i,e.params.title||e.params.prompt)||(e.params.prompt||"").slice(0,20)||void 0;await ie({items:[{type:"text",content:it(e),label:G,metadata:{title:nt(i,e.params.title||e.params.prompt),tags:bs(i)}}]}),u.success("歌词已插入到白板"),Ce.markAsInserted(s,"manual"),o==null||o("insert",s);return}const h=ks(i),M=(n=(K=i.clips)==null?void 0:K[0])==null?void 0:n.duration,$={title:i.title||e.params.title||e.params.prompt,duration:typeof M=="number"?M:i.duration,previewImageUrl:i.previewImageUrl,tags:typeof e.params.tags=="string"?e.params.tags:void 0,mv:typeof e.params.mv=="string"?e.params.mv:void 0,prompt:e.params.prompt,providerTaskId:i.providerTaskId||e.remoteId,clipId:i.primaryClipId||((F=(Z=i.clips)==null?void 0:Z[0])==null?void 0:F.clipId)||((N=(J=i.clips)==null?void 0:J[0])==null?void 0:N.id)||((U=i.clipIds)==null?void 0:U[0]),clipIds:i.clipIds};h.length===1?await Ss(H,h[0],$):await ie({items:h.map((G,T)=>{var Ve,Fe,Ge,He,Be,We,Ke,Qe,Xe,Ye,Ze,Je,et;return{type:"audio",content:G,groupId:`task-audio-${e.id}`,dimensions:{width:Ns,height:Ds},metadata:{...$,title:((Fe=(Ve=i.clips)==null?void 0:Ve[T])==null?void 0:Fe.title)||`${$.title||"Audio"} ${T+1}`,previewImageUrl:((He=(Ge=i.clips)==null?void 0:Ge[T])==null?void 0:He.imageLargeUrl)||((We=(Be=i.clips)==null?void 0:Be[T])==null?void 0:We.imageUrl)||$.previewImageUrl,duration:typeof((Qe=(Ke=i.clips)==null?void 0:Ke[T])==null?void 0:Qe.duration)=="number"?i.clips[T].duration||void 0:$.duration,clipId:((Ye=(Xe=i.clips)==null?void 0:Xe[T])==null?void 0:Ye.clipId)||((Je=(Ze=i.clips)==null?void 0:Ze[T])==null?void 0:Je.id)||((et=i.clipIds)==null?void 0:et[T])||$.clipId}}})}),u.success(h.length>1?"多条音频卡片已插入到白板":"音频卡片已插入到白板")}else if(e.type===p.CHAT){const h=i.chatResponse||"",M=(e.params.prompt||"").slice(0,20)||void 0;await ie({items:[{type:"text",content:h,label:M}]}),u.success("文本已插入到白板")}Ce.markAsInserted(s,"manual"),o==null||o("insert",s)}catch(i){console.error("Failed to insert to board:",i),u.error(`插入失败: ${i instanceof Error?i.message:"未知错误"}`)}},Ft=s=>{var a,c,y,w;const e=d.find(I=>I.id===s);if(!e){console.warn("Cannot edit: task not found");return}if(e.type===p.IMAGE){const I={initialPrompt:e.params.prompt,initialWidth:e.params.width,initialHeight:e.params.height,initialImages:e.params.uploadedImages,initialResultUrl:(a=e.result)==null?void 0:a.url,initialResultUrls:(c=e.result)==null?void 0:c.urls};_e(lt.aiImageGeneration,I)}else if(e.type===p.VIDEO){const I={initialPrompt:e.params.prompt,initialDuration:typeof e.params.seconds=="string"?parseInt(e.params.seconds,10):e.params.seconds,initialModel:e.params.model,initialSize:e.params.size,initialImages:e.params.uploadedImages,initialResultUrl:(y=e.result)==null?void 0:y.url,initialResultUrls:(w=e.result)==null?void 0:w.urls};_e(lt.aiVideoGeneration,I)}else if(e.type===p.AUDIO){u.info("音频任务暂不支持从任务面板直接编辑");return}o==null||o("edit",s)},Gt=s=>{const e=d.find(a=>a.id===s);e&&(xe(e),o==null||o("extractCharacter",s))},qe=r.useMemo(()=>{const s=new Set;return W.filter(e=>{var a,c,y,w;return e.status!==z.COMPLETED||!((a=e.result)!=null&&a.url)&&!((y=(c=e.result)==null?void 0:c.urls)!=null&&y.length)||e.type!==p.IMAGE&&e.type!==p.VIDEO&&!(e.type===p.AUDIO&&((w=e.result)==null?void 0:w.resultKind)!=="lyrics")||s.has(e.id)?!1:(s.add(e.id),!0)})},[W]),{previewMediaItems:Ht,taskIdToPreviewConfig:Re}=r.useMemo(()=>{var a,c,y,w,I,K;const s=[],e=new Map;for(const n of qe){const Z=s.length,F=((a=n.result)==null?void 0:a.title)||n.params.title||((c=n.params.prompt)==null?void 0:c.substring(0,50))||"媒体预览";if(n.type===p.AUDIO){const N=((w=(y=n.result)==null?void 0:y.clips)==null?void 0:w.filter(h=>!!h.audioUrl).map((h,M)=>{var $,G,T;return{id:h.clipId||h.id||`${n.id}-${M}`,url:h.audioUrl,type:"audio",title:h.title||(($=n.result)!=null&&$.clips&&n.result.clips.length>1?`${F} (${M+1}/${n.result.clips.length})`:F),posterUrl:h.imageLargeUrl||h.imageUrl||((G=n.result)==null?void 0:G.previewImageUrl),duration:typeof h.duration=="number"?h.duration:(T=n.result)==null?void 0:T.duration,prompt:n.params.prompt,tags:typeof n.params.tags=="string"?n.params.tags:void 0,artist:n.params.model||n.params.mv||"Aitu",album:"Aitu Generated"}}))??[],U=(I=n.result.urls)!=null&&I.length?n.result.urls:n.result.url?[n.result.url]:[],i=N.length>0?N:U.map((h,M)=>{var $,G;return{id:U.length>1?`${n.id}-${M}`:n.id,url:h,type:"audio",title:U.length>1?`${F} (${M+1}/${U.length})`:F,posterUrl:($=n.result)==null?void 0:$.previewImageUrl,duration:(G=n.result)==null?void 0:G.duration,prompt:n.params.prompt,tags:typeof n.params.tags=="string"?n.params.tags:void 0,artist:n.params.model||n.params.mv||"Aitu",album:"Aitu Generated"}});s.push(...i)}else{const N=(K=n.result.urls)!=null&&K.length?n.result.urls:[n.result.url],U=n.type===p.VIDEO?"video":"image";for(let i=0;i<N.length;i++){const h=U==="image"?at(N[i]):N[i];s.push({id:N.length>1?`${n.id}-${i}`:n.id,url:h,type:U,title:N.length>1?`${F} (${i+1}/${N.length})`:F})}}const J=s.length-Z;e.set(n.id,{mode:n.type===p.AUDIO&&J>1?"compare":"single",index:n.type===p.AUDIO&&J>1?Array.from({length:Math.min(J,4)},(N,U)=>Z+U):Z})}return{previewMediaItems:s,taskIdToPreviewConfig:e}},[qe]),Oe=r.useCallback(s=>{be(s);const e=Re.get(s);e!==void 0&&(_t(e.mode),yt(e.index),me(!0))},[Re]),Bt=r.useCallback(()=>{be(null),me(!1)},[]),Wt=r.useCallback(s=>{s.type==="image"&&(he(s.url),pe(!0),me(!1))},[]),Kt=r.useCallback(async s=>{if(H)try{const e=`edited-image-${Date.now()}`,a=`/__aitu_cache__/image/${e}.png`,y=await(await fetch(s)).blob();await st.cacheMediaFromBlob(a,y,"image",{taskId:e}),await rt(H,a),pe(!1),he("")}catch(e){console.error("Failed to insert edited image:",e)}},[H]),Qt=r.useCallback(()=>{f==null||f()},[f]),Xt=x>0?x:d.length,Ae="这里只显示最近 100 个任务,更早的任务会自动移到“历史”中继续保留。",Yt=t.jsx(b,{content:Ae,children:t.jsxs("span",{children:["全部 (",Xt,")"]})}),Zt=Ee===null?"历史":`历史 (${Ee})`,Jt=x>=100?`已加载最近 ${x} 个任务,较早任务已移至“历史”`:`已加载全部 ${x} 个任务`,es=t.jsxs("div",{className:"task-queue-panel__filters-container",children:[t.jsxs(ut,{value:A,onChange:s=>ht(s),children:[t.jsx(te,{value:"all",label:Yt}),t.jsx(te,{value:"active",label:`生成中 (${L.length})`}),t.jsx(te,{value:"failed",label:`失败 (${_.length})`}),t.jsx(te,{value:"completed",label:`已完成 (${P.length})`}),t.jsx(te,{value:"archived",label:Zt})]}),A!=="archived"&&t.jsxs("div",{className:"task-queue-panel__filters",children:[t.jsxs("div",{className:"task-queue-panel__type-filters",children:[t.jsx(b,{content:`全部 (${Y.all})`,children:t.jsx(j,{size:"small",variant:"text",shape:"square",onClick:()=>X("all"),className:D==="all"?"task-queue-panel__filter-btn--active":"",children:t.jsx(ns,{size:"16px"})})}),t.jsx(b,{content:`图片 (${Y.image})`,children:t.jsx(j,{size:"small",variant:"text",shape:"square",onClick:()=>X("image"),className:D==="image"?"task-queue-panel__filter-btn--active":"",children:t.jsx(cs,{size:"16px"})})}),t.jsx(b,{content:`视频 (${Y.video})`,children:t.jsx(j,{size:"small",variant:"text",shape:"square",onClick:()=>X("video"),className:D==="video"?"task-queue-panel__filter-btn--active":"",children:t.jsx(os,{size:"16px"})})}),t.jsx(b,{content:`音频 (${Y.audio})`,children:t.jsx(j,{size:"small",variant:"text",shape:"square",onClick:()=>X("audio"),className:D==="audio"?"task-queue-panel__filter-btn--active":"",children:t.jsx(ds,{size:16,strokeWidth:1.9})})}),t.jsx(b,{content:`文本 (${Y.text})`,children:t.jsx(j,{size:"small",variant:"text",shape:"square",onClick:()=>X("text"),className:D==="text"?"task-queue-panel__filter-btn--active":"",children:"文"})}),t.jsx(b,{content:`角色 (${Y.character})`,children:t.jsx(j,{size:"small",variant:"text",shape:"square",onClick:()=>X("character"),className:D==="character"?"task-queue-panel__filter-btn--active":"",children:t.jsx(dt,{size:"16px"})})})]}),t.jsxs("div",{className:"task-queue-panel__search-row",children:[t.jsx(us,{value:ae,onChange:s=>xt(s),placeholder:"搜索...",clearable:!0,prefixIcon:t.jsx(ms,{}),size:"small",className:"task-queue-panel__search-input"}),t.jsxs("div",{className:"task-queue-panel__filter-actions",children:[t.jsx(b,{content:B?"退出多选":"批量操作",children:t.jsx(j,{size:"small",variant:B?"base":"outline",theme:B?"primary":"default",icon:t.jsx(ps,{}),"data-track":"task_click_toggle_selection",onClick:Mt,children:B?"退出":"多选"})}),_.length>0&&!B&&t.jsx(b,{content:"清除失败",children:t.jsx(j,{size:"small",variant:"text",theme:"default",icon:t.jsx(ye,{style:{color:"var(--td-text-color-placeholder)"}}),"data-track":"task_click_clear_failed",onClick:()=>St("failed"),className:"task-queue-panel__clear-btn"})})]})]})]}),B&&!$e&&t.jsxs("div",{className:"task-queue-panel__batch-actions",children:[t.jsxs("div",{className:"task-queue-panel__batch-select",children:[t.jsx(hs,{checked:g.size===W.length&&W.length>0,indeterminate:g.size>0&&g.size<W.length,onChange:s=>s?Tt():Lt()}),t.jsxs("span",{className:"task-queue-panel__batch-count",children:["已选 ",g.size," / ",W.length]})]}),t.jsxs("div",{className:"task-queue-panel__batch-buttons",children:[Le>0&&t.jsxs(j,{size:"small",variant:"outline",theme:"warning",icon:t.jsx(fs,{}),"data-track":"task_click_batch_cancel",onClick:Rt,children:["取消 (",Le,")"]}),Te>0&&t.jsxs(j,{size:"small",theme:"primary",icon:t.jsx(je,{}),"data-track":"task_click_batch_retry",onClick:qt,children:["重试 (",Te,")"]}),bt&&Pe>0&&t.jsx(b,{content:"同步选中的任务到云端",placement:"bottom",children:t.jsx(j,{size:"small",variant:"outline",icon:t.jsx(gs,{}),"data-track":"task_click_batch_sync",onClick:Ot,disabled:re,loading:re,children:re?`${kt}%`:`同步 (${Pe})`})}),t.jsxs(j,{size:"small",variant:"text",theme:"default",icon:t.jsx(ye,{}),"data-track":"task_click_batch_delete",onClick:Pt,disabled:g.size===0,children:["删除 (",g.size,")"]})]})]})]});return t.jsxs(t.Fragment,{children:[t.jsx(xs,{isOpen:l,onClose:Qt,title:"任务队列",filterSection:es,position:"toolbar-right",width:"responsive",storageKey:qs,showBackdrop:!1,closeOnEsc:!1,showCloseButton:!0,className:"task-queue-panel",contentClassName:"task-queue-panel__content",resizable:!0,minWidth:320,maxWidth:1024,"data-testid":"task-queue-panel",children:$e?t.jsx(zs,{showHeader:!1,title:""}):A==="archived"?t.jsx(Ls,{onPreviewOpen:Oe,onDownload:ze,className:"task-queue-panel__list"}):t.jsx(Ms,{tasks:W,selectionMode:B,selectedTaskIds:g,onSelectionChange:$t,onRetry:Nt,onDelete:Et,onDownload:ze,onInsert:Vt,onCopy:At,onEdit:Ft,onPreviewOpen:Oe,onExtractCharacter:Gt,hasMore:R,isLoadingMore:q,onLoadMore:E,totalCount:x,loadedCount:O,allLoadedText:Jt,allLoadedHint:x>=100?Ae:void 0,className:"task-queue-panel__list",emptyContent:S?t.jsxs("div",{className:"task-queue-panel__empty",children:[t.jsx("div",{className:"task-queue-panel__empty-icon",children:"⏳"}),t.jsx("div",{className:"task-queue-panel__empty-text",children:"加载中..."})]}):t.jsxs("div",{className:"task-queue-panel__empty",children:[t.jsx("div",{className:"task-queue-panel__empty-icon",children:"📋"}),t.jsx("div",{className:"task-queue-panel__empty-text",children:A==="all"?"暂无任务":`暂无${A==="active"?"生成中":A==="completed"?"已完成":A==="failed"?"失败":"已取消"}任务`})]})})}),t.jsx(ne,{open:ft,title:"确认清除",description:`确定要清除所有${Ie==="completed"?"已完成":"失败"}的任务吗?此操作无法撤销。`,confirmText:"清除",cancelText:"取消",danger:!0,onOpenChange:ue,onConfirm:Dt}),t.jsx(ne,{open:wt,title:"确认删除",description:"确定要删除此任务吗?此操作无法撤销。",confirmText:"删除",cancelText:"取消",danger:!0,onOpenChange:fe,onConfirm:Ut}),t.jsx(ne,{open:It,title:"确认批量删除",description:`确定要删除选中的 ${g.size} 个任务吗?此操作无法撤销。`,confirmText:"删除",cancelText:"取消",danger:!0,onOpenChange:ve,onConfirm:zt}),t.jsx(vs,{visible:vt,items:Ht,initialMode:jt,initialIndex:Ct,onClose:Bt,showThumbnails:!0,onEdit:Wt}),ke&&Se&&t.jsx(Cs,{visible:ke,imageUrl:Se,showOverwrite:!1,onClose:()=>{pe(!1),he("")},onInsert:H?Kt:void 0}),t.jsx($s,{visible:!!Ne,task:Ne,onClose:()=>xe(null),onCreateStart:()=>{},onCreateComplete:s=>{xe(null)}})]})};export{qs as TASK_DRAWER_WIDTH_KEY,Bs as TaskQueuePanel};
|
|
1
|
+
import{r,ie as ct,y as t,am as ce,fF as j,dp as ot,al as u,bV as b,jD as ts,i9 as ye,jE as ss,jF as dt,aI as tt,hW as je,jG as as,fP as ne,eK as rs,bL as ls,jH as is,at as st,h1 as p,h0 as z,h8 as at,dj as rt,jI as ut,jJ as ns,jK as cs,jL as os,ho as ds,ig as us,ih as ms,jM as ps,ia as hs,jN as fs,jO as gs,jP as xs,ii as vs,jQ as Cs,jR as ys,jS as se,ij as js,d2 as _s,fR as ws,cX as lt,jT as it,jU as ie,g$ as Ce,eI as Is,jV as nt,jW as bs,jX as ks,aw as Ss,jY as Ds,jZ as Ns}from"./tool-windows-C4D0lII2.js";import{T as Es,C as Us,u as mt,V as Ms,a as $s}from"./useCharacters-945b6dqW.js";/* empty css */import"./main-8GBlYJSO.js";const Ts=30,Ls=({onPreviewOpen:l,onDownload:f,className:o})=>{const[d,L]=r.useState([]),[P,_]=r.useState(!0),[k,S]=r.useState(!1),[q,R]=r.useState(!1),x=r.useRef(0),O=r.useRef(null),E=r.useCallback(async m=>{try{return await ct.getArchivedTasks(m,Ts)}catch{return{tasks:[],hasMore:!1}}},[]);r.useEffect(()=>{let m=!1;return _(!0),x.current=0,E(0).then(C=>{m||(L(C.tasks),R(C.hasMore),x.current=C.tasks.length,_(!1))}),()=>{m=!0}},[E]);const V=r.useCallback(async()=>{if(k||!q)return;S(!0);const m=await E(x.current);L(C=>[...C,...m.tasks]),R(m.hasMore),x.current+=m.tasks.length,S(!1)},[k,q,E]);return r.useEffect(()=>{const m=O.current;if(!m)return;const C=()=>{m.scrollHeight-m.scrollTop-m.clientHeight<200&&V()};return m.addEventListener("scroll",C,{passive:!0}),()=>m.removeEventListener("scroll",C)},[V]),P?t.jsxs("div",{className:"task-queue-panel__empty",children:[t.jsx(ce,{size:"small"}),t.jsx("div",{className:"task-queue-panel__empty-text",children:"加载历史任务..."})]}):d.length===0?t.jsxs("div",{className:"task-queue-panel__empty",children:[t.jsx("div",{className:"task-queue-panel__empty-icon",children:"📦"}),t.jsx("div",{className:"task-queue-panel__empty-text",children:"暂无历史任务"})]}):t.jsxs("div",{ref:O,className:o,style:{overflow:"auto",height:"100%"},children:[d.map(m=>t.jsx(Es,{task:m,onPreviewOpen:l?()=>l(m.id):void 0,onDownload:f},m.id)),q&&t.jsx("div",{style:{padding:"12px",textAlign:"center"},children:k?t.jsx(ce,{size:"small"}):t.jsx(j,{size:"small",variant:"text",theme:"default",onClick:V,children:"加载更多"})})]})},Ps=({character:l,onDelete:f,onSelect:o,compact:d=!1})=>{const[L,P]=r.useState(!1),_=l.status==="processing"||l.status==="pending",k=l.status==="failed",S=l.status==="completed",q=r.useCallback(async m=>{if(m.stopPropagation(),!l.username)return;const C=`@${l.username}`;try{await ot(C),u.success(`已复制: ${C}`)}catch(v){console.error("Failed to copy:",v),u.error("复制失败")}},[l.username]),R=r.useCallback(()=>{S&&o&&o(l)},[S,o,l]),x=r.useCallback(m=>{m.stopPropagation(),f==null||f(l.id)},[f,l.id]),O=r.useCallback(m=>{m.stopPropagation(),S&&l.profilePictureUrl&&P(!0)},[S,l.profilePictureUrl]),E=()=>l.profilePictureUrl||S?t.jsx(b,{content:"点击查看大图",children:t.jsx(Us,{characterId:l.id,profilePictureUrl:l.profilePictureUrl,alt:l.username||"Character",className:"character-card__avatar-img",onClick:O})}):t.jsx("div",{className:"character-card__avatar-placeholder",children:t.jsx(dt,{})}),V=()=>_?t.jsxs("div",{className:"character-card__status character-card__status--processing",children:[t.jsx(ce,{size:"small"}),t.jsx("span",{children:"创建中..."})]}):k?t.jsxs("div",{className:"character-card__status character-card__status--failed",children:["创建失败: ",l.error||"未知错误"]}):null;return d?t.jsxs("div",{className:`character-card character-card--compact ${_?"character-card--loading":""} ${k?"character-card--failed":""}`,onClick:R,children:[t.jsx("div",{className:"character-card__avatar",children:E()}),t.jsx("span",{className:"character-card__username-text",children:l.username||"创建中..."})]}):t.jsxs("div",{className:`character-card ${_?"character-card--loading":""} ${k?"character-card--failed":""}`,onClick:R,children:[t.jsx("div",{className:"character-card__avatar",children:E()}),t.jsxs("div",{className:"character-card__info",children:[S&&l.username?t.jsx(b,{content:"点击复制",children:t.jsxs("div",{className:"character-card__username",onClick:q,children:["@",l.username,t.jsx(ts,{className:"character-card__username-copy"})]})}):t.jsx("div",{className:"character-card__username",style:{cursor:"default"},children:_?"创建中...":"角色"}),l.id&&t.jsx(b,{content:l.id,placement:"bottom",children:t.jsx("div",{className:"character-card__source",children:l.id})}),V()]}),t.jsx("div",{className:"character-card__actions",children:t.jsx(b,{content:"删除角色",children:t.jsx(j,{size:"small",variant:"text",theme:"danger",icon:t.jsx(ye,{}),"data-track":"character_click_delete",onClick:x})})}),l.profilePictureUrl&&t.jsx(ss,{visible:L,onClose:()=>P(!1),items:[{url:l.profilePictureUrl,type:"image",title:`@${l.username||"Character"}`}]})]})},zs=({onSelect:l,completedOnly:f=!1,maxItems:o,showHeader:d=!0,title:L="角色列表"})=>{const{characters:P,completedCharacters:_,pendingCharacters:k,isLoading:S,deleteCharacter:q,refreshCharacters:R}=mt(),[x,O]=tt.useState(null),E=tt.useMemo(()=>{let v=f?_:P;return v=[...v].sort((oe,de)=>de.createdAt-oe.createdAt),o&&v.length>o&&(v=v.slice(0,o)),v},[f,P,_,o]),V=r.useCallback(v=>{O(v)},[]),m=r.useCallback(async()=>{if(!x)return;await q(x)?u.success("角色已删除"):u.error("删除失败"),O(null)},[x,q]),C=r.useCallback(async()=>{await R(),u.success("已刷新")},[R]);return S?t.jsxs("div",{className:"character-list__loading",children:[t.jsx(ce,{size:"small"}),t.jsx("span",{children:"加载中..."})]}):E.length===0?t.jsxs("div",{className:"character-list",children:[d&&t.jsxs("div",{className:"character-list__header",children:[t.jsx("h4",{children:L}),t.jsx(j,{size:"small",variant:"text",icon:t.jsx(je,{}),"data-track":"character_click_refresh",onClick:C})]}),t.jsxs("div",{className:"character-list__empty",children:[t.jsx("div",{className:"character-list__empty-icon",children:t.jsx(as,{})}),t.jsx("div",{children:"暂无角色"}),t.jsx("div",{style:{fontSize:"12px",marginTop:"4px",color:"#999"},children:"从已完成的 Sora-2 视频中提取角色"})]})]}):t.jsxs("div",{className:"character-list",children:[d&&t.jsxs("div",{className:"character-list__header",children:[t.jsxs("h4",{children:[L,k.length>0&&t.jsxs("span",{style:{fontWeight:"normal",fontSize:"12px",color:"#666",marginLeft:"8px"},children:["(",k.length," 创建中)"]})]}),t.jsx(j,{size:"small",variant:"text",icon:t.jsx(je,{}),"data-track":"character_click_refresh",onClick:C})]}),t.jsx("div",{className:"character-list__items",children:E.map(v=>t.jsx(Ps,{character:v,onDelete:V,onSelect:l},v.id))}),t.jsx(ne,{open:!!x,title:"确认删除",description:"确定要删除此角色吗?删除后将无法在提示词中使用该角色。",confirmText:"删除",cancelText:"取消",danger:!0,onOpenChange:v=>{v||O(null)},onConfirm:m})]})},{TabPanel:te}=ut,qs="task-queue-drawer-width";function Rs(l){var f,o,d;return Array.isArray((f=l.result)==null?void 0:f.urls)&&l.result.urls.length>0?l.result.urls.length:(o=l.result)!=null&&o.url||(d=l.result)!=null&&d.chatResponse||se(l)?1:0}function Os(l){const f=Rs(l);return{taskId:l.id,taskType:l.type,taskStatus:l.status,model:typeof l.params.model=="string"&&l.params.model.trim()?l.params.model:void 0,resultCount:f||void 0,hasMultipleResults:f>1}}const Bs=({expanded:l,onClose:f,onTaskAction:o})=>{const{tasks:d,activeTasks:L,completedTasks:P,failedTasks:_,cancelledTasks:k,isLoading:S,isLoadingMore:q,hasMore:R,totalCount:x,loadedCount:O,loadMore:E,retryTask:V,deleteTask:m,clearCompleted:C,clearFailed:v,batchDeleteTasks:oe,batchRetryTasks:de,batchCancelTasks:pt}=rs(),{board:H,openDialog:_e}=ls(),{characters:we}=mt(),[A,ht]=r.useState("all"),[ft,ue]=r.useState(!1),[Ie,gt]=r.useState("completed"),[ae,xt]=r.useState(""),[D,X]=r.useState("all"),[As,be]=r.useState(null),[vt,me]=r.useState(!1),[Ct,yt]=r.useState(0),[jt,_t]=r.useState("single"),[ke,pe]=r.useState(!1),[Se,he]=r.useState(""),[wt,fe]=r.useState(!1),[ge,De]=r.useState(null),[Ne,xe]=r.useState(null),[B,ee]=r.useState(!1),[g,Q]=r.useState(new Set),[It,ve]=r.useState(!1),[Ee,Ue]=r.useState(null),{isConfigured:bt}=is(),[re,Me]=r.useState(!1),[kt,le]=r.useState(0),$e=D==="character";r.useEffect(()=>{st.initCacheStatus()},[]),r.useEffect(()=>{if(!l)return;let s=!1;return ct.getArchivedTaskCount().then(e=>{s||Ue(e)}).catch(()=>{s||Ue(0)}),()=>{s=!0}},[l,A]);const W=r.useMemo(()=>{let s;switch(A){case"all":s=d;break;case"active":s=L;break;case"completed":s=P;break;case"failed":s=_;break;case"cancelled":s=k;break;case"archived":return[];default:s=d}if(D!=="all"&&D!=="character"&&(s=s.filter(e=>e.type===(D==="image"?p.IMAGE:D==="audio"?p.AUDIO:D==="text"?p.CHAT:p.VIDEO))),ae.trim()){const e=ae.toLowerCase().trim();s=s.filter(a=>{var c,y,w,I,K;return a.params.prompt.toLowerCase().includes(e)||String(((c=a.result)==null?void 0:c.title)||"").toLowerCase().includes(e)||String(((y=a.result)==null?void 0:y.lyricsTitle)||"").toLowerCase().includes(e)||String(((w=a.result)==null?void 0:w.lyricsText)||"").toLowerCase().includes(e)||String(((I=a.result)==null?void 0:I.chatResponse)||"").toLowerCase().includes(e)||(((K=a.result)==null?void 0:K.lyricsTags)||[]).some(n=>String(n).toLowerCase().includes(e))})}return[...s].sort((e,a)=>a.createdAt-e.createdAt)},[A,d,L,P,_,k,D,ae]),St=s=>{gt(s),ue(!0)},Dt=()=>{Ie==="completed"?C():v(),ue(!1)},Nt=s=>{V(s),o==null||o("retry",s)},Et=s=>{De(s),fe(!0)},Ut=()=>{ge&&(m(ge),o==null||o("delete",ge)),fe(!1),De(null)},Mt=()=>{B?(ee(!1),Q(new Set)):ee(!0)},$t=(s,e)=>{Q(a=>{const c=new Set(a);return e?c.add(s):c.delete(s),c})},Tt=()=>{const s=W.map(e=>e.id);Q(new Set(s))},Lt=()=>{Q(new Set)},Pt=()=>{g.size!==0&&ve(!0)},zt=()=>{oe(Array.from(g)),Q(new Set),ee(!1),ve(!1),u.success(`已删除 ${g.size} 个任务`)},qt=()=>{const s=Array.from(g).filter(e=>{const a=d.find(c=>c.id===e);return(a==null?void 0:a.status)===z.FAILED||(a==null?void 0:a.status)===z.CANCELLED});if(s.length===0){u.warning("没有可重试的任务");return}de(s),Q(new Set),ee(!1),u.success(`已重试 ${s.length} 个任务`)},Te=r.useMemo(()=>Array.from(g).filter(s=>{const e=d.find(a=>a.id===s);return(e==null?void 0:e.status)===z.FAILED||(e==null?void 0:e.status)===z.CANCELLED}).length,[g,d]),Le=r.useMemo(()=>Array.from(g).filter(s=>{const e=d.find(a=>a.id===s);return(e==null?void 0:e.status)===z.PENDING||(e==null?void 0:e.status)===z.PROCESSING}).length,[g,d]),Pe=r.useMemo(()=>Array.from(g).filter(s=>{const e=d.find(a=>a.id===s);return(e==null?void 0:e.status)===z.COMPLETED&&((e==null?void 0:e.type)===p.IMAGE||(e==null?void 0:e.type)===p.VIDEO)}).length,[g,d]),Y=r.useMemo(()=>({all:d.length,image:d.filter(s=>s.type===p.IMAGE).length,video:d.filter(s=>s.type===p.VIDEO).length,audio:d.filter(s=>s.type===p.AUDIO).length,text:d.filter(s=>s.type===p.CHAT).length,character:we.length}),[d,we]),Rt=()=>{const s=Array.from(g).filter(e=>{const a=d.find(c=>c.id===e);return(a==null?void 0:a.status)===z.PENDING||(a==null?void 0:a.status)===z.PROCESSING});if(s.length===0){u.warning("没有可取消的进行中任务");return}pt(s),Q(new Set),ee(!1),u.success(`已取消 ${s.length} 个任务`)},Ot=async()=>{const s=Array.from(g).filter(e=>{const a=d.find(c=>c.id===e);return(a==null?void 0:a.status)===z.COMPLETED&&((a==null?void 0:a.type)===p.IMAGE||(a==null?void 0:a.type)===p.VIDEO)});if(!(s.length===0||re)){Me(!0),le(0);try{const e=await ys.syncMultipleTasks(s,(a,c)=>{le(Math.round(a/c*100))});console.log("[TaskQueuePanel] Batch sync result:",e),le(100),e.succeeded>0&&u.success(`已同步 ${e.succeeded} 个任务`),e.failed>0&&u.warning(`${e.failed} 个任务同步失败`)}catch(e){console.error("[TaskQueuePanel] Batch sync failed:",e),u.error("同步失败,请稍后重试")}finally{Me(!1),le(0)}}},ze=async s=>{const e=d.find(c=>c.id===s);if(e&&se(e)){u.info("歌词任务支持复制或插入画布");return}if(!e)return;const a=js(e);if(a.length!==0)try{const c=await _s(a);c.openedCount>0&&c.downloadedCount===0?u.success(c.openedCount>1?`已打开 ${c.openedCount} 个链接,请在新标签页下载`:"资源不支持直接下载,已打开链接"):u.success(e.type===p.AUDIO?a.length>1?"多条音频已开始下载":"音频下载成功":a.length>1?"多图已开始下载":"下载成功"),ws.track("generation_result_download",{...Os(e),downloadedCount:c.downloadedCount,openedCount:c.openedCount}),o==null||o("download",s)}catch(c){console.error("Download failed:",c),u.error("下载失败,请稍后重试")}},At=async s=>{const e=d.find(c=>c.id===s);if(!e||!se(e)){u.warning("暂无可复制的歌词");return}const a=it(e);if(!a.trim()){u.warning("暂无可复制的歌词");return}try{await ot(a),u.success("歌词已复制"),o==null||o("copy",s)}catch(c){console.error("Failed to copy lyrics:",c),u.error("复制失败,请稍后重试")}},Vt=async s=>{var a,c,y,w,I,K,n,Z,F,J,N,U;const e=d.find(i=>i.id===s);if(!e||!H){console.warn("Cannot insert: task result or board not available"),u.warning("无法插入:白板未就绪");return}if(!((a=e.result)!=null&&a.url)&&!((y=(c=e.result)==null?void 0:c.urls)!=null&&y.length)&&!se(e)){const i=e.type===p.CHAT?(w=e.result)==null?void 0:w.chatResponse:void 0;if(i!=null&&i.trim()){const h=(e.params.prompt||"").slice(0,20)||void 0;await ie({items:[{type:"text",content:i,label:h}]}),u.success("文本已插入到白板"),Ce.markAsInserted(s,"manual"),o==null||o("insert",s);return}console.warn("Cannot insert: task result is empty"),u.warning("无法插入:任务结果为空");return}try{const i=e.result;if(e.type===p.IMAGE){const h=(I=i.urls)!=null&&I.length?i.urls:[i.url];for(const M of h)await rt(H,at(M));u.success(h.length>1?"多图已插入到白板":"图片已插入到白板")}else if(e.type===p.VIDEO)await Is(H,i.url),u.success("视频已插入到白板");else if(e.type===p.AUDIO){if(se(e)){const G=nt(i,e.params.title||e.params.prompt)||(e.params.prompt||"").slice(0,20)||void 0;await ie({items:[{type:"text",content:it(e),label:G,metadata:{title:nt(i,e.params.title||e.params.prompt),tags:bs(i)}}]}),u.success("歌词已插入到白板"),Ce.markAsInserted(s,"manual"),o==null||o("insert",s);return}const h=ks(i),M=(n=(K=i.clips)==null?void 0:K[0])==null?void 0:n.duration,$={title:i.title||e.params.title||e.params.prompt,duration:typeof M=="number"?M:i.duration,previewImageUrl:i.previewImageUrl,tags:typeof e.params.tags=="string"?e.params.tags:void 0,mv:typeof e.params.mv=="string"?e.params.mv:void 0,prompt:e.params.prompt,providerTaskId:i.providerTaskId||e.remoteId,clipId:i.primaryClipId||((F=(Z=i.clips)==null?void 0:Z[0])==null?void 0:F.clipId)||((N=(J=i.clips)==null?void 0:J[0])==null?void 0:N.id)||((U=i.clipIds)==null?void 0:U[0]),clipIds:i.clipIds};h.length===1?await Ss(H,h[0],$):await ie({items:h.map((G,T)=>{var Ve,Fe,Ge,He,Be,We,Ke,Qe,Xe,Ye,Ze,Je,et;return{type:"audio",content:G,groupId:`task-audio-${e.id}`,dimensions:{width:Ns,height:Ds},metadata:{...$,title:((Fe=(Ve=i.clips)==null?void 0:Ve[T])==null?void 0:Fe.title)||`${$.title||"Audio"} ${T+1}`,previewImageUrl:((He=(Ge=i.clips)==null?void 0:Ge[T])==null?void 0:He.imageLargeUrl)||((We=(Be=i.clips)==null?void 0:Be[T])==null?void 0:We.imageUrl)||$.previewImageUrl,duration:typeof((Qe=(Ke=i.clips)==null?void 0:Ke[T])==null?void 0:Qe.duration)=="number"?i.clips[T].duration||void 0:$.duration,clipId:((Ye=(Xe=i.clips)==null?void 0:Xe[T])==null?void 0:Ye.clipId)||((Je=(Ze=i.clips)==null?void 0:Ze[T])==null?void 0:Je.id)||((et=i.clipIds)==null?void 0:et[T])||$.clipId}}})}),u.success(h.length>1?"多条音频卡片已插入到白板":"音频卡片已插入到白板")}else if(e.type===p.CHAT){const h=i.chatResponse||"",M=(e.params.prompt||"").slice(0,20)||void 0;await ie({items:[{type:"text",content:h,label:M}]}),u.success("文本已插入到白板")}Ce.markAsInserted(s,"manual"),o==null||o("insert",s)}catch(i){console.error("Failed to insert to board:",i),u.error(`插入失败: ${i instanceof Error?i.message:"未知错误"}`)}},Ft=s=>{var a,c,y,w;const e=d.find(I=>I.id===s);if(!e){console.warn("Cannot edit: task not found");return}if(e.type===p.IMAGE){const I={initialPrompt:e.params.prompt,initialWidth:e.params.width,initialHeight:e.params.height,initialImages:e.params.uploadedImages,initialResultUrl:(a=e.result)==null?void 0:a.url,initialResultUrls:(c=e.result)==null?void 0:c.urls};_e(lt.aiImageGeneration,I)}else if(e.type===p.VIDEO){const I={initialPrompt:e.params.prompt,initialDuration:typeof e.params.seconds=="string"?parseInt(e.params.seconds,10):e.params.seconds,initialModel:e.params.model,initialSize:e.params.size,initialImages:e.params.uploadedImages,initialResultUrl:(y=e.result)==null?void 0:y.url,initialResultUrls:(w=e.result)==null?void 0:w.urls};_e(lt.aiVideoGeneration,I)}else if(e.type===p.AUDIO){u.info("音频任务暂不支持从任务面板直接编辑");return}o==null||o("edit",s)},Gt=s=>{const e=d.find(a=>a.id===s);e&&(xe(e),o==null||o("extractCharacter",s))},qe=r.useMemo(()=>{const s=new Set;return W.filter(e=>{var a,c,y,w;return e.status!==z.COMPLETED||!((a=e.result)!=null&&a.url)&&!((y=(c=e.result)==null?void 0:c.urls)!=null&&y.length)||e.type!==p.IMAGE&&e.type!==p.VIDEO&&!(e.type===p.AUDIO&&((w=e.result)==null?void 0:w.resultKind)!=="lyrics")||s.has(e.id)?!1:(s.add(e.id),!0)})},[W]),{previewMediaItems:Ht,taskIdToPreviewConfig:Re}=r.useMemo(()=>{var a,c,y,w,I,K;const s=[],e=new Map;for(const n of qe){const Z=s.length,F=((a=n.result)==null?void 0:a.title)||n.params.title||((c=n.params.prompt)==null?void 0:c.substring(0,50))||"媒体预览";if(n.type===p.AUDIO){const N=((w=(y=n.result)==null?void 0:y.clips)==null?void 0:w.filter(h=>!!h.audioUrl).map((h,M)=>{var $,G,T;return{id:h.clipId||h.id||`${n.id}-${M}`,url:h.audioUrl,type:"audio",title:h.title||(($=n.result)!=null&&$.clips&&n.result.clips.length>1?`${F} (${M+1}/${n.result.clips.length})`:F),posterUrl:h.imageLargeUrl||h.imageUrl||((G=n.result)==null?void 0:G.previewImageUrl),duration:typeof h.duration=="number"?h.duration:(T=n.result)==null?void 0:T.duration,prompt:n.params.prompt,tags:typeof n.params.tags=="string"?n.params.tags:void 0,artist:n.params.model||n.params.mv||"Aitu",album:"Aitu Generated"}}))??[],U=(I=n.result.urls)!=null&&I.length?n.result.urls:n.result.url?[n.result.url]:[],i=N.length>0?N:U.map((h,M)=>{var $,G;return{id:U.length>1?`${n.id}-${M}`:n.id,url:h,type:"audio",title:U.length>1?`${F} (${M+1}/${U.length})`:F,posterUrl:($=n.result)==null?void 0:$.previewImageUrl,duration:(G=n.result)==null?void 0:G.duration,prompt:n.params.prompt,tags:typeof n.params.tags=="string"?n.params.tags:void 0,artist:n.params.model||n.params.mv||"Aitu",album:"Aitu Generated"}});s.push(...i)}else{const N=(K=n.result.urls)!=null&&K.length?n.result.urls:[n.result.url],U=n.type===p.VIDEO?"video":"image";for(let i=0;i<N.length;i++){const h=U==="image"?at(N[i]):N[i];s.push({id:N.length>1?`${n.id}-${i}`:n.id,url:h,type:U,title:N.length>1?`${F} (${i+1}/${N.length})`:F})}}const J=s.length-Z;e.set(n.id,{mode:n.type===p.AUDIO&&J>1?"compare":"single",index:n.type===p.AUDIO&&J>1?Array.from({length:Math.min(J,4)},(N,U)=>Z+U):Z})}return{previewMediaItems:s,taskIdToPreviewConfig:e}},[qe]),Oe=r.useCallback(s=>{be(s);const e=Re.get(s);e!==void 0&&(_t(e.mode),yt(e.index),me(!0))},[Re]),Bt=r.useCallback(()=>{be(null),me(!1)},[]),Wt=r.useCallback(s=>{s.type==="image"&&(he(s.url),pe(!0),me(!1))},[]),Kt=r.useCallback(async s=>{if(H)try{const e=`edited-image-${Date.now()}`,a=`/__aitu_cache__/image/${e}.png`,y=await(await fetch(s)).blob();await st.cacheMediaFromBlob(a,y,"image",{taskId:e}),await rt(H,a),pe(!1),he("")}catch(e){console.error("Failed to insert edited image:",e)}},[H]),Qt=r.useCallback(()=>{f==null||f()},[f]),Xt=x>0?x:d.length,Ae="这里只显示最近 100 个任务,更早的任务会自动移到“历史”中继续保留。",Yt=t.jsx(b,{content:Ae,children:t.jsxs("span",{children:["全部 (",Xt,")"]})}),Zt=Ee===null?"历史":`历史 (${Ee})`,Jt=x>=100?`已加载最近 ${x} 个任务,较早任务已移至“历史”`:`已加载全部 ${x} 个任务`,es=t.jsxs("div",{className:"task-queue-panel__filters-container",children:[t.jsxs(ut,{value:A,onChange:s=>ht(s),children:[t.jsx(te,{value:"all",label:Yt}),t.jsx(te,{value:"active",label:`生成中 (${L.length})`}),t.jsx(te,{value:"failed",label:`失败 (${_.length})`}),t.jsx(te,{value:"completed",label:`已完成 (${P.length})`}),t.jsx(te,{value:"archived",label:Zt})]}),A!=="archived"&&t.jsxs("div",{className:"task-queue-panel__filters",children:[t.jsxs("div",{className:"task-queue-panel__type-filters",children:[t.jsx(b,{content:`全部 (${Y.all})`,children:t.jsx(j,{size:"small",variant:"text",shape:"square",onClick:()=>X("all"),className:D==="all"?"task-queue-panel__filter-btn--active":"",children:t.jsx(ns,{size:"16px"})})}),t.jsx(b,{content:`图片 (${Y.image})`,children:t.jsx(j,{size:"small",variant:"text",shape:"square",onClick:()=>X("image"),className:D==="image"?"task-queue-panel__filter-btn--active":"",children:t.jsx(cs,{size:"16px"})})}),t.jsx(b,{content:`视频 (${Y.video})`,children:t.jsx(j,{size:"small",variant:"text",shape:"square",onClick:()=>X("video"),className:D==="video"?"task-queue-panel__filter-btn--active":"",children:t.jsx(os,{size:"16px"})})}),t.jsx(b,{content:`音频 (${Y.audio})`,children:t.jsx(j,{size:"small",variant:"text",shape:"square",onClick:()=>X("audio"),className:D==="audio"?"task-queue-panel__filter-btn--active":"",children:t.jsx(ds,{size:16,strokeWidth:1.9})})}),t.jsx(b,{content:`文本 (${Y.text})`,children:t.jsx(j,{size:"small",variant:"text",shape:"square",onClick:()=>X("text"),className:D==="text"?"task-queue-panel__filter-btn--active":"",children:"文"})}),t.jsx(b,{content:`角色 (${Y.character})`,children:t.jsx(j,{size:"small",variant:"text",shape:"square",onClick:()=>X("character"),className:D==="character"?"task-queue-panel__filter-btn--active":"",children:t.jsx(dt,{size:"16px"})})})]}),t.jsxs("div",{className:"task-queue-panel__search-row",children:[t.jsx(us,{value:ae,onChange:s=>xt(s),placeholder:"搜索...",clearable:!0,prefixIcon:t.jsx(ms,{}),size:"small",className:"task-queue-panel__search-input"}),t.jsxs("div",{className:"task-queue-panel__filter-actions",children:[t.jsx(b,{content:B?"退出多选":"批量操作",children:t.jsx(j,{size:"small",variant:B?"base":"outline",theme:B?"primary":"default",icon:t.jsx(ps,{}),"data-track":"task_click_toggle_selection",onClick:Mt,children:B?"退出":"多选"})}),_.length>0&&!B&&t.jsx(b,{content:"清除失败",children:t.jsx(j,{size:"small",variant:"text",theme:"default",icon:t.jsx(ye,{style:{color:"var(--td-text-color-placeholder)"}}),"data-track":"task_click_clear_failed",onClick:()=>St("failed"),className:"task-queue-panel__clear-btn"})})]})]})]}),B&&!$e&&t.jsxs("div",{className:"task-queue-panel__batch-actions",children:[t.jsxs("div",{className:"task-queue-panel__batch-select",children:[t.jsx(hs,{checked:g.size===W.length&&W.length>0,indeterminate:g.size>0&&g.size<W.length,onChange:s=>s?Tt():Lt()}),t.jsxs("span",{className:"task-queue-panel__batch-count",children:["已选 ",g.size," / ",W.length]})]}),t.jsxs("div",{className:"task-queue-panel__batch-buttons",children:[Le>0&&t.jsxs(j,{size:"small",variant:"outline",theme:"warning",icon:t.jsx(fs,{}),"data-track":"task_click_batch_cancel",onClick:Rt,children:["取消 (",Le,")"]}),Te>0&&t.jsxs(j,{size:"small",theme:"primary",icon:t.jsx(je,{}),"data-track":"task_click_batch_retry",onClick:qt,children:["重试 (",Te,")"]}),bt&&Pe>0&&t.jsx(b,{content:"同步选中的任务到云端",placement:"bottom",children:t.jsx(j,{size:"small",variant:"outline",icon:t.jsx(gs,{}),"data-track":"task_click_batch_sync",onClick:Ot,disabled:re,loading:re,children:re?`${kt}%`:`同步 (${Pe})`})}),t.jsxs(j,{size:"small",variant:"text",theme:"default",icon:t.jsx(ye,{}),"data-track":"task_click_batch_delete",onClick:Pt,disabled:g.size===0,children:["删除 (",g.size,")"]})]})]})]});return t.jsxs(t.Fragment,{children:[t.jsx(xs,{isOpen:l,onClose:Qt,title:"任务队列",filterSection:es,position:"toolbar-right",width:"responsive",storageKey:qs,showBackdrop:!1,closeOnEsc:!1,showCloseButton:!0,className:"task-queue-panel",contentClassName:"task-queue-panel__content",resizable:!0,minWidth:320,maxWidth:1024,"data-testid":"task-queue-panel",children:$e?t.jsx(zs,{showHeader:!1,title:""}):A==="archived"?t.jsx(Ls,{onPreviewOpen:Oe,onDownload:ze,className:"task-queue-panel__list"}):t.jsx(Ms,{tasks:W,selectionMode:B,selectedTaskIds:g,onSelectionChange:$t,onRetry:Nt,onDelete:Et,onDownload:ze,onInsert:Vt,onCopy:At,onEdit:Ft,onPreviewOpen:Oe,onExtractCharacter:Gt,hasMore:R,isLoadingMore:q,onLoadMore:E,totalCount:x,loadedCount:O,allLoadedText:Jt,allLoadedHint:x>=100?Ae:void 0,className:"task-queue-panel__list",emptyContent:S?t.jsxs("div",{className:"task-queue-panel__empty",children:[t.jsx("div",{className:"task-queue-panel__empty-icon",children:"⏳"}),t.jsx("div",{className:"task-queue-panel__empty-text",children:"加载中..."})]}):t.jsxs("div",{className:"task-queue-panel__empty",children:[t.jsx("div",{className:"task-queue-panel__empty-icon",children:"📋"}),t.jsx("div",{className:"task-queue-panel__empty-text",children:A==="all"?"暂无任务":`暂无${A==="active"?"生成中":A==="completed"?"已完成":A==="failed"?"失败":"已取消"}任务`})]})})}),t.jsx(ne,{open:ft,title:"确认清除",description:`确定要清除所有${Ie==="completed"?"已完成":"失败"}的任务吗?此操作无法撤销。`,confirmText:"清除",cancelText:"取消",danger:!0,onOpenChange:ue,onConfirm:Dt}),t.jsx(ne,{open:wt,title:"确认删除",description:"确定要删除此任务吗?此操作无法撤销。",confirmText:"删除",cancelText:"取消",danger:!0,onOpenChange:fe,onConfirm:Ut}),t.jsx(ne,{open:It,title:"确认批量删除",description:`确定要删除选中的 ${g.size} 个任务吗?此操作无法撤销。`,confirmText:"删除",cancelText:"取消",danger:!0,onOpenChange:ve,onConfirm:zt}),t.jsx(vs,{visible:vt,items:Ht,initialMode:jt,initialIndex:Ct,onClose:Bt,showThumbnails:!0,onEdit:Wt}),ke&&Se&&t.jsx(Cs,{visible:ke,imageUrl:Se,showOverwrite:!1,onClose:()=>{pe(!1),he("")},onInsert:H?Kt:void 0}),t.jsx($s,{visible:!!Ne,task:Ne,onClose:()=>xe(null),onCreateStart:()=>{},onCreateComplete:s=>{xe(null)}})]})};export{qs as TASK_DRAWER_WIDTH_KEY,Bs as TaskQueuePanel};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{y as t,aI as va,ny as Kt,at as ta,nz as Et,lH as ga,nA as ba,nn as xa,ns as ya,nB as _a,nC as ja,nD as Ia,nE as Sa,nq as wa,nw as Ca,nx as Na,nF as ie,bL as Rt,r as s,nG as ve,nH as Ge,lu as ka,iU as vt,g$ as ge,nI as nt,nJ as Pt,nK as At,i1 as Ae,nL as Ma,nM as Fe,nN as Ta,h1 as J,nO as aa,nP as gt,nQ as Qe,nR as Ea,nS as Aa,nT as Ra,nU as bt,cX as et,al as we,nV as Pa,ib as sa,h0 as be,nW as xt,nX as yt,hK as _t,kX as za,bV as Ue,ka as na,hM as Yt,as as jt,bx as Wt,i$ as Da,hk as Va,ni as qt,nj as Fa,nk as La,nY as Oa,ii as $a,fP as Ua,dj as Ga,eI as Ba}from"./tool-windows-hjm6YiPY.js";import{v as Ha}from"./video-analyze-DszumYAr.js";import{quickInsert as st,setCanvasBoard as Zt}from"./canvas-insertion-ZEZkcXvB.js";import{M as Be}from"./ModelDropdown-3MjTl1AO.js";import{u as He}from"./use-runtime-models-C0uyCfar.js";import{a as Ke}from"./model-selection-BaH65gMK.js";import{e as Ka,c as Ya,r as Wa,a as qa,b as tt,w as It,d as Za,f as Xa}from"./workflow-generation-utils-Da12qXTb.js";/* empty css *//* empty css *//* empty css */import{R as Ja}from"./ResizableDivider-B_67th7H.js";/* empty css */import"./model-benchmark-service-DDklUBjC.js";const Xt=[{id:"analyze",label:"分析"},{id:"script",label:"脚本"},{id:"generate",label:"生成"}],Qa=({current:e,onNavigate:n,hasRecord:c})=>{const j=Xt.findIndex(o=>o.id===e);return t.jsx("div",{className:"va-step-bar",children:Xt.map((o,h)=>{const m=o.id===e,I=h<j,S=!c&&h>0;return t.jsxs(va.Fragment,{children:[h>0&&t.jsx("span",{className:"va-step-arrow",children:"→"}),t.jsxs("button",{className:`va-step ${m?"active":""} ${I?"past":""}`,onClick:()=>!S&&n(o.id),disabled:S,children:[t.jsx("span",{className:"va-step-num",children:h+1}),o.label]})]},o.id)})})},es=({shots:e,totalDuration:n})=>t.jsx("div",{className:"va-timeline",children:e.filter(Boolean).map(c=>t.jsx("div",{className:"va-timeline-segment",style:{flex:Math.max(((c.endTime??0)-(c.startTime??0))/Math.max(n,1),0),backgroundColor:c.type&&Kt[c.type]||Kt.other},title:`${c.label||"未命名镜头"} ${c.startTime??0}s-${c.endTime??0}s`},c.id))});function Jt(e){return(e||"").trim().toLowerCase().replace(/[^a-z0-9]/g,"")||"mp4"}function ts(e){const n=e.name.split(".").pop();if(n&&n.length<=8)return Jt(n);const c=e.type.split("/")[1];return Jt(c)}async function as(e,n){const c=ts(e),o=`/__aitu_cache__/video/${`video-analyzer-source-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}.${c}`;return await ta.cacheMediaFromBlob(o,e,"video",{metadata:{source:"video-analyzer-input",fileName:e.name,mimeType:e.type||"video/mp4",size:e.size}}),{type:"upload",cacheUrl:o,fileName:e.name||`video-source.${c}`,mimeType:e.type||"video/mp4",size:e.size}}async function ss(e){if(!e||e.type!=="upload")return null;const n=await ta.getCachedBlob(e.cacheUrl);return n?new File([n],e.fileName||"video-source.mp4",{type:e.mimeType||n.type||"video/mp4",lastModified:Date.now()}):null}function ra(e){return Ca(e,"videoAnalyzerAction",["analyze","rewrite"])}function ns(e){return Na(e,{missingMessage:"分析任务缺少结果内容",fromStructured:n=>n})}function rs(e){const n=e.params.videoAnalyzerSourceSnapshot;if((n==null?void 0:n.type)==="youtube"||(n==null?void 0:n.type)==="upload")return n;const c=e.params.videoAnalyzerSource,j=String(e.params.videoAnalyzerSourceLabel||"").trim();return c==="youtube"&&j?{type:"youtube",youtubeUrl:j}:null}function ls(e){var c;const n=(c=e.result)==null?void 0:c.analysisData;return Array.isArray(n==null?void 0:n.editedShots)?n.editedShots:null}async function zt(e){var E,P;if(e.status!=="completed")return null;const n=ra(e);if(!n)return null;if(n==="analyze"){const F=await Et(),K=F.find(L=>L.analyzeTaskId===e.id);if(K)return{records:F,record:K};const X=ns(e),g=rs(e),O=e.params.videoAnalyzerSource==="upload"?"upload":"youtube",Y=String(e.params.videoAnalyzerSourceLabel||(O==="youtube"?(g==null?void 0:g.type)==="youtube"?g.youtubeUrl:"":"本地视频")),$={id:ga(),createdAt:Date.now(),source:O,sourceLabel:Y,sourceSnapshot:g,model:String(e.params.model||""),modelRef:e.params.modelRef||null,analysis:X,starred:!1,analyzeTaskId:e.id};return{records:await ba($),record:$}}const c=xa(e,"videoAnalyzerRecordId");if(!c)return null;const o=(await Et()).find(F=>F.id===c);if(!o||o.pendingRewriteTaskId!==e.id)return null;const h=ya(e),m=ls(e),I=m||(()=>{if(!h)throw new Error("脚本改编任务缺少结果内容");const F=_a(h),K=o.editedShots||o.analysis.shots;return ja(K,F)})(),S=`AI 改编 #${(((E=o.scriptVersions)==null?void 0:E.length)||0)+1}`,w=Ia(I,S,(P=o.productInfo)==null?void 0:P.prompt),x=Sa(o,w);return wa(o,{...x,pendingRewriteTaskId:null,storyboardGeneratedAt:Date.now()},ie)}function is(e){return ra(e)!==null}const St="gemini-3.1-pro-preview",wt="video-analyzer:model",os="aitu:settings:provider-nav";function cs(e){return(e/1024/1024).toFixed(1)+"MB"}const ds=({existingRecord:e,onComplete:n,onRecordsChange:c,onCreateNew:j,onNext:o})=>{const{setAppState:h}=Rt(),[m,I]=s.useState("upload"),[S,w]=s.useState(""),[x,E]=s.useState(null),[P,F]=s.useState(()=>(e==null?void 0:e.model)||ve(wt,St).modelId),[K,X]=s.useState(()=>(e==null?void 0:e.modelRef)||ve(wt,St).modelRef),g=s.useCallback((i,y)=>{F(i),X(y||null),Ge(wt,i,y)},[]),[O,Y]=s.useState(!1),[$,M]=s.useState(null),[L,A]=s.useState(""),[oe,V]=s.useState(""),[U,G]=s.useState((e==null?void 0:e.analysis)||null),z=ka(),T=s.useRef(null),B=s.useRef(null),W=s.useMemo(()=>{if(B.current&&URL.revokeObjectURL(B.current),!x)return B.current=null,null;const i=URL.createObjectURL(x);return B.current=i,i},[x]);s.useEffect(()=>()=>{B.current&&URL.revokeObjectURL(B.current)},[]),s.useEffect(()=>{let i=!1;return(async()=>{if(!e){if($)return;G(null),I("upload"),w(""),E(null),V("");return}G(e.analysis||null),F(e.model||St),X(e.modelRef||null),V("");const _=e.sourceSnapshot;if((_==null?void 0:_.type)==="upload"){I("upload"),w("");const ee=await ss(_);if(i)return;E(ee),ee||V("原上传视频缓存已失效,无法自动回填视频");return}if(e.source==="upload"){I("upload"),w(""),E(null),V("这条旧历史未保存原视频,无法自动回填视频");return}I("youtube"),E(null),(_==null?void 0:_.type)==="youtube"?w(_.youtubeUrl):e.source==="youtube"?w(e.sourceLabel||""):w("")})(),()=>{i=!0}},[e]);const Z=He("text"),H=s.useMemo(()=>Z.filter(i=>/^gemini/i.test(i.id)),[Z]),ce=s.useMemo(()=>{const i=z.find(y=>y.id===vt);return!!(i!=null&&i.apiKey.trim())},[z]),_e=(K==null?void 0:K.profileId)===vt,ke=s.useCallback(()=>{const i={action:"select",profileId:vt};window.__aituPendingProviderNavigationIntent=i,window.dispatchEvent(new CustomEvent(os,{detail:i})),h(y=>({...y,openSettings:!0}))},[h]),me=s.useCallback(i=>{var _;const y=(_=i.target.files)==null?void 0:_[0];y&&(E(y),V(""),G(null))},[]),Me=s.useCallback(i=>{i.preventDefault();const y=i.dataTransfer.files[0];y!=null&&y.type.startsWith("video/")&&(E(y),V(""),G(null))},[]),re=s.useCallback(i=>{i.stopPropagation(),E(null),V(""),T.current&&(T.current.value="")},[]),[Re,Pe]=s.useState(!1),[Q,ae]=s.useState(""),pe=s.useCallback(async(i,y)=>{Pe(!0),ae("提取帧图片...");try{const _=y.map(de=>de.startTime),ee=await Ka(i,_,(de,je)=>ae(`提取帧图片 ${de}/${je}`));return await Promise.all(y.map(async(de,je)=>{const Ie=ee[je];if(!Ie)return de;try{const rt=await Ya(Ie,de.id,"first");return{...de,generated_first_frame_url:rt}}catch{return de}}))}catch(_){return console.debug("Frame extraction failed:",_),y}finally{Pe(!1),ae("")}},[]),r=s.useCallback(async()=>{Y(!0),V(""),A("准备中...");try{let i={};if(m==="upload"&&x){A("缓存视频文件...");const _=await as(x);i={videoCacheUrl:_.type==="upload"?_.cacheUrl:void 0,..._.type==="upload"?{mimeType:_.mimeType}:{},model:P,modelRef:K,taskLabel:`分析视频:${x.name||"本地视频"}`,videoAnalyzerSource:"upload",videoAnalyzerSourceLabel:x.name||"本地视频",videoAnalyzerSourceSnapshot:_}}else if(m==="youtube"&&S)i={youtubeUrl:S,model:P,modelRef:K,taskLabel:`分析视频:${S}`,videoAnalyzerSource:"youtube",videoAnalyzerSourceLabel:S,videoAnalyzerSourceSnapshot:{type:"youtube",youtubeUrl:S}};else{V("请先选择视频文件或输入 YouTube URL"),Y(!1);return}A("加入任务队列...");const y=await Ha.execute(i,{mode:"queue"});y.success&&y.taskId?(M(y.taskId||null),A("已加入任务队列,等待分析...")):V(y.error||"创建分析任务失败")}catch(i){V(i.message||"分析失败")}finally{Y(!1)}},[m,x,S,P,K]);s.useEffect(()=>{if(!$)return;const i=ge.observeTaskUpdates().subscribe(y=>{var _;if(y.task.id===$){if(y.task.status==="failed"){M(null),A(""),V(((_=y.task.error)==null?void 0:_.message)||"分析失败");return}if(y.task.status==="completed"){zt(y.task).then(async ee=>{if(ee&&(c(ee.records),n(ee.record),G(ee.record.analysis),ee.record.source==="upload"&&x&&ee.record.analysis.shots.length>0)){const de=await pe(x,ee.record.analysis.shots);G(Ie=>Ie&&{...Ie,shots:de});const je=await ie(ee.record.id,{editedShots:de});c(je),n({...ee.record,editedShots:de})}}).catch(ee=>{V(ee.message||"分析结果同步失败")}).finally(()=>{M(null),A("")});return}typeof y.task.progress=="number"?A(`分析中 ${Math.round(y.task.progress)}%`):A("分析中,请耐心等待...")}});return()=>i.unsubscribe()},[$,n,c,x,pe]);const b=s.useCallback(async()=>{U&&await st("text",nt(U.shots,U))},[U]);return t.jsxs("div",{className:"va-page",children:[!U&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"va-tabs",children:[t.jsx("button",{className:`va-tab ${m==="upload"?"active":""}`,onClick:()=>I("upload"),children:"上传视频"}),t.jsx("button",{className:`va-tab ${m==="youtube"?"active":""}`,onClick:()=>I("youtube"),children:"YouTube URL"})]}),m==="upload"?x?t.jsxs("div",{className:"va-video-preview",children:[t.jsx("video",{src:W,controls:!0,muted:!0,playsInline:!0}),t.jsx("button",{className:"va-video-preview-close",onClick:re,children:"✕"}),t.jsxs("div",{className:"va-video-preview-info",children:[t.jsx("span",{className:"va-video-preview-name",children:x.name}),t.jsx("span",{className:"va-video-preview-size",children:cs(x.size)})]}),t.jsx("input",{ref:T,type:"file",accept:"video/*",onChange:me,style:{display:"none"}})]}):t.jsxs("div",{className:"va-dropzone",onDrop:Me,onDragOver:i=>i.preventDefault(),onClick:()=>{var i;return(i=T.current)==null?void 0:i.click()},children:[t.jsx("input",{ref:T,type:"file",accept:"video/*",onChange:me,style:{display:"none"}}),t.jsxs("span",{className:"va-placeholder",children:["拖拽视频到此处 或 点击上传",t.jsx("br",{}),t.jsx("span",{className:"va-placeholder-hint",children:"建议视频在6M以内,可用推特或Youtube下载器下载最低分辨率视频"})]})]}):t.jsx("input",{className:"va-url-input",type:"text",placeholder:"https://www.youtube.com/watch?v=...",value:S,onChange:i=>w(i.target.value)}),t.jsxs("div",{className:"va-model-select",children:[t.jsx("label",{className:"va-model-label",children:"分析模型"}),t.jsx(Be,{variant:"form",selectedModel:P,selectedSelectionKey:Ke(P,K),onSelect:g,models:H,placement:"down",disabled:O,placeholder:"选择多模态模型"})]}),!_e&&t.jsxs("div",{className:"va-model-tip",children:[t.jsx("span",{children:"建议使用 gemini-mix 分组的gemini-3.1-pro-preview"}),!ce&&t.jsx("button",{type:"button",className:"va-model-tip-link",onClick:ke,children:"去设置"})]}),t.jsx("button",{className:"va-analyze-btn",onClick:r,disabled:O||!!$||(m==="upload"?!x:!S),children:O||$?L||"分析中...":"开始分析"}),oe&&t.jsx("div",{className:"va-error",children:oe})]}),U&&t.jsxs("div",{className:"va-results",children:[t.jsxs("div",{className:"va-stats",children:[t.jsxs("div",{className:"va-stat",children:[t.jsxs("span",{className:"va-stat-value",children:[U.totalDuration,"s"]}),t.jsx("span",{className:"va-stat-label",children:"总时长"})]}),t.jsxs("div",{className:"va-stat",children:[t.jsx("span",{className:"va-stat-value",children:U.shotCount}),t.jsx("span",{className:"va-stat-label",children:"镜头数"})]}),t.jsxs("div",{className:"va-stat",children:[t.jsxs("span",{className:"va-stat-value",children:[U.productExposureRatio,"%"]}),t.jsx("span",{className:"va-stat-label",children:"产品占比"})]}),t.jsxs("div",{className:"va-stat",children:[t.jsx("span",{className:"va-stat-value",children:U.aspect_ratio||"-"}),t.jsx("span",{className:"va-stat-label",children:"画面比例"})]})]}),(U.video_style||U.bgm_mood)&&t.jsxs("div",{className:"va-style-info",children:[U.video_style&&t.jsxs("span",{children:["风格: ",U.video_style]}),U.bgm_mood&&t.jsxs("span",{children:["BGM: ",U.bgm_mood]})]}),t.jsx("div",{className:"va-suggestion",children:U.suggestion}),t.jsx(es,{shots:U.shots,totalDuration:U.totalDuration}),t.jsx("div",{className:"va-shots",children:U.shots.map((i,y)=>t.jsx(Pt,{shot:i,index:y},i.id))}),t.jsxs("div",{className:"va-page-actions",children:[Re&&t.jsx("span",{className:"va-frame-progress",children:Q}),t.jsx("button",{onClick:b,children:"插入画布"}),t.jsx("button",{onClick:()=>{G(null)},children:"重新分析"}),j&&t.jsx("button",{onClick:j,children:"新建分析"}),o&&t.jsx("button",{className:"va-btn-primary",onClick:o,children:"下一步: 编辑脚本 →"})]})]})]})};function Ne(e){e.style.height="auto",e.style.height=e.scrollHeight+"px"}function Te(e,n=30){if(!e)return 1;const c=e.split(`
|
|
1
|
+
import{y as t,aI as va,ny as Kt,at as ta,nz as Et,lH as ga,nA as ba,nn as xa,ns as ya,nB as _a,nC as ja,nD as Ia,nE as Sa,nq as wa,nw as Ca,nx as Na,nF as ie,bL as Rt,r as s,nG as ve,nH as Ge,lu as ka,iU as vt,g$ as ge,nI as nt,nJ as Pt,nK as At,i1 as Ae,nL as Ma,nM as Fe,nN as Ta,h1 as J,nO as aa,nP as gt,nQ as Qe,nR as Ea,nS as Aa,nT as Ra,nU as bt,cX as et,al as we,nV as Pa,ib as sa,h0 as be,nW as xt,nX as yt,hK as _t,kX as za,bV as Ue,ka as na,hM as Yt,as as jt,bx as Wt,i$ as Da,hk as Va,ni as qt,nj as Fa,nk as La,nY as Oa,ii as $a,fP as Ua,dj as Ga,eI as Ba}from"./tool-windows-C4D0lII2.js";import{v as Ha}from"./video-analyze-Co9na7Gr.js";import{quickInsert as st,setCanvasBoard as Zt}from"./canvas-insertion-CYbFgP4L.js";import{M as Be}from"./ModelDropdown-CHYgRb1r.js";import{u as He}from"./use-runtime-models-BLwgp0M1.js";import{a as Ke}from"./model-selection-CbzU26xQ.js";import{e as Ka,c as Ya,r as Wa,a as qa,b as tt,w as It,d as Za,f as Xa}from"./workflow-generation-utils-CZULSJWQ.js";/* empty css *//* empty css *//* empty css */import{R as Ja}from"./ResizableDivider-P1jpoJ3i.js";/* empty css */import"./model-benchmark-service-B0QCqInK.js";const Xt=[{id:"analyze",label:"分析"},{id:"script",label:"脚本"},{id:"generate",label:"生成"}],Qa=({current:e,onNavigate:n,hasRecord:c})=>{const j=Xt.findIndex(o=>o.id===e);return t.jsx("div",{className:"va-step-bar",children:Xt.map((o,h)=>{const m=o.id===e,I=h<j,S=!c&&h>0;return t.jsxs(va.Fragment,{children:[h>0&&t.jsx("span",{className:"va-step-arrow",children:"→"}),t.jsxs("button",{className:`va-step ${m?"active":""} ${I?"past":""}`,onClick:()=>!S&&n(o.id),disabled:S,children:[t.jsx("span",{className:"va-step-num",children:h+1}),o.label]})]},o.id)})})},es=({shots:e,totalDuration:n})=>t.jsx("div",{className:"va-timeline",children:e.filter(Boolean).map(c=>t.jsx("div",{className:"va-timeline-segment",style:{flex:Math.max(((c.endTime??0)-(c.startTime??0))/Math.max(n,1),0),backgroundColor:c.type&&Kt[c.type]||Kt.other},title:`${c.label||"未命名镜头"} ${c.startTime??0}s-${c.endTime??0}s`},c.id))});function Jt(e){return(e||"").trim().toLowerCase().replace(/[^a-z0-9]/g,"")||"mp4"}function ts(e){const n=e.name.split(".").pop();if(n&&n.length<=8)return Jt(n);const c=e.type.split("/")[1];return Jt(c)}async function as(e,n){const c=ts(e),o=`/__aitu_cache__/video/${`video-analyzer-source-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}.${c}`;return await ta.cacheMediaFromBlob(o,e,"video",{metadata:{source:"video-analyzer-input",fileName:e.name,mimeType:e.type||"video/mp4",size:e.size}}),{type:"upload",cacheUrl:o,fileName:e.name||`video-source.${c}`,mimeType:e.type||"video/mp4",size:e.size}}async function ss(e){if(!e||e.type!=="upload")return null;const n=await ta.getCachedBlob(e.cacheUrl);return n?new File([n],e.fileName||"video-source.mp4",{type:e.mimeType||n.type||"video/mp4",lastModified:Date.now()}):null}function ra(e){return Ca(e,"videoAnalyzerAction",["analyze","rewrite"])}function ns(e){return Na(e,{missingMessage:"分析任务缺少结果内容",fromStructured:n=>n})}function rs(e){const n=e.params.videoAnalyzerSourceSnapshot;if((n==null?void 0:n.type)==="youtube"||(n==null?void 0:n.type)==="upload")return n;const c=e.params.videoAnalyzerSource,j=String(e.params.videoAnalyzerSourceLabel||"").trim();return c==="youtube"&&j?{type:"youtube",youtubeUrl:j}:null}function ls(e){var c;const n=(c=e.result)==null?void 0:c.analysisData;return Array.isArray(n==null?void 0:n.editedShots)?n.editedShots:null}async function zt(e){var E,P;if(e.status!=="completed")return null;const n=ra(e);if(!n)return null;if(n==="analyze"){const F=await Et(),K=F.find(L=>L.analyzeTaskId===e.id);if(K)return{records:F,record:K};const X=ns(e),g=rs(e),O=e.params.videoAnalyzerSource==="upload"?"upload":"youtube",Y=String(e.params.videoAnalyzerSourceLabel||(O==="youtube"?(g==null?void 0:g.type)==="youtube"?g.youtubeUrl:"":"本地视频")),$={id:ga(),createdAt:Date.now(),source:O,sourceLabel:Y,sourceSnapshot:g,model:String(e.params.model||""),modelRef:e.params.modelRef||null,analysis:X,starred:!1,analyzeTaskId:e.id};return{records:await ba($),record:$}}const c=xa(e,"videoAnalyzerRecordId");if(!c)return null;const o=(await Et()).find(F=>F.id===c);if(!o||o.pendingRewriteTaskId!==e.id)return null;const h=ya(e),m=ls(e),I=m||(()=>{if(!h)throw new Error("脚本改编任务缺少结果内容");const F=_a(h),K=o.editedShots||o.analysis.shots;return ja(K,F)})(),S=`AI 改编 #${(((E=o.scriptVersions)==null?void 0:E.length)||0)+1}`,w=Ia(I,S,(P=o.productInfo)==null?void 0:P.prompt),x=Sa(o,w);return wa(o,{...x,pendingRewriteTaskId:null,storyboardGeneratedAt:Date.now()},ie)}function is(e){return ra(e)!==null}const St="gemini-3.1-pro-preview",wt="video-analyzer:model",os="aitu:settings:provider-nav";function cs(e){return(e/1024/1024).toFixed(1)+"MB"}const ds=({existingRecord:e,onComplete:n,onRecordsChange:c,onCreateNew:j,onNext:o})=>{const{setAppState:h}=Rt(),[m,I]=s.useState("upload"),[S,w]=s.useState(""),[x,E]=s.useState(null),[P,F]=s.useState(()=>(e==null?void 0:e.model)||ve(wt,St).modelId),[K,X]=s.useState(()=>(e==null?void 0:e.modelRef)||ve(wt,St).modelRef),g=s.useCallback((i,y)=>{F(i),X(y||null),Ge(wt,i,y)},[]),[O,Y]=s.useState(!1),[$,M]=s.useState(null),[L,A]=s.useState(""),[oe,V]=s.useState(""),[U,G]=s.useState((e==null?void 0:e.analysis)||null),z=ka(),T=s.useRef(null),B=s.useRef(null),W=s.useMemo(()=>{if(B.current&&URL.revokeObjectURL(B.current),!x)return B.current=null,null;const i=URL.createObjectURL(x);return B.current=i,i},[x]);s.useEffect(()=>()=>{B.current&&URL.revokeObjectURL(B.current)},[]),s.useEffect(()=>{let i=!1;return(async()=>{if(!e){if($)return;G(null),I("upload"),w(""),E(null),V("");return}G(e.analysis||null),F(e.model||St),X(e.modelRef||null),V("");const _=e.sourceSnapshot;if((_==null?void 0:_.type)==="upload"){I("upload"),w("");const ee=await ss(_);if(i)return;E(ee),ee||V("原上传视频缓存已失效,无法自动回填视频");return}if(e.source==="upload"){I("upload"),w(""),E(null),V("这条旧历史未保存原视频,无法自动回填视频");return}I("youtube"),E(null),(_==null?void 0:_.type)==="youtube"?w(_.youtubeUrl):e.source==="youtube"?w(e.sourceLabel||""):w("")})(),()=>{i=!0}},[e]);const Z=He("text"),H=s.useMemo(()=>Z.filter(i=>/^gemini/i.test(i.id)),[Z]),ce=s.useMemo(()=>{const i=z.find(y=>y.id===vt);return!!(i!=null&&i.apiKey.trim())},[z]),_e=(K==null?void 0:K.profileId)===vt,ke=s.useCallback(()=>{const i={action:"select",profileId:vt};window.__aituPendingProviderNavigationIntent=i,window.dispatchEvent(new CustomEvent(os,{detail:i})),h(y=>({...y,openSettings:!0}))},[h]),me=s.useCallback(i=>{var _;const y=(_=i.target.files)==null?void 0:_[0];y&&(E(y),V(""),G(null))},[]),Me=s.useCallback(i=>{i.preventDefault();const y=i.dataTransfer.files[0];y!=null&&y.type.startsWith("video/")&&(E(y),V(""),G(null))},[]),re=s.useCallback(i=>{i.stopPropagation(),E(null),V(""),T.current&&(T.current.value="")},[]),[Re,Pe]=s.useState(!1),[Q,ae]=s.useState(""),pe=s.useCallback(async(i,y)=>{Pe(!0),ae("提取帧图片...");try{const _=y.map(de=>de.startTime),ee=await Ka(i,_,(de,je)=>ae(`提取帧图片 ${de}/${je}`));return await Promise.all(y.map(async(de,je)=>{const Ie=ee[je];if(!Ie)return de;try{const rt=await Ya(Ie,de.id,"first");return{...de,generated_first_frame_url:rt}}catch{return de}}))}catch(_){return console.debug("Frame extraction failed:",_),y}finally{Pe(!1),ae("")}},[]),r=s.useCallback(async()=>{Y(!0),V(""),A("准备中...");try{let i={};if(m==="upload"&&x){A("缓存视频文件...");const _=await as(x);i={videoCacheUrl:_.type==="upload"?_.cacheUrl:void 0,..._.type==="upload"?{mimeType:_.mimeType}:{},model:P,modelRef:K,taskLabel:`分析视频:${x.name||"本地视频"}`,videoAnalyzerSource:"upload",videoAnalyzerSourceLabel:x.name||"本地视频",videoAnalyzerSourceSnapshot:_}}else if(m==="youtube"&&S)i={youtubeUrl:S,model:P,modelRef:K,taskLabel:`分析视频:${S}`,videoAnalyzerSource:"youtube",videoAnalyzerSourceLabel:S,videoAnalyzerSourceSnapshot:{type:"youtube",youtubeUrl:S}};else{V("请先选择视频文件或输入 YouTube URL"),Y(!1);return}A("加入任务队列...");const y=await Ha.execute(i,{mode:"queue"});y.success&&y.taskId?(M(y.taskId||null),A("已加入任务队列,等待分析...")):V(y.error||"创建分析任务失败")}catch(i){V(i.message||"分析失败")}finally{Y(!1)}},[m,x,S,P,K]);s.useEffect(()=>{if(!$)return;const i=ge.observeTaskUpdates().subscribe(y=>{var _;if(y.task.id===$){if(y.task.status==="failed"){M(null),A(""),V(((_=y.task.error)==null?void 0:_.message)||"分析失败");return}if(y.task.status==="completed"){zt(y.task).then(async ee=>{if(ee&&(c(ee.records),n(ee.record),G(ee.record.analysis),ee.record.source==="upload"&&x&&ee.record.analysis.shots.length>0)){const de=await pe(x,ee.record.analysis.shots);G(Ie=>Ie&&{...Ie,shots:de});const je=await ie(ee.record.id,{editedShots:de});c(je),n({...ee.record,editedShots:de})}}).catch(ee=>{V(ee.message||"分析结果同步失败")}).finally(()=>{M(null),A("")});return}typeof y.task.progress=="number"?A(`分析中 ${Math.round(y.task.progress)}%`):A("分析中,请耐心等待...")}});return()=>i.unsubscribe()},[$,n,c,x,pe]);const b=s.useCallback(async()=>{U&&await st("text",nt(U.shots,U))},[U]);return t.jsxs("div",{className:"va-page",children:[!U&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"va-tabs",children:[t.jsx("button",{className:`va-tab ${m==="upload"?"active":""}`,onClick:()=>I("upload"),children:"上传视频"}),t.jsx("button",{className:`va-tab ${m==="youtube"?"active":""}`,onClick:()=>I("youtube"),children:"YouTube URL"})]}),m==="upload"?x?t.jsxs("div",{className:"va-video-preview",children:[t.jsx("video",{src:W,controls:!0,muted:!0,playsInline:!0}),t.jsx("button",{className:"va-video-preview-close",onClick:re,children:"✕"}),t.jsxs("div",{className:"va-video-preview-info",children:[t.jsx("span",{className:"va-video-preview-name",children:x.name}),t.jsx("span",{className:"va-video-preview-size",children:cs(x.size)})]}),t.jsx("input",{ref:T,type:"file",accept:"video/*",onChange:me,style:{display:"none"}})]}):t.jsxs("div",{className:"va-dropzone",onDrop:Me,onDragOver:i=>i.preventDefault(),onClick:()=>{var i;return(i=T.current)==null?void 0:i.click()},children:[t.jsx("input",{ref:T,type:"file",accept:"video/*",onChange:me,style:{display:"none"}}),t.jsxs("span",{className:"va-placeholder",children:["拖拽视频到此处 或 点击上传",t.jsx("br",{}),t.jsx("span",{className:"va-placeholder-hint",children:"建议视频在6M以内,可用推特或Youtube下载器下载最低分辨率视频"})]})]}):t.jsx("input",{className:"va-url-input",type:"text",placeholder:"https://www.youtube.com/watch?v=...",value:S,onChange:i=>w(i.target.value)}),t.jsxs("div",{className:"va-model-select",children:[t.jsx("label",{className:"va-model-label",children:"分析模型"}),t.jsx(Be,{variant:"form",selectedModel:P,selectedSelectionKey:Ke(P,K),onSelect:g,models:H,placement:"down",disabled:O,placeholder:"选择多模态模型"})]}),!_e&&t.jsxs("div",{className:"va-model-tip",children:[t.jsx("span",{children:"建议使用 gemini-mix 分组的gemini-3.1-pro-preview"}),!ce&&t.jsx("button",{type:"button",className:"va-model-tip-link",onClick:ke,children:"去设置"})]}),t.jsx("button",{className:"va-analyze-btn",onClick:r,disabled:O||!!$||(m==="upload"?!x:!S),children:O||$?L||"分析中...":"开始分析"}),oe&&t.jsx("div",{className:"va-error",children:oe})]}),U&&t.jsxs("div",{className:"va-results",children:[t.jsxs("div",{className:"va-stats",children:[t.jsxs("div",{className:"va-stat",children:[t.jsxs("span",{className:"va-stat-value",children:[U.totalDuration,"s"]}),t.jsx("span",{className:"va-stat-label",children:"总时长"})]}),t.jsxs("div",{className:"va-stat",children:[t.jsx("span",{className:"va-stat-value",children:U.shotCount}),t.jsx("span",{className:"va-stat-label",children:"镜头数"})]}),t.jsxs("div",{className:"va-stat",children:[t.jsxs("span",{className:"va-stat-value",children:[U.productExposureRatio,"%"]}),t.jsx("span",{className:"va-stat-label",children:"产品占比"})]}),t.jsxs("div",{className:"va-stat",children:[t.jsx("span",{className:"va-stat-value",children:U.aspect_ratio||"-"}),t.jsx("span",{className:"va-stat-label",children:"画面比例"})]})]}),(U.video_style||U.bgm_mood)&&t.jsxs("div",{className:"va-style-info",children:[U.video_style&&t.jsxs("span",{children:["风格: ",U.video_style]}),U.bgm_mood&&t.jsxs("span",{children:["BGM: ",U.bgm_mood]})]}),t.jsx("div",{className:"va-suggestion",children:U.suggestion}),t.jsx(es,{shots:U.shots,totalDuration:U.totalDuration}),t.jsx("div",{className:"va-shots",children:U.shots.map((i,y)=>t.jsx(Pt,{shot:i,index:y},i.id))}),t.jsxs("div",{className:"va-page-actions",children:[Re&&t.jsx("span",{className:"va-frame-progress",children:Q}),t.jsx("button",{onClick:b,children:"插入画布"}),t.jsx("button",{onClick:()=>{G(null)},children:"重新分析"}),j&&t.jsx("button",{onClick:j,children:"新建分析"}),o&&t.jsx("button",{className:"va-btn-primary",onClick:o,children:"下一步: 编辑脚本 →"})]})]})]})};function Ne(e){e.style.height="auto",e.style.height=e.scrollHeight+"px"}function Te(e,n=30){if(!e)return 1;const c=e.split(`
|
|
2
2
|
`);let j=0;for(const o of c)j+=Math.max(1,Math.ceil(o.length/n));return Math.max(1,j)}function Ee(e){e&&Ne(e)}const Ct="video-analyzer:script-model",Nt="video-analyzer:video-model",Qt="gemini-3.1-pro-preview",ea="veo3",us=["固定镜头 (Static)","缓慢推近 (Dolly In)","缓慢拉远 (Dolly Out)","水平平移 (Pan)","垂直摇移 (Tilt)","跟随拍摄 (Follow)","手持感 (Handheld)","环绕拍摄 (Orbit)","升降镜头 (Crane)","快速推移 (Zoom In)","快速拉远 (Zoom Out)","滑轨移动 (Slider)","航拍俯冲 (Drone Dive)","第一人称 (POV)"],ms=[{label:"无 (none)",value:"none"},{label:"仅旁白 (narration_only)",value:"narration_only"},{label:"仅对白 (dialogue_only)",value:"dialogue_only"},{label:"旁白+对白 (both)",value:"both"}],ps=[{label:"硬切 (cut)",value:"cut"},{label:"溶解 (dissolve)",value:"dissolve"},{label:"匹配切 (match_cut)",value:"match_cut"},{label:"淡出到黑 (fade_to_black)",value:"fade_to_black"}],fs=({record:e,onRecordUpdate:n,onRecordsChange:c,onNext:j})=>{var pe;const[o,h]=s.useState(()=>{const r=At(e.productInfo||{prompt:""},e.analysis.totalDuration);return{...r,videoStyle:r.videoStyle??e.analysis.video_style??"",bgmMood:r.bgmMood??e.analysis.bgm_mood??""}}),[m,I]=s.useState(e.editedShots||[...e.analysis.shots]),[S,w]=s.useState(!1),[x,E]=s.useState(()=>e.pendingRewriteTaskId||null),[P,F]=s.useState(""),[K,X]=s.useState(""),[g,O]=s.useState(!1),Y=s.useRef(null),[$,M]=s.useState(()=>ve(Ct,Qt).modelId),[L,A]=s.useState(()=>ve(Ct,Qt).modelRef),oe=s.useCallback((r,b)=>{M(r),A(b||null),Ge(Ct,r,b)},[]),V=He("text"),U=He("video"),[G,z]=s.useState(()=>{var r;return((r=e.productInfo)==null?void 0:r.videoModel)||ve(Nt,ea).modelId}),[T,B]=s.useState(()=>{var r,b;return((r=e.productInfo)==null?void 0:r.videoModelRef)||ve(Nt,((b=e.productInfo)==null?void 0:b.videoModel)||ea).modelRef}),W=s.useCallback((r,b)=>{z(r),B(b||null),Ge(Nt,r,b);const i=Ae(r),y=parseInt(i.defaultDuration,10)||8;h(_=>({..._,videoModel:r,videoModelRef:b||null,segmentDuration:y}))},[]),Z=s.useMemo(()=>Ae(G).durationOptions,[G]),H=s.useMemo(()=>{if(o.segmentDuration&&Z.some(i=>parseInt(i.value,10)===o.segmentDuration))return o.segmentDuration;const r=Ae(G);return parseInt(r.defaultDuration,10)||8},[o.segmentDuration,Z,G]),ce=s.useMemo(()=>{const r=o.targetDuration||e.analysis.totalDuration,b=[{label:`${H}秒`,value:String(H)}];return Ma(r,b)},[H,o.targetDuration,e.analysis.totalDuration]),_e=s.useMemo(()=>e.characters||e.analysis.characters||[],[e.characters,e.analysis.characters]);s.useEffect(()=>{const r=At(e.productInfo||{prompt:""},e.analysis.totalDuration);h({...r,videoStyle:r.videoStyle??e.analysis.video_style??"",bgmMood:r.bgmMood??e.analysis.bgm_mood??""}),I(e.editedShots||[...e.analysis.shots]),E(b=>e.pendingRewriteTaskId??b??null),F(b=>e.pendingRewriteTaskId?b:"")},[e]);const ke=s.useRef();s.useEffect(()=>(clearTimeout(ke.current),ke.current=setTimeout(async()=>{const r=await ie(e.id,{productInfo:o});c(r),n({...e,productInfo:o,pendingRewriteTaskId:x})},500),()=>clearTimeout(ke.current)),[o,x]);const me=s.useCallback(async r=>{I(r);const b=Fe(e,r),i=await ie(e.id,{...b,productInfo:o});c(i),n({...e,...b,productInfo:o,pendingRewriteTaskId:x})},[e,o,x,n,c]),Me=s.useCallback(async r=>{const b=await ie(e.id,r);c(b),n({...e,...r,productInfo:o,pendingRewriteTaskId:x})},[e,o,x,n,c]),re=s.useCallback((r,b,i)=>{const y=m.map(_=>_.id===r?{..._,[b]:i}:_);me(y)},[m,me]),Re=s.useCallback((r,b)=>{const y=(e.characters||e.analysis.characters||[]).map(_=>_.id===r?{..._,description:b}:_);Me({characters:y})},[e.characters,e.analysis.characters,Me]),Pe=s.useCallback(async()=>{var r;if(!((r=o.prompt)!=null&&r.trim())){X("请填写提示词");return}w(!0),X(""),F("AI 改编中 0%");try{const b=Ta({recordAnalysis:e.analysis,productInfo:o,videoModel:G,characters:_e}),i=ge.createTask({prompt:`改编脚本:${o.prompt.slice(0,40)}`,model:$,modelRef:L||null,videoAnalyzerAction:"rewrite",videoAnalyzerPrompt:b,videoAnalyzerRecordId:e.id,autoInsertToCanvas:!1},J.CHAT);E(i.id),F(`AI 改编中 ${Math.round(i.progress??0)}%`);const y=await ie(e.id,{pendingRewriteTaskId:i.id});c(y),n({...e,pendingRewriteTaskId:i.id})}catch(b){X(b.message||"改编失败")}finally{w(!1)}},[e,o,m,G,_e,$,L,n,c]);s.useEffect(()=>{if(!x)return;const r=ge.getTask(x);typeof(r==null?void 0:r.progress)=="number"&&F(`AI 改编中 ${Math.round(r.progress)}%`);const b=ge.observeTaskUpdates().subscribe(i=>{var y;if(i.task.id===x){if(i.task.status==="failed"){E(null),F(""),X(((y=i.task.error)==null?void 0:y.message)||"改编失败"),ie(e.id,{pendingRewriteTaskId:null}).then(_=>{c(_),n({...e,pendingRewriteTaskId:null})});return}if(i.task.status==="completed"){zt(i.task).then(_=>{_&&(c(_.records),n(_.record),I(_.record.editedShots||_.record.analysis.shots))}).catch(_=>{X(_.message||"改编结果同步失败")}).finally(()=>{E(null),F("")});return}typeof i.task.progress=="number"&&F(`AI 改编中 ${Math.round(i.task.progress)}%`)}});return()=>b.unsubscribe()},[x,e.id,n,c]);const Q=s.useCallback(async()=>{await st("text",nt(m,e.analysis,o))},[m,o,e]),ae=s.useCallback(async r=>{const b=aa(e,r);if(!b)return;O(!1),I(b.editedShots);const i=await ie(e.id,b);c(i),n({...e,...b})},[e,n,c]);return s.useEffect(()=>{if(!g)return;const r=b=>{Y.current&&!Y.current.contains(b.target)&&O(!1)};return document.addEventListener("mousedown",r),()=>document.removeEventListener("mousedown",r)},[g]),t.jsxs("div",{className:"va-page",children:[t.jsxs("div",{className:"va-product-form",children:[t.jsx("textarea",{ref:Ee,className:"va-form-textarea va-auto-resize",placeholder:"描述你想要的视频内容,如:拖鞋,生活用品,主打防滑...",rows:Math.max(3,Te(o.prompt)),value:o.prompt,onChange:r=>h(b=>({...b,prompt:r.target.value})),onInput:r=>Ne(r.currentTarget)}),t.jsx("div",{className:"va-form-row",children:t.jsxs("div",{className:"va-duration-input",style:{width:"auto",flex:1},children:[t.jsx("label",{className:"va-edit-label",children:"视频时长(秒)"}),t.jsx("input",{className:"va-form-input",type:"number",min:5,max:300,value:o.targetDuration??e.analysis.totalDuration,onChange:r=>h(b=>({...b,targetDuration:Number(r.target.value)||void 0}))})]})}),t.jsxs("div",{className:"va-model-select",children:[t.jsx("label",{className:"va-model-label",children:"改编模型"}),t.jsx(Be,{variant:"form",selectedModel:$,selectedSelectionKey:Ke($,L),onSelect:oe,models:V,placement:"down",disabled:S,placeholder:"选择文本模型"})]}),t.jsxs("div",{className:"va-model-select",children:[t.jsx("label",{className:"va-model-label",children:"视频模型"}),t.jsx(Be,{variant:"form",selectedModel:G,selectedSelectionKey:Ke(G,T),onSelect:W,models:U,placement:"down",disabled:S,placeholder:"选择视频模型"}),t.jsxs("div",{className:"va-segment-duration-select",children:[t.jsx("label",{className:"va-model-label",children:"单段"}),t.jsx("select",{className:"va-form-select",value:String(H),onChange:r=>h(b=>({...b,segmentDuration:parseInt(r.target.value,10)})),disabled:Z.length<=1,children:Z.map(r=>t.jsx("option",{value:r.value,children:r.label},r.value))})]}),ce.overflow>0&&t.jsxs("span",{className:"va-duration-overflow",children:["实际 ",ce.actualTotal,"s(+",parseFloat(ce.overflow.toFixed(2)),"s)"]})]}),t.jsxs("div",{className:"va-version-row",children:[t.jsx("button",{className:"va-analyze-btn",onClick:Pe,disabled:S||!!x,style:{flex:1},children:S||x?P||"AI 改编中...":"AI 改编脚本"}),e.scriptVersions&&e.scriptVersions.length>0&&t.jsxs("div",{className:"va-version-select",ref:Y,children:[t.jsxs("button",{className:"va-version-btn",onClick:()=>O(r=>!r),children:[e.activeVersionId===gt?"原始分析":((pe=e.scriptVersions.find(r=>r.id===e.activeVersionId))==null?void 0:pe.label)||`v${e.scriptVersions.length}`," ▾"]}),g&&t.jsxs("div",{className:"va-version-menu",children:[e.scriptVersions.map(r=>t.jsxs("div",{className:`va-version-item ${r.id===e.activeVersionId?"active":""}`,onClick:()=>ae(r.id),children:[t.jsx("span",{children:r.label}),r.prompt&&t.jsx("span",{className:"va-version-prompt",children:r.prompt.length>30?r.prompt.slice(0,30)+"...":r.prompt}),t.jsxs("span",{className:"va-version-time",children:[r.shots.length," 镜头 · ",new Date(r.createdAt).toLocaleTimeString()]})]},r.id)),t.jsxs("div",{className:`va-version-item ${e.activeVersionId===gt||!e.activeVersionId?"active":""}`,onClick:()=>ae(gt),children:[t.jsx("span",{children:"原始分析"}),t.jsxs("span",{className:"va-version-time",children:[e.analysis.shots.length," 镜头 · ",new Date(e.createdAt).toLocaleTimeString()]})]})]})]})]}),t.jsxs("div",{className:"va-form-row",children:[t.jsxs("div",{style:{flex:1},children:[t.jsx("label",{className:"va-edit-label",children:"画面风格"}),t.jsx(Qe,{className:"va-style-combo",value:o.videoStyle||"",onChange:r=>h(b=>({...b,videoStyle:r})),options:Aa,placeholder:Ea})]}),t.jsxs("div",{style:{flex:1},children:[t.jsx("label",{className:"va-edit-label",children:"BGM 情绪"}),t.jsx("textarea",{ref:Ee,className:"va-edit-textarea va-auto-resize",rows:Te(o.bgmMood),value:o.bgmMood||"",onChange:r=>h(b=>({...b,bgmMood:r.target.value})),onInput:r=>Ne(r.currentTarget),placeholder:"如:轻快、治愈、科技感"})]})]}),K&&t.jsx("div",{className:"va-error",children:K})]}),t.jsx(Ra,{characters:_e,onChange:Re}),t.jsx("div",{className:"va-shots",children:m.map((r,b)=>t.jsx(Pt,{shot:r,index:b,compact:!0,children:t.jsxs("div",{className:"va-edit-fields",children:[t.jsx("label",{className:"va-edit-label",children:"画面描述"}),t.jsx("textarea",{ref:Ee,className:"va-edit-textarea va-auto-resize",rows:Te(r.description),value:r.description||"",onChange:i=>re(r.id,"description",i.target.value),onInput:i=>Ne(i.currentTarget)}),t.jsx("label",{className:"va-edit-label",children:"旁白"}),t.jsx("textarea",{ref:Ee,className:"va-edit-textarea va-auto-resize",rows:Te(r.narration),value:r.narration||"",onChange:i=>re(r.id,"narration",i.target.value),onInput:i=>Ne(i.currentTarget)}),t.jsx("label",{className:"va-edit-label",children:"角色说话"}),t.jsx("textarea",{ref:Ee,className:"va-edit-textarea va-auto-resize",rows:Te(r.dialogue),value:r.dialogue||"",onChange:i=>re(r.id,"dialogue",i.target.value),onInput:i=>Ne(i.currentTarget),placeholder:'多角色时按"角色名: 台词"分行'}),t.jsx("label",{className:"va-edit-label",children:"对白角色"}),t.jsx("input",{className:"va-form-input",type:"text",value:r.dialogue_speakers||"",onChange:i=>re(r.id,"dialogue_speakers",i.target.value),placeholder:"如:主讲人 或 主讲人|顾客"}),t.jsx("label",{className:"va-edit-label",children:"旁白/对白关系"}),t.jsx(Qe,{value:r.speech_relation||"",onChange:i=>re(r.id,"speech_relation",i),options:ms,placeholder:"选择关系"}),t.jsx("label",{className:"va-edit-label",children:"运镜方式"}),t.jsx(Qe,{value:r.camera_movement||"",onChange:i=>re(r.id,"camera_movement",i),options:us,placeholder:"选择或输入运镜方式"}),t.jsx("label",{className:"va-edit-label",children:"首帧 Prompt"}),t.jsx("textarea",{ref:Ee,className:"va-edit-textarea va-auto-resize",rows:Te(r.first_frame_prompt),value:r.first_frame_prompt||"",onChange:i=>re(r.id,"first_frame_prompt",i.target.value),onInput:i=>Ne(i.currentTarget)}),t.jsx("label",{className:"va-edit-label",children:"尾帧 Prompt"}),t.jsx("textarea",{ref:Ee,className:"va-edit-textarea va-auto-resize",rows:Te(r.last_frame_prompt),value:r.last_frame_prompt||"",onChange:i=>re(r.id,"last_frame_prompt",i.target.value),onInput:i=>Ne(i.currentTarget)}),t.jsx("label",{className:"va-edit-label",children:"转场方式"}),t.jsx(Qe,{value:r.transition_hint||"",onChange:i=>re(r.id,"transition_hint",i),options:ps,placeholder:"选择转场方式"})]})},r.id))}),t.jsxs("div",{className:"va-page-actions",children:[t.jsx("button",{onClick:Q,children:"脚本插入画布"}),j&&t.jsx("button",{className:"va-btn-primary",onClick:j,children:"下一步:批量生成 →"})]})]})};function hs(e,n,c){var j,o,h;return{recordId:e.id,fileNamePrefix:"va",zipBaseName:"video_analyzer_assets",scriptMarkdown:nt(n,e.analysis,e.productInfo),recordMeta:{id:e.id,source:e.source,sourceLabel:e.sourceLabel,prompt:((j=e.productInfo)==null?void 0:j.prompt)||"",aspectRatio:e.analysis.aspect_ratio||"16x9",videoStyle:((o=e.productInfo)==null?void 0:o.videoStyle)||e.analysis.video_style||"",bgmMood:((h=e.productInfo)==null?void 0:h.bgmMood)||e.analysis.bgm_mood||"",shotCount:n.length},shots:n,assets:c}}function vs(e,n){const c=e.characters||e.analysis.characters||[];return Wa(n,c)}const kt="video-analyzer:image-model",at="video-analyzer:video-model",Mt=({size:e=14})=>t.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",width:e,height:e,"aria-hidden":"true",children:[t.jsx("rect",{x:"3",y:"3",width:"8",height:"8",rx:"1.5"}),t.jsx("circle",{cx:"17",cy:"7",r:"4"}),t.jsx("rect",{x:"3",y:"13",width:"8",height:"8",rx:"1.5"}),t.jsx("rect",{x:"13",y:"13",width:"8",height:"8",rx:"1.5"})]}),gs=({record:e,onRecordUpdate:n,onRecordsChange:c,onRestart:j})=>{const o=s.useMemo(()=>e.editedShots||e.analysis.shots,[e.editedShots,e.analysis.shots]),h=e.analysis.aspect_ratio||"16x9",m=e.batchId||`va_${e.id}`,{openDialog:I,board:S}=Rt(),w=s.useRef(e),x=s.useRef(o),E=s.useRef(!1),P=s.useRef(null),F=s.useRef(null),[K,X]=s.useState([]),[g,O]=s.useState(null),Y=He("image"),$=He("video"),[M,L]=s.useState(()=>ve(kt,"").modelId),[A,oe]=s.useState(()=>ve(kt,"").modelRef),[V,U]=s.useState(()=>{var a;return((a=e.productInfo)==null?void 0:a.videoModel)||ve(at,"veo3").modelId}),[G,z]=s.useState(()=>{var a,l;return((a=e.productInfo)==null?void 0:a.videoModelRef)||ve(at,((l=e.productInfo)==null?void 0:l.videoModel)||"veo3").modelRef}),[T,B]=s.useState(()=>{var a,l;return bt(((a=e.productInfo)==null?void 0:a.videoModel)||ve(at,"veo3").modelId,(l=e.productInfo)==null?void 0:l.videoSize,h)}),[W,Z]=s.useState(()=>{var a,l;return((a=e.productInfo)==null?void 0:a.segmentDuration)||parseInt(Ae(((l=e.productInfo)==null?void 0:l.videoModel)||"veo3").defaultDuration,10)||8}),[H,ce]=s.useState({running:!1,stopping:!1,currentIndex:-1,retryCount:0}),[_e,ke]=s.useState(!1),me=s.useMemo(()=>Ae(V),[V]),Me=s.useMemo(()=>me.durationOptions,[me]),re=s.useMemo(()=>me.sizeOptions,[me]),Re=s.useMemo(()=>e.characters||e.analysis.characters||[],[e.characters,e.analysis.characters]),Pe=s.useMemo(()=>qa(o),[o]);s.useEffect(()=>{w.current=e},[e]),s.useEffect(()=>{x.current=o},[o]);const Q=s.useCallback(async a=>{const l=w.current,u={...l,...a};w.current=u,u.editedShots&&(x.current=u.editedShots);const d=await ie(l.id,a);return c(d),n(u),u},[n,c]),ae=s.useCallback(async a=>{const l=w.current,u=Fe(l,a);return x.current=a,await Q(u),a},[Q]),pe=s.useCallback(async a=>{const l=w.current,u={...At(l.productInfo||{prompt:""},l.analysis.totalDuration),...a};return await Q({productInfo:u}),u},[Q]),r=s.useCallback(async(a,l)=>{const u=w.current,f=(u.characters||u.analysis.characters||[]).map(p=>p.id===a?{...p,referenceImageUrl:l}:p);await Q({characters:f})},[Q]),b=s.useCallback(a=>{const l=`va_${e.id}_char${a.id}_ref`;I(et.aiImageGeneration,{initialPrompt:a.description,batchId:l,initialAspectRatio:"1:1",initialModel:M||void 0,initialModelRef:A})},[e.id,I,M,A]),i=s.useCallback((a,l)=>{L(a),oe(l||null),Ge(kt,a,l)},[]),y=s.useCallback((a,l)=>{U(a),z(l||null),Ge(at,a,l);const u=Ae(a),d=parseInt(u.defaultDuration,10)||8,f=bt(a,T,h);Z(d),B(f),pe({videoModel:a,videoModelRef:l||null,segmentDuration:d,videoSize:f})},[pe,h,T]),_=s.useCallback(a=>{Z(a),pe({segmentDuration:a})},[pe]),ee=s.useCallback(a=>{const l=bt(V,a,h);B(l),pe({videoSize:l})},[pe,h,V]),de=s.useCallback(async()=>{try{const a=w.current,l=x.current;if(!S)throw new Error("画布未就绪");Zt(S);const u=await st("text",nt(l,a.analysis,a.productInfo));if(!u.success)throw new Error(u.error||"插入失败,请确认画布已打开");we.success("脚本已插入画布")}catch(a){console.error("[VideoAnalyzer] Failed to insert script to canvas:",a);const l=a instanceof Error?a.message:"脚本插入画布失败";we.error(l)}},[S]),je=s.useCallback(async a=>{if(!S)return!1;try{Zt(S);const l=await st("video",a);if(!l.success)throw new Error(l.error||"插入失败,请确认画布已打开");return!0}catch(l){return console.error("[VideoAnalyzer] Failed to insert generated video to canvas:",l),!1}},[S]),{isExportingAssets:Ie,exportProgress:rt,handleExportAssets:ia}=Pa({onExport:async a=>{const l=w.current,u=x.current;return await Xa({...hs(l,u,Pe),onProgress:a})},onExportSuccess:a=>{we.success(`素材导出完成,共 ${a.assetCount} 个文件`)},onExportError:a=>{console.error("[VideoAnalyzer] Failed to export assets:",a),we.error("素材导出失败")}}),lt=s.useMemo(()=>K.map(a=>a.url).filter(Boolean),[K]),Dt=s.useCallback(async()=>{e.batchId||await Q({batchId:m})},[e.batchId,m,Q]),{tasks:Vt}=sa(),ze=s.useRef(new Set),it=s.useRef(new Set),Ft=s.useCallback(async(a,l,u)=>{let d=[...l],f=!1;for(const{shotId:p,videoUrl:C}of u){const N=`auto_${p}`;if(!it.current.has(N)){it.current.add(N);try{const R=d.findIndex(D=>D.id===p);if(R===-1)continue;const k=d[R+1];if(!k)continue;const v=await tt(C,k.id,"first","last");if(!v||k.generated_first_frame_url===v)continue;d=d.map((D,le)=>le===R+1?{...D,generated_first_frame_url:v}:D),f=!0}finally{it.current.delete(N)}}}if(f){const p=e;ie(a,Fe(p,d)).then(C=>{c(C),n({...p,editedShots:d})})}},[e,n,c]);s.useEffect(()=>{var C,N,R,k;const a=`va_${e.id}_shot`,l=`va_${e.id}_char`;let u=!1;const d=e;let f=d.editedShots||d.analysis.shots;const p=[];for(const v of Vt){if(v.status!==be.COMPLETED||ze.current.has(v.id))continue;const D=(C=v.params)==null?void 0:C.batchId;if(!D)continue;if(D.startsWith(l)){const he=(N=v.result)==null?void 0:N.url;if(ze.current.add(v.id),he){const Bt=D.slice(l.length),Ht=Bt.lastIndexOf("_ref");if(Ht!==-1){const fa=Bt.slice(0,Ht),ha=(w.current.characters||w.current.analysis.characters||[]).map(ht=>ht.id===fa?{...ht,referenceImageUrl:he}:ht);Q({characters:ha})}}continue}if(!D.startsWith(a))continue;if(e.storyboardGeneratedAt&&v.createdAt<e.storyboardGeneratedAt){ze.current.add(v.id);continue}const le=(R=v.result)==null?void 0:R.url;if(!le)continue;const se=D.slice(a.length),Se=se.lastIndexOf("_");if(Se===-1)continue;const ne=se.slice(0,Se),q=se.slice(Se+1);if(q!=="first"&&q!=="last"&&q!=="video")continue;const fe=q==="first"?"generated_first_frame_url":q==="last"?"generated_last_frame_url":"generated_video_url",te=f.find(he=>he.id===ne),ue=(k=te==null?void 0:te.suppressed_generated_urls)==null?void 0:k[q];if(ue&&ue===le){ze.current.add(v.id);continue}if(!te||te[fe]===le){ze.current.add(v.id);continue}f=f.map(he=>he.id===ne?{...he,[fe]:le,suppressed_generated_urls:he.suppressed_generated_urls?{...he.suppressed_generated_urls,[q]:void 0}:void 0}:he),ze.current.add(v.id),u=!0,q==="video"&&p.push({shotId:ne,videoUrl:le})}u&&ie(d.id,Fe(d,f)).then(v=>{c(v),n({...d,editedShots:f})}),p.length>0&&Ft(d.id,f,p)},[Vt,Ft,e,n,c,Q]);const[xe,ot]=s.useState(null),ct=s.useCallback((a,l)=>{ot({shotId:a,assetType:l})},[]),oa=s.useCallback(async a=>{if(!xe)return;ot(null);const{shotId:l,assetType:u}=xe,d=u==="first"?"generated_first_frame_url":u==="last"?"generated_last_frame_url":"generated_video_url",p=(e.editedShots||e.analysis.shots).map(N=>N.id===l?{...N,[d]:a.url}:N),C=await ie(e.id,Fe(e,p));c(C),n({...e,editedShots:p})},[xe,e,c,n]),[De,dt]=s.useState(null),Le=s.useRef(null),ye=s.useCallback(()=>{Le.current!==null&&(window.clearTimeout(Le.current),Le.current=null)},[]),Lt=s.useCallback(()=>{ye(),dt(null)},[ye]),Ot=s.useCallback(()=>{ye(),Le.current=window.setTimeout(()=>{Le.current=null,dt(null)},120)},[ye]),Ye=s.useCallback((a,l,u)=>{ye();const d=u.currentTarget.getBoundingClientRect();dt({url:a,type:l,x:d.left+d.width/2,y:d.top-8})},[ye]),We=s.useCallback(()=>{Ot()},[Ot]),ca=s.useCallback(()=>{ye()},[ye]),da=s.useCallback(()=>{Lt()},[Lt]);s.useEffect(()=>()=>{ye()},[ye]);const Oe=s.useMemo(()=>{var l;const a=(l=re.find(u=>u.value===T))==null?void 0:l.aspectRatio;if(a)return a;if(T!=null&&T.includes("x")){const[u,d]=T.split("x").map(Number);if(u&&d){const f=(C,N)=>N===0?C:f(N,C%N),p=f(u,d);return`${u/p}:${d/p}`}}return h.replace("x",":")},[h,re,T]),qe=Oe,Ce=s.useCallback(a=>a.map(l=>({url:l.url,name:l.name})),[]),Ze=s.useCallback((a=[],l=[])=>a.length===l.length&&a.every((u,d)=>{var f,p;return u.url===((f=l[d])==null?void 0:f.url)&&u.name===((p=l[d])==null?void 0:p.name)}),[]),Ve=s.useCallback(async(a,l,u)=>{let d=!1;const f=Ce(u.images),p=x.current.map(C=>{if(C.id!==a)return C;if(l==="first"){const k=C.first_frame_draft,v={prompt:u.prompt,images:f,aspectRatio:u.aspectRatio};return(k==null?void 0:k.prompt)===v.prompt&&(k==null?void 0:k.aspectRatio)===v.aspectRatio&&Ze(k==null?void 0:k.images,v.images)?C:(d=!0,{...C,first_frame_draft:v})}if(l==="last"){const k=C.last_frame_draft,v={prompt:u.prompt,images:f,aspectRatio:u.aspectRatio};return(k==null?void 0:k.prompt)===v.prompt&&(k==null?void 0:k.aspectRatio)===v.aspectRatio&&Ze(k==null?void 0:k.images,v.images)?C:(d=!0,{...C,last_frame_draft:v})}const N=C.video_draft,R={prompt:u.prompt,images:f,duration:u.duration,size:u.size};return(N==null?void 0:N.prompt)===R.prompt&&(N==null?void 0:N.duration)===R.duration&&(N==null?void 0:N.size)===R.size&&Ze(N==null?void 0:N.images,R.images)?C:(d=!0,{...C,video_draft:R})});d&&await ae(p)},[ae,Ze,Ce]),ut=s.useCallback(a=>{const l=a.first_frame_prompt||a.description||"";if(!l)return;const u=xt(l,e.analysis,e.productInfo),d=a.first_frame_draft,f=`va_${e.id}_shot${a.id}_first`;I(et.aiImageGeneration,{initialPrompt:(d==null?void 0:d.prompt)||u,batchId:f,initialAspectRatio:(d==null?void 0:d.aspectRatio)??qe,initialModel:M||void 0,initialModelRef:A,initialImages:d?Ce(d.images||[]):a.generated_first_frame_url?[{url:a.generated_first_frame_url,name:"首帧"}]:void 0,onDraftChange:p=>Ve(a.id,"first",p)})},[e,I,qe,M,A,Ve,Ce]),$e=s.useCallback((a,l)=>{if(a.generated_last_frame_url)return a.generated_last_frame_url;const u=o[l+1];return u==null?void 0:u.generated_first_frame_url},[o]),Xe=s.useCallback((a,l)=>{const u=a.last_frame_prompt||a.description||"";if(!u)return;const d=xt(u,e.analysis,e.productInfo),f=a.last_frame_draft,p=`va_${e.id}_shot${a.id}_last`,C=$e(a,l);I(et.aiImageGeneration,{initialPrompt:(f==null?void 0:f.prompt)||d,batchId:p,initialAspectRatio:(f==null?void 0:f.aspectRatio)??qe,initialModel:M||void 0,initialModelRef:A,initialImages:f?Ce(f.images||[]):C?[{url:C,name:"尾帧"}]:void 0,onDraftChange:N=>Ve(a.id,"last",N)})},[e,I,$e,qe,M,A,Ve,Ce]),mt=s.useCallback((a,l)=>{const u=yt(a,e.analysis,e.productInfo);if(!u)return;const d=a.video_draft,f=`va_${e.id}_shot${a.id}_video`,p=[];a.generated_first_frame_url&&p.push({url:a.generated_first_frame_url,name:"首帧"});const C=$e(a,l);C&&p.push({url:C,name:"尾帧"});const N=Ce((d==null?void 0:d.images)||[]),R=N.length>0?N:p.length>0?p:void 0,k=Ae(V),v=String((d==null?void 0:d.duration)??W),D=k.durationOptions.some(se=>se.value===v)?(d==null?void 0:d.duration)??W:void 0,le=k.sizeOptions.some(se=>se.value===((d==null?void 0:d.size)??T))?(d==null?void 0:d.size)??T:void 0;I(et.aiVideoGeneration,{initialPrompt:(d==null?void 0:d.prompt)||u,initialImages:R,initialDuration:D,initialSize:le,initialModel:V||void 0,initialModelRef:G,batchId:f,onDraftChange:se=>Ve(a.id,"video",se)})},[e.id,W,T,V,G,I,$e,e.analysis,e.productInfo,Ve,Ce]),pt=s.useCallback((a,l)=>{const u=l==="first"?"generated_first_frame_url":l==="last"?"generated_last_frame_url":"generated_video_url",f=(e.editedShots||e.analysis.shots).map(p=>p.id===a?{...p,[u]:void 0,suppressed_generated_urls:p[u]?{...p.suppressed_generated_urls||{},[l]:p[u]}:p.suppressed_generated_urls}:p);ie(e.id,Fe(e,f)).then(p=>{c(p),n({...e,editedShots:f})})},[e,n,c]),$t=s.useCallback(async(a,l,u)=>{var D,le,se;const d=a.first_frame_prompt||a.description||"";if(!d)return null;const f=xt(d,e.analysis,e.productInfo),p=[];if(l&&p.push(l),a.character_ids&&a.character_ids.length>0)for(const Se of a.character_ids){const ne=u.find(q=>q.id===Se);ne!=null&&ne.referenceImageUrl&&!p.includes(ne.referenceImageUrl)&&p.push(ne.referenceImageUrl)}const C=`va_${e.id}_shot${a.id}_first`,N=await _t.executeTool({name:"generate_image",arguments:{prompt:f.trim(),count:1,size:h,referenceImages:p.length>0?p:void 0,batchId:C,...M?{model:M,modelRef:A}:{}}},{mode:"queue"}),R=N.taskId||((D=N.data)==null?void 0:D.taskId);if(!N.success||!R)return null;const k=await It(R,(le=P.current)==null?void 0:le.signal);if(!k.success)return null;const v=k.task||ge.getTask(R);return((se=v==null?void 0:v.result)==null?void 0:se.url)||null},[e,h,M,A]),ft=s.useCallback(async(a,l,u)=>{const d=a[l+1];if(!d)return a;const f=await tt(u,d.id,"first","last");if(!f||d.generated_first_frame_url===f)return a;const p=a.map((C,N)=>N===l+1?{...C,generated_first_frame_url:f}:C);return await ae(p),p},[ae]),Ut=s.useCallback(async(a,l,u)=>{const d=a[l];if(!d||d.generated_video_url===u)return a;const f=a.map((p,C)=>C===l?{...p,generated_video_url:u}:p);return await ae(f),f},[ae]),Gt=s.useCallback(async(a,l,u)=>{var v,D;const d=yt(a,e.analysis,e.productInfo);if(!d)return null;const f=l===0?lt[0]:a.generated_first_frame_url,p=a.generated_last_frame_url||((v=u[l+1])==null?void 0:v.generated_first_frame_url),{referenceImages:C}=Za({model:V,firstFrameUrl:f,lastFrameUrl:p,extraReferenceUrls:lt.slice(l===0?1:0)}),N=`va_${e.id}_shot${a.id}_video`,R=await _t.executeTool({name:"generate_video",arguments:{prompt:d,size:T,seconds:String(W),count:1,batchId:N,model:V,modelRef:G,referenceImages:C,params:me.provider==="seedance"?{aspect_ratio:Oe}:void 0}},{mode:"queue"}),k=R.taskId||((D=R.data)==null?void 0:D.taskId);if(!R.success||!k)throw new Error(R.error||"创建视频任务失败");return k},[e.analysis,e.id,e.productInfo,lt,W,V,me.provider,G,T,Oe]),ua=s.useCallback(()=>{var a;E.current=!0,ce(l=>l.running?{...l,stopping:!0}:l),F.current&&ge.cancelTask(F.current),(a=P.current)==null||a.abort()},[]);s.useEffect(()=>()=>{var a;E.current=!0,(a=P.current)==null||a.abort()},[]);const ma=s.useCallback(async()=>{var l,u,d,f,p;if(H.running)return;let a=_e;a&&!S&&(we.warning("画布未就绪,本次将只生成不插入画布"),a=!1),await Dt(),E.current=!1,P.current=new AbortController,F.current=null,ce({running:!0,stopping:!1,currentIndex:-1,retryCount:0});try{let C=w.current.characters||w.current.analysis.characters||[];const N=C.filter(v=>!v.referenceImageUrl);if(N.length>0&&!E.current){for(const v of N){if(E.current)break;const D=`va_${e.id}_char${v.id}_ref`,le=await _t.executeTool({name:"generate_image",arguments:{prompt:v.description,count:1,size:"1:1",batchId:D,...M?{model:M,modelRef:A}:{}}},{mode:"queue"}),se=le.taskId||((l=le.data)==null?void 0:l.taskId);if(se){const Se=await It(se,(u=P.current)==null?void 0:u.signal);if(Se.success){const ne=Se.task||ge.getTask(se),q=(d=ne==null?void 0:ne.result)==null?void 0:d.url;if(q){const te=(w.current.characters||w.current.analysis.characters||[]).map(ue=>ue.id===v.id?{...ue,referenceImageUrl:q}:ue);await Q({characters:te})}}}}C=w.current.characters||w.current.analysis.characters||[]}let R=x.current,k;for(let v=0;v<R.length&&!E.current;v++){R=x.current;const D=R[v];if(!D||!yt(D,e.analysis,e.productInfo))continue;if(ce(fe=>({...fe,currentIndex:v,retryCount:0})),D.generated_video_url){try{k=await tt(D.generated_video_url,D.id,"last","last")||void 0}catch{k=void 0}a&&await je(D.generated_video_url),R=await ft(R,v,D.generated_video_url);continue}if(C=w.current.characters||w.current.analysis.characters||[],((D.character_ids||[]).length>0||k!==void 0)&&!D.generated_first_frame_url&&!E.current){const fe=await $t(D,k,C);fe&&(R=R.map((te,ue)=>ue===v?{...te,generated_first_frame_url:fe}:te),await ae(R))}if(E.current)break;let ne=0,q=null;for(;!E.current&&(q||(q=await Gt(R[v]||D,v,R)),!!q);){F.current=q,ce({running:!0,stopping:!1,currentIndex:v,retryCount:ne});const fe=await It(q,(f=P.current)==null?void 0:f.signal);if(E.current)break;const te=fe.task||ge.getTask(q),ue=(p=te==null?void 0:te.result)==null?void 0:p.url;if(fe.success&&te&&ue){R=await Ut(R,v,ue),a&&await je(ue);try{k=await tt(ue,D.id,"last","last")||void 0}catch{k=void 0}R=await ft(R,v,ue);break}if(ne+=1,ce({running:!0,stopping:!1,currentIndex:v,retryCount:ne}),(te==null?void 0:te.status)===be.FAILED){ge.retryTask(q);continue}q=null}F.current=null}}finally{F.current=null,P.current=null,ce({running:!1,stopping:!1,currentIndex:-1,retryCount:0})}},[H.running,Gt,Dt,$t,ae,Q,ft,e.id,e.analysis,e.productInfo,M,A,je,_e,Ut,S]),pa=s.useCallback(async()=>{const a=vs(w.current,x.current);await ae(a.shots),await Q({characters:a.characters})},[ae,Q]),Je=s.useMemo(()=>{const[a,l]=Oe.split(":").map(Number);return!a||!l?{}:{width:Math.round(54*a/l),height:54}},[Oe]);return t.jsxs("div",{className:"va-page",children:[t.jsxs("div",{className:"va-batch-config",children:[t.jsx("div",{className:"va-batch-config-title",children:"批量生成配置"}),t.jsx(Ja,{images:K,onImagesChange:X,multiple:!0,label:"参考图 (可选)"}),Re.length>0&&t.jsxs("div",{className:"va-characters",children:[t.jsx("div",{className:"va-characters-title",children:"角色"}),Re.map(a=>t.jsxs("div",{className:"va-character-item",children:[t.jsxs("div",{className:"va-character-info",children:[t.jsx("span",{className:"va-character-name",children:a.name}),t.jsx("span",{className:"va-character-desc",children:a.description})]}),t.jsxs("div",{className:"va-character-ref",children:[a.referenceImageUrl?t.jsxs("div",{className:"va-character-ref-thumb",children:[t.jsx("img",{src:a.referenceImageUrl,alt:a.name,referrerPolicy:"no-referrer"}),t.jsx("button",{className:"va-shot-frame-delete",onClick:()=>void r(a.id,void 0),children:"×"})]}):t.jsx("span",{className:"va-character-ref-empty",children:"未设置"}),t.jsx("button",{onClick:()=>b(a),children:"生成"}),t.jsx("button",{onClick:()=>O(a.id),children:"素材库"})]})]},a.id))]}),t.jsxs("div",{className:"va-product-form",children:[t.jsxs("div",{className:"va-model-select",children:[t.jsx("label",{className:"va-model-label",children:"图片模型"}),t.jsx(Be,{variant:"form",selectedModel:M,selectedSelectionKey:Ke(M,A),onSelect:i,models:Y,placement:"down",placeholder:"选择图片模型"})]}),t.jsxs("div",{className:"va-model-select",children:[t.jsx("label",{className:"va-model-label",children:"视频模型"}),t.jsx(Be,{variant:"form",selectedModel:V,selectedSelectionKey:Ke(V,G),onSelect:y,models:$,placement:"down",placeholder:"选择视频模型"}),t.jsxs("div",{className:"va-segment-duration-select",children:[t.jsx("label",{className:"va-model-label",children:"单段"}),t.jsx("select",{className:"va-form-select",value:String(W),onChange:a=>_(parseInt(a.target.value,10)),disabled:Me.length<=1,children:Me.map(a=>t.jsx("option",{value:a.value,children:a.label},a.value))})]}),t.jsxs("div",{className:"va-segment-duration-select",children:[t.jsx("label",{className:"va-model-label",children:"尺寸"}),t.jsx("select",{className:"va-form-select",value:T,onChange:a=>ee(a.target.value),disabled:re.length<=1,children:re.map(a=>t.jsx("option",{value:a.value,children:a.label},a.value))})]})]})]}),H.running&&t.jsxs("div",{className:"va-batch-config-title",children:["正在串行生成第 ",Math.max(H.currentIndex+1,1),"/",o.length," 段",H.retryCount>0?`,已重试 ${H.retryCount} 次`:""]}),t.jsxs("div",{className:"va-page-actions",children:[j&&t.jsx("button",{onClick:j,children:"重新分析"}),t.jsx("button",{onClick:pa,children:"重置生成"}),t.jsxs("label",{className:"va-inline-checkbox",children:[t.jsx("input",{type:"checkbox",checked:_e,onChange:a=>ke(a.target.checked)}),"生成后插入画布"]}),t.jsx("button",{onClick:ma,disabled:H.running,children:"全部→生成视频"}),H.running&&t.jsx("button",{onClick:ua,children:H.stopping?"停止中…":"停止全部生成"})]})]}),t.jsx("div",{className:"va-shots",children:o.map((a,l)=>t.jsx(Pt,{shot:a,index:l,actions:t.jsxs(t.Fragment,{children:[a.generated_first_frame_url?t.jsxs("div",{className:"va-shot-frame-thumb",style:Je,onMouseEnter:u=>Ye(a.generated_first_frame_url,"image",u),onMouseLeave:We,children:[t.jsx("img",{src:a.generated_first_frame_url,alt:"首帧",referrerPolicy:"no-referrer",onClick:()=>ut(a)}),t.jsx("button",{className:"va-shot-frame-delete",onClick:()=>pt(a.id,"first"),children:"×"}),t.jsx("button",{className:"va-shot-frame-regen",onClick:()=>ut(a),children:"↻"})]}):a.first_frame_prompt||a.description?t.jsxs("span",{className:"va-shot-frame-btn-group",children:[t.jsx("button",{onClick:()=>ut(a),children:"生成首帧"}),t.jsx("button",{className:"va-shot-frame-library-btn",onClick:()=>ct(a.id,"first"),children:t.jsx(Ue,{content:"从素材库选择",showArrow:!1,children:t.jsx("span",{children:t.jsx(Mt,{})})})})]}):null,(()=>{const u=a.generated_last_frame_url||$e(a,l),d=!a.generated_last_frame_url&&u;return a.generated_last_frame_url?t.jsxs("div",{className:"va-shot-frame-thumb",style:Je,onMouseEnter:f=>Ye(a.generated_last_frame_url,"image",f),onMouseLeave:We,children:[t.jsx("img",{src:a.generated_last_frame_url,alt:"尾帧",referrerPolicy:"no-referrer",onClick:()=>Xe(a,l)}),t.jsx("button",{className:"va-shot-frame-delete",onClick:()=>pt(a.id,"last"),children:"×"}),t.jsx("button",{className:"va-shot-frame-regen",onClick:()=>Xe(a,l),children:"↻"})]}):d?t.jsxs("div",{className:"va-shot-frame-thumb va-shot-frame-thumb--borrowed",style:Je,onMouseEnter:f=>Ye(u,"image",f),onMouseLeave:We,children:[t.jsx("img",{src:u,alt:"尾帧(下一镜头首帧)",referrerPolicy:"no-referrer",onClick:()=>Xe(a,l)}),t.jsx("span",{className:"va-shot-frame-label",children:"下一镜头首帧"})]}):a.last_frame_prompt||a.description?t.jsxs("span",{className:"va-shot-frame-btn-group",children:[t.jsx("button",{onClick:()=>Xe(a,l),children:"生成尾帧"}),t.jsx("button",{className:"va-shot-frame-library-btn",onClick:()=>ct(a.id,"last"),children:t.jsx(Ue,{content:"从素材库选择",showArrow:!1,children:t.jsx("span",{children:t.jsx(Mt,{})})})})]}):null})(),a.generated_video_url?t.jsxs("div",{className:"va-shot-frame-thumb",style:Je,onMouseEnter:u=>Ye(a.generated_video_url,"video",u),onMouseLeave:We,children:[t.jsx(na,{src:a.generated_video_url,alt:"生成视频缩略图",className:"va-shot-frame-media",thumbnailSize:"small",onClick:()=>mt(a,l),videoProps:{muted:!0,preload:"metadata"}}),t.jsx("button",{className:"va-shot-frame-delete",onClick:()=>pt(a.id,"video"),children:"×"}),t.jsx("button",{className:"va-shot-frame-regen",onClick:()=>mt(a,l),children:"↻"})]}):a.description||a.narration||a.dialogue||a.camera_movement||a.first_frame_prompt||a.last_frame_prompt?t.jsxs("span",{className:"va-shot-frame-btn-group",children:[t.jsx("button",{onClick:()=>mt(a,l),children:"生成视频"}),t.jsx("button",{className:"va-shot-frame-library-btn",onClick:()=>ct(a.id,"video"),children:t.jsx(Ue,{content:"从素材库插入视频",showArrow:!1,children:t.jsx("span",{children:t.jsx(Mt,{})})})})]}):null]})},a.id))}),t.jsxs("div",{className:"va-page-actions mv-generate-footer-actions",children:[t.jsx("button",{onClick:()=>void de(),disabled:o.length===0||!S,children:"脚本插入画布"}),t.jsx("button",{onClick:()=>void ia(),disabled:Ie||o.length===0,children:Ie?`素材下载 ${rt}%`:"素材下载 ZIP"})]}),t.jsx("div",{className:"mv-generate-footer-hint",children:"若有素材未打包成功,解压后在 ZIP 根目录运行 `sh 00.补全下载.sh` 即可按 manifest 补全下载。"}),t.jsx(Yt,{isOpen:!!xe,onClose:()=>ot(null),mode:Wt.SELECT,filterType:(xe==null?void 0:xe.assetType)==="video"?jt.VIDEO:jt.IMAGE,onSelect:oa,selectButtonText:(xe==null?void 0:xe.assetType)==="video"?"使用此视频":"使用此图片"}),t.jsx(Yt,{isOpen:!!g,onClose:()=>O(null),mode:Wt.SELECT,filterType:jt.IMAGE,onSelect:a=>{g&&r(g,a.url),O(null)},selectButtonText:"使用此图片"}),De&&za.createPortal(t.jsx("div",{className:"mv-hover-preview",style:{left:`${De.x}px`,top:`${De.y}px`},onMouseEnter:ca,onMouseLeave:da,children:De.type==="image"?t.jsx("img",{src:De.url,alt:"Preview",referrerPolicy:"no-referrer"}):t.jsx("video",{src:De.url,controls:!0,muted:!0,preload:"metadata"})}),document.body)]})};function la(e){var n;return e.result?(n=e.result.urls)!=null&&n.length?e.result.urls.filter(Boolean):e.result.url?[e.result.url]:[]:[]}function bs(e){var n,c;return e.result?e.type===J.VIDEO?((n=e.result.thumbnailUrls)==null?void 0:n[0])||e.result.thumbnailUrl||null:((c=e.result.thumbnailUrls)==null?void 0:c[0])||e.result.url||null:null}function xs(e){switch(e){case be.COMPLETED:return"已完成";case be.PROCESSING:return"进行中";case be.PENDING:return"等待中";case be.FAILED:return"失败";default:return""}}function ys(e){switch(e){case be.COMPLETED:return"completed";case be.PROCESSING:return"processing";case be.PENDING:return"pending";case be.FAILED:return"failed";default:return"pending"}}function _s(e){const n=new Date(e);return`${n.getMonth()+1}/${n.getDate()} ${String(n.getHours()).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}`}function js(e){const n=String(e.params.prompt||"");return n.length>40?`${n.slice(0,40)}…`:n}const Is=({record:e,related:n,isExpanded:c,onSelect:j,onToggleStar:o,onDelete:h,onToggleExpand:m,onInsertTask:I,onPreviewOpen:S,onSelectScript:w})=>{const x=!!(n&&n.rewrite.length+n.image.length+n.video.length>0),E=n?[...n.image,...n.video]:[];return t.jsxs("div",{className:"va-history-item",onClick:()=>j(e),children:[t.jsxs("div",{className:"va-history-header",children:[t.jsxs("span",{className:"va-history-source",children:[e.source==="youtube"?"🔗":"📁"," ",e.sourceLabel]}),t.jsx("button",{className:`va-star-btn ${e.starred?"starred":""}`,onClick:P=>o(P,e),children:e.starred?"★":"☆"})]}),t.jsxs("div",{className:"va-history-meta",children:[x&&t.jsxs("button",{className:`va-history-expand-btn ${c?"expanded":""}`,onClick:P=>m(P,e.id),children:[t.jsx(Da,{size:12}),t.jsx("span",{children:c?"收起":"关联任务"})]}),t.jsx("span",{children:new Date(e.createdAt).toLocaleString()}),t.jsxs("span",{children:[e.analysis.shotCount," 镜头"]}),t.jsx("span",{children:e.model}),t.jsx("button",{className:"va-history-delete",onClick:P=>h(P,e.id),children:"删除"})]}),e.analysis.video_style&&t.jsx("div",{className:"va-history-style",children:e.analysis.video_style}),c&&n&&t.jsx(Ss,{related:n,record:e,previewTasks:E,onInsertTask:I,onPreviewOpen:S,onSelectScript:w})]})},Ss=({related:e,record:n,previewTasks:c,onInsertTask:j,onPreviewOpen:o,onSelectScript:h})=>t.jsxs("div",{className:"va-history-related",onClick:m=>m.stopPropagation(),children:[e.rewrite.length>0&&t.jsxs("div",{children:[t.jsxs("div",{className:"va-history-related-group-title",children:["脚本改编 (",e.rewrite.length,")"]}),e.rewrite.map(m=>t.jsx(Tt,{task:m,onClick:I=>h==null?void 0:h(I,n,m)},m.id))]}),e.image.length>0&&t.jsxs("div",{children:[t.jsxs("div",{className:"va-history-related-group-title",children:["图片生成 (",e.image.length,")"]}),e.image.map(m=>t.jsx(Tt,{task:m,previewTasks:c,onInsertTask:j,onPreviewOpen:o},m.id))]}),e.video.length>0&&t.jsxs("div",{children:[t.jsxs("div",{className:"va-history-related-group-title",children:["视频生成 (",e.video.length,")"]}),e.video.map(m=>t.jsx(Tt,{task:m,previewTasks:c,onInsertTask:j,onPreviewOpen:o},m.id))]})]}),Tt=({task:e,previewTasks:n,onClick:c,onInsertTask:j,onPreviewOpen:o})=>{const h=e.status===be.COMPLETED,m=la(e),I=h&&m.length>0,S=(e.type===J.IMAGE||e.type===J.VIDEO)&&I&&!!(n!=null&&n.length),w=bs(e),x=m[0],E=s.useCallback(P=>{if(S&&n){o==null||o(P,e,n);return}c==null||c(P)},[S,c,o,n,e]);return t.jsx(Ue,{content:xs(e.status),showArrow:!1,children:t.jsxs("div",{className:"va-history-related-task",onClick:E,children:[t.jsx("span",{className:`va-history-related-task-status ${ys(e.status)}`}),t.jsx("span",{className:"va-history-related-task-prompt",children:js(e)}),t.jsx("span",{className:"va-history-related-task-time",children:_s(e.createdAt)}),I&&x&&e.type!==J.CHAT&&t.jsxs("span",{className:"va-history-related-task-thumb",children:[e.type===J.VIDEO?t.jsx(na,{src:x,poster:w||void 0,alt:"",className:"va-history-related-task-thumb-media",thumbnailSize:"small",videoProps:{preload:"metadata",muted:!0,playsInline:!0,"aria-hidden":!0}}):t.jsx("img",{src:w||x,alt:"",referrerPolicy:"no-referrer"}),e.type===J.VIDEO&&t.jsx("span",{className:"va-history-related-task-thumb-badge","aria-hidden":"true",children:"▶"})]}),I&&j&&t.jsx(Ue,{content:"插入画板",showArrow:!1,children:t.jsx("button",{className:"va-history-related-insert-btn",onClick:P=>j(P,e),"aria-label":"插入画板",children:t.jsx(Va,{size:16})})})]})})};function ws(e,n,c){var o;const j=((o=e.result)==null?void 0:o.title)||e.params.title||e.params.prompt||(e.type===J.VIDEO?"视频预览":"图片预览");return c>1?`${j} (${n+1}/${c})`:j}function Cs(e){var j,o,h;const n=[],c=new Map;for(const m of e){if(m.type!==J.IMAGE&&m.type!==J.VIDEO)continue;const I=la(m);if(I.length===0)continue;const S=n.length,w=m.type===J.VIDEO&&(((o=(j=m.result)==null?void 0:j.thumbnailUrls)==null?void 0:o[0])||((h=m.result)==null?void 0:h.thumbnailUrl))||void 0;I.forEach((x,E)=>{n.push({id:I.length>1?`${m.id}-${E}`:m.id,url:x,type:m.type===J.VIDEO?"video":"image",title:ws(m,E,I.length),prompt:m.params.prompt,posterUrl:m.type===J.VIDEO?w:void 0})}),c.set(m.id,S)}return{items:n,taskIdToIndex:c}}const Ns=({records:e,onSelect:n,onRecordsChange:c,showStarredOnly:j=!1,onInsertTask:o,onSelectScript:h})=>{const m=j?e.filter(z=>z.starred):e,[I,S]=s.useState(null),[w,x]=s.useState(!1),[E,P]=s.useState([]),[F,K]=s.useState(0),[X,g]=s.useState(null),{tasks:O}=sa(),Y=s.useMemo(()=>{const z=new Map,T=new Set(e.map(W=>W.id)),B=()=>({rewrite:[],image:[],video:[]});for(const W of O){const Z=W.params;if(W.type===J.CHAT&&Z.videoAnalyzerAction==="rewrite"&&typeof Z.videoAnalyzerRecordId=="string"&&T.has(Z.videoAnalyzerRecordId)){const H=Z.videoAnalyzerRecordId;qt(z,H,"rewrite",W,B);continue}if((W.type===J.IMAGE||W.type===J.VIDEO)&&typeof Z.batchId=="string"&&Z.batchId.startsWith("va_")){const H=Fa(Z.batchId,"va_",T);if(H){const ce=W.type===J.IMAGE?"image":"video";qt(z,H,ce,W,B)}}}return La(z)},[O,e]),$=s.useCallback(async(z,T)=>{z.stopPropagation();const B=await ie(T.id,{starred:!T.starred});c(B)},[c]),M=s.useCallback((z,T)=>{z.stopPropagation(),g(T)},[]),L=s.useCallback(async()=>{if(!X)return;const z=await Oa(X);c(z),g(null)},[c,X]),A=s.useCallback((z,T)=>{z.stopPropagation(),S(B=>B===T?null:T)},[]),oe=s.useCallback((z,T)=>{z.stopPropagation(),o==null||o(T)},[o]),V=s.useCallback((z,T,B)=>{z.stopPropagation(),h==null||h(T,B)},[h]),U=s.useCallback((z,T,B)=>{z.stopPropagation();const{items:W,taskIdToIndex:Z}=Cs(B),H=Z.get(T.id);!W.length||H===void 0||(P(W),K(H),x(!0))},[]),G=s.useCallback(()=>{x(!1)},[]);return m.length===0?t.jsx("div",{className:"va-page va-empty",children:t.jsx("span",{children:j?"暂无收藏":"暂无分析记录"})}):t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"va-page",children:t.jsx("div",{className:"va-history-list",children:m.map(z=>{const T=Y.get(z.id),B=I===z.id;return t.jsx(Is,{record:z,related:T,isExpanded:B,onSelect:n,onToggleStar:$,onDelete:M,onToggleExpand:A,onInsertTask:oe,onPreviewOpen:U,onSelectScript:V},z.id)})})}),t.jsx($a,{visible:w,items:E,initialIndex:F,onClose:G,showThumbnails:E.length>1}),t.jsx(Ua,{open:X!==null,title:"确认删除",description:"确定要删除这条历史记录吗?此操作不可撤销。",confirmText:"删除",cancelText:"取消",danger:!0,onOpenChange:z=>{z||g(null)},onConfirm:L})]})},Us=()=>{const[e,n]=s.useState("analyze"),[c,j]=s.useState(null),[o,h]=s.useState([]),[m,I]=s.useState(!1),{board:S}=Rt();s.useEffect(()=>{Et().then(h)},[]),s.useEffect(()=>{let g=!1;const O=new Set,Y=async M=>{if(!(!is(M)||O.has(M.id))){O.add(M.id);try{const L=await zt(M);if(!L||g)return;h(L.records),j(A=>(A==null?void 0:A.id)===L.record.id?L.record:A)}catch(L){console.error("[VideoAnalyzer] Failed to sync task result:",L)}finally{O.delete(M.id)}}};ge.getAllTasks().forEach(M=>{Y(M)});const $=ge.observeTaskUpdates().subscribe(M=>{M.task.status==="completed"&&Y(M.task)});return()=>{g=!0,$.unsubscribe()}},[]);const w=s.useCallback(g=>{j(g)},[]),x=s.useCallback(g=>{j(g),n("analyze")},[]),E=s.useCallback(g=>{j(g)},[]),P=s.useCallback(()=>{j(null),n("analyze")},[]),F=s.useCallback(g=>{g==="history"&&I(!1),n(g)},[]),K=s.useCallback(async g=>{var O,Y,$,M;if(!((O=g.result)!=null&&O.url)&&!(($=(Y=g.result)==null?void 0:Y.urls)!=null&&$.length)||!S){we.warning("无法插入:白板未就绪");return}try{if(g.type===J.IMAGE){const L=(M=g.result.urls)!=null&&M.length?g.result.urls:[g.result.url];for(const A of L)await Ga(S,A);we.success(L.length>1?"多图已插入到白板":"图片已插入到白板")}else g.type===J.VIDEO&&(await Ba(S,g.result.url),we.success("视频已插入到白板"))}catch(L){console.error("[VideoAnalyzer] Failed to insert to board:",L),we.error(`插入失败: ${L instanceof Error?L.message:"未知错误"}`)}},[S]),X=s.useCallback(async(g,O)=>{const Y=String(O.params.videoAnalyzerPrompt||O.params.prompt||""),$=g.scriptVersions||[],M=$.find(A=>A.prompt===Y)||$.find(A=>{var oe;return Y&&((oe=A.prompt)==null?void 0:oe.includes(Y))});let L=g;if(M&&M.id!==g.activeVersionId){const A=aa(g,M.id);if(A){const oe=await ie(g.id,A);L=oe.find(V=>V.id===g.id)||{...g,...A},h(oe)}}j(L),n("script")},[]);return t.jsxs("div",{className:"video-analyzer",children:[t.jsx("div",{className:"va-nav",children:e==="history"?t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"va-nav-back",onClick:()=>n("analyze"),children:"←"}),t.jsx("span",{className:"va-nav-title",children:m?"收藏":"历史记录"}),t.jsx("button",{className:`va-nav-btn ${m?"active":""}`,onClick:()=>I(g=>!g),children:m?"★ 收藏":"☆ 全部"})]}):t.jsxs(t.Fragment,{children:[t.jsx(Qa,{current:e,onNavigate:F,hasRecord:!!c}),t.jsxs("div",{className:"va-nav-actions",children:[t.jsxs("button",{className:"va-nav-btn",onClick:()=>{I(!1),n("history")},children:[t.jsx("span",{role:"img","aria-label":"history",children:"📋"}),o.length>0&&t.jsx("span",{className:"va-nav-count",children:o.length})]}),t.jsxs("button",{className:"va-nav-btn",onClick:()=>{I(!0),n("history")},children:[t.jsx("span",{role:"img","aria-label":"starred",children:"⭐"}),o.filter(g=>g.starred).length>0&&t.jsx("span",{className:"va-nav-count",children:o.filter(g=>g.starred).length})]})]})]})}),e==="analyze"&&t.jsx(ds,{existingRecord:c,onComplete:w,onRecordsChange:h,onCreateNew:P,onNext:c?()=>n("script"):void 0}),e==="script"&&c&&t.jsx(fs,{record:c,onRecordUpdate:E,onRecordsChange:h,onNext:()=>n("generate")}),e==="generate"&&c&&t.jsx(gs,{record:c,onRecordUpdate:E,onRecordsChange:h,onRestart:P}),e==="history"&&t.jsx(Ns,{records:o,onSelect:x,onRecordsChange:h,showStarredOnly:m,onInsertTask:S?K:void 0,onSelectScript:X})]})};export{Us as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as g,hz as B,y as i,bD as oe,bw as se,dM as ne,b7 as ie,iC as re,hj as ae,hw as q,hv as F,hy as U,al as J,iD as le,iy as ce,iz as de,iE as ue,iF as pe,bW as me,hn as fe,il as Z,i3 as V,hb as he,gP as N,hA as ge,hG as _e,he as be,hf as xe,iG as ze,hg as ye,i1 as Se,iH as ve,ik as H,io as we}from"./tool-windows-
|
|
1
|
+
import{r as g,hz as B,y as i,bD as oe,bw as se,dM as ne,b7 as ie,iC as re,hj as ae,hw as q,hv as F,hy as U,al as J,iD as le,iy as ce,iz as de,iE as ue,iF as pe,bW as me,hn as fe,il as Z,i3 as V,hb as he,gP as N,hA as ge,hG as _e,he as be,hf as xe,iG as ze,hg as ye,i1 as Se,iH as ve,ik as H,io as we}from"./tool-windows-C4D0lII2.js";import{u as Pe,K as Ee,M as Ne}from"./ModelDropdown-CHYgRb1r.js";import{u as Oe}from"./use-runtime-models-BLwgp0M1.js";import{f as Y,g as X,a as Me}from"./model-selection-CbzU26xQ.js";/* empty css */function je(e,t,o){return e==="size"?o.split("(")[0].trim():e==="duration"?`${t}s`:e==="klingAction2"?t==="image2video"?"图生":"文生":e==="mode"?t:o}const Ge=({selectedParams:e,onParamChange:t,compatibleParams:o,modelId:n,language:s="zh",disabled:r=!1,isOpen:l,onOpenChange:c,excludeParamIds:f})=>{const{value:d,setValue:u}=Pe({controlledValue:l,defaultValue:!1,onChange:c}),[_,y]=g.useState(0),[E,v]=g.useState(0),b=g.useMemo(()=>{const p=o??B(n);return f&&f.length>0?p.filter(h=>!f.includes(h.id)):p},[o,n,f]);g.useEffect(()=>{var p;if(d&&b.length>0){y(0);const h=b[0],S=e[h.id],P=((p=h.options)==null?void 0:p.findIndex(m=>m.value===S))??0;v(P>=0?P:0)}},[d,b,e]);const C=g.useMemo(()=>{if(b.length===0)return s==="zh"?"参数":"Params";const p=[];return b.forEach(h=>{var P;const S=e[h.id];if(S)if(h.valueType==="enum"){const m=(P=h.options)==null?void 0:P.find(z=>z.value===S);m&&p.push(je(h.id,S,m.label))}else{const m=S.length>10?`${S.slice(0,10)}…`:S;p.push(`${h.shortLabel||h.label}:${m}`)}}),p.length===0?s==="zh"?"配置参数":"Settings":p.join(", ")},[b,e,s]),D=g.useCallback(p=>{p.preventDefault(),!r&&u(!d)},[r,d,u]),$=g.useCallback(p=>{var P,m;if(p==="Escape")return u(!1),!0;const h=b[_],S=((P=h==null?void 0:h.options)==null?void 0:P.length)??0;if(p==="ArrowDown")return y(z=>{var x;const M=z<b.length-1?z+1:0,j=b[M],R=e[j.id],a=((x=j.options)==null?void 0:x.findIndex(w=>w.value===R))??0;return v(a>=0?a:0),M}),!0;if(p==="ArrowUp")return y(z=>{var x;const M=z>0?z-1:b.length-1,j=b[M],R=e[j.id],a=((x=j.options)==null?void 0:x.findIndex(w=>w.value===R))??0;return v(a>=0?a:0),M}),!0;if(p==="ArrowRight")return v(z=>z<S-1?z+1:0),!0;if(p==="ArrowLeft")return v(z=>z>0?z-1:S-1),!0;if(p==="Enter"||p===" "||p==="Tab"){const z=(m=h==null?void 0:h.options)==null?void 0:m[E];return z&&t(h.id,z.value),!0}return!1},[b,_,E,e,t]),O=g.useCallback((p,h)=>{t(p,h)},[t]),k=g.useCallback((p,h)=>{t(p,h,{keepOpen:!0})},[t]);return b.length===0?null:i.jsx(Ee,{isOpen:d,setIsOpen:u,disabled:r,openKeys:["Enter"," ","ArrowDown","ArrowUp"],onOpenKey:$,children:({containerRef:p,menuRef:h,portalPosition:S,handleTriggerKeyDown:P})=>i.jsxs("div",{className:"parameters-dropdown",ref:p,children:[i.jsxs("button",{className:`parameters-dropdown__trigger ${d?"parameters-dropdown__trigger--open":""}`,onMouseDown:D,onKeyDown:P,type:"button",disabled:r,title:`${C} (↑↓ Tab)`,children:[i.jsx("span",{className:"parameters-dropdown__label",children:C}),i.jsx(se,{size:14,className:`parameters-dropdown__icon ${d?"parameters-dropdown__icon--open":""}`})]}),d&&oe.createPortal(i.jsxs("div",{ref:h,className:`parameters-dropdown__menu parameters-dropdown__menu--flat ${ie}`,style:{position:"fixed",zIndex:ne.DROPDOWN_PORTAL,left:S.left,bottom:window.innerHeight-S.top+8,maxHeight:Math.max(240,Math.min(420,S.top-12)),overflowY:"auto"},onMouseDown:m=>m.stopPropagation(),onClick:m=>m.stopPropagation(),children:[i.jsxs("div",{className:"parameters-dropdown__header",children:[i.jsx(re,{size:14}),i.jsx("span",{children:s==="zh"?"设置生成参数 (↑↓←→ Tab)":"Parameters (↑↓←→ Tab)"})]}),i.jsx("div",{className:"parameters-dropdown__sections",children:b.map((m,z)=>{var R;const M=e[m.id],j=z===_;return i.jsxs("div",{className:`parameters-dropdown__section ${j?"parameters-dropdown__section--highlighted":""}`,children:[i.jsx("div",{className:"parameters-dropdown__section-title",children:m.label}),m.valueType==="enum"?i.jsx("div",{className:"parameters-dropdown__options",children:(R=m.options)==null?void 0:R.map((a,x)=>{const w=M===a.value,I=j&&x===E;return i.jsxs("button",{type:"button",className:`parameters-dropdown__option ${w?"parameters-dropdown__option--selected":""} ${I?"parameters-dropdown__option--highlighted":""}`,onClick:()=>O(m.id,a.value),onMouseEnter:()=>{y(z),v(x)},children:[i.jsx("span",{className:"parameters-dropdown__option-label",children:a.label.split("(")[0].trim()}),w&&i.jsx(ae,{size:12,className:"parameters-dropdown__option-check"})]},a.value)})}):i.jsx("div",{className:"parameters-dropdown__field",children:i.jsx("input",{type:m.valueType==="number"?"number":"text",className:"parameters-dropdown__field-input",value:M||"",placeholder:m.description||m.label,min:m.valueType==="number"?m.min:void 0,max:m.valueType==="number"?m.max:void 0,step:m.valueType==="number"?m.step:void 0,onChange:a=>k(m.id,a.target.value),onMouseDown:a=>a.stopPropagation(),onKeyDown:a=>a.stopPropagation()})})]},m.id)})})]}),document.body)]})})},Ie={mj_ar:"--ar",mj_v:"--v",mj_style:"--style",mj_s:"--s",mj_q:"--q",mj_seed:"--seed"},qe=e=>{const t=[];return Object.entries(Ie).forEach(([o,n])=>{const s=e[o];!s||s==="default"||t.push(`${n} ${s}`)}),t.join(" ")},W=(e,t,o)=>{const n=o==="image"?{isGenerating:e,imageLoading:t}:{isGenerating:e,videoLoading:t};window.dispatchEvent(new CustomEvent("ai-generation-state-change",{detail:n}))},Ue=(e,t,o)=>{g.useEffect(()=>{const n=s=>{(s.metaKey||s.ctrlKey)&&s.key==="Enter"&&(s.preventDefault(),!e&&t.trim()&&o())};return document.addEventListener("keydown",n),()=>{document.removeEventListener("keydown",n)}},[e,t,o])},He=e=>{const[t,o]=g.useState(!1),[n,s]=g.useState(!1),r=g.useCallback(c=>{o(c),W(c,n,e)},[n,e]),l=g.useCallback(c=>{s(c),W(t,c,e)},[t,e]);return{isGenerating:t,isLoading:n,updateIsGenerating:r,updateIsLoading:l}},Ye=(e,t,o)=>t==="image"?e==="zh"?"一只可爱的小猫坐在窗台上,阳光透过窗户洒在它的毛发上,背景是温馨的家居环境":"A cute kitten sitting on a windowsill, with sunlight streaming through the window onto its fur, with a cozy home environment in the background":o==="sora"?e==="zh"?"描述视频内容,输入 @ 可引用已创建的角色,如 @username 在海边漫步...":"Describe video content, type @ to reference created characters, e.g. @username walking on the beach...":e==="zh"?"生成一个美丽的日出场景,阳光从山峰后缓缓升起,云朵轻柔地飘动":"Generate a beautiful sunrise scene where the sun slowly rises from behind mountains with clouds gently floating",Re=({originalPrompt:e,optimizationRequirements:t,language:o,type:n,mode:s="polish"})=>{const r=e.trim(),l=(t==null?void 0:t.trim())||"",c=o==="zh"?n==="image"?"图片生成":"视频生成":n==="image"?"image generation":"video generation",f=o==="zh"?n==="image"?"重点补足主体、构图、风格、光线、材质与画面细节。":"重点补足主体动作、镜头语言、运镜、时序、转场与画面连续性。":n==="image"?"Improve subject detail, composition, style, lighting, materials, and visual detail.":"Improve subject motion, camera language, camera movement, timing, transitions, and continuity.";return s==="structured"?o==="zh"?[`你是一名专业的${c}结构化提示词设计师。`,"请把原始需求整理成适合复杂场景生成的 JSON 结构化提示词。","","目标:","1. 保留用户原始意图,不要擅自改题。","2. 将复杂场景拆解为稳定、可复用、可继续编辑的结构字段。","3. 如果原文中有明确的布局、数量、标题、区域、主体、材质、风格、时间线、图例、标注等信息,尽量显式结构化。",`4. ${f}`,"5. 只输出一个合法 JSON 对象,不要解释、不要标题、不要 Markdown 代码块。","","JSON 结构要求:","1. 顶层优先包含这些键:type、instruction、style、layout。","2. style 是对象,放背景、主体风格、材质、镜头或质感等。","3. layout 是对象,放标题、分区、数量、位置、图例、时间轴、主体布局等。","4. 对复杂主体区域,优先使用 centerpiece、focal_point、sections、annotations、timeline、legends 等语义化字段。","5. 数量必须用数字,枚举信息尽量使用数组。","6. 不确定的扩展项可以补充 defaults、constraints、notes,但保持简洁。","7. 如果用户已经给了某种 JSON 雏形,要在其基础上补全,而不是完全推翻重写。","","输出风格要求:","1. value 尽量写成可直接给生图/生视频模型使用的短句或短段落。","2. 字段命名保持英文 snake_case 或 lowerCamelCase 二选一,但同一份 JSON 内保持一致。","3. 内容语言尽量与原始提示词一致。","","【原始提示词】",r,"","【补充要求】",l||"将其整理成适合复杂结构场景的 JSON 提示词,便于后续继续扩写与复用。"].join(`
|
|
2
2
|
`):[`You are a professional ${c} prompt architect for structured prompts.`,"Transform the original request into a JSON-based structured prompt for complex scenes.","","Goals:","1. Preserve the original intent without changing the subject.","2. Decompose the scene into stable, reusable, and editable fields.","3. Explicitly structure layout, counts, titles, regions, subjects, materials, style, timeline, legends, labels, and annotations whenever present.",`4. ${f}`,"5. Output exactly one valid JSON object. No explanation, no title, no Markdown code fence.","","JSON structure rules:","1. Prefer these top-level keys: type, instruction, style, layout.","2. style should be an object for background, subject style, materials, camera, rendering, or texture.","3. layout should be an object for title, sections, counts, positions, legends, timelines, and composition.","4. For the main subject area, prefer semantic fields such as centerpiece, focal_point, sections, annotations, timeline, or legends.","5. Use numbers for counts and arrays for enumerations whenever possible.","6. Add defaults, constraints, or notes only when useful, and keep them concise.","7. If the user already provided a JSON draft, extend and normalize it instead of replacing it entirely.","","Output style rules:","1. Values should be concise and directly usable for downstream generation.","2. Use either snake_case or lowerCamelCase field names, but stay consistent within the same JSON.","3. Keep the language aligned with the original prompt as much as possible.","","[Original Prompt]",r,"","[Additional Requirements]",l||"Restructure it into a reusable JSON prompt for a complex visual scene."].join(`
|
|
3
3
|
`):o==="zh"?[`你是一名专业的${c}提示词优化助手。`,"请基于原始提示词和优化要求,输出一版可直接用于生成的最终提示词。","","要求:","1. 保持原始提示词的核心意图,不要偏题。","2. 优先满足优化要求;如果优化要求为空,仅做必要润色与结构优化。","3. 保持与原始提示词相同的语言风格;原文中英混合时,尽量沿用原表达。","4. 如果原始提示词已经较完整,只做轻量优化,避免无意义堆砌。",`5. ${f}`,"6. 只输出最终优化后的提示词,不要解释、不要加标题、不要用代码块。","","【原始提示词】",r,"","【优化要求】",l||"无,做通顺、准确、可执行的轻量优化。"].join(`
|
|
4
4
|
`):[`You are a professional ${c} prompt optimizer.`,"Based on the original prompt and refinement requirements, output one final prompt that can be used directly.","","Requirements:","1. Preserve the core intent of the original prompt.","2. Prioritize the refinement requirements; if they are empty, only do light polishing and restructuring.","3. Keep the same language style as the original prompt. If the original is mixed-language, preserve that style when possible.","4. If the original prompt is already detailed, only refine lightly and avoid unnecessary expansion.",`5. ${f}`,"6. Output only the final optimized prompt. No explanation, no title, no code block.","","[Original Prompt]",r,"","[Refinement Requirements]",l||"None. Apply light polishing for clarity and execution quality."].join(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{w as ln,c as Q}from"./path-CY0bYimO.js";import{aM as an,aN as X,aO as I,aP as rn,aQ as y,aI as on,aR as B,aS as _,aT as un,aU as t,aV as sn,aW as tn,aX as fn}from"./mermaid.core-
|
|
1
|
+
import{w as ln,c as Q}from"./path-CY0bYimO.js";import{aM as an,aN as X,aO as I,aP as rn,aQ as y,aI as on,aR as B,aS as _,aT as un,aU as t,aV as sn,aW as tn,aX as fn}from"./mermaid.core-BGyfnsLl.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function mn(l){return l.endAngle}function pn(l){return l&&l.padAngle}function dn(l,h,q,O,v,R,U,a){var D=q-l,i=O-h,n=U-v,m=a-R,r=m*D-n*i;if(!(r*r<y))return r=(n*(h-R)-m*(l-v))/r,[l+r*D,h+r*i]}function K(l,h,q,O,v,R,U){var a=l-q,D=h-O,i=(U?R:-R)/B(a*a+D*D),n=i*D,m=-i*a,r=l+n,s=h+m,f=q+n,c=O+m,V=(r+f)/2,o=(s+c)/2,p=f-r,g=c-s,A=p*p+g*g,T=v-R,P=r*c-f*s,E=(g<0?-1:1)*B(tn(0,T*T*A-P*P)),M=(P*g-p*E)/A,N=(-P*p-g*E)/A,w=(P*g+p*E)/A,d=(-P*p+g*E)/A,x=M-V,e=N-o,u=w-V,W=d-o;return x*x+e*e>u*u+W*W&&(M=w,N=d),{cx:M,cy:N,x01:-n,y01:-m,x11:M*(v/T-1),y11:N*(v/T-1)}}function vn(){var l=cn,h=yn,q=Q(0),O=null,v=gn,R=mn,U=pn,a=null,D=ln(i);function i(){var n,m,r=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-rn,c=R.apply(this,arguments)-rn,V=un(c-f),o=c>f;if(a||(a=n=D()),s<r&&(m=s,s=r,r=m),!(s>y))a.moveTo(0,0);else if(V>on-y)a.moveTo(s*X(f),s*I(f)),a.arc(0,0,s,f,c,!o),r>y&&(a.moveTo(r*X(c),r*I(c)),a.arc(0,0,r,c,f,o));else{var p=f,g=c,A=f,T=c,P=V,E=V,M=U.apply(this,arguments)/2,N=M>y&&(O?+O.apply(this,arguments):B(r*r+s*s)),w=_(un(s-r)/2,+q.apply(this,arguments)),d=w,x=w,e,u;if(N>y){var W=sn(N/r*I(M)),C=sn(N/s*I(M));(P-=W*2)>y?(W*=o?1:-1,A+=W,T-=W):(P=0,A=T=(f+c)/2),(E-=C*2)>y?(C*=o?1:-1,p+=C,g-=C):(E=0,p=g=(f+c)/2)}var j=s*X(p),z=s*I(p),F=r*X(T),G=r*I(T);if(w>y){var H=s*X(g),J=s*I(g),L=r*X(A),Y=r*I(A),S;if(V<an)if(S=dn(j,z,L,Y,H,J,F,G)){var Z=j-S[0],$=z-S[1],k=H-S[0],b=J-S[1],nn=1/I(fn((Z*k+$*b)/(B(Z*Z+$*$)*B(k*k+b*b)))/2),en=B(S[0]*S[0]+S[1]*S[1]);d=_(w,(r-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else d=x=0}E>y?x>y?(e=K(L,Y,j,z,s,x,o),u=K(H,J,F,G,s,x,o),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,t(e.y01,e.x01),t(u.y01,u.x01),!o):(a.arc(e.cx,e.cy,x,t(e.y01,e.x01),t(e.y11,e.x11),!o),a.arc(0,0,s,t(e.cy+e.y11,e.cx+e.x11),t(u.cy+u.y11,u.cx+u.x11),!o),a.arc(u.cx,u.cy,x,t(u.y11,u.x11),t(u.y01,u.x01),!o))):(a.moveTo(j,z),a.arc(0,0,s,p,g,!o)):a.moveTo(j,z),!(r>y)||!(P>y)?a.lineTo(F,G):d>y?(e=K(F,G,H,J,r,-d,o),u=K(j,z,L,Y,r,-d,o),a.lineTo(e.cx+e.x01,e.cy+e.y01),d<w?a.arc(e.cx,e.cy,d,t(e.y01,e.x01),t(u.y01,u.x01),!o):(a.arc(e.cx,e.cy,d,t(e.y01,e.x01),t(e.y11,e.x11),!o),a.arc(0,0,r,t(e.cy+e.y11,e.cx+e.x11),t(u.cy+u.y11,u.cx+u.x11),o),a.arc(u.cx,u.cy,d,t(u.y11,u.x11),t(u.y01,u.x01),!o))):a.arc(0,0,r,T,A,o)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,m=(+v.apply(this,arguments)+ +R.apply(this,arguments))/2-an/2;return[X(m)*n,I(m)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:Q(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:Q(+n),i):h},i.cornerRadius=function(n){return arguments.length?(q=typeof n=="function"?n:Q(+n),i):q},i.padRadius=function(n){return arguments.length?(O=n==null?null:typeof n=="function"?n:Q(+n),i):O},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:Q(+n),i):v},i.endAngle=function(n){return arguments.length?(R=typeof n=="function"?n:Q(+n),i):R},i.padAngle=function(n){return arguments.length?(U=typeof n=="function"?n:Q(+n),i):U},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{vn as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{w as ln,c as B}from"./path-CbwjOpE9.js";import{a4 as an,a5 as H,a6 as q,a7 as rn,a8 as y,a0 as on,a9 as L,aa as _,ab as un,ac as t,ad as sn,ae as tn,af as fn}from"./index-
|
|
1
|
+
import{w as ln,c as B}from"./path-CbwjOpE9.js";import{a4 as an,a5 as H,a6 as q,a7 as rn,a8 as y,a0 as on,a9 as L,aa as _,ab as un,ac as t,ad as sn,ae as tn,af as fn}from"./index-gHdnUGOu.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function mn(l){return l.endAngle}function pn(l){return l&&l.padAngle}function dn(l,h,I,D,v,A,C,a){var O=I-l,i=D-h,n=C-v,m=a-A,r=m*O-n*i;if(!(r*r<y))return r=(n*(h-A)-m*(l-v))/r,[l+r*O,h+r*i]}function W(l,h,I,D,v,A,C){var a=l-I,O=h-D,i=(C?A:-A)/L(a*a+O*O),n=i*O,m=-i*a,r=l+n,s=h+m,f=I+n,c=D+m,F=(r+f)/2,o=(s+c)/2,p=f-r,g=c-s,R=p*p+g*g,T=v-A,P=r*c-f*s,S=(g<0?-1:1)*L(tn(0,T*T*R-P*P)),j=(P*g-p*S)/R,z=(-P*p-g*S)/R,w=(P*g+p*S)/R,d=(-P*p+g*S)/R,x=j-F,e=z-o,u=w-F,G=d-o;return x*x+e*e>u*u+G*G&&(j=w,z=d),{cx:j,cy:z,x01:-n,y01:-m,x11:j*(v/T-1),y11:z*(v/T-1)}}function vn(){var l=cn,h=yn,I=B(0),D=null,v=gn,A=mn,C=pn,a=null,O=ln(i);function i(){var n,m,r=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-rn,c=A.apply(this,arguments)-rn,F=un(c-f),o=c>f;if(a||(a=n=O()),s<r&&(m=s,s=r,r=m),!(s>y))a.moveTo(0,0);else if(F>on-y)a.moveTo(s*H(f),s*q(f)),a.arc(0,0,s,f,c,!o),r>y&&(a.moveTo(r*H(c),r*q(c)),a.arc(0,0,r,c,f,o));else{var p=f,g=c,R=f,T=c,P=F,S=F,j=C.apply(this,arguments)/2,z=j>y&&(D?+D.apply(this,arguments):L(r*r+s*s)),w=_(un(s-r)/2,+I.apply(this,arguments)),d=w,x=w,e,u;if(z>y){var G=sn(z/r*q(j)),M=sn(z/s*q(j));(P-=G*2)>y?(G*=o?1:-1,R+=G,T-=G):(P=0,R=T=(f+c)/2),(S-=M*2)>y?(M*=o?1:-1,p+=M,g-=M):(S=0,p=g=(f+c)/2)}var J=s*H(p),K=s*q(p),N=r*H(T),Q=r*q(T);if(w>y){var U=s*H(g),V=s*q(g),X=r*H(R),Y=r*q(R),E;if(F<an)if(E=dn(J,K,X,Y,U,V,N,Q)){var Z=J-E[0],$=K-E[1],b=U-E[0],k=V-E[1],nn=1/q(fn((Z*b+$*k)/(L(Z*Z+$*$)*L(b*b+k*k)))/2),en=L(E[0]*E[0]+E[1]*E[1]);d=_(w,(r-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else d=x=0}S>y?x>y?(e=W(X,Y,J,K,s,x,o),u=W(U,V,N,Q,s,x,o),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,t(e.y01,e.x01),t(u.y01,u.x01),!o):(a.arc(e.cx,e.cy,x,t(e.y01,e.x01),t(e.y11,e.x11),!o),a.arc(0,0,s,t(e.cy+e.y11,e.cx+e.x11),t(u.cy+u.y11,u.cx+u.x11),!o),a.arc(u.cx,u.cy,x,t(u.y11,u.x11),t(u.y01,u.x01),!o))):(a.moveTo(J,K),a.arc(0,0,s,p,g,!o)):a.moveTo(J,K),!(r>y)||!(P>y)?a.lineTo(N,Q):d>y?(e=W(N,Q,U,V,r,-d,o),u=W(J,K,X,Y,r,-d,o),a.lineTo(e.cx+e.x01,e.cy+e.y01),d<w?a.arc(e.cx,e.cy,d,t(e.y01,e.x01),t(u.y01,u.x01),!o):(a.arc(e.cx,e.cy,d,t(e.y01,e.x01),t(e.y11,e.x11),!o),a.arc(0,0,r,t(e.cy+e.y11,e.cx+e.x11),t(u.cy+u.y11,u.cx+u.x11),o),a.arc(u.cx,u.cy,d,t(u.y11,u.x11),t(u.y01,u.x01),!o))):a.arc(0,0,r,T,R,o)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,m=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[H(m)*n,q(m)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:B(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:B(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:B(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:B(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:B(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:B(+n),i):A},i.padAngle=function(n){return arguments.length?(C=typeof n=="function"?n:B(+n),i):C},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{vn as a};
|