aitu-app 0.9.0 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/assets/{CanvasAudioPlayer-cp00LGgR.js → CanvasAudioPlayer-C_USx5uz.js} +1 -1
- package/assets/{ComicCreator-CAmJF3JX.js → ComicCreator-qGQaXp7h.js} +2 -2
- package/assets/DeferredAIInputBar-CPykEFYX.css +1 -0
- package/assets/DeferredAIInputBar-LmZGQCLT.js +107 -0
- package/assets/{DrawnixDeferredFeatures-DIznfzB7.js → DrawnixDeferredFeatures-Hy_-quZ1.js} +1 -1
- package/assets/{KnowledgeBaseContent-CxilHI-j.js → KnowledgeBaseContent-DSKNA70H.js} +8 -8
- package/assets/{MVCreator-ZrinzYPm.js → MVCreator-C3iClDLU.js} +12 -10
- package/assets/{ModelBenchmarkWorkbench-DbesnX6E.js → ModelBenchmarkWorkbench-BxwdcZ0q.js} +2 -2
- package/assets/{MusicAnalyzer-BzXD1qYH.js → MusicAnalyzer-f_T6_YPJ.js} +2 -2
- package/assets/{ParametersDropdown-DBQCDv3g.js → ParametersDropdown-CTSN3ClD.js} +1 -1
- package/assets/{PromptHistoryTool-CUCIE0Ld.js → PromptHistoryTool-DV-8RSdz.js} +2 -2
- package/assets/{ResizableDivider-CdfJF8GW.js → ResizableDivider-CUQBmPpx.js} +1 -1
- package/assets/TaskQueuePanel-CtjY1W4t.js +1 -0
- package/assets/{VideoAnalyzer-wtxorxD3.js → VideoAnalyzer-BBVBSONO.js} +3 -3
- package/assets/{VideoAnalyzer-C90c84gt.js → VideoAnalyzer-BmAjGvN8.js} +1 -1
- package/assets/{ai-chat-B5qFht2H.js → ai-chat-BO5vbKZW.js} +5 -5
- package/assets/{ai-generation-preferences-service-CvWbMxv3.js → ai-generation-preferences-service-ZmPTR-wz.js} +1 -1
- package/assets/{batch-image-generation-Bo3h_Eop.js → batch-image-generation-BLBSv-t6.js} +6 -6
- package/assets/{diagram-engines-C9ewAq_o.js → diagram-engines-CSzW_-6N.js} +2 -2
- package/assets/{editor-engines-CvxZrFyB.js → editor-engines-C573k8UM.js} +1 -1
- package/assets/{index-Dw6PsLbq.js → index-BT-rxxI3.js} +2 -2
- package/assets/{index-BCqdmg38.js → index-Dw_8lcIi.js} +1 -1
- package/assets/{index-BSlnQdcy.js → index-IHNaVKGH.js} +1 -1
- package/assets/{index-CjBeKr1R.js → index-N8asYyaz.js} +1 -1
- package/assets/{index-CylhK_f5.js → index-jxwTv7c1.js} +1 -1
- package/assets/{index.es-BKVY-J2g.js → index.es-BLXvmueB.js} +1 -1
- package/assets/{jspdf.es.min-BM9ML7Zw.js → jspdf.es.min-DxWvbkh4.js} +2 -2
- package/assets/{markdown-to-drawnix-COS1iVyq.js → markdown-to-drawnix-BVFYnimo.js} +2 -2
- package/assets/{mermaid-to-drawnix-oplawQO0.js → mermaid-to-drawnix-nGs2aeZ7.js} +2 -2
- package/assets/{model-benchmark-launcher-DD4vN0Ca.js → model-benchmark-launcher-DAWoSySc.js} +1 -1
- package/assets/{photo-wall-splitter-CbKqFOIV.js → photo-wall-splitter-CCUURzGk.js} +1 -1
- package/assets/{prompt-utils-7t-jk6n6.js → prompt-utils-MF_LILNU.js} +1 -1
- package/assets/{settings-dialog-D2yEWl8J.js → settings-dialog-Ac7R-_CG.js} +1 -1
- package/assets/{skill-dsl-parser-C-utRXFg.js → skill-dsl-parser-Do9iAYbB.js} +1 -1
- package/assets/{startup-app-DxX-P1pm.js → startup-app-eD_rQhSh.js} +531 -527
- package/assets/{task-sync-Dr7Nza2v.js → task-sync-BJVOunRa.js} +1 -1
- package/assets/{tool-windows-BIjc1zsU.js → tool-windows-CmgL3thd.js} +17 -17
- package/assets/ttd-dialog-B12v0SVY.js +6 -0
- package/assets/{ttd-dialog-submit-shortcut-yUk15rsg.js → ttd-dialog-submit-shortcut-C2lJygXA.js} +1 -1
- package/assets/useCharacters-BAKE4TeJ.js +2 -0
- package/assets/{useMediaViewer-CEvHYype.js → useMediaViewer-BGw5RkSR.js} +1 -1
- package/assets/{useWorkflowSubmission-Cxhdsl2b.js → useWorkflowSubmission-iAPmKke9.js} +6 -6
- package/assets/{video-recovery-service-CB8hyRf5.js → video-recovery-service-CW7bErP2.js} +1 -1
- package/assets/{workflow-generation-utils-JoRODaP7.js → workflow-generation-utils-DhIVnOHO.js} +2 -2
- package/assets/workflow-submission-service-Ce0cpj8E.js +4 -0
- package/changelog.json +18 -13
- package/idle-prefetch-manifest.json +306 -306
- package/manifest.json +3 -3
- package/package.json +1 -1
- package/precache-manifest.json +6 -6
- package/sw.js +1 -1
- package/version.json +6 -3
- package/assets/DeferredAIInputBar-CzMATNng.js +0 -107
- package/assets/DeferredAIInputBar-D_e6qG1y.css +0 -1
- package/assets/TaskQueuePanel-oLG4DAzJ.js +0 -1
- package/assets/ttd-dialog-CNSSc4wk.js +0 -6
- package/assets/useCharacters-DzXMuknh.js +0 -2
- package/assets/workflow-submission-service-BIGFW4s4.js +0 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as s,ec as re,M as v,
|
|
1
|
+
import{r as s,ec as re,M as v,kV as le,kW as se,ef as Y,eg as ce,j as t,b7 as ie,eK as oe,er as R,eu as K,dk as q,X as de}from"./startup-app-eD_rQhSh.js";import{M as ue}from"./tool-windows-CmgL3thd.js";const ge=({images:o,onImagesChange:m,language:F="zh",disabled:f=!1,multiple:g=!0,maxCount:h=10,label:z,slotLabels:p,onError:c})=>{const[B,M]=s.useState(!1),[S,C]=s.useState(!1),[j,A]=s.useState(0),[b,I]=s.useState(null),N=s.useRef(null),P=s.useRef(null),{addAsset:L}=re(),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],$=s.useCallback(e=>e.type.startsWith("image/")?e.size>25*1024*1024?(v.error(u.fileTooLarge),!1):!0:(v.error(u.invalidFile),!1),[u]),T=s.useCallback((e,a)=>new Promise((n,l)=>{const i=new FileReader;i.onload=()=>{n({url:i.result,name:a,file:(e instanceof File,e)})},i.onerror=l,i.readAsDataURL(e)}),[]),x=s.useCallback(async(e,a)=>{const l=Array.from(e).filter($);if(l.length===0)return;g&&o.length+l.length>h&&(v.warning(u.maxCountReached.replace("{count}",String(h))),l.splice(h-o.length));const i=[];for(const r of l)try{let d=r;if(r.size>10*1024*1024){const _=le(r.size/1048576),y=v.loading({content:F==="zh"?`正在压缩图片 (${(r.size/1024/1024).toFixed(1)}MB)...`:`Compressing image (${(r.size/1024/1024).toFixed(1)}MB)...`,duration:0,placement:"top"});try{d=await se(r,_.targetSizeMB),v.close(y),v.success({content:F==="zh"?`压缩完成: ${(r.size/1024/1024).toFixed(1)}MB → ${(d.size/1024/1024).toFixed(1)}MB`:`Compressed: ${(r.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:r.name})}catch(d){console.error("[ReferenceImageUpload] Error processing file:",d),c==null||c(u.loadFailed);continue}if(i.length!==0){i.forEach(({blob:r,name:d})=>{L(r,Y.IMAGE,ce.LOCAL,d).catch(_=>{console.warn("[ReferenceImageUpload] Failed to add asset to library:",_)})});try{const r=await Promise.all(i.map(({blob:d,name:_})=>T(d,_)));if(p&&a!==void 0){const d=[...o];d[a]=r[0],m(d.filter(Boolean))}else m(g?[...o,...r]:r.slice(0,1));c==null||c(null)}catch(r){console.error("[ReferenceImageUpload] Failed to process files:",r),c==null||c(u.loadFailed)}}},[o,g,h,p,F,$,T,L,m,c,u]),J=s.useCallback(e=>{const a=e.target.files;a&&a.length>0&&x(a,p?j:void 0),e.target.value=""},[x,p,j]),Q=s.useCallback(async e=>{try{const n=await(await fetch(e.url)).blob(),l=new FileReader;l.onload=()=>{const i={url:l.result,name:e.name};if(p){const r=[...o];r[j]=i,m(r.filter(Boolean))}else if(g){if(o.length>=h){v.warning(u.maxCountReached.replace("{count}",String(h)));return}m([...o,i])}else m([i]);M(!1),c==null||c(null)},l.readAsDataURL(n)}catch(a){console.error("[ReferenceImageUpload] Failed to convert asset to base64:",a),c==null||c(u.loadFailed),M(!1)}},[o,g,h,p,j,m,c,u]),U=s.useCallback(e=>{e.preventDefault(),e.stopPropagation(),f||C(!0)},[f]),O=s.useCallback(e=>{var n;e.preventDefault(),e.stopPropagation();const a=(n=N.current)==null?void 0:n.getBoundingClientRect();if(a){const{clientX:l,clientY:i}=e;(l<a.left||l>a.right||i<a.top||i>a.bottom)&&C(!1)}},[]),H=s.useCallback(e=>{e.preventDefault(),e.stopPropagation()},[]),G=s.useCallback((e,a)=>{if(e.preventDefault(),e.stopPropagation(),C(!1),f)return;const n=e.dataTransfer.files;n&&n.length>0&&x(n,a)},[f,x]);s.useEffect(()=>{const e=async a=>{var _;if(f)return;const n=document.activeElement,l=N.current;if(!l||!(l.contains(n)||n===document.body||(n==null?void 0:n.tagName)==="BODY"))return;const r=(_=a.clipboardData)==null?void 0:_.items;if(!r)return;const d=[];for(let y=0;y<r.length;y++){const D=r[y];if(D.type.startsWith("image/")){const X=D.getAsFile();X&&d.push(X)}}d.length>0&&(a.preventDefault(),x(d))};return document.addEventListener("paste",e),()=>{document.removeEventListener("paste",e)}},[f,x]);const Z=s.useCallback(e=>{const a=o.filter((n,l)=>l!==e);I(null),m(a)},[o,m]),V=s.useCallback(e=>{var a;e!==void 0&&A(e),(a=P.current)==null||a.click()},[]),W=s.useCallback(e=>{e!==void 0&&A(e),M(!0)},[]),E=s.useCallback((e,a)=>{const n=a.currentTarget.getBoundingClientRect(),l=n.left+n.width/2,i=n.top-10;I({url:e,x:l,y:i})},[]),ee=s.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=>G(a,e),children:t.jsxs("div",{className:"reference-image-upload__buttons",children:[t.jsx(R,{variant:"outline",icon:t.jsx(K,{size:16}),onClick:()=>V(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(q,{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:n=>E(e.url,n),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(de,{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 n=o[a];return t.jsxs("div",{className:"reference-image-upload__slot",children:[t.jsx("div",{className:"reference-image-upload__slot-title",children:e}),n?w(n,a):t.jsx("div",{className:`reference-image-upload__slot-placeholder ${S?"reference-image-upload__slot-placeholder--dragging":""}`,onDragEnter:U,onDragLeave:O,onDragOver:H,onDrop:l=>G(l,a),children:t.jsxs("div",{className:"reference-image-upload__slot-buttons",children:[t.jsx(R,{variant:"outline",icon:t.jsx(K,{size:16}),onClick:()=>V(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(q,{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,n)=>w(a,n)),e&&k(),o.length===0&&!e&&k()]})},ne=()=>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:[b&&ie.createPortal(t.jsx("div",{className:"reference-image-upload__hover-preview",style:{left:`${b.x}px`,top:`${b.y}px`,transform:"translate(-50%, -100%)"},children:t.jsx("img",{src:b.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:J,className:"reference-image-upload__input",disabled:f}),p?ae():g?te():ne(),B&&t.jsx(ue,{isOpen:B,onClose:()=>M(!1),mode:oe.SELECT,filterType:Y.IMAGE,onSelect:Q})]})]})};export{ge as R};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r,dA as ye,j as t,d8 as oe,er as _,ba as ot,M as u,E as I,kk as ss,b$ as _e,kl as dt,y as st,gr as je,km as as,c1 as ce,i4 as rs,ck as ls,e0 as at,bg as p,dB as q,n as rt,d as lt,kn as ut,ko as is,cq as ns,kp as cs,p as os,c7 as ds,c8 as us,kq as ms,dc as ps,kr as hs,ie as fs,hy as gs,g6 as se,jh as xs,ei as vs,am as Cs,bz as ie,ks as ys,kt as _s,ha as it,jg as js,gb as nt,c as Is,gd as ct,ku as ws,aT as bs,aN as ks,aO as Ss}from"./startup-app-eD_rQhSh.js";import{T as Ds,C as Ns,u as mt,V as Es,a as Ms}from"./useCharacters-BAKE4TeJ.js";import{M as Us,U as $s}from"./ai-chat-BO5vbKZW.js";import{e as Ts,B as Ls,I as qs,m as zs,f as ne,r as Ps}from"./tool-windows-CmgL3thd.js";/* empty css */import"./startup-runtime-DTmhLESk.js";const Rs=30,Os=({onPreviewOpen:l,onDownload:f,className:n})=>{const[d,$]=r.useState([]),[T,j]=r.useState(!0),[w,b]=r.useState(!1),[z,P]=r.useState(!1),x=r.useRef(0),R=r.useRef(null),D=r.useCallback(async m=>{try{return await ye.getArchivedTasks(m,Rs)}catch{return{tasks:[],hasMore:!1}}},[]);r.useEffect(()=>{let m=!1;return j(!0),x.current=0,D(0).then(C=>{m||($(C.tasks),P(C.hasMore),x.current=C.tasks.length,j(!1))}),()=>{m=!0}},[D]);const A=r.useCallback(async()=>{if(w||!z)return;b(!0);const m=await D(x.current);$(C=>[...C,...m.tasks]),P(m.hasMore),x.current+=m.tasks.length,b(!1)},[w,z,D]);return r.useEffect(()=>{const m=R.current;if(!m)return;const C=()=>{m.scrollHeight-m.scrollTop-m.clientHeight<200&&A()};return m.addEventListener("scroll",C,{passive:!0}),()=>m.removeEventListener("scroll",C)},[A]),T?t.jsxs("div",{className:"task-queue-panel__empty",children:[t.jsx(oe,{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:R,className:n,style:{overflow:"auto",height:"100%"},children:[d.map(m=>t.jsx(Ds,{task:m,onPreviewOpen:l?()=>l(m.id):void 0,onDownload:f},m.id)),z&&t.jsx("div",{style:{padding:"12px",textAlign:"center"},children:w?t.jsx(oe,{size:"small"}):t.jsx(_,{size:"small",variant:"text",theme:"default",onClick:A,children:"加载更多"})})]})},As=({character:l,onDelete:f,onSelect:n,compact:d=!1})=>{const[$,T]=r.useState(!1),j=l.status==="processing"||l.status==="pending",w=l.status==="failed",b=l.status==="completed",z=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]),P=r.useCallback(()=>{b&&n&&n(l)},[b,n,l]),x=r.useCallback(m=>{m.stopPropagation(),f==null||f(l.id)},[f,l.id]),R=r.useCallback(m=>{m.stopPropagation(),b&&l.profilePictureUrl&&T(!0)},[b,l.profilePictureUrl]),D=()=>l.profilePictureUrl||b?t.jsx(I,{content:"点击查看大图",children:t.jsx(Ns,{characterId:l.id,profilePictureUrl:l.profilePictureUrl,alt:l.username||"Character",className:"character-card__avatar-img",onClick:R})}):t.jsx("div",{className:"character-card__avatar-placeholder",children:t.jsx(dt,{})}),A=()=>j?t.jsxs("div",{className:"character-card__status character-card__status--processing",children:[t.jsx(oe,{size:"small"}),t.jsx("span",{children:"创建中..."})]}):w?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 ${j?"character-card--loading":""} ${w?"character-card--failed":""}`,onClick:P,children:[t.jsx("div",{className:"character-card__avatar",children:D()}),t.jsx("span",{className:"character-card__username-text",children:l.username||"创建中..."})]}):t.jsxs("div",{className:`character-card ${j?"character-card--loading":""} ${w?"character-card--failed":""}`,onClick:P,children:[t.jsx("div",{className:"character-card__avatar",children:D()}),t.jsxs("div",{className:"character-card__info",children:[b&&l.username?t.jsx(I,{content:"点击复制",children:t.jsxs("div",{className:"character-card__username",onClick:z,children:["@",l.username,t.jsx(ss,{className:"character-card__username-copy"})]})}):t.jsx("div",{className:"character-card__username",style:{cursor:"default"},children:j?"创建中...":"角色"}),l.id&&t.jsx(I,{content:l.id,placement:"bottom",children:t.jsx("div",{className:"character-card__source",children:l.id})}),A()]}),t.jsx("div",{className:"character-card__actions",children:t.jsx(I,{content:"删除角色",children:t.jsx(_,{size:"small",variant:"text",theme:"danger",icon:t.jsx(_e,{}),"data-track":"character_click_delete",onClick:x})})}),l.profilePictureUrl&&t.jsx(Us,{visible:$,onClose:()=>T(!1),items:[{url:l.profilePictureUrl,type:"image",title:`@${l.username||"Character"}`}]})]})},Vs=({onSelect:l,completedOnly:f=!1,maxItems:n,showHeader:d=!0,title:$="角色列表"})=>{const{characters:T,completedCharacters:j,pendingCharacters:w,isLoading:b,deleteCharacter:z,refreshCharacters:P}=mt(),[x,R]=st.useState(null),D=st.useMemo(()=>{let v=f?j:T;return v=[...v].sort((de,ue)=>ue.createdAt-de.createdAt),n&&v.length>n&&(v=v.slice(0,n)),v},[f,T,j,n]),A=r.useCallback(v=>{R(v)},[]),m=r.useCallback(async()=>{if(!x)return;await z(x)?u.success("角色已删除"):u.error("删除失败"),R(null)},[x,z]),C=r.useCallback(async()=>{await P(),u.success("已刷新")},[P]);return b?t.jsxs("div",{className:"character-list__loading",children:[t.jsx(oe,{size:"small"}),t.jsx("span",{children:"加载中..."})]}):D.length===0?t.jsxs("div",{className:"character-list",children:[d&&t.jsxs("div",{className:"character-list__header",children:[t.jsx("h4",{children:$}),t.jsx(_,{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:[$,w.length>0&&t.jsxs("span",{style:{fontWeight:"normal",fontSize:"12px",color:"#666",marginLeft:"8px"},children:["(",w.length," 创建中)"]})]}),t.jsx(_,{size:"small",variant:"text",icon:t.jsx(je,{}),"data-track":"character_click_refresh",onClick:C})]}),t.jsx("div",{className:"character-list__items",children:D.map(v=>t.jsx(As,{character:v,onDelete:A,onSelect:l},v.id))}),t.jsx(ce,{open:!!x,title:"确认删除",description:"确定要删除此角色吗?删除后将无法在提示词中使用该角色。",confirmText:"删除",cancelText:"取消",danger:!0,onOpenChange:v=>{v||R(null)},onConfirm:m})]})},{TabPanel:te}=ut,Fs="task-queue-drawer-width";function Gs(l){var f,n,d;return Array.isArray((f=l.result)==null?void 0:f.urls)&&l.result.urls.length>0?l.result.urls.length:(n=l.result)!=null&&n.url||(d=l.result)!=null&&d.chatResponse||se(l)?1:0}function Bs(l){const f=Gs(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 Xs=({expanded:l,onClose:f,onTaskAction:n})=>{const{tasks:d,activeTasks:$,completedTasks:T,failedTasks:j,cancelledTasks:w,isLoading:b,isLoadingMore:z,hasMore:P,totalCount:x,loadedCount:R,loadMore:D,retryTask:A,deleteTask:m,clearCompleted:C,clearFailed:v,batchDeleteTasks:de,batchRetryTasks:ue,batchCancelTasks:pt}=rs(),{board:G,openDialog:Ie}=ls(),{characters:we}=mt(),[O,ht]=r.useState("all"),[ft,me]=r.useState(!1),[be,gt]=r.useState("completed"),[ae,xt]=r.useState(""),[k,Y]=r.useState("all"),[Hs,ke]=r.useState(null),[vt,pe]=r.useState(!1),[Ct,yt]=r.useState(0),[_t,jt]=r.useState("single"),[Se,he]=r.useState(!1),[De,fe]=r.useState(""),[It,ge]=r.useState(!1),[xe,Ne]=r.useState(null),[Ee,ve]=r.useState(null),[B,ee]=r.useState(!1),[g,Q]=r.useState(new Set),[wt,Ce]=r.useState(!1),[Me,Ue]=r.useState(null),{isConfigured:bt}=Ts(),[re,$e]=r.useState(!1),[kt,le]=r.useState(0),Te=k==="character";r.useEffect(()=>{at.initCacheStatus()},[]),r.useEffect(()=>{if(!l)return;let s=!1;return ye.getArchivedTaskCount().then(e=>{s||Ue(e)}).catch(()=>{s||Ue(0)}),()=>{s=!0}},[l,O]);const H=r.useMemo(()=>{let s;switch(O){case"all":s=d;break;case"active":s=$;break;case"completed":s=T;break;case"failed":s=j;break;case"cancelled":s=w;break;case"archived":return[];default:s=d}if(k!=="all"&&k!=="character"&&(s=s.filter(e=>e.type===(k==="image"?p.IMAGE:k==="audio"?p.AUDIO:k==="text"?p.CHAT:p.VIDEO))),ae.trim()){const e=ae.toLowerCase().trim();s=s.filter(a=>{var o,y,L,W,K;return a.params.prompt.toLowerCase().includes(e)||String(((o=a.result)==null?void 0:o.title)||"").toLowerCase().includes(e)||String(((y=a.result)==null?void 0:y.lyricsTitle)||"").toLowerCase().includes(e)||String(((L=a.result)==null?void 0:L.lyricsText)||"").toLowerCase().includes(e)||String(((W=a.result)==null?void 0:W.chatResponse)||"").toLowerCase().includes(e)||(((K=a.result)==null?void 0:K.lyricsTags)||[]).some(c=>String(c).toLowerCase().includes(e))})}return[...s].sort((e,a)=>a.createdAt-e.createdAt)},[O,d,$,T,j,w,k,ae]),St=s=>{gt(s),me(!0)},Dt=()=>{be==="completed"?C():v(),me(!1)},Nt=s=>{A(s),n==null||n("retry",s)},Et=s=>{Ne(s),ge(!0)},Mt=()=>{xe&&(m(xe),n==null||n("delete",xe)),ge(!1),Ne(null)},Ut=()=>{B?(ee(!1),Q(new Set)):ee(!0)},$t=(s,e)=>{Q(a=>{const o=new Set(a);return e?o.add(s):o.delete(s),o})},Tt=()=>{const s=H.map(e=>e.id);Q(new Set(s))},Lt=()=>{Q(new Set)},qt=()=>{g.size!==0&&Ce(!0)},zt=()=>{de(Array.from(g)),Q(new Set),ee(!1),Ce(!1),u.success(`已删除 ${g.size} 个任务`)},Pt=()=>{const s=Array.from(g).filter(e=>{const a=d.find(o=>o.id===e);return(a==null?void 0:a.status)===q.FAILED||(a==null?void 0:a.status)===q.CANCELLED});if(s.length===0){u.warning("没有可重试的任务");return}ue(s),Q(new Set),ee(!1),u.success(`已重试 ${s.length} 个任务`)},Le=r.useMemo(()=>Array.from(g).filter(s=>{const e=d.find(a=>a.id===s);return(e==null?void 0:e.status)===q.FAILED||(e==null?void 0:e.status)===q.CANCELLED}).length,[g,d]),qe=r.useMemo(()=>Array.from(g).filter(s=>{const e=d.find(a=>a.id===s);return(e==null?void 0:e.status)===q.PENDING||(e==null?void 0:e.status)===q.PROCESSING}).length,[g,d]),ze=r.useMemo(()=>Array.from(g).filter(s=>{const e=d.find(a=>a.id===s);return(e==null?void 0:e.status)===q.COMPLETED&&((e==null?void 0:e.type)===p.IMAGE||(e==null?void 0:e.type)===p.VIDEO)}).length,[g,d]),Z=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(o=>o.id===e);return(a==null?void 0:a.status)===q.PENDING||(a==null?void 0:a.status)===q.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(o=>o.id===e);return(a==null?void 0:a.status)===q.COMPLETED&&((a==null?void 0:a.type)===p.IMAGE||(a==null?void 0:a.type)===p.VIDEO)});if(!(s.length===0||re)){$e(!0),le(0);try{const e=await zs.syncMultipleTasks(s,(a,o)=>{le(Math.round(a/o*100))});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{$e(!1),le(0)}}},Pe=async s=>{const e=d.find(o=>o.id===s);if(e&&se(e)){u.info("歌词任务支持复制或插入画布");return}if(!e)return;const a=xs(e);if(a.length!==0)try{const o=await vs(a);o.openedCount>0&&o.downloadedCount===0?u.success(o.openedCount>1?`已打开 ${o.openedCount} 个链接,请在新标签页下载`:"资源不支持直接下载,已打开链接"):u.success(e.type===p.AUDIO?a.length>1?"多条音频已开始下载":"音频下载成功":a.length>1?"多图已开始下载":"下载成功"),Cs.track("generation_result_download",{...Bs(e),downloadedCount:o.downloadedCount,openedCount:o.openedCount}),n==null||n("download",s)}catch(o){console.error("Download failed:",o),u.error("下载失败,请稍后重试")}},At=async s=>{const e=d.find(o=>o.id===s);if(!e||!se(e)){u.warning("暂无可复制的歌词");return}const a=nt(e);if(!a.trim()){u.warning("暂无可复制的歌词");return}try{await ot(a),u.success("歌词已复制"),n==null||n("copy",s)}catch(o){console.error("Failed to copy lyrics:",o),u.error("复制失败,请稍后重试")}},Vt=async s=>{var a,o,y,L,W,K,c,J,V,X,S,N;const e=d.find(i=>i.id===s);if(!e||!G){console.warn("Cannot insert: task result or board not available"),u.warning("无法插入:白板未就绪");return}if(!((a=e.result)!=null&&a.url)&&!((y=(o=e.result)==null?void 0:o.urls)!=null&&y.length)&&!se(e)){const i=e.type===p.CHAT?(L=e.result)==null?void 0:L.chatResponse:void 0;if(i!=null&&i.trim()){const h=(e.params.prompt||"").slice(0,20)||void 0;await ne({items:[{type:"text",content:i,label:h}]}),u.success("文本已插入到白板"),ie.markAsInserted(s,"manual"),n==null||n("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=(W=i.urls)!=null&&W.length?i.urls:[i.url];for(const E of h)await lt(G,rt(E));u.success(h.length>1?"多图已插入到白板":"图片已插入到白板")}else if(e.type===p.VIDEO)await Is(G,i.url),u.success("视频已插入到白板");else if(e.type===p.AUDIO){if(se(e)){const F=ct(i,e.params.title||e.params.prompt)||(e.params.prompt||"").slice(0,20)||void 0;await ne({items:[{type:"text",content:nt(e),label:F,metadata:{title:ct(i,e.params.title||e.params.prompt),tags:ws(i)}}]}),u.success("歌词已插入到白板"),ie.markAsInserted(s,"manual"),n==null||n("insert",s);return}const h=Ps(i),E=(c=(K=i.clips)==null?void 0:K[0])==null?void 0:c.duration,M={title:i.title||e.params.title||e.params.prompt,duration:typeof E=="number"?E: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||((V=(J=i.clips)==null?void 0:J[0])==null?void 0:V.clipId)||((S=(X=i.clips)==null?void 0:X[0])==null?void 0:S.id)||((N=i.clipIds)==null?void 0:N[0]),clipIds:i.clipIds};h.length===1?await bs(G,h[0],M):await ne({items:h.map((F,U)=>{var Fe,Ge,Be,He,We,Ke,Qe,Ye,Ze,Je,Xe,et,tt;return{type:"audio",content:F,groupId:`task-audio-${e.id}`,dimensions:{width:Ss,height:ks},metadata:{...M,title:((Ge=(Fe=i.clips)==null?void 0:Fe[U])==null?void 0:Ge.title)||`${M.title||"Audio"} ${U+1}`,previewImageUrl:((He=(Be=i.clips)==null?void 0:Be[U])==null?void 0:He.imageLargeUrl)||((Ke=(We=i.clips)==null?void 0:We[U])==null?void 0:Ke.imageUrl)||M.previewImageUrl,duration:typeof((Ye=(Qe=i.clips)==null?void 0:Qe[U])==null?void 0:Ye.duration)=="number"?i.clips[U].duration||void 0:M.duration,clipId:((Je=(Ze=i.clips)==null?void 0:Ze[U])==null?void 0:Je.clipId)||((et=(Xe=i.clips)==null?void 0:Xe[U])==null?void 0:et.id)||((tt=i.clipIds)==null?void 0:tt[U])||M.clipId}}})}),u.success(h.length>1?"多条音频卡片已插入到白板":"音频卡片已插入到白板")}else if(e.type===p.CHAT){const h=i.chatResponse||"",E=(e.params.prompt||"").slice(0,20)||void 0;await ne({items:[{type:"text",content:h,label:E}]}),u.success("文本已插入到白板")}ie.markAsInserted(s,"manual"),n==null||n("insert",s)}catch(i){console.error("Failed to insert to board:",i),u.error(`插入失败: ${i instanceof Error?i.message:"未知错误"}`)}},Ft=async s=>{const e=await ye.getTask(s)||ie.getTask(s)||d.find(a=>a.id===s);if(!e||e.type!==p.IMAGE){u.warning("未找到可回填的图片任务");return}ys({..._s(e),source:"task-queue"}),n==null||n("regenerate",s)},Gt=s=>{var a,o;const e=d.find(y=>y.id===s);if(!e){console.warn("Cannot edit: task not found");return}if(e.type===p.IMAGE)Ie(it.aiImageGeneration,js(e));else if(e.type===p.VIDEO){const y={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:(a=e.result)==null?void 0:a.url,initialResultUrls:(o=e.result)==null?void 0:o.urls};Ie(it.aiVideoGeneration,y)}else if(e.type===p.AUDIO){u.info("音频任务暂不支持从任务面板直接编辑");return}n==null||n("edit",s)},Bt=s=>{const e=d.find(a=>a.id===s);e&&(ve(e),n==null||n("extractCharacter",s))},Re=r.useMemo(()=>{const s=new Set;return H.filter(e=>{var a,o,y,L;return e.status!==q.COMPLETED||!((a=e.result)!=null&&a.url)&&!((y=(o=e.result)==null?void 0:o.urls)!=null&&y.length)||e.type!==p.IMAGE&&e.type!==p.VIDEO&&!(e.type===p.AUDIO&&((L=e.result)==null?void 0:L.resultKind)!=="lyrics")||s.has(e.id)?!1:(s.add(e.id),!0)})},[H]),{previewMediaItems:Ht,taskIdToPreviewConfig:Oe}=r.useMemo(()=>{var a,o,y,L,W,K;const s=[],e=new Map;for(const c of Re){const J=s.length,V=((a=c.result)==null?void 0:a.title)||c.params.title||((o=c.params.prompt)==null?void 0:o.substring(0,50))||"媒体预览";if(c.type===p.AUDIO){const S=((L=(y=c.result)==null?void 0:y.clips)==null?void 0:L.filter(h=>!!h.audioUrl).map((h,E)=>{var M,F,U;return{id:h.clipId||h.id||`${c.id}-${E}`,url:h.audioUrl,type:"audio",title:h.title||((M=c.result)!=null&&M.clips&&c.result.clips.length>1?`${V} (${E+1}/${c.result.clips.length})`:V),posterUrl:h.imageLargeUrl||h.imageUrl||((F=c.result)==null?void 0:F.previewImageUrl),duration:typeof h.duration=="number"?h.duration:(U=c.result)==null?void 0:U.duration,prompt:c.params.prompt,tags:typeof c.params.tags=="string"?c.params.tags:void 0,artist:c.params.model||c.params.mv||"Aitu",album:"Aitu Generated"}}))??[],N=(W=c.result.urls)!=null&&W.length?c.result.urls:c.result.url?[c.result.url]:[],i=S.length>0?S:N.map((h,E)=>{var M,F;return{id:N.length>1?`${c.id}-${E}`:c.id,url:h,type:"audio",title:N.length>1?`${V} (${E+1}/${N.length})`:V,posterUrl:(M=c.result)==null?void 0:M.previewImageUrl,duration:(F=c.result)==null?void 0:F.duration,prompt:c.params.prompt,tags:typeof c.params.tags=="string"?c.params.tags:void 0,artist:c.params.model||c.params.mv||"Aitu",album:"Aitu Generated"}});s.push(...i)}else{const S=(K=c.result.urls)!=null&&K.length?c.result.urls:[c.result.url],N=c.type===p.VIDEO?"video":"image";for(let i=0;i<S.length;i++){const h=N==="image"?rt(S[i]):S[i];s.push({id:S.length>1?`${c.id}-${i}`:c.id,url:h,type:N,title:S.length>1?`${V} (${i+1}/${S.length})`:V})}}const X=s.length-J;e.set(c.id,{mode:c.type===p.AUDIO&&X>1?"compare":"single",index:c.type===p.AUDIO&&X>1?Array.from({length:Math.min(X,4)},(S,N)=>J+N):J})}return{previewMediaItems:s,taskIdToPreviewConfig:e}},[Re]),Ae=r.useCallback(s=>{ke(s);const e=Oe.get(s);e!==void 0&&(jt(e.mode),yt(e.index),pe(!0))},[Oe]),Wt=r.useCallback(()=>{ke(null),pe(!1)},[]),Kt=r.useCallback(s=>{s.type==="image"&&(fe(s.url),he(!0),pe(!1))},[]),Qt=r.useCallback(async s=>{if(G)try{const e=`edited-image-${Date.now()}`,a=`/__aitu_cache__/image/${e}.png`,y=await(await fetch(s)).blob();await at.cacheMediaFromBlob(a,y,"image",{taskId:e}),await lt(G,a),he(!1),fe("")}catch(e){console.error("Failed to insert edited image:",e)}},[G]),Yt=r.useCallback(()=>{f==null||f()},[f]),Zt=x>0?x:d.length,Ve="这里只显示最近 100 个任务,更早的任务会自动移到“历史”中继续保留。",Jt=t.jsx(I,{content:Ve,children:t.jsxs("span",{children:["全部 (",Zt,")"]})}),Xt=Me===null?"历史":`历史 (${Me})`,es=x>=100?`已加载最近 ${x} 个任务,较早任务已移至“历史”`:`已加载全部 ${x} 个任务`,ts=t.jsxs("div",{className:"task-queue-panel__filters-container",children:[t.jsxs(ut,{value:O,onChange:s=>ht(s),children:[t.jsx(te,{value:"all",label:Jt}),t.jsx(te,{value:"active",label:`生成中 (${$.length})`}),t.jsx(te,{value:"failed",label:`失败 (${j.length})`}),t.jsx(te,{value:"completed",label:`已完成 (${T.length})`}),t.jsx(te,{value:"archived",label:Xt})]}),O!=="archived"&&t.jsxs("div",{className:"task-queue-panel__filters",children:[t.jsxs("div",{className:"task-queue-panel__type-filters",children:[t.jsx(I,{content:`全部 (${Z.all})`,children:t.jsx(_,{size:"small",variant:"text",shape:"square",onClick:()=>Y("all"),className:k==="all"?"task-queue-panel__filter-btn--active":"",children:t.jsx(is,{size:"16px"})})}),t.jsx(I,{content:`图片 (${Z.image})`,children:t.jsx(_,{size:"small",variant:"text",shape:"square",onClick:()=>Y("image"),className:k==="image"?"task-queue-panel__filter-btn--active":"",children:t.jsx(ns,{size:"16px"})})}),t.jsx(I,{content:`视频 (${Z.video})`,children:t.jsx(_,{size:"small",variant:"text",shape:"square",onClick:()=>Y("video"),className:k==="video"?"task-queue-panel__filter-btn--active":"",children:t.jsx(cs,{size:"16px"})})}),t.jsx(I,{content:`音频 (${Z.audio})`,children:t.jsx(_,{size:"small",variant:"text",shape:"square",onClick:()=>Y("audio"),className:k==="audio"?"task-queue-panel__filter-btn--active":"",children:t.jsx(os,{size:16,strokeWidth:1.9})})}),t.jsx(I,{content:`文本 (${Z.text})`,children:t.jsx(_,{size:"small",variant:"text",shape:"square",onClick:()=>Y("text"),className:k==="text"?"task-queue-panel__filter-btn--active":"",children:"文"})}),t.jsx(I,{content:`角色 (${Z.character})`,children:t.jsx(_,{size:"small",variant:"text",shape:"square",onClick:()=>Y("character"),className:k==="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(ds,{value:ae,onChange:s=>xt(s),placeholder:"搜索...",clearable:!0,prefixIcon:t.jsx(us,{}),size:"small",className:"task-queue-panel__search-input"}),t.jsxs("div",{className:"task-queue-panel__filter-actions",children:[t.jsx(I,{content:B?"退出多选":"批量操作",children:t.jsx(_,{size:"small",variant:B?"base":"outline",theme:B?"primary":"default",icon:t.jsx(ms,{}),"data-track":"task_click_toggle_selection",onClick:Ut,children:B?"退出":"多选"})}),j.length>0&&!B&&t.jsx(I,{content:"清除失败",children:t.jsx(_,{size:"small",variant:"text",theme:"default",icon:t.jsx(_e,{style:{color:"var(--td-text-color-placeholder)"}}),"data-track":"task_click_clear_failed",onClick:()=>St("failed"),className:"task-queue-panel__clear-btn"})})]})]})]}),B&&!Te&&t.jsxs("div",{className:"task-queue-panel__batch-actions",children:[t.jsxs("div",{className:"task-queue-panel__batch-select",children:[t.jsx(ps,{checked:g.size===H.length&&H.length>0,indeterminate:g.size>0&&g.size<H.length,onChange:s=>s?Tt():Lt()}),t.jsxs("span",{className:"task-queue-panel__batch-count",children:["已选 ",g.size," / ",H.length]})]}),t.jsxs("div",{className:"task-queue-panel__batch-buttons",children:[qe>0&&t.jsxs(_,{size:"small",variant:"outline",theme:"warning",icon:t.jsx(hs,{}),"data-track":"task_click_batch_cancel",onClick:Rt,children:["取消 (",qe,")"]}),Le>0&&t.jsxs(_,{size:"small",theme:"primary",icon:t.jsx(je,{}),"data-track":"task_click_batch_retry",onClick:Pt,children:["重试 (",Le,")"]}),bt&&ze>0&&t.jsx(I,{content:"同步选中的任务到云端",placement:"bottom",children:t.jsx(_,{size:"small",variant:"outline",icon:t.jsx(fs,{}),"data-track":"task_click_batch_sync",onClick:Ot,disabled:re,loading:re,children:re?`${kt}%`:`同步 (${ze})`})}),t.jsxs(_,{size:"small",variant:"text",theme:"default",icon:t.jsx(_e,{}),"data-track":"task_click_batch_delete",onClick:qt,disabled:g.size===0,children:["删除 (",g.size,")"]})]})]})]});return t.jsxs(t.Fragment,{children:[t.jsx(Ls,{isOpen:l,onClose:Yt,title:"任务队列",filterSection:ts,position:"toolbar-right",width:"responsive",storageKey:Fs,pinStorageKey:gs.task,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:Te?t.jsx(Vs,{showHeader:!1,title:""}):O==="archived"?t.jsx(Os,{onPreviewOpen:Ae,onDownload:Pe,className:"task-queue-panel__list"}):t.jsx(Es,{tasks:H,selectionMode:B,selectedTaskIds:g,onSelectionChange:$t,onRetry:Nt,onDelete:Et,onDownload:Pe,onInsert:Vt,onCopy:At,onEdit:Gt,onRegenerate:Ft,onPreviewOpen:Ae,onExtractCharacter:Bt,hasMore:P,isLoadingMore:z,onLoadMore:D,totalCount:x,loadedCount:R,allLoadedText:es,allLoadedHint:x>=100?Ve:void 0,className:"task-queue-panel__list",emptyContent:b?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:O==="all"?"暂无任务":`暂无${O==="active"?"生成中":O==="completed"?"已完成":O==="failed"?"失败":"已取消"}任务`})]})})}),t.jsx(ce,{open:ft,title:"确认清除",description:`确定要清除所有${be==="completed"?"已完成":"失败"}的任务吗?此操作无法撤销。`,confirmText:"清除",cancelText:"取消",danger:!0,onOpenChange:me,onConfirm:Dt}),t.jsx(ce,{open:It,title:"确认删除",description:"确定要删除此任务吗?此操作无法撤销。",confirmText:"删除",cancelText:"取消",danger:!0,onOpenChange:ge,onConfirm:Mt}),t.jsx(ce,{open:wt,title:"确认批量删除",description:`确定要删除选中的 ${g.size} 个任务吗?此操作无法撤销。`,confirmText:"删除",cancelText:"取消",danger:!0,onOpenChange:Ce,onConfirm:zt}),t.jsx($s,{visible:vt,items:Ht,initialMode:_t,initialIndex:Ct,onClose:Wt,showThumbnails:!0,onEdit:Kt}),Se&&De&&t.jsx(qs,{visible:Se,imageUrl:De,showOverwrite:!1,onClose:()=>{he(!1),fe("")},onInsert:G?Qt:void 0}),t.jsx(Ms,{visible:!!Ee,task:Ee,onClose:()=>ve(null),onCreateStart:()=>{},onCreateComplete:s=>{ve(null)}})]})};export{Fs as TASK_DRAWER_WIDTH_KEY,Xs as TaskQueuePanel};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{j as t,E as ct,mT as Ca,e0 as vt,mU as fa,a1 as Wa,mV as is,mI as Vt,mN as ls,mW as cs,mX as Ut,mY as us,mZ as ds,mL as ms,mQ as ps,mR as fs,m_ as xe,ck as ha,r as s,aw as we,aB as ut,m$ as Xe,gm as hs,jH as Jt,M as Se,n0 as wa,n1 as vs,am as $e,bz as ze,n2 as $t,n3 as Ya,n4 as qa,aA as Ft,n5 as va,ah as ja,n6 as gs,n7 as Ze,n8 as ys,bg as ge,n9 as Za,na as ea,nb as bs,mh as ta,nc as _s,nd as Ma,iU as Is,iW as xs,ji as Ss,ne as ka,h9 as Tt,db as aa,nf as Cs,gT as Xa,dB as Ve,ng as sa,nh as Na,ni as ws,b7 as js,R as lt,ef as ra,eK as Pa,nj as Ms,$ as ks,l as Ns,mz as Ta,mA as Ps,mB as Ts,nk as As,c1 as zs,mD as Es,mE as Ds,d as Rs,c as Vs,mF as Fs}from"./startup-app-DxX-P1pm.js";import{i as dt,j as Aa,k as za,T as Os,R as Ot,K as Ls,m as Ee,v as Ea,q as na,V as Qa,U as Us}from"./ai-chat-B5qFht2H.js";import{e as $s,c as Bs,r as Gs,a as Hs,b as Ks,w as oa,d as Ws,g as Ys,f as qs}from"./workflow-generation-utils-JoRODaP7.js";import{c as Da,f as Ra,g as Zs,d as Xs}from"./ai-generation-preferences-service-CvWbMxv3.js";import{M as Va}from"./tool-windows-BIjc1zsU.js";/* empty css *//* empty css */import{R as Qs}from"./ResizableDivider-CdfJF8GW.js";import{P as Fa}from"./ParametersDropdown-DBQCDv3g.js";import{u as Js}from"./VideoAnalyzer-C90c84gt.js";import"./startup-runtime-DTmhLESk.js";const er=({shots:e,totalDuration:r})=>t.jsx("div",{className:"va-timeline",children:e.filter(Boolean).map(l=>t.jsx(ct,{content:`${l.label||"未命名镜头"} ${l.startTime??0}s-${l.endTime??0}s`,showArrow:!1,children:t.jsx("div",{className:"va-timeline-segment",style:{flex:Math.max(((l.endTime??0)-(l.startTime??0))/Math.max(r,1),0),backgroundColor:l.type&&Ca[l.type]||Ca.other}})},l.id))});function Oa(e){return(e||"").trim().toLowerCase().replace(/[^a-z0-9]/g,"")||"mp4"}function tr(e){const r=e.name.split(".").pop();if(r&&r.length<=8)return Oa(r);const l=e.type.split("/")[1];return Oa(l)}async function ar(e,r){const l=tr(e),c=`/__aitu_cache__/video/${`video-analyzer-source-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}.${l}`;return await vt.cacheMediaFromBlob(c,e,"video",{metadata:{source:"video-analyzer-input",fileName:e.name,mimeType:e.type||"video/mp4",size:e.size}}),{type:"upload",cacheUrl:c,fileName:e.name||`video-source.${l}`,mimeType:e.type||"video/mp4",size:e.size}}async function sr(e){if(!e||e.type!=="upload")return null;const r=await vt.getCachedBlob(e.cacheUrl);return r?new File([r],e.fileName||"video-source.mp4",{type:e.mimeType||r.type||"video/mp4",lastModified:Date.now()}):null}function Ja(e){return ps(e,"videoAnalyzerAction",["analyze","rewrite","prompt-generate"])}function rr(e){return fs(e,{missingMessage:"分析任务缺少结果内容",fromStructured:r=>r})}function nr(e){const r=e.params.videoAnalyzerSourceSnapshot;if((r==null?void 0:r.type)==="youtube"||(r==null?void 0:r.type)==="upload"||(r==null?void 0:r.type)==="prompt")return r;const l=e.params.videoAnalyzerSource,h=String(e.params.videoAnalyzerSourceLabel||"").trim();return l==="youtube"&&h?{type:"youtube",youtubeUrl:h}:l==="prompt"&&h?{type:"prompt",prompt:String(e.params.videoAnalyzerUserPrompt||h),pdfCacheUrl:Vt(e,"pdfCacheUrl")||void 0,pdfName:Vt(e,"pdfName")||void 0,pdfMimeType:Vt(e,"pdfMimeType")||void 0}:null}function or(e,r){const l=new Map(e.map(h=>[h.id,h]));return r.map(h=>{const c=l.get(h.id);return{...h,referenceImageUrl:h.referenceImageUrl||(c==null?void 0:c.referenceImageUrl)}})}function ir(e){var h;const r=(h=e.result)==null?void 0:h.analysisData,l=Array.isArray(r==null?void 0:r.editedShots)?r.editedShots:Array.isArray(r==null?void 0:r.shots)?r.shots:null;return!r||!l?null:{shots:l,characters:Array.isArray(r.characters)?r.characters:void 0,hasCharacters:Object.prototype.hasOwnProperty.call(r,"characters"),videoStyle:String(r.video_style||r.videoStyle||"").trim()||void 0,bgmMood:String(r.bgm_mood||r.bgmMood||"").trim()||void 0,suggestion:String(r.suggestion||"").trim()||void 0}}function lr(e,r){const l=e.params.videoAnalyzerProductInfo;if(!(!l||typeof l!="object"))return Ut(l,r)}async function Lt(e){var N,ie;if(e.status!=="completed")return null;const r=Ja(e);if(!r)return null;if(r==="analyze"||r==="prompt-generate"){const le=await fa(),L=le.find(f=>f.analyzeTaskId===e.id);if(L)return{records:le,record:L};const J=rr(e),X=nr(e),he=e.params.videoAnalyzerSource,U=he==="prompt"?"prompt":he==="upload"?"upload":"youtube",D=String(e.params.videoAnalyzerSourceLabel||(U==="prompt"?"提示词生成":U==="youtube"?(X==null?void 0:X.type)==="youtube"?X.youtubeUrl:"":"本地视频")),me=lr(e,J.totalDuration),ae={id:Wa(),createdAt:Date.now(),source:U,sourceLabel:D,sourceSnapshot:X,model:String(e.params.model||""),modelRef:e.params.modelRef||null,analysis:J,...me?{productInfo:me}:{},starred:!1,analyzeTaskId:e.id};return{records:await is(ae),record:ae}}const l=Vt(e,"videoAnalyzerRecordId");if(!l)return null;const h=await fa(),c=h.find(le=>le.id===l);if(!c)return null;if(c.pendingRewriteTaskId!==e.id)return!c.pendingRewriteTaskId&&c.storyboardGeneratedAt&&(!e.completedAt||c.storyboardGeneratedAt>=e.completedAt)?{records:h,record:c}:null;const k=c.editedShots||c.analysis.shots,g=ir(e),I=g||(()=>{const le=ls(e);if(!le)throw new Error("脚本改编任务缺少结果内容");return cs(le,k)})(),O=I.shots,j=I.hasCharacters?or(c.characters||c.analysis.characters||[],I.characters||[]):void 0,S=I.videoStyle||I.bgmMood?{...Ut(c.productInfo||{prompt:""},c.analysis.totalDuration),...I.videoStyle?{videoStyle:I.videoStyle}:{},...I.bgmMood?{bgmMood:I.bgmMood}:{}}:void 0,T={...c.analysis,suggestion:I.suggestion||""},G=`AI 改编 #${(((N=c.scriptVersions)==null?void 0:N.length)||0)+1}`,Y=us(O,G,(ie=c.productInfo)==null?void 0:ie.prompt,{characters:j||c.characters||c.analysis.characters||[],productInfo:S||c.productInfo}),Q=ds(c,Y);return ms(c,{...Q,analysis:T,...j!==void 0?{characters:j}:{},...S?{productInfo:S}:{},pendingRewriteTaskId:null,storyboardGeneratedAt:Date.now()},xe)}function cr(e){return Ja(e)!==null}const ia="gemini-3.1-pro-preview",la="video-analyzer:model",At="video-analyzer:video-model",ca="veo3",zt=30,ur="aitu:settings:provider-nav",dr=20*1024*1024;function La(e){return(e/1024/1024).toFixed(1)+"MB"}function mr(e){const r=`${e.id} ${e.label} ${e.shortLabel||""} ${e.sourceProfileName||""}`.toLowerCase();return e.vendor===ja.GEMINI||e.vendor===ja.GOOGLE||r.includes("gemini")}const pr=({existingRecord:e,onComplete:r,onRecordsChange:l,onCreateNew:h,onNext:c})=>{const{setAppState:k}=ha(),[g,I]=s.useState("prompt"),[O,j]=s.useState(""),[S,T]=s.useState(()=>{var m;return((m=e==null?void 0:e.productInfo)==null?void 0:m.videoStyle)||(e==null?void 0:e.analysis.video_style)||""}),[G,Y]=s.useState(()=>{var m;return((m=e==null?void 0:e.productInfo)==null?void 0:m.targetDuration)||(e==null?void 0:e.analysis.totalDuration)||zt}),[Q,N]=s.useState({}),[ie,le]=s.useState([]),[L,J]=s.useState(null),[X,he]=s.useState(""),[U,D]=s.useState(null),[me,ae]=s.useState(()=>(e==null?void 0:e.model)||we(la,ia).modelId),[pe,f]=s.useState(()=>(e==null?void 0:e.modelRef)||we(la,ia).modelRef),R=s.useCallback((m,_)=>{ae(m),f(_||null),ut(la,m,_)},[]),A=dt("video"),[q,$]=s.useState(()=>{var m;return((m=e==null?void 0:e.productInfo)==null?void 0:m.videoModel)||we(At,ca).modelId}),[ee,K]=s.useState(()=>{var m,_;return((m=e==null?void 0:e.productInfo)==null?void 0:m.videoModelRef)||we(At,((_=e==null?void 0:e.productInfo)==null?void 0:_.videoModel)||ca).modelRef}),_e=s.useMemo(()=>Xe(q),[q]),[ce,ye]=s.useState(()=>{var w,F;const m=((w=e==null?void 0:e.productInfo)==null?void 0:w.videoModel)||we(At,ca).modelId,_=Xe(m);return((F=e==null?void 0:e.productInfo)==null?void 0:F.segmentDuration)||parseInt(_.defaultDuration,10)||8}),Oe=s.useMemo(()=>(_e.durationOptions||[]).map(m=>({value:parseInt(m.value,10),label:m.label})),[_e]),Qe=s.useCallback((m,_)=>{$(m),K(_||null),ut(At,m,_);const w=Xe(m);ye(parseInt(w.defaultDuration,10)||8)},[]),[ue,Pe]=s.useState(!1),[B,Be]=s.useState(null),[De,de]=s.useState(""),[i,v]=s.useState(""),[p,C]=s.useState((e==null?void 0:e.analysis)||null),be=hs(),W=s.useRef(null),Ne=s.useRef(null),Le=s.useRef(null),Te=s.useRef(!1),Bt=s.useMemo(()=>{if(Le.current&&URL.revokeObjectURL(Le.current),!U)return Le.current=null,null;const m=URL.createObjectURL(U);return Le.current=m,m},[U]);s.useEffect(()=>()=>{Le.current&&URL.revokeObjectURL(Le.current)},[]),s.useEffect(()=>{let m=!1;return(async()=>{var F,se,fe,Me;if(!e){if(B)return;C(null),I("prompt"),j(""),T(""),Y(zt),N({}),J(null),he(""),D(null),v("");return}if(C(e.analysis||null),ae(e.model||ia),f(e.modelRef||null),v(""),T(((F=e.productInfo)==null?void 0:F.videoStyle)||e.analysis.video_style||""),Y(((se=e.productInfo)==null?void 0:se.targetDuration)||e.analysis.totalDuration||zt),(fe=e.productInfo)!=null&&fe.videoModel){$(e.productInfo.videoModel),K(e.productInfo.videoModelRef||null);const Re=Xe(e.productInfo.videoModel);ye(e.productInfo.segmentDuration||parseInt(Re.defaultDuration,10)||8)}const w=e.sourceSnapshot;if((w==null?void 0:w.type)==="prompt"){I("prompt"),j(w.prompt||e.sourceLabel||""),N(wa((Me=e.productInfo)==null?void 0:Me.creativeBrief)),he(""),D(null),J(w.pdfCacheUrl?{cacheUrl:w.pdfCacheUrl,name:w.pdfName||"参考资料.pdf",size:w.pdfSize||0,mimeType:w.pdfMimeType||"application/pdf"}:null);return}if((w==null?void 0:w.type)==="upload"){I("upload"),j(""),N({}),J(null),he("");const Re=await sr(w);if(m)return;D(Re),Re||v("原上传视频缓存已失效,无法自动回填视频");return}if(e.source==="upload"){I("upload"),j(""),N({}),J(null),he(""),D(null),v("这条旧历史未保存原视频,无法自动回填视频");return}I("youtube"),j(""),N({}),J(null),D(null),(w==null?void 0:w.type)==="youtube"?he(w.youtubeUrl):e.source==="youtube"?he(e.sourceLabel||""):he("")})(),()=>{m=!0}},[e]);const Je=dt("text"),Ue=s.useMemo(()=>Je.filter(mr),[Je]),et=g!=="prompt"||!!L,Ke=s.useMemo(()=>et?Ue:Je,[Je,Ue,et]),Gt=s.useMemo(()=>{const m=be.find(_=>_.id===Jt);return!!(m!=null&&m.apiKey.trim())},[be]),mt=(pe==null?void 0:pe.profileId)===Jt,gt=s.useCallback(()=>{const m={action:"select",profileId:Jt};window.__aituPendingProviderNavigationIntent=m,window.dispatchEvent(new CustomEvent(ur,{detail:m})),k(_=>({..._,openSettings:!0}))},[k]);s.useEffect(()=>{if(Ke.length===0||Aa(Ke,me,pe))return;const _=Ke[0];R(_.id,za(_))},[Ke,me,pe,R]);const yt=s.useCallback(m=>{var w;const _=(w=m.target.files)==null?void 0:w[0];_&&(D(_),v(""),C(null))},[]),Ht=s.useCallback(m=>{m.preventDefault();const _=m.dataTransfer.files[0];_!=null&&_.type.startsWith("video/")&&(D(_),v(""),C(null))},[]),tt=s.useCallback(m=>{m.stopPropagation(),D(null),v(""),W.current&&(W.current.value="")},[]),bt=s.useCallback(()=>{const m=!B;J(_=>(m&&(_!=null&&_.cacheUrl)&&vt.deleteCache(_.cacheUrl).catch(()=>{}),null)),Ne.current&&(Ne.current.value="")},[B]),_t=s.useCallback(async m=>{var F;const _=(F=m.target.files)==null?void 0:F[0];if(m.target.value="",!_)return;if(!(_.type==="application/pdf"||_.name.toLowerCase().endsWith(".pdf"))){Se.warning("请上传 PDF 文件");return}if(_.size>dr){Se.warning("PDF 不能超过 20MB");return}if(Ue.length===0){Se.warning("PDF 入参需要 Gemini 文本模型,请先配置 Gemini 模型");return}try{const se=`video-prompt-pdf-${Wa()}.pdf`;await vt.cacheToCacheStorageOnly(se,_),J(fe=>(!B&&(fe!=null&&fe.cacheUrl)&&vt.deleteCache(fe.cacheUrl).catch(()=>{}),{cacheUrl:se,name:_.name,size:_.size,mimeType:_.type||"application/pdf"})),Se.success("PDF 已添加,将作为提示词上下文提交给 Gemini")}catch(se){Se.error(se instanceof Error?se.message:"PDF 上传失败")}},[Ue.length,B]),[Fe,at]=s.useState(!1),[It,je]=s.useState(""),st=s.useCallback(async(m,_)=>{at(!0),je("提取帧图片...");try{const w=_.map(se=>se.startTime),F=await $s(m,w,(se,fe)=>je(`提取帧图片 ${se}/${fe}`));return await Promise.all(_.map(async(se,fe)=>{const Me=F[fe];if(!Me)return se;try{const Re=await Bs(Me,se.id,"first");return{...se,generated_first_frame_url:Re}}catch{return se}}))}catch{return _}finally{at(!1),je("")}},[]),pt=s.useCallback(async()=>{if(!(Te.current||B)){Te.current=!0,Pe(!0),v(""),de("准备中...");try{let m={};if(g==="prompt"){const w=O.trim();if(!w){v("请输入提示词"),Te.current=!1,Pe(!1);return}if(L&&!Aa(Ue,me,pe)){const fe=Ue[0];fe&&R(fe.id,za(fe)),Se.warning("PDF 入参仅支持 Gemini 文本模型"),Te.current=!1,Pe(!1),de("");return}const F=wa(Q);m={prompt:vs({userPrompt:w,pdfAttachmentName:L==null?void 0:L.name,creativeBrief:F,videoStyle:S,videoModel:q,segmentDuration:ce,targetDuration:G}),model:me,modelRef:pe,taskLabel:`提示词生成:${w.slice(0,32)}`,videoAnalyzerAction:"prompt-generate",videoAnalyzerSource:"prompt",videoAnalyzerSourceLabel:w.slice(0,80),videoAnalyzerUserPrompt:w,videoAnalyzerSourceSnapshot:{type:"prompt",prompt:w,...L?{pdfCacheUrl:L.cacheUrl,pdfName:L.name,pdfMimeType:L.mimeType,pdfSize:L.size}:{}},videoAnalyzerProductInfo:{prompt:w,videoModel:q,videoModelRef:ee,targetDuration:G,segmentDuration:ce,videoStyle:S,creativeBrief:F},knowledgeContextRefs:ie,...L?{pdfCacheUrl:L.cacheUrl,pdfMimeType:L.mimeType,pdfName:L.name}:{}}}else if(g==="upload"&&U){de("缓存视频文件...");const w=await ar(U);m={videoCacheUrl:w.type==="upload"?w.cacheUrl:void 0,...w.type==="upload"?{mimeType:w.mimeType}:{},model:me,modelRef:pe,taskLabel:`分析视频:${U.name||"本地视频"}`,videoAnalyzerSource:"upload",videoAnalyzerSourceLabel:U.name||"本地视频",videoAnalyzerSourceSnapshot:w}}else if(g==="youtube"&&X)m={youtubeUrl:X,model:me,modelRef:pe,taskLabel:`分析视频:${X}`,videoAnalyzerSource:"youtube",videoAnalyzerSourceLabel:X,videoAnalyzerSourceSnapshot:{type:"youtube",youtubeUrl:X}};else{v("请先输入提示词、选择视频文件或输入 YouTube URL"),Te.current=!1,Pe(!1);return}$e.trackUIInteraction({area:"popular_video_tool",action:"video_analysis_started",control:"analyze_video",source:"video_analyzer_analyze_page",metadata:{inputMode:g,hasPrompt:!!O.trim(),hasPdfAttachment:!!L,hasUpload:!!U,hasYoutubeUrl:!!X,fileSizeBytes:U==null?void 0:U.size,hasModelRef:!!pe}}),de("加入任务队列...");const _=await Os.execute(m,{mode:"queue"});_.success&&_.taskId?(Be(_.taskId||null),de("已加入任务队列,等待分析...")):(Te.current=!1,v(_.error||"创建分析任务失败"))}catch(m){Te.current=!1,v(m.message||"分析失败")}finally{Pe(!1)}}},[g,U,X,O,S,q,ee,G,ce,Q,ie,L,B,me,pe,Ue,R]);s.useEffect(()=>{if(!B)return;const m=ze.observeTaskUpdates().subscribe(_=>{var w;if(_.task.id===B){if(_.task.status==="failed"){Te.current=!1,Be(null),de(""),v(((w=_.task.error)==null?void 0:w.message)||"分析失败");return}if(_.task.status==="completed"){Lt(_.task).then(async F=>{if(F&&(l(F.records),r(F.record),C(F.record.analysis),F.record.source==="upload"&&U&&F.record.analysis.shots.length>0)){const se=await st(U,F.record.analysis.shots);C(Me=>Me&&{...Me,shots:se});const fe=await xe(F.record.id,{editedShots:se});l(fe),r({...F.record,editedShots:se})}}).catch(F=>{v(F.message||"分析结果同步失败")}).finally(()=>{Te.current=!1,Be(null),de("")});return}typeof _.task.progress=="number"?de(`分析中 ${Math.round(_.task.progress)}%`):de("分析中,请耐心等待...")}});return()=>m.unsubscribe()},[B,r,l,U,st]);const Kt=s.useCallback(async()=>{var m;p&&(await Ot("text",$t(p.shots,p)),$e.trackUIInteraction({area:"popular_video_tool",action:"analysis_inserted_to_canvas",control:"insert_analysis",source:"video_analyzer_analyze_page",metadata:{shotCount:p.shots.length,productExposureRatio:p.productExposureRatio,characterCount:((m=p.characters)==null?void 0:m.length)||0}}))},[p]);return t.jsxs("div",{className:"va-page",children:[!p&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"va-tabs",children:[t.jsx("button",{className:`va-tab ${g==="prompt"?"active":""}`,onClick:()=>I("prompt"),children:"提示词生成"}),t.jsx("button",{className:`va-tab ${g==="upload"?"active":""}`,onClick:()=>I("upload"),children:"上传视频"}),t.jsx("button",{className:`va-tab ${g==="youtube"?"active":""}`,onClick:()=>I("youtube"),children:"YouTube URL"})]}),g==="prompt"?t.jsxs("div",{className:"va-prompt-start",children:[t.jsxs("div",{className:"va-context-panel",children:[t.jsxs("div",{className:"va-pdf-row",children:[t.jsx("input",{ref:Ne,type:"file",accept:"application/pdf,.pdf",onChange:_t,style:{display:"none"}}),t.jsx("button",{type:"button",className:"va-secondary-btn",onClick:()=>{var m;return(m=Ne.current)==null?void 0:m.click()},disabled:ue||!!B,children:L?"更换 PDF":"上传 PDF"}),L?t.jsxs("div",{className:"va-pdf-chip",children:[t.jsxs("span",{title:L.name,children:[L.name," · ",La(L.size)]}),t.jsx("button",{type:"button","aria-label":"移除 PDF",onClick:bt,disabled:ue||!!B,children:"×"})]}):t.jsx("span",{className:"va-pdf-hint",children:"可选,上传后仅支持 Gemini 模型,PDF 不超过 20MB"})]}),t.jsx(Ls,{value:ie,onChange:le,disabled:ue||!!B,className:"va-knowledge-context-selector"})]}),t.jsx(Ya,{value:Q,onChange:N,workflow:"popular_video",videoStyle:S,onVideoStyleChange:T}),t.jsx(qa,{selectedModel:q,selectedSelectionKey:Ee(q,ee),onSelectModel:Qe,models:A,segmentDuration:ce,durationOptions:Oe,onSegmentDurationChange:ye,targetDuration:G,onTargetDurationChange:m=>Y(Number.isFinite(m)&&m>0?m:zt),disabled:ue||!!B}),t.jsx("textarea",{className:"va-prompt-textarea",value:O,onChange:m=>{j(m.target.value),v(""),C(null)},placeholder:"输入产品、主题、受众、风格或爆款方向,可附带 PDF 作为上下文",rows:5})]}):g==="upload"?U?t.jsxs("div",{className:"va-video-preview",children:[t.jsx("video",{src:Bt,controls:!0,muted:!0,playsInline:!0}),t.jsx("button",{className:"va-video-preview-close",onClick:tt,children:"✕"}),t.jsxs("div",{className:"va-video-preview-info",children:[t.jsx("span",{className:"va-video-preview-name",children:U.name}),t.jsx("span",{className:"va-video-preview-size",children:La(U.size)})]}),t.jsx("input",{ref:W,type:"file",accept:"video/*",onChange:yt,style:{display:"none"}})]}):t.jsxs("div",{className:"va-dropzone",onDrop:Ht,onDragOver:m=>m.preventDefault(),onClick:()=>{var m;return(m=W.current)==null?void 0:m.click()},children:[t.jsx("input",{ref:W,type:"file",accept:"video/*",onChange:yt,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:X,onChange:m=>he(m.target.value)}),t.jsxs("div",{className:"va-analyze-control-row",children:[t.jsxs("div",{className:"va-model-select va-model-select--analysis",children:[t.jsx("label",{className:"va-model-label",children:"分析模型"}),t.jsx(Ft,{variant:"form",selectedModel:me,selectedSelectionKey:Ee(me,pe),onSelect:R,models:Ke,placement:"auto",disabled:ue,placeholder:et?"选择 Gemini 模型":"选择文本模型"})]}),t.jsx("button",{className:"va-analyze-btn va-analyze-btn--inline",onClick:pt,disabled:ue||!!B||(g==="prompt"?!O.trim():g==="upload"?!U:!X),children:ue||B?De||"分析中...":g==="prompt"?"生成提示词":"开始分析"})]}),et&&!mt&&t.jsxs("div",{className:"va-model-tip",children:[t.jsx("span",{children:"建议使用 gemini-mix 分组的gemini-3.1-pro-preview"}),!Gt&&t.jsx("button",{type:"button",className:"va-model-tip-link",onClick:gt,children:"去设置"})]}),i&&t.jsx("div",{className:"va-error",children:i})]}),p&&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:[p.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:p.shotCount}),t.jsx("span",{className:"va-stat-label",children:"镜头数"})]}),t.jsxs("div",{className:"va-stat",children:[t.jsxs("span",{className:"va-stat-value",children:[p.productExposureRatio,"%"]}),t.jsx("span",{className:"va-stat-label",children:"产品占比"})]}),t.jsxs("div",{className:"va-stat",children:[t.jsx("span",{className:"va-stat-value",children:p.aspect_ratio||"-"}),t.jsx("span",{className:"va-stat-label",children:"画面比例"})]})]}),(p.video_style||p.bgm_mood)&&t.jsxs("div",{className:"va-style-info",children:[p.video_style&&t.jsxs("span",{children:["风格: ",p.video_style]}),p.bgm_mood&&t.jsxs("span",{children:["BGM: ",p.bgm_mood]})]}),t.jsx("div",{className:"va-suggestion",children:p.suggestion}),t.jsx(er,{shots:p.shots,totalDuration:p.totalDuration}),t.jsx("div",{className:"va-shots",children:p.shots.map((m,_)=>t.jsx(va,{shot:m,index:_},m.id))}),t.jsxs("div",{className:"va-page-actions",children:[Fe&&t.jsx("span",{className:"va-frame-progress",children:It}),t.jsx("button",{onClick:Kt,children:"插入画布"}),t.jsx("button",{onClick:()=>{C(null)},children:"重新分析"}),h&&t.jsx("button",{onClick:h,children:"新建分析"}),c&&t.jsx("button",{className:"va-btn-primary",onClick:c,children:"下一步: 编辑脚本 →"})]})]})]})};function He(e){e.style.height="auto",e.style.height=e.scrollHeight+"px"}function We(e,r=30){if(!e)return 1;const l=e.split(`
|
|
2
|
-
`);let h=0;for(const c of l)h+=Math.max(1,Math.ceil(c.length/r));return Math.max(1,h)}function Ye(e){e&&He(e)}function Et(e){const r=Ut(e.productInfo||{prompt:""},e.analysis.totalDuration);return{...r,videoStyle:r.videoStyle??e.analysis.video_style??"",bgmMood:r.bgmMood??e.analysis.bgm_mood??""}}function qe(e,r,l){return e.find(h=>h.id===r)||l}const ua="video-analyzer:script-model",da="video-analyzer:video-model",Ua="gemini-3.1-pro-preview",$a="veo3",fr=["固定镜头 (Static)","缓慢推近 (Dolly In)","缓慢拉远 (Dolly Out)","水平平移 (Pan)","垂直摇移 (Tilt)","跟随拍摄 (Follow)","手持感 (Handheld)","环绕拍摄 (Orbit)","升降镜头 (Crane)","快速推移 (Zoom In)","快速拉远 (Zoom Out)","滑轨移动 (Slider)","航拍俯冲 (Drone Dive)","第一人称 (POV)"],hr=[{label:"无 (none)",value:"none"},{label:"仅旁白 (narration_only)",value:"narration_only"},{label:"仅对白 (dialogue_only)",value:"dialogue_only"},{label:"旁白+对白 (both)",value:"both"}],vr=[{label:"硬切 (cut)",value:"cut"},{label:"溶解 (dissolve)",value:"dissolve"},{label:"匹配切 (match_cut)",value:"match_cut"},{label:"淡出到黑 (fade_to_black)",value:"fade_to_black"}],gr=({record:e,onRecordUpdate:r,onRecordsChange:l,onNext:h})=>{var de;const[c,k]=s.useState(()=>Et(e)),[g,I]=s.useState(e.editedShots||[...e.analysis.shots]),[O,j]=s.useState(!1),[S,T]=s.useState(()=>e.pendingRewriteTaskId||null),[G,Y]=s.useState(""),[Q,N]=s.useState(""),[ie,le]=s.useState(!1),L=s.useRef(null),J=s.useRef(!1),[X,he]=s.useState(()=>we(ua,Ua).modelId),[U,D]=s.useState(()=>we(ua,Ua).modelRef),me=s.useCallback((i,v)=>{he(i),D(v||null),ut(ua,i,v)},[]),ae=dt("text"),pe=dt("video"),[f,R]=s.useState(()=>{var i;return((i=e.productInfo)==null?void 0:i.videoModel)||we(da,$a).modelId}),[A,q]=s.useState(()=>{var i,v;return((i=e.productInfo)==null?void 0:i.videoModelRef)||we(da,((v=e.productInfo)==null?void 0:v.videoModel)||$a).modelRef}),$=s.useCallback((i,v)=>{R(i),q(v||null),ut(da,i,v);const p=Xe(i),C=parseInt(p.defaultDuration,10)||8;k(be=>({...be,videoModel:i,videoModelRef:v||null,segmentDuration:C}))},[]),ee=s.useMemo(()=>Xe(f).durationOptions,[f]),K=s.useMemo(()=>{if(c.segmentDuration&&ee.some(p=>parseInt(p.value,10)===c.segmentDuration))return c.segmentDuration;const i=Xe(f);return parseInt(i.defaultDuration,10)||8},[c.segmentDuration,ee,f]),_e=s.useMemo(()=>{const i=c.targetDuration||e.analysis.totalDuration,v=[{label:`${K}秒`,value:String(K)}];return gs(i,v)},[K,c.targetDuration,e.analysis.totalDuration]),ce=s.useMemo(()=>e.characters||e.analysis.characters||[],[e.characters,e.analysis.characters]);s.useEffect(()=>{k(Et(e)),I(e.editedShots||[...e.analysis.shots]),T(e.pendingRewriteTaskId||null),Y(i=>e.pendingRewriteTaskId?i:"")},[e]);const ye=s.useRef();s.useEffect(()=>(clearTimeout(ye.current),ye.current=setTimeout(async()=>{const i=await xe(e.id,{productInfo:c});l(i),r(qe(i,e.id,{...e,productInfo:c,pendingRewriteTaskId:S}))},500),()=>clearTimeout(ye.current)),[c,S]);const Oe=s.useCallback(async i=>{I(i);const v=Ze(e,i),p=await xe(e.id,{...v,productInfo:c});l(p),r(qe(p,e.id,{...e,...v,productInfo:c,pendingRewriteTaskId:S}))},[e,c,S,r,l]),Qe=s.useCallback(async i=>{const v=await xe(e.id,i);l(v),r(qe(v,e.id,{...e,...i,productInfo:c,pendingRewriteTaskId:S}))},[e,c,S,r,l]),ue=s.useCallback((i,v,p)=>{const C=g.map(be=>be.id===i?{...be,[v]:p}:be);Oe(C)},[g,Oe]),Pe=s.useCallback((i,v)=>{const C=(e.characters||e.analysis.characters||[]).map(be=>be.id===i?{...be,description:v}:be);Qe({characters:C})},[e.characters,e.analysis.characters,Qe]),B=s.useCallback(async()=>{var i;if(!((i=c.prompt)!=null&&i.trim())){N("请填写提示词");return}if(!(J.current||S)){J.current=!0,j(!0),N(""),Y("AI 改编中 0%"),$e.trackUIInteraction({area:"popular_video_tool",action:"script_rewrite_started",control:"rewrite_script",source:"video_analyzer_script_page",metadata:{shotCount:g.length,promptLength:c.prompt.trim().length,hasModelRef:!!U}});try{const v=ys({recordAnalysis:e.analysis,productInfo:c,videoModel:f,characters:ce}),p=ze.createTask({prompt:`改编脚本:${c.prompt.slice(0,40)}`,model:X,modelRef:U||null,videoAnalyzerAction:"rewrite",videoAnalyzerPrompt:v,videoAnalyzerRecordId:e.id,autoInsertToCanvas:!1},ge.CHAT);T(p.id),Y(`AI 改编中 ${Math.round(p.progress??0)}%`);const C=await xe(e.id,{pendingRewriteTaskId:p.id});l(C),r(qe(C,e.id,{...e,pendingRewriteTaskId:p.id}))}catch(v){J.current=!1,N(v.message||"改编失败")}finally{j(!1)}}},[e,c,g,f,ce,X,U,r,l,S]);s.useEffect(()=>{var p;if(!S)return;const i=ze.getTask(S);if((i==null?void 0:i.status)==="failed"){J.current=!1,T(null),Y(""),N(((p=i.error)==null?void 0:p.message)||"改编失败"),xe(e.id,{pendingRewriteTaskId:null}).then(C=>{l(C),r(qe(C,e.id,{...e,pendingRewriteTaskId:null}))});return}if((i==null?void 0:i.status)==="completed"){Lt(i).then(C=>{if(!C){N("改编任务已完成,但未找到可回填的记录");return}l(C.records),r(C.record),k(Et(C.record)),I(C.record.editedShots||C.record.analysis.shots)}).catch(C=>{N(C.message||"改编结果同步失败")}).finally(()=>{J.current=!1,T(null),Y("")});return}typeof(i==null?void 0:i.progress)=="number"&&Y(`AI 改编中 ${Math.round(i.progress)}%`);const v=ze.observeTaskUpdates().subscribe(C=>{var be;if(C.task.id===S){if(C.task.status==="failed"){J.current=!1,T(null),Y(""),N(((be=C.task.error)==null?void 0:be.message)||"改编失败"),xe(e.id,{pendingRewriteTaskId:null}).then(W=>{l(W),r(qe(W,e.id,{...e,pendingRewriteTaskId:null}))});return}if(C.task.status==="completed"){Lt(C.task).then(W=>{if(!W){N("改编任务已完成,但未找到可回填的记录");return}l(W.records),r(W.record),k(Et(W.record)),I(W.record.editedShots||W.record.analysis.shots)}).catch(W=>{N(W.message||"改编结果同步失败")}).finally(()=>{J.current=!1,T(null),Y("")});return}typeof C.task.progress=="number"&&Y(`AI 改编中 ${Math.round(C.task.progress)}%`)}});return()=>v.unsubscribe()},[S,e.id,r,l]);const Be=s.useCallback(async()=>{await Ot("text",$t(g,e.analysis,c)),$e.trackUIInteraction({area:"popular_video_tool",action:"script_inserted_to_canvas",control:"insert_script",source:"video_analyzer_script_page",metadata:{shotCount:g.length}})},[g,c,e]),De=s.useCallback(async i=>{const v=Za(e,i);if(!v)return;le(!1),I(v.editedShots);const p=await xe(e.id,v);l(p),r(qe(p,e.id,{...e,...v}))},[e,r,l]);return s.useEffect(()=>{if(!ie)return;const i=v=>{L.current&&!L.current.contains(v.target)&&le(!1)};return document.addEventListener("mousedown",i),()=>document.removeEventListener("mousedown",i)},[ie]),t.jsxs("div",{className:"va-page",children:[t.jsxs("div",{className:"va-product-form",children:[t.jsx("textarea",{ref:Ye,className:"va-form-textarea va-auto-resize",placeholder:"描述你想要的视频内容,如:拖鞋,生活用品,主打防滑...",rows:Math.max(3,We(c.prompt)),value:c.prompt,onChange:i=>k(v=>({...v,prompt:i.target.value})),onInput:i=>He(i.currentTarget)}),t.jsx(Ya,{value:c.creativeBrief,onChange:i=>k(v=>({...v,creativeBrief:i})),videoStyle:c.videoStyle||"",onVideoStyleChange:i=>k(v=>({...v,videoStyle:i}))}),t.jsx("div",{className:"va-form-row",children:t.jsxs("div",{style:{flex:1},children:[t.jsx("label",{className:"va-edit-label",children:"BGM 情绪"}),t.jsx("textarea",{ref:Ye,className:"va-edit-textarea va-auto-resize",rows:We(c.bgmMood),value:c.bgmMood||"",onChange:i=>k(v=>({...v,bgmMood:i.target.value})),onInput:i=>He(i.currentTarget),placeholder:"如:轻快、治愈、科技感"})]})}),t.jsxs("div",{className:"va-model-select",children:[t.jsx("label",{className:"va-model-label",children:"改编模型"}),t.jsx(Ft,{variant:"form",selectedModel:X,selectedSelectionKey:Ee(X,U),onSelect:me,models:ae,placement:"down",disabled:O,placeholder:"选择文本模型"})]}),t.jsx(qa,{selectedModel:f,selectedSelectionKey:Ee(f,A),onSelectModel:$,models:pe,segmentDuration:K,durationOptions:ee,onSegmentDurationChange:i=>k(v=>({...v,segmentDuration:i})),targetDuration:c.targetDuration??e.analysis.totalDuration,onTargetDurationChange:i=>k(v=>({...v,targetDuration:i||void 0})),disabled:O,placement:"down",overflowText:_e.overflow>0?`实际 ${_e.actualTotal}s(+${parseFloat(_e.overflow.toFixed(2))}s)`:void 0}),t.jsxs("div",{className:"va-version-row",children:[t.jsx("button",{className:"va-analyze-btn",onClick:B,disabled:O||!!S,style:{flex:1},children:O||S?G||"AI 改编中...":"AI 改编脚本"}),e.scriptVersions&&e.scriptVersions.length>0&&t.jsxs("div",{className:"va-version-select",ref:L,children:[t.jsxs("button",{className:"va-version-btn",onClick:()=>le(i=>!i),children:[e.activeVersionId===ea?"原始分析":((de=e.scriptVersions.find(i=>i.id===e.activeVersionId))==null?void 0:de.label)||`v${e.scriptVersions.length}`," ▾"]}),ie&&t.jsxs("div",{className:"va-version-menu",children:[e.scriptVersions.map(i=>t.jsxs("div",{className:`va-version-item ${i.id===e.activeVersionId?"active":""}`,onClick:()=>De(i.id),children:[t.jsx("span",{children:i.label}),i.prompt&&t.jsx("span",{className:"va-version-prompt",children:i.prompt.length>30?i.prompt.slice(0,30)+"...":i.prompt}),t.jsxs("span",{className:"va-version-time",children:[i.shots.length," 镜头 · ",new Date(i.createdAt).toLocaleTimeString()]})]},i.id)),t.jsxs("div",{className:`va-version-item ${e.activeVersionId===ea||!e.activeVersionId?"active":""}`,onClick:()=>De(ea),children:[t.jsx("span",{children:"原始分析"}),t.jsxs("span",{className:"va-version-time",children:[e.analysis.shots.length," 镜头 · ",new Date(e.createdAt).toLocaleTimeString()]})]})]})]})]}),Q&&t.jsx("div",{className:"va-error",children:Q})]}),t.jsx(bs,{characters:ce,onChange:Pe}),t.jsx("div",{className:"va-shots",children:g.map((i,v)=>t.jsx(va,{shot:i,index:v,compact:!0,children:t.jsxs("div",{className:"va-edit-fields",children:[t.jsx("label",{className:"va-edit-label",children:"画面描述"}),t.jsx("textarea",{ref:Ye,className:"va-edit-textarea va-auto-resize",rows:We(i.description),value:i.description||"",onChange:p=>ue(i.id,"description",p.target.value),onInput:p=>He(p.currentTarget)}),t.jsx("label",{className:"va-edit-label",children:"旁白"}),t.jsx("textarea",{ref:Ye,className:"va-edit-textarea va-auto-resize",rows:We(i.narration),value:i.narration||"",onChange:p=>ue(i.id,"narration",p.target.value),onInput:p=>He(p.currentTarget)}),t.jsx("label",{className:"va-edit-label",children:"角色说话"}),t.jsx("textarea",{ref:Ye,className:"va-edit-textarea va-auto-resize",rows:We(i.dialogue),value:i.dialogue||"",onChange:p=>ue(i.id,"dialogue",p.target.value),onInput:p=>He(p.currentTarget),placeholder:'多角色时按"角色名: 台词"分行'}),t.jsx("label",{className:"va-edit-label",children:"对白角色"}),t.jsx("input",{className:"va-form-input",type:"text",value:i.dialogue_speakers||"",onChange:p=>ue(i.id,"dialogue_speakers",p.target.value),placeholder:"如:主讲人 或 主讲人|顾客"}),t.jsx("label",{className:"va-edit-label",children:"旁白/对白关系"}),t.jsx(ta,{value:i.speech_relation||"",onChange:p=>ue(i.id,"speech_relation",p),options:hr,placeholder:"选择关系"}),t.jsx("label",{className:"va-edit-label",children:"运镜方式"}),t.jsx(ta,{value:i.camera_movement||"",onChange:p=>ue(i.id,"camera_movement",p),options:fr,placeholder:"选择或输入运镜方式"}),t.jsx("label",{className:"va-edit-label",children:"首帧 Prompt"}),t.jsx("textarea",{ref:Ye,className:"va-edit-textarea va-auto-resize",rows:We(i.first_frame_prompt),value:i.first_frame_prompt||"",onChange:p=>ue(i.id,"first_frame_prompt",p.target.value),onInput:p=>He(p.currentTarget)}),t.jsx("label",{className:"va-edit-label",children:"尾帧 Prompt"}),t.jsx("textarea",{ref:Ye,className:"va-edit-textarea va-auto-resize",rows:We(i.last_frame_prompt),value:i.last_frame_prompt||"",onChange:p=>ue(i.id,"last_frame_prompt",p.target.value),onInput:p=>He(p.currentTarget)}),t.jsx("label",{className:"va-edit-label",children:"转场方式"}),t.jsx(ta,{value:i.transition_hint||"",onChange:p=>ue(i.id,"transition_hint",p),options:vr,placeholder:"选择转场方式"})]})},i.id))}),t.jsxs("div",{className:"va-page-actions",children:[t.jsx("button",{onClick:Be,children:"脚本插入画布"}),h&&t.jsx("button",{className:"va-btn-primary",onClick:h,children:"下一步:批量生成 →"})]})]})};function yr(e,r,l){var h,c,k,g,I;return{recordId:e.id,fileNamePrefix:"va",zipBaseName:"video_analyzer_assets",scriptMarkdown:$t(r,e.analysis,e.productInfo),recordMeta:{id:e.id,source:e.source,sourceLabel:e.sourceLabel,prompt:((h=e.productInfo)==null?void 0:h.prompt)||"",aspectRatio:e.analysis.aspect_ratio||"16x9",videoStyle:((c=e.productInfo)==null?void 0:c.videoStyle)||e.analysis.video_style||"",bgmMood:((k=e.productInfo)==null?void 0:k.bgmMood)||e.analysis.bgm_mood||"",creativeBrief:((g=e.productInfo)==null?void 0:g.creativeBrief)||{},creativeBriefSummary:_s((I=e.productInfo)==null?void 0:I.creativeBrief),shotCount:r.length},shots:r,assets:l}}function br(e,r){const l=e.characters||e.analysis.characters||[];return Gs(r,l)}const Dt="video-analyzer:image-model",Rt="video-analyzer:video-model";function Ba(e,r){const l=Object.keys(e),h=Object.keys(r);return l.length!==h.length?!1:l.every(c=>e[c]===r[c])}function Ga(e,r){return r.reduce((l,h)=>{var g;const c=e[h.id];return(h.valueType==="enum"?(g=h.options)==null?void 0:g.some(I=>I.value===c):typeof c=="string"&&c.trim()!=="")&&c?(l[h.id]=c,l):(h.defaultValue&&(l[h.id]=h.defaultValue),l)},{})}function Ha(e,r,l){return{...e,...r!=null?{duration:String(r)}:{},...l?{size:l}:{}}}function Ka(e,r,l){const{duration:h,size:c,...k}=e;return{extraParams:k,duration:h||r,size:c||l}}function _r(e){if(!e||e==="auto")return;const r=e.trim().replace(/[xX]/g,":");return/^\d+:\d+$/.test(r)?r:void 0}const ma=({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"})]}),Ir=({record:e,onRecordUpdate:r,onRecordsChange:l,onRestart:h})=>{const c=s.useMemo(()=>e.editedShots||e.analysis.shots,[e.editedShots,e.analysis.shots]),k=e.analysis.aspect_ratio||"16x9",g=e.batchId||`va_${e.id}`,{openDialog:I,board:O}=ha(),j=s.useRef(e),S=s.useRef(c),T=s.useRef(!1),G=s.useRef(!1),Y=s.useRef(null),Q=s.useRef(null),N=s.useRef(new Set),ie=s.useRef(new Set),[le,L]=s.useState([]),[J,X]=s.useState(null),he=dt("image"),U=dt("video"),[D,me]=s.useState(()=>we(Dt,"").modelId),[ae,pe]=s.useState(()=>we(Dt,"").modelRef),[f,R]=s.useState(()=>{const a=we(Dt,"");return a.modelId?Da(a.modelId,Ee(a.modelId,a.modelRef)).extraParams:{}}),[A,q]=s.useState(()=>{var a;return((a=e.productInfo)==null?void 0:a.videoModel)||we(Rt,"veo3").modelId}),[$,ee]=s.useState(()=>{var a,n;return((a=e.productInfo)==null?void 0:a.videoModelRef)||we(Rt,((n=e.productInfo)==null?void 0:n.videoModel)||"veo3").modelRef}),[K,_e]=s.useState(()=>{var y,d,M,x,E;const a=we(Rt,((y=e.productInfo)==null?void 0:y.videoModel)||"veo3"),n=((d=e.productInfo)==null?void 0:d.videoModel)||a.modelId,o=((M=e.productInfo)==null?void 0:M.videoModelRef)||a.modelRef,u=Ra(n,Ee(n,o));return Ha(u.extraParams,((x=e.productInfo)==null?void 0:x.segmentDuration)||u.duration,Ma(n,((E=e.productInfo)==null?void 0:E.videoSize)||u.size,k))}),[ce,ye]=s.useState({running:!1,stopping:!1,currentIndex:-1,retryCount:0,completedCount:0,activeCount:0}),[Oe,Qe]=s.useState(!1),ue=s.useMemo(()=>Is(D),[D]),Pe=s.useMemo(()=>xs(A,$||A,K),[A,$,K]),B=s.useMemo(()=>Ss(A,$||A,K),[A,$,K]),Be=s.useMemo(()=>B.sizeOptions,[B]),De=s.useMemo(()=>Ka(K,B.defaultDuration,B.defaultSize),[B.defaultDuration,B.defaultSize,K]),de=De.size,i=Number.parseFloat(De.duration)||8,v=s.useMemo(()=>Object.keys(f).length>0?f:void 0,[f]),p=s.useMemo(()=>e.characters||e.analysis.characters||[],[e.characters,e.analysis.characters]),C=s.useMemo(()=>{const a=e.sourceSnapshot,o=((a==null?void 0:a.type)==="prompt"?a.prompt:"")||(e.source==="prompt"?e.sourceLabel:""),u=[e.source!=="prompt"&&e.sourceLabel?`素材来源:${e.sourceLabel}`:"",(a==null?void 0:a.type)==="prompt"&&a.pdfName?`参考 PDF:${a.pdfName}`:""].filter(Boolean).join(`
|
|
3
|
-
`);return{...e.productInfo||{},generationTopic:o,generationContext:u,generationAdvice:e.analysis.suggestion||""}},[e.analysis.suggestion,e.productInfo,e.source,e.sourceLabel,e.sourceSnapshot]),be=s.useMemo(()=>Hs(c),[c]);s.useEffect(()=>{j.current=e},[e]),s.useEffect(()=>{S.current=c},[c]);const W=s.useCallback(async a=>{const n=j.current,o={...n,...a};j.current=o,o.editedShots&&(S.current=o.editedShots);const u=await xe(n.id,a);return l(u),r(o),o},[r,l]),Ne=s.useCallback(async a=>{const n=j.current,o=Ze(n,a);return S.current=a,await W(o),a},[W]),Le=s.useCallback(async a=>{const n=j.current,o={...Ut(n.productInfo||{prompt:""},n.analysis.totalDuration),...a};return await W({productInfo:o}),o},[W]),Te=s.useCallback(async(a,n)=>{const o=j.current,y=(o.characters||o.analysis.characters||[]).map(d=>d.id===a?{...d,referenceImageUrl:n}:d);await W({characters:y})},[W]),Bt=s.useCallback(a=>{const n=`va_${e.id}_char${a.id}_ref`,o=ka(a,e.analysis,C);I(Tt.aiImageGeneration,{initialPrompt:o,batchId:n,initialAspectRatio:"1:1",initialModel:D||void 0,initialModelRef:ae,assetMetadata:{category:aa.CHARACTER,characterName:a.name,characterPrompt:o}})},[C,e.analysis,e.id,I,D,ae]),Je=s.useCallback((a,n)=>{const o=n||null;me(a),pe(o),R(Da(a,Ee(a,o)).extraParams),ut(Dt,a,n)},[]),Ue=s.useCallback((a,n)=>{const o=n||null;q(a),ee(o),ut(Rt,a,n);const u=Ra(a,Ee(a,o));_e(Ha(u.extraParams,u.duration,Ma(a,u.size,k)))},[k]),et=s.useCallback((a,n)=>{R(o=>{const u={...o};return!n||n==="default"?delete u[a]:u[a]=n,u})},[]),Ke=s.useCallback((a,n)=>{_e(o=>{const u={...o};return!n||n==="default"?delete u[a]:u[a]=n,u})},[]);s.useEffect(()=>{const a=Ga(f,ue);Ba(f,a)||R(a)},[ue,f]),s.useEffect(()=>{const a=Ga(K,Pe);Ba(K,a)||_e(a)},[Pe,K]),s.useEffect(()=>{const a=Ka(K,B.defaultDuration,B.defaultSize);Zs({currentModel:A,currentSelectionKey:Ee(A,$),extraParams:a.extraParams,duration:a.duration,size:a.size}),Le({videoModel:A,videoModelRef:$||null,segmentDuration:Number.parseFloat(a.duration)||8,videoSize:a.size})},[Le,A,B.defaultDuration,B.defaultSize,$,K]);const Gt=s.useCallback(async()=>{try{const a=j.current,n=S.current;if(!O)throw new Error("画布未就绪");Ea(O);const o=await Ot("text",$t(n,a.analysis,a.productInfo));if(!o.success)throw new Error(o.error||"插入失败,请确认画布已打开");$e.trackUIInteraction({area:"popular_video_tool",action:"script_inserted_to_canvas",control:"insert_script",source:"video_analyzer_generate_page",metadata:{shotCount:n.length}}),Se.success("脚本已插入画布")}catch(a){console.error("[VideoAnalyzer] Failed to insert script to canvas:",a);const n=a instanceof Error?a.message:"脚本插入画布失败";Se.error(n)}},[O]),mt=s.useCallback(async a=>{if(!O)return!1;try{Ea(O);const n=await Ot("video",a);if(!n.success)throw new Error(n.error||"插入失败,请确认画布已打开");return!0}catch(n){return console.error("[VideoAnalyzer] Failed to insert generated video to canvas:",n),!1}},[O]),{isExportingAssets:gt,exportProgress:yt,handleExportAssets:Ht}=Cs({onExport:async a=>{const n=j.current,o=S.current;return await qs({...yr(n,o,be),onProgress:a})},onExportSuccess:a=>{Se.success(`素材导出完成,共 ${a.assetCount} 个文件`)},onExportError:a=>{console.error("[VideoAnalyzer] Failed to export assets:",a),Se.error("素材导出失败")}}),tt=s.useMemo(()=>le.map(a=>a.url).filter(Boolean),[le]),bt=s.useCallback(async()=>{e.batchId||await W({batchId:g})},[e.batchId,g,W]),{tasks:_t}=Xa(),Fe=s.useRef(new Set),at=s.useRef(new Set),It=s.useCallback(async(a,n,o)=>{let u=[...n],y=!1;for(const{shotId:d,videoUrl:M}of o){const x=`auto_${d}`;if(!at.current.has(x)){at.current.add(x);try{const E=u.findIndex(b=>b.id===d);if(E===-1)continue;const z=u[E+1];if(!z)continue;const Z=await Ks(M,z.id,"first","last");if(!Z||z.generated_first_frame_url===Z)continue;u=u.map((b,P)=>P===E+1?{...b,generated_first_frame_url:Z}:b),y=!0}finally{at.current.delete(x)}}}if(y){const d=e;xe(a,Ze(d,u)).then(M=>{l(M),r({...d,editedShots:u})})}},[e,r,l]);s.useEffect(()=>{var x,E,z,Z;const a=`va_${e.id}_shot`,n=`va_${e.id}_char`;let o=!1;const u=e,y=j.current.generatedAssetsResetAt||u.generatedAssetsResetAt;let d=u.editedShots||u.analysis.shots;const M=[];for(const b of _t){if(b.status!==Ve.COMPLETED||Fe.current.has(b.id))continue;const P=(x=b.params)==null?void 0:x.batchId;if(!P)continue;if(P.startsWith(n)){if(y&&b.createdAt<=y){Fe.current.add(b.id);continue}const re=(E=b.result)==null?void 0:E.url;if(Fe.current.add(b.id),re){const ke=P.slice(n.length),it=ke.lastIndexOf("_ref");if(it!==-1){const Pt=ke.slice(0,it),os=(j.current.characters||j.current.analysis.characters||[]).map(Qt=>Qt.id===Pt?{...Qt,referenceImageUrl:re}:Qt);W({characters:os})}}continue}if(!P.startsWith(a))continue;if(y&&b.createdAt<=y){Fe.current.add(b.id);continue}if(e.storyboardGeneratedAt&&b.createdAt<e.storyboardGeneratedAt){Fe.current.add(b.id);continue}const H=(z=b.result)==null?void 0:z.url;if(!H)continue;const te=P.slice(a.length),ne=te.lastIndexOf("_");if(ne===-1)continue;const oe=te.slice(0,ne),V=te.slice(ne+1);if(V!=="first"&&V!=="last"&&V!=="video")continue;const Ae=V==="first"?"generated_first_frame_url":V==="last"?"generated_last_frame_url":"generated_video_url",Ce=d.find(re=>re.id===oe),Ie=V==="video"&&ie.current.has(b.id),ve=(Z=Ce==null?void 0:Ce.suppressed_generated_urls)==null?void 0:Z[V];if(ve&&ve===H){Ie&&ie.current.delete(b.id),Fe.current.add(b.id);continue}if(!Ce||Ce[Ae]===H){Ie&&ie.current.delete(b.id),Fe.current.add(b.id);continue}d=d.map(re=>re.id===oe?{...re,[Ae]:H,suppressed_generated_urls:re.suppressed_generated_urls?{...re.suppressed_generated_urls,[V]:void 0}:void 0}:re),Fe.current.add(b.id),o=!0,V==="video"&&(Ie?ie.current.delete(b.id):M.push({shotId:oe,videoUrl:H}))}o&&xe(u.id,Ze(u,d)).then(b=>{l(b),r({...u,editedShots:d})}),M.length>0&&!G.current&&It(u.id,d,M)},[_t,It,e,r,l,W]);const[je,st]=s.useState(null),pt=s.useCallback((a,n)=>{st({shotId:a,assetType:n})},[]),Kt=s.useCallback(async a=>{if(!je)return;st(null);const{shotId:n,assetType:o}=je,u=o==="first"?"generated_first_frame_url":o==="last"?"generated_last_frame_url":"generated_video_url",d=(e.editedShots||e.analysis.shots).map(x=>x.id===n?{...x,[u]:a.url}:x),M=await xe(e.id,Ze(e,d));l(M),r({...e,editedShots:d})},[je,e,l,r]),[m,_]=s.useState(null),w=s.useRef(null),F=s.useCallback(()=>{w.current!==null&&(window.clearTimeout(w.current),w.current=null)},[]),se=s.useCallback(()=>{F(),_(null)},[F]),fe=s.useCallback(()=>{F(),w.current=window.setTimeout(()=>{w.current=null,_(null)},120)},[F]),Me=s.useCallback((a,n,o)=>{F();const u=o.currentTarget.getBoundingClientRect();_({url:a,type:n,x:u.left+u.width/2,y:u.top-8})},[F]),Re=s.useCallback(()=>{fe()},[fe]),ts=s.useCallback(()=>{F()},[F]),as=s.useCallback(()=>{se()},[se]);s.useEffect(()=>()=>{F()},[F]);const ft=s.useMemo(()=>{var n;const a=(n=Be.find(o=>o.value===de))==null?void 0:n.aspectRatio;if(a)return a;if(de!=null&&de.includes("x")){const[o,u]=de.split("x").map(Number);if(o&&u){const y=(M,x)=>x===0?M:y(x,M%x),d=y(o,u);return`${o/d}:${u/d}`}}return k.replace("x",":")},[k,Be,de]),Wt=ft,rt=_r(f.size),xt=f.size||Wt;s.useEffect(()=>{D&&Xs({currentModel:D,currentSelectionKey:Ee(D,ae),extraParams:f,aspectRatio:rt||Wt})},[Wt,D,ae,f,rt]);const Ge=s.useCallback(a=>a.map(n=>({url:n.url,name:n.name})),[]),St=s.useCallback((a=[],n=[])=>a.length===n.length&&a.every((o,u)=>{var y,d;return o.url===((y=n[u])==null?void 0:y.url)&&o.name===((d=n[u])==null?void 0:d.name)}),[]),Ct=s.useCallback((...a)=>{const n=new Set,o=[];return a.forEach(u=>{u==null||u.forEach(y=>{var M;const d=(M=y.url)==null?void 0:M.trim();!d||n.has(d)||(n.add(d),o.push({url:d,name:y.name||"参考图"}))})}),o.length>0?o:void 0},[]),wt=s.useCallback(a=>{var o;if(!((o=a.character_ids)!=null&&o.length))return[];const n=new Set;return a.character_ids.reduce((u,y)=>{var x;const d=p.find(E=>E.id===y),M=(x=d==null?void 0:d.referenceImageUrl)==null?void 0:x.trim();return!M||n.has(M)||(n.add(M),u.push({url:M,name:d!=null&&d.name?`角色:${d.name}`:"角色参考图"})),u},[])},[p]),nt=s.useCallback(async(a,n,o)=>{let u=!1;const y=Ge(o.images),d=S.current.map(M=>{if(M.id!==a)return M;if(n==="first"){const z=M.first_frame_draft,Z={prompt:o.prompt,images:y,aspectRatio:o.aspectRatio};return(z==null?void 0:z.prompt)===Z.prompt&&(z==null?void 0:z.aspectRatio)===Z.aspectRatio&&St(z==null?void 0:z.images,Z.images)?M:(u=!0,{...M,first_frame_draft:Z})}if(n==="last"){const z=M.last_frame_draft,Z={prompt:o.prompt,images:y,aspectRatio:o.aspectRatio};return(z==null?void 0:z.prompt)===Z.prompt&&(z==null?void 0:z.aspectRatio)===Z.aspectRatio&&St(z==null?void 0:z.images,Z.images)?M:(u=!0,{...M,last_frame_draft:Z})}const x=M.video_draft,E={prompt:o.prompt,images:y,duration:o.duration,size:o.size};return(x==null?void 0:x.prompt)===E.prompt&&(x==null?void 0:x.duration)===E.duration&&(x==null?void 0:x.size)===E.size&&St(x==null?void 0:x.images,E.images)?M:(u=!0,{...M,video_draft:E})});u&&await Ne(d)},[Ne,St,Ge]),Yt=s.useCallback(a=>{const n=a.first_frame_prompt||a.description||"";if(!n)return;$e.trackUIInteraction({area:"popular_video_tool",action:"shot_first_frame_generation_opened",control:"generate_first_frame",source:"video_analyzer_generate_page",metadata:{shotId:a.id,hasDraft:!!a.first_frame_draft}});const o=sa(n,e.analysis,C,{shot:a,characters:p}),u=a.first_frame_draft,y=u?Ge(u.images||[]):void 0,d=!u&&a.generated_first_frame_url?[{url:a.generated_first_frame_url,name:"首帧"}]:void 0,M=wt(a),x=`va_${e.id}_shot${a.id}_first`;I(Tt.aiImageGeneration,{initialPrompt:(u==null?void 0:u.prompt)||o,batchId:x,initialAspectRatio:(u==null?void 0:u.aspectRatio)??rt,initialModel:D||void 0,initialModelRef:ae,initialImages:Ct(y,d,M),onDraftChange:E=>nt(a.id,"first",E)})},[e,C,p,I,D,ae,Ct,wt,nt,rt,Ge]),ht=s.useCallback((a,n)=>{if(a.generated_last_frame_url)return a.generated_last_frame_url;const o=c[n+1];return o==null?void 0:o.generated_first_frame_url},[c]),jt=s.useCallback((a,n)=>{const o=a.last_frame_prompt||"";if(!o)return;$e.trackUIInteraction({area:"popular_video_tool",action:"shot_last_frame_generation_opened",control:"generate_last_frame",source:"video_analyzer_generate_page",metadata:{shotId:a.id,shotIndex:n,hasDraft:!!a.last_frame_draft}});const u=sa(o,e.analysis,C,{shot:a,characters:p}),y=a.last_frame_draft,d=y?Ge(y.images||[]):void 0,M=`va_${e.id}_shot${a.id}_last`,x=ht(a,n),E=!y&&x?[{url:x,name:"尾帧"}]:void 0,z=wt(a);I(Tt.aiImageGeneration,{initialPrompt:(y==null?void 0:y.prompt)||u,batchId:M,initialAspectRatio:(y==null?void 0:y.aspectRatio)??rt,initialModel:D||void 0,initialModelRef:ae,initialImages:Ct(d,E,z),onDraftChange:Z=>nt(a.id,"last",Z)})},[e,C,p,I,ht,D,ae,Ct,wt,nt,rt,Ge]),qt=s.useCallback((a,n)=>{$e.trackUIInteraction({area:"popular_video_tool",action:"shot_video_generation_opened",control:"generate_shot_video",source:"video_analyzer_generate_page",metadata:{shotId:a.id,shotIndex:n,hasDraft:!!a.video_draft}});const o=a.video_draft,u=`va_${e.id}_shot${a.id}_video`,y=[];a.generated_first_frame_url&&y.push({url:a.generated_first_frame_url,name:"首帧"});const d=ht(a,n);d&&y.push({url:d,name:"尾帧"});const M=Ge((o==null?void 0:o.images)||[]),x=M.length>0?M:y.length>0?y:void 0,E=Na(a,e.analysis,C,{referenceImageDescriptions:ws(x)});if(!E)return;const z=String((o==null?void 0:o.duration)??i),Z=B.durationOptions.some(P=>P.value===z)?(o==null?void 0:o.duration)??i:void 0,b=B.sizeOptions.some(P=>P.value===((o==null?void 0:o.size)??de))?(o==null?void 0:o.size)??de:void 0;I(Tt.aiVideoGeneration,{initialPrompt:(o==null?void 0:o.prompt)||E,initialImages:x,initialDuration:Z,initialSize:b,initialModel:A||void 0,initialModelRef:$,batchId:u,onDraftChange:P=>nt(a.id,"video",P)})},[e.id,i,de,A,B,$,I,ht,e.analysis,C,nt,Ge]),Zt=s.useCallback((a,n)=>{const o=n==="first"?"generated_first_frame_url":n==="last"?"generated_last_frame_url":"generated_video_url",y=(e.editedShots||e.analysis.shots).map(d=>d.id===a?{...d,[o]:void 0,suppressed_generated_urls:d[o]?{...d.suppressed_generated_urls||{},[n]:d[o]}:d.suppressed_generated_urls}:d);xe(e.id,Ze(e,y)).then(d=>{l(d),r({...e,editedShots:y})})},[e,r,l]),Mt=s.useCallback(async(a,n,o)=>{var b,P,H;const u=o==="first"?a.first_frame_prompt||a.description||"":a.last_frame_prompt||"";if(!u)return null;const y=sa(u,e.analysis,C,{shot:a,characters:n}),d=[...tt];if(a.character_ids&&a.character_ids.length>0)for(const te of a.character_ids){const ne=n.find(oe=>oe.id===te);ne!=null&&ne.referenceImageUrl&&!d.includes(ne.referenceImageUrl)&&d.push(ne.referenceImageUrl)}const M=`va_${e.id}_shot${a.id}_${o}`,x=await na.executeTool({name:"generate_image",arguments:{prompt:y.trim(),count:1,size:xt,referenceImages:d.length>0?d:void 0,batchId:M,...D?{model:D,modelRef:ae}:{},...v?{params:v}:{}}},{mode:"queue"}),E=x.taskId||((b=x.data)==null?void 0:b.taskId);if(!x.success||!E)return null;N.current.add(E),Q.current=E,ye(te=>({...te,activeCount:N.current.size}));let z;try{z=await oa(E,(P=Y.current)==null?void 0:P.signal)}finally{N.current.delete(E),Q.current===E&&(Q.current=null),ye(te=>({...te,activeCount:N.current.size}))}if(!z.success)return null;const Z=z.task||ze.getTask(E);return((H=Z==null?void 0:Z.result)==null?void 0:H.url)||null},[e,C,v,xt,D,ae,tt]),ga=s.useCallback((a,n)=>Mt(a,n,"first"),[Mt]),ya=s.useCallback((a,n)=>Mt(a,n,"last"),[Mt]),ba=s.useCallback(async(a,n)=>{const o=S.current,u=o.find(d=>d.id===a);if(!u||u.generated_first_frame_url===n)return o;const y=o.map(d=>d.id===a?{...d,generated_first_frame_url:n}:d);return await Ne(y),y},[Ne]),_a=s.useCallback(async(a,n)=>{const o=S.current,u=o.find(d=>d.id===a);if(!u||u.generated_last_frame_url===n)return o;const y=o.map(d=>d.id===a?{...d,generated_last_frame_url:n}:d);return await Ne(y),y},[Ne]),ot=s.useCallback(a=>S.current.find(n=>n.id===a),[]),Ia=s.useCallback(async(a,n)=>{const o=S.current.find(y=>y.id===a);if(!o||o.generated_video_url===n)return S.current;const u=S.current.map(y=>y.id===a?{...y,generated_video_url:n}:y);return await Ne(u),u},[Ne]),xa=s.useCallback(async(a,n)=>{var b;const o=a.generated_first_frame_url,u=n||a.generated_last_frame_url,{referenceImages:y,referenceImageDescriptions:d}=Ws({model:A,firstFrameUrl:o,lastFrameUrl:u,extraReferenceUrls:tt}),M=Na(a,e.analysis,C,{referenceImageDescriptions:d});if(!M)return null;const x=`va_${e.id}_shot${a.id}_video`,E={...De.extraParams,...B.provider==="seedance"?{aspect_ratio:ft}:{}},z=await na.executeTool({name:"generate_video",arguments:{prompt:M,size:De.size,seconds:De.duration,count:1,batchId:x,model:A,modelRef:$,referenceImages:y,params:Object.keys(E).length>0?E:void 0}},{mode:"queue"}),Z=z.taskId||((b=z.data)==null?void 0:b.taskId);if(!z.success||!Z)throw new Error(z.error||"创建视频任务失败");return Z},[e.analysis,e.id,C,tt,De,A,B.provider,$,ft]),ss=s.useCallback(()=>{var a;T.current=!0,ye(n=>n.running?{...n,stopping:!0}:n),Q.current&&ze.cancelTask(Q.current);for(const n of N.current)ze.cancelTask(n);(a=Y.current)==null||a.abort()},[]),kt=s.useCallback(()=>{ye(a=>({...a,activeCount:N.current.size}))},[]),Xt=s.useCallback((a,n)=>{ye(o=>({...o,currentIndex:a,retryCount:n,activeCount:N.current.size}))},[]);s.useEffect(()=>()=>{var a;T.current=!0,(a=Y.current)==null||a.abort()},[]);const rs=s.useCallback(async()=>{var n,o;if(G.current||ce.running)return;G.current=!0,$e.trackUIInteraction({area:"popular_video_tool",action:"batch_video_generation_started",control:"generate_all_videos",source:"video_analyzer_generate_page",metadata:{shotCount:S.current.length,insertToCanvasRequested:Oe,hasBoard:!!O}});let a=Oe;a&&!O&&(Se.warning("画布未就绪,本次将只生成不插入画布"),a=!1),await bt(),T.current=!1,Y.current=new AbortController,Q.current=null,ye({running:!0,stopping:!1,currentIndex:-1,retryCount:0,completedCount:0,activeCount:0});try{const y=(j.current.characters||j.current.analysis.characters||[]).filter(b=>!b.referenceImageUrl);if(y.length>0&&!T.current){const P=(await Promise.all(y.map(async H=>{var oe,V,Ae;if(T.current)return null;const te=`va_${e.id}_char${H.id}_ref`,ne=ka(H,j.current.analysis,C);try{const Ce=await na.executeTool({name:"generate_image",arguments:{prompt:ne,count:1,size:xt,batchId:te,assetMetadata:{category:aa.CHARACTER,characterName:H.name,characterPrompt:ne},...D?{model:D,modelRef:ae}:{},...v?{params:v}:{}}},{mode:"queue"}),Ie=Ce.taskId||((oe=Ce.data)==null?void 0:oe.taskId);if(!Ie)return null;Q.current=Ie,N.current.add(Ie),kt();let ve;try{if(T.current)return ze.cancelTask(Ie),null;ve=await oa(Ie,(V=Y.current)==null?void 0:V.signal)}finally{N.current.delete(Ie),Q.current===Ie&&(Q.current=null),kt()}if(!ve.success)return null;const re=ve.task||ze.getTask(Ie),ke=(Ae=re==null?void 0:re.result)==null?void 0:Ae.url;return ke?{charId:H.id,url:ke}:null}catch(Ce){return T.current||console.error("[VideoAnalyzer] Character reference generation failed:",{characterId:H.id,error:Ce}),null}}))).filter(H=>!!(H!=null&&H.url));if(P.length>0){const H=new Map(P.map(oe=>[oe.charId,oe.url])),ne=(j.current.characters||j.current.analysis.characters||[]).map(oe=>{const V=H.get(oe.id);return V?{...oe,referenceImageUrl:V}:oe});await W({characters:ne})}}const d=S.current,M=()=>{ye(b=>({...b,completedCount:Math.min(b.completedCount+1,d.length),activeCount:N.current.size}))},x=new Map,E=b=>{var ne;const P=ot(b.id)||b;if(P.generated_first_frame_url)return Promise.resolve(P.generated_first_frame_url);const H=(ne=x.get(b.id))==null?void 0:ne.first;if(H)return H;const te=(async()=>{const oe=j.current.characters||j.current.analysis.characters||[],V=await ga(P,oe);return V&&!T.current&&await ba(P.id,V),V})();return x.set(b.id,{...x.get(b.id)||{},first:te}),te},z=b=>{var ne,oe;const P=ot(b.id)||b;if(P.generated_last_frame_url)return Promise.resolve(P.generated_last_frame_url);if(!((ne=P.last_frame_prompt)!=null&&ne.trim()))return Promise.resolve(null);const H=(oe=x.get(b.id))==null?void 0:oe.last;if(H)return H;const te=(async()=>{const V=j.current.characters||j.current.analysis.characters||[],Ae=await ya(P,V);return Ae&&!T.current&&await _a(P.id,Ae),Ae})();return x.set(b.id,{...x.get(b.id)||{},last:te}),te};for(let b=0;b<d.length;b+=1){const P=d[b],H=d[b+1];E(P).catch(te=>(T.current||console.error("[VideoAnalyzer] Batch first frame generation failed:",{shotId:P.id,error:te}),null)),H&&!P.generated_last_frame_url&&!((n=P.last_frame_prompt)!=null&&n.trim())?E(H).catch(te=>(T.current||console.error("[VideoAnalyzer] Batch next first frame generation failed:",{shotId:H.id,error:te}),null)):(o=P.last_frame_prompt)!=null&&o.trim()&&z(P).catch(te=>(T.current||console.error("[VideoAnalyzer] Batch last frame generation failed:",{shotId:P.id,error:te}),null))}const Z=async(b,P)=>{var H,te,ne,oe;try{if(T.current)return;ye(re=>({...re,currentIndex:P}));let V=ot(b.id)||b;if(V.generated_video_url){a&&await mt(V.generated_video_url);return}const Ae=await E(V);if(Ae&&(V={...V,generated_first_frame_url:Ae}),T.current||(V=ot(b.id)||V,!V.generated_first_frame_url))return;let Ce=V.generated_last_frame_url;if(!Ce)if((H=V.last_frame_prompt)!=null&&H.trim())Ce=await z(V)||void 0;else{const re=d[P+1];Ce=re&&await E(re)||void 0}if(T.current)return;let Ie=0,ve=null;for(;!T.current&&(ve||(ve=await xa(ot(V.id)||V,Ce)),!!ve);){ie.current.add(ve),Q.current=ve,N.current.add(ve),Xt(P,Ie);let re;try{re=await oa(ve,(te=Y.current)==null?void 0:te.signal)}finally{N.current.delete(ve),Q.current===ve&&(Q.current=null),kt()}if(T.current)break;const ke=re.task||ze.getTask(ve),it=(ne=ke==null?void 0:ke.result)==null?void 0:ne.url;if(re.success&&ke&&it){await Ia(V.id,it),a&&await mt(it);break}if((ke==null?void 0:ke.status)===Ve.FAILED){const Pt=Ys(ke,re.error);if(Pt){T.current=!0;for(const Sa of N.current)ze.cancelTask(Sa);N.current.clear(),Q.current=null,(oe=Y.current)==null||oe.abort(),Se.error(`视频生成失败且不可重试,已停止:${Pt}`);break}Ie+=1,Xt(P,Ie),ze.retryTask(ve);continue}ve=null}}catch(V){T.current||console.error("[VideoAnalyzer] Batch shot pipeline failed:",{shotId:b.id,error:V})}finally{M()}};await Promise.all(d.map((b,P)=>Z(b,P)))}finally{G.current=!1,Q.current=null,N.current.clear(),Y.current=null,ye({running:!1,stopping:!1,currentIndex:-1,retryCount:0,completedCount:0,activeCount:0})}},[ce.running,xa,bt,ga,ya,W,ot,e.id,e.analysis,C,D,v,xt,ae,mt,Oe,kt,Xt,ba,_a,Ia,O]),ns=s.useCallback(async()=>{const a=br(j.current,S.current);await W({...Ze(j.current,a.shots),characters:a.characters,generatedAssetsResetAt:Date.now()})},[W]),Nt=s.useMemo(()=>{const[a,n]=ft.split(":").map(Number);if(!a||!n)return{};const o=Math.round(54*a/n);return{width:Math.max(o,48),height:o<48?Math.round(48*n/a):54}},[ft]);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(Qs,{images:le,onImagesChange:L,multiple:!0,label:"参考图 (可选)"}),p.length>0&&t.jsxs("div",{className:"va-characters",children:[t.jsx("div",{className:"va-characters-title",children:"角色"}),p.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(lt,{src:a.referenceImageUrl,alt:a.name,showSkeleton:!1,eager:!0}),t.jsx("button",{className:"va-shot-frame-delete",onClick:()=>void Te(a.id,void 0),children:"×"})]}):t.jsx("span",{className:"va-character-ref-empty",children:"未设置"}),t.jsx("button",{onClick:()=>Bt(a),children:"生成"}),t.jsx("button",{onClick:()=>X(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(Ft,{variant:"form",selectedModel:D,selectedSelectionKey:Ee(D,ae),onSelect:Je,models:he,placement:"down",placeholder:"选择图片模型"}),ue.length>0&&t.jsx(Fa,{selectedParams:f,onParamChange:et,compatibleParams:ue,modelId:D,placement:"down"})]}),t.jsxs("div",{className:"va-model-select",children:[t.jsx("label",{className:"va-model-label",children:"视频模型"}),t.jsx(Ft,{variant:"form",selectedModel:A,selectedSelectionKey:Ee(A,$),onSelect:Ue,models:U,placement:"down",placeholder:"选择视频模型"}),Pe.length>0&&t.jsx(Fa,{selectedParams:K,onParamChange:Ke,compatibleParams:Pe,modelId:A,placement:"down"})]})]}),ce.running&&t.jsxs("div",{className:"va-batch-config-title",children:["正在并行生成 ",ce.completedCount,"/",c.length," 段",ce.activeCount>0?`,运行中 ${ce.activeCount} 个任务`:"",ce.retryCount>0?`,已重试 ${ce.retryCount} 次`:""]}),t.jsxs("div",{className:"va-page-actions",children:[h&&t.jsx("button",{onClick:h,children:"重新分析"}),t.jsx("button",{onClick:ns,children:"重置生成"}),t.jsxs("label",{className:"va-inline-checkbox",children:[t.jsx("input",{type:"checkbox",checked:Oe,onChange:a=>Qe(a.target.checked)}),"生成后插入画布"]}),t.jsx("button",{onClick:rs,disabled:ce.running,children:"全部→生成视频"}),ce.running&&t.jsx("button",{onClick:ss,children:ce.stopping?"停止中…":"停止全部生成"})]})]}),t.jsx("div",{className:"va-shots",children:c.map((a,n)=>t.jsx(va,{shot:a,index:n,actions:t.jsxs(t.Fragment,{children:[a.generated_first_frame_url?t.jsxs("div",{className:"va-shot-frame-thumb",style:Nt,onMouseEnter:o=>Me(a.generated_first_frame_url,"image",o),onMouseLeave:Re,children:[t.jsx(lt,{src:a.generated_first_frame_url,alt:"首帧",showSkeleton:!1,eager:!0,onClick:()=>Yt(a)}),t.jsx("button",{className:"va-shot-frame-delete",onClick:()=>Zt(a.id,"first"),children:"×"}),t.jsx("button",{className:"va-shot-frame-regen",onClick:()=>Yt(a),children:"↻"})]}):a.first_frame_prompt||a.description?t.jsxs("span",{className:"va-shot-frame-btn-group",children:[t.jsx("button",{onClick:()=>Yt(a),children:"生成首帧"}),t.jsx("button",{className:"va-shot-frame-library-btn",onClick:()=>pt(a.id,"first"),children:t.jsx(ct,{content:"从素材库选择",showArrow:!1,children:t.jsx("span",{children:t.jsx(ma,{})})})})]}):null,(()=>{var y;const o=a.generated_last_frame_url||ht(a,n),u=!a.generated_last_frame_url&&o;return a.generated_last_frame_url?t.jsxs("div",{className:"va-shot-frame-thumb",style:Nt,onMouseEnter:d=>Me(a.generated_last_frame_url,"image",d),onMouseLeave:Re,children:[t.jsx(lt,{src:a.generated_last_frame_url,alt:"尾帧",showSkeleton:!1,eager:!0,onClick:()=>jt(a,n)}),t.jsx("button",{className:"va-shot-frame-delete",onClick:()=>Zt(a.id,"last"),children:"×"}),t.jsx("button",{className:"va-shot-frame-regen",onClick:()=>jt(a,n),children:"↻"})]}):u?t.jsxs("div",{className:"va-shot-frame-thumb va-shot-frame-thumb--borrowed",style:Nt,onMouseEnter:d=>Me(o,"image",d),onMouseLeave:Re,children:[t.jsx(lt,{src:o,alt:"尾帧(下一镜头首帧)",showSkeleton:!1,eager:!0,onClick:()=>jt(a,n)}),t.jsx("span",{className:"va-shot-frame-label",children:"下一镜头首帧"})]}):(y=a.last_frame_prompt)!=null&&y.trim()?t.jsxs("span",{className:"va-shot-frame-btn-group",children:[t.jsx("button",{onClick:()=>jt(a,n),children:"生成尾帧"}),t.jsx("button",{className:"va-shot-frame-library-btn",onClick:()=>pt(a.id,"last"),children:t.jsx(ct,{content:"从素材库选择",showArrow:!1,children:t.jsx("span",{children:t.jsx(ma,{})})})})]}):null})(),a.generated_video_url?t.jsxs("div",{className:"va-shot-frame-thumb",style:Nt,onMouseEnter:o=>Me(a.generated_video_url,"video",o),onMouseLeave:Re,children:[t.jsx(Qa,{src:a.generated_video_url,alt:"生成视频缩略图",className:"va-shot-frame-media",thumbnailSize:"small",onClick:()=>qt(a,n),videoProps:{muted:!0,preload:"metadata"}}),t.jsx("button",{className:"va-shot-frame-delete",onClick:()=>Zt(a.id,"video"),children:"×"}),t.jsx("button",{className:"va-shot-frame-regen",onClick:()=>qt(a,n),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:()=>qt(a,n),children:"生成视频"}),t.jsx("button",{className:"va-shot-frame-library-btn",onClick:()=>pt(a.id,"video"),children:t.jsx(ct,{content:"从素材库插入视频",showArrow:!1,children:t.jsx("span",{children:t.jsx(ma,{})})})})]}):null]})},a.id))}),t.jsxs("div",{className:"va-page-actions mv-generate-footer-actions",children:[t.jsx("button",{onClick:()=>void Gt(),disabled:c.length===0||!O,children:"脚本插入画布"}),t.jsx("button",{onClick:()=>void Ht(),disabled:gt||c.length===0,children:gt?`素材下载 ${yt}%`:"素材下载 ZIP"})]}),t.jsx("div",{className:"mv-generate-footer-hint",children:"若有素材未打包成功,解压后在 ZIP 根目录运行 `sh 00.补全下载.sh` 即可按 manifest 补全下载。"}),t.jsx(Va,{isOpen:!!je,onClose:()=>st(null),mode:Pa.SELECT,filterType:(je==null?void 0:je.assetType)==="video"?ra.VIDEO:ra.IMAGE,onSelect:Kt,selectButtonText:(je==null?void 0:je.assetType)==="video"?"使用此视频":"使用此图片"}),t.jsx(Va,{isOpen:!!J,onClose:()=>X(null),mode:Pa.SELECT,filterType:ra.IMAGE,filterCategory:aa.CHARACTER,onSelect:a=>{if(J){const n=j.current,o=(n.characters||n.analysis.characters||[]).find(u=>u.id===J);Te(J,a.url),o&&Ms(a,{name:o.name,prompt:o.description}).catch(u=>{console.warn("[VideoAnalyzer] Failed to mark asset as character:",u)})}X(null)},selectButtonText:"使用此主体"}),m&&js.createPortal(t.jsx("div",{className:"mv-hover-preview",style:{left:`${m.x}px`,top:`${m.y}px`},onMouseEnter:ts,onMouseLeave:as,children:m.type==="image"?t.jsx(lt,{src:m.url,alt:"Preview",showSkeleton:!1,eager:!0}):t.jsx("video",{src:m.url,controls:!0,muted:!0,preload:"metadata"})}),document.body)]})};function es(e){var r;return e.result?(r=e.result.urls)!=null&&r.length?e.result.urls.filter(Boolean):e.result.url?[e.result.url]:[]:[]}function xr(e){var r,l;return e.result?e.type===ge.VIDEO?((r=e.result.thumbnailUrls)==null?void 0:r[0])||e.result.thumbnailUrl||null:((l=e.result.thumbnailUrls)==null?void 0:l[0])||e.result.url||null:null}function Sr(e){switch(e){case Ve.COMPLETED:return"已完成";case Ve.PROCESSING:return"进行中";case Ve.PENDING:return"等待中";case Ve.FAILED:return"失败";default:return""}}function Cr(e){switch(e){case Ve.COMPLETED:return"completed";case Ve.PROCESSING:return"processing";case Ve.PENDING:return"pending";case Ve.FAILED:return"failed";default:return"pending"}}function wr(e){const r=new Date(e);return`${r.getMonth()+1}/${r.getDate()} ${String(r.getHours()).padStart(2,"0")}:${String(r.getMinutes()).padStart(2,"0")}`}function jr(e){const r=String(e.params.prompt||"");return r.length>40?`${r.slice(0,40)}…`:r}function Mr(e){return e==="youtube"?"🔗":e==="prompt"?"✦":"📁"}const kr=({record:e,related:r,isExpanded:l,onSelect:h,onToggleStar:c,onDelete:k,onToggleExpand:g,onInsertTask:I,onPreviewOpen:O,onSelectScript:j})=>{const S=!!(r&&r.rewrite.length+r.image.length+r.video.length>0),T=r?[...r.image,...r.video]:[];return t.jsxs("div",{className:"va-history-item",onClick:()=>h(e),children:[t.jsxs("div",{className:"va-history-header",children:[t.jsxs("span",{className:"va-history-source",children:[Mr(e.source)," ",e.sourceLabel]}),t.jsx("button",{className:`va-star-btn ${e.starred?"starred":""}`,onClick:G=>c(G,e),children:e.starred?"★":"☆"})]}),t.jsxs("div",{className:"va-history-meta",children:[S&&t.jsxs("button",{className:`va-history-expand-btn ${l?"expanded":""}`,onClick:G=>g(G,e.id),children:[t.jsx(ks,{size:12}),t.jsx("span",{children:l?"收起":"关联任务"})]}),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:G=>k(G,e.id),children:"删除"})]}),e.analysis.video_style&&t.jsx("div",{className:"va-history-style",children:e.analysis.video_style}),l&&r&&t.jsx(Nr,{related:r,record:e,previewTasks:T,onInsertTask:I,onPreviewOpen:O,onSelectScript:j})]})},Nr=({related:e,record:r,previewTasks:l,onInsertTask:h,onPreviewOpen:c,onSelectScript:k})=>t.jsxs("div",{className:"va-history-related",onClick:g=>g.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(g=>t.jsx(pa,{task:g,onClick:I=>k==null?void 0:k(I,r,g)},g.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(g=>t.jsx(pa,{task:g,previewTasks:l,onInsertTask:h,onPreviewOpen:c},g.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(g=>t.jsx(pa,{task:g,previewTasks:l,onInsertTask:h,onPreviewOpen:c},g.id))]})]}),pa=({task:e,previewTasks:r,onClick:l,onInsertTask:h,onPreviewOpen:c})=>{const k=e.status===Ve.COMPLETED,g=es(e),I=k&&g.length>0,O=(e.type===ge.IMAGE||e.type===ge.VIDEO)&&I&&!!(r!=null&&r.length),j=xr(e),S=g[0],T=s.useCallback(G=>{if(O&&r){c==null||c(G,e,r);return}l==null||l(G)},[O,l,c,r,e]);return t.jsx(ct,{content:Sr(e.status),showArrow:!1,children:t.jsxs("div",{className:"va-history-related-task",onClick:T,children:[t.jsx("span",{className:`va-history-related-task-status ${Cr(e.status)}`}),t.jsx("span",{className:"va-history-related-task-prompt",children:jr(e)}),t.jsx("span",{className:"va-history-related-task-time",children:wr(e.createdAt)}),I&&S&&e.type!==ge.CHAT&&t.jsxs("span",{className:"va-history-related-task-thumb",children:[e.type===ge.VIDEO?t.jsx(Qa,{src:S,poster:j||void 0,alt:"",className:"va-history-related-task-thumb-media",thumbnailSize:"small",videoProps:{preload:"metadata",muted:!0,playsInline:!0,"aria-hidden":!0}}):t.jsx(lt,{src:j||S,alt:"",showSkeleton:!1,eager:!0}),e.type===ge.VIDEO&&t.jsx("span",{className:"va-history-related-task-thumb-badge","aria-hidden":"true",children:"▶"})]}),I&&h&&t.jsx(ct,{content:"插入画板",showArrow:!1,children:t.jsx("button",{className:"va-history-related-insert-btn",onClick:G=>h(G,e),"aria-label":"插入画板",children:t.jsx(Ns,{size:16})})})]})})};function Pr(e,r,l){var c;const h=((c=e.result)==null?void 0:c.title)||e.params.title||e.params.prompt||(e.type===ge.VIDEO?"视频预览":"图片预览");return l>1?`${h} (${r+1}/${l})`:h}function Tr(e){var h,c,k;const r=[],l=new Map;for(const g of e){if(g.type!==ge.IMAGE&&g.type!==ge.VIDEO)continue;const I=es(g);if(I.length===0)continue;const O=r.length,j=g.type===ge.VIDEO&&(((c=(h=g.result)==null?void 0:h.thumbnailUrls)==null?void 0:c[0])||((k=g.result)==null?void 0:k.thumbnailUrl))||void 0;I.forEach((S,T)=>{r.push({id:I.length>1?`${g.id}-${T}`:g.id,url:S,type:g.type===ge.VIDEO?"video":"image",title:Pr(g,T,I.length),prompt:g.params.prompt,posterUrl:g.type===ge.VIDEO?j:void 0})}),l.set(g.id,O)}return{items:r,taskIdToIndex:l}}const Ar=({records:e,onSelect:r,onRecordsChange:l,showStarredOnly:h=!1,onInsertTask:c,onSelectScript:k})=>{const g=h?e.filter(f=>f.starred):e,[I,O]=s.useState(null),[j,S]=s.useState(!1),[T,G]=s.useState([]),[Y,Q]=s.useState(0),[N,ie]=s.useState(null),{tasks:le}=Xa(),L=s.useMemo(()=>{const f=new Map,R=new Set(e.map(q=>q.id)),A=()=>({rewrite:[],image:[],video:[]});for(const q of le){const $=q.params;if(q.type===ge.CHAT&&$.videoAnalyzerAction==="rewrite"&&typeof $.videoAnalyzerRecordId=="string"&&R.has($.videoAnalyzerRecordId)){const ee=$.videoAnalyzerRecordId;Ta(f,ee,"rewrite",q,A);continue}if((q.type===ge.IMAGE||q.type===ge.VIDEO)&&typeof $.batchId=="string"&&$.batchId.startsWith("va_")){const ee=Ps($.batchId,"va_",R);if(ee){const K=q.type===ge.IMAGE?"image":"video";Ta(f,ee,K,q,A)}}}return Ts(f)},[le,e]),J=s.useCallback(async(f,R)=>{f.stopPropagation();const A=await xe(R.id,{starred:!R.starred});l(A)},[l]),X=s.useCallback((f,R)=>{f.stopPropagation(),ie(R)},[]),he=s.useCallback(async()=>{if(!N)return;const f=await As(N);l(f),ie(null)},[l,N]),U=s.useCallback((f,R)=>{f.stopPropagation(),O(A=>A===R?null:R)},[]),D=s.useCallback((f,R)=>{f.stopPropagation(),c==null||c(R)},[c]),me=s.useCallback((f,R,A)=>{f.stopPropagation(),k==null||k(R,A)},[k]),ae=s.useCallback((f,R,A)=>{f.stopPropagation();const{items:q,taskIdToIndex:$}=Tr(A),ee=$.get(R.id);!q.length||ee===void 0||(G(q),Q(ee),S(!0))},[]),pe=s.useCallback(()=>{S(!1)},[]);return g.length===0?t.jsx("div",{className:"va-page va-empty",children:t.jsx("span",{children:h?"暂无收藏":"暂无分析记录"})}):t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"va-page",children:t.jsx("div",{className:"va-history-list",children:g.map(f=>{const R=L.get(f.id),A=I===f.id;return t.jsx(kr,{record:f,related:R,isExpanded:A,onSelect:r,onToggleStar:J,onDelete:X,onToggleExpand:U,onInsertTask:D,onPreviewOpen:ae,onSelectScript:me},f.id)})})}),t.jsx(Us,{visible:j,items:T,initialIndex:Y,onClose:pe,showThumbnails:T.length>1}),t.jsx(zs,{open:N!==null,title:"确认删除",description:"确定要删除这条历史记录吗?此操作不可撤销。",confirmText:"删除",cancelText:"取消",danger:!0,onOpenChange:f=>{f||ie(null)},onConfirm:he})]})},zr=[{id:"analyze",label:"分析"},{id:"script",label:"脚本"},{id:"generate",label:"生成"}],Hr=()=>{const{board:e}=ha(),{records:r,setRecords:l,currentRecord:h,setCurrentRecord:c,showStarred:k,setShowStarred:g,starredCount:I,selectRecord:O,updateCurrentRecord:j,restart:S,applySyncedRecord:T}=Es({loadRecords:fa,logPrefix:"[VideoAnalyzer]"}),{page:G,setPage:Y,navigateToStep:Q,goToDefaultPage:N,openHistory:ie,openStarred:le,toggleStarred:L}=Ds({initialPage:"analyze",defaultPage:"analyze",historyPage:"history",setShowStarred:g}),J=s.useCallback(async f=>cr(f)?Lt(f):null,[]);Js({syncTask:J,applySyncedRecord:T,logPrefix:"[VideoAnalyzer]"});const X=s.useMemo(()=>zr.map((f,R)=>({...f,disabled:!h&&R>0})),[h]),he=s.useCallback(f=>{j(f)},[j]),U=s.useCallback(f=>{O(f),N()},[N,O]),D=s.useCallback(f=>{j(f)},[j]),me=s.useCallback(()=>{S(),N()},[N,S]),ae=s.useCallback(async f=>{var R,A,q,$;if(!((R=f.result)!=null&&R.url)&&!((q=(A=f.result)==null?void 0:A.urls)!=null&&q.length)||!e){Se.warning("无法插入:白板未就绪");return}try{if(f.type===ge.IMAGE){const ee=($=f.result.urls)!=null&&$.length?f.result.urls:[f.result.url];for(const K of ee)await Rs(e,K);Se.success(ee.length>1?"多图已插入到白板":"图片已插入到白板")}else f.type===ge.VIDEO&&(await Vs(e,f.result.url),Se.success("视频已插入到白板"))}catch(ee){console.error("[VideoAnalyzer] Failed to insert to board:",ee),Se.error(`插入失败: ${ee instanceof Error?ee.message:"未知错误"}`)}},[e]),pe=s.useCallback(async(f,R)=>{const A=String(R.params.videoAnalyzerPrompt||R.params.prompt||""),q=f.scriptVersions||[],$=q.find(K=>K.prompt===A)||q.find(K=>{var _e;return A&&((_e=K.prompt)==null?void 0:_e.includes(A))});let ee=f;if($&&$.id!==f.activeVersionId){const K=Za(f,$.id);if(K){const _e=await xe(f.id,K);ee=_e.find(ce=>ce.id===f.id)||{...f,...K},l(_e)}}c(ee),Y("script")},[c,Y,l]);return t.jsxs("div",{className:"video-analyzer",children:[t.jsx(Fs,{isHistoryPage:G==="history",showStarred:k,recordsCount:r.length,starredCount:I,currentStep:G,steps:X,onStepNavigate:Q,onBackFromHistory:N,onOpenHistory:ie,onOpenStarred:le,onToggleStarred:L}),G==="analyze"&&t.jsx(pr,{existingRecord:h,onComplete:he,onRecordsChange:l,onCreateNew:me,onNext:h?()=>Y("script"):void 0}),G==="script"&&h&&t.jsx(gr,{record:h,onRecordUpdate:D,onRecordsChange:l,onNext:()=>Y("generate")}),G==="generate"&&h&&t.jsx(Ir,{record:h,onRecordUpdate:D,onRecordsChange:l,onRestart:me}),G==="history"&&t.jsx(Ar,{records:r,onSelect:U,onRecordsChange:l,showStarredOnly:k,onInsertTask:e?ae:void 0,onSelectScript:pe})]})};export{Hr as default};
|
|
1
|
+
import{j as t,E as ct,m$ as Ca,e0 as vt,n0 as fa,a1 as Wa,n1 as is,mQ as Vt,mV as ls,n2 as cs,n3 as Ut,n4 as us,n5 as ds,mT as ms,mY as ps,mZ as fs,n6 as xe,ck as ha,r as s,aw as we,aB as ut,n7 as Xe,gm as hs,jN as Qt,M as Se,n8 as wa,n9 as vs,am as $e,bz as ze,na as $t,nb as Ya,nc as qa,aA as Ft,nd as va,ah as ja,ne as gs,nf as Ze,ng as ys,bg as ge,nh as Za,ni as ea,nj as bs,mp as ta,nk as _s,nl as Ma,iV as Is,iX as xs,jo as Ss,nm as ka,ha as Tt,db as aa,nn as Cs,gT as Xa,dB as Ve,no as sa,np as Na,nq as ws,b7 as js,R as lt,ef as ra,eK as Pa,nr as Ms,$ as ks,l as Ns,mH as Ta,mI as Ps,mJ as Ts,ns as As,c1 as zs,mL as Es,mM as Ds,d as Rs,c as Vs,mN as Fs}from"./startup-app-eD_rQhSh.js";import{i as dt,j as Aa,k as za,T as Os,R as Ot,K as Ls,m as Ee,v as Ea,q as na,V as Ja,U as Us}from"./ai-chat-BO5vbKZW.js";import{e as $s,c as Bs,r as Gs,a as Hs,b as Ks,w as oa,d as Ws,g as Ys,f as qs}from"./workflow-generation-utils-DhIVnOHO.js";import{c as Da,f as Ra,g as Zs,d as Xs}from"./ai-generation-preferences-service-ZmPTR-wz.js";import{M as Va}from"./tool-windows-CmgL3thd.js";/* empty css *//* empty css */import{R as Js}from"./ResizableDivider-CUQBmPpx.js";import{P as Fa}from"./ParametersDropdown-CTSN3ClD.js";import{u as Qs}from"./VideoAnalyzer-BmAjGvN8.js";import"./startup-runtime-DTmhLESk.js";const er=({shots:e,totalDuration:r})=>t.jsx("div",{className:"va-timeline",children:e.filter(Boolean).map(l=>t.jsx(ct,{content:`${l.label||"未命名镜头"} ${l.startTime??0}s-${l.endTime??0}s`,showArrow:!1,children:t.jsx("div",{className:"va-timeline-segment",style:{flex:Math.max(((l.endTime??0)-(l.startTime??0))/Math.max(r,1),0),backgroundColor:l.type&&Ca[l.type]||Ca.other}})},l.id))});function Oa(e){return(e||"").trim().toLowerCase().replace(/[^a-z0-9]/g,"")||"mp4"}function tr(e){const r=e.name.split(".").pop();if(r&&r.length<=8)return Oa(r);const l=e.type.split("/")[1];return Oa(l)}async function ar(e,r){const l=tr(e),c=`/__aitu_cache__/video/${`video-analyzer-source-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}.${l}`;return await vt.cacheMediaFromBlob(c,e,"video",{metadata:{source:"video-analyzer-input",fileName:e.name,mimeType:e.type||"video/mp4",size:e.size}}),{type:"upload",cacheUrl:c,fileName:e.name||`video-source.${l}`,mimeType:e.type||"video/mp4",size:e.size}}async function sr(e){if(!e||e.type!=="upload")return null;const r=await vt.getCachedBlob(e.cacheUrl);return r?new File([r],e.fileName||"video-source.mp4",{type:e.mimeType||r.type||"video/mp4",lastModified:Date.now()}):null}function Qa(e){return ps(e,"videoAnalyzerAction",["analyze","rewrite","prompt-generate"])}function rr(e){return fs(e,{missingMessage:"分析任务缺少结果内容",fromStructured:r=>r})}function nr(e){const r=e.params.videoAnalyzerSourceSnapshot;if((r==null?void 0:r.type)==="youtube"||(r==null?void 0:r.type)==="upload"||(r==null?void 0:r.type)==="prompt")return r;const l=e.params.videoAnalyzerSource,h=String(e.params.videoAnalyzerSourceLabel||"").trim();return l==="youtube"&&h?{type:"youtube",youtubeUrl:h}:l==="prompt"&&h?{type:"prompt",prompt:String(e.params.videoAnalyzerUserPrompt||h),pdfCacheUrl:Vt(e,"pdfCacheUrl")||void 0,pdfName:Vt(e,"pdfName")||void 0,pdfMimeType:Vt(e,"pdfMimeType")||void 0}:null}function or(e,r){const l=new Map(e.map(h=>[h.id,h]));return r.map(h=>{const c=l.get(h.id);return{...h,referenceImageUrl:h.referenceImageUrl||(c==null?void 0:c.referenceImageUrl)}})}function ir(e){var h;const r=(h=e.result)==null?void 0:h.analysisData,l=Array.isArray(r==null?void 0:r.editedShots)?r.editedShots:Array.isArray(r==null?void 0:r.shots)?r.shots:null;return!r||!l?null:{shots:l,characters:Array.isArray(r.characters)?r.characters:void 0,hasCharacters:Object.prototype.hasOwnProperty.call(r,"characters"),videoStyle:String(r.video_style||r.videoStyle||"").trim()||void 0,bgmMood:String(r.bgm_mood||r.bgmMood||"").trim()||void 0,suggestion:String(r.suggestion||"").trim()||void 0}}function lr(e,r){const l=e.params.videoAnalyzerProductInfo;if(!(!l||typeof l!="object"))return Ut(l,r)}async function Lt(e){var N,ie;if(e.status!=="completed")return null;const r=Qa(e);if(!r)return null;if(r==="analyze"||r==="prompt-generate"){const le=await fa(),L=le.find(f=>f.analyzeTaskId===e.id);if(L)return{records:le,record:L};const Q=rr(e),X=nr(e),he=e.params.videoAnalyzerSource,U=he==="prompt"?"prompt":he==="upload"?"upload":"youtube",D=String(e.params.videoAnalyzerSourceLabel||(U==="prompt"?"提示词生成":U==="youtube"?(X==null?void 0:X.type)==="youtube"?X.youtubeUrl:"":"本地视频")),me=lr(e,Q.totalDuration),ae={id:Wa(),createdAt:Date.now(),source:U,sourceLabel:D,sourceSnapshot:X,model:String(e.params.model||""),modelRef:e.params.modelRef||null,analysis:Q,...me?{productInfo:me}:{},starred:!1,analyzeTaskId:e.id};return{records:await is(ae),record:ae}}const l=Vt(e,"videoAnalyzerRecordId");if(!l)return null;const h=await fa(),c=h.find(le=>le.id===l);if(!c)return null;if(c.pendingRewriteTaskId!==e.id)return!c.pendingRewriteTaskId&&c.storyboardGeneratedAt&&(!e.completedAt||c.storyboardGeneratedAt>=e.completedAt)?{records:h,record:c}:null;const k=c.editedShots||c.analysis.shots,g=ir(e),I=g||(()=>{const le=ls(e);if(!le)throw new Error("脚本改编任务缺少结果内容");return cs(le,k)})(),O=I.shots,j=I.hasCharacters?or(c.characters||c.analysis.characters||[],I.characters||[]):void 0,S=I.videoStyle||I.bgmMood?{...Ut(c.productInfo||{prompt:""},c.analysis.totalDuration),...I.videoStyle?{videoStyle:I.videoStyle}:{},...I.bgmMood?{bgmMood:I.bgmMood}:{}}:void 0,T={...c.analysis,suggestion:I.suggestion||""},G=`AI 改编 #${(((N=c.scriptVersions)==null?void 0:N.length)||0)+1}`,Y=us(O,G,(ie=c.productInfo)==null?void 0:ie.prompt,{characters:j||c.characters||c.analysis.characters||[],productInfo:S||c.productInfo}),J=ds(c,Y);return ms(c,{...J,analysis:T,...j!==void 0?{characters:j}:{},...S?{productInfo:S}:{},pendingRewriteTaskId:null,storyboardGeneratedAt:Date.now()},xe)}function cr(e){return Qa(e)!==null}const ia="gemini-3.1-pro-preview",la="video-analyzer:model",At="video-analyzer:video-model",ca="veo3",zt=30,ur="aitu:settings:provider-nav",dr=20*1024*1024;function La(e){return(e/1024/1024).toFixed(1)+"MB"}function mr(e){const r=`${e.id} ${e.label} ${e.shortLabel||""} ${e.sourceProfileName||""}`.toLowerCase();return e.vendor===ja.GEMINI||e.vendor===ja.GOOGLE||r.includes("gemini")}const pr=({existingRecord:e,onComplete:r,onRecordsChange:l,onCreateNew:h,onNext:c})=>{const{setAppState:k}=ha(),[g,I]=s.useState("prompt"),[O,j]=s.useState(""),[S,T]=s.useState(()=>{var m;return((m=e==null?void 0:e.productInfo)==null?void 0:m.videoStyle)||(e==null?void 0:e.analysis.video_style)||""}),[G,Y]=s.useState(()=>{var m;return((m=e==null?void 0:e.productInfo)==null?void 0:m.targetDuration)||(e==null?void 0:e.analysis.totalDuration)||zt}),[J,N]=s.useState({}),[ie,le]=s.useState([]),[L,Q]=s.useState(null),[X,he]=s.useState(""),[U,D]=s.useState(null),[me,ae]=s.useState(()=>(e==null?void 0:e.model)||we(la,ia).modelId),[pe,f]=s.useState(()=>(e==null?void 0:e.modelRef)||we(la,ia).modelRef),R=s.useCallback((m,_)=>{ae(m),f(_||null),ut(la,m,_)},[]),A=dt("video"),[q,$]=s.useState(()=>{var m;return((m=e==null?void 0:e.productInfo)==null?void 0:m.videoModel)||we(At,ca).modelId}),[ee,K]=s.useState(()=>{var m,_;return((m=e==null?void 0:e.productInfo)==null?void 0:m.videoModelRef)||we(At,((_=e==null?void 0:e.productInfo)==null?void 0:_.videoModel)||ca).modelRef}),_e=s.useMemo(()=>Xe(q),[q]),[ce,ye]=s.useState(()=>{var w,F;const m=((w=e==null?void 0:e.productInfo)==null?void 0:w.videoModel)||we(At,ca).modelId,_=Xe(m);return((F=e==null?void 0:e.productInfo)==null?void 0:F.segmentDuration)||parseInt(_.defaultDuration,10)||8}),Oe=s.useMemo(()=>(_e.durationOptions||[]).map(m=>({value:parseInt(m.value,10),label:m.label})),[_e]),Je=s.useCallback((m,_)=>{$(m),K(_||null),ut(At,m,_);const w=Xe(m);ye(parseInt(w.defaultDuration,10)||8)},[]),[ue,Pe]=s.useState(!1),[B,Be]=s.useState(null),[De,de]=s.useState(""),[i,v]=s.useState(""),[p,C]=s.useState((e==null?void 0:e.analysis)||null),be=hs(),W=s.useRef(null),Ne=s.useRef(null),Le=s.useRef(null),Te=s.useRef(!1),Bt=s.useMemo(()=>{if(Le.current&&URL.revokeObjectURL(Le.current),!U)return Le.current=null,null;const m=URL.createObjectURL(U);return Le.current=m,m},[U]);s.useEffect(()=>()=>{Le.current&&URL.revokeObjectURL(Le.current)},[]),s.useEffect(()=>{let m=!1;return(async()=>{var F,se,fe,Me;if(!e){if(B)return;C(null),I("prompt"),j(""),T(""),Y(zt),N({}),Q(null),he(""),D(null),v("");return}if(C(e.analysis||null),ae(e.model||ia),f(e.modelRef||null),v(""),T(((F=e.productInfo)==null?void 0:F.videoStyle)||e.analysis.video_style||""),Y(((se=e.productInfo)==null?void 0:se.targetDuration)||e.analysis.totalDuration||zt),(fe=e.productInfo)!=null&&fe.videoModel){$(e.productInfo.videoModel),K(e.productInfo.videoModelRef||null);const Re=Xe(e.productInfo.videoModel);ye(e.productInfo.segmentDuration||parseInt(Re.defaultDuration,10)||8)}const w=e.sourceSnapshot;if((w==null?void 0:w.type)==="prompt"){I("prompt"),j(w.prompt||e.sourceLabel||""),N(wa((Me=e.productInfo)==null?void 0:Me.creativeBrief)),he(""),D(null),Q(w.pdfCacheUrl?{cacheUrl:w.pdfCacheUrl,name:w.pdfName||"参考资料.pdf",size:w.pdfSize||0,mimeType:w.pdfMimeType||"application/pdf"}:null);return}if((w==null?void 0:w.type)==="upload"){I("upload"),j(""),N({}),Q(null),he("");const Re=await sr(w);if(m)return;D(Re),Re||v("原上传视频缓存已失效,无法自动回填视频");return}if(e.source==="upload"){I("upload"),j(""),N({}),Q(null),he(""),D(null),v("这条旧历史未保存原视频,无法自动回填视频");return}I("youtube"),j(""),N({}),Q(null),D(null),(w==null?void 0:w.type)==="youtube"?he(w.youtubeUrl):e.source==="youtube"?he(e.sourceLabel||""):he("")})(),()=>{m=!0}},[e]);const Qe=dt("text"),Ue=s.useMemo(()=>Qe.filter(mr),[Qe]),et=g!=="prompt"||!!L,Ke=s.useMemo(()=>et?Ue:Qe,[Qe,Ue,et]),Gt=s.useMemo(()=>{const m=be.find(_=>_.id===Qt);return!!(m!=null&&m.apiKey.trim())},[be]),mt=(pe==null?void 0:pe.profileId)===Qt,gt=s.useCallback(()=>{const m={action:"select",profileId:Qt};window.__aituPendingProviderNavigationIntent=m,window.dispatchEvent(new CustomEvent(ur,{detail:m})),k(_=>({..._,openSettings:!0}))},[k]);s.useEffect(()=>{if(Ke.length===0||Aa(Ke,me,pe))return;const _=Ke[0];R(_.id,za(_))},[Ke,me,pe,R]);const yt=s.useCallback(m=>{var w;const _=(w=m.target.files)==null?void 0:w[0];_&&(D(_),v(""),C(null))},[]),Ht=s.useCallback(m=>{m.preventDefault();const _=m.dataTransfer.files[0];_!=null&&_.type.startsWith("video/")&&(D(_),v(""),C(null))},[]),tt=s.useCallback(m=>{m.stopPropagation(),D(null),v(""),W.current&&(W.current.value="")},[]),bt=s.useCallback(()=>{const m=!B;Q(_=>(m&&(_!=null&&_.cacheUrl)&&vt.deleteCache(_.cacheUrl).catch(()=>{}),null)),Ne.current&&(Ne.current.value="")},[B]),_t=s.useCallback(async m=>{var F;const _=(F=m.target.files)==null?void 0:F[0];if(m.target.value="",!_)return;if(!(_.type==="application/pdf"||_.name.toLowerCase().endsWith(".pdf"))){Se.warning("请上传 PDF 文件");return}if(_.size>dr){Se.warning("PDF 不能超过 20MB");return}if(Ue.length===0){Se.warning("PDF 入参需要 Gemini 文本模型,请先配置 Gemini 模型");return}try{const se=`video-prompt-pdf-${Wa()}.pdf`;await vt.cacheToCacheStorageOnly(se,_),Q(fe=>(!B&&(fe!=null&&fe.cacheUrl)&&vt.deleteCache(fe.cacheUrl).catch(()=>{}),{cacheUrl:se,name:_.name,size:_.size,mimeType:_.type||"application/pdf"})),Se.success("PDF 已添加,将作为提示词上下文提交给 Gemini")}catch(se){Se.error(se instanceof Error?se.message:"PDF 上传失败")}},[Ue.length,B]),[Fe,at]=s.useState(!1),[It,je]=s.useState(""),st=s.useCallback(async(m,_)=>{at(!0),je("提取帧图片...");try{const w=_.map(se=>se.startTime),F=await $s(m,w,(se,fe)=>je(`提取帧图片 ${se}/${fe}`));return await Promise.all(_.map(async(se,fe)=>{const Me=F[fe];if(!Me)return se;try{const Re=await Bs(Me,se.id,"first");return{...se,generated_first_frame_url:Re}}catch{return se}}))}catch{return _}finally{at(!1),je("")}},[]),pt=s.useCallback(async()=>{if(!(Te.current||B)){Te.current=!0,Pe(!0),v(""),de("准备中...");try{let m={};if(g==="prompt"){const w=O.trim();if(!w){v("请输入提示词"),Te.current=!1,Pe(!1);return}if(L&&!Aa(Ue,me,pe)){const fe=Ue[0];fe&&R(fe.id,za(fe)),Se.warning("PDF 入参仅支持 Gemini 文本模型"),Te.current=!1,Pe(!1),de("");return}const F=wa(J);m={prompt:vs({userPrompt:w,pdfAttachmentName:L==null?void 0:L.name,creativeBrief:F,videoStyle:S,videoModel:q,segmentDuration:ce,targetDuration:G}),model:me,modelRef:pe,taskLabel:`提示词生成:${w.slice(0,32)}`,videoAnalyzerAction:"prompt-generate",videoAnalyzerSource:"prompt",videoAnalyzerSourceLabel:w.slice(0,80),videoAnalyzerUserPrompt:w,videoAnalyzerSourceSnapshot:{type:"prompt",prompt:w,...L?{pdfCacheUrl:L.cacheUrl,pdfName:L.name,pdfMimeType:L.mimeType,pdfSize:L.size}:{}},videoAnalyzerProductInfo:{prompt:w,videoModel:q,videoModelRef:ee,targetDuration:G,segmentDuration:ce,videoStyle:S,creativeBrief:F},knowledgeContextRefs:ie,...L?{pdfCacheUrl:L.cacheUrl,pdfMimeType:L.mimeType,pdfName:L.name}:{}}}else if(g==="upload"&&U){de("缓存视频文件...");const w=await ar(U);m={videoCacheUrl:w.type==="upload"?w.cacheUrl:void 0,...w.type==="upload"?{mimeType:w.mimeType}:{},model:me,modelRef:pe,taskLabel:`分析视频:${U.name||"本地视频"}`,videoAnalyzerSource:"upload",videoAnalyzerSourceLabel:U.name||"本地视频",videoAnalyzerSourceSnapshot:w}}else if(g==="youtube"&&X)m={youtubeUrl:X,model:me,modelRef:pe,taskLabel:`分析视频:${X}`,videoAnalyzerSource:"youtube",videoAnalyzerSourceLabel:X,videoAnalyzerSourceSnapshot:{type:"youtube",youtubeUrl:X}};else{v("请先输入提示词、选择视频文件或输入 YouTube URL"),Te.current=!1,Pe(!1);return}$e.trackUIInteraction({area:"popular_video_tool",action:"video_analysis_started",control:"analyze_video",source:"video_analyzer_analyze_page",metadata:{inputMode:g,hasPrompt:!!O.trim(),hasPdfAttachment:!!L,hasUpload:!!U,hasYoutubeUrl:!!X,fileSizeBytes:U==null?void 0:U.size,hasModelRef:!!pe}}),de("加入任务队列...");const _=await Os.execute(m,{mode:"queue"});_.success&&_.taskId?(Be(_.taskId||null),de("已加入任务队列,等待分析...")):(Te.current=!1,v(_.error||"创建分析任务失败"))}catch(m){Te.current=!1,v(m.message||"分析失败")}finally{Pe(!1)}}},[g,U,X,O,S,q,ee,G,ce,J,ie,L,B,me,pe,Ue,R]);s.useEffect(()=>{if(!B)return;const m=ze.observeTaskUpdates().subscribe(_=>{var w;if(_.task.id===B){if(_.task.status==="failed"){Te.current=!1,Be(null),de(""),v(((w=_.task.error)==null?void 0:w.message)||"分析失败");return}if(_.task.status==="completed"){Lt(_.task).then(async F=>{if(F&&(l(F.records),r(F.record),C(F.record.analysis),F.record.source==="upload"&&U&&F.record.analysis.shots.length>0)){const se=await st(U,F.record.analysis.shots);C(Me=>Me&&{...Me,shots:se});const fe=await xe(F.record.id,{editedShots:se});l(fe),r({...F.record,editedShots:se})}}).catch(F=>{v(F.message||"分析结果同步失败")}).finally(()=>{Te.current=!1,Be(null),de("")});return}typeof _.task.progress=="number"?de(`分析中 ${Math.round(_.task.progress)}%`):de("分析中,请耐心等待...")}});return()=>m.unsubscribe()},[B,r,l,U,st]);const Kt=s.useCallback(async()=>{var m;p&&(await Ot("text",$t(p.shots,p)),$e.trackUIInteraction({area:"popular_video_tool",action:"analysis_inserted_to_canvas",control:"insert_analysis",source:"video_analyzer_analyze_page",metadata:{shotCount:p.shots.length,productExposureRatio:p.productExposureRatio,characterCount:((m=p.characters)==null?void 0:m.length)||0}}))},[p]);return t.jsxs("div",{className:"va-page",children:[!p&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"va-tabs",children:[t.jsx("button",{className:`va-tab ${g==="prompt"?"active":""}`,onClick:()=>I("prompt"),children:"提示词生成"}),t.jsx("button",{className:`va-tab ${g==="upload"?"active":""}`,onClick:()=>I("upload"),children:"上传视频"}),t.jsx("button",{className:`va-tab ${g==="youtube"?"active":""}`,onClick:()=>I("youtube"),children:"YouTube URL"})]}),g==="prompt"?t.jsxs("div",{className:"va-prompt-start",children:[t.jsxs("div",{className:"va-context-panel",children:[t.jsxs("div",{className:"va-pdf-row",children:[t.jsx("input",{ref:Ne,type:"file",accept:"application/pdf,.pdf",onChange:_t,style:{display:"none"}}),t.jsx("button",{type:"button",className:"va-secondary-btn",onClick:()=>{var m;return(m=Ne.current)==null?void 0:m.click()},disabled:ue||!!B,children:L?"更换 PDF":"上传 PDF"}),L?t.jsxs("div",{className:"va-pdf-chip",children:[t.jsxs("span",{title:L.name,children:[L.name," · ",La(L.size)]}),t.jsx("button",{type:"button","aria-label":"移除 PDF",onClick:bt,disabled:ue||!!B,children:"×"})]}):t.jsx("span",{className:"va-pdf-hint",children:"可选,上传后仅支持 Gemini 模型,PDF 不超过 20MB"})]}),t.jsx(Ls,{value:ie,onChange:le,disabled:ue||!!B,className:"va-knowledge-context-selector"})]}),t.jsx(Ya,{value:J,onChange:N,workflow:"popular_video",videoStyle:S,onVideoStyleChange:T}),t.jsx(qa,{selectedModel:q,selectedSelectionKey:Ee(q,ee),onSelectModel:Je,models:A,segmentDuration:ce,durationOptions:Oe,onSegmentDurationChange:ye,targetDuration:G,onTargetDurationChange:m=>Y(Number.isFinite(m)&&m>0?m:zt),disabled:ue||!!B}),t.jsx("textarea",{className:"va-prompt-textarea",value:O,onChange:m=>{j(m.target.value),v(""),C(null)},placeholder:"输入产品、主题、受众、风格或爆款方向,可附带 PDF 作为上下文",rows:5})]}):g==="upload"?U?t.jsxs("div",{className:"va-video-preview",children:[t.jsx("video",{src:Bt,controls:!0,muted:!0,playsInline:!0}),t.jsx("button",{className:"va-video-preview-close",onClick:tt,children:"✕"}),t.jsxs("div",{className:"va-video-preview-info",children:[t.jsx("span",{className:"va-video-preview-name",children:U.name}),t.jsx("span",{className:"va-video-preview-size",children:La(U.size)})]}),t.jsx("input",{ref:W,type:"file",accept:"video/*",onChange:yt,style:{display:"none"}})]}):t.jsxs("div",{className:"va-dropzone",onDrop:Ht,onDragOver:m=>m.preventDefault(),onClick:()=>{var m;return(m=W.current)==null?void 0:m.click()},children:[t.jsx("input",{ref:W,type:"file",accept:"video/*",onChange:yt,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:X,onChange:m=>he(m.target.value)}),t.jsxs("div",{className:"va-analyze-control-row",children:[t.jsxs("div",{className:"va-model-select va-model-select--analysis",children:[t.jsx("label",{className:"va-model-label",children:"分析模型"}),t.jsx(Ft,{variant:"form",selectedModel:me,selectedSelectionKey:Ee(me,pe),onSelect:R,models:Ke,placement:"auto",disabled:ue,placeholder:et?"选择 Gemini 模型":"选择文本模型"})]}),t.jsx("button",{className:"va-analyze-btn va-analyze-btn--inline",onClick:pt,disabled:ue||!!B||(g==="prompt"?!O.trim():g==="upload"?!U:!X),children:ue||B?De||"分析中...":g==="prompt"?"生成提示词":"开始分析"})]}),et&&!mt&&t.jsxs("div",{className:"va-model-tip",children:[t.jsx("span",{children:"建议使用 gemini-mix 分组的gemini-3.1-pro-preview"}),!Gt&&t.jsx("button",{type:"button",className:"va-model-tip-link",onClick:gt,children:"去设置"})]}),i&&t.jsx("div",{className:"va-error",children:i})]}),p&&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:[p.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:p.shotCount}),t.jsx("span",{className:"va-stat-label",children:"镜头数"})]}),t.jsxs("div",{className:"va-stat",children:[t.jsxs("span",{className:"va-stat-value",children:[p.productExposureRatio,"%"]}),t.jsx("span",{className:"va-stat-label",children:"产品占比"})]}),t.jsxs("div",{className:"va-stat",children:[t.jsx("span",{className:"va-stat-value",children:p.aspect_ratio||"-"}),t.jsx("span",{className:"va-stat-label",children:"画面比例"})]})]}),(p.video_style||p.bgm_mood)&&t.jsxs("div",{className:"va-style-info",children:[p.video_style&&t.jsxs("span",{children:["风格: ",p.video_style]}),p.bgm_mood&&t.jsxs("span",{children:["BGM: ",p.bgm_mood]})]}),t.jsx("div",{className:"va-suggestion",children:p.suggestion}),t.jsx(er,{shots:p.shots,totalDuration:p.totalDuration}),t.jsx("div",{className:"va-shots",children:p.shots.map((m,_)=>t.jsx(va,{shot:m,index:_},m.id))}),t.jsxs("div",{className:"va-page-actions",children:[Fe&&t.jsx("span",{className:"va-frame-progress",children:It}),t.jsx("button",{onClick:Kt,children:"插入画布"}),t.jsx("button",{onClick:()=>{C(null)},children:"重新分析"}),h&&t.jsx("button",{onClick:h,children:"新建分析"}),c&&t.jsx("button",{className:"va-btn-primary",onClick:c,children:"下一步: 编辑脚本 →"})]})]})]})};function He(e){e.style.height="auto",e.style.height=e.scrollHeight+"px"}function We(e,r=30){if(!e)return 1;const l=e.split(`
|
|
2
|
+
`);let h=0;for(const c of l)h+=Math.max(1,Math.ceil(c.length/r));return Math.max(1,h)}function Ye(e){e&&He(e)}function Et(e){const r=Ut(e.productInfo||{prompt:""},e.analysis.totalDuration);return{...r,videoStyle:r.videoStyle??e.analysis.video_style??"",bgmMood:r.bgmMood??e.analysis.bgm_mood??""}}function qe(e,r,l){return e.find(h=>h.id===r)||l}const ua="video-analyzer:script-model",da="video-analyzer:video-model",Ua="gemini-3.1-pro-preview",$a="veo3",fr=["固定镜头 (Static)","缓慢推近 (Dolly In)","缓慢拉远 (Dolly Out)","水平平移 (Pan)","垂直摇移 (Tilt)","跟随拍摄 (Follow)","手持感 (Handheld)","环绕拍摄 (Orbit)","升降镜头 (Crane)","快速推移 (Zoom In)","快速拉远 (Zoom Out)","滑轨移动 (Slider)","航拍俯冲 (Drone Dive)","第一人称 (POV)"],hr=[{label:"无 (none)",value:"none"},{label:"仅旁白 (narration_only)",value:"narration_only"},{label:"仅对白 (dialogue_only)",value:"dialogue_only"},{label:"旁白+对白 (both)",value:"both"}],vr=[{label:"硬切 (cut)",value:"cut"},{label:"溶解 (dissolve)",value:"dissolve"},{label:"匹配切 (match_cut)",value:"match_cut"},{label:"淡出到黑 (fade_to_black)",value:"fade_to_black"}],gr=({record:e,onRecordUpdate:r,onRecordsChange:l,onNext:h})=>{var de;const[c,k]=s.useState(()=>Et(e)),[g,I]=s.useState(e.editedShots||[...e.analysis.shots]),[O,j]=s.useState(!1),[S,T]=s.useState(()=>e.pendingRewriteTaskId||null),[G,Y]=s.useState(""),[J,N]=s.useState(""),[ie,le]=s.useState(!1),L=s.useRef(null),Q=s.useRef(!1),[X,he]=s.useState(()=>we(ua,Ua).modelId),[U,D]=s.useState(()=>we(ua,Ua).modelRef),me=s.useCallback((i,v)=>{he(i),D(v||null),ut(ua,i,v)},[]),ae=dt("text"),pe=dt("video"),[f,R]=s.useState(()=>{var i;return((i=e.productInfo)==null?void 0:i.videoModel)||we(da,$a).modelId}),[A,q]=s.useState(()=>{var i,v;return((i=e.productInfo)==null?void 0:i.videoModelRef)||we(da,((v=e.productInfo)==null?void 0:v.videoModel)||$a).modelRef}),$=s.useCallback((i,v)=>{R(i),q(v||null),ut(da,i,v);const p=Xe(i),C=parseInt(p.defaultDuration,10)||8;k(be=>({...be,videoModel:i,videoModelRef:v||null,segmentDuration:C}))},[]),ee=s.useMemo(()=>Xe(f).durationOptions,[f]),K=s.useMemo(()=>{if(c.segmentDuration&&ee.some(p=>parseInt(p.value,10)===c.segmentDuration))return c.segmentDuration;const i=Xe(f);return parseInt(i.defaultDuration,10)||8},[c.segmentDuration,ee,f]),_e=s.useMemo(()=>{const i=c.targetDuration||e.analysis.totalDuration,v=[{label:`${K}秒`,value:String(K)}];return gs(i,v)},[K,c.targetDuration,e.analysis.totalDuration]),ce=s.useMemo(()=>e.characters||e.analysis.characters||[],[e.characters,e.analysis.characters]);s.useEffect(()=>{k(Et(e)),I(e.editedShots||[...e.analysis.shots]),T(e.pendingRewriteTaskId||null),Y(i=>e.pendingRewriteTaskId?i:"")},[e]);const ye=s.useRef();s.useEffect(()=>(clearTimeout(ye.current),ye.current=setTimeout(async()=>{const i=await xe(e.id,{productInfo:c});l(i),r(qe(i,e.id,{...e,productInfo:c,pendingRewriteTaskId:S}))},500),()=>clearTimeout(ye.current)),[c,S]);const Oe=s.useCallback(async i=>{I(i);const v=Ze(e,i),p=await xe(e.id,{...v,productInfo:c});l(p),r(qe(p,e.id,{...e,...v,productInfo:c,pendingRewriteTaskId:S}))},[e,c,S,r,l]),Je=s.useCallback(async i=>{const v=await xe(e.id,i);l(v),r(qe(v,e.id,{...e,...i,productInfo:c,pendingRewriteTaskId:S}))},[e,c,S,r,l]),ue=s.useCallback((i,v,p)=>{const C=g.map(be=>be.id===i?{...be,[v]:p}:be);Oe(C)},[g,Oe]),Pe=s.useCallback((i,v)=>{const C=(e.characters||e.analysis.characters||[]).map(be=>be.id===i?{...be,description:v}:be);Je({characters:C})},[e.characters,e.analysis.characters,Je]),B=s.useCallback(async()=>{var i;if(!((i=c.prompt)!=null&&i.trim())){N("请填写提示词");return}if(!(Q.current||S)){Q.current=!0,j(!0),N(""),Y("AI 改编中 0%"),$e.trackUIInteraction({area:"popular_video_tool",action:"script_rewrite_started",control:"rewrite_script",source:"video_analyzer_script_page",metadata:{shotCount:g.length,promptLength:c.prompt.trim().length,hasModelRef:!!U}});try{const v=ys({recordAnalysis:e.analysis,productInfo:c,videoModel:f,characters:ce}),p=ze.createTask({prompt:`改编脚本:${c.prompt.slice(0,40)}`,model:X,modelRef:U||null,videoAnalyzerAction:"rewrite",videoAnalyzerPrompt:v,videoAnalyzerRecordId:e.id,autoInsertToCanvas:!1},ge.CHAT);T(p.id),Y(`AI 改编中 ${Math.round(p.progress??0)}%`);const C=await xe(e.id,{pendingRewriteTaskId:p.id});l(C),r(qe(C,e.id,{...e,pendingRewriteTaskId:p.id}))}catch(v){Q.current=!1,N(v.message||"改编失败")}finally{j(!1)}}},[e,c,g,f,ce,X,U,r,l,S]);s.useEffect(()=>{var p;if(!S)return;const i=ze.getTask(S);if((i==null?void 0:i.status)==="failed"){Q.current=!1,T(null),Y(""),N(((p=i.error)==null?void 0:p.message)||"改编失败"),xe(e.id,{pendingRewriteTaskId:null}).then(C=>{l(C),r(qe(C,e.id,{...e,pendingRewriteTaskId:null}))});return}if((i==null?void 0:i.status)==="completed"){Lt(i).then(C=>{if(!C){N("改编任务已完成,但未找到可回填的记录");return}l(C.records),r(C.record),k(Et(C.record)),I(C.record.editedShots||C.record.analysis.shots)}).catch(C=>{N(C.message||"改编结果同步失败")}).finally(()=>{Q.current=!1,T(null),Y("")});return}typeof(i==null?void 0:i.progress)=="number"&&Y(`AI 改编中 ${Math.round(i.progress)}%`);const v=ze.observeTaskUpdates().subscribe(C=>{var be;if(C.task.id===S){if(C.task.status==="failed"){Q.current=!1,T(null),Y(""),N(((be=C.task.error)==null?void 0:be.message)||"改编失败"),xe(e.id,{pendingRewriteTaskId:null}).then(W=>{l(W),r(qe(W,e.id,{...e,pendingRewriteTaskId:null}))});return}if(C.task.status==="completed"){Lt(C.task).then(W=>{if(!W){N("改编任务已完成,但未找到可回填的记录");return}l(W.records),r(W.record),k(Et(W.record)),I(W.record.editedShots||W.record.analysis.shots)}).catch(W=>{N(W.message||"改编结果同步失败")}).finally(()=>{Q.current=!1,T(null),Y("")});return}typeof C.task.progress=="number"&&Y(`AI 改编中 ${Math.round(C.task.progress)}%`)}});return()=>v.unsubscribe()},[S,e.id,r,l]);const Be=s.useCallback(async()=>{await Ot("text",$t(g,e.analysis,c)),$e.trackUIInteraction({area:"popular_video_tool",action:"script_inserted_to_canvas",control:"insert_script",source:"video_analyzer_script_page",metadata:{shotCount:g.length}})},[g,c,e]),De=s.useCallback(async i=>{const v=Za(e,i);if(!v)return;le(!1),I(v.editedShots);const p=await xe(e.id,v);l(p),r(qe(p,e.id,{...e,...v}))},[e,r,l]);return s.useEffect(()=>{if(!ie)return;const i=v=>{L.current&&!L.current.contains(v.target)&&le(!1)};return document.addEventListener("mousedown",i),()=>document.removeEventListener("mousedown",i)},[ie]),t.jsxs("div",{className:"va-page",children:[t.jsxs("div",{className:"va-product-form",children:[t.jsx("textarea",{ref:Ye,className:"va-form-textarea va-auto-resize",placeholder:"描述你想要的视频内容,如:拖鞋,生活用品,主打防滑...",rows:Math.max(3,We(c.prompt)),value:c.prompt,onChange:i=>k(v=>({...v,prompt:i.target.value})),onInput:i=>He(i.currentTarget)}),t.jsx(Ya,{value:c.creativeBrief,onChange:i=>k(v=>({...v,creativeBrief:i})),videoStyle:c.videoStyle||"",onVideoStyleChange:i=>k(v=>({...v,videoStyle:i}))}),t.jsx("div",{className:"va-form-row",children:t.jsxs("div",{style:{flex:1},children:[t.jsx("label",{className:"va-edit-label",children:"BGM 情绪"}),t.jsx("textarea",{ref:Ye,className:"va-edit-textarea va-auto-resize",rows:We(c.bgmMood),value:c.bgmMood||"",onChange:i=>k(v=>({...v,bgmMood:i.target.value})),onInput:i=>He(i.currentTarget),placeholder:"如:轻快、治愈、科技感"})]})}),t.jsxs("div",{className:"va-model-select",children:[t.jsx("label",{className:"va-model-label",children:"改编模型"}),t.jsx(Ft,{variant:"form",selectedModel:X,selectedSelectionKey:Ee(X,U),onSelect:me,models:ae,placement:"down",disabled:O,placeholder:"选择文本模型"})]}),t.jsx(qa,{selectedModel:f,selectedSelectionKey:Ee(f,A),onSelectModel:$,models:pe,segmentDuration:K,durationOptions:ee,onSegmentDurationChange:i=>k(v=>({...v,segmentDuration:i})),targetDuration:c.targetDuration??e.analysis.totalDuration,onTargetDurationChange:i=>k(v=>({...v,targetDuration:i||void 0})),disabled:O,placement:"down",overflowText:_e.overflow>0?`实际 ${_e.actualTotal}s(+${parseFloat(_e.overflow.toFixed(2))}s)`:void 0}),t.jsxs("div",{className:"va-version-row",children:[t.jsx("button",{className:"va-analyze-btn",onClick:B,disabled:O||!!S,style:{flex:1},children:O||S?G||"AI 改编中...":"AI 改编脚本"}),e.scriptVersions&&e.scriptVersions.length>0&&t.jsxs("div",{className:"va-version-select",ref:L,children:[t.jsxs("button",{className:"va-version-btn",onClick:()=>le(i=>!i),children:[e.activeVersionId===ea?"原始分析":((de=e.scriptVersions.find(i=>i.id===e.activeVersionId))==null?void 0:de.label)||`v${e.scriptVersions.length}`," ▾"]}),ie&&t.jsxs("div",{className:"va-version-menu",children:[e.scriptVersions.map(i=>t.jsxs("div",{className:`va-version-item ${i.id===e.activeVersionId?"active":""}`,onClick:()=>De(i.id),children:[t.jsx("span",{children:i.label}),i.prompt&&t.jsx("span",{className:"va-version-prompt",children:i.prompt.length>30?i.prompt.slice(0,30)+"...":i.prompt}),t.jsxs("span",{className:"va-version-time",children:[i.shots.length," 镜头 · ",new Date(i.createdAt).toLocaleTimeString()]})]},i.id)),t.jsxs("div",{className:`va-version-item ${e.activeVersionId===ea||!e.activeVersionId?"active":""}`,onClick:()=>De(ea),children:[t.jsx("span",{children:"原始分析"}),t.jsxs("span",{className:"va-version-time",children:[e.analysis.shots.length," 镜头 · ",new Date(e.createdAt).toLocaleTimeString()]})]})]})]})]}),J&&t.jsx("div",{className:"va-error",children:J})]}),t.jsx(bs,{characters:ce,onChange:Pe}),t.jsx("div",{className:"va-shots",children:g.map((i,v)=>t.jsx(va,{shot:i,index:v,compact:!0,children:t.jsxs("div",{className:"va-edit-fields",children:[t.jsx("label",{className:"va-edit-label",children:"画面描述"}),t.jsx("textarea",{ref:Ye,className:"va-edit-textarea va-auto-resize",rows:We(i.description),value:i.description||"",onChange:p=>ue(i.id,"description",p.target.value),onInput:p=>He(p.currentTarget)}),t.jsx("label",{className:"va-edit-label",children:"旁白"}),t.jsx("textarea",{ref:Ye,className:"va-edit-textarea va-auto-resize",rows:We(i.narration),value:i.narration||"",onChange:p=>ue(i.id,"narration",p.target.value),onInput:p=>He(p.currentTarget)}),t.jsx("label",{className:"va-edit-label",children:"角色说话"}),t.jsx("textarea",{ref:Ye,className:"va-edit-textarea va-auto-resize",rows:We(i.dialogue),value:i.dialogue||"",onChange:p=>ue(i.id,"dialogue",p.target.value),onInput:p=>He(p.currentTarget),placeholder:'多角色时按"角色名: 台词"分行'}),t.jsx("label",{className:"va-edit-label",children:"对白角色"}),t.jsx("input",{className:"va-form-input",type:"text",value:i.dialogue_speakers||"",onChange:p=>ue(i.id,"dialogue_speakers",p.target.value),placeholder:"如:主讲人 或 主讲人|顾客"}),t.jsx("label",{className:"va-edit-label",children:"旁白/对白关系"}),t.jsx(ta,{value:i.speech_relation||"",onChange:p=>ue(i.id,"speech_relation",p),options:hr,placeholder:"选择关系"}),t.jsx("label",{className:"va-edit-label",children:"运镜方式"}),t.jsx(ta,{value:i.camera_movement||"",onChange:p=>ue(i.id,"camera_movement",p),options:fr,placeholder:"选择或输入运镜方式"}),t.jsx("label",{className:"va-edit-label",children:"首帧 Prompt"}),t.jsx("textarea",{ref:Ye,className:"va-edit-textarea va-auto-resize",rows:We(i.first_frame_prompt),value:i.first_frame_prompt||"",onChange:p=>ue(i.id,"first_frame_prompt",p.target.value),onInput:p=>He(p.currentTarget)}),t.jsx("label",{className:"va-edit-label",children:"尾帧 Prompt"}),t.jsx("textarea",{ref:Ye,className:"va-edit-textarea va-auto-resize",rows:We(i.last_frame_prompt),value:i.last_frame_prompt||"",onChange:p=>ue(i.id,"last_frame_prompt",p.target.value),onInput:p=>He(p.currentTarget)}),t.jsx("label",{className:"va-edit-label",children:"转场方式"}),t.jsx(ta,{value:i.transition_hint||"",onChange:p=>ue(i.id,"transition_hint",p),options:vr,placeholder:"选择转场方式"})]})},i.id))}),t.jsxs("div",{className:"va-page-actions",children:[t.jsx("button",{onClick:Be,children:"脚本插入画布"}),h&&t.jsx("button",{className:"va-btn-primary",onClick:h,children:"下一步:批量生成 →"})]})]})};function yr(e,r,l){var h,c,k,g,I;return{recordId:e.id,fileNamePrefix:"va",zipBaseName:"video_analyzer_assets",scriptMarkdown:$t(r,e.analysis,e.productInfo),recordMeta:{id:e.id,source:e.source,sourceLabel:e.sourceLabel,prompt:((h=e.productInfo)==null?void 0:h.prompt)||"",aspectRatio:e.analysis.aspect_ratio||"16x9",videoStyle:((c=e.productInfo)==null?void 0:c.videoStyle)||e.analysis.video_style||"",bgmMood:((k=e.productInfo)==null?void 0:k.bgmMood)||e.analysis.bgm_mood||"",creativeBrief:((g=e.productInfo)==null?void 0:g.creativeBrief)||{},creativeBriefSummary:_s((I=e.productInfo)==null?void 0:I.creativeBrief),shotCount:r.length},shots:r,assets:l}}function br(e,r){const l=e.characters||e.analysis.characters||[];return Gs(r,l)}const Dt="video-analyzer:image-model",Rt="video-analyzer:video-model";function Ba(e,r){const l=Object.keys(e),h=Object.keys(r);return l.length!==h.length?!1:l.every(c=>e[c]===r[c])}function Ga(e,r){return r.reduce((l,h)=>{var g;const c=e[h.id];return(h.valueType==="enum"?(g=h.options)==null?void 0:g.some(I=>I.value===c):typeof c=="string"&&c.trim()!=="")&&c?(l[h.id]=c,l):(h.defaultValue&&(l[h.id]=h.defaultValue),l)},{})}function Ha(e,r,l){return{...e,...r!=null?{duration:String(r)}:{},...l?{size:l}:{}}}function Ka(e,r,l){const{duration:h,size:c,...k}=e;return{extraParams:k,duration:h||r,size:c||l}}function _r(e){if(!e||e==="auto")return;const r=e.trim().replace(/[xX]/g,":");return/^\d+:\d+$/.test(r)?r:void 0}const ma=({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"})]}),Ir=({record:e,onRecordUpdate:r,onRecordsChange:l,onRestart:h})=>{const c=s.useMemo(()=>e.editedShots||e.analysis.shots,[e.editedShots,e.analysis.shots]),k=e.analysis.aspect_ratio||"16x9",g=e.batchId||`va_${e.id}`,{openDialog:I,board:O}=ha(),j=s.useRef(e),S=s.useRef(c),T=s.useRef(!1),G=s.useRef(!1),Y=s.useRef(null),J=s.useRef(null),N=s.useRef(new Set),ie=s.useRef(new Set),[le,L]=s.useState([]),[Q,X]=s.useState(null),he=dt("image"),U=dt("video"),[D,me]=s.useState(()=>we(Dt,"").modelId),[ae,pe]=s.useState(()=>we(Dt,"").modelRef),[f,R]=s.useState(()=>{const a=we(Dt,"");return a.modelId?Da(a.modelId,Ee(a.modelId,a.modelRef)).extraParams:{}}),[A,q]=s.useState(()=>{var a;return((a=e.productInfo)==null?void 0:a.videoModel)||we(Rt,"veo3").modelId}),[$,ee]=s.useState(()=>{var a,n;return((a=e.productInfo)==null?void 0:a.videoModelRef)||we(Rt,((n=e.productInfo)==null?void 0:n.videoModel)||"veo3").modelRef}),[K,_e]=s.useState(()=>{var y,d,M,x,E;const a=we(Rt,((y=e.productInfo)==null?void 0:y.videoModel)||"veo3"),n=((d=e.productInfo)==null?void 0:d.videoModel)||a.modelId,o=((M=e.productInfo)==null?void 0:M.videoModelRef)||a.modelRef,u=Ra(n,Ee(n,o));return Ha(u.extraParams,((x=e.productInfo)==null?void 0:x.segmentDuration)||u.duration,Ma(n,((E=e.productInfo)==null?void 0:E.videoSize)||u.size,k))}),[ce,ye]=s.useState({running:!1,stopping:!1,currentIndex:-1,retryCount:0,completedCount:0,activeCount:0}),[Oe,Je]=s.useState(!1),ue=s.useMemo(()=>Is(D),[D]),Pe=s.useMemo(()=>xs(A,$||A,K),[A,$,K]),B=s.useMemo(()=>Ss(A,$||A,K),[A,$,K]),Be=s.useMemo(()=>B.sizeOptions,[B]),De=s.useMemo(()=>Ka(K,B.defaultDuration,B.defaultSize),[B.defaultDuration,B.defaultSize,K]),de=De.size,i=Number.parseFloat(De.duration)||8,v=s.useMemo(()=>Object.keys(f).length>0?f:void 0,[f]),p=s.useMemo(()=>e.characters||e.analysis.characters||[],[e.characters,e.analysis.characters]),C=s.useMemo(()=>{const a=e.sourceSnapshot,o=((a==null?void 0:a.type)==="prompt"?a.prompt:"")||(e.source==="prompt"?e.sourceLabel:""),u=[e.source!=="prompt"&&e.sourceLabel?`素材来源:${e.sourceLabel}`:"",(a==null?void 0:a.type)==="prompt"&&a.pdfName?`参考 PDF:${a.pdfName}`:""].filter(Boolean).join(`
|
|
3
|
+
`);return{...e.productInfo||{},generationTopic:o,generationContext:u,generationAdvice:e.analysis.suggestion||""}},[e.analysis.suggestion,e.productInfo,e.source,e.sourceLabel,e.sourceSnapshot]),be=s.useMemo(()=>Hs(c),[c]);s.useEffect(()=>{j.current=e},[e]),s.useEffect(()=>{S.current=c},[c]);const W=s.useCallback(async a=>{const n=j.current,o={...n,...a};j.current=o,o.editedShots&&(S.current=o.editedShots);const u=await xe(n.id,a);return l(u),r(o),o},[r,l]),Ne=s.useCallback(async a=>{const n=j.current,o=Ze(n,a);return S.current=a,await W(o),a},[W]),Le=s.useCallback(async a=>{const n=j.current,o={...Ut(n.productInfo||{prompt:""},n.analysis.totalDuration),...a};return await W({productInfo:o}),o},[W]),Te=s.useCallback(async(a,n)=>{const o=j.current,y=(o.characters||o.analysis.characters||[]).map(d=>d.id===a?{...d,referenceImageUrl:n}:d);await W({characters:y})},[W]),Bt=s.useCallback(a=>{const n=`va_${e.id}_char${a.id}_ref`,o=ka(a,e.analysis,C);I(Tt.aiImageGeneration,{initialPrompt:o,batchId:n,initialAspectRatio:"1:1",initialModel:D||void 0,initialModelRef:ae,assetMetadata:{category:aa.CHARACTER,characterName:a.name,characterPrompt:o}})},[C,e.analysis,e.id,I,D,ae]),Qe=s.useCallback((a,n)=>{const o=n||null;me(a),pe(o),R(Da(a,Ee(a,o)).extraParams),ut(Dt,a,n)},[]),Ue=s.useCallback((a,n)=>{const o=n||null;q(a),ee(o),ut(Rt,a,n);const u=Ra(a,Ee(a,o));_e(Ha(u.extraParams,u.duration,Ma(a,u.size,k)))},[k]),et=s.useCallback((a,n)=>{R(o=>{const u={...o};return!n||n==="default"?delete u[a]:u[a]=n,u})},[]),Ke=s.useCallback((a,n)=>{_e(o=>{const u={...o};return!n||n==="default"?delete u[a]:u[a]=n,u})},[]);s.useEffect(()=>{const a=Ga(f,ue);Ba(f,a)||R(a)},[ue,f]),s.useEffect(()=>{const a=Ga(K,Pe);Ba(K,a)||_e(a)},[Pe,K]),s.useEffect(()=>{const a=Ka(K,B.defaultDuration,B.defaultSize);Zs({currentModel:A,currentSelectionKey:Ee(A,$),extraParams:a.extraParams,duration:a.duration,size:a.size}),Le({videoModel:A,videoModelRef:$||null,segmentDuration:Number.parseFloat(a.duration)||8,videoSize:a.size})},[Le,A,B.defaultDuration,B.defaultSize,$,K]);const Gt=s.useCallback(async()=>{try{const a=j.current,n=S.current;if(!O)throw new Error("画布未就绪");Ea(O);const o=await Ot("text",$t(n,a.analysis,a.productInfo));if(!o.success)throw new Error(o.error||"插入失败,请确认画布已打开");$e.trackUIInteraction({area:"popular_video_tool",action:"script_inserted_to_canvas",control:"insert_script",source:"video_analyzer_generate_page",metadata:{shotCount:n.length}}),Se.success("脚本已插入画布")}catch(a){console.error("[VideoAnalyzer] Failed to insert script to canvas:",a);const n=a instanceof Error?a.message:"脚本插入画布失败";Se.error(n)}},[O]),mt=s.useCallback(async a=>{if(!O)return!1;try{Ea(O);const n=await Ot("video",a);if(!n.success)throw new Error(n.error||"插入失败,请确认画布已打开");return!0}catch(n){return console.error("[VideoAnalyzer] Failed to insert generated video to canvas:",n),!1}},[O]),{isExportingAssets:gt,exportProgress:yt,handleExportAssets:Ht}=Cs({onExport:async a=>{const n=j.current,o=S.current;return await qs({...yr(n,o,be),onProgress:a})},onExportSuccess:a=>{Se.success(`素材导出完成,共 ${a.assetCount} 个文件`)},onExportError:a=>{console.error("[VideoAnalyzer] Failed to export assets:",a),Se.error("素材导出失败")}}),tt=s.useMemo(()=>le.map(a=>a.url).filter(Boolean),[le]),bt=s.useCallback(async()=>{e.batchId||await W({batchId:g})},[e.batchId,g,W]),{tasks:_t}=Xa(),Fe=s.useRef(new Set),at=s.useRef(new Set),It=s.useCallback(async(a,n,o)=>{let u=[...n],y=!1;for(const{shotId:d,videoUrl:M}of o){const x=`auto_${d}`;if(!at.current.has(x)){at.current.add(x);try{const E=u.findIndex(b=>b.id===d);if(E===-1)continue;const z=u[E+1];if(!z)continue;const Z=await Ks(M,z.id,"first","last");if(!Z||z.generated_first_frame_url===Z)continue;u=u.map((b,P)=>P===E+1?{...b,generated_first_frame_url:Z}:b),y=!0}finally{at.current.delete(x)}}}if(y){const d=e;xe(a,Ze(d,u)).then(M=>{l(M),r({...d,editedShots:u})})}},[e,r,l]);s.useEffect(()=>{var x,E,z,Z;const a=`va_${e.id}_shot`,n=`va_${e.id}_char`;let o=!1;const u=e,y=j.current.generatedAssetsResetAt||u.generatedAssetsResetAt;let d=u.editedShots||u.analysis.shots;const M=[];for(const b of _t){if(b.status!==Ve.COMPLETED||Fe.current.has(b.id))continue;const P=(x=b.params)==null?void 0:x.batchId;if(!P)continue;if(P.startsWith(n)){if(y&&b.createdAt<=y){Fe.current.add(b.id);continue}const re=(E=b.result)==null?void 0:E.url;if(Fe.current.add(b.id),re){const ke=P.slice(n.length),it=ke.lastIndexOf("_ref");if(it!==-1){const Pt=ke.slice(0,it),os=(j.current.characters||j.current.analysis.characters||[]).map(Jt=>Jt.id===Pt?{...Jt,referenceImageUrl:re}:Jt);W({characters:os})}}continue}if(!P.startsWith(a))continue;if(y&&b.createdAt<=y){Fe.current.add(b.id);continue}if(e.storyboardGeneratedAt&&b.createdAt<e.storyboardGeneratedAt){Fe.current.add(b.id);continue}const H=(z=b.result)==null?void 0:z.url;if(!H)continue;const te=P.slice(a.length),ne=te.lastIndexOf("_");if(ne===-1)continue;const oe=te.slice(0,ne),V=te.slice(ne+1);if(V!=="first"&&V!=="last"&&V!=="video")continue;const Ae=V==="first"?"generated_first_frame_url":V==="last"?"generated_last_frame_url":"generated_video_url",Ce=d.find(re=>re.id===oe),Ie=V==="video"&&ie.current.has(b.id),ve=(Z=Ce==null?void 0:Ce.suppressed_generated_urls)==null?void 0:Z[V];if(ve&&ve===H){Ie&&ie.current.delete(b.id),Fe.current.add(b.id);continue}if(!Ce||Ce[Ae]===H){Ie&&ie.current.delete(b.id),Fe.current.add(b.id);continue}d=d.map(re=>re.id===oe?{...re,[Ae]:H,suppressed_generated_urls:re.suppressed_generated_urls?{...re.suppressed_generated_urls,[V]:void 0}:void 0}:re),Fe.current.add(b.id),o=!0,V==="video"&&(Ie?ie.current.delete(b.id):M.push({shotId:oe,videoUrl:H}))}o&&xe(u.id,Ze(u,d)).then(b=>{l(b),r({...u,editedShots:d})}),M.length>0&&!G.current&&It(u.id,d,M)},[_t,It,e,r,l,W]);const[je,st]=s.useState(null),pt=s.useCallback((a,n)=>{st({shotId:a,assetType:n})},[]),Kt=s.useCallback(async a=>{if(!je)return;st(null);const{shotId:n,assetType:o}=je,u=o==="first"?"generated_first_frame_url":o==="last"?"generated_last_frame_url":"generated_video_url",d=(e.editedShots||e.analysis.shots).map(x=>x.id===n?{...x,[u]:a.url}:x),M=await xe(e.id,Ze(e,d));l(M),r({...e,editedShots:d})},[je,e,l,r]),[m,_]=s.useState(null),w=s.useRef(null),F=s.useCallback(()=>{w.current!==null&&(window.clearTimeout(w.current),w.current=null)},[]),se=s.useCallback(()=>{F(),_(null)},[F]),fe=s.useCallback(()=>{F(),w.current=window.setTimeout(()=>{w.current=null,_(null)},120)},[F]),Me=s.useCallback((a,n,o)=>{F();const u=o.currentTarget.getBoundingClientRect();_({url:a,type:n,x:u.left+u.width/2,y:u.top-8})},[F]),Re=s.useCallback(()=>{fe()},[fe]),ts=s.useCallback(()=>{F()},[F]),as=s.useCallback(()=>{se()},[se]);s.useEffect(()=>()=>{F()},[F]);const ft=s.useMemo(()=>{var n;const a=(n=Be.find(o=>o.value===de))==null?void 0:n.aspectRatio;if(a)return a;if(de!=null&&de.includes("x")){const[o,u]=de.split("x").map(Number);if(o&&u){const y=(M,x)=>x===0?M:y(x,M%x),d=y(o,u);return`${o/d}:${u/d}`}}return k.replace("x",":")},[k,Be,de]),Wt=ft,rt=_r(f.size),xt=f.size||Wt;s.useEffect(()=>{D&&Xs({currentModel:D,currentSelectionKey:Ee(D,ae),extraParams:f,aspectRatio:rt||Wt})},[Wt,D,ae,f,rt]);const Ge=s.useCallback(a=>a.map(n=>({url:n.url,name:n.name})),[]),St=s.useCallback((a=[],n=[])=>a.length===n.length&&a.every((o,u)=>{var y,d;return o.url===((y=n[u])==null?void 0:y.url)&&o.name===((d=n[u])==null?void 0:d.name)}),[]),Ct=s.useCallback((...a)=>{const n=new Set,o=[];return a.forEach(u=>{u==null||u.forEach(y=>{var M;const d=(M=y.url)==null?void 0:M.trim();!d||n.has(d)||(n.add(d),o.push({url:d,name:y.name||"参考图"}))})}),o.length>0?o:void 0},[]),wt=s.useCallback(a=>{var o;if(!((o=a.character_ids)!=null&&o.length))return[];const n=new Set;return a.character_ids.reduce((u,y)=>{var x;const d=p.find(E=>E.id===y),M=(x=d==null?void 0:d.referenceImageUrl)==null?void 0:x.trim();return!M||n.has(M)||(n.add(M),u.push({url:M,name:d!=null&&d.name?`角色:${d.name}`:"角色参考图"})),u},[])},[p]),nt=s.useCallback(async(a,n,o)=>{let u=!1;const y=Ge(o.images),d=S.current.map(M=>{if(M.id!==a)return M;if(n==="first"){const z=M.first_frame_draft,Z={prompt:o.prompt,images:y,aspectRatio:o.aspectRatio};return(z==null?void 0:z.prompt)===Z.prompt&&(z==null?void 0:z.aspectRatio)===Z.aspectRatio&&St(z==null?void 0:z.images,Z.images)?M:(u=!0,{...M,first_frame_draft:Z})}if(n==="last"){const z=M.last_frame_draft,Z={prompt:o.prompt,images:y,aspectRatio:o.aspectRatio};return(z==null?void 0:z.prompt)===Z.prompt&&(z==null?void 0:z.aspectRatio)===Z.aspectRatio&&St(z==null?void 0:z.images,Z.images)?M:(u=!0,{...M,last_frame_draft:Z})}const x=M.video_draft,E={prompt:o.prompt,images:y,duration:o.duration,size:o.size};return(x==null?void 0:x.prompt)===E.prompt&&(x==null?void 0:x.duration)===E.duration&&(x==null?void 0:x.size)===E.size&&St(x==null?void 0:x.images,E.images)?M:(u=!0,{...M,video_draft:E})});u&&await Ne(d)},[Ne,St,Ge]),Yt=s.useCallback(a=>{const n=a.first_frame_prompt||a.description||"";if(!n)return;$e.trackUIInteraction({area:"popular_video_tool",action:"shot_first_frame_generation_opened",control:"generate_first_frame",source:"video_analyzer_generate_page",metadata:{shotId:a.id,hasDraft:!!a.first_frame_draft}});const o=sa(n,e.analysis,C,{shot:a,characters:p}),u=a.first_frame_draft,y=u?Ge(u.images||[]):void 0,d=!u&&a.generated_first_frame_url?[{url:a.generated_first_frame_url,name:"首帧"}]:void 0,M=wt(a),x=`va_${e.id}_shot${a.id}_first`;I(Tt.aiImageGeneration,{initialPrompt:(u==null?void 0:u.prompt)||o,batchId:x,initialAspectRatio:(u==null?void 0:u.aspectRatio)??rt,initialModel:D||void 0,initialModelRef:ae,initialImages:Ct(y,d,M),onDraftChange:E=>nt(a.id,"first",E)})},[e,C,p,I,D,ae,Ct,wt,nt,rt,Ge]),ht=s.useCallback((a,n)=>{if(a.generated_last_frame_url)return a.generated_last_frame_url;const o=c[n+1];return o==null?void 0:o.generated_first_frame_url},[c]),jt=s.useCallback((a,n)=>{const o=a.last_frame_prompt||"";if(!o)return;$e.trackUIInteraction({area:"popular_video_tool",action:"shot_last_frame_generation_opened",control:"generate_last_frame",source:"video_analyzer_generate_page",metadata:{shotId:a.id,shotIndex:n,hasDraft:!!a.last_frame_draft}});const u=sa(o,e.analysis,C,{shot:a,characters:p}),y=a.last_frame_draft,d=y?Ge(y.images||[]):void 0,M=`va_${e.id}_shot${a.id}_last`,x=ht(a,n),E=!y&&x?[{url:x,name:"尾帧"}]:void 0,z=wt(a);I(Tt.aiImageGeneration,{initialPrompt:(y==null?void 0:y.prompt)||u,batchId:M,initialAspectRatio:(y==null?void 0:y.aspectRatio)??rt,initialModel:D||void 0,initialModelRef:ae,initialImages:Ct(d,E,z),onDraftChange:Z=>nt(a.id,"last",Z)})},[e,C,p,I,ht,D,ae,Ct,wt,nt,rt,Ge]),qt=s.useCallback((a,n)=>{$e.trackUIInteraction({area:"popular_video_tool",action:"shot_video_generation_opened",control:"generate_shot_video",source:"video_analyzer_generate_page",metadata:{shotId:a.id,shotIndex:n,hasDraft:!!a.video_draft}});const o=a.video_draft,u=`va_${e.id}_shot${a.id}_video`,y=[];a.generated_first_frame_url&&y.push({url:a.generated_first_frame_url,name:"首帧"});const d=ht(a,n);d&&y.push({url:d,name:"尾帧"});const M=Ge((o==null?void 0:o.images)||[]),x=M.length>0?M:y.length>0?y:void 0,E=Na(a,e.analysis,C,{referenceImageDescriptions:ws(x)});if(!E)return;const z=String((o==null?void 0:o.duration)??i),Z=B.durationOptions.some(P=>P.value===z)?(o==null?void 0:o.duration)??i:void 0,b=B.sizeOptions.some(P=>P.value===((o==null?void 0:o.size)??de))?(o==null?void 0:o.size)??de:void 0;I(Tt.aiVideoGeneration,{initialPrompt:(o==null?void 0:o.prompt)||E,initialImages:x,initialDuration:Z,initialSize:b,initialModel:A||void 0,initialModelRef:$,batchId:u,onDraftChange:P=>nt(a.id,"video",P)})},[e.id,i,de,A,B,$,I,ht,e.analysis,C,nt,Ge]),Zt=s.useCallback((a,n)=>{const o=n==="first"?"generated_first_frame_url":n==="last"?"generated_last_frame_url":"generated_video_url",y=(e.editedShots||e.analysis.shots).map(d=>d.id===a?{...d,[o]:void 0,suppressed_generated_urls:d[o]?{...d.suppressed_generated_urls||{},[n]:d[o]}:d.suppressed_generated_urls}:d);xe(e.id,Ze(e,y)).then(d=>{l(d),r({...e,editedShots:y})})},[e,r,l]),Mt=s.useCallback(async(a,n,o)=>{var b,P,H;const u=o==="first"?a.first_frame_prompt||a.description||"":a.last_frame_prompt||"";if(!u)return null;const y=sa(u,e.analysis,C,{shot:a,characters:n}),d=[...tt];if(a.character_ids&&a.character_ids.length>0)for(const te of a.character_ids){const ne=n.find(oe=>oe.id===te);ne!=null&&ne.referenceImageUrl&&!d.includes(ne.referenceImageUrl)&&d.push(ne.referenceImageUrl)}const M=`va_${e.id}_shot${a.id}_${o}`,x=await na.executeTool({name:"generate_image",arguments:{prompt:y.trim(),count:1,size:xt,referenceImages:d.length>0?d:void 0,batchId:M,...D?{model:D,modelRef:ae}:{},...v?{params:v}:{}}},{mode:"queue"}),E=x.taskId||((b=x.data)==null?void 0:b.taskId);if(!x.success||!E)return null;N.current.add(E),J.current=E,ye(te=>({...te,activeCount:N.current.size}));let z;try{z=await oa(E,(P=Y.current)==null?void 0:P.signal)}finally{N.current.delete(E),J.current===E&&(J.current=null),ye(te=>({...te,activeCount:N.current.size}))}if(!z.success)return null;const Z=z.task||ze.getTask(E);return((H=Z==null?void 0:Z.result)==null?void 0:H.url)||null},[e,C,v,xt,D,ae,tt]),ga=s.useCallback((a,n)=>Mt(a,n,"first"),[Mt]),ya=s.useCallback((a,n)=>Mt(a,n,"last"),[Mt]),ba=s.useCallback(async(a,n)=>{const o=S.current,u=o.find(d=>d.id===a);if(!u||u.generated_first_frame_url===n)return o;const y=o.map(d=>d.id===a?{...d,generated_first_frame_url:n}:d);return await Ne(y),y},[Ne]),_a=s.useCallback(async(a,n)=>{const o=S.current,u=o.find(d=>d.id===a);if(!u||u.generated_last_frame_url===n)return o;const y=o.map(d=>d.id===a?{...d,generated_last_frame_url:n}:d);return await Ne(y),y},[Ne]),ot=s.useCallback(a=>S.current.find(n=>n.id===a),[]),Ia=s.useCallback(async(a,n)=>{const o=S.current.find(y=>y.id===a);if(!o||o.generated_video_url===n)return S.current;const u=S.current.map(y=>y.id===a?{...y,generated_video_url:n}:y);return await Ne(u),u},[Ne]),xa=s.useCallback(async(a,n)=>{var b;const o=a.generated_first_frame_url,u=n||a.generated_last_frame_url,{referenceImages:y,referenceImageDescriptions:d}=Ws({model:A,firstFrameUrl:o,lastFrameUrl:u,extraReferenceUrls:tt}),M=Na(a,e.analysis,C,{referenceImageDescriptions:d});if(!M)return null;const x=`va_${e.id}_shot${a.id}_video`,E={...De.extraParams,...B.provider==="seedance"?{aspect_ratio:ft}:{}},z=await na.executeTool({name:"generate_video",arguments:{prompt:M,size:De.size,seconds:De.duration,count:1,batchId:x,model:A,modelRef:$,referenceImages:y,params:Object.keys(E).length>0?E:void 0}},{mode:"queue"}),Z=z.taskId||((b=z.data)==null?void 0:b.taskId);if(!z.success||!Z)throw new Error(z.error||"创建视频任务失败");return Z},[e.analysis,e.id,C,tt,De,A,B.provider,$,ft]),ss=s.useCallback(()=>{var a;T.current=!0,ye(n=>n.running?{...n,stopping:!0}:n),J.current&&ze.cancelTask(J.current);for(const n of N.current)ze.cancelTask(n);(a=Y.current)==null||a.abort()},[]),kt=s.useCallback(()=>{ye(a=>({...a,activeCount:N.current.size}))},[]),Xt=s.useCallback((a,n)=>{ye(o=>({...o,currentIndex:a,retryCount:n,activeCount:N.current.size}))},[]);s.useEffect(()=>()=>{var a;T.current=!0,(a=Y.current)==null||a.abort()},[]);const rs=s.useCallback(async()=>{var n,o;if(G.current||ce.running)return;G.current=!0,$e.trackUIInteraction({area:"popular_video_tool",action:"batch_video_generation_started",control:"generate_all_videos",source:"video_analyzer_generate_page",metadata:{shotCount:S.current.length,insertToCanvasRequested:Oe,hasBoard:!!O}});let a=Oe;a&&!O&&(Se.warning("画布未就绪,本次将只生成不插入画布"),a=!1),await bt(),T.current=!1,Y.current=new AbortController,J.current=null,ye({running:!0,stopping:!1,currentIndex:-1,retryCount:0,completedCount:0,activeCount:0});try{const y=(j.current.characters||j.current.analysis.characters||[]).filter(b=>!b.referenceImageUrl);if(y.length>0&&!T.current){const P=(await Promise.all(y.map(async H=>{var oe,V,Ae;if(T.current)return null;const te=`va_${e.id}_char${H.id}_ref`,ne=ka(H,j.current.analysis,C);try{const Ce=await na.executeTool({name:"generate_image",arguments:{prompt:ne,count:1,size:xt,batchId:te,assetMetadata:{category:aa.CHARACTER,characterName:H.name,characterPrompt:ne},...D?{model:D,modelRef:ae}:{},...v?{params:v}:{}}},{mode:"queue"}),Ie=Ce.taskId||((oe=Ce.data)==null?void 0:oe.taskId);if(!Ie)return null;J.current=Ie,N.current.add(Ie),kt();let ve;try{if(T.current)return ze.cancelTask(Ie),null;ve=await oa(Ie,(V=Y.current)==null?void 0:V.signal)}finally{N.current.delete(Ie),J.current===Ie&&(J.current=null),kt()}if(!ve.success)return null;const re=ve.task||ze.getTask(Ie),ke=(Ae=re==null?void 0:re.result)==null?void 0:Ae.url;return ke?{charId:H.id,url:ke}:null}catch(Ce){return T.current||console.error("[VideoAnalyzer] Character reference generation failed:",{characterId:H.id,error:Ce}),null}}))).filter(H=>!!(H!=null&&H.url));if(P.length>0){const H=new Map(P.map(oe=>[oe.charId,oe.url])),ne=(j.current.characters||j.current.analysis.characters||[]).map(oe=>{const V=H.get(oe.id);return V?{...oe,referenceImageUrl:V}:oe});await W({characters:ne})}}const d=S.current,M=()=>{ye(b=>({...b,completedCount:Math.min(b.completedCount+1,d.length),activeCount:N.current.size}))},x=new Map,E=b=>{var ne;const P=ot(b.id)||b;if(P.generated_first_frame_url)return Promise.resolve(P.generated_first_frame_url);const H=(ne=x.get(b.id))==null?void 0:ne.first;if(H)return H;const te=(async()=>{const oe=j.current.characters||j.current.analysis.characters||[],V=await ga(P,oe);return V&&!T.current&&await ba(P.id,V),V})();return x.set(b.id,{...x.get(b.id)||{},first:te}),te},z=b=>{var ne,oe;const P=ot(b.id)||b;if(P.generated_last_frame_url)return Promise.resolve(P.generated_last_frame_url);if(!((ne=P.last_frame_prompt)!=null&&ne.trim()))return Promise.resolve(null);const H=(oe=x.get(b.id))==null?void 0:oe.last;if(H)return H;const te=(async()=>{const V=j.current.characters||j.current.analysis.characters||[],Ae=await ya(P,V);return Ae&&!T.current&&await _a(P.id,Ae),Ae})();return x.set(b.id,{...x.get(b.id)||{},last:te}),te};for(let b=0;b<d.length;b+=1){const P=d[b],H=d[b+1];E(P).catch(te=>(T.current||console.error("[VideoAnalyzer] Batch first frame generation failed:",{shotId:P.id,error:te}),null)),H&&!P.generated_last_frame_url&&!((n=P.last_frame_prompt)!=null&&n.trim())?E(H).catch(te=>(T.current||console.error("[VideoAnalyzer] Batch next first frame generation failed:",{shotId:H.id,error:te}),null)):(o=P.last_frame_prompt)!=null&&o.trim()&&z(P).catch(te=>(T.current||console.error("[VideoAnalyzer] Batch last frame generation failed:",{shotId:P.id,error:te}),null))}const Z=async(b,P)=>{var H,te,ne,oe;try{if(T.current)return;ye(re=>({...re,currentIndex:P}));let V=ot(b.id)||b;if(V.generated_video_url){a&&await mt(V.generated_video_url);return}const Ae=await E(V);if(Ae&&(V={...V,generated_first_frame_url:Ae}),T.current||(V=ot(b.id)||V,!V.generated_first_frame_url))return;let Ce=V.generated_last_frame_url;if(!Ce)if((H=V.last_frame_prompt)!=null&&H.trim())Ce=await z(V)||void 0;else{const re=d[P+1];Ce=re&&await E(re)||void 0}if(T.current)return;let Ie=0,ve=null;for(;!T.current&&(ve||(ve=await xa(ot(V.id)||V,Ce)),!!ve);){ie.current.add(ve),J.current=ve,N.current.add(ve),Xt(P,Ie);let re;try{re=await oa(ve,(te=Y.current)==null?void 0:te.signal)}finally{N.current.delete(ve),J.current===ve&&(J.current=null),kt()}if(T.current)break;const ke=re.task||ze.getTask(ve),it=(ne=ke==null?void 0:ke.result)==null?void 0:ne.url;if(re.success&&ke&&it){await Ia(V.id,it),a&&await mt(it);break}if((ke==null?void 0:ke.status)===Ve.FAILED){const Pt=Ys(ke,re.error);if(Pt){T.current=!0;for(const Sa of N.current)ze.cancelTask(Sa);N.current.clear(),J.current=null,(oe=Y.current)==null||oe.abort(),Se.error(`视频生成失败且不可重试,已停止:${Pt}`);break}Ie+=1,Xt(P,Ie),ze.retryTask(ve);continue}ve=null}}catch(V){T.current||console.error("[VideoAnalyzer] Batch shot pipeline failed:",{shotId:b.id,error:V})}finally{M()}};await Promise.all(d.map((b,P)=>Z(b,P)))}finally{G.current=!1,J.current=null,N.current.clear(),Y.current=null,ye({running:!1,stopping:!1,currentIndex:-1,retryCount:0,completedCount:0,activeCount:0})}},[ce.running,xa,bt,ga,ya,W,ot,e.id,e.analysis,C,D,v,xt,ae,mt,Oe,kt,Xt,ba,_a,Ia,O]),ns=s.useCallback(async()=>{const a=br(j.current,S.current);await W({...Ze(j.current,a.shots),characters:a.characters,generatedAssetsResetAt:Date.now()})},[W]),Nt=s.useMemo(()=>{const[a,n]=ft.split(":").map(Number);if(!a||!n)return{};const o=Math.round(54*a/n);return{width:Math.max(o,48),height:o<48?Math.round(48*n/a):54}},[ft]);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(Js,{images:le,onImagesChange:L,multiple:!0,label:"参考图 (可选)"}),p.length>0&&t.jsxs("div",{className:"va-characters",children:[t.jsx("div",{className:"va-characters-title",children:"角色"}),p.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(lt,{src:a.referenceImageUrl,alt:a.name,showSkeleton:!1,eager:!0}),t.jsx("button",{className:"va-shot-frame-delete",onClick:()=>void Te(a.id,void 0),children:"×"})]}):t.jsx("span",{className:"va-character-ref-empty",children:"未设置"}),t.jsx("button",{onClick:()=>Bt(a),children:"生成"}),t.jsx("button",{onClick:()=>X(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(Ft,{variant:"form",selectedModel:D,selectedSelectionKey:Ee(D,ae),onSelect:Qe,models:he,placement:"down",placeholder:"选择图片模型"}),ue.length>0&&t.jsx(Fa,{selectedParams:f,onParamChange:et,compatibleParams:ue,modelId:D,placement:"down"})]}),t.jsxs("div",{className:"va-model-select",children:[t.jsx("label",{className:"va-model-label",children:"视频模型"}),t.jsx(Ft,{variant:"form",selectedModel:A,selectedSelectionKey:Ee(A,$),onSelect:Ue,models:U,placement:"down",placeholder:"选择视频模型"}),Pe.length>0&&t.jsx(Fa,{selectedParams:K,onParamChange:Ke,compatibleParams:Pe,modelId:A,placement:"down"})]})]}),ce.running&&t.jsxs("div",{className:"va-batch-config-title",children:["正在并行生成 ",ce.completedCount,"/",c.length," 段",ce.activeCount>0?`,运行中 ${ce.activeCount} 个任务`:"",ce.retryCount>0?`,已重试 ${ce.retryCount} 次`:""]}),t.jsxs("div",{className:"va-page-actions",children:[h&&t.jsx("button",{onClick:h,children:"重新分析"}),t.jsx("button",{onClick:ns,children:"重置生成"}),t.jsxs("label",{className:"va-inline-checkbox",children:[t.jsx("input",{type:"checkbox",checked:Oe,onChange:a=>Je(a.target.checked)}),"生成后插入画布"]}),t.jsx("button",{onClick:rs,disabled:ce.running,children:"全部→生成视频"}),ce.running&&t.jsx("button",{onClick:ss,children:ce.stopping?"停止中…":"停止全部生成"})]})]}),t.jsx("div",{className:"va-shots",children:c.map((a,n)=>t.jsx(va,{shot:a,index:n,actions:t.jsxs(t.Fragment,{children:[a.generated_first_frame_url?t.jsxs("div",{className:"va-shot-frame-thumb",style:Nt,onMouseEnter:o=>Me(a.generated_first_frame_url,"image",o),onMouseLeave:Re,children:[t.jsx(lt,{src:a.generated_first_frame_url,alt:"首帧",showSkeleton:!1,eager:!0,onClick:()=>Yt(a)}),t.jsx("button",{className:"va-shot-frame-delete",onClick:()=>Zt(a.id,"first"),children:"×"}),t.jsx("button",{className:"va-shot-frame-regen",onClick:()=>Yt(a),children:"↻"})]}):a.first_frame_prompt||a.description?t.jsxs("span",{className:"va-shot-frame-btn-group",children:[t.jsx("button",{onClick:()=>Yt(a),children:"生成首帧"}),t.jsx("button",{className:"va-shot-frame-library-btn",onClick:()=>pt(a.id,"first"),children:t.jsx(ct,{content:"从素材库选择",showArrow:!1,children:t.jsx("span",{children:t.jsx(ma,{})})})})]}):null,(()=>{var y;const o=a.generated_last_frame_url||ht(a,n),u=!a.generated_last_frame_url&&o;return a.generated_last_frame_url?t.jsxs("div",{className:"va-shot-frame-thumb",style:Nt,onMouseEnter:d=>Me(a.generated_last_frame_url,"image",d),onMouseLeave:Re,children:[t.jsx(lt,{src:a.generated_last_frame_url,alt:"尾帧",showSkeleton:!1,eager:!0,onClick:()=>jt(a,n)}),t.jsx("button",{className:"va-shot-frame-delete",onClick:()=>Zt(a.id,"last"),children:"×"}),t.jsx("button",{className:"va-shot-frame-regen",onClick:()=>jt(a,n),children:"↻"})]}):u?t.jsxs("div",{className:"va-shot-frame-thumb va-shot-frame-thumb--borrowed",style:Nt,onMouseEnter:d=>Me(o,"image",d),onMouseLeave:Re,children:[t.jsx(lt,{src:o,alt:"尾帧(下一镜头首帧)",showSkeleton:!1,eager:!0,onClick:()=>jt(a,n)}),t.jsx("span",{className:"va-shot-frame-label",children:"下一镜头首帧"})]}):(y=a.last_frame_prompt)!=null&&y.trim()?t.jsxs("span",{className:"va-shot-frame-btn-group",children:[t.jsx("button",{onClick:()=>jt(a,n),children:"生成尾帧"}),t.jsx("button",{className:"va-shot-frame-library-btn",onClick:()=>pt(a.id,"last"),children:t.jsx(ct,{content:"从素材库选择",showArrow:!1,children:t.jsx("span",{children:t.jsx(ma,{})})})})]}):null})(),a.generated_video_url?t.jsxs("div",{className:"va-shot-frame-thumb",style:Nt,onMouseEnter:o=>Me(a.generated_video_url,"video",o),onMouseLeave:Re,children:[t.jsx(Ja,{src:a.generated_video_url,alt:"生成视频缩略图",className:"va-shot-frame-media",thumbnailSize:"small",onClick:()=>qt(a,n),videoProps:{muted:!0,preload:"metadata"}}),t.jsx("button",{className:"va-shot-frame-delete",onClick:()=>Zt(a.id,"video"),children:"×"}),t.jsx("button",{className:"va-shot-frame-regen",onClick:()=>qt(a,n),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:()=>qt(a,n),children:"生成视频"}),t.jsx("button",{className:"va-shot-frame-library-btn",onClick:()=>pt(a.id,"video"),children:t.jsx(ct,{content:"从素材库插入视频",showArrow:!1,children:t.jsx("span",{children:t.jsx(ma,{})})})})]}):null]})},a.id))}),t.jsxs("div",{className:"va-page-actions mv-generate-footer-actions",children:[t.jsx("button",{onClick:()=>void Gt(),disabled:c.length===0||!O,children:"脚本插入画布"}),t.jsx("button",{onClick:()=>void Ht(),disabled:gt||c.length===0,children:gt?`素材下载 ${yt}%`:"素材下载 ZIP"})]}),t.jsx("div",{className:"mv-generate-footer-hint",children:"若有素材未打包成功,解压后在 ZIP 根目录运行 `sh 00.补全下载.sh` 即可按 manifest 补全下载。"}),t.jsx(Va,{isOpen:!!je,onClose:()=>st(null),mode:Pa.SELECT,filterType:(je==null?void 0:je.assetType)==="video"?ra.VIDEO:ra.IMAGE,onSelect:Kt,selectButtonText:(je==null?void 0:je.assetType)==="video"?"使用此视频":"使用此图片"}),t.jsx(Va,{isOpen:!!Q,onClose:()=>X(null),mode:Pa.SELECT,filterType:ra.IMAGE,filterCategory:aa.CHARACTER,onSelect:a=>{if(Q){const n=j.current,o=(n.characters||n.analysis.characters||[]).find(u=>u.id===Q);Te(Q,a.url),o&&Ms(a,{name:o.name,prompt:o.description}).catch(u=>{console.warn("[VideoAnalyzer] Failed to mark asset as character:",u)})}X(null)},selectButtonText:"使用此主体"}),m&&js.createPortal(t.jsx("div",{className:"mv-hover-preview",style:{left:`${m.x}px`,top:`${m.y}px`},onMouseEnter:ts,onMouseLeave:as,children:m.type==="image"?t.jsx(lt,{src:m.url,alt:"Preview",showSkeleton:!1,eager:!0}):t.jsx("video",{src:m.url,controls:!0,muted:!0,preload:"metadata"})}),document.body)]})};function es(e){var r;return e.result?(r=e.result.urls)!=null&&r.length?e.result.urls.filter(Boolean):e.result.url?[e.result.url]:[]:[]}function xr(e){var r,l;return e.result?e.type===ge.VIDEO?((r=e.result.thumbnailUrls)==null?void 0:r[0])||e.result.thumbnailUrl||null:((l=e.result.thumbnailUrls)==null?void 0:l[0])||e.result.url||null:null}function Sr(e){switch(e){case Ve.COMPLETED:return"已完成";case Ve.PROCESSING:return"进行中";case Ve.PENDING:return"等待中";case Ve.FAILED:return"失败";default:return""}}function Cr(e){switch(e){case Ve.COMPLETED:return"completed";case Ve.PROCESSING:return"processing";case Ve.PENDING:return"pending";case Ve.FAILED:return"failed";default:return"pending"}}function wr(e){const r=new Date(e);return`${r.getMonth()+1}/${r.getDate()} ${String(r.getHours()).padStart(2,"0")}:${String(r.getMinutes()).padStart(2,"0")}`}function jr(e){const r=String(e.params.prompt||"");return r.length>40?`${r.slice(0,40)}…`:r}function Mr(e){return e==="youtube"?"🔗":e==="prompt"?"✦":"📁"}const kr=({record:e,related:r,isExpanded:l,onSelect:h,onToggleStar:c,onDelete:k,onToggleExpand:g,onInsertTask:I,onPreviewOpen:O,onSelectScript:j})=>{const S=!!(r&&r.rewrite.length+r.image.length+r.video.length>0),T=r?[...r.image,...r.video]:[];return t.jsxs("div",{className:"va-history-item",onClick:()=>h(e),children:[t.jsxs("div",{className:"va-history-header",children:[t.jsxs("span",{className:"va-history-source",children:[Mr(e.source)," ",e.sourceLabel]}),t.jsx("button",{className:`va-star-btn ${e.starred?"starred":""}`,onClick:G=>c(G,e),children:e.starred?"★":"☆"})]}),t.jsxs("div",{className:"va-history-meta",children:[S&&t.jsxs("button",{className:`va-history-expand-btn ${l?"expanded":""}`,onClick:G=>g(G,e.id),children:[t.jsx(ks,{size:12}),t.jsx("span",{children:l?"收起":"关联任务"})]}),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:G=>k(G,e.id),children:"删除"})]}),e.analysis.video_style&&t.jsx("div",{className:"va-history-style",children:e.analysis.video_style}),l&&r&&t.jsx(Nr,{related:r,record:e,previewTasks:T,onInsertTask:I,onPreviewOpen:O,onSelectScript:j})]})},Nr=({related:e,record:r,previewTasks:l,onInsertTask:h,onPreviewOpen:c,onSelectScript:k})=>t.jsxs("div",{className:"va-history-related",onClick:g=>g.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(g=>t.jsx(pa,{task:g,onClick:I=>k==null?void 0:k(I,r,g)},g.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(g=>t.jsx(pa,{task:g,previewTasks:l,onInsertTask:h,onPreviewOpen:c},g.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(g=>t.jsx(pa,{task:g,previewTasks:l,onInsertTask:h,onPreviewOpen:c},g.id))]})]}),pa=({task:e,previewTasks:r,onClick:l,onInsertTask:h,onPreviewOpen:c})=>{const k=e.status===Ve.COMPLETED,g=es(e),I=k&&g.length>0,O=(e.type===ge.IMAGE||e.type===ge.VIDEO)&&I&&!!(r!=null&&r.length),j=xr(e),S=g[0],T=s.useCallback(G=>{if(O&&r){c==null||c(G,e,r);return}l==null||l(G)},[O,l,c,r,e]);return t.jsx(ct,{content:Sr(e.status),showArrow:!1,children:t.jsxs("div",{className:"va-history-related-task",onClick:T,children:[t.jsx("span",{className:`va-history-related-task-status ${Cr(e.status)}`}),t.jsx("span",{className:"va-history-related-task-prompt",children:jr(e)}),t.jsx("span",{className:"va-history-related-task-time",children:wr(e.createdAt)}),I&&S&&e.type!==ge.CHAT&&t.jsxs("span",{className:"va-history-related-task-thumb",children:[e.type===ge.VIDEO?t.jsx(Ja,{src:S,poster:j||void 0,alt:"",className:"va-history-related-task-thumb-media",thumbnailSize:"small",videoProps:{preload:"metadata",muted:!0,playsInline:!0,"aria-hidden":!0}}):t.jsx(lt,{src:j||S,alt:"",showSkeleton:!1,eager:!0}),e.type===ge.VIDEO&&t.jsx("span",{className:"va-history-related-task-thumb-badge","aria-hidden":"true",children:"▶"})]}),I&&h&&t.jsx(ct,{content:"插入画板",showArrow:!1,children:t.jsx("button",{className:"va-history-related-insert-btn",onClick:G=>h(G,e),"aria-label":"插入画板",children:t.jsx(Ns,{size:16})})})]})})};function Pr(e,r,l){var c;const h=((c=e.result)==null?void 0:c.title)||e.params.title||e.params.prompt||(e.type===ge.VIDEO?"视频预览":"图片预览");return l>1?`${h} (${r+1}/${l})`:h}function Tr(e){var h,c,k;const r=[],l=new Map;for(const g of e){if(g.type!==ge.IMAGE&&g.type!==ge.VIDEO)continue;const I=es(g);if(I.length===0)continue;const O=r.length,j=g.type===ge.VIDEO&&(((c=(h=g.result)==null?void 0:h.thumbnailUrls)==null?void 0:c[0])||((k=g.result)==null?void 0:k.thumbnailUrl))||void 0;I.forEach((S,T)=>{r.push({id:I.length>1?`${g.id}-${T}`:g.id,url:S,type:g.type===ge.VIDEO?"video":"image",title:Pr(g,T,I.length),prompt:g.params.prompt,posterUrl:g.type===ge.VIDEO?j:void 0})}),l.set(g.id,O)}return{items:r,taskIdToIndex:l}}const Ar=({records:e,onSelect:r,onRecordsChange:l,showStarredOnly:h=!1,onInsertTask:c,onSelectScript:k})=>{const g=h?e.filter(f=>f.starred):e,[I,O]=s.useState(null),[j,S]=s.useState(!1),[T,G]=s.useState([]),[Y,J]=s.useState(0),[N,ie]=s.useState(null),{tasks:le}=Xa(),L=s.useMemo(()=>{const f=new Map,R=new Set(e.map(q=>q.id)),A=()=>({rewrite:[],image:[],video:[]});for(const q of le){const $=q.params;if(q.type===ge.CHAT&&$.videoAnalyzerAction==="rewrite"&&typeof $.videoAnalyzerRecordId=="string"&&R.has($.videoAnalyzerRecordId)){const ee=$.videoAnalyzerRecordId;Ta(f,ee,"rewrite",q,A);continue}if((q.type===ge.IMAGE||q.type===ge.VIDEO)&&typeof $.batchId=="string"&&$.batchId.startsWith("va_")){const ee=Ps($.batchId,"va_",R);if(ee){const K=q.type===ge.IMAGE?"image":"video";Ta(f,ee,K,q,A)}}}return Ts(f)},[le,e]),Q=s.useCallback(async(f,R)=>{f.stopPropagation();const A=await xe(R.id,{starred:!R.starred});l(A)},[l]),X=s.useCallback((f,R)=>{f.stopPropagation(),ie(R)},[]),he=s.useCallback(async()=>{if(!N)return;const f=await As(N);l(f),ie(null)},[l,N]),U=s.useCallback((f,R)=>{f.stopPropagation(),O(A=>A===R?null:R)},[]),D=s.useCallback((f,R)=>{f.stopPropagation(),c==null||c(R)},[c]),me=s.useCallback((f,R,A)=>{f.stopPropagation(),k==null||k(R,A)},[k]),ae=s.useCallback((f,R,A)=>{f.stopPropagation();const{items:q,taskIdToIndex:$}=Tr(A),ee=$.get(R.id);!q.length||ee===void 0||(G(q),J(ee),S(!0))},[]),pe=s.useCallback(()=>{S(!1)},[]);return g.length===0?t.jsx("div",{className:"va-page va-empty",children:t.jsx("span",{children:h?"暂无收藏":"暂无分析记录"})}):t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"va-page",children:t.jsx("div",{className:"va-history-list",children:g.map(f=>{const R=L.get(f.id),A=I===f.id;return t.jsx(kr,{record:f,related:R,isExpanded:A,onSelect:r,onToggleStar:Q,onDelete:X,onToggleExpand:U,onInsertTask:D,onPreviewOpen:ae,onSelectScript:me},f.id)})})}),t.jsx(Us,{visible:j,items:T,initialIndex:Y,onClose:pe,showThumbnails:T.length>1}),t.jsx(zs,{open:N!==null,title:"确认删除",description:"确定要删除这条历史记录吗?此操作不可撤销。",confirmText:"删除",cancelText:"取消",danger:!0,onOpenChange:f=>{f||ie(null)},onConfirm:he})]})},zr=[{id:"analyze",label:"分析"},{id:"script",label:"脚本"},{id:"generate",label:"生成"}],Hr=()=>{const{board:e}=ha(),{records:r,setRecords:l,currentRecord:h,setCurrentRecord:c,showStarred:k,setShowStarred:g,starredCount:I,selectRecord:O,updateCurrentRecord:j,restart:S,applySyncedRecord:T}=Es({loadRecords:fa,logPrefix:"[VideoAnalyzer]"}),{page:G,setPage:Y,navigateToStep:J,goToDefaultPage:N,openHistory:ie,openStarred:le,toggleStarred:L}=Ds({initialPage:"analyze",defaultPage:"analyze",historyPage:"history",setShowStarred:g}),Q=s.useCallback(async f=>cr(f)?Lt(f):null,[]);Qs({syncTask:Q,applySyncedRecord:T,logPrefix:"[VideoAnalyzer]"});const X=s.useMemo(()=>zr.map((f,R)=>({...f,disabled:!h&&R>0})),[h]),he=s.useCallback(f=>{j(f)},[j]),U=s.useCallback(f=>{O(f),N()},[N,O]),D=s.useCallback(f=>{j(f)},[j]),me=s.useCallback(()=>{S(),N()},[N,S]),ae=s.useCallback(async f=>{var R,A,q,$;if(!((R=f.result)!=null&&R.url)&&!((q=(A=f.result)==null?void 0:A.urls)!=null&&q.length)||!e){Se.warning("无法插入:白板未就绪");return}try{if(f.type===ge.IMAGE){const ee=($=f.result.urls)!=null&&$.length?f.result.urls:[f.result.url];for(const K of ee)await Rs(e,K);Se.success(ee.length>1?"多图已插入到白板":"图片已插入到白板")}else f.type===ge.VIDEO&&(await Vs(e,f.result.url),Se.success("视频已插入到白板"))}catch(ee){console.error("[VideoAnalyzer] Failed to insert to board:",ee),Se.error(`插入失败: ${ee instanceof Error?ee.message:"未知错误"}`)}},[e]),pe=s.useCallback(async(f,R)=>{const A=String(R.params.videoAnalyzerPrompt||R.params.prompt||""),q=f.scriptVersions||[],$=q.find(K=>K.prompt===A)||q.find(K=>{var _e;return A&&((_e=K.prompt)==null?void 0:_e.includes(A))});let ee=f;if($&&$.id!==f.activeVersionId){const K=Za(f,$.id);if(K){const _e=await xe(f.id,K);ee=_e.find(ce=>ce.id===f.id)||{...f,...K},l(_e)}}c(ee),Y("script")},[c,Y,l]);return t.jsxs("div",{className:"video-analyzer",children:[t.jsx(Fs,{isHistoryPage:G==="history",showStarred:k,recordsCount:r.length,starredCount:I,currentStep:G,steps:X,onStepNavigate:J,onBackFromHistory:N,onOpenHistory:ie,onOpenStarred:le,onToggleStarred:L}),G==="analyze"&&t.jsx(pr,{existingRecord:h,onComplete:he,onRecordsChange:l,onCreateNew:me,onNext:h?()=>Y("script"):void 0}),G==="script"&&h&&t.jsx(gr,{record:h,onRecordUpdate:D,onRecordsChange:l,onNext:()=>Y("generate")}),G==="generate"&&h&&t.jsx(Ir,{record:h,onRecordUpdate:D,onRecordsChange:l,onRestart:me}),G==="history"&&t.jsx(Ar,{records:r,onSelect:U,onRecordsChange:l,showStarredOnly:k,onInsertTask:e?ae:void 0,onSelectScript:pe})]})};export{Hr as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as f,bz as u,dB as l}from"./startup-app-
|
|
1
|
+
import{r as f,bz as u,dB as l}from"./startup-app-eD_rQhSh.js";function b(e){return e.status===l.COMPLETED}function y({syncTask:e,applySyncedRecord:n,shouldHandleTask:o=b,logPrefix:a="[WorkflowTaskSync]"}){f.useEffect(()=>{let c=!1;const r=new Set,i=async s=>{if(!(!o(s)||r.has(s.id))){r.add(s.id);try{const t=await e(s);if(!t||c)return;n(t)}catch(t){console.error(`${a} Failed to sync task result:`,t)}finally{r.delete(s.id)}}};u.getAllTasks().forEach(s=>{i(s)});const d=u.observeTaskUpdates().subscribe(s=>{i(s.task)});return()=>{c=!0,d.unsubscribe()}},[n,a,o,e])}export{y as u};
|