chatlab-cli 0.32.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/README.md +2 -1
  2. package/dist/{chat-command-3KUWKS53.mjs → chat-command-XPY3WURC.mjs} +9 -9
  3. package/dist/{chunk-LNU4RW5G.mjs → chunk-AQPDZAWB.mjs} +1604 -1327
  4. package/dist/chunk-AQPDZAWB.mjs.map +1 -0
  5. package/dist/{chunk-UVCH2ICD.mjs → chunk-BQ3QN4QT.mjs} +3 -3
  6. package/dist/{chunk-DV4U34MR.mjs → chunk-DGF3S3TZ.mjs} +2 -2
  7. package/dist/{chunk-3J7WTUEE.mjs → chunk-IGEHMLHM.mjs} +2 -2
  8. package/dist/{chunk-CANPJOIE.mjs → chunk-IGK6UMN2.mjs} +112 -16
  9. package/dist/chunk-IGK6UMN2.mjs.map +1 -0
  10. package/dist/{chunk-BLOBEOCG.mjs → chunk-ISRLGLUL.mjs} +2 -2
  11. package/dist/{chunk-27DWKA3L.mjs → chunk-JCSPDTZL.mjs} +15 -62
  12. package/dist/chunk-JCSPDTZL.mjs.map +1 -0
  13. package/dist/{chunk-23AIEWCD.mjs → chunk-JTOHAMIW.mjs} +2 -2
  14. package/dist/{chunk-YVNZ73O5.mjs → chunk-OLE2USEN.mjs} +4492 -4038
  15. package/dist/chunk-OLE2USEN.mjs.map +1 -0
  16. package/dist/{chunk-YAQLYL52.mjs → chunk-QZCNVAH6.mjs} +2 -2
  17. package/dist/{chunk-YAQLYL52.mjs.map → chunk-QZCNVAH6.mjs.map} +1 -1
  18. package/dist/{chunk-3IGBPOJM.mjs → chunk-S5NCEESV.mjs} +5 -4
  19. package/dist/chunk-S5NCEESV.mjs.map +1 -0
  20. package/dist/{chunk-PZM3FHVZ.mjs → chunk-UO2XVFY6.mjs} +37 -26
  21. package/dist/chunk-UO2XVFY6.mjs.map +1 -0
  22. package/dist/cli.mjs +9 -9
  23. package/dist/contacts-worker.mjs +2 -2
  24. package/dist/global-insight-worker.mjs +2 -2
  25. package/dist/{http-YR26GF7X.mjs → http-HV6XWU6X.mjs} +12 -12
  26. package/dist/{import-Q3DUACU4.mjs → import-DP2XLZ2H.mjs} +8 -8
  27. package/dist/index.mjs +12 -12
  28. package/dist/{mcp-HTVZSGTI.mjs → mcp-QDPFBPGW.mjs} +9 -9
  29. package/dist/people-relationships-worker.mjs +2 -2
  30. package/dist/semantic-index-worker.mjs +1 -1
  31. package/dist/{src-HJL7YZZJ.mjs → src-B3A2QHP5.mjs} +12 -10
  32. package/dist/{stream-import-MXETSEPW.mjs → stream-import-KEGNP3QK.mjs} +8 -8
  33. package/dist/{worker-runtime-DZQDL2E2.mjs → worker-runtime-MDYKX3BW.mjs} +6 -6
  34. package/dist-cli-web/assets/ActionToolsPanel.vue_vue_type_script_setup_true_lang-JxPR2O6b.js +110 -0
  35. package/{dist-web/assets/BufferResource-BXfwfGam.js → dist-cli-web/assets/BufferResource--dSbJb0k.js} +1 -1
  36. package/dist-cli-web/assets/CanvasRenderer-Cm_dmJXZ.js +1 -0
  37. package/dist-cli-web/assets/DataDirCleanupNotice-B0s5txX3.js +1 -0
  38. package/dist-cli-web/assets/EChartWordcloud-CwMVJLBO.js +1 -0
  39. package/{dist-web/assets/Filter-Irxx0f6j.js → dist-cli-web/assets/Filter-BjYScRpK.js} +1 -1
  40. package/dist-cli-web/assets/LoadingState.vue_vue_type_script_setup_true_lang-BshQybD_.js +1 -0
  41. package/dist-cli-web/assets/MessageExportModal-DAJW2mFj.js +1 -0
  42. package/dist-cli-web/assets/PageHeader-BKAjCuqs.js +1 -0
  43. package/{dist-web/assets/RelationshipGalaxyCanvas-ByDU6ZS_.js → dist-cli-web/assets/RelationshipGalaxyCanvas-mlZs7k4L.js} +14 -14
  44. package/{dist-web/assets/RelationshipGalaxyThreeCanvas-BluPHjCR.css → dist-cli-web/assets/RelationshipGalaxyThreeCanvas-CeYJABxI.css} +1 -1
  45. package/{dist-web/assets/RelationshipGalaxyThreeCanvas-DgAlyKjc.js → dist-cli-web/assets/RelationshipGalaxyThreeCanvas-DgMG3jdU.js} +14 -14
  46. package/{dist-web/assets/RenderTargetSystem-Cx5U5HAM.js → dist-cli-web/assets/RenderTargetSystem-D00Ex44y.js} +1 -1
  47. package/dist-cli-web/assets/ThemeCard.vue_vue_type_script_setup_true_lang-Dsb6lzs-.js +1 -0
  48. package/dist-cli-web/assets/TimeSelect.vue_vue_type_script_setup_true_lang-BfR3tlkz.js +1 -0
  49. package/{dist-web/assets/WebGLRenderer-B3Fnp1WX.js → dist-cli-web/assets/WebGLRenderer-CTTusm2n.js} +2 -2
  50. package/{dist-web/assets/WebGPURenderer-DZ0X9N86.js → dist-cli-web/assets/WebGPURenderer-pyv3EXor.js} +2 -2
  51. package/dist-cli-web/assets/annual-summary-time-range-C_d1oZrj.js +1 -0
  52. package/dist-cli-web/assets/base-D91aVUwM.js +1 -0
  53. package/{dist-web/assets/browserAll-BqC9ELNO.js → dist-cli-web/assets/browserAll-C9fW936Y.js} +1 -1
  54. package/dist-cli-web/assets/cli-web-C7uGKz_E.js +1 -0
  55. package/{dist-web/assets/dateFormat-CX9atL2g.js → dist-cli-web/assets/dateFormat-rY43adcv.js} +1 -1
  56. package/{dist-web/assets/fetch-CUT9JdXT.js → dist-cli-web/assets/fetch-C6po4XYB.js} +3 -3
  57. package/dist-cli-web/assets/fetch-CNy9OQ2g.js +1 -0
  58. package/dist-cli-web/assets/fetch-CS3T-v-1.js +1 -0
  59. package/{dist-web/assets/fetch-C3KuMfIU.js → dist-cli-web/assets/fetch-CbnX5VoM.js} +3 -3
  60. package/dist-cli-web/assets/fetch-CrSz5KJy.js +1 -0
  61. package/dist-cli-web/assets/fetch-DG3AeEjW.js +1 -0
  62. package/dist-cli-web/assets/fetch-DYNgtIcU.js +1 -0
  63. package/{dist-web/assets/fetch-th_egarZ.js → dist-cli-web/assets/fetch-DZPC3D8R.js} +2 -2
  64. package/dist-cli-web/assets/fetch-Kk2knkEo.js +1 -0
  65. package/dist-cli-web/assets/fetch-PLrI3V67.js +1 -0
  66. package/dist-cli-web/assets/index-2-OaYdzt.js +1 -0
  67. package/dist-cli-web/assets/index-2S80bo1s.js +2 -0
  68. package/dist-cli-web/assets/index-3YO6RI5e.js +2 -0
  69. package/dist-cli-web/assets/index-BKo68Iu5.js +1 -0
  70. package/{dist-web/assets/index-Bm_U0hSr.js → dist-cli-web/assets/index-BrkDgcJ6.js} +4 -4
  71. package/dist-cli-web/assets/index-CGI3Y8pq.js +1 -0
  72. package/dist-cli-web/assets/index-CW9H_fBd.js +53 -0
  73. package/dist-cli-web/assets/index-DA3Q0TGT.js +1 -0
  74. package/dist-cli-web/assets/index-DFHYr_-u.js +1 -0
  75. package/dist-cli-web/assets/index-DmrrdYXH.css +1 -0
  76. package/dist-cli-web/assets/index-DmwA85vG.js +173 -0
  77. package/dist-cli-web/assets/index-DrjoMv9s.css +1 -0
  78. package/dist-cli-web/assets/index-DsdMsKYT.js +1 -0
  79. package/dist-cli-web/assets/index-JYfjMRb-.js +1 -0
  80. package/dist-cli-web/assets/index-Jhwca9kg.css +1 -0
  81. package/dist-cli-web/assets/index-ZTgfCZvY.js +64 -0
  82. package/dist-cli-web/assets/index-vtF05fh7.css +1 -0
  83. package/dist-cli-web/assets/people-page-header-D-LWaEqn.js +1 -0
  84. package/{dist-web/assets/webworkerAll-a_fveCLR.js → dist-cli-web/assets/webworkerAll-CPOVECup.js} +1 -1
  85. package/{dist-web → dist-cli-web}/index.html +2 -4
  86. package/package.json +4 -4
  87. package/dist/chunk-27DWKA3L.mjs.map +0 -1
  88. package/dist/chunk-3IGBPOJM.mjs.map +0 -1
  89. package/dist/chunk-CANPJOIE.mjs.map +0 -1
  90. package/dist/chunk-LNU4RW5G.mjs.map +0 -1
  91. package/dist/chunk-PZM3FHVZ.mjs.map +0 -1
  92. package/dist/chunk-YVNZ73O5.mjs.map +0 -1
  93. package/dist-web/assets/ActionToolsPanel.vue_vue_type_script_setup_true_lang-DfQa9E2W.js +0 -110
  94. package/dist-web/assets/CanvasRenderer-Bvpsbxds.js +0 -1
  95. package/dist-web/assets/DataDirCleanupNotice-C0sCmNL2.js +0 -1
  96. package/dist-web/assets/EChartWordcloud-C5hLT1vS.js +0 -1
  97. package/dist-web/assets/LoadingState.vue_vue_type_script_setup_true_lang-8s6XRB3S.js +0 -1
  98. package/dist-web/assets/MessageExportModal-tTI358HU.js +0 -1
  99. package/dist-web/assets/PageHeader-D5QQI9io.js +0 -1
  100. package/dist-web/assets/ThemeCard.vue_vue_type_script_setup_true_lang-CpNjFhpm.js +0 -1
  101. package/dist-web/assets/TimeSelect.vue_vue_type_script_setup_true_lang-DtCKfbaz.js +0 -1
  102. package/dist-web/assets/annual-summary-time-range-CvG74N2l.js +0 -1
  103. package/dist-web/assets/base-DdQRTliS.js +0 -1
  104. package/dist-web/assets/electron-ChQkD5ht.js +0 -1
  105. package/dist-web/assets/electron-DGxVMsvC.js +0 -1
  106. package/dist-web/assets/electron-hcWiB7Gg.js +0 -1
  107. package/dist-web/assets/fetch-3Ifr5YJN.js +0 -1
  108. package/dist-web/assets/fetch-74o_kRZf.js +0 -1
  109. package/dist-web/assets/fetch-BKFznq4l.js +0 -1
  110. package/dist-web/assets/fetch-BPj6IlT-.js +0 -1
  111. package/dist-web/assets/fetch-CoYaXr5K.js +0 -1
  112. package/dist-web/assets/fetch-Dcg6Q6Ei.js +0 -1
  113. package/dist-web/assets/fetch-DxWfYzkB.js +0 -1
  114. package/dist-web/assets/index-B3riRaJA.js +0 -1
  115. package/dist-web/assets/index-BKFGuwJu.css +0 -1
  116. package/dist-web/assets/index-BRDdozcm.js +0 -173
  117. package/dist-web/assets/index-Bg-OiHMa.js +0 -1
  118. package/dist-web/assets/index-BhewGKey.js +0 -2
  119. package/dist-web/assets/index-BpeJ40uK.js +0 -1
  120. package/dist-web/assets/index-C6bwt1H4.js +0 -1
  121. package/dist-web/assets/index-CEJqRkis.js +0 -2
  122. package/dist-web/assets/index-CKLCaqdT.js +0 -1
  123. package/dist-web/assets/index-D8Uq3_Dc.css +0 -1
  124. package/dist-web/assets/index-DBb03wVF.css +0 -1
  125. package/dist-web/assets/index-Ds5PiVyB.js +0 -64
  126. package/dist-web/assets/index-GXMxhYc9.js +0 -1
  127. package/dist-web/assets/index-JyB6Cr8r.js +0 -25
  128. package/dist-web/assets/index-UJl03IYE.css +0 -1
  129. package/dist-web/assets/index-tx-Oal36.js +0 -1
  130. package/dist-web/assets/people-page-header-DGkK0AMO.js +0 -1
  131. package/dist-web/assets/types-CZnACqaB.js +0 -1
  132. package/dist-web/assets/vendor-nuxt-ui-DMdbdSFy.js +0 -15
  133. package/dist-web/assets/vendor-reka-ui-8_x7iKfi.js +0 -15
  134. package/dist-web/assets/web-aZcioccr.js +0 -1
  135. /package/dist/{chat-command-3KUWKS53.mjs.map → chat-command-XPY3WURC.mjs.map} +0 -0
  136. /package/dist/{chunk-UVCH2ICD.mjs.map → chunk-BQ3QN4QT.mjs.map} +0 -0
  137. /package/dist/{chunk-DV4U34MR.mjs.map → chunk-DGF3S3TZ.mjs.map} +0 -0
  138. /package/dist/{chunk-3J7WTUEE.mjs.map → chunk-IGEHMLHM.mjs.map} +0 -0
  139. /package/dist/{chunk-BLOBEOCG.mjs.map → chunk-ISRLGLUL.mjs.map} +0 -0
  140. /package/dist/{chunk-23AIEWCD.mjs.map → chunk-JTOHAMIW.mjs.map} +0 -0
  141. /package/dist/{http-YR26GF7X.mjs.map → http-HV6XWU6X.mjs.map} +0 -0
  142. /package/dist/{import-Q3DUACU4.mjs.map → import-DP2XLZ2H.mjs.map} +0 -0
  143. /package/dist/{mcp-HTVZSGTI.mjs.map → mcp-QDPFBPGW.mjs.map} +0 -0
  144. /package/dist/{src-HJL7YZZJ.mjs.map → src-B3A2QHP5.mjs.map} +0 -0
  145. /package/dist/{stream-import-MXETSEPW.mjs.map → stream-import-KEGNP3QK.mjs.map} +0 -0
  146. /package/dist/{worker-runtime-DZQDL2E2.mjs.map → worker-runtime-MDYKX3BW.mjs.map} +0 -0
  147. /package/{dist-web → dist-cli-web}/assets/ActionToolsPanel-Dp-ojXjO.css +0 -0
  148. /package/{dist-web → dist-cli-web}/assets/PageHeader-XIXMTomn.css +0 -0
  149. /package/{dist-web → dist-cli-web}/assets/index-BfO_LpDv.css +0 -0
  150. /package/{dist-web → dist-cli-web}/assets/index-ByUaiVQK.css +0 -0
  151. /package/{dist-web → dist-cli-web}/assets/index-ZsZwPLWy.css +0 -0
  152. /package/{dist-web → dist-cli-web}/assets/logo-DXIuG_WE.svg +0 -0
  153. /package/{dist-web → dist-cli-web}/assets/relationship-galaxy-viewport-Cwfa51ER.js +0 -0
  154. /package/{dist-web → dist-cli-web}/assets/vendor-echarts-B-i_56Av.js +0 -0
  155. /package/{dist-web → dist-cli-web}/assets/vendor-echarts-wordcloud-Ca8n6qS6.js +0 -0
  156. /package/{dist-web → dist-cli-web}/assets/vendor-snapdom--nZvo8Sg.js +0 -0
  157. /package/{dist-web → dist-cli-web}/assets/vendor-zrender-5DcYjSZk.js +0 -0
  158. /package/{dist-web → dist-cli-web}/favicon.ico +0 -0
@@ -0,0 +1 @@
1
+ import{d as v,A as _,c as b,g as t,F as n,G as e,o as l,Q as y,R as k,E as c,S as x,U as w,V as S,W as V,a as u,X as R,Y as C}from"./index-CW9H_fBd.js";import{P as I}from"./PageHeader-BKAjCuqs.js";import{_ as B}from"./TimeSelect.vue_vue_type_script_setup_true_lang-BfR3tlkz.js";import{p as A}from"./annual-summary-time-range-C_d1oZrj.js";import"./vendor-snapdom--nZvo8Sg.js";import"./dateFormat-rY43adcv.js";const E={class:"flex h-full flex-col text-gray-900 dark:bg-page-dark dark:text-gray-100",style:{"padding-top":"var(--titlebar-area-height)"}},P=v({__name:"index",setup(T){const{t:a}=_(),r=R(),d=A(),{modelValue:i,componentKey:g,initialState:p,rangeSource:h}=d,s=u(()=>r.name==="insight-time-investment"?"time-investment":r.name==="insight-relationship-changes"?"relationship-changes":"annual-summary"),f=u(()=>[{id:"annual-summary",label:a("insight.tabs.annualSummary"),icon:"i-lucide-calendar-range",to:{name:"insight-annual-summary"}},{id:"time-investment",label:a("insight.tabs.timeInvestment"),icon:"i-lucide-clock-3",to:{name:"insight-time-investment"}},{id:"relationship-changes",label:a("insight.tabs.relationshipChanges"),icon:"i-lucide-git-compare-arrows",to:{name:"insight-relationship-changes"}}]);return(U,m)=>(l(),b("div",E,[t(I,{title:e(a)("insight.title"),icon:"i-heroicons-presentation-chart-bar","icon-class":"bg-pink-600 text-white dark:bg-pink-500 dark:text-white",size:"compact"},{default:n(()=>[t(e(y),{class:"mt-3 pb-1.5","model-value":s.value,items:f.value,"aria-label":e(a)("insight.tabs.nav")},k({_:2},[s.value==="annual-summary"?{name:"right",fn:n(()=>[(l(),c(B,{key:e(g),modelValue:e(i),"onUpdate:modelValue":m[0]||(m[0]=o=>x(i)?i.value=o:null),"range-source":e(h),"allowed-modes":["recent","year"],"allowed-recent-days":[365],"initial-state":e(p)},null,8,["modelValue","range-source","initial-state"]))]),key:"0"}:void 0]),1032,["model-value","items","aria-label"])]),_:1},8,["title"]),t(e(V),null,{default:n(({Component:o})=>[t(w,{name:"insight-tab-slide",mode:"out-in"},{default:n(()=>[(l(),c(S(o),{key:s.value}))]),_:2},1024)]),_:1})]))}}),K=C(P,[["__scopeId","data-v-a94720f4"]]);export{K as default};
@@ -0,0 +1 @@
1
+ import{d as a,A as n,c as o,f as e,g as c,t as r,G as i,o as m,_}from"./index-CW9H_fBd.js";import"./vendor-snapdom--nZvo8Sg.js";const p={class:"flex min-h-0 flex-1 items-center justify-center px-6 py-12"},l={class:"text-center text-sm text-gray-500 dark:text-gray-400"},h=a({__name:"index",setup(d){const{t}=n();return(x,f)=>{const s=_;return m(),o("main",p,[e("div",l,[c(s,{name:"i-lucide-git-compare-arrows",class:"mx-auto mb-3 h-8 w-8 text-pink-500"}),e("p",null,r(i(t)("insight.reserved")),1)])])}}});export{h as default};
@@ -0,0 +1 @@
1
+ .fade-enter-active[data-v-84666257],.fade-leave-active[data-v-84666257]{transition:opacity .15s ease}.fade-enter-from[data-v-84666257],.fade-leave-to[data-v-84666257]{opacity:0}.fade-enter-active[data-v-243684c6],.fade-leave-active[data-v-243684c6]{transition:opacity .15s ease}.fade-enter-from[data-v-243684c6],.fade-leave-to[data-v-243684c6]{opacity:0}.fade-enter-active[data-v-d8d145dc],.fade-leave-active[data-v-d8d145dc]{transition:opacity .15s ease}.fade-enter-from[data-v-d8d145dc],.fade-leave-to[data-v-d8d145dc]{opacity:0}.tab-slide-enter-active[data-v-a60937b1],.tab-slide-leave-active[data-v-a60937b1]{transition:opacity .2s ease,transform .2s ease}.tab-slide-enter-from[data-v-a60937b1]{opacity:0;transform:translateY(10px)}.tab-slide-leave-to[data-v-a60937b1]{opacity:0;transform:translateY(-10px)}
@@ -0,0 +1,64 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MessageExportModal-DAJW2mFj.js","assets/index-CW9H_fBd.js","assets/vendor-snapdom--nZvo8Sg.js","assets/index-DrjoMv9s.css"])))=>i.map(i=>d[i]);
2
+ import{b as S,C as Ce,O as Ae,d as A,o,c as I,n as K,f as s,Z as q,$ as Z,t as g,r as oe,a0 as nt,E as C,K as lt,P as pe,a as y,aA as it,w as z,i as rt,G as e,F as T,g as x,A as J,h as N,J as Ie,H as he,I as X,_ as ge,aT as Oe,aU as We,M as Q,T as le,aV as ut,an as De,aI as ct,aj as Ke,ay as Ue,U as Te,Y as Se,B as Fe,aW as dt,aX as mt,aY as je,ar as qe,al as ze,aZ as vt,R as pt,p as ht,a_ as gt,a4 as ft,aB as yt,ap as bt,S as He,aC as xt,X as kt,am as wt,au as _t,av as $t}from"./index-CW9H_fBd.js";import{b as P,a as ne,c as Ct,d as Ee,e as It,u as Tt,f as Ge,g as St,h as Vt,i as Rt,j as Mt,k as Lt,l as Dt,m as Nt,n as At,C as Ut,o as Ft,L as Bt,D as qt,M as zt}from"./ActionToolsPanel.vue_vue_type_script_setup_true_lang-JxPR2O6b.js";import{u as Ye,y as Ht,j as Xe,s as Et,i as Ze,k as Je,p as Pt,t as Ot,v as Wt}from"./vendor-echarts-B-i_56Av.js";import"./vendor-echarts-wordcloud-Ca8n6qS6.js";import{_ as te}from"./LoadingState.vue_vue_type_script_setup_true_lang-BshQybD_.js";import{a as Kt}from"./index-BrkDgcJ6.js";import{_ as jt}from"./ThemeCard.vue_vue_type_script_setup_true_lang-Dsb6lzs-.js";import{a as ae,g as Gt,_ as Yt}from"./base-D91aVUwM.js";import{a as Ne,b as Xt,c as Zt}from"./dateFormat-rY43adcv.js";import"./vendor-snapdom--nZvo8Sg.js";import"./TimeSelect.vue_vue_type_script_setup_true_lang-BfR3tlkz.js";import"./PageHeader-BKAjCuqs.js";import"./vendor-zrender-5DcYjSZk.js";function Jt(l,t={}){const{threshold:a=300,containerSelector:n=".overflow-y-auto",scrollLockDuration:r=800}=t,c=S(l[0]?.id||"");let d=!1;const v=S(null);let m=null;function w(){if(d)return;const u=[];l.forEach(p=>{const $=document.getElementById(p.id);if($){const h=$.getBoundingClientRect();u.push({id:p.id,top:Math.round(h.top)})}});let i=0;for(let p=0;p<u.length;p++){if(u[p].top>a){i=Math.max(0,p-1);break}i=p}c.value=l[i]?.id||""}function f(u){const i=document.getElementById(u);i&&(c.value=u,d=!0,i.scrollIntoView({behavior:"smooth",block:"start"}),setTimeout(()=>{d=!1,w()},r))}return Ce(()=>{m=v.value?.closest(n)||null,m&&(m.addEventListener("scroll",w,{passive:!0}),w())}),Ae(()=>{m&&m.removeEventListener("scroll",w)}),{contentRef:v,activeAnchor:c,scrollToAnchor:f,updateActiveAnchor:w}}function ke(l){return l===0?"text-amber-500 dark:text-amber-400":l===1?"text-gray-500 dark:text-gray-300":l===2?"text-orange-600 dark:text-orange-400":"text-gray-400 dark:text-gray-500"}function we(l){return String(l+1).padStart(2,"0")}function Qt(l){return l===0?"from-amber-400 to-orange-500":l===1?"from-gray-300 to-gray-400":l===2?"from-orange-400 to-amber-600":"from-primary-300 to-primary-500"}const ea={class:"sticky top-24 space-y-6"},ta={class:"border-l border-gray-200 dark:border-gray-800"},aa=["onClick"],sa=A({__name:"PageAnchorsNav",props:{anchors:{},activeAnchor:{},width:{default:"w-44"},hideOnMobile:{type:Boolean,default:!0}},emits:["click"],setup(l,{emit:t}){const a=t;function n(r){a("click",r)}return(r,c)=>(o(),I("div",{class:K([l.width,"shrink-0",l.hideOnMobile?"hidden lg:block":""])},[s("div",ea,[s("nav",null,[s("div",ta,[(o(!0),I(q,null,Z(l.anchors,d=>(o(),I("button",{key:d.id,class:K(["-ml-px block border-l-2 py-1.5 pl-4 text-left text-sm transition-colors",[l.activeAnchor===d.id?"border-pink-500 font-medium text-pink-600 dark:text-pink-400":"border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300"]]),onClick:v=>n(d.id)},g(d.label),11,aa))),128))])]),oe(r.$slots,"default")])],2))}}),ie=A({__name:"TopNSelect",props:{modelValue:{default:10},modelModifiers:{}},emits:["update:modelValue"],setup(l){const t=nt(l,"modelValue"),a=[{label:"Top 5",value:5},{label:"Top 10",value:10},{label:"Top 20",value:20},{label:"Top 30",value:30},{label:"Top 50",value:50},{label:"Top 100",value:100}];return(n,r)=>{const c=lt;return o(),C(c,{modelValue:t.value,"onUpdate:modelValue":r[0]||(r[0]=d=>t.value=d),items:a,"value-key":"value",class:"w-25"},null,8,["modelValue"])}}}),fe=A({__name:"ScrollableChart",props:{contentHeight:{},maxHeightVh:{default:60},paddingClass:{default:"px-3 py-2"}},setup(l){const t=l,a=y(()=>typeof window>"u"?500:Math.round(window.innerHeight*t.maxHeightVh/100)),n=y(()=>t.contentHeight>a.value),r=y(()=>({maxHeight:`${t.maxHeightVh}vh`,overflowY:n.value?"auto":"hidden"}));return(c,d)=>(o(),I("div",{class:K(l.paddingClass),style:pe(r.value)},[oe(c.$slots,"default")],6))}}),oa=A({__name:"EChartGraph",props:{data:{},height:{default:400},layout:{default:"circular"},directed:{type:Boolean,default:!1}},setup(l,{expose:t}){Ye([Ht,Xe,Et,Ze]);const a=l,n=y(()=>typeof a.height=="number"?`${a.height}px`:a.height),r=it(),c=S(null);let d=null;const v=["#ee4567","#5470c6","#91cc75","#fac858","#ee6666","#73c0de","#9a60b4","#fc8452","#3ba272","#ea7ccc","#6e7074","#546570"],m=y(()=>{const b=new Set;return a.data.nodes.filter(k=>b.has(k.name)?!1:(b.add(k.name),!0))}),w=y(()=>{const b=new Map;return m.value.forEach((k,_)=>{b.set(k.name,v[_%v.length])}),b});function f(b,k){return k<=0?1:1+b/k*5}const u=y(()=>{const b=a.data.maxLinkValue||Math.max(...a.data.links.map(k=>k.value||1),1);return{tooltip:{trigger:"item",backgroundColor:r.value?"rgba(30, 30, 30, 0.9)":"rgba(255, 255, 255, 0.95)",borderColor:r.value?"rgba(255, 255, 255, 0.1)":"rgba(0, 0, 0, 0.1)",textStyle:{color:r.value?"#e5e7eb":"#374151"},formatter:k=>k.dataType==="node"?`<b>${k.data.name}</b><br/>消息数: ${k.data.value||0}`:k.dataType==="edge"?`${k.data.source} → ${k.data.target}<br/>艾特次数: ${k.data.value||0}`:""},animationDuration:1e3,animationDurationUpdate:500,animationEasingUpdate:"quinticInOut",series:[{type:"graph",layout:a.layout,circular:a.layout==="circular"?{rotateLabel:!0}:void 0,force:a.layout==="force"?{repulsion:300,gravity:.1,edgeLength:[80,200],friction:.6}:void 0,roam:!0,scaleLimit:{min:.3,max:3},draggable:!0,label:{show:!0,position:"right",formatter:"{b}",color:r.value?"#e5e7eb":"#374151",fontSize:11,fontWeight:500},edgeSymbol:a.directed?["none","arrow"]:["none","none"],edgeSymbolSize:a.directed?[0,10]:[0,0],lineStyle:{curveness:.3,opacity:.5},emphasis:{focus:"adjacency",label:{show:!0,fontSize:13,fontWeight:600},lineStyle:{width:4,opacity:.9},itemStyle:{shadowBlur:15,shadowColor:"rgba(0, 0, 0, 0.3)"}},data:m.value.map(k=>{const _=w.value.get(k.name)||v[0];return{name:k.name,value:k.value,symbolSize:k.symbolSize||30,label:{show:a.layout==="circular"?!0:(k.symbolSize||30)>30},itemStyle:{color:_,borderColor:"#fff",borderWidth:2,shadowBlur:5,shadowColor:`${_}66`}}}),links:a.data.links.filter(k=>w.value.has(k.source)&&w.value.has(k.target)).map(k=>{const _=w.value.get(k.source)||v[0];return{source:k.source,target:k.target,value:k.value,lineStyle:{color:_,width:f(k.value||1,b)}}})}]}});function i(){c.value&&(d=Je(c.value,r.value?"dark":void 0,{renderer:"canvas"}),d.setOption({backgroundColor:"transparent",...u.value}))}function p(){d&&d.setOption({backgroundColor:"transparent",...u.value},{notMerge:!0})}function $(){d?.resize()}function h(){d&&d.dispatchAction({type:"restore"})}return t({resetView:h}),z([()=>a.data,()=>a.layout,()=>a.directed,r],()=>{d?p():i()},{deep:!0}),Ce(()=>{i(),window.addEventListener("resize",$)}),Ae(()=>{window.removeEventListener("resize",$),d?.dispose()}),(b,k)=>(o(),I("div",{ref_key:"chartRef",ref:c,style:pe({height:n.value,width:"100%"})},null,4))}}),Qe=Symbol("ranking-width-mode"),et={standard:{contentClass:"max-w-3xl",gridLeft:110,labelMaxLength:8},wide:{contentClass:"max-w-5xl",gridLeft:180,labelMaxLength:16},full:{contentClass:"max-w-none",gridLeft:260,labelMaxLength:28}};function ye(){const l=rt(Qe,null);return y(()=>et[l?.value??"standard"])}function be(l,t){return l.length<=t?l:`${l.slice(0,t)}…`}const na={class:"px-3 py-2"},Ve=A({__name:"EChartRank",props:{members:{},title:{},description:{},topN:{default:10},unit:{default:"条"},height:{default:"auto"},maxHeightVh:{default:60},bare:{type:Boolean,default:!1}},setup(l){const t=l,a=ye(),n=y(()=>t.members.slice(0,t.topN)),r=y(()=>{if(t.height!=="auto")return t.height;const v=n.value.length*36;return Math.max(v+30,180)}),c={type:"linear",x:0,y:0,x2:1,y2:0,colorStops:[{offset:0,color:"#ee4567"},{offset:1,color:"#f7758c"}]},d=y(()=>{const v=[...n.value].reverse(),m=v.map(i=>be(i.name,a.value.labelMaxLength)),w=v.map(i=>i.value),f=Math.max(...w,1),u=v.map(i=>({value:i.value,itemStyle:{color:c,borderRadius:[0,4,4,0]}}));return{tooltip:{trigger:"axis",axisPointer:{type:"shadow"},backgroundColor:"rgba(0, 0, 0, 0.8)",borderColor:"transparent",textStyle:{color:"#fff"},formatter:i=>{const p=i[0];if(!p)return"";const $=n.value.length-1-p.dataIndex,h=n.value[$];return`
3
+ <div style="padding: 4px 8px;">
4
+ <div style="font-weight: bold; margin-bottom: 4px;">${h.name}</div>
5
+ <div>${h.value} ${t.unit} (${h.percentage}%)</div>
6
+ </div>
7
+ `}},grid:{left:a.value.gridLeft,right:70,top:15,bottom:15,containLabel:!1},xAxis:{type:"value",max:f*1.1,axisLine:{show:!1},axisTick:{show:!1},axisLabel:{show:!1},splitLine:{show:!1}},yAxis:{type:"category",data:m,axisLine:{show:!1},axisTick:{show:!1},axisLabel:{fontSize:12,color:"#4b5563",margin:12,formatter:(i,p)=>{const h=n.value.length-1-p+1;return`${h===1?"🥇":h===2?"🥈":h===3?"🥉":`${h}.`} ${i}`}}},series:[{type:"bar",data:u,barWidth:18,barCategoryGap:"30%",label:{show:!0,position:"right",distance:8,formatter:i=>{const p=n.value.length-1-i.dataIndex;return`${n.value[p].value} ${t.unit}`},fontSize:11,fontWeight:500,color:"#6b7280"},emphasis:{itemStyle:{shadowBlur:6,shadowColor:"rgba(238, 69, 103, 0.3)"}}}]}});return(v,m)=>l.bare?(o(),C(e(fe),{key:0,"content-height":r.value,"max-height-vh":l.maxHeightVh},{default:T(()=>[x(ae,{option:d.value,height:r.value},null,8,["option","height"])]),_:1},8,["content-height","max-height-vh"])):(o(),C(e(P),{key:1,title:l.title,description:l.description,scrollable:"","max-height-vh":l.maxHeightVh},{default:T(()=>[s("div",na,[x(ae,{option:d.value,height:r.value},null,8,["option","height"])])]),_:1},8,["title","description","max-height-vh"]))}}),la={key:0,class:"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-linear-to-br from-pink-100 to-rose-100 text-sm font-medium text-pink-600 dark:from-pink-900/30 dark:to-rose-900/30 dark:text-pink-400"},ia={class:"min-w-0 flex-1"},ra={class:"flex items-baseline justify-between gap-3"},ua=["title"],ca={class:"flex shrink-0 items-baseline gap-1.5 whitespace-nowrap"},da={class:"font-mono text-base font-black tabular-nums text-gray-900 dark:text-white"},ma={class:"text-xs text-gray-500 dark:text-gray-400"},va={class:"mt-2 flex items-center gap-2.5"},pa={class:"h-1.5 flex-1 overflow-hidden rounded-full bg-gray-100 dark:bg-white/5"},ha={class:"w-10 shrink-0 text-right font-mono text-[11px] tabular-nums text-gray-400 dark:text-gray-500"},Pe=A({__name:"RankList",props:{members:{},showAvatar:{type:Boolean,default:!1},rankLimit:{default:0},unit:{}},setup(l){const{t}=J(),a=l,n=y(()=>a.unit||t("views.charts.rankList.unit")),r=y(()=>a.rankLimit>0?a.members.slice(0,a.rankLimit):a.members);function c(d){if(r.value.length===0)return 0;const v=r.value[0].value;return v===0?0:Math.round(r.value[d].value/v*100)}return(d,v)=>(o(),I("div",null,[(o(!0),I(q,null,Z(r.value,(m,w)=>(o(),I("div",{key:m.id,class:"flex items-start gap-3 px-5 py-3.5 transition-colors hover:bg-gray-50/70 dark:hover:bg-white/5"},[s("span",{class:K(["w-8 shrink-0 pt-0.5 text-center font-mono text-sm font-black tabular-nums",e(ke)(w)])},g(e(we)(w)),3),l.showAvatar?(o(),I("div",la,g(m.name.slice(0,1)),1)):N("",!0),s("div",ia,[s("div",ra,[s("p",{class:"truncate text-sm font-medium text-gray-900 dark:text-white",title:m.name},g(m.name),9,ua),s("div",ca,[s("span",da,g(m.value),1),s("span",ma,g(n.value),1)])]),s("div",va,[s("div",pa,[s("div",{class:K(["h-full rounded-full bg-linear-to-r transition-all",e(Qt)(w)]),style:pe({width:`${c(w)}%`})},null,6)]),s("span",ha,g(m.percentage)+"% ",1)])])]))),128))]))}}),ga={class:"flex items-center gap-2"},fa={class:"shrink-0 whitespace-nowrap rounded-full bg-gray-100 px-2.5 py-1 text-[11px] font-medium text-gray-500 dark:bg-white/5 dark:text-gray-400"},ya={class:"no-capture"},ba={key:0,class:"no-capture px-3 pb-3 pt-1"},xa={class:"flex items-center gap-1.5"},ka={class:"flex w-full items-center justify-between border-b border-gray-100 px-6 py-5 dark:border-white/5"},wa={class:"min-w-0"},_a={class:"truncate text-base font-semibold text-gray-900 dark:text-white"},$a={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},Ca={class:"max-h-[70vh] overflow-y-auto"},tt=A({__name:"ExpandableListCard",props:{title:{},description:{},showViewAll:{type:Boolean},viewAllLabel:{},countLabel:{}},setup(l){const t=S(!1),a=S(null);return(n,r)=>{const c=ge,d=he,v=Ie;return o(),C(e(P),{title:l.title,description:l.description,"show-divider":!1},{headerRight:T(()=>[s("div",ga,[s("span",fa,g(l.countLabel),1),s("div",ya,[oe(n.$slots,"headerRight")])])]),default:T(()=>[s("div",null,[oe(n.$slots,"default")]),l.showViewAll?(o(),I("div",ba,[x(v,{open:t.value,"onUpdate:open":r[0]||(r[0]=m=>t.value=m),ui:{content:"md:w-full max-w-4xl"}},{content:T(()=>[s("div",{ref_key:"modalBodyRef",ref:a,class:"section-content flex flex-col overflow-hidden"},[s("div",ka,[s("div",wa,[s("h3",_a,g(l.title),1),s("p",$a,g(l.countLabel),1)]),x(Kt,{size:"xs",type:"element","target-element":a.value},null,8,["target-element"])]),s("div",Ca,[oe(n.$slots,"full")])],512)]),default:T(()=>[x(d,{color:"neutral",variant:"ghost",class:"w-full justify-center rounded-lg py-2.5 text-xs font-medium text-gray-500 dark:text-gray-400"},{default:T(()=>[s("span",xa,[X(g(l.viewAllLabel)+" ",1),x(c,{name:"i-heroicons-arrow-right",class:"h-3.5 w-3.5"})])]),_:1})]),_:3},8,["open"])])):N("",!0)]),_:3},8,["title","description"])}}}),Ia=A({__name:"RankListPro",props:{members:{},title:{},description:{},topN:{default:10},unit:{}},setup(l){const{t}=J(),a=l,n=y(()=>a.members.slice(0,a.topN)),r=y(()=>a.members.length>a.topN);return(c,d)=>(o(),C(tt,{title:l.title,description:l.description,"show-view-all":r.value,"view-all-label":e(t)("views.charts.rankListPro.fullRanking"),"count-label":e(t)("views.charts.rankListPro.memberCount",{count:l.members.length})},{headerRight:T(()=>[oe(c.$slots,"headerRight")]),full:T(()=>[x(Pe,{members:l.members,unit:l.unit},null,8,["members","unit"])]),default:T(()=>[x(Pe,{members:n.value,unit:l.unit},null,8,["members","unit"])]),_:3},8,["title","description","show-view-all","view-all-label","count-label"]))}}),Ta={key:0},Sa={class:"px-5 py-8 text-center text-sm text-gray-400"},$e=A({__name:"ListPro",props:{items:{},title:{},description:{},topN:{default:10},countLabel:{}},setup(l){const{t}=J(),a=l,n=y(()=>a.items.slice(0,a.topN)),r=y(()=>a.items.length>a.topN),c=y(()=>a.countLabel?a.countLabel:t("views.charts.listPro.countTemplate",{count:a.items.length}));return(d,v)=>(o(),C(tt,{title:l.title,description:l.description,"show-view-all":r.value,"view-all-label":e(t)("views.charts.listPro.fullRanking"),"count-label":c.value},{headerRight:T(()=>[oe(d.$slots,"headerRight")]),full:T(()=>[s("div",null,[(o(!0),I(q,null,Z(l.items,(m,w)=>(o(),I("div",{key:w,class:"group/list-row px-5 py-3.5 transition-colors hover:bg-gray-50/70 dark:hover:bg-white/5"},[oe(d.$slots,"item",{item:m,index:w})]))),128))])]),default:T(()=>[oe(d.$slots,"config"),s("div",null,[(o(!0),I(q,null,Z(n.value,(m,w)=>(o(),I("div",{key:w,class:"group/list-row px-5 py-3.5 transition-colors hover:bg-gray-50/70 dark:hover:bg-white/5"},[oe(d.$slots,"item",{item:m,index:w})]))),128))]),l.items.length===0?(o(),I("div",Ta,[oe(d.$slots,"empty",{},()=>[s("div",Sa,g(e(t)("views.charts.listPro.empty")),1)])])):N("",!0)]),_:3},8,["title","description","show-view-all","view-all-label","count-label"]))}}),Va={class:"flex h-full flex-col"},Ra={class:"flex flex-wrap items-center justify-end px-3 py-2 sm:px-4"},Ma={class:"flex flex-wrap items-center justify-end gap-2 sm:gap-4"},La={class:"flex items-center gap-2"},Da={class:"text-xs text-gray-400"},Na={class:"flex items-center gap-2"},Aa={class:"text-xs text-gray-400"},Ua={class:"flex-1 min-h-0 relative"},Fa={key:0,class:"absolute inset-0 flex items-center justify-center"},Ba={key:0,class:"h-full"},qa={class:"absolute bottom-2 left-1/2 -translate-x-1/2 rounded-full bg-gray-100/80 px-3 py-1 text-xs text-gray-500 backdrop-blur-sm dark:bg-gray-800/80 dark:text-gray-400"},za={key:1,class:"flex h-full items-center justify-center text-gray-400"},Ha={class:"text-center"},Ea={class:"mt-2 text-sm"},Pa=A({__name:"InteractionView",props:{sessionId:{},timeFilter:{}},setup(l){const t=l,{t:a}=J(),n=S(!0),r=S({nodes:[],links:[],maxLinkValue:0}),c=S("circular"),d=S(!1),v=S(null);function m(){v.value?.resetView()}async function w(){if(t.sessionId){n.value=!0;try{const f=await Q().getMentionGraph(t.sessionId,t.timeFilter);r.value={nodes:f.nodes,links:f.links,maxLinkValue:f.maxLinkValue}}catch(f){console.error("[chart-interaction] 加载互动关系图数据失败:",f)}finally{n.value=!1}}}return z(()=>[t.sessionId,t.timeFilter],()=>{w()},{immediate:!0,deep:!0}),(f,u)=>{const i=he,p=Oe("UButtonGroup"),$=We,h=ge;return o(),I("div",Va,[s("div",Ra,[s("div",Ma,[s("div",La,[s("span",Da,g(e(a)("views.interaction.layout"))+":",1),x(p,{size:"xs"},{default:T(()=>[x(i,{color:c.value==="circular"?"primary":"neutral",variant:c.value==="circular"?"solid":"ghost",onClick:u[0]||(u[0]=b=>c.value="circular")},{default:T(()=>[X(g(e(a)("views.interaction.circular")),1)]),_:1},8,["color","variant"]),x(i,{color:c.value==="force"?"primary":"neutral",variant:c.value==="force"?"solid":"ghost",onClick:u[1]||(u[1]=b=>c.value="force")},{default:T(()=>[X(g(e(a)("views.interaction.force")),1)]),_:1},8,["color","variant"])]),_:1})]),s("div",Na,[s("span",Aa,g(e(a)("views.interaction.directed"))+":",1),x($,{modelValue:d.value,"onUpdate:modelValue":u[2]||(u[2]=b=>d.value=b),size:"xs"},null,8,["modelValue"])]),x(i,{size:"xs",color:"neutral",variant:"ghost",icon:"i-heroicons-arrow-path",onClick:m},{default:T(()=>[X(g(e(a)("views.interaction.reset")),1)]),_:1})])]),s("div",Ua,[n.value?(o(),I("div",Fa,[x(h,{name:"i-heroicons-arrow-path",class:"h-8 w-8 animate-spin text-pink-500"})])):(o(),I(q,{key:1},[r.value.nodes.length>0?(o(),I("div",Ba,[x(e(oa),{ref_key:"graphRef",ref:v,data:r.value,layout:c.value,directed:d.value,height:"100%"},null,8,["data","layout","directed"]),s("div",qa,g(e(a)("views.interaction.graphHint",{nodes:r.value.nodes.length,links:r.value.links.length})),1)])):(o(),I("div",za,[s("div",Ha,[x(h,{name:"i-heroicons-user-group",class:"mx-auto h-10 w-10 text-gray-300 dark:text-gray-600"}),s("p",Ea,g(e(a)("views.interaction.noInteraction")),1)])]))],64))])])}}}),Oa={class:"main-content mx-auto max-w-3xl p-4 sm:p-6"},Wa=A({__name:"MentionRankingView",props:{sessionId:{},timeFilter:{}},setup(l){const{t}=J(),a=l,n=S(null),r=S(!1);async function c(){if(a.sessionId){r.value=!0;try{n.value=await Q().getMentionAnalysis(a.sessionId,a.timeFilter)}catch(i){console.error("加载 @ 互动分析失败:",i)}finally{r.value=!1}}}const d=y(()=>n.value?n.value.topMentioners.map(i=>({id:i.memberId.toString(),name:i.name,value:i.count,percentage:i.percentage})):[]),v=y(()=>n.value?n.value.topMentioned.map(i=>({id:i.memberId.toString(),name:i.name,value:i.count,percentage:i.percentage})):[]),m=S("mentioners"),w=y(()=>[{label:t("members.relationships.rankModes.mentioners"),value:"mentioners"},{label:t("members.relationships.rankModes.mentioned"),value:"mentioned"}]),f=y(()=>m.value==="mentioners"?d.value:v.value),u=y(()=>m.value==="mentioners"?t("members.relationships.topMentionersDescription"):t("members.relationships.topMentionedDescription"));return z(()=>[a.sessionId,a.timeFilter],()=>{c()},{immediate:!0,deep:!0}),(i,p)=>(o(),I("div",Oa,[r.value?(o(),C(e(te),{key:0,text:e(t)("members.relationships.loading")},null,8,["text"])):n.value&&n.value.totalMentions>0&&f.value.length>0?(o(),C(e(Ia),{key:1,members:f.value,title:e(t)("members.relationships.rankingTitle"),description:u.value,unit:e(t)("members.relationships.times")},{headerRight:T(()=>[x(e(le),{modelValue:m.value,"onUpdate:modelValue":p[0]||(p[0]=$=>m.value=$),items:w.value,size:"sm"},null,8,["modelValue","items"])]),_:1},8,["members","title","description","unit"])):(o(),C(e(P),{key:2,title:e(t)("members.relationships.emptyTitle")},{default:T(()=>[x(e(ne),{text:e(t)("members.relationships.empty")},null,8,["text"])]),_:1},8,["title"]))]))}}),Ka={class:"mx-auto h-full max-w-[920px] p-2 sm:p-4"},ja={class:"flex flex-wrap items-center justify-between gap-2 border-b border-gray-200 bg-gray-50 px-3 py-3 dark:border-gray-700 dark:bg-page-dark/50 sm:px-4"},Ga={class:"flex items-center gap-3"},Ya={class:"flex items-center gap-3"},Xa={class:"p-3 w-64"},Za={class:"text-sm font-medium mb-3"},Ja={class:"space-y-3"},Qa={class:"text-xs text-gray-500 mb-1 block"},es={class:"text-xs text-gray-400 mt-1"},ts={class:"text-xs text-gray-500 mb-1 block"},as={class:"text-xs text-gray-400 mt-1"},ss={class:"flex-1 min-h-0 overflow-hidden"},os={key:0,class:"h-full flex items-center justify-center"},ns={key:1,class:"h-full flex items-center justify-center"},ls={class:"text-center text-gray-400"},is={key:2,class:"h-full"},rs={key:3,class:"h-full flex overflow-hidden"},us={class:"w-64 border-r border-gray-200 dark:border-gray-700 flex flex-col overflow-hidden"},cs={class:"px-4 py-3 border-b border-gray-200 dark:border-gray-700"},ds={class:"text-sm font-medium flex items-center gap-2"},ms={class:"flex-1 overflow-y-auto"},vs=["onClick"],ps={class:"flex items-center justify-between"},hs={class:"text-sm truncate"},gs={class:"text-xs text-gray-400"},fs={class:"flex-1 overflow-hidden flex flex-col"},ys={key:0,class:"flex-1 flex items-center justify-center"},bs={class:"text-center text-gray-400"},xs={class:"px-4 py-3 border-b border-gray-200 dark:border-gray-700 flex items-center gap-3"},ks={class:"w-10 h-10 rounded-full flex items-center justify-center text-white font-bold bg-primary-500"},ws={class:"font-medium"},_s={class:"text-xs text-gray-400"},$s={class:"px-4 py-3 border-b border-gray-200 dark:border-gray-700"},Cs={class:"text-sm font-medium flex items-center gap-2"},Is={class:"flex-1 overflow-y-auto"},Ts={key:0,class:"p-4 text-center text-gray-400"},Ss={class:"flex items-center gap-3"},Vs={class:"flex-1 min-w-0"},Rs={class:"text-sm font-medium truncate"},Ms={class:"flex items-center gap-3 mt-0.5 text-xs text-gray-400"},Ls={class:"w-20 h-2 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden"},Ds={key:4,class:"h-full flex flex-col overflow-hidden"},Ns={class:"px-4 py-3 border-b border-gray-200 dark:border-gray-700"},As={class:"text-sm font-medium flex items-center gap-2"},Us={class:"flex-1 overflow-y-auto"},Fs={class:"flex items-center gap-3"},Bs={class:"flex-1 min-w-0"},qs={class:"flex items-center gap-2 text-sm"},zs={class:"font-medium truncate"},Hs={class:"font-medium truncate"},Es={class:"flex items-center gap-3 mt-1 text-xs text-gray-400"},Ps={class:"w-24 h-2 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden"},Os={key:0,class:"px-4 py-2 border-t border-gray-200 dark:border-gray-700 text-xs text-gray-400 flex items-center gap-4 bg-gray-50 dark:bg-page-dark/50"},Ws=A({__name:"ClusterView",props:{sessionId:{},timeFilter:{}},setup(l){Ye([Pt,Xe,Ot,Wt,Ze]);const t=l,{t:a}=J(),n=ut(),r=y(()=>n.value==="dark"),c=S(!0),d=S(null),v=S("matrix"),m=S(null),w=S({lookAhead:3,decaySeconds:120,topEdges:150}),f=S(null);let u=null;async function i(){if(t.sessionId){c.value=!0;try{d.value=await Q().getClusterGraph(t.sessionId,t.timeFilter,{lookAhead:w.value.lookAhead,decaySeconds:w.value.decaySeconds,topEdges:w.value.topEdges})}catch(B){console.error("[chart-cluster] 加载小团体关系数据失败:",B),d.value=null}finally{c.value=!1}}}const p=y(()=>{if(!d.value||d.value.nodes.length===0)return null;const{nodes:B,links:U,maxLinkValue:E}=d.value,Y=[...B].sort((M,W)=>W.messageCount-M.messageCount).slice(0,20).map(M=>M.name),ee=new Map;for(const M of U)ee.set(`${M.source}-${M.target}`,M.value),ee.set(`${M.target}-${M.source}`,M.value);const G=[];for(let M=0;M<Y.length;M++)for(let W=0;W<Y.length;W++)if(M===W)G.push([M,W,-1]);else{const me=ee.get(`${Y[M]}-${Y[W]}`)||0;G.push([M,W,me])}return{names:Y,data:G,maxValue:E}});function $(){if(!p.value)return{graphic:{type:"text",style:{text:a("views.cluster.noData"),fill:"#999"}}};const{names:B,data:U,maxValue:E}=p.value;return{tooltip:{position:"top",formatter:se=>{const[Y,ee,G]=se.data;return G<0?`${B[Y]}`:G===0?`${B[Y]} ↔ ${B[ee]}<br/>暂无关系数据`:`${B[Y]} ↔ ${B[ee]}<br/>临近度: ${G.toFixed(2)}`}},grid:{left:120,right:40,top:40,bottom:120},xAxis:{type:"category",data:B,splitArea:{show:!0},axisLabel:{rotate:45,fontSize:10,color:r.value?"#ccc":"#333"}},yAxis:{type:"category",data:B,splitArea:{show:!0},axisLabel:{fontSize:10,color:r.value?"#ccc":"#333"}},visualMap:{min:0,max:E||1,calculable:!0,orient:"horizontal",left:"center",bottom:10,inRange:{color:r.value?["#1a1a2e","#16213e","#0f3460","#e94560"]:["#f7f7f7","#fce4ec","#f8bbd9","#ee4567"]},textStyle:{color:r.value?"#ccc":"#333"}},series:[{type:"heatmap",data:U.filter(se=>se[2]>=0),label:{show:!1},emphasis:{itemStyle:{shadowBlur:10,shadowColor:"rgba(0, 0, 0, 0.5)"}}}],backgroundColor:"transparent"}}const h=y(()=>d.value?[...d.value.nodes].sort((B,U)=>U.messageCount-B.messageCount):[]),b=y(()=>!d.value||m.value===null?null:d.value.nodes.find(B=>B.id===m.value)||null),k=y(()=>{if(!d.value||!b.value)return[];const B=b.value.name,U=[];for(const E of d.value.links)E.source===B?U.push({otherName:E.target,value:E.value,coOccurrenceCount:E.coOccurrenceCount}):E.target===B&&U.push({otherName:E.source,value:E.value,coOccurrenceCount:E.coOccurrenceCount});return U.sort((E,se)=>se.value-E.value),U}),_=y(()=>d.value?d.value.links.slice(0,50):[]);function V(){u&&v.value==="matrix"&&u.setOption($(),{notMerge:!0})}function O(){f.value&&(u=Je(f.value,r.value?"dark":void 0),V())}function j(){u?.resize()}return z(v,async(B,U)=>{U==="matrix"&&u&&(u.dispose(),u=null),B==="matrix"&&(await De(),O())}),z([d,()=>r.value],()=>{v.value==="matrix"&&V()},{deep:!0}),z(c,async(B,U)=>{U&&!B&&v.value==="matrix"&&(u&&(u.dispose(),u=null),await De(),O())}),z(()=>[t.sessionId,t.timeFilter],()=>i(),{immediate:!0,deep:!0}),Ce(()=>{window.addEventListener("resize",j),v.value==="matrix"&&De(()=>O())}),Ae(()=>{window.removeEventListener("resize",j),u?.dispose(),u=null}),(B,U)=>{const E=he,se=Oe("UButtonGroup"),Y=Ke,ee=ct,G=ge;return o(),I("div",Ka,[x(e(jt),{class:"flex h-full flex-col"},{default:T(()=>[s("div",ja,[s("div",Ga,[x(se,{size:"xs"},{default:T(()=>[x(E,{color:v.value==="matrix"?"primary":"neutral",variant:v.value==="matrix"?"solid":"ghost",onClick:U[0]||(U[0]=M=>v.value="matrix")},{default:T(()=>[X(g(e(a)("views.cluster.matrixView")),1)]),_:1},8,["color","variant"]),x(E,{color:v.value==="member"?"primary":"neutral",variant:v.value==="member"?"solid":"ghost",onClick:U[1]||(U[1]=M=>v.value="member")},{default:T(()=>[X(g(e(a)("views.cluster.memberView")),1)]),_:1},8,["color","variant"]),x(E,{color:v.value==="circle"?"primary":"neutral",variant:v.value==="circle"?"solid":"ghost",onClick:U[2]||(U[2]=M=>v.value="circle")},{default:T(()=>[X(g(e(a)("views.cluster.rankingView")),1)]),_:1},8,["color","variant"])]),_:1})]),s("div",Ya,[x(ee,null,{content:T(()=>[s("div",Xa,[s("h4",Za,g(e(a)("views.cluster.modelSettings")),1),s("div",Ja,[s("div",null,[s("label",Qa,g(e(a)("views.cluster.lookAhead")),1),x(Y,{modelValue:w.value.lookAhead,"onUpdate:modelValue":U[3]||(U[3]=M=>w.value.lookAhead=M),modelModifiers:{number:!0},type:"number",min:1,max:10,size:"xs",placeholder:"1-10"},null,8,["modelValue"]),s("p",es,g(e(a)("views.cluster.lookAheadDesc")),1)]),s("div",null,[s("label",ts,g(e(a)("views.cluster.decaySeconds")),1),x(Y,{modelValue:w.value.decaySeconds,"onUpdate:modelValue":U[4]||(U[4]=M=>w.value.decaySeconds=M),modelModifiers:{number:!0},type:"number",min:30,max:3600,size:"xs",placeholder:"30-3600"},null,8,["modelValue"]),s("p",as,g(e(a)("views.cluster.decaySecondsDesc")),1)]),x(E,{size:"xs",color:"primary",class:"w-full mt-2",onClick:i},{default:T(()=>[X(g(e(a)("views.cluster.applySettings")),1)]),_:1})])])]),default:T(()=>[x(E,{variant:"ghost",size:"xs",icon:"i-heroicons-adjustments-horizontal"})]),_:1}),x(E,{variant:"ghost",size:"xs",icon:"i-heroicons-arrow-path",onClick:i})])]),s("div",ss,[c.value?(o(),I("div",os,[x(G,{name:"i-heroicons-arrow-path",class:"w-6 h-6 animate-spin text-gray-400"})])):!d.value||d.value.nodes.length===0?(o(),I("div",ns,[s("div",ls,[x(G,{name:"i-heroicons-user-group",class:"w-12 h-12 mx-auto mb-2 opacity-50"}),s("p",null,g(e(a)("views.cluster.noData")),1)])])):v.value==="matrix"?(o(),I("div",is,[s("div",{ref_key:"chartRef",ref:f,class:"w-full h-full"},null,512)])):v.value==="member"?(o(),I("div",rs,[s("div",us,[s("div",cs,[s("h3",ds,[x(G,{name:"i-heroicons-users",class:"w-4 h-4"}),X(" "+g(e(a)("views.cluster.selectMember")),1)])]),s("div",ms,[(o(!0),I(q,null,Z(h.value,M=>(o(),I("div",{key:M.id,class:K(["px-4 py-2 cursor-pointer border-b border-gray-100 dark:border-gray-800 hover:bg-gray-50 dark:hover:bg-gray-800/50",{"bg-primary-50 dark:bg-primary-900/30":m.value===M.id}]),onClick:W=>m.value=M.id},[s("div",ps,[s("span",hs,g(M.name),1),s("span",gs,g(M.messageCount),1)])],10,vs))),128))])]),s("div",fs,[b.value?(o(),I(q,{key:1},[s("div",xs,[s("div",ks,g(b.value.name.charAt(0)),1),s("div",null,[s("div",ws,g(b.value.name),1),s("div",_s,g(e(a)("views.cluster.msgCount"))+": "+g(b.value.messageCount)+" | "+g(e(a)("views.cluster.relationCount"))+": "+g(k.value.length),1)])]),s("div",$s,[s("h3",Cs,[x(G,{name:"i-heroicons-heart",class:"w-4 h-4 text-pink-500"}),X(" "+g(e(a)("views.cluster.relationsByIntimacy")),1)])]),s("div",Is,[k.value.length===0?(o(),I("div",Ts,g(e(a)("views.cluster.noRelations")),1)):N("",!0),(o(!0),I(q,null,Z(k.value,(M,W)=>(o(),I("div",{key:M.otherName,class:"px-4 py-3 border-b border-gray-100 dark:border-gray-800 hover:bg-gray-50 dark:hover:bg-gray-800/50"},[s("div",Ss,[s("span",{class:K(["w-6 h-6 rounded-full flex items-center justify-center text-xs font-bold",W<3?"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400":"bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400"])},g(W+1),3),s("div",Vs,[s("div",Rs,g(M.otherName),1),s("div",Ms,[s("span",null,g(e(a)("views.cluster.intimacy"))+": "+g((M.value*100).toFixed(0))+"%",1),s("span",null,g(e(a)("views.cluster.coOccurrence"))+": "+g(M.coOccurrenceCount)+g(e(a)("views.cluster.times")),1)])]),s("div",Ls,[s("div",{class:"h-full bg-linear-to-r from-pink-400 to-pink-600",style:pe({width:`${k.value[0]?.value?M.value/k.value[0].value*100:0}%`})},null,4)])])]))),128))])],64)):(o(),I("div",ys,[s("div",bs,[x(G,{name:"i-heroicons-cursor-arrow-rays",class:"w-12 h-12 mx-auto mb-2 opacity-50"}),s("p",null,g(e(a)("views.cluster.selectMemberHint")),1)])]))])])):(o(),I("div",Ds,[s("div",Ns,[s("h3",As,[x(G,{name:"i-heroicons-trophy",class:"w-4 h-4 text-yellow-500"}),X(" "+g(e(a)("views.cluster.interactionRanking")),1)])]),s("div",Us,[(o(!0),I(q,null,Z(_.value,(M,W)=>(o(),I("div",{key:W,class:"px-4 py-3 border-b border-gray-100 dark:border-gray-800 hover:bg-gray-50 dark:hover:bg-gray-800/50"},[s("div",Fs,[s("span",{class:K(["w-8 h-8 rounded-full flex items-center justify-center text-sm font-bold",W<3?"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400":"bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400"])},g(W+1),3),s("div",Bs,[s("div",qs,[s("span",zs,g(M.source),1),U[5]||(U[5]=s("span",{class:"text-gray-400"},"↔",-1)),s("span",Hs,g(M.target),1)]),s("div",Es,[s("span",null,g(e(a)("views.cluster.score"))+": "+g(M.value.toFixed(2)),1),s("span",null,g(e(a)("views.cluster.coOccurrence"))+": "+g(M.coOccurrenceCount)+g(e(a)("views.cluster.times")),1)])]),s("div",Ps,[s("div",{class:"h-full bg-linear-to-r from-yellow-400 to-orange-500",style:pe({width:`${_.value[0]?.value?M.value/_.value[0].value*100:0}%`})},null,4)])])]))),128))])]))]),d.value?(o(),I("div",Os,[s("span",null,g(e(a)("views.cluster.totalMembers"))+": "+g(d.value.stats.totalMembers),1),s("span",null,g(e(a)("views.cluster.totalMessages"))+": "+g(d.value.stats.totalMessages.toLocaleString()),1),s("span",null,g(e(a)("views.cluster.involvedMembers"))+": "+g(d.value.stats.involvedMembers),1),s("span",null,g(e(a)("views.cluster.edgeCount"))+": "+g(d.value.stats.edgeCount),1)])):N("",!0)]),_:1})])}}}),Ks={class:"flex h-full flex-col"},js={class:"min-h-0 flex-1 overflow-y-auto"},Gs=A({__name:"GroupRelationships",props:{sessionId:{},timeFilter:{}},setup(l){const{t}=J(),a=l,n=S("mention-graph"),r=y(()=>[{id:"mention-graph",label:t("analysis.subTabs.groupRelationships.mentionGraph"),icon:"i-heroicons-arrows-right-left"},{id:"mention-ranking",label:t("analysis.subTabs.groupRelationships.mentionRanking"),icon:"i-heroicons-heart"},{id:"proximity",label:t("analysis.subTabs.groupRelationships.proximity"),icon:"i-heroicons-user-group"}]);return(c,d)=>(o(),I("div",Ks,[x(e(Ue),{modelValue:n.value,"onUpdate:modelValue":d[0]||(d[0]=v=>n.value=v),items:r.value,"persist-key":"groupRelationshipsTab"},null,8,["modelValue","items"]),s("div",js,[x(Te,{name:"fade",mode:"out-in"},{default:T(()=>[n.value==="mention-graph"?(o(),C(Pa,{key:0,"session-id":a.sessionId,"time-filter":a.timeFilter},null,8,["session-id","time-filter"])):n.value==="mention-ranking"?(o(),C(Wa,{key:1,"session-id":a.sessionId,"time-filter":a.timeFilter},null,8,["session-id","time-filter"])):n.value==="proximity"?(o(),C(Ws,{key:2,"session-id":a.sessionId,"time-filter":a.timeFilter},null,8,["session-id","time-filter"])):N("",!0)]),_:1})])]))}}),Ys=Se(Gs,[["__scopeId","data-v-84666257"]]);function Xs(l,t){return{keywords:[l],...t?.memberId!=null?{memberId:t.memberId}:{}}}const Zs={class:"main-content mx-auto max-w-3xl p-6"},Js=["aria-label","onClick"],Qs=["title"],eo={class:"flex shrink-0 items-center gap-3 pl-2"},to={class:"font-mono text-sm font-black tabular-nums text-primary-600 dark:text-primary-400"},ao={class:"grid w-full grid-cols-[2rem_minmax(0,1fr)] items-start gap-x-3 sm:grid-cols-[2rem_minmax(7.5rem,0.65fr)_minmax(0,1.35fr)]"},so=["title"],oo={class:"col-start-2 row-start-2 mt-1.5 flex min-w-0 flex-wrap items-center gap-x-4 gap-y-1.5 sm:col-start-3 sm:row-start-1 sm:mt-0"},no=["title","aria-label","onClick"],lo={class:"max-w-40 truncate text-sm text-gray-700 transition-colors group-hover/phrase:text-primary-600 dark:text-gray-200 dark:group-hover/phrase:text-primary-400"},io={class:"shrink-0 font-mono text-[11px] tabular-nums text-gray-400 dark:text-gray-500"},ro=A({__name:"CatchphraseTab",props:{sessionId:{},timeFilter:{}},setup(l){const{t}=J(),a=Fe(),n=l,r=S(null),c=S(!1),d=y(()=>r.value?.members??[]),v=y(()=>n.timeFilter?.memberId!=null),m=y(()=>v.value?d.value[0]??null:null),w=y(()=>m.value?t("quotes.catchphrase.memberTitle",{name:m.value.name}):t("quotes.catchphrase.title")),f=y(()=>v.value?t("quotes.catchphrase.memberDescription"):t("quotes.catchphrase.description"));async function u(){if(n.sessionId){c.value=!0;try{r.value=await Q().getCatchphraseAnalysis(n.sessionId,n.timeFilter)}catch($){console.error("Failed to load catchphrase analysis:",$)}finally{c.value=!1}}}function i($){a.openChatRecordDrawer(Xs($,n.timeFilter))}function p($){return $.catchphrases.slice(0,5)}return z(()=>[n.sessionId,n.timeFilter],()=>{u()},{immediate:!0,deep:!0}),($,h)=>{const b=ge;return o(),I("div",Zs,[c.value?(o(),C(e(te),{key:0,text:e(t)("quotes.catchphrase.loading")},null,8,["text"])):m.value?(o(),C(e($e),{key:1,items:m.value.catchphrases,title:w.value,description:f.value,"top-n":10,"count-label":e(t)("quotes.catchphrase.phraseCount",{count:m.value.catchphrases.length})},{item:T(({item:k,index:_})=>[s("button",{type:"button",class:"group/item grid w-full grid-cols-[2rem_minmax(0,1fr)_auto] items-center gap-3 rounded-lg text-left outline-none focus-visible:ring-2 focus-visible:ring-primary-500/40","aria-label":`${e(t)("quotes.catchphrase.viewChat")}: ${k.content}`,onClick:V=>i(k.content)},[s("span",{class:K(["w-8 shrink-0 text-center font-mono text-sm font-black tabular-nums",e(ke)(_)])},g(e(we)(_)),3),s("p",{class:"line-clamp-2 min-w-0 text-sm font-medium leading-5 text-gray-900 dark:text-white",title:k.content},g(k.content),9,Qs),s("div",eo,[s("span",to,g(e(t)("quotes.catchphrase.times",{count:k.count})),1),x(b,{name:"i-heroicons-chevron-right",class:"h-4 w-4 text-gray-300 transition-colors group-hover/item:text-gray-500 dark:text-gray-600 dark:group-hover/item:text-gray-400"})])],8,Js)]),_:1},8,["items","title","description","count-label"])):d.value.length>0?(o(),C(e($e),{key:2,items:d.value,title:w.value,description:f.value,"top-n":10,"count-label":e(t)("quotes.catchphrase.memberCount",{count:d.value.length})},{item:T(({item:k,index:_})=>[s("div",ao,[s("span",{class:K(["row-span-2 w-8 shrink-0 pt-0.5 text-center font-mono text-sm font-black tabular-nums sm:row-span-1",e(ke)(_)])},g(e(we)(_)),3),s("p",{class:"col-start-2 row-start-1 min-w-0 truncate pt-0.5 text-sm font-semibold text-gray-900 dark:text-white",title:k.name},g(k.name),9,so),s("div",oo,[(o(!0),I(q,null,Z(p(k),V=>(o(),I("button",{key:V.content,type:"button",class:"group/phrase inline-flex max-w-full items-baseline gap-1 rounded text-left outline-none focus-visible:ring-2 focus-visible:ring-primary-500/40",title:V.content,"aria-label":`${e(t)("quotes.catchphrase.viewChat")}: ${V.content}`,onClick:O=>i(V.content)},[s("span",lo," “"+g(V.content)+"” ",1),s("span",io,g(e(t)("quotes.catchphrase.times",{count:V.count})),1)],8,no))),128))])])]),_:1},8,["items","title","description","count-label"])):(o(),C(e(P),{key:3,title:w.value,description:f.value,"show-divider":!1},{default:T(()=>[x(e(ne),{text:e(t)("quotes.catchphrase.empty.title")},null,8,["text"])]),_:1},8,["title","description"]))])}}}),uo={class:"main-content mx-auto max-w-3xl p-6"},co=["aria-label","onClick"],mo={class:"min-w-0"},vo=["title"],po={class:"mt-1 flex min-w-0 items-center gap-1.5 text-xs text-gray-400 dark:text-gray-500"},ho={class:"truncate"},go={class:"shrink-0"},fo={class:"flex shrink-0 items-center gap-3 pl-2"},yo={class:"text-right"},bo={class:"font-mono text-sm font-black tabular-nums text-primary-600 dark:text-primary-400"},xo={class:"mt-0.5 text-[11px] text-gray-400 dark:text-gray-500"},ko=A({__name:"HotRepeatTab",props:{sessionId:{},timeFilter:{}},setup(l){const{t}=J(),a=l,n=Fe(),r=S(null),c=S(!1);async function d(){if(a.sessionId){c.value=!0;try{r.value=await Q().getRepeatAnalysis(a.sessionId,a.timeFilter)}catch(m){console.error("Failed to load repeat analysis:",m)}finally{c.value=!1}}}function v(m){n.openChatRecordDrawer({scrollToMessageId:m.firstMessageId,highlightKeywords:[m.content]})}return z(()=>[a.sessionId,a.timeFilter],()=>{d()},{immediate:!0,deep:!0}),(m,w)=>{const f=ge;return o(),I("div",uo,[c.value?(o(),C(e(te),{key:0,text:e(t)("quotes.hotRepeat.loading")},null,8,["text"])):r.value&&r.value.hotContents.length>0?(o(),C(e($e),{key:1,items:r.value.hotContents,title:e(t)("quotes.hotRepeat.title"),description:e(t)("quotes.hotRepeat.description"),"top-n":10,"count-label":e(t)("quotes.hotRepeat.countTemplate",{count:r.value.hotContents.length})},{item:T(({item:u,index:i})=>[s("button",{type:"button",class:"group/item grid w-full grid-cols-[2rem_minmax(0,1fr)_auto] items-center gap-3 rounded-lg text-left outline-none focus-visible:ring-2 focus-visible:ring-primary-500/40","aria-label":`${e(t)("quotes.hotRepeat.viewChat")}: ${u.content}`,onClick:p=>v(u)},[s("span",{class:K(["w-8 shrink-0 text-center font-mono text-sm font-black tabular-nums",e(ke)(i)])},g(e(we)(i)),3),s("div",mo,[s("p",{class:"line-clamp-2 text-sm font-medium leading-5 text-gray-900 dark:text-white",title:u.content},g(u.content),9,vo),s("div",po,[s("span",ho,g(u.originatorName),1),w[0]||(w[0]=s("span",{"aria-hidden":"true"},"·",-1)),s("span",go,g(e(Ne)(u.lastTs)),1)])]),s("div",fo,[s("div",yo,[s("p",bo,g(e(t)("quotes.hotRepeat.people",{count:u.maxChainLength})),1),s("p",xo,g(e(t)("quotes.hotRepeat.times",{count:u.count})),1)]),x(f,{name:"i-heroicons-chevron-right",class:"h-4 w-4 text-gray-300 transition-colors group-hover/item:text-gray-500 dark:text-gray-600 dark:group-hover/item:text-gray-400"})])],8,co)]),_:1},8,["items","title","description","count-label"])):(o(),C(e(P),{key:2,title:e(t)("quotes.hotRepeat.title")},{default:T(()=>[x(e(ne),{text:e(t)("quotes.hotRepeat.empty")},null,8,["text"])]),_:1},8,["title"]))])}}}),wo={class:"main-content mx-auto max-w-[920px] space-y-4 p-4 sm:space-y-6 sm:p-6"},_o={class:"grid grid-cols-1 gap-6 lg:grid-cols-2"},$o={class:"p-3 sm:p-5"},Co={class:"p-3 sm:p-5"},Io=A({__name:"GroupChatOverview",props:{session:{},memberActivity:{},messageTypes:{},hourlyActivity:{},dailyActivity:{},timeRange:{},filteredMessageCount:{},filteredMemberCount:{},timeFilter:{}},setup(l){const{t}=J(),a=l,{dailyChartData:n}=Tt(()=>a.dailyActivity),r=y(()=>({labels:a.messageTypes.map(d=>Gt(d.type,t)),values:a.messageTypes.map(d=>d.count)})),c=y(()=>{const d=[...a.memberActivity].sort((u,i)=>i.messageCount-u.messageCount),v=d.slice(0,10),m=d.slice(10).reduce((u,i)=>u+i.messageCount,0),w=v.map(u=>u.name),f=v.map(u=>u.messageCount);return m>0&&(w.push(t("analysis.overview.others")),f.push(m)),{labels:w,values:f}});return(d,v)=>(o(),I("div",wo,[x(Ct,{session:l.session,"daily-activity":l.dailyActivity,"message-types":l.messageTypes,"hourly-activity":l.hourlyActivity,"time-range":l.timeRange,"filtered-message-count":l.filteredMessageCount,"filtered-member-count":l.filteredMemberCount,"time-filter":l.timeFilter},null,8,["session","daily-activity","message-types","hourly-activity","time-range","filtered-message-count","filtered-member-count","time-filter"]),s("div",_o,[x(e(P),{title:e(t)("analysis.overview.messageTypeDistribution"),"show-divider":!1},{default:T(()=>[s("div",$o,[x(e(Ee),{data:r.value,height:280},null,8,["data"])])]),_:1},8,["title"]),x(e(P),{title:e(t)("analysis.overview.memberDistribution"),"show-divider":!1},{default:T(()=>[s("div",Co,[x(e(Ee),{data:c.value,height:280},null,8,["data"])])]),_:1},8,["title"])]),x(It,{"daily-activity":l.dailyActivity,"daily-chart-data":e(n)},null,8,["daily-activity","daily-chart-data"])]))}}),To={class:"flex h-full flex-col"},So={class:"flex-1 min-h-0 overflow-y-auto"},Vo=A({__name:"GroupChatInsights",props:{sessionId:{},session:{},memberActivity:{},messageTypes:{},hourlyActivity:{},dailyActivity:{},timeRange:{},filteredMessageCount:{},filteredMemberCount:{},timeFilter:{}},setup(l){const{t}=J(),a=l,n=y(()=>[{id:"overview",label:t("analysis.tabs.overview"),icon:"i-heroicons-squares-2x2"},{id:"type-analysis",label:t("analysis.subTabs.insights.typeAnalysis"),icon:"i-heroicons-chart-pie"},{id:"time-analysis",label:t("analysis.subTabs.insights.timeAnalysis"),icon:"i-heroicons-clock"},{id:"topic",label:t("analysis.subTabs.insights.topic"),icon:"i-heroicons-cloud"},{id:"group-relationships",label:t("analysis.subTabs.insights.groupRelationships"),icon:"i-heroicons-heart"}]),r=S("overview"),c=S(null),d=y(()=>({...a.timeFilter,memberId:c.value}));return(v,m)=>(o(),I("div",To,[x(e(Ue),{modelValue:r.value,"onUpdate:modelValue":m[1]||(m[1]=w=>r.value=w),items:n.value,"persist-key":"groupInsightsTab"},{right:T(()=>[r.value==="type-analysis"||r.value==="time-analysis"||r.value==="group-relationships"?(o(),C(Ge,{key:0,modelValue:c.value,"onUpdate:modelValue":m[0]||(m[0]=w=>c.value=w),"session-id":a.sessionId},null,8,["modelValue","session-id"])):N("",!0)]),_:1},8,["modelValue","items"]),s("div",So,[x(Te,{name:"fade",mode:"out-in"},{default:T(()=>[r.value==="overview"?(o(),C(Io,{key:0,session:a.session,"member-activity":a.memberActivity,"message-types":a.messageTypes,"hourly-activity":a.hourlyActivity,"daily-activity":a.dailyActivity,"time-range":a.timeRange,"filtered-message-count":a.filteredMessageCount,"filtered-member-count":a.filteredMemberCount,"time-filter":a.timeFilter},null,8,["session","member-activity","message-types","hourly-activity","daily-activity","time-range","filtered-message-count","filtered-member-count","time-filter"])):r.value==="type-analysis"?(o(),C(St,{key:1,"session-id":a.sessionId,"session-name":a.session.name,"time-filter":d.value},null,8,["session-id","session-name","time-filter"])):r.value==="time-analysis"?(o(),C(Vt,{key:2,"session-id":a.sessionId,"session-name":a.session.name,"time-filter":d.value},null,8,["session-id","session-name","time-filter"])):r.value==="topic"?(o(),C(e(Rt),{key:3,"session-id":a.sessionId,"time-filter":a.timeFilter},null,8,["session-id","time-filter"])):r.value==="group-relationships"?(o(),C(Ys,{key:4,"session-id":a.sessionId,"time-filter":d.value},null,8,["session-id","time-filter"])):N("",!0)]),_:1})])]))}}),Ro=Se(Vo,[["__scopeId","data-v-243684c6"]]),Mo={class:"border-b border-gray-100 p-4 dark:border-gray-800"},Lo={class:"mb-3 flex flex-wrap items-center gap-2"},Do={class:"text-xs text-gray-500 dark:text-gray-400"},No=["onClick"],Ao={class:"p-4"},Uo={class:"mb-3 font-semibold text-gray-900 dark:text-white"},Fo={class:"space-y-3"},Bo={class:"mb-1 block text-xs text-gray-500"},qo={class:"mb-1 block text-xs text-gray-500"},zo={class:"flex flex-wrap items-center gap-2"},Ho={class:"mt-4 flex justify-end gap-2"},Eo={class:"flex flex-wrap items-center gap-2"},Po={class:"mt-1.5 text-xs text-gray-400"},Oo={key:0,class:"border-b border-gray-100 px-5 py-4 dark:border-gray-800"},Wo={class:"mb-3 flex items-center justify-between"},Ko={class:"text-base font-medium text-gray-700 dark:text-gray-300"},jo={class:"flex cursor-pointer items-center gap-1.5 text-xs text-gray-500"},Go={class:"flex flex-wrap gap-2"},Yo={class:"text-xs text-gray-500"},Xo={class:"flex items-center gap-3"},Zo={class:"w-32 shrink-0"},Jo={class:"truncate font-medium text-gray-900 dark:text-white"},Qo={class:"flex flex-1 items-center"},en={class:"flex h-2 w-full overflow-hidden rounded-full bg-gray-100 dark:bg-white/5"},tn=["title"],an={class:"flex shrink-0 items-baseline gap-2"},sn={class:"font-mono text-base font-black tabular-nums text-gray-900 dark:text-white"},on={class:"text-xs text-gray-500"},nn={key:0,class:"flex h-64 flex-col items-center justify-center text-gray-400"},ln={class:"text-sm"},rn={key:1,class:"h-64"},un=A({__name:"KeywordRankingTab",props:{sessionId:{},timeFilter:{}},setup(l){const{t}=J(),a=l,n=dt(),r=S(!1),c={bg:"bg-pink-400",text:"text-pink-700",badge:"pink",wrapBg:"bg-pink-50 dark:bg-pink-900/20"},d=[{bg:"bg-amber-400",text:"text-amber-700",badge:"amber",wrapBg:"bg-amber-50 dark:bg-amber-900/20"},{bg:"bg-pink-400",text:"text-pink-700",badge:"pink",wrapBg:"bg-pink-50 dark:bg-pink-900/20"},{bg:"bg-blue-400",text:"text-blue-700",badge:"blue",wrapBg:"bg-blue-50 dark:bg-blue-900/20"},{bg:"bg-green-400",text:"text-green-700",badge:"green",wrapBg:"bg-green-50 dark:bg-green-900/20"},{bg:"bg-purple-400",text:"text-purple-700",badge:"purple",wrapBg:"bg-purple-50 dark:bg-purple-900/20"},{bg:"bg-red-400",text:"text-red-700",badge:"red",wrapBg:"bg-red-50 dark:bg-red-900/20"},{bg:"bg-cyan-400",text:"text-cyan-700",badge:"cyan",wrapBg:"bg-cyan-50 dark:bg-cyan-900/20"},{bg:"bg-orange-400",text:"text-orange-700",badge:"orange",wrapBg:"bg-orange-50 dark:bg-orange-900/20"}];function v(R){if(!r.value)return c;const F=i.value.indexOf(R);return d[F%d.length]}const m=["laugh","sad","praise","slacker","gossip","polite","curious"],w=y(()=>[{id:"laugh",name:t("quotes.keywords.templates.laugh.name"),keywords:t("quotes.keywords.templates.laugh.keywords").split(","),description:t("quotes.keywords.templates.laugh.description")},{id:"sad",name:t("quotes.keywords.templates.sad.name"),keywords:t("quotes.keywords.templates.sad.keywords").split(","),description:t("quotes.keywords.templates.sad.description")},{id:"praise",name:t("quotes.keywords.templates.praise.name"),keywords:t("quotes.keywords.templates.praise.keywords").split(","),description:t("quotes.keywords.templates.praise.description")},{id:"slacker",name:t("quotes.keywords.templates.slacker.name"),keywords:t("quotes.keywords.templates.slacker.keywords").split(","),description:t("quotes.keywords.templates.slacker.description")},{id:"gossip",name:t("quotes.keywords.templates.gossip.name"),keywords:t("quotes.keywords.templates.gossip.keywords").split(","),description:t("quotes.keywords.templates.gossip.description")},{id:"polite",name:t("quotes.keywords.templates.polite.name"),keywords:t("quotes.keywords.templates.polite.keywords").split(","),description:t("quotes.keywords.templates.polite.description")},{id:"curious",name:t("quotes.keywords.templates.curious.name"),keywords:t("quotes.keywords.templates.curious.keywords").split(","),description:t("quotes.keywords.templates.curious.description")}]),f=y(()=>{const R=n.customKeywordTemplates.map(ce=>({...ce,isCustom:!0}));return[...w.value.filter(ce=>!n.deletedPresetTemplateIds.includes(ce.id)),...R]}),u=S("laugh"),i=S([]);z(w,R=>{R.length>0&&i.value.length===0&&(i.value=[...R[0].keywords])},{immediate:!0});const p=y(()=>{const R=f.value.find(F=>F.id===u.value);return R?R.name:""}),$=S(null),h=S(!1),b=S(!1),k=S(null),_=S(""),V=S([]),O=S(""),j=y(()=>k.value!==null),B=y(()=>j.value?t("quotes.keywords.modal.editTitle"):t("quotes.keywords.modal.createTitle"));function U(){k.value=null,_.value="",V.value=[],O.value="",b.value=!0}function E(R){k.value=R.id,_.value=R.name,V.value=[...R.keywords],b.value=!0}function se(){const R=O.value.trim();R&&!V.value.includes(R)&&(V.value=[...V.value,R]),O.value=""}function Y(R){V.value=V.value.filter(F=>F!==R)}function ee(R){u.value=R.id,i.value=[...R.keywords],$.value=null,L()}function G(){i.value=[],$.value=null,u.value=""}const M=S("");function W(){const R=M.value.trim();R&&!i.value.includes(R)&&(i.value=[...i.value,R],L()),M.value=""}function me(R){i.value=i.value.filter(F=>F!==R),L()}function _e(R){return m.includes(R)}function Re(){if(_.value.trim()){if(j.value&&k.value)if(_e(k.value)){const R={id:`custom_${Date.now()}`,name:_.value.trim(),keywords:[...V.value]};n.addCustomKeywordTemplate(R),u.value=R.id,i.value=[...R.keywords],L()}else n.updateCustomKeywordTemplate(k.value,{name:_.value.trim(),keywords:[...V.value]}),u.value===k.value&&(i.value=[...V.value],L());else{const R={id:`custom_${Date.now()}`,name:_.value.trim(),keywords:[...V.value]};n.addCustomKeywordTemplate(R),u.value=R.id,i.value=[...R.keywords],L()}b.value=!1}}function re(R){_e(R)?n.addDeletedPresetTemplateId(R):n.removeCustomKeywordTemplate(R),u.value===R&&(f.value.length>0?ee(f.value[0]):G())}async function L(){if(!a.sessionId||i.value.length===0){$.value=null;return}h.value=!0;try{$.value=await Q().getLaughAnalysis(a.sessionId,a.timeFilter,[...i.value])}catch(R){console.error("Failed to load keyword ranking:",R),$.value=null}finally{h.value=!1}}const ue=y(()=>$.value?$.value.rankByCount.map(R=>({id:R.memberId.toString(),name:R.name,value:R.laughCount,percentage:R.percentage,keywordDistribution:R.keywordDistribution||[]})):[]);function Me(R){if(ue.value.length===0)return 0;const F=ue.value[0].value;return F===0?0:Math.round(ue.value[R].value/F*100)}function H(R,F){const ce=Me(F);return!R.keywordDistribution||R.keywordDistribution.length===0?[{keyword:"default",width:ce,bg:"bg-amber-400"}]:R.keywordDistribution.map(de=>({keyword:de.keyword,width:de.percentage/100*ce,bg:v(de.keyword).bg}))}return z(()=>[a.sessionId,a.timeFilter],()=>{L()},{immediate:!0,deep:!0}),(R,F)=>{const ce=mt,de=Ke,Le=je,Be=he,at=Ie,st=We,ot=ge;return o(),C(e($e),{items:ue.value,title:e(t)("quotes.keywords.title"),description:e(t)("quotes.keywords.description"),"top-n":10,"count-label":e(t)("quotes.keywords.countTemplate",{count:ue.value.length})},{config:T(()=>[s("div",Mo,[s("div",Lo,[s("span",Do,g(e(t)("quotes.keywords.templateLabel")),1),(o(!0),I(q,null,Z(f.value,D=>(o(),C(ce,{key:D.id,items:[[{label:e(t)("quotes.keywords.contextMenu.edit"),icon:"i-lucide-pencil",disabled:!D.isCustom,onSelect:()=>E(D)},{label:e(t)("quotes.keywords.contextMenu.delete"),icon:"i-lucide-trash",color:"error",onSelect:()=>re(D.id)}]]},{default:T(()=>[s("button",{class:K(["rounded-md border px-2.5 py-1 text-sm transition-all",u.value===D.id?"border-pink-500 bg-pink-50 text-pink-600 dark:border-pink-400 dark:bg-pink-900/20 dark:text-pink-400":"border-gray-200 text-gray-600 hover:border-gray-300 dark:border-gray-700 dark:text-gray-400 dark:hover:border-gray-600"]),onClick:ve=>ee(D)},g(D.name),11,No)]),_:2},1032,["items"]))),128)),x(at,{open:b.value,"onUpdate:open":F[3]||(F[3]=D=>b.value=D)},{content:T(()=>[s("div",Ao,[s("h3",Uo,g(B.value),1),s("div",Fo,[s("div",null,[s("label",Bo,g(e(t)("quotes.keywords.modal.templateName")),1),x(de,{modelValue:_.value,"onUpdate:modelValue":F[0]||(F[0]=D=>_.value=D),placeholder:e(t)("quotes.keywords.modal.templateNamePlaceholder")},null,8,["modelValue","placeholder"])]),s("div",null,[s("label",qo,g(e(t)("quotes.keywords.modal.keywords")),1),s("div",zo,[(o(!0),I(q,null,Z(V.value,D=>(o(),C(Le,{key:D,variant:"soft",class:"cursor-pointer",onClick:ve=>Y(D)},{default:T(()=>[X(g(D)+" ",1),F[6]||(F[6]=s("span",{class:"ml-0.5 hover:text-red-500"},"×",-1))]),_:2},1032,["onClick"]))),128)),x(de,{modelValue:O.value,"onUpdate:modelValue":F[1]||(F[1]=D=>O.value=D),placeholder:e(t)("quotes.keywords.modal.keywordPlaceholder"),class:"w-full",onKeydown:qe(ze(se,["prevent"]),["enter"])},null,8,["modelValue","placeholder","onKeydown"])])])]),s("div",Ho,[x(Be,{variant:"soft",onClick:F[2]||(F[2]=D=>b.value=!1)},{default:T(()=>[X(g(e(t)("common.cancel")),1)]),_:1}),x(Be,{color:"primary",disabled:!_.value.trim()||V.value.length===0,onClick:Re},{default:T(()=>[X(g(j.value?e(t)("quotes.keywords.modal.update"):e(t)("common.save")),1)]),_:1},8,["disabled"])])])]),default:T(()=>[s("button",{class:"rounded-md border border-dashed border-gray-300 px-2.5 py-1 text-sm text-gray-500 transition-all hover:border-pink-400 hover:text-pink-500 dark:border-gray-600",onClick:U},g(e(t)("quotes.keywords.newTemplate")),1)]),_:1},8,["open"])]),s("div",Eo,[(o(!0),I(q,null,Z(i.value,D=>(o(),C(Le,{key:D,class:"cursor-pointer",onClick:ve=>me(D)},{default:T(()=>[X(g(D)+" ",1),F[7]||(F[7]=s("span",{class:"ml-0.5 hover:text-red-500"},"×",-1))]),_:2},1032,["onClick"]))),128)),x(de,{modelValue:M.value,"onUpdate:modelValue":F[4]||(F[4]=D=>M.value=D),placeholder:e(t)("quotes.keywords.searchPlaceholder"),class:"w-32",onKeydown:qe(ze(W,["prevent"]),["enter"])},null,8,["modelValue","placeholder","onKeydown"]),i.value.length>0?(o(),I("button",{key:0,class:"text-sm text-pink-500 hover:text-red-500",onClick:G},g(e(t)("quotes.keywords.clear")),1)):N("",!0)]),s("div",Po,g(e(t)("quotes.keywords.templateHint")),1)]),$.value&&$.value.typeDistribution.length>0?(o(),I("div",Oo,[s("div",Wo,[s("span",Ko,g(p.value?p.value:i.value.length===1?i.value[0]:e(t)("quotes.keywords.keyword"))+g(e(t)("quotes.keywords.ranking")),1),s("label",jo,[s("span",null,g(e(t)("quotes.keywords.multiColorMode")),1),x(st,{modelValue:r.value,"onUpdate:modelValue":F[5]||(F[5]=D=>r.value=D),size:"md"},null,8,["modelValue"])])]),s("div",Go,[(o(!0),I(q,null,Z($.value.typeDistribution,D=>(o(),I("div",{key:D.type,class:K(["flex items-center gap-2 rounded-lg px-2 py-2 text-xs",v(D.type).wrapBg])},[s("span",{class:K(["h-2.5 w-2.5 shrink-0 rounded-full",v(D.type).bg])},null,2),s("span",{class:K(["font-medium",v(D.type).text])},g(D.type),3),s("span",Yo,g(e(t)("quotes.keywords.times",{count:D.count})),1),x(Le,{color:v(D.type).badge,variant:"soft",size:"xs"},{default:T(()=>[X(g(D.percentage)+"%",1)]),_:2},1032,["color"])],2))),128))])])):N("",!0),h.value&&ue.value.length===0?(o(),C(e(te),{key:1,text:e(t)("quotes.keywords.loading")},null,8,["text"])):N("",!0)]),item:T(({item:D,index:ve})=>[s("div",Xo,[s("span",{class:K(["w-8 shrink-0 text-center font-mono text-sm font-black tabular-nums",e(ke)(ve)])},g(e(we)(ve)),3),s("div",Zo,[s("p",Jo,g(D.name),1)]),s("div",Qo,[s("div",en,[(o(!0),I(q,null,Z(H(D,ve),xe=>(o(),I("div",{key:xe.keyword,class:K(["h-full transition-all first:rounded-l-full last:rounded-r-full",xe.bg]),style:pe({width:`${xe.width}%`}),title:`${xe.keyword}: ${xe.width.toFixed(1)}%`},null,14,tn))),128))])]),s("div",an,[s("span",sn,g(D.value),1),s("span",on,g(e(t)("quotes.keywords.timesWithPercent",{count:D.value,percent:D.percentage})),1)])])]),empty:T(()=>[h.value?(o(),I("div",rn)):(o(),I("div",nn,[x(ot,{name:"i-heroicons-magnifying-glass",class:"mb-2 h-8 w-8 opacity-50"}),s("p",ln,g(e(t)("quotes.keywords.empty")),1)]))]),_:1},8,["items","title","description","count-label"])}}}),cn={class:"flex items-center gap-3"},dn={key:1,class:"py-8 text-center text-sm text-gray-400"},mn=A({__name:"ActivityRank",props:{sessionId:{},memberActivity:{},timeFilter:{},showTopNSelect:{type:Boolean,default:!0},globalTopN:{}},setup(l){const t=l,a=S(null),n=S(null),r=S(!1),c=S("activity"),d=S(t.globalTopN??10);z(()=>t.globalTopN,h=>{h!==void 0&&(d.value=h)});async function v(){if(t.sessionId){r.value=!0;try{const h=Q(),[b,k]=await Promise.all([h.getDragonKingAnalysis(t.sessionId,t.timeFilter),h.getCheckInAnalysis(t.sessionId,t.timeFilter)]);a.value=b,n.value=k}catch(h){console.error("加载活跃数据失败:",h)}finally{r.value=!1}}}const m=y(()=>t.memberActivity.map(h=>({id:h.memberId.toString(),name:h.name,value:h.messageCount,percentage:h.percentage}))),w=y(()=>a.value?a.value.rank.map(h=>({id:h.memberId.toString(),name:h.name,value:h.count,percentage:h.percentage})):[]),f=y(()=>n.value?n.value.loyaltyRank.map(h=>({id:h.memberId.toString(),name:h.name,value:h.totalDays,percentage:h.percentage})):[]),u=y(()=>{switch(c.value){case"activity":return m.value;case"dragon":return w.value;case"loyalty":return f.value;default:return m.value}}),i=y(()=>{switch(c.value){case"activity":return"条";case"dragon":case"loyalty":return"天";default:return"条"}}),p=y(()=>{switch(c.value){case"activity":return"🏆 活跃榜 - 发言数量";case"dragon":return"🏆 活跃榜 - 龙王";case"loyalty":return"🏆 活跃榜 - 累计发言";default:return"🏆 活跃榜"}}),$=y(()=>{switch(c.value){case"activity":return"按消息发送数量排名";case"dragon":return`每天发言最多的人+1(共 ${a.value?.totalDays??0} 天)`;case"loyalty":return`累计发言天数排名(共 ${n.value?.totalDays??0} 天)`;default:return""}});return z(()=>[t.sessionId,t.timeFilter],()=>v(),{immediate:!0,deep:!0}),(h,b)=>(o(),C(e(P),{title:p.value,description:$.value},{headerRight:T(()=>[s("div",cn,[l.showTopNSelect?(o(),C(e(ie),{key:0,modelValue:d.value,"onUpdate:modelValue":b[0]||(b[0]=k=>d.value=k)},null,8,["modelValue"])):N("",!0),x(e(le),{modelValue:c.value,"onUpdate:modelValue":b[1]||(b[1]=k=>c.value=k),items:[{label:"发言数量",value:"activity"},{label:"龙王",value:"dragon"},{label:"累计发言",value:"loyalty"}],size:"sm"},null,8,["modelValue"])])]),default:T(()=>[r.value&&(c.value==="dragon"||c.value==="loyalty")?(o(),C(e(te),{key:0,text:"正在加载数据..."})):(o(),I(q,{key:1},[u.value.length>0?(o(),C(e(Ve),{key:0,members:u.value,title:p.value,unit:i.value,"top-n":d.value,bare:""},null,8,["members","title","unit","top-n"])):(o(),I("div",dn,"暂无数据"))],64))]),_:1},8,["title","description"]))}}),vn={key:0},pn={key:0,class:"flex items-center justify-center gap-6 border-t border-gray-100 px-5 py-3 dark:border-gray-800"},hn={class:"px-3 py-2"},gn=A({__name:"EChartStreakRank",props:{items:{},title:{},description:{},topN:{default:10},mode:{default:"max"},maxHeightVh:{default:60},bare:{type:Boolean,default:!1}},setup(l){const t=l,a=ye(),n=y(()=>t.mode==="current"?t.items.filter(f=>f.currentStreak>0).sort((f,u)=>u.currentStreak-f.currentStreak).slice(0,t.topN):t.items.slice(0,t.topN)),r=y(()=>{const f=n.value.length*36;return Math.max(f+30,180)}),c={type:"linear",x:0,y:0,x2:1,y2:0,colorStops:[{offset:0,color:"#ee4567"},{offset:1,color:"#f7758c"}]},d={type:"linear",x:0,y:0,x2:1,y2:0,colorStops:[{offset:0,color:"#f97316"},{offset:1,color:"#fb923c"}]};function v(f,u){return`${f} ~ ${u}`}function m(f){return t.mode==="current"?f.currentStreak:f.maxStreak}const w=y(()=>{const f=[...n.value].reverse(),u=f.map(h=>be(h.name,a.value.labelMaxLength)),i=f.map(h=>m(h)),p=Math.max(...i,1),$=f.map(h=>({value:m(h),itemStyle:{color:t.mode==="current"||h.currentStreak>0?d:c,borderRadius:[0,4,4,0]}}));return{tooltip:{trigger:"axis",axisPointer:{type:"shadow"},backgroundColor:"rgba(0, 0, 0, 0.8)",borderColor:"transparent",textStyle:{color:"#fff"},formatter:h=>{const b=h[0];if(!b)return"";const k=n.value.length-1-b.dataIndex,_=n.value[k];if(t.mode==="current")return`
8
+ <div style="padding: 4px 8px;">
9
+ <div style="font-weight: bold; margin-bottom: 6px;">${_.name}</div>
10
+ <div style="color: #fb923c;">🔥 当前连续 <b>${_.currentStreak}</b> 天</div>
11
+ <div style="margin-top: 4px; font-size: 12px; color: #9ca3af;">最长记录: ${_.maxStreak} 天</div>
12
+ </div>
13
+ `;let V=`
14
+ <div style="padding: 4px 8px;">
15
+ <div style="font-weight: bold; margin-bottom: 6px;">${_.name}</div>
16
+ <div style="margin-bottom: 4px;">🔥 最长连续: <b>${_.maxStreak}</b> 天</div>
17
+ <div style="font-size: 12px; color: #9ca3af;">${v(_.maxStreakStart,_.maxStreakEnd)}</div>
18
+ `;return _.currentStreak>0&&(V+=`<div style="margin-top: 6px; color: #fb923c;">🔥 当前连续 ${_.currentStreak} 天</div>`),V+="</div>",V}},grid:{left:a.value.gridLeft,right:70,top:15,bottom:15,containLabel:!1},xAxis:{type:"value",max:p*1.15,axisLine:{show:!1},axisTick:{show:!1},axisLabel:{show:!1},splitLine:{show:!1}},yAxis:{type:"category",data:u,axisLine:{show:!1},axisTick:{show:!1},axisLabel:{fontSize:12,color:"#4b5563",margin:12,formatter:(h,b)=>{const _=n.value.length-1-b+1;return`${_===1?"🥇":_===2?"🥈":_===3?"🥉":`${_}.`} ${h}`}}},series:[{type:"bar",data:$,barWidth:18,barCategoryGap:"30%",label:{show:!0,position:"right",distance:8,formatter:h=>{const b=n.value.length-1-h.dataIndex,k=n.value[b],_=m(k),V=t.mode==="current"||k.currentStreak>0?" 🔥":"";return`${_} 天${V}`},fontSize:11,fontWeight:500,color:"#6b7280"},emphasis:{itemStyle:{shadowBlur:6,shadowColor:"rgba(249, 115, 22, 0.3)"}}}]}});return(f,u)=>l.bare?(o(),I("div",vn,[x(e(fe),{"content-height":r.value,"max-height-vh":l.maxHeightVh},{default:T(()=>[x(e(ae),{option:w.value,height:r.value},null,8,["option","height"])]),_:1},8,["content-height","max-height-vh"]),l.mode==="max"?(o(),I("div",pn,[...u[0]||(u[0]=[vt('<div class="flex items-center gap-1.5"><div class="h-3 w-6 rounded bg-linear-to-r from-orange-500 to-orange-400"></div><span class="text-xs text-gray-500">当前连续中 🔥</span></div><div class="flex items-center gap-1.5"><div class="h-3 w-6 rounded bg-linear-to-r from-pink-500 to-pink-400"></div><span class="text-xs text-gray-500">已中断</span></div>',2)])])):N("",!0)])):(o(),C(e(P),{key:1,title:l.title,description:l.description,scrollable:"","max-height-vh":l.maxHeightVh},pt({default:T(()=>[s("div",hn,[x(e(ae),{option:w.value,height:r.value},null,8,["option","height"])])]),_:2},[l.mode==="max"?{name:"footer",fn:T(()=>[u[1]||(u[1]=s("div",{class:"flex items-center justify-center gap-6 border-t border-gray-100 px-5 py-3 dark:border-gray-800"},[s("div",{class:"flex items-center gap-1.5"},[s("div",{class:"h-3 w-6 rounded bg-linear-to-r from-orange-500 to-orange-400"}),s("span",{class:"text-xs text-gray-500"},"当前连续中 🔥")]),s("div",{class:"flex items-center gap-1.5"},[s("div",{class:"h-3 w-6 rounded bg-linear-to-r from-pink-500 to-pink-400"}),s("span",{class:"text-xs text-gray-500"},"已中断")])],-1))]),key:"0"}:void 0]),1032,["title","description","max-height-vh"]))}}),fn={class:"px-3 py-2"},yn=A({__name:"EChartBattleRank",props:{battles:{},title:{},description:{},topN:{default:10},maxHeightVh:{default:60},bare:{type:Boolean,default:!1}},setup(l){const t=l,a=y(()=>t.battles.slice(0,t.topN)),n=y(()=>{const v=a.value.length*36;return Math.max(v+30,180)}),r={type:"linear",x:0,y:0,x2:1,y2:0,colorStops:[{offset:0,color:"#ee4567"},{offset:1,color:"#f7758c"}]};function c(v){return`${v.participantCount} 人参战`}const d=y(()=>{const v=[...a.value].reverse(),m=v.map(i=>c(i)),w=v.map(i=>i.totalImages),f=Math.max(...w,1),u=v.map(i=>({value:i.totalImages,itemStyle:{color:r,borderRadius:[0,4,4,0]}}));return{tooltip:{trigger:"axis",axisPointer:{type:"shadow"},backgroundColor:"rgba(0, 0, 0, 0.85)",borderColor:"transparent",textStyle:{color:"#fff",fontSize:12},extraCssText:"max-width: 300px;",formatter:i=>{const p=i[0];if(!p)return"";const $=a.value.length-1-p.dataIndex,h=a.value[$],b=h.participants.slice(0,5).map(_=>`<span style="color: #d1d5db;">${_.name}</span> <b>${_.imageCount}</b>张`).join("、"),k=h.participants.length>5?`、+${h.participants.length-5}`:"";return`
19
+ <div style="padding: 6px 8px;">
20
+ <div style="font-weight: bold; margin-bottom: 8px; font-size: 13px;">
21
+ ⚔️ ${Ne(h.startTime)}
22
+ </div>
23
+ <div style="margin-bottom: 6px;">
24
+ <span style="color: #9ca3af;">参战人数:</span> <b>${h.participantCount}</b> 人
25
+ </div>
26
+ <div style="margin-bottom: 8px;">
27
+ <span style="color: #9ca3af;">总图片数:</span> <b style="color: #f472b6;">${h.totalImages}</b> 张
28
+ </div>
29
+ <div style="border-top: 1px solid #374151; padding-top: 6px; font-size: 11px;">
30
+ ${b}${k}
31
+ </div>
32
+ </div>
33
+ `}},grid:{left:95,right:125,top:15,bottom:15,containLabel:!1},xAxis:{type:"value",max:f*1.15,axisLine:{show:!1},axisTick:{show:!1},axisLabel:{show:!1},splitLine:{show:!1}},yAxis:{type:"category",data:m,axisLine:{show:!1},axisTick:{show:!1},axisLabel:{fontSize:11,color:"#4b5563",margin:12,formatter:(i,p)=>{const h=a.value.length-1-p+1;return`${h===1?"🥇":h===2?"🥈":h===3?"🥉":`${h}.`} ${i}`}}},series:[{type:"bar",data:u,barWidth:18,barCategoryGap:"30%",label:{show:!0,position:"right",distance:8,formatter:i=>{const p=a.value.length-1-i.dataIndex,$=a.value[p],h=Ne($.startTime);return`${$.totalImages} 张 (${h})`},fontSize:11,fontWeight:500,color:"#6b7280"},emphasis:{itemStyle:{shadowBlur:6,shadowColor:"rgba(238, 69, 103, 0.3)"}}}]}});return(v,m)=>l.bare?(o(),C(e(fe),{key:0,"content-height":n.value,"max-height-vh":l.maxHeightVh},{default:T(()=>[x(e(ae),{option:d.value,height:n.value},null,8,["option","height"])]),_:1},8,["content-height","max-height-vh"])):(o(),C(e(P),{key:1,title:l.title,description:l.description,scrollable:"","max-height-vh":l.maxHeightVh},{default:T(()=>[s("div",fn,[x(e(ae),{option:d.value,height:n.value},null,8,["option","height"])])]),_:1},8,["title","description","max-height-vh"]))}}),bn={class:"px-3 py-2"},xn=A({__name:"EChartTimeRank",props:{items:{},title:{},description:{},topN:{default:10},maxHeightVh:{default:60},bare:{type:Boolean,default:!1}},setup(l){const t=l,a=ye(),n=y(()=>t.items.slice(0,t.topN)),r=y(()=>{const m=n.value.length*36;return Math.max(m+30,180)}),c={type:"linear",x:0,y:0,x2:1,y2:0,colorStops:[{offset:0,color:"#f59e0b"},{offset:1,color:"#fbbf24"}]};function d(m){return(m/1e3).toFixed(2)+"s"}const v=y(()=>{if(n.value.length===0)return{};const m=[...n.value].reverse(),w=m.map(i=>be(i.name,a.value.labelMaxLength)),f=n.value[0].avgTimeDiff,u=m.map(i=>({value:Math.round(f/i.avgTimeDiff*100),itemStyle:{color:c,borderRadius:[0,4,4,0]}}));return{tooltip:{trigger:"axis",axisPointer:{type:"shadow"},backgroundColor:"rgba(0, 0, 0, 0.8)",borderColor:"transparent",textStyle:{color:"#fff"},formatter:i=>{const p=i[0];if(!p)return"";const $=n.value.length-1-p.dataIndex,h=n.value[$];return`
34
+ <div style="padding: 4px 8px;">
35
+ <div style="font-weight: bold; margin-bottom: 6px;">${h.name}</div>
36
+ <div style="margin-bottom: 4px;">⚡️ 平均反应时间: <b>${d(h.avgTimeDiff)}</b></div>
37
+ <div style="font-size: 12px; color: #9ca3af;">参与复读 ${h.count} 次</div>
38
+ </div>
39
+ `}},grid:{left:a.value.gridLeft,right:100,top:15,bottom:15,containLabel:!1},xAxis:{type:"value",max:105,axisLine:{show:!1},axisTick:{show:!1},axisLabel:{show:!1},splitLine:{show:!1}},yAxis:{type:"category",data:w,axisLine:{show:!1},axisTick:{show:!1},axisLabel:{fontSize:12,color:"#4b5563",margin:12,formatter:(i,p)=>{const h=n.value.length-1-p+1;return`${h===1?"🥇":h===2?"🥈":h===3?"🥉":`${h}.`} ${i}`}}},series:[{type:"bar",data:u,barWidth:18,barCategoryGap:"30%",label:{show:!0,position:"right",distance:8,formatter:i=>{const p=n.value.length-1-i.dataIndex,$=n.value[p];return`${d($.avgTimeDiff)} · ${$.count}次`},fontSize:11,fontWeight:500,color:"#6b7280"},emphasis:{itemStyle:{shadowBlur:6,shadowColor:"rgba(245, 158, 11, 0.3)"}}}]}});return(m,w)=>l.bare?(o(),C(e(fe),{key:0,"content-height":r.value,"max-height-vh":l.maxHeightVh},{default:T(()=>[x(e(ae),{option:v.value,height:r.value},null,8,["option","height"])]),_:1},8,["content-height","max-height-vh"])):(o(),C(e(P),{key:1,title:l.title,description:l.description,scrollable:"","max-height-vh":l.maxHeightVh},{default:T(()=>[s("div",bn,[x(e(ae),{option:v.value,height:r.value},null,8,["option","height"])])]),_:1},8,["title","description","max-height-vh"]))}}),kn={class:"flex items-center gap-3"},wn={class:"px-3 py-2"},_n=A({__name:"EChartDivingRank",props:{items:{},showTopNSelect:{type:Boolean,default:!0},maxHeightVh:{default:60},globalTopN:{}},setup(l){const t=l,a=ye(),n=S("desc"),r=S(t.globalTopN??10);z(()=>t.globalTopN,i=>{i!==void 0&&(r.value=i)});const c=y(()=>[...t.items].sort((p,$)=>n.value==="desc"?$.daysSinceLastMessage-p.daysSinceLastMessage:p.daysSinceLastMessage-$.daysSinceLastMessage).slice(0,r.value)),d=y(()=>n.value==="desc"?"🤿 潜水榜 - 潜水最久":"🤿 潜水榜 - 最近冒泡"),v=y(()=>n.value==="desc"?"距离上次发言时间最久的成员":"最近发言过的成员"),m=y(()=>{const i=c.value.length*36;return Math.max(i+30,180)}),w={type:"linear",x:0,y:0,x2:1,y2:0,colorStops:[{offset:0,color:"#06b6d4"},{offset:1,color:"#22d3ee"}]};function f(i){return i===0?"今天":i===1?"昨天":`${i} 天前`}const u=y(()=>{if(c.value.length===0)return{};const i=[...c.value].reverse(),p=i.map(b=>be(b.name,a.value.labelMaxLength)),$=Math.max(...c.value.map(b=>b.daysSinceLastMessage),1),h=i.map(b=>({value:b.daysSinceLastMessage,itemStyle:{color:w,borderRadius:[0,4,4,0]}}));return{tooltip:{trigger:"axis",axisPointer:{type:"shadow"},backgroundColor:"rgba(0, 0, 0, 0.8)",borderColor:"transparent",textStyle:{color:"#fff"},formatter:b=>{const k=b[0];if(!k)return"";const _=c.value.length-1-k.dataIndex,V=c.value[_];return`
40
+ <div style="padding: 4px 8px;">
41
+ <div style="font-weight: bold; margin-bottom: 6px;">${V.name}</div>
42
+ <div style="margin-bottom: 4px;">🤿 ${f(V.daysSinceLastMessage)}</div>
43
+ <div style="font-size: 12px; color: #9ca3af;">最后发言: ${Xt(V.lastMessageTs)}</div>
44
+ </div>
45
+ `}},grid:{left:a.value.gridLeft,right:100,top:15,bottom:15,containLabel:!1},xAxis:{type:"value",max:$*1.15,axisLine:{show:!1},axisTick:{show:!1},axisLabel:{show:!1},splitLine:{show:!1}},yAxis:{type:"category",data:p,axisLine:{show:!1},axisTick:{show:!1},axisLabel:{fontSize:12,color:"#4b5563",margin:12,formatter:(b,k)=>{const V=c.value.length-1-k+1;return`${V===1?"🥇":V===2?"🥈":V===3?"🥉":`${V}.`} ${b}`}}},series:[{type:"bar",data:h,barWidth:18,barCategoryGap:"30%",label:{show:!0,position:"right",distance:8,formatter:b=>{const k=c.value.length-1-b.dataIndex,_=c.value[k];return f(_.daysSinceLastMessage)},fontSize:11,fontWeight:500,color:"#6b7280"},emphasis:{itemStyle:{shadowBlur:6,shadowColor:"rgba(0, 0, 0, 0.2)"}}}]}});return(i,p)=>(o(),C(e(P),{title:d.value,description:v.value,scrollable:"","max-height-vh":l.maxHeightVh},{headerRight:T(()=>[s("div",kn,[l.showTopNSelect?(o(),C(e(ie),{key:0,modelValue:r.value,"onUpdate:modelValue":p[0]||(p[0]=$=>r.value=$)},null,8,["modelValue"])):N("",!0),x(e(le),{modelValue:n.value,"onUpdate:modelValue":p[1]||(p[1]=$=>n.value=$),items:[{label:"潜水最久",value:"desc"},{label:"最近冒泡",value:"asc"}],size:"sm"},null,8,["modelValue"])])]),default:T(()=>[s("div",wn,[x(e(ae),{option:u.value,height:m.value},null,8,["option","height"])])]),_:1},8,["title","description","max-height-vh"]))}}),$n={class:"px-3 py-2"},Cn=A({__name:"EChartConsecutiveRank",props:{items:{},title:{},description:{},topN:{default:10},maxHeightVh:{default:60},bare:{type:Boolean,default:!1}},setup(l){const t=l,a=ye(),n=y(()=>[...t.items].sort((m,w)=>w.maxConsecutiveDays-m.maxConsecutiveDays).slice(0,t.topN)),r=y(()=>{const m=n.value.length*36;return Math.max(m+30,180)}),c={type:"linear",x:0,y:0,x2:1,y2:0,colorStops:[{offset:0,color:"#f97316"},{offset:1,color:"#fb923c"}]},d={type:"linear",x:0,y:0,x2:1,y2:0,colorStops:[{offset:0,color:"#ec4899"},{offset:1,color:"#f472b6"}]},v=y(()=>{if(n.value.length===0)return{};const m=[...n.value].reverse(),w=m.map(u=>be(u.name,a.value.labelMaxLength)),f=Math.max(...n.value.map(u=>u.maxConsecutiveDays),1);return{tooltip:{trigger:"axis",axisPointer:{type:"shadow"},backgroundColor:"rgba(0, 0, 0, 0.85)",borderColor:"transparent",textStyle:{color:"#fff",fontSize:12},formatter:u=>{if(!u||u.length===0)return"";const i=u[0].dataIndex,p=n.value.length-1-i,$=n.value[p];let h=`
46
+ <div style="padding: 6px 8px;">
47
+ <div style="font-weight: bold; margin-bottom: 6px;">${$.name}</div>
48
+ <div>最长连续: <b style="color: #f472b6;">${$.maxConsecutiveDays}</b> 天</div>
49
+ `;return $.currentStreak>0&&(h+=`<div style="color: #f97316;">🔥 当前连续 ${$.currentStreak} 天</div>`),h+="</div>",h}},legend:{show:!1},grid:{left:a.value.gridLeft,right:75,top:15,bottom:15,containLabel:!1},xAxis:{type:"value",max:f*1.15,axisLine:{show:!1},axisTick:{show:!1},axisLabel:{show:!1},splitLine:{show:!1}},yAxis:{type:"category",data:w,axisLine:{show:!1},axisTick:{show:!1},axisLabel:{fontSize:12,color:"#4b5563",margin:12,formatter:(u,i)=>{const $=n.value.length-1-i+1;return`${$===1?"🥇":$===2?"🥈":$===3?"🥉":`${$}.`} ${u}`}}},series:[{name:"当前连续",type:"bar",data:m.map(u=>({value:u.currentStreak>0?u.maxConsecutiveDays:0,itemStyle:{color:c,borderRadius:[0,4,4,0]}})),barWidth:18,barGap:"-100%",label:{show:!0,position:"right",distance:8,formatter:u=>{const i=n.value.length-1-u.dataIndex,p=n.value[i];return p.currentStreak>0?`${p.maxConsecutiveDays} 天`:""},fontSize:11,fontWeight:500,color:"#6b7280"}},{name:"已中断",type:"bar",data:m.map(u=>({value:u.currentStreak===0?u.maxConsecutiveDays:0,itemStyle:{color:d,borderRadius:[0,4,4,0]}})),barWidth:18,label:{show:!0,position:"right",distance:8,formatter:u=>{const i=n.value.length-1-u.dataIndex,p=n.value[i];return p.currentStreak===0?`${p.maxConsecutiveDays} 天`:""},fontSize:11,fontWeight:500,color:"#6b7280"}}]}});return(m,w)=>l.bare?(o(),C(e(fe),{key:0,"content-height":r.value,"max-height-vh":l.maxHeightVh},{default:T(()=>[x(e(ae),{option:v.value,height:r.value},null,8,["option","height"])]),_:1},8,["content-height","max-height-vh"])):(o(),C(e(P),{key:1,title:l.title,description:l.description,scrollable:"","max-height-vh":l.maxHeightVh},{default:T(()=>[s("div",$n,[x(e(ae),{option:v.value,height:r.value},null,8,["option","height"])])]),_:1},8,["title","description","max-height-vh"]))}}),In={class:"px-3 py-2"},Tn=A({__name:"EChartNightOwlRank",props:{items:{},title:{},description:{},topN:{default:10},maxHeightVh:{default:60},bare:{type:Boolean,default:!1}},setup(l){const t=l,a=ye(),n=y(()=>t.items.slice(0,t.topN)),r=y(()=>{const v=n.value.length*36;return Math.max(v+50,200)}),c={h23:"#8b5cf6",h0:"#3b82f6",h1:"#06b6d4",h2:"#f59e0b",h3to4:"#ef4444"},d=y(()=>{if(n.value.length===0)return{};const v=[...n.value].reverse(),m=v.map(f=>be(f.name,a.value.labelMaxLength)),w=Math.max(...n.value.map(f=>f.totalNightMessages),1);return{tooltip:{trigger:"axis",axisPointer:{type:"shadow"},backgroundColor:"rgba(0, 0, 0, 0.85)",borderColor:"transparent",textStyle:{color:"#fff",fontSize:12},formatter:f=>{if(!f||f.length===0)return"";const u=f[0].dataIndex,i=n.value.length-1-u,p=n.value[i],$=p.hourlyBreakdown;return`
50
+ <div style="padding: 6px 8px;">
51
+ <div style="font-weight: bold; margin-bottom: 6px;">${p.name}</div>
52
+ <div style="margin-bottom: 4px;">
53
+ 称号: <b style="color: #f472b6;">${p.title}</b>
54
+ </div>
55
+ <div style="margin-bottom: 6px;">总发言: <b>${p.totalNightMessages}</b> 条</div>
56
+ <div style="border-top: 1px solid #374151; padding-top: 6px;">
57
+ <div><span style="color: ${c.h23};">●</span> 23点: ${$.h23} 条</div>
58
+ <div><span style="color: ${c.h0};">●</span> 0点: ${$.h0} 条</div>
59
+ <div><span style="color: ${c.h1};">●</span> 1点: ${$.h1} 条</div>
60
+ <div><span style="color: ${c.h2};">●</span> 2点: ${$.h2} 条</div>
61
+ <div><span style="color: ${c.h3to4};">●</span> 3-4点: ${$.h3to4} 条</div>
62
+ </div>
63
+ </div>
64
+ `}},legend:{show:!0,bottom:0,itemWidth:12,itemHeight:12,textStyle:{color:"#6b7280",fontSize:10}},grid:{left:a.value.gridLeft,right:70,top:15,bottom:35,containLabel:!1},xAxis:{type:"value",max:w*1.15,axisLine:{show:!1},axisTick:{show:!1},axisLabel:{show:!1},splitLine:{show:!1}},yAxis:{type:"category",data:m,axisLine:{show:!1},axisTick:{show:!1},axisLabel:{fontSize:12,color:"#4b5563",margin:12,formatter:(f,u)=>{const p=n.value.length-1-u+1;return`${p===1?"🥇":p===2?"🥈":p===3?"🥉":`${p}.`} ${f}`}}},series:[{name:"23点",type:"bar",stack:"total",data:v.map(f=>f.hourlyBreakdown.h23),itemStyle:{color:c.h23},barWidth:18},{name:"0点",type:"bar",stack:"total",data:v.map(f=>f.hourlyBreakdown.h0),itemStyle:{color:c.h0},barWidth:18},{name:"1点",type:"bar",stack:"total",data:v.map(f=>f.hourlyBreakdown.h1),itemStyle:{color:c.h1},barWidth:18},{name:"2点",type:"bar",stack:"total",data:v.map(f=>f.hourlyBreakdown.h2),itemStyle:{color:c.h2},barWidth:18},{name:"3-4点",type:"bar",stack:"total",data:v.map(f=>f.hourlyBreakdown.h3to4),itemStyle:{color:c.h3to4,borderRadius:[0,4,4,0]},barWidth:18,label:{show:!0,position:"right",distance:8,formatter:f=>{const u=n.value.length-1-f.dataIndex;return`${n.value[u].totalNightMessages} 条`},fontSize:11,fontWeight:500,color:"#6b7280"}}]}});return(v,m)=>l.bare?(o(),C(e(fe),{key:0,"content-height":r.value,"max-height-vh":l.maxHeightVh},{default:T(()=>[x(e(ae),{option:d.value,height:r.value},null,8,["option","height"])]),_:1},8,["content-height","max-height-vh"])):(o(),C(e(P),{key:1,title:l.title,description:l.description,scrollable:"","max-height-vh":l.maxHeightVh},{default:T(()=>[s("div",In,[x(e(ae),{option:d.value,height:r.value},null,8,["option","height"])])]),_:1},8,["title","description","max-height-vh"]))}}),Sn={id:"streak-rank",class:"scroll-mt-24"},Vn={class:"flex items-center gap-3"},Rn=A({__name:"CheckInRank",props:{sessionId:{},timeFilter:{},showTopNSelect:{type:Boolean,default:!0},globalTopN:{}},setup(l){const t=l,a=S(null),n=S(!1),r=S("max"),c=S(t.globalTopN??10);z(()=>t.globalTopN,f=>{f!==void 0&&(c.value=f)});const d=y(()=>r.value==="max"?"🔥 火花榜 - 最长连续":"🔥 火花榜 - 当前连续"),v=y(()=>r.value==="max"?"历史最长连续发言天数":"正在持续连续发言的成员"),m=y(()=>a.value?a.value.streakRank.some(f=>f.currentStreak>0):!1);async function w(){if(t.sessionId){n.value=!0;try{a.value=await Q().getCheckInAnalysis(t.sessionId,t.timeFilter)}catch(f){console.error("加载打卡分析失败:",f)}finally{n.value=!1}}}return z(()=>[t.sessionId,t.timeFilter],()=>{w()},{immediate:!0,deep:!0}),(f,u)=>(o(),I("div",Sn,[n.value?(o(),C(e(te),{key:0,text:"正在分析数据..."})):a.value&&a.value.streakRank.length>0?(o(),C(e(P),{key:1,title:d.value,description:v.value},{headerRight:T(()=>[s("div",Vn,[l.showTopNSelect?(o(),C(e(ie),{key:0,modelValue:c.value,"onUpdate:modelValue":u[0]||(u[0]=i=>c.value=i)},null,8,["modelValue"])):N("",!0),m.value?(o(),C(e(le),{key:1,modelValue:r.value,"onUpdate:modelValue":u[1]||(u[1]=i=>r.value=i),items:[{label:"最长连续",value:"max"},{label:"当前连续",value:"current"}],size:"sm"},null,8,["modelValue"])):N("",!0)])]),default:T(()=>[x(e(gn),{items:a.value.streakRank,title:d.value,mode:r.value,"top-n":c.value,bare:""},null,8,["items","title","mode","top-n"])]),_:1},8,["title","description"])):(o(),C(e(P),{key:2,title:"🔥 火花榜"},{default:T(()=>[x(e(ne),{text:"暂无连续发言数据"})]),_:1}))]))}}),Mn={class:"flex items-center gap-3"},Ln={key:1,class:"py-8 text-center text-sm text-gray-400"},Dn={key:1,class:"py-8 text-center text-sm text-gray-400"},Nn=A({__name:"MemeBattleRank",props:{sessionId:{},timeFilter:{},showTopNSelect:{type:Boolean,default:!0},globalTopN:{}},setup(l){const t=l,a=S(null),n=S(!1),r=S("count"),c=S(t.globalTopN??10);z(()=>t.globalTopN,p=>{p!==void 0&&(c.value=p)});async function d(){if(t.sessionId){n.value=!0;try{a.value=await Q().getMemeBattleAnalysis(t.sessionId,t.timeFilter)}catch(p){console.error("加载斗图分析失败:",p)}finally{n.value=!1}}}const v=y(()=>a.value?a.value.rankByCount.map(p=>({id:p.memberId.toString(),name:p.name,value:p.count,percentage:p.percentage})):[]),m=y(()=>a.value?a.value.rankByImageCount.map(p=>({id:p.memberId.toString(),name:p.name,value:p.count,percentage:p.percentage})):[]),w=y(()=>r.value==="count"?v.value:m.value),f=y(()=>r.value==="count"?"场":"张"),u=y(()=>{switch(r.value){case"battle":return"⚔️ 斗图榜 - 史诗级战役";case"count":return"⚔️ 斗图榜 - 按场次";case"image":return"⚔️ 斗图榜 - 按图量";default:return"⚔️ 斗图榜"}}),i=y(()=>{switch(r.value){case"battle":return"记录最激烈的斗图大战";case"count":return"参与斗图次数最多的人";case"image":return"在斗图中发送图片最多的人";default:return""}});return z(()=>[t.sessionId,t.timeFilter],()=>d(),{immediate:!0,deep:!0}),(p,$)=>n.value?(o(),C(e(te),{key:0,text:"正在统计斗图数据..."})):a.value?(o(),C(e(P),{key:1,title:u.value,description:i.value},{headerRight:T(()=>[s("div",Mn,[l.showTopNSelect?(o(),C(e(ie),{key:0,modelValue:c.value,"onUpdate:modelValue":$[0]||($[0]=h=>c.value=h)},null,8,["modelValue"])):N("",!0),x(e(le),{modelValue:r.value,"onUpdate:modelValue":$[1]||($[1]=h=>r.value=h),items:[{label:"按场次",value:"count"},{label:"按图量",value:"image"},{label:"史诗级战役",value:"battle"}],size:"sm"},null,8,["modelValue"])])]),default:T(()=>[r.value==="battle"?(o(),I(q,{key:0},[a.value.topBattles.length>0?(o(),C(e(yn),{key:0,battles:a.value.topBattles,title:"","top-n":c.value,bare:""},null,8,["battles","top-n"])):(o(),I("div",Ln,"暂无史诗级战役数据"))],64)):(o(),I(q,{key:1},[w.value.length>0?(o(),C(e(Ve),{key:0,members:w.value,title:u.value,unit:f.value,"top-n":c.value,bare:""},null,8,["members","title","unit","top-n"])):(o(),I("div",Dn,"暂无斗图数据"))],64))]),_:1},8,["title","description"])):N("",!0)}}),An={class:"space-y-6"},Un={class:"flex items-center gap-3"},Fn={class:"flex items-center gap-3"},Bn={key:1,class:"px-3 py-2"},qn=A({__name:"RepeatSection",props:{sessionId:{},timeFilter:{},showTopNSelect:{type:Boolean,default:!0},globalTopN:{}},setup(l){const t=l,a=S(null),n=S(!1),r=S("originator"),c=S("fastest"),d=S(t.globalTopN??10),v=S(t.globalTopN??10);z(()=>t.globalTopN,_=>{_!==void 0&&(d.value=_,v.value=_)});async function m(){if(t.sessionId){n.value=!0;try{a.value=await Q().getRepeatAnalysis(t.sessionId,t.timeFilter)}catch(_){console.error("加载复读分析失败:",_)}finally{n.value=!1}}}const w=y(()=>a.value?a.value.originators.map(_=>({id:_.memberId.toString(),name:_.name,value:_.count,percentage:_.percentage})):[]),f=y(()=>a.value?a.value.initiators.map(_=>({id:_.memberId.toString(),name:_.name,value:_.count,percentage:_.percentage})):[]),u=y(()=>a.value?a.value.breakers.map(_=>({id:_.memberId.toString(),name:_.name,value:_.count,percentage:_.percentage})):[]),i=y(()=>{switch(r.value){case"originator":return w.value;case"initiator":return f.value;case"breaker":return u.value;default:return w.value}}),p=y(()=>{switch(r.value){case"originator":return"🔁 复读榜 - 被复读";case"initiator":return"🔁 复读榜 - 挑起";case"breaker":return"🔁 复读榜 - 打断";default:return"🔁 复读榜"}}),$=y(()=>{switch(r.value){case"originator":return"发出的消息被别人复读的次数";case"initiator":return"第二个发送相同消息、带起节奏的人";case"breaker":return"终结复读链的人";default:return""}}),h=y(()=>{if(!a.value)return{labels:[],values:[]};const _=a.value.chainLengthDistribution;return{labels:_.map(V=>`${V.length}人`),values:_.map(V=>V.count)}}),b=y(()=>c.value==="fastest"?"📊 复读统计 - 最快反应":"📊 复读统计 - 链长分布"),k=y(()=>{if(c.value==="fastest")return"平均复读反应时间(至少参与5次复读)";const _=a.value?.totalRepeatChains??0,V=a.value?.avgChainLength??0;return`共 ${_} 次复读,平均 ${V} 人参与`});return z(()=>[t.sessionId,t.timeFilter],()=>m(),{immediate:!0,deep:!0}),(_,V)=>(o(),I("div",An,[n.value?(o(),C(e(te),{key:0,text:"正在分析复读数据..."})):a.value&&a.value.totalRepeatChains>0?(o(),I(q,{key:1},[x(e(P),{title:p.value,description:$.value},{headerRight:T(()=>[s("div",Un,[l.showTopNSelect?(o(),C(e(ie),{key:0,modelValue:d.value,"onUpdate:modelValue":V[0]||(V[0]=O=>d.value=O)},null,8,["modelValue"])):N("",!0),x(e(le),{modelValue:r.value,"onUpdate:modelValue":V[1]||(V[1]=O=>r.value=O),items:[{label:"被复读",value:"originator"},{label:"挑起",value:"initiator"},{label:"打断",value:"breaker"}],size:"sm"},null,8,["modelValue"])])]),default:T(()=>[i.value.length>0?(o(),C(e(Ve),{key:0,members:i.value,title:p.value,unit:"次","top-n":d.value,bare:""},null,8,["members","title","top-n"])):(o(),C(e(ne),{key:1,text:"暂无数据"}))]),_:1},8,["title","description"]),x(e(P),{title:b.value,description:k.value},{headerRight:T(()=>[s("div",Fn,[l.showTopNSelect&&c.value==="fastest"?(o(),C(e(ie),{key:0,modelValue:v.value,"onUpdate:modelValue":V[2]||(V[2]=O=>v.value=O)},null,8,["modelValue"])):N("",!0),x(e(le),{modelValue:c.value,"onUpdate:modelValue":V[3]||(V[3]=O=>c.value=O),items:[{label:"最快反应",value:"fastest"},{label:"链长分布",value:"distribution"}],size:"sm"},null,8,["modelValue"])])]),default:T(()=>[c.value==="fastest"?(o(),I(q,{key:0},[a.value.fastestRepeaters&&a.value.fastestRepeaters.length>0?(o(),C(e(xn),{key:0,items:a.value.fastestRepeaters,"top-n":v.value,title:"",bare:""},null,8,["items","top-n"])):(o(),C(e(ne),{key:1,text:"暂无最快复读数据"}))],64)):(o(),I("div",Bn,[h.value.labels.length>0?(o(),C(e(Yt),{key:0,data:h.value,height:200},null,8,["data"])):(o(),C(e(ne),{key:1,text:"暂无分布数据"}))]))]),_:1},8,["title","description"])],64)):(o(),C(e(P),{key:2,title:"🔁 复读榜"},{default:T(()=>[x(e(ne),{text:"该群组暂无复读记录"})]),_:1}))]))}}),zn=A({__name:"DivingRank",props:{sessionId:{},timeFilter:{},globalTopN:{}},setup(l){const t=l,a=S(null),n=S(!1);async function r(){if(t.sessionId){n.value=!0;try{a.value=await Q().getDivingAnalysis(t.sessionId,t.timeFilter)}catch(c){console.error("加载潜水分析失败:",c)}finally{n.value=!1}}}return z(()=>[t.sessionId,t.timeFilter],()=>r(),{immediate:!0,deep:!0}),(c,d)=>n.value?(o(),C(e(te),{key:0,text:"正在统计潜水数据..."})):a.value&&a.value.rank.length>0?(o(),C(e(_n),{key:1,items:a.value.rank,"global-top-n":l.globalTopN},null,8,["items","global-top-n"])):N("",!0)}}),Hn={class:"space-y-6"},En={class:"flex items-center gap-3"},Pn={key:1,class:"py-8 text-center text-sm text-gray-400"},On={key:1,class:"py-8 text-center text-sm text-gray-400"},Wn={class:"flex items-center gap-3"},Kn={key:1,class:"py-8 text-center text-sm text-gray-400"},jn=A({__name:"NightOwlRank",props:{sessionId:{},timeFilter:{},showTopNSelect:{type:Boolean,default:!0},globalTopN:{}},setup(l){const t=l,a=S(null),n=S(!1),r=S("first"),c=S("distribution"),d=S(t.globalTopN??10),v=S(t.globalTopN??10);z(()=>t.globalTopN,b=>{b!==void 0&&(d.value=b,v.value=b)});async function m(){if(t.sessionId){n.value=!0;try{a.value=await Q().getNightOwlAnalysis(t.sessionId,t.timeFilter)}catch(b){console.error("加载出勤分析失败:",b)}finally{n.value=!1}}}const w=y(()=>a.value?a.value.lastSpeakerRank.map(b=>({id:String(b.memberId),name:b.name,value:b.count,percentage:b.percentage})):[]),f=y(()=>a.value?a.value.firstSpeakerRank.map(b=>({id:String(b.memberId),name:b.name,value:b.count,percentage:b.percentage})):[]),u=y(()=>r.value==="last"?w.value:f.value),i=y(()=>r.value==="last"?"⏰ 出勤排行 - 最晚下班":"⏰ 出勤排行 - 最早上班"),p=y(()=>{const b=a.value?.totalDays??0;return r.value==="last"?`每天最后一个发言的人(共 ${b} 天)`:`每天第一个发言的人(共 ${b} 天)`}),$=y(()=>c.value==="distribution"?"🦉 修仙统计 - 发言分布":"🦉 修仙统计 - 连续记录"),h=y(()=>c.value==="distribution"?"深夜时段(23:00-05:00)各时段发言分布":"连续在深夜时段发言的天数");return z(()=>[t.sessionId,t.timeFilter],()=>m(),{immediate:!0,deep:!0}),(b,k)=>(o(),I("div",Hn,[n.value?(o(),C(e(te),{key:0,text:"正在加载出勤分析..."})):a.value?(o(),I(q,{key:1},[x(e(P),{title:$.value,description:h.value},{headerRight:T(()=>[s("div",En,[l.showTopNSelect?(o(),C(e(ie),{key:0,modelValue:d.value,"onUpdate:modelValue":k[0]||(k[0]=_=>d.value=_)},null,8,["modelValue"])):N("",!0),x(e(le),{modelValue:c.value,"onUpdate:modelValue":k[1]||(k[1]=_=>c.value=_),items:[{label:"发言分布",value:"distribution"},{label:"连续记录",value:"consecutive"}],size:"sm"},null,8,["modelValue"])])]),default:T(()=>[c.value==="distribution"?(o(),I(q,{key:0},[a.value.nightOwlRank.length>0?(o(),C(e(Tn),{key:0,items:a.value.nightOwlRank,"top-n":d.value,title:"",bare:""},null,8,["items","top-n"])):(o(),I("div",Pn,"暂无深夜发言数据"))],64)):(o(),I(q,{key:1},[a.value.consecutiveRecords.length>0?(o(),C(e(Cn),{key:0,items:a.value.consecutiveRecords,"top-n":d.value,title:"",bare:""},null,8,["items","top-n"])):(o(),I("div",On,"暂无连续记录"))],64))]),_:1},8,["title","description"]),x(e(P),{title:i.value,description:p.value},{headerRight:T(()=>[s("div",Wn,[l.showTopNSelect?(o(),C(e(ie),{key:0,modelValue:v.value,"onUpdate:modelValue":k[2]||(k[2]=_=>v.value=_)},null,8,["modelValue"])):N("",!0),x(e(le),{modelValue:r.value,"onUpdate:modelValue":k[3]||(k[3]=_=>r.value=_),items:[{label:"最早上班",value:"first"},{label:"最晚下班",value:"last"}],size:"sm"},null,8,["modelValue"])])]),default:T(()=>[u.value.length>0?(o(),C(e(Ve),{key:0,members:u.value,title:i.value,"top-n":v.value,unit:"次",bare:""},null,8,["members","title","top-n"])):(o(),I("div",Kn,"暂无数据"))]),_:1},8,["title","description"])],64)):N("",!0)]))}}),Gn={class:"mb-8 mt-4"},Yn={class:"text-5xl tracking-wider",style:{"font-weight":"800",background:"linear-gradient(to right, #f59e0b, #ec4899, #9333ea)","-webkit-background-clip":"text","-webkit-text-fill-color":"transparent"}},Xn={id:"activity-rank",class:"scroll-mt-24"},Zn={id:"meme-battle",class:"scroll-mt-24"},Jn={id:"repeat",class:"scroll-mt-24"},Qn={id:"night-owl",class:"scroll-mt-24"},el={id:"diving",class:"scroll-mt-24"},tl={class:"border-l border-gray-200 pl-4 dark:border-gray-800"},al={class:"mt-4 border-l border-gray-200 pl-4 dark:border-gray-800"},sl={class:"flex rounded-lg border border-gray-200 bg-white p-0.5 text-xs dark:border-gray-700 dark:bg-page-dark"},ol=["onClick"],nl=A({__name:"OverallRankingTab",props:{sessionId:{},timeFilter:{}},setup(l){const t=l,a=S([]),n=S([]);async function r(){if(!t.sessionId)return;const h=Q(),[b,k]=await Promise.all([h.getMemberActivity(t.sessionId,t.timeFilter),h.getAvailableYears(t.sessionId)]);a.value=b,n.value=k}z(()=>[t.sessionId,t.timeFilter],()=>r(),{immediate:!0,deep:!0});const c=y(()=>{if(t.timeFilter?.startTs&&t.timeFilter?.endTs){const h=new Date(t.timeFilter.startTs*1e3).getFullYear(),b=new Date(t.timeFilter.endTs*1e3).getFullYear();return h===b?`${h} 赛季`:`${h}-${b} 赛季`}if(n.value.length>0){const h=[...n.value].sort((_,V)=>_-V),b=h[0],k=h[h.length-1];return b===k?`${b} 赛季`:`${b}-${k} 赛季`}return"全部赛季"}),d=y(()=>({startTs:t.timeFilter?.startTs,endTs:t.timeFilter?.endTs})),v=[{id:"activity-rank",label:"🏆 活跃榜"},{id:"streak-rank",label:"🔥 火花榜"},{id:"meme-battle",label:"⚔️ 斗图榜"},{id:"repeat",label:"🔁 复读榜"},{id:"night-owl",label:"⏰ 出勤榜"},{id:"diving",label:"🤿 潜水榜"}],{contentRef:m,activeAnchor:w,scrollToAnchor:f}=Jt(v,{threshold:350}),u=S(10),i=S("standard");ht(Qe,i);const p=[{value:"standard",label:"标准"},{value:"wide",label:"宽屏"},{value:"full",label:"全宽"}],$=y(()=>et[i.value].contentClass);return(h,b)=>(o(),I("div",{ref_key:"contentRef",ref:m,class:"flex gap-6 p-6"},[s("div",{class:K(["main-content mx-auto min-w-0 flex-1 space-y-6 px-8",$.value])},[s("div",Gn,[s("h1",Yn," 🏆 "+g(c.value),1),b[1]||(b[1]=s("p",{class:"mt-4 text-sm text-gray-500 dark:text-gray-400"},"各榜单前三名请找群主领取奖励 🎁",-1))]),s("div",Xn,[x(e(mn),{"session-id":t.sessionId,"member-activity":a.value,"time-filter":d.value,"global-top-n":u.value},null,8,["session-id","member-activity","time-filter","global-top-n"])]),x(e(Rn),{"session-id":t.sessionId,"time-filter":d.value,"global-top-n":u.value},null,8,["session-id","time-filter","global-top-n"]),s("div",Zn,[x(e(Nn),{"session-id":t.sessionId,"time-filter":d.value,"global-top-n":u.value},null,8,["session-id","time-filter","global-top-n"])]),s("div",Jn,[x(e(qn),{"session-id":t.sessionId,"time-filter":d.value,"global-top-n":u.value},null,8,["session-id","time-filter","global-top-n"])]),s("div",Qn,[x(e(jn),{"session-id":t.sessionId,"time-filter":d.value,"global-top-n":u.value},null,8,["session-id","time-filter","global-top-n"])]),s("div",el,[x(e(zn),{"session-id":t.sessionId,"time-filter":d.value,"global-top-n":u.value},null,8,["session-id","time-filter","global-top-n"])]),b[2]||(b[2]=s("div",{class:"h-48 no-capture"},null,-1))],2),x(e(sa),{anchors:v,"active-anchor":e(w),onClick:e(f)},{default:T(()=>[s("div",tl,[b[3]||(b[3]=s("div",{class:"mb-2 text-xs text-gray-400"},"显示数量",-1)),x(e(ie),{modelValue:u.value,"onUpdate:modelValue":b[0]||(b[0]=k=>u.value=k)},null,8,["modelValue"])]),s("div",al,[b[4]||(b[4]=s("div",{class:"mb-2 text-xs text-gray-400"},"榜单宽度",-1)),s("div",sl,[(o(),I(q,null,Z(p,k=>s("button",{key:k.value,type:"button",class:K(["rounded-md px-2 py-1 transition",i.value===k.value?"bg-pink-500 text-white shadow-sm":"text-gray-500 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-800"]),onClick:_=>i.value=k.value},g(k.label),11,ol)),64))])])]),_:1},8,["active-anchor","onClick"])],512))}}),ll={class:"flex h-full flex-col"},il={class:"min-h-0 flex-1 overflow-y-auto"},rl={key:1,class:"main-content mx-auto w-full max-w-3xl p-6"},ul=A({__name:"RankingView",props:{sessionId:{},timeFilter:{}},setup(l){const t=l,{t:a,locale:n}=J(),r=S("overall"),c=S(null),d=y(()=>gt("groupRanking",n.value)),v=y(()=>[...d.value?[{id:"overall",label:a("analysis.subTabs.ranking.overall"),icon:"i-heroicons-trophy"}]:[],{id:"hot-repeat",label:a("analysis.subTabs.quotes.hotRepeat"),icon:"i-heroicons-sparkles"},{id:"catchphrase",label:a("analysis.subTabs.quotes.catchphrase"),icon:"i-heroicons-chat-bubble-bottom-center-text"},{id:"keyword",label:a("analysis.subTabs.ranking.keyword"),icon:"i-heroicons-magnifying-glass"}]),m=y(()=>({startTs:t.timeFilter?.startTs,endTs:t.timeFilter?.endTs})),w=y(()=>({...m.value,memberId:c.value}));return z(v,f=>{f.some(u=>u.id===r.value)||(r.value=f[0]?.id??"hot-repeat")},{immediate:!0}),(f,u)=>(o(),I("div",ll,[x(e(Ue),{modelValue:r.value,"onUpdate:modelValue":u[1]||(u[1]=i=>r.value=i),items:v.value,"persist-key":"groupRankingTab"},{right:T(()=>[r.value==="catchphrase"?(o(),C(Ge,{key:0,modelValue:c.value,"onUpdate:modelValue":u[0]||(u[0]=i=>c.value=i),"session-id":t.sessionId},null,8,["modelValue","session-id"])):N("",!0)]),_:1},8,["modelValue","items"]),s("div",il,[x(Te,{name:"fade",mode:"out-in"},{default:T(()=>[r.value==="overall"?(o(),C(nl,{key:0,"session-id":t.sessionId,"time-filter":m.value},null,8,["session-id","time-filter"])):r.value==="keyword"?(o(),I("div",rl,[x(un,{"session-id":t.sessionId,"time-filter":m.value},null,8,["session-id","time-filter"])])):r.value==="hot-repeat"?(o(),C(e(ko),{key:2,"session-id":t.sessionId,"time-filter":m.value},null,8,["session-id","time-filter"])):r.value==="catchphrase"?(o(),C(e(ro),{key:3,"session-id":t.sessionId,"time-filter":w.value},null,8,["session-id","time-filter"])):N("",!0)]),_:1})])]))}}),cl=Se(ul,[["__scopeId","data-v-d8d145dc"]]),dl={class:"main-content max-w-5xl p-6"},ml={class:"mb-4 text-sm text-gray-500 dark:text-gray-400 no-capture"},vl={key:0,class:"divide-y divide-gray-100 dark:divide-gray-800"},pl={class:"w-32 shrink-0 pt-0.5 font-medium text-gray-900 dark:text-white"},hl={class:"flex flex-1 flex-wrap items-center gap-2"},gl={class:"flex items-center gap-1.5 rounded-lg bg-gray-50 px-3 py-1.5 dark:bg-gray-800"},fl={class:"text-xs text-gray-400"},yl={key:0,class:"text-gray-300 dark:text-gray-600"},bl=A({__name:"NicknameHistory",props:{sessionId:{}},setup(l){const{t}=J(),a=l,n=S([]),r=S([]),c=S(!1);function d(w){return w.groupNickname||w.accountName||w.platformId}async function v(){if(a.sessionId)try{n.value=await Q().getMembers(a.sessionId)}catch(w){console.error("加载成员列表失败:",w)}}async function m(){if(!a.sessionId||n.value.length===0)return;c.value=!0;const w=[];try{const f=n.value.map(i=>Q().getMemberNameHistory(a.sessionId,i.id)),u=await Promise.all(f);n.value.forEach((i,p)=>{const $=u[p];$.length>2&&w.push({memberId:i.id,name:d(i),history:$})}),r.value=w}catch(f){console.error("加载昵称变更记录失败:",f)}finally{c.value=!1}}return z(()=>a.sessionId,async()=>{await v()},{immediate:!0}),z(()=>n.value.length,()=>{n.value.length>0&&m()}),Ce(async()=>{n.value.length===0&&await v()}),(w,f)=>{const u=je;return o(),I("div",dl,[s("p",ml,g(e(t)("members.nicknameHistory.note")),1),x(e(P),{title:e(t)("members.nicknameHistory.title"),description:c.value?e(t)("members.nicknameHistory.loading"):r.value.length>0?e(t)("members.nicknameHistory.hasChanges",{count:r.value.length}):e(t)("members.nicknameHistory.noChanges")},{default:T(()=>[!c.value&&r.value.length>0?(o(),I("div",vl,[(o(!0),I(q,null,Z(r.value,i=>(o(),I("div",{key:i.memberId,class:"flex items-start gap-3 px-5 py-3"},[s("div",pl,g(i.name),1),s("div",hl,[(o(!0),I(q,null,Z(i.history,(p,$)=>(o(),I(q,{key:$},[s("div",gl,[s("span",{class:K(["text-sm",p.endTs===null?"font-semibold text-pink-600":"text-gray-700 dark:text-gray-300"])},g(p.name),3),p.endTs===null?(o(),C(u,{key:0,color:"primary",variant:"soft",size:"xs"},{default:T(()=>[X(g(e(t)("members.nicknameHistory.current")),1)]),_:1})):N("",!0),s("span",fl,"("+g(e(Zt)(p.startTs,p.endTs))+")",1)]),$<i.history.length-1?(o(),I("span",yl,"→")):N("",!0)],64))),128))])]))),128))])):c.value?(o(),C(e(te),{key:2,text:e(t)("members.nicknameHistory.loadingText")},null,8,["text"])):(o(),C(e(ne),{key:1,text:e(t)("members.nicknameHistory.empty")},null,8,["text"]))]),_:1},8,["title","description"])])}}}),xl={class:"flex h-full flex-col overflow-hidden bg-white dark:bg-page-dark"},kl={class:"flex flex-none items-center justify-between border-b border-gray-200 px-5 py-3 dark:border-gray-700"},wl={class:"text-lg font-semibold text-gray-900 dark:text-white"},_l={class:"flex-1 overflow-auto"},$l=A({__name:"NicknameHistoryEntry",props:{sessionId:{}},setup(l){const{t}=J(),a=l,n=S(!1);return(r,c)=>{const d=he,v=Ie;return o(),I(q,null,[x(d,{variant:"ghost",icon:"i-heroicons-clock",size:"sm",onClick:c[0]||(c[0]=m=>n.value=!0)},{default:T(()=>[X(g(e(t)("analysis.subTabs.member.nicknameHistory")),1)]),_:1}),a.sessionId?(o(),C(v,{key:0,open:n.value,"onUpdate:open":c[2]||(c[2]=m=>n.value=m),ui:{content:"max-w-6xl h-[85vh]"}},{content:T(()=>[s("div",xl,[s("div",kl,[s("h2",wl,g(e(t)("analysis.subTabs.member.nicknameHistory")),1),x(d,{variant:"ghost",icon:"i-heroicons-x-mark",size:"sm",onClick:c[1]||(c[1]=m=>n.value=!1)})]),s("div",_l,[x(bl,{"session-id":a.sessionId},null,8,["session-id"])])])]),_:1},8,["open"])):N("",!0)],64)}}}),Cl={class:"flex h-full flex-col dark:bg-page-dark",style:{"padding-top":"var(--titlebar-area-height)"}},Il={class:"relative flex-1 overflow-y-auto"},Tl={class:"h-full"},Sl={key:2,class:"flex h-full items-center justify-center"},Vl={class:"text-gray-500"},Rl={class:"flex h-full flex-col overflow-hidden bg-white dark:bg-page-dark"},Ml={class:"flex flex-none items-center justify-between border-b border-gray-200 px-5 py-3 dark:border-gray-700"},Ll={class:"text-lg font-semibold text-gray-900 dark:text-white"},Dl={class:"text-sm text-gray-500 dark:text-gray-400"},Nl={class:"flex items-center gap-2"},Al={class:"flex-1 overflow-hidden"},Ul=A({__name:"index",setup(l){const t=_t(()=>$t(()=>import("./MessageExportModal-DAJW2mFj.js"),__vite__mapDeps([0,1,2,3]))),{t:a}=J(),n=kt(),r=wt(),c=ft(),d=Fe(),v=yt(),{currentSessionId:m}=bt(c),w=S(!1),f=S(!1),u=S(!1),i=S(!1),p=S(!1);function $(){d.openChatRecordDrawer({})}const h=[{id:"insights",labelKey:"analysis.tabs.insights",icon:"i-heroicons-presentation-chart-bar"},{id:"ranking",labelKey:"analysis.tabs.ranking",icon:"i-heroicons-trophy"},{id:"ai-chat",labelKey:"analysis.tabs.aiChat",icon:"i-heroicons-chat-bubble-left-ellipsis"},{id:"lab",labelKey:"analysis.tabs.lab",icon:"i-heroicons-beaker"}],b=y(()=>v.debugMode?[...h,{id:"debug",labelKey:"analysis.tabs.debug",icon:"i-heroicons-bug-ant"}]:h),k=y(()=>b.value.map(re=>re.id)),{activeTab:_,isLoading:V,isInitialLoad:O,session:j,memberActivity:B,hourlyActivity:U,dailyActivity:E,messageTypes:se,timeRangeValue:Y,fullTimeRange:ee,availableYears:G,timeFilter:M,initialTimeState:W,loadData:me}=Mt({route:n,router:r,currentSessionId:m,selectSession:c.selectSession,defaultTab:v.defaultSessionTab,validTabIds:k.value}),_e=y(()=>B.value.reduce((re,L)=>re+L.messageCount,0)),Re=y(()=>B.value.filter(re=>re.messageCount>0).length);return(re,L)=>{const ue=he,Me=Ie;return o(),I("div",Cl,[e(O)?(o(),C(te,{key:0,variant:"page",text:e(a)("analysis.groupChat.loading")},null,8,["text"])):e(j)?(o(),I(q,{key:1},[x(Lt,{"active-tab":e(_),"onUpdate:activeTab":L[0]||(L[0]=H=>He(_)?_.value=H:null),"time-range-value":e(Y),"onUpdate:timeRangeValue":L[1]||(L[1]=H=>He(Y)?Y.value=H:null),title:e(j).name,avatar:e(j).groupAvatar,icon:"i-heroicons-chat-bubble-left-right","icon-class":"bg-primary-600 text-white dark:bg-primary-500 dark:text-white",tabs:b.value,"current-session-id":e(m),"initial-time-state":e(W),onOpenIncrementalImport:L[2]||(L[2]=H=>u.value=!0),onOpenMemberManagement:L[3]||(L[3]=H=>p.value=!0),onOpenChatRecord:$,"onUpdate:fullRange":L[4]||(L[4]=H=>ee.value=H),"onUpdate:availableYears":L[5]||(L[5]=H=>G.value=H)},null,8,["active-tab","time-range-value","title","avatar","tabs","current-session-id","initial-time-state"]),s("div",Il,[e(V)?(o(),C(te,{key:0,variant:"overlay"})):N("",!0),s("div",Tl,[x(Te,{name:"tab-slide",mode:"out-in"},{default:T(()=>[e(_)==="insights"?(o(),C(Ro,{key:"insights-"+e(m),"session-id":e(m),session:e(j),"member-activity":e(B),"message-types":e(se),"hourly-activity":e(U),"daily-activity":e(E),"time-range":e(ee),"filtered-message-count":_e.value,"filtered-member-count":Re.value,"time-filter":e(M)},null,8,["session-id","session","member-activity","message-types","hourly-activity","daily-activity","time-range","filtered-message-count","filtered-member-count","time-filter"])):e(_)==="ranking"?(o(),C(cl,{key:"ranking-"+e(m),"session-id":e(m),"time-filter":e(M)},null,8,["session-id","time-filter"])):e(_)==="ai-chat"?(o(),C(e(Ut),{key:"ai-chat-"+e(m),"session-id":e(m),"session-name":e(j).name,"chat-type":"group"},null,8,["session-id","session-name"])):e(_)==="memory"?(o(),C(Ft,{key:"memory-"+e(m),"session-id":e(m),"session-name":e(j).name},null,8,["session-id","session-name"])):e(_)==="lab"?(o(),C(Bt,{key:"lab-"+e(m),"session-id":e(m),"chat-type":"group"},null,8,["session-id"])):e(_)==="debug"?(o(),C(e(qt),{key:"debug-"+e(m),"session-id":e(m)},null,8,["session-id"])):N("",!0)]),_:1})])]),x(Dt,{onOpenIncrementalImport:L[6]||(L[6]=H=>u.value=!0),onOpenSemanticIndex:L[7]||(L[7]=H=>w.value=!0),onOpenMemberManagement:L[8]||(L[8]=H=>p.value=!0),onOpenChatRecord:$,onOpenMessageExport:L[9]||(L[9]=H=>i.value=!0)})],64)):(o(),I("div",Sl,[s("p",Vl,g(e(a)("analysis.groupChat.loadError")),1)])),e(m)&&e(j)?(o(),C(Nt,{key:3,modelValue:w.value,"onUpdate:modelValue":L[10]||(L[10]=H=>w.value=H),"session-id":e(m),"message-count":e(j).messageCount},null,8,["modelValue","session-id","message-count"])):N("",!0),e(m)&&e(j)?(o(),C(xt,{key:4,modelValue:f.value,"onUpdate:modelValue":L[11]||(L[11]=H=>f.value=H),"session-id":e(m),"chat-type":"group","auto-check":""},null,8,["modelValue","session-id"])):N("",!0),e(m)&&e(j)?(o(),C(At,{key:5,modelValue:u.value,"onUpdate:modelValue":L[12]||(L[12]=H=>u.value=H),"session-id":e(m),"session-name":e(j).name,onImported:L[13]||(L[13]=()=>{e(me)(),e(c).loadSessions()})},null,8,["modelValue","session-id","session-name"])):N("",!0),e(m)?(o(),C(e(t),{key:6,modelValue:i.value,"onUpdate:modelValue":L[14]||(L[14]=H=>i.value=H)},null,8,["modelValue"])):N("",!0),e(m)?(o(),C(Me,{key:7,open:p.value,"onUpdate:open":L[16]||(L[16]=H=>p.value=H),ui:{content:"max-w-6xl h-[85vh]"}},{content:T(()=>[s("div",Rl,[s("div",Ml,[s("div",null,[s("h2",Ll,g(e(a)("analysis.tooltip.memberManagement")),1),s("p",Dl,g(e(a)("members.list.description",{count:e(j)?.memberCount??0})),1)]),s("div",Nl,[x($l,{"session-id":e(m)},null,8,["session-id"]),x(ue,{variant:"ghost",icon:"i-heroicons-x-mark",size:"sm",onClick:L[15]||(L[15]=H=>p.value=!1)})])]),s("div",Al,[x(zt,{"session-id":e(m),"show-header":!1,"chat-type":"group",onDataChanged:e(me)},null,8,["session-id","onDataChanged"])])])]),_:1},8,["open"])):N("",!0)])}}}),Xl=Se(Ul,[["__scopeId","data-v-a60937b1"]]);export{Xl as default};
@@ -0,0 +1 @@
1
+ .fade-enter-active[data-v-bde49511],.fade-leave-active[data-v-bde49511]{transition:opacity .15s ease}.fade-enter-from[data-v-bde49511],.fade-leave-to[data-v-bde49511]{opacity:0}.tab-slide-enter-active[data-v-8d40e308],.tab-slide-leave-active[data-v-8d40e308]{transition:opacity .2s ease,transform .2s ease}.tab-slide-enter-from[data-v-8d40e308]{opacity:0;transform:translateY(10px)}.tab-slide-leave-to[data-v-8d40e308]{opacity:0;transform:translateY(-10px)}
@@ -0,0 +1 @@
1
+ import{i as l,a as n,s as u,p as d}from"./index-CW9H_fBd.js";const o=Symbol("PeoplePageHeader");function i(e){const a=u(null),r=n(()=>a.value?.value??e.value);function s(t){a.value=t}return d(o,{setHeader:s}),{header:r}}function P(e){l(o)?.setHeader(e)}export{i as p,P as u};
@@ -1,4 +1,4 @@
1
- import{M as w,f as B,O,ar as A,a0 as k,j as _,G as M,b as U,N as E,I as z,a1 as T,T as b,ak as V,R as Y,w as X,r as P}from"./RelationshipGalaxyCanvas-ByDU6ZS_.js";import{F as q}from"./Filter-Irxx0f6j.js";import"./index-JyB6Cr8r.js";import"./vendor-reka-ui-8_x7iKfi.js";import"./vendor-nuxt-ui-DMdbdSFy.js";import"./vendor-snapdom--nZvo8Sg.js";import"./index-BhewGKey.js";import"./LoadingState.vue_vue_type_script_setup_true_lang-8s6XRB3S.js";import"./people-page-header-DGkK0AMO.js";import"./relationship-galaxy-viewport-Cwfa51ER.js";const v=new w;function G(g,e){e.clear();const t=e.matrix;for(let r=0;r<g.length;r++){const i=g[r];if(i.globalDisplayStatus<7)continue;const s=i.renderGroup??i.parentRenderGroup;s?.isCachedAsTexture?e.matrix=v.copyFrom(s.textureOffsetInverseTransform).append(i.worldTransform):s?._parentCacheAsTextureRenderGroup?e.matrix=v.copyFrom(s._parentCacheAsTextureRenderGroup.inverseWorldTransform).append(i.groupTransform):e.matrix=i.worldTransform,e.addBounds(i.bounds)}return e.matrix=t,e}function y(g){return typeof g.getCanvasFilterString=="function"}class L{constructor(){this.skip=!1,this.useClip=!1,this.filters=null,this.container=null,this.bounds=new k,this.cssFilterString=""}}class R{constructor(e){this._filterStack=[],this._filterStackIndex=0,this._savedStates=[],this._alphaMultiplier=1,this._warnedFilterTypes=new Set,this.renderer=e}push(e){const t=this._pushFilterFrame(),r=e.filterEffect.filters;if(t.skip=!1,t.useClip=!1,t.filters=r,t.container=e.container,t.cssFilterString="",r.every(o=>!o.enabled)){t.skip=!0;return}const i=[],s=1;for(const o of r){if(!o.enabled)continue;if(!y(o)){this._warnUnsupportedFilter(o);continue}const l=o.getCanvasFilterString();if(l===null){this._warnUnsupportedFilter(o);continue}l&&i.push(l)}if(i.length===0&&s===1){t.skip=!0;return}t.cssFilterString=i.join(" "),this._calculateFilterArea(e,t.bounds),t.useClip=!!e.filterEffect.filterArea;const n=this.renderer.canvasContext.activeContext,a=n.filter||"none";if(this._savedStates.push({filter:a,alphaMultiplier:this._alphaMultiplier}),t.useClip&&Number.isFinite(t.bounds.width)&&Number.isFinite(t.bounds.height)&&t.bounds.width>0&&t.bounds.height>0){const o=this.renderer.canvasContext.activeResolution||1;n.save(),n.setTransform(1,0,0,1,0,0),n.beginPath(),n.rect(t.bounds.x*o,t.bounds.y*o,t.bounds.width*o,t.bounds.height*o),n.clip()}else t.useClip=!1;t.cssFilterString&&(n.filter=a!=="none"?`${a} ${t.cssFilterString}`:t.cssFilterString)}pop(){const e=this._popFilterFrame();if(e.skip)return;const t=this._savedStates.pop();if(!t)return;const r=this.renderer.canvasContext.activeContext;e.useClip?r.restore():r.filter=t.filter,this._alphaMultiplier=t.alphaMultiplier}generateFilteredTexture({texture:e,filters:t}){if(!t?.length||t.every(d=>!d.enabled))return e;const r=[],i=1;for(const d of t){if(!d.enabled)continue;if(!y(d)){this._warnUnsupportedFilter(d);continue}const h=d.getCanvasFilterString();if(h===null){this._warnUnsupportedFilter(d);continue}h&&r.push(h)}if(r.length===0&&i===1)return e;const s=B.getCanvasSource(e);if(!s)return e;const n=e.frame,a=e.source._resolution??e.source.resolution??1,o=n.width,l=n.height,f=O.getOptimalCanvasAndContext(o,l,a),{canvas:c,context:u}=f;u.setTransform(1,0,0,1,0,0),u.clearRect(0,0,c.width,c.height),r.length&&(u.filter=r.join(" "));const p=n.x*a,m=n.y*a,x=o*a,F=l*a;return u.drawImage(s,p,m,x,F,0,0,x,F),u.filter="none",u.globalAlpha=1,A(c,o,l,a)}_calculateFilterArea(e,t){if(e.renderables?G(e.renderables,t):e.filterEffect.filterArea?(t.clear(),t.addRect(e.filterEffect.filterArea),t.applyMatrix(e.container.worldTransform)):e.container.getFastGlobalBounds(!0,t),e.container){const i=(e.container.renderGroup||e.container.parentRenderGroup)?.cacheToLocalTransform;i&&t.applyMatrix(i)}}_warnUnsupportedFilter(e){const t=e?.constructor?.name||"Filter";this._warnedFilterTypes.has(t)||(this._warnedFilterTypes.add(t),console.warn(`CanvasRenderer: filter "${t}" is not supported in Canvas2D and will be skipped.`))}get alphaMultiplier(){return this._alphaMultiplier}_pushFilterFrame(){let e=this._filterStack[this._filterStackIndex];return e||(e=this._filterStack[this._filterStackIndex]=new L),this._filterStackIndex++,e}_popFilterFrame(){return this._filterStackIndex<=0?this._filterStack[0]:(this._filterStackIndex--,this._filterStack[this._filterStackIndex])}destroy(){this._filterStack=null,this._savedStates=null,this._warnedFilterTypes=null,this._alphaMultiplier=1}}R.extension={type:[_.CanvasSystem],name:"filter"};var W=`in vec2 aPosition;
1
+ import{M as w,f as B,O,ar as A,a0 as k,j as _,G as M,b as U,N as E,I as z,a1 as T,T as b,ak as V,R as Y,w as X,r as P}from"./RelationshipGalaxyCanvas-mlZs7k4L.js";import{F as q}from"./Filter-BjYScRpK.js";import"./index-CW9H_fBd.js";import"./vendor-snapdom--nZvo8Sg.js";import"./index-2S80bo1s.js";import"./LoadingState.vue_vue_type_script_setup_true_lang-BshQybD_.js";import"./people-page-header-D-LWaEqn.js";import"./relationship-galaxy-viewport-Cwfa51ER.js";const v=new w;function G(g,e){e.clear();const t=e.matrix;for(let r=0;r<g.length;r++){const i=g[r];if(i.globalDisplayStatus<7)continue;const s=i.renderGroup??i.parentRenderGroup;s?.isCachedAsTexture?e.matrix=v.copyFrom(s.textureOffsetInverseTransform).append(i.worldTransform):s?._parentCacheAsTextureRenderGroup?e.matrix=v.copyFrom(s._parentCacheAsTextureRenderGroup.inverseWorldTransform).append(i.groupTransform):e.matrix=i.worldTransform,e.addBounds(i.bounds)}return e.matrix=t,e}function y(g){return typeof g.getCanvasFilterString=="function"}class L{constructor(){this.skip=!1,this.useClip=!1,this.filters=null,this.container=null,this.bounds=new k,this.cssFilterString=""}}class R{constructor(e){this._filterStack=[],this._filterStackIndex=0,this._savedStates=[],this._alphaMultiplier=1,this._warnedFilterTypes=new Set,this.renderer=e}push(e){const t=this._pushFilterFrame(),r=e.filterEffect.filters;if(t.skip=!1,t.useClip=!1,t.filters=r,t.container=e.container,t.cssFilterString="",r.every(o=>!o.enabled)){t.skip=!0;return}const i=[],s=1;for(const o of r){if(!o.enabled)continue;if(!y(o)){this._warnUnsupportedFilter(o);continue}const l=o.getCanvasFilterString();if(l===null){this._warnUnsupportedFilter(o);continue}l&&i.push(l)}if(i.length===0&&s===1){t.skip=!0;return}t.cssFilterString=i.join(" "),this._calculateFilterArea(e,t.bounds),t.useClip=!!e.filterEffect.filterArea;const n=this.renderer.canvasContext.activeContext,a=n.filter||"none";if(this._savedStates.push({filter:a,alphaMultiplier:this._alphaMultiplier}),t.useClip&&Number.isFinite(t.bounds.width)&&Number.isFinite(t.bounds.height)&&t.bounds.width>0&&t.bounds.height>0){const o=this.renderer.canvasContext.activeResolution||1;n.save(),n.setTransform(1,0,0,1,0,0),n.beginPath(),n.rect(t.bounds.x*o,t.bounds.y*o,t.bounds.width*o,t.bounds.height*o),n.clip()}else t.useClip=!1;t.cssFilterString&&(n.filter=a!=="none"?`${a} ${t.cssFilterString}`:t.cssFilterString)}pop(){const e=this._popFilterFrame();if(e.skip)return;const t=this._savedStates.pop();if(!t)return;const r=this.renderer.canvasContext.activeContext;e.useClip?r.restore():r.filter=t.filter,this._alphaMultiplier=t.alphaMultiplier}generateFilteredTexture({texture:e,filters:t}){if(!t?.length||t.every(d=>!d.enabled))return e;const r=[],i=1;for(const d of t){if(!d.enabled)continue;if(!y(d)){this._warnUnsupportedFilter(d);continue}const h=d.getCanvasFilterString();if(h===null){this._warnUnsupportedFilter(d);continue}h&&r.push(h)}if(r.length===0&&i===1)return e;const s=B.getCanvasSource(e);if(!s)return e;const n=e.frame,a=e.source._resolution??e.source.resolution??1,o=n.width,l=n.height,f=O.getOptimalCanvasAndContext(o,l,a),{canvas:c,context:u}=f;u.setTransform(1,0,0,1,0,0),u.clearRect(0,0,c.width,c.height),r.length&&(u.filter=r.join(" "));const p=n.x*a,m=n.y*a,x=o*a,F=l*a;return u.drawImage(s,p,m,x,F,0,0,x,F),u.filter="none",u.globalAlpha=1,A(c,o,l,a)}_calculateFilterArea(e,t){if(e.renderables?G(e.renderables,t):e.filterEffect.filterArea?(t.clear(),t.addRect(e.filterEffect.filterArea),t.applyMatrix(e.container.worldTransform)):e.container.getFastGlobalBounds(!0,t),e.container){const i=(e.container.renderGroup||e.container.parentRenderGroup)?.cacheToLocalTransform;i&&t.applyMatrix(i)}}_warnUnsupportedFilter(e){const t=e?.constructor?.name||"Filter";this._warnedFilterTypes.has(t)||(this._warnedFilterTypes.add(t),console.warn(`CanvasRenderer: filter "${t}" is not supported in Canvas2D and will be skipped.`))}get alphaMultiplier(){return this._alphaMultiplier}_pushFilterFrame(){let e=this._filterStack[this._filterStackIndex];return e||(e=this._filterStack[this._filterStackIndex]=new L),this._filterStackIndex++,e}_popFilterFrame(){return this._filterStackIndex<=0?this._filterStack[0]:(this._filterStackIndex--,this._filterStack[this._filterStackIndex])}destroy(){this._filterStack=null,this._savedStates=null,this._warnedFilterTypes=null,this._alphaMultiplier=1}}R.extension={type:[_.CanvasSystem],name:"filter"};var W=`in vec2 aPosition;
2
2
  out vec2 vTextureCoord;
3
3
 
4
4
  uniform vec4 uInputSize;
@@ -5,11 +5,9 @@
5
5
  <title>ChatLab</title>
6
6
  <!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
7
7
  <link rel="icon" href="/favicon.ico" />
8
- <script type="module" crossorigin src="/assets/index-JyB6Cr8r.js"></script>
9
- <link rel="modulepreload" crossorigin href="/assets/vendor-reka-ui-8_x7iKfi.js">
10
- <link rel="modulepreload" crossorigin href="/assets/vendor-nuxt-ui-DMdbdSFy.js">
8
+ <script type="module" crossorigin src="/assets/index-CW9H_fBd.js"></script>
11
9
  <link rel="modulepreload" crossorigin href="/assets/vendor-snapdom--nZvo8Sg.js">
12
- <link rel="stylesheet" crossorigin href="/assets/index-UJl03IYE.css">
10
+ <link rel="stylesheet" crossorigin href="/assets/index-DrjoMv9s.css">
13
11
  </head>
14
12
 
15
13
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chatlab-cli",
3
- "version": "0.32.0",
3
+ "version": "0.34.0",
4
4
  "description": "ChatLab CLI & Service - Chat history analysis tool",
5
5
  "type": "module",
6
6
  "bin": {
@@ -11,7 +11,7 @@
11
11
  "files": [
12
12
  "bin/",
13
13
  "dist/",
14
- "dist-web/",
14
+ "dist-cli-web/",
15
15
  "LICENSE"
16
16
  ],
17
17
  "engines": {
@@ -36,8 +36,8 @@
36
36
  "scripts": {
37
37
  "cli": "node scripts/ensure-native.mjs && tsx src/cli.ts",
38
38
  "build": "tsup",
39
- "build:full": "pnpm -w run build:web && pnpm run build && pnpm run prepare:web",
40
- "prepare:web": "rm -rf dist-web && cp -r ../../dist-web dist-web",
39
+ "build:full": "pnpm -w run build:cli-web && pnpm run build && pnpm run prepare:cli-web",
40
+ "prepare:cli-web": "rm -rf dist-cli-web && cp -r ../../dist-cli-web dist-cli-web",
41
41
  "ensure-native": "node scripts/ensure-native.mjs",
42
42
  "rebuild-native": "bash scripts/rebuild-native.sh",
43
43
  "rebuild-sqlite": "npm rebuild better-sqlite3",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ai/logger.ts","../src/ai/manager-factory.ts","../src/ai/tool-adapter.ts","../src/ai/llm-config.ts","../src/ai/assistant-loader.ts","../src/ai/agent.ts","../src/ai/agent-stream-runner.ts"],"sourcesContent":["/**\n * Server 端 AI 日志\n *\n * 复用 @openchatlab/node-runtime 的 AiLogger,\n * 在 startHttpServer() 中通过 initServerAiLogger() 初始化。\n */\n\nimport { AiLogger } from '@openchatlab/node-runtime'\n\nlet logger: AiLogger | null = null\n\nexport function initServerAiLogger(logsDir: string): AiLogger {\n if (!logger) {\n logger = new AiLogger(logsDir)\n }\n return logger\n}\n\nexport function getServerAiLogger(): AiLogger | null {\n return logger\n}\n\nexport function closeServerAiLogger(): void {\n if (logger) {\n logger.close()\n logger = null\n }\n}\n","/**\n * Factory functions for creating AssistantManager and SkillManagerCore instances.\n *\n * Server-side equivalent of the Electron adapter in electron/main/ai/assistant/manager.ts.\n * Uses Node.js fs directly (no Electron dependency).\n */\n\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { createHash, randomUUID } from 'crypto'\nimport {\n appLogger,\n AssistantManager,\n DEFAULT_GENERAL_ASSISTANT_RAW_CONFIGS,\n LEGACY_GENERAL_ASSISTANT_DIGESTS,\n SkillManagerCore,\n type AssistantManagerFs,\n type SkillManagerFs,\n} from '@openchatlab/node-runtime'\n\nconst nodeFs: AssistantManagerFs & SkillManagerFs = {\n ensureDir(dir: string) {\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true })\n },\n listFiles(dir: string, ext: string) {\n if (!fs.existsSync(dir)) return []\n return fs.readdirSync(dir).filter((f) => f.endsWith(ext))\n },\n readFile(filePath: string) {\n return fs.readFileSync(filePath, 'utf-8')\n },\n writeFile(filePath: string, content: string) {\n fs.writeFileSync(filePath, content, 'utf-8')\n },\n deleteFile(filePath: string) {\n if (fs.existsSync(filePath)) fs.unlinkSync(filePath)\n },\n fileExists(filePath: string) {\n return fs.existsSync(filePath)\n },\n joinPath(...parts: string[]) {\n return path.join(...parts)\n },\n}\n\nconst managerCache = new Map<string, { assistant: AssistantManager; skill: SkillManagerCore }>()\n\nexport function getAssistantManager(aiDataDir: string): AssistantManager {\n let cached = managerCache.get(aiDataDir)\n if (!cached) {\n cached = {\n assistant: new AssistantManager({\n fs: nodeFs,\n assistantsDir: path.join(aiDataDir, 'assistants'),\n builtinRawConfigs: DEFAULT_GENERAL_ASSISTANT_RAW_CONFIGS,\n contentHash: (content: string) => createHash('sha256').update(content).digest('hex'),\n legacyBuiltinDigests: LEGACY_GENERAL_ASSISTANT_DIGESTS,\n generateId: () => `custom_${randomUUID().replace(/-/g, '').slice(0, 12)}`,\n logger: appLogger,\n }),\n skill: new SkillManagerCore({\n fs: nodeFs,\n skillsDir: path.join(aiDataDir, 'skills'),\n builtinRawSkills: [],\n contentHash: (content: string) => createHash('md5').update(content).digest('hex'),\n }),\n }\n managerCache.set(aiDataDir, cached)\n }\n return cached.assistant\n}\n\nexport function getSkillManagerCore(aiDataDir: string): SkillManagerCore {\n let cached = managerCache.get(aiDataDir)\n if (!cached) {\n getAssistantManager(aiDataDir)\n cached = managerCache.get(aiDataDir)!\n }\n return cached.skill\n}\n","/**\n * 工具适配层\n *\n * 将 @openchatlab/tools 的 ToolDefinition 适配为 @earendil-works/pi-agent-core 的 AgentTool 格式。\n * 消息类工具返回 rawMessages 时自动执行预处理管道(清洗、去噪、脱敏、截断、格式化)。\n */\n\nimport type {\n ToolDefinition,\n ToolExecutionContext,\n SemanticSearchToolService,\n RawMessage,\n ToolTimeRange,\n} from '@openchatlab/tools'\nimport { CoreDataProvider, executeToolForAgent, toAgentToolParameters } from '@openchatlab/tools'\nimport type { DatabaseAdapter } from '@openchatlab/core'\nimport {\n applyPreprocessingPipeline,\n batchSegmentWithFrequency,\n preprocessMessages,\n type AgentTool,\n type PreprocessableMessage,\n type PreprocessConfig,\n type TruncationStrategy,\n createChartSchemaGateState,\n wrapWithChartSchemaGate,\n} from '@openchatlab/node-runtime'\nimport { getServerAiLogger } from './logger'\n\nconst DEFAULT_MAX_TOOL_RESULT_TOKENS = 8000\n\nconst TOOL_TRUNCATION_STRATEGY: Record<string, TruncationStrategy> = {\n search_messages: 'keep_first',\n deep_search_messages: 'keep_first',\n get_recent_messages: 'keep_last',\n get_message_context: 'keep_last',\n get_segment_messages: 'keep_last',\n get_conversation_between: 'keep_last',\n}\n\nexport interface ServerToolContext {\n db: DatabaseAdapter\n sessionId: string\n locale?: string\n /** 语义检索窄接口(仅当前会话可检索时由 runner 注入) */\n semanticIndexService?: SemanticSearchToolService\n /** 预处理配置(脱敏/匿名化/清洗) */\n preprocessConfig?: Record<string, unknown>\n /** 当前用户平台 id(昵称匿名化 owner 识别) */\n ownerPlatformId?: string\n /** 会话时间范围筛选(来自请求参数,供证据类工具继承) */\n timeFilter?: ToolTimeRange\n /** 关键词搜索消息条数上限 */\n maxMessagesLimit?: number\n}\n\nexport interface AdaptToolsOptions {\n maxToolResultTokens?: number\n}\n\nexport function adaptToolsForAgent(\n tools: ToolDefinition[],\n getContext: () => ServerToolContext,\n options?: AdaptToolsOptions\n): AgentTool<any, any>[] {\n const tokenBudget = options?.maxToolResultTokens ?? DEFAULT_MAX_TOOL_RESULT_TOKENS\n const chartSchemaGateState = createChartSchemaGateState()\n\n return tools.map((tool) =>\n wrapWithChartSchemaGate(\n {\n name: tool.name,\n label: tool.name,\n description: tool.description,\n parameters: toAgentToolParameters(tool.inputSchema) as any,\n async execute(_toolCallId: string, params: unknown) {\n const ctx = getContext()\n const execCtx: ToolExecutionContext = {\n db: ctx.db,\n dataProvider: new CoreDataProvider(ctx.db),\n sessionId: ctx.sessionId,\n locale: ctx.locale,\n semanticIndexService: ctx.semanticIndexService,\n preprocessConfig: ctx.preprocessConfig,\n ownerPlatformId: ctx.ownerPlatformId,\n timeFilter: ctx.timeFilter,\n maxMessagesLimit: ctx.maxMessagesLimit,\n maxToolResultTokens: tokenBudget,\n segmentText: (texts, locale, options) => batchSegmentWithFrequency(texts, locale as any, options as any),\n desensitizeMessages: (messages: RawMessage[]): RawMessage[] =>\n preprocessMessages(\n messages as PreprocessableMessage[],\n ctx.preprocessConfig as PreprocessConfig | undefined\n ) as RawMessage[],\n }\n const result = await executeToolForAgent(tool, params, execCtx)\n const details = result.details as Record<string, unknown> | null\n if (!Array.isArray(details?.rawMessages)) return result\n\n const { rawMessages, chart, charts, ...extraDetails } = details\n const preprocessCfg = ctx.preprocessConfig as PreprocessConfig | undefined\n const pipelineResult = applyPreprocessingPipeline({\n rawMessages: rawMessages as PreprocessableMessage[],\n preprocessConfig: preprocessCfg,\n anonymizeNames: preprocessCfg?.anonymizeNames ?? false,\n ownerPlatformId: ctx.ownerPlatformId,\n locale: ctx.locale,\n maxToolResultTokens: tokenBudget,\n truncationStrategy: TOOL_TRUNCATION_STRATEGY[tool.name] ?? 'keep_last',\n extraDetails,\n logger: getServerAiLogger() ?? undefined,\n })\n const chartDetails = { ...(chart ? { chart } : {}), ...(charts ? { charts } : {}) }\n return {\n content: [{ type: 'text', text: pipelineResult.text }],\n details: Object.keys(chartDetails).length > 0 ? chartDetails : null,\n }\n },\n },\n chartSchemaGateState\n )\n )\n}\n","/**\n * 服务端 LLM 配置加载\n *\n * API Key 从 ~/.chatlab/auth-profiles.json 读取,\n * 匹配顺序:config.authProfile 精确匹配 > config.provider 兜底匹配。\n *\n * 模型/Provider 等配置仍从 llm-config.json 读取。\n */\n\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport type { PiModel, PiApi } from '@openchatlab/node-runtime'\nimport { buildPiModel as buildPiModelCore, type PiModelConfig } from '@openchatlab/node-runtime'\nimport { resolveApiKey, writeAuthProfile } from '@openchatlab/config'\nimport { randomUUID } from 'crypto'\n\n// ==================== Types ====================\n\nexport interface AIServiceConfig {\n id: string\n name: string\n provider: string\n apiKey: string\n model?: string\n baseUrl?: string\n maxTokens?: number\n apiFormat?: string\n customModels?: Array<{ id: string; name: string }>\n authProfile?: string\n}\n\ninterface ModelSlot {\n configId: string\n modelId?: string\n}\n\ninterface AIConfigStore {\n configs: AIServiceConfig[]\n defaultAssistant: ModelSlot | null\n fastModel: ModelSlot | null\n}\n\n// ==================== Config Loading ====================\n\nexport function loadLlmConfig(aiDataDir: string): AIConfigStore {\n const configPath = path.join(aiDataDir, 'llm-config.json')\n if (!fs.existsSync(configPath)) {\n return { configs: [], defaultAssistant: null, fastModel: null }\n }\n\n try {\n const data = JSON.parse(fs.readFileSync(configPath, 'utf-8'))\n\n const configs = (data.configs || []).map((c: Record<string, unknown>) => {\n const provider = (c.provider as string) || ''\n const authProfile = c.authProfile as string | undefined\n const profileKey = resolveApiKey(provider, authProfile)\n const rawKey = (c.apiKey as string) || ''\n const fallbackKey = rawKey.startsWith('enc:') ? '' : rawKey\n return {\n ...c,\n apiKey: profileKey || fallbackKey,\n }\n })\n return {\n configs,\n defaultAssistant: data.defaultAssistant ?? null,\n fastModel: data.fastModel ?? null,\n }\n } catch {\n return { configs: [], defaultAssistant: null, fastModel: null }\n }\n}\n\nfunction resolveSlot(slot: ModelSlot | null | undefined, configs: AIServiceConfig[]): ModelSlot | null {\n if (slot && configs.some((c) => c.id === slot.configId)) return slot\n const fallback = configs[0]\n if (!fallback) return null\n return { configId: fallback.id, modelId: fallback.model }\n}\n\nexport function getDefaultAssistantConfig(aiDataDir: string): AIServiceConfig | null {\n const store = loadLlmConfig(aiDataDir)\n const slot = resolveSlot(store.defaultAssistant, store.configs)\n if (!slot) return null\n const config = store.configs.find((c) => c.id === slot.configId)\n if (!config) return null\n return { ...config, model: slot.modelId || config.model }\n}\n\n// ==================== Config Write Operations ====================\n\nconst MAX_CONFIG_COUNT = 99\n\nfunction saveLlmConfig(aiDataDir: string, store: AIConfigStore): void {\n const configPath = path.join(aiDataDir, 'llm-config.json')\n const toSave = {\n ...store,\n configs: store.configs.map((c) => {\n const { apiKey: _k, ...rest } = c\n return rest\n }),\n schemaVersion: 3,\n }\n fs.writeFileSync(configPath, JSON.stringify(toSave, null, 2), 'utf-8')\n}\n\nexport function addLlmConfig(\n aiDataDir: string,\n config: Omit<AIServiceConfig, 'id'>\n): { success: boolean; config?: AIServiceConfig; error?: string } {\n const store = loadLlmConfig(aiDataDir)\n\n if (store.configs.length >= MAX_CONFIG_COUNT) {\n return { success: false, error: `Maximum ${MAX_CONFIG_COUNT} configs reached` }\n }\n\n const newConfig: AIServiceConfig = {\n ...config,\n id: randomUUID(),\n }\n\n const storeForSave = loadRawConfigStore(aiDataDir)\n storeForSave.configs.push({\n ...newConfig,\n apiKey: '',\n })\n\n if (storeForSave.configs.length === 1) {\n storeForSave.defaultAssistant = { configId: newConfig.id, modelId: newConfig.model || '' }\n }\n\n if (config.apiKey) {\n const profileName = config.name?.toLowerCase().replace(/\\s+/g, '-') || config.provider\n writeAuthProfile(profileName, {\n type: 'api_key',\n provider: config.provider,\n key: config.apiKey,\n })\n ;(storeForSave.configs[storeForSave.configs.length - 1] as unknown as Record<string, unknown>).authProfile =\n profileName\n }\n\n saveLlmConfig(aiDataDir, storeForSave)\n return { success: true, config: { ...newConfig, apiKey: '' } }\n}\n\nexport function updateLlmConfig(\n aiDataDir: string,\n id: string,\n updates: Partial<Omit<AIServiceConfig, 'id'>>\n): { success: boolean; error?: string } {\n const storeForSave = loadRawConfigStore(aiDataDir)\n const index = storeForSave.configs.findIndex((c) => c.id === id)\n\n if (index === -1) {\n return { success: false, error: 'Config not found' }\n }\n\n const { apiKey: newApiKey, ...restUpdates } = updates\n const updated = {\n ...storeForSave.configs[index],\n ...restUpdates,\n }\n storeForSave.configs[index] = updated\n\n if (newApiKey) {\n const profileName = updated.name?.toLowerCase().replace(/\\s+/g, '-') || updated.provider\n writeAuthProfile(profileName, {\n type: 'api_key',\n provider: updated.provider,\n key: newApiKey,\n })\n ;(storeForSave.configs[index] as unknown as Record<string, unknown>).authProfile = profileName\n }\n\n saveLlmConfig(aiDataDir, storeForSave)\n return { success: true }\n}\n\nexport function deleteLlmConfig(aiDataDir: string, id: string): { success: boolean; error?: string } {\n const storeForSave = loadRawConfigStore(aiDataDir)\n const index = storeForSave.configs.findIndex((c) => c.id === id)\n\n if (index === -1) {\n return { success: false, error: 'Config not found' }\n }\n\n storeForSave.configs.splice(index, 1)\n\n const fallback = storeForSave.configs[0]\n if (storeForSave.defaultAssistant?.configId === id) {\n storeForSave.defaultAssistant = fallback ? { configId: fallback.id, modelId: fallback.model || '' } : null\n }\n if (storeForSave.fastModel?.configId === id) {\n storeForSave.fastModel = fallback ? { configId: fallback.id, modelId: fallback.model || '' } : null\n }\n\n saveLlmConfig(aiDataDir, storeForSave)\n return { success: true }\n}\n\nexport function setDefaultAssistantSlot(\n aiDataDir: string,\n configId: string,\n modelId: string\n): { success: boolean; error?: string } {\n const storeForSave = loadRawConfigStore(aiDataDir)\n const config = storeForSave.configs.find((c) => c.id === configId)\n\n if (!config) {\n return { success: false, error: 'Config not found' }\n }\n\n storeForSave.defaultAssistant = { configId, modelId }\n saveLlmConfig(aiDataDir, storeForSave)\n return { success: true }\n}\n\nexport function setFastModelSlot(aiDataDir: string, slot: ModelSlot | null): { success: boolean; error?: string } {\n const storeForSave = loadRawConfigStore(aiDataDir)\n\n if (slot !== null) {\n const config = storeForSave.configs.find((c) => c.id === slot.configId)\n if (!config) {\n return { success: false, error: 'Config not found' }\n }\n }\n\n storeForSave.fastModel = slot\n saveLlmConfig(aiDataDir, storeForSave)\n return { success: true }\n}\n\nfunction loadRawConfigStore(aiDataDir: string): AIConfigStore {\n const configPath = path.join(aiDataDir, 'llm-config.json')\n if (!fs.existsSync(configPath)) {\n return { configs: [], defaultAssistant: null, fastModel: null }\n }\n try {\n const data = JSON.parse(fs.readFileSync(configPath, 'utf-8'))\n return {\n configs: data.configs || [],\n defaultAssistant: data.defaultAssistant ?? null,\n fastModel: data.fastModel ?? null,\n }\n } catch {\n return { configs: [], defaultAssistant: null, fastModel: null }\n }\n}\n\n// ==================== PiModel Builder ====================\n\nexport function buildPiModel(config: AIServiceConfig): PiModel<PiApi> {\n return buildPiModelCore(config as PiModelConfig)\n}\n","/**\n * 助手配置加载器\n *\n * 通过共享 AssistantManager 加载配置,确保 standalone CLI 在首次使用时\n * 也会创建默认助手,而不是绕过初始化直接读取磁盘。\n */\n\nimport type { AssistantConfig } from '@openchatlab/node-runtime'\nimport { getAssistantManager } from './manager-factory'\n\nexport function loadAssistantConfig(aiDataDir: string, assistantId: string): AssistantConfig | null {\n return getAssistantManager(aiDataDir).getAssistantConfig(assistantId)\n}\n","/**\n * 服务端 Agent\n *\n * 使用 @openchatlab/node-runtime 的 runAgentCore 编排对话流程,\n * 通过 AgentEventHandler 输出与 Electron 端一致的流式事件。\n */\n\nimport {\n DEFAULT_MAX_TOOL_ROUNDS,\n buildPlanGuidance,\n createAnalysisPlanner,\n createLlmRouteDecider,\n createPlanContentBlock,\n decideRequestRoute,\n runAgentCore,\n checkAndCompress,\n buildSystemPrompt,\n createAiTranslate,\n createCompressionLlmAdapter,\n AgentEventHandler,\n formatAIError,\n shouldUseChartCapabilityForMessage,\n getChartPlannerCapabilityForMessage,\n initTokenizer,\n type AgentStreamChunk,\n type PiMessage,\n type SimpleHistoryMessage,\n type AIChatManager,\n type CompressionConfig,\n type AgentTool,\n type DataSnapshot,\n type OwnerInfo,\n type MentionedMember,\n} from '@openchatlab/node-runtime'\nimport type { ChartAutoMode } from '@openchatlab/shared-types'\n\nimport { getDefaultAssistantConfig, buildPiModel } from './llm-config'\nimport { getServerAiLogger } from './logger'\n\nexport type { AgentStreamChunk }\n\nexport interface RunAgentOptions {\n userMessage: string\n aiChatId: string\n historyLeafMessageId?: string | null\n chatType?: 'group' | 'private'\n locale?: string\n assistantSystemPrompt?: string\n skillMenu?: string | null\n skillDef?: { name: string; prompt: string }\n compressionConfig?: CompressionConfig\n tools?: AgentTool[]\n aiDataDir: string\n aiChatManager: AIChatManager\n onEvent: (event: AgentStreamChunk) => void\n abortSignal?: AbortSignal\n ownerInfo?: OwnerInfo\n mentionedMembers?: MentionedMember[]\n dataSnapshot?: DataSnapshot\n thinkingLevel?: string\n chartAutoMode?: ChartAutoMode\n}\n\nexport async function runServerAgent(options: RunAgentOptions): Promise<void> {\n const {\n userMessage,\n aiChatId,\n historyLeafMessageId,\n chatType = 'group',\n locale = 'zh-CN',\n assistantSystemPrompt,\n skillMenu,\n skillDef,\n compressionConfig,\n tools = [],\n aiDataDir,\n aiChatManager,\n onEvent,\n abortSignal,\n ownerInfo,\n mentionedMembers,\n dataSnapshot,\n thinkingLevel,\n chartAutoMode = 'suggest',\n } = options\n\n const aiLogger = getServerAiLogger()\n\n // 确保 tokenizer rank 表已加载(compression + agent 路径均依赖)\n await initTokenizer()\n\n const llmConfig = getDefaultAssistantConfig(aiDataDir)\n if (!llmConfig) {\n onEvent({ type: 'error', error: { name: 'ConfigError', message: 'LLM service not configured' } })\n onEvent({ type: 'done', isFinished: true })\n return\n }\n\n const piModel = buildPiModel(llmConfig)\n const t = createAiTranslate(locale)\n\n let skillCtx: { skillDef?: { name: string; prompt: string }; skillMenu?: string } | undefined\n if (skillDef) {\n skillCtx = { skillDef }\n } else if (skillMenu) {\n skillCtx = { skillMenu }\n }\n\n const systemPrompt = buildSystemPrompt({\n t,\n chatType,\n assistantSystemPrompt,\n ownerInfo,\n locale,\n skillCtx,\n mentionedMembers,\n dataSnapshot,\n })\n\n const handler = new AgentEventHandler({\n onChunk: onEvent,\n context: {},\n systemPrompt,\n })\n\n if (compressionConfig?.enabled && historyLeafMessageId === undefined) {\n const llmAdapter = createCompressionLlmAdapter({\n piModel,\n apiKey: llmConfig.apiKey,\n onCompressing: () => handler.emitStatus('compressing', []),\n })\n const compressionResult = await checkAndCompress(\n aiChatId,\n compressionConfig,\n systemPrompt,\n llmAdapter,\n aiChatManager,\n aiLogger ?? undefined\n )\n if (compressionResult.compressed) {\n onEvent({\n type: 'compression_done',\n compressionResult: {\n summaryContent: compressionResult.summaryContent ?? '',\n tokensBefore: compressionResult.tokensBefore ?? 0,\n tokensAfter: compressionResult.tokensAfter ?? 0,\n timestamp: Date.now(),\n },\n })\n }\n } else if (compressionConfig?.enabled && historyLeafMessageId !== undefined) {\n aiLogger?.info?.('Compression', 'Skipping compression for edited branch request', {\n aiChatId,\n historyLeafMessageId,\n })\n }\n\n if (abortSignal?.aborted) {\n handler.emitStatus('aborted', [], { force: true })\n onEvent({ type: 'done', isFinished: true, usage: handler.cloneUsage() })\n return\n }\n\n let history: SimpleHistoryMessage[] = []\n try {\n history = aiChatManager.getHistoryForAgent(aiChatId, undefined, historyLeafMessageId)\n } catch {\n // empty history on failure\n }\n\n handler.emitStatus('preparing', [], { pendingUserMessage: userMessage, force: true })\n\n const steerMessage = t('ai.agent.answerWithoutTools')\n let cachedMessages: PiMessage[] = []\n const effectiveTools =\n chartAutoMode === 'explicit' && !shouldUseChartCapabilityForMessage(userMessage)\n ? tools.filter((tool) => tool.name !== 'render_chart')\n : tools\n\n try {\n const routeInput = {\n userMessage,\n chatType,\n locale,\n dataSnapshot,\n availableTools: effectiveTools.map((tool) => tool.name),\n availableCapabilities: [\n getChartPlannerCapabilityForMessage({\n userMessage,\n locale,\n availableTools: effectiveTools.map((tool) => tool.name),\n chartAutoMode,\n }),\n ].filter((capability) => capability !== null),\n skillSummary: skillDef?.name ?? (skillMenu ? 'auto_skill_menu' : undefined),\n }\n const routeStartedAt = Date.now()\n const routeDecision = await decideRequestRoute(routeInput, {\n llmRouter: createLlmRouteDecider({\n piModel,\n apiKey: llmConfig.apiKey,\n abortSignal,\n }),\n })\n aiLogger?.info('Router', 'Shadow route decision', {\n ...routeDecision,\n elapsedMs: Date.now() - routeStartedAt,\n availableToolCount: tools.length,\n shadowOnly: true,\n })\n onEvent({ type: 'route', routeDecision })\n\n let effectiveSystemPrompt = systemPrompt\n if (routeDecision.route === 'planned_execution') {\n const planStartedAt = Date.now()\n const planner = createAnalysisPlanner({\n piModel,\n apiKey: llmConfig.apiKey,\n onPlanDelta: (delta) => onEvent({ type: 'plan_delta', planDelta: delta }),\n onThinkingDelta: (delta) => onEvent({ type: 'think', content: delta, thinkTag: 'thinking' }),\n onThinkingEnd: (durationMs) =>\n onEvent({ type: 'think', content: '', thinkTag: 'thinking', thinkDurationMs: durationMs }),\n onValidationDelta: (delta) => onEvent({ type: 'think', content: delta, thinkTag: 'plan_validation' }),\n onValidationEnd: (durationMs) =>\n onEvent({ type: 'think', content: '', thinkTag: 'plan_validation', thinkDurationMs: durationMs }),\n })\n const plan = await planner(routeInput, abortSignal)\n if (plan) {\n const planBlock = createPlanContentBlock(plan)\n onEvent({ type: 'plan', plan: planBlock })\n effectiveSystemPrompt = `${systemPrompt}\\n\\n${buildPlanGuidance(plan)}`\n aiLogger?.info('Planner', 'Plan generated', {\n title: plan.title,\n steps: plan.steps.length,\n successCriteria: plan.successCriteria.length,\n elapsedMs: Date.now() - planStartedAt,\n })\n } else {\n aiLogger?.warn('Planner', 'Plan generation skipped or failed', {\n elapsedMs: Date.now() - planStartedAt,\n route: routeDecision.route,\n })\n onEvent({ type: 'plan_skipped' })\n }\n }\n\n const result = await runAgentCore({\n piModel,\n apiKey: llmConfig.apiKey,\n systemPrompt: effectiveSystemPrompt,\n tools: effectiveTools,\n history,\n userMessage,\n maxToolRounds: DEFAULT_MAX_TOOL_ROUNDS,\n abortSignal,\n steerMessage,\n thinkingLevel: thinkingLevel as import('@openchatlab/core').ThinkingLevel | undefined,\n onConvertToLlm: (filteredMessages) => {\n cachedMessages = filteredMessages as PiMessage[]\n },\n onEvent: (coreEvent) => handler.handleCoreEvent(coreEvent, cachedMessages),\n onDebugContext: (messages) => {\n try {\n aiChatManager.setPendingDebugContext(aiChatId, JSON.stringify(messages, null, 2))\n } catch {\n // silent\n }\n },\n })\n\n if (result.error) {\n const friendlyMessage = formatAIError(result.error)\n onEvent({ type: 'error', error: { name: 'AgentError', message: friendlyMessage } })\n }\n\n handler.emitStatus('completed', cachedMessages, { force: true })\n onEvent({ type: 'done', isFinished: true, usage: result.usage })\n } catch (error) {\n const friendlyMessage = formatAIError(error)\n aiLogger?.error('ServerAgent', 'Agent execution error', { error: String(error) })\n handler.emitStatus('error', cachedMessages, { force: true })\n onEvent({ type: 'error', error: { name: 'AgentError', message: friendlyMessage } })\n onEvent({ type: 'done', isFinished: true, usage: handler.cloneUsage() })\n }\n}\n","/**\n * CLI Agent stream runner — provides runAgentStream implementation\n * for the shared HTTP route context.\n */\n\nimport type { DatabaseManager, AIChatManager, AgentStreamChunk, SemanticIndexRuntime } from '@openchatlab/node-runtime'\nimport {\n CHART_CAPABILITY_CORE_TOOLS,\n SkillManager,\n buildSkillMenuWithBuiltinChart,\n createActivateSkillTool,\n createDataSnapshotFromOverview,\n getAllowedBuiltinToolsForChartAutoSkill,\n getChartCapabilitySkill,\n getSkillConfigWithBuiltinChart,\n resolveChartRuntimeForRequest,\n} from '@openchatlab/node-runtime'\nimport { getChatOverview, normalizeBuiltinToolNames } from '@openchatlab/core'\nimport type { ChartAutoMode } from '@openchatlab/shared-types'\nimport type { DataSnapshot } from '@openchatlab/node-runtime'\nimport type { AgentStreamRequest } from '@openchatlab/http-routes'\nimport { AGENT_TOOL_REGISTRY, SEMANTIC_SEARCH_TOOL_NAME } from '@openchatlab/tools'\nimport { buildSemanticSearchGuidance } from '@openchatlab/node-runtime'\nimport { adaptToolsForAgent } from './tool-adapter'\nimport { getDefaultAssistantConfig, buildPiModel } from './llm-config'\nimport { loadAssistantConfig } from './assistant-loader'\nimport { runServerAgent } from './agent'\n\nfunction getAiDir(dbManager: DatabaseManager): string {\n const pathProvider = (dbManager as any)['pathProvider']\n if (!pathProvider) {\n throw Object.assign(new Error('PathProvider not available'), { statusCode: 500 })\n }\n return pathProvider.getAiDataDir()\n}\n\nconst RAW_SQL_TOOL_NAMES = new Set(['execute_sql'])\n\nexport function getAvailableToolDefs(isChartCapability: boolean, allowedToolSet: Set<string> | null) {\n if (isChartCapability) {\n const chartCoreTools = new Set<string>(CHART_CAPABILITY_CORE_TOOLS)\n return AGENT_TOOL_REGISTRY.filter(\n (tool) =>\n chartCoreTools.has(tool.name) ||\n (tool.category === 'analysis' && allowedToolSet?.has(tool.name) && !RAW_SQL_TOOL_NAMES.has(tool.name))\n )\n }\n\n return allowedToolSet\n ? AGENT_TOOL_REGISTRY.filter((tool) => tool.category !== 'analysis' || allowedToolSet.has(tool.name))\n : AGENT_TOOL_REGISTRY\n}\n\n// 区分“未配置白名单”和“配置为空白名单”:前者无限制,后者禁用 analysis 工具。\nexport function getAllowedToolSet(\n isChartCapability: boolean,\n allowedBuiltinTools?: readonly string[]\n): Set<string> | null {\n if (isChartCapability) {\n return new Set(normalizeBuiltinToolNames(allowedBuiltinTools ?? []))\n }\n return allowedBuiltinTools === undefined ? null : new Set(normalizeBuiltinToolNames(allowedBuiltinTools))\n}\n\nexport function createCliRunAgentStream(\n dbManager: DatabaseManager,\n aiChatManager: AIChatManager,\n semanticIndexService?: SemanticIndexRuntime\n): (params: AgentStreamRequest, onEvent: (chunk: AgentStreamChunk) => void, abortSignal: AbortSignal) => Promise<void> {\n return async (params, onEvent, abortSignal) => {\n const {\n userMessage,\n aiChatId,\n historyLeafMessageId,\n sessionId,\n chatType,\n locale,\n assistantId,\n skillId,\n enableAutoSkill,\n chartAutoMode,\n compressionConfig,\n ownerInfo,\n mentionedMembers,\n thinkingLevel,\n } = params\n\n const aiDataDir = getAiDir(dbManager)\n\n let assistantSystemPrompt: string | undefined\n let assistantAllowedTools: string[] | undefined\n if (assistantId) {\n const assistantConfig = loadAssistantConfig(aiDataDir, assistantId)\n if (assistantConfig?.systemPrompt) {\n assistantSystemPrompt = assistantConfig.systemPrompt\n }\n assistantAllowedTools = assistantConfig?.allowedBuiltinTools\n }\n\n const llmConfig = getDefaultAssistantConfig(aiDataDir)\n const maxToolResultPercent = compressionConfig?.maxToolResultPercent ?? 50\n const contextWindow = llmConfig ? (buildPiModel(llmConfig).contextWindow ?? 128000) : 128000\n const maxToolResultTokens = Math.floor(contextWindow * (maxToolResultPercent / 100))\n\n const db = (dbManager as any).open?.(sessionId)\n const resolvedChartAutoMode: ChartAutoMode = chartAutoMode ?? 'suggest'\n const chartRuntime = resolveChartRuntimeForRequest({\n skillId,\n userMessage,\n locale,\n assistantAllowedTools,\n enableAutoDetection: enableAutoSkill === true,\n chartAutoMode: resolvedChartAutoMode,\n })\n const isChartCapability = chartRuntime.isChartCapability\n const autoSkillAllowedTools =\n !skillId && enableAutoSkill && resolvedChartAutoMode !== 'explicit'\n ? getAllowedBuiltinToolsForChartAutoSkill(assistantAllowedTools)\n : assistantAllowedTools\n const allowedToolSet = getAllowedToolSet(\n isChartCapability,\n isChartCapability ? chartRuntime.allowedBuiltinTools : autoSkillAllowedTools\n )\n const availableToolDefs = getAvailableToolDefs(isChartCapability, allowedToolSet)\n\n // 语义检索按需暴露:仅当前会话可检索时保留工具,否则从工具集中过滤掉以减少 schema token 与无效调用。\n const canSemanticSearch = !!db && !!semanticIndexService && (await semanticIndexService.canSearch(sessionId))\n const filteredToolDefs = canSemanticSearch\n ? availableToolDefs\n : availableToolDefs.filter((tool) => tool.name !== SEMANTIC_SEARCH_TOOL_NAME)\n\n const agentTools = db\n ? adaptToolsForAgent(\n filteredToolDefs,\n () => ({\n db,\n sessionId,\n locale,\n semanticIndexService,\n preprocessConfig: params.preprocessConfig,\n ownerPlatformId: ownerInfo?.platformId,\n timeFilter: params.timeFilter,\n maxMessagesLimit: params.maxMessagesLimit,\n }),\n { maxToolResultTokens }\n )\n : []\n\n // 工具可用时向 system prompt 加简短引导,提示何时调用语义检索。\n if (canSemanticSearch) {\n assistantSystemPrompt = [assistantSystemPrompt, buildSemanticSearchGuidance(locale)].filter(Boolean).join('\\n\\n')\n }\n\n const skillMgr = new SkillManager(aiDataDir)\n skillMgr.init()\n const toolNames = agentTools.map((t: { name: string }) => t.name)\n\n let resolvedSkillDef: { name: string; prompt: string } | undefined\n let resolvedSkillMenu: string | undefined\n if (isChartCapability) {\n const def = chartRuntime.skillDef ?? getChartCapabilitySkill(locale ?? 'zh-CN')\n resolvedSkillDef = { name: def.name, prompt: def.prompt }\n } else if (skillId) {\n const def = skillMgr.getSkillConfig(skillId)\n if (def) resolvedSkillDef = { name: def.name, prompt: def.prompt }\n } else if (enableAutoSkill) {\n const baseMenu = skillMgr.getSkillMenu(chatType ?? 'group', toolNames)\n const menu =\n resolvedChartAutoMode === 'aggressive' ? buildSkillMenuWithBuiltinChart(baseMenu, locale, toolNames) : baseMenu\n if (menu) resolvedSkillMenu = menu\n }\n\n if (resolvedSkillMenu) {\n const activateSkillTool = createActivateSkillTool({\n chatType: chatType ?? 'group',\n allowedTools: toolNames,\n coreToolNames: new Set<string>(CHART_CAPABILITY_CORE_TOOLS),\n locale,\n getSkillConfig: (id) =>\n resolvedChartAutoMode === 'aggressive'\n ? getSkillConfigWithBuiltinChart(id, locale, (skillConfigId) => skillMgr.getSkillConfig(skillConfigId))\n : skillMgr.getSkillConfig(id),\n })\n agentTools.push(activateSkillTool as any)\n }\n\n const resolvedCompression = compressionConfig?.enabled\n ? {\n enabled: true as const,\n tokenThresholdPercent: compressionConfig.tokenThresholdPercent ?? 75,\n bufferSizePercent: compressionConfig.bufferSizePercent ?? 20,\n maxToolResultPercent: compressionConfig.maxToolResultPercent,\n }\n : undefined\n\n let dataSnapshot: DataSnapshot | undefined\n if (db) {\n try {\n dataSnapshot = createDataSnapshotFromOverview(getChatOverview(db, 10))\n } catch {\n // non-fatal\n }\n }\n\n await runServerAgent({\n userMessage,\n aiChatId,\n historyLeafMessageId,\n chatType,\n locale,\n assistantSystemPrompt,\n skillMenu: resolvedSkillMenu,\n skillDef: resolvedSkillDef,\n compressionConfig: resolvedCompression,\n tools: agentTools,\n aiDataDir,\n aiChatManager,\n onEvent,\n abortSignal,\n ownerInfo,\n mentionedMembers,\n dataSnapshot,\n thinkingLevel,\n chartAutoMode: resolvedChartAutoMode,\n })\n }\n}\n"],"mappings":"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","names":["options","fs","path","buildPiModel","buildPiModel","buildPiModel"]}