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.
Files changed (100) hide show
  1. package/README.md +3 -3
  2. package/assets/{CanvasAudioPlayer-DgcRAPAw.js → CanvasAudioPlayer-HtUs8HDj.js} +1 -1
  3. package/assets/{ComicCreator-BycaWmuc.js → ComicCreator-DhxXCyJR.js} +2 -2
  4. package/assets/{DeferredAIInputBar-CwJirFC0.js → DeferredAIInputBar-B2R2-2RU.js} +2 -2
  5. package/assets/{DrawnixDeferredFeatures-iBvUtWse.js → DrawnixDeferredFeatures-DHTr0c-V.js} +1 -1
  6. package/assets/{KnowledgeBaseContent-BHBg5nrj.js → KnowledgeBaseContent-CAq5kXdt.js} +3 -3
  7. package/assets/{MVCreator-j2vSDPdb.js → MVCreator-B9uaRsGE.js} +1 -1
  8. package/assets/{ModelBenchmarkWorkbench-Dq5hRRXu.js → ModelBenchmarkWorkbench-CK33zizl.js} +1 -1
  9. package/assets/{MusicAnalyzer-BLhUXQSA.js → MusicAnalyzer-D2NTonEA.js} +1 -1
  10. package/assets/{PromptHistoryTool-DJngTSmU.js → PromptHistoryTool-q6vOxFr6.js} +1 -1
  11. package/assets/{ResizableDivider-AjiNRzA1.js → ResizableDivider-BvT-DCEo.js} +1 -1
  12. package/assets/{TaskQueuePanel-YDHmXxWX.js → TaskQueuePanel-PayswYlG.js} +1 -1
  13. package/assets/{VideoAnalyzer-Qb6tEi0u.js → VideoAnalyzer-DnowtohS.js} +1 -1
  14. package/assets/{VideoAnalyzer-BjWgocHv.js → VideoAnalyzer-DoaGlK92.js} +1 -1
  15. package/assets/{ai-chat-D2kHVW04.js → ai-chat-BnWVpTEI.js} +9 -9
  16. package/assets/{batch-image-generation-A6_tinN3.js → batch-image-generation-CkmX4dem.js} +1 -1
  17. package/assets/{bootstrap-Cz9TDvTq.js → bootstrap-CQRLkOtk.js} +6 -6
  18. package/assets/{clean-confirm-DD8itIZV.js → clean-confirm-CIViVQ8s.js} +1 -1
  19. package/assets/{diagram-engines-BjFHXhwN.js → diagram-engines-DpAsX7pc.js} +2 -2
  20. package/assets/{editor-engines-FCgCX6kJ.js → editor-engines-9_72Ghfn.js} +1 -1
  21. package/assets/{external-skill-service-DuwhmKoU.js → external-skill-service-BN8ZCtPn.js} +1 -1
  22. package/assets/{frame-size-matcher-D5rWn72p.js → frame-size-matcher-9rxQ-bAY.js} +1 -1
  23. package/assets/{index-DkwucWUB.js → index-291TeU7i.js} +1 -1
  24. package/assets/{index-CHHy4efO.js → index-BJ-vS89P.js} +1 -1
  25. package/assets/{index-D0v91lhB.js → index-BSZAS0wO.js} +1 -1
  26. package/assets/{index-BECWJUV2.js → index-C7DAD_xK.js} +1 -1
  27. package/assets/{index-7TrMzH1l.js → index-CIgiIDgZ.js} +1 -1
  28. package/assets/{index-CBf-BvIi.js → index-CpHWUe__.js} +1 -1
  29. package/assets/{index-DeHXjhMn.js → index-D1LQ9eQM.js} +1 -1
  30. package/assets/{index-DsGlObqC.js → index-DRGxmFyd.js} +1 -1
  31. package/assets/{index-DUugpXxH.js → index-DmtcRYr8.js} +1 -1
  32. package/assets/{index.es-Dgi90kXH.js → index.es-Ch45-H39.js} +1 -1
  33. package/assets/{jspdf.es.min-Bm9veIPK.js → jspdf.es.min-bNprb1JY.js} +2 -2
  34. package/assets/{link-popup-Dw0GTx0j.js → link-popup-B6ReK6iq.js} +1 -1
  35. package/assets/{markdown-to-drawnix-CDain2y9.js → markdown-to-drawnix-BqT-3zQO.js} +2 -2
  36. package/assets/{mermaid-to-drawnix-Ddpp0aQq.js → mermaid-to-drawnix-CSctnpU0.js} +2 -2
  37. package/assets/{model-benchmark-launcher-DLwj4o8h.js → model-benchmark-launcher-DNMp2MLQ.js} +1 -1
  38. package/assets/{photo-wall-splitter-D2Ji--gy.js → photo-wall-splitter-DhBTEpdG.js} +1 -1
  39. package/assets/{popup-toolbar-mBe3Bjaq.js → popup-toolbar-BChsudwW.js} +3 -3
  40. package/assets/{prompt-utils-CatisMlq.js → prompt-utils-BX0pRV-Z.js} +1 -1
  41. package/assets/{quick-creation-toolbar-jRI3BBKS.js → quick-creation-toolbar-3-AYFpEF.js} +1 -1
  42. package/assets/{settings-dialog-BOrvJdPV.js → settings-dialog-Ccemaout.js} +1 -1
  43. package/assets/{size-picker-Blua_9Dv.js → size-picker-DTrdjyLh.js} +1 -1
  44. package/assets/{skill-dsl-parser-1E3u-6mw.js → skill-dsl-parser-ZR--uu5h.js} +1 -1
  45. package/assets/{startup-app-BXcHjIQM.js → startup-app-CH3QzBb4.js} +1 -1
  46. package/assets/{task-sync-CPtlvCdr.js → task-sync-C5XXOQ5m.js} +1 -1
  47. package/assets/{tool-windows-CSaRGLIT.js → tool-windows-Bf_pMml-.js} +5 -5
  48. package/assets/{ttd-dialog-RLopc37W.js → ttd-dialog-CohjwODB.js} +2 -2
  49. package/assets/{ttd-dialog-submit-shortcut-C9_wsIZ5.js → ttd-dialog-submit-shortcut-BVB8O_wE.js} +1 -1
  50. package/assets/{useCharacters-BCCGOiPW.js → useCharacters-CFlPvydq.js} +1 -1
  51. package/assets/{useWorkflowSubmission-Bo-icE0J.js → useWorkflowSubmission-CKkOEcAT.js} +2 -2
  52. package/assets/{video-merge-webcodecs-BWAut6ma.js → video-merge-webcodecs-BInWo9HA.js} +1 -1
  53. package/assets/{video-recovery-service-L4OR1un7.js → video-recovery-service-DITdD0pC.js} +1 -1
  54. package/assets/{workflow-generation-utils-CUmdJnGW.js → workflow-generation-utils-e0nRpAgJ.js} +2 -2
  55. package/assets/{workflow-submission-service-kAjrrvI-.js → workflow-submission-service-BqiL_5Cj.js} +1 -1
  56. package/changelog.json +87 -6
  57. package/idle-prefetch-manifest.json +128 -276
  58. package/manifest.json +3 -3
  59. package/package.json +1 -1
  60. package/precache-manifest.json +6 -6
  61. package/sw.js +1 -1
  62. package/version.json +58 -3
  63. package/.DS_Store +0 -0
  64. 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
  65. package/user-manual/screenshots/ai-step-0.png +0 -0
  66. package/user-manual/screenshots/ai-step-1.png +0 -0
  67. package/user-manual/screenshots/ai-step-2.png +0 -0
  68. package/user-manual/screenshots/ai-step-3.png +0 -0
  69. package/user-manual/screenshots/app-menu.png +0 -0
  70. package/user-manual/screenshots/backup-restore.png +0 -0
  71. package/user-manual/screenshots/canvas-tools.png +0 -0
  72. package/user-manual/screenshots/debug-panel.png +0 -0
  73. package/user-manual/screenshots/drawing-step-0.png +0 -0
  74. package/user-manual/screenshots/drawing-step-1.png +0 -0
  75. package/user-manual/screenshots/drawing-step-2.png +0 -0
  76. package/user-manual/screenshots/edit-selected.png +0 -0
  77. package/user-manual/screenshots/element-selected.png +0 -0
  78. package/user-manual/screenshots/flowchart-step-1.png +0 -0
  79. package/user-manual/screenshots/flowchart-step-2.png +0 -0
  80. package/user-manual/screenshots/flowchart-step-3.png +0 -0
  81. package/user-manual/screenshots/image-preview-empty.png +0 -0
  82. package/user-manual/screenshots/insert-from-library.png +0 -0
  83. package/user-manual/screenshots/insert-tools.png +0 -0
  84. package/user-manual/screenshots/inspiration-step-1.png +0 -0
  85. package/user-manual/screenshots/inspiration-step-2.png +0 -0
  86. package/user-manual/screenshots/media-library.png +0 -0
  87. package/user-manual/screenshots/mindmap-step-1.png +0 -0
  88. package/user-manual/screenshots/mindmap-step-2.png +0 -0
  89. package/user-manual/screenshots/mindmap-toolbar-menu.png +0 -0
  90. package/user-manual/screenshots/project-drawer.png +0 -0
  91. package/user-manual/screenshots/settings-dialog.png +0 -0
  92. package/user-manual/screenshots/shape-step-1.png +0 -0
  93. package/user-manual/screenshots/shape-step-2.png +0 -0
  94. package/user-manual/screenshots/text-step-1.png +0 -0
  95. package/user-manual/screenshots/text-step-2.png +0 -0
  96. package/user-manual/screenshots/toolbox-drawer.png +0 -0
  97. package/user-manual/screenshots/toolbox-entry.png +0 -0
  98. package/user-manual/screenshots/video-entry.png +0 -0
  99. package/user-manual/screenshots/view-navigation.png +0 -0
  100. package/user-manual/screenshots/zoom-menu.png +0 -0
@@ -1,4 +1,4 @@
1
- import{_ as vt}from"./startup-runtime-BrfuwjQS.js";import{cm as qs,ep as Hs,en as Ws,cK as Xs,gA as Ys,cO as be,P as o,S as Yt,U as Zs,eo as Zt,ew as We,et as jt,ey as Qt,ex as Xe,f3 as Ct,nq as Nt,nZ as Qs,q5 as ea,ao as y,i0 as Ye,ka as ta,T as W,q6 as sa,mU as aa,nC as na,kH as ra,aD as la,a8 as a,ab as P,co as D,fo as es,q7 as ia,eL as oa,q8 as ca,q9 as ua,eN as da,nN as ma,f2 as ha,f6 as ts,f1 as ss,qa as Ze,e8 as fa,qb as pa,fq as ga,iP as as,pd as wa,d1 as ns,c1 as St,fA as ba,eI as ka,o2 as Qe,m$ as xa,nL as ya}from"./ai-chat-D2kHVW04.js";import{p as va}from"./tool-windows-CSaRGLIT.js";import{b as ja}from"./mj-params-M-7csAp7.js";const rs=Zs.BATCH_IMAGE_CACHE,M=["prompt","params","images","count","preview"];function ke(b){return!!b&&typeof b=="object"&&!Array.isArray(b)&&Object.values(b).every(k=>typeof k=="string")}function ls(b){return Array.isArray(b)?[...b]:ke(b)?{...b}:b}function Ca(b,k){const z=Object.keys(b),R=Object.keys(k);return z.length===R.length&&z.every($=>b[$]===k[$])}function ze(b){return b.trim().toLowerCase().replace(/[::]/g,"x").replace(/×/g,"x").replace(/\s+/g,"")}function is(b){return ze(b).replace(/[=_-]/g,"")}function Sa(b,k){var $,r;if(typeof k!="string")return;const z=k.trim();if(!z)return;const R=ze(z);return(r=($=b.options)==null?void 0:$.find(F=>{const te=ze(F.value),_=ze(F.label),X=ze(F.label.split("(")[0]);return R===te||R===_||R===X}))==null?void 0:r.value}function za(b,k){const z=is(k),R={参数:"params",尺寸:"size",图片尺寸:"size",宽高比:"size",分辨率:"resolution",图片分辨率:"resolution",画质:"quality",图片质量:"quality",质量:"quality"},$=R[k.trim()]||R[z];return b.find(r=>r.id===k||r.id===$?!0:[r.id,r.label,r.shortLabel||"",r.description||""].map(is).includes(z))}function zt(b,k){if(typeof k!="string")return;const z=k.trim();if(z)return b.valueType==="enum"?Sa(b,z):z}function pe(b,k,z){const $=Nt(k).find(X=>X.id==="size"),r=ke(b.params)?b.params:{},F={...z,...r},te=r.size||b.size,_=$?zt($,te):void 0;return _&&(F.size=_),Qe(k,F)}function os(b,k,z){const R=b.trim();if(!R)return{...z};const $=Nt(k),r={};try{const _=JSON.parse(R);if(ke(_))return Qe(k,{...z,..._})}catch{}const F=$.find(_=>_.id==="size"),te=F?zt(F,R):void 0;return te?Qe(k,{...z,size:te}):(R.split(/[;\n]+/).map(_=>_.trim()).filter(Boolean).forEach(_=>{const X=_.match(/^([^:=:=]+)[:=:]\s*(.+)$/);if(!X)return;const se=za($,X[1]);if(!se)return;const B=zt(se,X[2]);B&&(r[se.id]=B)}),Qe(k,{...z,...r}))}function ge(b){return Object.entries(b).filter(([,k])=>k).map(([k,z])=>`${k}=${z}`).join(`
1
+ import{_ as vt}from"./startup-runtime-BrfuwjQS.js";import{cm as qs,ep as Hs,en as Ws,cK as Xs,gA as Ys,cO as be,P as o,S as Yt,U as Zs,eo as Zt,ew as We,et as jt,ey as Qt,ex as Xe,f3 as Ct,nq as Nt,nZ as Qs,q5 as ea,ao as y,i0 as Ye,ka as ta,T as W,q6 as sa,mU as aa,nC as na,kH as ra,aD as la,a8 as a,ab as P,co as D,fo as es,q7 as ia,eL as oa,q8 as ca,q9 as ua,eN as da,nN as ma,f2 as ha,f6 as ts,f1 as ss,qa as Ze,e8 as fa,qb as pa,fq as ga,iP as as,pd as wa,d1 as ns,c1 as St,fA as ba,eI as ka,o2 as Qe,m$ as xa,nL as ya}from"./ai-chat-BnWVpTEI.js";import{p as va}from"./tool-windows-Bf_pMml-.js";import{b as ja}from"./mj-params-M-7csAp7.js";const rs=Zs.BATCH_IMAGE_CACHE,M=["prompt","params","images","count","preview"];function ke(b){return!!b&&typeof b=="object"&&!Array.isArray(b)&&Object.values(b).every(k=>typeof k=="string")}function ls(b){return Array.isArray(b)?[...b]:ke(b)?{...b}:b}function Ca(b,k){const z=Object.keys(b),R=Object.keys(k);return z.length===R.length&&z.every($=>b[$]===k[$])}function ze(b){return b.trim().toLowerCase().replace(/[::]/g,"x").replace(/×/g,"x").replace(/\s+/g,"")}function is(b){return ze(b).replace(/[=_-]/g,"")}function Sa(b,k){var $,r;if(typeof k!="string")return;const z=k.trim();if(!z)return;const R=ze(z);return(r=($=b.options)==null?void 0:$.find(F=>{const te=ze(F.value),_=ze(F.label),X=ze(F.label.split("(")[0]);return R===te||R===_||R===X}))==null?void 0:r.value}function za(b,k){const z=is(k),R={参数:"params",尺寸:"size",图片尺寸:"size",宽高比:"size",分辨率:"resolution",图片分辨率:"resolution",画质:"quality",图片质量:"quality",质量:"quality"},$=R[k.trim()]||R[z];return b.find(r=>r.id===k||r.id===$?!0:[r.id,r.label,r.shortLabel||"",r.description||""].map(is).includes(z))}function zt(b,k){if(typeof k!="string")return;const z=k.trim();if(z)return b.valueType==="enum"?Sa(b,z):z}function pe(b,k,z){const $=Nt(k).find(X=>X.id==="size"),r=ke(b.params)?b.params:{},F={...z,...r},te=r.size||b.size,_=$?zt($,te):void 0;return _&&(F.size=_),Qe(k,F)}function os(b,k,z){const R=b.trim();if(!R)return{...z};const $=Nt(k),r={};try{const _=JSON.parse(R);if(ke(_))return Qe(k,{...z,..._})}catch{}const F=$.find(_=>_.id==="size"),te=F?zt(F,R):void 0;return te?Qe(k,{...z,size:te}):(R.split(/[;\n]+/).map(_=>_.trim()).filter(Boolean).forEach(_=>{const X=_.match(/^([^:=:=]+)[:=:]\s*(.+)$/);if(!X)return;const se=za($,X[1]);if(!se)return;const B=zt(se,X[2]);B&&(r[se.id]=B)}),Qe(k,{...z,...r}))}function ge(b){return Object.entries(b).filter(([,k])=>k).map(([k,z])=>`${k}=${z}`).join(`
2
2
  `)}function Na(b){const k={...b};return k.size==="auto"&&delete k.size,Object.keys(k).length>0?k:void 0}function cs(b){return b instanceof Element&&!!b.closest('input, textarea, [contenteditable="true"]')}function Ra(){const b=[];for(let k=0;k<5;k++)b.push({id:k+1,prompt:"",params:{size:"auto"},images:[],count:1,taskIds:[]});return b}const Pa=({onSwitchToSingle:b,selectedModel:k,selectedModelRef:z,onModelChange:R,onModelRefChange:$})=>{var Wt;const{language:r}=qs(),{confirm:F,confirmDialog:te}=Hs(),_=Ws("image"),{createTask:X,tasks:se}=va(),{addAsset:B,assets:us,loadAssets:Rt}=Xs(),{isMobile:ds,isTablet:ms}=Ys(),_t=ds||ms,Et=us.filter(t=>t.type===be.IMAGE);o.useEffect(()=>{Rt()},[Rt]);const[w,A]=o.useState(Ra),[ae,Ne]=o.useState(6),[et,Tt]=o.useState(!1),[ne,me]=o.useState(!1),he=o.useRef(!1),[tt,hs]=o.useState([]);o.useEffect(()=>{let t=!0;return Yt.get(rs).then(e=>{t&&(e&&e.tasks&&Array.isArray(e.tasks)&&e.tasks.length>0&&(A(e.tasks),e.taskIdCounter&&Ne(e.taskIdCounter)),Tt(!0))}).catch(e=>{console.warn("Failed to load batch image cache:",e),t&&Tt(!0)}),()=>{t=!1}},[]);const[j,re]=o.useState(null),[I,Y]=o.useState([]),[Z,O]=o.useState(null),[le,xe]=o.useState(null),[C,Q]=o.useState(new Set),{validSelectedRows:_a,selectedTaskCount:Ea,selectedInfoText:fs}=o.useMemo(()=>{const t=[...C].filter(n=>{const l=w[n];return l&&l.prompt&&l.prompt.trim()!==""}).sort((n,l)=>n-l),e=t.reduce((n,l)=>{const u=w[l];return n+((u==null?void 0:u.count)||1)},0),s=t.length>0?r==="zh"?`已选 ${t.length} 行 / ${e} 任务`:`${t.length} rows / ${e} tasks`:"";return{validSelectedRows:t,selectedTaskCount:e,selectedInfoText:s}},[C,w,r]),G=o.useRef([]),J=o.useRef(-1),ye=o.useRef(!1),[Dt,st]=o.useState(!0),[ps,at]=o.useState(!1),[V,$t]=o.useState(!1),[K,Mt]=o.useState(null),[Pt,At]=o.useState([]),[Re,nt]=o.useState(null),[we,rt]=o.useState(!1),[_e,lt]=o.useState(null),[gs,it]=o.useState(null),[Lt,ws]=o.useState(1),[bs,ot]=o.useState(!1),[L,ct]=o.useState([]),[ie,It]=o.useState(1),oe=Math.min(5,Math.max(1,Math.floor(Number.isFinite(Lt)?Lt:1))),ut=L.length>0?Math.ceil(L.length/oe):0,Ot=Math.max(1,w.length+ut),dt=o.useMemo(()=>L.slice(0,12).map(t=>URL.createObjectURL(t)),[L]);o.useEffect(()=>()=>{dt.forEach(t=>URL.revokeObjectURL(t))},[dt]);const ce=Zt("image"),Ee=We(_,ce.modelId,jt(ce.profileId,ce.modelId))||Qt("image",ce.modelId,jt(ce.profileId,ce.modelId)),[x,Te]=o.useState((Ee==null?void 0:Ee.id)||((Wt=_[0])==null?void 0:Wt.id)||"gemini-2.5-flash-image-vip"),[U,De]=o.useState(Xe(Ee)||jt(ce.profileId,ce.modelId)),ue=o.useMemo(()=>{if(We(_,x,U)||!x)return _;const e=Qt("image",x,U);return e?[e,..._]:_},[_,x,U]),mt=o.useMemo(()=>Ct(x,U),[x,U]),Kt=o.useMemo(()=>Nt(x),[x]),S=o.useMemo(()=>Qs(x,mt).extraParams,[x,mt]);o.useEffect(()=>{A(t=>{let e=!1;const s=t.map(n=>{const l=pe(n,x,S),u=typeof n.size=="string",c=ke(n.params)?n.params:{};if(!u&&Ca(c,l))return n;e=!0;const{size:d,...f}=n;return{...f,params:l}});return e?s:t})},[et,S,x]),o.useEffect(()=>{if(ue.length===0)return;We(ue,x,U)||(Te(ue[0].id),De(Xe(ue[0])))},[x,U,ue]),o.useEffect(()=>{if(!k)return;const t=Ct(x,U),e=Ct(k,z);if(t!==e){Te(k);const s=We(ue,k,z);De(Xe(s)||z||null)}},[k,z,x,U,ue]);const{openViewer:Ft,viewerProps:ks}=ea(),[ve,ht]=o.useState(null),[xs,$e]=o.useState(!1),[Me,ys]=o.useState(5),[Ut,ft]=o.useState(!1),[pt,gt]=o.useState(null),Pe=o.useRef(null),Ae=o.useRef(null),Le=o.useRef(null),Ie=o.useRef(null),Bt=o.useRef(null),Oe=o.useRef(null),wt=o.useRef(null),Ke=o.useRef(null),Fe=o.useCallback(()=>{var t;(t=Ke.current)==null||t.focus({preventScroll:!0})},[]),Ue=o.useCallback(t=>{const e=Ke.current;if(!e)return!1;const s=t.target instanceof Element?t.target:null;if(s&&e.contains(s))return!0;const n=document.activeElement;return n instanceof Element&&e.contains(n)},[]);o.useEffect(()=>{if(!et)return;const t={tasks:w,taskIdCounter:ae,timestamp:Date.now()};Yt.set(rs,t).catch(e=>{console.warn("Failed to save batch image cache:",e)})},[w,ae,et]);const Gt=o.useCallback((t,e,s,n)=>{if(ye.current){ye.current=!1;return}G.current=G.current.slice(0,J.current+1);const l={tasks:JSON.parse(JSON.stringify(t)),selectedCells:[...e],activeCell:s?{...s}:null,selectedRows:Array.from(n)};G.current.push(l),J.current=G.current.length-1,G.current.length>50&&(G.current.shift(),J.current--)},[]);o.useEffect(()=>{w.length>0&&Gt(w,I,j,C)},[w,Gt]),o.useEffect(()=>{if(G.current.length>0&&J.current>=0&&!ye.current){const t=G.current[J.current];t&&(t.selectedCells=[...I],t.activeCell=j?{...j}:null,t.selectedRows=Array.from(C))}},[I,j,C]);const Jt=o.useCallback(()=>{if(J.current>0){J.current--,ye.current=!0;const t=G.current[J.current];A(JSON.parse(JSON.stringify(t.tasks))),Y([...t.selectedCells]),re(t.activeCell?{...t.activeCell}:null),Q(new Set(t.selectedRows)),y.info(r==="zh"?"已撤销":"Undone")}else y.warning(r==="zh"?"没有可撤销的操作":"Nothing to undo")},[r]),Vt=o.useCallback(()=>{if(J.current<G.current.length-1){J.current++,ye.current=!0;const t=G.current[J.current];A(JSON.parse(JSON.stringify(t.tasks))),Y([...t.selectedCells]),re(t.activeCell?{...t.activeCell}:null),Q(new Set(t.selectedRows)),y.info(r==="zh"?"已重做":"Redone")}else y.warning(r==="zh"?"没有可重做的操作":"Nothing to redo")},[r]),vs=o.useCallback(t=>{A(e=>{const s=[...e];for(let n=0;n<t;n++)s.push({id:ae+n,prompt:"",params:{...S},images:[],count:1,taskIds:[]});return s}),Ne(e=>e+t)},[S,ae]),js=o.useCallback(()=>{if(C.size===0){y.warning(r==="zh"?"请先勾选要删除的行":"Please check rows to delete");return}A(t=>t.filter((e,s)=>!C.has(s))),Q(new Set),Y([]),re(null)},[C,r]),N=o.useCallback((t,e)=>{Fe(),re({row:t,col:e}),Y([{row:t,col:e}]),O(null),xe(null)},[Fe]),Be=o.useCallback((t,e)=>{if(N(t,e),e==="params"){xe({row:t,col:e});return}M.includes(e)&&e!=="images"&&O({row:t,col:e})},[N]),E=o.useCallback((t,e,s)=>{A(n=>{if(!n[t])return n;const l=[...n];return e==="params"?(l[t]={...l[t],params:pe({...l[t],params:ke(s)?s:{}},x,S)},l):e==="size"?(l[t]={...l[t],params:pe({...l[t],size:String(s||"")},x,S)},l):(l[t]={...l[t],[e]:s},l)})},[S,x]),qt=o.useCallback((t,e,s)=>{const n=t.split(/\r?\n/).filter(u=>u.trim());if(n.length===0)return;const l=(u,c,d)=>{if(!(u<0||u>=w.length))if(c==="prompt")E(u,c,d);else if(c==="count"){const f=parseInt(d,10);!isNaN(f)&&f>=1&&E(u,c,f)}else(c==="params"||c==="size")&&E(u,"params",os(d,x,S))};if(n.length===1||s.length>1){const u=n[0];s.forEach(c=>l(c.row,c.col,u));return}n.forEach((u,c)=>{l(e.row+c,e.col,u)})},[S,x,w.length,E]),Ht=o.useCallback((t,e)=>{const s=window.__copiedCells;if(!s||s.length===0)return!1;if(s.length===1){const n=s[0];return e.forEach(l=>{l.col===n.col&&E(l.row,l.col,n.value)}),!0}return s.forEach((n,l)=>{const u=t.row+l;u<w.length&&E(u,t.col,n.value)}),!0},[w.length,E]),je=o.useCallback((t,e,s)=>{if(t.shiftKey&&j){const n=Math.min(j.row,e),l=Math.max(j.row,e);Q(c=>{const d=new Set(c);for(let f=n;f<=l;f++)d.add(f);return d});const u=[];for(let c=n;c<=l;c++)u.push({row:c,col:j.col});Y(u),Bt.current=e}else t.ctrlKey||t.metaKey?Y(n=>n.some(u=>u.row===e&&u.col===s)?n.filter(u=>!(u.row===e&&u.col===s)):[...n,{row:e,col:s}]):(N(e,s),Bt.current=e)},[j,N]),Ge=o.useCallback(t=>{var s;if(!j){y.warning(r==="zh"?"请先选中一个单元格作为填充源":"Please select a cell as fill source");return}const e=(s=w[j.row])==null?void 0:s[t];if(e==null||typeof e=="string"&&e.trim()===""||Array.isArray(e)&&e.length===0){y.warning(r==="zh"?"选中的单元格没有数据":"Selected cell has no data");return}A(n=>n.map(l=>({...l,[t]:ls(e)}))),y.success(r==="zh"?"已填充整列":"Column filled")},[j,w,r]),Je=o.useCallback((t,e)=>{rt(!1),lt(null),$t(!0),Mt({row:t,col:e}),nt(t)},[]),bt=o.useCallback((t,e)=>{V||(Fe(),rt(!0),lt({row:t,col:e}),re({row:t,col:e}),Y([{row:t,col:e}]))},[Fe,V]),Cs=o.useCallback(t=>{if(!V&&!we)return;const s=t.target.closest("tr[data-row-index]");if(!s)return;const n=parseInt(s.dataset.rowIndex||"-1");if(!(n<0)){if(V&&K){nt(n);const l=K.row,u=n,c=Math.min(l,u),d=Math.max(l,u),f=[];for(let m=c;m<=d;m++)m!==l&&f.push(m);At(f)}if(we&&_e){const l=_e.col,u=_e.row,c=n,d=Math.min(u,c),f=Math.max(u,c),m=[];for(let i=d;i<=f;i++)m.push({row:i,col:l});Y(m)}}},[V,K,we,_e]),Ve=o.useCallback(()=>{var t;if(V&&K&&Re!==null&&Re!==K.row){const e=(t=w[K.row])==null?void 0:t[K.col],s=K.row,n=Re,l=Math.min(s,n),u=Math.max(s,n);A(d=>{const f=[...d];for(let m=l;m<=u;m++)m!==s&&f[m]&&(f[m]={...f[m],[K.col]:ls(e)});return f});const c=[];for(let d=l;d<=u;d++)c.push({row:d,col:K.col});Y(c),y.success(r==="zh"?`已填充 ${Math.abs(n-s)} 行`:`Filled ${Math.abs(n-s)} rows`)}$t(!1),Mt(null),nt(null),At([]),rt(!1),lt(null)},[V,K,Re,w,r]),Ss=o.useCallback(t=>{const e=t.target.files;e&&(Array.from(e).forEach(s=>{s.type.startsWith("image/")&&B(s,be.IMAGE,Ye.LOCAL,s.name).catch(n=>{console.warn("[BatchImageGeneration] Failed to add asset to library:",n)})}),Pe.current&&(Pe.current.value=""))},[B]),zs=o.useCallback(t=>{let e=[];if(C.size>0?e=[...C]:I.length>0?e=[...new Set(I.map(s=>s.row))]:j&&(e=[j.row]),e.length===0){y.warning(r==="zh"?"请先选中要添加图片的行":"Please select a row first");return}A(s=>{const n=[...s];return e.forEach(l=>{n[l]&&!n[l].images.includes(t)&&(n[l]={...n[l],images:[...n[l].images,t]})}),n})},[C,I,j,r]),fe=o.useCallback((t,e)=>{A(s=>{const n=[...s];return n[t]&&!n[t].images.includes(e)&&(n[t]={...n[t],images:[...n[t].images,e]}),n})},[]),Ns=o.useCallback((t,e)=>{A(s=>{const n=[...s];return n[t]&&(n[t]={...n[t],images:n[t].images.filter(l=>l!==e)}),n})},[]),Rs=o.useCallback(t=>{const e=t.target.files,s=wt.current;!e||e.length===0||s===null||(Array.from(e).forEach(n=>{if(!n.type.startsWith("image/"))return;B(n,be.IMAGE,Ye.LOCAL,n.name).catch(u=>{console.warn("[BatchImageGeneration] Failed to add asset to library:",u)});const l=new FileReader;l.onload=u=>{var d;const c=(d=u.target)==null?void 0:d.result;fe(s,c)},l.readAsDataURL(n)}),Ie.current&&(Ie.current.value=""),wt.current=null)},[fe,B]),_s=o.useCallback(t=>{var e;wt.current=t,st(!0),(e=Ie.current)==null||e.click()},[]),Es=o.useCallback(t=>{gt(t),ft(!0)},[]),Ts=o.useCallback(t=>{pt!==null&&(t.url&&fe(pt,t.url),ft(!1),gt(null))},[pt,fe]),Ds=o.useCallback((t,e)=>{t.preventDefault(),t.dataTransfer.dropEffect="copy",it(e)},[]),$s=o.useCallback(t=>{const e=t.relatedTarget;(!e||!t.currentTarget.contains(e))&&it(null)},[]),Ms=o.useCallback((t,e)=>{t.preventDefault(),it(null);const s=t.dataTransfer.getData("text/library-image");if(s){fe(e,s),y.success(r==="zh"?`已添加图片到第 ${e+1} 行`:`Added image to row ${e+1}`);return}const n=t.dataTransfer.files;if(!n||n.length===0)return;let l=0;Array.from(n).forEach(u=>{if(!u.type.startsWith("image/"))return;B(u,be.IMAGE,Ye.LOCAL,u.name).catch(d=>{console.warn("[BatchImageGeneration] Failed to add asset to library:",d)});const c=new FileReader;c.onload=d=>{var m;const f=(m=d.target)==null?void 0:m.result;fe(e,f)},c.readAsDataURL(u),l++}),l>0&&y.success(r==="zh"?`已添加 ${l} 张图片到第 ${e+1} 行`:`Added ${l} images to row ${e+1}`)},[fe,r,B]),Ps=o.useCallback((t,e)=>{t.dataTransfer.setData("text/library-image",e),t.dataTransfer.effectAllowed="copy"},[]),As=o.useCallback(t=>{const e=t.target.files;if(!e||e.length===0)return;const s=Array.from(e).filter(l=>l.type.startsWith("image/"));if(s.length===0){y.warning(r==="zh"?"请选择图片文件":"Please select image files");return}ct(s);const n=j?j.row+1:1;It(Math.min(n,w.length)),ot(!0),Ae.current&&(Ae.current.value="")},[r,j,w.length]),Ls=o.useCallback(async()=>{if(L.length===0)return;const t=ta(`批量导入(${L.length}张)`),e=oe,s=L.length,n=Math.ceil(s/e),l=ie-1,u=[];for(const m of L){B(m,be.IMAGE,Ye.LOCAL,m.name).catch(p=>{console.warn("[BatchImageGeneration] Failed to add asset to library:",p)});const i=await new Promise((p,h)=>{const g=new FileReader;g.onload=v=>{var T;return p((T=v.target)==null?void 0:T.result)},g.onerror=h,g.readAsDataURL(m)});u.push(i)}A(m=>{const i=[...m];let p=0,h=0;for(let g=0;g<n;g++){const v=l+g,T=[];for(let q=0;q<e&&p<s;q++)T.push(u[p]),p++;v<i.length?i[v]={...i[v],images:[...i[v].images,...T]}:(i.push({id:ae+h,prompt:"",params:{...S},images:T,count:1,taskIds:[]}),h++)}return i});const c=Math.min(n,w.length-l),d=Math.max(0,n-c);d>0&&Ne(m=>m+d),ct([]),ot(!1),t();const f=r==="zh"?`已导入 ${s} 张图片,从第 ${ie} 行开始`:`Imported ${s} images starting from row ${ie}`;y.success(f)},[L,oe,ie,ae,w.length,r,B,S]),kt=o.useCallback(()=>{ct([]),ot(!1)},[]),Is=o.useCallback(async()=>{try{const t=await vt(()=>import("./office-data-DMEex_0S.js").then(l=>l.x),[],import.meta.url),e=[{提示词:"一只可爱的橘猫在阳光下睡觉",参数:ge({...S,size:"1x1"}),数量:1},{提示词:"未来城市的夜景,霓虹灯闪烁",参数:ge({...S,size:"16x9"}),数量:2},{提示词:"古风美女,水墨画风格",参数:ge({...S,size:"3x4"}),数量:1},{提示词:"",参数:ge(S),数量:1},{提示词:"",参数:ge(S),数量:1}],s=t.utils.book_new(),n=t.utils.json_to_sheet(e);n["!cols"]=[{wch:60},{wch:24},{wch:8}],t.utils.book_append_sheet(s,n,"批量出图模板"),t.writeFile(s,"batch-image-template.xlsx"),y.success(r==="zh"?"模板下载成功,填写后可导入使用":"Template downloaded, fill and import to use")}catch(t){console.error("Excel template download error:",t),y.error(r==="zh"?"下载失败,请稍后重试":"Download failed, please try again")}},[S,r]),Os=o.useCallback(async t=>{var s;const e=(s=t.target.files)==null?void 0:s[0];if(e){try{const n=await vt(()=>import("./office-data-DMEex_0S.js").then(u=>u.x),[],import.meta.url),l=new FileReader;l.onload=u=>{var c;try{const d=new Uint8Array((c=u.target)==null?void 0:c.result),f=n.read(d,{type:"array"}),m=f.SheetNames[0],i=f.Sheets[m],p=n.utils.sheet_to_json(i);if(p.length===0){y.warning(r==="zh"?"Excel 文件为空":"Excel file is empty");return}const h=p.map((g,v)=>{const T=g.提示词||g.prompt||g.Prompt||"",q=g.参数||g.params||g.Params||"",ee=g.尺寸||g.size||g.Size||"",H=q?os(String(q),x,S):pe({params:S,size:String(ee)},x,S),He=parseInt(String(g.数量||g.count||g.Count||"1"))||1,Xt=g.参考图||g.images||g.Images||"",Vs=Xt?Xt.split(`
3
3
  `).map(Se=>Se.trim()).filter(Se=>Se.length>0&&!Se.startsWith("[")&&!Se.endsWith("]")):[];return{id:ae+v,prompt:String(T).trim(),params:H,images:Vs,count:Math.max(1,He),taskIds:[]}});A(g=>[...g,...h]),Ne(g=>g+h.length),y.success(r==="zh"?`已导入 ${h.length} 行数据`:`Imported ${h.length} rows`)}catch(d){console.error("Excel import error:",d),y.error(r==="zh"?"导入失败,请检查文件格式":"Import failed, please check file format")}},l.readAsArrayBuffer(e)}catch(n){console.error("Excel library load error:",n),y.error(r==="zh"?"加载 Excel 处理库失败":"Failed to load Excel library")}Le.current&&(Le.current.value="")}},[S,r,x,ae]),de=o.useCallback(t=>{if(t.taskIds.length===0)return{status:"idle",tasks:[],completedCount:0,failedCount:0};const e=se.filter(c=>t.taskIds.includes(c.id)),s=e.filter(c=>c.status===W.COMPLETED).length,n=e.filter(c=>c.status===W.FAILED).length,l=e.filter(c=>c.status===W.PENDING||c.status===W.PROCESSING).length;let u="idle";return l>0?u="generating":n>0&&s>0?u="partial":n>0?u="failed":s>0&&(u="completed"),{status:u,tasks:e,completedCount:s,failedCount:n}},[se]),Ks=o.useCallback(async()=>{try{const t=await vt(()=>import("./office-data-DMEex_0S.js").then(i=>i.x),[],import.meta.url),e=32e3,s=i=>{const h=i.map((g,v)=>g.startsWith("data:")?`[本地图片${v+1}]`:g).join(`
4
4
  `);return h.length>e?h.substring(0,e-20)+`