aitu-app 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/assets/{CanvasAudioPlayer-DgcRAPAw.js → CanvasAudioPlayer-HtUs8HDj.js} +1 -1
- package/assets/{ComicCreator-BycaWmuc.js → ComicCreator-DhxXCyJR.js} +2 -2
- package/assets/{DeferredAIInputBar-CwJirFC0.js → DeferredAIInputBar-B2R2-2RU.js} +2 -2
- package/assets/{DrawnixDeferredFeatures-iBvUtWse.js → DrawnixDeferredFeatures-DHTr0c-V.js} +1 -1
- package/assets/{KnowledgeBaseContent-BHBg5nrj.js → KnowledgeBaseContent-CAq5kXdt.js} +3 -3
- package/assets/{MVCreator-j2vSDPdb.js → MVCreator-B9uaRsGE.js} +1 -1
- package/assets/{ModelBenchmarkWorkbench-Dq5hRRXu.js → ModelBenchmarkWorkbench-CK33zizl.js} +1 -1
- package/assets/{MusicAnalyzer-BLhUXQSA.js → MusicAnalyzer-D2NTonEA.js} +1 -1
- package/assets/{PromptHistoryTool-DJngTSmU.js → PromptHistoryTool-q6vOxFr6.js} +1 -1
- package/assets/{ResizableDivider-AjiNRzA1.js → ResizableDivider-BvT-DCEo.js} +1 -1
- package/assets/{TaskQueuePanel-YDHmXxWX.js → TaskQueuePanel-PayswYlG.js} +1 -1
- package/assets/{VideoAnalyzer-Qb6tEi0u.js → VideoAnalyzer-DnowtohS.js} +1 -1
- package/assets/{VideoAnalyzer-BjWgocHv.js → VideoAnalyzer-DoaGlK92.js} +1 -1
- package/assets/{ai-chat-D2kHVW04.js → ai-chat-BnWVpTEI.js} +9 -9
- package/assets/{batch-image-generation-A6_tinN3.js → batch-image-generation-CkmX4dem.js} +1 -1
- package/assets/{bootstrap-Cz9TDvTq.js → bootstrap-CQRLkOtk.js} +6 -6
- package/assets/{clean-confirm-DD8itIZV.js → clean-confirm-CIViVQ8s.js} +1 -1
- package/assets/{diagram-engines-BjFHXhwN.js → diagram-engines-DpAsX7pc.js} +2 -2
- package/assets/{editor-engines-FCgCX6kJ.js → editor-engines-9_72Ghfn.js} +1 -1
- package/assets/{external-skill-service-DuwhmKoU.js → external-skill-service-BN8ZCtPn.js} +1 -1
- package/assets/{frame-size-matcher-D5rWn72p.js → frame-size-matcher-9rxQ-bAY.js} +1 -1
- package/assets/{index-DkwucWUB.js → index-291TeU7i.js} +1 -1
- package/assets/{index-CHHy4efO.js → index-BJ-vS89P.js} +1 -1
- package/assets/{index-D0v91lhB.js → index-BSZAS0wO.js} +1 -1
- package/assets/{index-BECWJUV2.js → index-C7DAD_xK.js} +1 -1
- package/assets/{index-7TrMzH1l.js → index-CIgiIDgZ.js} +1 -1
- package/assets/{index-CBf-BvIi.js → index-CpHWUe__.js} +1 -1
- package/assets/{index-DeHXjhMn.js → index-D1LQ9eQM.js} +1 -1
- package/assets/{index-DsGlObqC.js → index-DRGxmFyd.js} +1 -1
- package/assets/{index-DUugpXxH.js → index-DmtcRYr8.js} +1 -1
- package/assets/{index.es-Dgi90kXH.js → index.es-Ch45-H39.js} +1 -1
- package/assets/{jspdf.es.min-Bm9veIPK.js → jspdf.es.min-bNprb1JY.js} +2 -2
- package/assets/{link-popup-Dw0GTx0j.js → link-popup-B6ReK6iq.js} +1 -1
- package/assets/{markdown-to-drawnix-CDain2y9.js → markdown-to-drawnix-BqT-3zQO.js} +2 -2
- package/assets/{mermaid-to-drawnix-Ddpp0aQq.js → mermaid-to-drawnix-CSctnpU0.js} +2 -2
- package/assets/{model-benchmark-launcher-DLwj4o8h.js → model-benchmark-launcher-DNMp2MLQ.js} +1 -1
- package/assets/{photo-wall-splitter-D2Ji--gy.js → photo-wall-splitter-DhBTEpdG.js} +1 -1
- package/assets/{popup-toolbar-mBe3Bjaq.js → popup-toolbar-BChsudwW.js} +3 -3
- package/assets/{prompt-utils-CatisMlq.js → prompt-utils-BX0pRV-Z.js} +1 -1
- package/assets/{quick-creation-toolbar-jRI3BBKS.js → quick-creation-toolbar-3-AYFpEF.js} +1 -1
- package/assets/{settings-dialog-BOrvJdPV.js → settings-dialog-Ccemaout.js} +1 -1
- package/assets/{size-picker-Blua_9Dv.js → size-picker-DTrdjyLh.js} +1 -1
- package/assets/{skill-dsl-parser-1E3u-6mw.js → skill-dsl-parser-ZR--uu5h.js} +1 -1
- package/assets/{startup-app-BXcHjIQM.js → startup-app-CH3QzBb4.js} +1 -1
- package/assets/{task-sync-CPtlvCdr.js → task-sync-C5XXOQ5m.js} +1 -1
- package/assets/{tool-windows-CSaRGLIT.js → tool-windows-Bf_pMml-.js} +5 -5
- package/assets/{ttd-dialog-RLopc37W.js → ttd-dialog-CohjwODB.js} +2 -2
- package/assets/{ttd-dialog-submit-shortcut-C9_wsIZ5.js → ttd-dialog-submit-shortcut-BVB8O_wE.js} +1 -1
- package/assets/{useCharacters-BCCGOiPW.js → useCharacters-CFlPvydq.js} +1 -1
- package/assets/{useWorkflowSubmission-Bo-icE0J.js → useWorkflowSubmission-CKkOEcAT.js} +2 -2
- package/assets/{video-merge-webcodecs-BWAut6ma.js → video-merge-webcodecs-BInWo9HA.js} +1 -1
- package/assets/{video-recovery-service-L4OR1un7.js → video-recovery-service-DITdD0pC.js} +1 -1
- package/assets/{workflow-generation-utils-CUmdJnGW.js → workflow-generation-utils-e0nRpAgJ.js} +2 -2
- package/assets/{workflow-submission-service-kAjrrvI-.js → workflow-submission-service-BqiL_5Cj.js} +1 -1
- package/changelog.json +87 -6
- package/idle-prefetch-manifest.json +128 -276
- package/manifest.json +3 -3
- package/package.json +1 -1
- package/precache-manifest.json +6 -6
- package/sw.js +1 -1
- package/version.json +58 -3
- package/.DS_Store +0 -0
- package/user-manual/gifs//346/200/235/347/273/264/345/257/274/345/233/276/345/210/233/345/273/272/346/274/224/347/244/272.gif +0 -0
- package/user-manual/screenshots/ai-step-0.png +0 -0
- package/user-manual/screenshots/ai-step-1.png +0 -0
- package/user-manual/screenshots/ai-step-2.png +0 -0
- package/user-manual/screenshots/ai-step-3.png +0 -0
- package/user-manual/screenshots/app-menu.png +0 -0
- package/user-manual/screenshots/backup-restore.png +0 -0
- package/user-manual/screenshots/canvas-tools.png +0 -0
- package/user-manual/screenshots/debug-panel.png +0 -0
- package/user-manual/screenshots/drawing-step-0.png +0 -0
- package/user-manual/screenshots/drawing-step-1.png +0 -0
- package/user-manual/screenshots/drawing-step-2.png +0 -0
- package/user-manual/screenshots/edit-selected.png +0 -0
- package/user-manual/screenshots/element-selected.png +0 -0
- package/user-manual/screenshots/flowchart-step-1.png +0 -0
- package/user-manual/screenshots/flowchart-step-2.png +0 -0
- package/user-manual/screenshots/flowchart-step-3.png +0 -0
- package/user-manual/screenshots/image-preview-empty.png +0 -0
- package/user-manual/screenshots/insert-from-library.png +0 -0
- package/user-manual/screenshots/insert-tools.png +0 -0
- package/user-manual/screenshots/inspiration-step-1.png +0 -0
- package/user-manual/screenshots/inspiration-step-2.png +0 -0
- package/user-manual/screenshots/media-library.png +0 -0
- package/user-manual/screenshots/mindmap-step-1.png +0 -0
- package/user-manual/screenshots/mindmap-step-2.png +0 -0
- package/user-manual/screenshots/mindmap-toolbar-menu.png +0 -0
- package/user-manual/screenshots/project-drawer.png +0 -0
- package/user-manual/screenshots/settings-dialog.png +0 -0
- package/user-manual/screenshots/shape-step-1.png +0 -0
- package/user-manual/screenshots/shape-step-2.png +0 -0
- package/user-manual/screenshots/text-step-1.png +0 -0
- package/user-manual/screenshots/text-step-2.png +0 -0
- package/user-manual/screenshots/toolbox-drawer.png +0 -0
- package/user-manual/screenshots/toolbox-entry.png +0 -0
- package/user-manual/screenshots/video-entry.png +0 -0
- package/user-manual/screenshots/view-navigation.png +0 -0
- package/user-manual/screenshots/zoom-menu.png +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{dd as qe,P as a,r6 as U,a8 as e,r7 as is,r8 as cs,r9 as os,ra as us,rb as ds,rc as ms,rd as pe,re as Se,rf as xe,rg as oe,en as je,rh as Qe,ri as Ge,bP as ge,rj as ps,rk as hs,Q as X,aD as q,rl as fs,bO as ys,rm as Je,rn as Xe,ro as Ze,rp as gs,rq as es,rr as js,nI as vs,nN as $e,f2 as Ne,f3 as be,aM as Ie,rs as Fe,rt as Ke,ru as xs,rv as Ss,nq as Ns,rw as Me,rx as bs,ry as Is,rz as Ts,oG as ks,c5 as Cs,T as ue,ab as Ms,rA as As,rB as _s,rC as ws,rD as Es}from"./ai-chat-
|
|
1
|
+
import{dd as qe,P as a,r6 as U,a8 as e,r7 as is,r8 as cs,r9 as os,ra as us,rb as ds,rc as ms,rd as pe,re as Se,rf as xe,rg as oe,en as je,rh as Qe,ri as Ge,bP as ge,rj as ps,rk as hs,Q as X,aD as q,rl as fs,bO as ys,rm as Je,rn as Xe,ro as Ze,rp as gs,rq as es,rr as js,nI as vs,nN as $e,f2 as Ne,f3 as be,aM as Ie,rs as Fe,rt as Ke,ru as xs,rv as Ss,nq as Ns,rw as Me,rx as bs,ry as Is,rz as Ts,oG as ks,c5 as Cs,T as ue,ab as Ms,rA as As,rB as _s,rC as ws,rD as Es}from"./ai-chat-BnWVpTEI.js";import{s as Ue,i as zs,g as Ps,a as Ds}from"./task-sync-C5XXOQ5m.js";import{ap as Ls}from"./tool-windows-Bf_pMml-.js";import{u as Os}from"./VideoAnalyzer-DnowtohS.js";/* empty css */import"./startup-runtime-BrfuwjQS.js";function Re(s){return(s||"").trim().toLowerCase().replace(/[^a-z0-9]/g,"")||"mp3"}function Bs(s){const n=s.name.split(".").pop();return n&&n.length<=8?Re(n):Re(s.type.split("/")[1])}async function $s(s,n){const i=Bs(s),o=`/__aitu_cache__/audio/${`music-analyzer-source-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}.${i}`;return await qe.cacheMediaFromBlob(o,s,"audio",{metadata:{source:"music-analyzer-input",fileName:s.name,mimeType:s.type||"audio/mpeg",size:s.size}}),{type:"upload",cacheUrl:o,fileName:s.name||`music-source.${i}`,mimeType:s.type||"audio/mpeg",size:s.size}}async function Us(s){if(!s||s.type!=="upload")return null;const n=await qe.getCachedBlob(s.cacheUrl);return n?new File([n],s.fileName||"music-source.mp3",{type:s.mimeType||n.type||"audio/mpeg",lastModified:Date.now()}):null}const Gs=[{key:"purpose",label:"音乐用途",placeholder:"普通歌曲创作 / 短视频爆点 / 广告歌",options:is},{key:"genreStyle",label:"核心曲风",placeholder:"Mozart Classical / Mandopop / R&B",options:cs},{key:"vocalStyle",label:"人声/唱法",placeholder:"female vocal(女声)/ rap vocal(说唱人声)",options:os},{key:"energyMood",label:"情绪能量",placeholder:"高能上扬 / 深夜情绪化 / 克制高级",options:us},{key:"lyricGoal",label:"歌词目标",placeholder:"副歌第一句要有记忆点",options:ds}],Le=({value:s,onChange:n})=>{const i=a.useMemo(()=>U(s),[s]),b=a.useCallback((o,M)=>{n(U({...i,[o]:M}))},[i,n]);return e.jsxs("div",{className:"ma-music-brief",children:[e.jsxs("div",{className:"ma-card-header",children:[e.jsx("span",{children:"歌曲定位"}),e.jsx("span",{className:"ma-muted",children:"用于约束歌词与 Suno 标签"})]}),e.jsx("div",{className:"ma-music-brief-grid",children:Gs.map(o=>e.jsxs("label",{className:"ma-field",children:[e.jsx("span",{children:o.label}),e.jsx(ms,{className:"ma-brief-combo",value:i[o.key]||"",onChange:M=>b(o.key,M),options:o.options,placeholder:o.placeholder})]},o.key))})]})},Ae="gemini-2.5-pro",_e="music-analyzer:model",we="music-analyzer:lyrics-model",Oe="music-analyzer:creation-prompt";function Fs(s){return`${(s/1024/1024).toFixed(1)}MB`}function Ks(){try{return sessionStorage.getItem(Oe)||""}catch{return""}}function He(s){try{if(s){sessionStorage.setItem(Oe,s);return}sessionStorage.removeItem(Oe)}catch{}}function Rs(s=[],n=[]){return s.length!==n.length?!1:s.every((i,b)=>i===n[b])}const Hs=({existingRecord:s,onComplete:n,onRecordsChange:i,onCreateNew:b,onNext:o,onLyricsReady:M})=>{const[x,I]=a.useState((s==null?void 0:s.source)==="upload"?"reference":"scratch"),[u,P]=a.useState(()=>(s==null?void 0:s.creationPrompt)||Ks()),[T,F]=a.useState([]),[v,D]=a.useState(()=>U(s==null?void 0:s.musicBrief)),[y,Q]=a.useState(()=>(s==null?void 0:s.pendingLyricsGenTaskId)||null),[r,m]=a.useState(""),[g,j]=a.useState(null),[d,h]=a.useState(null),[k,K]=a.useState(""),[S,J]=a.useState(!0),[G,de]=a.useState(""),[V,Z]=a.useState(""),[re,me]=a.useState(""),te=a.useRef(null),C=a.useRef(null),R=a.useRef(),Y=a.useRef(!1),ne=a.useRef(!1),[ie,A]=a.useState(""),[L,le]=a.useState(()=>(s==null?void 0:s.analysisModel)||pe(_e,Ae).modelId),[ee,$]=a.useState(()=>(s==null?void 0:s.analysisModelRef)||pe(_e,Ae).modelRef),[z,H]=a.useState(()=>pe(we,Ie()).modelId),[se,c]=a.useState(()=>pe(we,Ie()).modelRef),N=a.useCallback((l,f)=>{le(l),$(f||null),Se(_e,l,f)},[]),t=a.useCallback((l,f)=>{H(l),c(f||null),Se(we,l,f)},[]),w=a.useMemo(()=>{if(C.current&&URL.revokeObjectURL(C.current),!g)return C.current=null,null;const l=URL.createObjectURL(g);return C.current=l,l},[g]);a.useEffect(()=>()=>{C.current&&URL.revokeObjectURL(C.current)},[]),a.useEffect(()=>{let l=!1;return(async()=>{if(!s){!d&&!y&&(j(null),D({}),A(""));return}le(s.analysisModel||Ae),$(s.analysisModelRef||null),P(s.creationPrompt||""),D(O=>{const B=U(s.musicBrief);return xe(O,B)?O:B});const p=s.analysis?Ge(s.analysis):null;if(de(s.title||(p==null?void 0:p.sunoTitle)||""),Z((s.styleTags||(p==null?void 0:p.sunoStyleTags)||(p==null?void 0:p.genreTags)||[]).join(", ")),me(s.lyricsDraft||(p==null?void 0:p.sunoLyricsDraft)||""),A(""),s.source==="upload"){const O=await Us(s.sourceSnapshot);if(l)return;j(O),O||A("原上传音频缓存已失效,无法自动回填音频")}})(),()=>{l=!0}},[s,d,y]),a.useEffect(()=>{if((s==null?void 0:s.source)==="scratch"){He(s.creationPrompt||"");return}s||He(u)},[u,s]),a.useEffect(()=>{if(s)return clearTimeout(R.current),R.current=setTimeout(async()=>{const l=U(v),f={musicBrief:l};if(x==="reference"){const B=V.split(",").map(rs=>rs.trim()).filter(Boolean),as=s.title!==G.trim(),ts=!Rs(s.styleTags||[],B),ns=(s.lyricsDraft||"")!==re,ls=!xe(s.musicBrief,l);if(!as&&!ts&&!ns&&!ls)return;f.title=G.trim(),f.styleTags=B,f.lyricsDraft=re}else if(xe(s.musicBrief,l))return;const p=await oe(s.id,f);i(p);const O=p.find(B=>B.id===s.id);O&&n(O)},400),()=>clearTimeout(R.current)},[re,V,G,s,v,x,n,i]);const _=je("text"),ce=a.useMemo(()=>_.filter(l=>/^gemini/i.test(l.id)),[_]),W=je("audio"),ae=a.useMemo(()=>Qe(_,W),[_,W]),E=a.useMemo(()=>s!=null&&s.analysis?Ge(s.analysis):null,[s==null?void 0:s.analysis]),Te=a.useCallback(l=>{var p;const f=(p=l.target.files)==null?void 0:p[0];f!=null&&f.type.startsWith("audio/")?(j(f),A("")):A("请选择音频文件")},[]),ve=a.useCallback(l=>{l.preventDefault();const f=l.dataTransfer.files[0];f!=null&&f.type.startsWith("audio/")?(j(f),A("")):A("请选择音频文件")},[]),ke=a.useCallback(async()=>{if(!(Y.current||d)){if(!g){A("请先上传音频");return}Y.current=!0,ge.trackUIInteraction({area:"popular_music_tool",action:"audio_analysis_started",control:"analyze_audio",source:"music_analyzer_create_page",metadata:{fileSizeBytes:g.size,hasModelRef:!!ee}}),A(""),K("缓存音频...");try{const l=await $s(g),f=ps(v),p=[hs,f].filter(Boolean).join(`
|
|
2
2
|
`),O=X.createTask({prompt:`分析音频:${g.name||"本地音频"}`,model:L,modelRef:ee,mimeType:l.mimeType,audioCacheUrl:l.cacheUrl,musicAnalyzerAction:"analyze",musicAnalyzerPrompt:p,musicAnalyzerMusicBrief:U(v),musicAnalyzerSource:"upload",musicAnalyzerSourceLabel:l.fileName,musicAnalyzerSourceSnapshot:l,autoInsertToCanvas:!1},q.CHAT);h(O.id),K("音频分析中 0%")}catch(l){Y.current=!1,A(l.message||"音频分析失败")}}},[g,v,d,L,ee]),he=a.useCallback(async()=>{if(ne.current||y)return;if(!u.trim()){A("请先描述你想创作的歌曲");return}ne.current=!0;const l=Je(z);ge.trackUIInteraction({area:"popular_music_tool",action:"lyrics_generation_started",control:"generate_lyrics",source:"music_analyzer_create_page",metadata:{engine:l?"suno":"text_model",promptLength:u.trim().length,hasModelRef:!!se}}),A(""),m(l?"歌词生成中...":"歌词草稿生成中 0%");try{const f={id:ys(),createdAt:Date.now(),source:"scratch",sourceLabel:u.slice(0,30)||"从零创作",creationPrompt:u,musicBrief:U(v),styleTags:fs(v),starred:!1},p=l?X.createTask({prompt:Xe({userPrompt:u,musicBrief:v,mode:"create"}),model:z,modelRef:se,sunoAction:"lyrics",musicAnalyzerAction:"lyrics-gen",musicAnalyzerRecordId:f.id,musicAnalyzerMusicBrief:U(v),knowledgeContextRefs:T,autoInsertToCanvas:!1},q.AUDIO):X.createTask({prompt:`从零创作歌词:${f.sourceLabel}`,model:z,modelRef:se,musicAnalyzerAction:"lyrics-gen",musicAnalyzerPrompt:Ze({userPrompt:u,musicBrief:v,mode:"create"}),musicAnalyzerRecordId:f.id,musicAnalyzerMusicBrief:U(v),knowledgeContextRefs:T,autoInsertToCanvas:!1},q.CHAT);f.pendingLyricsGenTaskId=p.id;const O=await gs(f);i(O),n(f),Q(p.id)}catch(f){ne.current=!1,A(f.message||"歌词生成失败"),m("")}},[u,T,v,n,i,y,z,se]);a.useEffect(()=>{if(!d)return;const l=X.getTask(d);typeof(l==null?void 0:l.progress)=="number"&&K(`音频分析中 ${Math.round(l.progress)}%`);const f=X.observeTaskUpdates().subscribe(p=>{var O;if(p.task.id===d){if(p.task.status==="failed"){Y.current=!1,h(null),K(""),A(((O=p.task.error)==null?void 0:O.message)||"音频分析失败");return}if(p.task.status==="completed"){Ue(p.task).then(B=>{B&&(i(B.records),n(B.record))}).catch(B=>A(B.message||"分析结果同步失败")).finally(()=>{Y.current=!1,h(null),K("")});return}typeof p.task.progress=="number"&&K(`音频分析中 ${Math.round(p.task.progress)}%`)}});return()=>f.unsubscribe()},[d,n,i]),a.useEffect(()=>{if(!y)return;const l=X.getTask(y);if(typeof(l==null?void 0:l.progress)=="number"){const p=l.type===q.CHAT?"歌词草稿生成中":"歌词生成中";m(`${p} ${Math.round(l.progress)}%`)}const f=X.observeTaskUpdates().subscribe(p=>{var O;if(p.task.id===y){if(p.task.status==="failed"){const B=String(p.task.params.musicAnalyzerRecordId||"").trim();ne.current=!1,Q(null),m(""),A(((O=p.task.error)==null?void 0:O.message)||"歌词生成失败"),B&&oe(B,{pendingLyricsGenTaskId:null}).then(i);return}if(p.task.status==="completed"){ne.current=!1,Q(null),m(""),M==null||M();return}if(typeof p.task.progress=="number"){const B=p.task.type===q.CHAT?"歌词草稿生成中":"歌词生成中";m(`${B} ${Math.round(p.task.progress)}%`)}}});return()=>f.unsubscribe()},[M,i,y]);const Ce=a.useCallback(async()=>{E&&(await es("text",js(E)),ge.trackUIInteraction({area:"popular_music_tool",action:"analysis_inserted_to_canvas",control:"insert_analysis",source:"music_analyzer_create_page",metadata:{hasSunoTitle:!!E.sunoTitle,tagsCount:E.sunoStyleTags.length}}))},[E]);return e.jsxs("div",{className:"ma-create-page",children:[e.jsxs("div",{className:"ma-mode-toggle",children:[e.jsx("button",{className:`ma-mode-btn ${x==="scratch"?"active":""}`,onClick:()=>I("scratch"),children:"从零创作"}),e.jsx("button",{className:`ma-mode-btn ${x==="reference"?"active":""}`,onClick:()=>I("reference"),children:"参考音频"})]}),e.jsxs("div",{className:"va-page",children:[x==="scratch"?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"ma-card",children:e.jsx(Le,{value:v,onChange:D})}),e.jsxs("div",{className:"ma-card",children:[e.jsxs("div",{className:"ma-card-header",children:[e.jsx("span",{children:"描述你想创作的歌曲"}),e.jsx(vs,{className:"ma-icon-btn",originalPrompt:u,language:"zh",scenarioId:"music.create-song",onApply:P})]}),e.jsx("textarea",{className:"ma-textarea",value:u,onChange:l=>P(l.target.value),rows:6,placeholder:"例如:一首关于夏天海边的轻快流行歌,女声,带有吉他和电子节拍"}),e.jsx($e,{value:T,onChange:F,disabled:!!y,className:"ma-knowledge-context-selector",placement:"up"})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"ma-card",children:[e.jsxs("div",{className:"ma-card-header",children:[e.jsx("span",{children:"上传音频"}),g&&e.jsx("span",{className:"ma-muted",children:Fs(g.size)})]}),e.jsx("div",{className:"va-dropzone ma-dropzone",onClick:()=>{var l;return(l=te.current)==null?void 0:l.click()},onDragOver:l=>l.preventDefault(),onDrop:ve,children:g?e.jsxs("div",{className:"ma-audio-preview",children:[e.jsxs("div",{className:"ma-audio-preview__meta",children:[e.jsx("strong",{children:g.name}),e.jsx("button",{className:"va-nav-btn",onClick:l=>{l.stopPropagation(),j(null),A(""),te.current&&(te.current.value="")},children:"清空"})]}),w&&e.jsx("audio",{controls:!0,src:w})]}):e.jsxs("div",{className:"ma-dropzone__placeholder",children:[e.jsx("span",{children:"点击或拖拽上传本地音频"}),e.jsx("small",{children:"支持 mp3、wav、m4a 等常见格式"})]})}),e.jsx("input",{ref:te,type:"file",accept:"audio/*",hidden:!0,onChange:Te})]}),e.jsx("div",{className:"ma-card",children:e.jsx(Le,{value:v,onChange:D})}),e.jsxs("div",{className:"ma-card",children:[e.jsx("div",{className:"ma-card-header",children:e.jsx("span",{children:"分析模型"})}),e.jsx(Ne,{selectedModel:L,selectedSelectionKey:be(L,ee),onSelect:N,models:ce,variant:"form",placement:"down",placeholder:"选择 Gemini 分析模型"})]})]}),E&&x==="reference"&&e.jsxs("div",{className:"ma-card",children:[e.jsxs("button",{className:"ma-section-toggle",onClick:()=>J(l=>!l),children:[e.jsx("span",{children:"分析摘要"}),e.jsx("span",{children:S?"收起":"展开"})]}),S&&e.jsxs("div",{className:"ma-analysis-summary",children:[e.jsx("p",{children:E.summary}),e.jsxs("div",{className:"ma-chip-row",children:[e.jsx("span",{className:"ma-chip",children:E.language||"未知语言"}),e.jsx("span",{className:"ma-chip",children:E.mood||"未知情绪"}),E.genreTags.map(l=>e.jsx("span",{className:"ma-chip ma-chip--accent",children:l},l))]}),e.jsx("div",{className:"ma-tag-row",children:E.structure.map(l=>e.jsx("code",{children:l},l))}),E.titleSuggestions.length>0&&e.jsxs("div",{className:"ma-suggestions",children:["推荐标题:",E.titleSuggestions.join(" / ")]}),(E.sunoTitle||E.sunoStyleTags.length>0||E.sunoLyricsDraft)&&e.jsxs("div",{className:"ma-suno-summary",children:[e.jsx("div",{className:"ma-suno-summary__title",children:"Suno 生成草稿"}),e.jsxs("div",{className:"ma-suno-summary__form",children:[e.jsxs("label",{className:"ma-suno-summary__field",children:[e.jsx("span",{children:"歌曲标题"}),e.jsx("input",{className:"ma-input",value:G,onChange:l=>de(l.target.value),placeholder:"可直接用于 Suno 的标题"})]}),e.jsxs("label",{className:"ma-suno-summary__field",children:[e.jsx("span",{children:"Suno 风格标签"}),e.jsx("input",{className:"ma-input",value:V,onChange:l=>Z(l.target.value),placeholder:"逗号分隔的风格标签"})]}),e.jsxs("label",{className:"ma-suno-summary__field",children:[e.jsx("span",{children:"带 Suno 标签的歌词草稿"}),e.jsx("textarea",{className:"ma-textarea",rows:12,value:re,onChange:l=>me(l.target.value),placeholder:"分析阶段整理出的可用歌词草稿"})]})]})]})]})]}),(ie||k||r)&&e.jsxs("div",{className:"ma-status-stack",children:[ie&&e.jsx("div",{className:"ma-error",children:ie}),k&&e.jsx("div",{className:"ma-progress",children:k}),r&&e.jsx("div",{className:"ma-progress",children:r})]}),e.jsx("div",{className:`va-page-actions ${x==="scratch"?"ma-lyrics-submit-row":""}`,children:x==="scratch"?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"ma-lyrics-model-inline",children:[e.jsx("span",{className:"ma-inline-label",children:"歌词模型"}),e.jsx(Ne,{selectedModel:z,selectedSelectionKey:be(z,se),onSelect:t,models:ae,variant:"form",placement:"up",placeholder:"选择歌词模型"})]}),e.jsx("button",{className:"va-btn-primary",onClick:he,disabled:!u.trim()||!!y,children:"生成歌词"})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:b,children:"新建"}),e.jsx("button",{onClick:Ce,disabled:!(s!=null&&s.analysis),children:"插入分析"}),e.jsx("button",{className:"va-btn-primary",onClick:ke,disabled:!g||!!d,children:"开始分析"}),e.jsx("button",{onClick:o,disabled:!s,children:"下一步"})]})})]})]})},Ee="music-analyzer:model",Ve="gemini-2.5-pro",Vs=({record:s,onRecordUpdate:n,onRecordsChange:i,onNext:b})=>{var $,z,H,se;const[o,M]=a.useState(()=>Fe(s)),[x,I]=a.useState([]),[u,P]=a.useState(s.lyricsDraft||""),[T,F]=a.useState(s.title||((z=($=s.analysis)==null?void 0:$.titleSuggestions)==null?void 0:z[0])||""),[v,D]=a.useState((s.styleTags||((H=s.analysis)==null?void 0:H.genreTags)||[]).join(", ")),[y,Q]=a.useState(()=>U(s.musicBrief)),[r,m]=a.useState(()=>s.pendingRewriteTaskId||null),[g,j]=a.useState(""),[d,h]=a.useState(""),[k,K]=a.useState(()=>s.analysisModel||pe(Ee,Ve).modelId),[S,J]=a.useState(()=>s.analysisModelRef||pe(Ee,Ve).modelRef),[G,de]=a.useState(!1),V=a.useRef(),Z=a.useRef(!1),re=a.useCallback((c,N)=>{K(c),J(N||null),Se(Ee,c,N)},[]);a.useEffect(()=>{var c,N,t;M(Fe(s)),P(s.lyricsDraft||""),F(s.title||((N=(c=s.analysis)==null?void 0:c.titleSuggestions)==null?void 0:N[0])||""),D((s.styleTags||((t=s.analysis)==null?void 0:t.genreTags)||[]).join(", ")),Q(w=>{const _=U(s.musicBrief);return xe(w,_)?w:_}),m(s.pendingRewriteTaskId||null)},[s]),a.useEffect(()=>(clearTimeout(V.current),V.current=setTimeout(async()=>{const c=v.split(",").map(t=>t.trim()).filter(Boolean),N=await oe(s.id,{rewritePrompt:o,lyricsDraft:u,title:T,styleTags:c,musicBrief:U(y),pendingRewriteTaskId:r});i(N),n({...s,rewritePrompt:o,lyricsDraft:u,title:T,styleTags:c,musicBrief:U(y),pendingRewriteTaskId:r})},400),()=>clearTimeout(V.current)),[u,y,n,i,r,s.id,o,v,T]);const me=je("text"),te=je("audio"),C=a.useMemo(()=>Qe(me,te),[me,te]),R=a.useMemo(()=>Je(k),[k]),Y=a.useMemo(()=>{const c=[{id:Ke,label:"原始版本"}];for(const N of s.lyricsVersions||[])c.push({id:N.id,label:N.label});return c},[s.lyricsVersions]),ne=s.activeVersionId||Ke,ie=Y.length>1,A=String(s.creationPrompt||"").trim(),L=a.useCallback(async c=>{const N=xs(s,c);if(!N)return;const t=await oe(s.id,N);i(t),n({...s,...N}),de(!1)},[n,i,s]),le=a.useCallback(async()=>{if(!(Z.current||r)){Z.current=!0,h(""),j(R?"歌词生成中...":"歌词改写中 0%"),ge.trackUIInteraction({area:"popular_music_tool",action:"lyrics_rewrite_started",control:"rewrite_lyrics",source:"music_analyzer_lyrics_page",metadata:{engine:R?"suno":"text_model",hasRewritePrompt:!!o.trim(),lyricsLength:u.trim().length}});try{let c;if(R){const t=Xe({userPrompt:o,originalPrompt:A,currentLyrics:u,musicBrief:y,mode:"rewrite"});c=X.createTask({prompt:t,model:k,modelRef:S||null,sunoAction:"lyrics",musicAnalyzerAction:"lyrics-gen",musicAnalyzerRecordId:s.id,musicAnalyzerMusicBrief:U(y),knowledgeContextRefs:x,autoInsertToCanvas:!1},q.AUDIO)}else c=X.createTask({prompt:`改写歌词:${s.sourceLabel}`,model:k,modelRef:S||null,musicAnalyzerAction:"rewrite",musicAnalyzerPrompt:Ze({analysis:s.analysis,userPrompt:o,originalPrompt:A,currentLyrics:u,musicBrief:y}),musicAnalyzerRecordId:s.id,musicAnalyzerMusicBrief:U(y),knowledgeContextRefs:x,autoInsertToCanvas:!1},q.CHAT);m(c.id);const N=await oe(s.id,{rewritePrompt:o,musicBrief:U(y),pendingRewriteTaskId:c.id});i(N),n({...s,rewritePrompt:o,musicBrief:U(y),pendingRewriteTaskId:c.id})}catch(c){Z.current=!1,h(c.message||"歌词改写失败"),j("")}}},[A,u,n,i,s,o,k,S,R,x,y,r]);a.useEffect(()=>{if(!r)return;const c=X.getTask(r);typeof(c==null?void 0:c.progress)=="number"&&j(`歌词改写中 ${Math.round(c.progress)}%`);const N=X.observeTaskUpdates().subscribe(t=>{var w;if(t.task.id===r){if(t.task.status==="failed"){Z.current=!1,m(null),j(""),h(((w=t.task.error)==null?void 0:w.message)||"歌词改写失败"),oe(s.id,{pendingRewriteTaskId:null}).then(i);return}if(t.task.status==="completed"){Ue(t.task).then(_=>{_&&(i(_.records),n(_.record),P(_.record.lyricsDraft||""),F(_.record.title||""),D((_.record.styleTags||[]).join(", ")))}).catch(_=>{h(_.message||"改写结果同步失败")}).finally(()=>{Z.current=!1,m(null),j("")});return}typeof t.task.progress=="number"&&j(`歌词改写中 ${Math.round(t.task.progress)}%`)}});return()=>N.unsubscribe()},[n,i,r,s.id]);const ee=a.useCallback(async()=>{const c=await es("text",Ss({title:T,styleTags:v.split(",").map(N=>N.trim()).filter(Boolean),lyricsDraft:u}));if(!c.success){h(c.error||"插入失败,请确认画布已打开");return}ge.trackUIInteraction({area:"popular_music_tool",action:"lyrics_inserted_to_canvas",control:"insert_lyrics",source:"music_analyzer_lyrics_page",metadata:{lyricsLength:u.trim().length,tagsCount:v.split(",").filter(N=>N.trim()).length}})},[u,v,T]);return e.jsxs("div",{className:"va-page",children:[e.jsx("div",{className:"ma-card",children:e.jsx(Le,{value:y,onChange:Q})}),e.jsxs("div",{className:"ma-card",children:[e.jsxs("div",{className:"ma-card-header",children:[e.jsx("span",{children:"改写要求"}),ie&&e.jsxs("div",{className:"ma-version-dropdown",children:[e.jsxs("button",{className:"ma-version-btn",onClick:()=>de(c=>!c),children:[((se=Y.find(c=>c.id===ne))==null?void 0:se.label)||"原始版本",e.jsx("span",{className:"ma-version-arrow",children:G?"▲":"▼"})]}),G&&e.jsx("div",{className:"ma-version-menu",children:Y.map(c=>e.jsx("button",{className:`ma-version-menu-item ${c.id===ne?"active":""}`,onClick:()=>L(c.id),children:c.label},c.id))})]})]}),e.jsx("textarea",{className:"ma-textarea",value:o,onChange:c=>M(c.target.value),rows:4,placeholder:"告诉 AI 要保留什么、强化什么、改成什么风格"}),e.jsx($e,{value:x,onChange:I,disabled:!!r,className:"ma-knowledge-context-selector",placement:"up"}),e.jsxs("div",{className:"ma-lyrics-submit-row ma-lyrics-submit-row--rewrite",children:[e.jsxs("div",{className:"ma-lyrics-model-inline",children:[e.jsx("span",{className:"ma-inline-label",children:"歌词模型"}),e.jsx(Ne,{selectedModel:k,selectedSelectionKey:be(k,S),onSelect:re,models:C,variant:"form",placement:"up",placeholder:"选择歌词模型"})]}),e.jsx("button",{className:"va-btn-primary ma-rewrite-submit",onClick:le,disabled:!!r,children:r?g||(R?"歌词生成中...":"歌词改写中..."):R?"Suno 生成歌词":"AI 改写"})]}),g&&e.jsx("div",{className:"ma-progress",children:g})]}),e.jsxs("div",{className:"ma-card",children:[e.jsx("div",{className:"ma-card-header",children:e.jsx("span",{children:"歌曲标题"})}),e.jsx("input",{className:"ma-input",value:T,onChange:c=>F(c.target.value),placeholder:"歌曲标题"})]}),e.jsxs("div",{className:"ma-card",children:[e.jsx("div",{className:"ma-card-header",children:e.jsx("span",{children:"Suno 风格标签"})}),e.jsx("input",{className:"ma-input",value:v,onChange:c=>D(c.target.value),placeholder:"例如 cinematic pop, female vocal, uplifting"})]}),e.jsxs("div",{className:"ma-card",children:[e.jsx("div",{className:"ma-card-header",children:e.jsx("span",{children:"歌词草稿"})}),e.jsx("textarea",{className:"ma-textarea",value:u,onChange:c=>P(c.target.value),rows:14,placeholder:"AI 改写结果会出现在这里,可继续手改"})]}),d&&e.jsx("div",{className:"ma-error",children:d}),e.jsxs("div",{className:"va-page-actions",children:[e.jsx("button",{onClick:ee,disabled:!u.trim(),children:"插入歌词"}),e.jsx("button",{className:"va-btn-primary",onClick:b,disabled:!u.trim(),children:"下一步"})]})]})},ze="music-analyzer:audio-model",Be=[{id:"generate",label:"新生成",hint:"从零生成完整音乐"},{id:"continue",label:"续写",hint:"从已有片段继续创作"},{id:"infill",label:"Infill",hint:"局部重绘指定时间窗口"}];function fe(s){const n=s.trim();if(!n)return null;const i=Number(n);return Number.isFinite(i)?i:null}function ye(s){return typeof s=="number"&&Number.isFinite(s)?String(s):""}function Pe(s){return s.split(",").map(n=>n.trim()).filter(Boolean)}function Ye(s){var n;return((n=Be.find(i=>i.id===s))==null?void 0:n.label)||"新生成"}function Ys(s){return typeof s.duration=="number"&&Number.isFinite(s.duration)?String(Math.max(0,Math.round(s.duration))):""}function We(s){const n=s.title||"未命名片段",i=s.duration!=null?` · ${ss(s.duration)}`:"",b=s.clipId?` · ${s.clipId.slice(0,8)}`:"";return`${n}${i}${b}`}const Ws=({record:s,onRecordUpdate:n,onRecordsChange:i,onRestart:b})=>{var N;const[o,M]=a.useState(s.title||""),[x,I]=a.useState((s.styleTags||[]).join(", ")),[u,P]=a.useState(s.lyricsDraft||""),[T,F]=a.useState([]),[v,D]=a.useState("chirp-v5-5"),[y,Q]=a.useState(1),[r,m]=a.useState(()=>pe(ze,Ie()).modelId),[g,j]=a.useState(()=>pe(ze,Ie()).modelRef),[d,h]=a.useState(s.musicEditAction||"generate"),[k,K]=a.useState(s.continueFromClipId||""),[S,J]=a.useState(ye(s.continueAt)),[G,de]=a.useState(ye(s.infillStartS)),[V,Z]=a.useState(ye(s.infillEndS)),[re,me]=a.useState(!1),[te,C]=a.useState(""),R=a.useRef(),Y=a.useRef(!1),ne=a.useCallback((t,w)=>{m(t),j(w||null),Se(ze,t,w)},[]);a.useEffect(()=>{M(s.title||""),I((s.styleTags||[]).join(", ")),P(s.lyricsDraft||""),h(s.musicEditAction||"generate"),K(s.continueFromClipId||""),J(ye(s.continueAt)),de(ye(s.infillStartS)),Z(ye(s.infillEndS))},[s]),a.useEffect(()=>(clearTimeout(R.current),R.current=setTimeout(async()=>{const t=Pe(x),w=fe(S),_=fe(G),ce=fe(V),W={title:o,styleTags:t,lyricsDraft:u,musicEditAction:d,continueFromClipId:k||null,continueAt:w,infillStartS:_,infillEndS:ce},ae=await oe(s.id,W);i(ae),n({...s,...W})},400),()=>clearTimeout(R.current)),[d,S,k,V,G,n,i,u,s.id,x,o]);const ie=je("audio"),A=a.useMemo(()=>ie.filter(t=>{const w=Array.isArray(t.tags)?t.tags.join(" "):"";return/suno/i.test(t.id)||/suno/i.test(w)}),[ie]),L=a.useMemo(()=>Ns(r).find(t=>t.id==="mv"),[r]);a.useEffect(()=>{L!=null&&L.defaultValue&&D(t=>t||String(L.defaultValue))},[L==null?void 0:L.defaultValue]);const le=s.generatedClips||[],ee=a.useMemo(()=>le.filter(t=>!!String(t.clipId||"").trim()),[le]),$=a.useMemo(()=>ee.find(t=>t.clipId===k)||null,[k,ee]),z=d!=="generate",H=d==="infill",se=a.useCallback((t,w)=>{if(!t.clipId){C("该片段尚未拿到真实 clip_id,暂时不能继续创作");return}h(w),K(t.clipId),J(_=>_||Ys(t)),C(w==="continue"?`已带入片段「${t.title||t.clipId.slice(0,8)}」用于续写`:`已带入片段「${t.title||t.clipId.slice(0,8)}」用于 Infill`)},[]),c=a.useCallback(async()=>{const t=u.trim(),w=o.trim(),_=x.trim(),ce=fe(S),W=fe(G),ae=fe(V);if(!t){C("请先准备歌词或生成提示词");return}if(z&&!k){C("请先选择要续写的片段");return}if(z&&!($!=null&&$.taskId)){C("当前片段缺少来源 task_id,请先重新同步或重新生成一次片段");return}if(z&&ce==null){C("请填写续写起点秒数");return}if(ce!=null&&ce<0){C("续写起点秒数不能小于 0");return}if(H&&W==null){C("请填写 Infill 开始秒数");return}if(H&&ae==null){C("请填写 Infill 结束秒数");return}if(W!=null&&W<0){C("Infill 开始秒数不能小于 0");return}if(ae!=null&&ae<0){C("Infill 结束秒数不能小于 0");return}if(H&&W!=null&&ae!=null&&W>=ae){C("Infill 开始秒数必须小于结束秒数");return}if(!Y.current){Y.current=!0,ge.trackUIInteraction({area:"popular_music_tool",action:"music_generation_started",control:"generate_music",source:"music_analyzer_generate_page",metadata:{editAction:d,batchCount:y,promptLength:t.length,hasTitle:!!w,tagsCount:Pe(_).length,hasMv:!!v,hasModelRef:!!g}}),me(!0),C("");try{const E=[],Te=d==="generate"?"gen":d;for(let he=0;he<y;he+=1){const Ce=X.createTask({prompt:t,model:r,modelRef:g,sunoAction:"music",title:w,tags:_,mv:v,continueClipId:z?k:void 0,continueTaskId:z?$==null?void 0:$.taskId:void 0,continueAt:z?ce??void 0:void 0,infillStartS:H?W??void 0:void 0,infillEndS:H?ae??void 0:void 0,knowledgeContextRefs:T,batchId:`ma_${s.id}_${Te}_${he}`,batchIndex:he,batchTotal:y,autoInsertToCanvas:!0},q.AUDIO);E.push(Ce.id)}const ve={generateTaskIds:[...s.generateTaskIds||[],...E],title:w,styleTags:Pe(_),lyricsDraft:t,musicEditAction:d,continueFromClipId:k||null,continueAt:ce,infillStartS:W,infillEndS:ae},ke=await oe(s.id,ve);i(ke),n({...s,...ve}),C(`已提交 ${y} 次${Ye(d)}任务到 Suno 队列`)}catch(E){C(E.message||"提交生成任务失败")}finally{me(!1),Y.current=!1}}},[d,y,S,k,V,G,T,v,n,i,u,s,z,H,$==null?void 0:$.taskId,r,g,x,o]);return e.jsxs("div",{className:"va-page",children:[e.jsxs("div",{className:"ma-card",children:[e.jsxs("div",{className:"ma-card-header",children:[e.jsx("span",{children:"创作动作"}),e.jsx("span",{className:"ma-muted",children:(N=Be.find(t=>t.id===d))==null?void 0:N.hint})]}),e.jsx("div",{className:"ma-action-toggle",children:Be.map(t=>e.jsx("button",{className:`ma-action-btn ${d===t.id?"active":""}`,onClick:()=>h(t.id),children:t.label},t.id))})]}),e.jsxs("div",{className:"ma-card",children:[e.jsx("div",{className:"ma-card-header",children:e.jsx("span",{children:"Suno 模型"})}),e.jsx(Ne,{selectedModel:r,selectedSelectionKey:be(r,g),onSelect:ne,models:A.length>0?A:ie,variant:"form",placement:"down",placeholder:"选择音频生成模型"})]}),(L==null?void 0:L.options)&&L.options.length>0&&e.jsxs("div",{className:"ma-card",children:[e.jsx("div",{className:"ma-card-header",children:e.jsx("span",{children:"Suno 版本"})}),e.jsx("select",{className:"ma-select",value:v,onChange:t=>D(t.target.value),children:L.options.map(t=>e.jsx("option",{value:String(t.value),children:t.label},t.value))})]}),z&&e.jsxs("div",{className:"ma-card",children:[e.jsxs("div",{className:"ma-card-header",children:[e.jsx("span",{children:"目标片段"}),e.jsx("span",{className:"ma-muted",children:"自动使用轮询得到的真实 clip_id"})]}),ee.length>0?e.jsxs("select",{className:"ma-select",value:k,onChange:t=>K(t.target.value),children:[e.jsx("option",{value:"",children:"请选择已生成片段"}),ee.map(t=>e.jsx("option",{value:t.clipId,children:We(t)},t.clipId))]}):e.jsx("div",{className:"ma-hint",children:"先生成至少一个片段,才能使用续写或 Infill。"}),$&&e.jsxs("div",{className:"ma-hint",children:["当前片段:",We($)]})]}),z&&e.jsxs("div",{className:"ma-card",children:[e.jsx("div",{className:"ma-card-header",children:e.jsx("span",{children:"编辑参数"})}),e.jsxs("div",{className:`ma-fields-grid ${H?"ma-fields-grid--triple":""}`,children:[e.jsxs("label",{className:"ma-field",children:[e.jsx("span",{children:"续写起点秒数"}),e.jsx("input",{className:"ma-input",type:"number",min:"0",step:"0.1",value:S,onChange:t=>J(t.target.value),placeholder:"例如 30"})]}),H&&e.jsxs("label",{className:"ma-field",children:[e.jsx("span",{children:"Infill 开始秒数"}),e.jsx("input",{className:"ma-input",type:"number",min:"0",step:"0.1",value:G,onChange:t=>de(t.target.value),placeholder:"例如 8"})]}),H&&e.jsxs("label",{className:"ma-field",children:[e.jsx("span",{children:"Infill 结束秒数"}),e.jsx("input",{className:"ma-input",type:"number",min:"0",step:"0.1",value:V,onChange:t=>Z(t.target.value),placeholder:"例如 16"})]})]})]}),e.jsxs("div",{className:"ma-card",children:[e.jsx("div",{className:"ma-card-header",children:e.jsx("span",{children:"歌曲标题"})}),e.jsx("input",{className:"ma-input",value:o,onChange:t=>M(t.target.value),placeholder:"歌曲标题"})]}),e.jsxs("div",{className:"ma-card",children:[e.jsx("div",{className:"ma-card-header",children:e.jsx("span",{children:"风格标签"})}),e.jsx("input",{className:"ma-input",value:x,onChange:t=>I(t.target.value),placeholder:"逗号分隔,例如 edm, intense, female vocal"})]}),e.jsxs("div",{className:"ma-card",children:[e.jsx("div",{className:"ma-card-header",children:e.jsx("span",{children:"提交给 Suno 的歌词/提示词"})}),e.jsx("textarea",{className:"ma-textarea",rows:10,value:u,onChange:t=>P(t.target.value),placeholder:"这里的内容会直接作为 prompt 提交给 Suno"}),e.jsx($e,{value:T,onChange:F,disabled:re,className:"ma-knowledge-context-selector",placement:"up"})]}),e.jsxs("div",{className:"ma-card",children:[e.jsxs("div",{className:"ma-card-header",children:[e.jsx("span",{children:"调用次数"}),e.jsx("span",{className:"ma-muted",children:"每次返回 2 首"})]}),e.jsx("div",{className:"ma-batch-selector",children:[1,2,3,4].map(t=>e.jsxs("button",{className:`ma-batch-btn ${y===t?"active":""}`,onClick:()=>Q(t),children:[t," 次"]},t))})]}),le.length>0&&e.jsxs("div",{className:"ma-card",children:[e.jsxs("div",{className:"ma-card-header",children:[e.jsxs("span",{children:["已生成片段 (",le.length,")"]}),e.jsx("span",{className:"ma-muted",children:"可直接带入续写或 Infill"})]}),e.jsx("div",{className:"ma-clips-gallery",children:le.map(t=>e.jsx(qs,{clip:t,selected:z&&!!t.clipId&&k===t.clipId,onContinue:()=>se(t,"continue"),onInfill:()=>se(t,"infill")},`${t.taskId}:${t.clipId||t.audioUrl}`))})]}),te&&e.jsx("div",{className:"ma-progress",children:te}),e.jsxs("div",{className:"va-page-actions",children:[e.jsx("button",{onClick:b,children:"重新开始"}),e.jsxs("button",{className:"va-btn-primary",onClick:c,disabled:re,children:[Ye(d)," ",y," 次"]})]})]})},qs=({clip:s,selected:n,onContinue:i,onInfill:b})=>{const o=!!String(s.clipId||"").trim();return e.jsxs("div",{className:`ma-clip-row ${n?"is-selected":""}`,children:[s.imageUrl?e.jsx("img",{className:"ma-clip-thumb",src:s.imageUrl,alt:"",referrerPolicy:"no-referrer"}):e.jsx("div",{className:"ma-clip-thumb ma-clip-thumb--placeholder",children:"♪"}),e.jsxs("div",{className:"ma-clip-meta",children:[e.jsx("span",{className:"ma-clip-title",children:s.title||"未命名"}),s.duration!=null&&e.jsx("span",{className:"ma-clip-duration",children:ss(s.duration)})]}),e.jsx("audio",{controls:!0,src:s.audioUrl,className:"ma-clip-player",preload:"metadata"}),e.jsxs("div",{className:"ma-clip-actions",children:[e.jsx("button",{className:"ma-clip-action-btn",onClick:i,disabled:!o,children:"续写"}),e.jsx("button",{className:"ma-clip-action-btn",onClick:b,disabled:!o,children:"Infill"})]})]})};function ss(s){const n=Math.floor(s/60),i=Math.round(s%60);return`${n}:${String(i).padStart(2,"0")}`}function Qs(s){switch(s){case ue.COMPLETED:return"已完成";case ue.PROCESSING:return"进行中";case ue.PENDING:return"等待中";case ue.FAILED:return"失败";default:return""}}function Js(s){switch(s){case ue.COMPLETED:return"completed";case ue.PROCESSING:return"processing";case ue.PENDING:return"pending";case ue.FAILED:return"failed";default:return"pending"}}function Xs(s){const n=new Date(s);return`${n.getMonth()+1}/${n.getDate()} ${String(n.getHours()).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}`}function Zs(s){var b,o,M,x;const n=s.params.musicAnalyzerAction;if(n==="rewrite"){const I=(b=s.result)!=null&&b.analysisData&&typeof s.result.analysisData=="object"?s.result.analysisData:null,u=typeof(I==null?void 0:I.title)=="string"&&I.title.trim()?I.title.trim():"";if(u)return u}if(n==="lyrics-gen"){const I=(o=s.result)!=null&&o.analysisData&&typeof s.result.analysisData=="object"?s.result.analysisData:null,u=typeof(I==null?void 0:I.title)=="string"&&I.title.trim()?I.title.trim():"";if(u)return u;const P=typeof((M=s.result)==null?void 0:M.lyricsTitle)=="string"&&s.result.lyricsTitle.trim()?s.result.lyricsTitle.trim():typeof((x=s.result)==null?void 0:x.title)=="string"&&s.result.title.trim()?s.result.title.trim():"";if(P)return P}const i=String(s.params.prompt||"");return i.length>40?`${i.slice(0,40)}…`:i}const ea=({records:s,onSelect:n,onRecordsChange:i,showStarredOnly:b=!1,onSelectLyrics:o})=>{const M=b?s.filter(r=>r.starred):s,[x,I]=a.useState(null),[u,P]=a.useState(null),{tasks:T}=Ls(),F=a.useMemo(()=>{const r=new Map,m=new Set(s.map(j=>j.id)),g=()=>({rewrite:[],lyricsGen:[],audio:[]});for(const j of T){const d=j.params;if(j.type===q.CHAT&&d.musicAnalyzerAction==="rewrite"&&typeof d.musicAnalyzerRecordId=="string"&&m.has(d.musicAnalyzerRecordId)){const h=d.musicAnalyzerRecordId;Me(r,h,"rewrite",j,g);continue}if((j.type===q.AUDIO||j.type===q.CHAT)&&d.musicAnalyzerAction==="lyrics-gen"&&typeof d.musicAnalyzerRecordId=="string"&&m.has(d.musicAnalyzerRecordId)){const h=d.musicAnalyzerRecordId;Me(r,h,"lyricsGen",j,g);continue}if(j.type===q.AUDIO&&typeof d.batchId=="string"&&d.batchId.startsWith("ma_")){const h=bs(d.batchId,"ma_",m);h&&Me(r,h,"audio",j,g)}}return Is(r)},[T,s]),v=a.useCallback(async(r,m)=>{r.stopPropagation();const g=await oe(m.id,{starred:!m.starred});i(g)},[i]),D=a.useCallback((r,m)=>{r.stopPropagation(),P(m)},[]),y=a.useCallback(async()=>{if(!u)return;const r=await Ts(u);i(r),P(null)},[i,u]),Q=a.useCallback((r,m)=>{r.stopPropagation(),I(g=>g===m?null:m)},[]);return M.length===0?e.jsx("div",{className:"va-page va-empty",children:e.jsx("span",{children:b?"暂无收藏":"暂无分析记录"})}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"va-page",children:e.jsx("div",{className:"va-history-list",children:M.map(r=>{var d;const m=F.get(r.id),g=!!(m&&m.rewrite.length+m.lyricsGen.length+m.audio.length>0),j=x===r.id;return e.jsxs("div",{className:"va-history-item",onClick:()=>n(r),children:[e.jsxs("div",{className:"va-history-header",children:[e.jsxs("span",{className:"va-history-source",children:[e.jsx("span",{role:"img","aria-label":"audio",children:r.source==="scratch"?"✨":"🎵"})," ",r.sourceLabel]}),e.jsx("button",{className:`va-star-btn ${r.starred?"starred":""}`,onClick:h=>v(h,r),children:r.starred?"★":"☆"})]}),e.jsxs("div",{className:"va-history-meta",children:[g&&e.jsxs("button",{className:`va-history-expand-btn ${j?"expanded":""}`,onClick:h=>Q(h,r.id),children:[e.jsx(ks,{size:12}),e.jsx("span",{children:j?"收起":"关联任务"})]}),e.jsx("span",{children:new Date(r.createdAt).toLocaleString()}),e.jsx("span",{children:r.analysisModel||r.source}),e.jsx("button",{className:"va-history-delete",onClick:h=>D(h,r.id),children:"删除"})]}),e.jsx("div",{className:"ma-history-title",children:r.title||"未命名歌曲"}),e.jsx("div",{className:"ma-history-summary",children:((d=r.analysis)==null?void 0:d.summary)||r.creationPrompt||"暂无摘要"}),r.generatedClips&&r.generatedClips.length>0&&e.jsxs("div",{className:"ma-history-clips-count",children:[r.generatedClips.length," 首已生成"]}),j&&m&&e.jsxs("div",{className:"va-history-related",onClick:h=>h.stopPropagation(),children:[m.lyricsGen.length>0&&e.jsxs("div",{children:[e.jsxs("div",{className:"va-history-related-group-title",children:["歌词生成 (",m.lyricsGen.length,")"]}),m.lyricsGen.map(h=>e.jsx(De,{task:h,onClick:()=>o==null?void 0:o(r)},h.id))]}),m.rewrite.length>0&&e.jsxs("div",{children:[e.jsxs("div",{className:"va-history-related-group-title",children:["歌词改写 (",m.rewrite.length,")"]}),m.rewrite.map(h=>e.jsx(De,{task:h,onClick:()=>o==null?void 0:o(r)},h.id))]}),m.audio.length>0&&e.jsxs("div",{children:[e.jsxs("div",{className:"va-history-related-group-title",children:["音乐生成 (",m.audio.length,")"]}),m.audio.map(h=>e.jsx(De,{task:h},h.id))]})]})]},r.id)})})}),e.jsx(Cs,{open:u!==null,title:"确认删除",description:"确定要删除这条音乐分析记录吗?此操作不可撤销。",confirmText:"删除",cancelText:"取消",danger:!0,onOpenChange:r=>{r||P(null)},onConfirm:y})]})},De=({task:s,onClick:n})=>{var o;const i=s.status===ue.COMPLETED,b=i&&((o=s.result)==null?void 0:o.url)||"";return e.jsx(Ms,{content:Qs(s.status),showArrow:!1,children:e.jsxs("div",{className:"va-history-related-task",onClick:n,style:n?{cursor:"pointer"}:void 0,children:[e.jsx("span",{className:`va-history-related-task-status ${Js(s.status)}`}),e.jsx("span",{className:"va-history-related-task-prompt",children:Zs(s)}),e.jsx("span",{className:"va-history-related-task-time",children:Xs(s.createdAt)}),i&&b&&s.type===q.AUDIO&&e.jsx("audio",{controls:!0,src:b,preload:"metadata",className:"ma-related-task-audio",onClick:M=>M.stopPropagation()})]})})},sa=[{id:"create",label:"创作"},{id:"lyrics",label:"歌词"},{id:"generate",label:"生成"}],ca=()=>{const{records:s,setRecords:n,currentRecord:i,showStarred:b,setShowStarred:o,starredCount:M,selectRecord:x,updateCurrentRecord:I,restart:u,applySyncedRecord:P}=As({loadRecords:Es,logPrefix:"[MusicAnalyzer]"}),{page:T,setPage:F,navigateToStep:v,goToDefaultPage:D,openHistory:y,openStarred:Q,toggleStarred:r}=_s({initialPage:"create",defaultPage:"create",historyPage:"history",setShowStarred:o}),m=a.useCallback(async S=>{if(zs(S)){const G=await Ue(S);return G?{...G,selectWhenNoCurrent:!0}:null}const J=Ps(S);return J?Ds(S,J):null},[]);Os({syncTask:m,applySyncedRecord:P,logPrefix:"[MusicAnalyzer]"});const g=a.useMemo(()=>sa.map((S,J)=>({...S,disabled:!i&&J>0})),[i]),j=a.useCallback(S=>{I(S)},[I]),d=a.useCallback(S=>{x(S),D()},[D,x]),h=a.useCallback(S=>{x(S),F("lyrics")},[x,F]),k=a.useCallback(S=>{I(S)},[I]),K=a.useCallback(()=>{u(),D()},[D,u]);return e.jsxs("div",{className:"video-analyzer music-analyzer",children:[e.jsx(ws,{isHistoryPage:T==="history",showStarred:b,recordsCount:s.length,starredCount:M,currentStep:T,steps:g,onStepNavigate:v,onBackFromHistory:D,onOpenHistory:y,onOpenStarred:Q,onToggleStarred:r}),T==="create"&&e.jsx(Hs,{existingRecord:i,onComplete:j,onRecordsChange:n,onCreateNew:K,onNext:i?()=>F("lyrics"):void 0,onLyricsReady:()=>F("lyrics")}),T==="lyrics"&&i&&e.jsx(Vs,{record:i,onRecordUpdate:k,onRecordsChange:n,onNext:()=>F("generate")}),T==="generate"&&i&&e.jsx(Ws,{record:i,onRecordUpdate:k,onRecordsChange:n,onRestart:K}),T==="history"&&e.jsx(ea,{records:s,onSelect:d,onRecordsChange:n,showStarredOnly:b,onSelectLyrics:h})]})};export{ca as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{n8 as f,bm as Lt,T as E,qm as rt,aD as Q,P as p,bP as k,ao as C,m$ as Ot,a8 as n,d0 as Ut,cA as at,oK as X,c4 as $t,c3 as zt,ab as it,pp as Bt,c1 as ct,qn as Ft,qo as Kt,qp as Vt,qq as Gt,nX as Qt}from"./ai-chat-
|
|
1
|
+
import{n8 as f,bm as Lt,T as E,qm as rt,aD as Q,P as p,bP as k,ao as C,m$ as Ot,a8 as n,d0 as Ut,cA as at,oK as X,c4 as $t,c3 as zt,ab as it,pp as Bt,c1 as ct,qn as Ft,qo as Kt,qp as Vt,qq as Gt,nX as Qt}from"./ai-chat-BnWVpTEI.js";import"./startup-runtime-BrfuwjQS.js";const Xt=30,Yt=80,Zt=20,Jt=2e3;function x(t,s=Jt){return typeof t!="string"?"":t.trim().slice(0,s)}function J(t){const s=[],o=new Set;return t.forEach(l=>{const c=x(l,60);!c||o.has(c)||(o.add(c),s.push(c))}),s}function W(t,s,o){const l=x(o,80);if(l)return l;const c=x(t,120),r=x(s,120);return c&&r&&c!==r?c:(r||c||"未命名提示词").slice(0,Zt)}function Wt(t){var o,l,c,r;const s=(o=t.params.promptMeta)==null?void 0:o.category;return s||(t.params.pptSlideImage||(l=t.params.pptSlidePrompt)!=null&&l.trim()?"ppt-slide":t.type===Q.IMAGE?"image":t.type===Q.VIDEO?"video":t.type===Q.AUDIO?"audio":(c=t.params.promptMeta)!=null&&c.skillName||(r=t.params.promptMeta)!=null&&r.skillId?"agent":"text")}function pt(t,s){var c,r,y,h,j,P,g;if(t.status===E.FAILED)return{kind:"error",text:((c=t.error)==null?void 0:c.message)||"任务失败"};if(t.status===E.CANCELLED)return{kind:"error",text:"任务已取消"};const o=t.result;if(!o)return{kind:"none",text:"暂无结果"};if(s==="image"||s==="ppt-slide"){const m=((r=o.thumbnailUrls)==null?void 0:r[0])||o.thumbnailUrl||((y=o.urls)==null?void 0:y[0])||o.url;return m?{kind:"image",url:m,title:o.title}:{kind:"none",text:"暂无图片预览"}}if(s==="video"){const m=o.url||((h=o.urls)==null?void 0:h[0]),S=o.thumbnailUrl||((j=o.thumbnailUrls)==null?void 0:j[0])||o.previewImageUrl;return m?{kind:"video",url:m,posterUrl:S,title:o.title,duration:o.duration}:{kind:"none",text:"暂无视频预览"}}if(s==="audio"){const m=(P=o.clips)==null?void 0:P[0],S=(m==null?void 0:m.audioUrl)||((g=o.urls)==null?void 0:g[0])||o.url,U=(m==null?void 0:m.imageLargeUrl)||(m==null?void 0:m.imageUrl)||o.previewImageUrl||o.thumbnailUrl,z=o.title||(m==null?void 0:m.title)||t.params.title;return{kind:"audio",url:S,coverUrl:U,title:z,text:o.lyricsText||o.lyricsTitle,duration:(m==null?void 0:m.duration)??o.duration}}const l=o.chatResponse||o.lyricsText||o.title||(o.url?"结果已生成":"");return l?{kind:"text",text:l.slice(0,500),title:o.title||o.lyricsTitle}:{kind:"none",text:"暂无文本预览"}}function qt(t){const s=t.params.promptMeta,o=Wt(t),l=x(rt((s==null?void 0:s.sentPrompt)||(o==="ppt-slide"?t.params.pptSlidePrompt:void 0)||t.params.prompt)),c=x(rt((s==null?void 0:s.initialPrompt)||t.params.sourcePrompt||t.params.rawInput||l)),r=x(s==null?void 0:s.skillName,80),y=x(s==null?void 0:s.skillId,120),h=((s==null?void 0:s.knowledgeContextRefs)||t.params.knowledgeContextRefs||[]).map(P=>P!=null&&P.title?`知识库:${x(P.title,40)}`:void 0),j=J([o,r||void 0,...(s==null?void 0:s.tags)||[],...h]);return{id:`prompt-history-${t.id}`,taskId:t.id,taskIds:[t.id],sourceSentPrompt:l,sourceSentPrompts:[l],category:o,status:t.status,title:W(c,l,s==null?void 0:s.title),initialPrompt:c,sentPrompt:l,tags:j,skillId:y||void 0,skillName:r||void 0,model:x(t.params.model,120)||void 0,createdAt:t.completedAt||t.createdAt,completedAt:t.completedAt,resultPreview:pt(t,o),resultPreviews:[pt(t,o)],resultCount:1,pinned:f.isContentPinned(l)}}function te(t){const s=f.getHistoryOverride(t.sourceSentPrompt),o=x((s==null?void 0:s.content)||(s==null?void 0:s.sentPrompt)||f.resolveContent(t.sourceSentPrompt)||t.sentPrompt),l=x(s==null?void 0:s.title,80)||(o===t.sentPrompt?t.title:W(t.initialPrompt,o)),c=(s==null?void 0:s.tags)!==void 0?J(s.tags):t.tags;return{...t,sentPrompt:o,title:l,tags:c,pinned:f.isContentPinned(o)}}function dt(t,s){var r;if(s.category&&s.category!=="all"&&t.category!==s.category||s.skillTag&&s.skillTag!=="all"&&!t.tags.includes(s.skillTag))return!1;const o=(r=s.search)==null?void 0:r.trim().toLowerCase();if(!o)return!0;const l=t.resultPreview.kind==="text"||t.resultPreview.kind==="error"||t.resultPreview.kind==="none"?t.resultPreview.text:t.resultPreview.title,c=[t.title,t.initialPrompt,t.sentPrompt,t.sourceSentPrompts.join(" "),t.tags.join(" "),t.skillName,t.model,l].filter(Boolean).join(`
|
|
2
2
|
`).toLowerCase();return o.split(/\s+/).every(y=>c.includes(y))}function ee(t,s){return!s.skillTag||s.skillTag==="all"||t.tags.includes(s.skillTag)}function se(t,s){return dt({...t,tags:t.tags},{...s,skillTag:"all"})}function oe(t){return t||"text"}function ut(t,s){return s.length>t.length?s:t}function Y(t){return t.kind!=="none"}function ne(t){const s=f.resolveMetadata(t.content),o=x(s.sourceContent||t.content),l=x(s.content||t.content),c=oe(t.modelType||s.modelType),r=J([c,...s.tags||[]]);return{id:`prompt-history-manual-${t.id}`,taskId:t.id,taskIds:[],sourceSentPrompt:o,sourceSentPrompts:[o],category:c,status:E.COMPLETED,title:W(l,l,s.title),initialPrompt:l,sentPrompt:l,tags:r,createdAt:t.timestamp,resultPreview:{kind:"none",text:"暂无结果"},resultPreviews:[],resultCount:0,pinned:!!t.pinned||f.isContentPinned(l)}}function le(t){const s=new Map;for(const o of t){const l=o.sentPrompt.trim(),c=o.sourceSentPrompt.trim();if(!l||f.isContentDeleted(l)||f.isContentDeleted(c))continue;const r=s.get(l);if(!r){s.set(l,{...o,id:`prompt-history-${l}`,resultPreviews:Y(o.resultPreview)?[o.resultPreview]:[],resultCount:Y(o.resultPreview)?1:0,pinned:f.isContentPinned(o.sentPrompt)});continue}r.taskIds.push(...o.taskIds),r.sourceSentPrompts=Array.from(new Set([...r.sourceSentPrompts,...o.sourceSentPrompts])),r.tags=Array.from(new Set([...r.tags,...o.tags])),r.title=ut(r.title,o.title),r.initialPrompt=ut(r.initialPrompt,o.initialPrompt),o.createdAt>r.createdAt&&(r.createdAt=o.createdAt,r.completedAt=o.completedAt,r.taskId=o.taskId,r.status=o.status,r.category=o.category,r.model=o.model||r.model),o.skillName&&!r.skillName&&(r.skillName=o.skillName),o.skillId&&!r.skillId&&(r.skillId=o.skillId),Y(o.resultPreview)&&(r.resultPreviews.push(o.resultPreview),r.resultCount=r.resultPreviews.length,r.resultPreview=r.resultPreviews[0])}return Array.from(s.values()).sort((o,l)=>o.pinned&&!l.pinned?-1:!o.pinned&&l.pinned?1:l.createdAt-o.createdAt)}async function re(t={}){const s=Math.min(Math.max(t.limit??Xt,1),80),o=Math.max(t.offset??0,0);let l=0;const c=[];let r=!0;for(f.getHistory().forEach(g=>c.push(ne(g)));r;){const g=await Lt.getPromptHistoryTaskSummaries({offset:l,limit:Yt,statuses:[E.COMPLETED,E.FAILED,E.CANCELLED]});for(const m of g.items){const S=te(qt(m));c.push(S)}l=g.nextOffset,(!g.hasMore||g.items.length===0)&&(r=!1)}const y=le(c),h=new Set;y.forEach(g=>{se(g,t)&&g.category==="agent"&&g.tags.filter(m=>m!=="agent").forEach(m=>h.add(m))});const j=y.filter(g=>dt(g,t)&&ee(g,t)),P=j.length;return{records:j.slice(o,o+s),nextOffset:o+Math.min(s,Math.max(P-o,0)),hasMore:o+s<P,total:P,skillTags:Array.from(h).sort((g,m)=>g.localeCompare(m,"zh-CN"))}}function ae(t,s,o){return f.setContentPinned(t,s,o)}function ie(t){f.deleteContents(t)}function ce(t){const s=t.content.trim();if(!s)return!1;const o=t.modelType||t.category;return f.addHistory(s,t.hasSelection,o),(t.title!==void 0||t.tags!==void 0||o)&&f.setHistoryOverride(s,{title:t.title,sentPrompt:s,tags:t.tags,modelType:o}),t.pinned!==void 0&&f.setContentPinned(s,t.pinned,o),!0}function pe(t){const s=Array.from(new Set((t.sourceSentPrompts||[t.sourceSentPrompt]).map(j=>j.trim()).filter(Boolean))),o=s[0]||"";if(!o)return!1;const l=f.resolveMetadata(o),c=t.sentPrompt.trim(),r=t.category?t.category:void 0,y=!!(t.allowSentPromptEdit&&c),h=y?c:l.content||c||o;return y&&h!==l.content&&f.setContentEdited(s,h,r),!!f.setHistoryOverride(o,{title:t.title,sentPrompt:h,tags:t.tags,modelType:r})}const Z=[{value:"all",label:"全部"},{value:"image",label:"图片"},{value:"video",label:"视频"},{value:"audio",label:"音频"},{value:"text",label:"文本"},{value:"agent",label:"Agent"},{value:"ppt-common",label:"PPT公共"},{value:"ppt-slide",label:"PPT页面"}];function ue(t){const s=[],o=new Set;return t.split(/[\n,,;;]+/).map(l=>l.trim()).filter(Boolean).forEach(l=>{const c=l.slice(0,60);o.has(c)||(o.add(c),s.push(c))}),s}function me(t){var s;return((s=Z.find(o=>o.value===t))==null?void 0:s.label)||t}function b(t){return t==="all"?void 0:t}function de(t){return new Intl.DateTimeFormat("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}).format(new Date(t))}function he(t){return t.kind==="audio"?t.title||t.text||t.url||"音频结果":t.kind==="text"?t.title?`${t.title} ${t.text}`:t.text:t.kind==="image"||t.kind==="video"?"":t.text}function ge(t,s,o){return t.kind==="image"?{id:`${s.id}-result-${o}`,url:t.url,type:"image",title:t.title||s.title,prompt:s.sentPrompt}:t.kind==="video"?{id:`${s.id}-result-${o}`,url:t.url,type:"video",posterUrl:t.posterUrl,title:t.title||s.title,duration:t.duration,prompt:s.sentPrompt}:t.kind==="audio"&&t.url?{id:`${s.id}-result-${o}`,url:t.url,type:"audio",posterUrl:t.coverUrl,title:t.title||s.title,duration:t.duration,prompt:s.sentPrompt}:null}function fe(t){var o;return(((o=t.resultPreviews)==null?void 0:o.length)>0?t.resultPreviews:t.resultPreview?[t.resultPreview]:[]).map((l,c)=>ge(l,t,c)).filter(l=>!!l)}function mt(t){return!!(t&&t.resultCount===0)}const xe=({initialCategory:t})=>{const[s,o]=p.useState([]),[l,c]=p.useState(t||"all"),[r,y]=p.useState("all"),[h,j]=p.useState(""),[P,g]=p.useState(0),[m,S]=p.useState(!1),[U,z]=p.useState(0),[$,ht]=p.useState([]),[B,q]=p.useState(null),[M,F]=p.useState(new Set),[tt,gt]=p.useState([]),[ft,yt]=p.useState(0),[Pt,et]=p.useState(!1),[i,R]=p.useState(null),K=p.useRef(!1),D=p.useRef(0),V=p.useRef(null),st=p.useRef(0),H=B!==null;p.useEffect(()=>{k.trackPromptAction({action:"open_tool",surface:"prompt_history_tool",source:"toolbox",status:"success",metadata:{tool_id:"prompt-history"}})},[]),p.useEffect(()=>{t&&(c(t),y("all"),j(""))},[t]);const v=p.useCallback(async(e="reset",u=0)=>{if(e==="more"&&K.current)return;const a=D.current+1;D.current=a,K.current=!0,q(e);try{const d=await re({category:l,skillTag:r,search:h,offset:u,limit:30});if(a!==D.current)return;o(_=>e==="more"?[..._,...d.records]:d.records),g(d.nextOffset),S(d.hasMore),z(d.total),ht(d.skillTags),e==="reset"&&(F(new Set),V.current=null)}catch(d){if(a!==D.current)return;k.trackPromptAction({action:"load_history",surface:"prompt_history_tool",promptType:b(l),status:"failed",metadata:{mode:e,has_search:h.trim().length>0,has_skill_filter:r!=="all"}}),console.error("[PromptHistoryTool] 加载提示词历史失败:",d),C.error("我的提示词加载失败")}finally{a===D.current&&(K.current=!1,q(null))}},[l,h,r]);p.useEffect(()=>{v("reset")},[v]),p.useEffect(()=>{r!=="all"&&!$.includes(r)&&y("all")},[r,$]);const T=p.useMemo(()=>s.map(e=>e.id),[s]),N=p.useMemo(()=>s.filter(e=>M.has(e.id)),[s,M]),A=p.useMemo(()=>ue((i==null?void 0:i.tagsInput)||""),[i==null?void 0:i.tagsInput]),xt=p.useMemo(()=>`共 ${U} 条,已加载 ${s.length} 条`,[s.length,U]),_t=T.length>0&&T.every(e=>M.has(e)),jt=p.useCallback(()=>{k.trackPromptAction({action:"refresh",surface:"prompt_history_tool",promptType:b(l),metadata:{has_search:h.trim().length>0,has_skill_filter:r!=="all"}}),v("reset")},[l,v,h,r]),vt=p.useCallback(e=>{e!==l&&(k.trackPromptAction({action:"filter_category",surface:"prompt_history_tool",promptType:b(e),metadata:{category:e}}),c(e))},[l]),kt=p.useCallback(e=>{const u=e.target.value;k.trackPromptAction({action:"filter_skill",surface:"prompt_history_tool",promptType:b(l),metadata:{selection:u==="all"?"all":"custom"}}),y(u)},[l]),bt=p.useCallback(e=>{const u=e.target.value;j(u);const a=u.trim();if(!a)return;const d=Date.now();d-st.current<2e3||(st.current=d,k.trackPromptAction({action:"search",surface:"prompt_history_tool",promptType:b(l),prompt:a,metadata:{has_skill_filter:r!=="all"}}))},[l,r]),Tt=p.useCallback((e,u,a)=>{F(d=>{const _=new Set(d),O=V.current;if(a&&O){const w=T.indexOf(O),I=T.indexOf(e);if(w>=0&&I>=0){const[Dt,Ht]=w<I?[w,I]:[I,w];return T.slice(Dt,Ht+1).forEach(lt=>{u?_.add(lt):_.delete(lt)}),_}}return u?_.add(e):_.delete(e),V.current=e,_})},[T]),Ct=p.useCallback(e=>{F(u=>{const a=new Set(u);return T.forEach(d=>{e?a.add(d):a.delete(d)}),a})},[T]),St=p.useCallback(()=>{N.length!==0&&(ie(N.flatMap(e=>e.sourceSentPrompts)),k.trackPromptAction({action:"delete",surface:"prompt_history_tool",itemCount:N.length,status:"success"}),C.success(`已删除 ${N.length} 条提示词`),v("reset"))},[v,N]),Nt=p.useCallback(async(e,u)=>{u.stopPropagation();try{await Ot(e.sentPrompt),k.trackPromptAction({action:"copy",surface:"prompt_history_tool",promptType:b(e.category),prompt:e.sentPrompt,status:"success",metadata:{record_status:e.status,initial_differs_from_sent:e.initialPrompt!==e.sentPrompt}}),C.success("提示词已复制")}catch(a){console.error("[PromptHistoryTool] 复制提示词失败:",a),C.error("复制失败")}},[]),wt=p.useCallback(e=>{var u;e.shiftKey&&((u=window.getSelection())==null||u.removeAllRanges())},[]),It=p.useCallback((e,u)=>{u.stopPropagation();const a=!e.pinned;ae(e.sentPrompt,a,e.category),k.trackPromptAction({action:a?"pin":"unpin",surface:"prompt_history_tool",promptType:b(e.category),prompt:e.sentPrompt,status:"success"}),C.success(a?"已置顶提示词":"已取消置顶"),v("reset")},[v]),At=p.useCallback((e,u)=>{u.stopPropagation(),R({mode:"edit",record:e,title:e.title,sentPrompt:e.sentPrompt,tagsInput:e.tags.join(", "),category:e.category,pinned:e.pinned})},[]),ot=p.useCallback((e,u)=>{u==null||u.stopPropagation();const a=l==="all"?"text":l;R({mode:"create",record:e,title:(e==null?void 0:e.title)||"",sentPrompt:(e==null?void 0:e.sentPrompt)||"",tagsInput:(e==null?void 0:e.tags.join(", "))||"",category:(e==null?void 0:e.category)||a,pinned:(e==null?void 0:e.pinned)||!1})},[l]),G=p.useCallback(()=>{R(null)},[]),Et=p.useCallback(()=>{var a,d,_,O,w,I;if(!i)return;if(!i.sentPrompt.trim()){C.warning("发送提示词不能为空");return}const e=i.mode==="edit"&&mt(i.record);if(!(i.mode==="create"?ce({title:i.title,content:i.sentPrompt,tags:A,category:i.category,pinned:i.pinned}):pe({sourceSentPrompt:((a=i.record)==null?void 0:a.sourceSentPrompt)||"",sourceSentPrompts:(d=i.record)==null?void 0:d.sourceSentPrompts,title:i.title,sentPrompt:e?i.sentPrompt:((_=i.record)==null?void 0:_.sentPrompt)||i.sentPrompt,tags:A,category:(O=i.record)==null?void 0:O.category,...e?{allowSentPromptEdit:!0}:{}}))){C.error("保存失败");return}k.trackPromptAction({action:i.mode==="create"?"create":"edit",surface:"prompt_history_tool",promptType:b(i.category),prompt:i.sentPrompt,status:"success",metadata:{tag_count:A.length,title_changed:i.mode==="edit"?i.title.trim()!==((w=i.record)==null?void 0:w.title):!!i.title.trim(),prompt_changed:i.mode==="create"||e&&i.sentPrompt.trim()!==((I=i.record)==null?void 0:I.sentPrompt)}}),C.success(i.mode==="create"?"提示词已创建":"提示词已更新"),R(null),v("reset")},[i,A,v]),L=p.useCallback(e=>{R(u=>u&&{...u,...e})},[]),Mt=p.useCallback((e,u,a)=>{e.stopPropagation(),u.length!==0&&(gt(u),yt(a),et(!0))},[]),Rt=p.useCallback(e=>{const u=e.currentTarget;u.scrollHeight-u.scrollTop-u.clientHeight<180&&m&&!H&&(k.trackPromptAction({action:"load_more",surface:"prompt_history_tool",promptType:b(l),itemCount:s.length,metadata:{has_search:h.trim().length>0,has_skill_filter:r!=="all",next_offset:P}}),v("more",P))},[l,m,v,H,P,s.length,h,r]),nt=(i==null?void 0:i.mode)==="create"||mt(i==null?void 0:i.record);return n.jsxs("div",{className:"prompt-history-tool",children:[n.jsxs("div",{className:"prompt-history-tool__toolbar",children:[n.jsxs("div",{className:"prompt-history-tool__search",children:[n.jsx(Ut,{size:14}),n.jsx("input",{value:h,onChange:bt,placeholder:"搜索标题、提示词、标签"})]}),n.jsx("button",{type:"button",className:"prompt-history-tool__icon-btn",onClick:()=>ot(),"aria-label":"新建提示词",children:n.jsx(at,{size:16})}),n.jsx("button",{type:"button",className:"prompt-history-tool__icon-btn",onClick:jt,disabled:H,"aria-label":"刷新",children:H?n.jsx(X,{size:16}):n.jsx($t,{size:16})})]}),n.jsx("div",{className:"prompt-history-tool__filters",children:Z.map(e=>n.jsx("button",{type:"button",className:l===e.value?"is-active":"",onClick:()=>vt(e.value),children:e.label},e.value))}),$.length>0&&n.jsx("div",{className:"prompt-history-tool__skill-filter",children:n.jsxs("select",{value:r,onChange:kt,children:[n.jsx("option",{value:"all",children:"全部 Skill"}),$.map(e=>n.jsx("option",{value:e,children:e},e))]})}),n.jsxs("div",{className:"prompt-history-tool__summary",children:[n.jsx("span",{children:xt}),N.length>0&&n.jsxs("button",{type:"button",className:"prompt-history-tool__delete-btn",onClick:St,children:[n.jsx(zt,{size:14}),"删除 ",N.length," 条"]}),B==="reset"&&n.jsx(X,{size:14,className:"prompt-history-tool__summary-loading"})]}),n.jsxs("div",{className:"prompt-history-tool__table-wrap",onScroll:Rt,children:[n.jsxs("table",{className:"prompt-history-tool__table",children:[n.jsx("thead",{children:n.jsxs("tr",{children:[n.jsx("th",{className:"prompt-history-tool__col-select",children:n.jsx("input",{type:"checkbox","aria-label":"选择已加载提示词",checked:_t,onChange:e=>Ct(e.target.checked)})}),n.jsx("th",{className:"prompt-history-tool__col-type",children:"类型"}),n.jsx("th",{className:"prompt-history-tool__col-title",children:"标题"}),n.jsx("th",{children:"发送提示词"}),n.jsx("th",{className:"prompt-history-tool__col-tags",children:"标签"}),n.jsx("th",{className:"prompt-history-tool__col-result",children:"结果"}),n.jsx("th",{className:"prompt-history-tool__col-time",children:"时间"}),n.jsx("th",{className:"prompt-history-tool__col-actions",children:"操作"})]})}),n.jsx("tbody",{children:s.map(e=>{const u=fe(e);return n.jsxs("tr",{className:M.has(e.id)?"is-selected":"",children:[n.jsx("td",{children:n.jsx("input",{type:"checkbox","aria-label":`选择 ${e.title}`,checked:M.has(e.id),onMouseDown:wt,onClick:a=>a.stopPropagation(),onChange:a=>Tt(e.id,a.target.checked,a.nativeEvent instanceof MouseEvent?a.nativeEvent.shiftKey:!1)})}),n.jsx("td",{children:n.jsx("span",{className:`prompt-history-tool__type prompt-history-tool__type--${e.category}`,children:me(e.category)})}),n.jsxs("td",{children:[n.jsx("div",{className:"prompt-history-tool__title",children:e.title}),e.initialPrompt!==e.sentPrompt&&n.jsxs("div",{className:"prompt-history-tool__subtext",children:["初始:",e.initialPrompt]}),e.sourceSentPrompt!==e.sentPrompt&&n.jsxs("div",{className:"prompt-history-tool__subtext",children:["原始:",e.sourceSentPrompt]})]}),n.jsx("td",{children:n.jsx(it,{placement:"left",delay:120,overlayClassName:"prompt-history-tool__prompt-popover",content:n.jsx("div",{className:"prompt-history-tool__prompt-full",children:e.sentPrompt}),children:n.jsx("button",{type:"button",className:"prompt-history-tool__prompt",onClick:a=>Nt(e,a),"aria-label":`复制提示词:${e.title}`,children:e.sentPrompt})})}),n.jsx("td",{children:n.jsx("div",{className:"prompt-history-tool__tags",children:e.tags.map(a=>n.jsx("span",{children:a},a))})}),n.jsx("td",{children:u.length>0?n.jsxs("div",{className:"prompt-history-tool__media-grid",children:[u.slice(0,4).map((a,d)=>n.jsx(it,{placement:"left",delay:80,overlayClassName:"prompt-history-tool__media-popover",content:a.type==="video"?n.jsx("video",{src:a.url,poster:a.posterUrl,controls:!0,muted:!0,preload:"metadata"}):n.jsx(ct,{src:a.posterUrl||a.url,alt:a.title||e.title,showSkeleton:!1,eager:!0}),children:n.jsx("button",{type:"button",className:"prompt-history-tool__media-thumb",onClick:_=>Mt(_,u,d),children:a.type==="video"?n.jsx(Bt,{src:a.url,poster:a.posterUrl,alt:a.title||e.title,thumbnailSize:"small",activateVideoOnClick:!1}):n.jsx(ct,{src:a.posterUrl||a.url,alt:a.title||e.title,showSkeleton:!1,eager:!0})})},a.id||a.url)),e.resultCount>4&&n.jsxs("span",{className:"prompt-history-tool__media-count",children:["+",e.resultCount-4]})]}):n.jsx("div",{className:"prompt-history-tool__result-text",children:he(e.resultPreview)})}),n.jsx("td",{children:de(e.createdAt)}),n.jsx("td",{children:n.jsxs("div",{className:"prompt-history-tool__actions",children:[n.jsx("button",{type:"button",className:"prompt-history-tool__create-btn",onClick:a=>ot(e,a),"aria-label":`基于 ${e.title} 创建`,children:n.jsx(at,{size:15})}),n.jsx("button",{type:"button",className:"prompt-history-tool__edit-btn",onClick:a=>At(e,a),"aria-label":`编辑 ${e.title}`,children:n.jsx(Ft,{size:15})}),n.jsx("button",{type:"button",className:`prompt-history-tool__pin-btn ${e.pinned?"is-pinned":""}`,onClick:a=>It(e,a),"aria-label":e.pinned?"取消置顶":"置顶",children:e.pinned?n.jsx(Kt,{size:15}):n.jsx(Vt,{size:15})})]})})]},e.id)})})]}),!H&&s.length===0&&n.jsx("div",{className:"prompt-history-tool__empty",children:"暂无我的提示词"}),B==="more"&&n.jsxs("div",{className:"prompt-history-tool__loading-more",children:[n.jsx(X,{size:14}),"加载中..."]}),!m&&s.length>0&&n.jsx("div",{className:"prompt-history-tool__done",children:"已加载全部"})]}),n.jsxs("div",{className:"prompt-history-tool__footer",children:[n.jsxs("div",{className:"prompt-history-tool__hint",children:[n.jsx(Gt,{size:13}),"点击提示词复制,勾选列选择,Shift 连选"]}),n.jsx("span",{children:m?"向下滚动自动加载":"没有更多了"})]}),n.jsx(Qt,{visible:Pt,items:tt,initialIndex:ft,onClose:()=>et(!1),showThumbnails:tt.length>1,videoAutoPlay:!0}),i&&n.jsx("div",{className:"prompt-history-tool__edit-mask",role:"presentation",onMouseDown:G,children:n.jsxs("form",{className:"prompt-history-tool__edit-dialog",onMouseDown:e=>e.stopPropagation(),onSubmit:e=>{e.preventDefault(),Et()},children:[n.jsxs("div",{className:"prompt-history-tool__edit-header",children:[n.jsxs("div",{children:[n.jsx("h3",{children:i.mode==="create"?"创建提示词":"编辑提示词"}),n.jsx("p",{children:i.mode==="create"?"填写类型、置顶、标题、发送提示词和标签":nt?"修改标题、发送提示词和标签":"修改标题和标签,发送提示词保持不变"})]}),n.jsx("button",{type:"button",className:"prompt-history-tool__edit-close",onClick:G,"aria-label":"关闭编辑弹窗",children:"×"})]}),i.mode==="create"&&n.jsxs("div",{className:"prompt-history-tool__field-row",children:[n.jsxs("label",{className:"prompt-history-tool__field",children:[n.jsx("span",{children:"类型"}),n.jsx("select",{value:i.category,onChange:e=>L({category:e.target.value}),children:Z.filter(e=>e.value!=="all").map(e=>n.jsx("option",{value:e.value,children:e.label},e.value))})]}),n.jsxs("label",{className:"prompt-history-tool__switch-field",children:[n.jsx("input",{type:"checkbox",checked:i.pinned,onChange:e=>L({pinned:e.target.checked})}),n.jsx("span",{children:"置顶"})]})]}),n.jsxs("label",{className:"prompt-history-tool__field",children:[n.jsx("span",{children:"标题"}),n.jsx("input",{value:i.title,onChange:e=>L({title:e.target.value}),maxLength:80,placeholder:"输入标题"})]}),n.jsxs("label",{className:"prompt-history-tool__field",children:[n.jsx("span",{children:"发送提示词"}),n.jsx("textarea",{value:i.sentPrompt,onChange:e=>L({sentPrompt:e.target.value}),readOnly:!nt,rows:8,maxLength:2e3,placeholder:"输入发送提示词"})]}),n.jsxs("label",{className:"prompt-history-tool__field",children:[n.jsx("span",{children:"标签"}),n.jsx("textarea",{className:"prompt-history-tool__tags-input",value:i.tagsInput,onChange:e=>L({tagsInput:e.target.value}),rows:2,placeholder:"多个标签用逗号或换行分隔"})]}),A.length>0&&n.jsx("div",{className:"prompt-history-tool__edit-tags",children:A.map(e=>n.jsx("span",{children:e},e))}),n.jsxs("div",{className:"prompt-history-tool__edit-footer",children:[n.jsx("button",{type:"button",onClick:G,children:"取消"}),n.jsx("button",{type:"submit",className:"is-primary",children:"保存"})]})]})})]})};export{xe as PromptHistoryTool,xe as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ai-chat-BlxYfB4O.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{_ as L}from"./startup-runtime-BrfuwjQS.js";import{P as d,cK as me,ao as h,cO as E,i0 as he,a8 as l,a3 as _e,fA as ve,eI as ye,co as D,iP as ee,f6 as te,gz as xe}from"./ai-chat-D2kHVW04.js";const T=25*1024*1024,ae=10*1024*1024,Re=({images:f,onImagesChange:g,language:F="zh",disabled:m=!1,multiple:p=!0,maxCount:_=10,label:U,slotLabels:c,onError:s})=>{const[O,x]=d.useState(!1),[$,B]=d.useState(!1),[v,H]=d.useState(0),[j,N]=d.useState(null),b=d.useRef(null),Y=d.useRef(null),{addAsset:G}=me(),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],k=d.useCallback(e=>c?e.filter(t=>(t==null?void 0:t.url)||(t==null?void 0:t.file)).map((t,a)=>({...t,slot:t.slot??a})).sort((t,a)=>(t.slot??0)-(a.slot??0)):e,[c]),ne=c?c.map((e,t)=>({slot:t,image:k(f).find(a=>(a.slot??-1)===t)})):[],z=d.useCallback(async e=>{if(e.size&&e.size>T)throw new Error(`Asset exceeds 25MB limit: ${e.name}`);let a=await(await fetch(e.url)).blob();if(a.size>T)throw new Error(`Asset exceeds 25MB limit: ${e.name}`);if(a.size>ae){const{compressImageBlob:n,getCompressionStrategy:r}=await L(async()=>{const{compressImageBlob:y,getCompressionStrategy:M}=await import("./ai-chat-D2kHVW04.js").then(R=>R.sH);return{compressImageBlob:y,getCompressionStrategy:M}},__vite__mapDeps([0]),import.meta.url),o=r(a.size/(1024*1024));a=await n(a,o.targetSizeMB)}return{url:await new Promise((n,r)=>{const o=new FileReader;o.onload=()=>n(o.result),o.onerror=r,o.readAsDataURL(a)}),name:e.name}},[]),S=d.useCallback((e,t=v)=>{if(!c)return;const a=c.map((n,r)=>r).filter(n=>n>=t).slice(0,e.length);if(a.length===0)return;const i=k(f).filter(n=>!a.includes(n.slot??-1));a.forEach((n,r)=>{i.push({...e[r],slot:n})}),g(k(i)),e.length>a.length&&h.warning(u.maxCountReached.replace("{count}",String(a.length)))},[v,f,k,g,c,u]),V=d.useCallback(e=>e.type.startsWith("image/")?e.size>T?(h.error(u.fileTooLarge),!1):!0:(h.error(u.invalidFile),!1),[u]),X=d.useCallback((e,t)=>new Promise((a,i)=>{const n=new FileReader;n.onload=()=>{a({url:n.result,name:t,file:(e instanceof File,e)})},n.onerror=i,n.readAsDataURL(e)}),[]),w=d.useCallback(async(e,t)=>{const i=Array.from(e).filter(V);if(i.length===0)return;if(c){const r=t??v,o=c.length-r;if(o<=0){h.warning(u.maxCountReached.replace("{count}","0"));return}i.length>o&&(h.warning(u.maxCountReached.replace("{count}",String(o))),i.splice(o))}else p&&f.length+i.length>_&&(h.warning(u.maxCountReached.replace("{count}",String(_))),i.splice(_-f.length));const n=[];for(const r of i)try{let o=r;if(r.size>ae){const{compressImageBlob:y,getCompressionStrategy:M}=await L(async()=>{const{compressImageBlob:P,getCompressionStrategy:pe}=await import("./ai-chat-D2kHVW04.js").then(ge=>ge.sH);return{compressImageBlob:P,getCompressionStrategy:pe}},__vite__mapDeps([0]),import.meta.url),R=M(r.size/(1024*1024)),I=h.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{o=await y(r,R.targetSizeMB),h.close(I),h.success({content:F==="zh"?`压缩完成: ${(r.size/1024/1024).toFixed(1)}MB → ${(o.size/1024/1024).toFixed(1)}MB`:`Compressed: ${(r.size/1024/1024).toFixed(1)}MB → ${(o.size/1024/1024).toFixed(1)}MB`,duration:2})}catch(P){h.close(I),console.error("[ReferenceImageUpload] Compression failed:",P),s==null||s(F==="zh"?"图片压缩失败":"Image compression failed");continue}}n.push({blob:o,name:r.name})}catch(o){console.error("[ReferenceImageUpload] Error processing file:",o),s==null||s(u.loadFailed);continue}if(n.length!==0){n.forEach(({blob:r,name:o})=>{G(r,E.IMAGE,he.LOCAL,o).catch(y=>{console.warn("[ReferenceImageUpload] Failed to add asset to library:",y)})});try{const r=await Promise.all(n.map(({blob:o,name:y})=>X(o,y)));c&&t!==void 0?S(r,t):g(p?[...f,...r]:r.slice(0,1)),s==null||s(null)}catch(r){console.error("[ReferenceImageUpload] Failed to process files:",r),s==null||s(u.loadFailed)}}},[S,G,v,X,f,F,_,p,s,g,c,u,V]),re=d.useCallback(e=>{const t=e.target.files;t&&t.length>0&&w(t,c?v:void 0),e.target.value=""},[w,c,v]),le=d.useCallback(async e=>{try{const t=await z(e);if(c)S([t]);else if(p){if(f.length>=_){h.warning(u.maxCountReached.replace("{count}",String(_)));return}g([...f,t])}else g([t]);x(!1),s==null||s(null)}catch(t){console.error("[ReferenceImageUpload] Failed to convert asset to base64:",t),s==null||s(u.loadFailed),x(!1)}},[S,z,f,p,_,c,g,s,u]),ce=d.useCallback(async e=>{if(e.length===0)return;let t=e;if(c){const a=c.length-v;if(a<=0){x(!1);return}t=e.slice(0,a),e.length>a&&h.warning(u.maxCountReached.replace("{count}",String(a)))}else if(p&&f.length+e.length>_){h.warning(u.maxCountReached.replace("{count}",String(_)));const a=_-f.length;if(a<=0){x(!1);return}t=e.slice(0,a)}else p||(t=e.slice(0,1));try{const a=[];for(const i of t)try{a.push(await z(i))}catch(n){console.error("[ReferenceImageUpload] Failed to convert asset:",i.name,n)}a.length>0&&(c?S(a):g(p?[...f,...a]:a.slice(0,1))),x(!1),s==null||s(null)}catch(a){console.error("[ReferenceImageUpload] Batch selection failed:",a),s==null||s(u.loadFailed),x(!1)}},[S,z,v,f,p,_,c,g,s,u]),W=d.useCallback(e=>{e.preventDefault(),e.stopPropagation(),m||B(!0)},[m]),K=d.useCallback(e=>{var a;e.preventDefault(),e.stopPropagation();const t=(a=b.current)==null?void 0:a.getBoundingClientRect();if(t){const{clientX:i,clientY:n}=e;(i<t.left||i>t.right||n<t.top||n>t.bottom)&&B(!1)}},[]),Z=d.useCallback(e=>{e.preventDefault(),e.stopPropagation()},[]),q=d.useCallback((e,t)=>{if(e.preventDefault(),e.stopPropagation(),B(!1),m)return;const a=e.dataTransfer.files;a&&a.length>0&&w(a,t)},[v,m,w,c]);d.useEffect(()=>{const e=async t=>{var y;if(m)return;const a=document.activeElement,i=b.current;if(!i||!(i.contains(a)||a===document.body||(a==null?void 0:a.tagName)==="BODY"))return;const r=(y=t.clipboardData)==null?void 0:y.items;if(!r)return;const o=[];for(let M=0;M<r.length;M++){const R=r[M];if(R.type.startsWith("image/")){const I=R.getAsFile();I&&o.push(I)}}o.length>0&&(t.preventDefault(),w(o,c?v:void 0))};return document.addEventListener("paste",e),()=>{document.removeEventListener("paste",e)}},[m,w]);const ie=d.useCallback((e,t)=>{const a=c?f.filter((i,n)=>(i.slot??n)!==(t??e)):f.filter((i,n)=>n!==e);N(null),g(a)},[f,g,c]),J=d.useCallback(e=>{var t;e!==void 0&&H(e),(t=Y.current)==null||t.click()},[]),Q=d.useCallback(e=>{e!==void 0&&H(e),x(!0)},[]),se=d.useCallback((e,t)=>{const a=t.currentTarget.getBoundingClientRect(),i=a.left+a.width/2,n=a.top-10;N({url:e,x:i,y:n})},[]),oe=d.useCallback(()=>{N(null)},[]),C=e=>l.jsx("div",{className:`reference-image-upload__placeholder ${$?"reference-image-upload__placeholder--dragging":""}`,onDragEnter:W,onDragLeave:K,onDragOver:Z,onDrop:t=>q(t,e),children:l.jsxs("div",{className:"reference-image-upload__buttons",children:[l.jsx(D,{variant:"outline",icon:l.jsx(ee,{size:16}),onClick:()=>J(e),disabled:m,"data-track":"reference_image_upload_local",className:"reference-image-upload__btn",children:u.local}),l.jsx(D,{variant:"outline",icon:l.jsx(te,{size:16}),onClick:()=>Q(e),disabled:m,"data-track":"reference_image_upload_library",className:"reference-image-upload__btn",children:u.library})]})}),A=(e,t)=>l.jsxs("div",{className:"reference-image-upload__preview",onMouseEnter:a=>se(e.url,a),onMouseLeave:oe,children:[l.jsx("img",{src:e.url,alt:e.name,className:"reference-image-upload__image"}),l.jsx("button",{type:"button",className:"reference-image-upload__remove",onClick:()=>ie(t,e.slot),disabled:m,"data-track":"reference_image_upload_remove",children:l.jsx(xe,{size:14})}),c&&c[e.slot??t]&&l.jsx("div",{className:"reference-image-upload__slot-label",children:c[e.slot??t]})]},t),de=()=>c?l.jsx("div",{className:"reference-image-upload__slots",children:ne.map(({slot:e,image:t},a)=>{const i=c[a];return l.jsxs("div",{className:"reference-image-upload__slot",children:[l.jsx("div",{className:"reference-image-upload__slot-title",children:i}),t?A(t,e):l.jsx("div",{className:`reference-image-upload__slot-placeholder ${$?"reference-image-upload__slot-placeholder--dragging":""}`,onDragEnter:W,onDragLeave:K,onDragOver:Z,onDrop:n=>q(n,e),children:l.jsxs("div",{className:"reference-image-upload__slot-buttons",children:[l.jsx(D,{variant:"outline",icon:l.jsx(ee,{size:16}),onClick:()=>J(e),disabled:m,"data-track":"reference_image_upload_slot_local",className:"reference-image-upload__slot-btn",children:u.local}),l.jsx(D,{variant:"outline",icon:l.jsx(te,{size:16}),onClick:()=>Q(e),disabled:m,"data-track":"reference_image_upload_slot_library",className:"reference-image-upload__slot-btn",children:u.library})]})})]},e)})}):null,fe=()=>{const e=p&&f.length<_;return l.jsxs("div",{className:"reference-image-upload__grid",children:[f.map((t,a)=>A(t,a)),e&&C(),f.length===0&&!e&&C()]})},ue=()=>f.length>0?l.jsxs("div",{className:"reference-image-upload__single",children:[A(f[0],0),l.jsx("div",{className:"reference-image-upload__replace",children:C()})]}):C();return l.jsxs(l.Fragment,{children:[j&&_e.createPortal(l.jsx("div",{className:"reference-image-upload__hover-preview",style:{left:`${j.x}px`,top:`${j.y}px`,transform:"translate(-50%, -100%)"},children:l.jsx("img",{src:j.url,alt:"Preview"})}),document.body),l.jsxs("div",{ref:b,className:`reference-image-upload ${m?"reference-image-upload--disabled":""}`,tabIndex:0,children:[U&&l.jsx("div",{className:"reference-image-upload__label",children:U}),l.jsx("input",{ref:Y,type:"file",accept:"image/*",multiple:p&&!c,onChange:re,className:"reference-image-upload__input",disabled:m}),c?de():p?fe():ue(),O&&l.jsx(ve,{isOpen:O,onClose:()=>x(!1),mode:ye.SELECT,filterType:E.IMAGE,onSelect:le,onSelectMultiple:p?ce:void 0,batchSelectButtonText:p?"批量插入对话框":void 0})]})]})};export{Re as R};
|
|
2
|
+
import{_ as L}from"./startup-runtime-BrfuwjQS.js";import{P as d,cK as me,ao as h,cO as E,i0 as he,a8 as l,a3 as _e,fA as ve,eI as ye,co as D,iP as ee,f6 as te,gz as xe}from"./ai-chat-BnWVpTEI.js";const T=25*1024*1024,ae=10*1024*1024,Re=({images:f,onImagesChange:g,language:F="zh",disabled:m=!1,multiple:p=!0,maxCount:_=10,label:U,slotLabels:c,onError:s})=>{const[O,x]=d.useState(!1),[$,B]=d.useState(!1),[v,H]=d.useState(0),[j,N]=d.useState(null),b=d.useRef(null),Y=d.useRef(null),{addAsset:G}=me(),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],k=d.useCallback(e=>c?e.filter(t=>(t==null?void 0:t.url)||(t==null?void 0:t.file)).map((t,a)=>({...t,slot:t.slot??a})).sort((t,a)=>(t.slot??0)-(a.slot??0)):e,[c]),ne=c?c.map((e,t)=>({slot:t,image:k(f).find(a=>(a.slot??-1)===t)})):[],z=d.useCallback(async e=>{if(e.size&&e.size>T)throw new Error(`Asset exceeds 25MB limit: ${e.name}`);let a=await(await fetch(e.url)).blob();if(a.size>T)throw new Error(`Asset exceeds 25MB limit: ${e.name}`);if(a.size>ae){const{compressImageBlob:n,getCompressionStrategy:r}=await L(async()=>{const{compressImageBlob:y,getCompressionStrategy:M}=await import("./ai-chat-BnWVpTEI.js").then(R=>R.sH);return{compressImageBlob:y,getCompressionStrategy:M}},__vite__mapDeps([0]),import.meta.url),o=r(a.size/(1024*1024));a=await n(a,o.targetSizeMB)}return{url:await new Promise((n,r)=>{const o=new FileReader;o.onload=()=>n(o.result),o.onerror=r,o.readAsDataURL(a)}),name:e.name}},[]),S=d.useCallback((e,t=v)=>{if(!c)return;const a=c.map((n,r)=>r).filter(n=>n>=t).slice(0,e.length);if(a.length===0)return;const i=k(f).filter(n=>!a.includes(n.slot??-1));a.forEach((n,r)=>{i.push({...e[r],slot:n})}),g(k(i)),e.length>a.length&&h.warning(u.maxCountReached.replace("{count}",String(a.length)))},[v,f,k,g,c,u]),V=d.useCallback(e=>e.type.startsWith("image/")?e.size>T?(h.error(u.fileTooLarge),!1):!0:(h.error(u.invalidFile),!1),[u]),X=d.useCallback((e,t)=>new Promise((a,i)=>{const n=new FileReader;n.onload=()=>{a({url:n.result,name:t,file:(e instanceof File,e)})},n.onerror=i,n.readAsDataURL(e)}),[]),w=d.useCallback(async(e,t)=>{const i=Array.from(e).filter(V);if(i.length===0)return;if(c){const r=t??v,o=c.length-r;if(o<=0){h.warning(u.maxCountReached.replace("{count}","0"));return}i.length>o&&(h.warning(u.maxCountReached.replace("{count}",String(o))),i.splice(o))}else p&&f.length+i.length>_&&(h.warning(u.maxCountReached.replace("{count}",String(_))),i.splice(_-f.length));const n=[];for(const r of i)try{let o=r;if(r.size>ae){const{compressImageBlob:y,getCompressionStrategy:M}=await L(async()=>{const{compressImageBlob:P,getCompressionStrategy:pe}=await import("./ai-chat-BnWVpTEI.js").then(ge=>ge.sH);return{compressImageBlob:P,getCompressionStrategy:pe}},__vite__mapDeps([0]),import.meta.url),R=M(r.size/(1024*1024)),I=h.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{o=await y(r,R.targetSizeMB),h.close(I),h.success({content:F==="zh"?`压缩完成: ${(r.size/1024/1024).toFixed(1)}MB → ${(o.size/1024/1024).toFixed(1)}MB`:`Compressed: ${(r.size/1024/1024).toFixed(1)}MB → ${(o.size/1024/1024).toFixed(1)}MB`,duration:2})}catch(P){h.close(I),console.error("[ReferenceImageUpload] Compression failed:",P),s==null||s(F==="zh"?"图片压缩失败":"Image compression failed");continue}}n.push({blob:o,name:r.name})}catch(o){console.error("[ReferenceImageUpload] Error processing file:",o),s==null||s(u.loadFailed);continue}if(n.length!==0){n.forEach(({blob:r,name:o})=>{G(r,E.IMAGE,he.LOCAL,o).catch(y=>{console.warn("[ReferenceImageUpload] Failed to add asset to library:",y)})});try{const r=await Promise.all(n.map(({blob:o,name:y})=>X(o,y)));c&&t!==void 0?S(r,t):g(p?[...f,...r]:r.slice(0,1)),s==null||s(null)}catch(r){console.error("[ReferenceImageUpload] Failed to process files:",r),s==null||s(u.loadFailed)}}},[S,G,v,X,f,F,_,p,s,g,c,u,V]),re=d.useCallback(e=>{const t=e.target.files;t&&t.length>0&&w(t,c?v:void 0),e.target.value=""},[w,c,v]),le=d.useCallback(async e=>{try{const t=await z(e);if(c)S([t]);else if(p){if(f.length>=_){h.warning(u.maxCountReached.replace("{count}",String(_)));return}g([...f,t])}else g([t]);x(!1),s==null||s(null)}catch(t){console.error("[ReferenceImageUpload] Failed to convert asset to base64:",t),s==null||s(u.loadFailed),x(!1)}},[S,z,f,p,_,c,g,s,u]),ce=d.useCallback(async e=>{if(e.length===0)return;let t=e;if(c){const a=c.length-v;if(a<=0){x(!1);return}t=e.slice(0,a),e.length>a&&h.warning(u.maxCountReached.replace("{count}",String(a)))}else if(p&&f.length+e.length>_){h.warning(u.maxCountReached.replace("{count}",String(_)));const a=_-f.length;if(a<=0){x(!1);return}t=e.slice(0,a)}else p||(t=e.slice(0,1));try{const a=[];for(const i of t)try{a.push(await z(i))}catch(n){console.error("[ReferenceImageUpload] Failed to convert asset:",i.name,n)}a.length>0&&(c?S(a):g(p?[...f,...a]:a.slice(0,1))),x(!1),s==null||s(null)}catch(a){console.error("[ReferenceImageUpload] Batch selection failed:",a),s==null||s(u.loadFailed),x(!1)}},[S,z,v,f,p,_,c,g,s,u]),W=d.useCallback(e=>{e.preventDefault(),e.stopPropagation(),m||B(!0)},[m]),K=d.useCallback(e=>{var a;e.preventDefault(),e.stopPropagation();const t=(a=b.current)==null?void 0:a.getBoundingClientRect();if(t){const{clientX:i,clientY:n}=e;(i<t.left||i>t.right||n<t.top||n>t.bottom)&&B(!1)}},[]),Z=d.useCallback(e=>{e.preventDefault(),e.stopPropagation()},[]),q=d.useCallback((e,t)=>{if(e.preventDefault(),e.stopPropagation(),B(!1),m)return;const a=e.dataTransfer.files;a&&a.length>0&&w(a,t)},[v,m,w,c]);d.useEffect(()=>{const e=async t=>{var y;if(m)return;const a=document.activeElement,i=b.current;if(!i||!(i.contains(a)||a===document.body||(a==null?void 0:a.tagName)==="BODY"))return;const r=(y=t.clipboardData)==null?void 0:y.items;if(!r)return;const o=[];for(let M=0;M<r.length;M++){const R=r[M];if(R.type.startsWith("image/")){const I=R.getAsFile();I&&o.push(I)}}o.length>0&&(t.preventDefault(),w(o,c?v:void 0))};return document.addEventListener("paste",e),()=>{document.removeEventListener("paste",e)}},[m,w]);const ie=d.useCallback((e,t)=>{const a=c?f.filter((i,n)=>(i.slot??n)!==(t??e)):f.filter((i,n)=>n!==e);N(null),g(a)},[f,g,c]),J=d.useCallback(e=>{var t;e!==void 0&&H(e),(t=Y.current)==null||t.click()},[]),Q=d.useCallback(e=>{e!==void 0&&H(e),x(!0)},[]),se=d.useCallback((e,t)=>{const a=t.currentTarget.getBoundingClientRect(),i=a.left+a.width/2,n=a.top-10;N({url:e,x:i,y:n})},[]),oe=d.useCallback(()=>{N(null)},[]),C=e=>l.jsx("div",{className:`reference-image-upload__placeholder ${$?"reference-image-upload__placeholder--dragging":""}`,onDragEnter:W,onDragLeave:K,onDragOver:Z,onDrop:t=>q(t,e),children:l.jsxs("div",{className:"reference-image-upload__buttons",children:[l.jsx(D,{variant:"outline",icon:l.jsx(ee,{size:16}),onClick:()=>J(e),disabled:m,"data-track":"reference_image_upload_local",className:"reference-image-upload__btn",children:u.local}),l.jsx(D,{variant:"outline",icon:l.jsx(te,{size:16}),onClick:()=>Q(e),disabled:m,"data-track":"reference_image_upload_library",className:"reference-image-upload__btn",children:u.library})]})}),A=(e,t)=>l.jsxs("div",{className:"reference-image-upload__preview",onMouseEnter:a=>se(e.url,a),onMouseLeave:oe,children:[l.jsx("img",{src:e.url,alt:e.name,className:"reference-image-upload__image"}),l.jsx("button",{type:"button",className:"reference-image-upload__remove",onClick:()=>ie(t,e.slot),disabled:m,"data-track":"reference_image_upload_remove",children:l.jsx(xe,{size:14})}),c&&c[e.slot??t]&&l.jsx("div",{className:"reference-image-upload__slot-label",children:c[e.slot??t]})]},t),de=()=>c?l.jsx("div",{className:"reference-image-upload__slots",children:ne.map(({slot:e,image:t},a)=>{const i=c[a];return l.jsxs("div",{className:"reference-image-upload__slot",children:[l.jsx("div",{className:"reference-image-upload__slot-title",children:i}),t?A(t,e):l.jsx("div",{className:`reference-image-upload__slot-placeholder ${$?"reference-image-upload__slot-placeholder--dragging":""}`,onDragEnter:W,onDragLeave:K,onDragOver:Z,onDrop:n=>q(n,e),children:l.jsxs("div",{className:"reference-image-upload__slot-buttons",children:[l.jsx(D,{variant:"outline",icon:l.jsx(ee,{size:16}),onClick:()=>J(e),disabled:m,"data-track":"reference_image_upload_slot_local",className:"reference-image-upload__slot-btn",children:u.local}),l.jsx(D,{variant:"outline",icon:l.jsx(te,{size:16}),onClick:()=>Q(e),disabled:m,"data-track":"reference_image_upload_slot_library",className:"reference-image-upload__slot-btn",children:u.library})]})})]},e)})}):null,fe=()=>{const e=p&&f.length<_;return l.jsxs("div",{className:"reference-image-upload__grid",children:[f.map((t,a)=>A(t,a)),e&&C(),f.length===0&&!e&&C()]})},ue=()=>f.length>0?l.jsxs("div",{className:"reference-image-upload__single",children:[A(f[0],0),l.jsx("div",{className:"reference-image-upload__replace",children:C()})]}):C();return l.jsxs(l.Fragment,{children:[j&&_e.createPortal(l.jsx("div",{className:"reference-image-upload__hover-preview",style:{left:`${j.x}px`,top:`${j.y}px`,transform:"translate(-50%, -100%)"},children:l.jsx("img",{src:j.url,alt:"Preview"})}),document.body),l.jsxs("div",{ref:b,className:`reference-image-upload ${m?"reference-image-upload--disabled":""}`,tabIndex:0,children:[U&&l.jsx("div",{className:"reference-image-upload__label",children:U}),l.jsx("input",{ref:Y,type:"file",accept:"image/*",multiple:p&&!c,onChange:re,className:"reference-image-upload__input",disabled:m}),c?de():p?fe():ue(),O&&l.jsx(ve,{isOpen:O,onClose:()=>x(!1),mode:ye.SELECT,filterType:E.IMAGE,onSelect:le,onSelectMultiple:p?ce:void 0,batchSelectButtonText:p?"批量插入对话框":void 0})]})]})};export{Re as R};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as r,bm as ye,a8 as t,eY as oe,co as _,m$ as ot,ao as u,ab as b,pc as ss,eN as _e,pd as as,pe as dt,R as st,dF as je,pf as rs,c5 as ce,el as ls,gj as is,dd as at,aD as m,T as P,nb as rt,b9 as lt,pg as ut,ph as ns,eL as cs,pi as os,bM as ds,c$ as us,eU as ps,pj as ms,f1 as hs,pk as fs,gq as gs,nX as xs,pl as vs,pm as Cs,nY as ys,mU as _s,bP as js,Q as ie,eP as it,ba as bs,bb as Is,dy as ws,dz as ks}from"./ai-chat-D2kHVW04.js";import{T as Ss,C as Ds,u as pt,V as Ns,a as Es}from"./useCharacters-BCCGOiPW.js";import{p as Us,ay as Ms,W as $s,az as se,ac as Ts,aA as nt,o as ne,aB as ct,aC as Ls,aD as Ps}from"./tool-windows-CSaRGLIT.js";/* empty css */import{b as zs,a as qs}from"./image-task-prefill-DtECrkJn.js";import"./startup-runtime-BrfuwjQS.js";const Rs=30,Os=({onPreviewOpen:l,onDownload:f,className:n})=>{const[d,$]=r.useState([]),[T,j]=r.useState(!0),[I,w]=r.useState(!1),[z,q]=r.useState(!1),x=r.useRef(0),R=r.useRef(null),D=r.useCallback(async p=>{try{return await ye.getArchivedTasks(p,Rs)}catch{return{tasks:[],hasMore:!1}}},[]);r.useEffect(()=>{let p=!1;return j(!0),x.current=0,D(0).then(C=>{p||($(C.tasks),q(C.hasMore),x.current=C.tasks.length,j(!1))}),()=>{p=!0}},[D]);const A=r.useCallback(async()=>{if(I||!z)return;w(!0);const p=await D(x.current);$(C=>[...C,...p.tasks]),q(p.hasMore),x.current+=p.tasks.length,w(!1)},[I,z,D]);return r.useEffect(()=>{const p=R.current;if(!p)return;const C=()=>{p.scrollHeight-p.scrollTop-p.clientHeight<200&&A()};return p.addEventListener("scroll",C,{passive:!0}),()=>p.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(p=>t.jsx(Ss,{task:p,onPreviewOpen:l?()=>l(p.id):void 0,onDownload:f},p.id)),z&&t.jsx("div",{style:{padding:"12px",textAlign:"center"},children:I?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",I=l.status==="failed",w=l.status==="completed",z=r.useCallback(async p=>{if(p.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]),q=r.useCallback(()=>{w&&n&&n(l)},[w,n,l]),x=r.useCallback(p=>{p.stopPropagation(),f==null||f(l.id)},[f,l.id]),R=r.useCallback(p=>{p.stopPropagation(),w&&l.profilePictureUrl&&T(!0)},[w,l.profilePictureUrl]),D=()=>l.profilePictureUrl||w?t.jsx(b,{content:"点击查看大图",children:t.jsx(Ds,{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:"创建中..."})]}):I?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":""} ${I?"character-card--failed":""}`,onClick:q,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":""} ${I?"character-card--failed":""}`,onClick:q,children:[t.jsx("div",{className:"character-card__avatar",children:D()}),t.jsxs("div",{className:"character-card__info",children:[w&&l.username?t.jsx(b,{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(b,{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(b,{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(as,{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:I,isLoading:w,deleteCharacter:z,refreshCharacters:q}=pt(),[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)},[]),p=r.useCallback(async()=>{if(!x)return;await z(x)?u.success("角色已删除"):u.error("删除失败"),R(null)},[x,z]),C=r.useCallback(async()=>{await q(),u.success("已刷新")},[q]);return w?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(rs,{})}),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:[$,I.length>0&&t.jsxs("span",{style:{fontWeight:"normal",fontSize:"12px",color:"#666",marginLeft:"8px"},children:["(",I.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:p})]})},{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 Js=({expanded:l,onClose:f,onTaskAction:n})=>{const{tasks:d,activeTasks:$,completedTasks:T,failedTasks:j,cancelledTasks:I,isLoading:w,isLoadingMore:z,hasMore:q,totalCount:x,loadedCount:R,loadMore:D,retryTask:A,deleteTask:p,clearCompleted:C,clearFailed:v,batchDeleteTasks:de,batchRetryTasks:ue,batchCancelTasks:mt}=Us(),{board:G,openDialog:be}=ls(),{characters:Ie}=pt(),[O,ht]=r.useState("all"),[ft,pe]=r.useState(!1),[we,gt]=r.useState("completed"),[ae,xt]=r.useState(""),[k,Y]=r.useState("all"),[Hs,ke]=r.useState(null),[vt,me]=r.useState(!1),[Ct,yt]=r.useState(0),[_t,jt]=r.useState("single"),[Se,he]=r.useState(!1),[De,fe]=r.useState(""),[bt,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),[It,Ce]=r.useState(!1),[Ue,Me]=r.useState(null),{isConfigured:wt}=is(),[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||Me(e)}).catch(()=>{s||Me(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=I;break;case"archived":return[];default:s=d}if(k!=="all"&&k!=="character"&&(s=s.filter(e=>e.type===(k==="image"?m.IMAGE:k==="audio"?m.AUDIO:k==="text"?m.CHAT:m.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,I,k,ae]),St=s=>{gt(s),pe(!0)},Dt=()=>{we==="completed"?C():v(),pe(!1)},Nt=s=>{A(s),n==null||n("retry",s)},Et=s=>{Ne(s),ge(!0)},Ut=()=>{xe&&(p(xe),n==null||n("delete",xe)),ge(!1),Ne(null)},Mt=()=>{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)},Pt=()=>{g.size!==0&&Ce(!0)},zt=()=>{de(Array.from(g)),Q(new Set),ee(!1),Ce(!1),u.success(`已删除 ${g.size} 个任务`)},qt=()=>{const s=Array.from(g).filter(e=>{const a=d.find(o=>o.id===e);return(a==null?void 0:a.status)===P.FAILED||(a==null?void 0:a.status)===P.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)===P.FAILED||(e==null?void 0:e.status)===P.CANCELLED}).length,[g,d]),Pe=r.useMemo(()=>Array.from(g).filter(s=>{const e=d.find(a=>a.id===s);return(e==null?void 0:e.status)===P.PENDING||(e==null?void 0:e.status)===P.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)===P.COMPLETED&&((e==null?void 0:e.type)===m.IMAGE||(e==null?void 0:e.type)===m.VIDEO)}).length,[g,d]),X=r.useMemo(()=>({all:d.length,image:d.filter(s=>s.type===m.IMAGE).length,video:d.filter(s=>s.type===m.VIDEO).length,audio:d.filter(s=>s.type===m.AUDIO).length,text:d.filter(s=>s.type===m.CHAT).length,character:Ie.length}),[d,Ie]),Rt=()=>{const s=Array.from(g).filter(e=>{const a=d.find(o=>o.id===e);return(a==null?void 0:a.status)===P.PENDING||(a==null?void 0:a.status)===P.PROCESSING});if(s.length===0){u.warning("没有可取消的进行中任务");return}mt(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)===P.COMPLETED&&((a==null?void 0:a.type)===m.IMAGE||(a==null?void 0:a.type)===m.VIDEO)});if(!(s.length===0||re)){$e(!0),le(0);try{const e=await Cs.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)}}},qe=async s=>{const e=d.find(o=>o.id===s);if(e&&se(e)){u.info("歌词任务支持复制或插入画布");return}if(!e)return;const a=ys(e);if(a.length!==0)try{const o=await _s(a);o.openedCount>0&&o.downloadedCount===0?u.success(o.openedCount>1?`已打开 ${o.openedCount} 个链接,请在新标签页下载`:"资源不支持直接下载,已打开链接"):u.success(e.type===m.AUDIO?a.length>1?"多条音频已开始下载":"音频下载成功":a.length>1?"多图已开始下载":"下载成功"),js.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,Z,V,J,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===m.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===m.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===m.VIDEO)await bs(G,i.url),u.success("视频已插入到白板");else if(e.type===m.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:Ls(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,U={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=(Z=i.clips)==null?void 0:Z[0])==null?void 0:V.clipId)||((S=(J=i.clips)==null?void 0:J[0])==null?void 0:S.id)||((N=i.clipIds)==null?void 0:N[0]),clipIds:i.clipIds};h.length===1?await Is(G,h[0],U):await ne({items:h.map((F,M)=>{var Fe,Ge,Be,He,We,Ke,Qe,Ye,Xe,Ze,Je,et,tt;return{type:"audio",content:F,groupId:`task-audio-${e.id}`,dimensions:{width:ks,height:ws},metadata:{...U,title:((Ge=(Fe=i.clips)==null?void 0:Fe[M])==null?void 0:Ge.title)||`${U.title||"Audio"} ${M+1}`,previewImageUrl:((He=(Be=i.clips)==null?void 0:Be[M])==null?void 0:He.imageLargeUrl)||((Ke=(We=i.clips)==null?void 0:We[M])==null?void 0:Ke.imageUrl)||U.previewImageUrl,duration:typeof((Ye=(Qe=i.clips)==null?void 0:Qe[M])==null?void 0:Ye.duration)=="number"?i.clips[M].duration||void 0:U.duration,clipId:((Ze=(Xe=i.clips)==null?void 0:Xe[M])==null?void 0:Ze.clipId)||((et=(Je=i.clips)==null?void 0:Je[M])==null?void 0:et.id)||((tt=i.clipIds)==null?void 0:tt[M])||U.clipId}}})}),u.success(h.length>1?"多条音频卡片已插入到白板":"音频卡片已插入到白板")}else if(e.type===m.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!==m.IMAGE){u.warning("未找到可回填的图片任务");return}Ts({...zs(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===m.IMAGE)be(it.aiImageGeneration,qs(e));else if(e.type===m.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};be(it.aiVideoGeneration,y)}else if(e.type===m.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!==P.COMPLETED||!((a=e.result)!=null&&a.url)&&!((y=(o=e.result)==null?void 0:o.urls)!=null&&y.length)||e.type!==m.IMAGE&&e.type!==m.VIDEO&&!(e.type===m.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 Z=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===m.AUDIO){const S=((L=(y=c.result)==null?void 0:y.clips)==null?void 0:L.filter(h=>!!h.audioUrl).map((h,E)=>{var U,F,M;return{id:h.clipId||h.id||`${c.id}-${E}`,url:h.audioUrl,type:"audio",title:h.title||((U=c.result)!=null&&U.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:(M=c.result)==null?void 0:M.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 U,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:(U=c.result)==null?void 0:U.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===m.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 J=s.length-Z;e.set(c.id,{mode:c.type===m.AUDIO&&J>1?"compare":"single",index:c.type===m.AUDIO&&J>1?Array.from({length:Math.min(J,4)},(S,N)=>Z+N):Z})}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),me(!0))},[Oe]),Wt=r.useCallback(()=>{ke(null),me(!1)},[]),Kt=r.useCallback(s=>{s.type==="image"&&(fe(s.url),he(!0),me(!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]),Xt=x>0?x:d.length,Ve="这里只显示最近 100 个任务,更早的任务会自动移到“历史”中继续保留。",Zt=t.jsx(b,{content:Ve,children:t.jsxs("span",{children:["全部 (",Xt,")"]})}),Jt=Ue===null?"历史":`历史 (${Ue})`,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:Zt}),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:Jt})]}),O!=="archived"&&t.jsxs("div",{className:"task-queue-panel__filters",children:[t.jsxs("div",{className:"task-queue-panel__type-filters",children:[t.jsx(b,{content:`全部 (${X.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(ns,{size:"16px"})})}),t.jsx(b,{content:`图片 (${X.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(cs,{size:"16px"})})}),t.jsx(b,{content:`视频 (${X.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(os,{size:"16px"})})}),t.jsx(b,{content:`音频 (${X.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(ds,{size:16,strokeWidth:1.9})})}),t.jsx(b,{content:`文本 (${X.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(b,{content:`角色 (${X.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(us,{value:ae,onChange:s=>xt(s),placeholder:"搜索...",clearable:!0,prefixIcon:t.jsx(ps,{}),size:"small",className:"task-queue-panel__search-input"}),t.jsxs("div",{className:"task-queue-panel__filter-actions",children:[t.jsx(b,{content:B?"退出多选":"批量操作",children:t.jsx(_,{size:"small",variant:B?"base":"outline",theme:B?"primary":"default",icon:t.jsx(ms,{}),"data-track":"task_click_toggle_selection",onClick:Mt,children:B?"退出":"多选"})}),j.length>0&&!B&&t.jsx(b,{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(hs,{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:[Pe>0&&t.jsxs(_,{size:"small",variant:"outline",theme:"warning",icon:t.jsx(fs,{}),"data-track":"task_click_batch_cancel",onClick:Rt,children:["取消 (",Pe,")"]}),Le>0&&t.jsxs(_,{size:"small",theme:"primary",icon:t.jsx(je,{}),"data-track":"task_click_batch_retry",onClick:qt,children:["重试 (",Le,")"]}),wt&&ze>0&&t.jsx(b,{content:"同步选中的任务到云端",placement:"bottom",children:t.jsx(_,{size:"small",variant:"outline",icon:t.jsx(gs,{}),"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:Pt,disabled:g.size===0,children:["删除 (",g.size,")"]})]})]})]});return t.jsxs(t.Fragment,{children:[t.jsx(Ms,{isOpen:l,onClose:Yt,title:"任务队列",filterSection:ts,position:"toolbar-right",width:"responsive",storageKey:Fs,pinStorageKey:$s.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:qe,className:"task-queue-panel__list"}):t.jsx(Ns,{tasks:H,selectionMode:B,selectedTaskIds:g,onSelectionChange:$t,onRetry:Nt,onDelete:Et,onDownload:qe,onInsert:Vt,onCopy:At,onEdit:Gt,onRegenerate:Ft,onPreviewOpen:Ae,onExtractCharacter:Bt,hasMore:q,isLoadingMore:z,onLoadMore:D,totalCount:x,loadedCount:R,allLoadedText:es,allLoadedHint:x>=100?Ve:void 0,className:"task-queue-panel__list",emptyContent:w?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:`确定要清除所有${we==="completed"?"已完成":"失败"}的任务吗?此操作无法撤销。`,confirmText:"清除",cancelText:"取消",danger:!0,onOpenChange:pe,onConfirm:Dt}),t.jsx(ce,{open:bt,title:"确认删除",description:"确定要删除此任务吗?此操作无法撤销。",confirmText:"删除",cancelText:"取消",danger:!0,onOpenChange:ge,onConfirm:Ut}),t.jsx(ce,{open:It,title:"确认批量删除",description:`确定要删除选中的 ${g.size} 个任务吗?此操作无法撤销。`,confirmText:"删除",cancelText:"取消",danger:!0,onOpenChange:Ce,onConfirm:zt}),t.jsx(xs,{visible:vt,items:Ht,initialMode:_t,initialIndex:Ct,onClose:Wt,showThumbnails:!0,onEdit:Kt}),Se&&De&&t.jsx(vs,{visible:Se,imageUrl:De,showOverwrite:!1,onClose:()=>{he(!1),fe("")},onInsert:G?Qt:void 0}),t.jsx(Es,{visible:!!Ee,task:Ee,onClose:()=>ve(null),onCreateStart:()=>{},onCreateComplete:s=>{ve(null)}})]})};export{Fs as TASK_DRAWER_WIDTH_KEY,Js as TaskQueuePanel};
|
|
1
|
+
import{P as r,bm as ye,a8 as t,eY as oe,co as _,m$ as ot,ao as u,ab as b,pc as ss,eN as _e,pd as as,pe as dt,R as st,dF as je,pf as rs,c5 as ce,el as ls,gj as is,dd as at,aD as m,T as P,nb as rt,b9 as lt,pg as ut,ph as ns,eL as cs,pi as os,bM as ds,c$ as us,eU as ps,pj as ms,f1 as hs,pk as fs,gq as gs,nX as xs,pl as vs,pm as Cs,nY as ys,mU as _s,bP as js,Q as ie,eP as it,ba as bs,bb as Is,dy as ws,dz as ks}from"./ai-chat-BnWVpTEI.js";import{T as Ss,C as Ds,u as pt,V as Ns,a as Es}from"./useCharacters-CFlPvydq.js";import{p as Us,ay as Ms,W as $s,az as se,ac as Ts,aA as nt,o as ne,aB as ct,aC as Ls,aD as Ps}from"./tool-windows-Bf_pMml-.js";/* empty css */import{b as zs,a as qs}from"./image-task-prefill-DtECrkJn.js";import"./startup-runtime-BrfuwjQS.js";const Rs=30,Os=({onPreviewOpen:l,onDownload:f,className:n})=>{const[d,$]=r.useState([]),[T,j]=r.useState(!0),[I,w]=r.useState(!1),[z,q]=r.useState(!1),x=r.useRef(0),R=r.useRef(null),D=r.useCallback(async p=>{try{return await ye.getArchivedTasks(p,Rs)}catch{return{tasks:[],hasMore:!1}}},[]);r.useEffect(()=>{let p=!1;return j(!0),x.current=0,D(0).then(C=>{p||($(C.tasks),q(C.hasMore),x.current=C.tasks.length,j(!1))}),()=>{p=!0}},[D]);const A=r.useCallback(async()=>{if(I||!z)return;w(!0);const p=await D(x.current);$(C=>[...C,...p.tasks]),q(p.hasMore),x.current+=p.tasks.length,w(!1)},[I,z,D]);return r.useEffect(()=>{const p=R.current;if(!p)return;const C=()=>{p.scrollHeight-p.scrollTop-p.clientHeight<200&&A()};return p.addEventListener("scroll",C,{passive:!0}),()=>p.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(p=>t.jsx(Ss,{task:p,onPreviewOpen:l?()=>l(p.id):void 0,onDownload:f},p.id)),z&&t.jsx("div",{style:{padding:"12px",textAlign:"center"},children:I?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",I=l.status==="failed",w=l.status==="completed",z=r.useCallback(async p=>{if(p.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]),q=r.useCallback(()=>{w&&n&&n(l)},[w,n,l]),x=r.useCallback(p=>{p.stopPropagation(),f==null||f(l.id)},[f,l.id]),R=r.useCallback(p=>{p.stopPropagation(),w&&l.profilePictureUrl&&T(!0)},[w,l.profilePictureUrl]),D=()=>l.profilePictureUrl||w?t.jsx(b,{content:"点击查看大图",children:t.jsx(Ds,{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:"创建中..."})]}):I?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":""} ${I?"character-card--failed":""}`,onClick:q,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":""} ${I?"character-card--failed":""}`,onClick:q,children:[t.jsx("div",{className:"character-card__avatar",children:D()}),t.jsxs("div",{className:"character-card__info",children:[w&&l.username?t.jsx(b,{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(b,{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(b,{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(as,{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:I,isLoading:w,deleteCharacter:z,refreshCharacters:q}=pt(),[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)},[]),p=r.useCallback(async()=>{if(!x)return;await z(x)?u.success("角色已删除"):u.error("删除失败"),R(null)},[x,z]),C=r.useCallback(async()=>{await q(),u.success("已刷新")},[q]);return w?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(rs,{})}),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:[$,I.length>0&&t.jsxs("span",{style:{fontWeight:"normal",fontSize:"12px",color:"#666",marginLeft:"8px"},children:["(",I.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:p})]})},{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 Js=({expanded:l,onClose:f,onTaskAction:n})=>{const{tasks:d,activeTasks:$,completedTasks:T,failedTasks:j,cancelledTasks:I,isLoading:w,isLoadingMore:z,hasMore:q,totalCount:x,loadedCount:R,loadMore:D,retryTask:A,deleteTask:p,clearCompleted:C,clearFailed:v,batchDeleteTasks:de,batchRetryTasks:ue,batchCancelTasks:mt}=Us(),{board:G,openDialog:be}=ls(),{characters:Ie}=pt(),[O,ht]=r.useState("all"),[ft,pe]=r.useState(!1),[we,gt]=r.useState("completed"),[ae,xt]=r.useState(""),[k,Y]=r.useState("all"),[Hs,ke]=r.useState(null),[vt,me]=r.useState(!1),[Ct,yt]=r.useState(0),[_t,jt]=r.useState("single"),[Se,he]=r.useState(!1),[De,fe]=r.useState(""),[bt,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),[It,Ce]=r.useState(!1),[Ue,Me]=r.useState(null),{isConfigured:wt}=is(),[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||Me(e)}).catch(()=>{s||Me(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=I;break;case"archived":return[];default:s=d}if(k!=="all"&&k!=="character"&&(s=s.filter(e=>e.type===(k==="image"?m.IMAGE:k==="audio"?m.AUDIO:k==="text"?m.CHAT:m.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,I,k,ae]),St=s=>{gt(s),pe(!0)},Dt=()=>{we==="completed"?C():v(),pe(!1)},Nt=s=>{A(s),n==null||n("retry",s)},Et=s=>{Ne(s),ge(!0)},Ut=()=>{xe&&(p(xe),n==null||n("delete",xe)),ge(!1),Ne(null)},Mt=()=>{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)},Pt=()=>{g.size!==0&&Ce(!0)},zt=()=>{de(Array.from(g)),Q(new Set),ee(!1),Ce(!1),u.success(`已删除 ${g.size} 个任务`)},qt=()=>{const s=Array.from(g).filter(e=>{const a=d.find(o=>o.id===e);return(a==null?void 0:a.status)===P.FAILED||(a==null?void 0:a.status)===P.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)===P.FAILED||(e==null?void 0:e.status)===P.CANCELLED}).length,[g,d]),Pe=r.useMemo(()=>Array.from(g).filter(s=>{const e=d.find(a=>a.id===s);return(e==null?void 0:e.status)===P.PENDING||(e==null?void 0:e.status)===P.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)===P.COMPLETED&&((e==null?void 0:e.type)===m.IMAGE||(e==null?void 0:e.type)===m.VIDEO)}).length,[g,d]),X=r.useMemo(()=>({all:d.length,image:d.filter(s=>s.type===m.IMAGE).length,video:d.filter(s=>s.type===m.VIDEO).length,audio:d.filter(s=>s.type===m.AUDIO).length,text:d.filter(s=>s.type===m.CHAT).length,character:Ie.length}),[d,Ie]),Rt=()=>{const s=Array.from(g).filter(e=>{const a=d.find(o=>o.id===e);return(a==null?void 0:a.status)===P.PENDING||(a==null?void 0:a.status)===P.PROCESSING});if(s.length===0){u.warning("没有可取消的进行中任务");return}mt(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)===P.COMPLETED&&((a==null?void 0:a.type)===m.IMAGE||(a==null?void 0:a.type)===m.VIDEO)});if(!(s.length===0||re)){$e(!0),le(0);try{const e=await Cs.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)}}},qe=async s=>{const e=d.find(o=>o.id===s);if(e&&se(e)){u.info("歌词任务支持复制或插入画布");return}if(!e)return;const a=ys(e);if(a.length!==0)try{const o=await _s(a);o.openedCount>0&&o.downloadedCount===0?u.success(o.openedCount>1?`已打开 ${o.openedCount} 个链接,请在新标签页下载`:"资源不支持直接下载,已打开链接"):u.success(e.type===m.AUDIO?a.length>1?"多条音频已开始下载":"音频下载成功":a.length>1?"多图已开始下载":"下载成功"),js.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,Z,V,J,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===m.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===m.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===m.VIDEO)await bs(G,i.url),u.success("视频已插入到白板");else if(e.type===m.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:Ls(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,U={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=(Z=i.clips)==null?void 0:Z[0])==null?void 0:V.clipId)||((S=(J=i.clips)==null?void 0:J[0])==null?void 0:S.id)||((N=i.clipIds)==null?void 0:N[0]),clipIds:i.clipIds};h.length===1?await Is(G,h[0],U):await ne({items:h.map((F,M)=>{var Fe,Ge,Be,He,We,Ke,Qe,Ye,Xe,Ze,Je,et,tt;return{type:"audio",content:F,groupId:`task-audio-${e.id}`,dimensions:{width:ks,height:ws},metadata:{...U,title:((Ge=(Fe=i.clips)==null?void 0:Fe[M])==null?void 0:Ge.title)||`${U.title||"Audio"} ${M+1}`,previewImageUrl:((He=(Be=i.clips)==null?void 0:Be[M])==null?void 0:He.imageLargeUrl)||((Ke=(We=i.clips)==null?void 0:We[M])==null?void 0:Ke.imageUrl)||U.previewImageUrl,duration:typeof((Ye=(Qe=i.clips)==null?void 0:Qe[M])==null?void 0:Ye.duration)=="number"?i.clips[M].duration||void 0:U.duration,clipId:((Ze=(Xe=i.clips)==null?void 0:Xe[M])==null?void 0:Ze.clipId)||((et=(Je=i.clips)==null?void 0:Je[M])==null?void 0:et.id)||((tt=i.clipIds)==null?void 0:tt[M])||U.clipId}}})}),u.success(h.length>1?"多条音频卡片已插入到白板":"音频卡片已插入到白板")}else if(e.type===m.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!==m.IMAGE){u.warning("未找到可回填的图片任务");return}Ts({...zs(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===m.IMAGE)be(it.aiImageGeneration,qs(e));else if(e.type===m.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};be(it.aiVideoGeneration,y)}else if(e.type===m.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!==P.COMPLETED||!((a=e.result)!=null&&a.url)&&!((y=(o=e.result)==null?void 0:o.urls)!=null&&y.length)||e.type!==m.IMAGE&&e.type!==m.VIDEO&&!(e.type===m.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 Z=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===m.AUDIO){const S=((L=(y=c.result)==null?void 0:y.clips)==null?void 0:L.filter(h=>!!h.audioUrl).map((h,E)=>{var U,F,M;return{id:h.clipId||h.id||`${c.id}-${E}`,url:h.audioUrl,type:"audio",title:h.title||((U=c.result)!=null&&U.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:(M=c.result)==null?void 0:M.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 U,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:(U=c.result)==null?void 0:U.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===m.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 J=s.length-Z;e.set(c.id,{mode:c.type===m.AUDIO&&J>1?"compare":"single",index:c.type===m.AUDIO&&J>1?Array.from({length:Math.min(J,4)},(S,N)=>Z+N):Z})}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),me(!0))},[Oe]),Wt=r.useCallback(()=>{ke(null),me(!1)},[]),Kt=r.useCallback(s=>{s.type==="image"&&(fe(s.url),he(!0),me(!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]),Xt=x>0?x:d.length,Ve="这里只显示最近 100 个任务,更早的任务会自动移到“历史”中继续保留。",Zt=t.jsx(b,{content:Ve,children:t.jsxs("span",{children:["全部 (",Xt,")"]})}),Jt=Ue===null?"历史":`历史 (${Ue})`,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:Zt}),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:Jt})]}),O!=="archived"&&t.jsxs("div",{className:"task-queue-panel__filters",children:[t.jsxs("div",{className:"task-queue-panel__type-filters",children:[t.jsx(b,{content:`全部 (${X.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(ns,{size:"16px"})})}),t.jsx(b,{content:`图片 (${X.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(cs,{size:"16px"})})}),t.jsx(b,{content:`视频 (${X.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(os,{size:"16px"})})}),t.jsx(b,{content:`音频 (${X.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(ds,{size:16,strokeWidth:1.9})})}),t.jsx(b,{content:`文本 (${X.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(b,{content:`角色 (${X.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(us,{value:ae,onChange:s=>xt(s),placeholder:"搜索...",clearable:!0,prefixIcon:t.jsx(ps,{}),size:"small",className:"task-queue-panel__search-input"}),t.jsxs("div",{className:"task-queue-panel__filter-actions",children:[t.jsx(b,{content:B?"退出多选":"批量操作",children:t.jsx(_,{size:"small",variant:B?"base":"outline",theme:B?"primary":"default",icon:t.jsx(ms,{}),"data-track":"task_click_toggle_selection",onClick:Mt,children:B?"退出":"多选"})}),j.length>0&&!B&&t.jsx(b,{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(hs,{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:[Pe>0&&t.jsxs(_,{size:"small",variant:"outline",theme:"warning",icon:t.jsx(fs,{}),"data-track":"task_click_batch_cancel",onClick:Rt,children:["取消 (",Pe,")"]}),Le>0&&t.jsxs(_,{size:"small",theme:"primary",icon:t.jsx(je,{}),"data-track":"task_click_batch_retry",onClick:qt,children:["重试 (",Le,")"]}),wt&&ze>0&&t.jsx(b,{content:"同步选中的任务到云端",placement:"bottom",children:t.jsx(_,{size:"small",variant:"outline",icon:t.jsx(gs,{}),"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:Pt,disabled:g.size===0,children:["删除 (",g.size,")"]})]})]})]});return t.jsxs(t.Fragment,{children:[t.jsx(Ms,{isOpen:l,onClose:Yt,title:"任务队列",filterSection:ts,position:"toolbar-right",width:"responsive",storageKey:Fs,pinStorageKey:$s.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:qe,className:"task-queue-panel__list"}):t.jsx(Ns,{tasks:H,selectionMode:B,selectedTaskIds:g,onSelectionChange:$t,onRetry:Nt,onDelete:Et,onDownload:qe,onInsert:Vt,onCopy:At,onEdit:Gt,onRegenerate:Ft,onPreviewOpen:Ae,onExtractCharacter:Bt,hasMore:q,isLoadingMore:z,onLoadMore:D,totalCount:x,loadedCount:R,allLoadedText:es,allLoadedHint:x>=100?Ve:void 0,className:"task-queue-panel__list",emptyContent:w?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:`确定要清除所有${we==="completed"?"已完成":"失败"}的任务吗?此操作无法撤销。`,confirmText:"清除",cancelText:"取消",danger:!0,onOpenChange:pe,onConfirm:Dt}),t.jsx(ce,{open:bt,title:"确认删除",description:"确定要删除此任务吗?此操作无法撤销。",confirmText:"删除",cancelText:"取消",danger:!0,onOpenChange:ge,onConfirm:Ut}),t.jsx(ce,{open:It,title:"确认批量删除",description:`确定要删除选中的 ${g.size} 个任务吗?此操作无法撤销。`,confirmText:"删除",cancelText:"取消",danger:!0,onOpenChange:Ce,onConfirm:zt}),t.jsx(xs,{visible:vt,items:Ht,initialMode:_t,initialIndex:Ct,onClose:Wt,showThumbnails:!0,onEdit:Kt}),Se&&De&&t.jsx(vs,{visible:Se,imageUrl:De,showOverwrite:!1,onClose:()=>{he(!1),fe("")},onInsert:G?Qt:void 0}),t.jsx(Es,{visible:!!Ee,task:Ee,onClose:()=>ve(null),onCreateStart:()=>{},onCreateComplete:s=>{ve(null)}})]})};export{Fs as TASK_DRAWER_WIDTH_KEY,Js as TaskQueuePanel};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as f,Q as u,T as l}from"./ai-chat-
|
|
1
|
+
import{P as f,Q as u,T as l}from"./ai-chat-BnWVpTEI.js";function T(e){return e.status===l.COMPLETED}function k({syncTask:e,applySyncedRecord:n,shouldHandleTask:o=T,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{k as u};
|