aitu-app 0.6.62 → 0.6.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/assets/{CanvasAudioPlayer-Bp59OYEE.js → CanvasAudioPlayer-B2W5__ni.js} +1 -1
- package/assets/{ChatDrawer-DTnFa0Yg.js → ChatDrawer-M1q92KNU.js} +2 -2
- package/assets/{ChatMessagesArea-C_PlPPB6.js → ChatMessagesArea-D9LNDmbK.js} +2 -2
- package/assets/{DeferredAIInputBar-FXIdAIFQ.js → DeferredAIInputBar-CKhI8Jhd.js} +2 -2
- package/assets/{DrawnixDeferredFeatures-BpdfVd0S.js → DrawnixDeferredFeatures-DxyxvT2y.js} +1 -1
- package/assets/{KnowledgeBaseContent-vMJrPxhl.js → KnowledgeBaseContent-C_JxGQXg.js} +3 -3
- package/assets/{MVCreator-DWnOuDTn.js → MVCreator-DOt6pxq2.js} +1 -1
- package/assets/{ModelBenchmarkWorkbench-B9Ak8WB1.js → ModelBenchmarkWorkbench-3j77ocpe.js} +1 -1
- package/assets/{ModelDropdown-BZKNlzLC.js → ModelDropdown-CHYgRb1r.js} +1 -1
- package/assets/{MusicAnalyzer-BzHZKtAN.js → MusicAnalyzer-BTXks5oV.js} +1 -1
- package/assets/{MusicAnalyzer-B3yC-t5k.js → MusicAnalyzer-Dr-DPePj.js} +1 -1
- package/assets/{ResizableDivider-Bdiw58QX.js → ResizableDivider-P1jpoJ3i.js} +1 -1
- package/assets/{TaskQueuePanel-DBtIBJgI.js → TaskQueuePanel-D6NtMAbm.js} +1 -1
- package/assets/{VideoAnalyzer-CuYECSqv.js → VideoAnalyzer-BHZMqLIa.js} +1 -1
- package/assets/{ai-generation-preferences-service-Cq-O2q6x.js → ai-generation-preferences-service-CabuQA69.js} +1 -1
- package/assets/{arc-DhZca7rk.js → arc-BajUk0_Z.js} +1 -1
- package/assets/{arc-DfLXzP3k.js → arc-Z9PGo_2L.js} +1 -1
- package/assets/{batch-image-generation-ScQBREQO.js → batch-image-generation-RKz5tz-Y.js} +1 -1
- package/assets/{blockDiagram-38ab4fdb-CgzfZL2B.js → blockDiagram-38ab4fdb-BsEJDcLK.js} +1 -1
- package/assets/{blockDiagram-38ab4fdb-DgGXcwMa.js → blockDiagram-38ab4fdb-Cfmk3_6A.js} +1 -1
- package/assets/{c4Diagram-3d4e48cf-DmFzQyUe.js → c4Diagram-3d4e48cf-D2OyfHpd.js} +1 -1
- package/assets/{c4Diagram-3d4e48cf-C-lxS4YK.js → c4Diagram-3d4e48cf-K-ewbsK1.js} +1 -1
- package/assets/{canvas-insertion-CB55h2RW.js → canvas-insertion-CYbFgP4L.js} +1 -1
- package/assets/channel-6DAc0JPc.js +1 -0
- package/assets/channel-WrMsNCbC.js +1 -0
- package/assets/{classDiagram-70f12bd4-DTz0TMM6.js → classDiagram-70f12bd4-BGEF352u.js} +1 -1
- package/assets/{classDiagram-70f12bd4-CUdj4KMb.js → classDiagram-70f12bd4-Gn3MZjEL.js} +1 -1
- package/assets/{classDiagram-v2-f2320105-D41aFBMP.js → classDiagram-v2-f2320105-C_aAfIgL.js} +1 -1
- package/assets/{classDiagram-v2-f2320105-DmLTBteW.js → classDiagram-v2-f2320105-DYPMFlcT.js} +1 -1
- package/assets/{clipper-5i9OpCTE.js → clipper-ByL4oIbZ.js} +1 -1
- package/assets/clone-keJVIubx.js +1 -0
- package/assets/{createText-2e5e7dd3-Dq1rEH0B.js → createText-2e5e7dd3-C0UgSBh5.js} +1 -1
- package/assets/{createText-2e5e7dd3-CR88HWX-.js → createText-2e5e7dd3-CoA6JNKB.js} +1 -1
- package/assets/{edges-e0da2a9e-B9zK1zd0.js → edges-e0da2a9e-DmyL0L_b.js} +1 -1
- package/assets/{edges-e0da2a9e-CKtt_pxW.js → edges-e0da2a9e-qdTreft0.js} +1 -1
- package/assets/{erDiagram-9861fffd-2WJUzrVx.js → erDiagram-9861fffd-Bjyf78Da.js} +1 -1
- package/assets/{erDiagram-9861fffd-CJUfsjF0.js → erDiagram-9861fffd-DYWtVkXG.js} +1 -1
- package/assets/{flowDb-956e92f1-BfYdFSTo.js → flowDb-956e92f1-Clfuqh48.js} +1 -1
- package/assets/{flowDb-956e92f1-BKtDeW51.js → flowDb-956e92f1-vnfymslR.js} +1 -1
- package/assets/{flowDiagram-66a62f08-BhU3ilPd.js → flowDiagram-66a62f08-54OX2XOH.js} +1 -1
- package/assets/{flowDiagram-66a62f08-C3bf45d6.js → flowDiagram-66a62f08-lS8fOa4T.js} +1 -1
- package/assets/flowDiagram-v2-96b9c2cf-Bw7qAcFu.js +1 -0
- package/assets/flowDiagram-v2-96b9c2cf-DGyrUMgR.js +1 -0
- package/assets/{flowchart-elk-definition-4a651766-xlMl1T8Z.js → flowchart-elk-definition-4a651766-CXdElD40.js} +1 -1
- package/assets/{flowchart-elk-definition-4a651766-BjsUvZ4U.js → flowchart-elk-definition-4a651766-D4UghemK.js} +1 -1
- package/assets/{ganttDiagram-c361ad54-Df2ZcHF_.js → ganttDiagram-c361ad54-Bl7rQCLW.js} +1 -1
- package/assets/{ganttDiagram-c361ad54-CnGXGsct.js → ganttDiagram-c361ad54-CwAjbWcn.js} +1 -1
- package/assets/{gitGraphDiagram-72cf32ee-tJ2_vL1A.js → gitGraphDiagram-72cf32ee-B-ykaDuR.js} +1 -1
- package/assets/{gitGraphDiagram-72cf32ee-CcbS4y2e.js → gitGraphDiagram-72cf32ee-ChvlaDvG.js} +1 -1
- package/assets/{graph-BPcMBtWb.js → graph-Bq1HvHkL.js} +1 -1
- package/assets/{graph-CS2_wM7v.js → graph-DM094zt_.js} +1 -1
- package/assets/{index-3862675e-D6vjfbIn.js → index-3862675e-CA0xjB9W.js} +1 -1
- package/assets/{index-3862675e-dXlwthVN.js → index-3862675e-DGrSmeWu.js} +1 -1
- package/assets/{index-CV1P-84m.js → index-AFp_qpAI.js} +1 -1
- package/assets/{index-CEc_YkGM.js → index-B4dceFKj.js} +1 -1
- package/assets/{index-CNr3KwTE.js → index-B67KSDhv.js} +1 -1
- package/assets/{index-Drrb0M5e.js → index-BC221_MJ.js} +1 -1
- package/assets/{index-C5p2HOjb.js → index-BGFWA6Zt.js} +1 -1
- package/assets/{index-D0m6nbEV.js → index-BH3jS3gm.js} +1 -1
- package/assets/{index-C-Z9lqlr.js → index-BKTLxghO.js} +1 -1
- package/assets/{index-Cpu6b-oW.js → index-Bks4xBST.js} +1 -1
- package/assets/{index-BTD3JWN5.js → index-BmEFRKV7.js} +1 -1
- package/assets/{index-DSFyyI0P.js → index-C3h-b0UN.js} +1 -1
- package/assets/{index-DSMO5CcI.js → index-C5Onm0uO.js} +1 -1
- package/assets/{index-B74ZEKfg.js → index-CGelrSXy.js} +1 -1
- package/assets/{index-kqvtDIDS.js → index-CKBsqCzR.js} +1 -1
- package/assets/{index-CQDIwW2U.js → index-CKjzms_e.js} +1 -1
- package/assets/{index-2mXPr7l5.js → index-CMLI8gQy.js} +1 -1
- package/assets/{index-e7c_QVSZ.js → index-CVEllvWf.js} +1 -1
- package/assets/{index-Dv3bZUbg.js → index-CW_ala_3.js} +1 -1
- package/assets/{index-Dgre-viW.js → index-Ci5Z3DWY.js} +1 -1
- package/assets/{index-k3Jp3ZQ1.js → index-CtNjfEqK.js} +1 -1
- package/assets/{index-ZWMuik9S.js → index-CvbEsbIE.js} +1 -1
- package/assets/{index-Bs5VMNrp.js → index-DM-iV9Y8.js} +2 -2
- package/assets/{index-vmrXtI2t.js → index-DTqVJVfv.js} +1 -1
- package/assets/{index-DUFjoe0j.js → index-DZtf3zC8.js} +1 -1
- package/assets/{index-BSRZB7-O.js → index-D_LadtY8.js} +1 -1
- package/assets/{index-0_ZBCb2g.js → index-DiSWR48t.js} +1 -1
- package/assets/{index-kd3whqy6.js → index-DsFroXrj.js} +1 -1
- package/assets/{index-ChaWhrq3.js → index-DxqCsnoj.js} +1 -1
- package/assets/{index-Da4Zevc8.js → index-Jvh12pKI.js} +1 -1
- package/assets/{index-CSAU26x-.js → index-gHdnUGOu.js} +3 -3
- package/assets/{index-C4eZmDJ9.js → index-kKjFXTNL.js} +1 -1
- package/assets/{index-B4IiTNZb.js → index-v1v0x1ci.js} +3 -3
- package/assets/{infoDiagram-f8f76790-DMx72eJm.js → infoDiagram-f8f76790-C-wYgjah.js} +1 -1
- package/assets/{infoDiagram-f8f76790-BLeEtbYG.js → infoDiagram-f8f76790-Cu-3eq4R.js} +1 -1
- package/assets/{journeyDiagram-49397b02-D7slMJv8.js → journeyDiagram-49397b02-BG8aYQK6.js} +1 -1
- package/assets/{journeyDiagram-49397b02-dDoZ8X2D.js → journeyDiagram-49397b02-DXPaY9vn.js} +1 -1
- package/assets/{layout-Dudrgxo6.js → layout-DvIBYRXu.js} +1 -1
- package/assets/{layout-BJKJDIU0.js → layout-SoDWNnQD.js} +1 -1
- package/assets/{line-DwQ6KClI.js → line-Bxc-zIvZ.js} +1 -1
- package/assets/{line-Dc246oW9.js → line-CFFXuH78.js} +1 -1
- package/assets/{linear-CiBxajPd.js → linear-BF0xIQKP.js} +1 -1
- package/assets/{linear-CqNjhErh.js → linear-DQ3XkjOP.js} +1 -1
- package/assets/{main-DjgAgoB3.js → main-8GBlYJSO.js} +8 -8
- package/assets/{mermaid.core-CU2vDz-q.js → mermaid.core-BGyfnsLl.js} +3 -3
- package/assets/{mindmap-definition-fc14e90a-DGpSfxh9.js → mindmap-definition-fc14e90a-CrYWIUXi.js} +1 -1
- package/assets/{mindmap-definition-fc14e90a-BQkLfh1U.js → mindmap-definition-fc14e90a-DOkI3ebm.js} +1 -1
- package/assets/{model-benchmark-launcher-CmMp2rvF.js → model-benchmark-launcher-DtJmU6Wc.js} +1 -1
- package/assets/{model-benchmark-service-Dp3K_32J.js → model-benchmark-service-B0QCqInK.js} +1 -1
- package/assets/{model-selection-ftcewdkR.js → model-selection-CbzU26xQ.js} +1 -1
- package/assets/{photo-wall-splitter-CpTLhitw.js → photo-wall-splitter-BPzdMtA1.js} +1 -1
- package/assets/{pieDiagram-8a3498a8-C_aWt1vo.js → pieDiagram-8a3498a8-ChLZxjKv.js} +1 -1
- package/assets/{pieDiagram-8a3498a8-BY1ATwqk.js → pieDiagram-8a3498a8-DAWd9-jL.js} +1 -1
- package/assets/{quadrantDiagram-120e2f19-OFkdPtSn.js → quadrantDiagram-120e2f19-CBBovNE2.js} +1 -1
- package/assets/{quadrantDiagram-120e2f19-xf9yG9X6.js → quadrantDiagram-120e2f19-DSvfgE7I.js} +1 -1
- package/assets/{requirementDiagram-deff3bca-DsPb0v4b.js → requirementDiagram-deff3bca-De51fyhT.js} +1 -1
- package/assets/{requirementDiagram-deff3bca-CtatOcr2.js → requirementDiagram-deff3bca-ke6SiEw1.js} +1 -1
- package/assets/{sankeyDiagram-04a897e0-BcTCV6qD.js → sankeyDiagram-04a897e0-BxiqkhtK.js} +1 -1
- package/assets/{sankeyDiagram-04a897e0-N96gVjbT.js → sankeyDiagram-04a897e0-Clr8_HiZ.js} +1 -1
- package/assets/{sequenceDiagram-704730f1-Bear7SLZ.js → sequenceDiagram-704730f1-Bc8zPHLG.js} +1 -1
- package/assets/{sequenceDiagram-704730f1-DLRzWtVL.js → sequenceDiagram-704730f1-BfBUJmAu.js} +1 -1
- package/assets/{settings-dialog-WcofnXV_.js → settings-dialog-C9BMj8Zj.js} +1 -1
- package/assets/{skill-dsl-parser-BNwTeo1q.js → skill-dsl-parser-BxkJ9Ixc.js} +1 -1
- package/assets/{stateDiagram-587899a1-CH7EwOB6.js → stateDiagram-587899a1-DAil8S_m.js} +1 -1
- package/assets/{stateDiagram-587899a1-CUW3xQxd.js → stateDiagram-587899a1-Vop8VRn5.js} +1 -1
- package/assets/{stateDiagram-v2-d93cdb3a-l-fbMGO9.js → stateDiagram-v2-d93cdb3a-8b1lkei5.js} +1 -1
- package/assets/{stateDiagram-v2-d93cdb3a-3-5Yp32H.js → stateDiagram-v2-d93cdb3a-BHm8pPuv.js} +1 -1
- package/assets/{styles-6aaf32cf-BPLesyoi.js → styles-6aaf32cf-BlD8JxQr.js} +1 -1
- package/assets/{styles-6aaf32cf-BUy6wDUT.js → styles-6aaf32cf-C4CEUYqK.js} +1 -1
- package/assets/{styles-9a916d00-SorKlmmA.js → styles-9a916d00-C6tkW5rH.js} +1 -1
- package/assets/{styles-9a916d00-DAi9i0R_.js → styles-9a916d00-Oss0YMv5.js} +1 -1
- package/assets/{styles-c10674c1-_FFsnt3G.js → styles-c10674c1-D4YQTLGD.js} +1 -1
- package/assets/{styles-c10674c1-CfcKE6tr.js → styles-c10674c1-D6N_fge5.js} +1 -1
- package/assets/{svgDrawCommon-08f97a94-Bq-q0CJQ.js → svgDrawCommon-08f97a94-BOSx1sQS.js} +1 -1
- package/assets/{svgDrawCommon-08f97a94-Cmxv1Ujz.js → svgDrawCommon-08f97a94-RZvmFGZL.js} +1 -1
- package/assets/{timeline-definition-85554ec2-Gw54p4RI.js → timeline-definition-85554ec2-BL5y0l6c.js} +1 -1
- package/assets/{timeline-definition-85554ec2-DkReY7my.js → timeline-definition-85554ec2-BY6Jx-ZP.js} +1 -1
- package/assets/{tool-windows-pGtQqqCf.js → tool-windows-C4D0lII2.js} +137 -137
- package/assets/{ttd-dialog-BSFLIecn.js → ttd-dialog-qD0QkDID.js} +4 -4
- package/assets/{use-runtime-models-DVNlNiyy.js → use-runtime-models-BLwgp0M1.js} +1 -1
- package/assets/{useCharacters-CEOwfCgt.js → useCharacters-945b6dqW.js} +1 -1
- package/assets/{useWorkflowSubmission-CHERNoKY.js → useWorkflowSubmission-Z0u0KCNN.js} +2 -2
- package/assets/{video-analyze-ClD2LHE1.js → video-analyze-Co9na7Gr.js} +1 -1
- package/assets/{video-generation-DqOsfozw.js → video-generation-x2UMMPYg.js} +1 -1
- package/assets/{video-recovery-service-CkGqEp_N.js → video-recovery-service-BsV5nlEP.js} +1 -1
- package/assets/{workflow-generation-utils-DJOYgqj3.js → workflow-generation-utils-CZULSJWQ.js} +2 -2
- package/assets/{workflow-submission-service-CqQWUBYu.js → workflow-submission-service-C-eCWm_8.js} +1 -1
- package/assets/{xychartDiagram-e933f94c-CLvSamjK.js → xychartDiagram-e933f94c-CNjZprqQ.js} +1 -1
- package/assets/{xychartDiagram-e933f94c-CWHMnAuh.js → xychartDiagram-e933f94c-DjIBec-i.js} +1 -1
- package/changelog.json +16 -0
- package/idle-prefetch-manifest.json +6 -6
- package/manifest.json +3 -3
- package/package.json +1 -1
- package/precache-manifest.json +302 -302
- package/sw.js +6 -6
- package/version.json +7 -3
- package/assets/channel-CyrndHtK.js +0 -1
- package/assets/channel-D_mcnvYJ.js +0 -1
- package/assets/clone-DHzJcKOG.js +0 -1
- package/assets/flowDiagram-v2-96b9c2cf-C5Otymll.js +0 -1
- package/assets/flowDiagram-v2-96b9c2cf-CTmHt9QV.js +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# Opentu CDN Assets v0.6.
|
|
1
|
+
# Opentu CDN Assets v0.6.64
|
|
2
2
|
|
|
3
3
|
> 静态资源包,不含 HTML 文件
|
|
4
4
|
|
|
5
|
-
- unpkg: https://unpkg.com/aitu-app@0.6.
|
|
6
|
-
- jsdelivr: https://cdn.jsdelivr.net/npm/aitu-app@0.6.
|
|
5
|
+
- unpkg: https://unpkg.com/aitu-app@0.6.64/
|
|
6
|
+
- jsdelivr: https://cdn.jsdelivr.net/npm/aitu-app@0.6.64/
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./tool-windows-Cos6lOhr.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{r as n,y as t,z as he,bV as N,cP as ke,cQ as Ae,hs as Se,jc as Te,iR as Le,jd as Ee,je as ue,jf as J,jg as U,jh as Ce,ji as Ne,jj as de,ho as pe,jk as Z,jl as Me,cr as Re,ig as De,as as ze,cy as $e,hF as oe,jm as ye,gP as ie,jn as le,jo as _e,jp as Oe,bw as Ue,jq as Fe,jr as qe,da as Ye,js as Ve,jt as fe,ju as Be,jv as He,_ as We,jw as Qe,jx as Xe,bW as Ke,jy as Ge,jz as Je,jA as Ze,jB as et,jC as tt}from"./tool-windows-pGtQqqCf.js";const ve=5;function me(e,i,s){const c=Math.max(0,window.innerWidth-i),y=Math.max(0,window.innerHeight-s);return{x:Math.max(0,Math.min(e.x,c)),y:Math.max(0,Math.min(e.y,y))}}function at(e){try{const i=localStorage.getItem(e);if(!i)return null;const s=JSON.parse(i);if(typeof s.x=="number"&&typeof s.y=="number")return s}catch{}return null}function nt(e,i){try{localStorage.setItem(e,JSON.stringify(i))}catch{}}function st(e){const{storageKey:i,enabled:s=!0}=e,[c,y]=n.useState(()=>s?at(i):null),[m,b]=n.useState(!1),w=n.useRef(!1),h=n.useRef(null),I=n.useRef(null),_=n.useCallback(f=>{if(!s||f.button!==0)return;const v=I.current;if(!v)return;const p=v.getBoundingClientRect();h.current={startPointerX:f.clientX,startPointerY:f.clientY,startElX:p.left,startElY:p.top,activated:!1,frameId:0}},[s]);n.useEffect(()=>{if(!s)return;const f=p=>{const u=h.current;if(!u)return;const g=p.clientX-u.startPointerX,M=p.clientY-u.startPointerY;if(!u.activated){if(Math.abs(g)<ve&&Math.abs(M)<ve)return;u.activated=!0,b(!0)}cancelAnimationFrame(u.frameId),u.frameId=requestAnimationFrame(()=>{const S=I.current;if(!S)return;const d=me({x:u.startElX+g,y:u.startElY+M},S.offsetWidth,S.offsetHeight);y(d)})},v=()=>{const p=h.current;if(!p)return;cancelAnimationFrame(p.frameId);const u=p.activated;h.current=null,b(!1),u&&(w.current=!0,requestAnimationFrame(()=>{w.current=!1}),y(g=>(g&&nt(i,g),g)))};return window.addEventListener("pointermove",f),window.addEventListener("pointerup",v),()=>{window.removeEventListener("pointermove",f),window.removeEventListener("pointerup",v)}},[s,i]),n.useEffect(()=>{if(!s||!c)return;const f=()=>{const v=I.current;v&&y(p=>p&&me(p,v.offsetWidth,v.offsetHeight))};return window.addEventListener("resize",f),()=>window.removeEventListener("resize",f)},[s,!!c]);const P=n.useCallback(()=>{y(null);try{localStorage.removeItem(i)}catch{}},[i]);return{position:c,isDragging:m,wasDraggedRef:w,elementRef:I,handlePointerDown:_,resetPosition:P}}const ot=({volume:e,onVolumeChange:i})=>{const s=n.useRef(null),c=n.useRef(null),y=n.useRef(!1),m=n.useRef(!1),b=n.useRef(!1),[w,h]=n.useState(!1),[I,_]=n.useState(!1),[P,f]=n.useState(!1),v=Math.round(e*100),p={"--canvas-audio-progress":`${e*100}%`},u=()=>{c.current!==null&&(window.clearTimeout(c.current),c.current=null)},g=()=>{u(),h(!0)},M=()=>{u(),h(d=>!d)},S=()=>{u(),!(m.current||b.current)&&(c.current=window.setTimeout(()=>{h(!1)},180))};return n.useEffect(()=>{m.current=I},[I]),n.useEffect(()=>{b.current=P},[P]),n.useEffect(()=>()=>u(),[]),n.useEffect(()=>{if(!w)return;const d=x=>{var k;(k=s.current)!=null&&k.contains(x.target)||(u(),h(!1),f(!1),_(!1),y.current=!1)};return document.addEventListener("pointerdown",d,!0),()=>document.removeEventListener("pointerdown",d,!0)},[w]),n.useEffect(()=>{if(!P)return;const d=()=>{b.current=!1,f(!1),m.current||(u(),c.current=window.setTimeout(()=>{h(!1)},180))};return window.addEventListener("pointerup",d),()=>window.removeEventListener("pointerup",d)},[P]),t.jsx("div",{ref:s,className:he("canvas-audio-player__volume",{"canvas-audio-player__volume--expanded":w}),onPointerDown:d=>d.stopPropagation(),onMouseEnter:()=>{m.current=!0,_(!0),u()},onMouseLeave:()=>{m.current=!1,_(!1),S()},onBlur:d=>{var k;const x=d.relatedTarget;x&&((k=s.current)!=null&&k.contains(x))||S()},children:t.jsxs("div",{className:"canvas-audio-player__volume-shell",children:[t.jsx("div",{className:"canvas-audio-player__volume-slider-wrap",children:t.jsx("input",{type:"range",min:0,max:1,step:.01,value:e,onFocus:g,onPointerDown:d=>{d.stopPropagation(),b.current=!0,f(!0),g()},onChange:d=>i(Number(d.target.value)),className:"canvas-audio-player__slider canvas-audio-player__slider--volume",style:p,"aria-label":"Playback volume","aria-valuetext":`${v}%`})}),t.jsxs("span",{className:"canvas-audio-player__volume-value",children:[v,"%"]}),t.jsx(N,{content:"音量",children:t.jsx("button",{type:"button",className:"canvas-audio-player__volume-toggle",onPointerDown:d=>{d.stopPropagation(),y.current=!0},onClick:()=>{y.current=!1,M()},onFocus:()=>{y.current||g()},onBlur:()=>{y.current=!1},"aria-label":"Volume controls","aria-expanded":w,children:e<=.01?t.jsx(ke,{size:16}):t.jsx(Ae,{size:16})})})]})})},ge="asset:";function it(e){var i;return(i=e==null?void 0:e.elementId)!=null&&i.startsWith(ge)?e.elementId.slice(ge.length):null}function xe(e){if(typeof e!="number"||!Number.isFinite(e)||e<=0)return"--:--";const i=Math.floor(e),s=Math.floor(i/60),c=i%60;return`${s}:${String(c).padStart(2,"0")}`}function lt(e){var s;const i=((s=e.segments[e.segments.length-1])==null?void 0:s.endMs)||0;return xe(i/1e3)}const rt=({queue:e,activeQueueIndex:i,queueSource:s,activePlaylistId:c,playing:y=!1,activeReadingSourceId:m,onSelect:b,onPlayAllTracksItem:w})=>{const{assets:h}=Se(),{playlists:I,playlistItems:_,favoriteAssetIds:P,createPlaylist:f,addAssetToPlaylist:v,removeAssetFromPlaylist:p,toggleFavorite:u}=Te(),{contextMenu:g,openAt:M,close:S}=Le(),[d,x]=n.useState(!1),[k,E]=n.useState(""),[F,T]=n.useState(null),{noteMetas:z,loadReadingSource:Q,buildReadingQueue:X}=Ee(),[q,Y]=n.useState(s==="reading"?ue:J),V=q===ue,R=s==="playlist"&&c?c:J,L=e.filter(a=>!U(a)),ee=Ce(L),K=a=>{const o=it(a);if(o)return o;if(!(a!=null&&a.audioUrl))return null;const r=h.find(j=>j.type===ze.AUDIO&&j.url===a.audioUrl);return(r==null?void 0:r.id)||null},B=n.useMemo(()=>new Set(R!==J?(_[R]||[]).map(a=>a.assetId?Ne({kind:"asset",assetId:a.assetId}):null).filter(a=>!!a):[]),[_,R]),D=n.useCallback(async a=>{if(w){w(a);return}const o=await Q(a);o&&(await X(a),b(o))},[w,Q,X,b]),$=n.useMemo(()=>z.map(a=>({id:a.id,title:a.title||"未命名笔记",subtitle:new Date(a.updatedAt).toLocaleDateString("zh-CN"),canFavorite:!1,isActive:(m==null?void 0:m.includes(a.id))===!0,isPlaying:y&&(m==null?void 0:m.includes(a.id))===!0})),[z,m,y]);return s==="reading"?t.jsxs("div",{className:"canvas-audio-player__playlist",children:[t.jsx(de,{className:"canvas-audio-player__playlist-tabs",selectedPlaylistId:q,allCount:L.length,allTracksCount:z.length,playlists:I,playlistItems:_,onSelect:Y,onCreate:()=>{E(""),x(!0)}}),V?$.length===0?t.jsxs("div",{className:"canvas-audio-player__playlist-empty",children:[t.jsx(pe,{size:16}),t.jsx("span",{children:"知识库还没有笔记"})]}):t.jsx(Z,{className:"canvas-audio-player__playlist-list",items:$,onSelect:a=>void D(a.id),onTogglePlayback:a=>void D(a.id),showPlaybackIndicator:!0}):t.jsx(Z,{className:"canvas-audio-player__playlist-list audio-track-list--queue",items:e.map((a,o)=>{const r=a;return{id:r.readingSourceId,title:r.title||"朗读轨道",subtitle:lt(r),previewImageUrl:r.previewImageUrl,isActive:o===i,isPlaying:o===i,canFavorite:!1}}),onSelect:a=>{const o=e.find(r=>U(r)&&r.readingSourceId===a.id);o&&b(o)},onTogglePlayback:a=>{const o=e.find(r=>U(r)&&r.readingSourceId===a.id);o&&b(o)},showPlaybackIndicator:!0})]}):t.jsxs("div",{className:"canvas-audio-player__playlist",children:[t.jsx(de,{className:"canvas-audio-player__playlist-tabs",selectedPlaylistId:q,allCount:L.length,allTracksCount:z.length,playlists:I,playlistItems:_,onSelect:Y,onCreate:()=>{E(""),x(!0)}}),V?$.length===0?t.jsxs("div",{className:"canvas-audio-player__playlist-empty",children:[t.jsx(pe,{size:16}),t.jsx("span",{children:"知识库还没有笔记"})]}):t.jsx(Z,{className:"canvas-audio-player__playlist-list",items:$,onSelect:a=>void D(a.id),onTogglePlayback:a=>void D(a.id),showPlaybackIndicator:!0}):t.jsx(Z,{className:"canvas-audio-player__playlist-list audio-track-list--queue",items:L.map((a,o)=>{const r=K(a);return{id:`${a.audioUrl}-${o}`,title:a.title||"未命名音频",subtitle:xe(ee.get(a.audioUrl)??a.duration),previewImageUrl:a.previewImageUrl,isActive:o===i,isPlaying:o===i,isFavorite:r?P.has(r):!1,canFavorite:!!r}}),onSelect:a=>{const o=L.find((r,j)=>`${r.audioUrl}-${j}`===a.id);o&&b(o)},onContextMenu:(a,o)=>{const r=L.find((H,te)=>`${H.audioUrl}-${te}`===a.id),j=K(r);j&&(o.preventDefault(),o.stopPropagation(),M(o.clientX,o.clientY,{kind:"asset",assetId:j}))},onToggleFavorite:a=>{const o=L.find((j,H)=>`${j.audioUrl}-${H}`===a.id),r=K(o);r&&u(r)},onTogglePlayback:a=>{const o=L.find((r,j)=>`${r.audioUrl}-${j}`===a.id);o&&b(o)},showFavoriteButton:!0,showPlaybackIndicator:!0}),t.jsx(Me,{contextMenu:g?{x:g.x,y:g.y,item:g.payload}:null,playlists:I,playlistItems:_,favoriteAssetIds:P,selectedPlaylistId:R===J?null:R,currentPlaylistItemKeys:B,onClose:S,onToggleFavorite:a=>void u(a),onAddToPlaylist:(a,o)=>{a.kind==="asset"&&v(a.assetId,o)},onRemoveFromPlaylist:(a,o)=>{a.kind==="asset"&&p(a.assetId,o)},onCreatePlaylistAndAdd:a=>{a.kind==="asset"&&(T(a.assetId),E(""),x(!0))}}),t.jsx(Re,{visible:d,header:"新建播放列表",onClose:()=>x(!1),onConfirm:async()=>{const a=await f(k);F&&await v(F,a.id),x(!1),E(""),T(null)},onCancel:()=>{x(!1),T(null)},confirmBtn:"确定",cancelBtn:"取消",children:t.jsx(De,{value:k,onChange:a=>E(String(a)),placeholder:"请输入播放列表名称"})})]})},we={sequential:t.jsx(et,{size:14}),"list-loop":t.jsx(Ze,{size:14}),"single-loop":t.jsx(Je,{size:14}),shuffle:t.jsx(Ge,{size:14})},ct=Object.keys(le).map(e=>({value:e,content:le[e],prefixIcon:we[e]}));function ut(e,i){return tt(i).map(s=>{const c=_e(s),y=Math.abs(s-e)<.001;return{value:s,content:y?`✓ ${c}`:c}})}function be(e){if(typeof e!="number"||!Number.isFinite(e)||e<=0)return"--:--";const i=Math.floor(e),s=Math.floor(i/60),c=i%60;return`${s}:${String(c).padStart(2,"0")}`}const yt=()=>{const e=$e(),i=n.useRef(null),[s,c]=n.useState(!1),[y,m]=n.useState(()=>{const l=oe.getToolState(ye);return(l==null?void 0:l.status)==="open"}),[b,w]=n.useState(()=>{try{return localStorage.getItem(ie.AUDIO_PLAYER_LAYOUT)==="vertical"?"vertical":"horizontal"}catch{return"horizontal"}}),[h,I]=n.useState(()=>typeof window<"u"?window.innerWidth:1024);n.useEffect(()=>{const l=()=>I(window.innerWidth);return window.addEventListener("resize",l),window.addEventListener("orientationchange",l),()=>{window.removeEventListener("resize",l),window.removeEventListener("orientationchange",l)}},[]);const _=h<=768?"vertical":b,[P,f]=n.useState(null),v=h<=768,{position:p,isDragging:u,wasDraggedRef:g,elementRef:M,handlePointerDown:S}=st({storageKey:ie.AUDIO_PLAYER_POSITION,enabled:!v}),d=n.useMemo(()=>!e.duration||e.duration<=0?0:Math.max(0,Math.min(100,e.currentTime/e.duration*100)),[e.currentTime,e.duration]),x=Number.isFinite(e.currentTime)?e.currentTime:0,k=Number.isFinite(e.duration)?e.duration:0,E=be(x),F=be(k),T=e.activeQueueIndex>=0?e.queue[e.activeQueueIndex]:null,z=e.activeTitle||(U(T)?T.title:void 0),Q=e.activePreviewImageUrl||(U(T)?T.previewImageUrl:void 0),X=e.activeQueueIndex>0,q=e.activeQueueIndex>=0&&e.activeQueueIndex<e.queue.length-1,Y=e.queue.length>1&&e.activeQueueIndex>=0,V=Y?`${e.activeQueueIndex+1}/${e.queue.length}`:null,R=e.queueSource==="playlist"?e.activePlaylistName||"播放列表":e.activePlaylistName||(e.queueSource==="reading"?"朗读轨道":"画布音频"),L=Y?`${R} ${e.activeQueueIndex+1} / ${e.queue.length}`:R,ee=V?`${V} · ${E} / ${F}`:`${E} / ${F}`,B=e.queueSource==="reading"&&(!!e.activeReadingSourceId||T!==null&&U(T))||!!e.activeAudioUrl,D=e.mediaType==="audio",$=e.mediaType==="reading"?"reading":"audio",a=le[e.playbackMode],o=we[e.playbackMode],r=n.useMemo(()=>ut(e.effectivePlaybackRate,$),[e.effectivePlaybackRate,$]),j=_e(e.effectivePlaybackRate),H=`${e.mediaType==="reading"?"语音速度":"播放速度"} ${j}`,te={"--canvas-audio-progress":`${d}%`},Pe=n.useCallback(()=>{w(l=>{const A=l==="horizontal"?"vertical":"horizontal";try{localStorage.setItem(ie.AUDIO_PLAYER_LAYOUT,A)}catch{}return A})},[]),je=n.useCallback(async()=>{try{e.playing?e.pausePlayback():await e.resumePlayback()}catch{}},[e]);if(n.useEffect(()=>{if(!B){c(!1),f(null);return}let l=0;const A=()=>{const ce=document.querySelector(".ai-input-bar__container");if(!(ce instanceof HTMLElement)){f(null);return}const se=ce.getBoundingClientRect(),G={left:Math.round(se.left),width:Math.round(se.width),bottom:Math.max(0,Math.round(window.innerHeight-se.top))};f(W=>W&&W.left===G.left&&W.width===G.width&&W.bottom===G.bottom?W:G)},C=()=>{window.cancelAnimationFrame(l),l=window.requestAnimationFrame(A)},ae=document.querySelector(".ai-input-bar__container"),ne=document.querySelector(".ai-input-bar"),O=typeof ResizeObserver<"u"?new ResizeObserver(()=>C()):null;return O&&ae instanceof HTMLElement&&O.observe(ae),O&&ne instanceof HTMLElement&&ne!==ae&&O.observe(ne),C(),window.addEventListener("resize",C),window.addEventListener("orientationchange",C),()=>{window.cancelAnimationFrame(l),window.removeEventListener("resize",C),window.removeEventListener("orientationchange",C),O==null||O.disconnect()}},[B]),n.useEffect(()=>{if(!s)return;const l=A=>{var C;(C=i.current)!=null&&C.contains(A.target)||c(!1)};return document.addEventListener("pointerdown",l,!0),()=>document.removeEventListener("pointerdown",l,!0)},[s]),n.useEffect(()=>{M.current=i.current}),n.useEffect(()=>{const l=oe.observeToolStates().subscribe(()=>{const A=oe.getToolState(ye);m((A==null?void 0:A.status)==="open")});return()=>l.unsubscribe()},[]),!B||y)return null;const Ie=p&&!v?{left:p.x,top:p.y}:{},re={...P?{"--canvas-audio-mobile-left":`${P.left}px`,"--canvas-audio-mobile-width":`${P.width}px`,"--canvas-audio-mobile-offset":`${P.bottom}px`}:{},...Ie};return t.jsxs("div",{ref:i,className:he("canvas-audio-player",{"canvas-audio-player--playlist-open":s,"canvas-audio-player--positioned":!!p,"canvas-audio-player--dragging":u,"canvas-audio-player--vertical":_==="vertical"}),style:Object.keys(re).length>0?re:void 0,children:[t.jsxs("button",{type:"button",className:"canvas-audio-player__queue-trigger",onPointerDown:S,onClick:()=>{g.current||c(l=>!l)},"aria-expanded":s,"aria-label":"切换播放列表",children:[t.jsx("div",{className:"canvas-audio-player__cover",children:t.jsx(Oe,{src:Q,alt:z||"Audio cover",fallbackClassName:"canvas-audio-player__cover-fallback",iconSize:16})}),t.jsxs("div",{className:"canvas-audio-player__meta",children:[t.jsx("div",{className:"canvas-audio-player__title",children:z||"未命名音频"}),t.jsxs("div",{className:"canvas-audio-player__subtitle",children:[t.jsx("span",{className:"canvas-audio-player__subtitle-text canvas-audio-player__subtitle-text--desktop",children:L}),t.jsx("span",{className:"canvas-audio-player__subtitle-text canvas-audio-player__subtitle-text--mobile",children:ee})]})]}),t.jsx("span",{className:"canvas-audio-player__queue-indicator","aria-hidden":"true",children:t.jsx(Ue,{size:14})})]}),t.jsxs("div",{className:"canvas-audio-player__controls",children:[t.jsx(N,{content:"上一首",children:t.jsx("button",{type:"button",className:"canvas-audio-player__action canvas-audio-player__action--previous",onClick:()=>void e.playPrevious(),disabled:!X,children:t.jsx(Fe,{size:14})})}),t.jsx(N,{content:e.playing?"暂停":"播放",children:t.jsx("button",{type:"button",className:"canvas-audio-player__action canvas-audio-player__action--primary",onClick:()=>void je(),children:e.playing?t.jsx(qe,{size:14}):t.jsx(Ye,{size:14})})}),t.jsx(N,{content:"下一首",children:t.jsx("button",{type:"button",className:"canvas-audio-player__action canvas-audio-player__action--next",onClick:()=>void e.playNext(),disabled:!q,children:t.jsx(Ve,{size:14})})})]}),t.jsxs("div",{className:"canvas-audio-player__progress",children:[t.jsx("span",{className:"canvas-audio-player__time",children:E}),t.jsx("input",{type:"range",min:0,max:k||0,step:.1,value:Math.min(x,k||x),onChange:l=>{D&&e.seekTo(Number(l.target.value))},className:"canvas-audio-player__slider canvas-audio-player__slider--progress",style:te,"aria-label":D?"Audio progress":"Reading progress",disabled:!D}),t.jsx("span",{className:"canvas-audio-player__time",children:F})]}),t.jsx(ot,{volume:e.volume,onVolumeChange:e.setVolume}),t.jsx(fe,{options:r,trigger:"click",placement:"bottom",minColumnWidth:112,onClick:l=>e.setPlaybackRate(Number(l.value)),children:t.jsx(N,{content:H,children:t.jsx("button",{type:"button",className:"canvas-audio-player__toggle canvas-audio-player__speed-toggle","aria-label":`切换播放速度,当前${j}`,children:t.jsx(Be,{size:14})})})}),t.jsx(fe,{options:ct,trigger:"click",placement:"bottom",minColumnWidth:132,onClick:l=>e.setPlaybackMode(l.value),children:t.jsx(N,{content:a,children:t.jsx("button",{type:"button",className:"canvas-audio-player__toggle canvas-audio-player__mode-toggle","aria-label":`切换播放模式,当前${a}`,children:o})})}),t.jsx(N,{content:"打开播放器工具",children:t.jsx("button",{type:"button",className:"canvas-audio-player__toggle canvas-audio-player__player-switch canvas-audio-player__switch-toggle",onClick:()=>{We(async()=>{const{openMusicPlayerTool:l}=await import("./tool-windows-pGtQqqCf.js").then(A=>A.oR);return{openMusicPlayerTool:l}},__vite__mapDeps([0]),import.meta.url).then(({openMusicPlayerTool:l})=>{l()})},"aria-label":"打开播放器工具",children:t.jsx(He,{size:14})})}),t.jsx(N,{content:_==="horizontal"?"切换为垂直布局":"切换为水平布局",children:t.jsx("button",{type:"button",className:"canvas-audio-player__toggle canvas-audio-player__layout-toggle",onClick:Pe,style:{display:h<=768?"none":""},children:_==="horizontal"?t.jsx(Qe,{size:14}):t.jsx(Xe,{size:14})})}),t.jsx(N,{content:"关闭播放器",children:t.jsx("button",{type:"button",className:"canvas-audio-player__close",onClick:e.stopPlayback,children:t.jsx(Ke,{size:14})})}),s?t.jsx(rt,{queue:e.queue,activeQueueIndex:e.activeQueueIndex,queueSource:e.queueSource,activePlaylistId:e.activePlaylistId,playing:e.playing,activeReadingSourceId:e.activeReadingSourceId,onSelect:l=>{U(l)?e.toggleReadingPlayback(l):e.togglePlayback(l),c(!1)}}):null]})};export{yt as CanvasAudioPlayer};
|
|
2
|
+
import{r as n,y as t,z as he,bV as N,cP as ke,cQ as Ae,hs as Se,jc as Te,iR as Le,jd as Ee,je as ue,jf as J,jg as U,jh as Ce,ji as Ne,jj as de,ho as pe,jk as Z,jl as Me,cr as Re,ig as De,as as ze,cy as $e,hF as oe,jm as ye,gP as ie,jn as le,jo as _e,jp as Oe,bw as Ue,jq as Fe,jr as qe,da as Ye,js as Ve,jt as fe,ju as Be,jv as He,_ as We,jw as Qe,jx as Xe,bW as Ke,jy as Ge,jz as Je,jA as Ze,jB as et,jC as tt}from"./tool-windows-C4D0lII2.js";const ve=5;function me(e,i,s){const c=Math.max(0,window.innerWidth-i),y=Math.max(0,window.innerHeight-s);return{x:Math.max(0,Math.min(e.x,c)),y:Math.max(0,Math.min(e.y,y))}}function at(e){try{const i=localStorage.getItem(e);if(!i)return null;const s=JSON.parse(i);if(typeof s.x=="number"&&typeof s.y=="number")return s}catch{}return null}function nt(e,i){try{localStorage.setItem(e,JSON.stringify(i))}catch{}}function st(e){const{storageKey:i,enabled:s=!0}=e,[c,y]=n.useState(()=>s?at(i):null),[m,b]=n.useState(!1),w=n.useRef(!1),h=n.useRef(null),I=n.useRef(null),_=n.useCallback(f=>{if(!s||f.button!==0)return;const v=I.current;if(!v)return;const p=v.getBoundingClientRect();h.current={startPointerX:f.clientX,startPointerY:f.clientY,startElX:p.left,startElY:p.top,activated:!1,frameId:0}},[s]);n.useEffect(()=>{if(!s)return;const f=p=>{const u=h.current;if(!u)return;const g=p.clientX-u.startPointerX,M=p.clientY-u.startPointerY;if(!u.activated){if(Math.abs(g)<ve&&Math.abs(M)<ve)return;u.activated=!0,b(!0)}cancelAnimationFrame(u.frameId),u.frameId=requestAnimationFrame(()=>{const S=I.current;if(!S)return;const d=me({x:u.startElX+g,y:u.startElY+M},S.offsetWidth,S.offsetHeight);y(d)})},v=()=>{const p=h.current;if(!p)return;cancelAnimationFrame(p.frameId);const u=p.activated;h.current=null,b(!1),u&&(w.current=!0,requestAnimationFrame(()=>{w.current=!1}),y(g=>(g&&nt(i,g),g)))};return window.addEventListener("pointermove",f),window.addEventListener("pointerup",v),()=>{window.removeEventListener("pointermove",f),window.removeEventListener("pointerup",v)}},[s,i]),n.useEffect(()=>{if(!s||!c)return;const f=()=>{const v=I.current;v&&y(p=>p&&me(p,v.offsetWidth,v.offsetHeight))};return window.addEventListener("resize",f),()=>window.removeEventListener("resize",f)},[s,!!c]);const P=n.useCallback(()=>{y(null);try{localStorage.removeItem(i)}catch{}},[i]);return{position:c,isDragging:m,wasDraggedRef:w,elementRef:I,handlePointerDown:_,resetPosition:P}}const ot=({volume:e,onVolumeChange:i})=>{const s=n.useRef(null),c=n.useRef(null),y=n.useRef(!1),m=n.useRef(!1),b=n.useRef(!1),[w,h]=n.useState(!1),[I,_]=n.useState(!1),[P,f]=n.useState(!1),v=Math.round(e*100),p={"--canvas-audio-progress":`${e*100}%`},u=()=>{c.current!==null&&(window.clearTimeout(c.current),c.current=null)},g=()=>{u(),h(!0)},M=()=>{u(),h(d=>!d)},S=()=>{u(),!(m.current||b.current)&&(c.current=window.setTimeout(()=>{h(!1)},180))};return n.useEffect(()=>{m.current=I},[I]),n.useEffect(()=>{b.current=P},[P]),n.useEffect(()=>()=>u(),[]),n.useEffect(()=>{if(!w)return;const d=x=>{var k;(k=s.current)!=null&&k.contains(x.target)||(u(),h(!1),f(!1),_(!1),y.current=!1)};return document.addEventListener("pointerdown",d,!0),()=>document.removeEventListener("pointerdown",d,!0)},[w]),n.useEffect(()=>{if(!P)return;const d=()=>{b.current=!1,f(!1),m.current||(u(),c.current=window.setTimeout(()=>{h(!1)},180))};return window.addEventListener("pointerup",d),()=>window.removeEventListener("pointerup",d)},[P]),t.jsx("div",{ref:s,className:he("canvas-audio-player__volume",{"canvas-audio-player__volume--expanded":w}),onPointerDown:d=>d.stopPropagation(),onMouseEnter:()=>{m.current=!0,_(!0),u()},onMouseLeave:()=>{m.current=!1,_(!1),S()},onBlur:d=>{var k;const x=d.relatedTarget;x&&((k=s.current)!=null&&k.contains(x))||S()},children:t.jsxs("div",{className:"canvas-audio-player__volume-shell",children:[t.jsx("div",{className:"canvas-audio-player__volume-slider-wrap",children:t.jsx("input",{type:"range",min:0,max:1,step:.01,value:e,onFocus:g,onPointerDown:d=>{d.stopPropagation(),b.current=!0,f(!0),g()},onChange:d=>i(Number(d.target.value)),className:"canvas-audio-player__slider canvas-audio-player__slider--volume",style:p,"aria-label":"Playback volume","aria-valuetext":`${v}%`})}),t.jsxs("span",{className:"canvas-audio-player__volume-value",children:[v,"%"]}),t.jsx(N,{content:"音量",children:t.jsx("button",{type:"button",className:"canvas-audio-player__volume-toggle",onPointerDown:d=>{d.stopPropagation(),y.current=!0},onClick:()=>{y.current=!1,M()},onFocus:()=>{y.current||g()},onBlur:()=>{y.current=!1},"aria-label":"Volume controls","aria-expanded":w,children:e<=.01?t.jsx(ke,{size:16}):t.jsx(Ae,{size:16})})})]})})},ge="asset:";function it(e){var i;return(i=e==null?void 0:e.elementId)!=null&&i.startsWith(ge)?e.elementId.slice(ge.length):null}function xe(e){if(typeof e!="number"||!Number.isFinite(e)||e<=0)return"--:--";const i=Math.floor(e),s=Math.floor(i/60),c=i%60;return`${s}:${String(c).padStart(2,"0")}`}function lt(e){var s;const i=((s=e.segments[e.segments.length-1])==null?void 0:s.endMs)||0;return xe(i/1e3)}const rt=({queue:e,activeQueueIndex:i,queueSource:s,activePlaylistId:c,playing:y=!1,activeReadingSourceId:m,onSelect:b,onPlayAllTracksItem:w})=>{const{assets:h}=Se(),{playlists:I,playlistItems:_,favoriteAssetIds:P,createPlaylist:f,addAssetToPlaylist:v,removeAssetFromPlaylist:p,toggleFavorite:u}=Te(),{contextMenu:g,openAt:M,close:S}=Le(),[d,x]=n.useState(!1),[k,E]=n.useState(""),[F,T]=n.useState(null),{noteMetas:z,loadReadingSource:Q,buildReadingQueue:X}=Ee(),[q,Y]=n.useState(s==="reading"?ue:J),V=q===ue,R=s==="playlist"&&c?c:J,L=e.filter(a=>!U(a)),ee=Ce(L),K=a=>{const o=it(a);if(o)return o;if(!(a!=null&&a.audioUrl))return null;const r=h.find(j=>j.type===ze.AUDIO&&j.url===a.audioUrl);return(r==null?void 0:r.id)||null},B=n.useMemo(()=>new Set(R!==J?(_[R]||[]).map(a=>a.assetId?Ne({kind:"asset",assetId:a.assetId}):null).filter(a=>!!a):[]),[_,R]),D=n.useCallback(async a=>{if(w){w(a);return}const o=await Q(a);o&&(await X(a),b(o))},[w,Q,X,b]),$=n.useMemo(()=>z.map(a=>({id:a.id,title:a.title||"未命名笔记",subtitle:new Date(a.updatedAt).toLocaleDateString("zh-CN"),canFavorite:!1,isActive:(m==null?void 0:m.includes(a.id))===!0,isPlaying:y&&(m==null?void 0:m.includes(a.id))===!0})),[z,m,y]);return s==="reading"?t.jsxs("div",{className:"canvas-audio-player__playlist",children:[t.jsx(de,{className:"canvas-audio-player__playlist-tabs",selectedPlaylistId:q,allCount:L.length,allTracksCount:z.length,playlists:I,playlistItems:_,onSelect:Y,onCreate:()=>{E(""),x(!0)}}),V?$.length===0?t.jsxs("div",{className:"canvas-audio-player__playlist-empty",children:[t.jsx(pe,{size:16}),t.jsx("span",{children:"知识库还没有笔记"})]}):t.jsx(Z,{className:"canvas-audio-player__playlist-list",items:$,onSelect:a=>void D(a.id),onTogglePlayback:a=>void D(a.id),showPlaybackIndicator:!0}):t.jsx(Z,{className:"canvas-audio-player__playlist-list audio-track-list--queue",items:e.map((a,o)=>{const r=a;return{id:r.readingSourceId,title:r.title||"朗读轨道",subtitle:lt(r),previewImageUrl:r.previewImageUrl,isActive:o===i,isPlaying:o===i,canFavorite:!1}}),onSelect:a=>{const o=e.find(r=>U(r)&&r.readingSourceId===a.id);o&&b(o)},onTogglePlayback:a=>{const o=e.find(r=>U(r)&&r.readingSourceId===a.id);o&&b(o)},showPlaybackIndicator:!0})]}):t.jsxs("div",{className:"canvas-audio-player__playlist",children:[t.jsx(de,{className:"canvas-audio-player__playlist-tabs",selectedPlaylistId:q,allCount:L.length,allTracksCount:z.length,playlists:I,playlistItems:_,onSelect:Y,onCreate:()=>{E(""),x(!0)}}),V?$.length===0?t.jsxs("div",{className:"canvas-audio-player__playlist-empty",children:[t.jsx(pe,{size:16}),t.jsx("span",{children:"知识库还没有笔记"})]}):t.jsx(Z,{className:"canvas-audio-player__playlist-list",items:$,onSelect:a=>void D(a.id),onTogglePlayback:a=>void D(a.id),showPlaybackIndicator:!0}):t.jsx(Z,{className:"canvas-audio-player__playlist-list audio-track-list--queue",items:L.map((a,o)=>{const r=K(a);return{id:`${a.audioUrl}-${o}`,title:a.title||"未命名音频",subtitle:xe(ee.get(a.audioUrl)??a.duration),previewImageUrl:a.previewImageUrl,isActive:o===i,isPlaying:o===i,isFavorite:r?P.has(r):!1,canFavorite:!!r}}),onSelect:a=>{const o=L.find((r,j)=>`${r.audioUrl}-${j}`===a.id);o&&b(o)},onContextMenu:(a,o)=>{const r=L.find((H,te)=>`${H.audioUrl}-${te}`===a.id),j=K(r);j&&(o.preventDefault(),o.stopPropagation(),M(o.clientX,o.clientY,{kind:"asset",assetId:j}))},onToggleFavorite:a=>{const o=L.find((j,H)=>`${j.audioUrl}-${H}`===a.id),r=K(o);r&&u(r)},onTogglePlayback:a=>{const o=L.find((r,j)=>`${r.audioUrl}-${j}`===a.id);o&&b(o)},showFavoriteButton:!0,showPlaybackIndicator:!0}),t.jsx(Me,{contextMenu:g?{x:g.x,y:g.y,item:g.payload}:null,playlists:I,playlistItems:_,favoriteAssetIds:P,selectedPlaylistId:R===J?null:R,currentPlaylistItemKeys:B,onClose:S,onToggleFavorite:a=>void u(a),onAddToPlaylist:(a,o)=>{a.kind==="asset"&&v(a.assetId,o)},onRemoveFromPlaylist:(a,o)=>{a.kind==="asset"&&p(a.assetId,o)},onCreatePlaylistAndAdd:a=>{a.kind==="asset"&&(T(a.assetId),E(""),x(!0))}}),t.jsx(Re,{visible:d,header:"新建播放列表",onClose:()=>x(!1),onConfirm:async()=>{const a=await f(k);F&&await v(F,a.id),x(!1),E(""),T(null)},onCancel:()=>{x(!1),T(null)},confirmBtn:"确定",cancelBtn:"取消",children:t.jsx(De,{value:k,onChange:a=>E(String(a)),placeholder:"请输入播放列表名称"})})]})},we={sequential:t.jsx(et,{size:14}),"list-loop":t.jsx(Ze,{size:14}),"single-loop":t.jsx(Je,{size:14}),shuffle:t.jsx(Ge,{size:14})},ct=Object.keys(le).map(e=>({value:e,content:le[e],prefixIcon:we[e]}));function ut(e,i){return tt(i).map(s=>{const c=_e(s),y=Math.abs(s-e)<.001;return{value:s,content:y?`✓ ${c}`:c}})}function be(e){if(typeof e!="number"||!Number.isFinite(e)||e<=0)return"--:--";const i=Math.floor(e),s=Math.floor(i/60),c=i%60;return`${s}:${String(c).padStart(2,"0")}`}const yt=()=>{const e=$e(),i=n.useRef(null),[s,c]=n.useState(!1),[y,m]=n.useState(()=>{const l=oe.getToolState(ye);return(l==null?void 0:l.status)==="open"}),[b,w]=n.useState(()=>{try{return localStorage.getItem(ie.AUDIO_PLAYER_LAYOUT)==="vertical"?"vertical":"horizontal"}catch{return"horizontal"}}),[h,I]=n.useState(()=>typeof window<"u"?window.innerWidth:1024);n.useEffect(()=>{const l=()=>I(window.innerWidth);return window.addEventListener("resize",l),window.addEventListener("orientationchange",l),()=>{window.removeEventListener("resize",l),window.removeEventListener("orientationchange",l)}},[]);const _=h<=768?"vertical":b,[P,f]=n.useState(null),v=h<=768,{position:p,isDragging:u,wasDraggedRef:g,elementRef:M,handlePointerDown:S}=st({storageKey:ie.AUDIO_PLAYER_POSITION,enabled:!v}),d=n.useMemo(()=>!e.duration||e.duration<=0?0:Math.max(0,Math.min(100,e.currentTime/e.duration*100)),[e.currentTime,e.duration]),x=Number.isFinite(e.currentTime)?e.currentTime:0,k=Number.isFinite(e.duration)?e.duration:0,E=be(x),F=be(k),T=e.activeQueueIndex>=0?e.queue[e.activeQueueIndex]:null,z=e.activeTitle||(U(T)?T.title:void 0),Q=e.activePreviewImageUrl||(U(T)?T.previewImageUrl:void 0),X=e.activeQueueIndex>0,q=e.activeQueueIndex>=0&&e.activeQueueIndex<e.queue.length-1,Y=e.queue.length>1&&e.activeQueueIndex>=0,V=Y?`${e.activeQueueIndex+1}/${e.queue.length}`:null,R=e.queueSource==="playlist"?e.activePlaylistName||"播放列表":e.activePlaylistName||(e.queueSource==="reading"?"朗读轨道":"画布音频"),L=Y?`${R} ${e.activeQueueIndex+1} / ${e.queue.length}`:R,ee=V?`${V} · ${E} / ${F}`:`${E} / ${F}`,B=e.queueSource==="reading"&&(!!e.activeReadingSourceId||T!==null&&U(T))||!!e.activeAudioUrl,D=e.mediaType==="audio",$=e.mediaType==="reading"?"reading":"audio",a=le[e.playbackMode],o=we[e.playbackMode],r=n.useMemo(()=>ut(e.effectivePlaybackRate,$),[e.effectivePlaybackRate,$]),j=_e(e.effectivePlaybackRate),H=`${e.mediaType==="reading"?"语音速度":"播放速度"} ${j}`,te={"--canvas-audio-progress":`${d}%`},Pe=n.useCallback(()=>{w(l=>{const A=l==="horizontal"?"vertical":"horizontal";try{localStorage.setItem(ie.AUDIO_PLAYER_LAYOUT,A)}catch{}return A})},[]),je=n.useCallback(async()=>{try{e.playing?e.pausePlayback():await e.resumePlayback()}catch{}},[e]);if(n.useEffect(()=>{if(!B){c(!1),f(null);return}let l=0;const A=()=>{const ce=document.querySelector(".ai-input-bar__container");if(!(ce instanceof HTMLElement)){f(null);return}const se=ce.getBoundingClientRect(),G={left:Math.round(se.left),width:Math.round(se.width),bottom:Math.max(0,Math.round(window.innerHeight-se.top))};f(W=>W&&W.left===G.left&&W.width===G.width&&W.bottom===G.bottom?W:G)},C=()=>{window.cancelAnimationFrame(l),l=window.requestAnimationFrame(A)},ae=document.querySelector(".ai-input-bar__container"),ne=document.querySelector(".ai-input-bar"),O=typeof ResizeObserver<"u"?new ResizeObserver(()=>C()):null;return O&&ae instanceof HTMLElement&&O.observe(ae),O&&ne instanceof HTMLElement&&ne!==ae&&O.observe(ne),C(),window.addEventListener("resize",C),window.addEventListener("orientationchange",C),()=>{window.cancelAnimationFrame(l),window.removeEventListener("resize",C),window.removeEventListener("orientationchange",C),O==null||O.disconnect()}},[B]),n.useEffect(()=>{if(!s)return;const l=A=>{var C;(C=i.current)!=null&&C.contains(A.target)||c(!1)};return document.addEventListener("pointerdown",l,!0),()=>document.removeEventListener("pointerdown",l,!0)},[s]),n.useEffect(()=>{M.current=i.current}),n.useEffect(()=>{const l=oe.observeToolStates().subscribe(()=>{const A=oe.getToolState(ye);m((A==null?void 0:A.status)==="open")});return()=>l.unsubscribe()},[]),!B||y)return null;const Ie=p&&!v?{left:p.x,top:p.y}:{},re={...P?{"--canvas-audio-mobile-left":`${P.left}px`,"--canvas-audio-mobile-width":`${P.width}px`,"--canvas-audio-mobile-offset":`${P.bottom}px`}:{},...Ie};return t.jsxs("div",{ref:i,className:he("canvas-audio-player",{"canvas-audio-player--playlist-open":s,"canvas-audio-player--positioned":!!p,"canvas-audio-player--dragging":u,"canvas-audio-player--vertical":_==="vertical"}),style:Object.keys(re).length>0?re:void 0,children:[t.jsxs("button",{type:"button",className:"canvas-audio-player__queue-trigger",onPointerDown:S,onClick:()=>{g.current||c(l=>!l)},"aria-expanded":s,"aria-label":"切换播放列表",children:[t.jsx("div",{className:"canvas-audio-player__cover",children:t.jsx(Oe,{src:Q,alt:z||"Audio cover",fallbackClassName:"canvas-audio-player__cover-fallback",iconSize:16})}),t.jsxs("div",{className:"canvas-audio-player__meta",children:[t.jsx("div",{className:"canvas-audio-player__title",children:z||"未命名音频"}),t.jsxs("div",{className:"canvas-audio-player__subtitle",children:[t.jsx("span",{className:"canvas-audio-player__subtitle-text canvas-audio-player__subtitle-text--desktop",children:L}),t.jsx("span",{className:"canvas-audio-player__subtitle-text canvas-audio-player__subtitle-text--mobile",children:ee})]})]}),t.jsx("span",{className:"canvas-audio-player__queue-indicator","aria-hidden":"true",children:t.jsx(Ue,{size:14})})]}),t.jsxs("div",{className:"canvas-audio-player__controls",children:[t.jsx(N,{content:"上一首",children:t.jsx("button",{type:"button",className:"canvas-audio-player__action canvas-audio-player__action--previous",onClick:()=>void e.playPrevious(),disabled:!X,children:t.jsx(Fe,{size:14})})}),t.jsx(N,{content:e.playing?"暂停":"播放",children:t.jsx("button",{type:"button",className:"canvas-audio-player__action canvas-audio-player__action--primary",onClick:()=>void je(),children:e.playing?t.jsx(qe,{size:14}):t.jsx(Ye,{size:14})})}),t.jsx(N,{content:"下一首",children:t.jsx("button",{type:"button",className:"canvas-audio-player__action canvas-audio-player__action--next",onClick:()=>void e.playNext(),disabled:!q,children:t.jsx(Ve,{size:14})})})]}),t.jsxs("div",{className:"canvas-audio-player__progress",children:[t.jsx("span",{className:"canvas-audio-player__time",children:E}),t.jsx("input",{type:"range",min:0,max:k||0,step:.1,value:Math.min(x,k||x),onChange:l=>{D&&e.seekTo(Number(l.target.value))},className:"canvas-audio-player__slider canvas-audio-player__slider--progress",style:te,"aria-label":D?"Audio progress":"Reading progress",disabled:!D}),t.jsx("span",{className:"canvas-audio-player__time",children:F})]}),t.jsx(ot,{volume:e.volume,onVolumeChange:e.setVolume}),t.jsx(fe,{options:r,trigger:"click",placement:"bottom",minColumnWidth:112,onClick:l=>e.setPlaybackRate(Number(l.value)),children:t.jsx(N,{content:H,children:t.jsx("button",{type:"button",className:"canvas-audio-player__toggle canvas-audio-player__speed-toggle","aria-label":`切换播放速度,当前${j}`,children:t.jsx(Be,{size:14})})})}),t.jsx(fe,{options:ct,trigger:"click",placement:"bottom",minColumnWidth:132,onClick:l=>e.setPlaybackMode(l.value),children:t.jsx(N,{content:a,children:t.jsx("button",{type:"button",className:"canvas-audio-player__toggle canvas-audio-player__mode-toggle","aria-label":`切换播放模式,当前${a}`,children:o})})}),t.jsx(N,{content:"打开播放器工具",children:t.jsx("button",{type:"button",className:"canvas-audio-player__toggle canvas-audio-player__player-switch canvas-audio-player__switch-toggle",onClick:()=>{We(async()=>{const{openMusicPlayerTool:l}=await import("./tool-windows-C4D0lII2.js").then(A=>A.oR);return{openMusicPlayerTool:l}},__vite__mapDeps([0]),import.meta.url).then(({openMusicPlayerTool:l})=>{l()})},"aria-label":"打开播放器工具",children:t.jsx(He,{size:14})})}),t.jsx(N,{content:_==="horizontal"?"切换为垂直布局":"切换为水平布局",children:t.jsx("button",{type:"button",className:"canvas-audio-player__toggle canvas-audio-player__layout-toggle",onClick:Pe,style:{display:h<=768?"none":""},children:_==="horizontal"?t.jsx(Qe,{size:14}):t.jsx(Xe,{size:14})})}),t.jsx(N,{content:"关闭播放器",children:t.jsx("button",{type:"button",className:"canvas-audio-player__close",onClick:e.stopPlayback,children:t.jsx(Ke,{size:14})})}),s?t.jsx(rt,{queue:e.queue,activeQueueIndex:e.activeQueueIndex,queueSource:e.queueSource,activePlaylistId:e.activePlaylistId,playing:e.playing,activeReadingSourceId:e.activeReadingSourceId,onSelect:l=>{U(l)?e.toggleReadingPlayback(l):e.togglePlayback(l),c(!1)}}):null]})};export{yt as CanvasAudioPlayer};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./tool-windows-Cos6lOhr.css","./index-CJ7peDFP.css","./MediaLibrarySidebar-CNCXXhfY.css","./use-runtime-models-BgWWl4Ng.css","./index-I7GscWS1.css","./main-DY6jstww.css","./ChatMessagesArea-DyR_wHFQ.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{aI as oe,r as s,y as r,kf as bt,i9 as vt,f_ as rt,fP as Tt,bV as ke,hm as Ct,lE as Dt,hv as Ie,hy as Rt,lF as ot,f$ as At,dM as Nt,ig as jt,ih as Lt,bD as Wt,lG as $t,lH as Pt,bj as it,h7 as qe,fR as re,lI as Ut,lJ as zt,lK as Ht,lL as Ft,lM as Gt,lN as Kt,lO as Vt,l3 as Bt,hd as $e,l2 as Ot,kR as Xt,lP as qt,lQ as Jt,hK as Qt,hw as Je,bL as Yt,b7 as Zt,hQ as es,lR as ts,_ as ct}from"./tool-windows-pGtQqqCf.js";import{u as ss,b as ns,i as Qe,V as as,j as rs,h as os,f as is}from"./use-runtime-models-DVNlNiyy.js";import{a as cs,f as Ye,b as ls}from"./model-selection-ftcewdkR.js";import{S as ds,i as us,u as fs}from"./index-B4IiTNZb.js";import{u as ms,e as ps}from"./main-DjgAgoB3.js";const lt=oe.memo(({session:t,isActive:e,onSelect:o,onDelete:d,onRename:g})=>{const[i,c]=s.useState(!1),[l,I]=s.useState(t.title),M=s.useRef(null),S=s.useCallback(()=>{i||o()},[o,i]),E=s.useCallback(_=>{_.stopPropagation(),d()},[d]),D=s.useCallback(_=>{_.stopPropagation(),I(t.title),c(!0)},[t.title]),y=s.useCallback(()=>{const _=l.trim();_&&_!==t.title&&g(_),c(!1)},[l,t.title,g]),z=s.useCallback(()=>{I(t.title),c(!1)},[t.title]),k=s.useCallback(_=>{_.key==="Enter"?(_.preventDefault(),y()):_.key==="Escape"&&(_.preventDefault(),z())},[y,z]),b=s.useCallback(_=>{I(_.target.value)},[]);s.useEffect(()=>{i&&M.current&&(M.current.focus(),M.current.select())},[i]);const H=s.useMemo(()=>{const _=new Date(t.updatedAt),q=new Date;return _.toDateString()===q.toDateString()?_.toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit"}):_.toLocaleDateString("zh-CN",{month:"short",day:"numeric"})},[t.updatedAt]);return r.jsxs("div",{className:`session-item ${e?"session-item--active":""} ${i?"session-item--editing":""}`,"data-track":"chat_click_session_select",onClick:S,role:"button",tabIndex:0,onKeyDown:_=>!i&&_.key==="Enter"&&S(),children:[r.jsxs("div",{className:"session-item__content",children:[i?r.jsx("input",{ref:M,className:"session-item__title-input",value:l,onChange:b,onKeyDown:k,onBlur:y,onClick:_=>_.stopPropagation(),maxLength:50}):r.jsx("div",{className:"session-item__title",children:t.title}),r.jsx("div",{className:"session-item__time",children:H})]}),!i&&r.jsxs("div",{className:"session-item__actions",children:[r.jsx("button",{className:"session-item__edit","data-track":"chat_click_session_edit",onClick:D,"aria-label":`编辑会话标题: ${t.title}`,children:r.jsx(bt,{size:14})}),r.jsx("button",{className:"session-item__delete","data-track":"chat_click_session_delete",onClick:E,"aria-label":`删除会话: ${t.title}`,children:r.jsx(vt,{size:14})})]})]})});lt.displayName="SessionItem";const dt=oe.memo(({sessions:t,activeSessionId:e,onSelectSession:o,onNewSession:d,onDeleteSession:g,onRenameSession:i})=>{const[c,l]=oe.useState(null),I=s.useCallback(y=>{o(y)},[o]),M=s.useCallback(y=>{l(y)},[]),S=s.useCallback(()=>{c&&(g(c),l(null))},[c,g]),E=s.useCallback(()=>{l(null)},[]),D=s.useCallback((y,z)=>{i(y,z)},[i]);return r.jsxs("div",{className:"session-list",children:[r.jsxs("div",{className:"session-list__header",children:[r.jsx("span",{className:"session-list__title",children:"会话列表"}),r.jsxs("button",{className:"session-list__new-btn","data-track":"chat_click_session_new",onClick:d,"aria-label":"新建会话",children:[r.jsx(rt,{size:14}),r.jsx("span",{children:"新建"})]})]}),r.jsx("div",{className:"session-list__items",children:t.length===0?r.jsx("div",{className:"session-list__empty",children:"暂无会话"}):t.map(y=>r.jsx(lt,{session:y,isActive:y.id===e,onSelect:()=>I(y.id),onDelete:()=>M(y.id),onRename:z=>D(y.id,z)},y.id))}),r.jsx(Tt,{open:c!==null,title:"删除会话",description:"确定删除此会话吗?删除后无法恢复。",confirmText:"删除",cancelText:"取消",danger:!0,onOpenChange:y=>{y||E()},onConfirm:S})]})});dt.displayName="SessionList";const ut=oe.memo(({isOpen:t,onClick:e,drawerWidth:o})=>{const d=t&&o?{right:o-18}:void 0;return r.jsx(ke,{content:t?"收起对话":"展开对话",children:r.jsx("button",{className:`chat-drawer-trigger ${t?"chat-drawer-trigger--active":""}`,"data-track":t?"chat_click_drawer_close":"chat_click_drawer_open",onClick:e,"aria-label":t?"收起对话":"展开对话","aria-expanded":t,style:d,children:r.jsx(Ct,{size:16,className:"chat-drawer-trigger__icon"})})})});ut.displayName="ChatDrawerTrigger";function Ee(t){return t.sourceProfileName||ot[t.vendor]||t.id}const hs=oe.memo(({model:t})=>{const e=os(t.sourceProfileId,t.id);return e?r.jsx("span",{className:"model-selector__item-price",children:e}):null}),gs=oe.memo(({model:t})=>{const e=is(t.sourceProfileId,t.id);return e!=null&&e.description?r.jsx("div",{className:"model-selector__item-desc",children:e.description}):null});function ws(t,e){var i;const o=Ee(t),d=(i=t.description)==null?void 0:i.trim(),g=(e==null?void 0:e.includeProvider)??!0;return d?!g||d.includes(o)?d:`${o} · ${d}`:g?o:""}function _s(t){return Ee(t).trim().slice(0,1).toUpperCase()||"M"}const ft=oe.memo(({className:t,value:e,valueRef:o,onChange:d,variant:g="capsule"})=>{var $;const i=ss("text"),c=(($=i[0])==null?void 0:$.id)||Dt,[l,I]=s.useState(c),[M,S]=s.useState(()=>Ie(null,c)),E=e??l,D=o===void 0?M:o,[y,z]=s.useState(!1),[k,b]=s.useState(""),[H,_]=s.useState(null),q=s.useRef(null),O=s.useRef(null);s.useEffect(()=>{!e&&c&&l!==c&&(I(c),S(Ie(null,c)))},[c,l,e]),s.useEffect(()=>{if(!y)return;const p=m=>{const U=m.target;q.current&&!q.current.contains(U)&&O.current&&!O.current.contains(U)&&(z(!1),b(""))},u=setTimeout(()=>{document.addEventListener("mousedown",p)},100);return()=>{clearTimeout(u),document.removeEventListener("mousedown",p)}},[y]);const V=s.useMemo(()=>E?cs(E,D):null,[E,D]),j=s.useMemo(()=>{if(Ye(i,E,D)||!E)return i;const u=Rt("text",E,D);return u?[u,...i]:i},[i,E,D]),x=s.useMemo(()=>Ye(j,E,D)||j.find(p=>p.id===E),[j,E,D]),C=s.useCallback(p=>{const u=Ie(p.sourceProfileId||null,p.id);e===void 0&&I(p.id),o===void 0&&S(u),d==null||d(p.id,u),z(!1),b("")},[e,o,d]),P=s.useCallback(()=>{const p=!y;z(p),p?_((x==null?void 0:x.vendor)||null):b("")},[x==null?void 0:x.vendor,y]),W=s.useMemo(()=>{const p=new Map,u=[];return j.forEach(m=>{p.has(m.vendor)||(u.push(m.vendor),p.set(m.vendor,0)),p.set(m.vendor,(p.get(m.vendor)??0)+1)}),u.map(m=>({id:m,label:ot[m],count:p.get(m)??0,icon:r.jsx(ns,{vendor:m,size:14})}))},[j]),ne=s.useCallback(p=>{_(p)},[]),ie=s.useMemo(()=>{const p=k.toLowerCase().trim();return p?j.filter(u=>{var U,J;const m=Ee(u).toLowerCase();return u.id.toLowerCase().includes(p)||u.label.toLowerCase().includes(p)||((U=u.shortLabel)==null?void 0:U.toLowerCase().includes(p))||((J=u.description)==null?void 0:J.toLowerCase().includes(p))||m.includes(p)}):H?j.filter(u=>u.vendor===H):j},[k,H,j]),[X,Z]=s.useState({top:0,left:0,width:0,bottom:0,placement:"bottom",maxHeight:480});s.useLayoutEffect(()=>{if(!y)return;const p=()=>{if(!O.current)return;const u=O.current.getBoundingClientRect(),m=window.innerHeight,U=m-u.bottom,J=u.top,de=U<400&&J>U?"top":"bottom",ee=de==="top"?J-16:m-u.bottom-16;Z({top:u.top,left:u.left,width:u.width,bottom:u.bottom,placement:de,maxHeight:Math.min(Math.max(ee,200),600)})};return p(),window.addEventListener("resize",p),window.addEventListener("scroll",p,!0),()=>{window.removeEventListener("resize",p),window.removeEventListener("scroll",p,!0)}},[y]);const le=()=>{if(!y)return null;const p=r.jsxs("div",{ref:q,className:"model-selector__dropdown",style:{position:"fixed",zIndex:Nt.DROPDOWN_PORTAL,left:X.left,top:X.placement==="bottom"?X.bottom+8:"auto",bottom:X.placement==="top"?window.innerHeight-X.top+8:"auto",minWidth:360,width:g==="form"?X.width:"auto",maxHeight:X.maxHeight,visibility:X.width===0?"hidden":"visible",transformOrigin:X.placement==="bottom"?"top left":"bottom left",display:"flex",flexDirection:"column"},onClick:u=>u.stopPropagation(),children:[r.jsx("div",{className:"model-selector__search",children:r.jsx(jt,{value:k,onChange:b,placeholder:"搜索模型...",prefixIcon:r.jsx(Lt,{}),clearable:!0,autofocus:!0})}),r.jsx(as,{tabs:W,activeTab:H,onTabChange:ne,searchQuery:k,compact:!0,children:r.jsx("div",{className:"model-selector__list",children:ie.length===0?r.jsx("div",{className:"model-selector__empty",children:"未找到匹配的模型"}):ie.map(u=>{const m=ls(u),U=m===V,J=!!k.trim(),de=ws(u,{includeProvider:!J});return r.jsxs("button",{className:`model-selector__item ${U?"model-selector__item--active":""}`,"data-track":"chat_click_model_select",onClick:()=>C(u),children:[r.jsx("span",{className:"model-selector__item-icon model-selector__item-icon--text","aria-hidden":"true",children:_s(u)}),r.jsxs("div",{className:"model-selector__item-content",children:[r.jsxs("div",{className:"model-selector__item-header",children:[r.jsx("span",{className:"model-selector__item-name",children:u.shortLabel||u.label}),J?r.jsx("span",{className:"model-selector__item-provider",children:Ee(u)}):null,r.jsx(Qe,{modelId:u.id,profileId:u.sourceProfileId||null}),r.jsx(rs,{modelId:u.id}),r.jsx(hs,{model:u})]}),de?r.jsx("div",{className:"model-selector__item-desc",children:de}):r.jsx(gs,{model:u})]}),U&&r.jsx("svg",{className:"model-selector__check",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",children:r.jsx("path",{d:"M13.3334 4L6.00002 11.3333L2.66669 8",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})]},m)})})})]});return Wt.createPortal(p,document.body)};return r.jsxs("div",{className:`model-selector ${t||""} model-selector--variant-${g}`,children:[r.jsxs("button",{ref:O,className:`model-selector__trigger ${y?"model-selector__trigger--active":""}`,"data-track":"chat_click_model_selector",onClick:P,"aria-label":"选择模型","aria-expanded":y,children:[r.jsxs("div",{className:"model-selector__trigger-content",children:[r.jsx(Qe,{modelId:(x==null?void 0:x.id)||E,profileId:(x==null?void 0:x.sourceProfileId)||null,className:"model-selector__trigger-health"}),r.jsx("span",{className:"model-selector__trigger-text",children:(x==null?void 0:x.shortLabel)||(x==null?void 0:x.label)||"选择模型"})]}),r.jsx(At,{size:16,className:`model-selector__trigger-icon ${y?"model-selector__trigger-icon--open":""}`})]}),le()]})});ft.displayName="ModelSelector";const mt=s.forwardRef(({selectedContent:t,onSend:e,disabled:o=!1,placeholder:d="输入消息..."},g)=>{const i=s.useRef(null),c=s.useRef(null),[l,I]=s.useState(""),M=t.length>0,{addHistory:S}=ms();s.useImperativeHandle(g,()=>({setContent:k=>{var b;I(k),(b=i.current)==null||b.focus()},getContent:()=>l,focus:()=>{var k;return(k=i.current)==null?void 0:k.focus()}}),[l]);const E=s.useCallback(()=>{const k=l.trim();if(!k&&t.length===0)return;const b=[];k&&b.push({type:"text",text:k}),t.forEach((_,q)=>{_.type==="image"||_.type==="graphics"?b.push({type:"data-file",data:{filename:`${_.type}-${q+1}.png`,mediaType:"image/png",url:_.url||""}}):_.type==="video"&&b.push({type:"data-file",data:{filename:`video-${q+1}.mp4`,mediaType:"video/mp4",url:_.url||""}})});const H={id:`msg_${Date.now()}`,role:"user",parts:b};k&&S(k,M,"agent"),Promise.resolve(e(H)).catch(_=>{console.error("[EnhancedChatInput] send failed:",_)}),I("")},[l,t,e,S,M]),D=s.useCallback(k=>{k.nativeEvent.isComposing||k.key==="Enter"&&!k.shiftKey&&(k.preventDefault(),E())},[E]);s.useEffect(()=>{i.current&&(i.current.style.height="auto",i.current.style.height=`${Math.min(i.current.scrollHeight,120)}px`)},[l]);const y=()=>t.length===0?null:r.jsx("div",{className:"enhanced-chat-input__selection",children:r.jsx(ds,{items:t,language:"zh",enableHoverPreview:!0})}),z=(l.trim()||t.length>0)&&!o;return r.jsxs("div",{className:"enhanced-chat-input",ref:c,children:[y(),r.jsxs("div",{className:"enhanced-chat-input__form",children:[r.jsx("div",{className:"enhanced-chat-input__input-wrapper",children:r.jsx("textarea",{ref:i,className:"enhanced-chat-input__textarea",value:l,onChange:k=>I(k.target.value),onKeyDown:D,placeholder:M?"描述你想要的效果...":d,disabled:o,rows:4})}),r.jsx("button",{className:`enhanced-chat-input__send ${z?"enhanced-chat-input__send--active":""}`,onClick:E,disabled:!z,"aria-label":"发送",children:r.jsx($t,{size:20})})]})]})});mt.displayName="EnhancedChatInput";const Me={MAX_TITLE_LENGTH:30,DRAWER_MIN_WIDTH:320,DRAWER_MAX_WIDTH:500,DRAWER_DEFAULT_WIDTH_RATIO:.3},ge={DRAWER_STATE:"aitu:chat:drawer-state",ACTIVE_SESSION:"aitu:chat:active-session",DATABASE_NAME:"aitu-chat",SESSIONS_STORE:"sessions",MESSAGES_STORE:"messages"},_e=it.createInstance({name:ge.DATABASE_NAME,storeName:ge.SESSIONS_STORE}),pe=it.createInstance({name:ge.DATABASE_NAME,storeName:ge.MESSAGES_STORE});function pt(){return Pt()}function Ss(t){const e=t.trim().replace(/\n/g," ");return e.length<=Me.MAX_TITLE_LENGTH?e:e.slice(0,Me.MAX_TITLE_LENGTH-3)+"..."}async function xs(){const t=Date.now(),e={id:pt(),title:"新对话",createdAt:t,updatedAt:t,messageCount:0};return await _e.setItem(e.id,e),e}async function be(t){return _e.getItem(t)}async function Is(){const t=[];return await _e.iterate(e=>{t.push(e)}),await new Promise(e=>{typeof window<"u"&&"requestIdleCallback"in window?window.requestIdleCallback(()=>e(),{timeout:50}):setTimeout(e,0)}),t.sort((e,o)=>o.updatedAt-e.updatedAt)}async function Ue(t,e){const o=await be(t);if(o){const d={...o,...e,updatedAt:Date.now()};await _e.setItem(t,d)}}async function Ms(t){const e=await ht(t);for(const o of e)await pe.removeItem(o.id);await _e.removeItem(t)}async function ys(t){await pe.setItem(t.id,t);const e=await be(t.sessionId);if(e){const o={messageCount:e.messageCount+1,updatedAt:Date.now()};await Ue(t.sessionId,o)}}async function ht(t){const e=[];return await pe.iterate(o=>{o.sessionId===t&&e.push(o)}),e.sort((o,d)=>o.timestamp-d.timestamp)}async function ks(t,e){const o=await pe.getItem(t);if(o){const d={...o,...e};await pe.setItem(t,d)}}async function Es(t){const e=await pe.getItem(t);if(e){await pe.removeItem(t);const o=await be(e.sessionId);o&&await Ue(e.sessionId,{messageCount:Math.max(0,o.messageCount-1)})}}const Ze={isOpen:!1,width:Math.min(Me.DRAWER_MAX_WIDTH,Math.max(Me.DRAWER_MIN_WIDTH,window.innerWidth*Me.DRAWER_DEFAULT_WIDTH_RATIO)),activeSessionId:null};function gt(){try{const t=localStorage.getItem(ge.DRAWER_STATE);if(t)return{...Ze,...JSON.parse(t)}}catch(t){console.error("[ChatStorage] Failed to get drawer state:",t)}return Ze}function bs(t){try{const o={...gt(),...t};localStorage.setItem(ge.DRAWER_STATE,JSON.stringify(o))}catch(e){console.error("[ChatStorage] Failed to set drawer state:",e)}}async function vs(){await _e.clear(),await pe.clear(),localStorage.removeItem(ge.DRAWER_STATE)}const T={createSession:xs,getSession:be,getAllSessions:Is,updateSession:Ue,deleteSession:Ms,addMessage:ys,getMessages:ht,updateMessage:ks,deleteMessage:Es,getDrawerState:gt,setDrawerState:bs,clearAllData:vs,generateId:pt,generateTitle:Ss};var Y=(t=>(t.SENDING="sending",t.STREAMING="streaming",t.SUCCESS="success",t.FAILED="failed",t))(Y||{}),se=(t=>(t.USER="user",t.ASSISTANT="assistant",t))(se||{});let ce=null;function wt(t){const e={};let o=1,d=1,g=1,i=t;return i=i.replace(/data:image\/[^;]+;base64,[A-Za-z0-9+/=]+/g,c=>{const l=`[图片${o}]`;return e[l]=c,o++,l}),i=i.replace(/data:video\/[^;]+;base64,[A-Za-z0-9+/=]+/g,c=>{const l=`[视频${d}]`;return e[l]=c,d++,l}),i=i.replace(/blob:[^\s"'<>]+/g,c=>{const l=`[媒体${g}]`;return e[l]=c,g++,l}),i=i.replace(/https?:\/\/[^\s"'<>]+\.(png|jpg|jpeg|gif|webp|svg|bmp)(\?[^\s"'<>]*)?/gi,c=>{const l=`[图片${o}]`;return e[l]=c,o++,l}),i=i.replace(/https?:\/\/[^\s"'<>]+\.(mp4|webm|mov|avi|mkv)(\?[^\s"'<>]*)?/gi,c=>{const l=`[视频${d}]`;return e[l]=c,d++,l}),{sanitized:i,urlMap:e}}function Ts(t,e){let o=t;for(const[d,g]of Object.entries(e))o=o.split(d).join(g);return o}async function Cs(t,e={}){const o={};let d=e.maxImageCount??Number.POSITIVE_INFINITY;return{geminiMessages:await Promise.all(t.filter(i=>i.status==="success"||i.status==="streaming").map(async i=>{const{sanitized:c,urlMap:l}=wt(i.content);Object.assign(o,l);const I=[{type:"text",text:c}];if(e.includeImageAttachments&&i.role===se.USER&&i.attachments&&i.attachments.length>0&&d>0){const M=await Vt(i.attachments,d);d-=M.length,I.push(...M)}return{role:i.role===se.USER?"user":"assistant",content:I}})),urlMap:o}}async function Ds(t,e,o=[],d,g,i){return Rs(t,e,o,d,g,i)}async function Rs(t,e,o=[],d,g,i){ce&&ce.abort(),ce=new AbortController;const c=ce.signal,l=Date.now().toString(),I=Date.now(),M=(typeof g=="string"?g:g==null?void 0:g.modelId)||qe.getConfig().modelName||"unknown";try{re.trackModelCall({taskId:l,taskType:"chat",model:M,promptLength:e.length,hasUploadedImage:o.length>0,startTime:I});const S=Ut("text",g),E=zt(S==null?void 0:S.binding),D=Ht(S==null?void 0:S.binding),y=Ft(o),z=Math.max(D-y,0),{geminiMessages:k,urlMap:b}=await Cs(t,{includeImageAttachments:E,maxImageCount:z}),{sanitized:H,urlMap:_}=wt(e),q={...b,..._},O=Gt(k),V=Math.max(D-O,0),j=[{type:"text",text:H}];if(E&&o.length>0&&V>0){const W=await Kt(o,V);j.push(...W)}const x=[];i&&x.push({role:"system",content:[{type:"text",text:i}]}),x.push(...k,{role:"user",content:j});let C="";if(await qe.sendChat(x,W=>{if(c.aborted)return;const ne=Ts(W,q);C=ne,d({type:"content",content:ne})},c,g||void 0),c.aborted)throw new Error("Request cancelled");const P=Date.now()-I;return re.trackModelSuccess({taskId:l,taskType:"chat",model:M,duration:P,resultSize:C.length}),d({type:"done"}),ce=null,C}catch(S){ce=null;const E=Date.now()-I;if(c.aborted||S.message==="Request cancelled"||S.name==="AbortError")throw re.trackTaskCancellation({taskId:l,taskType:"chat",duration:E}),d({type:"done"}),new Error("Request cancelled");const D=S instanceof Error?S.message:"Unknown error occurred";throw re.trackModelFailure({taskId:l,taskType:"chat",model:M,duration:E,error:D}),d({type:"error",error:D}),S}}function As(){ce&&(ce.abort(),ce=null)}function Ns(){return ce!==null}const et={sendChatMessage:Ds,stopGeneration:As,isGenerating:Ns},Pe="[[WORKFLOW_MESSAGE]]",js=["generate_image","generate_video","generate_grid_image","generate_photo_wall"];function Ls(t){var g;if(!js.includes(t.name))return t;const e={...t.arguments},o=e.model;let d=!1;if(!o)d=!0;else{const i=Bt(o),c=t.name==="generate_video";(c&&i!=="video"||!c&&i!=="image")&&(d=!0)}if(d){const i=$e.get(),c=t.name==="generate_video";let l;c?l=i.videoModelName||"veo3":l=i.imageModelName||((g=Ot[0])==null?void 0:g.id)||"gemini-2.5-flash-image-vip",e.model=l}return{...t,arguments:e}}function Ws(t){const e=[];t.aiAnalysis&&e.push(t.aiAnalysis);const o=t.steps.filter(c=>c.status==="completed"),d=t.steps.filter(c=>c.status==="failed");if(o.length>0||d.length>0){const c=[];o.length>0&&c.push(`成功执行 ${o.length} 个工具`),d.length>0&&c.push(`${d.length} 个工具执行失败`),c.length>0&&e.push(`[执行结果: ${c.join(",")}]`)}const g=t.steps.map(c=>{const l={};for(const[I,M]of Object.entries(c.args||{}))I!=="context"&&(typeof M=="string"&&M.length>200?l[I]=M.substring(0,200)+"...":l[I]=M);return{mcp:c.mcp,args:l}}),i={content:e.join(`
|
|
3
|
-
`)||`已完成任务: ${t.name}`,next:g};return JSON.stringify(i)}function $s(t){const e=[{type:"text",text:t.content}];if(t.attachments&&t.attachments.length>0)for(const o of t.attachments)e.push({type:"data-file",data:{filename:o.name,mediaType:o.type,url:o.data}});return{id:t.id,role:t.role===se.USER?"user":"assistant",parts:e}}function Ps(t,e){const d=t.parts.filter(c=>c.type==="text").map(c=>c.text).join(""),i=t.parts.filter(c=>c.type==="data-file").map((c,l)=>{const I=c.data;return{id:`${t.id}-att-${l}`,name:I.filename,type:I.mediaType,size:0,data:I.url,isBlob:!1}});return{id:t.id,sessionId:e,role:t.role==="user"?se.USER:se.ASSISTANT,content:d,timestamp:Date.now(),status:Y.SUCCESS,attachments:i.length>0?i:void 0}}function Us(t){return t.workflow&&t.content.startsWith(Pe)?{...t,content:Ws(t.workflow)}:t}function tt(t){return t.parts.filter(e=>e.type==="text").map(e=>e.text).join("")}us();function zs(t){const{sessionId:e,temporaryModel:o,onToolCalls:d,onWorkflowUpdate:g}=t,i=s.useRef(Xt()),c=s.useRef(d);c.current=d;const l=s.useRef(g);l.current=g;const I=s.useRef(o);I.current=o;const[M,S]=s.useState([]),[E,D]=s.useState("ready"),[y,z]=s.useState(!1),k=s.useRef(null),b=s.useRef([]),H=s.useRef(!1);s.useEffect(()=>{if(!e){S([]),b.current=[];return}(async()=>{z(!0);try{const C=await T.getMessages(e);b.current=C,S(C.map($s))}catch(C){console.error("[useChatHandler] Failed to load messages:",C),S([]),b.current=[]}finally{z(!1)}})()},[e]);const _=s.useCallback(async x=>{if(!e)return;if(H.current){console.warn("[useChatHandler] Message already being sent, ignoring duplicate call");return}H.current=!0,D("submitted");const C=Ps(x,e);await T.addMessage(C),S($=>[...$,x]);const P=await T.getSession(e);await T.updateSession(e,{updatedAt:Date.now(),messageCount:((P==null?void 0:P.messageCount)||0)+1});const W=T.generateId();k.current=W;const ne={id:W,role:"assistant",parts:[{type:"text",text:""}]};S($=>[...$,ne]),D("streaming");const ie=b.current.map(Us);ie.push(C),b.current=[...b.current,C];const X=tt(x);let Z="",le=!1;try{await et.sendChatMessage(ie.slice(0,-1),X,C.attachments||[],$=>{if($.type==="content"&&$.content)Z=$.content,S(p=>p.map(u=>u.id===W?{...u,parts:[{type:"text",text:Z}]}:u));else if($.type==="done"){const p=qt(Z),u=Jt(Z)||Z;if(p.length>0&&c.current){const U=p.map(ee=>Ls(ee)),J=async()=>{const ee=[];for(const ue of U)try{const fe=await Qt.executeTool(ue);ee.push({toolCall:ue,success:fe.success,data:fe.data,error:fe.error,taskId:fe.taskId})}catch(fe){ee.push({toolCall:ue,success:!1,error:fe.message||"工具执行失败"})}return ee},de=`${Pe}${W}`;S(ee=>ee.map(ue=>ue.id===W?{...ue,parts:[{type:"text",text:de}]}:ue)),c.current(U,W,J,u)}D("ready");const m={id:W,sessionId:e,role:se.ASSISTANT,content:p.length>0?`${Pe}${W}`:Z,timestamp:Date.now(),status:p.length>0?Y.STREAMING:Y.SUCCESS};T.addMessage(m),b.current=[...b.current,m],T.updateSession(e,{updatedAt:Date.now(),messageCount:((P==null?void 0:P.messageCount)||0)+2}),k.current=null,H.current=!1}else if($.type==="error"&&$.error){le=!0,D("error");const p=`❌ 错误: ${$.error}`;S(m=>m.map(U=>U.id===W?{...U,parts:[{type:"text",text:p}]}:U));const u={id:W,sessionId:e,role:se.ASSISTANT,content:p,timestamp:Date.now(),status:Y.FAILED,error:$.error};T.addMessage(u),b.current=[...b.current,u],k.current=null,H.current=!1}},I.current,i.current)}catch($){if($.message!=="Request cancelled"&&!le){D("error"),console.error("[useChatHandler] Stream error:",$);const p=`❌ 错误: ${$.message||"未知错误"}`;if(S(u=>u.map(m=>m.id===W?{...m,parts:[{type:"text",text:p}]}:m)),e&&W){const u={id:W,sessionId:e,role:se.ASSISTANT,content:p,timestamp:Date.now(),status:Y.FAILED,error:$.message||"未知错误"};T.addMessage(u),b.current=[...b.current,u]}}k.current=null,H.current=!1}},[e]),q=s.useCallback(async()=>{if(et.stopGeneration(),D("ready"),k.current&&e){const x=M.find(C=>C.id===k.current);if(x){const C=tt(x),P={id:x.id,sessionId:e,role:se.ASSISTANT,content:C,timestamp:Date.now(),status:Y.SUCCESS};await T.addMessage(P)}k.current=null}},[e,M]),O=s.useCallback(x=>{if(M.length<2)return;const C=[...M].reverse().findIndex(ie=>ie.role==="user");if(C===-1)return;const P=M.length-1-C,W=M[P],ne=M.slice(0,P+1);S(ne),_(W)},[M,_]),V=s.useCallback((x,C)=>{S(x),C&&(b.current=C)},[]),j=s.useCallback((x,C)=>{b.current=b.current.map(P=>P.id===x?{...P,workflow:C}:P)},[]);return{messages:M,status:E,sendMessage:_,stop:q,regenerate:O,setMessages:S,setMessagesWithRaw:V,updateRawMessageWorkflow:j,isLoading:y}}const Hs=oe.lazy(()=>ct(()=>import("./ChatMessagesArea-C_PlPPB6.js").then(t=>t.C),__vite__mapDeps([0,1,2,3,4,5,6]),import.meta.url)),st="[[WORKFLOW_MESSAGE]]";function Fs(t,e){switch(t){case"generate_image":return`生成图片: ${((e==null?void 0:e.prompt)||"").substring(0,30)}...`;case"generate_video":return`生成视频: ${((e==null?void 0:e.prompt)||"").substring(0,30)}...`;case"generate_audio":return`生成音频: ${((e==null?void 0:e.prompt)||"").substring(0,30)}...`;case"generate_text":return`生成文本: ${((e==null?void 0:e.prompt)||"").substring(0,30)}...`;case"generate_grid_image":return`生成宫格图: ${((e==null?void 0:e.theme)||"").substring(0,30)}...`;case"canvas_insertion":return"插入到画布";case"generate_mermaid":return"生成流程图";case"generate_mindmap":return"生成思维导图";default:return`执行 ${t}`}}const nt="chat-drawer-width",Gs=Math.max(375,window.innerWidth*.5),at=375,Ks=s.forwardRef(({defaultOpen:t=!1,onOpenChange:e},o)=>{const[d,g]=s.useState(()=>T.getDrawerState().isOpen??t),[i,c]=s.useState([]),[l,I]=s.useState(null),[M,S]=s.useState(!1),[E,D]=s.useState(()=>{const a=localStorage.getItem(nt);if(a){const n=parseInt(a,10);if(!isNaN(n)&&n>=at)return Math.min(n,window.innerWidth-60)}return Gs}),[y,z]=s.useState(!1),k=s.useRef(null),[b,H]=s.useState(()=>Je("text").modelId),[_,q]=s.useState(()=>{const a=Je("text");return Ie(a.profileId,a.modelId)}),[O,V]=s.useState(new Map),j=s.useRef(null),[x,C]=s.useState(null),{executeRetry:P,selectedContent:W,setIsDrawerOpen:ne,setDrawerWidth:ie}=ps();s.useEffect(()=>{ne(d)},[d,ne]),s.useEffect(()=>{ie(E)},[E,ie]);const X=oe.useRef(null),Z=oe.useRef(null),{appState:le,setAppState:$}=Yt();s.useEffect(()=>{if(!y)return;const a=h=>{const f=window.innerWidth-h.clientX,w=Math.max(at,Math.min(f,window.innerWidth-60));D(w)},n=()=>{z(!1),localStorage.setItem(nt,String(E))};return document.addEventListener("mousemove",a),document.addEventListener("mouseup",n),document.body.style.userSelect="none",document.body.style.cursor="ew-resize",()=>{document.removeEventListener("mousemove",a),document.removeEventListener("mouseup",n),document.body.style.userSelect="",document.body.style.cursor=""}},[y,E]),s.useEffect(()=>{const a=()=>{const n=window.innerWidth-60;E>n&&D(n)};return window.addEventListener("resize",a),()=>window.removeEventListener("resize",a)},[E]);const p=s.useCallback(a=>{a.preventDefault(),z(!0)},[]),u=s.useCallback(async(a,n,h,f)=>{var L,v;const A={id:`workflow-${Date.now()}`,name:"AI 智能生成",generationType:(L=a[0])!=null&&L.name.includes("video")?"video":(v=a[0])!=null&&v.name.includes("audio")?"audio":"image",prompt:f||"",aiAnalysis:f,count:a.length,steps:a.map((R,K)=>({id:`step-${K}`,mcp:R.name,status:"pending",description:Fs(R.name,R.arguments),args:R.arguments}))};V(R=>{const K=new Map(R);return K.set(n,A),K}),j.current=n,T.updateMessage(n,{workflow:A});try{const R=await h();re.track("chat_tool_execution_complete",{success:!0,resultCount:R.length}),V(K=>{const N=new Map(K),F=N.get(n);if(F){const B={...F,steps:F.steps.map((me,xe)=>{const Q=R[xe];return{...me,status:Q!=null&&Q.success?"completed":"failed",error:Q==null?void 0:Q.error,result:Q==null?void 0:Q.data}})};N.set(n,B),T.updateMessage(n,{workflow:B,status:Y.SUCCESS})}return N})}catch(R){console.error("[ChatDrawer] Tool execution failed:",R),V(K=>{const N=new Map(K),F=N.get(n);if(F){const B={...F,steps:F.steps.map(me=>({...me,status:"failed",error:R.message||"执行失败"}))};N.set(n,B),T.updateMessage(n,{workflow:B,status:Y.FAILED})}return N})}},[]),m=zs({sessionId:l,temporaryModel:_||b,onToolCalls:u}),U=s.useRef(m.sendMessage);U.current=m.sendMessage,s.useEffect(()=>{(async()=>{const n=T.getDrawerState(),h=await T.getAllSessions();c(h);let f=null;if(n.activeSessionId?(f=n.activeSessionId,I(n.activeSessionId)):h.length>0&&(f=h[0].id,I(h[0].id)),f)try{const w=await T.getMessages(f),A=new Map;for(const v of w)v.workflow&&A.set(v.id,v.workflow);V(A);const L=w.find(v=>v.workflow&&v.status===Y.STREAMING);j.current=(L==null?void 0:L.id)||null}catch(w){console.error("[ChatDrawer] Failed to load workflow messages:",w)}})()},[]),s.useEffect(()=>{T.setDrawerState({isOpen:d,activeSessionId:l})},[d,l]),s.useEffect(()=>{if(l&&ae.current){const a=ae.current;ae.current=null,setTimeout(()=>{U.current(a)},100)}},[l]),s.useEffect(()=>{if(!le.openSettings&&ae.current){const a=$e.get();if(a!=null&&a.apiKey){const n=ae.current;ae.current=null,l?setTimeout(()=>{U.current(n)},100):(async()=>{const h=await T.createSession();c(f=>[h,...f]),I(h.id),ae.current=n})()}}},[le.openSettings,l]),s.useEffect(()=>{const a=n=>{n.key==="Escape"&&d&&(g(!1),e==null||e(!1))};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[d,e]),s.useEffect(()=>{let a=null;return(async()=>{const{workflowSubmissionService:h}=await ct(async()=>{const{workflowSubmissionService:f}=await import("./workflow-submission-service-CqQWUBYu.js").then(w=>w.a);return{workflowSubmissionService:f}},__vite__mapDeps([0]),import.meta.url);a=h.subscribeToAllEvents(f=>{const w=f;V(A=>{let L=null;for(const[N,F]of A.entries())if(F.id===w.workflowId){L=N;break}if(!L)return A;const v=A.get(L);if(!v)return A;const R=new Map(A);let K;switch(w.type){case"step":{K={...v,steps:v.steps.map(N=>N.id===w.stepId?{...N,status:w.status||N.status,result:w.result??N.result,error:w.error??N.error}:N)};break}case"steps_added":{const F=(w.steps||[]).map(B=>({id:B.id,mcp:B.mcp,args:B.args,description:B.description,status:B.status}));K={...v,steps:[...v.steps,...F]};break}case"completed":case"failed":{const N=w.type==="completed"?"completed":"failed";K={...v,status:N,steps:v.steps.map(F=>{if(F.status==="running"||F.status==="pending"){const B=F.result;return B!=null&&B.taskId?F:{...F,status:N,error:w.type==="failed"?w.error:void 0}}return F})};break}default:return A}return R.set(L,K),T.updateMessage(L,{workflow:K}),R})})})().catch(h=>{console.error("[ChatDrawer] Failed to setup workflow sync:",h)}),()=>{a==null||a.unsubscribe()}},[]),s.useEffect(()=>{if(!M)return;const a=h=>{const f=h.target;f.closest(".t-dialog")===null&&X.current&&!X.current.contains(f)&&Z.current&&!Z.current.contains(f)&&S(!1)},n=setTimeout(()=>{document.addEventListener("mousedown",a)},100);return()=>{clearTimeout(n),document.removeEventListener("mousedown",a)}},[M]);const J=s.useCallback(()=>{g(a=>{const n=!a;return e==null||e(n),n})},[e]),de=s.useCallback(()=>{g(!1),e==null||e(!1)},[e]),ee=s.useCallback(async()=>{re.track("chat_session_create");const a=await T.createSession();c(n=>[a,...n]),I(a.id),S(!1),V(new Map),j.current=null,H(void 0)},[]),ue=s.useCallback(()=>{S(a=>!a)},[]),fe=s.useCallback(async a=>{re.track("chat_session_select"),I(a),S(!1),H(void 0);try{const n=await T.getMessages(a),h=new Map;for(const w of n)w.workflow&&h.set(w.id,w.workflow);V(h);const f=n.find(w=>w.workflow&&w.status===Y.STREAMING);j.current=(f==null?void 0:f.id)||null}catch(n){console.error("[ChatDrawer] Failed to load workflow messages:",n),V(new Map),j.current=null}},[]),_t=s.useCallback(async a=>{re.track("chat_session_delete"),await T.deleteSession(a),c(n=>{const h=n.filter(f=>f.id!==a);if(l===a){const f=h[0]||null;I((f==null?void 0:f.id)||null)}return h})},[l]),ve=s.useCallback(async(a,n)=>{re.track("chat_session_rename"),await T.updateSession(a,{title:n}),c(h=>h.map(f=>f.id===a?{...f,title:n}:f))},[]),ae=oe.useRef(null),Se=s.useCallback(async a=>{try{re.track("chat_message_send",{hasImages:a.parts.some(h=>h.type==="image_url")});const n=$e.get();if(!(n!=null&&n.apiKey)){ae.current=a,$({...le,openSettings:!0});return}if(ae.current=null,!l){const h=await T.createSession();c(f=>[h,...f]),I(h.id),ae.current=a;return}await m.sendMessage(a)}catch(n){console.error("[ChatDrawer] send message failed:",n),ae.current=a}},[l,m,le,$]),ze=s.useCallback(async a=>{var Xe;const{context:n,workflow:h,textModel:f,autoOpen:w=!0}=a;w&&(g(!0),e==null||e(!0)),f&&H(f);const A=await T.createSession(),L=[];n.userInstruction&&L.push(n.userInstruction),n.selection.texts.length>0&&L.push(`
|
|
2
|
+
import{aI as oe,r as s,y as r,kf as bt,i9 as vt,f_ as rt,fP as Tt,bV as ke,hm as Ct,lE as Dt,hv as Ie,hy as Rt,lF as ot,f$ as At,dM as Nt,ig as jt,ih as Lt,bD as Wt,lG as $t,lH as Pt,bj as it,h7 as qe,fR as re,lI as Ut,lJ as zt,lK as Ht,lL as Ft,lM as Gt,lN as Kt,lO as Vt,l3 as Bt,hd as $e,l2 as Ot,kR as Xt,lP as qt,lQ as Jt,hK as Qt,hw as Je,bL as Yt,b7 as Zt,hQ as es,lR as ts,_ as ct}from"./tool-windows-C4D0lII2.js";import{u as ss,b as ns,i as Qe,V as as,j as rs,h as os,f as is}from"./use-runtime-models-BLwgp0M1.js";import{a as cs,f as Ye,b as ls}from"./model-selection-CbzU26xQ.js";import{S as ds,i as us,u as fs}from"./index-v1v0x1ci.js";import{u as ms,e as ps}from"./main-8GBlYJSO.js";const lt=oe.memo(({session:t,isActive:e,onSelect:o,onDelete:d,onRename:g})=>{const[i,c]=s.useState(!1),[l,I]=s.useState(t.title),M=s.useRef(null),S=s.useCallback(()=>{i||o()},[o,i]),E=s.useCallback(_=>{_.stopPropagation(),d()},[d]),D=s.useCallback(_=>{_.stopPropagation(),I(t.title),c(!0)},[t.title]),y=s.useCallback(()=>{const _=l.trim();_&&_!==t.title&&g(_),c(!1)},[l,t.title,g]),z=s.useCallback(()=>{I(t.title),c(!1)},[t.title]),k=s.useCallback(_=>{_.key==="Enter"?(_.preventDefault(),y()):_.key==="Escape"&&(_.preventDefault(),z())},[y,z]),b=s.useCallback(_=>{I(_.target.value)},[]);s.useEffect(()=>{i&&M.current&&(M.current.focus(),M.current.select())},[i]);const H=s.useMemo(()=>{const _=new Date(t.updatedAt),q=new Date;return _.toDateString()===q.toDateString()?_.toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit"}):_.toLocaleDateString("zh-CN",{month:"short",day:"numeric"})},[t.updatedAt]);return r.jsxs("div",{className:`session-item ${e?"session-item--active":""} ${i?"session-item--editing":""}`,"data-track":"chat_click_session_select",onClick:S,role:"button",tabIndex:0,onKeyDown:_=>!i&&_.key==="Enter"&&S(),children:[r.jsxs("div",{className:"session-item__content",children:[i?r.jsx("input",{ref:M,className:"session-item__title-input",value:l,onChange:b,onKeyDown:k,onBlur:y,onClick:_=>_.stopPropagation(),maxLength:50}):r.jsx("div",{className:"session-item__title",children:t.title}),r.jsx("div",{className:"session-item__time",children:H})]}),!i&&r.jsxs("div",{className:"session-item__actions",children:[r.jsx("button",{className:"session-item__edit","data-track":"chat_click_session_edit",onClick:D,"aria-label":`编辑会话标题: ${t.title}`,children:r.jsx(bt,{size:14})}),r.jsx("button",{className:"session-item__delete","data-track":"chat_click_session_delete",onClick:E,"aria-label":`删除会话: ${t.title}`,children:r.jsx(vt,{size:14})})]})]})});lt.displayName="SessionItem";const dt=oe.memo(({sessions:t,activeSessionId:e,onSelectSession:o,onNewSession:d,onDeleteSession:g,onRenameSession:i})=>{const[c,l]=oe.useState(null),I=s.useCallback(y=>{o(y)},[o]),M=s.useCallback(y=>{l(y)},[]),S=s.useCallback(()=>{c&&(g(c),l(null))},[c,g]),E=s.useCallback(()=>{l(null)},[]),D=s.useCallback((y,z)=>{i(y,z)},[i]);return r.jsxs("div",{className:"session-list",children:[r.jsxs("div",{className:"session-list__header",children:[r.jsx("span",{className:"session-list__title",children:"会话列表"}),r.jsxs("button",{className:"session-list__new-btn","data-track":"chat_click_session_new",onClick:d,"aria-label":"新建会话",children:[r.jsx(rt,{size:14}),r.jsx("span",{children:"新建"})]})]}),r.jsx("div",{className:"session-list__items",children:t.length===0?r.jsx("div",{className:"session-list__empty",children:"暂无会话"}):t.map(y=>r.jsx(lt,{session:y,isActive:y.id===e,onSelect:()=>I(y.id),onDelete:()=>M(y.id),onRename:z=>D(y.id,z)},y.id))}),r.jsx(Tt,{open:c!==null,title:"删除会话",description:"确定删除此会话吗?删除后无法恢复。",confirmText:"删除",cancelText:"取消",danger:!0,onOpenChange:y=>{y||E()},onConfirm:S})]})});dt.displayName="SessionList";const ut=oe.memo(({isOpen:t,onClick:e,drawerWidth:o})=>{const d=t&&o?{right:o-18}:void 0;return r.jsx(ke,{content:t?"收起对话":"展开对话",children:r.jsx("button",{className:`chat-drawer-trigger ${t?"chat-drawer-trigger--active":""}`,"data-track":t?"chat_click_drawer_close":"chat_click_drawer_open",onClick:e,"aria-label":t?"收起对话":"展开对话","aria-expanded":t,style:d,children:r.jsx(Ct,{size:16,className:"chat-drawer-trigger__icon"})})})});ut.displayName="ChatDrawerTrigger";function Ee(t){return t.sourceProfileName||ot[t.vendor]||t.id}const hs=oe.memo(({model:t})=>{const e=os(t.sourceProfileId,t.id);return e?r.jsx("span",{className:"model-selector__item-price",children:e}):null}),gs=oe.memo(({model:t})=>{const e=is(t.sourceProfileId,t.id);return e!=null&&e.description?r.jsx("div",{className:"model-selector__item-desc",children:e.description}):null});function ws(t,e){var i;const o=Ee(t),d=(i=t.description)==null?void 0:i.trim(),g=(e==null?void 0:e.includeProvider)??!0;return d?!g||d.includes(o)?d:`${o} · ${d}`:g?o:""}function _s(t){return Ee(t).trim().slice(0,1).toUpperCase()||"M"}const ft=oe.memo(({className:t,value:e,valueRef:o,onChange:d,variant:g="capsule"})=>{var $;const i=ss("text"),c=(($=i[0])==null?void 0:$.id)||Dt,[l,I]=s.useState(c),[M,S]=s.useState(()=>Ie(null,c)),E=e??l,D=o===void 0?M:o,[y,z]=s.useState(!1),[k,b]=s.useState(""),[H,_]=s.useState(null),q=s.useRef(null),O=s.useRef(null);s.useEffect(()=>{!e&&c&&l!==c&&(I(c),S(Ie(null,c)))},[c,l,e]),s.useEffect(()=>{if(!y)return;const p=m=>{const U=m.target;q.current&&!q.current.contains(U)&&O.current&&!O.current.contains(U)&&(z(!1),b(""))},u=setTimeout(()=>{document.addEventListener("mousedown",p)},100);return()=>{clearTimeout(u),document.removeEventListener("mousedown",p)}},[y]);const V=s.useMemo(()=>E?cs(E,D):null,[E,D]),j=s.useMemo(()=>{if(Ye(i,E,D)||!E)return i;const u=Rt("text",E,D);return u?[u,...i]:i},[i,E,D]),x=s.useMemo(()=>Ye(j,E,D)||j.find(p=>p.id===E),[j,E,D]),C=s.useCallback(p=>{const u=Ie(p.sourceProfileId||null,p.id);e===void 0&&I(p.id),o===void 0&&S(u),d==null||d(p.id,u),z(!1),b("")},[e,o,d]),P=s.useCallback(()=>{const p=!y;z(p),p?_((x==null?void 0:x.vendor)||null):b("")},[x==null?void 0:x.vendor,y]),W=s.useMemo(()=>{const p=new Map,u=[];return j.forEach(m=>{p.has(m.vendor)||(u.push(m.vendor),p.set(m.vendor,0)),p.set(m.vendor,(p.get(m.vendor)??0)+1)}),u.map(m=>({id:m,label:ot[m],count:p.get(m)??0,icon:r.jsx(ns,{vendor:m,size:14})}))},[j]),ne=s.useCallback(p=>{_(p)},[]),ie=s.useMemo(()=>{const p=k.toLowerCase().trim();return p?j.filter(u=>{var U,J;const m=Ee(u).toLowerCase();return u.id.toLowerCase().includes(p)||u.label.toLowerCase().includes(p)||((U=u.shortLabel)==null?void 0:U.toLowerCase().includes(p))||((J=u.description)==null?void 0:J.toLowerCase().includes(p))||m.includes(p)}):H?j.filter(u=>u.vendor===H):j},[k,H,j]),[X,Z]=s.useState({top:0,left:0,width:0,bottom:0,placement:"bottom",maxHeight:480});s.useLayoutEffect(()=>{if(!y)return;const p=()=>{if(!O.current)return;const u=O.current.getBoundingClientRect(),m=window.innerHeight,U=m-u.bottom,J=u.top,de=U<400&&J>U?"top":"bottom",ee=de==="top"?J-16:m-u.bottom-16;Z({top:u.top,left:u.left,width:u.width,bottom:u.bottom,placement:de,maxHeight:Math.min(Math.max(ee,200),600)})};return p(),window.addEventListener("resize",p),window.addEventListener("scroll",p,!0),()=>{window.removeEventListener("resize",p),window.removeEventListener("scroll",p,!0)}},[y]);const le=()=>{if(!y)return null;const p=r.jsxs("div",{ref:q,className:"model-selector__dropdown",style:{position:"fixed",zIndex:Nt.DROPDOWN_PORTAL,left:X.left,top:X.placement==="bottom"?X.bottom+8:"auto",bottom:X.placement==="top"?window.innerHeight-X.top+8:"auto",minWidth:360,width:g==="form"?X.width:"auto",maxHeight:X.maxHeight,visibility:X.width===0?"hidden":"visible",transformOrigin:X.placement==="bottom"?"top left":"bottom left",display:"flex",flexDirection:"column"},onClick:u=>u.stopPropagation(),children:[r.jsx("div",{className:"model-selector__search",children:r.jsx(jt,{value:k,onChange:b,placeholder:"搜索模型...",prefixIcon:r.jsx(Lt,{}),clearable:!0,autofocus:!0})}),r.jsx(as,{tabs:W,activeTab:H,onTabChange:ne,searchQuery:k,compact:!0,children:r.jsx("div",{className:"model-selector__list",children:ie.length===0?r.jsx("div",{className:"model-selector__empty",children:"未找到匹配的模型"}):ie.map(u=>{const m=ls(u),U=m===V,J=!!k.trim(),de=ws(u,{includeProvider:!J});return r.jsxs("button",{className:`model-selector__item ${U?"model-selector__item--active":""}`,"data-track":"chat_click_model_select",onClick:()=>C(u),children:[r.jsx("span",{className:"model-selector__item-icon model-selector__item-icon--text","aria-hidden":"true",children:_s(u)}),r.jsxs("div",{className:"model-selector__item-content",children:[r.jsxs("div",{className:"model-selector__item-header",children:[r.jsx("span",{className:"model-selector__item-name",children:u.shortLabel||u.label}),J?r.jsx("span",{className:"model-selector__item-provider",children:Ee(u)}):null,r.jsx(Qe,{modelId:u.id,profileId:u.sourceProfileId||null}),r.jsx(rs,{modelId:u.id}),r.jsx(hs,{model:u})]}),de?r.jsx("div",{className:"model-selector__item-desc",children:de}):r.jsx(gs,{model:u})]}),U&&r.jsx("svg",{className:"model-selector__check",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",children:r.jsx("path",{d:"M13.3334 4L6.00002 11.3333L2.66669 8",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})]},m)})})})]});return Wt.createPortal(p,document.body)};return r.jsxs("div",{className:`model-selector ${t||""} model-selector--variant-${g}`,children:[r.jsxs("button",{ref:O,className:`model-selector__trigger ${y?"model-selector__trigger--active":""}`,"data-track":"chat_click_model_selector",onClick:P,"aria-label":"选择模型","aria-expanded":y,children:[r.jsxs("div",{className:"model-selector__trigger-content",children:[r.jsx(Qe,{modelId:(x==null?void 0:x.id)||E,profileId:(x==null?void 0:x.sourceProfileId)||null,className:"model-selector__trigger-health"}),r.jsx("span",{className:"model-selector__trigger-text",children:(x==null?void 0:x.shortLabel)||(x==null?void 0:x.label)||"选择模型"})]}),r.jsx(At,{size:16,className:`model-selector__trigger-icon ${y?"model-selector__trigger-icon--open":""}`})]}),le()]})});ft.displayName="ModelSelector";const mt=s.forwardRef(({selectedContent:t,onSend:e,disabled:o=!1,placeholder:d="输入消息..."},g)=>{const i=s.useRef(null),c=s.useRef(null),[l,I]=s.useState(""),M=t.length>0,{addHistory:S}=ms();s.useImperativeHandle(g,()=>({setContent:k=>{var b;I(k),(b=i.current)==null||b.focus()},getContent:()=>l,focus:()=>{var k;return(k=i.current)==null?void 0:k.focus()}}),[l]);const E=s.useCallback(()=>{const k=l.trim();if(!k&&t.length===0)return;const b=[];k&&b.push({type:"text",text:k}),t.forEach((_,q)=>{_.type==="image"||_.type==="graphics"?b.push({type:"data-file",data:{filename:`${_.type}-${q+1}.png`,mediaType:"image/png",url:_.url||""}}):_.type==="video"&&b.push({type:"data-file",data:{filename:`video-${q+1}.mp4`,mediaType:"video/mp4",url:_.url||""}})});const H={id:`msg_${Date.now()}`,role:"user",parts:b};k&&S(k,M,"agent"),Promise.resolve(e(H)).catch(_=>{console.error("[EnhancedChatInput] send failed:",_)}),I("")},[l,t,e,S,M]),D=s.useCallback(k=>{k.nativeEvent.isComposing||k.key==="Enter"&&!k.shiftKey&&(k.preventDefault(),E())},[E]);s.useEffect(()=>{i.current&&(i.current.style.height="auto",i.current.style.height=`${Math.min(i.current.scrollHeight,120)}px`)},[l]);const y=()=>t.length===0?null:r.jsx("div",{className:"enhanced-chat-input__selection",children:r.jsx(ds,{items:t,language:"zh",enableHoverPreview:!0})}),z=(l.trim()||t.length>0)&&!o;return r.jsxs("div",{className:"enhanced-chat-input",ref:c,children:[y(),r.jsxs("div",{className:"enhanced-chat-input__form",children:[r.jsx("div",{className:"enhanced-chat-input__input-wrapper",children:r.jsx("textarea",{ref:i,className:"enhanced-chat-input__textarea",value:l,onChange:k=>I(k.target.value),onKeyDown:D,placeholder:M?"描述你想要的效果...":d,disabled:o,rows:4})}),r.jsx("button",{className:`enhanced-chat-input__send ${z?"enhanced-chat-input__send--active":""}`,onClick:E,disabled:!z,"aria-label":"发送",children:r.jsx($t,{size:20})})]})]})});mt.displayName="EnhancedChatInput";const Me={MAX_TITLE_LENGTH:30,DRAWER_MIN_WIDTH:320,DRAWER_MAX_WIDTH:500,DRAWER_DEFAULT_WIDTH_RATIO:.3},ge={DRAWER_STATE:"aitu:chat:drawer-state",ACTIVE_SESSION:"aitu:chat:active-session",DATABASE_NAME:"aitu-chat",SESSIONS_STORE:"sessions",MESSAGES_STORE:"messages"},_e=it.createInstance({name:ge.DATABASE_NAME,storeName:ge.SESSIONS_STORE}),pe=it.createInstance({name:ge.DATABASE_NAME,storeName:ge.MESSAGES_STORE});function pt(){return Pt()}function Ss(t){const e=t.trim().replace(/\n/g," ");return e.length<=Me.MAX_TITLE_LENGTH?e:e.slice(0,Me.MAX_TITLE_LENGTH-3)+"..."}async function xs(){const t=Date.now(),e={id:pt(),title:"新对话",createdAt:t,updatedAt:t,messageCount:0};return await _e.setItem(e.id,e),e}async function be(t){return _e.getItem(t)}async function Is(){const t=[];return await _e.iterate(e=>{t.push(e)}),await new Promise(e=>{typeof window<"u"&&"requestIdleCallback"in window?window.requestIdleCallback(()=>e(),{timeout:50}):setTimeout(e,0)}),t.sort((e,o)=>o.updatedAt-e.updatedAt)}async function Ue(t,e){const o=await be(t);if(o){const d={...o,...e,updatedAt:Date.now()};await _e.setItem(t,d)}}async function Ms(t){const e=await ht(t);for(const o of e)await pe.removeItem(o.id);await _e.removeItem(t)}async function ys(t){await pe.setItem(t.id,t);const e=await be(t.sessionId);if(e){const o={messageCount:e.messageCount+1,updatedAt:Date.now()};await Ue(t.sessionId,o)}}async function ht(t){const e=[];return await pe.iterate(o=>{o.sessionId===t&&e.push(o)}),e.sort((o,d)=>o.timestamp-d.timestamp)}async function ks(t,e){const o=await pe.getItem(t);if(o){const d={...o,...e};await pe.setItem(t,d)}}async function Es(t){const e=await pe.getItem(t);if(e){await pe.removeItem(t);const o=await be(e.sessionId);o&&await Ue(e.sessionId,{messageCount:Math.max(0,o.messageCount-1)})}}const Ze={isOpen:!1,width:Math.min(Me.DRAWER_MAX_WIDTH,Math.max(Me.DRAWER_MIN_WIDTH,window.innerWidth*Me.DRAWER_DEFAULT_WIDTH_RATIO)),activeSessionId:null};function gt(){try{const t=localStorage.getItem(ge.DRAWER_STATE);if(t)return{...Ze,...JSON.parse(t)}}catch(t){console.error("[ChatStorage] Failed to get drawer state:",t)}return Ze}function bs(t){try{const o={...gt(),...t};localStorage.setItem(ge.DRAWER_STATE,JSON.stringify(o))}catch(e){console.error("[ChatStorage] Failed to set drawer state:",e)}}async function vs(){await _e.clear(),await pe.clear(),localStorage.removeItem(ge.DRAWER_STATE)}const T={createSession:xs,getSession:be,getAllSessions:Is,updateSession:Ue,deleteSession:Ms,addMessage:ys,getMessages:ht,updateMessage:ks,deleteMessage:Es,getDrawerState:gt,setDrawerState:bs,clearAllData:vs,generateId:pt,generateTitle:Ss};var Y=(t=>(t.SENDING="sending",t.STREAMING="streaming",t.SUCCESS="success",t.FAILED="failed",t))(Y||{}),se=(t=>(t.USER="user",t.ASSISTANT="assistant",t))(se||{});let ce=null;function wt(t){const e={};let o=1,d=1,g=1,i=t;return i=i.replace(/data:image\/[^;]+;base64,[A-Za-z0-9+/=]+/g,c=>{const l=`[图片${o}]`;return e[l]=c,o++,l}),i=i.replace(/data:video\/[^;]+;base64,[A-Za-z0-9+/=]+/g,c=>{const l=`[视频${d}]`;return e[l]=c,d++,l}),i=i.replace(/blob:[^\s"'<>]+/g,c=>{const l=`[媒体${g}]`;return e[l]=c,g++,l}),i=i.replace(/https?:\/\/[^\s"'<>]+\.(png|jpg|jpeg|gif|webp|svg|bmp)(\?[^\s"'<>]*)?/gi,c=>{const l=`[图片${o}]`;return e[l]=c,o++,l}),i=i.replace(/https?:\/\/[^\s"'<>]+\.(mp4|webm|mov|avi|mkv)(\?[^\s"'<>]*)?/gi,c=>{const l=`[视频${d}]`;return e[l]=c,d++,l}),{sanitized:i,urlMap:e}}function Ts(t,e){let o=t;for(const[d,g]of Object.entries(e))o=o.split(d).join(g);return o}async function Cs(t,e={}){const o={};let d=e.maxImageCount??Number.POSITIVE_INFINITY;return{geminiMessages:await Promise.all(t.filter(i=>i.status==="success"||i.status==="streaming").map(async i=>{const{sanitized:c,urlMap:l}=wt(i.content);Object.assign(o,l);const I=[{type:"text",text:c}];if(e.includeImageAttachments&&i.role===se.USER&&i.attachments&&i.attachments.length>0&&d>0){const M=await Vt(i.attachments,d);d-=M.length,I.push(...M)}return{role:i.role===se.USER?"user":"assistant",content:I}})),urlMap:o}}async function Ds(t,e,o=[],d,g,i){return Rs(t,e,o,d,g,i)}async function Rs(t,e,o=[],d,g,i){ce&&ce.abort(),ce=new AbortController;const c=ce.signal,l=Date.now().toString(),I=Date.now(),M=(typeof g=="string"?g:g==null?void 0:g.modelId)||qe.getConfig().modelName||"unknown";try{re.trackModelCall({taskId:l,taskType:"chat",model:M,promptLength:e.length,hasUploadedImage:o.length>0,startTime:I});const S=Ut("text",g),E=zt(S==null?void 0:S.binding),D=Ht(S==null?void 0:S.binding),y=Ft(o),z=Math.max(D-y,0),{geminiMessages:k,urlMap:b}=await Cs(t,{includeImageAttachments:E,maxImageCount:z}),{sanitized:H,urlMap:_}=wt(e),q={...b,..._},O=Gt(k),V=Math.max(D-O,0),j=[{type:"text",text:H}];if(E&&o.length>0&&V>0){const W=await Kt(o,V);j.push(...W)}const x=[];i&&x.push({role:"system",content:[{type:"text",text:i}]}),x.push(...k,{role:"user",content:j});let C="";if(await qe.sendChat(x,W=>{if(c.aborted)return;const ne=Ts(W,q);C=ne,d({type:"content",content:ne})},c,g||void 0),c.aborted)throw new Error("Request cancelled");const P=Date.now()-I;return re.trackModelSuccess({taskId:l,taskType:"chat",model:M,duration:P,resultSize:C.length}),d({type:"done"}),ce=null,C}catch(S){ce=null;const E=Date.now()-I;if(c.aborted||S.message==="Request cancelled"||S.name==="AbortError")throw re.trackTaskCancellation({taskId:l,taskType:"chat",duration:E}),d({type:"done"}),new Error("Request cancelled");const D=S instanceof Error?S.message:"Unknown error occurred";throw re.trackModelFailure({taskId:l,taskType:"chat",model:M,duration:E,error:D}),d({type:"error",error:D}),S}}function As(){ce&&(ce.abort(),ce=null)}function Ns(){return ce!==null}const et={sendChatMessage:Ds,stopGeneration:As,isGenerating:Ns},Pe="[[WORKFLOW_MESSAGE]]",js=["generate_image","generate_video","generate_grid_image","generate_photo_wall"];function Ls(t){var g;if(!js.includes(t.name))return t;const e={...t.arguments},o=e.model;let d=!1;if(!o)d=!0;else{const i=Bt(o),c=t.name==="generate_video";(c&&i!=="video"||!c&&i!=="image")&&(d=!0)}if(d){const i=$e.get(),c=t.name==="generate_video";let l;c?l=i.videoModelName||"veo3":l=i.imageModelName||((g=Ot[0])==null?void 0:g.id)||"gemini-2.5-flash-image-vip",e.model=l}return{...t,arguments:e}}function Ws(t){const e=[];t.aiAnalysis&&e.push(t.aiAnalysis);const o=t.steps.filter(c=>c.status==="completed"),d=t.steps.filter(c=>c.status==="failed");if(o.length>0||d.length>0){const c=[];o.length>0&&c.push(`成功执行 ${o.length} 个工具`),d.length>0&&c.push(`${d.length} 个工具执行失败`),c.length>0&&e.push(`[执行结果: ${c.join(",")}]`)}const g=t.steps.map(c=>{const l={};for(const[I,M]of Object.entries(c.args||{}))I!=="context"&&(typeof M=="string"&&M.length>200?l[I]=M.substring(0,200)+"...":l[I]=M);return{mcp:c.mcp,args:l}}),i={content:e.join(`
|
|
3
|
+
`)||`已完成任务: ${t.name}`,next:g};return JSON.stringify(i)}function $s(t){const e=[{type:"text",text:t.content}];if(t.attachments&&t.attachments.length>0)for(const o of t.attachments)e.push({type:"data-file",data:{filename:o.name,mediaType:o.type,url:o.data}});return{id:t.id,role:t.role===se.USER?"user":"assistant",parts:e}}function Ps(t,e){const d=t.parts.filter(c=>c.type==="text").map(c=>c.text).join(""),i=t.parts.filter(c=>c.type==="data-file").map((c,l)=>{const I=c.data;return{id:`${t.id}-att-${l}`,name:I.filename,type:I.mediaType,size:0,data:I.url,isBlob:!1}});return{id:t.id,sessionId:e,role:t.role==="user"?se.USER:se.ASSISTANT,content:d,timestamp:Date.now(),status:Y.SUCCESS,attachments:i.length>0?i:void 0}}function Us(t){return t.workflow&&t.content.startsWith(Pe)?{...t,content:Ws(t.workflow)}:t}function tt(t){return t.parts.filter(e=>e.type==="text").map(e=>e.text).join("")}us();function zs(t){const{sessionId:e,temporaryModel:o,onToolCalls:d,onWorkflowUpdate:g}=t,i=s.useRef(Xt()),c=s.useRef(d);c.current=d;const l=s.useRef(g);l.current=g;const I=s.useRef(o);I.current=o;const[M,S]=s.useState([]),[E,D]=s.useState("ready"),[y,z]=s.useState(!1),k=s.useRef(null),b=s.useRef([]),H=s.useRef(!1);s.useEffect(()=>{if(!e){S([]),b.current=[];return}(async()=>{z(!0);try{const C=await T.getMessages(e);b.current=C,S(C.map($s))}catch(C){console.error("[useChatHandler] Failed to load messages:",C),S([]),b.current=[]}finally{z(!1)}})()},[e]);const _=s.useCallback(async x=>{if(!e)return;if(H.current){console.warn("[useChatHandler] Message already being sent, ignoring duplicate call");return}H.current=!0,D("submitted");const C=Ps(x,e);await T.addMessage(C),S($=>[...$,x]);const P=await T.getSession(e);await T.updateSession(e,{updatedAt:Date.now(),messageCount:((P==null?void 0:P.messageCount)||0)+1});const W=T.generateId();k.current=W;const ne={id:W,role:"assistant",parts:[{type:"text",text:""}]};S($=>[...$,ne]),D("streaming");const ie=b.current.map(Us);ie.push(C),b.current=[...b.current,C];const X=tt(x);let Z="",le=!1;try{await et.sendChatMessage(ie.slice(0,-1),X,C.attachments||[],$=>{if($.type==="content"&&$.content)Z=$.content,S(p=>p.map(u=>u.id===W?{...u,parts:[{type:"text",text:Z}]}:u));else if($.type==="done"){const p=qt(Z),u=Jt(Z)||Z;if(p.length>0&&c.current){const U=p.map(ee=>Ls(ee)),J=async()=>{const ee=[];for(const ue of U)try{const fe=await Qt.executeTool(ue);ee.push({toolCall:ue,success:fe.success,data:fe.data,error:fe.error,taskId:fe.taskId})}catch(fe){ee.push({toolCall:ue,success:!1,error:fe.message||"工具执行失败"})}return ee},de=`${Pe}${W}`;S(ee=>ee.map(ue=>ue.id===W?{...ue,parts:[{type:"text",text:de}]}:ue)),c.current(U,W,J,u)}D("ready");const m={id:W,sessionId:e,role:se.ASSISTANT,content:p.length>0?`${Pe}${W}`:Z,timestamp:Date.now(),status:p.length>0?Y.STREAMING:Y.SUCCESS};T.addMessage(m),b.current=[...b.current,m],T.updateSession(e,{updatedAt:Date.now(),messageCount:((P==null?void 0:P.messageCount)||0)+2}),k.current=null,H.current=!1}else if($.type==="error"&&$.error){le=!0,D("error");const p=`❌ 错误: ${$.error}`;S(m=>m.map(U=>U.id===W?{...U,parts:[{type:"text",text:p}]}:U));const u={id:W,sessionId:e,role:se.ASSISTANT,content:p,timestamp:Date.now(),status:Y.FAILED,error:$.error};T.addMessage(u),b.current=[...b.current,u],k.current=null,H.current=!1}},I.current,i.current)}catch($){if($.message!=="Request cancelled"&&!le){D("error"),console.error("[useChatHandler] Stream error:",$);const p=`❌ 错误: ${$.message||"未知错误"}`;if(S(u=>u.map(m=>m.id===W?{...m,parts:[{type:"text",text:p}]}:m)),e&&W){const u={id:W,sessionId:e,role:se.ASSISTANT,content:p,timestamp:Date.now(),status:Y.FAILED,error:$.message||"未知错误"};T.addMessage(u),b.current=[...b.current,u]}}k.current=null,H.current=!1}},[e]),q=s.useCallback(async()=>{if(et.stopGeneration(),D("ready"),k.current&&e){const x=M.find(C=>C.id===k.current);if(x){const C=tt(x),P={id:x.id,sessionId:e,role:se.ASSISTANT,content:C,timestamp:Date.now(),status:Y.SUCCESS};await T.addMessage(P)}k.current=null}},[e,M]),O=s.useCallback(x=>{if(M.length<2)return;const C=[...M].reverse().findIndex(ie=>ie.role==="user");if(C===-1)return;const P=M.length-1-C,W=M[P],ne=M.slice(0,P+1);S(ne),_(W)},[M,_]),V=s.useCallback((x,C)=>{S(x),C&&(b.current=C)},[]),j=s.useCallback((x,C)=>{b.current=b.current.map(P=>P.id===x?{...P,workflow:C}:P)},[]);return{messages:M,status:E,sendMessage:_,stop:q,regenerate:O,setMessages:S,setMessagesWithRaw:V,updateRawMessageWorkflow:j,isLoading:y}}const Hs=oe.lazy(()=>ct(()=>import("./ChatMessagesArea-D9LNDmbK.js").then(t=>t.C),__vite__mapDeps([0,1,2,3,4,5,6]),import.meta.url)),st="[[WORKFLOW_MESSAGE]]";function Fs(t,e){switch(t){case"generate_image":return`生成图片: ${((e==null?void 0:e.prompt)||"").substring(0,30)}...`;case"generate_video":return`生成视频: ${((e==null?void 0:e.prompt)||"").substring(0,30)}...`;case"generate_audio":return`生成音频: ${((e==null?void 0:e.prompt)||"").substring(0,30)}...`;case"generate_text":return`生成文本: ${((e==null?void 0:e.prompt)||"").substring(0,30)}...`;case"generate_grid_image":return`生成宫格图: ${((e==null?void 0:e.theme)||"").substring(0,30)}...`;case"canvas_insertion":return"插入到画布";case"generate_mermaid":return"生成流程图";case"generate_mindmap":return"生成思维导图";default:return`执行 ${t}`}}const nt="chat-drawer-width",Gs=Math.max(375,window.innerWidth*.5),at=375,Ks=s.forwardRef(({defaultOpen:t=!1,onOpenChange:e},o)=>{const[d,g]=s.useState(()=>T.getDrawerState().isOpen??t),[i,c]=s.useState([]),[l,I]=s.useState(null),[M,S]=s.useState(!1),[E,D]=s.useState(()=>{const a=localStorage.getItem(nt);if(a){const n=parseInt(a,10);if(!isNaN(n)&&n>=at)return Math.min(n,window.innerWidth-60)}return Gs}),[y,z]=s.useState(!1),k=s.useRef(null),[b,H]=s.useState(()=>Je("text").modelId),[_,q]=s.useState(()=>{const a=Je("text");return Ie(a.profileId,a.modelId)}),[O,V]=s.useState(new Map),j=s.useRef(null),[x,C]=s.useState(null),{executeRetry:P,selectedContent:W,setIsDrawerOpen:ne,setDrawerWidth:ie}=ps();s.useEffect(()=>{ne(d)},[d,ne]),s.useEffect(()=>{ie(E)},[E,ie]);const X=oe.useRef(null),Z=oe.useRef(null),{appState:le,setAppState:$}=Yt();s.useEffect(()=>{if(!y)return;const a=h=>{const f=window.innerWidth-h.clientX,w=Math.max(at,Math.min(f,window.innerWidth-60));D(w)},n=()=>{z(!1),localStorage.setItem(nt,String(E))};return document.addEventListener("mousemove",a),document.addEventListener("mouseup",n),document.body.style.userSelect="none",document.body.style.cursor="ew-resize",()=>{document.removeEventListener("mousemove",a),document.removeEventListener("mouseup",n),document.body.style.userSelect="",document.body.style.cursor=""}},[y,E]),s.useEffect(()=>{const a=()=>{const n=window.innerWidth-60;E>n&&D(n)};return window.addEventListener("resize",a),()=>window.removeEventListener("resize",a)},[E]);const p=s.useCallback(a=>{a.preventDefault(),z(!0)},[]),u=s.useCallback(async(a,n,h,f)=>{var L,v;const A={id:`workflow-${Date.now()}`,name:"AI 智能生成",generationType:(L=a[0])!=null&&L.name.includes("video")?"video":(v=a[0])!=null&&v.name.includes("audio")?"audio":"image",prompt:f||"",aiAnalysis:f,count:a.length,steps:a.map((R,K)=>({id:`step-${K}`,mcp:R.name,status:"pending",description:Fs(R.name,R.arguments),args:R.arguments}))};V(R=>{const K=new Map(R);return K.set(n,A),K}),j.current=n,T.updateMessage(n,{workflow:A});try{const R=await h();re.track("chat_tool_execution_complete",{success:!0,resultCount:R.length}),V(K=>{const N=new Map(K),F=N.get(n);if(F){const B={...F,steps:F.steps.map((me,xe)=>{const Q=R[xe];return{...me,status:Q!=null&&Q.success?"completed":"failed",error:Q==null?void 0:Q.error,result:Q==null?void 0:Q.data}})};N.set(n,B),T.updateMessage(n,{workflow:B,status:Y.SUCCESS})}return N})}catch(R){console.error("[ChatDrawer] Tool execution failed:",R),V(K=>{const N=new Map(K),F=N.get(n);if(F){const B={...F,steps:F.steps.map(me=>({...me,status:"failed",error:R.message||"执行失败"}))};N.set(n,B),T.updateMessage(n,{workflow:B,status:Y.FAILED})}return N})}},[]),m=zs({sessionId:l,temporaryModel:_||b,onToolCalls:u}),U=s.useRef(m.sendMessage);U.current=m.sendMessage,s.useEffect(()=>{(async()=>{const n=T.getDrawerState(),h=await T.getAllSessions();c(h);let f=null;if(n.activeSessionId?(f=n.activeSessionId,I(n.activeSessionId)):h.length>0&&(f=h[0].id,I(h[0].id)),f)try{const w=await T.getMessages(f),A=new Map;for(const v of w)v.workflow&&A.set(v.id,v.workflow);V(A);const L=w.find(v=>v.workflow&&v.status===Y.STREAMING);j.current=(L==null?void 0:L.id)||null}catch(w){console.error("[ChatDrawer] Failed to load workflow messages:",w)}})()},[]),s.useEffect(()=>{T.setDrawerState({isOpen:d,activeSessionId:l})},[d,l]),s.useEffect(()=>{if(l&&ae.current){const a=ae.current;ae.current=null,setTimeout(()=>{U.current(a)},100)}},[l]),s.useEffect(()=>{if(!le.openSettings&&ae.current){const a=$e.get();if(a!=null&&a.apiKey){const n=ae.current;ae.current=null,l?setTimeout(()=>{U.current(n)},100):(async()=>{const h=await T.createSession();c(f=>[h,...f]),I(h.id),ae.current=n})()}}},[le.openSettings,l]),s.useEffect(()=>{const a=n=>{n.key==="Escape"&&d&&(g(!1),e==null||e(!1))};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[d,e]),s.useEffect(()=>{let a=null;return(async()=>{const{workflowSubmissionService:h}=await ct(async()=>{const{workflowSubmissionService:f}=await import("./workflow-submission-service-C-eCWm_8.js").then(w=>w.a);return{workflowSubmissionService:f}},__vite__mapDeps([0]),import.meta.url);a=h.subscribeToAllEvents(f=>{const w=f;V(A=>{let L=null;for(const[N,F]of A.entries())if(F.id===w.workflowId){L=N;break}if(!L)return A;const v=A.get(L);if(!v)return A;const R=new Map(A);let K;switch(w.type){case"step":{K={...v,steps:v.steps.map(N=>N.id===w.stepId?{...N,status:w.status||N.status,result:w.result??N.result,error:w.error??N.error}:N)};break}case"steps_added":{const F=(w.steps||[]).map(B=>({id:B.id,mcp:B.mcp,args:B.args,description:B.description,status:B.status}));K={...v,steps:[...v.steps,...F]};break}case"completed":case"failed":{const N=w.type==="completed"?"completed":"failed";K={...v,status:N,steps:v.steps.map(F=>{if(F.status==="running"||F.status==="pending"){const B=F.result;return B!=null&&B.taskId?F:{...F,status:N,error:w.type==="failed"?w.error:void 0}}return F})};break}default:return A}return R.set(L,K),T.updateMessage(L,{workflow:K}),R})})})().catch(h=>{console.error("[ChatDrawer] Failed to setup workflow sync:",h)}),()=>{a==null||a.unsubscribe()}},[]),s.useEffect(()=>{if(!M)return;const a=h=>{const f=h.target;f.closest(".t-dialog")===null&&X.current&&!X.current.contains(f)&&Z.current&&!Z.current.contains(f)&&S(!1)},n=setTimeout(()=>{document.addEventListener("mousedown",a)},100);return()=>{clearTimeout(n),document.removeEventListener("mousedown",a)}},[M]);const J=s.useCallback(()=>{g(a=>{const n=!a;return e==null||e(n),n})},[e]),de=s.useCallback(()=>{g(!1),e==null||e(!1)},[e]),ee=s.useCallback(async()=>{re.track("chat_session_create");const a=await T.createSession();c(n=>[a,...n]),I(a.id),S(!1),V(new Map),j.current=null,H(void 0)},[]),ue=s.useCallback(()=>{S(a=>!a)},[]),fe=s.useCallback(async a=>{re.track("chat_session_select"),I(a),S(!1),H(void 0);try{const n=await T.getMessages(a),h=new Map;for(const w of n)w.workflow&&h.set(w.id,w.workflow);V(h);const f=n.find(w=>w.workflow&&w.status===Y.STREAMING);j.current=(f==null?void 0:f.id)||null}catch(n){console.error("[ChatDrawer] Failed to load workflow messages:",n),V(new Map),j.current=null}},[]),_t=s.useCallback(async a=>{re.track("chat_session_delete"),await T.deleteSession(a),c(n=>{const h=n.filter(f=>f.id!==a);if(l===a){const f=h[0]||null;I((f==null?void 0:f.id)||null)}return h})},[l]),ve=s.useCallback(async(a,n)=>{re.track("chat_session_rename"),await T.updateSession(a,{title:n}),c(h=>h.map(f=>f.id===a?{...f,title:n}:f))},[]),ae=oe.useRef(null),Se=s.useCallback(async a=>{try{re.track("chat_message_send",{hasImages:a.parts.some(h=>h.type==="image_url")});const n=$e.get();if(!(n!=null&&n.apiKey)){ae.current=a,$({...le,openSettings:!0});return}if(ae.current=null,!l){const h=await T.createSession();c(f=>[h,...f]),I(h.id),ae.current=a;return}await m.sendMessage(a)}catch(n){console.error("[ChatDrawer] send message failed:",n),ae.current=a}},[l,m,le,$]),ze=s.useCallback(async a=>{var Xe;const{context:n,workflow:h,textModel:f,autoOpen:w=!0}=a;w&&(g(!0),e==null||e(!0)),f&&H(f);const A=await T.createSession(),L=[];n.userInstruction&&L.push(n.userInstruction),n.selection.texts.length>0&&L.push(`
|
|
4
4
|
📝 选中的文本:
|
|
5
5
|
${n.selection.texts.join(`
|
|
6
6
|
`)}`),n.selection.texts.length===0&&!n.userInstruction&&n.finalPrompt&&L.push(`
|