chatlab-cli 0.26.3 → 0.27.1

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 (87) hide show
  1. package/README.md +10 -4
  2. package/dist/{chat-command-D37MMEJ7.mjs → chat-command-B7POB3C3.mjs} +6 -5
  3. package/dist/{chat-command-D37MMEJ7.mjs.map → chat-command-B7POB3C3.mjs.map} +1 -1
  4. package/dist/{chunk-K5SGXTVJ.mjs → chunk-3FUF3PEY.mjs} +21 -19
  5. package/dist/{chunk-K5SGXTVJ.mjs.map → chunk-3FUF3PEY.mjs.map} +1 -1
  6. package/dist/{chunk-742TAKEP.mjs → chunk-3JNVGW62.mjs} +2 -2
  7. package/dist/{chunk-VSOWNKPA.mjs → chunk-GFHSSCCR.mjs} +11 -1
  8. package/dist/{chunk-YPTJVTVJ.mjs → chunk-I7BHOZPX.mjs} +13159 -19038
  9. package/dist/chunk-I7BHOZPX.mjs.map +1 -0
  10. package/dist/chunk-N3G43SCQ.mjs +7337 -0
  11. package/dist/chunk-N3G43SCQ.mjs.map +1 -0
  12. package/dist/{chunk-GNGZHBKM.mjs → chunk-RJ4D4QWK.mjs} +42 -7
  13. package/dist/chunk-RJ4D4QWK.mjs.map +1 -0
  14. package/dist/{chunk-VCN64OD6.mjs → chunk-SAE2H2LN.mjs} +7 -5
  15. package/dist/{chunk-VCN64OD6.mjs.map → chunk-SAE2H2LN.mjs.map} +1 -1
  16. package/dist/{chunk-QMXNJRTT.mjs → chunk-SIVERPF5.mjs} +280 -104
  17. package/dist/chunk-SIVERPF5.mjs.map +1 -0
  18. package/dist/{chunk-RMITK4IC.mjs → chunk-WQMKKUSD.mjs} +468 -118
  19. package/dist/chunk-WQMKKUSD.mjs.map +1 -0
  20. package/dist/{chunk-D5MWER7N.mjs → chunk-YUFYTDRH.mjs} +6 -4
  21. package/dist/{chunk-D5MWER7N.mjs.map → chunk-YUFYTDRH.mjs.map} +1 -1
  22. package/dist/cli.mjs +5 -4
  23. package/dist/{http-6F6TYWCI.mjs → http-A54ZBBAY.mjs} +10 -9
  24. package/dist/{import-VYPOMSSA.mjs → import-EA3TB3S2.mjs} +6 -5
  25. package/dist/index.mjs +10 -9
  26. package/dist/{mcp-AR7L5FA3.mjs → mcp-DJDOWHH3.mjs} +11 -9
  27. package/dist/{mcp-AR7L5FA3.mjs.map → mcp-DJDOWHH3.mjs.map} +1 -1
  28. package/dist/onnxruntime_binding-6Q6HXASN.node +0 -0
  29. package/dist/onnxruntime_binding-EKZT2NRK.node +0 -0
  30. package/dist/onnxruntime_binding-P6S7V3CI.node +0 -0
  31. package/dist/onnxruntime_binding-PJNNIIUO.node +0 -0
  32. package/dist/onnxruntime_binding-UN6SPTQK.node +0 -0
  33. package/dist/semantic-index-worker.mjs +34 -0
  34. package/dist/semantic-index-worker.mjs.map +1 -0
  35. package/dist/{service-KZTHBDQ5.mjs → service-KGL3RAIA.mjs} +2 -2
  36. package/dist/{src-6S7JPKHX.mjs → src-EKPMJRG6.mjs} +65 -109
  37. package/dist/{stream-import-KZFC3XT2.mjs → stream-import-FQFNRQ2B.mjs} +5 -4
  38. package/dist/transformers.node-PUMHAODN.mjs +42889 -0
  39. package/dist/transformers.node-PUMHAODN.mjs.map +1 -0
  40. package/dist/{update-checker-3N7HQEP2.mjs → update-checker-LGMTEKMT.mjs} +2 -2
  41. package/dist/worker-runtime-UH2OBO3T.mjs +71 -0
  42. package/dist/worker-runtime-UH2OBO3T.mjs.map +1 -0
  43. package/dist-web/assets/{DebugToolsPanel-DzZmSzIU.css → DebugToolsPanel-DFw6_G5V.css} +1 -1
  44. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-NL1sTF6i.js +110 -0
  45. package/dist-web/assets/{MessageExportModal-CF6yaor7.js → MessageExportModal-B60rvfCh.js} +1 -1
  46. package/dist-web/assets/{electron-DKVw61Ww.js → electron-BRUg9LnY.js} +1 -1
  47. package/dist-web/assets/{fetch-CUw-PUYP.js → fetch-BIpjJHxj.js} +1 -1
  48. package/dist-web/assets/{fetch-BMdgfBVS.js → fetch-BRsMdFcn.js} +1 -1
  49. package/dist-web/assets/{fetch-CPeSfqsU.js → fetch-C-m3IysH.js} +1 -1
  50. package/dist-web/assets/{fetch-CpYSD089.js → fetch-Cma-mZjd.js} +1 -1
  51. package/dist-web/assets/{fetch-D2jNBqs8.js → fetch-DE8gj5Ke.js} +1 -1
  52. package/dist-web/assets/{fetch-DqEMAea3.js → fetch-DLAp7h55.js} +1 -1
  53. package/dist-web/assets/{fetch-BvVfWR-P.js → fetch-DNSaxRnL.js} +1 -1
  54. package/dist-web/assets/{fetch-BC8jyJ_U.js → fetch-DOEbyLSD.js} +1 -1
  55. package/dist-web/assets/{fetch-BQlEQsqi.js → fetch-DSN-QYZE.js} +1 -1
  56. package/dist-web/assets/{fetch-Bh6HC-IR.js → fetch-woAa3H2L.js} +1 -1
  57. package/dist-web/assets/index-B3mDjury.js +11 -0
  58. package/dist-web/assets/{index-Qh0XLt3R.js → index-B9I-Y3fR.js} +1 -1
  59. package/dist-web/assets/{index-DqybGdJH.css → index-BX3tqfLz.css} +1 -1
  60. package/dist-web/assets/index-GAU7LI1r.js +173 -0
  61. package/dist-web/assets/index-I3SWZjnW.css +1 -0
  62. package/dist-web/assets/index-YmzTgkb2.css +1 -0
  63. package/dist-web/assets/index-iwqJDVMJ.js +2 -0
  64. package/dist-web/assets/index-o6veAyTB.js +64 -0
  65. package/dist-web/assets/{index-BHQnAj6l.js → index-r_zHR2t9.js} +1 -1
  66. package/dist-web/assets/{web-Bx2TiHDk.js → web-C2UtGskd.js} +1 -1
  67. package/dist-web/index.html +2 -2
  68. package/package.json +1 -1
  69. package/dist/chunk-GNGZHBKM.mjs.map +0 -1
  70. package/dist/chunk-QMXNJRTT.mjs.map +0 -1
  71. package/dist/chunk-RMITK4IC.mjs.map +0 -1
  72. package/dist/chunk-YPTJVTVJ.mjs.map +0 -1
  73. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-BTdqmm0y.js +0 -107
  74. package/dist-web/assets/index-BwzuCu5R.js +0 -2
  75. package/dist-web/assets/index-CG746E15.js +0 -64
  76. package/dist-web/assets/index-CXoQ_U22.js +0 -173
  77. package/dist-web/assets/index-HgIuP1Td.css +0 -1
  78. package/dist-web/assets/index-R82N2_0b.css +0 -1
  79. package/dist-web/assets/index-wPAmuQZY.js +0 -11
  80. /package/dist/{chunk-742TAKEP.mjs.map → chunk-3JNVGW62.mjs.map} +0 -0
  81. /package/dist/{chunk-VSOWNKPA.mjs.map → chunk-GFHSSCCR.mjs.map} +0 -0
  82. /package/dist/{http-6F6TYWCI.mjs.map → http-A54ZBBAY.mjs.map} +0 -0
  83. /package/dist/{import-VYPOMSSA.mjs.map → import-EA3TB3S2.mjs.map} +0 -0
  84. /package/dist/{service-KZTHBDQ5.mjs.map → service-KGL3RAIA.mjs.map} +0 -0
  85. /package/dist/{src-6S7JPKHX.mjs.map → src-EKPMJRG6.mjs.map} +0 -0
  86. /package/dist/{stream-import-KZFC3XT2.mjs.map → stream-import-FQFNRQ2B.mjs.map} +0 -0
  87. /package/dist/{update-checker-3N7HQEP2.mjs.map → update-checker-LGMTEKMT.mjs.map} +0 -0
@@ -0,0 +1,11 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/fetch-BIpjJHxj.js","assets/vendor-reka-ui-mMvma1EP.js","assets/vendor-nuxt-ui-Zy8txNdC.js","assets/vendor-snapdom-XnBoh1gd.js","assets/fetch-DSN-QYZE.js","assets/fetch-woAa3H2L.js","assets/electron-BRUg9LnY.js","assets/fetch-DLAp7h55.js","assets/fetch-BRsMdFcn.js","assets/fetch-DE8gj5Ke.js","assets/fetch-DNSaxRnL.js","assets/fetch-C-m3IysH.js","assets/fetch-Cma-mZjd.js","assets/fetch-DOEbyLSD.js","assets/web-C2UtGskd.js","assets/index-r_zHR2t9.js","assets/index-GAU7LI1r.js","assets/index-B9I-Y3fR.js","assets/index-BKFGuwJu.css","assets/index-o6veAyTB.js","assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-NL1sTF6i.js","assets/vendor-echarts-wordcloud-B1kQMklB.js","assets/vendor-echarts-CITQeskI.js","assets/vendor-zrender-DFl4U2Oe.js","assets/DebugToolsPanel-DFw6_G5V.css","assets/index-BX3tqfLz.css","assets/index-iwqJDVMJ.js","assets/index-I3SWZjnW.css"])))=>i.map(i=>d[i]);
2
+ import{t as cr,a as dr,c as Ri,b as I,d as tt,n as at,w as Ue,g as ur,o as mr,f as ga,bw as Ei,s as Ct,k as pt,l as ln,m as cn,i as rt,h as X,u as o,bp as Yt,q as Fi,bx as dn,e as un,r as Ni,j as gr,af as pr,p as Re,F as Qt,D as fr,L as f,by as Ui,Z as Pe,G as v,P as k,U as ne,a5 as r,H as Te,K as te,Q as $e,T as l,a3 as Be,R as Y,a0 as hs,O as Oi,bz as $s,au as Vi,J as Hi,W as Nn,a9 as Ps,bA as zi,bB as Bi,bC as Wi,bD as mn,bE as hr,bF as ji,I as qi,bG as Ki}from"./vendor-reka-ui-mMvma1EP.js";import{_ as Vs,a as We,b as Ke,c as vr,u as pa,d as Hs,e as ut,f as Gi,g as mt,h as _s,i as Xi,j as zs,k as yr,l as xs,m as gn,n as fa,o as br,p as Yi,q as Qi,r as Ji,s as Zi,t as el,v as tl,w as sl,x as al,y as nl,z as ol,A as rl,B as il}from"./vendor-nuxt-ui-Zy8txNdC.js";import{_ as je,c as ll}from"./vendor-snapdom-XnBoh1gd.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))n(a);new MutationObserver(a=>{for(const i of a)if(i.type==="childList")for(const c of i.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&n(c)}).observe(document,{childList:!0,subtree:!0});function s(a){const i={};return a.integrity&&(i.integrity=a.integrity),a.referrerPolicy&&(i.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?i.credentials="include":a.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function n(a){if(a.ep)return;a.ep=!0;const i=s(a);fetch(a.href,i)}})();function _r(e){return ur()?(mr(e),!0):!1}const Ca=new WeakMap,cl=(...e)=>{var t;const s=e[0],n=(t=ga())==null?void 0:t.proxy;if(n==null&&!ln())throw new Error("injectLocal must be called in setup");return n&&Ca.has(n)&&s in Ca.get(n)?Ca.get(n)[s]:cn(...e)},pn=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const dl=Object.prototype.toString,ul=e=>dl.call(e)==="[object Object]",Ha=()=>{};function xr(...e){if(e.length!==1)return cr(...e);const t=e[0];return typeof t=="function"?dr(Ri(()=>({get:t,set:Ha}))):I(t)}function kr(e,t){function s(...n){return new Promise((a,i)=>{Promise.resolve(e(()=>t.apply(this,n),{fn:t,thisArg:this,args:n})).then(a).catch(i)})}return s}const wr=e=>e();function ml(e,t={}){let s,n,a=Ha;const i=m=>{clearTimeout(m),a(),a=Ha};let c;return m=>{const u=pt(e),y=pt(t.maxWait);return s&&i(s),u<=0||y!==void 0&&y<=0?(n&&(i(n),n=void 0),Promise.resolve(m())):new Promise((g,_)=>{a=t.rejectOnCancel?_:g,c=m,y&&!n&&(n=setTimeout(()=>{s&&i(s),n=void 0,g(c())},y)),s=setTimeout(()=>{n&&i(n),n=void 0,g(m())},u)})}}function gl(e=wr,t={}){const{initialState:s="active"}=t,n=xr(s==="active");function a(){n.value=!1}function i(){n.value=!0}const c=(...d)=>{n.value&&e(...d)};return{isActive:dr(n),pause:a,resume:i,eventFilter:c}}function pl(e){let t;function s(){return t||(t=e()),t}return s.reset=async()=>{const n=t;t=void 0,n&&await n},s}function Un(e){return e.endsWith("rem")?Number.parseFloat(e)*16:Number.parseFloat(e)}function Ia(e){return Array.isArray(e)?e:[e]}function fl(e){return ga()}function hl(e,t=200,s={}){return kr(ml(t,s),e)}function vl(e,t,s={}){const{eventFilter:n=wr,...a}=s;return Ue(e,kr(n,t),a)}function yl(e,t,s={}){const{eventFilter:n,initialState:a="active",...i}=s,{eventFilter:c,pause:d,resume:m,isActive:u}=gl(n,{initialState:a});return{stop:vl(e,t,{...i,eventFilter:c}),pause:d,resume:m,isActive:u}}function Sr(e,t=!0,s){fl()?tt(e,s):t?e():at(e)}function bl(e,t,s={}){const{immediate:n=!0,immediateCallback:a=!1}=s,i=Ct(!1);let c;function d(){c&&(clearTimeout(c),c=void 0)}function m(){i.value=!1,d()}function u(...y){a&&e(),d(),i.value=!0,c=setTimeout(()=>{i.value=!1,c=void 0,e(...y)},pt(t))}return n&&(i.value=!0,pn&&u()),_r(m),{isPending:Ei(i),start:u,stop:m}}function gE(e=!1,t={}){const{truthyValue:s=!0,falsyValue:n=!1}=t,a=rt(e),i=Ct(e);function c(d){if(arguments.length)return i.value=d,i.value;{const m=pt(s);return i.value=i.value===m?pt(n):m,i.value}}return a?c:[i,c]}function _l(e,t,s){return Ue(e,t,{...s,immediate:!0})}const Ds=pn?window:void 0,Cr=pn?window.navigator:void 0;function Ir(e){var t;const s=pt(e);return(t=s?.$el)!=null?t:s}function Ls(...e){const t=[],s=()=>{t.forEach(d=>d()),t.length=0},n=(d,m,u,y)=>(d.addEventListener(m,u,y),()=>d.removeEventListener(m,u,y)),a=X(()=>{const d=Ia(pt(e[0])).filter(m=>m!=null);return d.every(m=>typeof m!="string")?d:void 0}),i=_l(()=>{var d,m;return[(m=(d=a.value)==null?void 0:d.map(u=>Ir(u)))!=null?m:[Ds].filter(u=>u!=null),Ia(pt(a.value?e[1]:e[0])),Ia(o(a.value?e[2]:e[1])),pt(a.value?e[3]:e[2])]},([d,m,u,y])=>{if(s(),!d?.length||!m?.length||!u?.length)return;const g=ul(y)?{...y}:y;t.push(...d.flatMap(_=>m.flatMap(x=>u.map(w=>n(_,x,w,g)))))},{flush:"post"}),c=()=>{i(),s()};return _r(s),c}function xl(){const e=Ct(!1),t=ga();return t&&tt(()=>{e.value=!0},t),e}function fn(e){const t=xl();return X(()=>(t.value,!!e()))}const kl=Symbol("vueuse-ssr-width");function wl(){const e=ln()?cl(kl,null):null;return typeof e=="number"?e:void 0}function Sl(e,t={}){const{window:s=Ds,ssrWidth:n=wl()}=t,a=fn(()=>s&&"matchMedia"in s&&typeof s.matchMedia=="function"),i=Ct(typeof n=="number"),c=Ct(),d=Ct(!1),m=u=>{d.value=u.matches};return Fi(()=>{if(i.value){i.value=!a.value;const u=pt(e).split(",");d.value=u.some(y=>{const g=y.includes("not all"),_=y.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),x=y.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/);let w=!!(_||x);return _&&w&&(w=n>=Un(_[1])),x&&w&&(w=n<=Un(x[1])),g?!w:w});return}a.value&&(c.value=s.matchMedia(pt(e)),d.value=c.value.matches)}),Ls(c,"change",m,{passive:!0}),X(()=>d.value)}function On(e,t={}){const{controls:s=!1,navigator:n=Cr}=t,a=fn(()=>n&&"permissions"in n),i=Ct(),c=typeof e=="string"?{name:e}:e,d=Ct(),m=()=>{var y,g;d.value=(g=(y=i.value)==null?void 0:y.state)!=null?g:"prompt"};Ls(i,"change",m,{passive:!0});const u=pl(async()=>{if(a.value){if(!i.value)try{i.value=await n.permissions.query(c)}catch{i.value=void 0}finally{m()}if(s)return Yt(i.value)}});return u(),s?{state:d,isSupported:a,query:u}:d}function Cl(e={}){const{navigator:t=Cr,read:s=!1,source:n,copiedDuring:a=1500,legacy:i=!1}=e,c=fn(()=>t&&"clipboard"in t),d=On("clipboard-read"),m=On("clipboard-write"),u=X(()=>c.value||i),y=Ct(""),g=Ct(!1),_=bl(()=>g.value=!1,a,{immediate:!1});async function x(){let p=!(c.value&&h(d.value));if(!p)try{y.value=await t.clipboard.readText()}catch{p=!0}p&&(y.value=P())}u.value&&s&&Ls(["copy","cut"],x,{passive:!0});async function w(p=pt(n)){if(u.value&&p!=null){let C=!(c.value&&h(m.value));if(!C)try{await t.clipboard.writeText(p)}catch{C=!0}C&&$(p),y.value=p,g.value=!0,_.start()}}function $(p){const C=document.createElement("textarea");C.value=p??"",C.style.position="absolute",C.style.opacity="0",document.body.appendChild(C),C.select(),document.execCommand("copy"),C.remove()}function P(){var p,C,S;return(S=(C=(p=document?.getSelection)==null?void 0:p.call(document))==null?void 0:C.toString())!=null?S:""}function h(p){return p==="granted"||p==="prompt"}return{isSupported:u,text:y,copied:g,copy:w}}const Gs=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Xs="__vueuse_ssr_handlers__",Il=Ml();function Ml(){return Xs in Gs||(Gs[Xs]=Gs[Xs]||{}),Gs[Xs]}function Mr(e,t){return Il[e]||t}function Tl(e){return Sl("(prefers-color-scheme: dark)",e)}function Al(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const $l={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Vn="vueuse-storage";function Pl(e,t,s,n={}){var a;const{flush:i="pre",deep:c=!0,listenToStorageChanges:d=!0,writeDefaults:m=!0,mergeDefaults:u=!1,shallow:y,window:g=Ds,eventFilter:_,onError:x=A=>{console.error(A)},initOnMounted:w}=n,$=(y?Ct:I)(typeof t=="function"?t():t),P=X(()=>pt(e));if(!s)try{s=Mr("getDefaultStorage",()=>{var A;return(A=Ds)==null?void 0:A.localStorage})()}catch(A){x(A)}if(!s)return $;const h=pt(t),p=Al(h),C=(a=n.serializer)!=null?a:$l[p],{pause:S,resume:z}=yl($,A=>re(A),{flush:i,deep:c,eventFilter:_});Ue(P,()=>de(),{flush:i});let M=!1;const D=A=>{w&&!M||de(A)},E=A=>{w&&!M||L(A)};g&&d&&(s instanceof Storage?Ls(g,"storage",D,{passive:!0}):Ls(g,Vn,E)),w?Sr(()=>{M=!0,de()}):de();function F(A,G){if(g){const J={key:P.value,oldValue:A,newValue:G,storageArea:s};g.dispatchEvent(s instanceof Storage?new StorageEvent("storage",J):new CustomEvent(Vn,{detail:J}))}}function re(A){try{const G=s.getItem(P.value);if(A==null)F(G,null),s.removeItem(P.value);else{const J=C.write(A);G!==J&&(s.setItem(P.value,J),F(G,J))}}catch(G){x(G)}}function ve(A){const G=A?A.newValue:s.getItem(P.value);if(G==null)return m&&h!=null&&s.setItem(P.value,C.write(h)),h;if(!A&&u){const J=C.read(G);return typeof u=="function"?u(J,h):p==="object"&&!Array.isArray(J)?{...h,...J}:J}else return typeof G!="string"?G:C.read(G)}function de(A){if(!(A&&A.storageArea!==s)){if(A&&A.key==null){$.value=h;return}if(!(A&&A.key!==P.value)){S();try{const G=C.write($.value);(A===void 0||A?.newValue!==G)&&($.value=ve(A))}catch(G){x(G)}finally{A?at(z):z()}}}}function L(A){de(A.detail)}return $}const Dl="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function hn(e={}){const{selector:t="html",attribute:s="class",initialValue:n="auto",window:a=Ds,storage:i,storageKey:c="vueuse-color-scheme",listenToStorageChanges:d=!0,storageRef:m,emitAuto:u,disableTransition:y=!0}=e,g={auto:"",light:"light",dark:"dark",...e.modes||{}},_=Tl({window:a}),x=X(()=>_.value?"dark":"light"),w=m||(c==null?xr(n):Pl(c,n,i,{window:a,listenToStorageChanges:d})),$=X(()=>w.value==="auto"?x.value:w.value),P=Mr("updateHTMLAttrs",(S,z,M)=>{const D=typeof S=="string"?a?.document.querySelector(S):Ir(S);if(!D)return;const E=new Set,F=new Set;let re=null;if(z==="class"){const de=M.split(/\s/g);Object.values(g).flatMap(L=>(L||"").split(/\s/g)).filter(Boolean).forEach(L=>{de.includes(L)?E.add(L):F.add(L)})}else re={key:z,value:M};if(E.size===0&&F.size===0&&re===null)return;let ve;y&&(ve=a.document.createElement("style"),ve.appendChild(document.createTextNode(Dl)),a.document.head.appendChild(ve));for(const de of E)D.classList.add(de);for(const de of F)D.classList.remove(de);re&&D.setAttribute(re.key,re.value),y&&(a.getComputedStyle(ve).opacity,document.head.removeChild(ve))});function h(S){var z;P(t,s,(z=g[S])!=null?z:S)}function p(S){e.onChanged?e.onChanged(S,h):h(S)}Ue($,p,{flush:"post",immediate:!0}),Sr(()=>p($.value));const C=X({get(){return u?w.value:$.value},set(S){w.value=S}});return Object.assign(C,{store:w,system:x,state:$})}function pE(e={}){const{valueDark:t="dark",valueLight:s=""}=e,n=hn({...e,onChanged:(c,d)=>{var m;e.onChanged?(m=e.onChanged)==null||m.call(e,c==="dark",d,c):d(c)},modes:{dark:t,light:s}}),a=X(()=>n.system.value);return X({get(){return n.value==="dark"},set(c){const d=c?"dark":"light";a.value===d?n.value="auto":n.value=d}})}let Tr;const ha=e=>Tr=e,Ar=Symbol();function za(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var Ts;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(Ts||(Ts={}));function Ll(){const e=un(!0),t=e.run(()=>I({}));let s=[],n=[];const a=pr({install(i){ha(a),a._a=i,i.provide(Ar,a),i.config.globalProperties.$pinia=a,n.forEach(c=>s.push(c)),n=[]},use(i){return this._a?s.push(i):n.push(i),this},_p:s,_a:null,_e:e,_s:new Map,state:t});return a}const $r=()=>{};function Hn(e,t,s,n=$r){e.add(t);const a=()=>{e.delete(t)&&n()};return!s&&ur()&&mr(a),a}function ls(e,...t){e.forEach(s=>{s(...t)})}const Rl=e=>e(),zn=Symbol(),Ma=Symbol();function Ba(e,t){e instanceof Map&&t instanceof Map?t.forEach((s,n)=>e.set(n,s)):e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const s in t){if(!t.hasOwnProperty(s))continue;const n=t[s],a=e[s];za(a)&&za(n)&&e.hasOwnProperty(s)&&!rt(n)&&!dn(n)?e[s]=Ba(a,n):e[s]=n}return e}const El=Symbol();function Fl(e){return!za(e)||!Object.prototype.hasOwnProperty.call(e,El)}const{assign:Gt}=Object;function Nl(e){return!!(rt(e)&&e.effect)}function Ul(e,t,s,n){const{state:a,actions:i,getters:c}=t,d=s.state.value[e];let m;function u(){d||(s.state.value[e]=a?a():{});const y=gr(s.state.value[e]);return Gt(y,i,Object.keys(c||{}).reduce((g,_)=>(g[_]=pr(X(()=>{ha(s);const x=s._s.get(e);return c[_].call(x,x)})),g),{}))}return m=Pr(e,u,t,s,n,!0),m}function Pr(e,t,s={},n,a,i){let c;const d=Gt({actions:{}},s),m={deep:!0};let u,y,g=new Set,_=new Set,x;const w=n.state.value[e];!i&&!w&&(n.state.value[e]={});let $;function P(E){let F;u=y=!1,typeof E=="function"?(E(n.state.value[e]),F={type:Ts.patchFunction,storeId:e,events:x}):(Ba(n.state.value[e],E),F={type:Ts.patchObject,payload:E,storeId:e,events:x});const re=$=Symbol();at().then(()=>{$===re&&(u=!0)}),y=!0,ls(g,F,n.state.value[e])}const h=i?function(){const{state:F}=s,re=F?F():{};this.$patch(ve=>{Gt(ve,re)})}:$r;function p(){c.stop(),g.clear(),_.clear(),n._s.delete(e)}const C=(E,F="")=>{if(zn in E)return E[Ma]=F,E;const re=function(){ha(n);const ve=Array.from(arguments),de=new Set,L=new Set;function A(ue){de.add(ue)}function G(ue){L.add(ue)}ls(_,{args:ve,name:re[Ma],store:z,after:A,onError:G});let J;try{J=E.apply(this&&this.$id===e?this:z,ve)}catch(ue){throw ls(L,ue),ue}return J instanceof Promise?J.then(ue=>(ls(de,ue),ue)).catch(ue=>(ls(L,ue),Promise.reject(ue))):(ls(de,J),J)};return re[zn]=!0,re[Ma]=F,re},S={_p:n,$id:e,$onAction:Hn.bind(null,_),$patch:P,$reset:h,$subscribe(E,F={}){const re=Hn(g,E,F.detached,()=>ve()),ve=c.run(()=>Ue(()=>n.state.value[e],de=>{(F.flush==="sync"?y:u)&&E({storeId:e,type:Ts.direct,events:x},de)},Gt({},m,F)));return re},$dispose:p},z=Ni(S);n._s.set(e,z);const D=(n._a&&n._a.runWithContext||Rl)(()=>n._e.run(()=>(c=un()).run(()=>t({action:C}))));for(const E in D){const F=D[E];if(rt(F)&&!Nl(F)||dn(F))i||(w&&Fl(F)&&(rt(F)?F.value=w[E]:Ba(F,w[E])),n.state.value[e][E]=F);else if(typeof F=="function"){const re=C(F,E);D[E]=re,d.actions[E]=F}}return Gt(z,D),Gt(Yt(z),D),Object.defineProperty(z,"$state",{get:()=>n.state.value[e],set:E=>{P(F=>{Gt(F,E)})}}),n._p.forEach(E=>{Gt(z,c.run(()=>E({store:z,app:n._a,pinia:n,options:d})))}),w&&i&&s.hydrate&&s.hydrate(z.$state,w),u=!0,y=!0,z}function Nt(e,t,s){let n;const a=typeof t=="function";n=a?s:t;function i(c,d){const m=ln();return c=c||(m?cn(Ar,null):null),c&&ha(c),c=Tr,c._s.has(e)||(a?Pr(e,t,n,c):Ul(e,n,c)),c._s.get(e)}return i.$id=e,i}function et(e){const t=Yt(e),s={};for(const n in t){const a=t[n];a.effect?s[n]=X({get:()=>e[n],set(i){e[n]=i}}):(rt(a)||dn(a))&&(s[n]=cr(e,n))}return s}function Ol(e,t){typeof console<"u"&&(console.warn("[intlify] "+e),t&&console.warn(t.stack))}const ua=typeof window<"u",Jt=(e,t=!1)=>t?Symbol.for(e):Symbol(e),Vl=(e,t,s)=>Hl({l:e,k:t,s}),Hl=e=>JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029").replace(/\u0027/g,"\\u0027"),Ze=e=>typeof e=="number"&&isFinite(e),zl=e=>vn(e)==="[object Date]",vs=e=>vn(e)==="[object RegExp]",va=e=>Ne(e)&&Object.keys(e).length===0,nt=Object.assign,Bl=Object.create,qe=(e=null)=>Bl(e);let Bn;const os=()=>Bn||(Bn=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:qe());function Wn(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/\//g,"&#x2F;").replace(/=/g,"&#x3D;")}function jn(e){return e.replace(/&(?![a-zA-Z0-9#]{2,6};)/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Wl(e){return e=e.replace(/(\w+)\s*=\s*"([^"]*)"/g,(n,a,i)=>`${a}="${jn(i)}"`),e=e.replace(/(\w+)\s*=\s*'([^']*)'/g,(n,a,i)=>`${a}='${jn(i)}'`),/\s*on\w+\s*=\s*["']?[^"'>]+["']?/gi.test(e)&&(e=e.replace(/(\s+)(on)(\w+\s*=)/gi,"$1&#111;n$3")),[/(\s+(?:href|src|action|formaction)\s*=\s*["']?)\s*javascript:/gi,/(style\s*=\s*["'][^"']*url\s*\(\s*)javascript:/gi].forEach(n=>{e=e.replace(n,"$1javascript&#58;")}),e}const jl=Object.prototype.hasOwnProperty;function At(e,t){return jl.call(e,t)}const Ye=Array.isArray,Ge=e=>typeof e=="function",Me=e=>typeof e=="string",Ve=e=>typeof e=="boolean",He=e=>e!==null&&typeof e=="object",ql=e=>He(e)&&Ge(e.then)&&Ge(e.catch),Dr=Object.prototype.toString,vn=e=>Dr.call(e),Ne=e=>vn(e)==="[object Object]",Kl=e=>e==null?"":Ye(e)||Ne(e)&&e.toString===Dr?JSON.stringify(e,null,2):String(e);function yn(e,t=""){return e.reduce((s,n,a)=>a===0?s+n:s+t+n,"")}const Ys=e=>!He(e)||Ye(e);function sa(e,t){if(Ys(e)||Ys(t))throw new Error("Invalid value");const s=[{src:e,des:t}];for(;s.length;){const{src:n,des:a}=s.pop();Object.keys(n).forEach(i=>{i!=="__proto__"&&(He(n[i])&&!He(a[i])&&(a[i]=Array.isArray(n[i])?[]:qe()),Ys(a[i])||Ys(n[i])?a[i]=n[i]:s.push({src:n[i],des:a[i]}))})}}function Gl(e,t,s){return{line:e,column:t,offset:s}}function Wa(e,t,s){return{start:e,end:t}}const ze={EXPECTED_TOKEN:1,INVALID_TOKEN_IN_PLACEHOLDER:2,UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER:3,UNKNOWN_ESCAPE_SEQUENCE:4,INVALID_UNICODE_ESCAPE_SEQUENCE:5,UNBALANCED_CLOSING_BRACE:6,UNTERMINATED_CLOSING_BRACE:7,EMPTY_PLACEHOLDER:8,NOT_ALLOW_NEST_PLACEHOLDER:9,INVALID_LINKED_FORMAT:10,MUST_HAVE_MESSAGES_IN_PLURAL:11,UNEXPECTED_EMPTY_LINKED_MODIFIER:12,UNEXPECTED_EMPTY_LINKED_KEY:13,UNEXPECTED_LEXICAL_ANALYSIS:14},Xl=17;function ya(e,t,s={}){const{domain:n,messages:a,args:i}=s,c=e,d=new SyntaxError(String(c));return d.code=e,t&&(d.location=t),d.domain=n,d}function Yl(e){throw e}const Dt=" ",Ql="\r",ct=`
3
+ `,Jl="\u2028",Zl="\u2029";function ec(e){const t=e;let s=0,n=1,a=1,i=0;const c=D=>t[D]===Ql&&t[D+1]===ct,d=D=>t[D]===ct,m=D=>t[D]===Zl,u=D=>t[D]===Jl,y=D=>c(D)||d(D)||m(D)||u(D),g=()=>s,_=()=>n,x=()=>a,w=()=>i,$=D=>c(D)||m(D)||u(D)?ct:t[D],P=()=>$(s),h=()=>$(s+i);function p(){return i=0,y(s)&&(n++,a=0),c(s)&&s++,s++,a++,t[s]}function C(){return c(s+i)&&i++,i++,t[s+i]}function S(){s=0,n=1,a=1,i=0}function z(D=0){i=D}function M(){const D=s+i;for(;D!==s;)p();i=0}return{index:g,line:_,column:x,peekOffset:w,charAt:$,currentChar:P,currentPeek:h,next:p,peek:C,reset:S,resetPeek:z,skipToPeek:M}}const Ut=void 0,tc=".",qn="'",sc="tokenizer";function ac(e,t={}){const s=t.location!==!1,n=ec(e),a=()=>n.index(),i=()=>Gl(n.line(),n.column(),n.index()),c=i(),d=a(),m={currentType:13,offset:d,startLoc:c,endLoc:c,lastType:13,lastOffset:d,lastStartLoc:c,lastEndLoc:c,braceNest:0,inLinked:!1,text:""},u=()=>m,{onError:y}=t;function g(b,O,Q,...ie){const ye=u();if(O.column+=Q,O.offset+=Q,y){const j=s?Wa(ye.startLoc,O):null,q=ya(b,j,{domain:sc,args:ie});y(q)}}function _(b,O,Q){b.endLoc=i(),b.currentType=O;const ie={type:O};return s&&(ie.loc=Wa(b.startLoc,b.endLoc)),Q!=null&&(ie.value=Q),ie}const x=b=>_(b,13);function w(b,O){return b.currentChar()===O?(b.next(),O):(g(ze.EXPECTED_TOKEN,i(),0,O),"")}function $(b){let O="";for(;b.currentPeek()===Dt||b.currentPeek()===ct;)O+=b.currentPeek(),b.peek();return O}function P(b){const O=$(b);return b.skipToPeek(),O}function h(b){if(b===Ut)return!1;const O=b.charCodeAt(0);return O>=97&&O<=122||O>=65&&O<=90||O===95}function p(b){if(b===Ut)return!1;const O=b.charCodeAt(0);return O>=48&&O<=57}function C(b,O){const{currentType:Q}=O;if(Q!==2)return!1;$(b);const ie=h(b.currentPeek());return b.resetPeek(),ie}function S(b,O){const{currentType:Q}=O;if(Q!==2)return!1;$(b);const ie=b.currentPeek()==="-"?b.peek():b.currentPeek(),ye=p(ie);return b.resetPeek(),ye}function z(b,O){const{currentType:Q}=O;if(Q!==2)return!1;$(b);const ie=b.currentPeek()===qn;return b.resetPeek(),ie}function M(b,O){const{currentType:Q}=O;if(Q!==7)return!1;$(b);const ie=b.currentPeek()===".";return b.resetPeek(),ie}function D(b,O){const{currentType:Q}=O;if(Q!==8)return!1;$(b);const ie=h(b.currentPeek());return b.resetPeek(),ie}function E(b,O){const{currentType:Q}=O;if(!(Q===7||Q===11))return!1;$(b);const ie=b.currentPeek()===":";return b.resetPeek(),ie}function F(b,O){const{currentType:Q}=O;if(Q!==9)return!1;const ie=()=>{const j=b.currentPeek();return j==="{"?h(b.peek()):j==="@"||j==="|"||j===":"||j==="."||j===Dt||!j?!1:j===ct?(b.peek(),ie()):ve(b,!1)},ye=ie();return b.resetPeek(),ye}function re(b){$(b);const O=b.currentPeek()==="|";return b.resetPeek(),O}function ve(b,O=!0){const Q=(ye=!1,j="")=>{const q=b.currentPeek();return q==="{"||q==="@"||!q?ye:q==="|"?!(j===Dt||j===ct):q===Dt?(b.peek(),Q(!0,Dt)):q===ct?(b.peek(),Q(!0,ct)):!0},ie=Q();return O&&b.resetPeek(),ie}function de(b,O){const Q=b.currentChar();return Q===Ut?Ut:O(Q)?(b.next(),Q):null}function L(b){const O=b.charCodeAt(0);return O>=97&&O<=122||O>=65&&O<=90||O>=48&&O<=57||O===95||O===36}function A(b){return de(b,L)}function G(b){const O=b.charCodeAt(0);return O>=97&&O<=122||O>=65&&O<=90||O>=48&&O<=57||O===95||O===36||O===45}function J(b){return de(b,G)}function ue(b){const O=b.charCodeAt(0);return O>=48&&O<=57}function W(b){return de(b,ue)}function V(b){const O=b.charCodeAt(0);return O>=48&&O<=57||O>=65&&O<=70||O>=97&&O<=102}function H(b){return de(b,V)}function ae(b){let O="",Q="";for(;O=W(b);)Q+=O;return Q}function K(b){let O="";for(;;){const Q=b.currentChar();if(Q==="{"||Q==="}"||Q==="@"||Q==="|"||!Q)break;if(Q===Dt||Q===ct)if(ve(b))O+=Q,b.next();else{if(re(b))break;O+=Q,b.next()}else O+=Q,b.next()}return O}function ee(b){P(b);let O="",Q="";for(;O=J(b);)Q+=O;const ie=b.currentChar();if(ie&&ie!=="}"&&ie!==Ut&&ie!==Dt&&ie!==ct&&ie!==" "){const ye=U(b);return g(ze.INVALID_TOKEN_IN_PLACEHOLDER,i(),0,Q+ye),Q+ye}return b.currentChar()===Ut&&g(ze.UNTERMINATED_CLOSING_BRACE,i(),0),Q}function fe(b){P(b);let O="";return b.currentChar()==="-"?(b.next(),O+=`-${ae(b)}`):O+=ae(b),b.currentChar()===Ut&&g(ze.UNTERMINATED_CLOSING_BRACE,i(),0),O}function he(b){return b!==qn&&b!==ct}function le(b){P(b),w(b,"'");let O="",Q="";for(;O=de(b,he);)O==="\\"?Q+=B(b):Q+=O;const ie=b.currentChar();return ie===ct||ie===Ut?(g(ze.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER,i(),0),ie===ct&&(b.next(),w(b,"'")),Q):(w(b,"'"),Q)}function B(b){const O=b.currentChar();switch(O){case"\\":case"'":return b.next(),`\\${O}`;case"u":return N(b,O,4);case"U":return N(b,O,6);default:return g(ze.UNKNOWN_ESCAPE_SEQUENCE,i(),0,O),""}}function N(b,O,Q){w(b,O);let ie="";for(let ye=0;ye<Q;ye++){const j=H(b);if(!j){g(ze.INVALID_UNICODE_ESCAPE_SEQUENCE,i(),0,`\\${O}${ie}${b.currentChar()}`);break}ie+=j}return`\\${O}${ie}`}function T(b){return b!=="{"&&b!=="}"&&b!==Dt&&b!==ct}function U(b){P(b);let O="",Q="";for(;O=de(b,T);)Q+=O;return Q}function Z(b){let O="",Q="";for(;O=A(b);)Q+=O;return Q}function oe(b){const O=Q=>{const ie=b.currentChar();return ie==="{"||ie==="@"||ie==="|"||ie==="("||ie===")"||!ie||ie===Dt?Q:(Q+=ie,b.next(),O(Q))};return O("")}function me(b){P(b);const O=w(b,"|");return P(b),O}function pe(b,O){let Q=null;switch(b.currentChar()){case"{":return O.braceNest>=1&&g(ze.NOT_ALLOW_NEST_PLACEHOLDER,i(),0),b.next(),Q=_(O,2,"{"),P(b),O.braceNest++,Q;case"}":return O.braceNest>0&&O.currentType===2&&g(ze.EMPTY_PLACEHOLDER,i(),0),b.next(),Q=_(O,3,"}"),O.braceNest--,O.braceNest>0&&P(b),O.inLinked&&O.braceNest===0&&(O.inLinked=!1),Q;case"@":return O.braceNest>0&&g(ze.UNTERMINATED_CLOSING_BRACE,i(),0),Q=_e(b,O)||x(O),O.braceNest=0,Q;default:{let ye=!0,j=!0,q=!0;if(re(b))return O.braceNest>0&&g(ze.UNTERMINATED_CLOSING_BRACE,i(),0),Q=_(O,1,me(b)),O.braceNest=0,O.inLinked=!1,Q;if(O.braceNest>0&&(O.currentType===4||O.currentType===5||O.currentType===6))return g(ze.UNTERMINATED_CLOSING_BRACE,i(),0),O.braceNest=0,be(b,O);if(ye=C(b,O))return Q=_(O,4,ee(b)),P(b),Q;if(j=S(b,O))return Q=_(O,5,fe(b)),P(b),Q;if(q=z(b,O))return Q=_(O,6,le(b)),P(b),Q;if(!ye&&!j&&!q)return Q=_(O,12,U(b)),g(ze.INVALID_TOKEN_IN_PLACEHOLDER,i(),0,Q.value),P(b),Q;break}}return Q}function _e(b,O){const{currentType:Q}=O;let ie=null;const ye=b.currentChar();switch((Q===7||Q===8||Q===11||Q===9)&&(ye===ct||ye===Dt)&&g(ze.INVALID_LINKED_FORMAT,i(),0),ye){case"@":return b.next(),ie=_(O,7,"@"),O.inLinked=!0,ie;case".":return P(b),b.next(),_(O,8,".");case":":return P(b),b.next(),_(O,9,":");default:return re(b)?(ie=_(O,1,me(b)),O.braceNest=0,O.inLinked=!1,ie):M(b,O)||E(b,O)?(P(b),_e(b,O)):D(b,O)?(P(b),_(O,11,Z(b))):F(b,O)?(P(b),ye==="{"?pe(b,O)||ie:_(O,10,oe(b))):(Q===7&&g(ze.INVALID_LINKED_FORMAT,i(),0),O.braceNest=0,O.inLinked=!1,be(b,O))}}function be(b,O){let Q={type:13};if(O.braceNest>0)return pe(b,O)||x(O);if(O.inLinked)return _e(b,O)||x(O);switch(b.currentChar()){case"{":return pe(b,O)||x(O);case"}":return g(ze.UNBALANCED_CLOSING_BRACE,i(),0),b.next(),_(O,3,"}");case"@":return _e(b,O)||x(O);default:{if(re(b))return Q=_(O,1,me(b)),O.braceNest=0,O.inLinked=!1,Q;if(ve(b))return _(O,0,K(b));break}}return Q}function ge(){const{currentType:b,offset:O,startLoc:Q,endLoc:ie}=m;return m.lastType=b,m.lastOffset=O,m.lastStartLoc=Q,m.lastEndLoc=ie,m.offset=a(),m.startLoc=i(),n.currentChar()===Ut?_(m,13):be(n,m)}return{nextToken:ge,currentOffset:a,currentPosition:i,context:u}}const nc="parser",oc=/(?:\\\\|\\'|\\u([0-9a-fA-F]{4})|\\U([0-9a-fA-F]{6}))/g;function rc(e,t,s){switch(e){case"\\\\":return"\\";case"\\'":return"'";default:{const n=parseInt(t||s,16);return n<=55295||n>=57344?String.fromCodePoint(n):"�"}}}function ic(e={}){const t=e.location!==!1,{onError:s}=e;function n(h,p,C,S,...z){const M=h.currentPosition();if(M.offset+=S,M.column+=S,s){const D=t?Wa(C,M):null,E=ya(p,D,{domain:nc,args:z});s(E)}}function a(h,p,C){const S={type:h};return t&&(S.start=p,S.end=p,S.loc={start:C,end:C}),S}function i(h,p,C,S){t&&(h.end=p,h.loc&&(h.loc.end=C))}function c(h,p){const C=h.context(),S=a(3,C.offset,C.startLoc);return S.value=p,i(S,h.currentOffset(),h.currentPosition()),S}function d(h,p){const C=h.context(),{lastOffset:S,lastStartLoc:z}=C,M=a(5,S,z);return M.index=parseInt(p,10),h.nextToken(),i(M,h.currentOffset(),h.currentPosition()),M}function m(h,p){const C=h.context(),{lastOffset:S,lastStartLoc:z}=C,M=a(4,S,z);return M.key=p,h.nextToken(),i(M,h.currentOffset(),h.currentPosition()),M}function u(h,p){const C=h.context(),{lastOffset:S,lastStartLoc:z}=C,M=a(9,S,z);return M.value=p.replace(oc,rc),h.nextToken(),i(M,h.currentOffset(),h.currentPosition()),M}function y(h){const p=h.nextToken(),C=h.context(),{lastOffset:S,lastStartLoc:z}=C,M=a(8,S,z);return p.type!==11?(n(h,ze.UNEXPECTED_EMPTY_LINKED_MODIFIER,C.lastStartLoc,0),M.value="",i(M,S,z),{nextConsumeToken:p,node:M}):(p.value==null&&n(h,ze.UNEXPECTED_LEXICAL_ANALYSIS,C.lastStartLoc,0,Lt(p)),M.value=p.value||"",i(M,h.currentOffset(),h.currentPosition()),{node:M})}function g(h,p){const C=h.context(),S=a(7,C.offset,C.startLoc);return S.value=p,i(S,h.currentOffset(),h.currentPosition()),S}function _(h){const p=h.context(),C=a(6,p.offset,p.startLoc);let S=h.nextToken();if(S.type===8){const z=y(h);C.modifier=z.node,S=z.nextConsumeToken||h.nextToken()}switch(S.type!==9&&n(h,ze.UNEXPECTED_LEXICAL_ANALYSIS,p.lastStartLoc,0,Lt(S)),S=h.nextToken(),S.type===2&&(S=h.nextToken()),S.type){case 10:S.value==null&&n(h,ze.UNEXPECTED_LEXICAL_ANALYSIS,p.lastStartLoc,0,Lt(S)),C.key=g(h,S.value||"");break;case 4:S.value==null&&n(h,ze.UNEXPECTED_LEXICAL_ANALYSIS,p.lastStartLoc,0,Lt(S)),C.key=m(h,S.value||"");break;case 5:S.value==null&&n(h,ze.UNEXPECTED_LEXICAL_ANALYSIS,p.lastStartLoc,0,Lt(S)),C.key=d(h,S.value||"");break;case 6:S.value==null&&n(h,ze.UNEXPECTED_LEXICAL_ANALYSIS,p.lastStartLoc,0,Lt(S)),C.key=u(h,S.value||"");break;default:{n(h,ze.UNEXPECTED_EMPTY_LINKED_KEY,p.lastStartLoc,0);const z=h.context(),M=a(7,z.offset,z.startLoc);return M.value="",i(M,z.offset,z.startLoc),C.key=M,i(C,z.offset,z.startLoc),{nextConsumeToken:S,node:C}}}return i(C,h.currentOffset(),h.currentPosition()),{node:C}}function x(h){const p=h.context(),C=p.currentType===1?h.currentOffset():p.offset,S=p.currentType===1?p.endLoc:p.startLoc,z=a(2,C,S);z.items=[];let M=null;do{const F=M||h.nextToken();switch(M=null,F.type){case 0:F.value==null&&n(h,ze.UNEXPECTED_LEXICAL_ANALYSIS,p.lastStartLoc,0,Lt(F)),z.items.push(c(h,F.value||""));break;case 5:F.value==null&&n(h,ze.UNEXPECTED_LEXICAL_ANALYSIS,p.lastStartLoc,0,Lt(F)),z.items.push(d(h,F.value||""));break;case 4:F.value==null&&n(h,ze.UNEXPECTED_LEXICAL_ANALYSIS,p.lastStartLoc,0,Lt(F)),z.items.push(m(h,F.value||""));break;case 6:F.value==null&&n(h,ze.UNEXPECTED_LEXICAL_ANALYSIS,p.lastStartLoc,0,Lt(F)),z.items.push(u(h,F.value||""));break;case 7:{const re=_(h);z.items.push(re.node),M=re.nextConsumeToken||null;break}}}while(p.currentType!==13&&p.currentType!==1);const D=p.currentType===1?p.lastOffset:h.currentOffset(),E=p.currentType===1?p.lastEndLoc:h.currentPosition();return i(z,D,E),z}function w(h,p,C,S){const z=h.context();let M=S.items.length===0;const D=a(1,p,C);D.cases=[],D.cases.push(S);do{const E=x(h);M||(M=E.items.length===0),D.cases.push(E)}while(z.currentType!==13);return M&&n(h,ze.MUST_HAVE_MESSAGES_IN_PLURAL,C,0),i(D,h.currentOffset(),h.currentPosition()),D}function $(h){const p=h.context(),{offset:C,startLoc:S}=p,z=x(h);return p.currentType===13?z:w(h,C,S,z)}function P(h){const p=ac(h,nt({},e)),C=p.context(),S=a(0,C.offset,C.startLoc);return t&&S.loc&&(S.loc.source=h),S.body=$(p),e.onCacheKey&&(S.cacheKey=e.onCacheKey(h)),C.currentType!==13&&n(p,ze.UNEXPECTED_LEXICAL_ANALYSIS,C.lastStartLoc,0,h[C.offset]||""),i(S,p.currentOffset(),p.currentPosition()),S}return{parse:P}}function Lt(e){if(e.type===13)return"EOF";const t=(e.value||"").replace(/\r?\n/gu,"\\n");return t.length>10?t.slice(0,9)+"…":t}function lc(e,t={}){const s={ast:e,helpers:new Set};return{context:()=>s,helper:i=>(s.helpers.add(i),i)}}function Kn(e,t){for(let s=0;s<e.length;s++)bn(e[s],t)}function bn(e,t){switch(e.type){case 1:Kn(e.cases,t),t.helper("plural");break;case 2:Kn(e.items,t);break;case 6:{bn(e.key,t),t.helper("linked"),t.helper("type");break}case 5:t.helper("interpolate"),t.helper("list");break;case 4:t.helper("interpolate"),t.helper("named");break}}function cc(e,t={}){const s=lc(e);s.helper("normalize"),e.body&&bn(e.body,s);const n=s.context();e.helpers=Array.from(n.helpers)}function dc(e){const t=e.body;return t.type===2?Gn(t):t.cases.forEach(s=>Gn(s)),e}function Gn(e){if(e.items.length===1){const t=e.items[0];(t.type===3||t.type===9)&&(e.static=t.value,delete t.value)}else{const t=[];for(let s=0;s<e.items.length;s++){const n=e.items[s];if(!(n.type===3||n.type===9)||n.value==null)break;t.push(n.value)}if(t.length===e.items.length){e.static=yn(t);for(let s=0;s<e.items.length;s++){const n=e.items[s];(n.type===3||n.type===9)&&delete n.value}}}}function ms(e){switch(e.t=e.type,e.type){case 0:{const t=e;ms(t.body),t.b=t.body,delete t.body;break}case 1:{const t=e,s=t.cases;for(let n=0;n<s.length;n++)ms(s[n]);t.c=s,delete t.cases;break}case 2:{const t=e,s=t.items;for(let n=0;n<s.length;n++)ms(s[n]);t.i=s,delete t.items,t.static&&(t.s=t.static,delete t.static);break}case 3:case 9:case 8:case 7:{const t=e;t.value&&(t.v=t.value,delete t.value);break}case 6:{const t=e;ms(t.key),t.k=t.key,delete t.key,t.modifier&&(ms(t.modifier),t.m=t.modifier,delete t.modifier);break}case 5:{const t=e;t.i=t.index,delete t.index;break}case 4:{const t=e;t.k=t.key,delete t.key;break}}delete e.type}function uc(e,t){const{filename:s,breakLineCode:n,needIndent:a}=t,i=t.location!==!1,c={filename:s,code:"",column:1,line:1,offset:0,map:void 0,breakLineCode:n,needIndent:a,indentLevel:0};i&&e.loc&&(c.source=e.loc.source);const d=()=>c;function m($,P){c.code+=$}function u($,P=!0){const h=P?n:"";m(a?h+" ".repeat($):h)}function y($=!0){const P=++c.indentLevel;$&&u(P)}function g($=!0){const P=--c.indentLevel;$&&u(P)}function _(){u(c.indentLevel)}return{context:d,push:m,indent:y,deindent:g,newline:_,helper:$=>`_${$}`,needIndent:()=>c.needIndent}}function mc(e,t){const{helper:s}=e;e.push(`${s("linked")}(`),ys(e,t.key),t.modifier?(e.push(", "),ys(e,t.modifier),e.push(", _type")):e.push(", undefined, _type"),e.push(")")}function gc(e,t){const{helper:s,needIndent:n}=e;e.push(`${s("normalize")}([`),e.indent(n());const a=t.items.length;for(let i=0;i<a&&(ys(e,t.items[i]),i!==a-1);i++)e.push(", ");e.deindent(n()),e.push("])")}function pc(e,t){const{helper:s,needIndent:n}=e;if(t.cases.length>1){e.push(`${s("plural")}([`),e.indent(n());const a=t.cases.length;for(let i=0;i<a&&(ys(e,t.cases[i]),i!==a-1);i++)e.push(", ");e.deindent(n()),e.push("])")}}function fc(e,t){t.body?ys(e,t.body):e.push("null")}function ys(e,t){const{helper:s}=e;switch(t.type){case 0:fc(e,t);break;case 1:pc(e,t);break;case 2:gc(e,t);break;case 6:mc(e,t);break;case 8:e.push(JSON.stringify(t.value),t);break;case 7:e.push(JSON.stringify(t.value),t);break;case 5:e.push(`${s("interpolate")}(${s("list")}(${t.index}))`,t);break;case 4:e.push(`${s("interpolate")}(${s("named")}(${JSON.stringify(t.key)}))`,t);break;case 9:e.push(JSON.stringify(t.value),t);break;case 3:e.push(JSON.stringify(t.value),t);break}}const hc=(e,t={})=>{const s=Me(t.mode)?t.mode:"normal",n=Me(t.filename)?t.filename:"message.intl";t.sourceMap;const a=t.breakLineCode!=null?t.breakLineCode:s==="arrow"?";":`
4
+ `,i=t.needIndent?t.needIndent:s!=="arrow",c=e.helpers||[],d=uc(e,{filename:n,breakLineCode:a,needIndent:i});d.push(s==="normal"?"function __msg__ (ctx) {":"(ctx) => {"),d.indent(i),c.length>0&&(d.push(`const { ${yn(c.map(y=>`${y}: _${y}`),", ")} } = ctx`),d.newline()),d.push("return "),ys(d,e),d.deindent(i),d.push("}"),delete e.helpers;const{code:m,map:u}=d.context();return{ast:e,code:m,map:u?u.toJSON():void 0}};function vc(e,t={}){const s=nt({},t),n=!!s.jit,a=!!s.minify,i=s.optimize==null?!0:s.optimize,d=ic(s).parse(e);return n?(i&&dc(d),a&&ms(d),{ast:d,code:""}):(cc(d,s),hc(d,s))}function yc(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(os().__INTLIFY_PROD_DEVTOOLS__=!1),typeof __INTLIFY_DROP_MESSAGE_COMPILER__!="boolean"&&(os().__INTLIFY_DROP_MESSAGE_COMPILER__=!1)}function Et(e){return He(e)&&_n(e)===0&&(At(e,"b")||At(e,"body"))}const Lr=["b","body"];function bc(e){return Zt(e,Lr)}const Rr=["c","cases"];function _c(e){return Zt(e,Rr,[])}const Er=["s","static"];function xc(e){return Zt(e,Er)}const Fr=["i","items"];function kc(e){return Zt(e,Fr,[])}const Nr=["t","type"];function _n(e){return Zt(e,Nr)}const Ur=["v","value"];function Qs(e,t){const s=Zt(e,Ur);if(s!=null)return s;throw Rs(t)}const Or=["m","modifier"];function wc(e){return Zt(e,Or)}const Vr=["k","key"];function Sc(e){const t=Zt(e,Vr);if(t)return t;throw Rs(6)}function Zt(e,t,s){for(let n=0;n<t.length;n++){const a=t[n];if(At(e,a)&&e[a]!=null)return e[a]}return s}const Hr=[...Lr,...Rr,...Er,...Fr,...Vr,...Or,...Ur,...Nr];function Rs(e){return new Error(`unhandled node type: ${e}`)}function Ta(e){return s=>Cc(s,e)}function Cc(e,t){const s=bc(t);if(s==null)throw Rs(0);if(_n(s)===1){const i=_c(s);return e.plural(i.reduce((c,d)=>[...c,Xn(e,d)],[]))}else return Xn(e,s)}function Xn(e,t){const s=xc(t);if(s!=null)return e.type==="text"?s:e.normalize([s]);{const n=kc(t).reduce((a,i)=>[...a,ja(e,i)],[]);return e.normalize(n)}}function ja(e,t){const s=_n(t);switch(s){case 3:return Qs(t,s);case 9:return Qs(t,s);case 4:{const n=t;if(At(n,"k")&&n.k)return e.interpolate(e.named(n.k));if(At(n,"key")&&n.key)return e.interpolate(e.named(n.key));throw Rs(s)}case 5:{const n=t;if(At(n,"i")&&Ze(n.i))return e.interpolate(e.list(n.i));if(At(n,"index")&&Ze(n.index))return e.interpolate(e.list(n.index));throw Rs(s)}case 6:{const n=t,a=wc(n),i=Sc(n);return e.linked(ja(e,i),a?ja(e,a):void 0,e.type)}case 7:return Qs(t,s);case 8:return Qs(t,s);default:throw new Error(`unhandled node on format message part: ${s}`)}}const Ic=e=>e;let Js=qe();function Mc(e,t={}){let s=!1;const n=t.onError||Yl;return t.onError=a=>{s=!0,n(a)},{...vc(e,t),detectError:s}}function Tc(e,t){if(!__INTLIFY_DROP_MESSAGE_COMPILER__&&Me(e)){Ve(t.warnHtmlMessage)&&t.warnHtmlMessage;const n=(t.onCacheKey||Ic)(e),a=Js[n];if(a)return a;const{ast:i,detectError:c}=Mc(e,{...t,location:!1,jit:!0}),d=Ta(i);return c?d:Js[n]=d}else{const s=e.cacheKey;if(s){const n=Js[s];return n||(Js[s]=Ta(e))}else return Ta(e)}}let Es=null;function Ac(e){Es=e}function $c(e,t,s){Es&&Es.emit("i18n:init",{timestamp:Date.now(),i18n:e,version:t,meta:s})}const Pc=Dc("function:translate");function Dc(e){return t=>Es&&Es.emit(e,t)}const Ht={INVALID_ARGUMENT:Xl,INVALID_DATE_ARGUMENT:18,INVALID_ISO_DATE_ARGUMENT:19,NOT_SUPPORT_LOCALE_PROMISE_VALUE:21,NOT_SUPPORT_LOCALE_ASYNC_FUNCTION:22,NOT_SUPPORT_LOCALE_TYPE:23},Lc=24;function zt(e){return ya(e,null,void 0)}function xn(e,t){return t.locale!=null?Yn(t.locale):Yn(e.locale)}let Aa;function Yn(e){if(Me(e))return e;if(Ge(e)){if(e.resolvedOnce&&Aa!=null)return Aa;if(e.constructor.name==="Function"){const t=e();if(ql(t))throw zt(Ht.NOT_SUPPORT_LOCALE_PROMISE_VALUE);return Aa=t}else throw zt(Ht.NOT_SUPPORT_LOCALE_ASYNC_FUNCTION)}else throw zt(Ht.NOT_SUPPORT_LOCALE_TYPE)}function Rc(e,t,s){return[...new Set([s,...Ye(t)?t:He(t)?Object.keys(t):Me(t)?[t]:[s]])]}function zr(e,t,s){const n=Me(s)?s:Fs,a=e;a.__localeChainCache||(a.__localeChainCache=new Map);let i=a.__localeChainCache.get(n);if(!i){i=[];let c=[s];for(;Ye(c);)c=Qn(i,c,t);const d=Ye(t)||!Ne(t)?t:t.default?t.default:null;c=Me(d)?[d]:d,Ye(c)&&Qn(i,c,!1),a.__localeChainCache.set(n,i)}return i}function Qn(e,t,s){let n=!0;for(let a=0;a<t.length&&Ve(n);a++){const i=t[a];Me(i)&&(n=Ec(e,t[a],s))}return n}function Ec(e,t,s){let n;const a=t.split("-");do{const i=a.join("-");n=Fc(e,i,s),a.splice(-1,1)}while(a.length&&n===!0);return n}function Fc(e,t,s){let n=!1;if(!e.includes(t)&&(n=!0,t)){n=t[t.length-1]!=="!";const a=t.replace(/!/g,"");e.push(a),(Ye(s)||Ne(s))&&s[a]&&(n=s[a])}return n}const es=[];es[0]={w:[0],i:[3,0],"[":[4],o:[7]};es[1]={w:[1],".":[2],"[":[4],o:[7]};es[2]={w:[2],i:[3,0],0:[3,0]};es[3]={i:[3,0],0:[3,0],w:[1,1],".":[2,1],"[":[4,1],o:[7,1]};es[4]={"'":[5,0],'"':[6,0],"[":[4,2],"]":[1,3],o:8,l:[4,0]};es[5]={"'":[4,0],o:8,l:[5,0]};es[6]={'"':[4,0],o:8,l:[6,0]};const Nc=/^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/;function Uc(e){return Nc.test(e)}function Oc(e){const t=e.charCodeAt(0),s=e.charCodeAt(e.length-1);return t===s&&(t===34||t===39)?e.slice(1,-1):e}function Vc(e){if(e==null)return"o";switch(e.charCodeAt(0)){case 91:case 93:case 46:case 34:case 39:return e;case 95:case 36:case 45:return"i";case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"w"}return"i"}function Hc(e){const t=e.trim();return e.charAt(0)==="0"&&isNaN(parseInt(e))?!1:Uc(t)?Oc(t):"*"+t}function zc(e){const t=[];let s=-1,n=0,a=0,i,c,d,m,u,y,g;const _=[];_[0]=()=>{c===void 0?c=d:c+=d},_[1]=()=>{c!==void 0&&(t.push(c),c=void 0)},_[2]=()=>{_[0](),a++},_[3]=()=>{if(a>0)a--,n=4,_[0]();else{if(a=0,c===void 0||(c=Hc(c),c===!1))return!1;_[1]()}};function x(){const w=e[s+1];if(n===5&&w==="'"||n===6&&w==='"')return s++,d="\\"+w,_[0](),!0}for(;n!==null;)if(s++,i=e[s],!(i==="\\"&&x())){if(m=Vc(i),g=es[n],u=g[m]||g.l||8,u===8||(n=u[0],u[1]!==void 0&&(y=_[u[1]],y&&(d=i,y()===!1))))return;if(n===7)return t}}const Jn=new Map;function Bc(e,t){return He(e)?e[t]:null}function Wc(e,t){if(!He(e))return null;let s=Jn.get(t);if(s||(s=zc(t),s&&Jn.set(t,s)),!s)return null;const n=s.length;let a=e,i=0;for(;i<n;){const c=s[i];if(Hr.includes(c)&&Et(a))return null;const d=a[c];if(d===void 0||Ge(a))return null;a=d,i++}return a}const jc="11.2.8",ba=-1,Fs="en-US",Zn="",eo=e=>`${e.charAt(0).toLocaleUpperCase()}${e.substr(1)}`;function qc(){return{upper:(e,t)=>t==="text"&&Me(e)?e.toUpperCase():t==="vnode"&&He(e)&&"__v_isVNode"in e?e.children.toUpperCase():e,lower:(e,t)=>t==="text"&&Me(e)?e.toLowerCase():t==="vnode"&&He(e)&&"__v_isVNode"in e?e.children.toLowerCase():e,capitalize:(e,t)=>t==="text"&&Me(e)?eo(e):t==="vnode"&&He(e)&&"__v_isVNode"in e?eo(e.children):e}}let Br;function Kc(e){Br=e}let Wr;function Gc(e){Wr=e}let jr;function Xc(e){jr=e}let qr=null;const Yc=e=>{qr=e},Qc=()=>qr;let Kr=null;const to=e=>{Kr=e},Jc=()=>Kr;let so=0;function Zc(e={}){const t=Ge(e.onWarn)?e.onWarn:Ol,s=Me(e.version)?e.version:jc,n=Me(e.locale)||Ge(e.locale)?e.locale:Fs,a=Ge(n)?Fs:n,i=Ye(e.fallbackLocale)||Ne(e.fallbackLocale)||Me(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:a,c=Ne(e.messages)?e.messages:$a(a),d=Ne(e.datetimeFormats)?e.datetimeFormats:$a(a),m=Ne(e.numberFormats)?e.numberFormats:$a(a),u=nt(qe(),e.modifiers,qc()),y=e.pluralRules||qe(),g=Ge(e.missing)?e.missing:null,_=Ve(e.missingWarn)||vs(e.missingWarn)?e.missingWarn:!0,x=Ve(e.fallbackWarn)||vs(e.fallbackWarn)?e.fallbackWarn:!0,w=!!e.fallbackFormat,$=!!e.unresolving,P=Ge(e.postTranslation)?e.postTranslation:null,h=Ne(e.processor)?e.processor:null,p=Ve(e.warnHtmlMessage)?e.warnHtmlMessage:!0,C=!!e.escapeParameter,S=Ge(e.messageCompiler)?e.messageCompiler:Br,z=Ge(e.messageResolver)?e.messageResolver:Wr||Bc,M=Ge(e.localeFallbacker)?e.localeFallbacker:jr||Rc,D=He(e.fallbackContext)?e.fallbackContext:void 0,E=e,F=He(E.__datetimeFormatters)?E.__datetimeFormatters:new Map,re=He(E.__numberFormatters)?E.__numberFormatters:new Map,ve=He(E.__meta)?E.__meta:{};so++;const de={version:s,cid:so,locale:n,fallbackLocale:i,messages:c,modifiers:u,pluralRules:y,missing:g,missingWarn:_,fallbackWarn:x,fallbackFormat:w,unresolving:$,postTranslation:P,processor:h,warnHtmlMessage:p,escapeParameter:C,messageCompiler:S,messageResolver:z,localeFallbacker:M,fallbackContext:D,onWarn:t,__meta:ve};return de.datetimeFormats=d,de.numberFormats=m,de.__datetimeFormatters=F,de.__numberFormatters=re,__INTLIFY_PROD_DEVTOOLS__&&$c(de,s,ve),de}const $a=e=>({[e]:qe()});function kn(e,t,s,n,a){const{missing:i,onWarn:c}=e;if(i!==null){const d=i(e,s,t,a);return Me(d)?d:t}else return t}function Cs(e,t,s){const n=e;n.__localeChainCache=new Map,e.localeFallbacker(e,s,t)}function ed(e,t){return e===t?!1:e.split("-")[0]===t.split("-")[0]}function td(e,t){const s=t.indexOf(e);if(s===-1)return!1;for(let n=s+1;n<t.length;n++)if(ed(e,t[n]))return!0;return!1}function ao(e,...t){const{datetimeFormats:s,unresolving:n,fallbackLocale:a,onWarn:i,localeFallbacker:c}=e,{__datetimeFormatters:d}=e,[m,u,y,g]=qa(...t),_=Ve(y.missingWarn)?y.missingWarn:e.missingWarn;Ve(y.fallbackWarn)?y.fallbackWarn:e.fallbackWarn;const x=!!y.part,w=xn(e,y),$=c(e,a,w);if(!Me(m)||m==="")return new Intl.DateTimeFormat(w,g).format(u);let P={},h,p=null;const C="datetime format";for(let M=0;M<$.length&&(h=$[M],P=s[h]||{},p=P[m],!Ne(p));M++)kn(e,m,h,_,C);if(!Ne(p)||!Me(h))return n?ba:m;let S=`${h}__${m}`;va(g)||(S=`${S}__${JSON.stringify(g)}`);let z=d.get(S);return z||(z=new Intl.DateTimeFormat(h,nt({},p,g)),d.set(S,z)),x?z.formatToParts(u):z.format(u)}const Gr=["localeMatcher","weekday","era","year","month","day","hour","minute","second","timeZoneName","formatMatcher","hour12","timeZone","dateStyle","timeStyle","calendar","dayPeriod","numberingSystem","hourCycle","fractionalSecondDigits"];function qa(...e){const[t,s,n,a]=e,i=qe();let c=qe(),d;if(Me(t)){const m=t.match(/(\d{4}-\d{2}-\d{2})(T|\s)?(.*)/);if(!m)throw zt(Ht.INVALID_ISO_DATE_ARGUMENT);const u=m[3]?m[3].trim().startsWith("T")?`${m[1].trim()}${m[3].trim()}`:`${m[1].trim()}T${m[3].trim()}`:m[1].trim();d=new Date(u);try{d.toISOString()}catch{throw zt(Ht.INVALID_ISO_DATE_ARGUMENT)}}else if(zl(t)){if(isNaN(t.getTime()))throw zt(Ht.INVALID_DATE_ARGUMENT);d=t}else if(Ze(t))d=t;else throw zt(Ht.INVALID_ARGUMENT);return Me(s)?i.key=s:Ne(s)&&Object.keys(s).forEach(m=>{Gr.includes(m)?c[m]=s[m]:i[m]=s[m]}),Me(n)?i.locale=n:Ne(n)&&(c=n),Ne(a)&&(c=a),[i.key||"",d,i,c]}function no(e,t,s){const n=e;for(const a in s){const i=`${t}__${a}`;n.__datetimeFormatters.has(i)&&n.__datetimeFormatters.delete(i)}}function oo(e,...t){const{numberFormats:s,unresolving:n,fallbackLocale:a,onWarn:i,localeFallbacker:c}=e,{__numberFormatters:d}=e,[m,u,y,g]=Ka(...t),_=Ve(y.missingWarn)?y.missingWarn:e.missingWarn;Ve(y.fallbackWarn)?y.fallbackWarn:e.fallbackWarn;const x=!!y.part,w=xn(e,y),$=c(e,a,w);if(!Me(m)||m==="")return new Intl.NumberFormat(w,g).format(u);let P={},h,p=null;const C="number format";for(let M=0;M<$.length&&(h=$[M],P=s[h]||{},p=P[m],!Ne(p));M++)kn(e,m,h,_,C);if(!Ne(p)||!Me(h))return n?ba:m;let S=`${h}__${m}`;va(g)||(S=`${S}__${JSON.stringify(g)}`);let z=d.get(S);return z||(z=new Intl.NumberFormat(h,nt({},p,g)),d.set(S,z)),x?z.formatToParts(u):z.format(u)}const Xr=["localeMatcher","style","currency","currencyDisplay","currencySign","useGrouping","minimumIntegerDigits","minimumFractionDigits","maximumFractionDigits","minimumSignificantDigits","maximumSignificantDigits","compactDisplay","notation","signDisplay","unit","unitDisplay","roundingMode","roundingPriority","roundingIncrement","trailingZeroDisplay"];function Ka(...e){const[t,s,n,a]=e,i=qe();let c=qe();if(!Ze(t))throw zt(Ht.INVALID_ARGUMENT);const d=t;return Me(s)?i.key=s:Ne(s)&&Object.keys(s).forEach(m=>{Xr.includes(m)?c[m]=s[m]:i[m]=s[m]}),Me(n)?i.locale=n:Ne(n)&&(c=n),Ne(a)&&(c=a),[i.key||"",d,i,c]}function ro(e,t,s){const n=e;for(const a in s){const i=`${t}__${a}`;n.__numberFormatters.has(i)&&n.__numberFormatters.delete(i)}}const sd=e=>e,ad=e=>"",nd="text",od=e=>e.length===0?"":yn(e),rd=Kl;function io(e,t){return e=Math.abs(e),t===2?e?e>1?1:0:1:e?Math.min(e,2):0}function id(e){const t=Ze(e.pluralIndex)?e.pluralIndex:-1;return e.named&&(Ze(e.named.count)||Ze(e.named.n))?Ze(e.named.count)?e.named.count:Ze(e.named.n)?e.named.n:t:t}function ld(e,t){t.count||(t.count=e),t.n||(t.n=e)}function cd(e={}){const t=e.locale,s=id(e),n=He(e.pluralRules)&&Me(t)&&Ge(e.pluralRules[t])?e.pluralRules[t]:io,a=He(e.pluralRules)&&Me(t)&&Ge(e.pluralRules[t])?io:void 0,i=h=>h[n(s,h.length,a)],c=e.list||[],d=h=>c[h],m=e.named||qe();Ze(e.pluralIndex)&&ld(s,m);const u=h=>m[h];function y(h,p){const C=Ge(e.messages)?e.messages(h,!!p):He(e.messages)?e.messages[h]:!1;return C||(e.parent?e.parent.message(h):ad)}const g=h=>e.modifiers?e.modifiers[h]:sd,_=Ne(e.processor)&&Ge(e.processor.normalize)?e.processor.normalize:od,x=Ne(e.processor)&&Ge(e.processor.interpolate)?e.processor.interpolate:rd,w=Ne(e.processor)&&Me(e.processor.type)?e.processor.type:nd,P={list:d,named:u,plural:i,linked:(h,...p)=>{const[C,S]=p;let z="text",M="";p.length===1?He(C)?(M=C.modifier||M,z=C.type||z):Me(C)&&(M=C||M):p.length===2&&(Me(C)&&(M=C||M),Me(S)&&(z=S||z));const D=y(h,!0)(P),E=z==="vnode"&&Ye(D)&&M?D[0]:D;return M?g(M)(E,z):E},message:y,type:w,interpolate:x,normalize:_,values:nt(qe(),c,m)};return P}const lo=()=>"",wt=e=>Ge(e);function co(e,...t){const{fallbackFormat:s,postTranslation:n,unresolving:a,messageCompiler:i,fallbackLocale:c,messages:d}=e,[m,u]=Ga(...t),y=Ve(u.missingWarn)?u.missingWarn:e.missingWarn,g=Ve(u.fallbackWarn)?u.fallbackWarn:e.fallbackWarn,_=Ve(u.escapeParameter)?u.escapeParameter:e.escapeParameter,x=!!u.resolvedMessage,w=Me(u.default)||Ve(u.default)?Ve(u.default)?i?m:()=>m:u.default:s?i?m:()=>m:null,$=s||w!=null&&(Me(w)||Ge(w)),P=xn(e,u);_&&dd(u);let[h,p,C]=x?[m,P,d[P]||qe()]:Yr(e,m,P,c,g,y),S=h,z=m;if(!x&&!(Me(S)||Et(S)||wt(S))&&$&&(S=w,z=S),!x&&(!(Me(S)||Et(S)||wt(S))||!Me(p)))return a?ba:m;let M=!1;const D=()=>{M=!0},E=wt(S)?S:Qr(e,m,p,S,z,D);if(M)return S;const F=gd(e,p,C,u),re=cd(F),ve=ud(e,E,re);let de=n?n(ve,m):ve;if(_&&Me(de)&&(de=Wl(de)),__INTLIFY_PROD_DEVTOOLS__){const L={timestamp:Date.now(),key:Me(m)?m:wt(S)?S.key:"",locale:p||(wt(S)?S.locale:""),format:Me(S)?S:wt(S)?S.source:"",message:de};L.meta=nt({},e.__meta,Qc()||{}),Pc(L)}return de}function dd(e){Ye(e.list)?e.list=e.list.map(t=>Me(t)?Wn(t):t):He(e.named)&&Object.keys(e.named).forEach(t=>{Me(e.named[t])&&(e.named[t]=Wn(e.named[t]))})}function Yr(e,t,s,n,a,i){const{messages:c,onWarn:d,messageResolver:m,localeFallbacker:u}=e,y=u(e,n,s);let g=qe(),_,x=null;const w="translate";for(let $=0;$<y.length&&(_=y[$],g=c[_]||qe(),(x=m(g,t))===null&&(x=g[t]),!(Me(x)||Et(x)||wt(x)));$++)if(!td(_,y)){const P=kn(e,t,_,i,w);P!==t&&(x=P)}return[x,_,g]}function Qr(e,t,s,n,a,i){const{messageCompiler:c,warnHtmlMessage:d}=e;if(wt(n)){const u=n;return u.locale=u.locale||s,u.key=u.key||t,u}if(c==null){const u=(()=>n);return u.locale=s,u.key=t,u}const m=c(n,md(e,s,a,n,d,i));return m.locale=s,m.key=t,m.source=n,m}function ud(e,t,s){return t(s)}function Ga(...e){const[t,s,n]=e,a=qe();if(!Me(t)&&!Ze(t)&&!wt(t)&&!Et(t))throw zt(Ht.INVALID_ARGUMENT);const i=Ze(t)?String(t):(wt(t),t);return Ze(s)?a.plural=s:Me(s)?a.default=s:Ne(s)&&!va(s)?a.named=s:Ye(s)&&(a.list=s),Ze(n)?a.plural=n:Me(n)?a.default=n:Ne(n)&&nt(a,n),[i,a]}function md(e,t,s,n,a,i){return{locale:t,key:s,warnHtmlMessage:a,onError:c=>{throw i&&i(c),c},onCacheKey:c=>Vl(t,s,c)}}function gd(e,t,s,n){const{modifiers:a,pluralRules:i,messageResolver:c,fallbackLocale:d,fallbackWarn:m,missingWarn:u,fallbackContext:y}=e,_={locale:t,modifiers:a,pluralRules:i,messages:(x,w)=>{let $=c(s,x);if($==null&&(y||w)){const[,,P]=Yr(y||e,x,t,d,m,u);$=c(P,x)}if(Me($)||Et($)){let P=!1;const p=Qr(e,x,t,$,x,()=>{P=!0});return P?lo:p}else return wt($)?$:lo}};return e.processor&&(_.processor=e.processor),n.list&&(_.list=n.list),n.named&&(_.named=n.named),Ze(n.plural)&&(_.pluralIndex=n.plural),_}yc();const pd="11.2.8";function fd(){typeof __VUE_I18N_FULL_INSTALL__!="boolean"&&(os().__VUE_I18N_FULL_INSTALL__=!0),typeof __VUE_I18N_LEGACY_API__!="boolean"&&(os().__VUE_I18N_LEGACY_API__=!0),typeof __INTLIFY_DROP_MESSAGE_COMPILER__!="boolean"&&(os().__INTLIFY_DROP_MESSAGE_COMPILER__=!1),typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(os().__INTLIFY_PROD_DEVTOOLS__=!1)}const ht={UNEXPECTED_RETURN_TYPE:Lc,INVALID_ARGUMENT:25,MUST_BE_CALL_SETUP_TOP:26,NOT_INSTALLED:27,REQUIRED_VALUE:28,INVALID_VALUE:29,NOT_INSTALLED_WITH_PROVIDE:31,UNEXPECTED_ERROR:32};function yt(e,...t){return ya(e,null,void 0)}const Xa=Jt("__translateVNode"),Ya=Jt("__datetimeParts"),Qa=Jt("__numberParts"),Jr=Jt("__setPluralRules"),Zr=Jt("__injectWithOption"),Ja=Jt("__dispose");function Ns(e){if(!He(e)||Et(e))return e;for(const t in e)if(At(e,t))if(!t.includes("."))He(e[t])&&Ns(e[t]);else{const s=t.split("."),n=s.length-1;let a=e,i=!1;for(let c=0;c<n;c++){if(s[c]==="__proto__")throw new Error(`unsafe key: ${s[c]}`);if(s[c]in a||(a[s[c]]=qe()),!He(a[s[c]])){i=!0;break}a=a[s[c]]}if(i||(Et(a)?Hr.includes(s[n])||delete e[t]:(a[s[n]]=e[t],delete e[t])),!Et(a)){const c=a[s[n]];He(c)&&Ns(c)}}return e}function wn(e,t){const{messages:s,__i18n:n,messageResolver:a,flatJson:i}=t,c=Ne(s)?s:Ye(n)?qe():{[e]:qe()};if(Ye(n)&&n.forEach(d=>{if("locale"in d&&"resource"in d){const{locale:m,resource:u}=d;m?(c[m]=c[m]||qe(),sa(u,c[m])):sa(u,c)}else Me(d)&&sa(JSON.parse(d),c)}),a==null&&i)for(const d in c)At(c,d)&&Ns(c[d]);return c}function ei(e){return e.type}function ti(e,t,s){let n=He(t.messages)?t.messages:qe();"__i18nGlobal"in s&&(n=wn(e.locale.value,{messages:n,__i18n:s.__i18nGlobal}));const a=Object.keys(n);a.length&&a.forEach(i=>{e.mergeLocaleMessage(i,n[i])});{if(He(t.datetimeFormats)){const i=Object.keys(t.datetimeFormats);i.length&&i.forEach(c=>{e.mergeDateTimeFormat(c,t.datetimeFormats[c])})}if(He(t.numberFormats)){const i=Object.keys(t.numberFormats);i.length&&i.forEach(c=>{e.mergeNumberFormat(c,t.numberFormats[c])})}}}function uo(e){return f(Ui,null,e,0)}function Us(){return ga()}const mo="__INTLIFY_META__",go=()=>[],hd=()=>!1;let po=0;function fo(e){return((t,s,n,a)=>e(s,n,Us()||void 0,a))}const vd=()=>{const e=Us();let t=null;return e&&(t=ei(e)[mo])?{[mo]:t}:null};function Sn(e={}){const{__root:t,__injectWithOption:s}=e,n=t===void 0,a=e.flatJson,i=ua?I:Ct;let c=Ve(e.inheritLocale)?e.inheritLocale:!0;const d=i(t&&c?t.locale.value:Me(e.locale)?e.locale:Fs),m=i(t&&c?t.fallbackLocale.value:Me(e.fallbackLocale)||Ye(e.fallbackLocale)||Ne(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:d.value),u=i(wn(d.value,e)),y=i(Ne(e.datetimeFormats)?e.datetimeFormats:{[d.value]:{}}),g=i(Ne(e.numberFormats)?e.numberFormats:{[d.value]:{}});let _=t?t.missingWarn:Ve(e.missingWarn)||vs(e.missingWarn)?e.missingWarn:!0,x=t?t.fallbackWarn:Ve(e.fallbackWarn)||vs(e.fallbackWarn)?e.fallbackWarn:!0,w=t?t.fallbackRoot:Ve(e.fallbackRoot)?e.fallbackRoot:!0,$=!!e.fallbackFormat,P=Ge(e.missing)?e.missing:null,h=Ge(e.missing)?fo(e.missing):null,p=Ge(e.postTranslation)?e.postTranslation:null,C=t?t.warnHtmlMessage:Ve(e.warnHtmlMessage)?e.warnHtmlMessage:!0,S=!!e.escapeParameter;const z=t?t.modifiers:Ne(e.modifiers)?e.modifiers:{};let M=e.pluralRules||t&&t.pluralRules,D;D=(()=>{n&&to(null);const q={version:pd,locale:d.value,fallbackLocale:m.value,messages:u.value,modifiers:z,pluralRules:M,missing:h===null?void 0:h,missingWarn:_,fallbackWarn:x,fallbackFormat:$,unresolving:!0,postTranslation:p===null?void 0:p,warnHtmlMessage:C,escapeParameter:S,messageResolver:e.messageResolver,messageCompiler:e.messageCompiler,__meta:{framework:"vue"}};q.datetimeFormats=y.value,q.numberFormats=g.value,q.__datetimeFormatters=Ne(D)?D.__datetimeFormatters:void 0,q.__numberFormatters=Ne(D)?D.__numberFormatters:void 0;const R=Zc(q);return n&&to(R),R})(),Cs(D,d.value,m.value);function F(){return[d.value,m.value,u.value,y.value,g.value]}const re=X({get:()=>d.value,set:q=>{D.locale=q,d.value=q}}),ve=X({get:()=>m.value,set:q=>{D.fallbackLocale=q,m.value=q,Cs(D,d.value,q)}}),de=X(()=>u.value),L=X(()=>y.value),A=X(()=>g.value);function G(){return Ge(p)?p:null}function J(q){p=q,D.postTranslation=q}function ue(){return P}function W(q){q!==null&&(h=fo(q)),P=q,D.missing=h}const V=(q,R,xe,Se,se,Ae)=>{F();let Oe;try{__INTLIFY_PROD_DEVTOOLS__,n||(D.fallbackContext=t?Jc():void 0),Oe=q(D)}finally{__INTLIFY_PROD_DEVTOOLS__,n||(D.fallbackContext=void 0)}if(xe!=="translate exists"&&Ze(Oe)&&Oe===ba||xe==="translate exists"&&!Oe){const[st,ce]=R();return t&&w?Se(t):se(st)}else{if(Ae(Oe))return Oe;throw yt(ht.UNEXPECTED_RETURN_TYPE)}};function H(...q){return V(R=>Reflect.apply(co,null,[R,...q]),()=>Ga(...q),"translate",R=>Reflect.apply(R.t,R,[...q]),R=>R,R=>Me(R))}function ae(...q){const[R,xe,Se]=q;if(Se&&!He(Se))throw yt(ht.INVALID_ARGUMENT);return H(R,xe,nt({resolvedMessage:!0},Se||{}))}function K(...q){return V(R=>Reflect.apply(ao,null,[R,...q]),()=>qa(...q),"datetime format",R=>Reflect.apply(R.d,R,[...q]),()=>Zn,R=>Me(R)||Ye(R))}function ee(...q){return V(R=>Reflect.apply(oo,null,[R,...q]),()=>Ka(...q),"number format",R=>Reflect.apply(R.n,R,[...q]),()=>Zn,R=>Me(R)||Ye(R))}function fe(q){return q.map(R=>Me(R)||Ze(R)||Ve(R)?uo(String(R)):R)}const le={normalize:fe,interpolate:q=>q,type:"vnode"};function B(...q){return V(R=>{let xe;const Se=R;try{Se.processor=le,xe=Reflect.apply(co,null,[Se,...q])}finally{Se.processor=null}return xe},()=>Ga(...q),"translate",R=>R[Xa](...q),R=>[uo(R)],R=>Ye(R))}function N(...q){return V(R=>Reflect.apply(oo,null,[R,...q]),()=>Ka(...q),"number format",R=>R[Qa](...q),go,R=>Me(R)||Ye(R))}function T(...q){return V(R=>Reflect.apply(ao,null,[R,...q]),()=>qa(...q),"datetime format",R=>R[Ya](...q),go,R=>Me(R)||Ye(R))}function U(q){M=q,D.pluralRules=M}function Z(q,R){return V(()=>{if(!q)return!1;const xe=Me(R)?R:d.value,Se=pe(xe),se=D.messageResolver(Se,q);return Et(se)||wt(se)||Me(se)},()=>[q],"translate exists",xe=>Reflect.apply(xe.te,xe,[q,R]),hd,xe=>Ve(xe))}function oe(q){let R=null;const xe=zr(D,m.value,d.value);for(let Se=0;Se<xe.length;Se++){const se=u.value[xe[Se]]||{},Ae=D.messageResolver(se,q);if(Ae!=null){R=Ae;break}}return R}function me(q){const R=oe(q);return R??(t?t.tm(q)||{}:{})}function pe(q){return u.value[q]||{}}function _e(q,R){if(a){const xe={[q]:R};for(const Se in xe)At(xe,Se)&&Ns(xe[Se]);R=xe[q]}u.value[q]=R,D.messages=u.value}function be(q,R){u.value[q]=u.value[q]||{};const xe={[q]:R};if(a)for(const Se in xe)At(xe,Se)&&Ns(xe[Se]);R=xe[q],sa(R,u.value[q]),D.messages=u.value}function ge(q){return y.value[q]||{}}function b(q,R){y.value[q]=R,D.datetimeFormats=y.value,no(D,q,R)}function O(q,R){y.value[q]=nt(y.value[q]||{},R),D.datetimeFormats=y.value,no(D,q,R)}function Q(q){return g.value[q]||{}}function ie(q,R){g.value[q]=R,D.numberFormats=g.value,ro(D,q,R)}function ye(q,R){g.value[q]=nt(g.value[q]||{},R),D.numberFormats=g.value,ro(D,q,R)}po++,t&&ua&&(Ue(t.locale,q=>{c&&(d.value=q,D.locale=q,Cs(D,d.value,m.value))}),Ue(t.fallbackLocale,q=>{c&&(m.value=q,D.fallbackLocale=q,Cs(D,d.value,m.value))}));const j={id:po,locale:re,fallbackLocale:ve,get inheritLocale(){return c},set inheritLocale(q){c=q,q&&t&&(d.value=t.locale.value,m.value=t.fallbackLocale.value,Cs(D,d.value,m.value))},get availableLocales(){return Object.keys(u.value).sort()},messages:de,get modifiers(){return z},get pluralRules(){return M||{}},get isGlobal(){return n},get missingWarn(){return _},set missingWarn(q){_=q,D.missingWarn=_},get fallbackWarn(){return x},set fallbackWarn(q){x=q,D.fallbackWarn=x},get fallbackRoot(){return w},set fallbackRoot(q){w=q},get fallbackFormat(){return $},set fallbackFormat(q){$=q,D.fallbackFormat=$},get warnHtmlMessage(){return C},set warnHtmlMessage(q){C=q,D.warnHtmlMessage=q},get escapeParameter(){return S},set escapeParameter(q){S=q,D.escapeParameter=q},t:H,getLocaleMessage:pe,setLocaleMessage:_e,mergeLocaleMessage:be,getPostTranslationHandler:G,setPostTranslationHandler:J,getMissingHandler:ue,setMissingHandler:W,[Jr]:U};return j.datetimeFormats=L,j.numberFormats=A,j.rt=ae,j.te=Z,j.tm=me,j.d=K,j.n=ee,j.getDateTimeFormat=ge,j.setDateTimeFormat=b,j.mergeDateTimeFormat=O,j.getNumberFormat=Q,j.setNumberFormat=ie,j.mergeNumberFormat=ye,j[Zr]=s,j[Xa]=B,j[Ya]=T,j[Qa]=N,j}function yd(e){const t=Me(e.locale)?e.locale:Fs,s=Me(e.fallbackLocale)||Ye(e.fallbackLocale)||Ne(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:t,n=Ge(e.missing)?e.missing:void 0,a=Ve(e.silentTranslationWarn)||vs(e.silentTranslationWarn)?!e.silentTranslationWarn:!0,i=Ve(e.silentFallbackWarn)||vs(e.silentFallbackWarn)?!e.silentFallbackWarn:!0,c=Ve(e.fallbackRoot)?e.fallbackRoot:!0,d=!!e.formatFallbackMessages,m=Ne(e.modifiers)?e.modifiers:{},u=e.pluralizationRules,y=Ge(e.postTranslation)?e.postTranslation:void 0,g=Me(e.warnHtmlInMessage)?e.warnHtmlInMessage!=="off":!0,_=!!e.escapeParameterHtml,x=Ve(e.sync)?e.sync:!0;let w=e.messages;if(Ne(e.sharedMessages)){const z=e.sharedMessages;w=Object.keys(z).reduce((D,E)=>{const F=D[E]||(D[E]={});return nt(F,z[E]),D},w||{})}const{__i18n:$,__root:P,__injectWithOption:h}=e,p=e.datetimeFormats,C=e.numberFormats,S=e.flatJson;return{locale:t,fallbackLocale:s,messages:w,flatJson:S,datetimeFormats:p,numberFormats:C,missing:n,missingWarn:a,fallbackWarn:i,fallbackRoot:c,fallbackFormat:d,modifiers:m,pluralRules:u,postTranslation:y,warnHtmlMessage:g,escapeParameter:_,messageResolver:e.messageResolver,inheritLocale:x,__i18n:$,__root:P,__injectWithOption:h}}function Za(e={}){const t=Sn(yd(e)),{__extender:s}=e,n={id:t.id,get locale(){return t.locale.value},set locale(a){t.locale.value=a},get fallbackLocale(){return t.fallbackLocale.value},set fallbackLocale(a){t.fallbackLocale.value=a},get messages(){return t.messages.value},get datetimeFormats(){return t.datetimeFormats.value},get numberFormats(){return t.numberFormats.value},get availableLocales(){return t.availableLocales},get missing(){return t.getMissingHandler()},set missing(a){t.setMissingHandler(a)},get silentTranslationWarn(){return Ve(t.missingWarn)?!t.missingWarn:t.missingWarn},set silentTranslationWarn(a){t.missingWarn=Ve(a)?!a:a},get silentFallbackWarn(){return Ve(t.fallbackWarn)?!t.fallbackWarn:t.fallbackWarn},set silentFallbackWarn(a){t.fallbackWarn=Ve(a)?!a:a},get modifiers(){return t.modifiers},get formatFallbackMessages(){return t.fallbackFormat},set formatFallbackMessages(a){t.fallbackFormat=a},get postTranslation(){return t.getPostTranslationHandler()},set postTranslation(a){t.setPostTranslationHandler(a)},get sync(){return t.inheritLocale},set sync(a){t.inheritLocale=a},get warnHtmlInMessage(){return t.warnHtmlMessage?"warn":"off"},set warnHtmlInMessage(a){t.warnHtmlMessage=a!=="off"},get escapeParameterHtml(){return t.escapeParameter},set escapeParameterHtml(a){t.escapeParameter=a},get pluralizationRules(){return t.pluralRules||{}},__composer:t,t(...a){return Reflect.apply(t.t,t,[...a])},rt(...a){return Reflect.apply(t.rt,t,[...a])},te(a,i){return t.te(a,i)},tm(a){return t.tm(a)},getLocaleMessage(a){return t.getLocaleMessage(a)},setLocaleMessage(a,i){t.setLocaleMessage(a,i)},mergeLocaleMessage(a,i){t.mergeLocaleMessage(a,i)},d(...a){return Reflect.apply(t.d,t,[...a])},getDateTimeFormat(a){return t.getDateTimeFormat(a)},setDateTimeFormat(a,i){t.setDateTimeFormat(a,i)},mergeDateTimeFormat(a,i){t.mergeDateTimeFormat(a,i)},n(...a){return Reflect.apply(t.n,t,[...a])},getNumberFormat(a){return t.getNumberFormat(a)},setNumberFormat(a,i){t.setNumberFormat(a,i)},mergeNumberFormat(a,i){t.mergeNumberFormat(a,i)}};return n.__extender=s,n}function bd(e,t,s){return{beforeCreate(){const n=Us();if(!n)throw yt(ht.UNEXPECTED_ERROR);const a=this.$options;if(a.i18n){const i=a.i18n;if(a.__i18n&&(i.__i18n=a.__i18n),i.__root=t,this===this.$root)this.$i18n=ho(e,i);else{i.__injectWithOption=!0,i.__extender=s.__vueI18nExtend,this.$i18n=Za(i);const c=this.$i18n;c.__extender&&(c.__disposer=c.__extender(this.$i18n))}}else if(a.__i18n)if(this===this.$root)this.$i18n=ho(e,a);else{this.$i18n=Za({__i18n:a.__i18n,__injectWithOption:!0,__extender:s.__vueI18nExtend,__root:t});const i=this.$i18n;i.__extender&&(i.__disposer=i.__extender(this.$i18n))}else this.$i18n=e;a.__i18nGlobal&&ti(t,a,a),this.$t=(...i)=>this.$i18n.t(...i),this.$rt=(...i)=>this.$i18n.rt(...i),this.$te=(i,c)=>this.$i18n.te(i,c),this.$d=(...i)=>this.$i18n.d(...i),this.$n=(...i)=>this.$i18n.n(...i),this.$tm=i=>this.$i18n.tm(i),s.__setInstance(n,this.$i18n)},mounted(){},unmounted(){const n=Us();if(!n)throw yt(ht.UNEXPECTED_ERROR);const a=this.$i18n;delete this.$t,delete this.$rt,delete this.$te,delete this.$d,delete this.$n,delete this.$tm,a.__disposer&&(a.__disposer(),delete a.__disposer,delete a.__extender),s.__deleteInstance(n),delete this.$i18n}}}function ho(e,t){e.locale=t.locale||e.locale,e.fallbackLocale=t.fallbackLocale||e.fallbackLocale,e.missing=t.missing||e.missing,e.silentTranslationWarn=t.silentTranslationWarn||e.silentFallbackWarn,e.silentFallbackWarn=t.silentFallbackWarn||e.silentFallbackWarn,e.formatFallbackMessages=t.formatFallbackMessages||e.formatFallbackMessages,e.postTranslation=t.postTranslation||e.postTranslation,e.warnHtmlInMessage=t.warnHtmlInMessage||e.warnHtmlInMessage,e.escapeParameterHtml=t.escapeParameterHtml||e.escapeParameterHtml,e.sync=t.sync||e.sync,e.__composer[Jr](t.pluralizationRules||e.pluralizationRules);const s=wn(e.locale,{messages:t.messages,__i18n:t.__i18n});return Object.keys(s).forEach(n=>e.mergeLocaleMessage(n,s[n])),t.datetimeFormats&&Object.keys(t.datetimeFormats).forEach(n=>e.mergeDateTimeFormat(n,t.datetimeFormats[n])),t.numberFormats&&Object.keys(t.numberFormats).forEach(n=>e.mergeNumberFormat(n,t.numberFormats[n])),e}const Cn={tag:{type:[String,Object]},locale:{type:String},scope:{type:String,validator:e=>e==="parent"||e==="global",default:"parent"},i18n:{type:Object}};function _d({slots:e},t){return t.length===1&&t[0]==="default"?(e.default?e.default():[]).reduce((n,a)=>[...n,...a.type===Pe?a.children:[a]],[]):t.reduce((s,n)=>{const a=e[n];return a&&(s[n]=a()),s},qe())}function si(){return Pe}const xd=Re({name:"i18n-t",props:nt({keypath:{type:String,required:!0},plural:{type:[Number,String],validator:e=>Ze(e)||!isNaN(e)}},Cn),setup(e,t){const{slots:s,attrs:n}=t,a=e.i18n||Fe({useScope:e.scope,__useComponent:!0});return()=>{const i=Object.keys(s).filter(g=>g[0]!=="_"),c=qe();e.locale&&(c.locale=e.locale),e.plural!==void 0&&(c.plural=Me(e.plural)?+e.plural:e.plural);const d=_d(t,i),m=a[Xa](e.keypath,d,c),u=nt(qe(),n),y=Me(e.tag)||He(e.tag)?e.tag:si();return fr(y,u,m)}}}),vo=xd;function kd(e){return Ye(e)&&!Me(e[0])}function ai(e,t,s,n){const{slots:a,attrs:i}=t;return()=>{const c={part:!0};let d=qe();e.locale&&(c.locale=e.locale),Me(e.format)?c.key=e.format:He(e.format)&&(Me(e.format.key)&&(c.key=e.format.key),d=Object.keys(e.format).reduce((_,x)=>s.includes(x)?nt(qe(),_,{[x]:e.format[x]}):_,qe()));const m=n(e.value,c,d);let u=[c.key];Ye(m)?u=m.map((_,x)=>{const w=a[_.type],$=w?w({[_.type]:_.value,index:x,parts:m}):[_.value];return kd($)&&($[0].key=`${_.type}-${x}`),$}):Me(m)&&(u=[m]);const y=nt(qe(),i),g=Me(e.tag)||He(e.tag)?e.tag:si();return fr(g,y,u)}}const wd=Re({name:"i18n-n",props:nt({value:{type:Number,required:!0},format:{type:[String,Object]}},Cn),setup(e,t){const s=e.i18n||Fe({useScope:e.scope,__useComponent:!0});return ai(e,t,Xr,(...n)=>s[Qa](...n))}}),yo=wd;function Sd(e,t){const s=e;if(e.mode==="composition")return s.__getInstance(t)||e.global;{const n=s.__getInstance(t);return n!=null?n.__composer:e.global.__composer}}function Cd(e){const t=c=>{const{instance:d,value:m}=c;if(!d||!d.$)throw yt(ht.UNEXPECTED_ERROR);const u=Sd(e,d.$),y=bo(m);return[Reflect.apply(u.t,u,[..._o(y)]),u]};return{created:(c,d)=>{const[m,u]=t(d);ua&&e.global===u&&(c.__i18nWatcher=Ue(u.locale,()=>{d.instance&&d.instance.$forceUpdate()})),c.__composer=u,c.textContent=m},unmounted:c=>{ua&&c.__i18nWatcher&&(c.__i18nWatcher(),c.__i18nWatcher=void 0,delete c.__i18nWatcher),c.__composer&&(c.__composer=void 0,delete c.__composer)},beforeUpdate:(c,{value:d})=>{if(c.__composer){const m=c.__composer,u=bo(d);c.textContent=Reflect.apply(m.t,m,[..._o(u)])}},getSSRProps:c=>{const[d]=t(c);return{textContent:d}}}}function bo(e){if(Me(e))return{path:e};if(Ne(e)){if(!("path"in e))throw yt(ht.REQUIRED_VALUE,"path");return e}else throw yt(ht.INVALID_VALUE)}function _o(e){const{path:t,locale:s,args:n,choice:a,plural:i}=e,c={},d=n||{};return Me(s)&&(c.locale=s),Ze(a)&&(c.plural=a),Ze(i)&&(c.plural=i),[t,d,c]}function Id(e,t,...s){const n=Ne(s[0])?s[0]:{};(!Ve(n.globalInstall)||n.globalInstall)&&([vo.name,"I18nT"].forEach(i=>e.component(i,vo)),[yo.name,"I18nN"].forEach(i=>e.component(i,yo)),[ko.name,"I18nD"].forEach(i=>e.component(i,ko))),e.directive("t",Cd(t))}const Md=Jt("global-vue-i18n");function Td(e={}){const t=__VUE_I18N_LEGACY_API__&&Ve(e.legacy)?e.legacy:__VUE_I18N_LEGACY_API__,s=Ve(e.globalInjection)?e.globalInjection:!0,n=new Map,[a,i]=Ad(e,t),c=Jt("");function d(g){return n.get(g)||null}function m(g,_){n.set(g,_)}function u(g){n.delete(g)}const y={get mode(){return __VUE_I18N_LEGACY_API__&&t?"legacy":"composition"},async install(g,..._){if(g.__VUE_I18N_SYMBOL__=c,g.provide(g.__VUE_I18N_SYMBOL__,y),Ne(_[0])){const $=_[0];y.__composerExtend=$.__composerExtend,y.__vueI18nExtend=$.__vueI18nExtend}let x=null;!t&&s&&(x=Nd(g,y.global)),__VUE_I18N_FULL_INSTALL__&&Id(g,y,..._),__VUE_I18N_LEGACY_API__&&t&&g.mixin(bd(i,i.__composer,y));const w=g.unmount;g.unmount=()=>{x&&x(),y.dispose(),w()}},get global(){return i},dispose(){a.stop()},__instances:n,__getInstance:d,__setInstance:m,__deleteInstance:u};return y}function Fe(e={}){const t=Us();if(t==null)throw yt(ht.MUST_BE_CALL_SETUP_TOP);if(!t.isCE&&t.appContext.app!=null&&!t.appContext.app.__VUE_I18N_SYMBOL__)throw yt(ht.NOT_INSTALLED);const s=$d(t),n=Dd(s),a=ei(t),i=Pd(e,a);if(i==="global")return ti(n,e,a),n;if(i==="parent"){let m=Ld(s,t,e.__useComponent);return m==null&&(m=n),m}const c=s;let d=c.__getInstance(t);if(d==null){const m=nt({},e);"__i18n"in a&&(m.__i18n=a.__i18n),n&&(m.__root=n),d=Sn(m),c.__composerExtend&&(d[Ja]=c.__composerExtend(d)),Ed(c,t,d),c.__setInstance(t,d)}return d}function Ad(e,t){const s=un(),n=__VUE_I18N_LEGACY_API__&&t?s.run(()=>Za(e)):s.run(()=>Sn(e));if(n==null)throw yt(ht.UNEXPECTED_ERROR);return[s,n]}function $d(e){const t=cn(e.isCE?Md:e.appContext.app.__VUE_I18N_SYMBOL__);if(!t)throw yt(e.isCE?ht.NOT_INSTALLED_WITH_PROVIDE:ht.UNEXPECTED_ERROR);return t}function Pd(e,t){return va(e)?"__i18n"in t?"local":"global":e.useScope?e.useScope:"local"}function Dd(e){return e.mode==="composition"?e.global:e.global.__composer}function Ld(e,t,s=!1){let n=null;const a=t.root;let i=Rd(t,s);for(;i!=null;){const c=e;if(e.mode==="composition")n=c.__getInstance(i);else if(__VUE_I18N_LEGACY_API__){const d=c.__getInstance(i);d!=null&&(n=d.__composer,s&&n&&!n[Zr]&&(n=null))}if(n!=null||a===i)break;i=i.parent}return n}function Rd(e,t=!1){return e==null?null:t&&e.vnode.ctx||e.parent}function Ed(e,t,s){tt(()=>{},t),Qt(()=>{const n=s;e.__deleteInstance(t);const a=n[Ja];a&&(a(),delete n[Ja])},t)}const Fd=["locale","fallbackLocale","availableLocales"],xo=["t","rt","d","n","tm","te"];function Nd(e,t){const s=Object.create(null);return Fd.forEach(a=>{const i=Object.getOwnPropertyDescriptor(t,a);if(!i)throw yt(ht.UNEXPECTED_ERROR);const c=rt(i.value)?{get(){return i.value.value},set(d){i.value.value=d}}:{get(){return i.get&&i.get()}};Object.defineProperty(s,a,c)}),e.config.globalProperties.$i18n=s,xo.forEach(a=>{const i=Object.getOwnPropertyDescriptor(t,a);if(!i||!i.value)throw yt(ht.UNEXPECTED_ERROR);Object.defineProperty(e.config.globalProperties,`$${a}`,i)}),()=>{delete e.config.globalProperties.$i18n,xo.forEach(a=>{delete e.config.globalProperties[`$${a}`]})}}const Ud=Re({name:"i18n-d",props:nt({value:{type:[Number,Date],required:!0},format:{type:[String,Object]}},Cn),setup(e,t){const s=e.i18n||Fe({useScope:e.scope,__useComponent:!0});return ai(e,t,Gr,(...n)=>s[Ya](...n))}}),ko=Ud;fd();Kc(Tc);Gc(Wc);Xc(zr);if(__INTLIFY_PROD_DEVTOOLS__){const e=os();e.__INTLIFY__=!0,Ac(e.__INTLIFY_DEVTOOLS_GLOBAL_HOOK__)}const Od={class:"title-bar"},Vd={key:0,class:"traffic-light-spacer"},Hd={key:1,class:"window-controls"},zd={key:0,width:"10",height:"10",viewBox:"0 0 10 10"},Bd={key:1,width:"10",height:"10",viewBox:"0 0 10 10"},Wd=Re({__name:"TitleBar",setup(e){const t=I(!1),s=I(!1),n=I(!1);tt(()=>{t.value=navigator.platform.toLowerCase().includes("mac"),n.value=navigator.platform.toLowerCase().includes("win"),window.electron?.ipcRenderer?.on("windowState",(d,m)=>{s.value=m})});function a(){window.electron?.ipcRenderer?.send("window-min")}function i(){window.electron?.ipcRenderer?.send("window-maxOrRestore")}function c(){window.electron?.ipcRenderer?.send("window-close")}return(d,m)=>(v(),k("div",Od,[t.value?(v(),k("div",Vd)):ne("",!0),m[4]||(m[4]=r("div",{class:"drag-region"},null,-1)),!t.value&&!n.value?(v(),k("div",Hd,[r("button",{class:"control-btn",onClick:a},[...m[0]||(m[0]=[r("svg",{width:"10",height:"1",viewBox:"0 0 10 1"},[r("path",{d:"M0 0h10v1H0z",fill:"currentColor"})],-1)])]),r("button",{class:"control-btn",onClick:i},[s.value?(v(),k("svg",Bd,[...m[2]||(m[2]=[r("path",{d:"M2 0v2H0v8h8V8h2V0H2zm1 3h5v5H1V3h2z",fill:"currentColor"},null,-1)])])):(v(),k("svg",zd,[...m[1]||(m[1]=[r("path",{d:"M0 0v10h10V0H0zm1 1h8v8H1V1z",fill:"currentColor"},null,-1)])]))]),r("button",{class:"control-btn control-btn-close",onClick:c},[...m[3]||(m[3]=[r("svg",{width:"10",height:"10",viewBox:"0 0 10 10"},[r("path",{d:"M1.41 0L0 1.41 3.59 5 0 8.59 1.41 10 5 6.41 8.59 10 10 8.59 6.41 5 10 1.41 8.59 0 5 3.59z",fill:"currentColor"})],-1)])])])):ne("",!0)]))}}),ks=(e,t)=>{const s=e.__vccOpts||e;for(const[n,a]of t)s[n]=a;return s},jd=ks(Wd,[["__scopeId","data-v-26ce777c"]]),Bt=Nt("layout",()=>{const e=I(!1),t=I(!1),s=I(null),n=I(!1),a=I(null),i=I(!1),c=I(!1),d=I("header"),m=I(!1),u=I(!1),y=I(!1),g=I("settings"),_=I(null);function x(){e.value=!e.value}function w(D){s.value=D,t.value=!0}function $(){t.value=!1,setTimeout(()=>{s.value=null},300)}function P(D){a.value=D,n.value=!0}function h(){n.value=!1,setTimeout(()=>{a.value=null},300)}function p(){i.value=!i.value}function C(){m.value=!m.value}function S(D,E){g.value=D||"settings",_.value=E||null,y.value=!0}function z(){y.value=!1}function M(){c.value=!c.value,c.value&&(i.value=!1)}return{isSidebarCollapsed:e,isToolsPanelLocked:i,isToolsPanelMini:c,toolsPanelPosition:d,isToolsPanelOpen:m,showScreenCaptureModal:t,screenCaptureImage:s,showChatRecordDrawer:n,chatRecordQuery:a,screenshotMobileAdapt:u,showSettings:y,settingsTab:g,settingsSubTab:_,toggleSidebar:x,toggleToolsPanelLock:p,toggleToolsPanelOpen:C,toggleToolsPanelMini:M,openScreenCaptureModal:w,closeScreenCaptureModal:$,openChatRecordDrawer:P,closeChatRecordDrawer:h,openSettings:S,closeSettings:z}},{persist:[{pick:["isSidebarCollapsed","screenshotMobileAdapt","isToolsPanelLocked","isToolsPanelMini","toolsPanelPosition"],storage:localStorage}]}),qd={class:"truncate text-xs font-medium"},ni=Re({__name:"SidebarButton",props:{icon:{},title:{},active:{type:Boolean,default:!1},tooltip:{default:""}},setup(e){const t=Bt(),{isSidebarCollapsed:s}=et(t);return(n,a)=>{const i=We,c=Vs,d=Ke;return o(s)?(v(),Te(c,{key:0,text:e.tooltip||e.title,content:{side:"right"}},{default:te(()=>[r("div",{class:$e(["flex h-9 w-9 cursor-pointer items-center justify-center rounded-xl mx-auto transition-all duration-200",[e.active?"bg-gray-200/50 dark:bg-gray-800/80 text-gray-900 dark:text-white":"text-gray-600 dark:text-gray-300 hover:bg-gray-200/40 dark:hover:bg-gray-800/40"]])},[f(i,{name:e.icon,class:"h-5 w-5 shrink-0"},null,8,["name"])],2)]),_:1},8,["text"])):(v(),Te(d,{key:1,class:$e(["transition-all duration-200 rounded-xl hover:bg-gray-200/40 dark:hover:bg-gray-800/40 h-10 cursor-pointer justify-start pl-1.5 w-[calc(100%-8px)]",[e.active?"bg-gray-200/50 dark:bg-gray-800/80 text-gray-900 dark:text-white font-medium":"text-gray-600 dark:text-gray-300"]]),color:"gray",variant:"ghost"},{default:te(()=>[f(i,{name:e.icon,class:"mr-2.5 h-5 w-5 shrink-0"},null,8,["name"]),r("span",qd,l(e.title),1)]),_:1},8,["class"]))}}}),Kd=Re({__name:"SidebarFooter",setup(e){const{t}=Fe(),s=Bt(),{showSettings:n,isSidebarCollapsed:a}=et(s);return(i,c)=>(v(),k("div",{class:$e(["py-2 dark:border-gray-800 space-y-2 mb-2",[o(a)?"px-3":"px-4"]])},[f(ni,{icon:"i-heroicons-cog-6-tooth",title:o(t)("layout.footer.settings"),active:o(n),tooltip:o(t)("layout.footer.settings"),onClick:c[0]||(c[0]=d=>o(s).openSettings())},null,8,["title","active","tooltip"])],2))}}),lt=!1;let Ft="/_web",oi="",en,Os;function ri(e){e.baseUrl!==void 0&&(Ft=e.baseUrl),e.token!==void 0&&(oi=e.token),e.getToken!==void 0&&(en=e.getToken??void 0),e.on401!==void 0&&(Os=e.on401??void 0)}function ii(){return en?en():oi}function ws(){const e=ii();return e?{Authorization:`Bearer ${e}`}:{}}function Gd(){return Ft}function Xd(e){if(!Ft.startsWith("http://")&&!Ft.startsWith("https://")||e.startsWith("http://")||e.startsWith("https://"))return e;try{return`${new URL(Ft).origin}${e}`}catch{return e}}async function Rt(e,t){const s=new Headers(t?.headers),n=ii();n&&!s.has("Authorization")&&s.set("Authorization",`Bearer ${n}`);const a=Xd(e),i=await fetch(a,{...t,headers:s});return i.status===401&&Os&&Os(),i}function Bs(e){e.status===401&&Os&&Os()}async function As(e,t){const s=await fetch(`${Ft}${e}`,{headers:ws(),signal:t});if(Bs(s),!s.ok){const n=await s.text().catch(()=>"");throw new Error(`HTTP ${s.status}: ${n}`)}return s.json()}async function ps(e,t,s){const n=t!==void 0,a=await fetch(`${Ft}${e}`,{method:"POST",headers:{...ws(),...n&&{"Content-Type":"application/json"}},...n&&{body:JSON.stringify(t)},signal:s});if(Bs(a),!a.ok){const i=await a.text().catch(()=>"");throw new Error(`HTTP ${a.status}: ${i}`)}return a.json()}let ma=new AbortController;function Yd(){ma.abort(),ma=new AbortController}function li(e){return e instanceof DOMException&&e.name==="AbortError"}function ci(){return new Promise(()=>{})}function Qd(e){return As(e,ma.signal).catch(t=>{if(li(t))return ci();throw t})}function Jd(e,t){return ps(e,t,ma.signal).catch(s=>{if(li(s))return ci();throw s})}async function Zd(e){const t=await fetch(`${Ft}${e}`,{method:"DELETE",headers:ws()});if(Bs(t),!t.ok){const s=await t.text().catch(()=>"");throw new Error(`HTTP ${t.status}: ${s}`)}return t.json()}async function di(e,t){const s=t!==void 0,n=await fetch(`${Ft}${e}`,{method:"PUT",headers:{...ws(),...s&&{"Content-Type":"application/json"}},...s&&{body:JSON.stringify(t)}});if(Bs(n),!n.ok){const a=await n.text().catch(()=>"");throw new Error(`HTTP ${n.status}: ${a}`)}return n.json()}async function eu(e,t){const s=t!==void 0,n=await fetch(`${Ft}${e}`,{method:"PATCH",headers:{...ws(),...s&&{"Content-Type":"application/json"}},...s&&{body:JSON.stringify(t)}});if(Bs(n),!n.ok){const a=await n.text().catch(()=>"");throw new Error(`HTTP ${n.status}: ${a}`)}return n.json()}const tu=Object.freeze(Object.defineProperty({__proto__:null,abortAnalyticsRequests:Yd,analyticsGet:Qd,analyticsPost:Jd,configureHttpClient:ri,del:Zd,fetchWithAuth:Rt,get:As,getAuthHeaders:ws,getBaseUrl:Gd,patch:eu,post:ps,put:di},Symbol.toStringTag,{value:"Module"}));function su(){return"web-serve"}const ui=new Map;let wo=!1;function Xe(e,t){ui.set(e,t)}function Pt(e){const t=ui.get(e);if(!t)throw new Error(`[services] Adapter "${e}" not registered. Call initServices() first.`);return t}async function au(){if(wo)return;switch(su()){case"electron":await nu();break;case"web-serve":await ou();break;case"web-browser":await iu();break}wo=!0}async function nu(){const{FetchDataAdapter:e}=await je(async()=>{const{FetchDataAdapter:g}=await import("./fetch-BIpjJHxj.js");return{FetchDataAdapter:g}},__vite__mapDeps([0,1,2,3]));Xe("data",new e);const{ElectronImportAdapter:t}=await je(async()=>{const{ElectronImportAdapter:g}=await import("./electron-2m4Vdk2z.js");return{ElectronImportAdapter:g}},[]);Xe("import",new t);const{FetchSessionIndexAdapter:s}=await je(async()=>{const{FetchSessionIndexAdapter:g}=await import("./fetch-DSN-QYZE.js");return{FetchSessionIndexAdapter:g}},__vite__mapDeps([4,1,2,3]));Xe("session-index",new s);const{FetchMessageAdapter:n}=await je(async()=>{const{FetchMessageAdapter:g}=await import("./fetch-woAa3H2L.js");return{FetchMessageAdapter:g}},__vite__mapDeps([5,1,2,3]));Xe("message",new n);const{ElectronPlatformAdapter:a}=await je(async()=>{const{ElectronPlatformAdapter:g}=await import("./electron-CRSL7qPM.js");return{ElectronPlatformAdapter:g}},[]);Xe("platform",new a);const{ElectronAIAdapter:i}=await je(async()=>{const{ElectronAIAdapter:g}=await import("./electron-BRUg9LnY.js");return{ElectronAIAdapter:g}},__vite__mapDeps([6,7,1,2,3]));Xe("ai",new i);const{FetchPreferencesAdapter:c}=await je(async()=>{const{FetchPreferencesAdapter:g}=await import("./fetch-BRsMdFcn.js");return{FetchPreferencesAdapter:g}},__vite__mapDeps([8,1,2,3]));Xe("preferences",new c);const{FetchLLMAdapter:d}=await je(async()=>{const{FetchLLMAdapter:g}=await import("./fetch-DE8gj5Ke.js");return{FetchLLMAdapter:g}},__vite__mapDeps([9,1,2,3]));Xe("llm",new d);const{FetchAssistantAdapter:m}=await je(async()=>{const{FetchAssistantAdapter:g}=await import("./fetch-DNSaxRnL.js");return{FetchAssistantAdapter:g}},__vite__mapDeps([10,1,2,3]));Xe("assistant-crud",new m);const{FetchSkillAdapter:u}=await je(async()=>{const{FetchSkillAdapter:g}=await import("./fetch-C-m3IysH.js");return{FetchSkillAdapter:g}},__vite__mapDeps([11,1,2,3]));Xe("skill-crud",new u);const{FetchCacheAdapter:y}=await je(async()=>{const{FetchCacheAdapter:g}=await import("./fetch-Cma-mZjd.js");return{FetchCacheAdapter:g}},__vite__mapDeps([12,1,2,3]));Xe("cache",new y),mi("electron")}async function ou(){const{FetchDataAdapter:e}=await je(async()=>{const{FetchDataAdapter:g}=await import("./fetch-BIpjJHxj.js");return{FetchDataAdapter:g}},__vite__mapDeps([0,1,2,3]));Xe("data",new e);const{FetchImportAdapter:t}=await je(async()=>{const{FetchImportAdapter:g}=await import("./fetch-DOEbyLSD.js");return{FetchImportAdapter:g}},__vite__mapDeps([13,1,2,3]));Xe("import",new t);const{FetchSessionIndexAdapter:s}=await je(async()=>{const{FetchSessionIndexAdapter:g}=await import("./fetch-DSN-QYZE.js");return{FetchSessionIndexAdapter:g}},__vite__mapDeps([4,1,2,3]));Xe("session-index",new s);const{FetchMessageAdapter:n}=await je(async()=>{const{FetchMessageAdapter:g}=await import("./fetch-woAa3H2L.js");return{FetchMessageAdapter:g}},__vite__mapDeps([5,1,2,3]));Xe("message",new n);const{WebPlatformAdapter:a}=await je(async()=>{const{WebPlatformAdapter:g}=await import("./web-C2UtGskd.js");return{WebPlatformAdapter:g}},__vite__mapDeps([14,1,2,3]));Xe("platform",new a);const{FetchAIAdapter:i}=await je(async()=>{const{FetchAIAdapter:g}=await import("./fetch-DLAp7h55.js");return{FetchAIAdapter:g}},__vite__mapDeps([7,1,2,3]));Xe("ai",new i);const{FetchPreferencesAdapter:c}=await je(async()=>{const{FetchPreferencesAdapter:g}=await import("./fetch-BRsMdFcn.js");return{FetchPreferencesAdapter:g}},__vite__mapDeps([8,1,2,3]));Xe("preferences",new c);const{FetchLLMAdapter:d}=await je(async()=>{const{FetchLLMAdapter:g}=await import("./fetch-DE8gj5Ke.js");return{FetchLLMAdapter:g}},__vite__mapDeps([9,1,2,3]));Xe("llm",new d);const{FetchAssistantAdapter:m}=await je(async()=>{const{FetchAssistantAdapter:g}=await import("./fetch-DNSaxRnL.js");return{FetchAssistantAdapter:g}},__vite__mapDeps([10,1,2,3]));Xe("assistant-crud",new m);const{FetchSkillAdapter:u}=await je(async()=>{const{FetchSkillAdapter:g}=await import("./fetch-C-m3IysH.js");return{FetchSkillAdapter:g}},__vite__mapDeps([11,1,2,3]));Xe("skill-crud",new u);const{FetchCacheAdapter:y}=await je(async()=>{const{FetchCacheAdapter:g}=await import("./fetch-Cma-mZjd.js");return{FetchCacheAdapter:g}},__vite__mapDeps([12,1,2,3]));Xe("cache",new y),await ru()}async function ru(){mi("web-serve")}function mi(e){const t=new Map,s=i=>/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(i),n=i=>t.get(i)??i;async function a(i,c){if(!i.ok){const d=await i.text().catch(()=>"");throw new Error(`[mergeApi] ${c} failed (${i.status}): ${d}`)}}window.mergeApi={exportSessionsToTempFiles:async i=>{try{const c=await Rt("/_web/sessions/export-for-merge",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionIds:i})});await a(c,"exportSessionsToTempFiles");const d=await c.json();return d.success?{success:!0,tempFiles:d.handles.map(u=>u.handle)}:{success:!1,tempFiles:[],error:d.error}}catch(c){return{success:!1,tempFiles:[],error:c instanceof Error?c.message:String(c)}}},cleanupTempExportFiles:async i=>{try{for(const c of i){const d=n(c);await Rt("/_web/merge/clear",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({handle:d})}),t.delete(c)}return{success:!0}}catch(c){return{success:!1,error:c instanceof Error?c.message:String(c)}}},parseFileInfo:async i=>{if(s(i)||t.has(i))return{name:"",format:"",platform:"",messageCount:0,memberCount:0,fileSize:0};if(e==="electron"){const c=await Rt("/_web/merge/parse",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:i})});await a(c,"parseFileInfo");const d=await c.json();if(!d.handle)throw new Error("Parse succeeded but no handle returned");return t.set(i,d.handle),d}return{name:"",format:"",platform:"",messageCount:0,memberCount:0,fileSize:0}},checkConflicts:async i=>{const c=i.map(n),d=await Rt("/_web/merge/conflicts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({handles:c})});return await a(d,"checkConflicts"),await d.json()},mergeFiles:async i=>{try{const c=i.filePaths.map(n),d=await Rt("/_web/merge/execute",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({handles:c,outputName:i.outputName,format:i.outputFormat||"json",andImport:i.andAnalyze??!1})});await a(d,"mergeFiles");const m=await d.json();for(const u of i.filePaths)t.delete(u);return m}catch(c){return{success:!1,error:c instanceof Error?c.message:String(c)}}},clearCache:async i=>{try{const c=i?n(i):void 0;return await Rt("/_web/merge/clear",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({handle:c})}),i?t.delete(i):t.clear(),!0}catch{return!1}}}}async function iu(){throw new Error("[services] web-browser platform not yet supported")}function kt(){return Pt("data")}function So(){return Pt("import")}function dt(){return Pt("session-index")}const Xt="/ai/semantic-index";function cs(e){return async t=>(await ps(`${Xt}/${e}`,{sessionId:t})).status}const lu={getConfig:()=>As(`${Xt}/config`),setConfig:(e,t)=>di(`${Xt}/config`,{config:e,apiKey:t}),listEnabled:async()=>(await As(`${Xt}/enabled`)).sessions,status:async e=>(await As(`${Xt}/status?sessionId=${encodeURIComponent(e)}`)).status,statusForSessions:async e=>(await ps(`${Xt}/status`,{sessionIds:e})).sessions,enable:cs("enable"),disable:cs("disable"),build:cs("build"),pause:cs("pause"),cancel:cs("cancel"),rebuild:cs("rebuild"),buildPending:async()=>(await ps(`${Xt}/build-pending`)).sessions,cleanup:()=>ps(`${Xt}/cleanup`)};function gi(){return lu}const Co=5,Io=15,Is=10;function ds(){return Pt("message")}function $t(){return Pt("platform")}function xt(){return Pt("ai")}function cu(){return Pt("preferences")}function it(){return Pt("llm")}function _t(){return Pt("assistant-crud")}function Ot(){return Pt("skill-crud")}const bs=I({default_session_tab:"overview",session_gap_threshold:1800,summary_strategy:"standard"});function Mo(){return bs.value}function du(e){bs.value=e}function To(e){bs.value={...bs.value,...e}}function rs(){return bs.value.session_gap_threshold}function In(){return bs.value.summary_strategy??"standard"}const St=Nt("session",()=>{const e=I([]),t=I(null),s=I(!1),n=I(null),a=I(!1),i=I(!1),c=I([]),d=I(!1),m=I(null),u=I(!1),y=I([]),g=I("parsing"),_=I(null),x=I(null),w=X(()=>t.value&&e.value.find(T=>T.id===t.value)||null),$=I(!1),P=I(0),h=I([]),p=I(!1);async function C(){return{needsMigration:!1,count:0,currentVersion:0,pendingMigrations:[]}}async function S(){p.value=!0;try{const T=await window.chatApi.runMigration();return T.success&&($.value=!1,P.value=0),T}catch(T){return console.error("执行迁移失败:",T),{success:!1,error:String(T)}}finally{p.value=!1}}async function z(){try{const T=await kt().getSessions();e.value=T,t.value&&!T.find(U=>U.id===t.value)&&(t.value=null),a.value=!0}catch(T){console.error("加载会话列表失败:",T),a.value=!0}}async function M(){try{const T=await $t().showOpenDialog({properties:["openFile"],filters:[{name:"Chat Files",extensions:["json","jsonl","txt"]},{name:"All Files",extensions:["*"]}]});return T.canceled||T.filePaths.length===0?{success:!1,error:"error.no_file_selected"}:await D(T.filePaths[0])}catch(T){return{success:!1,error:String(T)}}}async function D(T){try{s.value=!0,n.value={stage:"detecting",progress:0,message:""};const U=[];let Z=!1,oe="reading",me=Date.now();const pe=1e3,_e=async()=>{if(!Z){for(Z=!0;U.length>0;){const b=U[0];if(b.stage!==oe){const O=Date.now()-me;O<pe&&await new Promise(Q=>setTimeout(Q,pe-O)),oe=b.stage,me=Date.now()}n.value=U.shift()}Z=!1}},be=await So().importFile(T,void 0,b=>{b.stage!=="done"&&(U.push(b),_e())});for(;U.length>0||Z;)await new Promise(b=>setTimeout(b,100));const ge=Date.now()-me;if(ge<pe&&await new Promise(b=>setTimeout(b,pe-ge)),n.value&&(n.value.progress=100),await new Promise(b=>setTimeout(b,300)),be.success&&be.sessionId){await z(),t.value=be.sessionId;try{await dt().generate(be.sessionId,rs())}catch(b){console.error("自动生成会话索引失败:",b)}return await ae(be.sessionId),{success:!0,diagnostics:be.diagnostics}}else return{success:!1,error:be.error||"error.import_failed",diagnostics:be.diagnostics}}catch(U){return{success:!1,error:String(U)}}finally{s.value=!1,setTimeout(()=>{n.value=null},500)}}async function E(T){if(T.length===0)return{total:0,success:0,failed:0,cancelled:0,files:[]};i.value=!0,d.value=!1,m.value=null,c.value=T.map(_e=>({path:_e,name:_e.split("/").pop()||_e.split("\\").pop()||_e,status:"pending"}));let U=0,Z=0,oe=0;const me=_e=>{for(let be=_e;be<c.value.length;be++)c.value[be].status==="pending"&&(c.value[be].status="cancelled",oe++)};for(let _e=0;_e<c.value.length;_e++){if(d.value){me(_e);break}const be=c.value[_e];be.status="importing",be.progress={stage:"detecting",progress:0,message:""};try{const ge=[];let b=!1,O="reading",Q=Date.now();const ie=300,ye=async()=>{if(!b){for(b=!0;ge.length>0;){if(d.value){ge.length=0;break}const R=ge[0];if(R.stage!==O){const xe=Date.now()-Q;xe<ie&&await new Promise(Se=>setTimeout(Se,ie-xe)),O=R.stage,Q=Date.now()}be.progress=ge.shift()}b=!1}},j=await So().importFile(be.path,void 0,R=>{R.stage!=="done"&&(ge.push(R),ye())});let q=0;for(;(ge.length>0||b)&&!d.value&&q<100;)await new Promise(R=>setTimeout(R,30)),q++;if(d.value){if(j.success&&j.sessionId){be.status="success",be.sessionId=j.sessionId,U++;try{await dt().generate(j.sessionId,rs())}catch(R){console.error("自动生成会话索引失败:",R)}await ae(j.sessionId)}else be.status="failed",be.error=j.error||"error.import_failed",Z++;me(_e+1);break}if(j.success&&j.sessionId){if(be.status="success",be.sessionId=j.sessionId,U++,!d.value)try{await dt().generate(j.sessionId,rs())}catch(R){console.error("自动生成会话索引失败:",R)}await ae(j.sessionId)}else be.status="failed",be.error=j.error||"error.import_failed",Z++}catch(ge){be.status="failed",be.error=String(ge),Z++}}await z();const pe={total:T.length,success:U,failed:Z,cancelled:oe,files:[...c.value]};return m.value=pe,i.value=!1,pe}function F(){d.value=!0}function re(){m.value=null,c.value=[]}async function ve(T){if(T.length<2)return{success:!1,error:"合并导入至少需要2个文件"};const U=800;u.value=!0,_.value=null,x.value=null,g.value="parsing",y.value=T.map(oe=>({path:oe,name:oe.split("/").pop()||oe.split("\\").pop()||oe,status:"pending"}));let Z=Date.now();try{for(let b=0;b<y.value.length;b++){const O=y.value[b],Q=Date.now();O.status="parsing";try{const ie=await window.mergeApi.parseFileInfo(O.path);O.info=ie;const ye=Date.now()-Q,j=Math.max(300,U/T.length);ye<j&&await new Promise(q=>setTimeout(q,j-ye)),O.status="done"}catch(ie){throw new Error(`解析文件失败: ${O.name} - ${ie instanceof Error?ie.message:String(ie)}`)}}const oe=Date.now()-Z;oe<U&&await new Promise(b=>setTimeout(b,U-oe)),Z=Date.now(),g.value="merging";const me=y.value.map(b=>b.info?.name).filter(Boolean),pe=[...new Set(me)],_e=pe.length===1?pe[0]:me[0]||"合并记录",be=await window.mergeApi.mergeFiles({filePaths:T,outputName:_e,conflictResolutions:[],andAnalyze:!0});if(!be.success)throw new Error(be.error||"合并失败");await window.mergeApi.clearCache();const ge=Date.now()-Z;if(ge<U&&await new Promise(b=>setTimeout(b,U-ge)),g.value="done",x.value={success:!0,sessionId:be.sessionId},await z(),be.sessionId)try{await dt().generate(be.sessionId,rs())}catch(b){console.error("自动生成会话索引失败:",b)}return{success:!0,sessionId:be.sessionId}}catch(oe){g.value="error";const me=oe instanceof Error?oe.message:String(oe);return _.value=me,x.value={success:!1,error:me},await window.mergeApi.clearCache(),{success:!1,error:me}}}function de(){u.value=!1,y.value=[],x.value=null,_.value=null}function L(T){t.value=T}async function A(T){try{const U=await kt().deleteSession(T);if(U){const Z=e.value.findIndex(oe=>oe.id===T);Z!==-1&&e.value.splice(Z,1),t.value===T&&(t.value=null),await z()}return U}catch(U){return console.error("删除会话失败:",U),!1}}async function G(T,U){try{const Z=await kt().renameSession(T,U);if(Z){const oe=e.value.find(me=>me.id===T);oe&&(oe.name=U)}return Z}catch(Z){return console.error("重命名会话失败:",Z),!1}}function J(){t.value=null}async function ue(T,U){try{const Z=await kt().updateSessionOwnerId(T,U);if(Z){const oe=e.value.find(me=>me.id===T);oe&&(oe.ownerId=U)}return Z}catch(Z){return console.error("更新会话所有者失败:",Z),!1}}async function W(T,U){const Z=await kt().setOwnerAndApplyProfile(T,U);for(const oe of[T,...Z.updatedSessionIds]){const me=e.value.find(pe=>pe.id===oe);me&&(me.ownerId=Z.updatedSessionOwnerIds[oe]??Z.ownerId)}return Z}async function V(T){const U=await kt().tryApplyOwnerProfile(T);if(U.applied&&U.ownerId){const Z=e.value.find(oe=>oe.id===T);Z&&(Z.ownerId=U.ownerId)}return U}function H(T){return kt().dismissOwnerPrompt(T)}async function ae(T){try{await V(T)}catch(U){console.warn("导入后应用 owner profile 失败:",U)}}const K=I([]),ee=I("all"),fe=I("importedAt"),he=I("desc"),le=X(()=>{let T=e.value;ee.value!=="all"&&(T=T.filter(oe=>oe.type===ee.value));const U=new Map(K.value.map((oe,me)=>[oe,me])),Z=he.value==="desc"?-1:1;return[...T].sort((oe,me)=>{const pe=U.get(oe.id),_e=U.get(me.id),be=pe!==void 0,ge=_e!==void 0;if(be&&ge)return _e-pe;if(be&&!ge)return-1;if(!be&&ge)return 1;const b=fe.value,O=oe[b]??0,Q=me[b]??0;return O!==Q?(O-Q)*Z:0})});function B(T){const U=K.value.indexOf(T);U!==-1?K.value.splice(U,1):K.value.push(T)}function N(T){return K.value.includes(T)}return{sessions:e,sortedSessions:le,pinnedSessionIds:K,filterType:ee,sortField:fe,sortOrder:he,currentSessionId:t,isImporting:s,importProgress:n,isInitialized:a,currentSession:w,migrationNeeded:$,migrationCount:P,pendingMigrations:h,isMigrating:p,checkMigration:C,runMigration:S,loadSessions:z,importFile:M,importFileFromPath:D,selectSession:L,deleteSession:A,renameSession:G,clearSelection:J,updateSessionOwnerId:ue,setOwnerAndApplyProfile:W,tryApplyOwnerProfile:V,dismissOwnerPrompt:H,togglePinSession:B,isPinned:N,isBatchImporting:i,batchFiles:c,batchImportCancelled:d,batchImportResult:m,importFilesFromPaths:E,cancelBatchImport:F,clearBatchImportResult:re,isMergeImporting:u,mergeFiles:y,mergeStage:g,mergeError:_,mergeResult:x,mergeImportFiles:ve,clearMergeImportResult:de}},{persist:[{pick:["currentSessionId"],storage:sessionStorage},{pick:["filterType","sortField","sortOrder"],storage:localStorage}],backendPersist:{pick:["pinnedSessionIds"]}}),uu={class:"w-48 p-1.5 flex flex-col space-y-0.5"},mu={class:"px-2 pb-2 pt-1 text-xs font-semibold text-gray-500 dark:text-gray-400"},gu=["onClick"],pu=Re({__name:"SidebarSortPopover",setup(e){const{t}=Fe(),s=St(),{sortField:n,sortOrder:a}=et(s),i=I(!1),c=[{value:"importedAt",labelKey:"layout.sort.importedAt"},{value:"lastMessageTs",labelKey:"layout.sort.lastMessageTs"},{value:"messageCount",labelKey:"layout.sort.messageCount"}];function d(m){n.value===m?a.value=a.value==="desc"?"asc":"desc":(n.value=m,a.value="desc"),i.value=!1}return(m,u)=>{const y=Ke,g=Vs,_=We,x=vr;return v(),Te(x,{open:i.value,"onUpdate:open":u[0]||(u[0]=w=>i.value=w),ui:{content:"z-50 p-0"}},{content:te(()=>[r("div",uu,[r("div",mu,l(o(t)("layout.tooltip.sort")),1),(v(),k(Pe,null,Be(c,w=>r("button",{key:w.value,class:$e(["flex w-full items-center justify-between rounded-md px-2.5 py-2 text-sm transition-colors",o(n)===w.value?"bg-gray-100 text-gray-900 dark:bg-white/10 dark:text-white font-medium":"text-gray-600 hover:bg-gray-50 dark:text-gray-300 dark:hover:bg-white/5"]),onClick:$=>d(w.value)},[r("span",null,l(o(t)(w.labelKey)),1),o(n)===w.value?(v(),Te(_,{key:0,name:o(a)==="desc"?"i-heroicons-bars-arrow-down":"i-heroicons-bars-arrow-up",class:"h-4 w-4 opacity-70"},null,8,["name"])):ne("",!0)],10,gu)),64))])]),default:te(()=>[f(g,{text:o(t)("layout.tooltip.sort"),content:{side:"bottom"}},{default:te(()=>[f(y,{icon:o(a)==="desc"?"i-heroicons-bars-arrow-down":"i-heroicons-bars-arrow-up",color:"neutral",variant:"ghost",size:"xs"},null,8,["icon"])]),_:1},8,["text"])]),_:1},8,["open"])}}});function fu(e){const t=e.trim().replace(/^v/i,""),s=/^(\d+)\.(\d+)\.(\d+)$/.exec(t);return s?pi(s):null}function hu(e){const t=e.trim().replace(/^v/i,""),s=/^(\d+)\.(\d+)\.(\d+)(-[0-9A-Za-z.-]+)?$/.exec(t);return s?{...pi(s),prerelease:!!s[4]}:null}function pi(e){return{major:Number(e[1]),minor:Number(e[2]),patch:Number(e[3])}}function vu(e,t){const s=fu(e),n=hu(t);return!s||!n?!1:s.major!==n.major?s.major>n.major:s.minor!==n.minor?s.minor>n.minor:s.patch!==n.patch?s.patch>n.patch:n.prerelease}const yu=[{tag:"n",name:"名词",description:"普通名词",meaningful:!0},{tag:"nr",name:"人名",description:"人名",meaningful:!0},{tag:"ns",name:"地名",description:"地名",meaningful:!0},{tag:"nt",name:"机构名",description:"机构团体名",meaningful:!0},{tag:"nz",name:"其他专名",description:"其他专有名词",meaningful:!0},{tag:"nw",name:"作品名",description:"作品名",meaningful:!0},{tag:"v",name:"动词",description:"普通动词",meaningful:!1},{tag:"vn",name:"动名词",description:"动名词",meaningful:!0},{tag:"vd",name:"副动词",description:"副动词",meaningful:!1},{tag:"vg",name:"动语素",description:"动词性语素",meaningful:!1},{tag:"a",name:"形容词",description:"普通形容词",meaningful:!0},{tag:"an",name:"名形词",description:"名形词",meaningful:!0},{tag:"ad",name:"副形词",description:"副形词",meaningful:!0},{tag:"ag",name:"形语素",description:"形容词性语素",meaningful:!0},{tag:"i",name:"成语",description:"成语",meaningful:!0},{tag:"l",name:"习用语",description:"习用语",meaningful:!0},{tag:"j",name:"简称",description:"简称略语",meaningful:!0},{tag:"d",name:"副词",description:"副词",meaningful:!1},{tag:"p",name:"介词",description:"介词",meaningful:!1},{tag:"c",name:"连词",description:"连词",meaningful:!1},{tag:"u",name:"助词",description:"助词",meaningful:!1},{tag:"r",name:"代词",description:"代词",meaningful:!1},{tag:"m",name:"数词",description:"数词",meaningful:!1},{tag:"q",name:"量词",description:"量词",meaningful:!1},{tag:"f",name:"方位词",description:"方位词",meaningful:!1},{tag:"t",name:"时间词",description:"时间词",meaningful:!1},{tag:"e",name:"叹词",description:"叹词",meaningful:!1},{tag:"y",name:"语气词",description:"语气词",meaningful:!1},{tag:"o",name:"拟声词",description:"拟声词",meaningful:!1},{tag:"x",name:"非语素字",description:"非语素字",meaningful:!1},{tag:"w",name:"标点符号",description:"标点符号",meaningful:!1}];new Set(yu.filter(e=>e.meaningful).map(e=>e.tag));const Ms="chart_runtime";function ke(e){return{...e,builtin:!0,editable:!1}}ke({id:"gpt-5.4-pro",providerId:"openai",name:"GPT-5.4 Pro",description:"Latest flagship, best reasoning & coding",contextWindow:1e6,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"gpt-5.4",providerId:"openai",name:"GPT-5.4",description:"GPT-5.4 standard",contextWindow:1e6,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"gpt-5.2-pro",providerId:"openai",name:"GPT-5.2 Pro",description:"GPT-5.2 Pro",contextWindow:1e6,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"gpt-5.2",providerId:"openai",name:"GPT-5.2",description:"GPT-5.2 standard",contextWindow:1e6,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"gpt-5.1",providerId:"openai",name:"GPT-5.1",description:"GPT-5.1",contextWindow:1e6,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"gpt-5-pro",providerId:"openai",name:"GPT-5 Pro",description:"GPT-5 Pro",contextWindow:1e6,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"gpt-5",providerId:"openai",name:"GPT-5",description:"GPT-5 standard",contextWindow:1e6,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"gpt-4.1",providerId:"openai",name:"GPT-4.1",description:"Best at coding & instruction following",contextWindow:1047576,capabilities:["chat","vision","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"gpt-4.1-mini",providerId:"openai",name:"GPT-4.1 Mini",description:"Cost-effective",contextWindow:1047576,capabilities:["chat","vision","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"gpt-4.1-nano",providerId:"openai",name:"GPT-4.1 Nano",description:"Fastest and most affordable",contextWindow:1047576,capabilities:["chat","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"gpt-4o",providerId:"openai",name:"GPT-4o",description:"Multimodal flagship model",contextWindow:128e3,capabilities:["chat","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"gpt-4o-mini",providerId:"openai",name:"GPT-4o Mini",description:"Lightweight multimodal model",contextWindow:128e3,capabilities:["chat","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"o3",providerId:"openai",name:"o3",description:"Advanced reasoning model",contextWindow:2e5,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"o4-mini",providerId:"openai",name:"o4-mini",description:"Efficient reasoning model",contextWindow:2e5,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"text-embedding-3-small",providerId:"openai",name:"Text Embedding 3 Small",description:"Efficient embedding model",contextWindow:8191,capabilities:["embedding"],recommendedFor:["embedding"],status:"stable"}),ke({id:"text-embedding-3-large",providerId:"openai",name:"Text Embedding 3 Large",description:"High-precision embedding model",contextWindow:8191,capabilities:["embedding"],recommendedFor:["embedding"],status:"stable"});ke({id:"claude-opus-4-6",providerId:"anthropic",name:"Claude Opus 4.6",description:"Latest flagship, adaptive thinking",contextWindow:2e5,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"claude-sonnet-4-6",providerId:"anthropic",name:"Claude Sonnet 4.6",description:"Cost-effective, adaptive thinking",contextWindow:2e5,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"claude-opus-4-5",providerId:"anthropic",name:"Claude Opus 4.5",description:"Previous generation flagship",contextWindow:2e5,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"claude-sonnet-4-5",providerId:"anthropic",name:"Claude Sonnet 4.5",description:"Previous generation cost-effective",contextWindow:2e5,capabilities:["chat","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"claude-haiku-4-5",providerId:"anthropic",name:"Claude Haiku 4.5",description:"Fast and lightweight",contextWindow:2e5,capabilities:["chat","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"claude-sonnet-4-20250514",providerId:"anthropic",name:"Claude Sonnet 4",description:"Sonnet 4 snapshot",contextWindow:2e5,capabilities:["chat","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"claude-opus-4-20250514",providerId:"anthropic",name:"Claude Opus 4",description:"Opus 4 snapshot",contextWindow:2e5,capabilities:["chat","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"claude-haiku-3-5-20241022",providerId:"anthropic",name:"Claude 3.5 Haiku",description:"3.5 Haiku snapshot",contextWindow:2e5,capabilities:["chat","vision","function_calling"],recommendedFor:[],status:"stable"});ke({id:"gemini-3.1-pro-preview",providerId:"gemini",name:"Gemini 3.1 Pro",description:"Latest Gemini 3.1 Pro preview",contextWindow:1048576,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:["chat"],status:"preview"}),ke({id:"gemini-3-pro-preview",providerId:"gemini",name:"Gemini 3 Pro",description:"Gemini 3 Pro preview",contextWindow:1048576,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:["chat"],status:"preview"}),ke({id:"gemini-2.5-flash",providerId:"gemini",name:"Gemini 2.5 Flash",description:"Cost-effective, low latency, adaptive thinking",contextWindow:1048576,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"gemini-2.5-pro",providerId:"gemini",name:"Gemini 2.5 Pro",description:"Deep reasoning and complex tasks",contextWindow:1048576,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"gemini-2.0-flash",providerId:"gemini",name:"Gemini 2.0 Flash",description:"Previous generation fast model",contextWindow:1048576,capabilities:["chat","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"text-embedding-004",providerId:"gemini",name:"Text Embedding 004",description:"Google embedding model",contextWindow:2048,capabilities:["embedding"],recommendedFor:["embedding"],status:"stable"});ke({id:"deepseek-v4-pro",providerId:"deepseek",name:"DeepSeek V4 Pro",description:"Flagship model, 1M context, thinking & non-thinking",contextWindow:1e6,capabilities:["chat","reasoning","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"deepseek-v4-flash",providerId:"deepseek",name:"DeepSeek V4 Flash",description:"Fast model, 1M context, thinking & non-thinking",contextWindow:1e6,capabilities:["chat","reasoning","function_calling"],recommendedFor:["chat"],status:"stable"});ke({id:"qwen3.5-plus",providerId:"qwen",name:"Qwen3.5 Plus",description:"Latest Qwen3.5 flagship",contextWindow:262144,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"qwen3.5-flash",providerId:"qwen",name:"Qwen3.5 Flash",description:"Qwen3.5 fast version",contextWindow:262144,capabilities:["chat","reasoning","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"qwen3-max",providerId:"qwen",name:"Qwen3 Max",description:"Qwen3 massive-scale",contextWindow:262144,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"qwen-max",providerId:"qwen",name:"Qwen Max",description:"Massive-scale language model",contextWindow:262144,capabilities:["chat","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"qwen-plus",providerId:"qwen",name:"Qwen Plus",description:"Good quality, suitable for most scenarios",contextWindow:262144,capabilities:["chat","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"qwen-turbo",providerId:"qwen",name:"Qwen Turbo",description:"Fast and cost-effective",contextWindow:1e6,capabilities:["chat","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"qwen-long",providerId:"qwen",name:"Qwen Long",description:"Ultra-long context model",contextWindow:262144,capabilities:["chat"],recommendedFor:[],status:"stable"}),ke({id:"text-embedding-v3",providerId:"qwen",name:"Text Embedding V3",description:"Qwen embedding model",contextWindow:8192,capabilities:["embedding"],recommendedFor:["embedding"],status:"stable"});ke({id:"glm-5",providerId:"glm",name:"GLM-5",description:"Latest flagship model",contextWindow:2e5,capabilities:["chat","reasoning","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"glm-4.7",providerId:"glm",name:"GLM-4.7",description:"GLM-4.7 high performance",contextWindow:2e5,capabilities:["chat","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"glm-4.6v",providerId:"glm",name:"GLM-4.6V",description:"4.6 multimodal model",contextWindow:2e5,capabilities:["chat","vision","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"glm-4.6v-flash",providerId:"glm",name:"GLM-4.6V Flash",description:"4.6V free multimodal",contextWindow:2e5,capabilities:["chat","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"glm-4.5",providerId:"glm",name:"GLM-4.5",description:"GLM-4.5 standard",contextWindow:2e5,capabilities:["chat","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"glm-4.5-flash",providerId:"glm",name:"GLM-4.5 Flash",description:"4.5 free model",contextWindow:2e5,capabilities:["chat","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"glm-4-plus",providerId:"glm",name:"GLM-4 Plus",description:"Previous generation flagship",contextWindow:128e3,capabilities:["chat","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"glm-4-flash",providerId:"glm",name:"GLM-4 Flash",description:"Fast model",contextWindow:128e3,capabilities:["chat","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"embedding-3",providerId:"glm",name:"Embedding-3",description:"Zhipu embedding model",contextWindow:8192,capabilities:["embedding"],recommendedFor:["embedding"],status:"stable"});ke({id:"kimi-k2.5",providerId:"kimi",name:"Kimi K2.5",description:"Latest flagship with vision support",contextWindow:262144,capabilities:["chat","vision","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"kimi-k2-thinking",providerId:"kimi",name:"Kimi K2 Thinking",description:"K2 deep reasoning",contextWindow:131072,capabilities:["chat","reasoning","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"kimi-k2-thinking-turbo",providerId:"kimi",name:"Kimi K2 Thinking Turbo",description:"K2 fast reasoning",contextWindow:131072,capabilities:["chat","reasoning","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"kimi-k2-0905-Preview",providerId:"kimi",name:"Kimi K2 Preview",description:"K2 preview",contextWindow:131072,capabilities:["chat","function_calling"],recommendedFor:[],status:"preview"}),ke({id:"moonshot-v1-auto",providerId:"kimi",name:"Moonshot V1 Auto",description:"Auto-select context length",contextWindow:131072,capabilities:["chat","function_calling"],recommendedFor:[],status:"stable"});ke({id:"doubao-seed-2-0-pro-260215",providerId:"doubao",name:"Doubao Seed 2.0 Pro",description:"Latest flagship model",contextWindow:256e3,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"doubao-seed-2-0-lite-260215",providerId:"doubao",name:"Doubao Seed 2.0 Lite",description:"Seed 2.0 lightweight",contextWindow:256e3,capabilities:["chat","reasoning","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"doubao-seed-2-0-mini-260215",providerId:"doubao",name:"Doubao Seed 2.0 Mini",description:"Seed 2.0 ultra-fast",contextWindow:256e3,capabilities:["chat","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"doubao-seed-1-8-251228",providerId:"doubao",name:"Doubao Seed 1.8",description:"Previous generation flagship",contextWindow:128e3,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"doubao-seed-1-6-251015",providerId:"doubao",name:"Doubao Seed 1.6",description:"High-performance general model",contextWindow:128e3,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"doubao-seed-1-6-lite-251015",providerId:"doubao",name:"Doubao Seed 1.6 Lite",description:"Lightweight and cost-effective",contextWindow:128e3,capabilities:["chat","function_calling"],recommendedFor:[],status:"stable"});ke({id:"deepseek-ai/DeepSeek-V3.2",providerId:"siliconflow",name:"DeepSeek V3.2",description:"DeepSeek V3.2 on SiliconFlow",contextWindow:128e3,capabilities:["chat","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"deepseek-ai/DeepSeek-R1",providerId:"siliconflow",name:"DeepSeek R1",description:"DeepSeek R1 reasoning model",contextWindow:65536,capabilities:["chat","reasoning"],recommendedFor:["chat"],status:"stable"}),ke({id:"Qwen/Qwen3-8B",providerId:"siliconflow",name:"Qwen3 8B",description:"Qwen3 8B lightweight model",contextWindow:32768,capabilities:["chat"],recommendedFor:[],status:"stable"});ke({id:"llama3-70b-8192",providerId:"groq",name:"LLaMA3 70B",description:"Meta LLaMA3 70B ultra-fast inference",contextWindow:8192,capabilities:["chat","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"llama3-8b-8192",providerId:"groq",name:"LLaMA3 8B",description:"Meta LLaMA3 8B lightweight ultra-fast",contextWindow:8192,capabilities:["chat"],recommendedFor:["chat"],status:"stable"}),ke({id:"mistral-saba-24b",providerId:"groq",name:"Mistral Saba 24B",description:"Mistral Saba 24B",contextWindow:32768,capabilities:["chat"],recommendedFor:[],status:"stable"}),ke({id:"gemma-9b-it",providerId:"groq",name:"Gemma 9B",description:"Google Gemma 9B",contextWindow:8192,capabilities:["chat"],recommendedFor:[],status:"stable"});ke({id:"deepseek/deepseek-v4-pro",providerId:"openrouter",name:"DeepSeek V4 Pro",description:"DeepSeek V4 Pro via OpenRouter",contextWindow:1e6,capabilities:["chat","reasoning","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"google/gemini-2.5-flash-preview",providerId:"openrouter",name:"Gemini 2.5 Flash",description:"Google Gemini 2.5 Flash via OpenRouter",contextWindow:1048576,capabilities:["chat","vision","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"mistralai/mistral-7b-instruct:free",providerId:"openrouter",name:"Mistral 7B (Free)",description:"Mistral 7B free tier",contextWindow:32768,capabilities:["chat"],recommendedFor:[],status:"stable"});ke({id:"grok-4",providerId:"xai",name:"Grok 4",description:"Latest flagship model",contextWindow:256e3,capabilities:["chat","reasoning","vision","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"grok-3",providerId:"xai",name:"Grok 3",description:"Grok 3 standard",contextWindow:131072,capabilities:["chat","vision","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"grok-3-fast",providerId:"xai",name:"Grok 3 Fast",description:"Grok 3 fast version",contextWindow:131072,capabilities:["chat","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"grok-3-mini",providerId:"xai",name:"Grok 3 Mini",description:"Grok 3 small reasoning model",contextWindow:131072,capabilities:["chat","reasoning","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"grok-3-mini-fast",providerId:"xai",name:"Grok 3 Mini Fast",description:"Grok 3 Mini fast version",contextWindow:131072,capabilities:["chat","reasoning","function_calling"],recommendedFor:[],status:"stable"});ke({id:"MiniMax-M2.7",providerId:"minimax",name:"MiniMax M2.7",description:"Latest flagship model",contextWindow:2e5,capabilities:["chat","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"MiniMax-M2.7-highspeed",providerId:"minimax",name:"MiniMax M2.7 HS",description:"M2.7 high-speed",contextWindow:2e5,capabilities:["chat","function_calling"],recommendedFor:["chat"],status:"stable"}),ke({id:"MiniMax-M2.5",providerId:"minimax",name:"MiniMax M2.5",description:"M2.5 standard",contextWindow:204800,capabilities:["chat","function_calling"],recommendedFor:[],status:"stable"}),ke({id:"MiniMax-M2.5-highspeed",providerId:"minimax",name:"MiniMax M2.5 HS",description:"M2.5 high-speed",contextWindow:204800,capabilities:["chat","function_calling"],recommendedFor:[],status:"stable"});const bu=4e3,_u=`
5
+ …[truncated]`;function Ao(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function $o(e){return!Ao(e)||!Array.isArray(e.content)?"":e.content.map(t=>Ao(t)&&t.type==="text"&&typeof t.text=="string"?t.text:"").filter(t=>t.length>0).join(`
6
+ `)}function Po(e,t=bu){return e.length<=t?e:e.slice(0,t)+_u}function xu(e){const t=e.latestVersion||"";return{latestVersion:t,currentVersion:e.currentVersion,hasUpdate:typeof e.serverHasUpdate=="boolean"?e.serverHasUpdate:!!(t&&vu(t,e.currentVersion))}}function ku(e,t=Date.now()){return e?{lastCheckTime:t,latestVersion:e.latestVersion,hasUpdate:e.hasUpdate,currentVersion:e.currentVersion}:null}const wu=["onClick"],Mn=Re({__name:"SubTabs",props:{modelValue:{},items:{},persistKey:{},orientation:{default:"horizontal"},size:{default:"md"},bordered:{type:Boolean}},emits:["update:modelValue","change"],setup(e,{emit:t}){const s=e,n=t,a=pa(),i=Hs(),c=X(()=>s.orientation==="vertical"),d=I({}),m=I(null),u=I({}),y=X({get:()=>s.modelValue,set:w=>{n("update:modelValue",w),n("change",w)}});function g(){const w=d.value[y.value];if(w&&m.value){const $=m.value.getBoundingClientRect(),P=w.getBoundingClientRect();c.value?u.value={top:`${P.top-$.top}px`,height:`${P.height}px`,right:"0px",width:"2px"}:u.value={left:`${P.left-$.left}px`,width:`${P.width}px`,bottom:"0px",height:"2px"}}}const _=w=>{y.value=w};function x(w,$){d.value[w]=$}return tt(()=>{if(s.persistKey){const w=a.query[s.persistKey];w&&s.items.some($=>$.id===w)&&(y.value=w)}at(()=>{g()})}),Ue(()=>s.modelValue,w=>{s.persistKey&&w&&i.replace({query:{...a.query,[s.persistKey]:w}}),at(()=>{g()})}),Ue(()=>s.items,()=>{at(()=>{g()})},{deep:!0}),(w,$)=>{const P=We;return v(),k("div",{class:$e([c.value?["h-full",e.bordered!==!1?"border-r border-gray-200/50 dark:border-gray-700/50":""]:["flex items-center justify-between",e.bordered!==!1?"border-b border-gray-200/50 dark:border-gray-800/50":"",e.size==="sm"?"px-3":"px-6","overflow-x-auto"]])},[r("div",{ref_key:"containerRef",ref:m,class:$e(["relative",[c.value?"flex flex-col gap-1":"flex gap-1"]])},[(v(!0),k(Pe,null,Be(e.items,h=>(v(),k("button",{key:h.id,ref_for:!0,ref:p=>x(h.id,p),class:$e(["flex shrink-0 items-center whitespace-nowrap font-medium transition-colors",[c.value?"justify-start gap-2 px-3 py-2 text-sm":e.size==="sm"?"gap-1.5 px-2 py-1.5 text-xs":"gap-2 px-4 py-3 text-sm",y.value===h.id?"text-primary-600 dark:text-primary-400":"text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300"]]),onClick:p=>_(h.id)},[h.icon?(v(),Te(P,{key:0,name:h.icon,class:$e(e.size==="sm"?"h-3.5 w-3.5":"h-4 w-4")},null,8,["name","class"])):ne("",!0),Y(" "+l(h.label),1)],10,wu))),128)),r("div",{class:"absolute bg-primary-500 transition-all duration-300 ease-out",style:hs(u.value)},null,4)],2),c.value?ne("",!0):Oi(w.$slots,"right",{key:0})],2)}}}),Do="/assets/logo-DXIuG_WE.svg",Su={key:0,class:"ml-2 flex items-center"},Cu=["src"],Iu={class:"ml-2 text-2xl font-black tracking-tight text-pink-500"},Mu={class:"ml-2 text-xs text-gray-400"},Tu=["src"],Au={class:"flex-1 relative min-h-0 flex flex-col"},$u={key:0,class:"mb-2"},Pu={class:"flex items-center gap-0.5"},Du={key:0,class:"mt-2 px-4"},Lu={class:"flex-1 overflow-y-auto"},Ru={key:0,class:"py-8 text-center text-sm text-gray-500"},Eu={key:1,class:"py-8 text-center text-sm text-gray-500"},Fu=["onClick"],Nu=["src","alt"],Uu={key:2,class:"min-w-0 flex-1"},Ou={class:"flex items-center justify-between gap-1.5"},Vu={class:"truncate text-xs font-medium"},Hu={class:"truncate text-[10px] text-gray-400 dark:text-gray-500 mt-0.5 leading-none"},zu={class:"p-4"},Bu={class:"mb-3 font-semibold text-gray-900 dark:text-white"},Wu={class:"flex justify-end gap-2"},ju={class:"p-4"},qu={class:"mb-3 font-semibold text-gray-900 dark:text-white"},Ku={class:"mb-4 text-sm text-gray-600 dark:text-gray-400"},Gu={class:"flex justify-end gap-2"},Xu={class:"p-4"},Yu={class:"mb-3 flex items-center gap-2"},Qu={class:"flex h-8 w-8 items-center justify-center rounded-lg bg-red-50 text-red-500 dark:bg-red-950/30"},Ju={class:"font-semibold text-gray-900 dark:text-white"},Zu={class:"text-sm text-gray-600 dark:text-gray-400"},em={class:"mt-2 text-sm text-gray-500 dark:text-gray-400"},tm={key:0,class:"mt-3 rounded-md border border-gray-200 bg-gray-50 px-3 py-2 font-mono text-xs text-gray-700 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-200"},sm={class:"mt-4 flex justify-end gap-2"},am="chatlab:latest-version-check:v2",nm=Re({__name:"Sidebar",setup(e){const{t}=Fe(),s=St(),n=Bt(),{sessions:a,sortedSessions:i,filterType:c}=et(s),{isSidebarCollapsed:d}=et(n),{toggleSidebar:m}=n,u=Hs(),y=pa(),g=X(()=>y.path==="/"),_=I(!1),x=I(null),w=I(""),$=I(null),P=I(!1),h=I(null),p=I(""),C=I(""),S=I(!1),z=I(!1),M=I(!1),D=I(!1),E=I(""),F=X(()=>[{id:"all",label:t("layout.filter.all")},{id:"private",label:t("layout.filter.private")},{id:"group",label:t("layout.filter.group")}]),re=X(()=>{if(!E.value.trim())return i.value;const oe=E.value.toLowerCase().trim();return i.value.filter(me=>me.name.toLowerCase().includes(oe))});function ve(){D.value=!D.value,D.value||(E.value="")}tt(async()=>{s.loadSessions();try{p.value=await $t().getVersion(),J()}catch(oe){console.error("Failed to get version",oe)}}),Qt(()=>{});function de(){u.push("/")}function L(oe){const me=ku(oe);if(me)try{window.localStorage.setItem(am,JSON.stringify(me))}catch{}}function A(oe){C.value=oe?.latestVersion??"",S.value=oe?.hasUpdate??!1}async function G(){const me=await $t().checkUpdate();return!me||me.error?null:xu({latestVersion:me.latestVersion,currentVersion:me.currentVersion,serverHasUpdate:me.hasUpdate})}async function J(){try{const oe=await G();if(!oe){A(null);return}A(oe)}catch(oe){A(null),console.debug("Update notice check failed:",oe)}}function ue(){z.value=!0}async function W(){{z.value=!1;return}}function V(oe){x.value=oe,w.value=oe.name,_.value=!0,at(()=>{$.value?.focus(),$.value?.select()})}async function H(){if(!x.value||!w.value.trim())return;await s.renameSession(x.value.id,w.value.trim())&&(_.value=!1,x.value=null,w.value="")}function ae(){_.value=!1,x.value=null,w.value=""}function K(oe){h.value=oe,P.value=!0}async function ee(){if(!h.value)return;const oe=h.value.id,me=y.params.id===oe;await s.deleteSession(oe),P.value=!1,h.value=null,me&&u.push("/")}function fe(){P.value=!1,h.value=null}async function he(oe){try{await navigator.clipboard.writeText(oe)}catch(me){console.error("Failed to copy session id:",me)}}function le(oe){const me=s.isPinned(oe.id);return[[{label:t(me?"layout.contextMenu.unpin":"layout.contextMenu.pin"),class:"p-2",onSelect:()=>s.togglePinSession(oe.id)},{label:t("layout.contextMenu.rename"),class:"p-2",onSelect:()=>V(oe)},{label:t("layout.contextMenu.copyId"),class:"p-2",onSelect:()=>he(oe.id)},{label:t("layout.contextMenu.delete"),color:"error",class:"p-2",onSelect:()=>K(oe)}]]}function B(oe){return oe.type==="private"?"private-chat":"group-chat"}function N(oe){return oe.type==="private"}function T(oe){const me=oe.name||"";return me?N(oe)?me.slice(-1):me.slice(0,1):"?"}function U(oe){return N(oe)?oe.memberAvatar||null:oe.groupAvatar||null}function Z(oe,me){if(me)return N(oe)?"bg-pink-500 text-white dark:bg-pink-600":"bg-primary-600 text-white dark:bg-primary-500";const pe=[{bg:"bg-pink-50 dark:bg-pink-950/20",text:"text-pink-600 dark:text-pink-400"},{bg:"bg-blue-50 dark:bg-blue-950/20",text:"text-blue-600 dark:text-blue-400"},{bg:"bg-emerald-50 dark:bg-emerald-950/20",text:"text-emerald-600 dark:text-emerald-400"},{bg:"bg-purple-50 dark:bg-purple-950/20",text:"text-purple-600 dark:text-purple-400"},{bg:"bg-amber-50 dark:bg-amber-950/20",text:"text-amber-600 dark:text-amber-400"}],_e=oe.id||"";let be=0;for(let b=0;b<_e.length;b++)be=_e.charCodeAt(b)+((be<<5)-be);const ge=Math.abs(be)%pe.length;return`${pe[ge].bg} ${pe[ge].text}`}return(oe,me)=>{const pe=We,_e=Ke,be=Vs,ge=ut,b=Gi,O=mt;return v(),k("div",{class:$e(["flex h-full flex-col border-r border-gray-200/50 transition-all duration-300 ease-in-out dark:border-gray-800/50",[o(d)?"w-20":"w-72",g.value?"":"bg-gray-50 dark:bg-gray-900"]])},[r("div",{class:$e(["flex flex-col pt-5",[o(d)?"px-3 pb-4":"p-4"]])},[r("div",{class:$e(["mb-2 flex items-center",[o(d)?"justify-center":"justify-between"]]),style:{"-webkit-app-region":"drag"}},[o(d)?(v(),k("div",{key:1,class:"group relative flex h-9 w-9 cursor-pointer items-center justify-center rounded-full hover:bg-gray-200/60 dark:hover:bg-gray-800",style:{"-webkit-app-region":"no-drag"},onClick:me[0]||(me[0]=(...Q)=>o(m)&&o(m)(...Q))},[r("img",{src:o(Do),alt:"ChatLab",class:"size-5 select-none pointer-events-none group-hover:hidden"},null,8,Tu),f(pe,{name:"i-lucide-panel-right-open",class:"size-4 hidden group-hover:block scale-x-[-1]"})])):(v(),k("div",Su,[r("img",{src:o(Do),alt:"ChatLab",class:"h-6 w-6 select-none pointer-events-none"},null,8,Cu),r("div",Iu,l(o(t)("layout.brand")),1),r("span",Mu,"v"+l(p.value),1),S.value?(v(),k("button",{key:0,type:"button",class:"ml-1.5 rounded-full bg-red-500 px-1.5 py-0.5 text-[10px] font-bold leading-none text-white shadow-sm shadow-red-500/20 transition hover:bg-red-600",style:{"-webkit-app-region":"no-drag"},onClick:ue},l(o(t)("layout.updateNotice.tag")),1)):ne("",!0)])),o(d)?ne("",!0):(v(),Te(be,{key:2,text:o(t)("layout.tooltip.collapse"),content:{side:"bottom"},style:{"-webkit-app-region":"no-drag"}},{default:te(()=>[f(_e,{color:"gray",variant:"ghost",size:"sm",class:"group flex h-9 w-9 cursor-pointer items-center justify-center rounded-full hover:bg-gray-200/60 dark:hover:bg-gray-800",onClick:o(m)},{default:te(()=>[f(pe,{name:"i-lucide-panel-right",class:"size-4 group-hover:hidden scale-x-[-1]"}),f(pe,{name:"i-lucide-panel-right-close",class:"size-4 hidden group-hover:block scale-x-[-1]"})]),_:1},8,["onClick"])]),_:1},8,["text"]))],2),f(ni,{icon:"i-heroicons-plus",title:o(t)("layout.newAnalysis"),active:g.value,onClick:de},null,8,["title","active"])],2),r("div",Au,[!o(d)&&o(a).length>0?(v(),k("div",$u,[f(Mn,{modelValue:o(c),"onUpdate:modelValue":me[2]||(me[2]=Q=>rt(c)?c.value=Q:null),items:F.value,size:"sm",bordered:!1},{right:te(()=>[r("div",Pu,[f(be,{text:o(t)("layout.tooltip.search"),content:{side:"bottom"}},{default:te(()=>[f(_e,{icon:D.value?"i-heroicons-x-mark":"i-heroicons-magnifying-glass",color:"neutral",variant:"ghost",size:"xs",onClick:ve},null,8,["icon"])]),_:1},8,["text"]),f(pu),f(be,{text:o(t)("layout.manage"),content:{side:"bottom"}},{default:te(()=>[f(_e,{icon:"i-heroicons-rectangle-stack",color:"neutral",variant:"ghost",size:"xs",onClick:me[1]||(me[1]=Q=>o(n).openSettings("data"))})]),_:1},8,["text"])])]),_:1},8,["modelValue","items"]),D.value?(v(),k("div",Du,[f(ge,{modelValue:E.value,"onUpdate:modelValue":me[3]||(me[3]=Q=>E.value=Q),placeholder:o(t)("layout.searchPlaceholder"),icon:"i-heroicons-magnifying-glass",size:"sm",autofocus:""},null,8,["modelValue","placeholder"])])):ne("",!0)])):ne("",!0),r("div",Lu,[o(a).length===0&&!o(d)?(v(),k("div",Ru,l(o(t)("layout.noRecords")),1)):re.value.length===0&&E.value.trim()&&!o(d)?(v(),k("div",Eu,l(o(t)("layout.noSearchResult")),1)):ne("",!0),r("div",{class:$e(["space-y-1 pb-8",[o(d)?"px-3":"px-4"]])},[(v(!0),k(Pe,null,Be(re.value,Q=>(v(),Te(b,{key:Q.id,items:le(Q)},{default:te(()=>[f(be,{text:Q.name,disabled:!o(d)||!Q.name,content:{side:"right"}},{default:te(()=>[r("div",{class:$e(["group relative flex items-center text-left transition-all duration-200 cursor-pointer",[o(y).params.id===Q.id?"bg-gray-200/50 dark:bg-gray-800/80 text-gray-900 dark:text-white font-medium":"text-gray-600 dark:text-gray-300 hover:bg-gray-200/30 dark:hover:bg-gray-800/30",o(d)?"justify-center h-10 w-10 rounded-xl mx-auto":"w-full rounded-xl p-1.5 px-2.5 pl-1.5"]]),onClick:ie=>o(u).push({name:B(Q),params:{id:Q.id},query:o(y).query})},[r("div",{class:$e(["absolute top-1/2 -translate-y-1/2 w-[3px] rounded-r-full bg-pink-500 dark:bg-pink-400 transition-all duration-200",[o(d)?"-left-3":"-left-4",o(y).params.id===Q.id?"h-4.5 opacity-100":"h-0 opacity-0 group-hover:h-2.5 group-hover:opacity-40"]])},null,2),U(Q)?(v(),k("img",{key:0,src:U(Q),alt:Q.name,class:$e(["h-7 w-7 min-w-7 shrink-0 rounded-lg object-cover",[o(d)?"":"mr-2.5"]])},null,10,Nu)):(v(),k("div",{key:1,class:$e(["flex h-7 w-7 shrink-0 items-center justify-center rounded-lg text-xs font-semibold select-none",[Z(Q,o(y).params.id===Q.id),o(d)?"":"mr-2.5"]])},l(T(Q)),3)),o(d)?ne("",!0):(v(),k("div",Uu,[r("div",Ou,[r("p",Vu,l(Q.name),1),o(s).isPinned(Q.id)?(v(),Te(pe,{key:0,name:"i-lucide-pin",class:"h-3 w-3 shrink-0 text-gray-400/80 rotate-45"})):ne("",!0)]),r("p",Hu,l(o(t)("layout.sessionInfo",{count:Q.messageCount})),1)]))],10,Fu)]),_:2},1032,["text","disabled"])]),_:2},1032,["items"]))),128))],2)]),me[9]||(me[9]=r("div",{class:"pointer-events-none absolute bottom-0 left-0 right-0 h-12 bg-gradient-to-t from-gray-50 to-transparent dark:from-gray-900"},null,-1))]),f(O,{open:_.value,"onUpdate:open":me[5]||(me[5]=Q=>_.value=Q),ui:{content:"z-50"}},{content:te(()=>[r("div",zu,[r("h3",Bu,l(o(t)("layout.renameModal.title")),1),f(ge,{ref_key:"renameInputRef",ref:$,modelValue:w.value,"onUpdate:modelValue":me[4]||(me[4]=Q=>w.value=Q),placeholder:o(t)("layout.renameModal.placeholder"),class:"mb-4 w-100",onKeydown:$s(H,["enter"])},null,8,["modelValue","placeholder"]),r("div",Wu,[f(_e,{variant:"soft",onClick:ae},{default:te(()=>[Y(l(o(t)("common.cancel")),1)]),_:1}),f(_e,{color:"primary",disabled:!w.value.trim(),onClick:H},{default:te(()=>[Y(l(o(t)("common.confirm")),1)]),_:1},8,["disabled"])])])]),_:1},8,["open"]),f(O,{open:P.value,"onUpdate:open":me[6]||(me[6]=Q=>P.value=Q),ui:{content:"z-50"}},{content:te(()=>[r("div",ju,[r("h3",qu,l(o(t)("layout.deleteModal.title")),1),r("p",Ku,l(o(t)("layout.deleteModal.message",{name:h.value?.name})),1),r("div",Gu,[f(_e,{variant:"soft",onClick:fe},{default:te(()=>[Y(l(o(t)("common.cancel")),1)]),_:1}),f(_e,{color:"error",onClick:ee},{default:te(()=>[Y(l(o(t)("common.delete")),1)]),_:1})])])]),_:1},8,["open"]),f(O,{open:z.value,"onUpdate:open":me[8]||(me[8]=Q=>z.value=Q),ui:{content:"z-50"}},{content:te(()=>[r("div",Xu,[r("div",Yu,[r("div",Qu,[f(pe,{name:"i-lucide-sparkles",class:"h-4 w-4"})]),r("h3",Ju,l(o(t)("layout.updateNotice.title")),1)]),r("p",Zu,l(o(t)("layout.updateNotice.message",{version:C.value})),1),r("p",em,l(o(lt)?o(t)("layout.updateNotice.desktopHint"):o(t)("layout.updateNotice.cliHint")),1),o(lt)?ne("",!0):(v(),k("div",tm," clb update ")),r("div",sm,[f(_e,{variant:"soft",disabled:M.value,onClick:me[7]||(me[7]=Q=>z.value=!1)},{default:te(()=>[Y(l(o(t)("layout.updateNotice.later")),1)]),_:1},8,["disabled"]),o(lt)?(v(),Te(_e,{key:0,color:"primary",loading:M.value,onClick:W},{default:te(()=>[Y(l(o(t)("layout.updateNotice.updateNow")),1)]),_:1},8,["loading"])):ne("",!0)])])]),_:1},8,["open"]),f(Kd)],2)}}}),om={class:"flex flex-col"},rm={class:"flex items-center justify-between border-b border-gray-200 px-6 py-4 dark:border-gray-700"},im={class:"flex items-center gap-3"},lm={class:"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-pink-400 to-pink-600"},cm={class:"bg-gray-100 p-4 dark:bg-gray-800"},dm={class:"mx-auto max-h-[60vh] overflow-auto rounded-lg bg-white shadow-lg dark:bg-gray-900"},um=["src"],mm=Re({__name:"ScreenCaptureModal",props:{open:{type:Boolean},imageData:{}},emits:["update:open"],setup(e,{emit:t}){const s=e,n=t,a=X({get:()=>s.open,set:c=>n("update:open",c)});function i(){a.value=!1}return(c,d)=>{const m=We,u=Ke,y=mt;return v(),Te(y,{open:a.value,"onUpdate:open":d[0]||(d[0]=g=>a.value=g),ui:{content:"max-w-4xl z-100"}},{content:te(()=>[r("div",om,[r("div",rm,[r("div",im,[r("div",lm,[f(m,{name:"i-heroicons-camera",class:"h-5 w-5 text-white"})]),d[1]||(d[1]=r("div",null,[r("h2",{class:"text-lg font-semibold text-gray-900 dark:text-white"},"截图预览")],-1))]),f(u,{icon:"i-heroicons-x-mark",variant:"ghost",color:"neutral",size:"sm",onClick:i})]),r("div",cm,[r("div",dm,[e.imageData?(v(),k("img",{key:0,src:e.imageData,alt:"截图预览",class:"block w-full"},null,8,um)):ne("",!0)])])])]),_:1},8,["open"])}}}),Ws=Nt("llm",()=>{const e=I([]),t=I([]),s=I(null),n=I(null),a=I(!1),i=I(!1),c=I([]),d=I([]),m=X(()=>e.value.find(M=>M.id===s.value?.configId)||null),u=X(()=>e.value.find(M=>M.id===n.value?.configId)||null),y=X(()=>!!s.value),g=X(()=>e.value.length>=99);function _(M){return c.value.find(D=>D.id===M)}function x(M){return d.value.filter(D=>D.providerId===M)}function w(M,D){return d.value.find(E=>E.providerId===M&&E.id===D)}function $(M){return d.value.find(D=>D.id===M)}async function P(){i.value||(await h(),i.value=!0)}async function h(){a.value=!0;try{const M=it(),[D,E,F,re,ve,de]=await Promise.all([M.getProviders(),M.getProviderRegistry(),M.getModelCatalog(),M.getConfigStore(),M.getDefaultAssistantSlot(),M.getFastModelSlot()]);t.value=D,c.value=E,d.value=F,e.value=re.configs,s.value=ve,n.value=de}catch(M){console.error("[LLM Store] 加载配置失败:",M)}finally{a.value=!1}}async function p(M,D){try{const E=await it().setDefaultAssistantModel(M,D);return E.success?(s.value={configId:M,modelId:D},!0):(console.error("[LLM Store] 设置默认助手模型失败:",E.error),!1)}catch(E){return console.error("[LLM Store] 设置默认助手模型失败:",E),!1}}async function C(M){try{const D=await it().setFastModel(M);return D.success?(n.value=M,!0):(console.error("[LLM Store] 设置快速模型失败:",D.error),!1)}catch(D){return console.error("[LLM Store] 设置快速模型失败:",D),!1}}async function S(){await h()}function z(M){const D=c.value.find(E=>E.id===M);return D?D.name:t.value.find(E=>E.id===M)?.name||M}return{configs:e,providers:t,providerRegistry:c,modelCatalog:d,defaultAssistant:s,fastModel:n,isLoading:a,isInitialized:i,defaultAssistantConfig:m,fastModelConfig:u,hasConfig:y,isMaxConfigs:g,init:P,loadConfigs:h,setDefaultAssistantModel:p,setFastModel:C,refreshConfigs:S,getProviderName:z,getProviderById:_,getModelsByProviderId:x,getModelById:w,findModelAcrossProviders:$}}),gm=Re({__name:"Tabs",props:{modelValue:{},items:{},size:{}},emits:["update:modelValue"],setup(e,{emit:t}){const s=e,n=t,a=I(),i=I(),c=X({get:()=>s.modelValue,set:m=>n("update:modelValue",m)}),d=async()=>{if(await at(),!a.value||!i.value)return;const m=s.items.findIndex(h=>h.value===c.value);if(m<0)return;const g=i.value.$el.querySelectorAll('[role="tab"]')[m];if(!g)return;const _=a.value,x=_.clientWidth,w=g.offsetLeft,$=g.offsetWidth,P=w+$/2-x/2;_.scrollTo({left:Math.max(0,P),behavior:"smooth"})};return Ue(c,()=>{d()},{immediate:!1}),(m,u)=>{const y=_s;return v(),k("div",{ref_key:"scrollContainer",ref:a,class:"overflow-x-auto overflow-y-hidden scrollbar-hide"},[f(y,{ref_key:"tabsRef",ref:i,modelValue:c.value,"onUpdate:modelValue":u[0]||(u[0]=g=>c.value=g),size:e.size,items:e.items,content:!1,class:"min-w-max"},null,8,["modelValue","size","items"])],512)}}}),Vt=ks(gm,[["__scopeId","data-v-4a114c59"]]),pm=["innerHTML"],fi=Re({__name:"AlertTips",props:{icon:{},content:{},color:{}},setup(e){return(t,s)=>{const n=Xi;return v(),Te(n,{color:e.color||"error",variant:"outline",icon:e.icon||"i-lucide-terminal",class:"p-2"},{title:te(()=>[r("p",{innerHTML:e.content},null,8,pm)]),_:1},8,["color","icon"])}}}),fm={key:0,class:"mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300"},hm={key:0,class:"font-normal text-gray-400"},vm={class:"flex gap-2"},ym={key:1,class:"mt-1 text-xs text-gray-500"},bm={key:2,class:"mt-2"},_m={key:0,class:"flex items-center gap-1 text-sm text-green-600 dark:text-green-400"},xm={key:1,class:"flex items-center gap-1 text-sm text-amber-600 dark:text-amber-400"},aa=Re({__name:"ApiKeyInput",props:{modelValue:{},placeholder:{default:""},label:{default:"API Key"},optionalText:{default:""},hint:{default:""},validateLoading:{type:Boolean,default:!1},validateDisabled:{type:Boolean,default:!1},validateText:{default:""},validationResult:{default:"idle"},validationMessage:{default:""}},emits:["update:modelValue","validate"],setup(e,{emit:t}){const s=e,n=t,a=X(()=>!!s.validateText),i=I(!1);function c(d){n("update:modelValue",d)}return(d,m)=>{const u=Ke,y=ut,g=We;return v(),k("div",null,[e.label?(v(),k("label",fm,[Y(l(e.label)+" ",1),e.optionalText?(v(),k("span",hm,l(e.optionalText),1)):ne("",!0)])):ne("",!0),r("div",vm,[f(y,{"model-value":e.modelValue,type:i.value?"text":"password",placeholder:e.placeholder,ui:{trailing:"pe-1"},class:"flex-1","onUpdate:modelValue":c},Vi({_:2},[e.modelValue?{name:"trailing",fn:te(()=>[f(u,{color:"neutral",variant:"link",size:"sm",icon:i.value?"i-heroicons-eye-slash":"i-heroicons-eye","aria-label":i.value?"Hide":"Show","aria-pressed":i.value,onClick:m[0]||(m[0]=_=>i.value=!i.value)},null,8,["icon","aria-label","aria-pressed"])]),key:"0"}:void 0]),1032,["model-value","type","placeholder"]),a.value?(v(),Te(u,{key:0,loading:e.validateLoading,disabled:e.validateDisabled,variant:"soft",onClick:m[1]||(m[1]=_=>n("validate"))},{default:te(()=>[Y(l(e.validateText),1)]),_:1},8,["loading","disabled"])):ne("",!0)]),e.hint?(v(),k("p",ym,l(e.hint),1)):ne("",!0),e.validationMessage?(v(),k("div",bm,[e.validationResult==="valid"?(v(),k("div",_m,[f(g,{name:"i-heroicons-check-circle",class:"h-4 w-4"}),Y(" "+l(e.validationMessage),1)])):e.validationResult==="invalid"?(v(),k("div",xm,[f(g,{name:"i-heroicons-exclamation-triangle",class:"h-4 w-4"}),Y(" "+l(e.validationMessage),1)])):ne("",!0)])):ne("",!0)])}}}),km={class:"flex max-h-[80vh] min-h-[400px] flex-col p-6"},wm={class:"mb-4 flex items-center justify-between"},Sm={class:"text-lg font-semibold text-gray-900 dark:text-white"},Cm={class:"flex items-center gap-2"},Im={class:"min-h-0 flex-1 overflow-y-auto"},Mm={key:0,class:"flex flex-col items-center justify-center py-12"},Tm={class:"text-sm text-gray-500"},Am={key:1,class:"flex flex-col items-center justify-center py-12"},$m={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},Pm={class:"mt-1 max-w-sm text-center text-xs text-gray-500"},Dm={key:2,class:"flex flex-col items-center justify-center py-12"},Lm={class:"text-sm text-gray-500"},Rm={key:3,class:"space-y-1"},Em={class:"min-w-0 flex-1"},Fm={class:"truncate text-sm font-medium text-gray-800 dark:text-gray-200"},Nm={class:"flex items-center gap-2"},Um={key:0,class:"truncate text-xs text-gray-400"},Om={key:1,class:"shrink-0 rounded bg-gray-100 px-1.5 py-0.5 text-[10px] font-medium text-gray-500 dark:bg-gray-800 dark:text-gray-400"},Vm={key:0,disabled:"",class:"ml-3 flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-xs text-green-500"},Hm={class:"mt-4 flex items-center justify-between border-t border-gray-100 pt-4 dark:border-gray-800"},zm={class:"text-xs text-gray-400"},Bm=Re({__name:"RemoteModelBrowser",props:Nn({models:{},loading:{type:Boolean},error:{},addedModelIds:{}},{open:{type:Boolean,required:!0},openModifiers:{}}),emits:Nn(["add","addAll","refresh"],["update:open"]),setup(e,{emit:t}){const{t:s}=Fe(),n=Hi(e,"open"),a=e,i=t,c=I(""),d=X(()=>{const y=c.value.toLowerCase().trim();return y?a.models.filter(g=>g.id.toLowerCase().includes(y)||g.name.toLowerCase().includes(y)||g.ownedBy&&g.ownedBy.toLowerCase().includes(y)):a.models}),m=X(()=>d.value.filter(y=>!a.addedModelIds.has(y.id)));function u(){i("addAll",m.value)}return(y,g)=>{const _=We,x=Ke,w=ut,$=mt;return v(),Te($,{open:n.value,ui:{content:"max-w-2xl z-[102]",overlay:"z-[101]"},"onUpdate:open":g[4]||(g[4]=P=>n.value=P)},{content:te(()=>[r("div",km,[r("div",wm,[r("h3",Sm,l(o(s)("settings.aiConfig.modal.fetchModelsTitle")),1),r("div",Cm,[d.value.length>0&&m.value.length>0?(v(),Te(x,{key:0,size:"xs",variant:"soft",onClick:u},{default:te(()=>[f(_,{name:"i-heroicons-plus",class:"h-3.5 w-3.5"}),Y(" "+l(o(s)("settings.aiConfig.modal.addAllModels"))+" ("+l(m.value.length)+") ",1)]),_:1})):ne("",!0),f(x,{size:"xs",variant:"ghost",loading:e.loading,onClick:g[0]||(g[0]=P=>i("refresh"))},{default:te(()=>[f(_,{name:"i-heroicons-arrow-path",class:"h-4 w-4"})]),_:1},8,["loading"])])]),f(w,{modelValue:c.value,"onUpdate:modelValue":g[1]||(g[1]=P=>c.value=P),placeholder:o(s)("settings.aiConfig.modal.searchModels"),class:"mb-3",ui:{leading:"pointer-events-none"}},{leading:te(()=>[f(_,{name:"i-heroicons-magnifying-glass",class:"h-4 w-4 text-gray-400"})]),_:1},8,["modelValue","placeholder"]),r("div",Im,[e.loading?(v(),k("div",Mm,[f(_,{name:"i-heroicons-arrow-path",class:"mb-3 h-8 w-8 animate-spin text-gray-400"}),r("p",Tm,l(o(s)("settings.aiConfig.modal.fetchModelsLoading")),1)])):e.error?(v(),k("div",Am,[f(_,{name:"i-heroicons-exclamation-triangle",class:"mb-3 h-8 w-8 text-amber-400"}),r("p",$m,l(o(s)("settings.aiConfig.modal.fetchModelsError")),1),r("p",Pm,l(e.error),1),f(x,{size:"xs",variant:"soft",class:"mt-3",onClick:g[2]||(g[2]=P=>i("refresh"))},{default:te(()=>[Y(l(o(s)("common.retry")),1)]),_:1})])):d.value.length===0?(v(),k("div",Dm,[f(_,{name:"i-heroicons-cube-transparent",class:"mb-3 h-8 w-8 text-gray-300"}),r("p",Lm,l(c.value?o(s)("common.noResults"):o(s)("settings.aiConfig.modal.fetchModelsEmpty")),1)])):(v(),k("div",Rm,[(v(!0),k(Pe,null,Be(d.value,P=>(v(),k("div",{key:P.id,class:"flex items-center justify-between rounded-lg px-3 py-2 transition-colors hover:bg-gray-50 dark:hover:bg-gray-800/50"},[r("div",Em,[r("p",Fm,l(P.id),1),r("div",Nm,[P.ownedBy?(v(),k("span",Um,l(P.ownedBy),1)):ne("",!0),P.contextWindow?(v(),k("span",Om,l(P.contextWindow>=1e6?(P.contextWindow/1048576).toFixed(1)+"M":Math.round(P.contextWindow/1024)+"K"),1)):ne("",!0)])]),e.addedModelIds.has(P.id)?(v(),k("button",Vm,[f(_,{name:"i-heroicons-check",class:"h-3.5 w-3.5"}),Y(" "+l(o(s)("settings.aiConfig.modal.modelAdded")),1)])):(v(),Te(x,{key:1,size:"xs",variant:"soft",class:"ml-3 shrink-0",onClick:h=>i("add",P)},{default:te(()=>[f(_,{name:"i-heroicons-plus",class:"h-3.5 w-3.5"}),Y(" "+l(o(s)("common.add")),1)]),_:1},8,["onClick"]))]))),128))]))]),r("div",Hm,[r("p",zm,l(o(s)("settings.aiConfig.modal.fetchModelsCount",{total:e.models.length,shown:d.value.length})),1),f(x,{variant:"soft",onClick:g[3]||(g[3]=P=>n.value=!1)},{default:te(()=>[Y(l(o(s)("common.close")),1)]),_:1})])])]),_:1},8,["open"])}}});function hi(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var na={exports:{}},Wm=na.exports,Lo;function _a(){return Lo||(Lo=1,(function(e,t){(function(s,n){e.exports=n()})(Wm,(function(){var s=1e3,n=6e4,a=36e5,i="millisecond",c="second",d="minute",m="hour",u="day",y="week",g="month",_="quarter",x="year",w="date",$="Invalid Date",P=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,h=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,p={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(A){var G=["th","st","nd","rd"],J=A%100;return"["+A+(G[(J-20)%10]||G[J]||G[0])+"]"}},C=function(A,G,J){var ue=String(A);return!ue||ue.length>=G?A:""+Array(G+1-ue.length).join(J)+A},S={s:C,z:function(A){var G=-A.utcOffset(),J=Math.abs(G),ue=Math.floor(J/60),W=J%60;return(G<=0?"+":"-")+C(ue,2,"0")+":"+C(W,2,"0")},m:function A(G,J){if(G.date()<J.date())return-A(J,G);var ue=12*(J.year()-G.year())+(J.month()-G.month()),W=G.clone().add(ue,g),V=J-W<0,H=G.clone().add(ue+(V?-1:1),g);return+(-(ue+(J-W)/(V?W-H:H-W))||0)},a:function(A){return A<0?Math.ceil(A)||0:Math.floor(A)},p:function(A){return{M:g,y:x,w:y,d:u,D:w,h:m,m:d,s:c,ms:i,Q:_}[A]||String(A||"").toLowerCase().replace(/s$/,"")},u:function(A){return A===void 0}},z="en",M={};M[z]=p;var D="$isDayjsObject",E=function(A){return A instanceof de||!(!A||!A[D])},F=function A(G,J,ue){var W;if(!G)return z;if(typeof G=="string"){var V=G.toLowerCase();M[V]&&(W=V),J&&(M[V]=J,W=V);var H=G.split("-");if(!W&&H.length>1)return A(H[0])}else{var ae=G.name;M[ae]=G,W=ae}return!ue&&W&&(z=W),W||!ue&&z},re=function(A,G){if(E(A))return A.clone();var J=typeof G=="object"?G:{};return J.date=A,J.args=arguments,new de(J)},ve=S;ve.l=F,ve.i=E,ve.w=function(A,G){return re(A,{locale:G.$L,utc:G.$u,x:G.$x,$offset:G.$offset})};var de=(function(){function A(J){this.$L=F(J.locale,null,!0),this.parse(J),this.$x=this.$x||J.x||{},this[D]=!0}var G=A.prototype;return G.parse=function(J){this.$d=(function(ue){var W=ue.date,V=ue.utc;if(W===null)return new Date(NaN);if(ve.u(W))return new Date;if(W instanceof Date)return new Date(W);if(typeof W=="string"&&!/Z$/i.test(W)){var H=W.match(P);if(H){var ae=H[2]-1||0,K=(H[7]||"0").substring(0,3);return V?new Date(Date.UTC(H[1],ae,H[3]||1,H[4]||0,H[5]||0,H[6]||0,K)):new Date(H[1],ae,H[3]||1,H[4]||0,H[5]||0,H[6]||0,K)}}return new Date(W)})(J),this.init()},G.init=function(){var J=this.$d;this.$y=J.getFullYear(),this.$M=J.getMonth(),this.$D=J.getDate(),this.$W=J.getDay(),this.$H=J.getHours(),this.$m=J.getMinutes(),this.$s=J.getSeconds(),this.$ms=J.getMilliseconds()},G.$utils=function(){return ve},G.isValid=function(){return this.$d.toString()!==$},G.isSame=function(J,ue){var W=re(J);return this.startOf(ue)<=W&&W<=this.endOf(ue)},G.isAfter=function(J,ue){return re(J)<this.startOf(ue)},G.isBefore=function(J,ue){return this.endOf(ue)<re(J)},G.$g=function(J,ue,W){return ve.u(J)?this[ue]:this.set(W,J)},G.unix=function(){return Math.floor(this.valueOf()/1e3)},G.valueOf=function(){return this.$d.getTime()},G.startOf=function(J,ue){var W=this,V=!!ve.u(ue)||ue,H=ve.p(J),ae=function(T,U){var Z=ve.w(W.$u?Date.UTC(W.$y,U,T):new Date(W.$y,U,T),W);return V?Z:Z.endOf(u)},K=function(T,U){return ve.w(W.toDate()[T].apply(W.toDate("s"),(V?[0,0,0,0]:[23,59,59,999]).slice(U)),W)},ee=this.$W,fe=this.$M,he=this.$D,le="set"+(this.$u?"UTC":"");switch(H){case x:return V?ae(1,0):ae(31,11);case g:return V?ae(1,fe):ae(0,fe+1);case y:var B=this.$locale().weekStart||0,N=(ee<B?ee+7:ee)-B;return ae(V?he-N:he+(6-N),fe);case u:case w:return K(le+"Hours",0);case m:return K(le+"Minutes",1);case d:return K(le+"Seconds",2);case c:return K(le+"Milliseconds",3);default:return this.clone()}},G.endOf=function(J){return this.startOf(J,!1)},G.$set=function(J,ue){var W,V=ve.p(J),H="set"+(this.$u?"UTC":""),ae=(W={},W[u]=H+"Date",W[w]=H+"Date",W[g]=H+"Month",W[x]=H+"FullYear",W[m]=H+"Hours",W[d]=H+"Minutes",W[c]=H+"Seconds",W[i]=H+"Milliseconds",W)[V],K=V===u?this.$D+(ue-this.$W):ue;if(V===g||V===x){var ee=this.clone().set(w,1);ee.$d[ae](K),ee.init(),this.$d=ee.set(w,Math.min(this.$D,ee.daysInMonth())).$d}else ae&&this.$d[ae](K);return this.init(),this},G.set=function(J,ue){return this.clone().$set(J,ue)},G.get=function(J){return this[ve.p(J)]()},G.add=function(J,ue){var W,V=this;J=Number(J);var H=ve.p(ue),ae=function(fe){var he=re(V);return ve.w(he.date(he.date()+Math.round(fe*J)),V)};if(H===g)return this.set(g,this.$M+J);if(H===x)return this.set(x,this.$y+J);if(H===u)return ae(1);if(H===y)return ae(7);var K=(W={},W[d]=n,W[m]=a,W[c]=s,W)[H]||1,ee=this.$d.getTime()+J*K;return ve.w(ee,this)},G.subtract=function(J,ue){return this.add(-1*J,ue)},G.format=function(J){var ue=this,W=this.$locale();if(!this.isValid())return W.invalidDate||$;var V=J||"YYYY-MM-DDTHH:mm:ssZ",H=ve.z(this),ae=this.$H,K=this.$m,ee=this.$M,fe=W.weekdays,he=W.months,le=W.meridiem,B=function(U,Z,oe,me){return U&&(U[Z]||U(ue,V))||oe[Z].slice(0,me)},N=function(U){return ve.s(ae%12||12,U,"0")},T=le||function(U,Z,oe){var me=U<12?"AM":"PM";return oe?me.toLowerCase():me};return V.replace(h,(function(U,Z){return Z||(function(oe){switch(oe){case"YY":return String(ue.$y).slice(-2);case"YYYY":return ve.s(ue.$y,4,"0");case"M":return ee+1;case"MM":return ve.s(ee+1,2,"0");case"MMM":return B(W.monthsShort,ee,he,3);case"MMMM":return B(he,ee);case"D":return ue.$D;case"DD":return ve.s(ue.$D,2,"0");case"d":return String(ue.$W);case"dd":return B(W.weekdaysMin,ue.$W,fe,2);case"ddd":return B(W.weekdaysShort,ue.$W,fe,3);case"dddd":return fe[ue.$W];case"H":return String(ae);case"HH":return ve.s(ae,2,"0");case"h":return N(1);case"hh":return N(2);case"a":return T(ae,K,!0);case"A":return T(ae,K,!1);case"m":return String(K);case"mm":return ve.s(K,2,"0");case"s":return String(ue.$s);case"ss":return ve.s(ue.$s,2,"0");case"SSS":return ve.s(ue.$ms,3,"0");case"Z":return H}return null})(U)||H.replace(":","")}))},G.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},G.diff=function(J,ue,W){var V,H=this,ae=ve.p(ue),K=re(J),ee=(K.utcOffset()-this.utcOffset())*n,fe=this-K,he=function(){return ve.m(H,K)};switch(ae){case x:V=he()/12;break;case g:V=he();break;case _:V=he()/3;break;case y:V=(fe-ee)/6048e5;break;case u:V=(fe-ee)/864e5;break;case m:V=fe/a;break;case d:V=fe/n;break;case c:V=fe/s;break;default:V=fe}return W?V:ve.a(V)},G.daysInMonth=function(){return this.endOf(g).$D},G.$locale=function(){return M[this.$L]},G.locale=function(J,ue){if(!J)return this.$L;var W=this.clone(),V=F(J,ue,!0);return V&&(W.$L=V),W},G.clone=function(){return ve.w(this.$d,this)},G.toDate=function(){return new Date(this.valueOf())},G.toJSON=function(){return this.isValid()?this.toISOString():null},G.toISOString=function(){return this.$d.toISOString()},G.toString=function(){return this.$d.toUTCString()},A})(),L=de.prototype;return re.prototype=L,[["$ms",i],["$s",c],["$m",d],["$H",m],["$W",u],["$M",g],["$y",x],["$D",w]].forEach((function(A){L[A[1]]=function(G){return this.$g(G,A[0],A[1])}})),re.extend=function(A,G){return A.$i||(A(G,de,re),A.$i=!0),re},re.locale=F,re.isDayjs=E,re.unix=function(A){return re(1e3*A)},re.en=M[z],re.Ls=M,re.p={},re}))})(na)),na.exports}var jm=_a();const gt=hi(jm);var oa={exports:{}},qm=oa.exports,Ro;function Km(){return Ro||(Ro=1,(function(e,t){(function(s,n){e.exports=n(_a())})(qm,(function(s){function n(c){return c&&typeof c=="object"&&"default"in c?c:{default:c}}var a=n(s),i={name:"zh-cn",weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),ordinal:function(c,d){return d==="W"?c+"周":c+"日"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},relativeTime:{future:"%s内",past:"%s前",s:"几秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},meridiem:function(c,d){var m=100*c+d;return m<600?"凌晨":m<900?"早上":m<1100?"上午":m<1300?"中午":m<1800?"下午":"晚上"}};return a.default.locale(i,null,!0),i}))})(oa)),oa.exports}Km();var ra={exports:{}},Gm=ra.exports,Eo;function Xm(){return Eo||(Eo=1,(function(e,t){(function(s,n){e.exports=n(_a())})(Gm,(function(s){function n(c){return c&&typeof c=="object"&&"default"in c?c:{default:c}}var a=n(s),i={name:"zh-tw",weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),ordinal:function(c,d){return d==="W"?c+"週":c+"日"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"},meridiem:function(c,d){var m=100*c+d;return m<600?"凌晨":m<900?"早上":m<1100?"上午":m<1300?"中午":m<1800?"下午":"晚上"}};return a.default.locale(i,null,!0),i}))})(ra)),ra.exports}Xm();var ia={exports:{}},Ym=ia.exports,Fo;function Qm(){return Fo||(Fo=1,(function(e,t){(function(s,n){e.exports=n()})(Ym,(function(){return{name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(s){var n=["th","st","nd","rd"],a=s%100;return"["+s+(n[(a-20)%10]||n[a]||n[0])+"]"}}}))})(ia)),ia.exports}Qm();var la={exports:{}},Jm=la.exports,No;function Zm(){return No||(No=1,(function(e,t){(function(s,n){e.exports=n(_a())})(Jm,(function(s){function n(c){return c&&typeof c=="object"&&"default"in c?c:{default:c}}var a=n(s),i={name:"ja",weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),ordinal:function(c){return c+"日"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日(ddd) HH:mm"},meridiem:function(c){return c<12?"午前":"午後"},relativeTime:{future:"%s後",past:"%s前",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}};return a.default.locale(i,null,!0),i}))})(la)),la.exports}Zm();const eg="确定",tg="取消",sg="保存",ag="编辑",ng="添加",og="截屏",rg="关闭",ig="返回",lg="完成",cg="重试",dg="应用初始化失败",ug="加载中...",mg="初始化中...",gg="无匹配结果",pg="导出成功",fg="导出失败",hg="生成中...",vg="重新生成",yg="打开目录",bg="请先在设置中配置 AI 服务",_g={unknown:"未知错误"},xg={text:"文字",image:"图片",voice:"语音",video:"视频",file:"文件",emoji:"表情",link:"链接",location:"位置",redPacket:"红包",transfer:"转账",poke:"拍一拍",call:"通话",share:"分享",reply:"回复",forward:"转发",contact:"名片",system:"系统",recall:"撤回",other:"其他",unknown:"未知"},kg={mon:"周一",tue:"周二",wed:"周三",thu:"周四",fri:"周五",sat:"周六",sun:"周日"},wg={jan:"1月",feb:"2月",mar:"3月",apr:"4月",may:"5月",jun:"6月",jul:"7月",aug:"8月",sep:"9月",oct:"10月",nov:"11月",dec:"12月"},Sg={title:"选择语言",subtitle:"请选择您偏好的界面语言",next:"下一步"},Cg={title:"隐私政策与用户协议",subtitle:"使用前请仔细阅读",disagree:"我不同意",agree:"我已阅读并同意",updateNotice:"协议内容有重要更新,请重新阅读并确认"},Ig={selectDate:"选择日期",clearDate:"清空日期"},Mg={mode:{recent:"最近",quarter:"按季",year:"按年",custom:"自定义"},recent:{oneYear:"近一年",twoYears:"近两年",fiveYears:"近五年",all:"全部"},display:{recent365:"最近一年",recent730:"最近两年",recent1825:"最近五年"},quarter:{label:"{year}年 第{quarter}季度"},year:{label:"{year}年"}},Tg={allMembers:"全部成员"},Ag={description:"此服务已开启认证保护,请输入 API Token 登录",tokenLabel:"API Token",tokenPlaceholder:"clb_xxxxxxxx",submit:"登录",hint:"Token 可在启动日志、config.toml 或 --token 启动参数中获取",errorEmpty:"请输入 Token",errorInvalid:"Token 无效,请检查后重试",errorNetwork:"网络连接失败",rememberDevice:"记住此设备",rememberWarning:"仅在可信设备上勾选,Token 将持久保存在浏览器中",logoutTitle:"账户",logoutDesc:"退出当前认证登录",logout:"退出登录"},$g={confirm:eg,cancel:tg,delete:"删除",save:sg,edit:ag,add:ng,capture:og,close:rg,back:ig,done:lg,retry:cg,initFailed:dg,loading:ug,initializing:mg,noResults:gg,export:"导出",exportSuccess:pg,exportFailed:fg,generating:hg,regenerate:vg,openFolder:yg,errorNoAIConfig:bg,error:_g,messageType:xg,weekday:kg,month:wg,languageSelect:Sg,agreement:Cg,datePicker:Ig,timeSelect:Mg,userSelect:Tg,login:Ag},Pg="ChatLab",Dg="分析新对话",Lg="管理",Rg="暂无记录",Eg="搜索对话名称",Fg="未找到匹配的聊天记录",Ng={rename:"重命名",pin:"置顶",unpin:"取消置顶",copyId:"复制 ID",delete:"删除"},Ug={title:"重命名",placeholder:"请输入新名称"},Og={title:"确认删除",message:'确定要删除聊天记录 "{name}" 吗?此操作无法撤销。'},Vg={tag:"New",title:"发现新版本",message:"最新版本是 v{version}。",desktopHint:"点击立即更新后,ChatLab 会开始检查并下载桌面端更新。",cliHint:"请在终端运行以下命令更新 CLI,更新后重启服务。",updateNow:"立即更新",later:"稍后"},Hg={all:"全部",private:"私聊",group:"群聊"},zg={importedAt:"导入时间",lastMessageTs:"最近对话",messageCount:"消息数量"},Bg={collapse:"收起侧边栏",search:"搜索聊天记录",sort:"排序"},Wg="{count} 条消息",jg={settings:"设置"},qg={brand:Pg,newAnalysis:Dg,manage:Lg,noRecords:Rg,searchPlaceholder:Eg,noSearchResult:Fg,contextMenu:Ng,renameModal:Ug,deleteModal:Og,updateNotice:Vg,filter:Hg,sort:zg,tooltip:Bg,sessionInfo:Wg,footer:jg},Kg="设置",Gg={basic:"基础设置",ai:"AI 设置",aiConfig:"模型服务",aiDefaultModel:"默认模型",semanticIndex:"语义索引",chatPreferences:"对话偏好",compression:"上下文压缩",aiPreprocess:"预处理",dataManage:"数据管理",storage:"存储管理",sessionManage:"会话索引",about:"关于",api:"自动化",apiSubTabs:{autoSync:"自动同步",apiService:"API 服务",mcp:"MCP"}},Xg={general:{title:"常规"},preferences:{title:"偏好设置"},language:{description:"选择软件显示语言"},appearance:{title:"外观设置",themeMode:"主题模式",auto:"跟随系统",light:"浅色模式",dark:"深色模式"},defaultTab:{description:"进入聊天对话后默认显示的页面",overview:"总览",aiChat:"AI 对话"},autoLaunch:{openAtLogin:"开机自启动",openAtLoginDesc:"系统启动时自动运行 ChatLab",devModeHint:"开发模式下不可用"},toolsPanel:{positionLabel:"快捷工具入口位置",positionDesc:"选择快捷工具面板的显示位置",positionSide:"右侧",positionHeader:"顶部"},screenshot:{mobileAdapt:"移动端适配",mobileAdaptDesc:"截图时自动缩放宽度,适合移动端查看"},network:{title:"网络设置",proxyMode:"代理模式",proxyModeDesc:"访问网络时使用的代理方式",modeOff:"关闭",modeSystem:"跟随系统",modeManual:"手动配置",proxyAddress:"代理地址",proxyPlaceholder:"http://127.0.0.1:7890",proxyHelp:"支持 HTTP/HTTPS 代理,格式如:http://127.0.0.1:7890",testConnection:"测试连接",testing:"测试中...",connectionSuccess:"代理连接成功!",connectionFailed:"连接失败",enterProxyFirst:"请先输入代理地址",invalidProxyUrl:"请输入有效的代理地址,格式如 http://127.0.0.1:7890",onlyHttpSupported:"仅支持 http:// 或 https:// 协议",saveFailed:"保存失败"}},Yg={title:"默认模型",noConfigs:"请先在「模型服务」中添加模型配置",selectProvider:"选择提供商",selectModel:"选择模型",assistantModel:{label:"默认助手模型",description:"用于 AI 对话、工具调用、SQL 助手、上下文压缩"},fastModel:{label:"快速模型",description:"用于会话摘要生成,未配置时使用默认助手模型",followAssistant:"跟随默认助手模型"}},Qg={title:"模型服务",defaultModel:"默认模型",empty:{title:"还没有配置 AI 服务",description:"添加一个配置开始使用 AI 功能"},addConfig:"添加新服务",maxConfigs:"已达最大配置数量(10个)",modal:{addConfig:"添加新服务",editConfig:"编辑服务",localService:"本地服务",configName:"配置名称",optional:"(选填)",configNamePlaceholderPreset:"留空将使用服务商名称",configNamePlaceholderCustom:"留空将使用 API 端点地址",aiProvider:"AI 服务商",apiKeyPlaceholder:"输入你的 API Key",apiKeyPlaceholderEdit:"输入新的 API Key(留空保持原有)",apiKeyPlaceholderLocal:"本地服务通常不需要",apiKeyHintLocal:"如果服务设置了认证,在此输入",validate:"验证",validationSuccess:"连接验证成功",validationFailed:"连接验证失败",validationFailedTitle:"API 连接验证失败",saveAnywayHint:"验证未通过,配置信息可能有误。是否仍然保存?",saveAnyway:"仍然保存",validationError:"验证失败:",model:"模型",apiEndpoint:"API 地址",apiEndpointHint:"兼容 OpenAI 格式的 API 端点",resolvedUrl:"实际请求地址:",fetchModels:"从 API 获取",fetchModelsTitle:"浏览远程模型",fetchModelsLoading:"正在获取模型列表...",fetchModelsEmpty:"未获取到模型",fetchModelsError:"获取模型列表失败",fetchModelsCount:"共 {total} 个模型,当前显示 {shown} 个",modelAdded:"已添加",addAllModels:"全部添加",searchModels:"搜索模型...",apiEndpointOverrideHint:"默认地址已填入,可按需改为完整 URL",customService:"自定义服务",visitWebsite:"访问官网",getApiKey:"获取 API Key",presetService:"预设服务",thirdPartyService:"第三方服务",addCustomModel:"添加模型",deleteCustomModel:"删除选中",customModelId:"模型端点名",customModelIdHint:"API 调用时使用的模型标识符",customModelDisplayName:"显示名称",customModelDisplayNamePlaceholder:"自定义显示名",editModel:"编辑模型",contextWindow:"上下文窗口",contextWindowPlaceholder:"如 128000",contextWindowHint:"模型支持的最大上下文 token 数(用于上下文压缩)",contextWindowMissing:"未设置上下文窗口,将使用默认值,建议点击「编辑模型」手动填写",modelRequired:"至少添加一个模型才能保存",apiFormat:"API 接口类型",apiFormatOpenAI:"OpenAI Completions",apiFormatAnthropic:"Anthropic",apiFormatGemini:"Gemini",apiFormatOpenAIResponses:"OpenAI Responses"},providerKind:{aggregator:"聚合",custom:"自定义"}},Jg={title:"本地存储管理",description:"管理 ChatLab 在本地存储的数据文件",dataLocation:{title:"数据目录位置",description:"自定义本地数据与缓存的存放位置",choose:"选择位置",applyPath:"应用",reset:"恢复默认",open:"打开",serverPathHint:"请输入运行 CLI 服务的机器可访问的绝对路径。",migrateHint:"检测到数据仍在旧位置,建议迁移至统一目录:",ignoreMigrateHint:"忽略",migrateAction:"一键迁移",restartTip:"切换目录后请重启应用,旧目录下缓存会跟随迁移",cliRestartTip:"切换目录后请重启 CLI 服务,旧目录下数据会在服务启动前迁移",confirmTitle:"确认切换数据目录",confirmMessage:"您即将切换数据存储位置,现有数据将被迁移到新目录。",newPath:"新目录路径",defaultPath:"默认位置",confirmWarning:"重启应用后,旧数据目录将被自动删除。请确保新目录路径正确。",cliConfirmWarning:"重启 CLI 服务后,旧数据目录会迁移到新位置。请确保新目录路径正确且服务进程有读写权限。",pathRequired:"请输入数据目录路径",installDirForbidden:"不能将数据目录放在应用安装目录下,应用更新时该目录会被清空",cancel:"取消",confirm:"确认切换",migrationQueuedTitle:"数据迁移已登记",migrationSuccessMessage:"应用需要重启以使更改生效。",cliMigrationSuccessMessage:"请停止当前 CLI 服务并重新启动,迁移会在服务启动前执行。重启完成后再重新打开页面查看新目录。",relaunchNow:"立即重启",acknowledge:"知道了"},openRootDir:"打开根目录",totalUsage:"总占用:",loading:"加载中...",files:"文件",notExist:"不存在",clear:"清理",open:"打开",cache:{databases:{name:"聊天记录数据库",description:"导入的聊天记录分析数据"},ai:{name:"AI 对话数据库",description:"AI 对话历史和配置文件"},statsCache:{name:"缓存数据",description:"聊天记录的统计缓存,清理后会自动重建"},logs:{name:"日志文件",description:"软件的运行日志,包含导入、AI、错误等日志"}}},Zg={session:{title:"会话索引设置",description:"会话索引将聊天记录按时间间隔自动分割为对话段落,便于AI分析和浏览",defaultThreshold:"默认分割间隔",thresholdUnit:"分钟",thresholdHelp:"超过该时间间隔的消息将被分到新的会话段落",generating:"正在生成",batchTitle:"批量生成索引",totalSessions:"共 {count} 个聊天",generatedCount:"已生成 {count} 个",notGeneratedCount:"未生成 {count} 个",loadingStatus:"加载中...",batchGenerate:"生成未索引",batchRegenerate:"全部重新生成",batchRegenerateConfirmTitle:"确认重新生成",batchRegenerateConfirmMessage:"此操作将清空所有已生成的 AI 摘要,并重新生成全部会话索引。",batchRegenerateConfirmWarning:"已有的摘要内容将被覆盖,此操作不可撤销。",summaryStrategy:"摘要详细程度",summaryStrategyHelp:"影响 AI 生成摘要时的详细程度",summaryBrief:"简要",summaryStandard:"标准"},semanticIndex:{title:"语义索引",description:"用所选向量模型为聊天记录建立索引,启用后 AI 回答时可按语义检索相关历史片段作为依据。",vectorModel:"向量模型",selectModel:"选择向量模型",switchModel:"切换模型",noModelSelected:"未选择向量模型",modelModalTitle:"配置向量模型",modeLocal:"本地模型",modeApi:"API",recommended:"推荐",approxSize:"约 {mb} MB",localDownloadHint:"首次建立索引时自动下载模型,可能需要一些时间。",apiTemplate:"服务模板",modelName:"模型名",apiKeySaved:"已保存,留空则不修改",apiKeyHint:"API Key 单独安全存储,配置文件只保存引用。",apiCostWarning:"API 模式可能产生服务商费用,请确认模型价格。",changeRebuildHint:"更换模型或 API 后,已启用对话需要重建索引。",searchMaxResults:{label:"单次检索片段数",hint:"AI 调用语义检索时默认返回的相关片段数(5-15)。AI 可按问题需要临时调高。"},overview:"索引概览",enabledCount:"已启用 {count} 个对话",coverage:"覆盖率 {percent}%",buildPending:"建立待处理索引",cleanup:"清理未使用索引",cleanupConfirm:"将删除已停用对话和旧模型遗留的索引数据。此操作不会删除聊天记录。",configFirst:"请先配置向量模型",selectConversations:"选择对话",enabledSessions:"已启用对话",state:{completed:"已完成",building:"建立中",pending:"待建立",needsRebuild:"需要重建",failed:"失败",paused:"已暂停"},action:{build:"建立索引",pause:"暂停",cancel:"取消",rebuild:"重建索引",disable:"停用"},session:{statusLabel:"状态",notEnabled:"未启用",coverageLabel:"覆盖率",progressLabel:"建立进度",enableHint:"启用后,AI 可以在回答此对话相关问题时检索历史聊天片段。",configFirst:"启用前需要先在 设置 > AI > 语义索引 配置向量模型。",enable:"启用索引",buildVsEnable:"启用索引:让此对话进入语义检索范围;建立索引:开始读取全部消息生成向量,可能消耗本地算力或 API 额度。",retry:"重试",continue:"继续"},picker:{title:"选择对话",all:"全部",group:"群聊",private:"私聊",searchPlaceholder:"按名称搜索",messages:"{count} 条消息",enabled:"已启用",selectedSummary:"已选择 {count} 个对话,约 {messages} 条消息",confirmDisableTitle:"确认停用",confirmDisableMessage:"这些对话将停用语义索引,但索引数据会保留,可稍后清理。"}}},ep={chatSettings:{title:"工具设置"},exportSettings:{title:"导出设置"},chatPreferences:{title:"对话偏好",enableAutoSkill:"AI 自主选择技能",enableAutoSkillDesc:"启用后,AI 会根据用户的问题自动匹配并激活合适的分析技能;关闭后仅在手动选择技能时生效",chartAutoMode:{title:"图表自动生成",description:"控制 AI 在没有手动选择绘图助手时使用图表的积极程度",explicit:"明确请求时",explicitHint:"只有你明确要求图表时,AI 才会生成图表。",suggest:"智能生成",suggestHint:"策略保守,仅在能明显帮助理解分析结果时生成图表。",aggressive:"积极生成",aggressiveHint:"AI 会更主动地在数据分析场景中生成图表。"}},maxMessages:{title:"发送条数限制",description:"每次提交给 AI 的最大消息数,数值越大 Token 消耗越多,分析也更准确(新手建议2000)"},searchContext:{title:"搜索上下文窗口",description:"搜索命中消息时自动携带前后的对话上下文,帮助 AI 理解消息背景。设为 0 则不携带上下文",before:"前",after:"后"},exportFormat:{title:"对话导出格式",description:"导出 AI 对话时使用的文件格式",txtLabel:"TXT"},sqlExportFormat:{title:"SQL Lab 导出格式",description:"导出 SQL 查询结果时使用的文件格式"},compression:{title:"上下文压缩",enable:"自动压缩上下文",enableDesc:"对话过长时自动压缩历史为摘要,保留关键信息的同时降低 Token 消耗",threshold:"压缩阈值",thresholdDesc:"上下文 Token 达到模型窗口的百分比时触发压缩",buffer:"缓冲区大小",bufferDesc:"保留最近消息原文的比例,不参与压缩",maxToolResultPercent:"工具结果上限",maxToolResultPercentDesc:"单次工具返回给 AI 的最大数据量占比(基于模型上下文窗口计算),超出部分会被智能截断"}},tp={title:"关于 ChatLab",description:"本地化的聊天记录分析工具,通过 SQL 和 AI Agent 回顾你的社交记忆。",version:"版本",checkUpdate:"检查更新",checking:"检查中...",upToDate:"已是最新版本",newVersionAvailable:"发现新版本 {version}",webUpdateHint:"请在终端运行 clb update 后重启服务。",updateCheckFailed:"检查更新失败:{error}",unknown:"未知",privacy:{title:"隐私设置",analytics:"匿名使用统计",analyticsDesc:"开启后,软件会收集版本号、操作系统版本等非敏感数据,用于帮助优化产品"},developer:{title:"开发者选项",debugMode:"DEBUG 模式",debugModeDesc:"开启后,将显示调试面板和快捷调试工具,可用于查看数据库、运行测试工具,并记录更详细的调试日志。"}},sp={title:"聊天记录预处理",description:"在聊天记录发送给 AI 前进行预处理,节省 Token 并过滤噪音。原始数据不会被修改。",dataCleaning:"数据清洗",dataCleaningDesc:"自动清理 XML 卡片消息(如分享链接、小程序等),提取有效内容,大幅节省 Token。建议保持开启。",mergeConsecutive:"合并连续发言",mergeConsecutiveDesc:"同一人在短时间内的连续消息合并为一条",mergeWindow:"合并时间窗口(秒)",denoise:"智能去噪",denoiseDesc:"过滤纯语气词、纯表情、系统占位符(如 [图片])等无意义消息",desensitize:"数据脱敏",desensitizeDesc:"根据规则将敏感信息(手机号、邮箱、证件号等)替换为占位符",desensitizeBuiltin:"预置规则",desensitizeResetBuiltin:"恢复默认",desensitizeCustom:"自定义规则",desensitizeAddCustom:"添加自定义规则",desensitizeRuleName:"规则名称",desensitizeRulePattern:"正则表达式",desensitizeRuleReplacement:"替换文本",desensitizeRuleAdd:"添加",desensitizeRuleInvalidRegex:"正则表达式语法错误",desensitizeRuleNamePlaceholder:"例如:员工工号",desensitizeRulePatternPlaceholder:"例如:EMP-\\d+",desensitizeRuleReplacementPlaceholder:"替换文本,如 [工号]",anonymizeNames:"昵称匿名化",anonymizeNamesDesc:"用编号(U1、U2…)替代真实昵称发送给 AI,减少幻觉并节省 Token",blacklist:"黑名单关键词",blacklistDesc:"包含以下任一关键词的消息将被整条过滤",blacklistPlaceholder:"输入关键词后按回车添加",blacklistAdd:"添加"},ap={groups:{credentials:"密码与 Token",credentials_desc:"API Key、Bearer Token 等凭据",global_contact:"通用联系方式",global_contact_desc:"邮箱等跨地区联系方式",global_financial:"通用金融信息",global_financial_desc:"信用卡等金融编号",global_network:"通用网络信息",global_network_desc:"URL、IP 地址等网络标识",region_cn:"中国大陆",region_cn_desc:"中国大陆电话、证件和银行卡等规则",region_us:"美国",region_us_desc:"美国电话、证件等规则",region_jp:"日本",region_jp_desc:"日本电话、个人编号等规则",region_kr:"韩国",region_kr_desc:"韩国电话、身份证号等规则"},rules:{cn_phone:"中国手机号",cn_phone_desc:"1xx xxxx xxxx 格式的 11 位号码",cn_id_card:"中国身份证号",cn_id_card_desc:"18 位,末位可含 X",cn_bank_card:"中国银行卡号",cn_bank_card_desc:"16-19 位连续数字",cn_landline:"中国座机号",cn_landline_desc:"区号-号码,如 010-12345678",us_ssn:"美国社会安全号 (SSN)",us_ssn_desc:"XXX-XX-XXXX 格式",us_phone:"美国电话号码",us_phone_desc:"+1 (XXX) XXX-XXXX 格式",us_drivers_license:"美国驾照号",us_drivers_license_desc:"字母开头 + 7-8 位数字",jp_phone:"日本电话号码",jp_phone_desc:"0x0-XXXX-XXXX 格式",jp_my_number:"日本个人编号",jp_my_number_desc:"12 位数字(マイナンバー)",kr_phone:"韩国电话号码",kr_phone_desc:"01X-XXXX-XXXX 格式",kr_rrn:"韩国身份证号",kr_rrn_desc:"XXXXXX-XXXXXXX 格式(주민번호)",api_key_prefix:"API Key / Token(已知前缀)",api_key_prefix_desc:"sk-、ghp_、AKIA 等开头的长字符串",bearer_token:"Bearer Token",bearer_token_desc:"Bearer 后的授权令牌值",email:"邮箱地址",email_desc:"user{'@'}domain.com 标准格式",credit_card:"信用卡号",credit_card_desc:"Visa / MasterCard / AmEx 等卡号",ipv4:"IPv4 地址",ipv4_desc:"如 192.168.1.1",url:"URL 链接",url_desc:"http:// 或 https:// 开头的链接"}},np={service:{title:"API 服务",enable:"启用 API 服务",enableDesc:"开启后,外部工具可通过 HTTP API 查询、导出和导入聊天数据。仅本机可访问 (127.0.0.1)",portInUseHint:"端口被占用,请在下方修改端口或关闭占用该端口的程序后重试"},status:{running:"运行中",stopped:"已停止",starting:"启动中...",portInUse:"端口被占用",error:"启动失败"},port:{title:"端口配置",label:"监听端口",desc:"API 服务监听的本地端口号(1024-65535)",edit:"修改",save:"保存",cancel:"取消"},token:{title:"访问令牌",label:"Bearer Token",desc:"所有 API 请求需要在 Authorization 头中携带此 Token",noToken:"尚未生成 Token,请先启用服务",regenerate:"重新生成"},dataSources:{title:"数据源",desc:"配置外部数据源 URL,ChatLab 将按设定间隔自动拉取并导入聊天数据。",empty:"暂无数据源",noSessions:"暂无导入会话,点击上方「管理导入会话」添加",disabled:"已暂停",every:"每",minutes:"分钟",lastSync:"上次同步",syncing:"同步中",messages:"条消息",addBtn:"添加数据源",form:{modalTitle:"添加数据源",name:"名称",namePlaceholder:"例如:我的聊天服务器",token:"访问令牌",tokenPlaceholder:"远程 API 的 Bearer Token",interval:"拉取间隔(分钟)",pullLimit:"每次拉取消息数",pullLimitPlaceholder:"默认 1000"},discovery:{baseUrl:"服务器地址",baseUrlPlaceholder:"示例:http://127.0.0.1:2333/api/v1",found:"发现 {count} 个会话",search:"搜索",searchPlaceholder:"按会话名称搜索",selectAll:"全选",deselectAll:"取消全选",selectByType:"会话类型",typeAll:"全部",typePrivate:"私聊",typeGroup:"群聊",loadMore:"加载更多",subscribe:"订阅 {count} 个会话",messages:"条消息",error:"连接远程服务器失败",connectionCheckFailed:"无法连接到远程服务器,请检查地址和令牌是否正确"},edit:{title:"修改配置",save:"保存",cancel:"取消",editSource:"修改配置",manageSessions:"管理订阅",subscribed:"已订阅"},deleteConfirm:{title:"删除数据源",message:"确认删除数据源「{name}」?该数据源下的所有导入配置将被移除。已导入的本地对话不会被删除。"},deleteSessionConfirm:{title:"删除订阅",message:"确认删除订阅「{name}」?",keepData:"仅删除订阅",deleteData:"同时删除导入的聊天"}},usage:{title:"使用说明",desc:"启用服务后,外部工具可通过 API 查询数据,或向 ChatLab 推送聊天记录。所有请求需携带 Bearer Token 认证。",authHint:"请求头示例:",docLink:"查看完整 API 文档"}},op={overview:{title:"MCP 概述",description:"MCP 让 AI 助手直接查询你的聊天记录。支持会话发现、关键词搜索、成员统计、时间分布等操作。",toolCount:"{count} 个工具",resourceCount:"{count} 个资源",installHint:"安装 chatlab-cli 后,在 AI 客户端中添加以下配置即可使用:"},clients:{other:"通用"},config:{title:"客户端配置",clientLabel:"MCP 客户端",copy:"复制",copied:"已复制",claudeHint:"将此配置添加到 ClaudeCode 的 MCP 配置中。",codexHint:"将此 TOML 配置添加到 ~/.codex/config.toml 文件中。",openclawHint:"将此配置添加到项目的 openclaw.json 文件中。",otherHint:"将此 JSON 配置添加到你的 MCP 客户端配置文件中。"},tips:{title:"使用提示",dataDir:"MCP 服务器读取 ~/.chatlab/ 目录下的聊天数据,与桌面应用共享同一份数据。",readOnly:"所有操作均为只读,不会修改你的聊天记录。",nodeRequired:"npx 和 CLI 方式需要 Node.js 20 或更高版本。",docs:"详细文档请访问 docs.chatlab.fun。"}},rp={title:Kg,tabs:Gg,basic:Xg,defaultModel:Yg,aiConfig:Qg,storage:Jg,ai:Zg,aiPrompt:ep,about:tp,aiPreprocess:sp,desensitize:ap,api:np,mcp:op},ip="探索新的聊天记忆",lp={file:"文件导入",api:"自动同步",push:"API推送",apiDescription:"配置外部平台的数据源,让聊天记录定期自动同步到ChatLab。",apiButton:"去配置自动同步",pushDescription:"开启本地API服务,允许第三方工具/插件或脚本将聊天记录主动推送至ChatLab。",pushButton:"去开启 API 服务"},cp={viewExample:"查看示例 Demo",downloading:"正在下载示例数据...",importing:"正在导入示例数据...",failed:"示例数据加载失败,请检查网络连接后重试"},dp={title:"数据库需要升级",description:"检测到 {count} 个数据库需要升级以支持新功能。",note:"升级过程通常只需几秒钟,不会丢失任何数据。",upgradeContent:"本次升级内容:",upgradeNow:"立即升级",upgrading:"正在升级...",failed:"迁移失败",partialFailed:"部分数据库升级失败",errorHint:"这通常是因为数据库文件损坏。建议在侧边栏中删除失败的会话,然后重新导入。",close:"关闭",retry:"重试"},up={title:"选择要导入的聊天",scanning:"正在扫描聊天列表...",scanFailed:"扫描失败",retry:"重试",selectAll:"全选",chatCount:"共 {count} 个聊天",selected:"已选 {count} 个",messageCount:"{count} 条消息",import:"导入 ({count})",noChats:"未发现任何聊天"},mp={title:"选择聊天记录格式",hint:"无法自动识别此文件的格式,请手动选择对应的聊天记录格式。",manualSelect:"手动选择格式",confirm:"使用此格式导入"},gp={export:"新手引导"},pp={website:"官网",terms:"使用条款"},fp={title:"版本日志",subtitle:"查看所有版本更新内容",latest:"最新版本",current:"当前版本",total:"共 {count} 个版本",close:"关闭",loadError:"加载版本日志失败",retry:"重试",types:{feat:"新功能",fix:"问题修复",refactor:"重构优化",docs:"文档更新",chore:"其他优化",style:"样式优化",ci:"CI/构建"}},hp={tagline:ip,tabs:lp,import:{dropHint:"松开鼠标导入文件",clickHint:"点击选择或拖拽聊天记录导入",multipleHint:"支持同时选择或拖拽多个文件",selectFiles:"选择聊天记录文件",selectFolder:"选择导出文件夹",importFolder:"导入文件夹",chatRecords:"聊天记录",allFiles:"所有文件",progress:{detecting:"正在检测格式...",reading:"正在读取文件...",parsing:"正在解析消息...",saving:"正在写入数据库...",done:"导入完成",error:"导入中断"},processed:"已处理 {count} 条消息",viewLog:"查看导入日志",cannotReadPath:"无法读取文件路径",errors:{no_file_selected:"未选择文件",import_failed:"导入失败",unrecognized_format:"无法识别的文件格式",no_messages:"未解析到任何消息,请检查文件格式是否正确",actionHint:"你还可以尝试下方手动匹配或查看日志:"},diagnostics:{format:"检测格式:",received:"收到消息:",written:" / 写入:",skipped:" / 跳过:"},batch:{importing:"正在批量导入",progressCount:"第 {current} 个 / 共 {total} 个",cancel:"取消导入",waiting:"等待中",skipped:"已跳过",success:"导入成功",completed:"批量导入完成",summary:"成功 {success} 个,失败 {failed} 个,跳过 {cancelled} 个",view:"查看"},options:{mergeImport:"合并导入",mergeImportHint:"勾选后,多个文件将合并为一个聊天记录"},merge:{importing:"正在合并",parsing:"正在解析文件...",merging:"正在合并消息...",completed:"合并完成",completedHint:"{count} 个文件已合并",messageCount:"{count} 条消息",failed:"合并失败"}},demo:cp,migration:dp,chatSelector:up,formatSelector:mp,quickStart:gp,footer:pp,changelog:fp},vp={loading:"加载分析数据...",loadError:"无法加载会话数据"},yp={loading:"加载分析数据...",loadError:"无法加载会话数据"},bp={overview:"总览",view:"洞察",aiChat:"AI对话",memory:"记忆",lab:"实验室",debug:"Debug"},_p={sqlTables:"SQL 表格",basicTools:"基础工具",tableBrowser:{chatDb:"聊天记录 DB",aiDb:"AI 对话 DB",rowCount:"共 {count} 行",page:"第 {current} / {total} 页",refresh:"刷新",noData:"暂无数据",editRow:"编辑行",deleteRow:"删除行",confirmDelete:"确认删除这行数据?",allConversations:"全部对话",copyCell:"复制选中项",copyRow:"复制整行 (JSON)",clearDebugContext:"清除 Debug 上下文",confirmClearDebug:"确认清除所有消息的 debug_context 数据?此操作不可撤销。"}},xp={comingSoon:"正在计划中,如果你对记忆功能有什么建议,欢迎加群讨论。",joinLink:"https://chatlab.fun/cn/other/community"},kp={viewChatRecord:"查看聊天记录",sessionIndex:"会话索引",semanticIndex:"语义索引",incrementalImport:"增量导入",memberManagement:"成员管理",more:"更多"},wp={title:"追加聊天记录",description:"选择要追加到「{name}」的聊天记录文件,系统会自动去重。",dropHint:"点击选择或拖拽文件到此处",analyzing:"正在分析文件...",totalInFile:"文件消息数",newMessages:"新增消息",duplicates:"重复消息",noNewMessages:"文件中没有新消息,所有消息都已存在",importing:"正在导入...",import:"确认导入 {count} 条消息",success:"导入成功",successDetail:"成功追加 {count} 条新消息",failed:"导入失败"},Sp={view:{typeAnalysis:"类型",timeAnalysis:"时间",topic:"话题",groupRelationships:"群关系",ranking:"榜单",relationship:"关系",languagePreference:"语言偏好"},quotes:{hotRepeat:"最火复读",catchphrase:"口头禅",keywordAnalysis:"关键词分析"},groupRelationships:{mentionGraph:"{'@'} 关系图",mentionRanking:"{'@'} 排行",proximity:"发言临近度"},member:{nicknameHistory:"昵称变更"}},Cp={messageTypeDistribution:"消息类型分布",memberDistribution:"成员消息占比",others:"其他人",memberComparison:"双方消息占比",statCards:{dailyAvgMessages:"日均消息",messagesCount:"{count} 条",daysCount:"共 {count} 天",imageMessages:"图片消息",imagesCount:"{count} 张",peakHour:"最活跃时段:",mostActiveWeekday:"最活跃星期",messagesOnDay:"{count} 条消息",weekendActivity:"周末活跃度",weekendRatio:"周末消息占比",mostActiveDate:"最活跃日期",consecutiveStreak:"连续打卡",daysStreak:"{count} 天",longestStreak:"最长连续活跃",activityRate:"活跃率",activeDaysRatio:"有消息的天数占比",lateNightChat:"深夜聊天",lateNightRatio:"占总消息 {ratio}%"},dailyTrend:{title:"每日消息趋势"},identity:{privateChat:"私聊",groupChat:"群聊",totalMessages:"消息总数",durationDays:"跨度天数",activeDays:"活跃天数",dailyAvgMessages:"日均消息"},tools:"常用工具"},Ip={miniMode:"迷你模式",exitMini:"退出迷你模式"},Mp={title:"导出聊天记录",selectOutputDir:"选择保存目录",format:"格式"},Tp={timeRange:"时间范围",allTime:"全部",today:"今天",lastWeek:"近7天",lastMonth:"近1个月",last3Months:"近3个月",lastYear:"近1年",customTime:"自定义",exportSuccess:"导出成功",exportFailed:"导出失败",exportPreparing:"正在准备导出..."},Ap={groupChat:vp,privateChat:yp,tabs:bp,debug:_p,memory:xp,tooltip:kp,incremental:wp,subTabs:Sp,overview:Cp,toolsPanel:Ip,messageExport:Mp,filter:Tp},$p={searchPlaceholder:"搜索对话名称",searchResult:"找到 {count} / {total} 个",noSearchResult:"未找到匹配的聊天记录",selectAll:"全选",shiftClickHint:"按住 Shift 点击可范围多选",selected:"已选 {count} 个",empty:"暂无聊天记录",delete:"删除选中",confirmTitle:"确认删除",confirmMessage:"确定要删除选中的 {count} 个聊天记录吗?此操作不可撤销。",deleting:"正在删除...",columns:{name:"名称",platform:"平台",messages:"消息数",summaries:"AI摘要",aiChats:"AI 对话",importedAt:"导入时间"},clickToEdit:"点击编辑名称",merge:"合并选中",mergeHint:"选择 2 个以上同聊天类型的聊天记录才能合并",mergeConfirmTitle:"合并聊天记录",mergeConfirmMessage:"将合并选中的 {count} 个聊天记录,生成一条新的合并记录。",deleteOriginalsLabel:"合并后删除原聊天记录",mergeRiskWarning:"强提醒:删除后不可恢复,且由于跨平台上下文差异,聊天语义可能出现错位或混乱。请确认你已备份原始数据并理解风险。",mergeSteps:{exporting:"正在导出聊天记录...",parsing:"正在解析文件...",checking:"正在检测冲突...",merging:"正在合并数据...",cleaning:"正在清理临时文件..."},mergeSuccess:"成功合并 {count} 个聊天记录",mergeError:"合并失败:{error}",mergedSuffix:"合并"},Pp={batchManage:$p},Dp={name:"DeepSeek"},Lp={name:"通义千问"},Rp={name:"Gemini"},Ep={name:"MiniMax"},Fp={name:"GLM"},Np={name:"Kimi"},Up={name:"豆包"},Op={name:"硅基流动"},Vp={name:"Groq"},Hp={name:"OpenRouter"},zp={name:"xAI"},Bp={deepseek:Dp,qwen:Lp,gemini:Rp,minimax:Ep,glm:Fp,kimi:Np,doubao:Up,siliconflow:Op,groq:Vp,openrouter:Hp,xai:zp,"openai-compatible":{name:"第三方服务"}},Wp={chatExplorer:"对话式探索",sqlLab:"SQL实验室"},jp={scrollToBottom:"返回底部",input:{placeholderWithSlash:"输入你的问题,或输入 / 选择技能、输入 {'@'} 选择成员...",placeholderWithActiveSkill:"已选择 /{name},请输入具体问题...",slashHint:"输入 / 选择技能",useSkill:"选择技能",mentionHint:"输入 {'@'} 选择成员",mentionEmpty:"没有匹配的成员",mentionEmptyHint:"可按昵称、别名或账号搜索",slashEmpty:"没有匹配的技能",slashEmptyHint:"打开技能管理导入内置技能,或创建一个自定义技能",manageSkills:"管理技能",previewTagsLabel:"标签",previewToolsLabel:"工具",previewUnavailable:"暂无可预览的技能提示词",quickAsk:"快速提问",editQuickAsk:"编辑快速提问",send:"发送",needMoreThanSkill:"仅选择技能还不能发送,请继续输入具体问题",needQuestion:"请输入问题后再发送"},fork:{success:"已复刻对话",failed:"复刻对话失败"},backgroundTask:{runningShort:"进行中",runningTitle:"AI 正在后台推理",runningDescription:"上一条问题仍在推理,请等待完成或先停止。",blockedAction:"当前回答仍在生成中,请先等待完成或手动停止。",return:"返回查看"},message:{copy:{tooltip:"复制 Markdown",success:"Markdown 已复制到剪贴板",failed:"复制 Markdown 失败"},process:{label:"执行过程",processing:"处理中",processed:"已处理"},toolResult:{view:"查看结果",title:"发送给 AI 的工具结果",copy:"复制结果",copySuccess:"工具结果已复制",copyFailed:"复制工具结果失败",displayTruncated:"此历史结果仅保存了截断版本;当前轮 AI 可能看到了更完整的内容。"},edit:{tooltip:"编辑并重新生成",submit:"发送",overwriteSubsequent:"覆盖后续所有对话"},fork:{tooltip:"从此处复刻对话"},chart:{expand:"打开大图",empty:"暂无数据",rows:"{count} 行数据",truncated:"已截断"},generating:"正在生成回复...",summary:{label:"上下文摘要",info:"以上对话已被压缩为摘要以节省上下文空间"},plan:{label:"分析计划",evidenceNeeded:"所需证据",suggestedTools:"建议工具",successCriteria:"完成标准",noTools:"无"},think:{labels:{think:"已思考",analysis:"分析",reasoning:"推理",reflection:"反思",planValidation:"生成计划",other:"思考({tag})"},loading:"思考中",duration:"耗时 {seconds}s"},toolParams:{keywords:"关键词",time:"时间",getMessages:"获取 {count} 条消息",limit:"限制 {count} 条",contextWithMessages:"{msgCount} 条消息的前后各 {contextSize} 条上下文",context:"前后各 {size} 条上下文",topMembers:"前 {count} 名成员",search:"搜索",getMemberList:"获取成员列表",memberId:"成员ID",timeStats:{hourly:"按小时",weekday:"按星期",daily:"按日期"}}},thinking:{processingResult:"处理结果中",called:"已调用:",analyzing:"正在分析问题...",compressing:"正在压缩上下文..."},statusBar:{model:{notConfigured:"AI 未配置"},messageLimit:{label:"消息上限:",title:"每次发送的最大消息条数,点击配置"},agent:{label:"Agent",contextTokens:"上下文",phase:{compressing:"压缩上下文",preparing:"准备中",thinking:"思考中",tool_running:"调用工具",responding:"生成中",completed:"已完成",aborted:"已停止",error:"错误"},phaseShort:{compressing:"压缩",preparing:"准备",thinking:"思考",tool_running:"工具",responding:"生成",completed:"完成",aborted:"停止",error:"错误"}},thinking:{title:"思考强度",tooltip:"设置模型的思考强度",level:{default:"默认",off:"关闭",minimal:"极低",low:"低",medium:"中",high:"高",xhigh:"最高",auto:"自动"}},tokenUsageTitle:"累计 Token 使用量",cacheHit:"缓存命中",export:{label:"导出",title:"导出当前对话"},log:{label:"日志",title:"打开当前 AI 日志文件",openFailed:"打开日志失败",openFailedDesc:"请稍后重试"}},conversation:{newChat:"新对话",newConversation:"新建对话",empty:"暂无历史记录",startNew:"开始新对话",titlePlaceholder:"输入标题...",group:{last7Days:"最近 7 天",last30Days:"最近 30 天"},rename:"重命名",copyId:"复制 ID",delete:"删除",export:{createdAt:"创建时间",user:"用户",assistant:"AI 助手",noMessages:"对话没有消息"}},error:{title:"处理失败",detail:"错误详情",viewDetail:"查看详情",requestUrl:"请求路径",statusCode:"状态码",responseBody:"响应内容",responseHeaders:"响应头",requestBody:"请求体",name:"错误名称",message:"错误信息",stack:"堆栈信息",cause:"错误原因",provider:"服务商",copyAll:"复制全部",copied:"已复制到剪贴板",unknown:"未知错误"},dataSource:{title:"数据源",keywords:"关键词:",empty:"暂无数据",emptyHint:"发送问题后,相关记录会显示在这里",totalRecords:"共 {count} 条记录",loadMore:"加载更多"},evidence:{title:"依据证据",query:"问题",criteria:"判定标准",empty:"未找到明确可计入的证据",totalSources:"共 {count} 条来源",mode:{auto:"自动",hybrid:"语义 + 关键词",semantic:"语义检索",keyword:"关键词检索"},group:{included:"计入证据",excluded:"不计入",uncertain:"不确定"},warning:{criteria_missing:"未提供判定标准,分组结果较为保守",keywords_missing_for_hybrid:"未提供关键词,已退化为纯语义检索",keywords_required_for_keyword_mode:"关键词模式需要提供关键词",semantic_unavailable:"语义索引不可用,已改用关键词检索",keyword_unavailable:"关键词检索不可用",semantic_partial:"语义检索结果可能不完整"}}},qp={editor:{errorEmptySQL:"请输入 SQL 语句",placeholder:"输入 SQL 查询语句...",tip:"提示:双击左侧列名可插入到 SQL",history:"历史",generateAndRun:"生成并执行",switchToSQLMode:"切换为 SQL 输入模式",switchToPromptMode:"切换为 Prompt 输入模式",run:"运行"},schema:{tables:"数据表",doubleClickToInsert:"双击插入到 SQL",primaryKey:"主键"},result:{queryError:"查询错误",rows:"{count} 行",readableTime:"时间戳转日期",viewChat:"查看聊天记录",summarize:"总结一下",pageSize:"每页",emptyResult:"查询结果为空",initialState:"输入 SQL 语句并运行查看结果",initialHint:"仅支持只读查询(SELECT / WITH),建议添加 LIMIT 以提升性能",summaryTitle:"AI 结果总结",analyzing:"AI 正在分析结果...",errorSummary:"总结失败"},generate:{placeholder:"例如:查找发言最多的前 10 个成员、统计每天的消息数量、找出包含「买房」关键词的消息...",errorEmptyPrompt:"请输入查询需求",errorGenerate:"AI 生成失败",errorTokenLimit:"模型输出达到 token 上限,未能生成完整回复(可能思考消耗了过多 token)",aiOutput:"AI 输出",thinking:"思考中…",thinkingProcess:"思考过程",waitingAI:"等待 AI 响应...",defaultPromptPrivate:"请统计最近1年私聊中双方各自的:消息总数、消息占比、活跃天数、日均消息数(按活跃天计算)、首次发言时间、最近发言时间;按消息总数降序展示。",defaultPromptGroup:"请统计最近1年群聊中各成员的:消息总数、消息占比、活跃天数、日均消息数(按活跃天计算)、文本消息占比;显示成员名称并按消息总数降序,返回前20名。"},history:{title:"AI 生成历史",execute:"执行",empty:"暂无历史记录",justNow:"刚刚",minutesAgo:"{count} 分钟前",hoursAgo:"{count} 小时前",today:"今天"}},Kp={selector:{title:"选择一个助手开始对话",heroTitlePrefix:"使用",heroTitleSuffix:"开始对话",subtitle:"每个助手擅长不同类型的分析任务,选择最适合你需求的助手",noAssistants:"当前场景暂无可用助手",manage:"管理助手",addNew:"新增助手"},config:{viewTitle:"查看配置",createTitle:"新建助手",editTitle:"助手配置",betaWarning:"当前处于测试阶段,配置逻辑后续可能调整,请备份好提示词和相关配置。",tabs:{basic:"基础配置",tools:"工具管理"},name:"名称",systemPrompt:"系统提示词",chatType:"适用聊天类型",chatTypeAll:"全部",chatTypeGroup:"群聊",chatTypePrivate:"私聊",locale:"适用语言",localeHint:"不选 = 全语言",presetQuestions:"预设问题",addQuestion:"添加新问题...",coreTools:"核心工具",coreToolsHint:"基础数据获取工具,始终启用,不可关闭",analysisTools:"分析工具",analysisToolsHint:"按需开启的分析能力,勾选后才会对 AI 可用",selectAll:"全选",deselectAll:"全不选",resetDefault:"恢复默认",create:"创建"},market:{title:"助手管理",tabs:{local:"本地助手",market:"助手市场"},localHint:"管理已导入的助手,可配置或删除",marketHint:"浏览助手市场,导入后即可使用和自由编辑",default:"默认",reimport:"重新导入",imported:"已导入",import:"导入",importing:"导入中...",importSuccess:"导入成功",importFailed:"导入失败",viewConfig:"查看配置",duplicate:"复制",addAssistant:"新增助手",noLocal:"暂无已导入的助手",noCatalog:"暂无可用助手,请检查网络连接",loading:"加载中...",loadFailed:"加载失败,请检查网络连接",retry:"重试"},fallbackName:"助手",duplicateSuffix:"(副本)",toast:{loadFailed:"加载失败",createSuccess:"创建成功",createFailed:"创建失败",saveSuccess:"保存成功",saveFailed:"保存失败",resetSuccess:"已恢复默认",resetFailed:"恢复失败",unknownError:"未知错误"},builtinToolDesc:{get_chat_overview:"获取聊天概览信息",search_messages:"搜索聊天消息",deep_search_messages:"深度搜索聊天消息",get_recent_messages:"获取最近消息",get_message_context:"获取消息上下文",get_conversation_between:"获取两人对话",get_members:"获取成员列表",get_schema:"查看数据表结构",get_member_stats:"获取成员统计",get_member_name_history:"获取成员改名历史",get_time_stats:"获取时间统计",get_segment_messages:"获取段落消息",get_segment_summaries:"获取段落摘要",message_type_breakdown:"消息类型分布",peak_chat_hours_by_member:"成员活跃时段",member_activity_trend:"成员活跃趋势",silent_members:"沉默成员检测",reply_interaction_ranking:"回复互动排行",mutual_interaction_pairs:"互动好友配对",member_message_length_stats:"消息长度统计",unanswered_messages:"未回复消息",daily_active_members:"每日活跃人数趋势",conversation_initiator_stats:"话题发起者统计",activity_heatmap:"活跃度热力图",response_time_analysis:"响应时间分析",keyword_frequency:"高频词统计",render_chart:"生成动态图表",semantic_search_current_chat:"检索聊天历史"}},Gp={config:{createTitle:"新建技能",editTitle:"技能配置",chatScopeAll:"全部",chatScopeGroup:"群聊",chatScopePrivate:"私聊",rawEditorHint:"直接编辑完整的技能 Markdown 文件(含 YAML frontmatter)",create:"创建",save:"保存"},market:{title:"技能管理",tabs:{local:"本地技能",market:"技能市场"},localHint:"管理已导入的技能,可配置或删除",marketHint:"浏览技能市场,导入后即可使用和自由编辑",reimport:"重新导入",imported:"已导入",import:"导入",importing:"导入中...",importSuccess:"导入成功",importFailed:"导入失败",noLocal:"暂无已导入的技能",noCatalog:"暂无可用技能,请检查网络连接",addSkill:"新建自定义技能",loading:"加载中...",loadFailed:"加载失败,请检查网络连接",retry:"重试"},active:{label:"主动调用技能:{name}"}},Xp={toolTest:{coreTools:"核心工具",analysisTools:"分析工具",parameters:"参数",arrayPlaceholder:"多个值用逗号分隔",execute:"执行",cancel:"取消",elapsed:"耗时 {ms}ms",result:"执行结果",truncated:"结果过大,已截断显示。建议减小 limit 参数以获取完整数据。"}},Yp={tab:Wp,chat:jp,sqlLab:qp,assistant:Kp,skill:Gp,lab:Xp},Qp={loading:"正在分析词频...",stats:{wordsLabel:"总词数",clickHint:"提示:点击词云可查看相关消息"},config:{maxWords:"显示词数",sizeScale:"字体大小",userFilter:"用户筛选",posFilter:"词性过滤",enableStopwords:"过滤停用词",dict:"分词词库"},size:{small:"小",medium:"中",large:"大",xlarge:"特大"},posFilter:{all:"全部词性",meaningful:"有意义",custom:"自定义",customHint:"自定义词性",selectMeaningful:"有意义",selectAll:"全选",clearAll:"清空"},empty:{title:"暂无词云数据",description:"当前筛选条件下没有足够的文本消息用于生成词云"},dict:{zhCN:"简体中文",zhTW:"繁体中文",download:"下载词库","download_zh-CN":"下载简体词库","download_zh-TW":"下载繁体词库",needDownload:"词云已使用内置分词结果展示。下载中文词库可提升分词准确度。",downloadHint:"~8MB",downloadSuccess:"词库下载成功",downloadFailed:"词库下载失败",promptTitle:"繁体中文词库",promptDescription:"检测到您使用繁体中文,词云分析需要繁体词库才能获得最佳效果。是否立即下载?(约 8MB)",promptDownload:"立即下载",promptLater:"稍后再说"}},Jp={title:"🔍 关键词排行",description:"分析群聊关键词使用排行,这里可以自定义多种榜单",countTemplate:"共 {count} 位成员",templateLabel:"模板:",newTemplate:"+ 新建",searchPlaceholder:"输入并搜索",clear:"清空",templateHint:"* 右键模板可编辑或删除",keyword:"关键词",ranking:"排行榜",multiColorMode:"多色模式",times:"{count}次",timesWithPercent:"次 ({percent}%)",loading:"正在分析数据...",empty:"暂无数据,请尝试添加关键词或切换模板",contextMenu:{edit:"编辑",delete:"删除"},modal:{createTitle:"创建模板",editTitle:"编辑模板",templateName:"模板名称",templateNamePlaceholder:"如:正能量",keywords:"关键词",keywordPlaceholder:"输入后回车添加",update:"更新"},templates:{laugh:{name:"含笑量",keywords:"哈哈,xswl,lol,笑死,233",description:"统计群内的快乐指数"},sad:{name:"沮丧量",keywords:"想死,难受,哭了,崩溃,裂开,无语,累了",description:"统计群内的负面情绪"},praise:{name:"捧哏",keywords:"牛逼,666,厉害,强,nb,大佬,羡慕,好强",description:"统计群内最会夸人的成员"},slacker:{name:"摸鱼",keywords:"摸鱼,下班,饿了,困了,不想上班,什么时候下班",description:"统计群内最想下班的打工人"},gossip:{name:"吃瓜",keywords:"吃瓜,细说,真的假的,展开说说,尊嘟假嘟,卧槽,离谱",description:"统计群内最爱吃瓜的成员"},polite:{name:"礼貌",keywords:"谢谢,麻烦,收到,好的,辛苦,打扰,请教",description:"统计群内最客气的成员"},curious:{name:"疑问",keywords:"为什么,啥,怎么,不懂,求教",description:"统计群内问题最多的成员"}}},Zp={title:"🔥 最火复读内容",loading:"正在加载复读数据...",description:"单次复读参与人数最多的内容",countTemplate:"共 {count} 条热门复读",people:"{count}人",times:"{count} 次",colon:":",viewChat:"查看聊天记录",empty:"暂无复读数据"},ef={heroPrefix:"共分析了",heroMiddle:"条消息,",heroMiddleSecond:"产生了",heroSuffix:"个不同词汇",topTopicsPrefix:"你们最爱聊:",hotTopic:"热门话题",hotTopicDesc:"出现了 {count} 次",richness:"词汇丰富度",richnessValue:"{value}%",richnessDesc:"不重复词 {unique} / 总词数 {total}",chatStyle:"聊天风格",styleEncyclopedia:"百科全书型",styleEncyclopediaDesc:"名词占比高,爱聊人、地、事",styleAction:"行动派",styleActionDesc:"动词占比高,爱讨论做什么",styleExpressive:"表达派",styleExpressiveDesc:"形容词占比高,善于修饰表达",styleBalanced:"均衡型",styleBalancedDesc:"聊天内容多元,各类话题均衡",expressionStyle:"表达风格",expressionCasual:"简洁口语",expressionCasualDesc:"用词简短,轻松随意",expressionFormal:"正式书面",expressionFormalDesc:"用词考究,表达严谨",expressionMixed:"混合风格",expressionMixedDesc:"口语与书面兼顾",watermark:"话题画像 · Topic Profile",sharedTopics:"共同话题"},tf={loading:"正在分析口头禅数据...",times:"{count}次",empty:{title:"暂无口头禅数据"},stats:{clickHint:"提示:点击可查看相关消息"},viewMode:{list:"列表",wordcloud:"词云"},topN:"显示数量"},sf={loading:"正在分析语言偏好...",empty:"暂无足够的文字消息进行语言分析",card:{diversityTitle:"词汇深度",diversityDesc:"不重复词汇占比",styleTitle:"聊天气质",styleDesc:"基于词性分布推导的表达风格",punctTitle:"标点性格",punctDesc:"最常用的标点风格",watermark:"语言偏好 · Language Preference",radarFactual:"事实性",radarActive:"行动感",radarDescriptive:"描述欲",radarAffable:"亲和力",radarIntense:"程度感",radarNoun:"名词",radarVerb:"动词",radarAdj:"形容词",radarModal:"语气词",radarAdv:"副词",topCatchphrases:"热门口头禅",languageProfiles:"语言画像"},catchphrasePK:{title:"口头禅 PK",sharedCount:"{count} 个共同口头禅",hint:"提示:点击可查看相关消息,粉框标记为共同口头禅"},pos:{title:"词性图谱",styleEncyclopedia:"百科全书派",styleAction:"行动派",styleExpressive:"感性派",styleBalanced:"均衡派"},modal:{title:"语气词画像",toneSoft:"软萌亲和",toneCurious:"好奇探索",toneCasual:"随和建议",toneCalm:"沉稳内敛",toneMixed:"多元风格",empty:"暂无语气词数据"},punctuation:{title:"标点性格",none:"无标点",personalityDeep:"深沉文学型",personalityPassionate:"情绪饱满型",personalityCurious:"好奇宝宝型",personalityCheerful:"心情愉悦型",personalityFreeflow:"意识流型",personalityPrecise:"严谨规范型",empty:"暂无标点数据"}},af={wordcloud:Qp,keywords:Jp,hotRepeat:Zp,topicProfile:ef,catchphrase:tf,languagePreference:sf},nf={title:"你是谁?",subtitle:"选择你在这个对话中的身份",description:"设置后你的消息会显示在聊天记录查看器右侧,AI 对话也能识别你的身份,分析更准确。同平台的其他对话会自动套用。",searchPlaceholder:"搜索成员",noMatch:"没有找到匹配的成员",empty:"暂无成员数据",later:"稍后",dontRemind:"本会话不再提醒",save:"保存",clear:"清除当前选择",saved:"已设置你的身份",appliedToOthers:"已自动应用到 {count} 个同平台会话",saveFailed:"设置身份失败",currentOwner:"我是:{name}",choose:"选择我是谁",change:"修改",helper:"设置后 AI 对话能识别你的身份,分析更准确"},of={title:"成员管理",description:"共 {count} 位成员,可为成员添加别名备注或移除成员",searchPlaceholder:"搜索群昵称、账号名称、ID 或别名",noMatch:"没有找到匹配的成员",empty:"暂无成员数据",table:{accountName:"账号名称",groupNickname:"群昵称",messageCount:"消息数",customAlias:"自定义别名",actions:"操作"},aliasPlaceholder:"输入后回车添加",delete:"删除",mergeSelected:"合并选中",mergeSelectedCount:"已选 {count} 位成员",pagination:"显示 {start} - {end} 条,共 {total} 位成员",tip:"提示:添加别名可以更好地识别聊天记录中的对话对象,别名将用于搜索和 AI 分析中。",mergeModal:{title:"确认合并成员?",content:"将成员 {source}({sourceCount} 条消息)合并到 {target}({targetCount} 条消息)下。默认保留消息更多一方的名称。",hint:"合并后不可恢复,被合并成员的消息将全部归属到保留成员。",cancel:"取消",confirm:"确认合并"},modal:{title:"确认删除成员?",content:"即将删除成员 {name} 及其 {count} 条消息,此操作不可恢复。",cancel:"取消",confirm:"确认删除"}},rf={note:"备注:QQ的旧版客户端支持导出聊天记录为txt版本,这个版本会获得最准确的昵称变更记录",title:"昵称变更记录",loading:"加载中...",hasChanges:"{count} 位成员曾修改过昵称",noChanges:"暂无成员修改昵称",current:"当前",empty:"该群组所有成员均未修改过昵称",loadingText:"正在加载昵称变更记录..."},lf={loading:"正在分析 {'@'} 互动数据...",topMentioners:"📢 谁最喜欢 {'@'} 别人",totalMentions:"共 {count} 次 {'@'}",topMentioned:"🎯 谁最常被 {'@'}",popularMember:"群里的人气王",times:"次",oneWay:{title:"🐕 单向关注检测",description:"发现 {count} 对单向关注关系(一方 {'@'} 另一方占比 ≥80%)",neverRespond:"从不回应",reverse:"反向 {count} 次",ratio:"{value}% 单向"},twoWay:{title:"💕 双向奔赴检测",description:"发现 {count} 对互动频繁的 CP(互相 {'@'} 且平衡度 ≥30%)",interactions:"次互动",balance:"{value}% 平衡"},emptyTitle:"📱 {'@'} 互动分析",empty:"暂无 {'@'} 互动数据",modal:{title:"{name} 的 {'@'} 关系",topMentioned:"最常 {'@'} 的人",topMentioners:"最常 {'@'} TA 的人",timesCount:"{count} 次",close:"关闭"}},cf={ownerPrompt:nf,list:of,nicknameHistory:rf,relationships:lf,private:{title:"对话成员",description:"共 {count} 位成员,可为成员添加别名备注用于搜索和 AI 分析",messageCount:"消息数",percentage:"占比 {value}%",customAlias:"自定义别名",aliasPlaceholder:"输入后回车添加别名",empty:"暂无成员数据",tipTitle:"提示",tipContent:"添加别名可以更好地识别聊天记录中的对话对象,别名将用于搜索和 AI 分析中。"}},df={title:"聊天记录查看器",loadedCount:"已加载 {count} 条消息"},uf={loading:"加载中...",noMessages:"暂无消息",tryAdjustFilter:"尝试调整筛选条件",loadingMore:"加载更多...",scrollUpForMore:"↑ 向上滚动加载更多",scrollDownForMore:"↓ 向下滚动加载更多"},mf={messageId:"消息 ID",memberNotSupported:"成员(暂不支持)",keywordsPlaceholder:"关键词,多个用逗号分隔,回车搜索",startDate:"起始日期",endDate:"结束日期",reset:"重置",filter:"筛选"},gf={timeline:"摘要",noSessions:"暂无摘要",generateSummary:"生成摘要",tooFewMessages:"消息太少"},pf="摘要生成失败",ff="未知错误",hf={title:"批量生成摘要",byRange:"按范围",byTime:"按时间",selectRange:"选择范围",rangeStart:"最早",rangeInfo:"约",sessionsUnit:"个会话",rangeEnd:"最近",timeRange:"选择时间范围",today:"今天",yesterday:"昨天",week:"最近7天",month:"最近30天",custom:"自定义",found:"找到",hasSummary:"个已有摘要",tooFewMessages:"个消息太少",pending:"待生成:",unit:"个",noPending:"没有可生成的会话",noSessions:"该时间范围内没有会话",checking:"检查中...",loading:"加载中...",progress:"进度",session:"会话",statusSuccess:"成功",statusSkipped:"跳过",statusFailed:"失败",success:"成功:",failed:"失败:",skipped:"跳过:",start:"开始生成",stop:"停止"},vf={viewContext:"查看上下文",replyTo:"回复"},yf={title:"会话索引",subtitle:"用于聊天记录的时间线导航",notGenerated:"尚未生成会话索引",notGeneratedHint:"生成会话索引后,您可以在聊天记录查看器中使用时间线快速导航到不同的会话。",whatIsIt:"会话索引的作用:",benefit1:"根据消息时间间隔自动识别会话边界",benefit2:"在聊天记录查看器中提供时间线导航",benefit3:"为 AI 分析提供对话上下文理解能力",generated:"会话索引已生成",sessionCount:"共识别出 {count} 个会话",regenerateHint:"如果您调整了会话间隔阈值,可以重新生成索引。",generate:"生成索引",regenerate:"重新生成",generating:"生成中...",cancel:"取消"},bf={drawer:df,messageList:uf,filter:mf,timeline:gf,summaryFailed:pf,summaryUnknownError:ff,batchSummary:hf,messageItem:vf,sessionIndex:yf},_f={rankingView:"排行视图",memberView:"成员视图",matrixView:"矩阵视图",modelSettings:"模型参数",lookAhead:"邻居数量",lookAheadDesc:"每条消息向后看几个发言者",decaySeconds:"时间衰减(秒)",decaySecondsDesc:"值越大,远距离消息权重越高",applySettings:"应用设置",noData:"暂无数据",selectMember:"选择成员",selectMemberHint:"请从左侧选择一个成员",msgCount:"发言数",relationCount:"关系数",relationsByIntimacy:"发言临近度排行",noRelations:"暂无关系数据",intimacy:"临近度",interactionRanking:"互动排行",score:"临近度",coOccurrence:"共现",times:"次",totalMembers:"群成员",totalMessages:"消息总数",involvedMembers:"参与成员",edgeCount:"关系数"},xf={typeDistribution:"消息类型分布",hourlyDistribution:"小时分布",weekdayDistribution:"星期分布",monthlyDistribution:"月份分布",yearlyDistribution:"年份分布",timeHeatmap:"时间热力图",heatmapHint:"展示聊天时间规律",calendarHeatmap:"消息日历",calendarHint:"每日消息分布",calendarTooltipMessages:"消息",lengthDetailTitle:"短消息分布 (1-25字)",lengthDetailHint:"逐字统计",lengthGroupedTitle:"长度区间分布",lengthGroupedHint:"每5字一组",noTextMessages:"暂无文字消息",noData:"暂无数据",profile:{avgLengthUnit:"{count} 字/条",textExpression:"文字表达力",textExpressionDesc:"最长消息 {count} 字",mediaRichness:"媒体丰富度",shortMaster:"短消息达人",shortMasterDesc:"共 {count} 条 ≤5字",essayLover:"小作文爱好者",essayLoverDesc:"≥{threshold}字的消息",typeDistribution:"消息类型",heroLine1Prefix:"你们共留下了",heroLine1Suffix:"条消息"},typeCard:{watermark:"类型报告",nonTextPrefix:"除文字外,发了",nonTextImage:"图片",nonTextEmoji:"表情包",nonTextVoice:"语音",nonTextVideo:"视频",nonTextFile:"文件",nonTextLink:"链接",unitImage:"张图片",unitEmoji:"个表情包",unitVoice:"条语音",unitVideo:"个视频",unitFile:"个文件",unitLink:"个链接"},timeCard:{hourlyDistribution:"24h 分布",watermark:"时间报告",heroDaysIn:"天里有",heroDaysActive:"天在聊天",heroAvgPrefix:"平均每天",heroAvgSuffix:"条消息",personalityNightOwl:"夜猫子",personalityEarlyBird:"早起鸟",personalityLunchChat:"午间闲聊",personalityEveningChat:"晚间活跃",personalityDaytime:"白天活跃",personalityEveryday:"全勤达人",personalityWeekend:"周末活跃",personalityWeekday:"工作日活跃",peakRecord:"巅峰记录",peakRecordDesc:"单日最多 {count} 条",topHoursLabel:"最活跃时段",peakWeekdayLabel:"最活跃周几",weekendRatio:"周末占比",weekendRatioDesc:"周末消息占比"},timeAnalysis:{memberTrendTitle:"消息趋势",memberTrendHint:"各成员的月度消息量变化"},typeAnalysis:{textDepthTitle:"文字深度分析",textTotal:"文字消息总数",avgLength:"平均字数",medianLength:"中位数长度",maxLength:"最长消息",percentiles:"文字长度分位数",shortMessages:"短消息(≤5字)",essayMessages:"小作文(≥30字)"}},kf={layout:"布局",circular:"环形",force:"力导向",directed:"有向",reset:"重置",graphHint:"共 {nodes} 位成员,{links} 条互动关系",noInteraction:"暂无艾特互动数据"},wf={empty:{title:"暂无关系数据",description:"当前时间范围内没有会话记录。"},monthly:{title:"月度明细",totalSessionsPrefix:"共对话",totalSessionsSuffix:"次"},trend:{title:"主动性趋势",hint:"蓝色线为 {name} 的月度主动发起占比,50% 线为均衡基准"},hero:{totalSessionsPrefix:"你们共进行了",totalSessionsSuffix:"次对话",initiativePrefix:"其中有",initiativeByPrefix:"的开场白由",initiativeBySuffix:"发起",initiateTimes:"次发起"},initiator:"发起话题",closer:"结束话题",closerTitle:"话题终结者",closerHint:"统计话题结束时最后发言的人。",noActivity:"本月无互动",watermarkReport:"关系报告",monthFormat:"{year}年{month}月",monthShortFormat:"{month}月",iceBreaker:{title:"破冰达人",hint:"超过 24 小时沉默后主动打破僵局的次数"},responseLatency:{title:"回复速度",hint:"当对方发来消息后,平均多久回复",seconds:"{n} 秒",minutesSeconds:"{m}分{s}秒",hours:"{n} 小时",hoursMinutes:"{h} 小时 {m} 分钟"},perseverance:{title:"锲而不舍",hintWithThreshold:"对方{threshold}内还没回复就又发了一次消息的次数",thresholdMinutes:"{n}分钟"},labels:{wellMatched:"势均力敌",missingYou:"{name} 在想念",monologue:"{name} 的独白",peacefulSilence:"各自安好",fleetingThoughts:"偶尔想起"}},Sf={title:"时间线视图",description:"消息时间分布、活跃周期变化趋势等可视化内容"},Cf={rankListPro:{fullRanking:"完整排行",memberCount:"共 {count} 位成员"},rankList:{unit:"条"},nicknameHistory:{periodToNow:"{start} ~ 至今",periodRange:"{start} ~ {end}",current:"当前",empty:"暂无昵称记录"},listPro:{countTemplate:"共 {count} 项",fullRanking:"完整排行",empty:"暂无数据"}},If={cluster:_f,message:xf,interaction:kf,relationship:wf,timeline:Sf,charts:Cf},Mf="关键词过滤",Tf="方案列表",Af="方案名称",$f="请输入方案名称",Pf="新方案",Df="新建方案",Lf="删除方案",Rf="设为默认",Ef="默认方案",Ff="关键词过滤",Nf="不过滤",Uf="管理方案",Of="添加过滤词",Vf="输入词语后回车添加,支持空格或逗号分隔批量添加",Hf="添加",zf="过滤词列表",Bf="清空全部",Wf="暂无方案,点击 + 新建",jf="暂无过滤词,在上方输入框添加",qf="选择或创建一个过滤方案",Kf="已过滤 {count} 个词",Gf="关闭",Xf={title:Mf,schemeList:Tf,schemeName:Af,schemeNamePlaceholder:$f,defaultSchemeName:Pf,createScheme:Df,deleteScheme:Lf,setDefault:Rf,isDefault:Ef,filterScheme:Ff,noFilter:Nf,manage:Uf,addWords:Of,addWordsPlaceholder:Vf,add:Hf,wordList:zf,clearAll:Bf,emptyScheme:Wf,emptyWords:jf,selectOrCreate:qf,activeCount:Kf,close:Gf},Yf={common:$g,layout:qg,settings:rp,home:hp,analysis:Ap,tools:Pp,providers:Bp,ai:Yp,quotes:af,members:cf,records:bf,views:If,wordFilter:Xf},Qf="OK",Jf="Cancel",Zf="Save",eh="Edit",th="Add",sh="Capture",ah="Close",nh="Back",oh="Done",rh="Retry",ih="App initialization failed",lh="Loading...",ch="Initializing...",dh="No results found",uh="Export successful",mh="Export failed",gh="Generating...",ph="Regenerate",fh="Open Folder",hh="Please configure AI service in Settings first",vh={unknown:"Unknown error"},yh={text:"Text",image:"Image",voice:"Voice",video:"Video",file:"File",emoji:"Emoji",link:"Link",location:"Location",redPacket:"Red Packet",transfer:"Transfer",poke:"Poke",call:"Call",share:"Share",reply:"Reply",forward:"Forward",contact:"Contact",system:"System",recall:"Recalled",other:"Other",unknown:"Unknown"},bh={mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat",sun:"Sun"},_h={jan:"Jan",feb:"Feb",mar:"Mar",apr:"Apr",may:"May",jun:"Jun",jul:"Jul",aug:"Aug",sep:"Sep",oct:"Oct",nov:"Nov",dec:"Dec"},xh={title:"Select Language",subtitle:"Choose your preferred interface language",next:"Next"},kh={title:"Privacy Policy & User Agreement",subtitle:"Please read carefully before use",disagree:"I Disagree",agree:"I Have Read and Agree",updateNotice:"The agreement has important updates. Please read and confirm again."},wh={selectDate:"Select Date",clearDate:"Clear"},Sh={mode:{recent:"Recent",quarter:"Quarter",year:"Year",custom:"Custom"},recent:{oneYear:"Last 1Y",twoYears:"Last 2Y",fiveYears:"Last 5Y",all:"All"},display:{recent365:"Last 1 year",recent730:"Last 2 years",recent1825:"Last 5 years"},quarter:{label:"{year} Q{quarter}"},year:{label:"{year}"}},Ch={allMembers:"All Members"},Ih={description:"This service requires authentication. Enter your API Token to continue.",tokenLabel:"API Token",tokenPlaceholder:"clb_xxxxxxxx",submit:"Login",hint:"Find the token in the startup log, config.toml, or the --token flag",errorEmpty:"Please enter a token",errorInvalid:"Invalid token, please check and try again",errorNetwork:"Network connection failed",rememberDevice:"Remember this device",rememberWarning:"Only check on trusted devices — token will persist in the browser",logoutTitle:"Account",logoutDesc:"Sign out of the current session",logout:"Sign out"},Mh={confirm:Qf,cancel:Jf,delete:"Delete",save:Zf,edit:eh,add:th,capture:sh,close:ah,back:nh,done:oh,retry:rh,initFailed:ih,loading:lh,initializing:ch,noResults:dh,export:"Export",exportSuccess:uh,exportFailed:mh,generating:gh,regenerate:ph,openFolder:fh,errorNoAIConfig:hh,error:vh,messageType:yh,weekday:bh,month:_h,languageSelect:xh,agreement:kh,datePicker:wh,timeSelect:Sh,userSelect:Ch,login:Ih},Th="ChatLab",Ah="New Analysis",$h="Manage",Ph="No records",Dh="Search conversation name",Lh="No matching chat records found",Rh={rename:"Rename",pin:"Pin",unpin:"Unpin",copyId:"Copy ID",delete:"Delete"},Eh={title:"Rename",placeholder:"Enter new name"},Fh={title:"Confirm Delete",message:'Are you sure you want to delete "{name}"? This action cannot be undone.'},Nh={tag:"New",title:"Update Available",message:"The latest version is v{version}.",desktopHint:"Click Update Now to start checking and downloading the desktop update.",cliHint:"Run the following command in your terminal, then restart the service.",updateNow:"Update Now",later:"Later"},Uh={all:"All",private:"Private",group:"Group"},Oh={importedAt:"Import Time",lastMessageTs:"Last Message",messageCount:"Message Count"},Vh={collapse:"Collapse sidebar",search:"Search chat records",sort:"Sort"},Hh="{count} messages",zh={settings:"Settings"},Bh={brand:Th,newAnalysis:Ah,manage:$h,noRecords:Ph,searchPlaceholder:Dh,noSearchResult:Lh,contextMenu:Rh,renameModal:Eh,deleteModal:Fh,updateNotice:Nh,filter:Uh,sort:Oh,tooltip:Vh,sessionInfo:Hh,footer:zh},Wh="Settings",jh={basic:"General",ai:"AI Settings",aiConfig:"Model Service",aiDefaultModel:"Default Model",semanticIndex:"Semantic Index",chatPreferences:"Preferences",compression:"Compression",aiPreprocess:"Preprocess",dataManage:"Data Management",storage:"Storage",sessionManage:"Session Index",about:"About",api:"Automation",apiSubTabs:{autoSync:"Auto Sync",apiService:"API Service",mcp:"MCP"}},qh={general:{title:"General"},preferences:{title:"Preferences"},language:{description:"Choose language"},appearance:{title:"Appearance",themeMode:"Theme Mode",auto:"System",light:"Light",dark:"Dark"},defaultTab:{description:"Default page when entering a chat conversation",overview:"Overview",aiChat:"AI Chat"},autoLaunch:{openAtLogin:"Launch at Login",openAtLoginDesc:"Automatically start ChatLab when the system boots",devModeHint:"Not available in dev mode"},toolsPanel:{positionLabel:"Tools Panel Position",positionDesc:"Choose where the quick tools panel appears",positionSide:"Side",positionHeader:"Header"},screenshot:{mobileAdapt:"Mobile Adaptation",mobileAdaptDesc:"Auto-scale width when taking screenshots for mobile viewing"},network:{title:"Network",proxyMode:"Proxy Mode",proxyModeDesc:"How to connect when accessing external services",modeOff:"Off",modeSystem:"System",modeManual:"Manual",proxyAddress:"Proxy Address",proxyPlaceholder:"http://127.0.0.1:7890",proxyHelp:"Supports HTTP/HTTPS proxy, e.g.: http://127.0.0.1:7890",testConnection:"Test Connection",testing:"Testing...",connectionSuccess:"Proxy connection successful!",connectionFailed:"Connection failed",enterProxyFirst:"Please enter proxy address first",invalidProxyUrl:"Please enter a valid proxy address, e.g. http://127.0.0.1:7890",onlyHttpSupported:"Only http:// or https:// protocols are supported",saveFailed:"Save failed"}},Kh={title:"Default Model",noConfigs:'Please add a model configuration in "Model Service" first',selectProvider:"Select provider",selectModel:"Select model",assistantModel:{label:"Default Assistant Model",description:"Used for AI chat, tool calls, SQL assistant, and context compression"},fastModel:{label:"Fast Model",description:"Used for session summary generation. Falls back to the default assistant model if not set",followAssistant:"Follow default assistant model"}},Gh={title:"Model Services",defaultModel:"Default Model",empty:{title:"No AI service configured",description:"Add a configuration to start using AI features"},addConfig:"Add New Service",maxConfigs:"Maximum configurations reached (10)",modal:{addConfig:"Add New Service",editConfig:"Edit Service",localService:"Local Service",configName:"Configuration Name",optional:" (Optional)",configNamePlaceholderPreset:"Leave empty to use provider name",configNamePlaceholderCustom:"Leave empty to use API endpoint",aiProvider:"AI Provider",apiKeyPlaceholder:"Enter your API Key",apiKeyPlaceholderEdit:"Enter new API Key (leave empty to keep current)",apiKeyPlaceholderLocal:"Usually not required for local services",apiKeyHintLocal:"Enter if the service requires authentication",validate:"Validate",validationSuccess:"Connection validated successfully",validationFailed:"Connection validation failed",validationFailedTitle:"API Connection Validation Failed",saveAnywayHint:"Validation did not pass. The configuration may be incorrect. Save anyway?",saveAnyway:"Save Anyway",validationError:"Validation failed: ",model:"Model",apiEndpoint:"API URL",apiEndpointHint:"OpenAI-compatible API endpoint",resolvedUrl:"Resolved URL:",fetchModels:"Fetch from API",fetchModelsTitle:"Browse Remote Models",fetchModelsLoading:"Fetching model list...",fetchModelsEmpty:"No models found",fetchModelsError:"Failed to fetch models",fetchModelsCount:"{total} models total, showing {shown}",modelAdded:"Added",addAllModels:"Add all",searchModels:"Search models...",apiEndpointOverrideHint:"Default URL is prefilled. Replace if needed",customService:"Custom Service",visitWebsite:"Visit Website",getApiKey:"Get API Key",presetService:"Preset",thirdPartyService:"Third-party",addCustomModel:"Add Model",deleteCustomModel:"Delete Selected",customModelId:"Model Endpoint Name",customModelIdHint:"The model identifier used in API calls",customModelDisplayName:"Display Name",customModelDisplayNamePlaceholder:"Custom display name",editModel:"Edit Model",contextWindow:"Context Window",contextWindowPlaceholder:"e.g. 128000",contextWindowHint:"Maximum context tokens supported by this model (used for context compression)",contextWindowMissing:'Context window not set, will use default. Click "Edit Model" to set it manually',modelRequired:"Add at least one model to save",apiFormat:"API Format",apiFormatOpenAI:"OpenAI Completions",apiFormatAnthropic:"Anthropic",apiFormatGemini:"Gemini",apiFormatOpenAIResponses:"OpenAI Responses"},providerKind:{aggregator:"Aggregator",custom:"Custom"}},Xh={title:"Local Storage Management",description:"Manage data files stored locally by ChatLab",dataLocation:{title:"Data Directory",description:"Customize where local data and cache are stored",choose:"Choose",applyPath:"Apply",reset:"Reset",open:"Open",serverPathHint:"Enter an absolute path that is accessible from the machine running the CLI server.",migrateHint:"Data is still at a legacy location. Migrate to the unified directory:",ignoreMigrateHint:"Ignore",migrateAction:"Migrate Now",restartTip:"Please restart the app after switching. Data will be migrated from the old directory.",cliRestartTip:"Restart the CLI server after switching. Data will be migrated before the server starts.",confirmTitle:"Confirm Directory Change",confirmMessage:"You are about to change the data storage location. Existing data will be migrated to the new directory.",newPath:"New directory path",defaultPath:"Default location",confirmWarning:"After restarting, the old data directory will be automatically deleted. Please ensure the new path is correct.",cliConfirmWarning:"After restarting the CLI server, data will be migrated to the new location. Make sure the path is correct and writable by the server process.",pathRequired:"Please enter a data directory path",installDirForbidden:"Data directory cannot be placed inside the app installation directory, as it will be cleared during updates",cancel:"Cancel",confirm:"Confirm",migrationQueuedTitle:"Migration Queued",migrationSuccessMessage:"The app needs to restart for changes to take effect.",cliMigrationSuccessMessage:"Stop the current CLI server and start it again. Migration will run before the server starts. Reopen the page afterward to see the new directory.",relaunchNow:"Restart Now",acknowledge:"Got it"},openRootDir:"Open Root",totalUsage:"Total: ",loading:"Loading...",files:"files",notExist:"Not exist",clear:"Clear",open:"Open",cache:{databases:{name:"Chat Databases",description:"Imported chat analysis data"},ai:{name:"AI Chat Databases",description:"AI chat history and config files"},statsCache:{name:"Cache Data",description:"Statistics cache for chat records, auto-rebuilt after clearing"},logs:{name:"Log Files",description:"App logs including import, AI, error logs"}}},Yh={session:{title:"Session Index Settings",description:"Session index splits chat history into conversation segments by time gaps for better AI analysis",defaultThreshold:"Default Gap Threshold",thresholdUnit:"minutes",thresholdHelp:"Messages exceeding this time gap will be split into a new session",generating:"Generating",batchTitle:"Batch Generate Index",totalSessions:"{count} chats total",generatedCount:"{count} generated",notGeneratedCount:"{count} not generated",loadingStatus:"Loading...",batchGenerate:"Generate Missing",batchRegenerate:"Regenerate All",batchRegenerateConfirmTitle:"Confirm Regeneration",batchRegenerateConfirmMessage:"This will clear all existing AI summaries and regenerate session indexes from scratch.",batchRegenerateConfirmWarning:"Existing summaries will be overwritten. This action cannot be undone.",summaryStrategy:"Summary Detail Level",summaryStrategyHelp:"Controls how detailed AI-generated summaries will be",summaryBrief:"Brief",summaryStandard:"Standard"},semanticIndex:{title:"Semantic Index",description:"Builds an index of your chats with the selected vector model. Once enabled, the AI can semantically retrieve relevant past excerpts as supporting evidence.",vectorModel:"Vector Model",selectModel:"Select Vector Model",switchModel:"Switch Model",noModelSelected:"No vector model selected",modelModalTitle:"Configure Vector Model",modeLocal:"Local Model",modeApi:"API",recommended:"Recommended",approxSize:"~{mb} MB",localDownloadHint:"The model is downloaded automatically on first index build, which may take a while.",apiTemplate:"Service Template",modelName:"Model Name",apiKeySaved:"Saved; leave blank to keep",apiKeyHint:"API keys are stored separately and securely; the config keeps only a reference.",apiCostWarning:"API mode may incur provider costs. Please confirm model pricing.",changeRebuildHint:"After changing the model or API, enabled conversations need to be rebuilt.",searchMaxResults:{label:"Excerpts per search",hint:"Default number of relevant excerpts returned when the AI runs a semantic search (5-15). The AI may raise it as needed."},overview:"Index Overview",enabledCount:"{count} conversations enabled",coverage:"Coverage {percent}%",buildPending:"Build Pending Indexes",cleanup:"Clean Up Unused Indexes",cleanupConfirm:"This deletes index data from disabled conversations and old models. It does not delete chat records.",configFirst:"Configure a vector model first",selectConversations:"Select Conversations",enabledSessions:"Enabled Conversations",state:{completed:"Completed",building:"Building",pending:"Pending",needsRebuild:"Needs Rebuild",failed:"Failed",paused:"Paused"},action:{build:"Build Index",pause:"Pause",cancel:"Cancel",rebuild:"Rebuild",disable:"Disable"},session:{statusLabel:"Status",notEnabled:"Not enabled",coverageLabel:"Coverage",progressLabel:"Build progress",enableHint:"Once enabled, the AI can retrieve past chat excerpts when answering questions about this conversation.",configFirst:"Configure a vector model under Settings > AI > Semantic Index before enabling.",enable:"Enable Index",buildVsEnable:"Enable Index: include this conversation in semantic retrieval. Build Index: read all messages and generate vectors, which may use local compute or API quota.",retry:"Retry",continue:"Continue"},picker:{title:"Select Conversations",all:"All",group:"Group",private:"Private",searchPlaceholder:"Search by name",messages:"{count} messages",enabled:"Enabled",selectedSummary:"{count} conversations selected, ~{messages} messages",confirmDisableTitle:"Confirm Disable",confirmDisableMessage:"These conversations will be removed from semantic retrieval, but their index data is kept and can be cleaned up later."}}},Qh={chatSettings:{title:"Tool Settings"},exportSettings:{title:"Export Settings"},chatPreferences:{title:"Conversation Preferences",enableAutoSkill:"AI Auto-Select Skills",enableAutoSkillDesc:"When enabled, AI will automatically match and activate suitable analysis skills based on user queries; when disabled, skills only take effect when manually selected",chartAutoMode:{title:"Auto Chart Generation",description:"Controls how actively AI uses charts when the Chart Assistant is not manually selected",explicit:"Explicit requests",explicitHint:"AI only generates charts when you explicitly ask for them.",suggest:"Smart generation",suggestHint:"Conservative strategy: AI only generates charts when they clearly help explain the analysis.",aggressive:"Active generation",aggressiveHint:"AI more actively adds charts in data analysis scenarios."}},maxMessages:{title:"Max Messages per Request",description:"Max number of messages sent to AI per request. Higher values consume more tokens but provide more accurate context (recommended: 2000)."},searchContext:{title:"Search Context Window",description:"Automatically include surrounding messages for each search hit to help AI understand the context. Set to 0 to disable",before:"Before",after:"After"},exportFormat:{title:"Export Format",description:"File format for exporting AI conversations",txtLabel:"TXT"},sqlExportFormat:{title:"SQL Lab Export Format",description:"File format for exporting SQL query results"},compression:{title:"Context Compression",enable:"Auto-compress context",enableDesc:"Automatically compress long conversation history into summaries to reduce token usage",threshold:"Compression threshold",thresholdDesc:"Trigger compression when context tokens reach this percentage of the model's context window",buffer:"Buffer size",bufferDesc:"Percentage of recent messages to keep uncompressed",maxToolResultPercent:"Tool result limit",maxToolResultPercentDesc:"Maximum data percentage per tool call sent to AI (based on model context window). Excess results are intelligently truncated"}},Jh={title:"About ChatLab",description:"Chat records analysis tool",version:"Version",checkUpdate:"Check for Updates",checking:"Checking...",upToDate:"You are up to date",newVersionAvailable:"New version {version} available",webUpdateHint:"Run clb update in your terminal, then restart the service.",updateCheckFailed:"Update check failed: {error}",unknown:"Unknown",privacy:{title:"Privacy Settings",analytics:"Anonymous Usage Statistics",analyticsDesc:"When enabled, the app collects non-sensitive data like version number and OS version to help improve the product"},developer:{title:"Developer Options",debugMode:"DEBUG Mode",debugModeDesc:"When enabled, the debug panel and quick debugging tools will be shown. You can use them to view databases, run testing tools, and record more detailed debug logs."}},Zh={title:"Chat Preprocessing",description:"Preprocess chat records before sending to AI to save tokens and filter noise. Original data is not modified.",dataCleaning:"Data Cleaning",dataCleaningDesc:"Automatically clean XML card messages (shared links, mini-programs, etc.), extracting useful content and significantly saving tokens. Recommended to keep enabled.",mergeConsecutive:"Merge Consecutive",mergeConsecutiveDesc:"Merge consecutive messages from the same sender within a short time window",mergeWindow:"Merge window (seconds)",denoise:"Smart Denoise",denoiseDesc:"Filter out meaningless messages like interjections, emojis, and system placeholders (e.g. [Image])",desensitize:"Data Masking",desensitizeDesc:"Replace sensitive information (phone numbers, emails, ID numbers, etc.) based on rules",desensitizeBuiltin:"Built-in Rules",desensitizeResetBuiltin:"Restore Defaults",desensitizeCustom:"Custom Rules",desensitizeAddCustom:"Add Custom Rule",desensitizeRuleName:"Rule Name",desensitizeRulePattern:"Regex Pattern",desensitizeRuleReplacement:"Replacement Text",desensitizeRuleAdd:"Add",desensitizeRuleInvalidRegex:"Invalid regex syntax",desensitizeRuleNamePlaceholder:"e.g. Employee ID",desensitizeRulePatternPlaceholder:"e.g. EMP-\\d+",desensitizeRuleReplacementPlaceholder:"Replacement, e.g. [EmpID]",anonymizeNames:"Anonymize Nicknames",anonymizeNamesDesc:"Replace real nicknames with IDs (U1, U2…) when sending to AI, reducing hallucinations and saving tokens",blacklist:"Blacklist Keywords",blacklistDesc:"Messages containing any of these keywords will be filtered out entirely",blacklistPlaceholder:"Type a keyword and press Enter to add",blacklistAdd:"Add"},ev={groups:{credentials:"Passwords & Tokens",credentials_desc:"Credentials such as API keys and Bearer tokens",global_contact:"Global Contact Info",global_contact_desc:"Cross-region contact details such as email addresses",global_financial:"Global Financial Info",global_financial_desc:"Financial identifiers such as credit card numbers",global_network:"Global Network Info",global_network_desc:"Network identifiers such as URLs and IP addresses",region_cn:"Mainland China",region_cn_desc:"Rules for phone numbers, IDs, and bank cards in Mainland China",region_us:"United States",region_us_desc:"Rules for phone numbers and IDs in the United States",region_jp:"Japan",region_jp_desc:"Rules for phone numbers and My Number in Japan",region_kr:"Korea",region_kr_desc:"Rules for phone numbers and resident registration numbers in Korea"},rules:{cn_phone:"China Mobile Number",cn_phone_desc:"11-digit starting with 1xx",cn_id_card:"China ID Card Number",cn_id_card_desc:"18-digit, may end with X",cn_bank_card:"China Bank Card Number",cn_bank_card_desc:"16-19 consecutive digits",cn_landline:"China Landline Number",cn_landline_desc:"Area code + number, e.g. 010-12345678",us_ssn:"US Social Security Number (SSN)",us_ssn_desc:"XXX-XX-XXXX format",us_phone:"US Phone Number",us_phone_desc:"+1 (XXX) XXX-XXXX format",us_drivers_license:"US Driver's License",us_drivers_license_desc:"Letter + 7-8 digits",jp_phone:"Japan Phone Number",jp_phone_desc:"0x0-XXXX-XXXX format",jp_my_number:"Japan My Number",jp_my_number_desc:"12-digit number (マイナンバー)",kr_phone:"Korea Phone Number",kr_phone_desc:"01X-XXXX-XXXX format",kr_rrn:"Korea Resident Registration Number",kr_rrn_desc:"XXXXXX-XXXXXXX format (주민번호)",api_key_prefix:"API Key / Token (Known Prefixes)",api_key_prefix_desc:"Strings starting with sk-, ghp_, AKIA, etc.",bearer_token:"Bearer Token",bearer_token_desc:"Authorization token after Bearer",email:"Email Address",email_desc:"Standard user{'@'}domain.com format",credit_card:"Credit Card Number",credit_card_desc:"Visa / MasterCard / AmEx card numbers",ipv4:"IPv4 Address",ipv4_desc:"e.g. 192.168.1.1",url:"URL Link",url_desc:"Links starting with http:// or https://"}},tv={service:{title:"API Service",enable:"Enable API Service",enableDesc:"When enabled, external tools can query, export, and import chat data via HTTP API. Localhost only (127.0.0.1)",portInUseHint:"Port is in use. Please change the port below or close the program using this port"},status:{running:"Running",stopped:"Stopped",starting:"Starting...",portInUse:"Port in use",error:"Failed to start"},port:{title:"Port Configuration",label:"Listen Port",desc:"Local port for the API service (1024-65535)",edit:"Edit",save:"Save",cancel:"Cancel"},token:{title:"Access Token",label:"Bearer Token",desc:"All API requests must include this token in the Authorization header",noToken:"No token generated yet. Please enable the service first",regenerate:"Regenerate"},dataSources:{title:"Data Sources",desc:"Configure external data source URLs. ChatLab will automatically pull and import chat data at the specified interval.",empty:"No data sources",noSessions:'No import sessions. Click "Manage Sessions" above to add.',disabled:"Paused",every:"Every",minutes:"min",lastSync:"Last sync",syncing:"Syncing",messages:"messages",addBtn:"Add Data Source",form:{modalTitle:"Add Data Source",name:"Name",namePlaceholder:"e.g., My Chat Server",token:"Access Token",tokenPlaceholder:"Bearer Token for the remote API",interval:"Pull Interval (minutes)",pullLimit:"Messages per Pull",pullLimitPlaceholder:"Default 1000"},discovery:{baseUrl:"Server URL",baseUrlPlaceholder:"e.g. http://127.0.0.1:2333/api/v1",found:"Found {count} sessions",search:"Search",searchPlaceholder:"Search by session name",selectAll:"Select All",deselectAll:"Deselect All",selectByType:"Session type",typeAll:"All",typePrivate:"Private",typeGroup:"Group",loadMore:"Load More",subscribe:"Subscribe {count} sessions",messages:"messages",error:"Failed to connect to remote server",connectionCheckFailed:"Cannot connect to the remote server. Please check the URL and token."},edit:{title:"Edit Data Source",save:"Save",cancel:"Cancel",editSource:"Edit Config",manageSessions:"Manage Subscriptions",subscribed:"Subscribed"},deleteConfirm:{title:"Delete Data Source",message:'Are you sure you want to delete "{name}"? All import configurations under this data source will be removed. Already imported local conversations will not be deleted.'},deleteSessionConfirm:{title:"Delete Subscription",message:'Are you sure you want to delete "{name}"?',keepData:"Remove subscription only",deleteData:"Also delete imported chats"}},usage:{title:"Usage Guide",desc:"After enabling the service, external tools can query data or push chat records to ChatLab via API. All requests require Bearer Token authentication.",authHint:"Header example:",docLink:"View full API documentation"}},sv={overview:{title:"MCP Overview",description:"MCP lets AI assistants directly query your chat records. Supports session discovery, keyword search, member stats, time distribution, and more.",toolCount:"{count} tools",resourceCount:"{count} resources",installHint:"Install chatlab-cli, then add the config below to your AI client:"},clients:{other:"Other"},config:{title:"Client Configuration",clientLabel:"MCP Client",copy:"Copy",copied:"Copied",claudeHint:"Add this config to ClaudeCode's MCP configuration.",codexHint:"Add this TOML config to your ~/.codex/config.toml file.",openclawHint:"Add this config to your project's openclaw.json file.",otherHint:"Add this JSON config to your MCP client configuration file."},tips:{title:"Tips",dataDir:"The MCP server reads chat data from ~/.chatlab/, sharing the same data as the desktop app.",readOnly:"All operations are read-only and will not modify your chat records.",nodeRequired:"npx and CLI modes require Node.js 20 or higher.",docs:"For detailed documentation, visit docs.chatlab.fun."}},av={title:Wh,tabs:jh,basic:qh,defaultModel:Kh,aiConfig:Gh,storage:Xh,ai:Yh,aiPrompt:Qh,about:Jh,aiPreprocess:Zh,desensitize:ev,api:tv,mcp:sv},nv="Explore New Chat Memories",ov={file:"File Import",api:"Auto Sync",push:"API Push",apiDescription:"Connect external platform data sources to automatically sync chat records to ChatLab on a schedule.",apiButton:"Configure Auto Sync",pushDescription:"Start the local API server to let third-party tools, plugins, or scripts push chat records directly into ChatLab.",pushButton:"Configure API Server"},rv={viewExample:"Try a Demo",downloading:"Downloading demo data...",importing:"Importing demo data...",failed:"Failed to load demo data. Please check your network and try again."},iv={title:"Database upgrade required",description:"{count} database(s) need to be upgraded for new features.",note:"The upgrade usually takes only a few seconds and won't lose any data.",upgradeContent:"Upgrade content:",upgradeNow:"Upgrade Now",upgrading:"Upgrading...",failed:"Migration failed",partialFailed:"Some databases failed to upgrade",errorHint:"This is usually caused by corrupted database files. Please delete the failed sessions from the sidebar and re-import them.",close:"Close",retry:"Retry"},lv={title:"Select chats to import",scanning:"Scanning chat list...",scanFailed:"Scan failed",retry:"Retry",selectAll:"Select all",chatCount:"{count} chats",selected:"{count} selected",messageCount:"{count} messages",import:"Import ({count})",noChats:"No chats found"},cv={title:"Select Chat Format",hint:"Unable to auto-detect the file format. Please manually select the corresponding chat format.",manualSelect:"Select format manually",confirm:"Import with this format"},dv={export:"Getting Started"},uv={website:"Website",terms:"Terms of Use"},mv={title:"Changelog",subtitle:"View all version updates",latest:"Latest",current:"Current",total:"{count} versions in total",close:"Close",loadError:"Failed to load changelog",retry:"Retry",types:{feat:"Features",fix:"Bug Fixes",refactor:"Refactors",docs:"Docs",chore:"Other",style:"Style",ci:"CI"}},gv={tagline:nv,tabs:ov,import:{dropHint:"Drop to import files",clickHint:"Click to select or drag chat records to import",multipleHint:"Multiple files can be selected or dragged at once",selectFiles:"Select chat record files",selectFolder:"Select export folder",importFolder:"Import Folder",chatRecords:"Chat Records",allFiles:"All Files",progress:{detecting:"Detecting format...",reading:"Reading file...",parsing:"Parsing messages...",saving:"Saving to database...",done:"Import complete",error:"Import interrupted"},processed:"{count} messages processed",viewLog:"View import log",cannotReadPath:"Cannot read file path",errors:{no_file_selected:"No file selected",import_failed:"Import failed",unrecognized_format:"Unrecognized file format",no_messages:"No messages parsed. Please check if the file format is correct.",actionHint:"You can try manual format matching or view the log below:"},diagnostics:{format:"Format: ",received:"Received: ",written:" / Written: ",skipped:" / Skipped: "},batch:{importing:"Batch importing",progressCount:"{current} of {total}",cancel:"Cancel import",waiting:"Waiting",skipped:"Skipped",success:"Import successful",completed:"Batch import completed",summary:"{success} succeeded, {failed} failed, {cancelled} skipped",view:"View"},options:{mergeImport:"Merge Import",mergeImportHint:"Multiple files will be merged into one chat record"},merge:{importing:"Merging",parsing:"Parsing files...",merging:"Merging messages...",completed:"Merge completed",completedHint:"{count} files merged",messageCount:"{count} messages",failed:"Merge failed"}},demo:rv,migration:iv,chatSelector:lv,formatSelector:cv,quickStart:dv,footer:uv,changelog:mv},pv={loading:"Loading analysis data...",loadError:"Unable to load session data"},fv={loading:"Loading analysis data...",loadError:"Unable to load session data"},hv={overview:"Overview",view:"Insights",aiChat:"AI Chat",memory:"Memory",lab:"Lab",debug:"Debug"},vv={sqlTables:"SQL Tables",basicTools:"Basic Tools",tableBrowser:{chatDb:"Chat DB",aiDb:"AI Chat DB",rowCount:"{count} rows",page:"Page {current} / {total}",refresh:"Refresh",noData:"No data",editRow:"Edit",deleteRow:"Delete Row",confirmDelete:"Are you sure you want to delete this row?",allConversations:"All Conversations",copyCell:"Copy Selected",copyRow:"Copy Row (JSON)",clearDebugContext:"Clear Debug Context",confirmClearDebug:"Clear debug_context for all messages? This cannot be undone."}},yv={comingSoon:"Memory feature coming soon, stay tuned"},bv={viewChatRecord:"View Chat History",sessionIndex:"Session Index",semanticIndex:"Semantic Index",incrementalImport:"Import More",memberManagement:"Manage Member",more:"More"},_v={title:"Append Chat Records",description:'Select chat record file to append to "{name}". Duplicates will be automatically removed.',dropHint:"Click to select or drop file here",analyzing:"Analyzing file...",totalInFile:"Total in file",newMessages:"New messages",duplicates:"Duplicates",noNewMessages:"No new messages found, all messages already exist",importing:"Importing...",import:"Import {count} messages",success:"Import successful",successDetail:"Successfully appended {count} new messages",failed:"Import failed"},xv={view:{typeAnalysis:"Types",timeAnalysis:"Time",topic:"Topics",groupRelationships:"Relationships",ranking:"Rankings",relationship:"Relationship",languagePreference:"Language Preference"},quotes:{hotRepeat:"Hot Repeats",catchphrase:"Catchphrases",keywordAnalysis:"Keyword Analysis"},groupRelationships:{mentionGraph:"Mention Graph",mentionRanking:"Mention Ranking",proximity:"Proximity"},member:{nicknameHistory:"Nickname History"}},kv={messageTypeDistribution:"Message Type Distribution",memberDistribution:"Member Activity Distribution",others:"Others",memberComparison:"Member Comparison",statCards:{dailyAvgMessages:"Daily Avg Messages",messagesCount:"{count} msgs",daysCount:"{count} days total",imageMessages:"Image Messages",imagesCount:"{count} images",peakHour:"Peak hour:",mostActiveWeekday:"Most Active Day",messagesOnDay:"{count} messages",weekendActivity:"Weekend Activity",weekendRatio:"Weekend message ratio",mostActiveDate:"Most Active Date",consecutiveStreak:"Streak",daysStreak:"{count} days",longestStreak:"Longest active streak",activityRate:"Activity Rate",activeDaysRatio:"Days with messages",lateNightChat:"Late Night Chat",lateNightRatio:"{ratio}% of all messages"},dailyTrend:{title:"Daily Message Trend"},identity:{privateChat:"Private",groupChat:"Group",totalMessages:"Total Messages",durationDays:"Duration Days",activeDays:"Active Days",dailyAvgMessages:"Daily Avg"},tools:"Quick Tools"},wv={miniMode:"Mini mode",exitMini:"Exit mini mode"},Sv={title:"Export Records",selectOutputDir:"Select Output Directory",format:"Format"},Cv={timeRange:"Time Range",allTime:"All Time",today:"Today",lastWeek:"Last 7 Days",lastMonth:"Last Month",last3Months:"Last 3 Months",lastYear:"Last Year",customTime:"Custom",exportSuccess:"Export successful",exportFailed:"Export failed",exportPreparing:"Preparing export..."},Iv={groupChat:pv,privateChat:fv,tabs:hv,debug:vv,memory:yv,tooltip:bv,incremental:_v,subTabs:xv,overview:kv,toolsPanel:wv,messageExport:Sv,filter:Cv},Mv={searchPlaceholder:"Search conversation name",searchResult:"Found {count} / {total}",noSearchResult:"No matching chat records found",selectAll:"Select All",shiftClickHint:"Hold Shift to select a range",selected:"{count} selected",empty:"No chat records",delete:"Delete Selected",confirmTitle:"Confirm Delete",confirmMessage:"Are you sure you want to delete {count} selected chat record(s)? This action cannot be undone.",deleting:"Deleting...",columns:{name:"Name",platform:"Platform",messages:"Messages",summaries:"AI Summaries",aiChats:"AI Chats",importedAt:"Imported"},clickToEdit:"Click to edit name",merge:"Merge Selected",mergeHint:"Select at least 2 chat records of the same chat type to merge",mergeConfirmTitle:"Merge Chat Records",mergeConfirmMessage:"This will merge {count} selected chat records into a new merged record.",deleteOriginalsLabel:"Delete original records after merge",mergeRiskWarning:"Critical warning: deletion cannot be undone, and cross-platform context differences may cause semantic confusion. Please back up your original data before continuing.",mergeSteps:{exporting:"Exporting chat records...",parsing:"Parsing files...",checking:"Checking conflicts...",merging:"Merging data...",cleaning:"Cleaning up temp files..."},mergeSuccess:"Successfully merged {count} chat records",mergeError:"Merge failed: {error}",mergedSuffix:"Merged"},Tv={batchManage:Mv},Av={name:"DeepSeek"},$v={name:"Qwen"},Pv={name:"Gemini"},Dv={name:"MiniMax"},Lv={name:"GLM"},Rv={name:"Kimi"},Ev={name:"Doubao"},Fv={name:"SiliconFlow"},Nv={name:"Groq"},Uv={name:"OpenRouter"},Ov={name:"xAI"},Vv={deepseek:Av,qwen:$v,gemini:Pv,minimax:Dv,glm:Lv,kimi:Rv,doubao:Ev,siliconflow:Fv,groq:Nv,openrouter:Uv,xai:Ov,"openai-compatible":{name:"Third-party"}},Hv={chatExplorer:"Chat Explorer",sqlLab:"SQL Lab"},zv={scrollToBottom:"Back to Bottom",input:{placeholderWithSlash:"Enter your question, or type / for skills and {'@'} for members...",placeholderWithActiveSkill:"/{name} selected. Enter your specific question...",slashHint:"Type / to pick a skill",useSkill:"Choose Skill",mentionHint:"Type {'@'} to pick a member",mentionEmpty:"No matching members",mentionEmptyHint:"Search by nickname, alias, or account",slashEmpty:"No matching skills",slashEmptyHint:"Open Skill Manager to import built-in skills or create a custom one",manageSkills:"Manage Skills",previewTagsLabel:"Tags",previewToolsLabel:"Tools",previewUnavailable:"No skill prompt available for preview",quickAsk:"Quick Ask",editQuickAsk:"Edit Quick Ask",send:"Send",needMoreThanSkill:"Selecting a skill alone is not enough. Enter a specific question.",needQuestion:"Enter a question before sending"},fork:{success:"Conversation forked",failed:"Failed to fork conversation"},backgroundTask:{runningShort:"Running",runningTitle:"AI is still thinking",runningDescription:"The previous question is still running. Please wait for it to finish or stop it first.",blockedAction:"The current answer is still being generated. Wait for it to finish or stop it first.",return:"Return"},message:{copy:{tooltip:"Copy Markdown",success:"Markdown copied to clipboard",failed:"Failed to copy Markdown"},process:{label:"Process",processing:"Processing",processed:"Processed"},toolResult:{view:"View result",title:"Tool result sent to AI",copy:"Copy result",copySuccess:"Tool result copied",copyFailed:"Failed to copy tool result",displayTruncated:"Only a truncated version of this historical result was saved; the AI may have seen more content in the original turn."},edit:{tooltip:"Edit and regenerate",submit:"Send",overwriteSubsequent:"Overwrite all subsequent messages"},fork:{tooltip:"Fork conversation from here"},chart:{expand:"Open large chart",empty:"No data",rows:"{count} rows",truncated:"Truncated"},generating:"Generating response...",summary:{label:"Context Summary",info:"Previous conversation has been compressed into a summary to save context space"},plan:{label:"Analysis Plan",evidenceNeeded:"Evidence needed",suggestedTools:"Suggested tools",successCriteria:"Success criteria",noTools:"None"},think:{labels:{think:"Thinking",analysis:"Analysis",reasoning:"Reasoning",reflection:"Reflection",planValidation:"Generate plan",other:"Thinking ({tag})"},loading:"Thinking",duration:"Took {seconds}s"},toolParams:{keywords:"Keywords",time:"Time",getMessages:"Get {count} messages",limit:"Limit {count}",contextWithMessages:"Context of {contextSize} messages around {msgCount} messages",context:"{size} messages context",topMembers:"Top {count} members",search:"Search",getMemberList:"Get member list",memberId:"Member ID",timeStats:{hourly:"Hourly",weekday:"By Weekday",daily:"Daily"}}},thinking:{processingResult:"Processing result",called:"Called:",analyzing:"Analyzing question...",compressing:"Compressing context..."},statusBar:{model:{notConfigured:"AI Not Configured"},messageLimit:{label:"Limit: ",title:"Max messages per request, click to configure"},agent:{label:"Agent",contextTokens:"Context",phase:{compressing:"Compressing",preparing:"Preparing",thinking:"Thinking",tool_running:"Running tool",responding:"Responding",completed:"Completed",aborted:"Stopped",error:"Error"},phaseShort:{compressing:"Compress",preparing:"Prep",thinking:"Think",tool_running:"Tool",responding:"Reply",completed:"Done",aborted:"Stop",error:"Err"}},thinking:{title:"Thinking level",tooltip:"Set the thinking intensity for this model",level:{default:"Default",off:"Off",minimal:"Minimal",low:"Low",medium:"Medium",high:"High",xhigh:"Max",auto:"Auto"}},tokenUsageTitle:"Total token usage",cacheHit:"Cache hit",export:{label:"Export",title:"Export current conversation"},log:{label:"Logs",title:"Open current AI log file",openFailed:"Failed to open log",openFailedDesc:"Please try again later"}},conversation:{newChat:"New Chat",newConversation:"New Chat",empty:"No history yet",startNew:"Start New Chat",titlePlaceholder:"Enter title...",group:{last7Days:"Last 7 Days",last30Days:"Last 30 Days"},rename:"Rename",copyId:"Copy ID",delete:"Delete",export:{createdAt:"Created",user:"User",assistant:"AI Assistant",noMessages:"No messages to export"}},error:{title:"Processing Failed",detail:"Error Details",viewDetail:"View Details",requestUrl:"Request URL",statusCode:"Status Code",responseBody:"Response Body",responseHeaders:"Response Headers",requestBody:"Request Body",name:"Error Name",message:"Error Message",stack:"Stack Trace",cause:"Error Cause",provider:"Provider",copyAll:"Copy All",copied:"Copied to clipboard",unknown:"Unknown error"},dataSource:{title:"Data Source",keywords:"Keywords:",empty:"No data",emptyHint:"Related records will appear here after asking questions",totalRecords:"{count} records",loadMore:"Load More"},evidence:{title:"Evidence",query:"Question",criteria:"Criteria",empty:"No conclusive evidence found",totalSources:"{count} sources",mode:{auto:"Auto",hybrid:"Semantic + Keyword",semantic:"Semantic",keyword:"Keyword"},group:{included:"Counted",excluded:"Excluded",uncertain:"Uncertain"},warning:{criteria_missing:"No criteria provided; grouping is conservative",keywords_missing_for_hybrid:"No keywords provided; fell back to semantic-only search",keywords_required_for_keyword_mode:"Keyword mode requires keywords",semantic_unavailable:"Semantic index unavailable; used keyword search instead",keyword_unavailable:"Keyword search unavailable",semantic_partial:"Semantic results may be incomplete"}}},Bv={editor:{errorEmptySQL:"Please enter an SQL statement",placeholder:"Enter SQL query...",tip:"Tip: Double-click column names to insert into SQL",history:"History",generateAndRun:"Generate and Run",switchToSQLMode:"Switch to SQL Mode",switchToPromptMode:"Switch to Prompt Mode",run:"Run"},schema:{tables:"Tables",doubleClickToInsert:"Double-click to insert into SQL",primaryKey:"Primary Key"},result:{queryError:"Query Error",rows:"{count} rows",readableTime:"Readable time",viewChat:"View chat history",summarize:"Summarize",pageSize:"Per page",emptyResult:"Query returned no results",initialState:"Enter SQL and run to see results",initialHint:"Only read-only queries are supported (SELECT / WITH). Add LIMIT for better performance",summaryTitle:"AI Result Summary",analyzing:"AI is analyzing results...",errorSummary:"Summary failed"},generate:{placeholder:"E.g.: Find top 10 members by message count, count daily messages, find messages containing 'keyword'...",errorEmptyPrompt:"Please enter your query requirement",errorGenerate:"AI generation failed",errorTokenLimit:"Model output reached token limit without generating a complete response (thinking may have consumed too many tokens)",aiOutput:"AI Output",thinking:"Thinking…",thinkingProcess:"Thinking process",waitingAI:"Waiting for AI response...",defaultPromptPrivate:"For the last 1 year of this private chat, compare both participants by total messages, message share, active days, average messages per active day, first message time, and latest message time; sort by total messages desc.",defaultPromptGroup:"For the last 1 year of this group chat, rank members by total messages, message share, active days, average messages per active day, and text-message ratio; include display names and return top 20 by total messages desc."},history:{title:"AI Generation History",execute:"Execute",empty:"No history records",justNow:"Just now",minutesAgo:"{count} min ago",hoursAgo:"{count} hr ago",today:"Today"}},Wv={selector:{title:"Choose an assistant to start",heroTitlePrefix:"Chat with",heroTitleSuffix:"",subtitle:"Each assistant specializes in different types of analysis tasks. Pick the one that best fits your needs.",noAssistants:"No assistants available for this context",manage:"Manage Assistants",addNew:"New Assistant"},config:{viewTitle:"View Config",createTitle:"New Assistant",editTitle:"Assistant Config",betaWarning:"This feature is in beta. Configuration logic may change, so please back up your prompts.",tabs:{basic:"Basic",tools:"Tools"},name:"Name",systemPrompt:"System Prompt",chatType:"Chat Type",chatTypeAll:"All",chatTypeGroup:"Group",chatTypePrivate:"Private",locale:"Language",localeHint:"None selected = all languages",presetQuestions:"Preset Questions",addQuestion:"Add a question...",coreTools:"Core Tools",coreToolsHint:"Essential data retrieval tools, always enabled",analysisTools:"Analysis Tools",analysisToolsHint:"Enable on demand. Only checked tools will be available to AI",selectAll:"Select All",deselectAll:"Deselect All",resetDefault:"Reset to Default",create:"Create"},market:{title:"Assistant Manager",tabs:{local:"Local",market:"Market"},localHint:"Manage imported assistants, configure or delete",marketHint:"Browse the assistant market, import to use and customize",default:"Default",reimport:"Re-import",imported:"Imported",import:"Import",importing:"Importing...",importSuccess:"Import successful",importFailed:"Import failed",viewConfig:"View Config",duplicate:"Duplicate",addAssistant:"Add Assistant",noLocal:"No imported assistants yet",noCatalog:"No assistants available, please check your network",loading:"Loading...",loadFailed:"Failed to load, please check your network",retry:"Retry"},fallbackName:"Assistant",duplicateSuffix:" (Copy)",toast:{loadFailed:"Failed to load",createSuccess:"Created successfully",createFailed:"Failed to create",saveSuccess:"Saved successfully",saveFailed:"Failed to save",resetSuccess:"Reset to default",resetFailed:"Failed to reset",unknownError:"Unknown error"},builtinToolDesc:{get_chat_overview:"Get chat overview information",search_messages:"Search chat messages",deep_search_messages:"Deep search chat messages",get_recent_messages:"Get recent messages",get_message_context:"Get message context",get_conversation_between:"Get conversation between two members",get_members:"Get members",get_schema:"Inspect database schema",get_member_stats:"Get member statistics",get_member_name_history:"Get member name history",get_time_stats:"Get time statistics",get_segment_messages:"Get segment messages",get_segment_summaries:"Get segment summaries",message_type_breakdown:"Message type distribution",peak_chat_hours_by_member:"Member peak hours",member_activity_trend:"Member activity trend",silent_members:"Silent member detection",reply_interaction_ranking:"Reply interaction ranking",mutual_interaction_pairs:"Mutual interaction pairs",member_message_length_stats:"Message length stats",unanswered_messages:"Unanswered messages",daily_active_members:"Daily active members",conversation_initiator_stats:"Conversation initiators",activity_heatmap:"Activity heatmap",response_time_analysis:"Response time analysis",keyword_frequency:"Keyword frequency",render_chart:"Generate dynamic chart",semantic_search_current_chat:"Search chat history"}},jv={config:{createTitle:"New Skill",editTitle:"Skill Config",chatScopeAll:"All",chatScopeGroup:"Group",chatScopePrivate:"Private",rawEditorHint:"Edit the full skill Markdown file (with YAML frontmatter)",create:"Create",save:"Save"},market:{title:"Skill Manager",tabs:{local:"Local",market:"Market"},localHint:"Manage imported skills, configure or delete",marketHint:"Browse the skill market, import to use and customize",reimport:"Re-import",imported:"Imported",import:"Import",importing:"Importing...",importSuccess:"Import successful",importFailed:"Import failed",noLocal:"No imported skills yet",noCatalog:"No skills available, please check your network",addSkill:"Create Custom Skill",loading:"Loading...",loadFailed:"Failed to load, please check your network",retry:"Retry"},active:{label:"Manually Invoked Skill: {name}"}},qv={toolTest:{coreTools:"Core Tools",analysisTools:"Analysis Tools",parameters:"Parameters",arrayPlaceholder:"Separate values with commas",execute:"Execute",cancel:"Cancel",elapsed:"Elapsed {ms}ms",result:"Result",truncated:"Result too large, truncated. Try reducing the limit parameter for complete data."}},Kv={tab:Hv,chat:zv,sqlLab:Bv,assistant:Wv,skill:jv,lab:qv},Gv={loading:"Analyzing word frequency...",stats:{wordsLabel:"Total words",clickHint:"Note: Click a word in the cloud to view related messages"},config:{maxWords:"Max words",sizeScale:"Font size",userFilter:"User filter",posFilter:"POS filter",enableStopwords:"Filter stopwords",dict:"Dictionary"},size:{small:"S",medium:"M",large:"L",xlarge:"XL"},posFilter:{all:"All",meaningful:"Meaningful",custom:"Custom",customHint:"Custom POS",selectMeaningful:"Meaningful",selectAll:"All",clearAll:"Clear"},empty:{title:"No word cloud data",description:"Not enough text messages to generate a word cloud with current filters"},dict:{zhCN:"Simplified Chinese",zhTW:"Traditional Chinese",download:"Download dictionary","download_zh-CN":"Download Simplified Chinese dict","download_zh-TW":"Download Traditional Chinese dict",needDownload:"Word cloud is shown with the built-in tokenizer. Download a Chinese dictionary for more accurate segmentation.",downloadHint:"~8MB",downloadSuccess:"Dictionary downloaded successfully",downloadFailed:"Dictionary download failed",promptTitle:"Traditional Chinese Dictionary",promptDescription:"We detected you're using Traditional Chinese. For best word cloud results, a Traditional Chinese dictionary is recommended. Download now? (~8MB)",promptDownload:"Download now",promptLater:"Maybe later"}},Xv={title:"🔍 Keyword Ranking",description:"Analyze keyword usage rankings in chats, customize your own lists",countTemplate:"{count} members",templateLabel:"Templates:",newTemplate:"+ New",searchPlaceholder:"Type to search",clear:"Clear",templateHint:"* Right-click template to edit or delete",keyword:"Keyword",ranking:" Ranking",multiColorMode:"Multi-color",times:"{count}x",timesWithPercent:"x ({percent}%)",loading:"Analyzing data...",empty:"No data available. Try adding keywords or switching templates.",contextMenu:{edit:"Edit",delete:"Delete"},modal:{createTitle:"Create Template",editTitle:"Edit Template",templateName:"Template Name",templateNamePlaceholder:"e.g. Positive",keywords:"Keywords",keywordPlaceholder:"Press Enter to add",update:"Update"},templates:{laugh:{name:"Laughter",keywords:"lol,lmao,haha,rofl,dying,hilarious",description:"Track happiness index in the group"},sad:{name:"Sadness",keywords:"sad,depressed,tired,exhausted,ugh,sucks,hate",description:"Track negative emotions in the group"},praise:{name:"Praise",keywords:"awesome,amazing,great,nice,cool,impressive,wow,goat",description:"Find members who give the most compliments"},slacker:{name:"Slacking",keywords:"bored,slacking,hungry,sleepy,friday yet,done for today,hate mondays",description:"Find members who want to leave work most"},gossip:{name:"Gossip",keywords:"omg,no way,really,spill,tea,wtf,insane,crazy",description:"Find members who love gossip the most"},polite:{name:"Polite",keywords:"thanks,please,sorry,appreciate,welcome,excuse me,thank you",description:"Find the most polite members"},curious:{name:"Questions",keywords:"why,how,what,confused,help,anyone know",description:"Find members who ask the most questions"}}},Yv={title:"🔥 Hot Repeats",loading:"Loading repeat data...",description:"Content with most participants in single repeat chain",countTemplate:"{count} hot repeats",people:"{count} ppl",times:"{count}x",colon:": ",viewChat:"View chat history",empty:"No repeat data available"},Qv={heroPrefix:"Analyzed",heroMiddle:"messages,",heroMiddleSecond:"yielding",heroSuffix:"unique words",topTopicsPrefix:"You love talking about:",hotTopic:"Hot Topic",hotTopicDesc:"Appeared {count} times",richness:"Lexical Diversity",richnessValue:"{value}%",richnessDesc:"Unique {unique} / Total {total}",chatStyle:"Chat Style",styleEncyclopedia:"Encyclopedia",styleEncyclopediaDesc:"Noun-heavy, loves discussing people, places & things",styleAction:"Action-Oriented",styleActionDesc:"Verb-heavy, loves discussing what to do",styleExpressive:"Expressive",styleExpressiveDesc:"Adjective-heavy, rich in emotional expression",styleBalanced:"Balanced",styleBalancedDesc:"Diverse topics, well-rounded conversations",expressionStyle:"Expression Style",expressionCasual:"Casual",expressionCasualDesc:"Short words, relaxed and informal",expressionFormal:"Formal",expressionFormalDesc:"Elaborate words, precise expression",expressionMixed:"Mixed",expressionMixedDesc:"A blend of casual and formal",watermark:"Topic Profile",sharedTopics:"Shared Topics"},Jv={loading:"Analyzing catchphrases...",times:"{count}x",empty:{title:"No catchphrase data"},stats:{clickHint:"Tip: Click a phrase to view related messages"},viewMode:{list:"List",wordcloud:"Word Cloud"},topN:"Show count"},Zv={loading:"Analyzing language preferences...",empty:"Not enough text messages for language analysis",card:{diversityTitle:"Lexical Depth",diversityDesc:"Unique word ratio",styleTitle:"Chat Style",styleDesc:"Expression style based on POS distribution",punctTitle:"Punctuation Style",punctDesc:"Most used punctuation personality",watermark:"Language Preference",radarFactual:"Factual",radarActive:"Active",radarDescriptive:"Descriptive",radarAffable:"Affable",radarIntense:"Intense",radarNoun:"Noun",radarVerb:"Verb",radarAdj:"Adjective",radarModal:"Modal",radarAdv:"Adverb",topCatchphrases:"Top Catchphrases",languageProfiles:"Language Profiles"},catchphrasePK:{title:"Catchphrase Battle",sharedCount:"{count} shared catchphrases",hint:"Click to view messages. Pink outlines mark shared catchphrases."},pos:{title:"POS Portrait",styleEncyclopedia:"Encyclopedia",styleAction:"Action-oriented",styleExpressive:"Expressive",styleBalanced:"Balanced"},modal:{title:"Modal Particles",toneSoft:"Soft & Warm",toneCurious:"Curious",toneCasual:"Casual",toneCalm:"Calm & Steady",toneMixed:"Mixed Style",empty:"No modal particle data"},punctuation:{title:"Punctuation Personality",none:"No punct.",personalityDeep:"Deep Thinker",personalityPassionate:"Passionate",personalityCurious:"Curious Mind",personalityCheerful:"Cheerful",personalityFreeflow:"Free-flow",personalityPrecise:"Precise",empty:"No punctuation data"}},ey={wordcloud:Gv,keywords:Xv,hotRepeat:Yv,topicProfile:Qv,catchphrase:Jv,languagePreference:Zv},ty={title:"Who Are You?",subtitle:"Select your identity in this chat",description:"Your messages will appear on the right side of the chat viewer, and AI conversations can identify you for more accurate analysis. Other chats from the same platform will be filled in automatically.",searchPlaceholder:"Search members",noMatch:"No matching members found",empty:"No member data",later:"Later",dontRemind:"Don't remind me for this chat",save:"Save",clear:"Clear current selection",saved:"Your identity has been set",appliedToOthers:"Automatically applied to {count} chats from the same platform",saveFailed:"Failed to set identity",currentOwner:"I am: {name}",choose:"Choose who I am",change:"Change",helper:"Helps AI identify you in conversations for more accurate analysis"},sy={title:"Group Member Management",description:"{count} members. Add aliases or remove members",searchPlaceholder:"Search nickname, account name, ID or alias",noMatch:"No matching members found",empty:"No member data available",table:{accountName:"Account Name",groupNickname:"Group Nickname",messageCount:"Messages",customAlias:"Custom Aliases",actions:"Actions"},aliasPlaceholder:"Press Enter to add",delete:"Delete",mergeSelected:"Merge Selected",mergeSelectedCount:"{count} members selected",pagination:"Showing {start} - {end} of {total} members",tip:"Tip: Adding aliases helps identify chat participants and improves search and AI analysis accuracy.",mergeModal:{title:"Merge Members?",content:"Merge {source} ({sourceCount} messages) into {target} ({targetCount} messages). By default, the merged name keeps the member with more messages.",hint:"This action cannot be undone. All messages from the merged member will be reassigned to the kept member.",cancel:"Cancel",confirm:"Confirm Merge"},modal:{title:"Delete Member?",content:"This will delete member {name} and their {count} messages. This action cannot be undone.",cancel:"Cancel",confirm:"Confirm Delete"}},ay={note:"Note: QQ's legacy client can export chat history as txt format, which provides the most accurate nickname history",title:"Nickname History",loading:"Loading...",hasChanges:"{count} members have changed nicknames",noChanges:"No nickname changes",current:"Current",empty:"No members have changed their nicknames",loadingText:"Loading nickname history..."},ny={loading:"Analyzing {'@'} interaction data...",topMentioners:"📢 Top {'@'} Initiators",totalMentions:"{count} total {'@'}s",topMentioned:"🎯 Most {'@'} Mentioned",popularMember:"Most popular in the group",times:"times",oneWay:{title:"🐕 One-way Detection",description:"Found {count} one-way relationships (one party {'@'} another ≥80%)",neverRespond:"Never responds",reverse:"{count}x reverse",ratio:"{value}% one-way"},twoWay:{title:"💕 Mutual Detection",description:"Found {count} frequent CP pairs (mutual {'@'} with ≥30% balance)",interactions:"interactions",balance:"{value}% balanced"},emptyTitle:"📱 {'@'} Interaction Analysis",empty:"No {'@'} interaction data available",modal:{title:"{name}'s {'@'} Relationships",topMentioned:"Most frequently {'@'}s",topMentioners:"Most frequently {'@'}d by",timesCount:"{count}x",close:"Close"}},oy={ownerPrompt:ty,list:sy,nicknameHistory:ay,relationships:ny,private:{title:"Chat Members",description:"{count} members. Add aliases for search and AI analysis",messageCount:"Messages",percentage:"{value}% of total",customAlias:"Custom Aliases",aliasPlaceholder:"Press Enter to add alias",empty:"No member data available",tipTitle:"Tip",tipContent:"Adding aliases helps identify chat participants and improves search and AI analysis accuracy."}},ry={title:"Chat Record Viewer",loadedCount:"{count} messages loaded"},iy={loading:"Loading...",noMessages:"No messages",tryAdjustFilter:"Try adjusting the filter",loadingMore:"Loading more...",scrollUpForMore:"↑ Scroll up to load more",scrollDownForMore:"↓ Scroll down to load more"},ly={messageId:"Message ID",memberNotSupported:"Member (not supported)",keywordsPlaceholder:"Keywords, comma separated, Enter to search",startDate:"Start Date",endDate:"End Date",reset:"Reset",filter:"Filter"},cy={timeline:"Summaries",noSessions:"No summaries",generateSummary:"Summarize",tooFewMessages:"Too few"},dy="Summary generation failed",uy="Unknown error",my={title:"Batch Generate Summaries",byRange:"By Range",byTime:"By Time",selectRange:"Select Range",rangeStart:"Earliest",rangeInfo:"About",sessionsUnit:"sessions",rangeEnd:"Latest",timeRange:"Select Time Range",today:"Today",yesterday:"Yesterday",week:"Last 7 days",month:"Last 30 days",custom:"Custom",found:"Found",hasSummary:"already summarized",tooFewMessages:"too few messages",pending:"Pending:",unit:"",noPending:"No sessions to generate",noSessions:"No sessions in this time range",checking:"Checking...",loading:"Loading...",progress:"Progress",session:"Session",statusSuccess:"Success",statusSkipped:"Skipped",statusFailed:"Failed",success:"Success:",failed:"Failed:",skipped:"Skipped:",start:"Start",stop:"Stop"},gy={viewContext:"View Context",replyTo:"Reply to"},py={title:"Session Index",subtitle:"For timeline navigation in chat records",notGenerated:"Session index not generated",notGeneratedHint:"After generating session index, you can use timeline navigation in the chat record viewer to quickly jump to different sessions.",whatIsIt:"What session index does:",benefit1:"Identify conversation boundaries based on message time gaps",benefit2:"Provide timeline navigation in chat record viewer",benefit3:"Enable AI analysis to understand conversation context",generated:"Session index generated",sessionCount:"{count} sessions identified",regenerateHint:"You can regenerate the index if you've adjusted the session gap threshold.",generate:"Generate Index",regenerate:"Regenerate",generating:"Generating...",cancel:"Cancel"},fy={drawer:ry,messageList:iy,filter:ly,timeline:cy,summaryFailed:dy,summaryUnknownError:uy,batchSummary:my,messageItem:gy,sessionIndex:py},hy={rankingView:"Ranking",memberView:"Member View",matrixView:"Matrix View",modelSettings:"Model Settings",lookAhead:"Look Ahead",lookAheadDesc:"Messages to look ahead per sender",decaySeconds:"Time Decay (sec)",decaySecondsDesc:"Higher = distant messages matter more",applySettings:"Apply",noData:"No data",selectMember:"Select Member",selectMemberHint:"Select a member from the left",msgCount:"Messages",relationCount:"Relations",relationsByIntimacy:"Proximity Ranking",noRelations:"No relations",intimacy:"Proximity",interactionRanking:"Interaction Ranking",score:"Proximity",coOccurrence:"Co-occur",times:" times",totalMembers:"Total Members",totalMessages:"Total Messages",involvedMembers:"Involved",edgeCount:"Relations"},vy={typeDistribution:"Message Type Distribution",hourlyDistribution:"Hourly Distribution",weekdayDistribution:"Weekday Distribution",monthlyDistribution:"Monthly Distribution",yearlyDistribution:"Yearly Distribution",timeHeatmap:"Time Heatmap",heatmapHint:"Shows chat time patterns",calendarHeatmap:"Message Calendar",calendarHint:"Daily message distribution",calendarTooltipMessages:"Messages",lengthDetailTitle:"Short Messages (1-25 chars)",lengthDetailHint:"Per character",lengthGroupedTitle:"Length Range Distribution",lengthGroupedHint:"Grouped by 5",noTextMessages:"No text messages",noData:"No data",profile:{avgLengthUnit:"{count} chars/msg",textExpression:"Text Expression",textExpressionDesc:"Longest message {count} chars",mediaRichness:"Media Richness",shortMaster:"Short Msg Master",shortMasterDesc:"{count} msgs with ≤5 chars",essayLover:"Essay Lover",essayLoverDesc:"Messages with ≥{threshold} chars",typeDistribution:"Msg Types",heroLine1Prefix:"A total of",heroLine1Suffix:"messages exchanged"},typeCard:{watermark:"Type Report",nonTextPrefix:"Besides text,",nonTextImage:"images",nonTextEmoji:"emojis",nonTextVoice:"voice msgs",nonTextVideo:"videos",nonTextFile:"files",nonTextLink:"links",unitImage:"images",unitEmoji:"emojis",unitVoice:"voice msgs",unitVideo:"videos",unitFile:"files",unitLink:"links"},timeCard:{hourlyDistribution:"24h Distribution",watermark:"Time Report",heroDaysIn:"days,",heroDaysActive:"days active",heroAvgPrefix:"Average",heroAvgSuffix:"messages/day",personalityNightOwl:"Night Owl",personalityEarlyBird:"Early Bird",personalityLunchChat:"Lunch Chatter",personalityEveningChat:"Evening Talker",personalityDaytime:"Daytime Active",personalityEveryday:"Always On",personalityWeekend:"Weekend Active",personalityWeekday:"Weekday Active",peakRecord:"Peak Record",peakRecordDesc:"Max {count} msgs in a day",topHoursLabel:"Top Active Hours",peakWeekdayLabel:"Peak Weekday",weekendRatio:"Weekend Ratio",weekendRatioDesc:"Messages on weekends"},timeAnalysis:{memberTrendTitle:"Message Trend",memberTrendHint:"Monthly message volume by member"},typeAnalysis:{textDepthTitle:"Text Depth Analysis",textTotal:"Text Messages",avgLength:"Avg Chars",medianLength:"Median Length",maxLength:"Max Length",percentiles:"Length Percentiles",shortMessages:"Short(≤5 chars)",essayMessages:"Long(≥30 chars)"}},yy={layout:"Layout",circular:"Circular",force:"Force",directed:"Directed",reset:"Reset",graphHint:"{nodes} members, {links} interactions",noInteraction:"No mention interaction data"},by={empty:{title:"No Relationship Data",description:"No sessions found in the selected time range."},monthly:{title:"Monthly Breakdown",totalSessionsPrefix:"Total",totalSessionsSuffix:"sessions"},trend:{title:"Initiative Trend",hint:"Blue line shows {name}'s monthly initiative ratio; 50% line is the balanced baseline"},hero:{totalSessionsPrefix:"You had",totalSessionsSuffix:"conversations in total",initiativePrefix:"",initiativeByPrefix:"of opening messages were started by",initiativeBySuffix:"",initiateTimes:"starts"},initiator:"Start Conversations",closer:"End Conversations",closerTitle:"Conversation Closer",closerHint:"Shows who sends the last message when a topic ends.",noActivity:"No activity this month",watermarkReport:"Relationship Report",monthFormat:"{month}/{year}",monthShortFormat:"{month}",iceBreaker:{title:"Ice Breaker",hint:"Times breaking silence after 24+ hours of inactivity"},responseLatency:{title:"Reply Speed",hint:"Average time to reply after the other person sends a message",seconds:"{n}s",minutesSeconds:"{m}m {s}s",hours:"{n}h",hoursMinutes:"{h}h {m}min"},perseverance:{title:"Perseverance",hintWithThreshold:"Times sending another message when the other person hasn't replied within {threshold}",thresholdMinutes:"{n} min"},labels:{wellMatched:"Well Matched",missingYou:"{name} Misses You",monologue:"{name}'s Monologue",peacefulSilence:"Peaceful Silence",fleetingThoughts:"Fleeting Thoughts"}},_y={title:"Timeline View",description:"Message time distribution, active period trends and other visualizations"},xy={rankListPro:{fullRanking:"Full Ranking",memberCount:"{count} members"},rankList:{unit:""},nicknameHistory:{periodToNow:"{start} ~ Now",periodRange:"{start} ~ {end}",current:"Current",empty:"No nickname history"},listPro:{countTemplate:"{count} items",fullRanking:"Full Ranking",empty:"No data"}},ky={cluster:hy,message:vy,interaction:yy,relationship:by,timeline:_y,charts:xy},wy="Keyword Filter",Sy="Schemes",Cy="Scheme Name",Iy="Enter scheme name",My="New Scheme",Ty="New Scheme",Ay="Delete",$y="Set as Default",Py="Default",Dy="Keyword Filter",Ly="No Filter",Ry="Manage Schemes",Ey="Add Filter Words",Fy="Type and press Enter, separate with spaces or commas",Ny="Add",Uy="Filter Words",Oy="Clear All",Vy="No schemes yet. Click + to create one.",Hy="No filter words. Add some above.",zy="Select or create a filter scheme",By="{count} words filtered",Wy="Close",jy={title:wy,schemeList:Sy,schemeName:Cy,schemeNamePlaceholder:Iy,defaultSchemeName:My,createScheme:Ty,deleteScheme:Ay,setDefault:$y,isDefault:Py,filterScheme:Dy,noFilter:Ly,manage:Ry,addWords:Ey,addWordsPlaceholder:Fy,add:Ny,wordList:Uy,clearAll:Oy,emptyScheme:Vy,emptyWords:Hy,selectOrCreate:zy,activeCount:By,close:Wy},qy={common:Mh,layout:Bh,settings:av,home:gv,analysis:Iv,tools:Tv,providers:Vv,ai:Kv,quotes:ey,members:oy,records:fy,views:ky,wordFilter:jy},Ky="確定",Gy="取消",Xy="儲存",Yy="編輯",Qy="新增",Jy="截圖",Zy="關閉",e0="返回上一頁",t0="完成",s0="重試",a0="應用程式初始化失敗",n0="載入中...",o0="初始化中...",r0="無匹配結果",i0="匯出成功",l0="匯出失敗",c0="產生中...",d0="重新產生",u0="開啟資料夾",m0="請先在設定中設定 AI 服務",g0={unknown:"未知錯誤"},p0={text:"文字",image:"圖片",voice:"語音",video:"影片",file:"檔案",emoji:"表情",link:"連結",location:"位置",redPacket:"紅包",transfer:"轉帳",poke:"拍一拍",call:"通話",share:"分享",reply:"回覆",forward:"轉發",contact:"名片",system:"系統",recall:"收回",other:"其他",unknown:"未知"},f0={mon:"週一",tue:"週二",wed:"週三",thu:"週四",fri:"週五",sat:"週六",sun:"週日"},h0={jan:"1月",feb:"2月",mar:"3月",apr:"4月",may:"5月",jun:"6月",jul:"7月",aug:"8月",sep:"9月",oct:"10月",nov:"11月",dec:"12月"},v0={title:"選擇語言",subtitle:"請選擇您偏好的介面語言",next:"下一步"},y0={title:"隱私權政策與使用條款",subtitle:"使用前請先詳閱",disagree:"我不同意",agree:"我已閱讀並同意上述內容",updateNotice:"條款內容已更新,請重新閱讀並確認"},b0={selectDate:"選擇日期",clearDate:"清除日期"},_0={mode:{recent:"最近",quarter:"按季",year:"按年",custom:"自訂"},recent:{oneYear:"近一年",twoYears:"近兩年",fiveYears:"近五年",all:"全部"},display:{recent365:"最近一年",recent730:"最近兩年",recent1825:"最近五年"},quarter:{label:"{year}年 第{quarter}季"},year:{label:"{year}年"}},x0={allMembers:"全部成員"},k0={description:"此服務已開啟認證保護,請輸入 API Token 登入",tokenLabel:"API Token",tokenPlaceholder:"clb_xxxxxxxx",submit:"登入",hint:"Token 可在啟動日誌、config.toml 或 --token 啟動參數中取得",errorEmpty:"請輸入 Token",errorInvalid:"Token 無效,請檢查後重試",errorNetwork:"網路連線失敗",rememberDevice:"記住此裝置",rememberWarning:"僅在可信裝置上勾選,Token 將持久保存在瀏覽器中",logoutTitle:"帳戶",logoutDesc:"退出目前認證登入",logout:"登出"},w0={confirm:Ky,cancel:Gy,delete:"刪除",save:Xy,edit:Yy,add:Qy,capture:Jy,close:Zy,back:e0,done:t0,retry:s0,initFailed:a0,loading:n0,initializing:o0,noResults:r0,export:"匯出",exportSuccess:i0,exportFailed:l0,generating:c0,regenerate:d0,openFolder:u0,errorNoAIConfig:m0,error:g0,messageType:p0,weekday:f0,month:h0,languageSelect:v0,agreement:y0,datePicker:b0,timeSelect:_0,userSelect:x0,login:k0},S0="ChatLab",C0="分析新對話",I0="管理",M0="暫無紀錄",T0="搜尋聊天名稱",A0="未找到匹配的聊天紀錄",$0={rename:"重新命名",pin:"置頂",unpin:"取消置頂",copyId:"複製 ID",delete:"刪除"},P0={title:"重新命名",placeholder:"請輸入新名稱"},D0={title:"確認刪除",message:"確定要刪除聊天紀錄「{name}」嗎?此操作無法復原。"},L0={tag:"New",title:"發現新版本",message:"最新版本是 v{version}。",desktopHint:"點擊立即更新後,ChatLab 會開始檢查並下載桌面端更新。",cliHint:"請在終端機執行以下命令更新 CLI,更新後重新啟動服務。",updateNow:"立即更新",later:"稍後"},R0={all:"全部",private:"私聊",group:"群聊"},E0={importedAt:"匯入時間",lastMessageTs:"最近對話",messageCount:"訊息數量"},F0={collapse:"收起側邊欄",search:"搜尋聊天紀錄",sort:"排序"},N0="{count} 條訊息",U0={settings:"設定"},O0={brand:S0,newAnalysis:C0,manage:I0,noRecords:M0,searchPlaceholder:T0,noSearchResult:A0,contextMenu:$0,renameModal:P0,deleteModal:D0,updateNotice:L0,filter:R0,sort:E0,tooltip:F0,sessionInfo:N0,footer:U0},V0="設定",H0={basic:"基本設定",ai:"AI 設定",aiConfig:"模型服務",aiDefaultModel:"預設模型",semanticIndex:"語意索引",chatPreferences:"對話偏好",compression:"上下文壓縮",aiPreprocess:"前處理",dataManage:"資料管理",storage:"儲存管理",sessionManage:"會話索引",about:"關於 ChatLab",api:"自動化",apiSubTabs:{autoSync:"自動同步",apiService:"API 服務",mcp:"MCP"}},z0={general:{title:"一般"},preferences:{title:"偏好設定"},language:{description:"選擇軟體顯示語言"},appearance:{title:"外觀設定",themeMode:"主題模式",auto:"依系統設定",light:"淺色模式",dark:"深色模式"},defaultTab:{description:"進入聊天對話後預設顯示的頁面",overview:"總覽",aiChat:"AI 對話"},autoLaunch:{openAtLogin:"開機自動啟動",openAtLoginDesc:"系統啟動時自動執行 ChatLab",devModeHint:"開發模式下不可用"},toolsPanel:{positionLabel:"快捷工具入口位置",positionDesc:"選擇快捷工具面板的顯示位置",positionSide:"右側",positionHeader:"頂部"},screenshot:{mobileAdapt:"行動畫面適配",mobileAdaptDesc:"截圖時會自動縮放寬度,方便在行動裝置上查看"},network:{title:"網路設定",proxyMode:"代理模式",proxyModeDesc:"存取網路時使用的代理方式",modeOff:"關閉",modeSystem:"跟隨系統",modeManual:"手動設定",proxyAddress:"代理地址",proxyPlaceholder:"http://127.0.0.1:7890",proxyHelp:"支援 HTTP/HTTPS 代理,格式如:http://127.0.0.1:7890",testConnection:"測試連線",testing:"測試中...",connectionSuccess:"代理連線成功!",connectionFailed:"連線失敗",enterProxyFirst:"請先輸入代理地址",invalidProxyUrl:"請輸入有效的代理地址,格式如 http://127.0.0.1:7890",onlyHttpSupported:"僅支援 http:// 或 https:// 協定",saveFailed:"儲存失敗"}},B0={title:"預設模型",noConfigs:"請先在「模型服務」中新增模型設定",selectProvider:"選擇提供商",selectModel:"選擇模型",assistantModel:{label:"預設助手模型",description:"用於 AI 對話、工具呼叫、SQL 助手、上下文壓縮"},fastModel:{label:"快速模型",description:"用於會話摘要生成,未設定時使用預設助手模型",followAssistant:"跟隨預設助手模型"}},W0={title:"模型服務",defaultModel:"預設模型",empty:{title:"尚未設定 AI 服務",description:"新增一組設定後即可開始使用 AI 功能"},addConfig:"新增服務",maxConfigs:"已達設定上限(最多 10 組)",modal:{addConfig:"新增服務",editConfig:"編輯服務",localService:"本機服務",configName:"設定名稱",optional:"(選填)",configNamePlaceholderPreset:"留空則使用服務商名稱",configNamePlaceholderCustom:"留空則使用 API 端點網址",aiProvider:"AI 服務商",apiKeyPlaceholder:"輸入你的 API Key",apiKeyPlaceholderEdit:"輸入新的 API Key(留空保持原有)",apiKeyPlaceholderLocal:"本機服務通常不需要",apiKeyHintLocal:"如果服務設定了認證,在此輸入",validate:"驗證",validationSuccess:"連線驗證成功",validationFailed:"連線驗證失敗",validationFailedTitle:"API 連線驗證失敗",saveAnywayHint:"驗證未通過,設定資訊可能有誤。是否仍然儲存?",saveAnyway:"仍然儲存",validationError:"驗證失敗:",model:"模型",apiEndpoint:"API 位址",apiEndpointHint:"相容 OpenAI 格式的 API 端點",resolvedUrl:"實際請求地址:",fetchModels:"從 API 獲取",fetchModelsTitle:"瀏覽遠端模型",fetchModelsLoading:"正在獲取模型列表...",fetchModelsEmpty:"未獲取到模型",fetchModelsError:"獲取模型列表失敗",fetchModelsCount:"共 {total} 個模型,當前顯示 {shown} 個",modelAdded:"已添加",addAllModels:"全部添加",searchModels:"搜尋模型...",apiEndpointOverrideHint:"預設地址已填入,可按需改為完整 URL",customService:"自訂服務",visitWebsite:"訪問官網",getApiKey:"取得 API Key",presetService:"預設服務",thirdPartyService:"第三方服務",addCustomModel:"新增模型",deleteCustomModel:"刪除選中",customModelId:"模型端點名稱",customModelIdHint:"API 呼叫時使用的模型識別碼",customModelDisplayName:"顯示名稱",customModelDisplayNamePlaceholder:"自訂顯示名稱",editModel:"編輯模型",contextWindow:"上下文視窗",contextWindowPlaceholder:"如 128000",contextWindowHint:"模型支援的最大上下文 token 數(用於上下文壓縮)",contextWindowMissing:"未設定上下文視窗,將使用預設值,建議點擊「編輯模型」手動填寫",modelRequired:"至少新增一個模型才能儲存",apiFormat:"API 介面類型",apiFormatOpenAI:"OpenAI Completions",apiFormatAnthropic:"Anthropic",apiFormatGemini:"Gemini",apiFormatOpenAIResponses:"OpenAI Responses"},providerKind:{aggregator:"聚合",custom:"自訂"}},j0={title:"本機儲存管理",description:"管理 ChatLab 在本機儲存的資料檔案",dataLocation:{title:"資料目錄位置",description:"自訂本機資料與快取的存放位置",choose:"選擇位置",applyPath:"套用",reset:"還原預設",open:"開啟",serverPathHint:"請輸入執行 CLI 服務的機器可存取的絕對路徑。",migrateHint:"偵測到資料仍在舊位置,建議遷移至統一目錄:",ignoreMigrateHint:"忽略",migrateAction:"一鍵遷移",restartTip:"切換目錄後請重新啟動應用程式,舊目錄下快取會跟隨遷移",cliRestartTip:"切換目錄後請重新啟動 CLI 服務,舊目錄下資料會在服務啟動前遷移",confirmTitle:"確認切換資料目錄",confirmMessage:"您即將切換資料儲存位置,現有資料將被遷移到新目錄。",newPath:"新目錄路徑",defaultPath:"預設位置",confirmWarning:"重新啟動應用程式後,舊資料目錄將被自動刪除。請確保新目錄路徑正確。",cliConfirmWarning:"重新啟動 CLI 服務後,舊資料目錄會遷移到新位置。請確保新目錄路徑正確且服務程序有讀寫權限。",pathRequired:"請輸入資料目錄路徑",installDirForbidden:"不能將資料目錄放在應用程式安裝目錄下,應用程式更新時該目錄會被清空",cancel:"取消",confirm:"確認切換",migrationQueuedTitle:"資料遷移已登記",migrationSuccessMessage:"應用程式需要重新啟動以使變更生效。",cliMigrationSuccessMessage:"請停止目前的 CLI 服務並重新啟動,遷移會在服務啟動前執行。重新啟動完成後再重新開啟頁面查看新目錄。",relaunchNow:"立即重新啟動",acknowledge:"知道了"},openRootDir:"開啟根目錄",totalUsage:"總佔用:",loading:"載入中...",files:"檔案",notExist:"不存在",clear:"清理",open:"開啟",cache:{databases:{name:"聊天紀錄資料庫",description:"匯入的聊天紀錄分析資料"},ai:{name:"AI 對話資料庫",description:"AI 對話歷史與設定檔"},statsCache:{name:"快取資料",description:"聊天記錄的統計快取,清理後會自動重建"},logs:{name:"日誌檔案",description:"軟體的執行日誌,包含匯入、AI、錯誤等日誌"}}},q0={session:{title:"會話索引設定",description:"會話索引會依時間間隔自動將聊天紀錄切分成對話段落,方便 AI 分析與瀏覽",defaultThreshold:"預設分割間隔",thresholdUnit:"分鐘",thresholdHelp:"超過該時間間隔的訊息將被分到新的會話段落",generating:"產生中",batchTitle:"批次產生索引",totalSessions:"共 {count} 個聊天",generatedCount:"已產生 {count} 個",notGeneratedCount:"未產生 {count} 個",loadingStatus:"載入中...",batchGenerate:"產生未索引項目",batchRegenerate:"全部重新產生",batchRegenerateConfirmTitle:"確認重新產生",batchRegenerateConfirmMessage:"此操作將清空所有已產生的 AI 摘要,並重新產生全部會話索引。",batchRegenerateConfirmWarning:"已有的摘要內容將被覆蓋,此操作不可撤銷。",summaryStrategy:"摘要詳細程度",summaryStrategyHelp:"影響 AI 生成摘要時的詳細程度",summaryBrief:"簡要",summaryStandard:"標準"},semanticIndex:{title:"語意索引",description:"用所選向量模型為聊天記錄建立索引,啟用後 AI 回答時可按語意檢索相關歷史片段作為依據。",vectorModel:"向量模型",selectModel:"選擇向量模型",switchModel:"切換模型",noModelSelected:"未選擇向量模型",modelModalTitle:"設定向量模型",modeLocal:"本地模型",modeApi:"API",recommended:"推薦",approxSize:"約 {mb} MB",localDownloadHint:"首次建立索引時自動下載模型,可能需要一些時間。",apiTemplate:"服務範本",modelName:"模型名稱",apiKeySaved:"已儲存,留空則不修改",apiKeyHint:"API Key 單獨安全儲存,設定檔只保存引用。",apiCostWarning:"API 模式可能產生服務商費用,請確認模型價格。",changeRebuildHint:"更換模型或 API 後,已啟用對話需要重建索引。",searchMaxResults:{label:"單次檢索片段數",hint:"AI 呼叫語意檢索時預設回傳的相關片段數(5-15)。AI 可依問題需要臨時調高。"},overview:"索引概覽",enabledCount:"已啟用 {count} 個對話",coverage:"覆蓋率 {percent}%",buildPending:"建立待處理索引",cleanup:"清理未使用索引",cleanupConfirm:"將刪除已停用對話和舊模型遺留的索引資料。此操作不會刪除聊天記錄。",configFirst:"請先設定向量模型",selectConversations:"選擇對話",enabledSessions:"已啟用對話",state:{completed:"已完成",building:"建立中",pending:"待建立",needsRebuild:"需要重建",failed:"失敗",paused:"已暫停"},action:{build:"建立索引",pause:"暫停",cancel:"取消",rebuild:"重建索引",disable:"停用"},session:{statusLabel:"狀態",notEnabled:"未啟用",coverageLabel:"覆蓋率",progressLabel:"建立進度",enableHint:"啟用後,AI 可以在回答此對話相關問題時檢索歷史聊天片段。",configFirst:"啟用前需要先在 設定 > AI > 語意索引 設定向量模型。",enable:"啟用索引",buildVsEnable:"啟用索引:讓此對話進入語意檢索範圍;建立索引:開始讀取全部訊息生成向量,可能消耗本地算力或 API 額度。",retry:"重試",continue:"繼續"},picker:{title:"選擇對話",all:"全部",group:"群聊",private:"私聊",searchPlaceholder:"依名稱搜尋",messages:"{count} 則訊息",enabled:"已啟用",selectedSummary:"已選擇 {count} 個對話,約 {messages} 則訊息",confirmDisableTitle:"確認停用",confirmDisableMessage:"這些對話將停用語意索引,但索引資料會保留,可稍後清理。"}}},K0={chatSettings:{title:"工具設定"},exportSettings:{title:"匯出設定"},chatPreferences:{title:"對話偏好",enableAutoSkill:"AI 自主選擇技能",enableAutoSkillDesc:"啟用後,AI 會根據使用者的問題自動匹配並啟用合適的分析技能;關閉後僅在手動選擇技能時生效",chartAutoMode:{title:"圖表自動生成",description:"控制 AI 在沒有手動選擇繪圖助手時使用圖表的積極程度",explicit:"明確要求時",explicitHint:"只有你明確要求圖表時,AI 才會生成圖表。",suggest:"智慧生成",suggestHint:"策略保守,僅在能明顯幫助理解分析結果時生成圖表。",aggressive:"積極生成",aggressiveHint:"AI 會更主動地在資料分析場景中生成圖表。"}},maxMessages:{title:"傳送條數限制",description:"每次提交給 AI 的最大訊息數,數值越大 Token 消耗越多,分析也更準確(新手建議2000)"},searchContext:{title:"搜尋上下文視窗",description:"搜尋命中訊息時自動攜帶前後的對話上下文,幫助 AI 理解訊息背景。設為 0 則不攜帶上下文",before:"前",after:"後"},exportFormat:{title:"對話匯出格式",description:"匯出 AI 對話時使用的檔案格式",txtLabel:"TXT"},sqlExportFormat:{title:"SQL Lab 匯出格式",description:"匯出 SQL 查詢結果時使用的檔案格式"},compression:{title:"上下文壓縮",enable:"自動壓縮上下文",enableDesc:"對話過長時自動壓縮歷史為摘要,保留關鍵資訊的同時降低 Token 消耗",threshold:"壓縮閾值",thresholdDesc:"上下文 Token 達到模型視窗的百分比時觸發壓縮",buffer:"緩衝區大小",bufferDesc:"保留最近訊息原文的比例,不參與壓縮",maxToolResultPercent:"工具結果上限",maxToolResultPercentDesc:"單次工具回傳給 AI 的最大資料量占比(基於模型上下文視窗計算),超出部分會被智慧截斷"}},G0={title:"關於 ChatLab",description:"在本機運作的聊天紀錄分析工具,透過 SQL 和 AI Agent 幫你回顧社交記憶。",version:"版本",checkUpdate:"檢查更新",checking:"檢查中...",upToDate:"已是最新版本",newVersionAvailable:"發現新版本 {version}",webUpdateHint:"請在終端機執行 clb update 後重啟服務。",updateCheckFailed:"檢查更新失敗:{error}",unknown:"未知",privacy:{title:"隱私設定",analytics:"匿名使用統計",analyticsDesc:"開啟後,軟體會收集版本號、作業系統版本等非敏感資料,用於幫助最佳化產品"},developer:{title:"開發者選項",debugMode:"DEBUG 模式",debugModeDesc:"開啟後,將顯示除錯面板和快捷除錯工具,可用於查看資料庫、執行測試工具,並記錄更詳細的除錯日誌。"}},X0={title:"聊天紀錄預處理",description:"在聊天紀錄傳送給 AI 前進行預處理,節省 Token 並過濾雜訊。原始資料不會被修改。",dataCleaning:"資料清洗",dataCleaningDesc:"自動清理 XML 卡片訊息(如分享連結、小程式等),提取有效內容,大幅節省 Token。建議保持開啟。",mergeConsecutive:"合併連續發言",mergeConsecutiveDesc:"同一人在短時間內的連續訊息合併為一條",mergeWindow:"合併時間視窗(秒)",denoise:"智慧去雜訊",denoiseDesc:"過濾純語氣詞、純表情、系統佔位符(如 [圖片])等無意義訊息",desensitize:"資料脫敏",desensitizeDesc:"根據規則將敏感資訊(手機號、電子郵件、證件號等)替換為佔位符",desensitizeBuiltin:"預置規則",desensitizeResetBuiltin:"恢復預設",desensitizeCustom:"自訂規則",desensitizeAddCustom:"新增自訂規則",desensitizeRuleName:"規則名稱",desensitizeRulePattern:"正規表達式",desensitizeRuleReplacement:"替換文字",desensitizeRuleAdd:"新增",desensitizeRuleInvalidRegex:"正規表達式語法錯誤",desensitizeRuleNamePlaceholder:"例如:員工工號",desensitizeRulePatternPlaceholder:"例如:EMP-\\d+",desensitizeRuleReplacementPlaceholder:"替換文字,如 [工號]",anonymizeNames:"暱稱匿名化",anonymizeNamesDesc:"用編號(U1、U2…)替代真實暱稱傳送給 AI,減少幻覺並節省 Token",blacklist:"黑名單關鍵詞",blacklistDesc:"包含以下任一關鍵詞的訊息將被整條過濾",blacklistPlaceholder:"輸入關鍵詞後按 Enter 新增",blacklistAdd:"新增"},Y0={groups:{credentials:"密碼與 Token",credentials_desc:"API Key、Bearer Token 等憑證",global_contact:"通用聯絡方式",global_contact_desc:"電子郵件等跨地區聯絡方式",global_financial:"通用金融資訊",global_financial_desc:"信用卡等金融編號",global_network:"通用網路資訊",global_network_desc:"URL、IP 地址等網路識別",region_cn:"中國大陸",region_cn_desc:"中國大陸電話、證件和銀行卡等規則",region_us:"美國",region_us_desc:"美國電話、證件等規則",region_jp:"日本",region_jp_desc:"日本電話、個人編號等規則",region_kr:"韓國",region_kr_desc:"韓國電話、身份證號等規則"},rules:{cn_phone:"中國手機號",cn_phone_desc:"1xx xxxx xxxx 格式的 11 位號碼",cn_id_card:"中國身份證號",cn_id_card_desc:"18 位,末位可含 X",cn_bank_card:"中國銀行卡號",cn_bank_card_desc:"16-19 位連續數字",cn_landline:"中國市話號碼",cn_landline_desc:"區號-號碼,如 010-12345678",us_ssn:"美國社會安全號 (SSN)",us_ssn_desc:"XXX-XX-XXXX 格式",us_phone:"美國電話號碼",us_phone_desc:"+1 (XXX) XXX-XXXX 格式",us_drivers_license:"美國駕照號",us_drivers_license_desc:"字母開頭 + 7-8 位數字",jp_phone:"日本電話號碼",jp_phone_desc:"0x0-XXXX-XXXX 格式",jp_my_number:"日本個人編號",jp_my_number_desc:"12 位數字(マイナンバー)",kr_phone:"韓國電話號碼",kr_phone_desc:"01X-XXXX-XXXX 格式",kr_rrn:"韓國身份證號",kr_rrn_desc:"XXXXXX-XXXXXXX 格式(주민번호)",api_key_prefix:"API Key / Token(已知前綴)",api_key_prefix_desc:"sk-、ghp_、AKIA 等開頭的長字串",bearer_token:"Bearer Token",bearer_token_desc:"Bearer 後的授權權杖值",email:"電子郵件地址",email_desc:"user{'@'}domain.com 標準格式",credit_card:"信用卡號",credit_card_desc:"Visa / MasterCard / AmEx 等卡號",ipv4:"IPv4 地址",ipv4_desc:"如 192.168.1.1",url:"URL 連結",url_desc:"http:// 或 https:// 開頭的連結"}},Q0={service:{title:"API 服務",enable:"啟用 API 服務",enableDesc:"開啟後,外部工具可透過 HTTP API 查詢、匯出和匯入聊天數據。僅本機可存取 (127.0.0.1)",portInUseHint:"連接埠被佔用,請在下方修改連接埠或關閉佔用該連接埠的程式後重試"},status:{running:"執行中",stopped:"已停止",starting:"啟動中...",portInUse:"連接埠被佔用",error:"啟動失敗"},port:{title:"連接埠配置",label:"監聽連接埠",desc:"API 服務監聽的本機連接埠號(1024-65535)",edit:"修改",save:"儲存",cancel:"取消"},token:{title:"存取權杖",label:"Bearer Token",desc:"所有 API 請求需要在 Authorization 標頭中攜帶此 Token",noToken:"尚未產生 Token,請先啟用服務",regenerate:"重新產生"},dataSources:{title:"資料來源",desc:"設定外部資料來源 URL,ChatLab 將按設定間隔自動拉取並匯入聊天資料。",empty:"暫無資料來源",disabled:"已暫停",every:"每",minutes:"分鐘",lastSync:"上次同步",syncing:"同步中",messages:"則訊息",addBtn:"新增資料來源",form:{modalTitle:"新增資料來源",name:"名稱",namePlaceholder:"例如:我的聊天伺服器",token:"存取權杖",tokenPlaceholder:"遠端 API 的 Bearer Token",interval:"拉取間隔(分鐘)",pullLimit:"每次拉取訊息數",pullLimitPlaceholder:"預設 1000"},discovery:{baseUrl:"伺服器地址",baseUrlPlaceholder:"示例:http://127.0.0.1:2333/api/v1",found:"發現 {count} 個會話",search:"搜尋",searchPlaceholder:"依會話名稱搜尋",selectAll:"全選",deselectAll:"取消全選",selectByType:"會話類型",typeAll:"全部",typePrivate:"私訊",typeGroup:"群組",loadMore:"載入更多",subscribe:"訂閱 {count} 個會話",messages:"則訊息",error:"連線遠端伺服器失敗",connectionCheckFailed:"無法連線到遠端伺服器,請檢查地址和權杖是否正確"},noSessions:"暫無匯入會話,點擊上方「管理訂閱」新增",edit:{title:"修改配置",save:"儲存",cancel:"取消",editSource:"修改配置",manageSessions:"管理訂閱",subscribed:"已訂閱"},deleteConfirm:{title:"刪除資料來源",message:"確認刪除資料來源「{name}」?該資料來源下的所有匯入配置將被移除。已匯入的本機對話不會被刪除。"},deleteSessionConfirm:{title:"刪除訂閱",message:"確認刪除訂閱「{name}」?",keepData:"僅刪除訂閱",deleteData:"同時刪除匯入的聊天"}},usage:{title:"使用說明",desc:"啟用服務後,外部工具可透過 API 查詢資料,或向 ChatLab 推送聊天記錄。所有請求需攜帶 Bearer Token 認證。",authHint:"請求標頭範例:",docLink:"查看完整 API 文件"}},J0={overview:{title:"MCP 概述",description:"MCP 讓 AI 助手直接查詢你的聊天記錄。支援會話發現、關鍵字搜尋、成員統計、時間分佈等操作。",toolCount:"{count} 個工具",resourceCount:"{count} 個資源",installHint:"安裝 chatlab-cli 後,在 AI 用戶端中新增以下設定即可使用:"},clients:{other:"通用"},config:{title:"用戶端設定",clientLabel:"MCP 用戶端",copy:"複製",copied:"已複製",claudeHint:"將此設定新增至 ClaudeCode 的 MCP 設定中。",codexHint:"將此 TOML 設定新增至 ~/.codex/config.toml 檔案中。",openclawHint:"將此設定新增至專案的 openclaw.json 檔案中。",otherHint:"將此 JSON 設定新增到你的 MCP 用戶端設定檔中。"},tips:{title:"使用提示",dataDir:"MCP 伺服器讀取 ~/.chatlab/ 目錄下的聊天資料,與桌面應用程式共用同一份資料。",readOnly:"所有操作均為唯讀,不會修改你的聊天記錄。",nodeRequired:"npx 和 CLI 方式需要 Node.js 20 或更高版本。",docs:"詳細文件請造訪 docs.chatlab.fun。"}},Z0={title:V0,tabs:H0,basic:z0,defaultModel:B0,aiConfig:W0,storage:j0,ai:q0,aiPrompt:K0,about:G0,aiPreprocess:X0,desensitize:Y0,api:Q0,mcp:J0},eb="探索新的聊天記憶",tb={file:"檔案匯入",api:"自動同步",push:"API推送",apiDescription:"設定外部平台的資料來源,讓聊天記錄定期自動同步到ChatLab。",apiButton:"前往設定自動同步",pushDescription:"開啟本地API服務,允許第三方工具/掛件或腳本將聊天記錄主動推送至ChatLab。",pushButton:"前往設定 API 服務"},sb={viewExample:"查看示例 Demo",downloading:"正在下載示例資料...",importing:"正在匯入示例資料...",failed:"示例資料載入失敗,請確認網路連線後重試"},ab={title:"資料庫需要更新",description:"偵測到 {count} 個資料庫需要升級以支援新功能。",note:"更新通常只需幾秒鐘,不會遺失任何資料。",upgradeContent:"本次升級內容:",upgradeNow:"立即升級",upgrading:"正在升級...",failed:"遷移失敗",partialFailed:"部分資料庫升級失敗",errorHint:"這通常是因為資料庫檔案損壞。建議在側邊欄中刪除失敗的會話,然後重新匯入。",close:"關閉",retry:"重試"},nb={title:"選擇要匯入的聊天",scanning:"正在掃描聊天列表...",scanFailed:"掃描失敗",retry:"重試",selectAll:"全選",chatCount:"共 {count} 個聊天",selected:"已選 {count} 個",messageCount:"{count} 條訊息",import:"匯入 ({count})",noChats:"未發現任何聊天"},ob={title:"選擇聊天記錄格式",hint:"無法自動識別此檔案的格式,請手動選擇對應的聊天記錄格式。",manualSelect:"手動選擇格式",confirm:"使用此格式匯入"},rb={export:"新手引導"},ib={website:"官網",terms:"使用條款"},lb={title:"更新紀錄",subtitle:"查看所有版本更新內容",latest:"最新版本",current:"目前版本",total:"共 {count} 個版本",close:"關閉",loadError:"載入更新紀錄失敗",retry:"重試",types:{feat:"新功能",fix:"問題修復",refactor:"重構優化",docs:"文件更新",chore:"其他優化",style:"樣式優化",ci:"CI/建置"}},cb={tagline:eb,tabs:tb,import:{dropHint:"鬆開滑鼠匯入檔案",clickHint:"點一下選擇,或直接拖曳聊天紀錄匯入",multipleHint:"支援同時選擇或拖曳多個檔案",selectFiles:"選擇聊天紀錄檔案",selectFolder:"選擇匯出資料夾",importFolder:"匯入資料夾",chatRecords:"聊天紀錄",allFiles:"所有檔案",progress:{detecting:"正在偵測格式...",reading:"正在讀取檔案...",parsing:"正在解析訊息...",saving:"正在寫入資料庫...",done:"匯入完成",error:"匯入中斷"},processed:"已處理 {count} 則訊息",viewLog:"檢視匯入日誌",cannotReadPath:"無法讀取檔案路徑",errors:{no_file_selected:"未選擇檔案",import_failed:"匯入失敗",unrecognized_format:"無法識別的檔案格式",no_messages:"未解析到任何訊息,請檢查檔案格式是否正確",actionHint:"你還可以嘗試下方手動匹配或查看日誌:"},diagnostics:{format:"偵測格式:",received:"收到訊息:",written:" / 寫入:",skipped:" / 跳過:"},batch:{importing:"批次匯入中",progressCount:"第 {current} / {total} 個",cancel:"取消匯入",waiting:"等待中",skipped:"已跳過",success:"匯入成功",completed:"批次匯入完成",summary:"成功 {success} 個,失敗 {failed} 個,跳過 {cancelled} 個",view:"檢視"},options:{mergeImport:"合併匯入",mergeImportHint:"勾選後,多個檔案會合併成同一份聊天紀錄"},merge:{importing:"正在合併",parsing:"正在解析檔案...",merging:"正在合併訊息...",completed:"合併完成",completedHint:"{count} 個檔案已合併",messageCount:"{count} 條訊息",failed:"合併失敗"}},demo:sb,migration:ab,chatSelector:nb,formatSelector:ob,quickStart:rb,footer:ib,changelog:lb},db={loading:"載入分析資料...",loadError:"無法載入聊天資料"},ub={loading:"載入分析資料...",loadError:"無法載入聊天資料"},mb={overview:"總覽",view:"洞察",aiChat:"AI 對話",memory:"記憶",lab:"實驗室",debug:"Debug"},gb={sqlTables:"SQL 表格",basicTools:"基礎工具",tableBrowser:{chatDb:"聊天記錄 DB",aiDb:"AI 對話 DB",rowCount:"共 {count} 行",page:"第 {current} / {total} 頁",refresh:"重新整理",noData:"暫無資料",editRow:"編輯",deleteRow:"刪除行",confirmDelete:"確認刪除這行資料?",allConversations:"全部對話",copyCell:"複製選取項",copyRow:"複製整行 (JSON)",clearDebugContext:"清除 Debug 上下文",confirmClearDebug:"確認清除所有訊息的 debug_context 資料?此操作不可撤銷。"}},pb={comingSoon:"記憶功能即將上線,敬請期待"},fb={viewChatRecord:"查看聊天紀錄",sessionIndex:"會話索引",semanticIndex:"語意索引",incrementalImport:"追加匯入",memberManagement:"成員管理",more:"更多"},hb={title:"新增聊天紀錄",description:"選擇要加入「{name}」的聊天紀錄檔案,系統會自動排除重複內容。",dropHint:"點擊選擇或拖曳檔案到此處",analyzing:"正在分析檔案...",totalInFile:"檔案訊息數",newMessages:"新增訊息",duplicates:"重複訊息",noNewMessages:"檔案中沒有新訊息,所有訊息都已存在",importing:"正在匯入...",import:"匯入 {count} 則訊息",success:"匯入成功",successDetail:"已新增 {count} 則新訊息",failed:"匯入失敗"},vb={view:{typeAnalysis:"類型",timeAnalysis:"時間",topic:"話題",groupRelationships:"群關係",ranking:"榜單",relationship:"關係",languagePreference:"語言偏好"},quotes:{hotRepeat:"熱門複讀",catchphrase:"口頭禪",keywordAnalysis:"關鍵字分析"},groupRelationships:{mentionGraph:"{'@'} 關係圖",mentionRanking:"{'@'} 排行",proximity:"發言臨近度"},member:{nicknameHistory:"暱稱變更"}},yb={messageTypeDistribution:"訊息類型分佈",memberDistribution:"成員訊息占比",others:"其他人",memberComparison:"雙方訊息佔比",statCards:{dailyAvgMessages:"日均訊息",messagesCount:"{count} 條",daysCount:"共 {count} 天",imageMessages:"圖片訊息",imagesCount:"{count} 張",peakHour:"最活躍時段:",mostActiveWeekday:"最活躍星期",messagesOnDay:"{count} 條訊息",weekendActivity:"週末活躍度",weekendRatio:"週末訊息佔比",mostActiveDate:"最活躍日期",consecutiveStreak:"連續活躍",daysStreak:"{count} 天",longestStreak:"最長連續活躍",activityRate:"活躍率",activeDaysRatio:"有訊息的天數佔比",lateNightChat:"深夜聊天",lateNightRatio:"佔總訊息 {ratio}%"},dailyTrend:{title:"每日訊息趨勢"},identity:{privateChat:"私聊",groupChat:"群聊",totalMessages:"訊息總數",durationDays:"跨度天數",activeDays:"活躍天數",dailyAvgMessages:"日均訊息"},tools:"常用工具"},bb={miniMode:"迷你模式",exitMini:"退出迷你模式"},_b={title:"匯出聊天紀錄",selectOutputDir:"選擇儲存目錄",format:"格式"},xb={timeRange:"時間範圍",allTime:"全部",today:"今天",lastWeek:"近7天",lastMonth:"近1個月",last3Months:"近3個月",lastYear:"近1年",customTime:"自訂",exportSuccess:"匯出成功",exportFailed:"匯出失敗",exportPreparing:"正在準備匯出..."},kb={groupChat:db,privateChat:ub,tabs:mb,debug:gb,memory:pb,tooltip:fb,incremental:hb,subTabs:vb,overview:yb,toolsPanel:bb,messageExport:_b,filter:xb},wb={searchPlaceholder:"搜尋聊天名稱",searchResult:"找到 {count} / {total} 筆",noSearchResult:"未找到匹配的聊天紀錄",selectAll:"全選",shiftClickHint:"按住 Shift 點擊可範圍多選",selected:"已選 {count} 個",empty:"暫無聊天紀錄",delete:"刪除所選項目",confirmTitle:"確認刪除",confirmMessage:"確定要刪除選取的 {count} 個聊天紀錄嗎?此操作無法復原。",deleting:"正在刪除...",columns:{name:"名稱",platform:"平台",messages:"訊息數",summaries:"AI摘要",aiChats:"AI 對話",importedAt:"匯入時間"},clickToEdit:"點擊即可編輯名稱",merge:"合併所選項目",mergeHint:"選擇 2 個以上同聊天類型的聊天紀錄才能合併",mergeConfirmTitle:"合併聊天紀錄",mergeConfirmMessage:"即將合併所選的 {count} 個聊天紀錄,並建立一筆新的合併紀錄。",deleteOriginalsLabel:"合併後刪除原始聊天紀錄",mergeRiskWarning:"強提醒:刪除後無法復原,且跨平台上下文差異可能導致語意錯位或混亂。請先備份原始資料並確認你已理解風險。",mergeSteps:{exporting:"正在匯出聊天紀錄...",parsing:"正在解析檔案...",checking:"正在偵測衝突...",merging:"正在合併資料...",cleaning:"正在清理暫存檔案..."},mergeSuccess:"成功合併 {count} 個聊天紀錄",mergeError:"合併失敗:{error}",mergedSuffix:"合併"},Sb={batchManage:wb},Cb={name:"DeepSeek"},Ib={name:"通義千問"},Mb={name:"Gemini"},Tb={name:"MiniMax"},Ab={name:"GLM"},$b={name:"Kimi"},Pb={name:"豆包"},Db={name:"矽基流動"},Lb={name:"Groq"},Rb={name:"OpenRouter"},Eb={name:"xAI"},Fb={deepseek:Cb,qwen:Ib,gemini:Mb,minimax:Tb,glm:Ab,kimi:$b,doubao:Pb,siliconflow:Db,groq:Lb,openrouter:Rb,xai:Eb,"openai-compatible":{name:"第三方服務"}},Nb={chatExplorer:"對話式探索",sqlLab:"SQL 實驗室"},Ub={scrollToBottom:"回到底部",input:{placeholderWithSlash:"輸入你的問題,或輸入 / 選擇技能、輸入 {'@'} 選擇成員...",placeholderWithActiveSkill:"已選擇 /{name},請輸入具體問題...",slashHint:"輸入 / 選擇技能",useSkill:"選擇技能",mentionHint:"輸入 {'@'} 選擇成員",mentionEmpty:"沒有符合的成員",mentionEmptyHint:"可按暱稱、別名或帳號搜尋",slashEmpty:"沒有符合的技能",slashEmptyHint:"開啟技能管理匯入內建技能,或建立自訂技能",manageSkills:"管理技能",previewTagsLabel:"標籤",previewToolsLabel:"工具",previewUnavailable:"暫無可預覽的技能提示詞",quickAsk:"快速提問",editQuickAsk:"編輯快速提問",send:"送出",needMoreThanSkill:"只選擇技能還不能送出,請繼續輸入具體問題",needQuestion:"請輸入問題後再送出"},fork:{success:"已複製對話",failed:"複製對話失敗"},backgroundTask:{runningShort:"進行中",runningTitle:"AI 正在背景推理",runningDescription:"上一個問題仍在推理中,請等待完成或先停止。",blockedAction:"目前回答仍在生成中,請先等待完成或手動停止。",return:"返回查看"},message:{copy:{tooltip:"複製 Markdown",success:"Markdown 已複製到剪貼簿",failed:"複製 Markdown 失敗"},process:{label:"執行過程",processing:"處理中",processed:"已處理"},toolResult:{view:"查看結果",title:"傳送給 AI 的工具結果",copy:"複製結果",copySuccess:"工具結果已複製",copyFailed:"複製工具結果失敗",displayTruncated:"此歷史結果只保存了截斷版本;原本那一輪 AI 可能看到了更完整的內容。"},edit:{tooltip:"編輯並重新生成",submit:"送出",overwriteSubsequent:"覆蓋後續所有對話"},fork:{tooltip:"從此處複製對話"},chart:{expand:"開啟大圖",empty:"暫無資料",rows:"{count} 行資料",truncated:"已截斷"},generating:"正在產生回覆...",summary:{label:"上下文摘要",info:"以上對話已被壓縮為摘要以節省上下文空間"},plan:{label:"分析計畫",evidenceNeeded:"所需證據",suggestedTools:"建議工具",successCriteria:"完成標準",noTools:"無"},think:{labels:{think:"已思考",analysis:"分析",reasoning:"推理",reflection:"反思",planValidation:"產生計畫",other:"思考({tag})"},loading:"思考中",duration:"耗時 {seconds} 秒"},toolParams:{keywords:"關鍵字",time:"時間",getMessages:"取得 {count} 則訊息",limit:"限制 {count} 則",contextWithMessages:"{msgCount} 則訊息的前後各 {contextSize} 則上下文",context:"前後各 {size} 則上下文",topMembers:"前 {count} 名成員",search:"搜尋",getMemberList:"取得成員列表",memberId:"成員 ID",timeStats:{hourly:"按小時",weekday:"按星期",daily:"按日期"}}},thinking:{processingResult:"正在整理結果",called:"已執行:",analyzing:"正在分析問題...",compressing:"正在壓縮上下文..."},statusBar:{model:{notConfigured:"AI 尚未設定"},messageLimit:{label:"訊息上限:",title:"設定每次送出的最大訊息數"},agent:{label:"Agent",contextTokens:"上下文",phase:{compressing:"壓縮上下文",preparing:"準備中",thinking:"思考中",tool_running:"工具執行中",responding:"回覆中",completed:"已完成",aborted:"已停止",error:"錯誤"},phaseShort:{compressing:"壓縮",preparing:"準備",thinking:"思考",tool_running:"工具",responding:"回覆",completed:"完成",aborted:"停止",error:"錯誤"}},thinking:{title:"思考強度",tooltip:"設定模型的思考強度",level:{default:"預設",off:"關閉",minimal:"極低",low:"低",medium:"中",high:"高",xhigh:"最高",auto:"自動"}},tokenUsageTitle:"累計 Token 用量",cacheHit:"快取命中",export:{label:"匯出",title:"匯出當前對話"},log:{label:"日誌",title:"開啟當前 AI 日誌檔案",openFailed:"開啟日誌失敗",openFailedDesc:"請稍後重試"}},conversation:{newChat:"新對話",newConversation:"新建對話",empty:"暫無歷史紀錄",startNew:"開始新對話",titlePlaceholder:"輸入標題...",group:{last7Days:"最近 7 天",last30Days:"最近 30 天"},rename:"重新命名",copyId:"複製 ID",delete:"刪除",export:{createdAt:"建立時間",user:"使用者",assistant:"AI 助手",noMessages:"對話沒有訊息"}},error:{title:"處理失敗",detail:"錯誤詳情",viewDetail:"查看詳情",requestUrl:"請求路徑",statusCode:"狀態碼",responseBody:"回應內容",responseHeaders:"回應標頭",requestBody:"請求主體",name:"錯誤名稱",message:"錯誤訊息",stack:"堆疊資訊",cause:"錯誤原因",provider:"服務商",copyAll:"複製全部",copied:"已複製到剪貼簿",unknown:"未知錯誤"},dataSource:{title:"資料來源",keywords:"關鍵字:",empty:"暫無資料",emptyHint:"傳送問題後,相關紀錄會顯示在這裡",totalRecords:"共 {count} 筆紀錄",loadMore:"載入更多"},evidence:{title:"依據證據",query:"問題",criteria:"判定標準",empty:"未找到明確可計入的證據",totalSources:"共 {count} 條來源",mode:{auto:"自動",hybrid:"語意 + 關鍵字",semantic:"語意檢索",keyword:"關鍵字檢索"},group:{included:"計入證據",excluded:"不計入",uncertain:"不確定"},warning:{criteria_missing:"未提供判定標準,分組結果較為保守",keywords_missing_for_hybrid:"未提供關鍵字,已退化為純語意檢索",keywords_required_for_keyword_mode:"關鍵字模式需要提供關鍵字",semantic_unavailable:"語意索引不可用,已改用關鍵字檢索",keyword_unavailable:"關鍵字檢索不可用",semantic_partial:"語意檢索結果可能不完整"}}},Ob={editor:{errorEmptySQL:"請輸入 SQL 語句",placeholder:"輸入 SQL 查詢語句...",tip:"提示:雙擊左側欄位名可插入到 SQL",history:"歷史",generateAndRun:"生成並執行",switchToSQLMode:"切換為 SQL 輸入模式",switchToPromptMode:"切換為 Prompt 輸入模式",run:"執行"},schema:{tables:"資料表",doubleClickToInsert:"雙擊插入到 SQL",primaryKey:"主鍵"},result:{queryError:"查詢錯誤",rows:"{count} 行",readableTime:"時間戳轉日期",viewChat:"檢視聊天紀錄",summarize:"整理摘要",pageSize:"每頁",emptyResult:"查詢結果為空",initialState:"輸入 SQL 語句後執行,即可查看結果",initialHint:"僅支援唯讀查詢(SELECT / WITH),建議添加 LIMIT 以提升效能",summaryTitle:"AI 分析摘要",analyzing:"AI 正在分析結果...",errorSummary:"總結失敗"},generate:{placeholder:"例如:查找發言最多的前 10 個成員、統計每天的訊息數量、找出包含「買房」關鍵字的訊息...",errorEmptyPrompt:"請輸入查詢需求",errorGenerate:"AI 產生失敗",errorTokenLimit:"模型輸出達到 token 上限,未能生成完整回覆(可能思考消耗了過多 token)",aiOutput:"AI 輸出",thinking:"思考中…",thinkingProcess:"思考過程",waitingAI:"等待 AI 回應...",defaultPromptPrivate:"請統計最近1年私聊中雙方各自的:訊息總數、訊息占比、活躍天數、日均訊息數(按活躍天計算)、首次發言時間、最近發言時間;依訊息總數降序顯示。",defaultPromptGroup:"請統計最近1年群聊中各成員的:訊息總數、訊息占比、活躍天數、日均訊息數(按活躍天計算)、文字訊息占比;顯示成員名稱並依訊息總數降序,返回前20名。"},history:{title:"AI 產生紀錄",execute:"執行",empty:"暫無歷史紀錄",justNow:"剛才",minutesAgo:"{count} 分鐘前",hoursAgo:"{count} 小時前",today:"今天"}},Vb={selector:{title:"選擇一個助手開始對話",heroTitlePrefix:"使用",heroTitleSuffix:"開始對話",subtitle:"每位助手都擅長不同分析任務,請選擇最符合需求的一位",noAssistants:"當前場景暫無可用助手",manage:"管理助手",addNew:"新增助手"},config:{viewTitle:"檢視設定",createTitle:"新增助手",editTitle:"編輯助手",betaWarning:"目前仍為測試功能,設定邏輯後續可能調整,請先備份提示詞與相關設定。",tabs:{basic:"基本設定",tools:"工具管理"},name:"名稱",systemPrompt:"系統提示詞",chatType:"適用聊天類型",chatTypeAll:"全部",chatTypeGroup:"群聊",chatTypePrivate:"私聊",locale:"適用語言",localeHint:"不選代表套用全部語言",presetQuestions:"預設問題",addQuestion:"新增問題...",coreTools:"核心工具",coreToolsHint:"基礎資料取得工具,始終啟用,無法關閉",analysisTools:"分析工具",analysisToolsHint:"按需開啟的分析能力,勾選後才會對 AI 可用",selectAll:"全選",deselectAll:"全不選",resetDefault:"還原預設",create:"建立"},market:{title:"助手管理",tabs:{local:"本地助手",market:"助手市場"},localHint:"管理已導入的助手,可配置或刪除",marketHint:"瀏覽助手市場,導入後即可使用和自由編輯",default:"預設",reimport:"重新導入",imported:"已導入",import:"導入",importing:"導入中...",importSuccess:"導入成功",importFailed:"導入失敗",viewConfig:"查看配置",duplicate:"複製",addAssistant:"新增助手",noLocal:"暫無已導入的助手",noCatalog:"暫無可用助手,請檢查網路連線",loading:"載入中...",loadFailed:"載入失敗,請檢查網路連線",retry:"重試"},fallbackName:"助手",duplicateSuffix:"(副本)",toast:{loadFailed:"載入失敗",createSuccess:"建立成功",createFailed:"建立失敗",saveSuccess:"儲存成功",saveFailed:"儲存失敗",resetSuccess:"已還原預設",resetFailed:"恢復失敗",unknownError:"未知錯誤"},builtinToolDesc:{get_chat_overview:"取得聊天概覽資訊",search_messages:"搜尋聊天訊息",deep_search_messages:"深度搜尋聊天訊息",get_recent_messages:"取得最近訊息",get_message_context:"取得訊息上下文",get_conversation_between:"取得兩人對話",get_members:"取得成員列表",get_schema:"查看資料表結構",get_member_stats:"取得成員統計",get_member_name_history:"取得成員改名歷史",get_time_stats:"取得時間統計",get_segment_messages:"取得段落訊息",get_segment_summaries:"取得段落摘要",message_type_breakdown:"訊息類型分佈",peak_chat_hours_by_member:"成員活躍時段",member_activity_trend:"成員活躍趨勢",silent_members:"沉默成員偵測",reply_interaction_ranking:"回覆互動排行",mutual_interaction_pairs:"互動好友配對",member_message_length_stats:"訊息長度統計",unanswered_messages:"未回覆訊息",daily_active_members:"每日活躍人數趨勢",conversation_initiator_stats:"話題發起者統計",activity_heatmap:"活躍度熱力圖",response_time_analysis:"回應時間分析",keyword_frequency:"高頻詞統計",render_chart:"生成動態圖表",semantic_search_current_chat:"檢索聊天歷史"}},Hb={market:{title:"技能管理",tabs:{local:"本地技能",market:"技能市場"},localHint:"管理已導入的技能,可配置或刪除",marketHint:"瀏覽技能市場,導入後即可使用和自由編輯",reimport:"重新導入",imported:"已導入",import:"導入",importing:"導入中...",importSuccess:"導入成功",importFailed:"導入失敗",noLocal:"暫無已導入的技能",noCatalog:"暫無可用技能,請檢查網路連線",addSkill:"新建自定義技能",loading:"載入中...",loadFailed:"載入失敗,請檢查網路連線",retry:"重試"},active:{label:"主動呼叫技能:{name}"}},zb={toolTest:{coreTools:"核心工具",analysisTools:"分析工具",parameters:"參數",arrayPlaceholder:"多個值用逗號分隔",execute:"執行",cancel:"取消",elapsed:"耗時 {ms}ms",result:"執行結果",truncated:"結果過大,已截斷顯示。建議減小 limit 參數以獲取完整資料。"}},Bb={tab:Nb,chat:Ub,sqlLab:Ob,assistant:Vb,skill:Hb,lab:zb},Wb={loading:"正在分析詞頻...",stats:{wordsLabel:"總詞數",clickHint:"提示:點擊詞雲可查看相關訊息"},config:{maxWords:"顯示詞數",sizeScale:"字體大小",userFilter:"使用者篩選",posFilter:"詞性過濾",enableStopwords:"過濾停用詞",dict:"分詞詞庫"},size:{small:"小",medium:"中",large:"大",xlarge:"特大"},posFilter:{all:"全部詞性",meaningful:"常用詞性",custom:"自訂",customHint:"自選詞性",selectMeaningful:"常用詞性",selectAll:"全選",clearAll:"清空"},empty:{title:"暫無詞雲資料",description:"目前篩選條件下的文字訊息不足,無法產生詞雲"},dict:{zhCN:"簡體中文",zhTW:"繁體中文",download:"下載詞庫","download_zh-CN":"下載簡體詞庫","download_zh-TW":"下載繁體詞庫",needDownload:"詞雲已使用內建分詞結果顯示。下載中文詞庫可提升分詞準確度。",downloadHint:"~8MB",downloadSuccess:"詞庫下載成功",downloadFailed:"詞庫下載失敗",promptTitle:"繁體中文詞庫",promptDescription:"偵測到您使用繁體中文,詞雲分析需要繁體詞庫才能取得最佳效果。是否立即下載?(約 8MB)",promptDownload:"立即下載",promptLater:"稍後再說"}},jb={title:"🔍 關鍵字排行榜",description:"分析群聊中的關鍵字使用情況,也能自訂不同榜單",countTemplate:"共 {count} 位成員",templateLabel:"範本:",newTemplate:"+ 新增範本",searchPlaceholder:"輸入後搜尋",clear:"清空",templateHint:"* 右鍵範本可編輯或刪除",keyword:"關鍵字",ranking:"排行榜",multiColorMode:"多色模式",times:"{count} 次",timesWithPercent:"次 ({percent}%)",loading:"正在分析資料...",empty:"暫無資料,請嘗試新增關鍵字或切換範本",contextMenu:{edit:"編輯",delete:"刪除"},modal:{createTitle:"建立範本",editTitle:"編輯範本",templateName:"範本名稱",templateNamePlaceholder:"如:正能量",keywords:"關鍵字",keywordPlaceholder:"輸入後按 Enter 新增",update:"更新"},templates:{laugh:{name:"歡樂值",keywords:"哈哈,xswl,lol,笑死,233",description:"統計群內的快樂指數"},sad:{name:"沮喪量",keywords:"想死,難受,哭了,崩潰,裂開,無語,累了",description:"統計群內的負面情緒"},praise:{name:"捧哏",keywords:"牛逼,666,厲害,強,nb,大佬,羨慕,好強",description:"統計群內最會誇人的成員"},slacker:{name:"摸魚",keywords:"摸魚,下班,餓了,困了,不想上班,什麼時候下班",description:"統計群內最想下班的打工人"},gossip:{name:"吃瓜",keywords:"吃瓜,細說,真的假的,展開說說,尊嘟假嘟,臥槽,離譜",description:"統計群內最愛吃瓜的成員"},polite:{name:"禮貌",keywords:"謝謝,麻煩,收到,好的,辛苦,打擾,請教",description:"統計群內最客氣的成員"},curious:{name:"疑問",keywords:"為什麼,啥,怎麼,不懂,求教",description:"統計群內問題最多的成員"}}},qb={title:"🔥 熱門複讀",loading:"正在載入複讀資料...",description:"單次複讀參與人數最多的內容",countTemplate:"共 {count} 筆熱門複讀",people:"{count}人",times:"{count} 次",colon:":",viewChat:"檢視聊天紀錄",empty:"暫無複讀資料"},Kb={heroPrefix:"共分析了",heroMiddle:"則訊息,",heroMiddleSecond:"產生了",heroSuffix:"個不同詞彙",topTopicsPrefix:"你們最愛聊:",hotTopic:"熱門話題",hotTopicDesc:"出現了 {count} 次",richness:"詞彙豐富度",richnessValue:"{value}%",richnessDesc:"不重複詞 {unique} / 總詞數 {total}",chatStyle:"聊天風格",styleEncyclopedia:"百科全書型",styleEncyclopediaDesc:"名詞佔比高,愛聊人、地、事",styleAction:"行動派",styleActionDesc:"動詞佔比高,愛討論做什麼",styleExpressive:"表達派",styleExpressiveDesc:"形容詞佔比高,善於修飾表達",styleBalanced:"均衡型",styleBalancedDesc:"聊天內容多元,各類話題均衡",expressionStyle:"表達風格",expressionCasual:"簡潔口語",expressionCasualDesc:"用詞簡短,輕鬆隨意",expressionFormal:"正式書面",expressionFormalDesc:"用詞考究,表達嚴謹",expressionMixed:"混合風格",expressionMixedDesc:"口語與書面兼顧",watermark:"話題畫像 · Topic Profile",sharedTopics:"共同話題"},Gb={loading:"正在分析口頭禪資料...",times:"{count} 次",empty:{title:"暫無口頭禪資料"},stats:{clickHint:"提示:點擊可查看相關訊息"},viewMode:{list:"列表",wordcloud:"詞雲"},topN:"顯示數量"},Xb={loading:"正在分析語言偏好...",empty:"暫無足夠的文字訊息進行語言分析",card:{diversityTitle:"詞彙深度",diversityDesc:"不重複詞彙佔比",styleTitle:"聊天氣質",styleDesc:"基於詞性分佈推導的表達風格",punctTitle:"標點性格",punctDesc:"最常用的標點風格",watermark:"語言偏好 · Language Preference",radarFactual:"事實性",radarActive:"行動感",radarDescriptive:"描述欲",radarAffable:"親和力",radarIntense:"程度感",radarNoun:"名詞",radarVerb:"動詞",radarAdj:"形容詞",radarModal:"語氣詞",radarAdv:"副詞",topCatchphrases:"熱門口頭禪",languageProfiles:"語言畫像"},catchphrasePK:{title:"口頭禪 PK",sharedCount:"{count} 個共同口頭禪",hint:"提示:點擊可查看相關訊息,粉框標記為共同口頭禪"},pos:{title:"詞性圖譜",styleEncyclopedia:"百科全書派",styleAction:"行動派",styleExpressive:"感性派",styleBalanced:"均衡派"},modal:{title:"語氣詞畫像",toneSoft:"軟萌親和",toneCurious:"好奇探索",toneCasual:"隨和建議",toneCalm:"沉穩內斂",toneMixed:"多元風格",empty:"暫無語氣詞資料"},punctuation:{title:"標點性格",none:"無標點",personalityDeep:"深沉文學型",personalityPassionate:"情緒飽滿型",personalityCurious:"好奇寶寶型",personalityCheerful:"心情愉悅型",personalityFreeflow:"意識流型",personalityPrecise:"嚴謹規範型",empty:"暫無標點資料"}},Yb={wordcloud:Wb,keywords:jb,hotRepeat:qb,topicProfile:Kb,catchphrase:Gb,languagePreference:Xb},Qb={title:"你是誰?",subtitle:"選擇你在這個對話中的身分",description:"設定後你的訊息會顯示在聊天紀錄檢視器右側,AI 對話也能識別你的身分,分析更準確。同平台的其他對話會自動套用。",searchPlaceholder:"搜尋成員",noMatch:"沒有找到符合的成員",empty:"暫無成員資料",later:"稍後",dontRemind:"此對話不再提醒",save:"儲存",clear:"清除目前選擇",saved:"已設定你的身分",appliedToOthers:"已自動套用到 {count} 個同平台對話",saveFailed:"設定身分失敗",currentOwner:"我是:{name}",choose:"選擇我是誰",change:"修改",helper:"設定後 AI 對話能識別你的身分,分析更準確"},Jb={title:"成員管理",description:"共 {count} 位成員,可為成員新增別名備註或移除成員",searchPlaceholder:"搜尋群暱稱、帳號名稱、ID 或別名",noMatch:"沒有找到符合的成員",empty:"暫無成員資料",table:{accountName:"帳號名稱",groupNickname:"群暱稱",messageCount:"訊息數",customAlias:"自訂別名",actions:"操作"},aliasPlaceholder:"輸入後按 Enter 新增",delete:"刪除",mergeSelected:"合併所選",mergeSelectedCount:"已選 {count} 位成員",pagination:"顯示第 {start} - {end} 筆,共 {total} 位成員",tip:"提示:新增別名後,搜尋與 AI 分析時會更容易辨識聊天對象。",mergeModal:{title:"確認合併成員?",content:"將成員 {source}({sourceCount} 則訊息)合併至 {target}({targetCount} 則訊息)下。預設保留訊息較多一方的名稱。",hint:"合併後無法復原,被合併成員的訊息將全部歸屬至保留成員。",cancel:"取消",confirm:"確認合併"},modal:{title:"確認刪除成員?",content:"即將刪除成員 {name} 及其 {count} 則訊息,此操作不可復原。",cancel:"取消",confirm:"確認刪除"}},Zb={note:"備註:QQ 舊版客戶端支援匯出 txt 聊天紀錄,該版本能取得較完整的暱稱變更紀錄",title:"暱稱變更紀錄",loading:"載入中...",hasChanges:"{count} 位成員曾修改過暱稱",noChanges:"暫無成員修改暱稱",current:"當前",empty:"該群組所有成員均未修改過暱稱",loadingText:"正在載入暱稱變更紀錄..."},e_={loading:"正在分析 {'@'} 互動資料...",topMentioners:"📢 誰最喜歡 {'@'} 別人",totalMentions:"共 {count} 次 {'@'}",topMentioned:"🎯 誰最常被 {'@'}",popularMember:"群裡的人氣王",times:"次",oneWay:{title:"🐕 單向關注偵測",description:"發現 {count} 對單向關注關係(一方 {'@'} 另一方佔比 ≥80%)",neverRespond:"從不回應",reverse:"反向 {count} 次",ratio:"{value}% 單向"},twoWay:{title:"💕 雙向奔赴偵測",description:"發現 {count} 對互動頻繁的 CP(互相 {'@'} 且平衡度 ≥30%)",interactions:"次互動",balance:"{value}% 平衡"},emptyTitle:"📱 {'@'} 互動分析",empty:"暫無 {'@'} 互動資料",modal:{title:"{name} 的 {'@'} 關係",topMentioned:"最常 {'@'} 的人",topMentioners:"最常 {'@'} TA 的人",timesCount:"{count} 次",close:"關閉"}},t_={ownerPrompt:Qb,list:Jb,nicknameHistory:Zb,relationships:e_,private:{title:"對話成員",description:"共 {count} 位成員,可為成員新增別名備註用於搜尋和 AI 分析",messageCount:"訊息數",percentage:"佔比 {value}%",customAlias:"自訂別名",aliasPlaceholder:"輸入後按 Enter 新增別名",empty:"暫無成員資料",tipTitle:"提示",tipContent:"新增別名可以更好地識別聊天紀錄中的對話對象,別名將用於搜尋和 AI 分析中。"}},s_={title:"聊天紀錄檢視器",loadedCount:"已載入 {count} 條訊息"},a_={loading:"載入中...",noMessages:"暫無訊息",tryAdjustFilter:"嘗試調整篩選條件",loadingMore:"載入更多...",scrollUpForMore:"↑ 向上捲動載入更多",scrollDownForMore:"↓ 向下捲動載入更多"},n_={messageId:"訊息 ID",memberNotSupported:"成員(暫不支援)",keywordsPlaceholder:"關鍵字(多個請用逗號分隔,按 Enter 搜尋)",startDate:"起始日期",endDate:"結束日期",reset:"重置",filter:"篩選"},o_={timeline:"摘要",noSessions:"暫無摘要",generateSummary:"產生摘要",tooFewMessages:"訊息太少"},r_="摘要產生失敗",i_="未知錯誤",l_={title:"批次產生摘要",byRange:"依範圍",byTime:"依時間",selectRange:"選擇範圍",rangeStart:"最早",rangeInfo:"約",sessionsUnit:"個會話",rangeEnd:"最近",timeRange:"選擇時間範圍",today:"今天",yesterday:"昨天",week:"最近7天",month:"最近30天",custom:"自訂",found:"找到",hasSummary:"個已有摘要",tooFewMessages:"個訊息太少",pending:"待產生:",unit:"個",noPending:"沒有可產生摘要的會話",noSessions:"該時間範圍內沒有會話",checking:"檢查中...",loading:"載入中...",progress:"進度",session:"會話",statusSuccess:"成功",statusSkipped:"跳過",statusFailed:"失敗",success:"成功:",failed:"失敗:",skipped:"跳過:",start:"開始產生",stop:"停止"},c_={viewContext:"檢視上下文",replyTo:"回覆"},d_={title:"會話索引",subtitle:"用於聊天紀錄的時間軸導覽",notGenerated:"尚未產生會話索引",notGeneratedHint:"產生會話索引後,您可以在聊天紀錄檢視器中透過時間軸快速切換到不同會話。",whatIsIt:"會話索引的作用:",benefit1:"根據訊息時間間隔自動識別會話邊界",benefit2:"在聊天紀錄檢視器中提供時間軸導覽",benefit3:"協助 AI 更理解對話上下文",generated:"會話索引已產生",sessionCount:"共識別出 {count} 個會話",regenerateHint:"如果您調整了會話間隔門檻,可重新產生索引。",generate:"產生索引",regenerate:"重新產生",generating:"產生中...",cancel:"取消"},u_={drawer:s_,messageList:a_,filter:n_,timeline:o_,summaryFailed:r_,summaryUnknownError:i_,batchSummary:l_,messageItem:c_,sessionIndex:d_},m_={rankingView:"排行榜檢視",memberView:"成員檢視",matrixView:"矩陣檢視",modelSettings:"模型參數",lookAhead:"鄰近人數",lookAheadDesc:"每則訊息往後納入幾位發言者",decaySeconds:"時間衰減(秒)",decaySecondsDesc:"值越大,遠距離訊息權重越高",applySettings:"套用設定",noData:"暫無資料",selectMember:"選擇成員",selectMemberHint:"請從左側選擇一個成員",msgCount:"發言數",relationCount:"關係數",relationsByIntimacy:"發言鄰近度排行",noRelations:"暫無關係資料",intimacy:"鄰近度",interactionRanking:"互動排行榜",score:"鄰近度",coOccurrence:"共現",times:"次",totalMembers:"群成員",totalMessages:"訊息總數",involvedMembers:"參與成員",edgeCount:"關係數"},g_={typeDistribution:"訊息類型分佈",hourlyDistribution:"小時分佈",weekdayDistribution:"星期分佈",monthlyDistribution:"月份分佈",yearlyDistribution:"年份分佈",timeHeatmap:"時間熱力圖",heatmapHint:"顯示聊天時間分布規律",calendarHeatmap:"訊息日曆",calendarHint:"每日訊息分佈",calendarTooltipMessages:"訊息",lengthDetailTitle:"短訊息分佈 (1-25字)",lengthDetailHint:"逐字統計",lengthGroupedTitle:"長度區間分佈",lengthGroupedHint:"每5字一組",noTextMessages:"暫無文字訊息",noData:"暫無資料",profile:{avgLengthUnit:"{count} 字/則",textExpression:"文字表達力",textExpressionDesc:"最長訊息 {count} 字",mediaRichness:"媒體豐富度",shortMaster:"短訊息達人",shortMasterDesc:"共 {count} 則 ≤5字",essayLover:"小作文愛好者",essayLoverDesc:"≥{threshold}字的訊息",typeDistribution:"訊息類型",heroLine1Prefix:"你們共留下了",heroLine1Suffix:"則訊息"},typeCard:{watermark:"類型報告",nonTextPrefix:"除文字外,發了",nonTextImage:"圖片",nonTextEmoji:"表情包",nonTextVoice:"語音",nonTextVideo:"影片",nonTextFile:"檔案",nonTextLink:"連結",unitImage:"張圖片",unitEmoji:"個表情包",unitVoice:"則語音",unitVideo:"個影片",unitFile:"個檔案",unitLink:"個連結"},timeCard:{hourlyDistribution:"24h 分佈",watermark:"時間報告",heroDaysIn:"天裡有",heroDaysActive:"天在聊天",heroAvgPrefix:"平均每天",heroAvgSuffix:"則訊息",personalityNightOwl:"夜貓子",personalityEarlyBird:"早起鳥",personalityLunchChat:"午間閒聊",personalityEveningChat:"晚間活躍",personalityDaytime:"白天活躍",personalityEveryday:"全勤達人",personalityWeekend:"週末活躍",personalityWeekday:"工作日活躍",peakRecord:"巔峰紀錄",peakRecordDesc:"單日最多 {count} 則",topHoursLabel:"最活躍時段",peakWeekdayLabel:"最活躍週幾",weekendRatio:"週末佔比",weekendRatioDesc:"週末訊息佔比"},timeAnalysis:{memberTrendTitle:"訊息趨勢",memberTrendHint:"各成員的月度訊息量變化"},typeAnalysis:{textDepthTitle:"文字深度分析",textTotal:"文字訊息總數",avgLength:"平均字數",medianLength:"中位數長度",maxLength:"最長訊息",percentiles:"文字長度分位數",shortMessages:"短訊息(≤5字)",essayMessages:"小作文(≥30字)"}},p_={layout:"佈局",circular:"環形",force:"力導向",directed:"有向",reset:"重置",graphHint:"共 {nodes} 位成員,{links} 條互動關係",noInteraction:"暫無艾特互動資料"},f_={empty:{title:"暫無關係資料",description:"目前時間範圍內沒有對話記錄。"},monthly:{title:"月度明細",totalSessionsPrefix:"共對話",totalSessionsSuffix:"次"},trend:{title:"主動性趨勢",hint:"藍色線為 {name} 的月度主動發起佔比,50% 線為均衡基準"},hero:{totalSessionsPrefix:"你們共進行了",totalSessionsSuffix:"次對話",initiativePrefix:"其中有",initiativeByPrefix:"的開場白由",initiativeBySuffix:"發起",initiateTimes:"次發起"},initiator:"發起話題",closer:"結束話題",closerTitle:"話題終結者",closerHint:"統計話題結束時最後發言的人。",noActivity:"本月無互動",watermarkReport:"關係報告",monthFormat:"{year}年{month}月",monthShortFormat:"{month}月",iceBreaker:{title:"破冰達人",hint:"超過 24 小時沉默後主動打破僵局的次數"},responseLatency:{title:"回覆速度",hint:"收到對方訊息後平均多久回覆",seconds:"{n} 秒",minutesSeconds:"{m}分{s}秒",hours:"{n} 小時",hoursMinutes:"{h} 小時 {m} 分鐘"},perseverance:{title:"鍥而不捨",hintWithThreshold:"對方{threshold}內還沒回覆就又發了一次訊息的次數",thresholdMinutes:"{n}分鐘"},labels:{wellMatched:"勢均力敵",missingYou:"{name} 在想念",monologue:"{name} 的獨白",peacefulSilence:"各自安好",fleetingThoughts:"偶爾想起"}},h_={title:"時間軸檢視",description:"以視覺化方式呈現訊息時間分布與活躍週期變化"},v_={rankListPro:{fullRanking:"完整排行榜",memberCount:"共 {count} 位成員"},rankList:{unit:"條"},nicknameHistory:{periodToNow:"{start} ~ 至今",periodRange:"{start} ~ {end}",current:"目前",empty:"暫無暱稱紀錄"},listPro:{countTemplate:"共 {count} 項",fullRanking:"完整排行榜",empty:"暫無資料"}},y_={cluster:m_,message:g_,interaction:p_,relationship:f_,timeline:h_,charts:v_},b_="關鍵詞過濾",__="方案列表",x_="方案名稱",k_="請輸入方案名稱",w_="新方案",S_="新建方案",C_="刪除方案",I_="設為預設",M_="預設方案",T_="關鍵詞過濾",A_="不過濾",$_="管理方案",P_="新增過濾詞",D_="輸入詞語後按 Enter 新增,支援空格或逗號分隔批量新增",L_="新增",R_="過濾詞列表",E_="清空全部",F_="尚無方案,點擊 + 新建",N_="尚無過濾詞,在上方輸入框新增",U_="選擇或建立一個過濾方案",O_="已過濾 {count} 個詞",V_="關閉",H_={title:b_,schemeList:__,schemeName:x_,schemeNamePlaceholder:k_,defaultSchemeName:w_,createScheme:S_,deleteScheme:C_,setDefault:I_,isDefault:M_,filterScheme:T_,noFilter:A_,manage:$_,addWords:P_,addWordsPlaceholder:D_,add:L_,wordList:R_,clearAll:E_,emptyScheme:F_,emptyWords:N_,selectOrCreate:U_,activeCount:O_,close:V_},z_={common:w0,layout:O0,settings:Z0,home:cb,analysis:kb,tools:Sb,providers:Fb,ai:Bb,quotes:Yb,members:t_,records:u_,views:y_,wordFilter:H_},B_="確認",W_="キャンセル",j_="保存",q_="編集",K_="追加",G_="スクリーンショット",X_="閉じる",Y_="戻る",Q_="完了",J_="リトライ",Z_="アプリの初期化に失敗しました",ex="読み込み中...",tx="初期化中...",sx="結果が見つかりません",ax="エクスポートに成功しました",nx="エクスポートに失敗しました",ox="生成中...",rx="再生成",ix="フォルダーを開く",lx="先に設定でAIサービスを構成してください",cx={unknown:"不明なエラー"},dx={text:"テキスト",image:"画像",voice:"音声",video:"動画",file:"ファイル",emoji:"絵文字",link:"リンク",location:"位置情報",redPacket:"お年玉",transfer:"送金",poke:"ツンツン",call:"通話",share:"共有",reply:"返信",forward:"転送",contact:"連絡先カード",system:"システム",recall:"取り消し",other:"その他",unknown:"不明"},ux={mon:"月曜",tue:"火曜",wed:"水曜",thu:"木曜",fri:"金曜",sat:"土曜",sun:"日曜"},mx={jan:"1月",feb:"2月",mar:"3月",apr:"4月",may:"5月",jun:"6月",jul:"7月",aug:"8月",sep:"9月",oct:"10月",nov:"11月",dec:"12月"},gx={title:"言語を選択",subtitle:"ご希望のインターフェース言語を選択してください",next:"次へ"},px={title:"プライバシーポリシーと利用規約",subtitle:"利用前に必ずお読みください",disagree:"同意しない",agree:"内容を確認して同意する",updateNotice:"規約内容が更新されました。再度お読みいただき、ご確認ください"},fx={selectDate:"日付を選択",clearDate:"日付をクリア"},hx={mode:{recent:"最近",quarter:"四半期別",year:"年別",custom:"カスタム"},recent:{oneYear:"1年間",twoYears:"2年間",fiveYears:"5年間",all:"すべて"},display:{recent365:"最近1年間",recent730:"最近2年間",recent1825:"最近5年間"},quarter:{label:"{year}年 第{quarter}四半期"},year:{label:"{year}年"}},vx={allMembers:"すべてのメンバー"},yx={description:"このサービスは認証が必要です。API Tokenを入力してください。",tokenLabel:"API Token",tokenPlaceholder:"clb_xxxxxxxx",submit:"ログイン",hint:"Tokenは起動ログ、config.toml、または --token フラグで確認できます",errorEmpty:"Tokenを入力してください",errorInvalid:"無効なTokenです。確認してもう一度お試しください",errorNetwork:"ネットワーク接続に失敗しました",rememberDevice:"このデバイスを記憶する",rememberWarning:"信頼できるデバイスでのみ使用してください。Tokenがブラウザに保存されます",logoutTitle:"アカウント",logoutDesc:"現在のセッションからログアウト",logout:"ログアウト"},bx={confirm:B_,cancel:W_,delete:"削除",save:j_,edit:q_,add:K_,capture:G_,close:X_,back:Y_,done:Q_,retry:J_,initFailed:Z_,loading:ex,initializing:tx,noResults:sx,export:"エクスポート",exportSuccess:ax,exportFailed:nx,generating:ox,regenerate:rx,openFolder:ix,errorNoAIConfig:lx,error:cx,messageType:dx,weekday:ux,month:mx,languageSelect:gx,agreement:px,datePicker:fx,timeSelect:hx,userSelect:vx,login:yx},_x="ChatLab",xx="新しいチャットを分析",kx="管理",wx="記録がありません",Sx="チャット名を検索",Cx="一致するチャット記録が見つかりません",Ix={rename:"名前変更",pin:"ピン留め",unpin:"ピン留め解除",copyId:"IDをコピー",delete:"削除"},Mx={title:"名前変更",placeholder:"新しい名前を入力してください"},Tx={title:"削除の確認",message:"チャット記録「{name}」を削除しますか?この操作は取り消せません。"},Ax={tag:"New",title:"新しいバージョンがあります",message:"最新バージョンは v{version} です。",desktopHint:"今すぐ更新をクリックすると、デスクトップ版の更新確認とダウンロードを開始します。",cliHint:"ターミナルで次のコマンドを実行し、更新後にサービスを再起動してください。",updateNow:"今すぐ更新",later:"後で"},$x={all:"すべて",private:"個人",group:"グループ"},Px={importedAt:"インポート日時",lastMessageTs:"最新メッセージ",messageCount:"メッセージ数"},Dx={collapse:"サイドバーを折りたたむ",search:"チャット記録を検索",sort:"並べ替え"},Lx="{count} 件のメッセージ",Rx={settings:"設定"},Ex={brand:_x,newAnalysis:xx,manage:kx,noRecords:wx,searchPlaceholder:Sx,noSearchResult:Cx,contextMenu:Ix,renameModal:Mx,deleteModal:Tx,updateNotice:Ax,filter:$x,sort:Px,tooltip:Dx,sessionInfo:Lx,footer:Rx},Fx="設定",Nx={basic:"基本設定",ai:"AI 設定",aiConfig:"モデルサービス",aiDefaultModel:"デフォルトモデル",semanticIndex:"セマンティックインデックス",chatPreferences:"会話設定",compression:"圧縮",aiPreprocess:"前処理",dataManage:"データ管理",storage:"ストレージ管理",sessionManage:"セッションインデックス",about:"ChatLabについて",api:"オートメーション",apiSubTabs:{autoSync:"自動同期",apiService:"API サービス",mcp:"MCP"}},Ux={general:{title:"一般"},preferences:{title:"環境設定"},language:{description:"アプリの表示言語を選択します"},appearance:{title:"外観設定",themeMode:"テーマモード",auto:"システムに従う",light:"ライトモード",dark:"ダークモード"},defaultTab:{description:"チャットに入った時に表示するページ",overview:"概要",aiChat:"AI チャット"},autoLaunch:{openAtLogin:"ログイン時に自動起動",openAtLoginDesc:"システム起動時に ChatLab を自動的に実行します",devModeHint:"開発モードでは利用できません"},toolsPanel:{positionLabel:"ツールパネルの位置",positionDesc:"クイックツールパネルの表示位置を選択します",positionSide:"サイド",positionHeader:"ヘッダー"},screenshot:{mobileAdapt:"モバイル対応",mobileAdaptDesc:"スクリーンショット時に幅を自動調整し、モバイル端末での閲覧に最適化します"},network:{title:"ネットワーク設定",proxyMode:"プロキシモード",proxyModeDesc:"ネットワークアクセス時に使用するプロキシ方式",modeOff:"オフ",modeSystem:"システムに従う",modeManual:"手動設定",proxyAddress:"プロキシアドレス",proxyPlaceholder:"http://127.0.0.1:7890",proxyHelp:"HTTP/HTTPS プロキシに対応。形式例:http://127.0.0.1:7890",testConnection:"接続テスト",testing:"テスト中...",connectionSuccess:"プロキシ接続に成功しました!",connectionFailed:"接続に失敗しました",enterProxyFirst:"先にプロキシアドレスを入力してください",invalidProxyUrl:"有効なプロキシアドレスを入力してください。形式例:http://127.0.0.1:7890",onlyHttpSupported:"http:// または https:// プロトコルのみ対応",saveFailed:"保存に失敗しました"}},Ox={title:"デフォルトモデル",noConfigs:"先に「モデルサービス」でモデル設定を追加してください",selectProvider:"プロバイダーを選択",selectModel:"モデルを選択",assistantModel:{label:"デフォルトアシスタントモデル",description:"AIチャット、ツール呼び出し、SQLアシスタント、コンテキスト圧縮に使用"},fastModel:{label:"高速モデル",description:"セッション要約生成に使用。未設定の場合はデフォルトアシスタントモデルを使用",followAssistant:"デフォルトアシスタントモデルに従う"}},Vx={title:"モデルサービス",defaultModel:"デフォルトモデル",empty:{title:"AI サービスが未設定です",description:"設定を追加して AI を使い始めましょう"},addConfig:"サービスを追加",maxConfigs:"設定は最大 10 件までです",modal:{addConfig:"サービスを追加",editConfig:"サービスを編集",localService:"ローカルサービス",configName:"設定名",optional:"(任意)",configNamePlaceholderPreset:"空欄の場合、サービス名が使用されます",configNamePlaceholderCustom:"空欄の場合、API エンドポイントが使用されます",aiProvider:"AI プロバイダー",apiKeyPlaceholder:"API Key を入力",apiKeyPlaceholderEdit:"新しい API Key を入力(空欄で現在の値を維持)",apiKeyPlaceholderLocal:"ローカルサービスでは通常不要です",apiKeyHintLocal:"サービスに認証が設定されている場合はこちらに入力",validate:"接続確認",validationSuccess:"接続を確認しました",validationFailed:"接続の確認に失敗しました",validationFailedTitle:"API接続の検証に失敗しました",saveAnywayHint:"検証に通過しませんでした。設定が正しくない可能性があります。それでも保存しますか?",saveAnyway:"保存する",validationError:"検証に失敗:",model:"モデル",apiEndpoint:"API URL",apiEndpointHint:"OpenAI 互換形式の API エンドポイント",resolvedUrl:"実際のリクエストURL:",fetchModels:"APIから取得",fetchModelsTitle:"リモートモデル一覧",fetchModelsLoading:"モデルリストを取得中...",fetchModelsEmpty:"モデルが見つかりません",fetchModelsError:"モデルリストの取得に失敗しました",fetchModelsCount:"全 {total} モデル、{shown} 件表示中",modelAdded:"追加済み",addAllModels:"すべて追加",searchModels:"モデルを検索...",apiEndpointOverrideHint:"デフォルトURLは入力済みです。必要に応じて変更してください",customService:"カスタムサービス",visitWebsite:"公式サイト",getApiKey:"APIキーを取得",presetService:"プリセット",thirdPartyService:"サードパーティ",addCustomModel:"モデルを追加",deleteCustomModel:"選択を削除",customModelId:"モデルエンドポイント名",customModelIdHint:"API呼び出しで使用されるモデル識別子",customModelDisplayName:"表示名",customModelDisplayNamePlaceholder:"カスタム表示名",editModel:"モデルを編集",contextWindow:"コンテキストウィンドウ",contextWindowPlaceholder:"例: 128000",contextWindowHint:"モデルがサポートする最大コンテキストトークン数(コンテキスト圧縮に使用)",contextWindowMissing:"コンテキストウィンドウが未設定です。デフォルト値が使用されます。「モデル編集」から手動で設定してください",modelRequired:"少なくとも 1 つのモデルを追加してから保存してください",apiFormat:"API インターフェース",apiFormatOpenAI:"OpenAI Completions",apiFormatAnthropic:"Anthropic",apiFormatGemini:"Gemini",apiFormatOpenAIResponses:"OpenAI Responses"},providerKind:{aggregator:"アグリゲータ",custom:"カスタム"}},Hx={title:"ローカルストレージ管理",description:"ChatLab がローカルに保存したデータファイルを管理します",dataLocation:{title:"データディレクトリの場所",description:"ローカルデータとキャッシュの保存先をカスタマイズ",choose:"場所を選択",applyPath:"適用",reset:"デフォルトに戻す",open:"開く",serverPathHint:"CLI サーバーを実行しているマシンからアクセスできる絶対パスを入力してください。",migrateHint:"データがまだ旧ディレクトリにあります。統一ディレクトリへの移行をお勧めします:",ignoreMigrateHint:"無視",migrateAction:"今すぐ移行",restartTip:"ディレクトリ変更後はアプリを再起動してください。旧ディレクトリのキャッシュは自動で移行されます",cliRestartTip:"ディレクトリ変更後は CLI サーバーを再起動してください。データはサーバー起動前に移行されます",confirmTitle:"データディレクトリの切り替えを確認",confirmMessage:"データの保存先を切り替えます。既存データは新しいディレクトリに移行されます。",newPath:"新しいディレクトリパス",defaultPath:"デフォルトの場所",confirmWarning:"アプリ再起動後、旧データディレクトリは自動的に削除されます。新しいディレクトリパスが正しいことを確認してください。",cliConfirmWarning:"CLI サーバー再起動後、データは新しい場所へ移行されます。パスが正しく、サーバープロセスに読み書き権限があることを確認してください。",pathRequired:"データディレクトリパスを入力してください",installDirForbidden:"データディレクトリをアプリのインストールディレクトリ内に配置することはできません。更新時にディレクトリが消去されます",cancel:"キャンセル",confirm:"切り替えを確認",migrationQueuedTitle:"データ移行を予約しました",migrationSuccessMessage:"変更を反映するにはアプリの再起動が必要です。",cliMigrationSuccessMessage:"現在の CLI サーバーを停止してから再起動してください。移行はサーバー起動前に実行されます。再起動後にページを開き直すと新しいディレクトリを確認できます。",relaunchNow:"今すぐ再起動",acknowledge:"了解"},openRootDir:"ルートを開く",totalUsage:"合計使用量:",loading:"読み込み中...",files:"ファイル",notExist:"存在しません",clear:"クリア",open:"開く",cache:{databases:{name:"チャット履歴データベース",description:"インポートしたチャット履歴の分析データ"},ai:{name:"AI 会話データベース",description:"AI チャット履歴と設定ファイル"},statsCache:{name:"キャッシュデータ",description:"チャット記録の統計キャッシュ。クリア後に自動で再構築されます"},logs:{name:"ログファイル",description:"アプリの実行ログ(インポート、AI、エラーなどのログを含む)"}}},zx={session:{title:"セッションインデックス設定",description:"セッションインデックスは時間間隔に応じてチャット履歴を自動で区切り、AI 分析や閲覧をしやすくします",defaultThreshold:"デフォルト分割間隔",thresholdUnit:"分",thresholdHelp:"この時間を超える間隔があるメッセージは新しいセッションに分割されます",generating:"作成中",batchTitle:"インデックスを一括生成",totalSessions:"全 {count} チャット",generatedCount:"生成済み {count} 件",notGeneratedCount:"未生成 {count} 件",loadingStatus:"読み込み中...",batchGenerate:"未生成分を作成",batchRegenerate:"すべて再生成",batchRegenerateConfirmTitle:"再生成の確認",batchRegenerateConfirmMessage:"この操作により、既存のAI要約がすべてクリアされ、セッションインデックスが最初から再生成されます。",batchRegenerateConfirmWarning:"既存の要約は上書きされます。この操作は取り消せません。",summaryStrategy:"要約の詳細度",summaryStrategyHelp:"AI が要約を生成する際の詳細さを設定します",summaryBrief:"簡潔",summaryStandard:"標準"},semanticIndex:{title:"セマンティックインデックス",description:"選択したベクトルモデルでチャット履歴のインデックスを作成します。有効にすると、AI は回答時に関連する過去の断片を意味検索して裏付けとして利用できます。",vectorModel:"ベクトルモデル",selectModel:"ベクトルモデルを選択",switchModel:"モデルを切り替え",noModelSelected:"ベクトルモデル未選択",modelModalTitle:"ベクトルモデルの設定",modeLocal:"ローカルモデル",modeApi:"API",recommended:"推奨",approxSize:"約 {mb} MB",localDownloadHint:"初回のインデックス作成時にモデルが自動ダウンロードされます。時間がかかる場合があります。",apiTemplate:"サービステンプレート",modelName:"モデル名",apiKeySaved:"保存済み。空欄で変更しません",apiKeyHint:"API キーは別途安全に保存され、設定には参照のみが保存されます。",apiCostWarning:"API モードはプロバイダー費用が発生する場合があります。価格をご確認ください。",changeRebuildHint:"モデルや API を変更すると、有効な会話は再構築が必要です。",searchMaxResults:{label:"1回の検索で返す断片数",hint:"AI がセマンティック検索を実行する際に返す関連断片のデフォルト数(5〜15)。必要に応じて AI が増やせます。"},overview:"インデックス概要",enabledCount:"{count} 件の会話で有効",coverage:"カバレッジ {percent}%",buildPending:"保留中のインデックスを作成",cleanup:"未使用インデックスを整理",cleanupConfirm:"無効化した会話や旧モデルのインデックスデータを削除します。チャット記録は削除されません。",configFirst:"先にベクトルモデルを設定してください",selectConversations:"会話を選択",enabledSessions:"有効な会話",state:{completed:"完了",building:"作成中",pending:"未作成",needsRebuild:"再構築が必要",failed:"失敗",paused:"一時停止"},action:{build:"インデックス作成",pause:"一時停止",cancel:"キャンセル",rebuild:"再構築",disable:"無効化"},session:{statusLabel:"状態",notEnabled:"未有効",coverageLabel:"カバレッジ",progressLabel:"構築の進捗",enableHint:"有効にすると、この会話に関する質問に答える際に AI が過去のチャット断片を検索できます。",configFirst:"有効化の前に 設定 > AI > セマンティックインデックス でベクトルモデルを設定してください。",enable:"インデックスを有効化",buildVsEnable:"有効化:この会話をセマンティック検索の対象に含めます。作成:全メッセージを読み込みベクトルを生成します。ローカル計算や API 枠を消費する場合があります。",retry:"再試行",continue:"続行"},picker:{title:"会話を選択",all:"すべて",group:"グループ",private:"個人",searchPlaceholder:"名前で検索",messages:"{count} 件のメッセージ",enabled:"有効",selectedSummary:"{count} 件の会話を選択、約 {messages} 件のメッセージ",confirmDisableTitle:"無効化の確認",confirmDisableMessage:"これらの会話はセマンティック検索から除外されますが、インデックスデータは保持され、後で整理できます。"}}},Bx={chatSettings:{title:"ツール設定"},exportSettings:{title:"エクスポート設定"},chatPreferences:{title:"会話設定",enableAutoSkill:"AI 自動スキル選択",enableAutoSkillDesc:"有効にすると、AI がユーザーの質問に基づいて適切な分析スキルを自動的にマッチして有効化します。無効にすると、手動で選択した場合のみスキルが適用されます",chartAutoMode:{title:"グラフ自動生成",description:"グラフアシスタントを手動選択していないときに、AI がどの程度積極的にグラフを使うかを制御します",explicit:"明確な依頼時",explicitHint:"明確にグラフを依頼した場合のみ、AI がグラフを生成します。",suggest:"スマート生成",suggestHint:"控えめな方針です。分析結果の理解に明確に役立つ場合のみ、AI がグラフを生成します。",aggressive:"積極生成",aggressiveHint:"データ分析の場面で、AI がより積極的にグラフを生成します。"}},maxMessages:{title:"送信メッセージ数の上限",description:"1 回のリクエストで AI に送る最大メッセージ数です。増やすほど Token 消費は増えますが、分析精度も上がります(初めてなら 2000 推奨)"},searchContext:{title:"検索コンテキストウィンドウ",description:"検索ヒット時に前後の会話コンテキストを自動的に含めることで、AI がメッセージの背景を理解しやすくなります。0 に設定するとコンテキストなし",before:"前",after:"後"},exportFormat:{title:"会話エクスポート形式",description:"AI チャットをエクスポートする際のファイル形式",txtLabel:"TXT"},sqlExportFormat:{title:"SQL Lab エクスポート形式",description:"SQL クエリ結果をエクスポートする際のファイル形式"},compression:{title:"コンテキスト圧縮",enable:"コンテキストの自動圧縮",enableDesc:"会話が長くなった際に履歴を自動的に要約に圧縮し、トークン消費を削減します",threshold:"圧縮閾値",thresholdDesc:"コンテキストトークンがモデルウィンドウのこの割合に達したら圧縮を開始",buffer:"バッファサイズ",bufferDesc:"圧縮せずに保持する最新メッセージの割合",maxToolResultPercent:"ツール結果の上限",maxToolResultPercentDesc:"1回のツール呼び出しでAIに送信される最大データ割合(モデルのコンテキストウィンドウに基づいて計算)。超過分はスマートに切り捨てられます"}},Wx={title:"ChatLabについて",description:"ローカルで動くチャット履歴分析ツール。SQL と AI Agent で会話を振り返れます。",version:"バージョン",checkUpdate:"アップデートを確認",checking:"確認中...",upToDate:"最新バージョンです",newVersionAvailable:"新しいバージョン {version} があります",webUpdateHint:"ターミナルで clb update を実行し、サービスを再起動してください。",updateCheckFailed:"更新確認に失敗しました:{error}",unknown:"不明",privacy:{title:"プライバシー設定",analytics:"匿名利用統計",analyticsDesc:"有効にすると、バージョン番号やOS情報などの非機密データを収集し、製品の改善に役立てます"},developer:{title:"開発者オプション",debugMode:"DEBUG モード",debugModeDesc:"有効にすると、デバッグパネルとクイックデバッグツールが表示されます。データベースの確認、テストツールの実行、より詳細なデバッグログの記録に使用できます。"}},jx={title:"チャット履歴の前処理",description:"チャット履歴を AI に送信する前に前処理を行い、Token を節約しノイズを除去します。元のデータは変更されません。",dataCleaning:"データクリーニング",dataCleaningDesc:"XML カードメッセージ(共有リンク、ミニアプリなど)を自動クリーニングし、有効な内容を抽出します。Token を大幅に節約できます。オンのままにすることを推奨します。",mergeConsecutive:"連続発言の結合",mergeConsecutiveDesc:"同一人物の短時間内の連続メッセージを1つに結合します",mergeWindow:"結合タイムウィンドウ(秒)",denoise:"スマートノイズ除去",denoiseDesc:"感動詞のみ、絵文字のみ、システムプレースホルダー([画像] など)といった無意味なメッセージを除去します",desensitize:"データマスキング",desensitizeDesc:"ルールに基づいて機密情報(電話番号、メールアドレス、身分証番号など)をプレースホルダーに置換します",desensitizeBuiltin:"プリセットルール",desensitizeResetBuiltin:"既定に戻す",desensitizeCustom:"カスタムルール",desensitizeAddCustom:"カスタムルールを追加",desensitizeRuleName:"ルール名",desensitizeRulePattern:"正規表現",desensitizeRuleReplacement:"置換テキスト",desensitizeRuleAdd:"追加",desensitizeRuleInvalidRegex:"正規表現の構文エラー",desensitizeRuleNamePlaceholder:"例:社員番号",desensitizeRulePatternPlaceholder:"例:EMP-\\d+",desensitizeRuleReplacementPlaceholder:"置換テキスト。例:[社員番号]",anonymizeNames:"ニックネーム匿名化",anonymizeNamesDesc:"実際のニックネームの代わりに番号(U1、U2…)を AI に送信し、幻覚を減らして Token を節約します",blacklist:"ブラックリストキーワード",blacklistDesc:"以下のキーワードのいずれかを含むメッセージは丸ごと除外されます",blacklistPlaceholder:"キーワードを入力して Enter で追加",blacklistAdd:"追加"},qx={groups:{credentials:"パスワードと Token",credentials_desc:"API Key、Bearer Token などの認証情報",global_contact:"汎用連絡先情報",global_contact_desc:"メールアドレスなど地域をまたぐ連絡先情報",global_financial:"汎用金融情報",global_financial_desc:"クレジットカード番号などの金融識別子",global_network:"汎用ネットワーク情報",global_network_desc:"URL、IP アドレスなどのネットワーク識別子",region_cn:"中国本土",region_cn_desc:"中国本土の電話番号、証明書、銀行カードなどのルール",region_us:"米国",region_us_desc:"米国の電話番号、証明書などのルール",region_jp:"日本",region_jp_desc:"日本の電話番号、マイナンバーなどのルール",region_kr:"韓国",region_kr_desc:"韓国の電話番号、住民登録番号などのルール"},rules:{cn_phone:"中国の携帯電話番号",cn_phone_desc:"1xx xxxx xxxx 形式の11桁の番号",cn_id_card:"中国の身分証番号",cn_id_card_desc:"18桁、末尾に X を含む場合あり",cn_bank_card:"中国の銀行カード番号",cn_bank_card_desc:"16-19桁の連続数字",cn_landline:"中国の固定電話番号",cn_landline_desc:"市外局番-番号(例:010-12345678)",us_ssn:"米国社会保障番号(SSN)",us_ssn_desc:"XXX-XX-XXXX 形式",us_phone:"米国電話番号",us_phone_desc:"+1 (XXX) XXX-XXXX 形式",us_drivers_license:"米国運転免許証番号",us_drivers_license_desc:"アルファベット + 7-8桁の数字",jp_phone:"日本の電話番号",jp_phone_desc:"0x0-XXXX-XXXX 形式",jp_my_number:"マイナンバー",jp_my_number_desc:"12桁の数字(マイナンバー)",kr_phone:"韓国の電話番号",kr_phone_desc:"01X-XXXX-XXXX 形式",kr_rrn:"韓国の住民登録番号",kr_rrn_desc:"XXXXXX-XXXXXXX 形式(주민번호)",api_key_prefix:"API Key / Token(既知プレフィックス)",api_key_prefix_desc:"sk-、ghp_、AKIA などで始まる長い文字列",bearer_token:"Bearer Token",bearer_token_desc:"Bearer に続く認証トークン値",email:"メールアドレス",email_desc:"user{'@'}domain.com の標準形式",credit_card:"クレジットカード番号",credit_card_desc:"Visa / MasterCard / AmEx などのカード番号",ipv4:"IPv4 アドレス",ipv4_desc:"例:192.168.1.1",url:"URL リンク",url_desc:"http:// または https:// で始まるリンク"}},Kx={service:{title:"API サービス",enable:"API サービスを有効化",enableDesc:"有効にすると、外部ツールが HTTP API 経由でチャットデータの照会・エクスポート・インポートができます。ローカルホストのみ (127.0.0.1)",portInUseHint:"ポートが使用中です。下のポートを変更するか、このポートを使用しているプログラムを終了してから再試行してください"},status:{running:"実行中",stopped:"停止中",starting:"起動中...",portInUse:"ポート使用中",error:"起動失敗"},port:{title:"ポート設定",label:"リッスンポート",desc:"API サービスのローカルポート番号(1024-65535)",edit:"編集",save:"保存",cancel:"キャンセル"},token:{title:"アクセストークン",label:"Bearer Token",desc:"すべての API リクエストは Authorization ヘッダーにこのトークンを含める必要があります",noToken:"トークンが未生成です。まずサービスを有効にしてください",regenerate:"再生成"},dataSources:{title:"データソース",desc:"外部データソースの URL を設定すると、ChatLab が指定間隔で自動的にチャットデータを取得・インポートします。",empty:"データソースなし",disabled:"一時停止中",every:"",minutes:"分ごと",lastSync:"最終同期",syncing:"同期中",messages:"件",addBtn:"データソースを追加",form:{modalTitle:"データソースを追加",name:"名前",namePlaceholder:"例:マイチャットサーバー",token:"アクセストークン",tokenPlaceholder:"リモート API の Bearer Token",interval:"取得間隔(分)",pullLimit:"1回の取得メッセージ数",pullLimitPlaceholder:"デフォルト 1000"},discovery:{baseUrl:"サーバーアドレス",baseUrlPlaceholder:"例:http://127.0.0.1:2333/api/v1",found:"{count} 件のセッションが見つかりました",search:"検索",searchPlaceholder:"セッション名で検索",selectAll:"すべて選択",deselectAll:"選択解除",selectByType:"セッションタイプ",typeAll:"すべて",typePrivate:"個人チャット",typeGroup:"グループチャット",loadMore:"さらに読み込む",subscribe:"{count} 件を購読",messages:"件のメッセージ",error:"リモートサーバーへの接続に失敗しました",connectionCheckFailed:"リモートサーバーに接続できません。URL とトークンを確認してください。"},noSessions:"インポートセッションがありません。上の「サブスクリプション管理」から追加してください",edit:{title:"設定を変更",save:"保存",cancel:"キャンセル",editSource:"設定を変更",manageSessions:"サブスクリプション管理",subscribed:"購読中"},deleteConfirm:{title:"データソースを削除",message:"データソース「{name}」を削除してもよろしいですか?このデータソース下のすべてのインポート設定が削除されます。既にインポート済みのローカル会話は削除されません。"},deleteSessionConfirm:{title:"サブスクリプションを削除",message:"「{name}」を削除してもよろしいですか?",keepData:"サブスクリプションのみ削除",deleteData:"インポートしたチャットも削除"}},usage:{title:"使用ガイド",desc:"サービスを有効にすると、外部ツールが API 経由でデータを照会したり、ChatLab にチャット記録をプッシュしたりできます。すべてのリクエストに Bearer Token 認証が必要です。",authHint:"ヘッダー例:",docLink:"API ドキュメントを見る"}},Gx={overview:{title:"MCP 概要",description:"MCP により、AI アシスタントがチャット記録を直接クエリできます。セッション検出、キーワード検索、メンバー統計、時間分布などをサポートしています。",toolCount:"{count} 個のツール",resourceCount:"{count} 個のリソース",installHint:"chatlab-cli をインストール後、AI クライアントに以下の設定を追加してください:"},clients:{other:"その他"},config:{title:"クライアント設定",clientLabel:"MCP クライアント",copy:"コピー",copied:"コピー済み",claudeHint:"この設定を ClaudeCode の MCP 設定に追加してください。",codexHint:"この TOML 設定を ~/.codex/config.toml ファイルに追加してください。",openclawHint:"この設定をプロジェクトの openclaw.json ファイルに追加してください。",otherHint:"この JSON 設定を MCP クライアントの設定ファイルに追加してください。"},tips:{title:"ヒント",dataDir:"MCP サーバーは ~/.chatlab/ ディレクトリのチャットデータを読み取り、デスクトップアプリと同じデータを共有します。",readOnly:"すべての操作は読み取り専用で、チャット記録は変更されません。",nodeRequired:"npx および CLI モードには Node.js 20 以上が必要です。",docs:"詳細なドキュメントは docs.chatlab.fun をご覧ください。"}},Xx={title:Fx,tabs:Nx,basic:Ux,defaultModel:Ox,aiConfig:Vx,storage:Hx,ai:zx,aiPrompt:Bx,about:Wx,aiPreprocess:jx,desensitize:qx,api:Kx,mcp:Gx},Yx="新しいチャットの記憶を探索する",Qx={file:"ファイルインポート",api:"自動同期",push:"APIプッシュ",apiDescription:"外部プラットフォームのデータソースを設定し、チャット履歴をChatLabへ定期的に自動同期します。",apiButton:"自動同期を設定する",pushDescription:"ローカルAPIサーバーを起動し、サードパーティのツール・プラグイン・スクリプトからChatLabへチャット履歴をプッシュできます。",pushButton:"APIサーバーを設定する"},Jx={viewExample:"デモを試す",downloading:"デモデータをダウンロード中...",importing:"デモデータをインポート中...",failed:"デモデータの読み込みに失敗しました。ネットワーク接続を確認してから再試行してください。"},Zx={title:"データベースのアップグレードが必要です",description:"新機能をサポートするため、{count} 件のデータベースをアップグレードする必要があります。",note:"アップグレードは通常数秒で完了し、データは失われません。",upgradeContent:"今回のアップグレード内容:",upgradeNow:"今すぐアップグレード",upgrading:"アップグレード中...",failed:"移行に失敗しました",partialFailed:"一部のデータベースのアップグレードに失敗しました",errorHint:"これは通常、データベースファイルの破損が原因です。サイドバーで失敗したセッションを削除し、再度インポートすることをお勧めします。",close:"閉じる",retry:"リトライ"},ek={title:"インポートするチャットを選択",scanning:"チャットリストをスキャン中...",scanFailed:"スキャンに失敗しました",retry:"リトライ",selectAll:"すべて選択",chatCount:"全 {count} 件のチャット",selected:"{count} 件を選択中",messageCount:"{count} 件のメッセージ",import:"インポート ({count})",noChats:"チャットが見つかりません"},tk={title:"チャット形式を選択",hint:"ファイル形式を自動検出できませんでした。対応するチャット形式を手動で選択してください。",manualSelect:"形式を手動で選択",confirm:"この形式でインポート"},sk={export:"初心者ガイド"},ak={website:"公式サイト",terms:"利用規約"},nk={title:"バージョン履歴",subtitle:"すべてのバージョン更新内容を確認",latest:"最新バージョン",current:"現在のバージョン",total:"全 {count} バージョン",close:"閉じる",loadError:"バージョン履歴の読み込みに失敗しました",retry:"リトライ",types:{feat:"新機能",fix:"バグ修正",refactor:"リファクタリング",docs:"ドキュメント更新",chore:"その他の改善",style:"スタイル改善",ci:"CI/ビルド"}},ok={tagline:Yx,tabs:Qx,import:{dropHint:"マウスを離してファイルをインポート",clickHint:"クリックして選択、またはチャット記録をドラッグ&ドロップでインポート",multipleHint:"複数ファイルの同時選択・ドラッグに対応しています",selectFiles:"チャット記録ファイルを選択",selectFolder:"エクスポートフォルダを選択",importFolder:"フォルダをインポート",chatRecords:"チャット記録",allFiles:"すべてのファイル",progress:{detecting:"フォーマットを検出中...",reading:"ファイルを読み込み中...",parsing:"メッセージを解析中...",saving:"データベースに書き込み中...",done:"インポート完了",error:"インポート中断"},processed:"{count} 件のメッセージを処理しました",viewLog:"インポートログを表示",cannotReadPath:"ファイルパスを読み取れません",errors:{no_file_selected:"ファイルが選択されていません",import_failed:"インポートに失敗しました",unrecognized_format:"認識できないファイル形式です",no_messages:"メッセージを検出できませんでした。ファイル形式が正しいか確認してください",actionHint:"下記の手動マッチングまたはログの確認をお試しください:"},diagnostics:{format:"検出フォーマット:",received:"受信メッセージ:",written:" / 書き込み:",skipped:" / スキップ:"},batch:{importing:"一括インポート中",progressCount:"{current} / {total} 件目",cancel:"インポートをキャンセル",waiting:"待機中",skipped:"スキップ済み",success:"インポート成功",completed:"一括インポート完了",summary:"成功 {success} 件、失敗 {failed} 件、スキップ {cancelled} 件",view:"表示"},options:{mergeImport:"結合インポート",mergeImportHint:"チェックすると、複数ファイルが1つのチャット記録に結合されます"},merge:{importing:"結合中",parsing:"ファイルを解析中...",merging:"メッセージを結合中...",completed:"結合完了",completedHint:"{count} 件のファイルを結合しました",messageCount:"{count} 件のメッセージ",failed:"結合に失敗しました"}},demo:Jx,migration:Zx,chatSelector:ek,formatSelector:tk,quickStart:sk,footer:ak,changelog:nk},rk={loading:"分析データを読み込み中...",loadError:"セッションデータを読み込めません"},ik={loading:"分析データを読み込み中...",loadError:"セッションデータを読み込めません"},lk={overview:"概要",view:"インサイト",aiChat:"AIチャット",memory:"メモリー",lab:"ラボ",debug:"Debug"},ck={sqlTables:"SQLテーブル",basicTools:"基本ツール",tableBrowser:{chatDb:"チャット DB",aiDb:"AI会話 DB",rowCount:"{count} 行",page:"{current} / {total} ページ",refresh:"更新",noData:"データなし",editRow:"編集",deleteRow:"行を削除",confirmDelete:"この行を削除してもよろしいですか?",allConversations:"すべての会話",copyCell:"選択項目をコピー",copyRow:"行をコピー (JSON)",clearDebugContext:"デバッグコンテキストをクリア",confirmClearDebug:"すべてのメッセージの debug_context を削除しますか?この操作は取り消せません。"}},dk={comingSoon:"メモリー機能は近日公開予定です。お楽しみに"},uk={viewChatRecord:"チャット履歴を見る",sessionIndex:"セッション索引",semanticIndex:"セマンティックインデックス",incrementalImport:"追加インポート",memberManagement:"メンバー管理",more:"その他"},mk={title:"チャット記録を追加",description:"「{name}」に追加するチャット履歴ファイルを選択してください。重複は自動で除外されます。",dropHint:"クリックして選択、またはファイルをここにドラッグ",analyzing:"ファイルを分析中...",totalInFile:"ファイル内のメッセージ数",newMessages:"新規メッセージ",duplicates:"重複メッセージ",noNewMessages:"新しいメッセージはありません。すべて取り込み済みです",importing:"インポート中...",import:"{count} 件を取り込む",success:"インポート成功",successDetail:"{count} 件の新しいメッセージを追加しました",failed:"インポートに失敗しました"},gk={view:{typeAnalysis:"タイプ",timeAnalysis:"時間",topic:"トピック",groupRelationships:"グループ関係",ranking:"ランキング",relationship:"関係",languagePreference:"言語傾向"},quotes:{hotRepeat:"盛り上がった復唱",catchphrase:"口癖",keywordAnalysis:"キーワード分析"},groupRelationships:{mentionGraph:"{'@'} 関係図",mentionRanking:"{'@'} ランキング",proximity:"発言の近接度"},member:{nicknameHistory:"ニックネーム変更履歴"}},pk={messageTypeDistribution:"メッセージタイプ分布",memberDistribution:"メンバー別発言割合",others:"その他",memberComparison:"双方のメッセージ割合",statCards:{dailyAvgMessages:"1日あたりのメッセージ",messagesCount:"{count} 件",daysCount:"合計 {count} 日間",imageMessages:"画像メッセージ",imagesCount:"{count} 枚",peakHour:"最も活発な時間帯:",mostActiveWeekday:"最も活発な曜日",messagesOnDay:"{count} 件のメッセージ",weekendActivity:"週末の活発度",weekendRatio:"週末メッセージの割合",mostActiveDate:"最も活発な日",consecutiveStreak:"連続日数",daysStreak:"{count} 日間",longestStreak:"最長連続アクティブ",activityRate:"アクティブ率",activeDaysRatio:"メッセージのある日の割合",lateNightChat:"深夜チャット",lateNightRatio:"全メッセージの {ratio}%"},dailyTrend:{title:"日別メッセージトレンド"},identity:{privateChat:"プライベートチャット",groupChat:"グループチャット",totalMessages:"メッセージ総数",durationDays:"期間日数",activeDays:"アクティブ日数",dailyAvgMessages:"日平均メッセージ"},tools:"よく使うツール"},fk={miniMode:"ミニモード",exitMini:"ミニモードを終了"},hk={title:"チャット記録をエクスポート",selectOutputDir:"保存先を選択",format:"形式"},vk={timeRange:"期間",allTime:"すべて",today:"今日",lastWeek:"過去7日間",lastMonth:"過去1ヶ月",last3Months:"過去3ヶ月",lastYear:"過去1年",customTime:"カスタム",exportSuccess:"エクスポートに成功しました",exportFailed:"エクスポートに失敗しました",exportPreparing:"エクスポート準備中..."},yk={groupChat:rk,privateChat:ik,tabs:lk,debug:ck,memory:dk,tooltip:uk,incremental:mk,subTabs:gk,overview:pk,toolsPanel:fk,messageExport:hk,filter:vk},bk={searchPlaceholder:"チャット名を検索",searchResult:"{count} / {total} 件を検出",noSearchResult:"一致するチャット履歴が見つかりません",selectAll:"すべて選択",shiftClickHint:"Shiftキーを押しながらクリックで範囲選択できます",selected:"{count} 件を選択中",empty:"チャット履歴がありません",delete:"選択した項目を削除",confirmTitle:"削除の確認",confirmMessage:"選択した {count} 件のチャット履歴を削除しますか?この操作は取り消せません。",deleting:"削除中...",columns:{name:"名前",platform:"プラットフォーム",messages:"メッセージ数",summaries:"AI要約",aiChats:"AI チャット",importedAt:"インポート日時"},clickToEdit:"クリックして名前を編集",merge:"選択項目を結合",mergeHint:"結合するには同じチャット種別の履歴を 2 件以上選択してください",mergeConfirmTitle:"チャット履歴を結合",mergeConfirmMessage:"選択した {count} 件のチャット履歴を結合し、新しい統合履歴を作成します。",deleteOriginalsLabel:"結合後に元のチャット履歴を削除する",mergeRiskWarning:"重要な警告:削除は元に戻せず、プラットフォーム間の文脈差により意味が混在する可能性があります。続行前に元データをバックアップしてください。",mergeSteps:{exporting:"チャット履歴をエクスポート中...",parsing:"ファイルを解析中...",checking:"競合を検出中...",merging:"データを結合中...",cleaning:"一時ファイルを削除中..."},mergeSuccess:"{count} 件のチャット履歴を結合しました",mergeError:"結合に失敗しました:{error}",mergedSuffix:"結合"},_k={batchManage:bk},xk={name:"DeepSeek"},kk={name:"通義千問"},wk={name:"Gemini"},Sk={name:"MiniMax"},Ck={name:"GLM"},Ik={name:"Kimi"},Mk={name:"豆包"},Tk={name:"SiliconFlow"},Ak={name:"Groq"},$k={name:"OpenRouter"},Pk={name:"xAI"},Dk={deepseek:xk,qwen:kk,gemini:wk,minimax:Sk,glm:Ck,kimi:Ik,doubao:Mk,siliconflow:Tk,groq:Ak,openrouter:$k,xai:Pk,"openai-compatible":{name:"サードパーティ"}},Lk={chatExplorer:"対話で探索",sqlLab:"SQL ラボ"},Rk={scrollToBottom:"下へ移動",input:{placeholderWithSlash:"質問を入力、または / でスキル、{'@'} でメンバーを選択...",placeholderWithActiveSkill:"/{name} を選択済みです。具体的な質問を入力してください...",slashHint:"/ でスキルを選択",useSkill:"スキルを選ぶ",mentionHint:"{'@'} でメンバーを選択",mentionEmpty:"一致するメンバーがいません",mentionEmptyHint:"ニックネーム、別名、アカウントで検索できます",slashEmpty:"一致するスキルがありません",slashEmptyHint:"スキル管理を開いて内蔵スキルを読み込むか、カスタムスキルを作成してください",manageSkills:"スキルを管理",previewTagsLabel:"タグ",previewToolsLabel:"ツール",previewUnavailable:"プレビューできるスキルプロンプトがありません",quickAsk:"クイック質問",editQuickAsk:"クイック質問を編集",send:"送信",needMoreThanSkill:"スキルを選んだだけでは送信できません。具体的な質問を入力してください。",needQuestion:"質問を入力してから送信してください"},fork:{success:"会話をフォークしました",failed:"会話のフォークに失敗しました"},backgroundTask:{runningShort:"進行中",runningTitle:"AI がバックグラウンドで推論中です",runningDescription:"前の質問がまだ処理中です。完了を待つか、先に停止してください。",blockedAction:"現在の回答はまだ生成中です。完了を待つか、手動で停止してください。",return:"戻って確認"},message:{copy:{tooltip:"Markdown をコピー",success:"Markdown をクリップボードにコピーしました",failed:"Markdown のコピーに失敗しました"},process:{label:"実行過程",processing:"処理中",processed:"処理済み"},toolResult:{view:"結果を表示",title:"AI に送信されたツール結果",copy:"結果をコピー",copySuccess:"ツール結果をコピーしました",copyFailed:"ツール結果のコピーに失敗しました",displayTruncated:"この履歴結果は切り詰められた版のみ保存されています。元のターンでは AI がより多くの内容を見ていた可能性があります。"},edit:{tooltip:"編集して再生成",submit:"送信",overwriteSubsequent:"以降のすべての会話を上書き"},fork:{tooltip:"ここから会話をフォーク"},chart:{expand:"大きなチャートを開く",empty:"データがありません",rows:"{count} 行のデータ",truncated:"切り捨て済み"},generating:"回答を作成中...",summary:{label:"コンテキスト要約",info:"以前の会話がコンテキスト節約のため要約に圧縮されました"},plan:{label:"分析計画",evidenceNeeded:"必要な証拠",suggestedTools:"推奨ツール",successCriteria:"成功基準",noTools:"なし"},think:{labels:{think:"思考",analysis:"分析",reasoning:"推論",reflection:"振り返り",planValidation:"計画を生成",other:"思考({tag})"},loading:"思考中...",duration:"{seconds}秒"},toolParams:{keywords:"キーワード",time:"時間",getMessages:"{count} 件のメッセージを取得",limit:"{count} 件に制限",contextWithMessages:"{msgCount} 件のメッセージの前後各 {contextSize} 件のコンテキスト",context:"前後各 {size} 件のコンテキスト",topMembers:"上位 {count} 名のメンバー",search:"検索",getMemberList:"メンバー一覧を取得",memberId:"メンバーID",timeStats:{hourly:"時間別",weekday:"曜日別",daily:"日別"}}},thinking:{processingResult:"結果を整理中",called:"実行したツール:",analyzing:"問題を分析中...",compressing:"コンテキストを圧縮中..."},statusBar:{model:{notConfigured:"AI 未設定"},messageLimit:{label:"メッセージ上限:",title:"1回の送信で含む最大メッセージ数。クリックして設定"},agent:{label:"Agent",contextTokens:"コンテキスト",phase:{compressing:"圧縮中",preparing:"準備中",thinking:"思考中",tool_running:"ツール実行中",responding:"応答中",completed:"完了",aborted:"停止",error:"エラー"},phaseShort:{compressing:"圧縮",preparing:"準備",thinking:"思考",tool_running:"ツール",responding:"生成",completed:"完了",aborted:"停止",error:"エラー"}},thinking:{title:"思考強度",tooltip:"モデルの思考強度を設定",level:{default:"デフォルト",off:"オフ",minimal:"極小",low:"低",medium:"中",high:"高",xhigh:"最大",auto:"自動"}},tokenUsageTitle:"累計 Token 使用量",cacheHit:"キャッシュヒット",export:{label:"エクスポート",title:"現在のチャットをエクスポート"},log:{label:"ログ",title:"現在の AI ログファイルを開く",openFailed:"ログを開けませんでした",openFailedDesc:"しばらくしてから再度お試しください"}},conversation:{newChat:"新規チャット",newConversation:"新規チャット",empty:"履歴はありません",startNew:"新しいチャットを始める",titlePlaceholder:"タイトルを入力...",group:{last7Days:"過去 7 日間",last30Days:"過去 30 日間"},rename:"名前を変更",copyId:"ID をコピー",delete:"削除",export:{createdAt:"作成日時",user:"ユーザー",assistant:"AI アシスタント",noMessages:"会話にメッセージがありません"}},error:{title:"処理に失敗しました",detail:"エラー詳細",viewDetail:"詳細を表示",requestUrl:"リクエストURL",statusCode:"ステータスコード",responseBody:"レスポンスボディ",responseHeaders:"レスポンスヘッダー",requestBody:"リクエストボディ",name:"エラー名",message:"エラーメッセージ",stack:"スタックトレース",cause:"エラー原因",provider:"プロバイダー",copyAll:"すべてコピー",copied:"クリップボードにコピーしました",unknown:"不明なエラー"},dataSource:{title:"データソース",keywords:"キーワード:",empty:"データがありません",emptyHint:"質問を送信すると、関連する記録がここに表示されます",totalRecords:"全 {count} 件の記録",loadMore:"さらに読み込む"},evidence:{title:"根拠",query:"質問",criteria:"判定基準",empty:"明確な根拠は見つかりませんでした",totalSources:"全 {count} 件のソース",mode:{auto:"自動",hybrid:"セマンティック + キーワード",semantic:"セマンティック検索",keyword:"キーワード検索"},group:{included:"根拠に算入",excluded:"除外",uncertain:"不確実"},warning:{criteria_missing:"判定基準が未指定のため、グループ分けは保守的です",keywords_missing_for_hybrid:"キーワードが未指定のため、セマンティック検索のみに切り替えました",keywords_required_for_keyword_mode:"キーワードモードにはキーワードが必要です",semantic_unavailable:"セマンティックインデックスが利用できないため、キーワード検索を使用しました",keyword_unavailable:"キーワード検索が利用できません",semantic_partial:"セマンティック検索の結果が不完全な可能性があります"}}},Ek={editor:{errorEmptySQL:"SQL 文を入力してください",placeholder:"SQL クエリを入力...",tip:"ヒント:左側の列名をダブルクリックすると SQL に挿入できます",history:"履歴",generateAndRun:"生成して実行",switchToSQLMode:"SQL 入力モードに切り替え",switchToPromptMode:"Prompt 入力モードに切り替え",run:"実行"},schema:{tables:"テーブル",doubleClickToInsert:"ダブルクリックで SQL に挿入",primaryKey:"主キー"},result:{queryError:"クエリエラー",rows:"{count} 行",readableTime:"タイムスタンプを日付に変換",viewChat:"チャット履歴を見る",summarize:"要約する",pageSize:"表示件数",emptyResult:"クエリ結果が空です",initialState:"SQL 文を入力して実行すると結果が表示されます",initialHint:"読み取り専用クエリ(SELECT / WITH)のみ対応しています。速度向上のため LIMIT の指定をおすすめします",summaryTitle:"AI 結果サマリー",analyzing:"AI が結果を分析中...",errorSummary:"要約に失敗しました"},generate:{placeholder:"例:発言数が最も多い上位10名のメンバーを検索、1日あたりのメッセージ数を集計、「旅行」というキーワードを含むメッセージを検索...",errorEmptyPrompt:"クエリ要件を入力してください",errorGenerate:"AI 生成に失敗しました",errorTokenLimit:"モデル出力がトークン上限に達し、完全な応答を生成できませんでした(思考にトークンを消費しすぎた可能性があります)",aiOutput:"AI 出力",thinking:"思考中…",thinkingProcess:"思考プロセス",waitingAI:"AI の応答待ち...",defaultPromptPrivate:"この個人チャットの直近1年間について、2人それぞれのメッセージ総数・割合・アクティブ日数・アクティブ日あたり平均件数・初回発言時刻・最終発言時刻を集計し、メッセージ総数の降順で表示してください。",defaultPromptGroup:"このグループチャットの直近1年間について、各メンバーのメッセージ総数・割合・アクティブ日数・アクティブ日あたり平均件数・テキスト比率を集計し、表示名付きでメッセージ総数の降順上位20名を返してください。"},history:{title:"AI 生成履歴",execute:"実行",empty:"履歴はありません",justNow:"たった今",minutesAgo:"{count} 分前",hoursAgo:"{count} 時間前",today:"今日"}},Fk={selector:{title:"アシスタントを選んでチャットを始めましょう",heroTitlePrefix:"",heroTitleSuffix:"と話しかける",subtitle:"各アシスタントは得意分野が異なります。目的に合うものを選んでください",noAssistants:"現在のシーンで利用可能なアシスタントはありません",manage:"アシスタント管理",addNew:"アシスタントを追加"},config:{viewTitle:"設定を確認",createTitle:"アシスタントを作成",editTitle:"アシスタント設定",betaWarning:"現在はベータ版のため、設定仕様が今後変わる可能性があります。プロンプトや関連設定は控えを残してください。",tabs:{basic:"基本設定",tools:"ツール管理"},name:"名前",systemPrompt:"システムプロンプト",chatType:"対応チャットタイプ",chatTypeAll:"すべて",chatTypeGroup:"グループチャット",chatTypePrivate:"個人チャット",locale:"対応言語",localeHint:"未選択なら全言語が対象です",presetQuestions:"プリセット質問",addQuestion:"質問を追加...",coreTools:"コアツール",coreToolsHint:"基本データ取得ツール、常に有効、無効化不可",analysisTools:"分析ツール",analysisToolsHint:"必要に応じて有効化。チェックしたツールのみ AI が利用可能",selectAll:"すべて選択",deselectAll:"すべて解除",resetDefault:"デフォルトに戻す",create:"作成"},market:{title:"アシスタント管理",tabs:{local:"ローカル",market:"マーケット"},localHint:"インポート済みのアシスタントを管理・設定・削除",marketHint:"アシスタントマーケットを閲覧し、インポートして使用・カスタマイズ",default:"デフォルト",reimport:"再インポート",imported:"インポート済み",import:"インポート",importing:"インポート中...",importSuccess:"インポート成功",importFailed:"インポート失敗",viewConfig:"設定を見る",duplicate:"複製",addAssistant:"アシスタントを追加",noLocal:"インポート済みのアシスタントはありません",noCatalog:"利用可能なアシスタントがありません。ネットワーク接続を確認してください",loading:"読み込み中...",loadFailed:"読み込みに失敗しました。ネットワーク接続を確認してください",retry:"再試行"},fallbackName:"アシスタント",duplicateSuffix:"(コピー)",toast:{loadFailed:"読み込みに失敗しました",createSuccess:"作成しました",createFailed:"作成に失敗しました",saveSuccess:"保存しました",saveFailed:"保存に失敗しました",resetSuccess:"デフォルトに戻しました",resetFailed:"リセットに失敗しました",unknownError:"不明なエラー"},builtinToolDesc:{get_chat_overview:"チャット概要情報を取得",search_messages:"チャットメッセージを検索",deep_search_messages:"チャットメッセージを深層検索",get_recent_messages:"最近のメッセージを取得",get_message_context:"メッセージのコンテキストを取得",get_conversation_between:"2人のやり取りを取得",get_members:"メンバー一覧を取得",get_schema:"データベーススキーマを確認",get_member_stats:"メンバー統計を取得",get_member_name_history:"メンバーの名前変更履歴を取得",get_time_stats:"時間統計を取得",get_segment_messages:"セグメントメッセージを取得",get_segment_summaries:"セグメント要約を取得",message_type_breakdown:"メッセージ種別分布",peak_chat_hours_by_member:"メンバー活動時間帯",member_activity_trend:"メンバー活動トレンド",silent_members:"沈黙メンバー検出",reply_interaction_ranking:"返信インタラクションランキング",mutual_interaction_pairs:"相互インタラクションペア",member_message_length_stats:"メッセージ長さ統計",unanswered_messages:"未返信メッセージ",daily_active_members:"日別アクティブ人数推移",conversation_initiator_stats:"話題開始者統計",activity_heatmap:"活性度ヒートマップ",response_time_analysis:"応答時間分析",keyword_frequency:"高頻度キーワード統計",render_chart:"動的チャート生成",semantic_search_current_chat:"チャット履歴を検索"}},Nk={market:{title:"スキル管理",tabs:{local:"ローカル",market:"マーケット"},localHint:"インポート済みのスキルを管理・設定・削除",marketHint:"スキルマーケットを閲覧し、インポートして使用・カスタマイズ",reimport:"再インポート",imported:"インポート済み",import:"インポート",importing:"インポート中...",importSuccess:"インポート成功",importFailed:"インポート失敗",noLocal:"インポート済みのスキルはありません",noCatalog:"利用可能なスキルがありません。ネットワーク接続を確認してください",addSkill:"カスタムスキルを作成",loading:"読み込み中...",loadFailed:"読み込みに失敗しました。ネットワーク接続を確認してください",retry:"再試行"},active:{label:"手動呼び出しスキル:{name}"}},Uk={toolTest:{coreTools:"コアツール",analysisTools:"分析ツール",parameters:"パラメータ",arrayPlaceholder:"カンマで区切って入力",execute:"実行",cancel:"キャンセル",elapsed:"所要時間 {ms}ms",result:"実行結果",truncated:"結果が大きすぎるため、切り捨てて表示しています。limit パラメータを小さくしてください。"}},Ok={tab:Lk,chat:Rk,sqlLab:Ek,assistant:Fk,skill:Nk,lab:Uk},Vk={loading:"単語頻度を分析中...",stats:{wordsLabel:"総単語数",clickHint:"ヒント:ワードクラウドをクリックすると関連メッセージを表示できます"},config:{maxWords:"表示単語数",sizeScale:"フォントサイズ",userFilter:"ユーザーフィルター",posFilter:"品詞フィルター",enableStopwords:"ストップワードを除外",dict:"辞書"},size:{small:"小",medium:"中",large:"大",xlarge:"特大"},posFilter:{all:"すべての品詞",meaningful:"主要品詞",custom:"カスタム",customHint:"品詞を指定",selectMeaningful:"主要品詞",selectAll:"すべて選択",clearAll:"クリア"},empty:{title:"ワードクラウドデータがありません",description:"現在の絞り込み条件では、ワードクラウドを作れるほどテキストメッセージがありません"},dict:{zhCN:"簡体字中国語",zhTW:"繁体字中国語",download:"辞書をダウンロード","download_zh-CN":"簡体字辞書をダウンロード","download_zh-TW":"繁体字辞書をダウンロード",needDownload:"ワードクラウドは内蔵トークナイザーの結果で表示されています。中国語辞書をダウンロードすると分かち書きの精度が向上します。",downloadHint:"~8MB",downloadSuccess:"辞書のダウンロードが完了しました",downloadFailed:"辞書のダウンロードに失敗しました",promptTitle:"繁体字中国語辞書",promptDescription:"繁体字中国語をご使用中です。ワードクラウドの精度を上げるため、繁体字辞書のダウンロードをお勧めします。今すぐダウンロードしますか?(約8MB)",promptDownload:"今すぐダウンロード",promptLater:"後で"}},Hk={title:"🔍 キーワードランキング",description:"グループチャットのキーワード使用ランキングを分析します。カスタムランキングも作成できます",countTemplate:"全 {count} 名のメンバー",templateLabel:"テンプレート:",newTemplate:"+ 新規作成",searchPlaceholder:"入力して検索",clear:"クリア",templateHint:"* テンプレートを右クリックで編集・削除できます",keyword:"キーワード",ranking:"ランキング",multiColorMode:"マルチカラーモード",times:"{count}回",timesWithPercent:"回 ({percent}%)",loading:"データを分析中...",empty:"データがありません。キーワードを追加するかテンプレートを切り替えてください",contextMenu:{edit:"編集",delete:"削除"},modal:{createTitle:"テンプレートを作成",editTitle:"テンプレートを編集",templateName:"テンプレート名",templateNamePlaceholder:"例:ポジティブ",keywords:"キーワード",keywordPlaceholder:"入力して Enter で追加",update:"更新"},templates:{laugh:{name:"笑い度",keywords:"笑,ウケる,草,www,lol,ワロタ,233",description:"グループ内の笑い指数を集計"},sad:{name:"落ち込み度",keywords:"辛い,しんどい,泣いた,無理,きつい,疲れた",description:"グループ内のネガティブ感情を集計"},praise:{name:"褒め上手",keywords:"すごい,さすが,天才,神,やばい,尊い,最高",description:"グループで最も褒め上手なメンバーを集計"},slacker:{name:"サボり",keywords:"サボり,帰りたい,お腹空いた,眠い,仕事したくない,定時",description:"グループで最も退勤を待ち望んでいるメンバーを集計"},gossip:{name:"ゴシップ好き",keywords:"マジで,詳しく,本当に,えぇ,やばい,ありえない",description:"グループで最もゴシップ好きなメンバーを集計"},polite:{name:"礼儀正しさ",keywords:"ありがとう,すみません,了解,お疲れ様,よろしく,恐れ入ります",description:"グループで最も礼儀正しいメンバーを集計"},curious:{name:"質問好き",keywords:"なぜ,なんで,どうやって,わからない,教えて",description:"グループで最も質問が多いメンバーを集計"}}},zk={title:"🔥 盛り上がった復唱",loading:"リピートデータを読み込み中...",description:"1 回の復唱で最も多くの人が参加したフレーズ",countTemplate:"全 {count} 件の復唱",people:"{count}人",times:"{count} 回",colon:":",viewChat:"チャット履歴を見る",empty:"リピートデータがありません"},Bk={heroPrefix:"",heroMiddle:"件のメッセージを分析し、",heroMiddleSecond:"その結果、",heroSuffix:"個のユニークな単語が見つかりました",topTopicsPrefix:"よく話すトピック:",hotTopic:"注目トピック",hotTopicDesc:"{count} 回出現",richness:"語彙の豊かさ",richnessValue:"{value}%",richnessDesc:"ユニーク {unique} / 合計 {total}",chatStyle:"チャットスタイル",styleEncyclopedia:"百科事典タイプ",styleEncyclopediaDesc:"名詞が多く、人・場所・物の話題が中心",styleAction:"アクション派",styleActionDesc:"動詞が多く、行動や計画の話題が中心",styleExpressive:"表現豊かタイプ",styleExpressiveDesc:"形容詞が多く、感情表現が豊か",styleBalanced:"バランス型",styleBalancedDesc:"多様なトピックでバランスの取れた会話",expressionStyle:"表現スタイル",expressionCasual:"カジュアル",expressionCasualDesc:"短い言葉でリラックスした表現",expressionFormal:"フォーマル",expressionFormalDesc:"丁寧な言葉遣いで正確な表現",expressionMixed:"ミックス",expressionMixedDesc:"カジュアルとフォーマルの混合",watermark:"トピックプロフィール",sharedTopics:"共通のトピック"},Wk={loading:"口癖データを分析中...",times:"{count}回",empty:{title:"口癖データがありません"},stats:{clickHint:"ヒント:クリックすると関連メッセージを表示できます"},viewMode:{list:"リスト",wordcloud:"ワードクラウド"},topN:"表示数"},jk={loading:"言語傾向を分析中...",empty:"言語分析に十分なテキストメッセージがありません",card:{diversityTitle:"語彙の深さ",diversityDesc:"ユニーク単語の割合",styleTitle:"チャット気質",styleDesc:"品詞分布に基づく表現スタイル",punctTitle:"句読点パーソナリティ",punctDesc:"最も使われる句読点スタイル",watermark:"言語傾向 · Language Preference",radarFactual:"事実性",radarActive:"行動力",radarDescriptive:"描写力",radarAffable:"親和力",radarIntense:"強調度",radarNoun:"名詞",radarVerb:"動詞",radarAdj:"形容詞",radarModal:"終助詞",radarAdv:"副詞"},catchphrasePK:{title:"口癖バトル",sharedCount:"{count} 個の共通口癖",hint:"クリックで関連メッセージを表示。ピンク枠は共通の口癖です。"},pos:{title:"品詞ポートレート",styleEncyclopedia:"百科事典タイプ",styleAction:"行動派",styleExpressive:"感性派",styleBalanced:"バランス型"},modal:{title:"終助詞プロフィール",toneSoft:"やわらかい",toneCurious:"好奇心旺盛",toneCasual:"カジュアル",toneCalm:"落ち着き",toneMixed:"多彩なスタイル",empty:"終助詞データがありません"},punctuation:{title:"句読点パーソナリティ",none:"句読点なし",personalityDeep:"深い思考型",personalityPassionate:"情熱的",personalityCurious:"好奇心型",personalityCheerful:"明るい",personalityFreeflow:"自由型",personalityPrecise:"几帳面",empty:"句読点データがありません"}},qk={wordcloud:Vk,keywords:Hk,hotRepeat:zk,topicProfile:Bk,catchphrase:Wk,languagePreference:jk},Kk={title:"あなたはどなたですか?",subtitle:"このチャットでのあなたの身元を選択してください",description:"設定するとあなたのメッセージがチャット履歴ビューアの右側に表示され、AI との会話でもあなた本人として認識され、分析がより正確になります。同じプラットフォームの他のチャットにも自動的に適用されます。",searchPlaceholder:"メンバーを検索",noMatch:"一致するメンバーが見つかりません",empty:"メンバーデータがありません",later:"後で",dontRemind:"このチャットでは再通知しない",save:"保存",clear:"現在の選択をクリア",saved:"あなたの身元を設定しました",appliedToOthers:"同じプラットフォームの {count} 件のチャットに自動適用しました",saveFailed:"身元の設定に失敗しました",currentOwner:"私は:{name}",choose:"自分を選択",change:"変更",helper:"設定すると AI があなたを認識し、分析がより正確になります"},Gk={title:"メンバー管理",description:"全 {count} 名のメンバー。別名の追加やメンバーの削除ができます",searchPlaceholder:"グループニックネーム、アカウント名、ID、または別名で検索",noMatch:"一致するメンバーが見つかりません",empty:"メンバーデータがありません",table:{accountName:"アカウント名",groupNickname:"グループニックネーム",messageCount:"メッセージ数",customAlias:"カスタム別名",actions:"操作"},aliasPlaceholder:"入力して Enter で追加",delete:"削除",mergeSelected:"選択を結合",mergeSelectedCount:"{count} 名を選択中",pagination:"{start} - {end} 件表示、全 {total} 名のメンバー",tip:"ヒント:別名を追加すると、チャット履歴の相手をより正確に識別できます。別名は検索や AI 分析で使用されます。",mergeModal:{title:"メンバーを結合しますか?",content:"{source}({sourceCount} 件)を {target}({targetCount} 件)へ結合します。結合後の名前は、メッセージ数が多い側を優先して保持します。",hint:"この操作は元に戻せません。結合される側のメッセージはすべて保持側に移動します。",cancel:"キャンセル",confirm:"結合を確認"},modal:{title:"メンバーを削除しますか?",content:"メンバー {name} とその {count} 件のメッセージを削除します。この操作は元に戻せません。",cancel:"キャンセル",confirm:"削除を確認"}},Xk={note:"備考:QQ の旧バージョンクライアントはチャット履歴を txt 形式でエクスポートできます。この形式では最も正確なニックネーム変更履歴が取得できます",title:"ニックネーム変更履歴",loading:"読み込み中...",hasChanges:"{count} 名のメンバーがニックネームを変更しました",noChanges:"ニックネームを変更したメンバーはいません",current:"現在",empty:"このグループのすべてのメンバーはニックネームを変更していません",loadingText:"ニックネーム変更履歴を読み込み中..."},Yk={loading:"{'@'} インタラクションデータを分析中...",topMentioners:"📢 最も {'@'} する人",totalMentions:"全 {count} 回の {'@'}",topMentioned:"🎯 最も {'@'} される人",popularMember:"グループの人気者",times:"回",oneWay:{title:"🐕 片思い検出",description:"{count} 組の片思い関係を発見(一方の {'@'} が80%以上を占める)",neverRespond:"返信なし",reverse:"逆方向 {count} 回",ratio:"{value}% 片方向"},twoWay:{title:"💕 両思い検出",description:"{count} 組の頻繁な相互やり取りを発見(互いに {'@'} かつバランス度 ≥30%)",interactions:"回のやり取り",balance:"{value}% バランス"},emptyTitle:"📱 {'@'} インタラクション分析",empty:"{'@'} インタラクションデータがありません",modal:{title:"{name} の {'@'} 関係",topMentioned:"最も {'@'} する相手",topMentioners:"最も {'@'} してくる相手",timesCount:"{count} 回",close:"閉じる"}},Qk={ownerPrompt:Kk,list:Gk,nicknameHistory:Xk,relationships:Yk,private:{title:"会話メンバー",description:"全 {count} 名のメンバー。検索や AI 分析に使用する別名を追加できます",messageCount:"メッセージ数",percentage:"割合 {value}%",customAlias:"カスタム別名",aliasPlaceholder:"入力して Enter で別名を追加",empty:"メンバーデータがありません",tipTitle:"ヒント",tipContent:"別名を追加すると、チャット履歴の相手をより正確に識別できます。別名は検索や AI 分析で使用されます。"}},Jk={title:"チャット履歴ビューア",loadedCount:"{count} 件のメッセージを読み込みました"},Zk={loading:"読み込み中...",noMessages:"メッセージがありません",tryAdjustFilter:"フィルター条件を調整してみてください",loadingMore:"さらに読み込み中...",scrollUpForMore:"↑ 上にスクロールしてさらに読み込む",scrollDownForMore:"↓ 下にスクロールしてさらに読み込む"},ew={messageId:"メッセージ ID",memberNotSupported:"メンバー(未対応)",keywordsPlaceholder:"キーワード(複数はカンマ区切り、Enter で検索)",startDate:"開始日",endDate:"終了日",reset:"リセット",filter:"フィルター"},tw={timeline:"要約",noSessions:"要約がありません",generateSummary:"要約を作成",tooFewMessages:"メッセージが少なすぎます"},sw="要約の生成に失敗しました",aw="不明なエラー",nw={title:"要約をまとめて作成",byRange:"範囲で選択",byTime:"時間で選択",selectRange:"範囲を選択",rangeStart:"最古",rangeInfo:"約",sessionsUnit:"セッション",rangeEnd:"最新",timeRange:"時間範囲を選択",today:"今日",yesterday:"昨日",week:"直近7日間",month:"直近30日間",custom:"カスタム",found:"見つかった",hasSummary:"件は要約済み",tooFewMessages:"件はメッセージ不足",pending:"未生成:",unit:"件",noPending:"生成可能なセッションがありません",noSessions:"この時間範囲にセッションがありません",checking:"確認中...",loading:"読み込み中...",progress:"進捗",session:"セッション",statusSuccess:"成功",statusSkipped:"スキップ",statusFailed:"失敗",success:"成功:",failed:"失敗:",skipped:"スキップ:",start:"生成開始",stop:"停止"},ow={viewContext:"コンテキストを表示",replyTo:"返信"},rw={title:"セッションインデックス",subtitle:"チャット履歴をタイムラインでたどれます",notGenerated:"セッションインデックスが未生成です",notGeneratedHint:"セッションインデックスを生成すると、チャット履歴ビューアーのタイムラインから各セッションにすばやくジャンプできます。",whatIsIt:"セッションインデックスの役割:",benefit1:"メッセージの時間間隔に基づいてセッション境界を自動識別",benefit2:"チャット履歴ビューアーにタイムラインナビゲーションを提供",benefit3:"AI が会話の文脈を理解しやすくなる",generated:"セッションインデックス生成済み",sessionCount:"全 {count} セッションを識別しました",regenerateHint:"セッション間隔のしきい値を調整した場合は、インデックスを再生成できます。",generate:"インデックスを生成",regenerate:"再生成",generating:"生成中...",cancel:"キャンセル"},iw={drawer:Jk,messageList:Zk,filter:ew,timeline:tw,summaryFailed:sw,summaryUnknownError:aw,batchSummary:nw,messageItem:ow,sessionIndex:rw},lw={rankingView:"ランキング表示",memberView:"メンバー表示",matrixView:"マトリクス表示",modelSettings:"モデル設定",lookAhead:"隣接数",lookAheadDesc:"各メッセージの後ろ側で何人分の発言を対象にするか",decaySeconds:"時間減衰(秒)",decaySecondsDesc:"値が大きいほど遠いメッセージの重みが高くなる",applySettings:"設定を適用",noData:"データがありません",selectMember:"メンバーを選択",selectMemberHint:"左側からメンバーを選択してください",msgCount:"発言数",relationCount:"関係数",relationsByIntimacy:"発言近接度ランキング",noRelations:"関係データがありません",intimacy:"近接度",interactionRanking:"やり取りランキング",score:"近接度",coOccurrence:"共起",times:"回",totalMembers:"グループメンバー",totalMessages:"メッセージ総数",involvedMembers:"参加メンバー",edgeCount:"関係数"},cw={typeDistribution:"メッセージタイプ分布",hourlyDistribution:"時間帯別分布",weekdayDistribution:"曜日別分布",monthlyDistribution:"月別分布",yearlyDistribution:"年別分布",timeHeatmap:"時間ヒートマップ",heatmapHint:"チャット時間帯の傾向を表示",calendarHeatmap:"メッセージカレンダー",calendarHint:"日別メッセージ分布",calendarTooltipMessages:"メッセージ",lengthDetailTitle:"短文メッセージ分布(1-25文字)",lengthDetailHint:"文字ごとの統計",lengthGroupedTitle:"文字数区間分布",lengthGroupedHint:"5文字ごとにグループ化",noTextMessages:"テキストメッセージがありません",noData:"データがありません",profile:{avgLengthUnit:"{count} 文字/件",textExpression:"テキスト表現力",textExpressionDesc:"最長メッセージ {count} 文字",mediaRichness:"メディアの豊かさ",shortMaster:"短文マスター",shortMasterDesc:"5文字以下 {count} 件",essayLover:"長文好き",essayLoverDesc:"{threshold}文字以上のメッセージ",typeDistribution:"メッセージ種類",heroLine1Prefix:"合計で",heroLine1Suffix:"件のメッセージを交わしました"},typeCard:{watermark:"タイプレポート",nonTextPrefix:"テキスト以外に、",nonTextImage:"画像",nonTextEmoji:"スタンプ",nonTextVoice:"音声",nonTextVideo:"動画",nonTextFile:"ファイル",nonTextLink:"リンク",unitImage:"枚の画像",unitEmoji:"個のスタンプ",unitVoice:"件の音声",unitVideo:"本の動画",unitFile:"個のファイル",unitLink:"個のリンク"},timeCard:{hourlyDistribution:"24h 分布",watermark:"時間レポート",heroDaysIn:"日間で",heroDaysActive:"日アクティブ",heroAvgPrefix:"平均",heroAvgSuffix:"件/日",personalityNightOwl:"夜型",personalityEarlyBird:"朝型",personalityLunchChat:"昼休み派",personalityEveningChat:"夜の語らい",personalityDaytime:"日中活動",personalityEveryday:"毎日活動",personalityWeekend:"週末活躍",personalityWeekday:"平日活躍",peakRecord:"ピーク記録",peakRecordDesc:"1日最多 {count} 件",topHoursLabel:"最もアクティブ",peakWeekdayLabel:"ピーク曜日",weekendRatio:"週末比率",weekendRatioDesc:"週末メッセージ比率"},timeAnalysis:{memberTrendTitle:"メッセージトレンド",memberTrendHint:"メンバー別月次メッセージ推移"},typeAnalysis:{textDepthTitle:"テキスト深度分析",textTotal:"テキスト総数",avgLength:"平均文字数",medianLength:"中央値",maxLength:"最長メッセージ",percentiles:"文字数パーセンタイル",shortMessages:"短文(≤5文字)",essayMessages:"長文(≥30文字)"}},dw={layout:"レイアウト",circular:"サークル",force:"フォースレイアウト",directed:"有向",reset:"リセット",graphHint:"全 {nodes} 名のメンバー、{links} 件のインタラクション",noInteraction:"メンションデータがありません"},uw={empty:{title:"関係データがありません",description:"選択した期間内にセッションが見つかりません。"},monthly:{title:"月別明細",totalSessionsPrefix:"会話",totalSessionsSuffix:"回"},trend:{title:"主動性の推移",hint:"青い線は {name} の月別主動発起率。50% 線がバランス基準です"},hero:{totalSessionsPrefix:"2人の会話は合計",totalSessionsSuffix:"回",initiativePrefix:"",initiativeByPrefix:"の話題の切り出しは",initiativeBySuffix:"から始まりました",initiateTimes:"回発起"},initiator:"話題を始める",closer:"話題を終える",closerTitle:"会話の締め役",closerHint:"話題が終わるときに最後に発言した人を集計します。",noActivity:"今月はやり取りなし",watermarkReport:"関係レポート",monthFormat:"{year}年{month}月",monthShortFormat:"{month}月",iceBreaker:{title:"アイスブレイカー",hint:"24時間以上の沈黙を破って話しかけた回数"},responseLatency:{title:"返信速度",hint:"相手がメッセージを送った後、平均何分で返信するか",seconds:"{n} 秒",minutesSeconds:"{m}分{s}秒",hours:"{n} 時間",hoursMinutes:"{h} 時間 {m} 分"},perseverance:{title:"粘り強さ",hintWithThreshold:"相手が{threshold}以内に返信しないうちに、もう一通メッセージを送った回数",thresholdMinutes:"{n}分"},labels:{wellMatched:"互角",missingYou:"{name} が恋しがっている",monologue:"{name} の独白",peacefulSilence:"穏やかな沈黙",fleetingThoughts:"ふとした思い出"}},mw={title:"タイムライン表示",description:"メッセージの時間分布や活動周期の変化を可視化します"},gw={rankListPro:{fullRanking:"全順位を表示",memberCount:"全 {count} 名のメンバー"},rankList:{unit:"件"},nicknameHistory:{periodToNow:"{start} 〜 現在",periodRange:"{start} 〜 {end}",current:"現在",empty:"ニックネーム履歴がありません"},listPro:{countTemplate:"全 {count} 件",fullRanking:"全順位を表示",empty:"データがありません"}},pw={cluster:lw,message:cw,interaction:dw,relationship:uw,timeline:mw,charts:gw},fw="キーワードフィルター",hw="スキーム一覧",vw="スキーム名",yw="スキーム名を入力",bw="新しいスキーム",_w="新規作成",xw="削除",kw="デフォルトに設定",ww="デフォルト",Sw="キーワードフィルター",Cw="フィルターなし",Iw="スキーム管理",Mw="フィルターワード追加",Tw="入力してEnterで追加、スペースまたはカンマ区切りで一括追加可能",Aw="追加",$w="フィルターワード一覧",Pw="すべてクリア",Dw="スキームがありません。+ をクリックして作成",Lw="フィルターワードがありません。上の入力欄から追加してください",Rw="フィルタースキームを選択または作成",Ew="{count} 個のワードをフィルター中",Fw="閉じる",Nw={title:fw,schemeList:hw,schemeName:vw,schemeNamePlaceholder:yw,defaultSchemeName:bw,createScheme:_w,deleteScheme:xw,setDefault:kw,isDefault:ww,filterScheme:Sw,noFilter:Cw,manage:Iw,addWords:Mw,addWordsPlaceholder:Tw,add:Aw,wordList:$w,clearAll:Pw,emptyScheme:Dw,emptyWords:Lw,selectOrCreate:Rw,activeCount:Ew,close:Fw},Uw={common:bx,layout:Ex,settings:Xx,home:ok,analysis:yk,tools:_k,providers:Dk,ai:Ok,quotes:qk,members:Qk,records:iw,views:pw,wordFilter:Nw},vi=[{code:"en-US",name:"English (US)",nativeName:"English"},{code:"zh-CN",name:"Chinese (Simplified)",nativeName:"简体中文"},{code:"zh-TW",name:"Chinese (Traditional)",nativeName:"繁體中文"},{code:"ja-JP",name:"Japanese",nativeName:"日本語"}];new Set(vi.map(e=>e.code));function Ow(){const e=navigator.language;return e==="zh-TW"||e==="zh-Hant"?"zh-TW":e.startsWith("zh")?"zh-CN":e.startsWith("ja")?"ja-JP":"en-US"}const Vw={"zh-CN":"zh-cn","zh-TW":"zh-tw","en-US":"en","ja-JP":"ja"};function Uo(e){return Vw[e]??"en"}const Hw={groupRanking:["zh-CN","zh-TW"]};function fE(e,t){const s=Hw[e];return!s||s.length===0?!0:s.includes(t)}function zw(){return Ow()}const xa=Td({legacy:!1,locale:zw(),fallbackLocale:"en-US",messages:{"zh-CN":Yf,"en-US":qy,"zh-TW":z_,"ja-JP":Uw}});function Oo(e){xa.global.locale.value=e}function Vo(){return xa.global.locale.value}const yi=2;function Bw(e){return{...e,desensitizeRulesSchemaVersion:yi,desensitizeBuiltinRuleOverrides:{...e.desensitizeBuiltinRuleOverrides??{}},mergeWindowSeconds:e.mergeWindowSeconds??180,desensitizeRules:e.desensitizeRules.filter(t=>!t.builtin).map(t=>({...t,locales:[...t.locales]}))}}const ts=Nt("settings",()=>{const e=I(Vo()),t=I("overview"),s=I(!1);function n(m){s.value=m,window.electron?.ipcRenderer.send("app:setDebugMode",m)}const a=I({dataCleaning:!0,mergeConsecutive:!0,mergeWindowSeconds:180,blacklistKeywords:[],denoise:!0,desensitize:!0,desensitizeRulesSchemaVersion:yi,desensitizeBuiltinRuleOverrides:{},desensitizeRules:[],anonymizeNames:!1});async function i(){const m=JSON.parse(JSON.stringify(a.value.desensitizeRules));a.value.desensitizeRules=await xt().mergeDesensitizeRules(m,e.value,a.value.desensitizeBuiltinRuleOverrides??{})}async function c(m){e.value=m,Oo(m),gt.locale(Uo(m)),window.electron?.ipcRenderer.send("locale:change",m),await i()}async function d(){const m=Vo();e.value!==m&&Oo(e.value),gt.locale(Uo(e.value)),await i(),window.electron?.ipcRenderer.send("app:setDebugMode",s.value)}return{locale:e,setLocale:c,initLocale:d,defaultSessionTab:t,debugMode:s,setDebugMode:n,aiPreprocessConfig:a,ensureDesensitizeRules:i}},{persist:{pick:["debugMode"],storage:localStorage},backendPersist:{pick:["aiPreprocessConfig"],serialize:e=>({aiPreprocessConfig:Bw(e.aiPreprocessConfig)})}});function Pa(e){return e.provider==="openai-compatible"||e.provider.startsWith("custom:")?!e.apiKeySet||(e.baseUrl?.includes("localhost")??!1)?"local":"openai-compat":"preset"}function Ho(e){if(!(e.mode==="edit"&&!!e.existingApiKeySet&&!e.hasNewApiKey&&e.originalProvider===e.currentProvider&&e.originalConnectionMode===e.currentConnectionMode))return!1;if(e.currentConnectionMode==="openai-compat"){const s=n=>n?.trim().replace(/\/+$/,"")||"";return s(e.originalBaseUrl)===s(e.currentBaseUrl)}return!0}const ns="openai-completions",Ww=[{value:"openai-completions",labelKey:"settings.aiConfig.modal.apiFormatOpenAI"},{value:"anthropic-messages",labelKey:"settings.aiConfig.modal.apiFormatAnthropic"},{value:"google-generative-ai",labelKey:"settings.aiConfig.modal.apiFormatGemini"},{value:"openai-responses",labelKey:"settings.aiConfig.modal.apiFormatOpenAIResponses"}],jw=["doubao","siliconflow"];function qw(e){const{t,locale:s}=Fe(),n=ts(),a=Ws();function i(ce){const Ie=`providers.${ce}.name`,Ce=t(Ie);return Ce===Ie?ce:Ce}const c=X(()=>JSON.parse(localStorage.getItem(`chatlab_app_config_${s.value}`)||localStorage.getItem("chatlab_app_config")||"{}").aiTips||{}),d=I("preset"),m=X(()=>[{label:t("settings.aiConfig.modal.presetService"),value:"preset"},{label:t("settings.aiConfig.modal.thirdPartyService"),value:"openai-compat"},{label:t("settings.aiConfig.modal.localService"),value:"local"}]),u=I(!1),y=I(!1),g=I(!1),_=I(""),x=I(!1),w=I(""),$=I(""),P=I(void 0),h=I([]),p=I({provider:"",apiKey:"",model:"",baseUrl:"",apiFormat:ns,customName:""}),C=I("idle"),S=I(""),z=X(()=>a.providerRegistry.filter(ce=>!(!n.locale.startsWith("zh")&&jw.includes(ce.id)))),M=X(()=>z.value.filter(ce=>ce.kind==="official"&&ce.id!=="openai-compatible")),D=X(()=>z.value.filter(ce=>!ce.builtin)),E=X(()=>a.providerRegistry.find(ce=>ce.id===p.value.provider)),F=X(()=>d.value==="local"),re=X(()=>d.value==="openai-compat"),ve=X(()=>d.value==="preset"),de=X(()=>F.value||re.value),L=X(()=>p.value.provider?a.getModelsByProviderId(p.value.provider).filter(ce=>!ce.capabilities.includes("embedding")&&!ce.capabilities.includes("ranking")):[]),A=X(()=>de.value?h.value.map(ce=>({label:ce.name,value:ce.id})):L.value.map(ce=>({label:ce.name,value:ce.id}))),G=X(()=>{if(!p.value.model)return!1;if(de.value)return h.value.some(Ie=>Ie.id===p.value.model);const ce=L.value.find(Ie=>Ie.id===p.value.model);return ce?!ce.builtin:!1}),J=X(()=>{if(!p.value.model)return;const ce=p.value.provider||"openai-compatible";return(a.getModelById(ce,p.value.model)||a.findModelAcrossProviders(p.value.model))?.contextWindow}),ue=X(()=>{const{provider:ce,apiKey:Ie,baseUrl:Ce}=p.value;return Ho({mode:e.mode.value,existingApiKeySet:e.config.value?.apiKeySet,hasNewApiKey:!!Ie.trim(),originalProvider:e.config.value?.provider,currentProvider:ce,originalConnectionMode:e.config.value?Pa(e.config.value):void 0,currentConnectionMode:d.value,originalBaseUrl:e.config.value?.baseUrl,currentBaseUrl:Ce.trim()||void 0})}),W=X(()=>{const{provider:ce,apiKey:Ie,baseUrl:Ce,model:Le}=p.value,Ee=ue.value;return F.value?Ce.trim()&&Le.trim():re.value?Ce.trim()&&(Ie.trim()||Ee)&&Le.trim():ce?Ie.trim()||Ee:!1}),V=X(()=>Ww.map(ce=>({label:t(ce.labelKey),value:ce.value}))),H=X(()=>e.mode.value==="add"?t("settings.aiConfig.modal.addConfig"):t("settings.aiConfig.modal.editConfig")),ae={gemini:"google-generative-ai",anthropic:"anthropic-messages"},K={"openai-completions":"/chat/completions","openai-responses":"/responses","anthropic-messages":"/v1/messages"},ee=X(()=>{const Ie=p.value.baseUrl?.trim()||(ve.value?E.value?.defaultBaseUrl:"");if(!Ie)return"";const Ce=ve.value?ae[p.value.provider]||ns:p.value.apiFormat||ns,Le=Ie.replace(/\/+$/,"");let Ee;if(Ce==="anthropic-messages")Ee=Le.replace(/\/v1\/?$/,"");else if(Ce==="openai-completions"||Ce==="openai-responses")try{const Qe=new URL(Le);!Le.endsWith("/v1")&&(Qe.pathname==="/"||Qe.pathname==="")?Ee=Le+"/v1":Ee=Le}catch{Ee=Le}else Ee=Le;const ot=K[Ce];return ot?Ee+ot:Ee});function fe(){d.value="preset",h.value=[];const ce=M.value[0]?.id||"",Ie=ce?a.getModelsByProviderId(ce):[],Ce=Ie.find(Ee=>Ee.recommendedFor.includes("chat")),Le=ce?a.providerRegistry.find(Ee=>Ee.id===ce):null;p.value={provider:ce,apiKey:"",model:Ce?.id||Ie[0]?.id||"",baseUrl:Le?.defaultBaseUrl||"",apiFormat:ns,customName:""},C.value="idle",S.value=""}function he(ce){const Ie=a.providerRegistry.find(Ee=>Ee.id===ce.provider),Ce=ce.provider==="openai-compatible"||ce.provider.startsWith("custom:"),Le=!!(ce.model&&a.getModelById(ce.provider,ce.model));Ce?(d.value=Pa(ce),ce.customModels&&ce.customModels.length>0?h.value=[...ce.customModels]:h.value=ce.model?[{id:ce.model,name:ce.model}]:[]):(d.value="preset",h.value=[]),p.value={provider:ce.provider,apiKey:ce.apiKey||"",model:Ce?ce.model||"":Le&&ce.model||"",baseUrl:ce.baseUrl||Ie?.defaultBaseUrl||"",apiFormat:ce.apiFormat||ns,customName:ce.name||""},C.value="idle",S.value=""}function le(ce){p.value.provider=ce,C.value="idle",S.value="",p.value.baseUrl=a.providerRegistry.find(Le=>Le.id===ce)?.defaultBaseUrl||"";const Ie=a.getModelsByProviderId(ce),Ce=Ie.filter(Le=>Le.recommendedFor.includes("chat"));p.value.model=Ce[0]?.id||Ie[0]?.id||"",p.value.apiKey=""}function B(ce){if(d.value=ce,C.value="idle",S.value="",ce==="local")p.value.provider="openai-compatible",p.value.baseUrl="http://localhost:11434",p.value.model=h.value[0]?.id||"",p.value.apiKey="";else if(ce==="openai-compat")p.value.provider="openai-compatible",p.value.baseUrl="",p.value.model=h.value[0]?.id||"",p.value.apiKey="";else{h.value=[];const Ie=M.value[0]?.id||"";p.value.provider=Ie,p.value.baseUrl=a.providerRegistry.find(Ee=>Ee.id===Ie)?.defaultBaseUrl||"";const Ce=Ie?a.getModelsByProviderId(Ie):[],Le=Ce.filter(Ee=>Ee.recommendedFor.includes("chat"));p.value.model=Le[0]?.id||Ce[0]?.id||"",p.value.apiKey=""}}const N=I(!1),T=I([]),U=I(""),Z=I(!1),oe=X(()=>de.value?new Set(h.value.map(ce=>ce.id)):new Set(L.value.map(ce=>ce.id))),me=X(()=>ve.value?ae[p.value.provider]||ns:p.value.apiFormat||ns),pe=X(()=>{if(me.value==="anthropic-messages")return!1;const ce=p.value.baseUrl||E.value?.defaultBaseUrl||"",Ie=p.value.apiKey.trim()||F.value||ue.value;return!!(ce.trim()&&Ie)});async function _e(){const ce=p.value.baseUrl||E.value?.defaultBaseUrl||"",Ie=p.value.apiKey||(F.value?"sk-no-key-required":""),Ce=ue.value;if(!ce||!Ie&&!Ce)return;const Le=!Ie&&Ce?e.config.value?.id:void 0;N.value=!0,U.value="",Z.value=!0;try{const Ee=await it().fetchRemoteModels(p.value.provider||"openai-compatible",Ie,ce,me.value,Le);if(Ee.success&&Ee.models){const ot=p.value.provider||"openai-compatible";T.value=Ee.models.map(Qe=>{if(Qe.contextWindow)return Qe;const ss=a.getModelById(ot,Qe.id)||a.findModelAcrossProviders(Qe.id);return ss?.contextWindow?{...Qe,contextWindow:ss.contextWindow}:Qe})}else U.value=Ee.error||t("settings.aiConfig.modal.fetchModelsError")}catch(Ee){U.value=String(Ee)}finally{N.value=!1}}async function be(ce){if(de.value){h.value.some(Ce=>Ce.id===ce.id)||h.value.push({id:ce.id,name:ce.name});const Ie=p.value.provider||"openai-compatible";if(ce.contextWindow&&!a.getModelById(Ie,ce.id)?.contextWindow)try{await it().addCustomModel({id:ce.id,providerId:Ie,name:ce.name,contextWindow:ce.contextWindow,capabilities:["chat"],recommendedFor:[],description:"",status:"stable"}),await a.refreshConfigs()}catch{}}else{const Ie=p.value.provider||"openai-compatible";if(!L.value.some(Ce=>Ce.id===ce.id))try{await it().addCustomModel({id:ce.id,providerId:Ie,name:ce.name,contextWindow:ce.contextWindow||void 0,capabilities:["chat"],recommendedFor:[],description:"",status:"stable"}),await a.refreshConfigs()}catch{}}p.value.model||(p.value.model=ce.id)}async function ge(ce){for(const Ie of ce)await be(Ie)}function b(){w.value="",$.value="",P.value=void 0,x.value=!0}async function O(){const ce=$.value.trim(),Ie=w.value.trim()||ce;if(!ce)return;if(de.value){h.value.some(Le=>Le.id===ce)||h.value.push({id:ce,name:Ie}),p.value.model=ce,x.value=!1;return}const Ce=p.value.provider||"openai-compatible";try{await it().addCustomModel({id:ce,providerId:Ce,name:Ie,contextWindow:P.value||void 0,capabilities:["chat"],recommendedFor:[],description:"",status:"stable"}),await a.refreshConfigs(),p.value.model=ce,x.value=!1}catch(Le){console.error("添加自定义模型失败:",Le)}}const Q=I(!1),ie=I(void 0),ye=I("");function j(){const ce=p.value.model;if(!ce)return;const Ie=p.value.provider||"openai-compatible",Ce=a.getModelById(Ie,ce);ie.value=Ce?.contextWindow??void 0,ye.value=Ce?.name??"",Q.value=!0}async function q(){const ce=p.value.model;if(!ce)return;const Ie=p.value.provider||"openai-compatible";try{const Ce={contextWindow:ie.value||void 0};ye.value.trim()&&(Ce.name=ye.value.trim());const Le=it();(await Le.updateCustomModel(Ie,ce,Ce)).success||await Le.addCustomModel({id:ce,providerId:Ie,name:ye.value.trim()||ce,contextWindow:ie.value||void 0,capabilities:["chat"],recommendedFor:[],description:"",status:"stable"}),await a.refreshConfigs()}catch(Ce){console.error("编辑模型失败:",Ce)}Q.value=!1}async function R(ce){if(de.value){const Ce=h.value.findIndex(Le=>Le.id===ce);Ce!==-1&&h.value.splice(Ce,1),p.value.model===ce&&(p.value.model=h.value[0]?.id||"");return}const Ie=p.value.provider||"openai-compatible";try{if(await it().deleteCustomModel(Ie,ce),await a.refreshConfigs(),p.value.model===ce){const Ce=L.value;p.value.model=Ce[0]?.id||""}}catch(Ce){console.error("删除自定义模型失败:",Ce)}}async function xe(){const{provider:ce,baseUrl:Ie}=p.value,Ce=p.value.apiKey.trim(),Le=ue.value;if(ve.value){if(!ce||!Ce&&!Le){C.value="idle",S.value="";return}}else if(!Ie||re.value&&!Ce&&!Le)return;u.value=!0,C.value="idle";const Ee=!Ce&&Le?e.config.value?.id:void 0;try{const ot=!Ce&&Le?"":Ce||"sk-no-key-required",Qe=await it().validateApiKey(ce||"openai-compatible",ot,Ie||void 0,p.value.model||void 0,void 0,Ee);C.value=Qe.success?"valid":"invalid",Qe.success?S.value=t("settings.aiConfig.modal.validationSuccess"):S.value=Qe.error||t("settings.aiConfig.modal.validationFailed")}catch(ot){C.value="invalid",S.value=t("settings.aiConfig.modal.validationError")+String(ot)}finally{u.value=!1}}function Se(){if(de.value&&p.value.baseUrl)try{return new URL(p.value.baseUrl).hostname}catch{return t("settings.aiConfig.modal.customService")}const ce=E.value;if(ce)return i(ce.id)||ce.name;const Ie=e.providers.value.find(Ce=>Ce.id===p.value.provider);return Ie?Ie.name:p.value.baseUrl||t("settings.aiConfig.modal.customService")}async function se(){y.value=!0;try{const ce=p.value.provider;let Ie=p.value.apiKey.trim();!Ie&&F.value&&(Ie="sk-no-key-required");const Ce=p.value.customName.trim()||Se(),Le=de.value&&h.value.length>0?h.value.map(Ee=>({id:Ee.id,name:Ee.name})):void 0;if(e.mode.value==="add"){const Ee=de.value&&p.value.apiFormat||void 0,ot=await it().addConfig({name:Ce,provider:ce,apiKey:Ie,model:p.value.model.trim()||void 0,baseUrl:p.value.baseUrl.trim()||void 0,apiFormat:Ee,customModels:Le});ot.success?(e.onClose(),e.onSaved()):console.error("添加配置失败:",ot.error)}else{const Ee=de.value&&p.value.apiFormat||void 0,ot={name:Ce,provider:ce,model:p.value.model.trim()||void 0,baseUrl:p.value.baseUrl.trim()||void 0,apiFormat:Ee,customModels:Le};(p.value.apiKey.trim()||F.value)&&(ot.apiKey=Ie);const Qe=await it().updateConfig(e.config.value.id,ot);Qe.success?(e.onClose(),e.onSaved()):console.error("更新配置失败:",Qe.error)}}catch(ce){console.error("保存配置失败:",ce)}finally{y.value=!1}}async function Ae(){if(!W.value)return;if(C.value==="valid")return se();const ce=!!p.value.apiKey.trim();if(Ho({mode:e.mode.value,existingApiKeySet:e.config.value?.apiKeySet,hasNewApiKey:ce,originalProvider:e.config.value?.provider,currentProvider:p.value.provider,originalConnectionMode:e.config.value?Pa(e.config.value):void 0,currentConnectionMode:d.value,originalBaseUrl:e.config.value?.baseUrl,currentBaseUrl:p.value.baseUrl.trim()||void 0}))return se();u.value=!0;try{const Ce=p.value.apiKey.trim()||"sk-no-key-required",Le=await it().validateApiKey(p.value.provider||"openai-compatible",Ce,p.value.baseUrl.trim()||void 0,p.value.model.trim()||void 0);if(Le.success)return C.value="valid",S.value="",se();C.value="invalid",_.value=Le.error||t("settings.aiConfig.modal.validationFailed"),g.value=!0}catch(Ce){_.value=String(Ce),g.value=!0}finally{u.value=!1}}function Oe(){g.value=!1,se()}function st(){g.value=!1}return Ue(e.open,ce=>{ce&&(e.mode.value==="edit"&&e.config.value?he(e.config.value):fe())}),Ue(()=>p.value.apiKey,()=>{C.value="idle",S.value=""}),{getLocalizedProviderName:i,aiTips:c,connectionMode:d,connectionModeItems:m,isValidating:u,isSaving:y,showValidationFailConfirm:g,validationFailMessage:_,showAddModelDialog:x,newModelName:w,newModelId:$,newModelContextWindow:P,formData:p,validationResult:C,validationMessage:S,officialProviders:M,customProviders:D,currentProviderDef:E,isLocalMode:F,isOpenAICompat:re,isPresetMode:ve,isCompatMode:de,modelTabItems:A,selectedModelIsCustom:G,selectedModelContextWindow:J,canSave:W,canReuseStoredKey:ue,apiFormatItems:V,modalTitle:H,resolvedApiUrl:ee,isFetchingModels:N,remoteModels:T,remoteModelsError:U,showRemoteModelBrowser:Z,addedModelIds:oe,canFetchModels:pe,showEditModelDialog:Q,editModelContextWindow:ie,editModelName:ye,selectProvider:le,onConnectionModeChange:B,openAddModelDialog:b,confirmAddModel:O,openEditModelDialog:j,confirmEditModel:q,deleteCustomModel:R,validateKey:xe,saveConfig:Ae,confirmSaveAnyway:Oe,cancelSave:st,fetchRemoteModels:_e,addRemoteModel:be,addAllRemoteModels:ge}}const Kw={class:"flex min-h-[min(640px,80vh)] max-h-[80vh] flex-col p-6"},Gw={class:"mb-4 text-lg font-semibold text-gray-900 dark:text-white"},Xw={class:"min-h-0 flex-1 overflow-y-auto pr-1"},Yw={class:"space-y-4"},Qw={class:"mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300"},Jw={class:"flex flex-wrap gap-2"},Zw=["onClick"],e1=["onClick"],t1={key:0,class:"mt-3 rounded-lg border border-gray-100 bg-gray-50/50 px-3 py-2 dark:border-gray-800 dark:bg-gray-800/50"},s1={class:"flex gap-3"},a1=["href"],n1=["href"],o1={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},r1={class:"mt-1 text-[10px] text-gray-400"},i1={key:0,class:"mt-1.5 flex items-center gap-1 text-[11px] text-gray-400 dark:text-gray-500"},l1={class:"ml-0.5 break-all rounded bg-gray-100 px-1 py-0.5 font-mono text-[10px] text-gray-500 dark:bg-gray-800 dark:text-gray-400"},c1={class:"mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300"},d1={key:1,class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},u1={key:0,class:"ml-2"},m1={key:2,class:"mt-1 flex items-center gap-1 text-xs text-red-500 dark:text-red-400"},g1={class:"mt-2 flex items-center gap-2"},p1={class:"mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300"},f1={class:"flex gap-2"},h1={key:0,class:"mt-1.5 flex items-center gap-1 text-[11px] text-gray-400 dark:text-gray-500"},v1={class:"ml-0.5 break-all rounded bg-gray-100 px-1 py-0.5 font-mono text-[10px] text-gray-500 dark:bg-gray-800 dark:text-gray-400"},y1={class:"mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300"},b1={key:1,class:"flex items-center gap-1 text-xs text-red-500 dark:text-red-400"},_1={key:2,class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},x1={key:0,class:"ml-2"},k1={key:3,class:"mt-1 flex items-center gap-1 text-xs text-red-500 dark:text-red-400"},w1={class:"mt-2 flex items-center gap-2"},S1={key:0},C1={key:0,class:"flex items-center gap-1 text-sm text-green-600 dark:text-green-400"},I1={key:1,class:"flex items-center gap-1 text-sm text-amber-600 dark:text-amber-400"},M1={class:"mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300"},T1={class:"mt-1 text-xs text-gray-500"},A1={key:0,class:"mt-1.5 flex items-center gap-1 text-[11px] text-gray-400 dark:text-gray-500"},$1={class:"ml-0.5 break-all rounded bg-gray-100 px-1 py-0.5 font-mono text-[10px] text-gray-500 dark:bg-gray-800 dark:text-gray-400"},P1={class:"mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300"},D1={key:1,class:"flex items-center gap-1 text-xs text-red-500 dark:text-red-400"},L1={key:2,class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},R1={key:0,class:"ml-2"},E1={key:3,class:"mt-1 flex items-center gap-1 text-xs text-red-500 dark:text-red-400"},F1={class:"mt-2 flex items-center gap-2"},N1={key:3},U1={class:"mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300"},O1={key:4},V1={class:"mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300"},H1={class:"font-normal text-gray-400"},z1={class:"mt-4 flex shrink-0 justify-end gap-2 border-t border-gray-100 pt-4 dark:border-gray-800"},B1={class:"p-6"},W1={class:"mb-4 flex items-start gap-3"},j1={class:"font-medium text-gray-900 dark:text-white"},q1={class:"mt-1 text-sm text-gray-600 dark:text-gray-400"},K1={class:"mt-2 text-sm text-gray-500 dark:text-gray-400"},G1={class:"flex justify-end gap-2"},X1={class:"p-5"},Y1={class:"mb-4 text-base font-semibold text-gray-900 dark:text-white"},Q1={class:"space-y-3"},J1={class:"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300"},Z1={class:"mt-1 text-[10px] text-gray-400"},eS={class:"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300"},tS={class:"font-normal text-gray-400"},sS={class:"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300"},aS={class:"flex items-center gap-2"},nS={class:"mt-1.5 flex flex-wrap gap-1"},oS=["onClick"],rS={class:"mt-1 text-[10px] text-gray-400"},iS={class:"mt-4 flex justify-end gap-2"},lS={class:"p-5"},cS={class:"mb-4 text-base font-semibold text-gray-900 dark:text-white"},dS={class:"space-y-3"},uS={class:"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300"},mS={class:"text-sm text-gray-600 dark:text-gray-400"},gS={class:"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300"},pS={class:"font-normal text-gray-400"},fS={class:"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300"},hS={class:"flex items-center gap-2"},vS={class:"mt-1.5 flex flex-wrap gap-1"},yS=["onClick"],bS={class:"mt-1 text-[10px] text-gray-400"},_S={class:"mt-4 flex justify-end gap-2"},xS=Re({__name:"AIModelEditModal",props:{open:{type:Boolean},mode:{},config:{},providers:{}},emits:["update:open","saved"],setup(e,{emit:t}){const{t:s}=Fe(),n=e,a=t,{getLocalizedProviderName:i,aiTips:c,connectionMode:d,connectionModeItems:m,isValidating:u,isSaving:y,showValidationFailConfirm:g,validationFailMessage:_,showAddModelDialog:x,newModelName:w,newModelId:$,newModelContextWindow:P,formData:h,validationResult:p,validationMessage:C,officialProviders:S,customProviders:z,currentProviderDef:M,isLocalMode:D,isOpenAICompat:E,isPresetMode:F,modelTabItems:re,selectedModelIsCustom:ve,selectedModelContextWindow:de,canSave:L,canReuseStoredKey:A,apiFormatItems:G,modalTitle:J,resolvedApiUrl:ue,isFetchingModels:W,remoteModels:V,remoteModelsError:H,showRemoteModelBrowser:ae,addedModelIds:K,canFetchModels:ee,showEditModelDialog:fe,editModelContextWindow:he,editModelName:le,selectProvider:B,onConnectionModeChange:N,openAddModelDialog:T,confirmAddModel:U,openEditModelDialog:Z,confirmEditModel:oe,deleteCustomModel:me,validateKey:pe,saveConfig:_e,confirmSaveAnyway:be,cancelSave:ge,fetchRemoteModels:b,addRemoteModel:O,addAllRemoteModels:Q}=qw({...gr(n),onClose:()=>a("update:open",!1),onSaved:()=>a("saved")});function ie(){a("update:open",!1)}return(ye,j)=>{const q=ut,R=We,xe=Ke,Se=mt;return v(),k(Pe,null,[f(Se,{open:e.open,ui:{content:"max-w-2xl z-[101]",overlay:"z-[100]"},"onUpdate:open":j[23]||(j[23]=se=>a("update:open",se))},{content:te(()=>[r("div",Kw,[r("h3",Gw,l(o(J)),1),r("div",Xw,[r("div",Yw,[f(Vt,{"model-value":o(d),items:o(m),size:"sm","onUpdate:modelValue":o(N)},null,8,["model-value","items","onUpdate:modelValue"]),o(F)?(v(),k(Pe,{key:0},[r("div",null,[r("label",Qw,l(o(s)("settings.aiConfig.modal.aiProvider")),1),r("div",Jw,[(v(!0),k(Pe,null,Be(o(S),se=>(v(),k("button",{key:se.id,class:$e(["rounded-lg border-2 px-3 py-1.5 text-xs font-medium transition-colors",[o(h).provider===se.id?"border-transparent bg-primary-500 text-white hover:bg-primary-600 dark:bg-primary-500 dark:text-white dark:hover:bg-primary-400":"border-gray-200 bg-white text-gray-600 hover:border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-400 dark:hover:border-gray-600"]]),onClick:Ae=>o(B)(se.id)},l(o(i)(se.id)||se.name),11,Zw))),128)),(v(!0),k(Pe,null,Be(o(z),se=>(v(),k("button",{key:se.id,class:$e(["rounded-lg border-2 px-3 py-1.5 text-xs font-medium transition-colors",[o(h).provider===se.id?"border-transparent bg-primary-500 text-white hover:bg-primary-600 dark:bg-primary-500 dark:text-white dark:hover:bg-primary-400":"border-dashed border-gray-300 bg-white text-gray-500 hover:border-gray-400 dark:border-gray-600 dark:bg-gray-900 dark:text-gray-400"]]),onClick:Ae=>o(B)(se.id)},l(se.name),11,e1))),128))]),o(M)&&(o(M).website||o(M).consoleUrl)?(v(),k("div",t1,[r("div",s1,[o(M).website?(v(),k("a",{key:0,href:o(M).website,target:"_blank",rel:"noopener",class:"text-xs text-primary-500 hover:underline"},l(o(s)("settings.aiConfig.modal.visitWebsite")),9,a1)):ne("",!0),o(M).consoleUrl?(v(),k("a",{key:1,href:o(M).consoleUrl,target:"_blank",rel:"noopener",class:"text-xs text-primary-500 hover:underline"},l(o(s)("settings.aiConfig.modal.getApiKey")),9,n1)):ne("",!0)])])):ne("",!0)]),f(aa,{modelValue:o(h).apiKey,"onUpdate:modelValue":j[0]||(j[0]=se=>o(h).apiKey=se),placeholder:e.mode==="edit"&&e.config?.apiKeySet?o(s)("settings.aiConfig.modal.apiKeyPlaceholderEdit"):o(s)("settings.aiConfig.modal.apiKeyPlaceholder"),"validate-loading":o(u),"validate-disabled":!o(h).apiKey&&!o(A),"validate-text":o(s)("settings.aiConfig.modal.validate"),"validation-result":o(p),"validation-message":o(C),onValidate:o(pe)},null,8,["modelValue","placeholder","validate-loading","validate-disabled","validate-text","validation-result","validation-message","onValidate"]),r("div",null,[r("label",o1,l(o(s)("settings.aiConfig.modal.apiEndpoint")),1),f(q,{modelValue:o(h).baseUrl,"onUpdate:modelValue":j[1]||(j[1]=se=>o(h).baseUrl=se),class:"mt-2 w-full",placeholder:o(M)?.defaultBaseUrl||"https://api.example.com/v1"},null,8,["modelValue","placeholder"]),r("p",r1,l(o(s)("settings.aiConfig.modal.apiEndpointOverrideHint")),1),o(ue)?(v(),k("p",i1,[f(R,{name:"i-heroicons-link",class:"h-3 w-3 shrink-0"}),r("span",null,l(o(s)("settings.aiConfig.modal.resolvedUrl")),1),r("code",l1,l(o(ue)),1)])):ne("",!0)]),r("div",null,[r("label",c1,l(o(s)("settings.aiConfig.modal.model")),1),o(re).length>0?(v(),Te(Vt,{key:0,modelValue:o(h).model,"onUpdate:modelValue":j[2]||(j[2]=se=>o(h).model=se),items:o(re),size:"xs"},null,8,["modelValue","items"])):ne("",!0),o(h).model?(v(),k("p",d1,[Y(l(o(s)("settings.aiConfig.modal.customModelId"))+": "+l(o(h).model)+" ",1),o(de)?(v(),k("span",u1," · "+l(o(s)("settings.aiConfig.modal.contextWindow"))+": "+l(o(de)>=1e6?(o(de)/1048576).toFixed(1)+"M":Math.round(o(de)/1024)+"K"),1)):ne("",!0)])):ne("",!0),o(h).model&&!o(de)?(v(),k("p",m1,[f(R,{name:"i-heroicons-exclamation-triangle",class:"h-3.5 w-3.5 shrink-0"}),Y(" "+l(o(s)("settings.aiConfig.modal.contextWindowMissing")),1)])):ne("",!0),r("div",g1,[o(ee)?(v(),k("button",{key:0,class:"flex items-center gap-1 rounded-md border border-dashed border-primary-300 px-2 py-1 text-xs text-primary-500 transition-colors hover:border-primary-400 hover:text-primary-600 dark:border-primary-700 dark:text-primary-400 dark:hover:border-primary-500",onClick:j[3]||(j[3]=(...se)=>o(b)&&o(b)(...se))},[f(R,{name:"i-heroicons-cloud-arrow-down",class:"h-3.5 w-3.5"}),Y(" "+l(o(s)("settings.aiConfig.modal.fetchModels")),1)])):ne("",!0),o(M)?.supportsCustomModels?(v(),k("button",{key:1,class:"flex items-center gap-1 rounded-md border border-dashed border-gray-300 px-2 py-1 text-xs text-gray-500 transition-colors hover:border-primary-400 hover:text-primary-500 dark:border-gray-600 dark:text-gray-400 dark:hover:border-primary-500 dark:hover:text-primary-400",onClick:j[4]||(j[4]=(...se)=>o(T)&&o(T)(...se))},[f(R,{name:"i-heroicons-plus",class:"h-3.5 w-3.5"}),Y(" "+l(o(s)("settings.aiConfig.modal.addCustomModel")),1)])):ne("",!0),o(h).model?(v(),k("button",{key:2,class:"flex items-center gap-1 rounded-md border border-dashed border-gray-300 px-2 py-1 text-xs text-gray-500 transition-colors hover:border-primary-400 hover:text-primary-500 dark:border-gray-600 dark:text-gray-400 dark:hover:border-primary-500 dark:hover:text-primary-400",onClick:j[5]||(j[5]=(...se)=>o(Z)&&o(Z)(...se))},[f(R,{name:"i-heroicons-pencil-square",class:"h-3.5 w-3.5"}),Y(" "+l(o(s)("settings.aiConfig.modal.editModel")),1)])):ne("",!0),o(ve)?(v(),k("button",{key:3,class:"flex items-center gap-1 rounded-md border border-dashed border-red-200 px-2 py-1 text-xs text-red-400 transition-colors hover:border-red-400 hover:text-red-500 dark:border-red-800 dark:hover:border-red-500",onClick:j[6]||(j[6]=se=>o(me)(o(h).model))},[f(R,{name:"i-heroicons-trash",class:"h-3.5 w-3.5"}),Y(" "+l(o(s)("settings.aiConfig.modal.deleteCustomModel")),1)])):ne("",!0)])])],64)):o(D)?(v(),k(Pe,{key:1},[f(aa,{modelValue:o(h).apiKey,"onUpdate:modelValue":j[7]||(j[7]=se=>o(h).apiKey=se),placeholder:o(s)("settings.aiConfig.modal.apiKeyPlaceholderLocal"),"optional-text":o(s)("settings.aiConfig.modal.optional"),hint:o(s)("settings.aiConfig.modal.apiKeyHintLocal")},null,8,["modelValue","placeholder","optional-text","hint"]),r("div",null,[r("label",p1,l(o(s)("settings.aiConfig.modal.apiEndpoint")),1),r("div",f1,[f(q,{modelValue:o(h).baseUrl,"onUpdate:modelValue":j[8]||(j[8]=se=>o(h).baseUrl=se),placeholder:"http://localhost:11434",class:"flex-1"},null,8,["modelValue"]),f(xe,{loading:o(u),disabled:!o(h).baseUrl,variant:"soft",onClick:o(pe)},{default:te(()=>[Y(l(o(s)("settings.aiConfig.modal.validate")),1)]),_:1},8,["loading","disabled","onClick"])]),o(ue)?(v(),k("p",h1,[f(R,{name:"i-heroicons-link",class:"h-3 w-3 shrink-0"}),r("span",null,l(o(s)("settings.aiConfig.modal.resolvedUrl")),1),r("code",v1,l(o(ue)),1)])):ne("",!0)]),r("div",null,[r("label",y1,l(o(s)("settings.aiConfig.modal.model")),1),o(re).length>0?(v(),Te(Vt,{key:0,modelValue:o(h).model,"onUpdate:modelValue":j[9]||(j[9]=se=>o(h).model=se),items:o(re),size:"xs"},null,8,["modelValue","items"])):(v(),k("p",b1,[f(R,{name:"i-heroicons-exclamation-triangle",class:"h-3.5 w-3.5 shrink-0"}),Y(" "+l(o(s)("settings.aiConfig.modal.modelRequired")),1)])),o(h).model?(v(),k("p",_1,[Y(l(o(s)("settings.aiConfig.modal.customModelId"))+": "+l(o(h).model)+" ",1),o(de)?(v(),k("span",x1," · "+l(o(s)("settings.aiConfig.modal.contextWindow"))+": "+l(o(de)>=1e6?(o(de)/1048576).toFixed(1)+"M":Math.round(o(de)/1024)+"K"),1)):ne("",!0)])):ne("",!0),o(h).model&&!o(de)?(v(),k("p",k1,[f(R,{name:"i-heroicons-exclamation-triangle",class:"h-3.5 w-3.5 shrink-0"}),Y(" "+l(o(s)("settings.aiConfig.modal.contextWindowMissing")),1)])):ne("",!0),r("div",w1,[o(ee)?(v(),k("button",{key:0,class:"flex items-center gap-1 rounded-md border border-dashed border-primary-300 px-2 py-1 text-xs text-primary-500 transition-colors hover:border-primary-400 hover:text-primary-600 dark:border-primary-700 dark:text-primary-400 dark:hover:border-primary-500",onClick:j[10]||(j[10]=(...se)=>o(b)&&o(b)(...se))},[f(R,{name:"i-heroicons-cloud-arrow-down",class:"h-3.5 w-3.5"}),Y(" "+l(o(s)("settings.aiConfig.modal.fetchModels")),1)])):ne("",!0),o(M)?.supportsCustomModels?(v(),k("button",{key:1,class:"flex items-center gap-1 rounded-md border border-dashed border-gray-300 px-2 py-1 text-xs text-gray-500 transition-colors hover:border-primary-400 hover:text-primary-500 dark:border-gray-600 dark:text-gray-400 dark:hover:border-primary-500 dark:hover:text-primary-400",onClick:j[11]||(j[11]=(...se)=>o(T)&&o(T)(...se))},[f(R,{name:"i-heroicons-plus",class:"h-3.5 w-3.5"}),Y(" "+l(o(s)("settings.aiConfig.modal.addCustomModel")),1)])):ne("",!0),o(h).model?(v(),k("button",{key:2,class:"flex items-center gap-1 rounded-md border border-dashed border-gray-300 px-2 py-1 text-xs text-gray-500 transition-colors hover:border-primary-400 hover:text-primary-500 dark:border-gray-600 dark:text-gray-400 dark:hover:border-primary-500 dark:hover:text-primary-400",onClick:j[12]||(j[12]=(...se)=>o(Z)&&o(Z)(...se))},[f(R,{name:"i-heroicons-pencil-square",class:"h-3.5 w-3.5"}),Y(" "+l(o(s)("settings.aiConfig.modal.editModel")),1)])):ne("",!0),o(ve)?(v(),k("button",{key:3,class:"flex items-center gap-1 rounded-md border border-dashed border-red-200 px-2 py-1 text-xs text-red-400 transition-colors hover:border-red-400 hover:text-red-500 dark:border-red-800 dark:hover:border-red-500",onClick:j[13]||(j[13]=se=>o(me)(o(h).model))},[f(R,{name:"i-heroicons-trash",class:"h-3.5 w-3.5"}),Y(" "+l(o(s)("settings.aiConfig.modal.deleteCustomModel")),1)])):ne("",!0)])]),o(C)?(v(),k("div",S1,[o(p)==="valid"?(v(),k("div",C1,[f(R,{name:"i-heroicons-check-circle",class:"h-4 w-4"}),Y(" "+l(o(C)),1)])):o(p)==="invalid"?(v(),k("div",I1,[f(R,{name:"i-heroicons-exclamation-triangle",class:"h-4 w-4"}),Y(" "+l(o(C)),1)])):ne("",!0)])):ne("",!0)],64)):o(E)?(v(),k(Pe,{key:2},[o(c).thirdPartyApi?.show?(v(),Te(fi,{key:0,icon:"i-heroicons-exclamation-triangle",content:o(c).thirdPartyApi?.content},null,8,["content"])):ne("",!0),f(aa,{modelValue:o(h).apiKey,"onUpdate:modelValue":j[14]||(j[14]=se=>o(h).apiKey=se),placeholder:e.mode==="edit"&&e.config?.apiKeySet?o(s)("settings.aiConfig.modal.apiKeyPlaceholderEdit"):o(s)("settings.aiConfig.modal.apiKeyPlaceholder"),"validate-loading":o(u),"validate-disabled":!o(h).apiKey&&!o(A)||!o(h).baseUrl,"validate-text":o(s)("settings.aiConfig.modal.validate"),"validation-result":o(p),"validation-message":o(C),onValidate:o(pe)},null,8,["modelValue","placeholder","validate-loading","validate-disabled","validate-text","validation-result","validation-message","onValidate"]),r("div",null,[r("label",M1,l(o(s)("settings.aiConfig.modal.apiEndpoint")),1),f(q,{modelValue:o(h).baseUrl,"onUpdate:modelValue":j[15]||(j[15]=se=>o(h).baseUrl=se),class:"w-full",placeholder:"https://api.example.com"},null,8,["modelValue"]),r("p",T1,l(o(s)("settings.aiConfig.modal.apiEndpointHint")),1),o(ue)?(v(),k("p",A1,[f(R,{name:"i-heroicons-link",class:"h-3 w-3 shrink-0"}),r("span",null,l(o(s)("settings.aiConfig.modal.resolvedUrl")),1),r("code",$1,l(o(ue)),1)])):ne("",!0)]),r("div",null,[r("label",P1,l(o(s)("settings.aiConfig.modal.model")),1),o(re).length>0?(v(),Te(Vt,{key:0,modelValue:o(h).model,"onUpdate:modelValue":j[16]||(j[16]=se=>o(h).model=se),items:o(re),size:"xs"},null,8,["modelValue","items"])):(v(),k("p",D1,[f(R,{name:"i-heroicons-exclamation-triangle",class:"h-3.5 w-3.5 shrink-0"}),Y(" "+l(o(s)("settings.aiConfig.modal.modelRequired")),1)])),o(h).model?(v(),k("p",L1,[Y(l(o(s)("settings.aiConfig.modal.customModelId"))+": "+l(o(h).model)+" ",1),o(de)?(v(),k("span",R1," · "+l(o(s)("settings.aiConfig.modal.contextWindow"))+": "+l(o(de)>=1e6?(o(de)/1048576).toFixed(1)+"M":Math.round(o(de)/1024)+"K"),1)):ne("",!0)])):ne("",!0),o(h).model&&!o(de)?(v(),k("p",E1,[f(R,{name:"i-heroicons-exclamation-triangle",class:"h-3.5 w-3.5 shrink-0"}),Y(" "+l(o(s)("settings.aiConfig.modal.contextWindowMissing")),1)])):ne("",!0),r("div",F1,[o(ee)?(v(),k("button",{key:0,class:"flex items-center gap-1 rounded-md border border-dashed border-primary-300 px-2 py-1 text-xs text-primary-500 transition-colors hover:border-primary-400 hover:text-primary-600 dark:border-primary-700 dark:text-primary-400 dark:hover:border-primary-500",onClick:j[17]||(j[17]=(...se)=>o(b)&&o(b)(...se))},[f(R,{name:"i-heroicons-cloud-arrow-down",class:"h-3.5 w-3.5"}),Y(" "+l(o(s)("settings.aiConfig.modal.fetchModels")),1)])):ne("",!0),o(M)?.supportsCustomModels?(v(),k("button",{key:1,class:"flex items-center gap-1 rounded-md border border-dashed border-gray-300 px-2 py-1 text-xs text-gray-500 transition-colors hover:border-primary-400 hover:text-primary-500 dark:border-gray-600 dark:text-gray-400 dark:hover:border-primary-500 dark:hover:text-primary-400",onClick:j[18]||(j[18]=(...se)=>o(T)&&o(T)(...se))},[f(R,{name:"i-heroicons-plus",class:"h-3.5 w-3.5"}),Y(" "+l(o(s)("settings.aiConfig.modal.addCustomModel")),1)])):ne("",!0),o(h).model?(v(),k("button",{key:2,class:"flex items-center gap-1 rounded-md border border-dashed border-gray-300 px-2 py-1 text-xs text-gray-500 transition-colors hover:border-primary-400 hover:text-primary-500 dark:border-gray-600 dark:text-gray-400 dark:hover:border-primary-500 dark:hover:text-primary-400",onClick:j[19]||(j[19]=(...se)=>o(Z)&&o(Z)(...se))},[f(R,{name:"i-heroicons-pencil-square",class:"h-3.5 w-3.5"}),Y(" "+l(o(s)("settings.aiConfig.modal.editModel")),1)])):ne("",!0),o(ve)?(v(),k("button",{key:3,class:"flex items-center gap-1 rounded-md border border-dashed border-red-200 px-2 py-1 text-xs text-red-400 transition-colors hover:border-red-400 hover:text-red-500 dark:border-red-800 dark:hover:border-red-500",onClick:j[20]||(j[20]=se=>o(me)(o(h).model))},[f(R,{name:"i-heroicons-trash",class:"h-3.5 w-3.5"}),Y(" "+l(o(s)("settings.aiConfig.modal.deleteCustomModel")),1)])):ne("",!0)])])],64)):ne("",!0),o(F)?ne("",!0):(v(),k("div",N1,[r("label",U1,l(o(s)("settings.aiConfig.modal.apiFormat")),1),f(Vt,{modelValue:o(h).apiFormat,"onUpdate:modelValue":j[21]||(j[21]=se=>o(h).apiFormat=se),items:o(G),size:"xs"},null,8,["modelValue","items"])])),o(h).provider||!o(F)?(v(),k("div",O1,[r("label",V1,[Y(l(o(s)("settings.aiConfig.modal.configName"))+" ",1),r("span",H1,l(o(s)("settings.aiConfig.modal.optional")),1)]),f(q,{modelValue:o(h).customName,"onUpdate:modelValue":j[22]||(j[22]=se=>o(h).customName=se),class:"w-full",placeholder:o(F)?o(s)("settings.aiConfig.modal.configNamePlaceholderPreset"):o(s)("settings.aiConfig.modal.configNamePlaceholderCustom")},null,8,["modelValue","placeholder"])])):ne("",!0)])]),r("div",z1,[f(xe,{variant:"soft",onClick:ie},{default:te(()=>[Y(l(o(s)("common.cancel")),1)]),_:1}),f(xe,{color:"primary",disabled:!o(L),loading:o(y)||o(u),onClick:o(_e)},{default:te(()=>[Y(l(e.mode==="add"?o(s)("common.add"):o(s)("common.save")),1)]),_:1},8,["disabled","loading","onClick"])])])]),_:1},8,["open"]),f(Se,{open:o(g),ui:{content:"z-[102]",overlay:"z-[101]"},"onUpdate:open":j[24]||(j[24]=se=>g.value=se)},{content:te(()=>[r("div",B1,[r("div",W1,[f(R,{name:"i-heroicons-exclamation-triangle",class:"mt-0.5 h-6 w-6 shrink-0 text-amber-500"}),r("div",null,[r("h4",j1,l(o(s)("settings.aiConfig.modal.validationFailedTitle")),1),r("p",q1,l(o(_)),1),r("p",K1,l(o(s)("settings.aiConfig.modal.saveAnywayHint")),1)])]),r("div",G1,[f(xe,{variant:"soft",onClick:o(ge)},{default:te(()=>[Y(l(o(s)("common.cancel")),1)]),_:1},8,["onClick"]),f(xe,{color:"warning",onClick:o(be)},{default:te(()=>[Y(l(o(s)("settings.aiConfig.modal.saveAnyway")),1)]),_:1},8,["onClick"])])])]),_:1},8,["open"]),f(Bm,{open:o(ae),"onUpdate:open":j[25]||(j[25]=se=>rt(ae)?ae.value=se:null),models:o(V),loading:o(W),error:o(H),"added-model-ids":o(K),onAdd:o(O),onAddAll:o(Q),onRefresh:o(b)},null,8,["open","models","loading","error","added-model-ids","onAdd","onAddAll","onRefresh"]),f(Se,{open:o(x),ui:{content:"z-[102]",overlay:"z-[101]"},"onUpdate:open":j[30]||(j[30]=se=>x.value=se)},{content:te(()=>[r("div",X1,[r("h4",Y1,l(o(s)("settings.aiConfig.modal.addCustomModel")),1),r("div",Q1,[r("div",null,[r("label",J1,l(o(s)("settings.aiConfig.modal.customModelId")),1),f(q,{modelValue:o($),"onUpdate:modelValue":j[26]||(j[26]=se=>rt($)?$.value=se:null),class:"w-full",placeholder:"gpt-4o-custom, deepseek-r1, ..."},null,8,["modelValue"]),r("p",Z1,l(o(s)("settings.aiConfig.modal.customModelIdHint")),1)]),r("div",null,[r("label",eS,[Y(l(o(s)("settings.aiConfig.modal.customModelDisplayName"))+" ",1),r("span",tS,l(o(s)("settings.aiConfig.modal.optional")),1)]),f(q,{modelValue:o(w),"onUpdate:modelValue":j[27]||(j[27]=se=>rt(w)?w.value=se:null),class:"w-full",placeholder:o($)||o(s)("settings.aiConfig.modal.customModelDisplayNamePlaceholder")},null,8,["modelValue","placeholder"])]),r("div",null,[r("label",sS,l(o(s)("settings.aiConfig.modal.contextWindow")),1),r("div",aS,[f(q,{"model-value":o(P)??"",class:"flex-1",type:"number",placeholder:o(s)("settings.aiConfig.modal.contextWindowPlaceholder"),"onUpdate:modelValue":j[28]||(j[28]=se=>P.value=se?Number(se):void 0)},null,8,["model-value","placeholder"])]),r("div",nS,[(v(),k(Pe,null,Be([{label:"64K",value:65536},{label:"128K",value:128e3},{label:"200K",value:2e5},{label:"1M",value:1048576}],se=>r("button",{key:se.value,class:$e(["rounded border px-1.5 py-0.5 text-[10px] transition-colors",[o(P)===se.value?"border-primary-400 bg-primary-50 text-primary-600 dark:border-primary-600 dark:bg-primary-900/30 dark:text-primary-400":"border-gray-200 text-gray-500 hover:border-gray-300 dark:border-gray-700 dark:text-gray-400 dark:hover:border-gray-600"]]),onClick:Ae=>P.value=se.value},l(se.label),11,oS)),64))]),r("p",rS,l(o(s)("settings.aiConfig.modal.contextWindowHint")),1)])]),r("div",iS,[f(xe,{variant:"soft",onClick:j[29]||(j[29]=se=>x.value=!1)},{default:te(()=>[Y(l(o(s)("common.cancel")),1)]),_:1}),f(xe,{color:"primary",disabled:!o($).trim(),onClick:o(U)},{default:te(()=>[Y(l(o(s)("common.add")),1)]),_:1},8,["disabled","onClick"])])])]),_:1},8,["open"]),f(Se,{open:o(fe),ui:{content:"z-[102]",overlay:"z-[101]"},"onUpdate:open":j[34]||(j[34]=se=>fe.value=se)},{content:te(()=>[r("div",lS,[r("h4",cS,l(o(s)("settings.aiConfig.modal.editModel")),1),r("div",dS,[r("div",null,[r("label",uS,l(o(s)("settings.aiConfig.modal.customModelId")),1),r("p",mS,l(o(h).model),1)]),r("div",null,[r("label",gS,[Y(l(o(s)("settings.aiConfig.modal.customModelDisplayName"))+" ",1),r("span",pS,l(o(s)("settings.aiConfig.modal.optional")),1)]),f(q,{modelValue:o(le),"onUpdate:modelValue":j[31]||(j[31]=se=>rt(le)?le.value=se:null),class:"w-full",placeholder:o(h).model||o(s)("settings.aiConfig.modal.customModelDisplayNamePlaceholder")},null,8,["modelValue","placeholder"])]),r("div",null,[r("label",fS,l(o(s)("settings.aiConfig.modal.contextWindow")),1),r("div",hS,[f(q,{"model-value":o(he)??"",class:"flex-1",type:"number",placeholder:o(s)("settings.aiConfig.modal.contextWindowPlaceholder"),"onUpdate:modelValue":j[32]||(j[32]=se=>he.value=se?Number(se):void 0)},null,8,["model-value","placeholder"])]),r("div",vS,[(v(),k(Pe,null,Be([{label:"64K",value:65536},{label:"128K",value:128e3},{label:"200K",value:2e5},{label:"1M",value:1048576}],se=>r("button",{key:se.value,class:$e(["rounded border px-1.5 py-0.5 text-[10px] transition-colors",[o(he)===se.value?"border-primary-400 bg-primary-50 text-primary-600 dark:border-primary-600 dark:bg-primary-900/30 dark:text-primary-400":"border-gray-200 text-gray-500 hover:border-gray-300 dark:border-gray-700 dark:text-gray-400 dark:hover:border-gray-600"]]),onClick:Ae=>he.value=se.value},l(se.label),11,yS)),64))]),r("p",bS,l(o(s)("settings.aiConfig.modal.contextWindowHint")),1)])]),r("div",_S,[f(xe,{variant:"soft",onClick:j[33]||(j[33]=se=>fe.value=!1)},{default:te(()=>[Y(l(o(s)("common.cancel")),1)]),_:1}),f(xe,{color:"primary",onClick:o(oe)},{default:te(()=>[Y(l(o(s)("common.save")),1)]),_:1},8,["onClick"])])])]),_:1},8,["open"])],64)}}}),kS={key:0,class:"flex items-center justify-center py-12"},wS={key:1,class:"space-y-6"},SS={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},CS={class:"rounded-lg border border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800/50"},IS={key:0,class:"divide-y divide-gray-200 dark:divide-gray-700"},MS={class:"flex items-center gap-3"},TS={class:"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-gray-200 text-gray-500 dark:bg-gray-700 dark:text-gray-400"},AS={class:"flex min-w-0 items-center gap-2"},$S={class:"w-28 shrink-0 truncate text-sm font-medium text-gray-900 dark:text-white"},PS={class:"flex min-w-0 items-center gap-1.5 text-xs text-gray-500 dark:text-gray-400"},DS={class:"truncate"},LS={class:"truncate"},RS={class:"flex items-center gap-1"},ES={key:1,class:"flex flex-col items-center justify-center py-8"},FS={class:"mt-2 text-sm text-gray-500 dark:text-gray-400"},NS={class:"text-xs text-gray-400 dark:text-gray-500"},US={class:"border-t border-gray-200 px-4 py-3 dark:border-gray-700"},OS=Re({__name:"AIModelConfigTab",emits:["config-changed"],setup(e,{expose:t,emit:s}){const{t:n,locale:a}=Fe(),i=s,c=X(()=>JSON.parse(localStorage.getItem(`chatlab_app_config_${a.value}`)||localStorage.getItem("chatlab_app_config")||"{}").aiTips||{}),d=Ws(),{configs:m,providers:u,providerRegistry:y,isLoading:g,isMaxConfigs:_}=et(d),x=I(!1),w=I("add"),$=I(null);function P(){w.value="add",$.value=null,x.value=!0}function h(E){w.value="edit",$.value=E,x.value=!0}async function p(){await d.refreshConfigs(),i("config-changed")}async function C(E){try{const F=await it().deleteConfig(E);F.success?(await d.refreshConfigs(),i("config-changed")):console.error("删除配置失败:",F.error)}catch(F){console.error("删除配置失败:",F)}}function S(E){const F=`providers.${E}.name`,re=n(F);return re!==F?re:d.getProviderName(E)}function z(E){const F=y.value.find(re=>re.id===E);return!F||F.kind==="official"||F.kind==="openai-compatible"?null:F.kind==="aggregator"?n("settings.aiConfig.providerKind.aggregator"):F.builtin?null:n("settings.aiConfig.providerKind.custom")}function M(E,F){return F?d.getModelById(E,F)?.name||F:n("settings.aiConfig.defaultModel")}function D(){d.refreshConfigs()}return t({refresh:D}),tt(()=>{d.isInitialized?d.refreshConfigs():d.init()}),(E,F)=>{const re=We,ve=zs,de=Ke;return v(),k(Pe,null,[o(g)?(v(),k("div",kS,[f(re,{name:"i-heroicons-arrow-path",class:"h-6 w-6 animate-spin text-gray-400"})])):(v(),k("div",wS,[r("div",null,[r("h4",SS,[f(re,{name:"i-heroicons-sparkles",class:"h-4 w-4 text-violet-500"}),Y(" "+l(o(n)("settings.aiConfig.title")),1)]),o(m).length===0&&c.value.configTab?.show?(v(),Te(fi,{key:0,content:c.value.configTab?.content},null,8,["content"])):ne("",!0),r("div",CS,[o(m).length>0?(v(),k("div",IS,[(v(!0),k(Pe,null,Be(o(m),L=>(v(),k("div",{key:L.id,class:"group flex items-center justify-between px-4 py-2.5 transition-colors hover:bg-gray-100/50 dark:hover:bg-gray-700/30"},[r("div",MS,[r("div",TS,[f(re,{name:"i-heroicons-sparkles",class:"h-3.5 w-3.5"})]),r("div",AS,[r("span",$S,l(L.name),1),F[2]||(F[2]=r("span",{class:"h-3.5 w-px shrink-0 bg-gray-200 dark:bg-gray-700"},null,-1)),r("span",PS,[r("span",DS,l(S(L.provider)),1),z(L.provider)?(v(),Te(ve,{key:0,color:"neutral",variant:"subtle",size:"xs"},{default:te(()=>[Y(l(z(L.provider)),1)]),_:2},1024)):ne("",!0),F[1]||(F[1]=r("span",{class:"shrink-0"},"·",-1)),r("span",LS,l(M(L.provider,L.model)),1)])])]),r("div",RS,[f(de,{size:"xs",color:"neutral",variant:"ghost",icon:"i-heroicons-pencil-square",onClick:A=>h(L)},null,8,["onClick"]),f(de,{size:"xs",color:"error",variant:"ghost",icon:"i-heroicons-trash",onClick:A=>C(L.id)},null,8,["onClick"])])]))),128))])):(v(),k("div",ES,[f(re,{name:"i-heroicons-sparkles",class:"h-8 w-8 text-gray-300 dark:text-gray-600"}),r("p",FS,l(o(n)("settings.aiConfig.empty.title")),1),r("p",NS,l(o(n)("settings.aiConfig.empty.description")),1)])),r("div",US,[f(de,{variant:"soft",disabled:o(_),size:"sm",onClick:P},{default:te(()=>[f(re,{name:"i-heroicons-plus",class:"mr-1.5 h-3.5 w-3.5"}),Y(" "+l(o(_)?o(n)("settings.aiConfig.maxConfigs"):o(n)("settings.aiConfig.addConfig")),1)]),_:1},8,["disabled"])])])])])),f(xS,{open:x.value,"onUpdate:open":F[0]||(F[0]=L=>x.value=L),mode:w.value,config:$.value,providers:o(u),onSaved:p},null,8,["open","mode","config","providers"])],64)}}}),VS={class:"space-y-6"},HS={key:0,class:"rounded-lg border-2 border-dashed border-gray-200 py-8 text-center dark:border-gray-700"},zS={class:"text-sm text-gray-500 dark:text-gray-400"},BS={key:1},WS={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},jS={class:"space-y-5 rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},qS={class:"mb-2"},KS={class:"text-sm font-medium text-gray-900 dark:text-white"},GS={class:"text-xs text-gray-500 dark:text-gray-400"},XS={class:"flex items-center gap-3"},YS={class:"flex-1"},QS={class:"mb-1 block text-xs text-gray-400 dark:text-gray-500"},JS={class:"flex-1"},ZS={class:"mb-1 block text-xs text-gray-400 dark:text-gray-500"},eC={class:"mb-2"},tC={class:"text-sm font-medium text-gray-900 dark:text-white"},sC={class:"text-xs text-gray-500 dark:text-gray-400"},aC={class:"flex items-center gap-3"},nC={class:"flex-1"},oC={class:"mb-1 block text-xs text-gray-400 dark:text-gray-500"},rC={class:"flex-1"},iC={class:"mb-1 block text-xs text-gray-400 dark:text-gray-500"},Da="__follow__",lC=Re({__name:"AIDefaultModelTab",emits:["config-changed"],setup(e,{emit:t}){const{t:s}=Fe(),n=t,a=Ws(),{configs:i,defaultAssistant:c,fastModel:d,modelCatalog:m}=et(a);function u(C){const S=i.value.find(D=>D.id===C);if(!S)return[];if(S.customModels&&S.customModels.length>0)return S.customModels.map(D=>({label:D.name||D.id,value:D.id}));const M=m.value.filter(D=>D.providerId===S.provider&&!D.capabilities.includes("embedding")&&!D.capabilities.includes("ranking")).map(D=>({label:D.name||D.id,value:D.id}));return S.model&&!M.some(D=>D.value===S.model)&&M.unshift({label:S.model,value:S.model}),M}const y=X(()=>i.value.map(C=>({label:C.name,value:C.id}))),g=X(()=>{const C=c.value?.configId;return C?u(C):[]}),_=X({get:()=>c.value?.configId??"",set:C=>{if(!C)return;const z=u(C)[0]?.value??"";a.setDefaultAssistantModel(C,z),n("config-changed")}}),x=X({get:()=>c.value?.modelId??"",set:C=>{const S=c.value?.configId;S&&C&&(a.setDefaultAssistantModel(S,C),n("config-changed"))}}),w=X(()=>[{label:s("settings.defaultModel.fastModel.followAssistant"),value:Da},...y.value]),$=X(()=>{const C=d.value?.configId;return C?u(C):[]}),P=X(()=>d.value!==null),h=X({get:()=>d.value?.configId??Da,set:C=>{if(C===Da)a.setFastModel(null);else{const z=u(C)[0]?.value??"";a.setFastModel({configId:C,modelId:z})}n("config-changed")}}),p=X({get:()=>d.value?.modelId??"",set:C=>{const S=d.value?.configId;S&&C&&(a.setFastModel({configId:S,modelId:C}),n("config-changed"))}});return tt(()=>{a.isInitialized||a.init()}),(C,S)=>{const z=We,M=yr;return v(),k("div",VS,[o(i).length===0?(v(),k("div",HS,[f(z,{name:"i-heroicons-cpu-chip",class:"mx-auto mb-2 h-8 w-8 text-gray-300 dark:text-gray-600"}),r("p",zS,l(o(s)("settings.defaultModel.noConfigs")),1)])):(v(),k("div",BS,[r("h4",WS,[f(z,{name:"i-heroicons-cpu-chip",class:"h-4 w-4 text-violet-500"}),Y(" "+l(o(s)("settings.defaultModel.title")),1)]),r("div",jS,[r("div",null,[r("div",qS,[r("p",KS,l(o(s)("settings.defaultModel.assistantModel.label")),1),r("p",GS,l(o(s)("settings.defaultModel.assistantModel.description")),1)]),r("div",XS,[r("div",YS,[r("span",QS,l(o(s)("settings.defaultModel.selectProvider")),1),f(M,{modelValue:_.value,"onUpdate:modelValue":S[0]||(S[0]=D=>_.value=D),items:y.value,ui:{content:"z-[200]"},class:"w-full",size:"sm"},null,8,["modelValue","items"])]),r("div",JS,[r("span",ZS,l(o(s)("settings.defaultModel.selectModel")),1),g.value.length>0?(v(),Te(M,{key:0,modelValue:x.value,"onUpdate:modelValue":S[1]||(S[1]=D=>x.value=D),items:g.value,ui:{content:"z-[200]"},class:"w-full",size:"sm"},null,8,["modelValue","items"])):(v(),Te(M,{key:1,items:[],disabled:"",class:"w-full",size:"sm"}))])])]),r("div",null,[r("div",eC,[r("p",tC,l(o(s)("settings.defaultModel.fastModel.label")),1),r("p",sC,l(o(s)("settings.defaultModel.fastModel.description")),1)]),r("div",aC,[r("div",nC,[r("span",oC,l(o(s)("settings.defaultModel.selectProvider")),1),f(M,{modelValue:h.value,"onUpdate:modelValue":S[2]||(S[2]=D=>h.value=D),items:w.value,ui:{content:"z-[200]"},class:"w-full",size:"sm"},null,8,["modelValue","items"])]),r("div",rC,[r("span",iC,l(o(s)("settings.defaultModel.selectModel")),1),P.value&&$.value.length>0?(v(),Te(M,{key:0,modelValue:p.value,"onUpdate:modelValue":S[3]||(S[3]=D=>p.value=D),items:$.value,ui:{content:"z-[200]"},class:"w-full",size:"sm"},null,8,["modelValue","items"])):(v(),Te(M,{key:1,items:[],disabled:"",class:"w-full",size:"sm"}))])])])])]))])}}}),ka=Nt("prompt",()=>{const e=I(0),t=I({maxMessagesPerRequest:1e3,exportFormat:"markdown",sqlExportFormat:"csv",enableAutoSkill:!0,chartAutoMode:"suggest",searchContextBefore:2,searchContextAfter:2,contextCompression:{enabled:!0,tokenThresholdPercent:75,bufferSizePercent:20,maxToolResultPercent:50}}),s=I([]),n=I([]),a=I({});function i(){e.value++}function c(x){const{contextCompression:w,...$}=x;t.value={...t.value,...$,contextCompression:w?{...t.value.contextCompression,...w}:t.value.contextCompression},i()}function d(x){s.value.push(x)}function m(x,w){const $=s.value.findIndex(P=>P.id===x);$!==-1&&(s.value[$]={...s.value[$],...w})}function u(x){const w=s.value.findIndex($=>$.id===x);w!==-1&&s.value.splice(w,1)}function y(x){n.value.includes(x)||n.value.push(x)}function g(x,w){return a.value[`${x}:${w}`]}function _(x,w,$){a.value={...a.value,[`${x}:${w}`]:$}}return{aiConfigVersion:e,aiGlobalSettings:t,customKeywordTemplates:s,deletedPresetTemplateIds:n,thinkingLevels:a,notifyAIConfigChanged:i,updateAIGlobalSettings:c,addCustomKeywordTemplate:d,updateCustomKeywordTemplate:m,removeCustomKeywordTemplate:u,addDeletedPresetTemplateId:y,getThinkingLevel:g,setThinkingLevel:_}},{persist:!1,backendPersist:{pick:["aiGlobalSettings","customKeywordTemplates","deletedPresetTemplateIds","thinkingLevels"]}}),cC={class:"space-y-6"},dC={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},uC={class:"space-y-4 rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},mC={class:"flex items-center justify-between"},gC={class:"flex-1 pr-4"},pC={class:"text-sm font-medium text-gray-900 dark:text-white"},fC={class:"text-xs text-gray-500 dark:text-gray-400"},hC={class:"flex items-center justify-between"},vC={class:"flex-1 pr-4"},yC={class:"text-sm font-medium text-gray-900 dark:text-white"},bC={class:"text-xs text-gray-500 dark:text-gray-400"},_C={class:"flex flex-col items-end gap-1"},xC={class:"max-w-64 text-right text-xs text-gray-500 dark:text-gray-400"},kC={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},wC={class:"space-y-4 rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},SC={class:"flex items-center justify-between"},CC={class:"flex-1 pr-4"},IC={class:"text-sm font-medium text-gray-900 dark:text-white"},MC={class:"text-xs text-gray-500 dark:text-gray-400"},TC={class:"mb-2"},AC={class:"text-sm font-medium text-gray-900 dark:text-white"},$C={class:"text-xs text-gray-500 dark:text-gray-400"},PC={class:"flex items-center gap-4"},DC={class:"flex items-center gap-2"},LC={class:"text-xs text-gray-500 dark:text-gray-400"},RC={class:"flex items-center gap-2"},EC={class:"text-xs text-gray-500 dark:text-gray-400"},FC={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},NC={class:"space-y-4 rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},UC={class:"flex items-center justify-between"},OC={class:"flex-1 pr-4"},VC={class:"text-sm font-medium text-gray-900 dark:text-white"},HC={class:"text-xs text-gray-500 dark:text-gray-400"},zC={class:"flex items-center justify-between"},BC={class:"flex-1 pr-4"},WC={class:"text-sm font-medium text-gray-900 dark:text-white"},jC={class:"text-xs text-gray-500 dark:text-gray-400"},qC={class:"flex items-center gap-1"},KC={class:"flex items-center justify-between"},GC={class:"flex-1 pr-4"},XC={class:"text-sm font-medium text-gray-900 dark:text-white"},YC={class:"text-xs text-gray-500 dark:text-gray-400"},QC={class:"flex items-center gap-1"},JC={class:"flex items-center justify-between"},ZC={class:"flex-1 pr-4"},eI={class:"text-sm font-medium text-gray-900 dark:text-white"},tI={class:"text-xs text-gray-500 dark:text-gray-400"},sI={class:"flex items-center gap-1"},aI=Re({__name:"AIPromptConfigTab",props:{setSectionRef:{type:Function}},emits:["config-changed"],setup(e,{emit:t}){const{t:s}=Fe(),n=ka(),{aiGlobalSettings:a}=et(n),i=e,c=t;function d(C,S){i.setSectionRef?.(C,S)}const m=X({get:()=>a.value.maxMessagesPerRequest,set:C=>{const S=Math.max(0,Math.min(5e4,C||1e3));n.updateAIGlobalSettings({maxMessagesPerRequest:S}),c("config-changed")}}),u=X({get:()=>a.value.enableAutoSkill??!0,set:C=>{n.updateAIGlobalSettings({enableAutoSkill:C}),c("config-changed")}}),y=X(()=>[{label:s("settings.aiPrompt.chatPreferences.chartAutoMode.explicit"),value:"explicit"},{label:s("settings.aiPrompt.chatPreferences.chartAutoMode.suggest"),value:"suggest"},{label:s("settings.aiPrompt.chatPreferences.chartAutoMode.aggressive"),value:"aggressive"}]),g=X({get:()=>a.value.chartAutoMode??"suggest",set:C=>{n.updateAIGlobalSettings({chartAutoMode:C}),c("config-changed")}}),_=X(()=>s(`settings.aiPrompt.chatPreferences.chartAutoMode.${g.value}Hint`)),x=X({get:()=>a.value.searchContextBefore??3,set:C=>{const S=Math.max(0,Math.min(20,C??3));n.updateAIGlobalSettings({searchContextBefore:S}),c("config-changed")}}),w=X({get:()=>a.value.searchContextAfter??3,set:C=>{const S=Math.max(0,Math.min(20,C??3));n.updateAIGlobalSettings({searchContextAfter:S}),c("config-changed")}}),$=X({get:()=>a.value.contextCompression?.enabled??!1,set:C=>{n.updateAIGlobalSettings({contextCompression:{...a.value.contextCompression,enabled:C}}),c("config-changed")}}),P=X({get:()=>a.value.contextCompression?.tokenThresholdPercent??75,set:C=>{const S=Math.max(30,Math.min(95,C||75));n.updateAIGlobalSettings({contextCompression:{...a.value.contextCompression,tokenThresholdPercent:S}}),c("config-changed")}}),h=X({get:()=>a.value.contextCompression?.bufferSizePercent??20,set:C=>{const S=Math.max(5,Math.min(50,C||20));n.updateAIGlobalSettings({contextCompression:{...a.value.contextCompression,bufferSizePercent:S}}),c("config-changed")}}),p=X({get:()=>a.value.contextCompression?.maxToolResultPercent??50,set:C=>{const S=Math.max(10,Math.min(80,C||50));n.updateAIGlobalSettings({contextCompression:{...a.value.contextCompression,maxToolResultPercent:S}}),c("config-changed")}});return(C,S)=>{const z=We,M=xs,D=_s,E=gn;return v(),k("div",cC,[r("div",{ref:F=>d("skill",F)},[r("h4",dC,[f(z,{name:"i-heroicons-bolt",class:"h-4 w-4 text-amber-500"}),Y(" "+l(o(s)("settings.aiPrompt.chatPreferences.title")),1)]),r("div",uC,[r("div",mC,[r("div",gC,[r("p",pC,l(o(s)("settings.aiPrompt.chatPreferences.enableAutoSkill")),1),r("p",fC,l(o(s)("settings.aiPrompt.chatPreferences.enableAutoSkillDesc")),1)]),f(M,{modelValue:u.value,"onUpdate:modelValue":S[0]||(S[0]=F=>u.value=F)},null,8,["modelValue"])]),r("div",hC,[r("div",vC,[r("p",yC,l(o(s)("settings.aiPrompt.chatPreferences.chartAutoMode.title")),1),r("p",bC,l(o(s)("settings.aiPrompt.chatPreferences.chartAutoMode.description")),1)]),r("div",_C,[f(D,{modelValue:g.value,"onUpdate:modelValue":S[1]||(S[1]=F=>g.value=F),items:y.value,disabled:!u.value,size:"xs"},null,8,["modelValue","items","disabled"]),r("p",xC,l(_.value),1)])])])],512),r("div",{ref:F=>d("chat",F)},[r("h4",kC,[f(z,{name:"i-heroicons-chat-bubble-left-right",class:"h-4 w-4 text-green-500"}),Y(" "+l(o(s)("settings.aiPrompt.chatSettings.title")),1)]),r("div",wC,[r("div",SC,[r("div",CC,[r("p",IC,l(o(s)("settings.aiPrompt.maxMessages.title")),1),r("p",MC,l(o(s)("settings.aiPrompt.maxMessages.description")),1)]),f(E,{modelValue:m.value,"onUpdate:modelValue":S[2]||(S[2]=F=>m.value=F),min:0,max:5e4,class:"w-30"},null,8,["modelValue"])]),r("div",null,[r("div",TC,[r("p",AC,l(o(s)("settings.aiPrompt.searchContext.title")),1),r("p",$C,l(o(s)("settings.aiPrompt.searchContext.description")),1)]),r("div",PC,[r("div",DC,[r("span",LC,l(o(s)("settings.aiPrompt.searchContext.before")),1),f(E,{modelValue:x.value,"onUpdate:modelValue":S[3]||(S[3]=F=>x.value=F),min:0,max:20,class:"w-24"},null,8,["modelValue"])]),r("div",RC,[r("span",EC,l(o(s)("settings.aiPrompt.searchContext.after")),1),f(E,{modelValue:w.value,"onUpdate:modelValue":S[4]||(S[4]=F=>w.value=F),min:0,max:20,class:"w-24"},null,8,["modelValue"])])])])])],512),r("div",{ref:F=>d("compression",F)},[r("h4",FC,[f(z,{name:"i-heroicons-archive-box-arrow-down",class:"h-4 w-4 text-purple-500"}),Y(" "+l(o(s)("settings.aiPrompt.compression.title")),1)]),r("div",NC,[r("div",UC,[r("div",OC,[r("p",VC,l(o(s)("settings.aiPrompt.compression.enable")),1),r("p",HC,l(o(s)("settings.aiPrompt.compression.enableDesc")),1)]),f(M,{modelValue:$.value,"onUpdate:modelValue":S[5]||(S[5]=F=>$.value=F)},null,8,["modelValue"])]),r("div",zC,[r("div",BC,[r("p",WC,l(o(s)("settings.aiPrompt.compression.maxToolResultPercent")),1),r("p",jC,l(o(s)("settings.aiPrompt.compression.maxToolResultPercentDesc")),1)]),r("div",qC,[f(E,{modelValue:p.value,"onUpdate:modelValue":S[6]||(S[6]=F=>p.value=F),min:10,max:80,class:"w-24"},null,8,["modelValue"]),S[9]||(S[9]=r("span",{class:"text-xs text-gray-400"},"%",-1))])]),$.value?(v(),k(Pe,{key:0},[r("div",KC,[r("div",GC,[r("p",XC,l(o(s)("settings.aiPrompt.compression.threshold")),1),r("p",YC,l(o(s)("settings.aiPrompt.compression.thresholdDesc")),1)]),r("div",QC,[f(E,{modelValue:P.value,"onUpdate:modelValue":S[7]||(S[7]=F=>P.value=F),min:30,max:95,class:"w-24"},null,8,["modelValue"]),S[10]||(S[10]=r("span",{class:"text-xs text-gray-400"},"%",-1))])]),r("div",JC,[r("div",ZC,[r("p",eI,l(o(s)("settings.aiPrompt.compression.buffer")),1),r("p",tI,l(o(s)("settings.aiPrompt.compression.bufferDesc")),1)]),r("div",sI,[f(E,{modelValue:h.value,"onUpdate:modelValue":S[8]||(S[8]=F=>h.value=F),min:5,max:50,class:"w-24"},null,8,["modelValue"]),S[11]||(S[11]=r("span",{class:"text-xs text-gray-400"},"%",-1))])])],64)):ne("",!0)])],512)])}}}),nI={class:"space-y-6"},oI={class:"mb-1 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},rI={class:"text-xs text-gray-500 dark:text-gray-400"},iI={class:"space-y-3 rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},lI={class:"flex items-center justify-between"},cI={class:"flex-1 pr-4"},dI={class:"text-sm font-medium text-gray-900 dark:text-white"},uI={class:"text-xs text-gray-500 dark:text-gray-400"},mI={class:"flex items-center justify-between"},gI={class:"flex-1 pr-4"},pI={class:"text-sm font-medium text-gray-900 dark:text-white"},fI={class:"text-xs text-gray-500 dark:text-gray-400"},hI={key:0,class:"ml-6 flex items-center justify-between"},vI={class:"text-xs text-gray-500 dark:text-gray-400"},yI={class:"flex items-center justify-between"},bI={class:"flex-1 pr-4"},_I={class:"text-sm font-medium text-gray-900 dark:text-white"},xI={class:"text-xs text-gray-500 dark:text-gray-400"},kI={class:"flex items-center justify-between"},wI={class:"flex-1 pr-4"},SI={class:"text-sm font-medium text-gray-900 dark:text-white"},CI={class:"text-xs text-gray-500 dark:text-gray-400"},II={class:"flex items-center justify-between"},MI={class:"flex-1 pr-4"},TI={class:"text-sm font-medium text-gray-900 dark:text-white"},AI={class:"text-xs text-gray-500 dark:text-gray-400"},$I={key:1,class:"ml-4 space-y-3"},PI={key:0},DI={class:"mb-2 flex items-center justify-between gap-3"},LI={class:"text-xs font-medium text-gray-500 dark:text-gray-400"},RI={class:"space-y-2"},EI={class:"flex items-center gap-2 px-2.5 py-2"},FI=["onClick"],NI={class:"min-w-0 flex-1"},UI={class:"block truncate text-xs font-medium text-gray-700 dark:text-gray-200"},OI={key:0,class:"block truncate text-[10px] text-gray-400"},VI={class:"shrink-0 text-[10px] text-gray-400"},HI={key:0,class:"border-t border-gray-100 px-2 py-1.5 dark:border-gray-800"},zI=["checked","onChange"],BI={class:"flex-1 text-xs text-gray-700 dark:text-gray-300"},WI={key:0,class:"shrink-0 text-[10px] text-gray-400"},jI={class:"mb-2 text-xs font-medium text-gray-500 dark:text-gray-400"},qI={key:0,class:"mb-2 space-y-1.5"},KI=["checked","onChange"],GI={class:"flex-1 text-xs text-gray-700 dark:text-gray-300"},XI=["title"],YI={class:"space-y-3 rounded-md border border-dashed border-gray-300 p-3 dark:border-gray-600"},QI={class:"text-xs font-medium text-gray-500 dark:text-gray-400"},JI={class:"grid grid-cols-[auto_1fr] items-center gap-x-3 gap-y-2"},ZI={class:"text-[11px] text-gray-500 dark:text-gray-400 whitespace-nowrap"},eM={class:"text-[11px] text-gray-500 dark:text-gray-400 whitespace-nowrap"},tM={key:0,class:"mt-1 text-xs text-red-500"},sM={class:"text-[11px] text-gray-500 dark:text-gray-400 whitespace-nowrap"},aM={class:"mb-2 text-sm font-medium text-gray-900 dark:text-white"},nM={class:"mb-3 text-xs text-gray-500 dark:text-gray-400"},oM={class:"mb-3 flex gap-2"},rM={key:0,class:"flex flex-wrap gap-2"},iM=Re({__name:"AIPreprocessTab",setup(e){const{t,te:s}=Fe(),n=ts(),{aiPreprocessConfig:a}=et(n);tt(()=>n.ensureDesensitizeRules());const i=I(""),c=I({}),d=["credentials","global_contact","global_financial","global_network","region_cn","region_us","region_jp","region_kr"];function m(){const L=i.value.trim();if(L){if(a.value.blacklistKeywords.includes(L)){i.value="";return}a.value.blacklistKeywords.push(L),i.value=""}}function u(L){a.value.blacklistKeywords.splice(L,1)}const y=X(()=>a.value.desensitizeRules.filter(L=>L.builtin)),g=X(()=>a.value.desensitizeRules.filter(L=>!L.builtin)),_=X(()=>{const L=new Map;for(const A of y.value){const G=A.group??"global_contact";L.set(G,[...L.get(G)??[],A])}return d.map(A=>({id:A,rules:L.get(A)??[]})).filter(A=>A.rules.length>0)}),x=I({name:"",pattern:"",replacement:""}),w=I("");function $(L){const A=`settings.desensitize.rules.${L.id}`;return s(A)?t(A):L.label}function P(L){const A=`settings.desensitize.rules.${L.id}_desc`;return s(A)?t(A):""}function h(L){const A=`settings.desensitize.groups.${L}`;return s(A)?t(A):L}function p(L){const A=`settings.desensitize.groups.${L}_desc`;return s(A)?t(A):""}function C(L){return c.value[L]??!1}function S(L){c.value={...c.value,[L]:!C(L)}}function z(L){const A=L.filter(G=>G.enabled).length;return{checked:L.length>0&&A===L.length,indeterminate:A>0&&A<L.length}}function M(L,A){a.value.desensitizeBuiltinRuleOverrides={...a.value.desensitizeBuiltinRuleOverrides??{},[L]:A}}function D(L){const A=a.value.desensitizeRules.find(G=>G.id===L);A&&(A.enabled=!A.enabled,A.builtin&&M(A.id,A.enabled))}function E(L,A){L.enabled=A,L.builtin&&M(L.id,A)}function F(L,A){for(const G of L)E(G,A)}function re(){const L={...a.value.desensitizeBuiltinRuleOverrides??{}};for(const A of y.value)delete L[A.id],A.enabled=!0;a.value.desensitizeBuiltinRuleOverrides=L}function ve(){const L=x.value.name.trim(),A=x.value.pattern.trim(),G=x.value.replacement.trim();if(!(!L||!A||!G)){try{new RegExp(A),w.value=""}catch{w.value=t("settings.aiPreprocess.desensitizeRuleInvalidRegex");return}a.value.desensitizeRules.push({id:`custom_${Date.now()}_${Math.random().toString(36).slice(2,6)}`,label:L,pattern:A,replacement:G,enabled:!0,builtin:!1,locales:[]}),x.value={name:"",pattern:"",replacement:""}}}function de(L){const A=a.value.desensitizeRules.findIndex(G=>G.id===L);A!==-1&&a.value.desensitizeRules.splice(A,1)}return(L,A)=>{const G=We,J=xs,ue=gn,W=fa,V=Ke,H=ut,ae=zs;return v(),k("div",nI,[r("div",null,[r("h4",oI,[f(G,{name:"i-heroicons-funnel",class:"h-4 w-4 text-amber-500"}),Y(" "+l(o(t)("settings.aiPreprocess.title")),1)]),r("p",rI,l(o(t)("settings.aiPreprocess.description")),1)]),r("div",iI,[r("div",lI,[r("div",cI,[r("p",dI,l(o(t)("settings.aiPreprocess.dataCleaning")),1),r("p",uI,l(o(t)("settings.aiPreprocess.dataCleaningDesc")),1)]),f(J,{modelValue:o(a).dataCleaning,"onUpdate:modelValue":A[0]||(A[0]=K=>o(a).dataCleaning=K)},null,8,["modelValue"])]),r("div",mI,[r("div",gI,[r("p",pI,l(o(t)("settings.aiPreprocess.mergeConsecutive")),1),r("p",fI,l(o(t)("settings.aiPreprocess.mergeConsecutiveDesc")),1)]),f(J,{modelValue:o(a).mergeConsecutive,"onUpdate:modelValue":A[1]||(A[1]=K=>o(a).mergeConsecutive=K)},null,8,["modelValue"])]),o(a).mergeConsecutive?(v(),k("div",hI,[r("p",vI,l(o(t)("settings.aiPreprocess.mergeWindow")),1),f(ue,{modelValue:o(a).mergeWindowSeconds,"onUpdate:modelValue":A[2]||(A[2]=K=>o(a).mergeWindowSeconds=K),min:30,max:600,step:30,class:"w-28"},null,8,["modelValue"])])):ne("",!0),r("div",yI,[r("div",bI,[r("p",_I,l(o(t)("settings.aiPreprocess.denoise")),1),r("p",xI,l(o(t)("settings.aiPreprocess.denoiseDesc")),1)]),f(J,{modelValue:o(a).denoise,"onUpdate:modelValue":A[3]||(A[3]=K=>o(a).denoise=K)},null,8,["modelValue"])]),r("div",kI,[r("div",wI,[r("p",SI,l(o(t)("settings.aiPreprocess.anonymizeNames")),1),r("p",CI,l(o(t)("settings.aiPreprocess.anonymizeNamesDesc")),1)]),f(J,{modelValue:o(a).anonymizeNames,"onUpdate:modelValue":A[4]||(A[4]=K=>o(a).anonymizeNames=K)},null,8,["modelValue"])]),r("div",II,[r("div",MI,[r("p",TI,l(o(t)("settings.aiPreprocess.desensitize")),1),r("p",AI,l(o(t)("settings.aiPreprocess.desensitizeDesc")),1)]),f(J,{modelValue:o(a).desensitize,"onUpdate:modelValue":A[5]||(A[5]=K=>o(a).desensitize=K)},null,8,["modelValue"])]),o(a).desensitize?(v(),k("div",$I,[y.value.length>0?(v(),k("div",PI,[r("div",DI,[r("p",LI,l(o(t)("settings.aiPreprocess.desensitizeBuiltin")),1),r("button",{type:"button",class:"inline-flex items-center gap-1 text-xs font-medium text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200",onClick:re},[f(G,{name:"i-heroicons-arrow-path",class:"h-3.5 w-3.5"}),Y(" "+l(o(t)("settings.aiPreprocess.desensitizeResetBuiltin")),1)])]),r("div",RI,[(v(!0),k(Pe,null,Be(_.value,K=>(v(),k("div",{key:K.id,class:"rounded-md border border-gray-200 bg-white dark:border-gray-700 dark:bg-gray-900/40"},[r("div",EI,[f(W,{"model-value":z(K.rules).checked,indeterminate:z(K.rules).indeterminate,size:"xs","onUpdate:modelValue":ee=>F(K.rules,!!ee)},null,8,["model-value","indeterminate","onUpdate:modelValue"]),r("button",{type:"button",class:"flex min-w-0 flex-1 items-center gap-2 text-left",onClick:ee=>S(K.id)},[f(G,{name:C(K.id)?"i-heroicons-chevron-down":"i-heroicons-chevron-right",class:"h-3.5 w-3.5 shrink-0 text-gray-400"},null,8,["name"]),r("span",NI,[r("span",UI,l(h(K.id)),1),p(K.id)?(v(),k("span",OI,l(p(K.id)),1)):ne("",!0)]),r("span",VI,l(K.rules.filter(ee=>ee.enabled).length)+"/"+l(K.rules.length),1)],8,FI)]),C(K.id)?(v(),k("div",HI,[(v(!0),k(Pe,null,Be(K.rules,ee=>(v(),k("label",{key:ee.id,class:"flex cursor-pointer items-center gap-2.5 rounded-md px-2 py-1.5 hover:bg-gray-100 dark:hover:bg-gray-700/50"},[r("input",{type:"checkbox",checked:ee.enabled,class:"h-3.5 w-3.5 rounded border-gray-300 text-primary-500 focus:ring-primary-500",onChange:fe=>D(ee.id)},null,40,zI),r("span",BI,l($(ee)),1),P(ee)?(v(),k("span",WI,l(P(ee)),1)):ne("",!0)]))),128))])):ne("",!0)]))),128))])])):ne("",!0),r("div",null,[r("p",jI,l(o(t)("settings.aiPreprocess.desensitizeCustom")),1),g.value.length>0?(v(),k("div",qI,[(v(!0),k(Pe,null,Be(g.value,K=>(v(),k("div",{key:K.id,class:"flex items-center gap-2.5 rounded-md px-2 py-1.5 hover:bg-gray-100 dark:hover:bg-gray-700/50"},[r("input",{type:"checkbox",checked:K.enabled,class:"h-3.5 w-3.5 rounded border-gray-300 text-primary-500 focus:ring-primary-500",onChange:ee=>D(K.id)},null,40,KI),r("span",GI,l(K.label),1),r("code",{class:"max-w-40 shrink-0 truncate text-[10px] text-gray-400",title:K.pattern},l(K.pattern),9,XI),f(V,{icon:"i-heroicons-x-mark",variant:"ghost",size:"2xs",color:"error",onClick:ee=>de(K.id)},null,8,["onClick"])]))),128))])):ne("",!0),r("div",YI,[r("p",QI,l(o(t)("settings.aiPreprocess.desensitizeAddCustom")),1),r("div",JI,[r("label",ZI,l(o(t)("settings.aiPreprocess.desensitizeRuleName"))+": ",1),f(H,{modelValue:x.value.name,"onUpdate:modelValue":A[6]||(A[6]=K=>x.value.name=K),placeholder:o(t)("settings.aiPreprocess.desensitizeRuleNamePlaceholder"),size:"xs",class:"w-full"},null,8,["modelValue","placeholder"]),r("label",eM,l(o(t)("settings.aiPreprocess.desensitizeRulePattern"))+": ",1),r("div",null,[f(H,{modelValue:x.value.pattern,"onUpdate:modelValue":A[7]||(A[7]=K=>x.value.pattern=K),placeholder:o(t)("settings.aiPreprocess.desensitizeRulePatternPlaceholder"),size:"xs",class:"w-full font-mono"},null,8,["modelValue","placeholder"]),w.value?(v(),k("p",tM,l(w.value),1)):ne("",!0)]),r("label",sM,l(o(t)("settings.aiPreprocess.desensitizeRuleReplacement"))+": ",1),f(H,{modelValue:x.value.replacement,"onUpdate:modelValue":A[8]||(A[8]=K=>x.value.replacement=K),placeholder:o(t)("settings.aiPreprocess.desensitizeRuleReplacementPlaceholder"),size:"xs",class:"w-full"},null,8,["modelValue","placeholder"])]),f(V,{size:"xs",variant:"soft",block:"",disabled:!x.value.name.trim()||!x.value.pattern.trim()||!x.value.replacement.trim(),onClick:ve},{default:te(()=>[Y(l(o(t)("settings.aiPreprocess.desensitizeRuleAdd")),1)]),_:1},8,["disabled"])])])])):ne("",!0)]),r("div",null,[r("h4",aM,l(o(t)("settings.aiPreprocess.blacklist")),1),r("p",nM,l(o(t)("settings.aiPreprocess.blacklistDesc")),1),r("div",oM,[f(H,{modelValue:i.value,"onUpdate:modelValue":A[9]||(A[9]=K=>i.value=K),placeholder:o(t)("settings.aiPreprocess.blacklistPlaceholder"),class:"flex-1",size:"sm",onKeydown:$s(Ps(m,["prevent"]),["enter"])},null,8,["modelValue","placeholder","onKeydown"]),f(V,{size:"sm",variant:"soft",disabled:!i.value.trim(),onClick:m},{default:te(()=>[Y(l(o(t)("settings.aiPreprocess.blacklistAdd")),1)]),_:1},8,["disabled"])]),o(a).blacklistKeywords.length>0?(v(),k("div",rM,[(v(!0),k(Pe,null,Be(o(a).blacklistKeywords,(K,ee)=>(v(),Te(ae,{key:K,variant:"subtle",color:"error",class:"cursor-pointer",onClick:fe=>u(ee)},{default:te(()=>[Y(l(K)+" ",1),f(G,{name:"i-heroicons-x-mark",class:"ml-1 h-3 w-3"})]),_:2},1032,["onClick"]))),128))])):ne("",!0)])])}}}),lM={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},cM={class:"space-y-4 rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},dM={class:"flex items-center justify-between"},uM={class:"flex-1 pr-4"},mM={class:"text-sm font-medium text-gray-900 dark:text-white"},gM={class:"text-xs text-gray-500 dark:text-gray-400"},pM={class:"flex items-center justify-between"},fM={class:"flex-1 pr-4"},hM={class:"text-sm font-medium text-gray-900 dark:text-white"},vM={class:"text-xs text-gray-500 dark:text-gray-400"},yM=Re({__name:"AIExportSettingsTab",emits:["config-changed"],setup(e,{emit:t}){const{t:s}=Fe(),n=t,a=ka(),{aiGlobalSettings:i}=et(a),c=X(()=>[{label:"Markdown",value:"markdown"},{label:s("settings.aiPrompt.exportFormat.txtLabel"),value:"txt"}]),d=X({get:()=>i.value.exportFormat??"markdown",set:y=>{a.updateAIGlobalSettings({exportFormat:y}),n("config-changed")}}),m=X(()=>[{label:"CSV",value:"csv"},{label:"JSON",value:"json"}]),u=X({get:()=>i.value.sqlExportFormat??"csv",set:y=>{a.updateAIGlobalSettings({sqlExportFormat:y}),n("config-changed")}});return(y,g)=>{const _=We,x=_s;return v(),k("div",null,[r("h4",lM,[f(_,{name:"i-heroicons-arrow-down-tray",class:"h-4 w-4 text-blue-500"}),Y(" "+l(o(s)("settings.aiPrompt.exportSettings.title")),1)]),r("div",cM,[r("div",dM,[r("div",uM,[r("p",mM,l(o(s)("settings.aiPrompt.exportFormat.title")),1),r("p",gM,l(o(s)("settings.aiPrompt.exportFormat.description")),1)]),f(x,{modelValue:d.value,"onUpdate:modelValue":g[0]||(g[0]=w=>d.value=w),items:c.value,size:"xs"},null,8,["modelValue","items"])]),r("div",pM,[r("div",fM,[r("p",hM,l(o(s)("settings.aiPrompt.sqlExportFormat.title")),1),r("p",vM,l(o(s)("settings.aiPrompt.sqlExportFormat.description")),1)]),f(x,{modelValue:u.value,"onUpdate:modelValue":g[1]||(g[1]=w=>u.value=w),items:m.value,size:"xs"},null,8,["modelValue","items"])])])])}}}),bM={class:"space-y-3"},_M={class:"flex items-center justify-between"},xM={class:"flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},kM={class:"mt-0.5 text-xs text-gray-500 dark:text-gray-400"},wM={class:"flex items-center justify-between rounded-lg border border-gray-200 bg-gray-50 px-4 py-3 dark:border-gray-700 dark:bg-gray-800/50"},SM={class:"text-sm text-gray-700 dark:text-gray-300"},CM={class:"text-xs text-gray-400"},IM={class:"flex items-center justify-between rounded-lg border border-gray-200 bg-gray-50 px-4 py-3 dark:border-gray-700 dark:bg-gray-800/50"},MM={class:"text-sm text-gray-700 dark:text-gray-300"},TM={class:"text-xs text-gray-400"},AM={class:"flex items-center gap-2"},$M={class:"text-xs text-gray-500"},PM={class:"rounded-lg border border-gray-200 bg-gray-50 px-4 py-3 dark:border-gray-700 dark:bg-gray-800/50"},DM={class:"flex items-center justify-between"},LM={class:"text-sm text-gray-700 dark:text-gray-300"},RM={key:0,class:"mt-1 flex items-center gap-3 text-xs"},EM={class:"text-gray-500"},FM={class:"text-green-600 dark:text-green-400"},NM={key:0,class:"text-amber-600 dark:text-amber-400"},UM={key:1,class:"mt-1 flex items-center gap-1 text-xs text-gray-400"},OM={class:"flex items-center gap-2"},VM={key:0,class:"mt-3 space-y-2"},HM={class:"flex items-center justify-between text-xs"},zM={class:"text-gray-500"},BM={class:"font-medium text-gray-700 dark:text-gray-300"},WM={class:"p-5"},jM={class:"mb-4 flex items-center gap-3"},qM={class:"flex h-10 w-10 items-center justify-center rounded-full bg-red-100 dark:bg-red-900/30"},KM={class:"text-lg font-semibold text-gray-900 dark:text-white"},GM={class:"space-y-3 text-sm text-gray-600 dark:text-gray-400"},XM={class:"rounded-lg border border-red-200 bg-red-50 p-3 dark:border-red-800/50 dark:bg-red-900/20"},YM={class:"text-xs text-red-700 dark:text-red-400"},QM={class:"mt-5 flex justify-end gap-2"},JM=30,ZM=Re({__name:"SessionIndexSection",setup(e){const{t}=Fe(),s=I(JM),n=I("standard"),a=X(()=>[{label:t("settings.ai.session.summaryBrief"),value:"brief"},{label:t("settings.ai.session.summaryStandard"),value:"standard"}]),i=I([]),c=I(!1),d=I(!1),m=I({current:0,total:0,currentName:""}),u=I(!1),y=X(()=>{const M=i.value.length,D=i.value.filter(F=>F.hasIndex).length,E=M-D;return{total:M,generated:D,notGenerated:E}}),g=X(()=>m.value.total===0?0:Math.round(m.value.current/m.value.total*100));function _(){s.value<1&&(s.value=1),s.value>1440&&(s.value=1440),To({session_gap_threshold:s.value*60})}function x(){const M=rs();s.value=Math.round(M/60)}function w(M){n.value=M,To({summary_strategy:M})}async function $(){c.value=!0;try{const[M,D]=await Promise.all([kt().getSessions(),dt().getAllIndexStats()]),E=new Map(D.map(F=>[F.sessionId,F]));i.value=M.map(F=>{const re=E.get(F.id);return{id:F.id,name:F.name,hasIndex:re?.hasIndex??!1,sessionCount:re?.sessionCount??0}})}catch(M){console.error("加载会话索引状态失败:",M)}finally{c.value=!1}}async function P(){const M=i.value.filter(E=>!E.hasIndex);if(M.length===0)return;d.value=!0,m.value={current:0,total:M.length,currentName:""};const D=s.value*60;for(let E=0;E<M.length;E++){const F=M[E];m.value={current:E,total:M.length,currentName:F.name};try{const re=await dt().generate(F.id,D),ve=i.value.find(de=>de.id===F.id);ve&&(ve.hasIndex=!0,ve.sessionCount=re)}catch(re){console.error(`生成会话 ${F.name} 索引失败:`,re)}}m.value={current:M.length,total:M.length,currentName:""},d.value=!1}function h(){u.value=!1,p()}async function p(){if(i.value.length===0)return;d.value=!0,m.value={current:0,total:i.value.length,currentName:""};const M=s.value*60;for(let D=0;D<i.value.length;D++){const E=i.value[D];m.value={current:D,total:i.value.length,currentName:E.name};try{const F=await dt().generate(E.id,M);E.hasIndex=!0,E.sessionCount=F}catch(F){console.error(`生成会话 ${E.name} 索引失败:`,F)}}m.value={current:i.value.length,total:i.value.length,currentName:""},d.value=!1}const C=I(null);let S=null,z=!1;return tt(()=>{x(),n.value=In(),S=new IntersectionObserver(M=>{M[0]?.isIntersecting&&!z&&(z=!0,$(),S?.disconnect())},{threshold:.1}),C.value&&S.observe(C.value)}),Qt(()=>{S?.disconnect()}),(M,D)=>{const E=We,F=Ke,re=ut,ve=br,de=mt;return v(),k("div",{ref_key:"sectionRef",ref:C,class:"space-y-6"},[r("div",bM,[r("div",_M,[r("div",null,[r("h3",xM,[f(E,{name:"i-heroicons-clock",class:"h-4 w-4 text-blue-500"}),Y(" "+l(o(t)("settings.ai.session.title")),1)]),r("p",kM,l(o(t)("settings.ai.session.description")),1)]),f(F,{icon:"i-heroicons-arrow-path",variant:"ghost",size:"xs",loading:c.value,onClick:$},null,8,["loading"])]),r("div",wM,[r("div",null,[r("span",SM,l(o(t)("settings.ai.session.summaryStrategy")),1),r("p",CM,l(o(t)("settings.ai.session.summaryStrategyHelp")),1)]),f(Vt,{"model-value":n.value,items:a.value,size:"xs","onUpdate:modelValue":w},null,8,["model-value","items"])]),r("div",IM,[r("div",null,[r("span",MM,l(o(t)("settings.ai.session.defaultThreshold")),1),r("p",TM,l(o(t)("settings.ai.session.thresholdHelp")),1)]),r("div",AM,[f(re,{modelValue:s.value,"onUpdate:modelValue":D[0]||(D[0]=L=>s.value=L),modelModifiers:{number:!0},type:"number",min:1,max:1440,size:"xs",class:"w-20",onBlur:_},null,8,["modelValue"]),r("span",$M,l(o(t)("settings.ai.session.thresholdUnit")),1)])]),r("div",PM,[r("div",DM,[r("div",null,[r("span",LM,l(o(t)("settings.ai.session.batchTitle")),1),c.value?(v(),k("div",UM,[f(E,{name:"i-heroicons-arrow-path",class:"h-3 w-3 animate-spin"}),Y(" "+l(o(t)("settings.ai.session.loadingStatus")),1)])):(v(),k("div",RM,[r("span",EM,l(o(t)("settings.ai.session.totalSessions",{count:y.value.total})),1),r("span",FM,l(o(t)("settings.ai.session.generatedCount",{count:y.value.generated})),1),y.value.notGenerated>0?(v(),k("span",NM,l(o(t)("settings.ai.session.notGeneratedCount",{count:y.value.notGenerated})),1)):ne("",!0)]))]),r("div",OM,[y.value.notGenerated>0?(v(),Te(F,{key:0,size:"xs",color:"primary",loading:d.value,disabled:c.value,onClick:P},{default:te(()=>[d.value?ne("",!0):(v(),Te(E,{key:0,name:"i-heroicons-sparkles",class:"mr-1 h-3 w-3"})),Y(" "+l(o(t)("settings.ai.session.batchGenerate")),1)]),_:1},8,["loading","disabled"])):ne("",!0),f(F,{size:"xs",variant:"soft",loading:d.value,disabled:c.value||y.value.total===0,onClick:D[1]||(D[1]=L=>u.value=!0)},{default:te(()=>[d.value?ne("",!0):(v(),Te(E,{key:0,name:"i-heroicons-arrow-path",class:"mr-1 h-3 w-3"})),Y(" "+l(o(t)("settings.ai.session.batchRegenerate")),1)]),_:1},8,["loading","disabled"])])]),d.value?(v(),k("div",VM,[r("div",HM,[r("span",zM,l(o(t)("settings.ai.session.generating"))+" "+l(m.value.currentName),1),r("span",BM,l(m.value.current)+"/"+l(m.value.total)+" ("+l(g.value)+"%) ",1)]),f(ve,{value:g.value,size:"sm"},null,8,["value"])])):ne("",!0)])]),f(de,{open:u.value,"onUpdate:open":D[3]||(D[3]=L=>u.value=L),ui:{content:"z-[101]",overlay:"z-[100]"}},{content:te(()=>[r("div",WM,[r("div",jM,[r("div",qM,[f(E,{name:"i-heroicons-exclamation-triangle",class:"h-5 w-5 text-red-600 dark:text-red-400"})]),r("h3",KM,l(o(t)("settings.ai.session.batchRegenerateConfirmTitle")),1)]),r("div",GM,[r("p",null,l(o(t)("settings.ai.session.batchRegenerateConfirmMessage")),1),r("div",XM,[r("p",YM,l(o(t)("settings.ai.session.batchRegenerateConfirmWarning")),1)])]),r("div",QM,[f(F,{variant:"ghost",onClick:D[2]||(D[2]=L=>u.value=!1)},{default:te(()=>[Y(l(o(t)("common.cancel")),1)]),_:1}),f(F,{color:"error",onClick:h},{default:te(()=>[Y(l(o(t)("settings.ai.session.batchRegenerate")),1)]),_:1})])])]),_:1},8,["open"])],512)}}}),eT={class:"flex max-h-[80vh] flex-col p-5"},tT={class:"mb-3 text-base font-semibold text-gray-900 dark:text-white"},sT={class:"mb-3 flex items-center gap-2"},aT={key:0,class:"mb-2 rounded border border-amber-200 bg-amber-50 px-2 py-1.5 text-xs text-amber-700 dark:border-amber-800/50 dark:bg-amber-900/20 dark:text-amber-400"},nT={key:1,class:"flex items-center gap-2 py-8 text-sm text-gray-400"},oT={key:2,class:"min-h-0 flex-1 space-y-1 overflow-y-auto"},rT={class:"min-w-0 flex-1"},iT={class:"truncate text-sm text-gray-800 dark:text-gray-200"},lT={class:"flex items-center gap-2 text-xs text-gray-400"},cT={key:0,class:"text-blue-500"},dT={class:"mt-3 flex items-center justify-between border-t border-gray-200 pt-3 dark:border-gray-700"},uT={class:"text-xs text-gray-500"},mT={class:"flex gap-2"},gT={class:"p-5"},pT={class:"mb-3 text-base font-semibold text-gray-900 dark:text-white"},fT={class:"mb-3 text-sm text-gray-600 dark:text-gray-400"},hT={class:"mb-4 max-h-32 overflow-y-auto rounded border border-gray-200 p-2 text-xs text-gray-500 dark:border-gray-700"},vT={class:"flex justify-end gap-2"},yT=Re({__name:"SemanticIndexConversationPicker",props:{modelValue:{type:Boolean},apiMode:{type:Boolean}},emits:["update:modelValue","saved"],setup(e,{emit:t}){const s=e,n=t,{t:a}=Fe(),i=kt(),c=gi(),d=X({get:()=>s.modelValue,set:E=>n("update:modelValue",E)}),m=I([]),u=I(!1),y=I(!1),g=I(""),_=I("all"),x=I(new Set),w=I(new Set),$=I(!1),P=X(()=>[{label:a("settings.ai.semanticIndex.picker.all"),value:"all"},{label:a("settings.ai.semanticIndex.picker.group"),value:"group"},{label:a("settings.ai.semanticIndex.picker.private"),value:"private"}]),h=X(()=>{const E=g.value.trim().toLowerCase();return m.value.filter(F=>!(_.value!=="all"&&F.type!==_.value||E&&!F.name.toLowerCase().includes(E)))}),p=X(()=>{let E=0;for(const F of m.value)x.value.has(F.id)&&(E+=F.messageCount);return{count:x.value.size,messages:E}}),C=X(()=>m.value.filter(E=>{if(!w.value.has(E.id)||x.value.has(E.id))return!1;const F=E.status;return F?F.indexStatus==="completed"||F.running||F.queued||F.indexStatus==="failed"&&F.chunkCount>0:!1}));async function S(){u.value=!0;try{const E=await i.getSessions(),F=await c.statusForSessions(E.map(de=>de.id)),re=new Map(F.map(de=>[de.sessionId,de]));m.value=E.map(de=>({id:de.id,name:de.name,type:de.type==="private"?"private":"group",messageCount:de.messageCount,status:re.get(de.id)??null}));const ve=new Set(F.filter(de=>de.enabled).map(de=>de.sessionId));w.value=new Set(ve),x.value=new Set(ve)}catch(E){console.error("[semantic-index] picker load failed:",E)}finally{u.value=!1}}function z(E){const F=new Set(x.value);F.has(E)?F.delete(E):F.add(E),x.value=F}function M(){if(C.value.length>0){$.value=!0;return}D()}async function D(){$.value=!1,y.value=!0;try{const E=[...x.value].filter(re=>!w.value.has(re)),F=[...w.value].filter(re=>!x.value.has(re));for(const re of E)await c.enable(re);for(const re of F)await c.disable(re);n("saved"),d.value=!1}catch(E){console.error("[semantic-index] picker save failed:",E)}finally{y.value=!1}}return Ue(()=>s.modelValue,E=>{E&&S()}),(E,F)=>{const re=ut,ve=yr,de=We,L=fa,A=Ke,G=mt;return v(),k(Pe,null,[f(G,{open:d.value,"onUpdate:open":F[3]||(F[3]=J=>d.value=J),ui:{content:"z-[101] max-w-2xl",overlay:"z-[100]"}},{content:te(()=>[r("div",eT,[r("h3",tT,l(o(a)("settings.ai.semanticIndex.picker.title")),1),r("div",sT,[f(re,{modelValue:g.value,"onUpdate:modelValue":F[0]||(F[0]=J=>g.value=J),icon:"i-heroicons-magnifying-glass",size:"sm",class:"flex-1",placeholder:o(a)("settings.ai.semanticIndex.picker.searchPlaceholder")},null,8,["modelValue","placeholder"]),f(ve,{modelValue:_.value,"onUpdate:modelValue":F[1]||(F[1]=J=>_.value=J),items:P.value,size:"sm",class:"w-28"},null,8,["modelValue","items"])]),e.apiMode?(v(),k("p",aT,l(o(a)("settings.ai.semanticIndex.apiCostWarning")),1)):ne("",!0),u.value?(v(),k("div",nT,[f(de,{name:"i-heroicons-arrow-path",class:"h-4 w-4 animate-spin"}),Y(" "+l(o(a)("common.loading")),1)])):(v(),k("div",oT,[(v(!0),k(Pe,null,Be(h.value,J=>(v(),k("label",{key:J.id,class:"flex cursor-pointer items-center gap-3 rounded-lg px-2 py-2 hover:bg-gray-50 dark:hover:bg-gray-800/50"},[f(L,{"model-value":x.value.has(J.id),"onUpdate:modelValue":ue=>z(J.id)},null,8,["model-value","onUpdate:modelValue"]),r("div",rT,[r("div",iT,l(J.name),1),r("div",lT,[r("span",null,l(J.type==="group"?o(a)("settings.ai.semanticIndex.picker.group"):o(a)("settings.ai.semanticIndex.picker.private")),1),r("span",null,l(o(a)("settings.ai.semanticIndex.picker.messages",{count:J.messageCount})),1),J.status?.enabled?(v(),k("span",cT,l(o(a)("settings.ai.semanticIndex.picker.enabled")),1)):ne("",!0)])])]))),128))])),r("div",dT,[r("span",uT,l(o(a)("settings.ai.semanticIndex.picker.selectedSummary",{count:p.value.count,messages:p.value.messages})),1),r("div",mT,[f(A,{variant:"ghost",onClick:F[2]||(F[2]=J=>d.value=!1)},{default:te(()=>[Y(l(o(a)("common.cancel")),1)]),_:1}),f(A,{color:"primary",loading:y.value,onClick:M},{default:te(()=>[Y(l(o(a)("common.save")),1)]),_:1},8,["loading"])])])])]),_:1},8,["open"]),f(G,{open:$.value,"onUpdate:open":F[5]||(F[5]=J=>$.value=J),ui:{content:"z-[103]",overlay:"z-[102]"}},{content:te(()=>[r("div",gT,[r("h3",pT,l(o(a)("settings.ai.semanticIndex.picker.confirmDisableTitle")),1),r("p",fT,l(o(a)("settings.ai.semanticIndex.picker.confirmDisableMessage")),1),r("ul",hT,[(v(!0),k(Pe,null,Be(C.value,J=>(v(),k("li",{key:J.id,class:"truncate"},l(J.name),1))),128))]),r("div",vT,[f(A,{variant:"ghost",onClick:F[4]||(F[4]=J=>$.value=!1)},{default:te(()=>[Y(l(o(a)("common.cancel")),1)]),_:1}),f(A,{color:"error",loading:y.value,onClick:D},{default:te(()=>[Y(l(o(a)("common.confirm")),1)]),_:1},8,["loading"])])])]),_:1},8,["open"])],64)}}}),tn=[{modelId:"onnx-community/Qwen3-Embedding-0.6B-ONNX",name:"Qwen3-Embedding-0.6B",approxMB:593,recommended:!0,zhOnly:!1},{modelId:"Xenova/bge-base-zh-v1.5",name:"BGE base zh",approxMB:390,recommended:!1,zhOnly:!0}],La=[{id:"openai-compatible",label:"OpenAI Compatible",baseUrl:"",model:""},{id:"openai",label:"OpenAI",baseUrl:"https://api.openai.com/v1",model:"text-embedding-3-small"},{id:"ollama",label:"Ollama",baseUrl:"http://localhost:11434/v1",model:"nomic-embed-text"},{id:"qwen",label:"通义千问",baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",model:"text-embedding-v3",zhOnly:!0},{id:"zhipu",label:"智谱",baseUrl:"https://open.bigmodel.cn/api/paas/v4",model:"embedding-3",zhOnly:!0},{id:"siliconflow",label:"SiliconFlow",baseUrl:"https://api.siliconflow.cn/v1",model:"BAAI/bge-m3"}];function zo(e){return(e??"").trim().replace(/\/+$/,"")}function bi(e){if(!e)return!0;try{const t=new URL(e),s=t.hostname.toLowerCase(),n=s==="localhost"||s==="127.0.0.1"||s==="::1",a=t.port||(t.protocol==="https:"?"443":"80");return!(n&&a==="11434")}catch{return!0}}function _i(e,t,s=!0){return!s||e?.mode!=="api"||!e.api?.authProfile?!1:zo(e.api.baseUrl)===zo(t)}function bT(e,t){const s=t.apiBaseUrl.trim(),n=t.apiModel.trim(),a=_i(e,s)?e?.api?.authProfile:void 0;return{version:e?.version??1,enabled:e?.enabled??!0,mode:t.mode,local:{modelId:t.localModelId},api:t.mode==="api"?{baseUrl:s,model:n,...a?{authProfile:a}:{}}:null,searchMaxResults:e?.searchMaxResults??10}}const _T={class:"space-y-4 p-5"},xT={class:"flex items-center justify-between gap-3"},kT={class:"text-base font-semibold text-gray-900 dark:text-white"},wT={key:0,class:"space-y-2"},ST={class:"grid gap-2 sm:grid-cols-2"},CT=["onClick"],IT={class:"flex w-full items-center justify-between"},MT={class:"text-sm font-medium text-gray-900 dark:text-white"},TT={class:"text-xs text-gray-500"},AT={class:"text-xs text-gray-400"},$T={key:1,class:"space-y-3"},PT={class:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-400"},DT={class:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-400"},LT={class:"rounded border border-amber-200 bg-amber-50 px-2 py-1.5 text-xs text-amber-700 dark:border-amber-800/50 dark:bg-amber-900/20 dark:text-amber-400"},RT={class:"text-xs text-gray-400"},ET={class:"flex justify-end gap-2 border-t border-gray-200 pt-3 dark:border-gray-700"},FT=Re({__name:"SemanticIndexModelModal",props:{open:{type:Boolean},config:{},apiKeySet:{type:Boolean},saving:{type:Boolean}},emits:["update:open","confirm"],setup(e,{emit:t}){const s=e,n=t,{t:a,locale:i}=Fe(),c=I("local"),d=I(tn[0].modelId),m=I("openai-compatible"),u=I(""),y=I(""),g=I(""),_=X(()=>i.value.startsWith("zh")),x=X(()=>tn.filter(D=>!D.zhOnly||_.value)),w=X(()=>La.filter(D=>!D.zhOnly||_.value||D.id===m.value)),$=X(()=>[{label:a("settings.ai.semanticIndex.modeLocal"),value:"local"},{label:a("settings.ai.semanticIndex.modeApi"),value:"api"}]),P=X(()=>_i(s.config,u.value,s.apiKeySet)),h=X(()=>bi(u.value)),p=X(()=>c.value==="local"?!!d.value:!!u.value.trim()&&!!y.value.trim()&&(!h.value||P.value||!!g.value.trim()));function C(){const D=s.config;c.value=D?.mode??"local",d.value=D?.local.modelId??"",u.value=D?.api?.baseUrl??"",y.value=D?.api?.model??"",g.value="";const E=La.find(F=>F.baseUrl===D?.api?.baseUrl);m.value=E?.id??"openai-compatible"}Ue(()=>s.open,D=>{D&&C()});function S(D){m.value=String(D);const E=La.find(F=>F.id===m.value);E&&E.id!=="openai-compatible"&&(u.value=E.baseUrl,y.value=E.model)}function z(){n("update:open",!1)}function M(){p.value&&n("confirm",{mode:c.value,localModelId:d.value,apiBaseUrl:u.value,apiModel:y.value,apiKey:g.value})}return(D,E)=>{const F=zs,re=ut,ve=Ke,de=mt;return v(),Te(de,{open:e.open,ui:{content:"z-[101] max-w-lg",overlay:"z-[100]"},"onUpdate:open":E[4]||(E[4]=L=>n("update:open",L))},{content:te(()=>[r("div",_T,[r("div",xT,[r("h3",kT,l(o(a)("settings.ai.semanticIndex.modelModalTitle")),1),f(Vt,{"model-value":c.value,items:$.value,size:"xs","onUpdate:modelValue":E[0]||(E[0]=L=>c.value=L)},null,8,["model-value","items"])]),c.value==="local"?(v(),k("div",wT,[r("div",ST,[(v(!0),k(Pe,null,Be(x.value,L=>(v(),k("button",{key:L.modelId,type:"button",class:$e(["flex flex-col items-start gap-1 rounded-lg border p-3 text-left transition",d.value===L.modelId?"border-blue-500 bg-blue-50 dark:border-blue-400 dark:bg-blue-900/20":"border-gray-200 hover:border-gray-300 dark:border-gray-700 dark:hover:border-gray-600"]),onClick:A=>d.value=L.modelId},[r("div",IT,[r("span",MT,l(L.name),1),L.recommended?(v(),Te(F,{key:0,color:"primary",variant:"soft",size:"xs"},{default:te(()=>[Y(l(o(a)("settings.ai.semanticIndex.recommended")),1)]),_:1})):ne("",!0)]),r("span",TT,l(o(a)("settings.ai.semanticIndex.approxSize",{mb:L.approxMB})),1)],10,CT))),128))]),r("p",AT,l(o(a)("settings.ai.semanticIndex.localDownloadHint")),1)])):(v(),k("div",$T,[r("div",null,[r("label",PT,l(o(a)("settings.ai.semanticIndex.apiTemplate")),1),f(Vt,{"model-value":m.value,items:w.value.map(L=>({label:L.label,value:L.id})),size:"xs","onUpdate:modelValue":S},null,8,["model-value","items"])]),r("div",null,[E[5]||(E[5]=r("label",{class:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-400"},"Base URL",-1)),f(re,{modelValue:u.value,"onUpdate:modelValue":E[1]||(E[1]=L=>u.value=L),size:"sm",class:"w-full",placeholder:"https://api.example.com/v1"},null,8,["modelValue"])]),r("div",null,[r("label",DT,l(o(a)("settings.ai.semanticIndex.modelName")),1),f(re,{modelValue:y.value,"onUpdate:modelValue":E[2]||(E[2]=L=>y.value=L),size:"sm",class:"w-full",placeholder:"text-embedding-3-small"},null,8,["modelValue"])]),f(aa,{modelValue:g.value,"onUpdate:modelValue":E[3]||(E[3]=L=>g.value=L),placeholder:P.value?o(a)("settings.ai.semanticIndex.apiKeySaved"):"",hint:o(a)("settings.ai.semanticIndex.apiKeyHint")},null,8,["modelValue","placeholder","hint"]),r("p",LT,l(o(a)("settings.ai.semanticIndex.apiCostWarning")),1)])),r("p",RT,l(o(a)("settings.ai.semanticIndex.changeRebuildHint")),1),r("div",ET,[f(ve,{variant:"ghost",disabled:e.saving,onClick:z},{default:te(()=>[Y(l(o(a)("common.cancel")),1)]),_:1},8,["disabled"]),f(ve,{color:"primary",loading:e.saving,disabled:!p.value,onClick:M},{default:te(()=>[Y(l(o(a)("common.confirm")),1)]),_:1},8,["loading","disabled"])])])]),_:1},8,["open"])}}}),NT={class:"flex items-start justify-between gap-3"},UT={class:"min-w-0"},OT={class:"flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},VT={class:"mt-0.5 text-xs text-gray-500 dark:text-gray-400"},HT={class:"space-y-2 rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},zT={class:"flex items-center justify-between gap-3"},BT={class:"min-w-0"},WT={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},jT={class:"mt-0.5 flex min-w-0 items-center gap-2 text-xs"},qT={class:"truncate text-gray-700 dark:text-gray-300"},KT={key:0,class:"truncate text-gray-400"},GT={key:1,class:"text-gray-400"},XT={key:0,class:"text-xs text-amber-500"},YT={class:"space-y-2 rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},QT={class:"flex items-center justify-between gap-3"},JT={class:"min-w-0"},ZT={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},eA={class:"mt-0.5 text-xs text-gray-500 dark:text-gray-400"},tA={class:"space-y-3 rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},sA={class:"flex items-center justify-between"},aA={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},nA={class:"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs"},oA={class:"text-gray-500"},rA={class:"text-green-600 dark:text-green-400"},iA={key:0,class:"text-blue-600 dark:text-blue-400"},lA={key:1,class:"text-gray-500"},cA={key:2,class:"text-amber-600 dark:text-amber-400"},dA={key:3,class:"text-red-600 dark:text-red-400"},uA={class:"text-gray-500"},mA={class:"flex flex-wrap items-center gap-2"},gA={key:0,class:"text-xs text-amber-500"},pA={key:0,class:"space-y-2"},fA={class:"text-xs font-medium text-gray-500"},hA={class:"min-w-0"},vA={class:"truncate text-sm text-gray-800 dark:text-gray-200"},yA={class:"flex items-center gap-2 text-xs"},bA=["title"],_A={key:0,class:"mt-1 flex items-center gap-2"},xA={class:"h-1.5 max-w-[160px] flex-1 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700"},kA={class:"shrink-0 text-[11px] text-gray-400"},wA={class:"flex shrink-0 items-center gap-1"},SA={class:"p-5"},CA={class:"mb-4 flex items-center gap-3"},IA={class:"flex h-10 w-10 items-center justify-center rounded-full bg-red-100 dark:bg-red-900/30"},MA={class:"text-lg font-semibold text-gray-900 dark:text-white"},TA={class:"text-sm text-gray-600 dark:text-gray-400"},AA={class:"mt-5 flex justify-end gap-2"},$A=Re({__name:"SemanticIndexSection",setup(e){const{t}=Fe(),s=gi(),n=I(!1),a=I(!1),i=I(!0),c=I(!1),d=I(null),m=I(Is),u=I(!1),y=X(()=>a.value&&d.value?.mode==="api"),g=X(()=>{const le=d.value;return!a.value||!le?!1:le.mode==="local"?!!le.local.modelId:!!le.api?.baseUrl&&!!le.api?.model&&(!bi(le.api.baseUrl)||n.value)}),_=X(()=>{const le=d.value;if(!a.value||!le)return null;if(le.mode==="local"){const N=tn.find(T=>T.modelId===le.local.modelId);return{type:t("settings.ai.semanticIndex.modeLocal"),name:N?.name??le.local.modelId,sub:""}}let B=le.api?.baseUrl??"";try{B=new URL(B).host}catch{}return{type:t("settings.ai.semanticIndex.modeApi"),name:le.api?.model??"",sub:B}});function x(le){return Number.isFinite(le)?Math.max(Co,Math.min(Io,Math.round(le))):Is}let w=null;function $(le){m.value=x(le??Is),w&&clearTimeout(w),w=setTimeout(()=>{const B=d.value;!B||m.value===B.searchMaxResults||re({...B,searchMaxResults:m.value})},600)}const P=I([]),h=I(new Map),p=I(!1),C=I(null),S=I(!1),z=I(!1),M=I(!1),D=I(!1),E=X(()=>{const le=P.value;let B=0,N=0,T=0,U=0,Z=0,oe=0,me=0;for(const _e of le)oe+=_e.indexedMessages,me+=_e.totalMessages,_e.needsRebuild?N++:_e.running||_e.queued||_e.indexStatus==="running"?T++:_e.indexStatus==="completed"?B++:_e.indexStatus==="failed"?Z++:U++;const pe=me>0?Math.round(oe/me*100):0;return{enabled:le.length,completed:B,needsRebuild:N,building:T,pending:U,failed:Z,indexedMessages:oe,totalMessages:me,coverage:pe}}),F=X(()=>P.value.filter(le=>!le.running&&!le.queued&&(le.needsRebuild||le.indexStatus!=="completed"||!!le.hasNewMessages)).length);async function re(le,B){c.value=!0;try{const N=await s.setConfig(le,B);return d.value=N.config,n.value=N.apiKeySet,a.value=N.configured,i.value=N.config.enabled,m.value=x(N.config.searchMaxResults??Is),await ue(),!0}catch(N){return console.error("[semantic-index] save config failed:",N),!1}finally{c.value=!1}}async function ve(le){const B=bT(d.value,le);B.searchMaxResults=x(B.searchMaxResults),await re(B,le.apiKey.trim()||void 0)&&(u.value=!1)}async function de(le){const B=d.value;!B||B.enabled===le||await re({...B,enabled:le})}const L=X(()=>P.value.some(K));let A=null;function G(){A&&(clearTimeout(A),A=null)}function J(){G(),L.value&&(A=setTimeout(async()=>{try{P.value=await s.listEnabled()}catch(le){console.error("[semantic-index] poll statuses failed:",le)}J()},1500))}async function ue(){p.value=!0;try{const[le,B]=await Promise.all([s.listEnabled(),kt().getSessions()]);P.value=le,h.value=new Map(B.map(N=>[N.id,N.name]))}catch(le){console.error("[semantic-index] load statuses failed:",le)}finally{p.value=!1}J()}async function W(le,B){C.value=B;try{await s[le](B),await ue()}catch(N){console.error(`[semantic-index] ${le} failed:`,N)}finally{C.value=null}}async function V(){S.value=!0;try{P.value=await s.buildPending(),J()}catch(le){console.error("[semantic-index] build pending failed:",le)}finally{S.value=!1}}async function H(){M.value=!1,z.value=!0;try{await s.cleanup(),await ue()}catch(le){console.error("[semantic-index] cleanup failed:",le)}finally{z.value=!1}}function ae(le){const B="settings.ai.semanticIndex.state";return le.needsRebuild?{label:t(`${B}.needsRebuild`),color:"text-amber-600 dark:text-amber-400"}:le.running||le.queued||le.indexStatus==="running"?{label:t(`${B}.building`),color:"text-blue-600 dark:text-blue-400"}:le.indexStatus==="completed"?{label:t(`${B}.completed`),color:"text-green-600 dark:text-green-400"}:le.indexStatus==="failed"?{label:t(`${B}.failed`),color:"text-red-600 dark:text-red-400"}:le.indexStatus==="paused"?{label:t(`${B}.paused`),color:"text-gray-500"}:{label:t(`${B}.pending`),color:"text-gray-500"}}function K(le){return le.running||le.queued||le.indexStatus==="running"}const ee=I(null);let fe=null,he=!1;return tt(async()=>{try{const le=await s.getConfig();d.value=le.config,n.value=le.apiKeySet,a.value=le.configured,i.value=le.config.enabled,m.value=x(le.config.searchMaxResults??Is)}catch(le){console.error("[semantic-index] load config failed:",le)}fe=new IntersectionObserver(le=>{le[0]?.isIntersecting&&!he&&(he=!0,ue(),fe?.disconnect())},{threshold:.1}),ee.value&&fe.observe(ee.value)}),Qt(()=>{fe?.disconnect(),G(),w&&clearTimeout(w)}),(le,B)=>{const N=We,T=xs,U=zs,Z=Ke,oe=gn,me=mt;return v(),k("div",{ref_key:"sectionRef",ref:ee,class:"space-y-6"},[r("div",NT,[r("div",UT,[r("h3",OT,[f(N,{name:"i-heroicons-circle-stack",class:"h-4 w-4 text-blue-500"}),Y(" "+l(o(t)("settings.ai.semanticIndex.title")),1)]),r("p",VT,l(o(t)("settings.ai.semanticIndex.description")),1)]),f(T,{"model-value":i.value,loading:c.value,class:"mt-0.5 shrink-0","onUpdate:modelValue":de},null,8,["model-value","loading"])]),i.value?(v(),k(Pe,{key:0},[r("div",HT,[r("div",zT,[r("div",BT,[r("span",WT,l(o(t)("settings.ai.semanticIndex.vectorModel")),1),r("div",jT,[_.value?(v(),k(Pe,{key:0},[f(U,{color:y.value?"neutral":"primary",variant:"soft",size:"xs"},{default:te(()=>[Y(l(_.value.type),1)]),_:1},8,["color"]),r("span",qT,l(_.value.name),1),_.value.sub?(v(),k("span",KT,l(_.value.sub),1)):ne("",!0)],64)):(v(),k("span",GT,l(o(t)("settings.ai.semanticIndex.noModelSelected")),1))])]),f(Z,{size:"xs",color:_.value?"neutral":"primary",variant:_.value?"soft":"solid",class:"shrink-0",onClick:B[0]||(B[0]=pe=>u.value=!0)},{default:te(()=>[Y(l(_.value?o(t)("settings.ai.semanticIndex.switchModel"):o(t)("settings.ai.semanticIndex.selectModel")),1)]),_:1},8,["color","variant"])]),g.value?ne("",!0):(v(),k("p",XT,l(o(t)("settings.ai.semanticIndex.configFirst")),1))]),f(FT,{open:u.value,"onUpdate:open":B[1]||(B[1]=pe=>u.value=pe),config:a.value?d.value:null,"api-key-set":n.value,saving:c.value,onConfirm:ve},null,8,["open","config","api-key-set","saving"]),g.value?(v(),k(Pe,{key:0},[r("div",YT,[r("div",QT,[r("div",JT,[r("span",ZT,l(o(t)("settings.ai.semanticIndex.searchMaxResults.label")),1),r("p",eA,l(o(t)("settings.ai.semanticIndex.searchMaxResults.hint")),1)]),f(oe,{min:o(Co),max:o(Io),"model-value":m.value,size:"sm",class:"w-28 shrink-0","onUpdate:modelValue":$},null,8,["min","max","model-value"])])]),r("div",tA,[r("div",sA,[r("span",aA,l(o(t)("settings.ai.semanticIndex.overview")),1),f(Z,{icon:"i-heroicons-arrow-path",variant:"ghost",size:"xs",loading:p.value,onClick:ue},null,8,["loading"])]),r("div",nA,[r("span",oA,l(o(t)("settings.ai.semanticIndex.enabledCount",{count:E.value.enabled})),1),r("span",rA,l(o(t)("settings.ai.semanticIndex.state.completed"))+" "+l(E.value.completed),1),E.value.building>0?(v(),k("span",iA,l(o(t)("settings.ai.semanticIndex.state.building"))+" "+l(E.value.building),1)):ne("",!0),E.value.pending>0?(v(),k("span",lA,l(o(t)("settings.ai.semanticIndex.state.pending"))+" "+l(E.value.pending),1)):ne("",!0),E.value.needsRebuild>0?(v(),k("span",cA,l(o(t)("settings.ai.semanticIndex.state.needsRebuild"))+" "+l(E.value.needsRebuild),1)):ne("",!0),E.value.failed>0?(v(),k("span",dA,l(o(t)("settings.ai.semanticIndex.state.failed"))+" "+l(E.value.failed),1)):ne("",!0),r("span",uA,l(o(t)("settings.ai.semanticIndex.coverage",{percent:E.value.coverage})),1)]),r("div",mA,[f(Z,{size:"xs",variant:"soft",icon:"i-heroicons-check-circle",onClick:B[2]||(B[2]=pe=>D.value=!0)},{default:te(()=>[Y(l(o(t)("settings.ai.semanticIndex.selectConversations")),1)]),_:1}),f(Z,{size:"xs",color:"primary",loading:S.value,disabled:!g.value||F.value===0,onClick:V},{default:te(()=>[Y(l(o(t)("settings.ai.semanticIndex.buildPending")),1)]),_:1},8,["loading","disabled"]),f(Z,{size:"xs",variant:"soft",loading:z.value,onClick:B[3]||(B[3]=pe=>M.value=!0)},{default:te(()=>[Y(l(o(t)("settings.ai.semanticIndex.cleanup")),1)]),_:1},8,["loading"]),g.value?ne("",!0):(v(),k("span",gA,l(o(t)("settings.ai.semanticIndex.configFirst")),1))])]),P.value.length>0?(v(),k("div",pA,[r("span",fA,l(o(t)("settings.ai.semanticIndex.enabledSessions")),1),(v(!0),k(Pe,null,Be(P.value,pe=>(v(),k("div",{key:pe.sessionId,class:"flex items-center justify-between rounded-lg border border-gray-200 px-3 py-2 dark:border-gray-700"},[r("div",hA,[r("div",vA,l(h.value.get(pe.sessionId)||pe.sessionId),1),r("div",yA,[r("span",{class:$e(ae(pe).color)},l(ae(pe).label),3),pe.error?(v(),k("span",{key:0,class:"truncate text-red-500",title:pe.error},l(pe.error),9,bA)):ne("",!0)]),K(pe)?(v(),k("div",_A,[r("div",xA,[r("div",{class:"h-full rounded-full bg-blue-500 transition-all duration-500",style:hs({width:`${pe.totalMessages>0?Math.round(pe.indexedMessages/pe.totalMessages*100):0}%`})},null,4)]),r("span",kA,l(pe.indexedMessages)+"/"+l(pe.totalMessages),1)])):ne("",!0)]),r("div",wA,[K(pe)?(v(),k(Pe,{key:0},[f(Z,{size:"xs",variant:"ghost",loading:C.value===pe.sessionId,onClick:_e=>W("pause",pe.sessionId)},{default:te(()=>[Y(l(o(t)("settings.ai.semanticIndex.action.pause")),1)]),_:1},8,["loading","onClick"]),f(Z,{size:"xs",variant:"ghost",color:"error",disabled:C.value===pe.sessionId,onClick:_e=>W("cancel",pe.sessionId)},{default:te(()=>[Y(l(o(t)("settings.ai.semanticIndex.action.cancel")),1)]),_:1},8,["disabled","onClick"])],64)):pe.indexStatus==="completed"&&!pe.needsRebuild?(v(),Te(Z,{key:1,size:"xs",variant:"ghost",loading:C.value===pe.sessionId,onClick:_e=>W("rebuild",pe.sessionId)},{default:te(()=>[Y(l(o(t)("settings.ai.semanticIndex.action.rebuild")),1)]),_:1},8,["loading","onClick"])):pe.needsRebuild?(v(),Te(Z,{key:2,size:"xs",variant:"ghost",loading:C.value===pe.sessionId,onClick:_e=>W("rebuild",pe.sessionId)},{default:te(()=>[Y(l(o(t)("settings.ai.semanticIndex.action.rebuild")),1)]),_:1},8,["loading","onClick"])):(v(),Te(Z,{key:3,size:"xs",variant:"ghost",loading:C.value===pe.sessionId,onClick:_e=>W("build",pe.sessionId)},{default:te(()=>[Y(l(o(t)("settings.ai.semanticIndex.action.build")),1)]),_:1},8,["loading","onClick"])),f(Z,{size:"xs",variant:"ghost",color:"neutral",disabled:C.value===pe.sessionId,onClick:_e=>W("disable",pe.sessionId)},{default:te(()=>[Y(l(o(t)("settings.ai.semanticIndex.action.disable")),1)]),_:1},8,["disabled","onClick"])])]))),128))])):ne("",!0),f(yT,{modelValue:D.value,"onUpdate:modelValue":B[4]||(B[4]=pe=>D.value=pe),"api-mode":y.value,onSaved:ue},null,8,["modelValue","api-mode"]),f(me,{open:M.value,"onUpdate:open":B[6]||(B[6]=pe=>M.value=pe),ui:{content:"z-[101]",overlay:"z-[100]"}},{content:te(()=>[r("div",SA,[r("div",CA,[r("div",IA,[f(N,{name:"i-heroicons-trash",class:"h-5 w-5 text-red-600 dark:text-red-400"})]),r("h3",MA,l(o(t)("settings.ai.semanticIndex.cleanup")),1)]),r("p",TA,l(o(t)("settings.ai.semanticIndex.cleanupConfirm")),1),r("div",AA,[f(Z,{variant:"ghost",onClick:B[5]||(B[5]=pe=>M.value=!1)},{default:te(()=>[Y(l(o(t)("common.cancel")),1)]),_:1}),f(Z,{color:"error",onClick:H},{default:te(()=>[Y(l(o(t)("settings.ai.semanticIndex.cleanup")),1)]),_:1})])])]),_:1},8,["open"])],64)):ne("",!0)],64)):ne("",!0)],512)}}});function PA(e){const t=I(e.value[0]?.id||""),s=I(!1),n=I(null),a=I({});function i(u,y){a.value[u]=y}function c(u){const y=a.value[u];y&&n.value&&(s.value=!0,y.scrollIntoView({behavior:"smooth",block:"start"}),setTimeout(()=>{s.value=!1},500))}function d(){if(s.value||!n.value)return;const u=n.value,y=u.getBoundingClientRect(),g=50;if(u.scrollHeight-u.scrollTop-u.clientHeight<5){const x=e.value[e.value.length-1];x&&(t.value=x.id);return}for(const x of e.value){const w=a.value[x.id];if(w){const $=w.getBoundingClientRect();if($.top<=y.top+g&&$.bottom>y.top+g){t.value=x.id;break}}}}tt(()=>{n.value?.addEventListener("scroll",d)}),Qt(()=>{n.value?.removeEventListener("scroll",d)});function m(u){const y=a.value[u];y&&n.value&&(s.value=!0,y.scrollIntoView({behavior:"smooth",block:"start"}),t.value=u,setTimeout(()=>{s.value=!1},500))}return{activeNav:t,scrollContainerRef:n,sectionRefs:a,setSectionRef:i,handleNavChange:c,scrollToId:m}}const DA={class:"flex h-full gap-6"},LA={class:"w-36 shrink-0"},RA={class:"space-y-8"},EA=Re({__name:"AISettingsTab",emits:["config-changed"],setup(e,{expose:t,emit:s}){const{t:n}=Fe(),a=s,i=X(()=>[{id:"model",label:n("settings.tabs.aiConfig")},{id:"defaultModel",label:n("settings.tabs.aiDefaultModel")},{id:"semanticIndex",label:n("settings.tabs.semanticIndex")},{id:"skill",label:n("settings.tabs.chatPreferences")},{id:"chat",label:n("settings.aiPrompt.chatSettings.title")},{id:"compression",label:n("settings.tabs.compression")},{id:"preprocess",label:n("settings.tabs.aiPreprocess")},{id:"sessionIndex",label:n("settings.tabs.sessionManage")},{id:"export",label:n("settings.aiPrompt.exportSettings.title")}]),{activeNav:c,scrollContainerRef:d,setSectionRef:m,handleNavChange:u,scrollToId:y}=PA(i);function g(){a("config-changed")}function _(w){y(w)}t({scrollToSection:_});const x=I(null);return x.value,(w,$)=>(v(),k("div",DA,[r("div",LA,[f(Mn,{modelValue:o(c),"onUpdate:modelValue":$[0]||($[0]=P=>rt(c)?c.value=P:null),items:i.value,orientation:"vertical",onChange:o(u)},null,8,["modelValue","items","onChange"])]),r("div",{ref_key:"scrollContainerRef",ref:d,class:"min-w-0 flex-1 overflow-y-auto"},[r("div",RA,[r("div",{ref:P=>o(m)("model",P)},[f(OS,{ref_key:"aiModelConfigRef",ref:x,onConfigChanged:g},null,512)],512),r("div",{ref:P=>o(m)("defaultModel",P)},[f(lC,{onConfigChanged:g})],512),r("div",{ref:P=>o(m)("semanticIndex",P)},[f($A)],512),f(aI,{"set-section-ref":o(m),onConfigChanged:g},null,8,["set-section-ref"]),r("div",{ref:P=>o(m)("preprocess",P)},[f(iM)],512),r("div",{ref:P=>o(m)("sessionIndex",P)},[f(ZM)],512),r("div",{ref:P=>o(m)("export",P)},[f(yM,{onConfigChanged:g})],512)])],512)]))}}),FA={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},NA={class:"rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},UA={class:"flex items-center justify-between"},OA={class:"flex-1 pr-4"},VA={class:"text-sm font-medium text-gray-900 dark:text-white"},HA={class:"text-xs text-gray-500 dark:text-gray-400"},zA={class:"w-64"},BA={key:0,class:"mt-4 space-y-3"},WA={class:"mb-1.5 block text-xs font-medium text-gray-700 dark:text-gray-300"},jA={key:0,class:"mt-1 text-xs text-red-500"},qA={key:1,class:"mt-1 text-xs text-gray-400"},KA={class:"flex items-center gap-3"},GA={key:0,class:"flex items-center gap-1.5"},XA=Re({__name:"NetworkSettingsSection",setup(e){const{t}=Fe(),s=I("system"),n=I(""),a=I(""),i=I(!1),c=I(!1),d=I(null),m=X(()=>[{label:t("settings.basic.network.modeOff"),value:"off"},{label:t("settings.basic.network.modeSystem"),value:"system"},{label:t("settings.basic.network.modeManual"),value:"manual"}]);async function u(){try{const P=await window.networkApi.getProxyConfig();s.value=P.mode||"system",n.value=P.url||""}catch(P){console.error("获取代理配置失败:",P)}}function y(P){if(!P)return a.value="",!0;try{const h=new URL(P);return["http:","https:"].includes(h.protocol)?(a.value="",!0):(a.value=t("settings.basic.network.onlyHttpSupported"),!1)}catch{return a.value=t("settings.basic.network.invalidProxyUrl"),!1}}async function g(){if(d.value=null,s.value==="manual"&&!n.value.trim()){a.value=t("settings.basic.network.enterProxyFirst");return}if(!(s.value==="manual"&&!y(n.value))){i.value=!0;try{const P=await window.networkApi.saveProxyConfig({mode:s.value,url:n.value.trim()});P.success||(a.value=P.error||t("settings.basic.network.saveFailed"))}catch(P){console.error("保存代理配置失败:",P),a.value=t("settings.basic.network.saveFailed")}finally{i.value=!1}}}async function _(P){const h=P;s.value=h,d.value=null,a.value="",h!=="manual"&&await g()}function x(){d.value=null,n.value?y(n.value):a.value=""}async function w(){s.value==="manual"&&n.value.trim()&&await g()}async function $(){if(!n.value.trim()){a.value=t("settings.basic.network.enterProxyFirst");return}if(y(n.value)){c.value=!0,d.value=null;try{const P=await window.networkApi.testProxyConnection(n.value.trim());d.value={success:P.success,message:P.success?t("settings.basic.network.connectionSuccess"):P.error||t("settings.basic.network.connectionFailed")}}catch(P){d.value={success:!1,message:t("settings.basic.network.connectionFailed")+": "+(P instanceof Error?P.message:String(P))}}finally{c.value=!1}}}return tt(()=>{u()}),(P,h)=>{const p=We,C=_s,S=ut,z=Ke;return v(),k("div",null,[r("h3",FA,[f(p,{name:"i-heroicons-globe-alt",class:"h-4 w-4 text-cyan-500"}),Y(" "+l(o(t)("settings.basic.network.title")),1)]),r("div",NA,[r("div",UA,[r("div",OA,[r("p",VA,l(o(t)("settings.basic.network.proxyMode")),1),r("p",HA,l(o(t)("settings.basic.network.proxyModeDesc")),1)]),r("div",zA,[f(C,{"model-value":s.value,size:"sm",class:"gap-0",items:m.value,"onUpdate:modelValue":_},null,8,["model-value","items"])])]),s.value==="manual"?(v(),k("div",BA,[r("div",null,[r("label",WA,l(o(t)("settings.basic.network.proxyAddress")),1),f(S,{modelValue:n.value,"onUpdate:modelValue":h[0]||(h[0]=M=>n.value=M),placeholder:o(t)("settings.basic.network.proxyPlaceholder"),color:a.value?"error":"neutral",size:"sm",class:"w-full",onInput:x,onBlur:w},null,8,["modelValue","placeholder","color"]),a.value?(v(),k("p",jA,l(a.value),1)):(v(),k("p",qA,l(o(t)("settings.basic.network.proxyHelp")),1))]),r("div",KA,[f(z,{loading:c.value,disabled:c.value||!n.value.trim(),color:"neutral",variant:"soft",size:"sm",onClick:$},{default:te(()=>[f(p,{name:"i-heroicons-signal",class:"mr-1 h-4 w-4"}),Y(" "+l(c.value?o(t)("settings.basic.network.testing"):o(t)("settings.basic.network.testConnection")),1)]),_:1},8,["loading","disabled"]),d.value?(v(),k("div",GA,[f(p,{name:d.value.success?"i-heroicons-check-circle":"i-heroicons-x-circle",class:$e(["h-4 w-4",d.value.success?"text-green-500":"text-red-500"])},null,8,["name","class"]),r("span",{class:$e(["text-xs",d.value.success?"text-green-600 dark:text-green-400":"text-red-600 dark:text-red-400"])},l(d.value.message),3)])):ne("",!0)])])):ne("",!0)])])}}}),YA={class:"space-y-6 pb-6"},QA={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},JA={class:"rounded-lg border border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800/50"},ZA={class:"flex items-center justify-between p-4"},e$={class:"flex-1 pr-4"},t$={class:"text-sm font-medium text-gray-900 dark:text-white"},s$={class:"w-72"},a$={class:"flex items-center justify-between p-4"},n$={class:"flex-1 pr-4"},o$={class:"text-sm font-medium text-gray-900 dark:text-white"},r$={class:"text-xs text-gray-500 dark:text-gray-400"},i$={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},l$={class:"rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},c$={class:"flex items-center justify-between"},d$={class:"flex-1 pr-4"},u$={class:"text-sm font-medium text-gray-900 dark:text-white"},m$={class:"w-64"},g$={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},p$={class:"rounded-lg border border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800/50"},f$={class:"flex items-center justify-between p-4"},h$={class:"flex-1 pr-4"},v$={class:"text-sm font-medium text-gray-900 dark:text-white"},y$={class:"w-64"},b$={class:"flex items-center justify-between p-4"},_$={class:"flex-1 pr-4"},x$={class:"text-sm font-medium text-gray-900 dark:text-white"},k$={class:"text-xs text-gray-500 dark:text-gray-400"},w$={class:"w-64"},S$={class:"flex items-center justify-between p-4"},C$={class:"flex-1 pr-4"},I$={class:"text-sm font-medium text-gray-900 dark:text-white"},M$={class:"text-xs text-gray-500 dark:text-gray-400"},T$=Re({__name:"BasicSettingsTab",setup(e){const{t}=Fe(),s=Bt(),n=ts(),{screenshotMobileAdapt:a,toolsPanelPosition:i}=et(s),{locale:c,defaultSessionTab:d}=et(n),m=I(!1),u=I(!0);tt(async()=>{{u.value=!1;return}});async function y(h){}const g=hn({emitAuto:!0,initialValue:"light"}),_=X(()=>[{label:t("settings.basic.appearance.auto"),value:"auto"},{label:t("settings.basic.appearance.light"),value:"light"},{label:t("settings.basic.appearance.dark"),value:"dark"}]),x=X(()=>vi.map(h=>({label:h.nativeName,value:h.code}))),w=X({get:()=>c.value,set:h=>n.setLocale(h)}),$=X(()=>[{label:t("settings.basic.defaultTab.overview"),value:"overview"},{label:t("settings.basic.defaultTab.aiChat"),value:"ai-chat"}]),P=X(()=>[{label:t("settings.basic.toolsPanel.positionHeader"),value:"header"},{label:t("settings.basic.toolsPanel.positionSide"),value:"side"}]);return(h,p)=>{const C=We,S=xs,z=_s;return v(),k("div",YA,[r("div",null,[r("h3",QA,[f(C,{name:"i-heroicons-cog-6-tooth",class:"h-4 w-4 text-gray-500"}),Y(" "+l(o(t)("settings.basic.general.title")),1)]),r("div",JA,[r("div",ZA,[r("div",e$,[r("p",t$,l(o(t)("settings.basic.language.description")),1)]),r("div",s$,[f(Vt,{modelValue:w.value,"onUpdate:modelValue":p[0]||(p[0]=M=>w.value=M),size:"sm",class:"gap-0",items:x.value},null,8,["modelValue","items"])])]),o(lt)?(v(),k(Pe,{key:0},[p[6]||(p[6]=r("div",{class:"border-t border-gray-200 dark:border-gray-700"},null,-1)),r("div",a$,[r("div",n$,[r("p",o$,l(o(t)("settings.basic.autoLaunch.openAtLogin")),1),r("p",r$,l(u.value?o(t)("settings.basic.autoLaunch.openAtLoginDesc"):o(t)("settings.basic.autoLaunch.devModeHint")),1)]),f(S,{modelValue:m.value,"onUpdate:modelValue":[p[1]||(p[1]=M=>m.value=M),y],disabled:!u.value},null,8,["modelValue","disabled"])])],64)):ne("",!0)])]),r("div",null,[r("h3",i$,[f(C,{name:"i-heroicons-paint-brush",class:"h-4 w-4 text-pink-500"}),Y(" "+l(o(t)("settings.basic.appearance.title")),1)]),r("div",l$,[r("div",c$,[r("div",d$,[r("p",u$,l(o(t)("settings.basic.appearance.themeMode")),1)]),r("div",m$,[f(z,{modelValue:o(g),"onUpdate:modelValue":p[2]||(p[2]=M=>rt(g)?g.value=M:null),size:"sm",class:"gap-0",items:_.value},null,8,["modelValue","items"])])])])]),r("div",null,[r("h3",g$,[f(C,{name:"i-heroicons-adjustments-horizontal",class:"h-4 w-4 text-purple-500"}),Y(" "+l(o(t)("settings.basic.preferences.title")),1)]),r("div",p$,[r("div",f$,[r("div",h$,[r("p",v$,l(o(t)("settings.basic.defaultTab.description")),1)]),r("div",y$,[f(z,{modelValue:o(d),"onUpdate:modelValue":p[3]||(p[3]=M=>rt(d)?d.value=M:null),size:"sm",class:"gap-0",items:$.value},null,8,["modelValue","items"])])]),p[7]||(p[7]=r("div",{class:"border-t border-gray-200 dark:border-gray-700"},null,-1)),r("div",b$,[r("div",_$,[r("p",x$,l(o(t)("settings.basic.toolsPanel.positionLabel")),1),r("p",k$,l(o(t)("settings.basic.toolsPanel.positionDesc")),1)]),r("div",w$,[f(z,{modelValue:o(i),"onUpdate:modelValue":p[4]||(p[4]=M=>rt(i)?i.value=M:null),size:"sm",class:"gap-0",items:P.value},null,8,["modelValue","items"])])]),p[8]||(p[8]=r("div",{class:"border-t border-gray-200 dark:border-gray-700"},null,-1)),r("div",S$,[r("div",C$,[r("p",I$,l(o(t)("settings.basic.screenshot.mobileAdapt")),1),r("p",M$,l(o(t)("settings.basic.screenshot.mobileAdaptDesc")),1)]),f(S,{modelValue:o(a),"onUpdate:modelValue":p[5]||(p[5]=M=>rt(a)?a.value=M:null)},null,8,["modelValue"])])])]),o(lt)?(v(),Te(XA,{key:0})):ne("",!0)])}}}),A$=2e3;function Tn(){const e=Yi(),t=s=>e.add({duration:A$,...s});return{add:t,success:(s,n={})=>t({title:s,color:"success",...n}),fail:(s,n={})=>t({title:s,color:"error",...n}),info:(s,n={})=>t({title:s,color:"primary",...n}),warn:(s,n={})=>t({title:s,color:"warning",...n})}}var ca={exports:{}},$$=ca.exports,Bo;function P$(){return Bo||(Bo=1,(function(e,t){(function(s,n){e.exports=n()})($$,(function(){return function(s,n,a){s=s||{};var i=n.prototype,c={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function d(u,y,g,_){return i.fromToBase(u,y,g,_)}a.en.relativeTime=c,i.fromToBase=function(u,y,g,_,x){for(var w,$,P,h=g.$locale().relativeTime||c,p=s.thresholds||[{l:"s",r:44,d:"second"},{l:"m",r:89},{l:"mm",r:44,d:"minute"},{l:"h",r:89},{l:"hh",r:21,d:"hour"},{l:"d",r:35},{l:"dd",r:25,d:"day"},{l:"M",r:45},{l:"MM",r:10,d:"month"},{l:"y",r:17},{l:"yy",d:"year"}],C=p.length,S=0;S<C;S+=1){var z=p[S];z.d&&(w=_?a(u).diff(g,z.d,!0):g.diff(u,z.d,!0));var M=(s.rounding||Math.round)(Math.abs(w));if(P=w>0,M<=z.r||!z.r){M<=1&&S>0&&(z=p[S-1]);var D=h[z.l];x&&(M=x(""+M)),$=typeof D=="string"?D.replace("%d",M):D(M,y,z.l,P);break}}if(y)return $;var E=P?h.future:h.past;return typeof E=="function"?E($):E.replace("%s",$)},i.to=function(u,y){return d(u,y,this,!0)},i.from=function(u,y){return d(u,y,this)};var m=function(u){return u.$u?a.utc():a()};i.toNow=function(u){return this.to(m(this),u)},i.fromNow=function(u){return this.from(m(this),u)}}}))})(ca)),ca.exports}var D$=P$();const L$=hi(D$),R$={class:"flex h-full flex-col"},E$={class:"mb-4"},F$={class:"mb-4 flex items-center justify-between"},N$={class:"flex items-center gap-4"},U$={class:"text-xs text-gray-400 dark:text-gray-500"},O$={key:0,class:"text-sm text-gray-500 dark:text-gray-400"},V$={key:1,class:"text-sm text-gray-500 dark:text-gray-400"},H$={class:"flex gap-2"},z$={key:0,class:"flex flex-1 items-center justify-center"},B$={class:"text-center text-gray-500 dark:text-gray-400"},W$={key:1,class:"flex flex-1 items-center justify-center"},j$={class:"text-center text-gray-500 dark:text-gray-400"},q$={key:2,class:"flex-1 overflow-y-auto rounded-lg border border-gray-200/50 dark:border-gray-700/50"},K$={class:"sticky top-0 z-1 flex items-center gap-3 border-b border-gray-200 bg-gray-50 px-3 py-2 text-xs font-medium text-gray-500 dark:border-gray-700 dark:bg-gray-800/80 dark:text-gray-400"},G$=["onClick"],X$={class:"flex shrink-0 flex-col leading-none"},Y$=["onClick"],Q$={class:"w-6"},J$={class:"w-8"},Z$=["src","alt"],eP={class:"min-w-0 flex-1"},tP={class:"flex items-center gap-1.5"},sP=["title","onClick"],aP={class:"w-20 text-center"},nP={class:"w-24 text-right text-sm text-gray-600 dark:text-gray-300"},oP={class:"w-16 text-right text-sm text-gray-600 dark:text-gray-300"},rP={class:"w-16 text-right text-sm text-gray-600 dark:text-gray-300"},iP={class:"w-28 text-right text-xs text-gray-500 dark:text-gray-400"},lP={class:"p-4"},cP={class:"mb-4 flex items-center gap-3"},dP={class:"flex h-10 w-10 items-center justify-center rounded-full bg-blue-100 dark:bg-blue-900/30"},uP={class:"text-lg font-semibold text-gray-900 dark:text-white"},mP={class:"mb-4 text-gray-600 dark:text-gray-400"},gP={class:"mb-4 max-h-40 overflow-y-auto rounded-lg border border-gray-200 dark:border-gray-700"},pP={class:"text-sm text-gray-700 dark:text-gray-300"},fP={class:"text-xs text-gray-400"},hP={class:"mb-4"},vP={key:0,class:"mb-4 rounded-lg border border-red-200 bg-red-50 px-3 py-2 dark:border-red-800/50 dark:bg-red-900/20"},yP={class:"flex items-start gap-2"},bP={class:"text-xs leading-5 text-red-700 dark:text-red-300"},_P={key:1,class:"mb-4 rounded-lg bg-blue-50 px-4 py-3 dark:bg-blue-900/20"},xP={class:"flex items-center gap-2"},kP={class:"text-sm text-blue-700 dark:text-blue-300"},wP={class:"flex justify-end gap-2"},SP={class:"p-4"},CP={class:"mb-4 flex items-center gap-3"},IP={class:"flex h-10 w-10 items-center justify-center rounded-full bg-red-100 dark:bg-red-900/30"},MP={class:"text-lg font-semibold text-gray-900 dark:text-white"},TP={class:"mb-6 text-gray-600 dark:text-gray-400"},AP={class:"flex justify-end gap-2"},$P=Re({__name:"BatchManageTab",setup(e){gt.extend(L$);const t=Tn(),{t:s,locale:n}=Fe(),a=St(),{sessions:i}=et(a),c=I(""),d=X(()=>{if(!c.value.trim())return i.value;const ge=c.value.toLowerCase().trim();return i.value.filter(b=>b.name.toLowerCase().includes(ge)||b.platform.toLowerCase().includes(ge))}),m=[{key:"spacer-select",type:"spacer",class:"w-6"},{key:"spacer-avatar",type:"spacer",class:"w-8"},{key:"name",type:"sortable",field:"name",labelKey:"tools.batchManage.columns.name",class:"min-w-0 flex-1",align:"left"},{key:"platform",type:"sortable",field:"platform",labelKey:"tools.batchManage.columns.platform",class:"w-20",align:"center"},{key:"messages",type:"sortable",field:"messageCount",labelKey:"tools.batchManage.columns.messages",class:"w-24",align:"right"},{key:"summaries",type:"static",labelKey:"tools.batchManage.columns.summaries",class:"w-16",align:"right"},{key:"aiChats",type:"static",labelKey:"tools.batchManage.columns.aiChats",class:"w-16",align:"right"},{key:"importedAt",type:"sortable",field:"importedAt",labelKey:"tools.batchManage.columns.importedAt",class:"w-28",align:"right"}],u=I({field:null,direction:null});function y(ge){return"asc"}function g(ge){if(u.value.field===ge){u.value.direction==="asc"?u.value.direction="desc":u.value.direction==="desc"?u.value={field:null,direction:null}:u.value.direction="asc";return}u.value={field:ge,direction:y()}}function _(ge){return u.value.field!==ge?null:u.value.direction}function x(ge,b){return _(ge)===b?"text-primary-500 dark:text-primary-400":"text-gray-300 dark:text-gray-600"}function w(ge){return ge==="left"?"justify-start text-left":ge==="center"?"justify-center text-center":"justify-end text-right"}function $(ge){return`${ge.class} ${w(ge.align)}`}function P(ge){return`${ge.class} flex items-center gap-1 transition-colors hover:text-gray-700 dark:hover:text-gray-200 ${w(ge.align)}`}const h=X(()=>{const ge=[...d.value],{field:b,direction:O}=u.value;if(!b||!O)return ge;const Q=O==="asc"?1:-1;return ge.sort((ie,ye)=>b==="name"?ie.name.localeCompare(ye.name,n.value)*Q:b==="platform"?ee(ie.platform).localeCompare(ee(ye.platform),n.value)*Q:b==="messageCount"?(ie.messageCount-ye.messageCount)*Q:(ie.importedAt-ye.importedAt)*Q),ge}),p=I(new Set),C=I(!1),S=I(!1),z=I(null),M=I(""),D=X(()=>i.value.filter(ge=>p.value.has(ge.id))),E=X(()=>new Set(D.value.map(ge=>ge.type))),F=X(()=>p.value.size<2?!1:E.value.size===1),re=X(()=>h.value.length>0&&h.value.every(ge=>p.value.has(ge.id))),ve=X(()=>{const ge=h.value.filter(b=>p.value.has(b.id)).length;return ge>0&&ge<h.value.length});function de(){if(re.value){const ge=new Set(h.value.map(b=>b.id));p.value=new Set([...p.value].filter(b=>!ge.has(b)))}else{const ge=new Set(p.value);for(const b of h.value)ge.add(b.id);p.value=ge}}const L=I(null);Ue(h,()=>{L.value=null});function A(ge){const b=new Set(p.value);b.has(ge)?b.delete(ge):b.add(ge),p.value=b}function G(ge,b,O){if(O.shiftKey&&L.value!==null){const Q=Math.min(L.value,ge),ie=Math.max(L.value,ge),ye=new Set(p.value);for(let j=Q;j<=ie;j++){const q=h.value[j];q&&ye.add(q.id)}p.value=ye}else A(b);L.value=ge}function J(ge){!ge.shiftKey||ge.target?.closest('input, textarea, [contenteditable="true"]')||ge.preventDefault()}function ue(ge){return p.value.has(ge)}function W(ge){return gt.unix(ge).locale({"zh-CN":"zh-cn","zh-TW":"zh-tw","ja-JP":"ja"}[n.value]??"en").fromNow()}function V(ge){return ge.type==="private"}function H(ge){return V(ge)?ge.memberAvatar||null:ge.groupAvatar||null}function ae(ge){const b=ge.name||"";return b?V(ge)?b.length<=2?b:b.slice(-2):b.length<=2?b:b.slice(0,2):"?"}const K={qq:{label:"QQ",class:"bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300"},weixin:{label:"微信",class:"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300"},discord:{label:"Discord",class:"bg-indigo-100 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-300"},whatsapp:{label:"WhatsApp",class:"bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-300"},instagram:{label:"Instagram",class:"bg-pink-100 text-pink-700 dark:bg-pink-900/30 dark:text-pink-300"},line:{label:"LINE",class:"bg-lime-100 text-lime-700 dark:bg-lime-900/30 dark:text-lime-300"},unknown:{label:"未知",class:"bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-300"}};function ee(ge){return K[ge]?.label||ge}function fe(ge){return K[ge]?.class||K.unknown.class}function he(ge,b){b.stopPropagation(),z.value=ge.id,M.value=ge.name}async function le(){if(!z.value||!M.value.trim()){z.value=null,M.value="";return}const ge=M.value.trim(),b=i.value.find(O=>O.id===z.value);b&&b.name!==ge&&await a.renameSession(z.value,ge),z.value=null,M.value=""}function B(){z.value=null,M.value=""}function N(){p.value.size!==0&&(C.value=!0)}const T=I(!1),U=I(!1),Z=I(""),oe=I(!1);async function me(){F.value&&(oe.value=!1,T.value=!0)}async function pe(){if(!F.value)return;U.value=!0,Z.value=s("tools.batchManage.mergeSteps.exporting");const ge=Array.from(p.value);let b=[];try{const O=await window.mergeApi.exportSessionsToTempFiles(ge);if(!O.success)throw new Error(O.error||"导出失败");b=O.tempFiles,Z.value=s("tools.batchManage.mergeSteps.parsing");for(const R of b)await window.mergeApi.parseFileInfo(R);Z.value=s("tools.batchManage.mergeSteps.checking");const Q=await window.mergeApi.checkConflicts(b);Q.conflicts.length>0&&console.log(`[BatchDelete] 检测到 ${Q.conflicts.length} 个冲突,使用默认解决方案`),Z.value=s("tools.batchManage.mergeSteps.merging");const j=`${i.value.find(R=>p.value.has(R.id))?.name||"聊天记录"}(${s("tools.batchManage.mergedSuffix")})`,q=await window.mergeApi.mergeFiles({filePaths:b,outputName:j,outputFormat:"json",conflictResolutions:Q.conflicts.map(R=>({id:R.id,resolution:"keep1"})),andAnalyze:!0});if(!q.success)throw new Error(q.error||"合并失败");if(oe.value){Z.value=s("tools.batchManage.mergeSteps.cleaning");for(const R of ge)await a.deleteSession(R)}await window.mergeApi.cleanupTempExportFiles(b),await a.loadSessions(),p.value=new Set,T.value=!1,t.success(s("tools.batchManage.mergeSuccess",{count:ge.length}))}catch(O){console.error("[BatchDelete] 合并失败:",O),t.fail(s("tools.batchManage.mergeError",{error:String(O)})),b.length>0&&await window.mergeApi.cleanupTempExportFiles(b)}finally{U.value=!1,Z.value=""}}async function _e(){if(p.value.size!==0){S.value=!0;try{const ge=Array.from(p.value);for(const b of ge)await a.deleteSession(b);p.value=new Set,C.value=!1}catch(ge){console.error("Batch delete failed:",ge)}finally{S.value=!1}}}function be(){C.value=!1}return tt(()=>{a.loadSessions()}),(ge,b)=>{const O=ut,Q=fa,ie=Ke,ye=Vs,j=We,q=mt;return v(),k("div",R$,[r("div",E$,[f(O,{modelValue:c.value,"onUpdate:modelValue":b[0]||(b[0]=R=>c.value=R),placeholder:o(s)("tools.batchManage.searchPlaceholder"),icon:"i-heroicons-magnifying-glass",size:"md",class:"w-80"},null,8,["modelValue","placeholder"])]),r("div",F$,[r("div",N$,[f(Q,{"model-value":re.value,indeterminate:ve.value,label:o(s)("tools.batchManage.selectAll"),"onUpdate:modelValue":de},null,8,["model-value","indeterminate","label"]),r("span",U$,l(o(s)("tools.batchManage.shiftClickHint")),1),p.value.size>0?(v(),k("span",O$,l(o(s)("tools.batchManage.selected",{count:p.value.size})),1)):ne("",!0),c.value.trim()&&d.value.length!==o(i).length?(v(),k("span",V$,l(o(s)("tools.batchManage.searchResult",{count:d.value.length,total:o(i).length})),1)):ne("",!0)]),r("div",H$,[f(ye,{text:F.value?"":o(s)("tools.batchManage.mergeHint")},{default:te(()=>[f(ie,{color:"primary",disabled:!F.value,icon:"i-heroicons-document-duplicate",onClick:me},{default:te(()=>[Y(l(o(s)("tools.batchManage.merge")),1)]),_:1},8,["disabled"])]),_:1},8,["text"]),f(ie,{color:"primary",disabled:p.value.size===0,icon:"i-heroicons-trash",onClick:N},{default:te(()=>[Y(l(o(s)("tools.batchManage.delete")),1)]),_:1},8,["disabled"])])]),o(i).length===0?(v(),k("div",z$,[r("div",B$,[f(j,{name:"i-heroicons-inbox",class:"mb-2 h-12 w-12"}),r("p",null,l(o(s)("tools.batchManage.empty")),1)])])):d.value.length===0?(v(),k("div",W$,[r("div",j$,[f(j,{name:"i-heroicons-magnifying-glass",class:"mb-2 h-12 w-12"}),r("p",null,l(o(s)("tools.batchManage.noSearchResult")),1)])])):(v(),k("div",q$,[r("div",K$,[(v(),k(Pe,null,Be(m,R=>(v(),k(Pe,{key:R.key},[R.type==="spacer"?(v(),k("div",{key:0,class:$e(R.class)},null,2)):R.type==="static"?(v(),k("div",{key:1,class:$e($(R))},l(o(s)(R.labelKey)),3)):(v(),k("button",{key:2,class:$e(P(R)),onClick:xe=>g(R.field)},[r("span",null,l(o(s)(R.labelKey)),1),r("span",X$,[f(j,{name:"i-heroicons-chevron-up",class:$e(["h-2.5 w-2.5",x(R.field,"asc")])},null,8,["class"]),f(j,{name:"i-heroicons-chevron-down",class:$e(["-mt-0.5 h-2.5 w-2.5",x(R.field,"desc")])},null,8,["class"])])],10,G$))],64))),64))]),(v(!0),k(Pe,null,Be(h.value,(R,xe)=>(v(),k("div",{key:R.id,class:$e(["flex cursor-pointer items-center gap-3 px-3 py-2 transition-colors hover:bg-gray-100 dark:hover:bg-gray-800",[ue(R.id)?"bg-pink-50 dark:bg-pink-900/20":"",xe!==h.value.length-1?"border-b border-gray-100 dark:border-gray-800":""]]),onMousedown:J,onClick:Se=>G(xe,R.id,Se)},[r("div",Q$,[f(Q,{"model-value":ue(R.id),onClick:Ps(Se=>G(xe,R.id,Se),["stop"])},null,8,["model-value","onClick"])]),r("div",J$,[H(R)?(v(),k("img",{key:0,src:H(R),alt:R.name,class:"h-8 w-8 shrink-0 rounded-full object-cover"},null,8,Z$)):(v(),k("div",{key:1,class:$e(["flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-[10px] font-bold",V(R)?"bg-pink-500 text-white":"bg-primary-500 text-white"])},l(ae(R)),3))]),r("div",eP,[r("div",tP,[f(j,{name:V(R)?"i-heroicons-user":"i-heroicons-user-group",class:"h-3.5 w-3.5 shrink-0 text-gray-400"},null,8,["name"]),z.value===R.id?zi((v(),k("input",{key:0,"onUpdate:modelValue":b[1]||(b[1]=Se=>M.value=Se),type:"text",class:"w-full rounded border border-pink-300 bg-white px-2 py-0.5 text-sm font-medium text-gray-900 focus:border-pink-500 focus:outline-none focus:ring-1 focus:ring-pink-500 dark:border-pink-600 dark:bg-gray-800 dark:text-white",autofocus:"",onBlur:le,onKeydown:[$s(le,["enter"]),$s(B,["escape"])],onClick:b[2]||(b[2]=Ps(()=>{},["stop"]))},null,544)),[[Bi,M.value]]):(v(),k("p",{key:1,class:"cursor-text truncate rounded px-1 text-sm font-medium text-gray-900 hover:bg-gray-200 dark:text-white dark:hover:bg-gray-700",title:o(s)("tools.batchManage.clickToEdit"),onClick:Se=>he(R,Se)},l(R.name),9,sP))])]),r("div",aP,[r("span",{class:$e(["inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium",fe(R.platform)])},l(ee(R.platform)),3)]),r("div",nP,l(R.messageCount.toLocaleString()),1),r("div",oP,l(R.summaryCount||0),1),r("div",rP,l(R.aiConversationCount||0),1),r("div",iP,l(W(R.importedAt)),1)],42,Y$))),128))])),f(q,{open:T.value,"onUpdate:open":b[5]||(b[5]=R=>T.value=R),ui:{content:"z-[101]",overlay:"z-[100]"}},{content:te(()=>[r("div",lP,[r("div",cP,[r("div",dP,[f(j,{name:"i-heroicons-document-duplicate",class:"h-5 w-5 text-blue-600 dark:text-blue-400"})]),r("h3",uP,l(o(s)("tools.batchManage.mergeConfirmTitle")),1)]),r("p",mP,l(o(s)("tools.batchManage.mergeConfirmMessage",{count:p.value.size})),1),r("div",gP,[(v(!0),k(Pe,null,Be(D.value,R=>(v(),k("div",{key:R.id,class:"flex items-center gap-2 border-b border-gray-100 px-3 py-2 last:border-b-0 dark:border-gray-800"},[f(j,{name:V(R)?"i-heroicons-user":"i-heroicons-user-group",class:"h-4 w-4 text-gray-400"},null,8,["name"]),r("span",pP,l(R.name),1),r("span",fP,l(R.messageCount.toLocaleString())+" 条",1)]))),128))]),r("div",hP,[f(Q,{modelValue:oe.value,"onUpdate:modelValue":b[3]||(b[3]=R=>oe.value=R),label:o(s)("tools.batchManage.deleteOriginalsLabel")},null,8,["modelValue","label"])]),oe.value?(v(),k("div",vP,[r("div",yP,[f(j,{name:"i-heroicons-exclamation-triangle",class:"mt-0.5 h-4 w-4 shrink-0 text-red-600"}),r("p",bP,l(o(s)("tools.batchManage.mergeRiskWarning")),1)])])):ne("",!0),U.value?(v(),k("div",_P,[r("div",xP,[f(j,{name:"i-heroicons-arrow-path",class:"h-4 w-4 animate-spin text-blue-600 dark:text-blue-400"}),r("span",kP,l(Z.value),1)])])):ne("",!0),r("div",wP,[f(ie,{variant:"soft",disabled:U.value,onClick:b[4]||(b[4]=R=>T.value=!1)},{default:te(()=>[Y(l(o(s)("common.cancel")),1)]),_:1},8,["disabled"]),f(ie,{color:"primary",loading:U.value,onClick:pe},{default:te(()=>[Y(l(U.value?Z.value:o(s)("tools.batchManage.merge")),1)]),_:1},8,["loading"])])])]),_:1},8,["open"]),f(q,{open:C.value,"onUpdate:open":b[6]||(b[6]=R=>C.value=R),ui:{content:"z-[101]",overlay:"z-[100]"}},{content:te(()=>[r("div",SP,[r("div",CP,[r("div",IP,[f(j,{name:"i-heroicons-exclamation-triangle",class:"h-5 w-5 text-red-600 dark:text-red-400"})]),r("h3",MP,l(o(s)("tools.batchManage.confirmTitle")),1)]),r("p",TP,l(o(s)("tools.batchManage.confirmMessage",{count:p.value.size})),1),r("div",AP,[f(ie,{variant:"soft",disabled:S.value,onClick:be},{default:te(()=>[Y(l(o(s)("common.cancel")),1)]),_:1},8,["disabled"]),f(ie,{color:"error",loading:S.value,onClick:_e},{default:te(()=>[Y(l(S.value?o(s)("tools.batchManage.deleting"):o(s)("common.delete")),1)]),_:1},8,["loading"])])])]),_:1},8,["open"])])}}});function gs(){return Pt("cache")}const hE=Object.freeze(Object.defineProperty({__proto__:null,useCacheService:gs},Symbol.toStringTag,{value:"Module"})),An="chatlab_ignore_migrate_default_hint";function PP(e){const t=e.getItem(An);if(!t)return null;try{const s=JSON.parse(t);return!s.ignoredForDataDir||!s.ignoredAt?null:{ignoredForDataDir:s.ignoredForDataDir,ignoredAt:s.ignoredAt}}catch{return null}}function DP(e,t){return PP(e)?.ignoredForDataDir===t}function LP(e,t){e.setItem(An,JSON.stringify({ignoredForDataDir:t,ignoredAt:new Date().toISOString()}))}function RP(e){e.removeItem(An)}const EP={class:"space-y-6"},FP={class:"flex items-center justify-between"},NP={class:"flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},UP={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},OP={class:"flex items-center gap-2"},VP={class:"rounded-lg bg-gray-100 px-3 py-1.5 dark:bg-gray-800"},HP={class:"text-xs text-gray-500 dark:text-gray-400"},zP={class:"text-sm font-semibold text-gray-900 dark:text-white"},BP={key:0,class:"flex items-center justify-center py-8"},WP={class:"ml-2 text-sm text-gray-500"},jP={key:1,class:"space-y-2"},qP={class:"flex items-center justify-between"},KP={class:"flex items-center gap-3"},GP={class:"flex items-center gap-2"},XP={class:"text-sm font-medium text-gray-900 dark:text-white"},YP={class:"text-xs text-gray-500 dark:text-gray-400"},QP={class:"flex items-center"},JP={class:"flex items-center gap-2 text-xs text-gray-400"},ZP={class:"w-14 text-right"},e2={class:"w-16 text-right"},t2={class:"ml-4 flex w-36 shrink-0 items-center justify-end gap-1"},s2={class:"rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},a2={class:"flex items-start justify-between gap-3"},n2={class:"min-w-0 flex-1"},o2={class:"text-sm font-medium text-gray-900 dark:text-white"},r2={class:"mt-0.5 text-xs text-gray-500 dark:text-gray-400"},i2={class:"shrink-0"},l2={class:"mt-3 flex items-center gap-2"},c2={key:0,class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},d2={key:1,class:"mt-3 flex items-center justify-between rounded-lg border border-blue-200 bg-blue-50 p-3 dark:border-blue-800/50 dark:bg-blue-900/20"},u2={class:"text-xs font-medium text-blue-700 dark:text-blue-300"},m2={class:"mt-0.5 font-mono text-xs text-blue-600 dark:text-blue-400"},g2={class:"flex shrink-0 items-center gap-2"},p2={class:"mt-2 text-xs text-amber-600 dark:text-amber-400"},f2={key:2,class:"mt-1 text-xs text-red-500"},h2={class:"p-5"},v2={class:"mb-4 flex items-center gap-3"},y2={class:"flex h-10 w-10 items-center justify-center rounded-full bg-amber-100 dark:bg-amber-900/30"},b2={class:"text-lg font-semibold text-gray-900 dark:text-white"},_2={class:"space-y-3 text-sm text-gray-600 dark:text-gray-400"},x2={class:"rounded-lg bg-gray-100 p-3 dark:bg-gray-800"},k2={class:"text-xs text-gray-500 dark:text-gray-400"},w2={class:"mt-1 font-mono text-sm text-gray-900 dark:text-white"},S2={class:"rounded-lg border border-amber-200 bg-amber-50 p-3 dark:border-amber-800/50 dark:bg-amber-900/20"},C2={class:"text-xs text-amber-700 dark:text-amber-400"},I2={class:"mt-5 flex justify-end gap-2"},M2={class:"p-5"},T2={class:"mb-4 flex items-center gap-3"},A2={class:"flex h-10 w-10 items-center justify-center rounded-full bg-green-100 dark:bg-green-900/30"},$2={class:"text-lg font-semibold text-gray-900 dark:text-white"},P2={class:"text-sm text-gray-600 dark:text-gray-400"},D2={class:"mt-5 flex justify-end"},L2=Re({__name:"StorageManageSection",setup(e,{expose:t}){const{t:s}=Fe(),n=I(null),a=I(!1),i=I(null),c=I(""),d=I(""),m=I(""),u=I(!1),y=I(!1),g=I(!1),_=I(!1),x=I(null),w=I(!1),$=I(!1),P=I(null),h=I(!1),p=I(!1);function C(K){if(K===0)return"0 B";const ee=["B","KB","MB","GB"],fe=Math.floor(Math.log(K)/Math.log(1024));return`${(K/Math.pow(1024,fe)).toFixed(fe>0?1:0)} ${ee[fe]}`}const S=X(()=>n.value?C(n.value.totalSize):"0 B");async function z(){a.value=!0;try{n.value=await gs().getInfo()}catch(K){console.error("获取缓存信息失败:",K)}finally{a.value=!1}}const M=X(()=>g.value||!!c.value),D=X(()=>M.value&&c.value&&m.value&&c.value!==m.value&&u.value&&!w.value);function E(){if(!c.value||!m.value){w.value=!1;return}try{w.value=DP(localStorage,c.value)}catch{w.value=!1}}async function F(){try{const K=await gs().getDataDir();c.value=K.path,d.value=K.pendingMigration?.to||K.path,m.value=K.defaultPath||"",u.value=!!K.hasLegacyDataAtDefaultDir,y.value=K.isCustom,g.value=lt||!!K.canSetDataDir,E()}catch(K){console.error("获取数据目录失败:",K)}}async function re(K){i.value=K;try{const ee=await gs().clear(K);ee.success?await z():console.error("清理缓存失败:",ee.error)}catch(ee){console.error("清理缓存失败:",ee)}finally{i.value=null}}async function ve(K){try{await gs().openDir(K)}catch(ee){console.error("打开目录失败:",ee)}}async function de(){await ve("base")}async function L(){x.value=null;try{const K=await window.cacheApi.selectDataDir();if(!K.success||!K.path){K.error==="INSTALL_DIR_FORBIDDEN"&&(x.value=s("settings.storage.dataLocation.installDirForbidden"));return}P.value=K.path,h.value=!0,$.value=!0}catch(K){x.value=K instanceof Error?K.message:String(K)}}async function A(){x.value=null,P.value=null,h.value=!0,$.value=!0}function G(){x.value=null,P.value=null,h.value=!0,$.value=!0}function J(){x.value=null;const K=d.value.trim();if(!K){x.value=s("settings.storage.dataLocation.pathRequired");return}P.value=K,h.value=!0,$.value=!0}function ue(){if(!(!c.value||!m.value)){try{LP(localStorage,c.value)}catch{}w.value=!0}}async function W(){$.value=!1,await H(P.value,h.value)}function V(){$.value=!1,P.value=null,h.value=!1}async function H(K,ee){_.value=!0;try{const fe=lt?await window.cacheApi.setDataDir(K,ee):await gs().setDataDir(K,ee);if(!fe.success){x.value=fe.error||"设置失败";return}if(fe.requiresRelaunch!==!1)try{RP(localStorage)}catch{}if(fe.requiresRelaunch===!1){await F();return}p.value=!0}catch(fe){x.value=fe instanceof Error?fe.message:String(fe)}finally{_.value=!1}}async function ae(){p.value=!1}return tt(()=>{z(),F()}),t({refresh:z}),(K,ee)=>{const fe=We,he=Ke,le=zs,B=ut,N=mt;return v(),k("div",EP,[r("div",FP,[r("div",null,[r("h3",NP,[f(fe,{name:"i-heroicons-folder-open",class:"h-4 w-4 text-amber-500"}),Y(" "+l(o(s)("settings.storage.title")),1)]),r("p",UP,l(o(s)("settings.storage.description")),1)]),r("div",OP,[n.value?.baseDir?(v(),Te(he,{key:0,icon:"i-heroicons-folder-open",variant:"ghost",size:"sm",onClick:de},{default:te(()=>[Y(l(o(s)("settings.storage.openRootDir")),1)]),_:1})):ne("",!0),r("div",VP,[r("span",HP,l(o(s)("settings.storage.totalUsage")),1),r("span",zP,l(S.value),1)]),f(he,{icon:"i-heroicons-arrow-path",variant:"ghost",size:"sm",loading:a.value,onClick:z},null,8,["loading"])])]),a.value&&!n.value?(v(),k("div",BP,[f(fe,{name:"i-heroicons-arrow-path",class:"h-5 w-5 animate-spin text-gray-400"}),r("span",WP,l(o(s)("settings.storage.loading")),1)])):n.value?(v(),k("div",jP,[(v(!0),k(Pe,null,Be(n.value.directories,T=>(v(),k("div",{key:T.id,class:"rounded-lg border border-gray-200 bg-gray-50 px-3 py-2.5 transition-colors hover:bg-gray-100 dark:border-gray-700 dark:bg-gray-800/50 dark:hover:bg-gray-800"},[r("div",qP,[r("div",KP,[r("div",{class:$e(["flex h-8 w-8 shrink-0 items-center justify-center rounded-lg",{"bg-green-100 dark:bg-green-900/30":T.id==="databases","bg-violet-100 dark:bg-violet-900/30":T.id==="ai","bg-cyan-100 dark:bg-cyan-900/30":T.id==="cache","bg-amber-100 dark:bg-amber-900/30":T.id==="downloads","bg-blue-100 dark:bg-blue-900/30":T.id==="logs"}])},[f(fe,{name:T.icon,class:$e(["h-4 w-4",{"text-green-600 dark:text-green-400":T.id==="databases","text-violet-600 dark:text-violet-400":T.id==="ai","text-cyan-600 dark:text-cyan-400":T.id==="cache","text-amber-600 dark:text-amber-400":T.id==="downloads","text-blue-600 dark:text-blue-400":T.id==="logs"}])},null,8,["name","class"])],2),r("div",null,[r("div",GP,[r("h4",XP,l(o(s)(T.name)),1),T.exists?ne("",!0):(v(),Te(le,{key:0,variant:"soft",color:"gray",size:"xs"},{default:te(()=>[Y(l(o(s)("settings.storage.notExist")),1)]),_:1}))]),r("p",YP,l(o(s)(T.description)),1)])]),r("div",QP,[r("div",JP,[r("span",ZP,l(T.fileCount)+" "+l(o(s)("settings.storage.files")),1),r("span",e2,l(C(T.size)),1)]),r("div",t2,[T.canClear&&T.size>0?(v(),Te(he,{key:0,icon:"i-heroicons-trash",variant:"soft",color:"red",size:"xs",loading:i.value===T.id,disabled:i.value!==null,onClick:U=>re(T.id)},{default:te(()=>[Y(l(o(s)("settings.storage.clear")),1)]),_:1},8,["loading","disabled","onClick"])):ne("",!0),f(he,{icon:"i-heroicons-folder-open",variant:"ghost",size:"xs",onClick:U=>ve(T.id)},{default:te(()=>[Y(l(o(s)("settings.storage.open")),1)]),_:1},8,["onClick"])])])])]))),128))])):ne("",!0),M.value?(v(),k(Pe,{key:2},[r("div",s2,[r("div",a2,[r("div",n2,[r("p",o2,l(o(s)("settings.storage.dataLocation.title")),1),r("p",r2,l(o(s)("settings.storage.dataLocation.description")),1)]),r("div",i2,[f(he,{icon:"i-heroicons-folder-open",variant:"ghost",size:"xs",onClick:de},{default:te(()=>[Y(l(o(s)("settings.storage.dataLocation.open")),1)]),_:1})])]),r("div",l2,[f(B,{modelValue:d.value,"onUpdate:modelValue":ee[0]||(ee[0]=T=>d.value=T),readonly:o(lt)||!g.value,size:"sm",class:"min-w-0 flex-1"},null,8,["modelValue","readonly"]),o(lt)?(v(),Te(he,{key:0,size:"sm",variant:"soft",loading:_.value,disabled:_.value,onClick:L},{default:te(()=>[Y(l(o(s)("settings.storage.dataLocation.choose")),1)]),_:1},8,["loading","disabled"])):g.value?(v(),Te(he,{key:1,size:"sm",variant:"soft",loading:_.value,disabled:_.value||!d.value.trim(),onClick:J},{default:te(()=>[Y(l(o(s)("settings.storage.dataLocation.applyPath")),1)]),_:1},8,["loading","disabled"])):ne("",!0),y.value?(v(),Te(he,{key:2,size:"sm",variant:"ghost",disabled:_.value,onClick:A},{default:te(()=>[Y(l(o(s)("settings.storage.dataLocation.reset")),1)]),_:1},8,["disabled"])):ne("",!0)]),!o(lt)&&g.value?(v(),k("p",c2,l(o(s)("settings.storage.dataLocation.serverPathHint")),1)):ne("",!0),D.value?(v(),k("div",d2,[r("div",null,[r("p",u2,l(o(s)("settings.storage.dataLocation.migrateHint")),1),r("p",m2,l(m.value),1)]),r("div",g2,[f(he,{size:"sm",variant:"ghost",disabled:_.value,onClick:ue},{default:te(()=>[Y(l(o(s)("settings.storage.dataLocation.ignoreMigrateHint")),1)]),_:1},8,["disabled"]),f(he,{size:"sm",color:"primary",variant:"soft",loading:_.value,disabled:_.value,onClick:G},{default:te(()=>[Y(l(o(s)("settings.storage.dataLocation.migrateAction")),1)]),_:1},8,["loading","disabled"])])])):ne("",!0),r("p",p2,l(o(lt)?o(s)("settings.storage.dataLocation.restartTip"):o(s)("settings.storage.dataLocation.cliRestartTip")),1),x.value?(v(),k("p",f2,l(x.value),1)):ne("",!0)]),f(N,{open:$.value,"onUpdate:open":ee[1]||(ee[1]=T=>$.value=T),ui:{content:"z-[101]",overlay:"z-[100]"}},{content:te(()=>[r("div",h2,[r("div",v2,[r("div",y2,[f(fe,{name:"i-heroicons-exclamation-triangle",class:"h-5 w-5 text-amber-600 dark:text-amber-400"})]),r("h3",b2,l(o(s)("settings.storage.dataLocation.confirmTitle")),1)]),r("div",_2,[r("p",null,l(o(s)("settings.storage.dataLocation.confirmMessage")),1),r("div",x2,[r("p",k2,l(o(s)("settings.storage.dataLocation.newPath")),1),r("p",w2,l(P.value||o(s)("settings.storage.dataLocation.defaultPath")),1)]),r("div",S2,[r("p",C2,l(o(lt)?o(s)("settings.storage.dataLocation.confirmWarning"):o(s)("settings.storage.dataLocation.cliConfirmWarning")),1)])]),r("div",I2,[f(he,{variant:"ghost",onClick:V},{default:te(()=>[Y(l(o(s)("settings.storage.dataLocation.cancel")),1)]),_:1}),f(he,{color:"primary",onClick:W},{default:te(()=>[Y(l(o(s)("settings.storage.dataLocation.confirm")),1)]),_:1})])])]),_:1},8,["open"]),f(N,{open:p.value,"onUpdate:open":ee[2]||(ee[2]=T=>p.value=T),dismissible:!1,ui:{content:"z-[101]",overlay:"z-[100]"}},{content:te(()=>[r("div",M2,[r("div",T2,[r("div",A2,[f(fe,{name:"i-heroicons-check-circle",class:"h-5 w-5 text-green-600 dark:text-green-400"})]),r("h3",$2,l(o(s)("settings.storage.dataLocation.migrationQueuedTitle")),1)]),r("p",P2,l(o(lt)?o(s)("settings.storage.dataLocation.migrationSuccessMessage"):o(s)("settings.storage.dataLocation.cliMigrationSuccessMessage")),1),r("div",D2,[f(he,{color:"primary",onClick:ae},{default:te(()=>[Y(l(o(lt)?o(s)("settings.storage.dataLocation.relaunchNow"):o(s)("settings.storage.dataLocation.acknowledge")),1)]),_:1})])])]),_:1},8,["open"])],64)):ne("",!0)])}}}),R2={class:"h-full overflow-y-auto"},E2=Re({__name:"StorageTab",setup(e,{expose:t}){const s=I(null);return t({refresh:()=>s.value?.refresh()}),(n,a)=>(v(),k("div",R2,[f(L2,{ref_key:"storageManageRef",ref:s},null,512)]))}}),Kt="chatlab_auth_token",Zs="chatlab_remember_device",$n=Nt("auth",()=>{const e=I(sessionStorage.getItem(Kt)||localStorage.getItem(Kt)||""),t=I(!!localStorage.getItem(Zs)),s=I(!1),n=X(()=>!!e.value);function a(){s.value=!0}function i(d,m){e.value=d,t.value=m,a(),m?(localStorage.setItem(Kt,d),localStorage.setItem(Zs,"1"),sessionStorage.removeItem(Kt)):(sessionStorage.setItem(Kt,d),localStorage.removeItem(Kt),localStorage.removeItem(Zs))}function c(){e.value="",t.value=!1,s.value=!1,sessionStorage.removeItem(Kt),localStorage.removeItem(Kt),localStorage.removeItem(Zs)}return{token:e,requiresAuth:s,rememberDevice:t,isAuthenticated:n,login:i,logout:c,markRequiresAuth:a}}),F2={class:"space-y-6 pr-1"},N2={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},U2={class:"rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},O2={class:"flex items-center justify-between"},V2={class:"flex items-center gap-3"},H2={class:"flex h-12 w-12 items-center justify-center rounded-xl bg-linear-to-br from-pink-500 to-pink-600"},z2={class:"text-xs text-gray-500 dark:text-gray-400"},B2={class:"mt-1 text-xs text-gray-400"},W2={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},j2={class:"rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},q2={class:"flex items-center justify-between"},K2={class:"text-sm font-medium text-gray-900 dark:text-white"},G2={class:"text-xs text-gray-500 dark:text-gray-400"},X2={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},Y2={class:"rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},Q2={class:"flex items-center justify-between"},J2={class:"text-sm font-medium text-gray-900 dark:text-white"},Z2={class:"text-xs text-gray-500 dark:text-gray-400"},eD={key:0},tD={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},sD={class:"rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},aD={class:"flex items-center justify-between"},nD={class:"text-sm font-medium text-gray-900 dark:text-white"},oD=Re({__name:"AboutTab",setup(e){const{t}=Fe(),s=Tn(),n=Hs(),a=ts(),i=Bt(),c=$n(),{debugMode:d}=et(a),m=c.isAuthenticated;function u(){i.closeSettings(),c.logout(),n.push({name:"login"})}const y=I(t("common.loading")),g=I(!1),_=I(!0);async function x(){try{y.value=await $t().getVersion()}catch(h){console.error("Failed to get version:",h),y.value=t("settings.about.unknown")}}async function w(){try{_.value=await $t().getAnalyticsEnabled()}catch(h){console.error("Failed to get analytics status:",h)}}async function $(h){try{await $t().setAnalyticsEnabled(h),_.value=h}catch(p){console.error("Failed to set analytics:",p)}}async function P(){g.value=!0;try{const h=await $t().checkUpdate();if(!h)return;h.error?s.fail(t("settings.about.updateCheckFailed",{error:h.error})):h.hasUpdate?s.success(t("settings.about.newVersionAvailable",{version:h.latestVersion}),{duration:15e3,description:lt?void 0:t("settings.about.webUpdateHint")}):s.success(t("settings.about.upToDate"))}catch(h){console.error("Update check failed:",h)}finally{g.value=!1}}return tt(()=>{x(),w()}),(h,p)=>{const C=We,S=Ke,z=xs;return v(),k("div",F2,[r("div",null,[r("h3",N2,[f(C,{name:"i-heroicons-information-circle",class:"h-4 w-4 text-blue-500"}),Y(" "+l(o(t)("settings.about.title")),1)]),r("div",U2,[r("div",O2,[r("div",V2,[r("div",H2,[f(C,{name:"i-heroicons-chat-bubble-left-right",class:"h-6 w-6 text-white"})]),r("div",null,[p[0]||(p[0]=r("p",{class:"text-sm font-semibold text-gray-900 dark:text-white"},"ChatLab",-1)),r("p",z2,l(o(t)("settings.about.description")),1),r("p",B2,l(o(t)("settings.about.version"))+" "+l(y.value),1)])]),f(S,{disabled:g.value,color:"primary",variant:"soft",size:"sm",onClick:P},{default:te(()=>[f(C,{name:"i-heroicons-arrow-path",class:$e(["mr-1 h-4 w-4",{"animate-spin":g.value}])},null,8,["class"]),Y(" "+l(g.value?o(t)("settings.about.checking"):o(t)("settings.about.checkUpdate")),1)]),_:1},8,["disabled"])])])]),r("div",null,[r("h3",W2,[f(C,{name:"i-heroicons-shield-check",class:"h-4 w-4 text-purple-500"}),Y(" "+l(o(t)("settings.about.privacy.title")),1)]),r("div",j2,[r("div",q2,[r("div",null,[r("p",K2,l(o(t)("settings.about.privacy.analytics")),1),r("p",G2,l(o(t)("settings.about.privacy.analyticsDesc")),1)]),f(z,{"model-value":_.value,"onUpdate:modelValue":$},null,8,["model-value"])])])]),r("div",null,[r("h3",X2,[f(C,{name:"i-heroicons-wrench-screwdriver",class:"h-4 w-4 text-orange-500"}),Y(" "+l(o(t)("settings.about.developer.title")),1)]),r("div",Y2,[r("div",Q2,[r("div",null,[r("p",J2,l(o(t)("settings.about.developer.debugMode")),1),r("p",Z2,l(o(t)("settings.about.developer.debugModeDesc")),1)]),f(z,{"model-value":o(d),"onUpdate:modelValue":o(a).setDebugMode},null,8,["model-value","onUpdate:modelValue"])])])]),o(m)?(v(),k("div",eD,[r("h3",tD,[f(C,{name:"i-heroicons-arrow-right-on-rectangle",class:"h-4 w-4 text-red-500"}),Y(" "+l(o(t)("common.login.logoutTitle")),1)]),r("div",sD,[r("div",aD,[r("div",null,[r("p",nD,l(o(t)("common.login.logoutDesc")),1)]),f(S,{color:"error",variant:"soft",size:"sm",onClick:u},{default:te(()=>[f(C,{name:"i-heroicons-arrow-right-on-rectangle",class:"mr-1 h-4 w-4"}),Y(" "+l(o(t)("common.login.logout")),1)]),_:1})])])])):ne("",!0)])}}});function rD(){const e=()=>()=>{};async function t(s,n){const a=await Rt(s,n);if(!a.ok){const i=await a.json().catch(()=>({}));throw new Error(i?.error||`HTTP ${a.status}`)}return a.json()}return{getConfig:()=>t("/_web/automation/config"),getStatus:async()=>({running:!0,port:null,startedAt:null,error:null}),setEnabled:async()=>({running:!0,port:null,startedAt:null,error:null}),setPort:async()=>({running:!0,port:null,startedAt:null,error:null}),regenerateToken:async()=>t("/_web/automation/config"),onStartupError:e,getDataSources:()=>t("/_web/automation/data-sources"),addDataSource:s=>t("/_web/automation/data-sources",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}),updateDataSource:(s,n)=>t(`/_web/automation/data-sources/${s}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)}),deleteDataSource:async s=>(await t(`/_web/automation/data-sources/${s}`,{method:"DELETE"})).success,addImportSessions:(s,n)=>t(`/_web/automation/data-sources/${s}/sessions`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessions:n})}),removeImportSession:async(s,n,a)=>(await t(`/_web/automation/data-sources/${s}/sessions/${n}${a?"?deleteData=true":""}`,{method:"DELETE"})).success,triggerPull:(s,n)=>t(`/_web/automation/data-sources/${s}/pull`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:n})}),triggerPullAll:s=>t(`/_web/automation/data-sources/${s}/pull-all`,{method:"POST"}),onPullResult:e,fetchRemoteSessions:async(s,n,a)=>{const i=new URLSearchParams({baseUrl:s});return n&&i.set("token",n),a?.keyword&&i.set("keyword",a.keyword),a?.limit&&i.set("limit",String(a.limit)),a?.cursor&&i.set("cursor",a.cursor),t(`/_web/automation/remote-sessions?${i}`)}}}function iD(){return rD()}const xi=Nt("apiServer",()=>{const e=iD(),t=I({enabled:!1,port:5200,token:"",createdAt:0}),s=I({running:!1,port:null,startedAt:null,error:null}),n=I(!1),a=I([]),i=I(new Set),c=I(new Map),d=X(()=>!0),m=X(()=>s.value.running),u=X(()=>!!s.value.error),y=X(()=>s.value.error?.startsWith("PORT_IN_USE")??!1),g=X(()=>!lt);async function _(){try{t.value=await e.getConfig()}catch(W){console.error("[ApiServerStore] Failed to fetch config:",W)}}async function x(){try{s.value=await e.getStatus()}catch(W){console.error("[ApiServerStore] Failed to fetch status:",W)}}async function w(){await Promise.all([_(),x(),C()])}async function $(W){n.value=!0;try{s.value=await e.setEnabled(W),await _()}catch(V){console.error("[ApiServerStore] Failed to set enabled:",V)}finally{n.value=!1}}async function P(W){n.value=!0;try{s.value=await e.setPort(W),await _()}catch(V){console.error("[ApiServerStore] Failed to set port:",V)}finally{n.value=!1}}async function h(){try{t.value=await e.regenerateToken()}catch(W){console.error("[ApiServerStore] Failed to regenerate token:",W)}}function p(){return e.onStartupError(W=>{s.value.error=W.error,s.value.running=!1})}async function C(){try{a.value=await e.getDataSources()}catch(W){console.error("[ApiServerStore] Failed to fetch data sources:",W)}}async function S(W){try{const V=await e.addDataSource(W);return a.value.push(V),V}catch(V){return console.error("[ApiServerStore] Failed to add data source:",V),null}}async function z(W,V){try{const H=await e.updateDataSource(W,V);if(H){const ae=a.value.findIndex(K=>K.id===W);ae!==-1&&(a.value[ae]=H)}return H}catch(H){return console.error("[ApiServerStore] Failed to update data source:",H),null}}async function M(W){try{const V=await e.deleteDataSource(W);return V&&(a.value=a.value.filter(H=>H.id!==W)),V}catch(V){return console.error("[ApiServerStore] Failed to delete data source:",V),!1}}async function D(W,V){try{const H=await e.addImportSessions(W,V);if(await C(),H.length>0){for(const ae of H)i.value.add(ae.id);i.value=new Set(i.value),E(W,H.map(ae=>ae.id))}return H}catch(H){return console.error("[ApiServerStore] Failed to add import sessions:",H),[]}}function E(W,V,H=24,ae=5e3){let K=0;const ee=setInterval(async()=>{K++,await Promise.all([C(),F()]);const fe=a.value.find(le=>le.id===W);if(V.filter(le=>{const B=fe?.sessions.find(N=>N.id===le);return B&&B.lastStatus==="idle"}).length===0||K>=H){for(const le of V)i.value.delete(le),c.value.delete(le);i.value=new Set(i.value),c.value=new Map(c.value),clearInterval(ee)}},ae)}async function F(){if(g.value)try{const W=await Rt("/_web/automation/sync-progress").then(H=>H.json()),V=new Map;for(const H of W)H.done||V.set(H.sessionId,{current:H.current,pages:H.pages});c.value=V}catch{}}async function re(W,V,H){try{const ae=await e.removeImportSession(W,V,H);return ae&&(await C(),H&&St().loadSessions()),ae}catch(ae){return console.error("[ApiServerStore] Failed to remove import session:",ae),!1}}async function ve(W,V){const H=V||W;i.value.add(H),i.value=new Set(i.value);const ae=L();try{const K=await e.triggerPull(W,V);return await C(),await St().loadSessions(),G(W,V),K}catch(K){return console.error("[ApiServerStore] Failed to trigger pull:",K),{success:!1,error:String(K)}}finally{clearInterval(ae),i.value.delete(H),i.value=new Set(i.value),c.value.delete(H),c.value=new Map(c.value)}}async function de(W){const V=a.value.find(K=>K.id===W),H=[W,...V?.sessions.map(K=>K.id)??[]];for(const K of H)i.value.add(K);i.value=new Set(i.value);const ae=L();try{const K=await e.triggerPullAll(W);return await C(),await St().loadSessions(),G(W),K}catch(K){return console.error("[ApiServerStore] Failed to trigger pull all:",K),{success:!1,error:String(K)}}finally{clearInterval(ae);for(const K of H)i.value.delete(K),c.value.delete(K);i.value=new Set(i.value),c.value=new Map(c.value)}}function L(){return setInterval(F,3e3)}function A(){return e.onPullResult(async()=>{await C(),await St().loadSessions(),J()})}function G(W,V){const H=a.value.find(fe=>fe.id===W);if(!H)return;const ae=V?H.sessions.filter(fe=>fe.id===V&&fe.targetSessionId):H.sessions.filter(fe=>fe.targetSessionId),K=dt(),ee=rs();for(const fe of ae)K.generateIncremental(fe.targetSessionId,ee).catch(()=>{})}function J(){const W=dt(),V=rs();for(const H of a.value)for(const ae of H.sessions)ae.targetSessionId&&W.generateIncremental(ae.targetSessionId,V).catch(()=>{})}async function ue(W,V,H){return e.fetchRemoteSessions(W,V,H)}return{config:t,status:s,loading:n,dataSources:a,pullingIds:i,syncProgress:c,available:d,isRunning:m,hasError:u,isPortInUse:y,isWebMode:g,fetchConfig:_,fetchStatus:x,refresh:w,setEnabled:$,setPort:P,regenerateToken:h,listenStartupError:p,fetchDataSources:C,addDataSource:S,updateDataSource:z,deleteDataSource:M,addImportSessions:D,removeImportSession:re,triggerPull:ve,triggerPullAll:de,listenPullResult:A,fetchRemoteSessions:ue}}),ki={"en-US":"en","zh-CN":"cn","zh-TW":"tw","ja-JP":"ja"},wi="/_proxy/chatlab.fun";function vE(e){return ki[e]??""}function yE(e){const t=ki[e];return t?`?lang=${t}`:""}const Wo=wi,lD={"zh-CN":"cn","zh-TW":"cn","en-US":"en","ja-JP":"ja"},Si=Nt("assistant",()=>{const e=I([]),t=I(null),s=I(!1),n=I([]),a=I([]),i=I([]),c=I(!1),d=I(null),m=I("group"),u=I("zh-CN"),y=X(()=>t.value?e.value.find(W=>W.id===t.value)??null:null),g=X(()=>e.value.filter(W=>{const V=!W.applicableChatTypes?.length||W.applicableChatTypes.includes(m.value),H=!W.supportedLocales?.length||W.supportedLocales.some(ae=>u.value.startsWith(ae));return V&&H})),_=4,x=X(()=>g.value.slice(0,_)),w=X(()=>g.value.slice(_)),$=X(()=>g.value.length>_),P=X(()=>{const W=new Set(e.value.map(V=>V.id));return i.value.map(V=>({...V,imported:W.has(V.id)}))});function h(W,V){m.value=W,u.value=V}async function p(){try{const W=_t();e.value=await W.getAll(),s.value=!0}catch(W){console.error("[AssistantStore] Failed to load assistants:",W)}}async function C(){try{n.value=await _t().getBuiltinCatalog()}catch(W){console.error("[AssistantStore] Failed to load builtin catalog:",W)}}async function S(){try{a.value=await _t().getBuiltinToolCatalog()}catch(W){console.error("[AssistantStore] Failed to load builtin tool catalog:",W)}}async function z(W){const V=lD[W||u.value]??"en",H=`${Wo}/${V}/assistant.json`;c.value=!0,d.value=null;try{const ae=await $t().fetchRemoteConfig(H);if(!ae.success||!ae.data){d.value=ae.error||"Failed to fetch cloud catalog",i.value=[];return}const K=ae.data;if(!Array.isArray(K)){d.value="Invalid catalog format",i.value=[];return}i.value=K.filter(ee=>ee.id&&ee.name&&ee.path)}catch(ae){d.value=String(ae),i.value=[]}finally{c.value=!1}}async function M(W){const V=`${Wo}${W.path}`;try{const H=await $t().fetchRemoteConfig(V);if(!H.success||typeof H.data!="string")return{success:!1,error:H.error||"Failed to fetch assistant content"};const ae=await _t().importFromMd(H.data);return ae.success&&await p(),ae}catch(H){return{success:!1,error:String(H)}}}function D(W){return e.value.some(V=>V.id===W)}function E(W){t.value=W}function F(){t.value=null}async function re(W){try{return await _t().getConfig(W)}catch(V){return console.error("[AssistantStore] Failed to get config:",V),null}}async function ve(W,V){try{const H=await _t().update(W,V);return H.success&&await p(),H}catch(H){return{success:!1,error:String(H)}}}async function de(W){try{const V=await _t().reset(W);return V.success&&await p(),V}catch(V){return{success:!1,error:String(V)}}}async function L(W){try{const V=await _t().importBuiltin(W);return V.success&&(await p(),await C()),V}catch(V){return{success:!1,error:String(V)}}}async function A(W){try{const V=await _t().reimport(W);return V.success&&(await p(),await C()),V}catch(V){return{success:!1,error:String(V)}}}async function G(W){try{const V=await _t().create(W);return V.success&&await p(),V}catch(V){return{success:!1,error:String(V)}}}async function J(W){try{const V=_t(),H=await V.getConfig(W);if(!H)return{success:!1,error:"Assistant not found"};const{id:ae,builtinId:K,...ee}=H,fe=await V.create({...ee,name:`${H.name}${xa.global.t("ai.assistant.duplicateSuffix")}`});return fe.success&&await p(),fe}catch(V){return{success:!1,error:String(V)}}}async function ue(W){try{const V=await _t().delete(W);return V.success&&await p(),V}catch(V){return{success:!1,error:String(V)}}}return{assistants:e,selectedAssistantId:t,selectedAssistant:y,isLoaded:s,builtinCatalog:n,builtinToolCatalog:a,cloudCatalog:i,cloudLoading:c,cloudError:d,cloudCatalogWithStatus:P,currentChatType:m,currentLocale:u,filteredAssistants:g,defaultAssistants:x,moreAssistants:w,hasMoreAssistants:$,loadAssistants:p,loadBuiltinCatalog:C,loadBuiltinToolCatalog:S,fetchCloudCatalog:z,importFromCloud:M,isCloudItemImported:D,selectAssistant:E,clearSelection:F,setFilterContext:h,getAssistantConfig:re,updateAssistant:ve,createAssistant:G,duplicateAssistant:J,resetAssistant:de,importAssistant:L,reimportAssistant:A,deleteAssistant:ue}}),jo=wi,cD={"zh-CN":"cn","zh-TW":"cn","en-US":"en","ja-JP":"ja"},dD=Nt("skill",()=>{const e=I([]),t=I(null),s=I(!1),n=I([]),a=I([]),i=I(!1),c=I(null),d=I("group"),m=I("zh-CN");function u(){const L=m.value.startsWith("zh");return{id:Ms,name:L?"绘图助手":"Chart Assistant",description:L?"按本轮问题生成灵活的聊天数据图表":"Generate flexible charts for this chat question",tags:[L?"图表":"chart"],chatScope:"all",tools:["render_chart","get_schema"],builtinId:Ms}}const y=X(()=>t.value?t.value===Ms?u():e.value.find(L=>L.id===t.value)??null:null),g=X(()=>u()),_=X(()=>e.value.filter(L=>L.chatScope==="all"||L.chatScope===d.value)),x=X(()=>{const A=Si().selectedAssistant,G=[g.value,..._.value];return A?G.filter(J=>(J.tools.length,!0)):G}),w=X(()=>{const L={};for(const A of x.value){const G=A.tags[0]||"other";L[G]||(L[G]=[]),L[G].push(A)}return L}),$=X(()=>{const L=new Set(e.value.map(A=>A.id));return a.value.map(A=>({...A,imported:L.has(A.id)}))});function P(L,A){d.value=L,A&&(m.value=A)}async function h(){try{e.value=await Ot().getAll(),s.value=!0}catch(L){console.error("[SkillStore] Failed to load skills:",L)}}async function p(){try{n.value=await Ot().getBuiltinCatalog()}catch(L){console.error("[SkillStore] Failed to load builtin catalog:",L)}}async function C(){const L=cD[m.value]??"en",A=`${jo}/${L}/skill.json`;i.value=!0,c.value=null;try{const G=await $t().fetchRemoteConfig(A);if(!G.success||!G.data){c.value=G.error||"Failed to fetch cloud catalog",a.value=[];return}const J=G.data;if(!Array.isArray(J)){c.value="Invalid catalog format",a.value=[];return}a.value=J.filter(ue=>ue.id&&ue.name&&ue.path)}catch(G){c.value=String(G),a.value=[]}finally{i.value=!1}}async function S(L){const A=`${jo}${L.path}`;try{const G=await $t().fetchRemoteConfig(A);if(!G.success||typeof G.data!="string")return{success:!1,error:G.error||"Failed to fetch skill content"};const J=await Ot().importFromMd(G.data);return J.success&&await h(),J}catch(G){return{success:!1,error:String(G)}}}function z(L){return e.value.some(A=>A.id===L)}function M(L){t.value=L}async function D(L){if(L===Ms)return{...u(),prompt:"",builtinId:Ms};try{return await Ot().getConfig(L)}catch(A){return console.error("[SkillStore] Failed to get skill config:",A),null}}async function E(L,A){try{const G=await Ot().update(L,A);return G.success&&await h(),G}catch(G){return{success:!1,error:String(G)}}}async function F(L){try{const A=await Ot().create(L);return A.success&&await h(),A}catch(A){return{success:!1,error:String(A)}}}async function re(L){try{const A=await Ot().delete(L);return A.success&&(t.value===L&&(t.value=null),await h()),A}catch(A){return{success:!1,error:String(A)}}}async function ve(L){try{const A=await Ot().importBuiltin(L);return A.success&&(await h(),await p()),A}catch(A){return{success:!1,error:String(A)}}}async function de(L){try{const A=await Ot().reimport(L);return A.success&&(await h(),await p()),A}catch(A){return{success:!1,error:String(A)}}}return{skills:e,activeSkillId:t,builtinCatalog:n,isLoaded:s,currentChatType:d,currentLocale:m,activeSkill:y,scopedSkills:_,compatibleSkills:x,groupedSkills:w,cloudCatalog:a,cloudLoading:i,cloudError:c,cloudCatalogWithStatus:$,setFilterContext:P,loadSkills:h,loadBuiltinCatalog:p,fetchCloudCatalog:C,importFromCloud:S,isCloudItemImported:z,activateSkill:M,getSkillConfig:D,updateSkill:E,createSkill:F,deleteSkill:re,importSkill:ve,reimportSkill:de}});async function Ci(e){const{url:t,method:s="POST",headers:n={},body:a,signal:i,onEvent:c}=e,d=await Rt(t,{method:s,headers:{"Content-Type":"application/json",...n},body:a!=null?JSON.stringify(a):void 0,signal:i});if(!d.ok){const _=await d.text().catch(()=>"");throw new Error(`SSE request failed: HTTP ${d.status} ${_}`)}if(!d.body)throw new Error("SSE response has no body");const m=d.body.getReader(),u=new TextDecoder;let y="",g="";for(;;){const{done:_,value:x}=await m.read();if(_)break;y+=u.decode(x,{stream:!0});const w=y.split(`
7
+ `);y=w.pop()||"";for(const $ of w)$.startsWith("event: ")?g=$.slice(7).trim():$.startsWith("data: ")&&(c({event:g,data:$.slice(6)}),g="")}y.trim()&&y.startsWith("data: ")&&c({event:g,data:y.slice(6)})}function bE(){return{async chatStream(e,t,s){let n;try{return await Ci({url:"/_web/ai/llm/chat-stream",body:{messages:e,options:t},onEvent:({data:a})=>{try{const i=JSON.parse(a);i.finishReason==="error"&&i.error&&(n=i.error),s?.(i)}catch{}}}),n?{success:!1,error:n}:{success:!0}}catch(a){const i=a instanceof Error?a.message:String(a);return{success:!1,error:n??i}}}}}const us=new Map;function Ra(){return{runStream(e,t){const s=new AbortController,n=`local_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;us.set(n,{serverId:"",abortController:s});const a=new Promise(i=>{let c="";const d=[];let m=0,u,y=!1,g;Ci({url:"/_web/ai/agent/stream",body:e,signal:s.signal,onEvent:({event:_,data:x})=>{try{const w=JSON.parse(x);if(_==="meta"){const P=us.get(n);P&&(P.serverId=w.requestId??"");return}const $=w;switch(t?.($),$.type){case"content":$.content&&(c+=$.content);break;case"tool_start":$.toolName&&d.push($.toolName);break;case"status":$.status&&(m=$.status.round);break;case"done":$.usage&&(u=$.usage);break;case"error":y=!0,g=$.error;break}}catch{}}}).then(()=>{us.delete(n),i({success:!y,result:{content:c,toolsUsed:d,toolRounds:m,totalUsage:u},...y&&g?{error:g}:{}})}).catch(_=>{us.delete(n),s.signal.aborted?i({success:!1,result:{content:c,toolsUsed:d,toolRounds:m,aborted:!0}}):i({success:!1,error:{name:"FetchError",message:_.message??String(_),stack:null}})})});return{requestId:n,promise:a}},async abort(e){const t=us.get(e);if(!t)return{success:!1,error:"Request not found"};if(t.abortController.abort(),t.serverId)try{const{post:s}=await je(async()=>{const{post:n}=await Promise.resolve().then(()=>tu);return{post:n}},void 0);await s("/ai/agent/abort",{requestId:t.serverId})}catch{}return us.delete(e),{success:!0}}}}function uD(e){return e.desensitize&&!e.desensitizeRules.some(t=>t.builtin)}function mD(e){if(e.dataCleaning||e.mergeConsecutive||e.blacklistKeywords.length>0||e.denoise||e.desensitize||e.anonymizeNames)return{dataCleaning:e.dataCleaning,mergeConsecutive:e.mergeConsecutive,mergeWindowSeconds:e.mergeWindowSeconds,blacklistKeywords:[...e.blacklistKeywords],denoise:e.denoise,desensitize:e.desensitize,desensitizeRules:e.desensitizeRules.map(s=>({...s,locales:[...s.locales]})),anonymizeNames:e.anonymizeNames}}function Tt(e){return e==="render_chart"}function gD(e,t,s){if(!e||!Tt(e))return null;const n=e;return{type:"tool",tool:{name:n,displayName:n,status:"running",params:t,toolCallId:s,transient:!0}}}function Ii(e,t,s){if(!ft(e))return!1;const n=e;return n.type!=="tool"||!n.tool||n.tool.transient!==!0||n.tool.name!==t||s&&n.tool.toolCallId!==s?!1:Tt(String(n.tool.name))}function pD(e,t,s){let n=!1;const a=[...e];for(let i=a.length-1;i>=0;i--)if(Ii(a[i],t,s)){a.splice(i,1),n=!0;break}return n?a:[...e]}function ft(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function qo(e){return ft(e)&&e.version===1&&ft(e.spec)&&ft(e.dataset)}function sn(e){if(!ft(e))return[];const t=ft(e.details)?e.details:e,s=[];if(qo(t.chart)&&s.push(t.chart),Array.isArray(t.charts))for(const n of t.charts)qo(n)&&s.push(n);return s}function Mi(e){return{...e,dataset:{...e.dataset,rows:[]}}}function Ti(e){return e.map(t=>({type:"chart",chart:Mi(t)}))}function an(e){return Array.isArray(e)?`[${e.map(an).join(",")}]`:ft(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${an(e[t])}`).join(",")}}`:JSON.stringify(e)}function Ko(e){const t=Mi(e);return an({spec:t.spec,columns:t.dataset.columns,data:t.data,rowCount:t.rowCount,truncated:t.truncated})}function fD(e,t){const s=Ko(t);return e.some(n=>{if(!ft(n))return!1;const a=n;return a.type==="chart"&&a.chart?Ko(a.chart)===s:!1})}function hD(e,t,s,n){const a=[...e];let i=-1;for(let u=a.length-1;u>=0;u--)if(Ii(a[u],t,s)){i=u;break}const c=i>=0?a.filter((u,y)=>y!==i):a,d=n.filter(u=>!fD(c,u)),m=Ti(d);return i>=0?(a.splice(i,1,...m),a):[...a,...m]}function vD(e,t,s,n,a){if(n.length>0)return hD(e,t,s,n);const i=pD(e,t,s);return a?[...i,a]:i}function _E(e,t,s){const n=e[t];return!ft(n)||n.type!=="error"||!ft(n.error)||n.error.name!=="ChartRenderError"?!1:s?.isStreaming?!0:e.slice(t+1).some(a=>ft(a)&&a.type==="chart")}function yD(e){return ft(e)?typeof e.error=="string"?e.error:ft(e.error)&&typeof e.error.message=="string"?e.error.message:Array.isArray(e.content)?e.content.map(t=>ft(t)&&t.type==="text"&&typeof t.text=="string"?t.text:"").join(`
8
+ `).trim():null:null}function Go(e,t){if(!Tt(e)||sn(t).length>0)return null;const s=yD(t);if(!s)return null;const a=/^Error:\s*(.+)$/is.exec(s)?.[1]?.trim();return!a||/^Call get_schema before render_chart\b/i.test(a)?null:{type:"error",error:{name:"ChartRenderError",message:a,stack:null}}}function da(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ea(e){return da(e)&&e.version===1&&typeof e.query=="string"&&Array.isArray(e.groups)}function Xo(e){if(!da(e))return null;const t=da(e.details)?e.details:null;if(t&&Ea(t.evidence))return t.evidence;const s=da(e.data)?e.data:null;return s&&Ea(s.evidence)?s.evidence:Ea(e.evidence)?e.evidence:null}function bD(e){return{type:"evidence",evidence:e}}function Yo(e){return JSON.parse(JSON.stringify(e))}function Pn(e){return JSON.parse(JSON.stringify(e))}function Ai(e){return e?.type==="plan_draft"&&typeof e.text=="string"}function _D(e,t){const s=e.map(Pn),n=s[s.length-1];return Ai(n)?n.text+=t:s.push({type:"plan_draft",version:1,status:"streaming",text:t}),s}function xD(e,t){const s=e.map(Pn);for(let n=s.length-1;n>=0;n--){const a=s[n];if(Ai(a)){const i=a.text.trim();return s[n]={...Yo(t),...i?{displayText:i}:{}},s}}return s.push(Yo(t)),s}function kD(e){return e.filter(t=>t.type!=="plan_draft").map(Pn)}function Qo(e){if(!e)return;const t=JSON.parse(JSON.stringify(e));for(const s of t)s.type==="tool"&&delete s.tool.displayResult;return t}const Mt="__draft__";function Fa(e){return e.startsWith("en")?"general_en":e.startsWith("ja")?"general_ja":"general_cn"}function wD(e){return e?`${e.startTs}_${e.endTs}`:"all"}function SD(e){return`${e.sessionId}:${e.chatType}:${wD(e.timeFilter)}`}function nn(){return{promptTokens:0,completionTokens:0,totalTokens:0,cacheReadTokens:0,cacheWriteTokens:0}}function Jo(e){return{promptTokens:e.promptTokens??0,completionTokens:e.completionTokens??0,totalTokens:e.totalTokens??0,cacheReadTokens:e.cacheReadTokens??0,cacheWriteTokens:e.cacheWriteTokens??0}}function ea(e){if(e&&typeof e=="object"){const t=e;return{name:typeof t.name=="string"?t.name:null,message:typeof t.message=="string"?t.message:"未知错误",stack:typeof t.stack=="string"?t.stack:null,statusCode:typeof t.statusCode=="number"?t.statusCode:null,url:typeof t.url=="string"?t.url:null,responseBody:typeof t.responseBody=="string"?t.responseBody:null,responseHeaders:t.responseHeaders&&typeof t.responseHeaders=="object"?t.responseHeaders:null,requestBody:typeof t.requestBody=="string"?t.requestBody:null,cause:typeof t.cause=="string"?t.cause:null,provider:typeof t.provider=="string"?t.provider:null,friendlyMessage:typeof t.friendlyMessage=="string"?t.friendlyMessage:null}}return{name:null,message:e?String(e):"未知错误",stack:null}}function ta(e){return{id:e.id,role:e.role,content:e.content,timestamp:e.timestamp*1e3,parentId:e.parentId,contentBlocks:e.contentBlocks}}function on(e=null){return{messages:[],sourceMessages:[],currentKeywords:[],assistantId:e,loaded:!1}}function CD(e){const t=on(null);return{sessionId:e.sessionId,sessionName:e.sessionName,chatType:e.chatType,locale:e.locale,timeFilter:e.timeFilter,selectedAssistantId:null,messages:t.messages,sourceMessages:t.sourceMessages,currentKeywords:t.currentKeywords,isLoadingSource:!1,isAIThinking:!1,currentAIChatId:null,currentToolStatus:null,toolsUsedInCurrentRound:[],sessionTokenUsage:nn(),agentStatus:null,ownerInfo:void 0,ownerInfoInitialized:!1,isAborted:!1,currentRequestId:"",currentAgentRequestId:"",aiChatBuffers:{[Mt]:t}}}function Na(e){return e.currentAIChatId??Mt}const ID=Nt("aiChatRuntime",()=>{const e=I({}),t=I(null),s=ka(),n=St(),a=ts(),i=Si(),c=dD(),d=Ws(),{aiGlobalSettings:m}=et(s);let u=!1;function y(B){return`${B}_${Date.now()}_${Math.random().toString(36).slice(2,8)}`}function g(B){const N=SD(B),T=e.value[N];if(T)return T.sessionName=B.sessionName,T.chatType=B.chatType,T.locale=B.locale,T.timeFilter=B.timeFilter,{chatKey:N,state:T};const U=CD(B);e.value[N]=U;const Z=e.value[N];return p(N),{chatKey:N,state:Z}}function _(B){return e.value[B]??null}function x(){return t.value?_(t.value.chatKey):null}function w(B,N,T=null){return B.aiChatBuffers[N]||(B.aiChatBuffers[N]=on(T)),B.aiChatBuffers[N]}function $(B,N){const T=B.currentAIChatId??Mt,U=B.aiChatBuffers[T];U&&(U.sessionTokenUsage={...B.sessionTokenUsage});const Z=w(B,N);B.currentAIChatId=N===Mt?null:N,B.messages=Z.messages,B.sourceMessages=Z.sourceMessages,B.currentKeywords=Z.currentKeywords,B.selectedAssistantId=Z.assistantId,B.sessionTokenUsage=Z.sessionTokenUsage?{...Z.sessionTokenUsage}:nn(),B.agentStatus=null}function P(B,N,T){const U=w(B,N);return B.aiChatBuffers[T]=U,N!==T&&delete B.aiChatBuffers[N],B.currentAIChatId===null&&N===Mt&&(B.currentAIChatId=T),U}function h(B){const N=_(B);N&&(N.selectedAssistantId?i.selectAssistant(N.selectedAssistantId):i.clearSelection())}async function p(B){const N=_(B);if(!N)return;const U=n.sessions.find(Z=>Z.id===N.sessionId)?.ownerId;if(!U){N.ownerInfo=void 0,N.ownerInfoInitialized=!0;return}if(!(N.ownerInfoInitialized&&N.ownerInfo?.platformId===U))try{const oe=(await kt().getMembers(N.sessionId)).find(me=>me.platformId===U);N.ownerInfo=oe?{platformId:U,displayName:oe.groupNickname||oe.accountName||U}:{platformId:U,displayName:U},N.ownerInfoInitialized=!0}catch(Z){console.error("[AI] 获取 Owner 信息失败:",Z),N.ownerInfo=void 0,N.ownerInfoInitialized=!0}}function C(B,N,T,U=null){const Z=_(B);Z&&(t.value={requestId:T,chatKey:B,sessionId:Z.sessionId,sessionName:Z.sessionName,chatType:Z.chatType,aiChatId:U,questionPreview:N.trim().slice(0,80),startedAt:Date.now()})}function S(B,N){t.value&&t.value.chatKey===B&&(N&&t.value.requestId!==N||(t.value=null))}function z(B,N){t.value&&t.value.chatKey===B&&(t.value.aiChatId=N)}function M(B){return{phase:"preparing",round:0,toolsUsed:B.toolsUsedInCurrentRound.length,contextTokens:0,totalUsage:{...B.sessionTokenUsage},updatedAt:Date.now()}}function D(B,N,T){const U=B.agentStatus?{...B.agentStatus}:M(B);B.agentStatus={...U,...T,phase:N,updatedAt:Date.now()}}function E(B,N){const T=_(B);if(!T||T.isAIThinking)return!1;const U=w(T,Na(T),N);return U.assistantId=N,T.selectedAssistantId=N,i.selectAssistant(N),!0}async function F(B,N){const T=_(B);if(!T)return!1;try{const U=await xt().getAIChat(N),Z=w(T,N,U?.assistantId??null);if(!Z.loaded){const[oe,me]=await Promise.all([xt().getMessages(N),xt().getAIChatTokenUsage(N)]);Z.messages.splice(0,Z.messages.length,...oe.map(pe=>ta(pe))),Z.sourceMessages.splice(0,Z.sourceMessages.length),Z.currentKeywords.splice(0,Z.currentKeywords.length),Z.sessionTokenUsage=Jo(me),Z.loaded=!0}return Z.assistantId=U?.assistantId??Z.assistantId??null,$(T,N),h(B),!0}catch(U){return console.error("[AI] 加载对话历史失败:",U),!1}}function re(B,N){const T=_(B);if(!T)return!1;const U=N??Mt;return T.aiChatBuffers[U]?($(T,U),h(B),!0):!1}function ve(){return t.value?(u=!0,re(t.value.chatKey,t.value.aiChatId)):!1}async function de(B){if(u){u=!1;return}const N=_(B);if(!(!N||N.isAIThinking)){if(i.isLoaded||await i.loadAssistants(),!N.selectedAssistantId){const T=Fa(N.locale);E(B,T)}L(B)}}function L(B,N){const T=_(B);if(!T||T.isAIThinking)return!1;const U=on(T.selectedAssistantId);return T.aiChatBuffers[Mt]=U,$(T,Mt),T.currentToolStatus=null,T.toolsUsedInCurrentRound=[],T.isLoadingSource=!1,T.sessionTokenUsage=nn(),T.agentStatus=null,T.isAborted=!1,T.currentRequestId="",T.currentAgentRequestId="",N&&U.messages.push({id:y("welcome"),role:"assistant",content:N,timestamp:Date.now()}),!0}async function A(){}async function G(){}function J(B,N){const T=j=>{const q=N();B.messages[q]={...B.messages[q],...j}};return{updateAIMessage:T,appendTextToBlocks:j=>{if(!j)return;const q=N(),R=B.messages[q].contentBlocks||[],xe=R[R.length-1];j.trim().length===0&&(!xe||xe.type!=="text")||(xe&&xe.type==="text"?xe.text+=j:R.push({type:"text",text:j}),T({contentBlocks:[...R],content:B.messages[q].content+j}))},appendThinkToBlocks:(j,q,R)=>{if(!j&&R===void 0)return;const xe=N(),Se=B.messages[xe].contentBlocks||[],se=q||"think",Ae=Se[Se.length-1];let Oe=Ae;if(Ae&&Ae.type==="think"&&Ae.tag===se)Ae.text+=j;else if(j.trim().length>0)Oe={type:"think",tag:se,text:j},Se.push(Oe);else if(R!==void 0)for(let st=Se.length-1;st>=0;st--){const ce=Se[st];if(ce.type==="think"&&ce.tag===se){Oe=ce;break}}R!==void 0&&Oe&&Oe.type==="think"&&(Oe.durationMs=R),T({contentBlocks:[...Se]})},appendChartsToBlocks:j=>{if(j.length===0)return;const q=N(),R=B.messages[q].contentBlocks||[];R.push(...Ti(j)),T({contentBlocks:[...R]})},appendEvidenceToBlocks:j=>{const q=N(),R=B.messages[q].contentBlocks||[];R.push(bD(j)),T({contentBlocks:[...R]})},appendPlanDraftToBlocks:j=>{if(!j)return;const q=N(),R=B.messages[q].contentBlocks||[];T({contentBlocks:[..._D(R,j)]})},appendPlanToBlocks:j=>{const q=N(),R=B.messages[q].contentBlocks||[];T({contentBlocks:[...xD(R,j)]})},removePlanDraftsFromBlocks:()=>{const j=N(),q=B.messages[j].contentBlocks||[];T({contentBlocks:[...kD(q)]})},updatePlanBlockStatus:j=>{const q=N(),R=B.messages[q].contentBlocks||[];for(let xe=R.length-1;xe>=0;xe--){const Se=R[xe];if(Se.type==="plan"){Se.status=j;break}}T({contentBlocks:[...R]})},appendErrorToBlocks:j=>{const q=N(),R=B.messages[q].contentBlocks||[];R.push({type:"error",error:j}),T({contentBlocks:[...R]})},addToolBlock:(j,q,R)=>{const xe=N(),Se=B.messages[xe].contentBlocks||[];Se.push({type:"tool",tool:{name:j,displayName:j,status:"running",params:q,toolCallId:R}}),T({contentBlocks:[...Se]})},addRenderOnlyToolPendingBlock:(j,q,R)=>{const xe=gD(j,q,R);if(!xe)return;const Se=N(),se=B.messages[Se].contentBlocks||[];se.push(xe),T({contentBlocks:[...se]})},updateRenderOnlyToolResult:(j,q,R,xe)=>{const Se=N(),se=B.messages[Se].contentBlocks||[];T({contentBlocks:vD(se,j,q,R,xe)})},updateToolBlockStatus:(j,q,R)=>{const xe=N(),Se=B.messages[xe].contentBlocks||[],se=Oe=>Oe.type==="tool"&&Oe.tool.status==="running";let Ae;if(R?.toolCallId)for(let Oe=Se.length-1;Oe>=0;Oe--){const st=Se[Oe];if(se(st)&&st.tool.toolCallId===R.toolCallId){Ae=st;break}}if(!Ae)for(let Oe=Se.length-1;Oe>=0;Oe--){const st=Se[Oe];if(se(st)&&st.tool.name===j){Ae=st;break}}Ae&&(Ae.tool.status=q,R?.result!==void 0&&(Ae.tool.result=R.result),R?.displayResult!==void 0&&(Ae.tool.displayResult=R.displayResult),R?.isError!==void 0&&(Ae.tool.isError=R.isError)),T({contentBlocks:[...Se]})}}}async function ue(B,N,T){const U=_(B);if(!U)return{success:!1,reason:"error"};if(!N.trim())return{success:!1,reason:"empty"};if(U.isAIThinking||t.value)return{success:!1,reason:"busy",activeTask:t.value};const Z=y("req"),oe=Na(U);let me=oe===Mt?null:oe;const pe=w(U,oe,U.selectedAssistantId);let _e,be;pe.assistantId=U.selectedAssistantId,pe.loaded=!0,C(B,N,Z,me),h(B),p(B);const ge=c.activeSkillId,b=c.activeSkill?.name,O=m.value.enableAutoSkill??!0,Q=O?m.value.chartAutoMode??"suggest":"explicit",ie=(T?.mentionedMembers??[]).map(ye=>({memberId:ye.memberId,platformId:ye.platformId,displayName:ye.displayName,aliases:[...ye.aliases],mentionText:ye.mentionText}));U.isAIThinking=!0,U.isLoadingSource=!0,U.currentToolStatus=null,U.toolsUsedInCurrentRound=[],U.agentStatus=null,U.isAborted=!1,U.currentRequestId=Z,U.currentAgentRequestId="";try{const ye=await it().hasConfig();if(U.isAborted)return S(B,Z),{success:!1,reason:"aborted"};if(U.currentRequestId!==Z)return S(B,Z),{success:!1,reason:"busy",activeTask:t.value};if(!ye)return pe.messages.push({id:y("error"),role:"assistant",content:"⚠️ 请先配置 AI 服务。点击左下角「设置」按钮前往「模型配置Tab」进行配置。",timestamp:Date.now()}),S(B,Z),{success:!1,reason:"no_config"};const j={id:y("user"),role:"user",content:N,timestamp:Date.now(),toolCalls:[]};_e=j,pe.messages.push(j);const q={id:y("ai"),role:"assistant",content:"",timestamp:Date.now(),isStreaming:!0,contentBlocks:[]};ge&&b&&q.contentBlocks.push({type:"skill",skillId:ge,skillName:b}),pe.messages.push(q);let R=pe.messages.length-1,xe=!1;const{updateAIMessage:Se,appendTextToBlocks:se,appendThinkToBlocks:Ae,appendChartsToBlocks:Oe,appendEvidenceToBlocks:st,appendPlanDraftToBlocks:ce,appendPlanToBlocks:Ie,removePlanDraftsFromBlocks:Ce,updatePlanBlockStatus:Le,appendErrorToBlocks:Ee,addToolBlock:ot,addRenderOnlyToolPendingBlock:Qe,updateRenderOnlyToolResult:ss,updateToolBlockStatus:bt}=J(pe,()=>R),Wt=pe.assistantId??Fa(U.locale);if(!me){const we=N.slice(0,50)+(N.length>50?"...":""),Je=await xt().createAIChat(U.sessionId,we,Wt);if(U.isAborted)return Se({isStreaming:!1}),S(B,Z),{success:!1,reason:"aborted"};if(U.currentRequestId!==Z)return Se({isStreaming:!1}),S(B,Z),{success:!1,reason:"busy",activeTask:t.value};me=Je.id,P(U,Mt,Je.id),pe.assistantId=Wt,z(B,Je.id)}const jt={sessionId:U.sessionId,aiChatId:me,timeFilter:U.timeFilter?{startTs:U.timeFilter.startTs,endTs:U.timeFilter.endTs}:void 0,maxMessagesLimit:m.value.maxMessagesPerRequest,ownerInfo:U.ownerInfo?{platformId:U.ownerInfo.platformId,displayName:U.ownerInfo.displayName}:void 0,mentionedMembers:ie.length>0?ie:void 0,preprocessConfig:await V(),searchContextBefore:m.value.searchContextBefore,searchContextAfter:m.value.searchContextAfter},{requestId:as,promise:Sa}=Ra().runStream({userMessage:N,sessionId:U.sessionId,aiChatId:me,timeFilter:jt.timeFilter,maxMessagesLimit:jt.maxMessagesLimit,ownerInfo:jt.ownerInfo,mentionedMembers:jt.mentionedMembers,preprocessConfig:jt.preprocessConfig,chatType:U.chatType,locale:U.locale,assistantId:Wt,skillId:ge,enableAutoSkill:ge?void 0:O,chartAutoMode:ge?void 0:Q,compressionConfig:{enabled:m.value.contextCompression?.enabled??!1,tokenThresholdPercent:m.value.contextCompression?.tokenThresholdPercent??75,bufferSizePercent:m.value.contextCompression?.bufferSizePercent??20,maxToolResultPercent:m.value.contextCompression?.maxToolResultPercent??50},thinkingLevel:(()=>{const we=d.defaultAssistant;if(!(!we?.configId||!we?.modelId))return s.getThinkingLevel(we.configId,we.modelId)})()},we=>{if(!(U.isAborted||Z!==U.currentRequestId))switch(we.type){case"content":we.content&&(U.currentToolStatus=null,se(we.content));break;case"think":we.content?Ae(we.content,we.thinkTag):we.thinkDurationMs!==void 0&&Ae("",we.thinkTag,we.thinkDurationMs);break;case"tool_start":if(we.toolName){const Je=we.toolParams;U.currentToolStatus={name:we.toolName,displayName:we.toolName,status:"running"},U.toolsUsedInCurrentRound.push(we.toolName),Tt(we.toolName)?Qe(we.toolName,Je,we.toolCallId):ot(we.toolName,Je,we.toolCallId)}break;case"tool_result":if(we.toolName){const Je=sn(we.toolResult),vt=Go(we.toolName,we.toolResult);Tt(we.toolName)?ss(we.toolName,we.toolCallId,Je,vt):Oe(Je);const qs=Xo(we.toolResult);qs&&st(qs),vt&&(Tt(we.toolName)||Ee(vt.error));const Ss=vt!==null||we.toolIsError===!0;if(U.currentToolStatus?.name===we.toolName&&(U.currentToolStatus={...U.currentToolStatus,status:Ss?"error":"done"}),!Tt(we.toolName)){const is=$o(we.toolResult);bt(we.toolName,Ss?"error":"done",{toolCallId:we.toolCallId,result:Po(is),displayResult:is,isError:we.toolIsError})}}U.isLoadingSource=!1;break;case"plan_delta":we.planDelta&&ce(we.planDelta);break;case"plan":we.plan&&(Ie(we.plan),Le("executing"));break;case"plan_skipped":Ce();break;case"status":we.status&&(!U.agentStatus||we.status.updatedAt>=U.agentStatus.updatedAt)&&(U.agentStatus=we.status);break;case"compression_done":if(we.compressionResult){const Je={id:`summary-${Date.now()}`,role:"summary",content:we.compressionResult.summaryContent,timestamp:we.compressionResult.timestamp},vt=Math.max(0,pe.messages.length-1);pe.messages.splice(vt,0,Je),R++}break;case"done":U.currentToolStatus=null,xe||Le("done"),we.usage&&(be={...we.usage},U.sessionTokenUsage={promptTokens:U.sessionTokenUsage.promptTokens+we.usage.promptTokens,completionTokens:U.sessionTokenUsage.completionTokens+we.usage.completionTokens,totalTokens:U.sessionTokenUsage.totalTokens+we.usage.totalTokens,cacheReadTokens:U.sessionTokenUsage.cacheReadTokens+we.usage.cacheReadTokens,cacheWriteTokens:U.sessionTokenUsage.cacheWriteTokens+we.usage.cacheWriteTokens}),D(U,"completed",we.usage?{totalUsage:we.usage}:void 0);break;case"error":if(Ce(),Le("skipped"),U.currentToolStatus&&(U.currentToolStatus={...U.currentToolStatus,status:"error"},bt(U.currentToolStatus.name,"error")),!xe){xe=!0;const Je=pe.messages[R].contentBlocks||[];Je.push({type:"error",error:ea(we.error)}),Se({contentBlocks:[...Je],isStreaming:!1})}D(U,"error");break}});U.currentAgentRequestId=as,C(B,N,as,me);const It=await Sa;if(U.isAborted)return S(B,as),{success:!1,reason:"aborted"};if(Z!==U.currentRequestId)return S(B,as),{success:!1,reason:"busy",activeTask:t.value};if(It.success&&It.result){pe.messages[R]={...pe.messages[R],dataSource:{toolsUsed:It.result.toolsUsed,toolRounds:It.result.toolRounds},isStreaming:!1};const we=await W(me,j,pe.messages[R],be);we&&(Object.assign(j,we.userMessage),pe.messages[R]={...pe.messages[R],...we.assistantMessage,isStreaming:!1})}else if(xe){const we=await W(me,j,pe.messages[R],be);we&&(Object.assign(j,we.userMessage),pe.messages[R]={...pe.messages[R],...we.assistantMessage,isStreaming:!1})}else{const we=pe.messages[R].contentBlocks||[];we.push({type:"error",error:ea(It.error)}),pe.messages[R]={...pe.messages[R],contentBlocks:[...we],isStreaming:!1};const Je=await W(me,j,pe.messages[R],be);Je&&(Object.assign(j,Je.userMessage),pe.messages[R]={...pe.messages[R],...Je.assistantMessage,isStreaming:!1})}return{success:!0}}catch(ye){console.error("[AI] 处理失败:",ye),U.agentStatus=null;const j=pe.messages[pe.messages.length-1];if(j&&j.role==="assistant"){const q={name:ye instanceof Error?ye.name:null,message:ye instanceof Error?ye.message:String(ye),stack:ye instanceof Error?ye.stack??null:null},R=j.contentBlocks||[];R.push({type:"error",error:q}),j.contentBlocks=[...R],j.isStreaming=!1;const xe=_e||pe.messages.findLast(Se=>Se.role==="user");xe&&await W(me,xe,j,be)}return{success:!1,reason:"error"}}finally{U.isAIThinking=!1,U.isLoadingSource=!1,U.currentToolStatus=null,U.isAborted=!1,U.currentRequestId="",U.currentAgentRequestId="",S(B)}}async function W(B,N,T,U){try{if(!B)return null;const Z=await xt().addMessage(B,"user",N.content),oe=Qo(T.contentBlocks),me=await xt().addMessage(B,"assistant",T.content,void 0,void 0,oe,U);return{userMessage:ta(Z),assistantMessage:ta(me)}}catch(Z){return console.error("[AI] 保存对话失败:",Z),null}}async function V(){const B=a.aiPreprocessConfig;return uD(B)&&await a.ensureDesensitizeRules(),mD(a.aiPreprocessConfig)}function H(B){return B.trim().replace(/^[\s"'“”‘’([{<]+|[\s"'“”‘’)\]}>.,!?;:,。!?;:、]+$/g,"").toLocaleLowerCase()}async function ae(B,N){const T=new Set;for(const U of N.matchAll(/@([^\s@]+)/g)){const Z=H(U[1]??"");Z&&T.add(Z)}if(T.size===0)return[];try{const U=await kt().getMembers(B.sessionId),Z=new Map;U.forEach(_e=>{const be=_e.groupNickname||_e.accountName||_e.platformId;Z.set(be,(Z.get(be)??0)+1)});const oe=U.map(_e=>{const be=_e.groupNickname||_e.accountName||_e.platformId,ge=(Z.get(be)??0)>1?`${be}·${_e.platformId}`:be,b=[..._e.aliases],O=[be,_e.groupNickname||"",_e.accountName||"",_e.platformId,ge,...b].map(H).filter(Boolean);return{memberId:_e.id,platformId:_e.platformId,displayName:be,aliases:b,mentionText:`@${ge}`,lookupValues:O}}),me=[],pe=new Set;for(const _e of T){const be=oe.find(ge=>!pe.has(ge.memberId)&&ge.lookupValues.includes(_e));be&&(pe.add(be.memberId),me.push({memberId:be.memberId,platformId:be.platformId,displayName:be.displayName,aliases:be.aliases,mentionText:be.mentionText}))}return me}catch(U){return console.error("[AI] Failed to resolve mentioned members for edited message:",U),[]}}async function K(B,N,T,U){const Z=_(B),oe=T.trim();if(!Z||!Z.currentAIChatId)return{success:!1,reason:"error"};if(!oe)return{success:!1,reason:"empty"};if(Z.isAIThinking||t.value)return{success:!1,reason:"busy",activeTask:t.value};const me=U?.overwriteSubsequent??!1,pe=w(Z,Z.currentAIChatId,Z.selectedAssistantId),_e=pe.messages.findIndex(ge=>ge.id===N),be=pe.messages[_e];return!be||be.role!=="user"||be.isStreaming?{success:!1,reason:"error"}:be.content.trim()===oe?{success:!1,reason:"empty"}:me?ee(B,Z,pe,_e,be,oe):fe(B,Z,pe,_e,be,oe)}async function ee(B,N,T,U,Z,oe){try{return await it().hasConfig()?N.isAborted?{success:!1,reason:"aborted"}:N.isAIThinking||t.value?{success:!1,reason:"busy",activeTask:t.value}:(await xt().deleteMessagesFrom(N.currentAIChatId,Z.id),T.messages.splice(U,T.messages.length-U),ue(B,oe)):{success:!1,reason:"no_config"}}catch(me){return console.error("[AI] edit and overwrite failed:",me),{success:!1,reason:"error"}}}async function fe(B,N,T,U,Z,oe){const me=y("req");let pe,_e=!1;C(B,oe,me,N.currentAIChatId),h(B),p(B),N.isAIThinking=!0,N.isLoadingSource=!0,N.currentToolStatus=null,N.toolsUsedInCurrentRound=[],N.agentStatus=null,N.isAborted=!1,N.currentRequestId=me,N.currentAgentRequestId="";const be=T.messages[U+1],ge=be?.role==="assistant",b=ge?T.messages.slice(U+2):T.messages.slice(U+1),O={id:y("ai"),role:"assistant",content:"",timestamp:Date.now(),isStreaming:!0,contentBlocks:[]},Q=c.activeSkillId,ie=c.activeSkill?.name;Q&&ie&&O.contentBlocks.push({type:"skill",skillId:Q,skillName:ie});const ye={...Z,content:oe},j=ge?2:1;T.messages.splice(U,j,ye,O);const q=U+1,R=()=>{T.messages.splice(U,T.messages.length-U,Z),ge&&T.messages.splice(U+1,0,be),T.messages.push(...b)},{updateAIMessage:xe,appendTextToBlocks:Se,appendThinkToBlocks:se,appendChartsToBlocks:Ae,appendEvidenceToBlocks:Oe,appendPlanDraftToBlocks:st,appendPlanToBlocks:ce,removePlanDraftsFromBlocks:Ie,updatePlanBlockStatus:Ce,appendErrorToBlocks:Le,addToolBlock:Ee,addRenderOnlyToolPendingBlock:ot,updateRenderOnlyToolResult:Qe,updateToolBlockStatus:ss}=J(T,()=>q);try{if(!await it().hasConfig())return R(),S(B,me),{success:!1,reason:"no_config"};const Wt=T.assistantId??Fa(N.locale),jt=await ae(N,oe);if(N.isAborted)return R(),S(B,me),{success:!1,reason:"aborted"};if(me!==N.currentRequestId)return R(),S(B,me),{success:!1,reason:"busy",activeTask:t.value};const as=m.value.enableAutoSkill??!0,Sa=as?m.value.chartAutoMode??"suggest":"explicit",It={sessionId:N.sessionId,aiChatId:N.currentAIChatId,historyLeafMessageId:Z.parentId??null,timeFilter:N.timeFilter?{startTs:N.timeFilter.startTs,endTs:N.timeFilter.endTs}:void 0,maxMessagesLimit:m.value.maxMessagesPerRequest,ownerInfo:N.ownerInfo?{platformId:N.ownerInfo.platformId,displayName:N.ownerInfo.displayName}:void 0,mentionedMembers:jt.length>0?jt:void 0,preprocessConfig:await V(),searchContextBefore:m.value.searchContextBefore,searchContextAfter:m.value.searchContextAfter},{requestId:we,promise:Je}=Ra().runStream({userMessage:oe,sessionId:N.sessionId,aiChatId:N.currentAIChatId,historyLeafMessageId:Z.parentId??null,timeFilter:It.timeFilter,maxMessagesLimit:It.maxMessagesLimit,ownerInfo:It.ownerInfo,mentionedMembers:It.mentionedMembers,preprocessConfig:It.preprocessConfig,chatType:N.chatType,locale:N.locale,assistantId:Wt,skillId:Q,enableAutoSkill:Q?void 0:as,chartAutoMode:Q?void 0:Sa,compressionConfig:{enabled:m.value.contextCompression?.enabled??!1,tokenThresholdPercent:m.value.contextCompression?.tokenThresholdPercent??75,bufferSizePercent:m.value.contextCompression?.bufferSizePercent??20,maxToolResultPercent:m.value.contextCompression?.maxToolResultPercent??50},thinkingLevel:(()=>{const De=d.defaultAssistant;if(!(!De?.configId||!De?.modelId))return s.getThinkingLevel(De.configId,De.modelId)})()},De=>{if(!(N.isAborted||me!==N.currentRequestId))switch(De.type){case"content":N.currentToolStatus=null,Se(De.content||"");break;case"think":De.content?se(De.content,De.thinkTag):De.thinkDurationMs!==void 0&&se("",De.thinkTag,De.thinkDurationMs);break;case"tool_start":if(De.toolName){const qt=De.toolParams;N.currentToolStatus={name:De.toolName,displayName:De.toolName,status:"running"},N.toolsUsedInCurrentRound.push(De.toolName),Tt(De.toolName)?ot(De.toolName,qt,De.toolCallId):Ee(De.toolName,qt,De.toolCallId)}break;case"tool_result":if(De.toolName){const qt=sn(De.toolResult),Ks=Go(De.toolName,De.toolResult);Tt(De.toolName)?Qe(De.toolName,De.toolCallId,qt,Ks):Ae(qt);const En=Xo(De.toolResult);if(En&&Oe(En),Ks&&(Tt(De.toolName)||Le(Ks.error)),!Tt(De.toolName)){const Fn=$o(De.toolResult);ss(De.toolName,Ks!==null||De.toolIsError===!0?"error":"done",{toolCallId:De.toolCallId,result:Po(Fn),displayResult:Fn,isError:De.toolIsError})}}N.currentToolStatus=null,N.isLoadingSource=!1;break;case"plan_delta":De.planDelta&&st(De.planDelta);break;case"plan":De.plan&&(ce(De.plan),Ce("executing"));break;case"plan_skipped":Ie();break;case"status":De.status&&(!N.agentStatus||De.status.updatedAt>=N.agentStatus.updatedAt)&&(N.agentStatus=De.status);break;case"done":N.currentToolStatus=null,_e||Ce("done"),De.usage&&(pe={...De.usage}),D(N,"completed",De.usage?{totalUsage:De.usage}:void 0);break;case"error":{Ie(),Ce("skipped"),_e=!0,N.currentToolStatus&&ss(N.currentToolStatus.name,"error");const qt=T.messages[q].contentBlocks||[];qt.push({type:"error",error:ea(De.error)}),xe({contentBlocks:[...qt],isStreaming:!1}),D(N,"error");break}}});N.currentAgentRequestId=we,C(B,oe,we,N.currentAIChatId);const vt=await Je;if(N.isAborted)return R(),S(B,we),{success:!1,reason:"aborted"};if(me!==N.currentRequestId)return R(),S(B,we),{success:!1,reason:"busy",activeTask:t.value};if(vt.success&&vt.result)xe({dataSource:{toolsUsed:vt.result.toolsUsed,toolRounds:vt.result.toolRounds},isStreaming:!1});else if(!_e){const De=T.messages[q].contentBlocks||[];De.push({type:"error",error:ea(vt.error)}),xe({contentBlocks:[...De],isStreaming:!1})}if(!vt.success)return R(),{success:!1,reason:"error"};await xt().updateMessageContent(Z.id,oe),ge&&await xt().deleteAndRelinkMessage(N.currentAIChatId,be.id);const qs=Qo(T.messages[q].contentBlocks),Ss=await xt().insertMessageAfter(N.currentAIChatId,Z.id,"assistant",T.messages[q].content,qs,pe);T.messages[q]={...ta(Ss),dataSource:T.messages[q].dataSource,isStreaming:!1},T.messages[U]={...T.messages[U],content:oe};const is=q+1;return is<T.messages.length&&(T.messages[is]={...T.messages[is],parentId:Ss.id}),T.sessionTokenUsage=Jo(await xt().getAIChatTokenUsage(N.currentAIChatId)),N.sessionTokenUsage={...T.sessionTokenUsage},{success:!0}}catch(bt){if(N.isAborted)return R(),{success:!1,reason:"aborted"};console.error("[AI] edit and regenerate failed:",bt);const Wt=T.messages[q]?.contentBlocks||[];return Wt.push({type:"error",error:{name:bt instanceof Error?bt.name:null,message:bt instanceof Error?bt.message:String(bt),stack:bt instanceof Error?bt.stack??null:null}}),T.messages[q]&&xe({contentBlocks:[...Wt],isStreaming:!1}),{success:!1,reason:"error"}}finally{N.isAIThinking=!1,N.isLoadingSource=!1,N.currentToolStatus=null,N.isAborted=!1,N.currentRequestId="",N.currentAgentRequestId="",S(B)}}async function he(B){const N=_(B);if(!N||!N.isAIThinking)return!1;N.isAborted=!0,N.isAIThinking=!1,N.isLoadingSource=!1,N.currentToolStatus=null,D(N,"aborted");const T=t.value?.chatKey===B?t.value.aiChatId??Mt:Na(N),U=N.aiChatBuffers[T],Z=U?U.messages[U.messages.length-1]:void 0;if(Z&&Z.role==="assistant"&&Z.isStreaming&&(Z.isStreaming=!1,Z.content+=`
9
+
10
+ _(已停止生成)_`),N.currentAgentRequestId)try{await Ra().abort(N.currentAgentRequestId)}catch(oe){console.error("[AI] 中止 Agent 请求失败:",oe)}return N.currentRequestId="",N.currentAgentRequestId="",S(B),!0}async function le(){return t.value?he(t.value.chatKey):!1}return{sessionStates:e,activeTask:t,ensureSessionState:g,getSessionState:_,getActiveTaskState:x,applySessionAssistantSelection:h,selectAssistantForSession:E,loadAIChat:F,focusAIChat:re,focusActiveTaskAIChat:ve,resetToSelectorOnEnter:de,startNewAIChat:L,loadMoreSourceMessages:A,updateMaxMessages:G,sendMessage:ue,editMessageAndRegenerate:K,stopGeneration:he,stopActiveTask:le}}),Dn=document.createElement("canvas");Dn.width=1;Dn.height=1;const Zo=Dn.getContext("2d",{willReadFrequently:!0});function MD(e){if(!Zo)return null;const t=Zo;t.clearRect(0,0,1,1),t.fillStyle="rgba(0, 0, 0, 0)",t.fillRect(0,0,1,1);try{t.fillStyle=e}catch{return null}t.fillRect(0,0,1,1);const[s,n,a,i]=t.getImageData(0,0,1,1).data;return i===0?null:{r:s,g:n,b:a,a:i/255}}function er(e,t){const s=e.a+t.a*(1-e.a);return s<=0?{r:0,g:0,b:0,a:0}:{r:(e.r*e.a+t.r*t.a*(1-e.a))/s,g:(e.g*e.a+t.g*t.a*(1-e.a))/s,b:(e.b*e.a+t.b*t.a*(1-e.a))/s,a:s}}function Ua(e){return`rgb(${Math.round(e.r)}, ${Math.round(e.g)}, ${Math.round(e.b)})`}function TD(e){const t={r:17,g:17,b:17,a:1};let s=e,n=null;for(;s;){const a=window.getComputedStyle(s).backgroundColor,i=MD(a);if(i&&i.a>0&&(n=n?er(n,i):i,n.a>=.999))return Ua(n);s=s.parentElement}return Ua(n?er(n,t):t)}async function xE(e,t){const s=t?.maxExportWidth??2160,n=t?.minScale??1,a=t?.fullContent!==!1,i=t?.backgroundColor??TD(e),c=a?e.scrollWidth:e.getBoundingClientRect().width;let d=Math.min(1,s/Math.max(1,c));d=Math.max(n,d);const m={scale:d,embedFonts:t?.embedFonts??!1,compress:t?.compress??!0,backgroundColor:i,crossOrigin:t?.crossOrigin??"anonymous"},u=await ll(e,m);try{const y=await u.toCanvas();if(y&&y.toDataURL){const g=y,_=document.createElement("canvas"),x=g.width>s?s/g.width:1;_.width=Math.round(g.width*x),_.height=Math.round(g.height*x);const w=_.getContext("2d");if(w)return w.fillStyle=i,w.fillRect(0,0,_.width,_.height),w.drawImage(g,0,0,_.width,_.height),_.toDataURL("image/png")}}catch{}try{const y=await u.toPng({backgroundColor:i});if(y instanceof HTMLImageElement)return y.src;if(y instanceof Blob)return new Promise((g,_)=>{const x=new FileReader;x.onload=()=>g(x.result),x.onerror=_,x.readAsDataURL(y)});if(typeof y=="string")return y}catch{}try{return(await u.toImg()).src}catch(y){throw console.error("captureAsImageData: all export paths failed",y),new Error("Failed to capture image data")}}const AD={key:0,class:"px-2 pb-2"},tr=Re({__name:"DatePicker",props:{modelValue:{},placeholder:{default:""},clearable:{type:Boolean,default:!0},widthClass:{default:"w-32"}},emits:["update:modelValue"],setup(e,{emit:t}){const{t:s,locale:n}=Fe(),a=e,i=t,c=I(!1),d=X(()=>n.value.startsWith("zh")?"zh-CN":n.value==="ja-JP"?"ja-JP":"en-US");function m(x){if(!x)return;const w=gt(x);return new Wi(w.year(),w.month()+1,w.date())}function u(x){return x?`${x.year}-${String(x.month).padStart(2,"0")}-${String(x.day).padStart(2,"0")}`:""}const y=X({get:()=>m(a.modelValue),set:x=>{i("update:modelValue",u(x)),x&&(c.value=!1)}}),g=X(()=>a.modelValue?gt(a.modelValue).format("YYYY/MM/DD"):"");function _(){i("update:modelValue",""),c.value=!1}return(x,w)=>{const $=Ke,P=Qi,h=vr;return v(),Te(h,{open:c.value,"onUpdate:open":w[1]||(w[1]=p=>c.value=p),ui:{content:"z-[100]"}},{content:te(()=>[f(P,{modelValue:y.value,"onUpdate:modelValue":w[0]||(w[0]=p=>y.value=p),"number-of-months":1,"fixed-weeks":!1,locale:d.value},null,8,["modelValue","locale"]),e.clearable?(v(),k("div",AD,[f($,{variant:"ghost",size:"xs",color:"neutral",class:"w-full",onClick:_},{default:te(()=>[Y(l(o(s)("common.datePicker.clearDate")),1)]),_:1})])):ne("",!0)]),default:te(()=>[f($,{label:g.value||e.placeholder||o(s)("common.datePicker.selectDate"),icon:"i-heroicons-calendar-days",variant:"outline",color:"neutral",size:"sm",class:$e([e.widthClass,"justify-start",{"text-gray-400":!g.value}])},null,8,["label","class"])]),_:1},8,["open"])}}});function Oa(e){const t=String(e.type||"").trim().toLowerCase(),s=String(e.id||"").trim().toLowerCase();return t==="group"||s.endsWith("@chatroom")?"group":t==="private"?"private":(t==="channel"||t==="official"||t==="other"||s.startsWith("gh_")||s.includes("@openim")||s.startsWith("weixin")&&s!=="weixin","other")}const $D={class:"p-6",style:{"min-width":"480px","max-height":"80vh","overflow-y":"auto"}},PD={class:"mb-4 text-lg font-semibold text-gray-900 dark:text-white"},DD={class:"space-y-4"},LD={class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},RD={class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},ED={class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},FD={class:"grid grid-cols-2 gap-3"},ND={class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},UD={class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},OD={key:1,class:"rounded-md bg-red-50 p-3 text-xs text-red-600 dark:bg-red-900/20 dark:text-red-400"},VD={key:2},HD={class:"mb-2 flex items-center justify-between"},zD={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},BD={class:"mb-3 flex items-center gap-2"},WD={class:"mb-2 flex flex-wrap items-center gap-2"},jD={class:"text-xs text-gray-500 dark:text-gray-400"},qD={class:"inline-flex rounded-lg bg-gray-100 p-0.5 dark:bg-gray-800"},KD=["disabled","onClick"],GD={key:0,class:"max-h-64 overflow-y-auto rounded-lg border border-gray-200 dark:border-gray-600"},XD=["onClick"],YD={class:"min-w-0 flex-1"},QD={class:"flex items-center gap-2 truncate text-sm font-medium text-gray-900 dark:text-white"},JD={key:0,class:"rounded-full bg-green-100 px-1.5 py-0.5 text-[10px] text-green-700 dark:bg-green-900/30 dark:text-green-400"},ZD={class:"flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400"},eL={class:"rounded bg-gray-100 px-1 dark:bg-gray-700"},tL={key:0},sL={key:1,class:"rounded-lg border border-dashed border-gray-200 px-3 py-6 text-center text-xs text-gray-500 dark:border-gray-700 dark:text-gray-400"},aL={key:2,class:"mt-3 flex justify-center"},nL={class:"flex justify-end gap-2 pt-2"},sr=200,oL=5e3,ar=Re({__name:"DataSourceAddModal",props:{open:{type:Boolean},manageSource:{},subscribedRemoteIds:{}},emits:["update:open","sourceAdded","sessionsAdded"],setup(e,{emit:t}){const s=e,n=t,{t:a}=Fe(),i=xi(),c=X(()=>!!s.manageSource),d=I({name:"",baseUrl:"",token:"",intervalMinutes:60,pullLimit:1e3}),m=I([]),u=I(new Set),y=I(!1),g=I(!1),_=I(!1),x=I(""),w=I(""),$=I(),P=I(!1),h=I(!1),p=I("all");Ue(()=>s.open,async V=>{V&&(c.value&&s.manageSource?d.value={name:s.manageSource.name||"",baseUrl:s.manageSource.baseUrl,token:s.manageSource.token,intervalMinutes:s.manageSource.intervalMinutes,pullLimit:s.manageSource.pullLimit}:d.value={name:"",baseUrl:"",token:"",intervalMinutes:60,pullLimit:1e3},m.value=[],u.value=new Set,x.value="",w.value="",$.value=void 0,P.value=!1,h.value=!1,p.value="all",c.value&&await de())},{immediate:!0});const C=X(()=>m.value.filter(V=>Oa(V)!=="other")),S=X(()=>p.value==="all"?C.value:C.value.filter(V=>Oa(V)===p.value)),z=X(()=>S.value.filter(V=>!s.subscribedRemoteIds?.has(V.id))),M=X(()=>z.value.length>0&&z.value.every(V=>u.value.has(V.id))),D=X(()=>[{value:"all",label:a("settings.api.dataSources.discovery.typeAll")},{value:"private",label:a("settings.api.dataSources.discovery.typePrivate")},{value:"group",label:a("settings.api.dataSources.discovery.typeGroup")}].map(V=>({...V,count:V.value==="all"?C.value.length:C.value.filter(H=>Oa(H)===V.value).length})));function E(V){p.value=V}function F(){const V=z.value.map(H=>H.id);if(M.value){const H=new Set(u.value);for(const ae of V)H.delete(ae);u.value=H}else u.value=new Set([...u.value,...V])}function re(V){if(s.subscribedRemoteIds?.has(V))return;const H=new Set(u.value);H.has(V)?H.delete(V):H.add(V),u.value=H}function ve(){n("update:open",!1)}async function de(){await J({append:!1,resetSelection:!0})}async function L(){await J({append:!1,resetSelection:!0})}async function A(){!P.value||!$.value||await J({append:!0,resetSelection:!1})}function G(V,H){const ae=new Map(V.map(K=>[K.id,K]));for(const K of H)ae.set(K.id,K);return[...ae.values()]}async function J(V){if(d.value.baseUrl){V.append?g.value=!0:y.value=!0,h.value=!0,x.value="",V.append||(m.value=[],$.value=void 0,P.value=!1,p.value="all",V.resetSelection&&(u.value=new Set));try{const H=await i.fetchRemoteSessions(d.value.baseUrl,d.value.token,{keyword:w.value.trim()||void 0,limit:sr,cursor:V.append?$.value:void 0});if(!V.append&&!H.page&&H.sessions.length>=sr){const ae=await i.fetchRemoteSessions(d.value.baseUrl,d.value.token,{keyword:w.value.trim()||void 0,limit:oL});m.value=ae.sessions,P.value=!1,$.value=void 0}else m.value=V.append?G(m.value,H.sessions):H.sessions,P.value=!!H.page?.hasMore,$.value=H.page?.nextCursor}catch(H){x.value=H.message||a("settings.api.dataSources.discovery.error")}finally{y.value=!1,g.value=!1}}}async function ue(){if(c.value){if(u.value.size===0||!s.manageSource)return;const V=m.value.filter(H=>u.value.has(H.id)).map(H=>({name:H.name,remoteSessionId:H.id}));n("sessionsAdded",s.manageSource.id,V),ve();return}_.value=!0,x.value="";try{await i.fetchRemoteSessions(d.value.baseUrl,d.value.token,{limit:1})}catch(V){x.value=V.message||a("settings.api.dataSources.discovery.connectionCheckFailed");return}finally{_.value=!1}_.value=!0;try{await i.addDataSource({name:d.value.name||void 0,baseUrl:d.value.baseUrl,token:d.value.token,intervalMinutes:d.value.intervalMinutes,pullLimit:d.value.pullLimit||void 0}),n("sourceAdded"),ve()}finally{_.value=!1}}function W(V){return V===void 0?"-":V>=1e4?`${(V/1e4).toFixed(1)}w`:V>=1e3?`${(V/1e3).toFixed(1)}k`:String(V)}return(V,H)=>{const ae=ut,K=Ke,ee=fa,fe=mt;return v(),Te(fe,{open:e.open,ui:{content:"z-[101]",overlay:"z-[100]"},"onUpdate:open":H[7]||(H[7]=he=>n("update:open",he))},{content:te(()=>[r("div",$D,[r("h3",PD,l(c.value?o(a)("settings.api.dataSources.edit.manageSessions"):o(a)("settings.api.dataSources.form.modalTitle")),1),r("div",DD,[c.value?ne("",!0):(v(),k(Pe,{key:0},[r("div",null,[r("label",LD,l(o(a)("settings.api.dataSources.form.name")),1),f(ae,{modelValue:d.value.name,"onUpdate:modelValue":H[0]||(H[0]=he=>d.value.name=he),class:"w-full",placeholder:o(a)("settings.api.dataSources.form.namePlaceholder")},null,8,["modelValue","placeholder"])]),r("div",null,[r("label",RD,l(o(a)("settings.api.dataSources.discovery.baseUrl")),1),f(ae,{modelValue:d.value.baseUrl,"onUpdate:modelValue":H[1]||(H[1]=he=>d.value.baseUrl=he),class:"w-full",placeholder:o(a)("settings.api.dataSources.discovery.baseUrlPlaceholder")},null,8,["modelValue","placeholder"])]),r("div",null,[r("label",ED,[Y(l(o(a)("settings.api.dataSources.form.token"))+" ",1),H[8]||(H[8]=r("span",{class:"text-red-500"},"*",-1))]),f(ae,{modelValue:d.value.token,"onUpdate:modelValue":H[2]||(H[2]=he=>d.value.token=he),class:"w-full",placeholder:o(a)("settings.api.dataSources.form.tokenPlaceholder")},null,8,["modelValue","placeholder"])]),r("div",FD,[r("div",null,[r("label",ND,l(o(a)("settings.api.dataSources.form.interval")),1),f(ae,{modelValue:d.value.intervalMinutes,"onUpdate:modelValue":H[3]||(H[3]=he=>d.value.intervalMinutes=he),modelModifiers:{number:!0},type:"number",min:1,class:"w-full"},null,8,["modelValue"])]),r("div",null,[r("label",UD,l(o(a)("settings.api.dataSources.form.pullLimit")),1),f(ae,{modelValue:d.value.pullLimit,"onUpdate:modelValue":H[4]||(H[4]=he=>d.value.pullLimit=he),modelModifiers:{number:!0},type:"number",min:100,max:1e4,class:"w-full",placeholder:o(a)("settings.api.dataSources.form.pullLimitPlaceholder")},null,8,["modelValue","placeholder"])])])],64)),x.value?(v(),k("div",OD,l(x.value),1)):ne("",!0),c.value&&h.value?(v(),k("div",VD,[r("div",HD,[r("span",zD,l(o(a)("settings.api.dataSources.discovery.found",{count:C.value.length})),1),r("button",{class:"text-xs text-blue-500 hover:text-blue-700 dark:hover:text-blue-400",onClick:F},l(M.value?o(a)("settings.api.dataSources.discovery.deselectAll"):o(a)("settings.api.dataSources.discovery.selectAll")),1)]),r("div",BD,[f(ae,{modelValue:w.value,"onUpdate:modelValue":H[5]||(H[5]=he=>w.value=he),class:"flex-1",placeholder:o(a)("settings.api.dataSources.discovery.searchPlaceholder"),onKeydown:$s(Ps(L,["prevent"]),["enter"])},null,8,["modelValue","placeholder","onKeydown"]),f(K,{color:"primary",variant:"soft",loading:y.value,onClick:L},{default:te(()=>[Y(l(o(a)("settings.api.dataSources.discovery.search")),1)]),_:1},8,["loading"])]),r("div",WD,[r("span",jD,l(o(a)("settings.api.dataSources.discovery.selectByType")),1),r("div",qD,[(v(!0),k(Pe,null,Be(D.value,he=>(v(),k("button",{key:he.value,type:"button",class:$e(["rounded-md px-2.5 py-1 text-xs transition-colors",p.value===he.value?"bg-white text-blue-600 shadow-sm dark:bg-gray-700 dark:text-blue-300":"text-gray-600 hover:text-gray-900 dark:text-gray-400 dark:hover:text-gray-200"]),disabled:he.count===0,onClick:le=>E(he.value)},l(he.label)+" ("+l(he.count)+") ",11,KD))),128))])]),C.value.length>0?(v(),k("div",GD,[(v(!0),k(Pe,null,Be(S.value,he=>(v(),k("div",{key:he.id,class:$e(["flex items-center gap-3 border-b border-gray-100 px-3 py-2 last:border-0",e.subscribedRemoteIds?.has(he.id)?"opacity-60":"cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800"]),onClick:le=>re(he.id)},[f(ee,{"model-value":e.subscribedRemoteIds?.has(he.id)||u.value.has(he.id),disabled:e.subscribedRemoteIds?.has(he.id),onClick:H[6]||(H[6]=Ps(()=>{},["stop"])),"onUpdate:modelValue":le=>re(he.id)},null,8,["model-value","disabled","onUpdate:modelValue"]),r("div",YD,[r("div",QD,[Y(l(he.name)+" ",1),e.subscribedRemoteIds?.has(he.id)?(v(),k("span",JD,l(o(a)("settings.api.dataSources.edit.subscribed")),1)):ne("",!0)]),r("div",ZD,[r("span",eL,l(he.platform),1),r("span",null,l(he.type),1),he.messageCount!==void 0?(v(),k("span",tL,l(W(he.messageCount))+" "+l(o(a)("settings.api.dataSources.discovery.messages")),1)):ne("",!0)])])],10,XD))),128))])):(v(),k("div",sL,l(o(a)("settings.api.dataSources.discovery.found",{count:0})),1)),P.value?(v(),k("div",aL,[f(K,{color:"neutral",variant:"soft",loading:g.value,onClick:A},{default:te(()=>[Y(l(o(a)("settings.api.dataSources.discovery.loadMore")),1)]),_:1},8,["loading"])])):ne("",!0)])):ne("",!0),r("div",nL,[f(K,{variant:"soft",onClick:ve},{default:te(()=>[Y(l(o(a)("common.cancel")),1)]),_:1}),c.value?(v(),Te(K,{key:0,color:"primary",disabled:u.value.size===0,onClick:ue},{default:te(()=>[Y(l(o(a)("settings.api.dataSources.discovery.subscribe",{count:u.value.size})),1)]),_:1},8,["disabled"])):(v(),Te(K,{key:1,color:"primary",disabled:!d.value.baseUrl||!d.value.token,loading:_.value,onClick:ue},{default:te(()=>[Y(l(o(a)("settings.api.dataSources.addBtn")),1)]),_:1},8,["disabled","loading"]))])])])]),_:1},8,["open"])}}}),rL={class:"p-6",style:{"min-width":"420px"}},iL={class:"mb-4 text-lg font-semibold text-gray-900 dark:text-white"},lL={class:"space-y-4"},cL={class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},dL={class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},uL={class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},mL={class:"grid grid-cols-2 gap-3"},gL={class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},pL={class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},fL={class:"flex justify-end gap-2 pt-2"},hL=Re({__name:"DataSourceEditModal",props:{open:{type:Boolean},dataSource:{}},emits:["update:open","saved"],setup(e,{emit:t}){const s=e,n=t,{t:a}=Fe(),i=I({name:"",baseUrl:"",token:"",intervalMinutes:60,pullLimit:1e3});Ue(()=>s.open,d=>{d&&s.dataSource&&(i.value={name:s.dataSource.name,baseUrl:s.dataSource.baseUrl,token:s.dataSource.token,intervalMinutes:s.dataSource.intervalMinutes,pullLimit:s.dataSource.pullLimit})});function c(){n("saved",{name:i.value.name,baseUrl:i.value.baseUrl,token:i.value.token,intervalMinutes:i.value.intervalMinutes,pullLimit:i.value.pullLimit}),n("update:open",!1)}return(d,m)=>{const u=ut,y=Ke,g=mt;return v(),Te(g,{open:e.open,ui:{content:"z-[101]",overlay:"z-[100]"},"onUpdate:open":m[6]||(m[6]=_=>n("update:open",_))},{content:te(()=>[r("div",rL,[r("h3",iL,l(o(a)("settings.api.dataSources.edit.title")),1),r("div",lL,[r("div",null,[r("label",cL,l(o(a)("settings.api.dataSources.form.name")),1),f(u,{modelValue:i.value.name,"onUpdate:modelValue":m[0]||(m[0]=_=>i.value.name=_),class:"w-full",placeholder:o(a)("settings.api.dataSources.form.namePlaceholder")},null,8,["modelValue","placeholder"])]),r("div",null,[r("label",dL,l(o(a)("settings.api.dataSources.discovery.baseUrl")),1),f(u,{modelValue:i.value.baseUrl,"onUpdate:modelValue":m[1]||(m[1]=_=>i.value.baseUrl=_),class:"w-full",placeholder:"https://example.com"},null,8,["modelValue"])]),r("div",null,[r("label",uL,l(o(a)("settings.api.dataSources.form.token")),1),f(u,{modelValue:i.value.token,"onUpdate:modelValue":m[2]||(m[2]=_=>i.value.token=_),class:"w-full",placeholder:o(a)("settings.api.dataSources.form.tokenPlaceholder")},null,8,["modelValue","placeholder"])]),r("div",mL,[r("div",null,[r("label",gL,l(o(a)("settings.api.dataSources.form.interval")),1),f(u,{modelValue:i.value.intervalMinutes,"onUpdate:modelValue":m[3]||(m[3]=_=>i.value.intervalMinutes=_),modelModifiers:{number:!0},type:"number",min:1,class:"w-full"},null,8,["modelValue"])]),r("div",null,[r("label",pL,l(o(a)("settings.api.dataSources.form.pullLimit")),1),f(u,{modelValue:i.value.pullLimit,"onUpdate:modelValue":m[4]||(m[4]=_=>i.value.pullLimit=_),modelModifiers:{number:!0},type:"number",min:100,max:1e4,class:"w-full",placeholder:o(a)("settings.api.dataSources.form.pullLimitPlaceholder")},null,8,["modelValue","placeholder"])])]),r("div",fL,[f(y,{variant:"soft",onClick:m[5]||(m[5]=_=>n("update:open",!1))},{default:te(()=>[Y(l(o(a)("settings.api.dataSources.edit.cancel")),1)]),_:1}),f(y,{color:"primary",onClick:c},{default:te(()=>[Y(l(o(a)("settings.api.dataSources.edit.save")),1)]),_:1})])])])]),_:1},8,["open"])}}}),vL={class:"space-y-6 pb-6"},yL={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},bL={class:"rounded-lg border border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800/50"},_L={class:"p-4"},xL={class:"text-sm text-gray-600 dark:text-gray-300"},kL={class:"mt-3 flex flex-wrap gap-2"},wL={class:"inline-flex items-center gap-1.5 rounded-full bg-emerald-100 px-2.5 py-1 text-xs font-medium text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400"},SL={class:"inline-flex items-center gap-1.5 rounded-full bg-blue-100 px-2.5 py-1 text-xs font-medium text-blue-700 dark:bg-blue-900/30 dark:text-blue-400"},CL={class:"p-4"},IL={class:"text-sm text-gray-600 dark:text-gray-300"},ML={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},TL={class:"rounded-lg border border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800/50"},AL={class:"flex items-center justify-between p-4"},$L={class:"flex-1 pr-4"},PL={class:"text-sm font-medium text-gray-900 dark:text-white"},DL={class:"w-72"},LL={class:"p-4"},RL={class:"relative"},EL={class:"overflow-x-auto rounded-lg bg-gray-900 p-4 text-xs leading-relaxed text-gray-100 dark:bg-gray-950"},FL={class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},NL={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},UL={class:"rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},OL={class:"space-y-2 text-xs text-gray-600 dark:text-gray-400"},VL={class:"flex items-start gap-2"},HL={class:"flex items-start gap-2"},zL={class:"flex items-start gap-2"},BL={class:"flex items-start gap-2"},WL=Re({__name:"McpSettingsTab",setup(e){const{t}=Fe(),{copy:s,copied:n}=Cl({copiedDuring:2e3}),a=I("claude"),i=X(()=>[{label:"ClaudeCode",value:"claude"},{label:"Codex",value:"codex"},{label:"OpenClaw",value:"openclaw"},{label:t("settings.mcp.clients.other"),value:"other"}]),c=X(()=>{const m="chatlab",u=["mcp"];switch(a.value){case"codex":return["[mcp_servers.chatlab]",`command = "${m}"`,`args = ["${u[0]}"]`].join(`
11
+ `);case"openclaw":return JSON.stringify({mcp:{servers:{chatlab:{command:m,args:u}}}},null,2);case"claude":return JSON.stringify({mcpServers:{chatlab:{command:m,args:u}}},null,2);default:return JSON.stringify({command:m,args:u},null,2)}});function d(){s(c.value)}return(m,u)=>{const y=We,g=_s,_=Ke;return v(),k("div",vL,[r("div",null,[r("h3",yL,[f(y,{name:"i-heroicons-command-line",class:"h-4 w-4 text-emerald-500"}),Y(" "+l(o(t)("settings.mcp.overview.title")),1)]),r("div",bL,[r("div",_L,[r("p",xL,l(o(t)("settings.mcp.overview.description")),1),r("div",kL,[r("span",wL,[u[1]||(u[1]=r("span",{class:"h-1.5 w-1.5 rounded-full bg-emerald-500"},null,-1)),Y(" "+l(o(t)("settings.mcp.overview.toolCount",{count:33})),1)]),r("span",SL,[u[2]||(u[2]=r("span",{class:"h-1.5 w-1.5 rounded-full bg-blue-500"},null,-1)),Y(" "+l(o(t)("settings.mcp.overview.resourceCount",{count:3})),1)]),u[3]||(u[3]=r("span",{class:"inline-flex items-center gap-1.5 rounded-full bg-purple-100 px-2.5 py-1 text-xs font-medium text-purple-700 dark:bg-purple-900/30 dark:text-purple-400"},[r("span",{class:"h-1.5 w-1.5 rounded-full bg-purple-500"}),Y(" stdio ")],-1))])]),u[5]||(u[5]=r("div",{class:"border-t border-gray-200 dark:border-gray-700"},null,-1)),r("div",CL,[r("p",IL,l(o(t)("settings.mcp.overview.installHint")),1),u[4]||(u[4]=r("div",{class:"mt-2"},[r("code",{class:"inline-block rounded-md bg-gray-900 px-3 py-1.5 text-xs text-gray-100 dark:bg-gray-950"}," npm install -g chatlab-cli ")],-1))])])]),r("div",null,[r("h3",ML,[f(y,{name:"i-heroicons-clipboard-document",class:"h-4 w-4 text-pink-500"}),Y(" "+l(o(t)("settings.mcp.config.title")),1)]),r("div",TL,[r("div",AL,[r("div",$L,[r("p",PL,l(o(t)("settings.mcp.config.clientLabel")),1)]),r("div",DL,[f(g,{modelValue:a.value,"onUpdate:modelValue":u[0]||(u[0]=x=>a.value=x),size:"sm",class:"gap-0",items:i.value},null,8,["modelValue","items"])])]),u[6]||(u[6]=r("div",{class:"border-t border-gray-200 dark:border-gray-700"},null,-1)),r("div",LL,[r("div",RL,[r("pre",EL,[r("code",null,l(c.value),1)]),f(_,{icon:o(n)?"i-heroicons-check":"i-heroicons-clipboard",color:o(n)?"success":"neutral",variant:"soft",size:"xs",class:"absolute right-2 top-2",onClick:d},{default:te(()=>[Y(l(o(n)?o(t)("settings.mcp.config.copied"):o(t)("settings.mcp.config.copy")),1)]),_:1},8,["icon","color"])]),r("p",FL,l(o(t)(`settings.mcp.config.${a.value}Hint`)),1)])])]),r("div",null,[r("h3",NL,[f(y,{name:"i-heroicons-light-bulb",class:"h-4 w-4 text-amber-500"}),Y(" "+l(o(t)("settings.mcp.tips.title")),1)]),r("div",UL,[r("ul",OL,[r("li",VL,[u[7]||(u[7]=r("span",{class:"mt-0.5 text-gray-400"},"•",-1)),Y(" "+l(o(t)("settings.mcp.tips.dataDir")),1)]),r("li",HL,[u[8]||(u[8]=r("span",{class:"mt-0.5 text-gray-400"},"•",-1)),Y(" "+l(o(t)("settings.mcp.tips.readOnly")),1)]),r("li",zL,[u[9]||(u[9]=r("span",{class:"mt-0.5 text-gray-400"},"•",-1)),Y(" "+l(o(t)("settings.mcp.tips.nodeRequired")),1)]),r("li",BL,[u[10]||(u[10]=r("span",{class:"mt-0.5 text-gray-400"},"•",-1)),Y(" "+l(o(t)("settings.mcp.tips.docs")),1)])])])])])}}}),jL={class:"flex h-full flex-col -mx-6 -mt-6"},qL={class:"flex-1 min-h-0 overflow-auto"},KL={class:"space-y-6 px-6 pt-4 pb-6"},GL={key:0},XL={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},YL={class:"rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},QL={class:"mb-3 text-xs text-gray-500 dark:text-gray-400"},JL={key:0,class:"mb-4 space-y-4"},ZL={class:"flex items-center justify-between border-b border-gray-100 px-3 py-2 dark:border-gray-700"},e4={class:"flex items-center gap-2"},t4={key:0,class:"text-xs font-medium text-gray-700 dark:text-gray-300"},s4={class:"text-xs font-mono text-gray-500 dark:text-gray-400"},a4={key:1,class:"text-xs text-gray-400"},n4={class:"flex items-center gap-1"},o4={key:0,class:"max-h-80 overflow-y-auto"},r4={class:"flex items-center justify-between"},i4={class:"flex items-center gap-2"},l4={class:"text-sm font-medium text-gray-900 dark:text-white"},c4={class:"flex items-center gap-1"},d4={class:"mt-1 flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400"},u4={key:0,class:"text-blue-500"},m4={key:1,class:"text-blue-500"},g4={key:2},p4={class:"text-gray-400"},f4={key:0,class:"text-green-500"},h4={key:1,class:"text-red-500"},v4={key:1,class:"px-3 py-4 text-center text-xs text-gray-400"},y4={key:1,class:"mb-4 py-4 text-center text-xs text-gray-400"},b4={key:0},_4={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},x4={class:"rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},k4={class:"flex items-center gap-2"},w4={class:"text-xs text-green-500"},S4={class:"mt-3 space-y-2 border-t border-gray-200 pt-3 text-xs text-gray-600 dark:border-gray-700 dark:text-gray-400"},C4={class:"flex items-center justify-between"},I4={class:"font-mono text-gray-700 dark:text-gray-300"},M4={key:0,class:"flex items-center justify-between gap-2"},T4={class:"flex items-center gap-1"},A4={class:"rounded bg-gray-100 px-2 py-0.5 font-mono text-gray-700 dark:bg-gray-800 dark:text-gray-300"},$4={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},P4={class:"rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},D4={class:"flex items-center justify-between"},L4={class:"flex-1 pr-4"},R4={class:"text-sm font-medium text-gray-900 dark:text-white"},E4={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},F4={key:0,class:"mt-3 flex items-center gap-2 border-t border-gray-200 pt-3 dark:border-gray-700"},N4={key:0,class:"ml-auto text-xs text-gray-500 dark:text-gray-400"},U4={key:1,class:"mt-2 rounded-md bg-red-50 p-2 text-xs text-red-600 dark:bg-red-900/20 dark:text-red-400"},O4={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},V4={class:"rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},H4={class:"flex items-center justify-between"},z4={class:"flex-1 pr-4"},B4={class:"text-sm font-medium text-gray-900 dark:text-white"},W4={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},j4={key:0,class:"flex items-center gap-2"},q4={key:1,class:"flex items-center gap-2"},K4={class:"font-mono text-sm text-gray-700 dark:text-gray-300"},G4={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},X4={class:"rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},Y4={class:"mb-2 text-sm font-medium text-gray-900 dark:text-white"},Q4={class:"mb-3 text-xs text-gray-500 dark:text-gray-400"},J4={key:0,class:"flex items-center gap-2"},Z4={class:"flex-1 rounded bg-gray-100 px-3 py-2 font-mono text-xs text-gray-700 dark:bg-gray-800 dark:text-gray-300"},e5={key:1,class:"text-xs text-gray-400"},t5={class:"mt-3"},s5={class:"mt-3 border-t border-gray-200 pt-3 dark:border-gray-700"},a5={class:"text-xs text-gray-500 dark:text-gray-400"},n5={class:"mt-1 rounded bg-gray-100 p-2 font-mono text-xs text-gray-700 dark:bg-gray-800 dark:text-gray-300"},o5={class:"mb-3 flex items-center gap-2 text-sm font-semibold text-gray-900 dark:text-white"},r5={class:"rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50"},i5={class:"text-xs text-gray-600 dark:text-gray-400"},l5=["href"],c5={class:"p-4"},d5={class:"mb-3 font-semibold text-gray-900 dark:text-white"},u5={class:"mb-4 text-sm text-gray-600 dark:text-gray-400"},m5={class:"flex justify-end gap-2"},g5={class:"p-4"},p5={class:"mb-3 font-semibold text-gray-900 dark:text-white"},f5={class:"mb-4 text-sm text-gray-600 dark:text-gray-400"},h5={class:"flex justify-end gap-2"},v5=Re({__name:"ApiSettingsTab",setup(e){const{t,locale:s}=Fe(),n=xi(),{config:a,status:i,loading:c,isRunning:d,hasError:m,isPortInUse:u,dataSources:y,pullingIds:g,syncProgress:_,isWebMode:x}=et(n),w=I("sync"),$=Bt();Ue(()=>$.settingsSubTab,ie=>{$.settingsTab==="api"&&ie&&["sync","api","mcp"].includes(ie)&&(w.value=ie)},{immediate:!0});const P=X(()=>[{id:"sync",label:t("settings.tabs.apiSubTabs.autoSync"),icon:"i-heroicons-cloud-arrow-down"},{id:"api",label:t("settings.tabs.apiSubTabs.apiService"),icon:"i-heroicons-server-stack"},{id:"mcp",label:t("settings.tabs.apiSubTabs.mcp"),icon:"i-heroicons-command-line"}]),h=I(!1),p=I(!1),C=I(5200),S=I(!1),z=I(!1),M=I(!1),D=I(null),E=I(!1),F=I(null),re=I(!1),ve=I(null),de=I(!1),L=I(null);let A=null,G=null;tt(async()=>{await n.refresh(),C.value=a.value.port,A=n.listenStartupError(),G=n.listenPullResult()}),Qt(()=>{A?.(),G?.()});const J=X(()=>a.value.token?a.value.token.slice(0,8)+"••••••••••••••••":""),ue=X(()=>c.value?t("settings.api.status.starting"):d.value?t("settings.api.status.running"):u.value?t("settings.api.status.portInUse"):m.value?t("settings.api.status.error"):t("settings.api.status.stopped")),W=X(()=>c.value?"text-yellow-500":d.value?"text-green-500":m.value?"text-red-500":"text-gray-400"),V=X(()=>`http://127.0.0.1:${i.value.port||a.value.port}/api/v1`),H=X(()=>s.value==="zh-CN"||s.value==="zh-TW"?"https://docs.chatlab.fun/cn/standard/chatlab-api":"https://docs.chatlab.fun/en/standard/chatlab-api");async function ae(){await n.setEnabled(!a.value.enabled)}async function K(){const ie=C.value;ie<1024||ie>65535||(await n.setPort(ie),p.value=!1)}function ee(){p.value=!0,C.value=a.value.port}function fe(){C.value=a.value.port,p.value=!1}async function he(){try{await navigator.clipboard.writeText(a.value.token),S.value=!0,setTimeout(()=>{S.value=!1},2e3)}catch{}}async function le(){await n.regenerateToken()}function B(ie){D.value=ie,M.value=!0}async function N(ie){D.value&&await n.updateDataSource(D.value.id,ie)}function T(ie){F.value=ie,E.value=!0}async function U(ie,ye){await n.addImportSessions(ie,ye)}async function Z(ie){await n.updateDataSource(ie.id,{enabled:!ie.enabled})}function oe(ie){ve.value=ie,re.value=!0}async function me(){if(!ve.value)return;const ie=ve.value;ie.enabled&&await n.updateDataSource(ie.id,{enabled:!1}),await n.deleteDataSource(ie.id),re.value=!1,ve.value=null}function pe(ie,ye){L.value={ds:ie,sess:ye},de.value=!0}async function _e(){if(!L.value)return;const{ds:ie,sess:ye}=L.value;await n.removeImportSession(ie.id,ye.id,!1),de.value=!1,L.value=null}async function be(){if(!L.value)return;const{ds:ie,sess:ye}=L.value;await n.removeImportSession(ie.id,ye.id,!0),de.value=!1,L.value=null}async function ge(ie){await n.triggerPullAll(ie.id)}async function b(ie,ye){await n.triggerPull(ie.id,ye.id)}function O(ie){return ie?new Date(ie*1e3).toLocaleString():"-"}function Q(ie){return new Set(ie.sessions.map(ye=>ye.remoteSessionId))}return(ie,ye)=>{const j=We,q=Ke,R=xs,xe=ut,Se=mt;return v(),k("div",jL,[f(o(Mn),{modelValue:w.value,"onUpdate:modelValue":ye[0]||(ye[0]=se=>w.value=se),items:P.value,"persist-key":"apiSubTab"},null,8,["modelValue","items"]),r("div",qL,[r("div",KL,[w.value==="sync"?(v(),k("div",GL,[r("h3",XL,[f(j,{name:"i-heroicons-cloud-arrow-down",class:"h-4 w-4 text-indigo-500"}),Y(" "+l(o(t)("settings.api.dataSources.title")),1)]),r("div",YL,[r("p",QL,l(o(t)("settings.api.dataSources.desc")),1),o(y).length>0?(v(),k("div",JL,[(v(!0),k(Pe,null,Be(o(y),se=>(v(),k("div",{key:se.id,class:"rounded-lg border border-gray-200 bg-white dark:border-gray-600 dark:bg-gray-800"},[r("div",ZL,[r("div",e4,[f(j,{name:"i-heroicons-server-stack",class:"h-3.5 w-3.5 text-gray-500 dark:text-gray-400"}),se.name?(v(),k("span",t4,l(se.name),1)):ne("",!0),r("span",s4,l(se.baseUrl),1),se.enabled?ne("",!0):(v(),k("span",a4," ("+l(o(t)("settings.api.dataSources.disabled"))+") ",1))]),r("div",n4,[f(q,{size:"xs",variant:"ghost",onClick:Ae=>B(se)},{default:te(()=>[f(j,{name:"i-heroicons-pencil-square",class:"mr-1 h-3.5 w-3.5"}),Y(" "+l(o(t)("settings.api.dataSources.edit.editSource")),1)]),_:1},8,["onClick"]),f(q,{size:"xs",variant:"ghost",onClick:Ae=>T(se)},{default:te(()=>[f(j,{name:"i-heroicons-queue-list",class:"mr-1 h-3.5 w-3.5"}),Y(" "+l(o(t)("settings.api.dataSources.edit.manageSessions")),1)]),_:1},8,["onClick"]),f(q,{size:"xs",variant:"ghost",onClick:Ae=>Z(se)},{default:te(()=>[f(j,{name:se.enabled?"i-heroicons-pause":"i-heroicons-play",class:"h-3.5 w-3.5"},null,8,["name"])]),_:2},1032,["onClick"]),f(q,{size:"xs",variant:"ghost",disabled:o(g).has(se.id)||se.sessions.some(Ae=>o(g).has(Ae.id)),onClick:Ae=>ge(se)},{default:te(()=>[f(j,{name:"i-heroicons-arrow-path",class:$e(["h-3.5 w-3.5",{"animate-spin":o(g).has(se.id)||se.sessions.some(Ae=>o(g).has(Ae.id))}])},null,8,["class"])]),_:2},1032,["disabled","onClick"]),f(q,{size:"xs",variant:"ghost",color:"error",disabled:se.sessions.some(Ae=>o(g).has(Ae.id)),onClick:Ae=>oe(se)},{default:te(()=>[f(j,{name:"i-heroicons-trash",class:"h-3.5 w-3.5"})]),_:1},8,["disabled","onClick"])])]),se.sessions.length>0?(v(),k("div",o4,[(v(!0),k(Pe,null,Be(se.sessions,Ae=>(v(),k("div",{key:Ae.id,class:"border-b border-gray-50 px-3 py-2.5 last:border-0 dark:border-gray-700/50"},[r("div",r4,[r("div",i4,[r("span",{class:$e(["inline-block h-2 w-2 rounded-full",o(g).has(Ae.id)?"animate-pulse bg-blue-500":Ae.lastStatus==="success"?"bg-green-500":Ae.lastStatus==="error"?"bg-red-500":"bg-gray-400"])},null,2),r("span",l4,l(Ae.name),1)]),r("div",c4,[f(q,{size:"xs",variant:"ghost",disabled:o(g).has(Ae.id),onClick:Oe=>b(se,Ae)},{default:te(()=>[f(j,{name:"i-heroicons-arrow-path",class:$e(["h-3.5 w-3.5",{"animate-spin":o(g).has(Ae.id)}])},null,8,["class"])]),_:2},1032,["disabled","onClick"]),f(q,{size:"xs",variant:"ghost",color:"error",disabled:o(g).has(Ae.id),onClick:Oe=>pe(se,Ae)},{default:te(()=>[f(j,{name:"i-heroicons-trash",class:"h-3.5 w-3.5"})]),_:1},8,["disabled","onClick"])])]),r("div",d4,[o(_).get(Ae.id)?(v(),k("span",u4,l(o(t)("settings.api.dataSources.syncing"))+"... "+l(o(_).get(Ae.id).current)+" "+l(o(t)("settings.api.dataSources.messages")),1)):o(g).has(Ae.id)&&!o(_).get(Ae.id)?(v(),k("span",m4,l(o(t)("settings.api.dataSources.syncing"))+"...",1)):(v(),k("span",g4,l(o(t)("settings.api.dataSources.every"))+" "+l(se.intervalMinutes)+" "+l(o(t)("settings.api.dataSources.minutes")),1)),!o(g).has(Ae.id)&&Ae.lastPullAt?(v(),k(Pe,{key:3},[ye[13]||(ye[13]=r("span",{class:"text-gray-300 dark:text-gray-600"},"·",-1)),r("span",p4,l(o(t)("settings.api.dataSources.lastSync"))+": "+l(O(Ae.lastPullAt)),1),Ae.lastStatus==="success"?(v(),k("span",f4," (+"+l(Ae.lastNewMessages)+") ",1)):ne("",!0),Ae.lastStatus==="error"?(v(),k("span",h4,l(Ae.lastError),1)):ne("",!0)],64)):ne("",!0)])]))),128))])):(v(),k("div",v4,l(o(t)("settings.api.dataSources.noSessions")),1))]))),128))])):(v(),k("div",y4,l(o(t)("settings.api.dataSources.empty")),1)),f(q,{variant:"soft",onClick:ye[1]||(ye[1]=se=>z.value=!0)},{default:te(()=>[f(j,{name:"i-heroicons-plus",class:"mr-2 h-4 w-4"}),Y(" "+l(o(t)("settings.api.dataSources.addBtn")),1)]),_:1})])])):ne("",!0),w.value==="api"?(v(),k(Pe,{key:1},[o(x)?(v(),k("div",b4,[r("h3",_4,[f(j,{name:"i-heroicons-server-stack",class:"h-4 w-4 text-blue-500"}),Y(" "+l(o(t)("settings.api.service.title")),1)]),r("div",x4,[r("div",k4,[ye[14]||(ye[14]=r("span",{class:"inline-block h-2 w-2 rounded-full bg-green-500"},null,-1)),r("span",w4,l(o(t)("settings.api.status.running")),1)]),r("div",S4,[r("div",C4,[r("span",null,l(o(t)("settings.api.port.label")),1),r("span",I4,l(o(a).port||"-"),1)]),o(a).token?(v(),k("div",M4,[r("span",null,l(o(t)("settings.api.token.label")),1),r("div",T4,[r("code",A4,l(h.value?o(a).token:J.value),1),f(q,{size:"xs",variant:"ghost",onClick:ye[2]||(ye[2]=se=>h.value=!h.value)},{default:te(()=>[f(j,{name:h.value?"i-heroicons-eye-slash":"i-heroicons-eye",class:"h-3.5 w-3.5"},null,8,["name"])]),_:1}),f(q,{size:"xs",variant:"ghost",onClick:he},{default:te(()=>[f(j,{name:S.value?"i-heroicons-check":"i-heroicons-clipboard",class:"h-3.5 w-3.5"},null,8,["name"])]),_:1})])])):ne("",!0)])])])):(v(),k(Pe,{key:1},[r("div",null,[r("h3",$4,[f(j,{name:"i-heroicons-server-stack",class:"h-4 w-4 text-blue-500"}),Y(" "+l(o(t)("settings.api.service.title")),1)]),r("div",P4,[r("div",D4,[r("div",L4,[r("p",R4,l(o(t)("settings.api.service.enable")),1),r("p",E4,l(o(t)("settings.api.service.enableDesc")),1)]),f(R,{"model-value":o(a).enabled,loading:o(c),"onUpdate:modelValue":ae},null,8,["model-value","loading"])]),o(a).enabled?(v(),k("div",F4,[r("span",{class:$e(["inline-block h-2 w-2 rounded-full",o(d)?"bg-green-500":o(m)?"bg-red-500":"bg-gray-400"])},null,2),r("span",{class:$e(["text-xs",W.value])},l(ue.value),3),o(d)&&o(i).port?(v(),k("span",N4,l(V.value),1)):ne("",!0)])):ne("",!0),o(u)?(v(),k("div",U4,l(o(t)("settings.api.service.portInUseHint")),1)):ne("",!0)])]),r("div",null,[r("h3",O4,[f(j,{name:"i-heroicons-globe-alt",class:"h-4 w-4 text-purple-500"}),Y(" "+l(o(t)("settings.api.port.title")),1)]),r("div",V4,[r("div",H4,[r("div",z4,[r("p",B4,l(o(t)("settings.api.port.label")),1),r("p",W4,l(o(t)("settings.api.port.desc")),1)]),p.value?(v(),k("div",j4,[f(xe,{modelValue:C.value,"onUpdate:modelValue":ye[3]||(ye[3]=se=>C.value=se),modelModifiers:{number:!0},type:"number",min:1024,max:65535,size:"sm",class:"w-24"},null,8,["modelValue"]),f(q,{size:"xs",color:"primary",loading:o(c),onClick:K},{default:te(()=>[Y(l(o(t)("settings.api.port.save")),1)]),_:1},8,["loading"]),f(q,{size:"xs",variant:"ghost",onClick:fe},{default:te(()=>[Y(l(o(t)("settings.api.port.cancel")),1)]),_:1})])):(v(),k("div",q4,[r("span",K4,l(o(a).port),1),f(q,{size:"xs",variant:"ghost",onClick:ee},{default:te(()=>[Y(l(o(t)("settings.api.port.edit")),1)]),_:1})]))])])]),r("div",null,[r("h3",G4,[f(j,{name:"i-heroicons-key",class:"h-4 w-4 text-amber-500"}),Y(" "+l(o(t)("settings.api.token.title")),1)]),r("div",X4,[r("p",Y4,l(o(t)("settings.api.token.label")),1),r("p",Q4,l(o(t)("settings.api.token.desc")),1),o(a).token?(v(),k("div",J4,[r("code",Z4,l(h.value?o(a).token:J.value),1),f(q,{size:"xs",variant:"ghost",onClick:ye[4]||(ye[4]=se=>h.value=!h.value)},{default:te(()=>[f(j,{name:h.value?"i-heroicons-eye-slash":"i-heroicons-eye",class:"h-4 w-4"},null,8,["name"])]),_:1}),f(q,{size:"xs",variant:"ghost",onClick:he},{default:te(()=>[f(j,{name:S.value?"i-heroicons-check":"i-heroicons-clipboard",class:"h-4 w-4"},null,8,["name"])]),_:1})])):(v(),k("div",e5,l(o(t)("settings.api.token.noToken")),1)),r("div",t5,[f(q,{variant:"soft",color:"warning",onClick:le},{default:te(()=>[f(j,{name:"i-heroicons-arrow-path",class:"mr-1 h-4 w-4"}),Y(" "+l(o(t)("settings.api.token.regenerate")),1)]),_:1})]),r("div",s5,[r("p",a5,l(o(t)("settings.api.usage.authHint")),1),r("div",n5," Authorization: Bearer "+l(o(a).token?J.value:"clb_..."),1)])])])],64)),r("div",null,[r("h3",o5,[f(j,{name:"i-heroicons-book-open",class:"h-4 w-4 text-teal-500"}),Y(" "+l(o(t)("settings.api.usage.title")),1)]),r("div",r5,[r("p",i5,l(o(t)("settings.api.usage.desc")),1),r("a",{href:H.value,target:"_blank",class:"mt-2 inline-flex items-center gap-1 text-xs text-blue-500 hover:text-blue-600 dark:text-blue-400 dark:hover:text-blue-300"},[f(j,{name:"i-heroicons-arrow-top-right-on-square",class:"h-3.5 w-3.5"}),Y(" "+l(o(t)("settings.api.usage.docLink")),1)],8,l5)])])],64)):ne("",!0),w.value==="mcp"?(v(),Te(WL,{key:2})):ne("",!0)])]),f(ar,{open:z.value,"onUpdate:open":ye[5]||(ye[5]=se=>z.value=se),onSourceAdded:ye[6]||(ye[6]=se=>o(n).fetchDataSources())},null,8,["open"]),f(hL,{open:M.value,"onUpdate:open":ye[7]||(ye[7]=se=>M.value=se),"data-source":D.value,onSaved:N},null,8,["open","data-source"]),F.value?(v(),Te(ar,{key:0,open:E.value,"onUpdate:open":ye[8]||(ye[8]=se=>E.value=se),"manage-source":F.value,"subscribed-remote-ids":Q(F.value),onSessionsAdded:U},null,8,["open","manage-source","subscribed-remote-ids"])):ne("",!0),f(Se,{open:re.value,"onUpdate:open":ye[10]||(ye[10]=se=>re.value=se),ui:{content:"z-[101]",overlay:"z-[100]"}},{content:te(()=>[r("div",c5,[r("h3",d5,l(o(t)("settings.api.dataSources.deleteConfirm.title")),1),r("p",u5,l(o(t)("settings.api.dataSources.deleteConfirm.message",{name:ve.value?.baseUrl})),1),r("div",m5,[f(q,{variant:"soft",onClick:ye[9]||(ye[9]=se=>re.value=!1)},{default:te(()=>[Y(l(o(t)("common.cancel")),1)]),_:1}),f(q,{color:"error",onClick:me},{default:te(()=>[Y(l(o(t)("common.delete")),1)]),_:1})])])]),_:1},8,["open"]),f(Se,{open:de.value,"onUpdate:open":ye[12]||(ye[12]=se=>de.value=se),ui:{content:"z-[101]",overlay:"z-[100]"}},{content:te(()=>[r("div",g5,[r("h3",p5,l(o(t)("settings.api.dataSources.deleteSessionConfirm.title")),1),r("p",f5,l(o(t)("settings.api.dataSources.deleteSessionConfirm.message",{name:L.value?.sess.name})),1),r("div",h5,[f(q,{variant:"soft",onClick:ye[11]||(ye[11]=se=>de.value=!1)},{default:te(()=>[Y(l(o(t)("common.cancel")),1)]),_:1}),f(q,{variant:"soft",onClick:_e},{default:te(()=>[Y(l(o(t)("settings.api.dataSources.deleteSessionConfirm.keepData")),1)]),_:1}),f(q,{color:"error",onClick:be},{default:te(()=>[Y(l(o(t)("settings.api.dataSources.deleteSessionConfirm.deleteData")),1)]),_:1})])])]),_:1},8,["open"])])}}}),y5={class:"flex min-h-[650px] h-[85vh] flex-col overflow-hidden"},b5={class:"shrink-0 border-b border-gray-200 px-6 pt-5 pb-0 dark:border-gray-800"},_5={class:"flex items-center justify-between"},x5={class:"flex items-center gap-3"},k5={class:"flex h-8 w-8 items-center justify-center rounded-lg bg-primary-600 dark:bg-primary-500"},w5={class:"text-lg font-semibold text-gray-900 dark:text-white"},S5={class:"mt-4 flex items-center gap-1 overflow-x-auto pb-3 scrollbar-hide"},C5=["onClick"],I5={class:"whitespace-nowrap"},M5={class:"relative flex-1"},T5={class:"absolute inset-0 p-6"},A5={key:"settings",class:"h-full overflow-y-auto"},$5={key:"about",class:"h-full overflow-y-auto"},P5=Re({__name:"SettingsModal",setup(e){const{t}=Fe(),s=ka(),n=Bt(),{showSettings:a,settingsTab:i,settingsSubTab:c}=et(n),d=X(()=>[{id:"settings",label:t("settings.tabs.basic"),icon:"i-heroicons-cog-6-tooth"},{id:"ai",label:t("settings.tabs.ai"),icon:"i-heroicons-sparkles"},{id:"api",label:t("settings.tabs.api"),icon:"i-heroicons-server-stack"},{id:"data",label:t("settings.tabs.dataManage"),icon:"i-heroicons-rectangle-stack"},{id:"storage",label:t("settings.tabs.storage"),icon:"i-heroicons-folder-open"},{id:"about",label:t("settings.tabs.about"),icon:"i-heroicons-information-circle"}]),m=I("settings"),u=I({});function y(w,$){u.value[w]=$}function g(){s.notifyAIConfigChanged()}function _(w){m.value=w,at(()=>{u.value[w]?.refresh?.()})}function x(w){const $=u.value[m.value];$?.scrollToSection&&$.scrollToSection(w)}return Ue(a,async w=>{w&&(m.value=i.value||"settings",c.value&&(await at(),setTimeout(()=>x(c.value),100)),at(()=>{u.value[m.value]?.refresh?.()}))}),(w,$)=>{const P=We,h=Ke,p=mt;return v(),Te(p,{open:o(a),"onUpdate:open":$[1]||($[1]=C=>rt(a)?a.value=C:null),ui:{content:"sm:max-w-[900px] z-[100]",overlay:"z-[99] bg-gray-200/80 backdrop-blur-sm dark:bg-gray-950/80"}},{content:te(()=>[r("div",y5,[r("div",b5,[r("div",_5,[r("div",x5,[r("div",k5,[f(P,{name:"i-heroicons-cog-6-tooth",class:"h-4 w-4 text-white"})]),r("h2",w5,l(o(t)("settings.title")),1)]),f(h,{icon:"i-heroicons-x-mark",color:"neutral",variant:"ghost",size:"sm",onClick:$[0]||($[0]=C=>o(n).closeSettings())})]),r("div",S5,[(v(!0),k(Pe,null,Be(d.value,C=>(v(),k("button",{key:C.id,class:$e(["flex items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium transition-all",[m.value===C.id?"bg-pink-500 text-white dark:bg-pink-900/30 dark:text-pink-300":"text-gray-600 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-800"]]),onClick:S=>_(C.id)},[f(P,{name:C.icon,class:"h-4 w-4"},null,8,["name"]),r("span",I5,l(C.label),1)],10,C5))),128))])]),r("div",M5,[r("div",T5,[f(mn,{name:"tab-slide",mode:"out-in"},{default:te(()=>[m.value==="settings"?(v(),k("div",A5,[f(T$)])):m.value==="ai"?(v(),Te(EA,{key:"ai",ref:C=>y("ai",C),onConfigChanged:g},null,512)):m.value==="data"?(v(),Te($P,{key:"data"})):m.value==="api"?(v(),Te(v5,{key:"api"})):m.value==="storage"?(v(),Te(E2,{key:"storage",ref:C=>y("storage",C)},null,512)):m.value==="about"?(v(),k("div",$5,[f(oD)])):ne("",!0)]),_:1})])])])]),_:1},8,["open"])}}}),D5=ks(P5,[["__scopeId","data-v-e39e5624"]]),L5={class:"border-b border-gray-200 px-4 py-3 dark:border-gray-800"},R5={class:"flex items-center gap-3"},E5={class:"flex items-center gap-2"},F5={class:"mt-2 flex items-center gap-3"},N5={class:"flex gap-2"},U5=Re({__name:"FilterPanel",props:{query:{}},emits:["apply","reset"],setup(e,{emit:t}){const{t:s}=Fe(),n=e,a=t,i=I({messageId:"",memberName:"",keywords:"",startDate:"",endDate:""});Ue(()=>n.query,u=>{u&&(i.value={messageId:u.scrollToMessageId?.toString()||"",memberName:u.memberName||"",keywords:u.keywords?.join(", ")||"",startDate:u.startTs?gt.unix(u.startTs).format("YYYY-MM-DD"):"",endDate:u.endTs?gt.unix(u.endTs).format("YYYY-MM-DD"):""})},{immediate:!0});function c(){const u=i.value,y={},g=u.keywords&&u.keywords.trim();if(u.messageId&&!g){const _=parseInt(u.messageId,10);isNaN(_)||(y.scrollToMessageId=_)}if(u.memberName&&(y.memberName=u.memberName),g){const _=u.keywords.split(/[,,]/).map(x=>x.trim()).filter(x=>x);_.length>0&&(y.keywords=_,y.highlightKeywords=_,i.value.messageId="")}u.startDate&&(y.startTs=gt(u.startDate).startOf("day").unix()),u.endDate&&(y.endTs=gt(u.endDate).endOf("day").unix()),a("apply",y)}function d(u){u.key==="Enter"&&(u.preventDefault(),c())}function m(){i.value={messageId:"",memberName:"",keywords:"",startDate:"",endDate:""},a("reset")}return(u,y)=>{const g=ut,_=Ke;return v(),k("div",L5,[r("div",R5,[f(g,{modelValue:i.value.messageId,"onUpdate:modelValue":y[0]||(y[0]=x=>i.value.messageId=x),type:"number",placeholder:o(s)("records.filter.messageId"),size:"sm",class:"w-24"},null,8,["modelValue","placeholder"]),f(g,{modelValue:i.value.memberName,"onUpdate:modelValue":y[1]||(y[1]=x=>i.value.memberName=x),placeholder:o(s)("records.filter.memberNotSupported"),size:"sm",class:"w-28",disabled:""},null,8,["modelValue","placeholder"]),r("div",E5,[f(o(tr),{modelValue:i.value.startDate,"onUpdate:modelValue":y[2]||(y[2]=x=>i.value.startDate=x),placeholder:o(s)("records.filter.startDate")},null,8,["modelValue","placeholder"]),y[5]||(y[5]=r("span",{class:"text-xs text-gray-400"},"~",-1)),f(o(tr),{modelValue:i.value.endDate,"onUpdate:modelValue":y[3]||(y[3]=x=>i.value.endDate=x),placeholder:o(s)("records.filter.endDate")},null,8,["modelValue","placeholder"])])]),r("div",F5,[f(g,{modelValue:i.value.keywords,"onUpdate:modelValue":y[4]||(y[4]=x=>i.value.keywords=x),placeholder:o(s)("records.filter.keywordsPlaceholder"),size:"sm",class:"flex-1",onKeydown:d},null,8,["modelValue","placeholder"]),r("div",N5,[f(_,{color:"neutral",variant:"ghost",size:"sm",onClick:m},{default:te(()=>[Y(l(o(s)("records.filter.reset")),1)]),_:1}),f(_,{color:"primary",size:"sm",onClick:c},{default:te(()=>[Y(l(o(s)("records.filter.filter")),1)]),_:1})])])])}}}),O5=["src","alt"],V5={key:1},H5={key:0,class:"mb-2 border-l-2 border-pink-400 dark:border-pink-500 pl-2.5 py-1 text-xs text-gray-500 dark:text-gray-400 bg-gray-500/5 dark:bg-white/5 rounded-r"},z5={class:"font-medium text-gray-600 dark:text-gray-300"},B5={key:0,class:"ml-1 font-semibold text-gray-700 dark:text-gray-200"},W5={key:1,class:"mt-1 line-clamp-2 italic text-gray-500 dark:text-gray-400 leading-normal"},j5=["innerHTML"],q5=["title"],K5=Re({__name:"MessageItem",props:{message:{},isTarget:{type:Boolean},highlightKeywords:{},isFiltered:{type:Boolean}},emits:["view-context"],setup(e,{emit:t}){const{t:s}=Fe(),n=e,a=St(),i=X(()=>{const $=a.currentSession?.ownerId;return $?n.message.senderPlatformId===$:!1}),c=X(()=>{const $=n.message.senderName||"";let P=0;for(let h=0;h<$.length;h++)P=$.charCodeAt(h)+((P<<5)-P);return Math.abs(P)%16}),d=[{avatar:"bg-rose-400 dark:bg-rose-500",name:"text-rose-600 dark:text-rose-400"},{avatar:"bg-pink-400 dark:bg-pink-500",name:"text-pink-600 dark:text-pink-400"},{avatar:"bg-fuchsia-400 dark:bg-fuchsia-500",name:"text-fuchsia-600 dark:text-fuchsia-400"},{avatar:"bg-purple-400 dark:bg-purple-500",name:"text-purple-600 dark:text-purple-400"},{avatar:"bg-violet-400 dark:bg-violet-500",name:"text-violet-600 dark:text-violet-400"},{avatar:"bg-indigo-400 dark:bg-indigo-500",name:"text-indigo-600 dark:text-indigo-400"},{avatar:"bg-blue-400 dark:bg-blue-500",name:"text-blue-600 dark:text-blue-400"},{avatar:"bg-sky-400 dark:bg-sky-500",name:"text-sky-600 dark:text-sky-400"},{avatar:"bg-cyan-400 dark:bg-cyan-500",name:"text-cyan-600 dark:text-cyan-400"},{avatar:"bg-teal-400 dark:bg-teal-500",name:"text-teal-600 dark:text-teal-400"},{avatar:"bg-emerald-400 dark:bg-emerald-500",name:"text-emerald-600 dark:text-emerald-400"},{avatar:"bg-green-400 dark:bg-green-500",name:"text-green-600 dark:text-green-400"},{avatar:"bg-lime-500 dark:bg-lime-600",name:"text-lime-600 dark:text-lime-400"},{avatar:"bg-amber-400 dark:bg-amber-500",name:"text-amber-600 dark:text-amber-400"},{avatar:"bg-orange-400 dark:bg-orange-500",name:"text-orange-600 dark:text-orange-400"},{avatar:"bg-red-400 dark:bg-red-500",name:"text-red-600 dark:text-red-400"}],m=X(()=>d[c.value]),u=X(()=>m.value.avatar),y=X(()=>m.value.name),g=X(()=>i.value?"bg-pink-50/80 dark:bg-pink-950/20":"bg-gray-100/80 dark:bg-gray-800/80"),_=X(()=>{const $=n.message.senderName||"",P=n.message.senderAliases||[];return P.length>0?`${$}(${P[0]})`:$}),x=X(()=>{const $=n.message.senderName||"";if(!$)return"?";try{const h=[...new Intl.Segmenter("zh",{granularity:"grapheme"}).segment($)];if(h.length>0)return h[0].segment}catch{const P=[...$];if(P.length>0){const h=P[0];return/^[a-zA-Z]$/.test(h)?h.toUpperCase():h}}return"?"});function w($){if(!n.highlightKeywords?.length||!$)return $;const P=n.highlightKeywords.map(p=>p.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),h=new RegExp(`(${P})`,"gi");return $.replace(h,'<mark class="bg-transparent border-b-2 border-yellow-400 dark:border-yellow-500">$1</mark>')}return($,P)=>{const h=We;return v(),k("div",{class:$e(["group px-4 py-2.5 transition-all duration-300",[e.isTarget?"bg-amber-500/5 dark:bg-amber-500/10":"hover:bg-gray-50/40 dark:hover:bg-gray-900/10"]])},[r("div",{class:$e(["flex gap-3",i.value?"flex-row-reverse":""])},[r("div",{class:$e(["flex h-9 w-9 shrink-0 items-center justify-center rounded-lg text-sm font-medium text-white overflow-hidden",e.message.senderAvatar?"":u.value])},[e.message.senderAvatar?(v(),k("img",{key:0,src:e.message.senderAvatar,alt:e.message.senderName,class:"h-full w-full object-cover"},null,8,O5)):(v(),k("span",V5,l(x.value),1))],2),r("div",{class:$e(["min-w-0 flex-1",i.value?"flex flex-col items-end":""])},[r("div",{class:$e(["mb-1 flex items-center gap-2",i.value?"flex-row-reverse":""])},[r("span",{class:$e(["text-sm font-medium",y.value])},l(_.value),3)],2),r("div",{class:$e(["flex items-start gap-1 max-w-[calc(100%-68px)]",i.value?"flex-row-reverse":""])},[r("div",{class:$e(["relative inline-block rounded-2xl px-3.5 py-2.5 transition-all duration-300 border border-gray-100 dark:border-gray-800/40",[g.value,e.isTarget?"ring-2 ring-amber-400 dark:ring-amber-500":""]])},[e.message.replyToMessageId?(v(),k("div",H5,[r("span",z5,l(o(s)("records.messageItem.replyTo")),1),e.message.replyToSenderName?(v(),k("span",B5,l(e.message.replyToSenderName),1)):ne("",!0),e.message.replyToContent?(v(),k("p",W5,l(e.message.replyToContent),1)):ne("",!0)])):ne("",!0),r("p",{class:"whitespace-pre-wrap break-all text-sm text-gray-700 dark:text-gray-200",innerHTML:w(e.message.content||"")},null,8,j5)],2),e.isFiltered?(v(),k("button",{key:0,class:"mt-1 flex h-6 w-6 items-center justify-center rounded-lg opacity-0 transition-all duration-200 hover:bg-gray-100 dark:hover:bg-gray-800 hover:text-pink-500 dark:hover:text-pink-400 active:scale-95 group-hover:opacity-100 cursor-pointer",title:o(s)("records.messageItem.viewContext"),onClick:P[0]||(P[0]=p=>$.$emit("view-context",e.message.id))},[f(h,{name:"i-heroicons-chat-bubble-left-ellipsis",class:"h-4 w-4"})],8,q5)):ne("",!0)],2)],2)],2)],2)}}}),G5={class:"flex h-full flex-col overflow-hidden"},X5={key:0,class:"flex h-full items-center justify-center"},Y5={class:"text-center"},Q5={class:"mt-2 text-sm text-gray-500"},J5={key:1,class:"flex h-full items-center justify-center"},Z5={class:"text-center"},e3={class:"mt-2 text-sm text-gray-500"},t3={class:"mt-1 text-xs text-gray-400"},s3={key:0,class:"flex justify-center py-2"},a3={key:0,class:"text-xs text-gray-400"},n3={key:1,class:"text-xs text-gray-400"},o3=["data-index"],r3={key:0,class:"flex items-center justify-center py-2"},i3={class:"flex items-center gap-2 text-xs text-gray-400"},l3={key:1,class:"flex justify-center py-2"},c3={key:0,class:"text-xs text-gray-400"},d3={key:1,class:"text-xs text-gray-400"},u3=300,nr=80,m3=Re({__name:"MessageList",props:{query:{},externalMessages:{default:void 0},hitMessageIds:{default:()=>[]},externalScrollBehavior:{default:"top"}},emits:["count-change","visible-message-change","jump-to-message","reach-bottom","reach-top","message-timestamps-change"],setup(e,{expose:t,emit:s}){const{t:n}=Fe(),a=e,i=s,c=St(),d=X(()=>!!a.externalMessages?.length),m=X(()=>{if(d.value)return!1;const ee=a.query;return!!(ee.memberId||ee.keywords?.length)}),u=I([]),y=I(!1),g=I(!1),_=I(!1),x=I(!1),w=I(!1),$=I(0),P=I(null),h=I(null),p=hr(X(()=>({count:u.value.length,getScrollElement:()=>P.value,estimateSize:()=>nr,overscan:10,getItemKey:ee=>u.value[ee]?.id??ee}))),C=X(()=>p.value.getVirtualItems()),S=X(()=>p.value.getTotalSize());function z(ee){return{filter:ee.startTs||ee.endTs?{startTs:ee.startTs,endTs:ee.endTs}:void 0,senderId:ee.memberId,keywords:ee.keywords?[...Yt(ee.keywords)]:void 0}}function M(ee){return ee.map(fe=>({...fe,replyToMessageId:fe.replyToMessageId??null,replyToContent:fe.replyToContent??null,replyToSenderName:fe.replyToSenderName??null}))}let D=0;async function E(){if(d.value){const fe=a.externalMessages.length,he=D>0&&fe>D;u.value=a.externalMessages,_.value=!1,x.value=!1,w.value=!1,i("count-change",u.value.length),D=fe,await at(),a.externalScrollBehavior==="preserve"&&he||F();return}const ee=c.currentSessionId;if(!ee){u.value=[],i("count-change",0);return}y.value=!0,u.value=[],h.value=null;try{const fe=Yt(a.query),{filter:he,senderId:le,keywords:B}=z(fe),N=fe.scrollToMessageId;if(N){const U=ds(),[Z,oe]=await Promise.all([U.getMessagesBefore(ee,N,50,he,le,B),U.getMessagesAfter(ee,N,50,he,le,B)]),me=await U.getMessageContext(ee,N,0);u.value=M([...Z.messages,...me,...oe.messages]),_.value=Z.hasMore,x.value=oe.hasMore,h.value=N}else if(B&&B.length>0){w.value=!0,$.value=0;const U=await ds().searchMessages(ee,B,he,100,0,le);u.value=M(U.messages),_.value=!1,x.value=U.messages.length>=100,$.value=U.messages.length,await at(),F()}else{w.value=!1,$.value=0;const U=await ds().getAllRecentMessages(ee,he,100);u.value=M(U.messages),_.value=U.messages.length>=100,x.value=!1,await at(),setTimeout(()=>{re()},50)}i("count-change",u.value.length);const T=u.value.map(U=>U.timestamp);i("message-timestamps-change",T),h.value&&(await at(),setTimeout(()=>{h.value&&(L(h.value),h.value=null)},100))}catch(fe){console.error("加载消息失败:",fe),u.value=[],i("count-change",0)}finally{y.value=!1}}function F(){p.value.scrollToOffset(0)}function re(){u.value.length!==0&&(p.value.scrollToIndex(u.value.length-1,{align:"end"}),requestAnimationFrame(()=>{const ee=P.value;ee&&(ee.scrollTop=ee.scrollHeight)}))}async function ve(){if(g.value||!_.value||u.value.length===0)return;const ee=c.currentSessionId;if(!ee)return;const fe=u.value[0];if(fe){g.value=!0;try{const he=Yt(a.query),{filter:le,senderId:B,keywords:N}=z(he),T=await ds().getMessagesBefore(ee,fe.id,50,le,B,N);if(T.messages.length>0){const U=p.value.scrollOffset??0,Z=[...M(T.messages),...u.value];u.value=Z,await at();const me=T.messages.length*nr;p.value.scrollToOffset(U+me),i("count-change",u.value.length),i("message-timestamps-change",u.value.map(pe=>pe.timestamp))}_.value=T.hasMore}catch(he){console.error("加载更早消息失败:",he)}finally{g.value=!1}}}async function de(){if(g.value||!x.value||u.value.length===0)return;const ee=c.currentSessionId;if(ee){g.value=!0;try{const fe=Yt(a.query),{filter:he,senderId:le,keywords:B}=z(fe);if(w.value&&B&&B.length>0){const N=await ds().searchMessages(ee,B,he,50,$.value,le);N.messages.length>0&&(u.value=[...u.value,...M(N.messages)],$.value+=N.messages.length,i("count-change",u.value.length),i("message-timestamps-change",u.value.map(T=>T.timestamp))),x.value=N.messages.length>=50}else{const N=u.value[u.value.length-1];if(!N)return;const T=await ds().getMessagesAfter(ee,N.id,50,he,le,B);T.messages.length>0&&(u.value=[...u.value,...M(T.messages)],i("count-change",u.value.length),i("message-timestamps-change",u.value.map(U=>U.timestamp))),x.value=T.hasMore}}catch(fe){console.error("加载更多消息失败:",fe)}finally{g.value=!1}}}function L(ee){const fe=u.value.findIndex(he=>he.id===ee);fe!==-1&&p.value.scrollToIndex(fe,{align:"center"})}function A(){const ee=P.value;if(!ee)return;const fe=ee.scrollHeight-ee.scrollTop-ee.clientHeight;d.value&&(ee.scrollTop<50&&i("reach-top"),fe<50&&i("reach-bottom")),!d.value&&!g.value&&(ee.scrollTop<100&&_.value&&ve(),fe<100&&x.value&&de()),ue()}let G=null,J=0;function ue(){G||(G=setTimeout(()=>{G=null,W()},150))}function W(){const ee=C.value;if(ee.length===0)return;const fe=Math.floor(ee.length/2),he=ee[fe];if(!he)return;const le=u.value[he.index];le&&le.id!==J&&(J=le.id,i("visible-message-change",{id:le.id,timestamp:le.timestamp}))}function V(ee){return d.value&&a.hitMessageIds?.length?a.hitMessageIds.includes(ee):ee===a.query.scrollToMessageId}function H(ee){const fe=u.value[ee];if(!fe)return null;const he=ee>0?u.value[ee-1]:null;if(!he)return ae(fe.timestamp);const le=fe.timestamp,B=he.timestamp,N=le-B,T=gt.unix(le).startOf("day"),U=gt.unix(B).startOf("day");return!T.isSame(U)||N>=u3?ae(le):null}function ae(ee){const fe=gt.unix(ee),he=gt().startOf("day");return fe.isSame(he,"day")?fe.format("HH:mm"):fe.format("YYYY-MM-DD HH:mm")}function K(ee){ee&&p.value.measureElement(ee)}return Ue(()=>a.query,()=>{d.value||E()},{deep:!0}),Ue(()=>a.externalMessages,()=>{d.value&&E()},{deep:!0,immediate:!0}),Qt(()=>{G&&(clearTimeout(G),G=null)}),t({refresh:E,scrollToMessage:L}),(ee,fe)=>{const he=We;return v(),k("div",G5,[y.value?(v(),k("div",X5,[r("div",Y5,[f(he,{name:"i-heroicons-arrow-path",class:"h-8 w-8 animate-spin text-gray-400"}),r("p",Q5,l(o(n)("records.messageList.loading")),1)])])):u.value.length===0?(v(),k("div",J5,[r("div",Z5,[f(he,{name:"i-heroicons-chat-bubble-left-right",class:"h-12 w-12 text-gray-300 dark:text-gray-600"}),r("p",e3,l(o(n)("records.messageList.noMessages")),1),r("p",t3,l(o(n)("records.messageList.tryAdjustFilter")),1)])])):(v(),k("div",{key:2,ref_key:"scrollContainerRef",ref:P,class:"h-full overflow-y-auto",onScroll:A},[_.value?(v(),k("div",s3,[g.value?(v(),k("span",a3,[f(he,{name:"i-heroicons-arrow-path",class:"mr-1 inline h-3 w-3 animate-spin"}),Y(" "+l(o(n)("records.messageList.loadingMore")),1)])):(v(),k("span",n3,l(o(n)("records.messageList.scrollUpForMore")),1))])):ne("",!0),r("div",{class:"relative w-full",style:hs({height:`${S.value}px`})},[(v(!0),k(Pe,null,Be(C.value,le=>(v(),k("div",{key:String(le.key),ref_for:!0,ref:B=>K(B),class:"absolute left-0 top-0 w-full",style:hs({transform:`translateY(${le.start}px)`}),"data-index":le.index},[H(le.index)?(v(),k("div",r3,[r("div",i3,[fe[1]||(fe[1]=r("div",{class:"h-px w-8 bg-gray-200 dark:bg-gray-700"},null,-1)),r("span",null,l(H(le.index)),1),fe[2]||(fe[2]=r("div",{class:"h-px w-8 bg-gray-200 dark:bg-gray-700"},null,-1))])])):ne("",!0),f(K5,{"data-message-id":u.value[le.index]?.id,message:u.value[le.index],"is-target":V(u.value[le.index]?.id??0),"highlight-keywords":e.query.highlightKeywords,"is-filtered":m.value,onViewContext:fe[0]||(fe[0]=B=>i("jump-to-message",B))},null,8,["data-message-id","message","is-target","highlight-keywords","is-filtered"])],12,o3))),128))],4),x.value?(v(),k("div",l3,[g.value?(v(),k("span",c3,[f(he,{name:"i-heroicons-arrow-path",class:"mr-1 inline h-3 w-3 animate-spin"}),Y(" "+l(o(n)("records.messageList.loadingMore")),1)])):(v(),k("span",d3,l(o(n)("records.messageList.scrollDownForMore")),1))])):ne("",!0)],544))])}}});function g3(e){e.value=!0}function p3(e,t,s,n){return[e,t,s,!1,n]}const f3={class:"flex items-center justify-between"},h3={class:"text-lg font-semibold"},v3={class:"space-y-4"},y3={class:"flex gap-2 border-b border-gray-200 dark:border-gray-700 pb-3"},b3={key:0},_3={class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2"},x3={class:"space-y-3"},k3={class:"flex items-center gap-4"},w3={class:"text-lg font-semibold text-primary-600 dark:text-primary-400 min-w-[4rem] text-right"},S3={class:"text-xs text-gray-500 flex justify-between"},C3={key:0},I3={key:1},M3={class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2"},T3={class:"flex flex-wrap gap-2"},A3={key:0,class:"mt-3 flex items-center gap-2"},$3={key:2,class:"text-sm text-gray-600 dark:text-gray-400"},P3={key:0,class:"text-gray-500"},D3={key:0,class:"text-green-600 dark:text-green-400"},L3={key:2,class:"text-gray-400"},R3={key:0,class:"mt-1 font-medium"},E3={key:1,class:"mt-1 text-gray-400"},F3={key:1,class:"text-gray-400"},N3={key:3,class:"flex items-center gap-2 text-sm text-gray-500"},U3={key:4,class:"flex items-center gap-2 text-sm text-gray-500"},O3={key:5,class:"space-y-2"},V3={class:"flex items-center justify-between text-sm"},H3={key:1,class:"h-2 w-full rounded-full bg-green-500"},z3={class:"flex items-center gap-2"},B3={class:"flex-1 font-medium"},W3={key:0,class:"pl-6 text-xs text-gray-600 dark:text-gray-400 line-clamp-2"},j3={key:1,class:"pl-6 text-xs text-red-500"},q3={key:2,class:"pl-6 text-xs text-gray-400 italic"},K3={key:7,class:"flex items-center gap-4 text-sm"},G3={class:"text-green-600 dark:text-green-400"},X3={key:0,class:"text-red-600 dark:text-red-400"},Y3={key:1,class:"text-gray-500"},Q3={class:"flex justify-end gap-2"},J3=Re({__name:"BatchSummaryModal",props:{open:{type:Boolean},sessionId:{}},emits:["update:open","completed"],setup(e,{emit:t}){const s=e,n=t,{t:a,locale:i}=Fe(),c=X({get:()=>s.open,set:H=>n("update:open",H)}),d=I("range"),m=I(50),u=I(0),y=I("today"),g=I(""),_=I(""),x=I([]),w=I(!1),$=I(!1),P=I(0),h=I(0),p=I([]),C=I(!1);function S(H){return H.includes("少于3条")||H.includes("less than 3")||H.includes("无需生成摘要")}const z=I(null),M=X(()=>{const H=new Date,ae=new Date(H.getFullYear(),H.getMonth(),H.getDate());switch(y.value){case"today":return{start:ae.getTime(),end:H.getTime()};case"yesterday":{const K=new Date(ae);return K.setDate(K.getDate()-1),{start:K.getTime(),end:ae.getTime()-1}}case"week":{const K=new Date(ae);return K.setDate(K.getDate()-7),{start:K.getTime(),end:H.getTime()}}case"month":{const K=new Date(ae);return K.setMonth(K.getMonth()-1),{start:K.getTime(),end:H.getTime()}}case"custom":if(g.value&&_.value){const K=new Date(g.value),ee=new Date(_.value);return{start:K.getTime(),end:new Date(ee.getTime()+1440*60*1e3-1).getTime()}}return null;default:return null}}),D=I({}),E=I(!1),F=X(()=>x.value.filter(H=>H.summary?!1:D.value[H.id]?.canGenerate!==!1)),re=X(()=>x.value.filter(H=>H.summary).length),ve=X(()=>x.value.filter(H=>H.summary?!1:D.value[H.id]?.canGenerate===!1).length),de=X(()=>h.value===0?100:Math.round(P.value/h.value*100)),L=X(()=>{const H=p.value.filter(ee=>ee.status==="success").length,ae=p.value.filter(ee=>ee.status==="failed").length,K=p.value.filter(ee=>ee.status==="skipped").length;return{success:H,failed:ae,skipped:K}});async function A(){w.value=!0,D.value={};try{if(d.value==="range"){const H=await dt().getSessions(s.sessionId);u.value=H.length;const ae=Math.ceil(H.length*(m.value/100));x.value=H.slice(-ae)}else{if(!M.value){x.value=[];return}const H=Math.floor(M.value.start/1e3),ae=Math.floor(M.value.end/1e3);x.value=await dt().getByTimeRange(s.sessionId,H,ae)}x.value.length>0&&await G()}catch(H){console.error("查询会话失败:",H),x.value=[]}finally{w.value=!1}}async function G(){const H=x.value.filter(ae=>!ae.summary).map(ae=>ae.id);if(H.length!==0){E.value=!0;try{D.value=await dt().checkCanGenerateSummary(s.sessionId,H)}catch(ae){console.error("检查会话摘要失败:",ae)}finally{E.value=!1}}}const J=hl(()=>{A()},300);Ue(()=>[d.value,y.value,g.value,_.value],()=>{(d.value==="range"||y.value!=="custom"||g.value&&_.value)&&A()},{immediate:!0}),Ue(()=>m.value,()=>{d.value==="range"&&J()}),Ue(()=>s.open,H=>{H&&($.value=!1,P.value=0,p.value=[],C.value=!1,A())});async function ue(){const H=[...F.value];if(H.length!==0){$.value=!0,C.value=!1,P.value=0,h.value=H.length,p.value=[];try{for(const ae of H){if(C.value)break;try{const K=await dt().generateSummary(s.sessionId,ae.id,i.value,!1,In());if(K.success){p.value.push({id:ae.id,status:"success",summary:K.summary||""});const ee=x.value.findIndex(fe=>fe.id===ae.id);ee!==-1&&(x.value[ee].summary=K.summary||"")}else K.error&&S(K.error)?p.value.push({id:ae.id,status:"skipped",message:K.error}):p.value.push({id:ae.id,status:"failed",message:K.error})}catch(K){p.value.push({id:ae.id,status:"failed",message:String(K)})}P.value++,await at(),z.value&&(z.value.scrollTop=z.value.scrollHeight)}}finally{$.value=!1}L.value.success>0&&n("completed")}}function W(){g3(C)}function V(){$.value&&(C.value=!0),n("update:open",!1)}return(H,ae)=>{const K=Ke,ee=Zi,fe=ut,he=We,le=br,B=Ji,N=mt;return v(),Te(N,{open:c.value,"onUpdate:open":ae[5]||(ae[5]=T=>c.value=T),ui:{overlay:"z-[10001]",content:"z-[10001]"}},{content:te(()=>[f(B,null,{header:te(()=>[r("div",f3,[r("h3",h3,l(o(a)("records.batchSummary.title","批量生成摘要")),1),f(K,{color:"neutral",variant:"ghost",icon:"i-heroicons-x-mark",size:"sm",onClick:V})])]),footer:te(()=>[r("div",Q3,[f(K,{color:"neutral",variant:"outline",disabled:$.value,onClick:V},{default:te(()=>[Y(l(o(a)("common.close","关闭")),1)]),_:1},8,["disabled"]),$.value?(v(),Te(K,{key:1,color:"error",onClick:W},{default:te(()=>[Y(l(o(a)("records.batchSummary.stop","停止")),1)]),_:1})):(v(),Te(K,{key:0,color:"primary",disabled:F.value.length===0||w.value,onClick:ue},{default:te(()=>[Y(l(o(a)("records.batchSummary.start","开始生成")),1)]),_:1},8,["disabled"]))])]),default:te(()=>[r("div",v3,[r("div",y3,[f(K,{color:d.value==="range"?"primary":"neutral",variant:d.value==="range"?"solid":"ghost",size:"sm",disabled:$.value,onClick:ae[0]||(ae[0]=T=>d.value="range")},{default:te(()=>[Y(l(o(a)("records.batchSummary.byRange","按范围")),1)]),_:1},8,["color","variant","disabled"]),f(K,{color:d.value==="time"?"primary":"neutral",variant:d.value==="time"?"solid":"ghost",size:"sm",disabled:$.value,onClick:ae[1]||(ae[1]=T=>d.value="time")},{default:te(()=>[Y(l(o(a)("records.batchSummary.byTime","按时间")),1)]),_:1},8,["color","variant","disabled"])]),d.value==="range"?(v(),k("div",b3,[r("label",_3,l(o(a)("records.batchSummary.selectRange","选择范围")),1),r("div",x3,[r("div",k3,[f(ee,{modelValue:m.value,"onUpdate:modelValue":ae[2]||(ae[2]=T=>m.value=T),min:1,max:100,step:1,disabled:$.value,class:"flex-1"},null,8,["modelValue","disabled"]),r("span",w3,l(m.value)+"% ",1)]),r("div",S3,[r("span",null,l(o(a)("records.batchSummary.rangeStart","最早")),1),u.value>0?(v(),k("span",C3,l(o(a)("records.batchSummary.rangeInfo","约"))+" "+l(Math.ceil(u.value*m.value/100))+" / "+l(u.value)+" "+l(o(a)("records.batchSummary.sessionsUnit","个会话")),1)):ne("",!0),r("span",null,l(o(a)("records.batchSummary.rangeEnd","最近")),1)])])])):d.value==="time"?(v(),k("div",I3,[r("label",M3,l(o(a)("records.batchSummary.timeRange","选择时间范围")),1),r("div",T3,[(v(!0),k(Pe,null,Be([{key:"today",label:o(a)("records.batchSummary.today","今天")},{key:"yesterday",label:o(a)("records.batchSummary.yesterday","昨天")},{key:"week",label:o(a)("records.batchSummary.week","最近7天")},{key:"month",label:o(a)("records.batchSummary.month","最近30天")},{key:"custom",label:o(a)("records.batchSummary.custom","自定义")}],T=>(v(),Te(K,{key:T.key,color:y.value===T.key?"primary":"neutral",variant:y.value===T.key?"solid":"outline",size:"sm",disabled:$.value,onClick:U=>y.value=T.key},{default:te(()=>[Y(l(T.label),1)]),_:2},1032,["color","variant","disabled","onClick"]))),128))]),y.value==="custom"?(v(),k("div",A3,[f(fe,{modelValue:g.value,"onUpdate:modelValue":ae[3]||(ae[3]=T=>g.value=T),type:"date",disabled:$.value,size:"sm"},null,8,["modelValue","disabled"]),ae[6]||(ae[6]=r("span",{class:"text-gray-500"},"—",-1)),f(fe,{modelValue:_.value,"onUpdate:modelValue":ae[4]||(ae[4]=T=>_.value=T),type:"date",disabled:$.value,size:"sm"},null,8,["modelValue","disabled"])])):ne("",!0)])):ne("",!0),!w.value&&!E.value?(v(),k("div",$3,[x.value.length>0?(v(),k(Pe,{key:0},[r("p",null,[Y(l(o(a)("records.batchSummary.found","找到"))+" "+l(x.value.length)+" "+l(o(a)("records.batchSummary.sessionsUnit","个会话"))+" ",1),re.value>0||ve.value>0?(v(),k("span",P3,[ae[7]||(ae[7]=Y(" ( ",-1)),re.value>0?(v(),k("span",D3,l(re.value)+" "+l(o(a)("records.batchSummary.hasSummary","个已有摘要")),1)):ne("",!0),re.value>0&&ve.value>0?(v(),k(Pe,{key:1},[Y(",")],64)):ne("",!0),ve.value>0?(v(),k("span",L3,l(ve.value)+" "+l(o(a)("records.batchSummary.tooFewMessages","个消息太少")),1)):ne("",!0),ae[8]||(ae[8]=Y(" ) ",-1))])):ne("",!0)]),F.value.length>0?(v(),k("p",R3,l(o(a)("records.batchSummary.pending","待生成:"))+" "+l(F.value.length)+" "+l(o(a)("records.batchSummary.unit","个")),1)):(v(),k("p",E3,l(o(a)("records.batchSummary.noPending","没有可生成的会话")),1))],64)):(v(),k("p",F3,l(o(a)("records.batchSummary.noSessions","该时间范围内没有会话")),1))])):E.value?(v(),k("div",N3,[f(he,{name:"i-heroicons-arrow-path",class:"animate-spin"}),Y(" "+l(o(a)("records.batchSummary.checking","检查中...")),1)])):(v(),k("div",U3,[f(he,{name:"i-heroicons-arrow-path",class:"animate-spin"}),Y(" "+l(o(a)("records.batchSummary.loading","加载中...")),1)])),$.value||p.value.length>0?(v(),k("div",O3,[r("div",V3,[r("span",null,l(o(a)("records.batchSummary.progress","进度")),1),r("span",null,l(P.value)+" / "+l(h.value||F.value.length),1)]),$.value?(v(),Te(le,{key:0,value:de.value},null,8,["value"])):(v(),k("div",H3))])):ne("",!0),p.value.length>0?(v(),k("div",{key:6,ref_key:"resultsContainer",ref:z,class:"max-h-64 overflow-y-auto rounded border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50"},[(v(!0),k(Pe,null,Be(p.value,T=>(v(),k("div",{key:T.id,class:"flex flex-col gap-1 px-3 py-2 text-sm border-b border-gray-200 dark:border-gray-700 last:border-b-0"},[r("div",z3,[f(he,{name:T.status==="success"?"i-heroicons-check-circle":T.status==="skipped"?"i-heroicons-minus-circle":"i-heroicons-x-circle",class:$e(["flex-shrink-0",{"text-green-500":T.status==="success","text-gray-400":T.status==="skipped","text-red-500":T.status==="failed"}])},null,8,["name","class"]),r("span",B3,l(o(a)("records.batchSummary.session","会话"))+" #"+l(T.id),1),r("span",{class:$e(["flex-shrink-0 text-xs",{"text-green-600 dark:text-green-400":T.status==="success","text-gray-500":T.status==="skipped","text-red-600 dark:text-red-400":T.status==="failed"}])},l(T.status==="success"?o(a)("records.batchSummary.statusSuccess","成功"):T.status==="skipped"?o(a)("records.batchSummary.statusSkipped","跳过"):o(a)("records.batchSummary.statusFailed","失败")),3)]),T.summary?(v(),k("div",W3,l(T.summary),1)):T.status==="failed"&&T.message?(v(),k("div",j3,l(T.message),1)):T.status==="skipped"?(v(),k("div",q3,l(o(a)("records.batchSummary.tooFewMessages","消息数量太少")),1)):ne("",!0)]))),128))],512)):ne("",!0),!$.value&&p.value.length>0?(v(),k("div",K3,[r("span",G3,[f(he,{name:"i-heroicons-check-circle",class:"mr-1"}),Y(" "+l(o(a)("records.batchSummary.success","成功:"))+" "+l(L.value.success),1)]),L.value.failed>0?(v(),k("span",X3,[f(he,{name:"i-heroicons-x-circle",class:"mr-1"}),Y(" "+l(o(a)("records.batchSummary.failed","失败:"))+" "+l(L.value.failed),1)])):ne("",!0),L.value.skipped>0?(v(),k("span",Y3,[f(he,{name:"i-heroicons-minus-circle",class:"mr-1"}),Y(" "+l(o(a)("records.batchSummary.skipped","跳过:"))+" "+l(L.value.skipped),1)])):ne("",!0)])):ne("",!0)])]),_:1})]),_:1},8,["open"])}}}),Z3={key:0,class:"flex h-full w-10 flex-col items-center border-r border-gray-200 bg-gray-50 py-2 dark:border-gray-700 dark:bg-gray-800/50"},eR={class:"mt-2 flex flex-1 items-center"},tR={class:"vertical-text text-xs text-gray-400"},sR={key:1,class:"flex h-full w-56 flex-col border-r border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800/50"},aR={class:"flex items-center justify-between border-b border-gray-200 px-2 py-1.5 dark:border-gray-700"},nR={class:"text-xs font-medium text-gray-600 dark:text-gray-300"},oR={class:"flex items-center gap-0.5"},rR={key:0,class:"flex flex-1 items-center justify-center"},iR={key:1,class:"flex flex-1 items-center justify-center p-2"},lR={class:"text-xs text-gray-400"},cR={key:0,class:"flex w-full items-center gap-1 px-2 py-1"},dR={class:"text-xs font-medium text-gray-700 dark:text-gray-200"},uR={class:"text-xs text-gray-400"},mR={key:1,class:"px-1.5 py-0.5"},gR=["onClick"],pR={class:"flex-1 min-w-0"},fR={class:"flex items-center justify-between mb-0.5"},hR={class:"text-xs font-semibold text-gray-700 dark:text-gray-200"},vR={class:"font-mono text-[10px] px-1.5 py-0.5 rounded bg-gray-200/50 dark:bg-gray-700/50 text-gray-500 dark:text-gray-400 font-medium"},yR={class:"flex w-full items-center"},bR={class:"line-clamp-2 text-xs leading-normal text-gray-400 dark:text-gray-500 font-normal"},_R={class:"max-w-sm whitespace-pre-wrap text-sm leading-relaxed font-normal"},xR=["onClick"],kR={key:2,class:"text-xs italic text-gray-300 dark:text-gray-600"},wR=28,SR=52,CR=Re({__name:"SessionTimeline",props:{sessionId:{},activeSessionId:{},collapsed:{type:Boolean},filterStartTs:{},filterEndTs:{},filterMatchedSessionIds:{}},emits:["select","update:collapsed"],setup(e,{emit:t}){const s=e,n=t,{t:a,locale:i}=Fe(),c=Tn(),d=I([]),m=I(!0),u=I(null),y=I(new Set),g=I(!1),_=X({get:()=>s.collapsed??!1,set:L=>n("update:collapsed",L)}),x=X(()=>{let L=d.value;return L.length===0?[]:(s.filterMatchedSessionIds&&s.filterMatchedSessionIds.size>0?L=L.filter(A=>s.filterMatchedSessionIds.has(A.id)):(s.filterStartTs||s.filterEndTs)&&(L=L.filter(A=>{const G=A.startTs,J=A.endTs;return!(s.filterStartTs&&J<s.filterStartTs||s.filterEndTs&&G>s.filterEndTs)})),L)}),w=X(()=>{const L=x.value;if(L.length===0)return[];const A=[],G=new Map;for(const ue of L){const W=z(ue.startTs);let V=G.get(W);V||(V={label:C(ue.startTs),sessions:[]},G.set(W,V)),V.sessions.push(ue)}const J=Array.from(G.entries()).sort((ue,W)=>ue[0].localeCompare(W[0]));for(const[ue,W]of J){A.push({type:"date",date:ue,label:W.label,count:W.sessions.length});const V=W.sessions.sort((H,ae)=>H.startTs-ae.startTs);for(const H of V)A.push({type:"session",session:H})}return A});function $(L){const A=["bg-pink-50 dark:bg-pink-950/30 text-pink-500 dark:text-pink-400","bg-blue-50 dark:bg-blue-950/30 text-blue-500 dark:text-blue-400","bg-emerald-50 dark:bg-emerald-950/30 text-emerald-500 dark:text-emerald-400","bg-violet-50 dark:bg-violet-950/30 text-violet-500 dark:text-violet-400","bg-amber-50 dark:bg-amber-950/30 text-amber-500 dark:text-amber-400"];return A[L%A.length]}const P=hr(X(()=>({count:w.value.length,getScrollElement:()=>u.value,estimateSize:L=>w.value[L]?.type==="date"?wR:SR,overscan:10,getItemKey:L=>{const A=w.value[L];return A?A.type==="date"?`date-${A.date}`:`session-${A.session.id}`:L}}))),h=X(()=>P.value.getVirtualItems()),p=X(()=>P.value.getTotalSize());function C(L){return new Date(L*1e3).toLocaleDateString("zh-CN",{month:"2-digit",day:"2-digit"})}function S(L){return new Date(L*1e3).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit"})}function z(L){const A=new Date(L*1e3);return`${A.getFullYear()}-${String(A.getMonth()+1).padStart(2,"0")}-${String(A.getDate()).padStart(2,"0")}`}async function M(){if(s.sessionId){m.value=!0;try{const L=await dt().getSessions(s.sessionId);d.value=L}catch(L){console.error("加载会话列表失败:",L)}finally{m.value=!1}await at(),setTimeout(()=>{s.activeSessionId?E(s.activeSessionId):D()},50)}}function D(){w.value.length>0&&P.value.scrollToIndex(w.value.length-1,{align:"end"})}function E(L){const A=w.value.findIndex(G=>G.type==="session"&&G.session.id===L);A!==-1&&P.value.scrollToIndex(A,{align:"center"})}function F(L){n("select",L.id,L.firstMessageId)}async function re(L,A){if(A.stopPropagation(),A.preventDefault(),console.log("[SessionTimeline] 开始生成摘要:",L.id,s.sessionId),y.value.has(L.id)){console.log("[SessionTimeline] 已在生成中,跳过");return}y.value.add(L.id),console.log("[SessionTimeline] 正在生成中的会话:",Array.from(y.value));try{console.log("[SessionTimeline] 调用 IPC...");const G=await dt().generateSummary(...p3(s.sessionId,L.id,i.value,In()));if(console.log("[SessionTimeline] IPC 返回:",G),G.success&&G.summary){const J=d.value.findIndex(ue=>ue.id===L.id);J!==-1&&(d.value[J]={...d.value[J],summary:G.summary})}else c.fail(a("records.summaryFailed","摘要生成失败"),{description:G.error||a("records.summaryUnknownError","未知错误")})}catch(G){c.fail(a("records.summaryFailed","摘要生成失败"),{description:String(G)})}finally{y.value.delete(L.id),console.log("[SessionTimeline] 生成完成")}}function ve(L){return y.value.has(L)}function de(L){L&&P.value.measureElement(L)}return Ue(()=>s.activeSessionId,L=>{L&&E(L)}),Ue(()=>s.sessionId,()=>{M()},{immediate:!0}),(L,A)=>{const G=Ke,J=Vs,ue=We;return v(),k(Pe,null,[_.value?(v(),k("div",Z3,[f(G,{icon:"i-heroicons-chevron-right",variant:"ghost",size:"xs",onClick:A[0]||(A[0]=W=>_.value=!1)}),r("div",eR,[r("span",tR,l(o(a)("records.timeline.timeline")),1)])])):(v(),k("div",sR,[r("div",aR,[r("span",nR,l(o(a)("records.timeline.timeline")),1),r("div",oR,[f(J,{text:o(a)("records.batchSummary.title")},{default:te(()=>[f(G,{icon:"i-heroicons-sparkles",variant:"ghost",size:"xs",onClick:A[1]||(A[1]=W=>g.value=!0)})]),_:1},8,["text"]),f(G,{icon:"i-heroicons-chevron-left",variant:"ghost",size:"xs",onClick:A[2]||(A[2]=W=>_.value=!0)})])]),m.value?(v(),k("div",rR,[f(ue,{name:"i-heroicons-arrow-path",class:"h-4 w-4 animate-spin text-gray-400"})])):d.value.length===0?(v(),k("div",iR,[r("span",lR,l(o(a)("records.timeline.noSessions")),1)])):(v(),k("div",{key:2,ref_key:"scrollContainerRef",ref:u,class:"flex-1 overflow-y-auto py-1"},[r("div",{class:"relative w-full",style:hs({height:`${p.value}px`})},[(v(!0),k(Pe,null,Be(h.value,W=>(v(),k("div",{key:String(W.key),ref_for:!0,ref:V=>de(V),class:"absolute left-0 top-0 w-full",style:hs({transform:`translateY(${W.start}px)`})},[w.value[W.index]?.type==="date"?(v(),k("div",cR,[r("span",dR,l(w.value[W.index].label),1),r("span",uR," ("+l(w.value[W.index].count)+") ",1)])):w.value[W.index]?.type==="session"?(v(),k("div",mR,[r("button",{class:$e(["group relative flex w-full gap-2.5 items-center rounded-xl p-1.5 pl-2.5 text-left transition-all duration-200",[e.activeSessionId===w.value[W.index].session.id?"bg-pink-500/5 dark:bg-pink-500/10":"hover:bg-gray-100 dark:hover:bg-gray-800/60"]]),onClick:V=>F(w.value[W.index].session)},[r("div",{class:$e(["absolute left-0 top-1/2 -translate-y-1/2 w-1 rounded-r-md transition-all duration-200",[e.activeSessionId===w.value[W.index].session.id?"h-5 bg-pink-500 dark:bg-pink-400 opacity-100":"h-0 bg-pink-500/40 dark:bg-pink-400/40 group-hover:h-3 group-hover:opacity-100 opacity-0"]])},null,2),r("div",{class:$e(["w-7 h-7 rounded-lg flex items-center justify-center shrink-0 transition-colors",$(w.value[W.index].session.id)])},[f(ue,{name:"i-heroicons-chat-bubble-oval-left",class:"w-3.5 h-3.5"})],2),r("div",pR,[r("div",fR,[r("span",hR,l(S(w.value[W.index].session.startTs)),1),r("span",vR,l(w.value[W.index].session.messageCount),1)]),r("div",yR,[w.value[W.index].session.summary?(v(),Te(J,{key:0,popper:{placement:"right"},ui:{content:"z-[10001] h-auto max-h-80 overflow-y-auto"}},{content:te(()=>[r("div",_R,l(w.value[W.index].session.summary),1)]),default:te(()=>[r("span",bR,l(w.value[W.index].session.summary),1)]),_:2},1024)):w.value[W.index].session.messageCount>=3?(v(),k("span",{key:1,class:"flex items-center gap-1 text-xs text-gray-400 hover:text-pink-500 dark:text-gray-500 dark:hover:text-pink-400 cursor-pointer",onClick:V=>re(w.value[W.index].session,V)},[ve(w.value[W.index].session.id)?(v(),Te(ue,{key:0,name:"i-heroicons-arrow-path",class:"h-3 w-3 animate-spin"})):(v(),Te(ue,{key:1,name:"i-heroicons-sparkles",class:"h-3 w-3"})),r("span",null,l(o(a)("records.timeline.generateSummary")),1)],8,xR)):(v(),k("span",kR,l(o(a)("records.timeline.tooFewMessages")),1))])])],10,gR)])):ne("",!0)],4))),128))],4)],512))])),f(J3,{open:g.value,"onUpdate:open":A[3]||(A[3]=W=>g.value=W),"session-id":e.sessionId,onCompleted:M},null,8,["open","session-id"])],64)}}}),IR=ks(CR,[["__scopeId","data-v-a062e5b6"]]),MR={class:"flex h-full w-[750px] flex-col bg-white dark:bg-gray-900",style:{"-webkit-app-region":"no-drag"}},TR={class:"text-lg font-semibold text-gray-900 dark:text-white"},AR={class:"flex min-h-0 flex-1"},$R={class:"min-h-0 min-w-0 flex-1"},PR={key:0,class:"shrink-0 border-t border-gray-200 px-4 py-2 dark:border-gray-800"},DR={class:"text-xs text-gray-500"},LR=Re({__name:"ChatRecordDrawer",setup(e){const{t}=Fe(),s=Bt(),n=St(),{currentSessionId:a}=et(n),i=I(!1);tt(()=>{i.value=navigator.platform.toLowerCase().includes("win")});const c=I(null),d=I({}),m=I(0),u=I(!1),y=I(void 0),g=I([]),_=I(void 0);function x(z){d.value=z}function w(){d.value={},_.value=void 0}function $(z){m.value=z}function P(z){if(!d.value.keywords?.length||!g.value.length){_.value=void 0;return}const M=new Set;for(const D of z)for(const E of g.value)if(D>=E.startTs&&D<=E.endTs){M.add(E.id);break}_.value=M.size>0?M:void 0}function h(z){if(!g.value.length)return;let M;for(const D of g.value)if(z.timestamp>=D.startTs&&z.timestamp<=D.endTs){M=D;break}if(!M)for(const D of g.value)if(D.firstMessageId<=z.id)M=D;else break;M&&M.id!==y.value&&(y.value=M.id)}function p(z,M){y.value=z,d.value={...d.value,scrollToMessageId:M}}function C(z){d.value={scrollToMessageId:z}}async function S(){if(a.value)try{const z=await dt().getSessions(a.value);g.value=z.map(M=>({id:M.id,startTs:M.startTs,endTs:M.endTs,firstMessageId:M.firstMessageId}))}catch{g.value=[]}}return Ue(()=>s.showChatRecordDrawer,async z=>{if(z){const M=Yt(s.chatRecordQuery);d.value=M?{...M}:{},await S(),g.value.length>0&&(y.value=g.value[g.value.length-1].id),await at(),c.value?.refresh()}else d.value={},m.value=0,y.value=void 0,g.value=[]}),(z,M)=>{const D=Ke,E=el;return v(),Te(E,{open:o(s).showChatRecordDrawer,"onUpdate:open":M[2]||(M[2]=F=>o(s).showChatRecordDrawer=F),direction:"right",handle:!1,ui:{content:"z-50"}},{content:te(()=>[r("div",MR,[r("div",{class:$e(["flex items-center justify-between border-b border-gray-200 px-4 dark:border-gray-800",i.value?"pt-10 pb-3":"py-3"])},[r("h3",TR,l(o(t)("records.drawer.title")),1),f(D,{icon:"i-heroicons-x-mark",color:"neutral",variant:"ghost",size:"sm",onClick:M[0]||(M[0]=F=>o(s).closeChatRecordDrawer())})],2),f(U5,{query:d.value,onApply:x,onReset:w},null,8,["query"]),r("div",AR,[o(a)?(v(),Te(IR,{key:0,collapsed:u.value,"onUpdate:collapsed":M[1]||(M[1]=F=>u.value=F),"session-id":o(a),"active-session-id":y.value,"filter-start-ts":d.value.startTs,"filter-end-ts":d.value.endTs,"filter-matched-session-ids":_.value,onSelect:p},null,8,["collapsed","session-id","active-session-id","filter-start-ts","filter-end-ts","filter-matched-session-ids"])):ne("",!0),r("div",$R,[f(m3,{ref_key:"messageListRef",ref:c,query:d.value,onCountChange:$,onVisibleMessageChange:h,onJumpToMessage:C,onMessageTimestampsChange:P},null,8,["query"])])]),m.value>0?(v(),k("div",PR,[r("span",DR,l(o(t)("records.drawer.loadedCount",{count:m.value})),1)])):ne("",!0)])]),_:1},8,["open"])}}}),RR={key:0,class:"pointer-events-auto fixed right-4 bottom-[88px] z-40"},ER=["title"],FR={class:"flex h-6.5 w-6.5 shrink-0 items-center justify-center rounded-full bg-white text-primary-600 shadow-[0_2px_8px_rgba(255,255,255,0.28)]"},NR={class:"text-[11px] font-medium text-white"},UR=Re({__name:"GlobalTaskBar",setup(e){const{t}=Fe(),s=pa(),n=Hs(),a=ID(),{activeTask:i}=et(a),c=X(()=>a.getActiveTaskState()),d=X(()=>{if(!i.value)return!1;const u=i.value.chatType==="group"?"group-chat":"private-chat";return s.name===u&&String(s.params.id??"")===i.value.sessionId&&s.query.tab==="ai-chat"?(c.value?.currentAIChatId??null)!==(i.value.aiChatId??null):!0});async function m(){i.value&&(a.focusActiveTaskAIChat(),await n.push({name:i.value.chatType==="group"?"group-chat":"private-chat",params:{id:i.value.sessionId},query:{tab:"ai-chat"}}))}return(u,y)=>{const g=We;return v(),Te(mn,{name:"task-bar-fade"},{default:te(()=>[d.value?(v(),k("div",RR,[r("button",{class:"group flex h-9 items-center gap-1.5 overflow-hidden rounded-full bg-primary-500 px-2 shadow-[0_10px_24px_rgba(15,23,42,0.12)] transition-all hover:-translate-y-0.5 hover:bg-primary-600 hover:shadow-[0_16px_32px_rgba(15,23,42,0.16)] dark:bg-primary-500 dark:hover:bg-primary-400",title:`${o(t)("ai.chat.backgroundTask.return")} · ${o(i)?.sessionName??""}`,onClick:m},[r("div",FR,[f(g,{name:"i-heroicons-sparkles",class:"h-3 w-3 animate-pulse"})]),r("span",NR,l(o(t)("ai.chat.backgroundTask.runningShort")),1)],8,ER)])):ne("",!0)]),_:1})}}}),OR=ks(UR,[["__scopeId","data-v-996544a9"]]),$i=new Map;let rn=null,Va=null,fs={};function VR(){if(!rn||Object.keys(fs).length===0)return;const e={...fs};fs={},rn(e).catch(t=>{console.warn("[BackendPersist] Save failed:",t)})}function or(){Va&&clearTimeout(Va),Va=setTimeout(VR,500)}function HR(e,t){if(t.serialize){Object.assign(fs,t.serialize(e)),or();return}const s={};for(const n of t.pick)s[n]=JSON.parse(JSON.stringify(e[n]));t.key?fs[t.key]=s:Object.assign(fs,s),or()}function zR(e){rn=e}function BR(e){for(const[,{store:t,config:s}]of $i){const n=s.key?e[s.key]:e;if(!n||typeof n!="object")continue;const a={};for(const i of s.pick){const c=n[i];c!==void 0&&(a[i]=c)}Object.keys(a).length>0&&t.$patch(a)}}const WR=({store:e,options:t})=>{const s=t.backendPersist;if(s){$i.set(e.$id,{store:e,config:s});for(const n of s.pick)Ue(()=>e.$state[n],()=>HR(e.$state,s),{deep:!0})}};let rr=!1;async function jR(){if(rr)return;rr=!0;const e=cu();try{const[t,s,n]=await Promise.all([e.getPreferences(),e.getUiConfig(),e.getLocale()]);du(s);const a=ts();s.default_session_tab&&(a.defaultSessionTab=s.default_session_tab),n&&a.$patch({locale:n}),BR(t)}catch(t){console.warn("[PreferencesSync] Failed to load from backend, keeping default state:",t)}zR(t=>e.savePreferences(t)),qR(e)}function qR(e){const t=ts();Ue(()=>t.defaultSessionTab,s=>{e.saveUiConfig({default_session_tab:s}).catch(n=>{console.warn("[PreferencesSync] Failed to save ui config:",n)})}),Ue(()=>Mo().session_gap_threshold,s=>{e.saveUiConfig({session_gap_threshold:s}).catch(n=>{console.warn("[PreferencesSync] Failed to save ui config:",n)})}),Ue(()=>Mo().summary_strategy,s=>{e.saveUiConfig({summary_strategy:s}).catch(n=>{console.warn("[PreferencesSync] Failed to save ui config:",n)})}),Ue(()=>t.locale,s=>{e.saveLocale(s).catch(n=>{console.warn("[PreferencesSync] Failed to save locale:",n)})})}const KR={class:"relative flex h-screen w-full overflow-hidden bg-gray-50 dark:bg-gray-900"},GR={key:0,class:"flex h-full w-full items-center justify-center"},XR={key:0,class:"flex flex-col items-center justify-center gap-3 text-center"},YR={class:"text-sm text-gray-700 dark:text-gray-300"},QR={class:"max-w-sm text-xs text-gray-500"},JR={key:1,class:"flex flex-col items-center justify-center text-center"},ZR={class:"mt-2 text-sm text-gray-500"},eE={class:"relative flex-1 overflow-hidden"},tE=Re({__name:"App",setup(e){const{t}=Fe(),s=St(),n=Bt(),a=ts(),i=Ws(),c=$n(),{isInitialized:d}=et(s),m=pa(),u=Hs(),y=X(()=>m.name==="login"),g=I(null),_=hn({emitAuto:!0,initialValue:"light"}),x={delayDuration:100},w={position:"top-center",progress:!1,duration:2e3};let $=!1;async function P(){if(!($||d.value)){$=!0,g.value=null;try{await au(),await jR(),await a.initLocale(),i.init(),await s.loadSessions()}catch(p){console.error("App initialization failed:",p),g.value=p instanceof Error?p.message:String(p)}finally{$=!1}}}function h(p){(navigator.platform.toLowerCase().includes("mac")?p.metaKey:p.ctrlKey)&&p.key===","&&(p.preventDefault(),p.stopPropagation(),n.showSettings||n.openSettings())}return Ue(y,p=>{p||P()}),Ue(_,p=>{},{immediate:!0}),tt(async()=>{window.addEventListener("keydown",h);const p=navigator.platform.toLowerCase();p.includes("win")?document.documentElement.classList.add("platform-windows"):p.includes("linux")&&document.documentElement.classList.add("platform-linux");{let C=!1;ri({getToken:()=>c.token,on401:()=>{if(C||u.currentRoute.value.name==="login")return;C=!0,c.markRequiresAuth(),c.logout();const z=u.currentRoute.value.fullPath,M=z.startsWith("/login")?"/":z;u.push({name:"login",query:{redirect:M}}).finally(()=>{C=!1})}})}y.value||await P()}),Qt(()=>{window.removeEventListener("keydown",h)}),(p,C)=>{const S=ji("router-view"),z=We,M=Ke,D=tl;return v(),Te(D,{tooltip:x,toaster:w},{default:te(()=>[y.value?(v(),Te(S,{key:0})):(v(),k(Pe,{key:1},[f(jd),r("div",KR,[o(d)?(v(),k(Pe,{key:1},[f(nm),r("main",eE,[f(S,null,{default:te(({Component:E})=>[f(mn,{name:"page-fade",mode:"out-in"},{default:te(()=>[(v(),Te(qi(E),{key:o(m).path}))]),_:2},1024)]),_:1})])],64)):(v(),k("div",GR,[g.value?(v(),k("div",XR,[f(z,{name:"i-heroicons-exclamation-triangle",class:"h-8 w-8 text-red-500"}),r("p",YR,l(o(t)("common.initFailed")),1),r("p",QR,l(g.value),1),f(M,{size:"sm",color:"primary",variant:"soft",onClick:P},{default:te(()=>[Y(l(o(t)("common.retry")),1)]),_:1})])):(v(),k("div",JR,[f(z,{name:"i-heroicons-arrow-path",class:"h-8 w-8 animate-spin text-pink-500"}),r("p",ZR,l(o(t)("common.initializing")),1)]))]))])],64)),f(mm,{open:o(n).showScreenCaptureModal,"image-data":o(n).screenCaptureImage,"onUpdate:open":C[0]||(C[0]=E=>E?null:o(n).closeScreenCaptureModal())},null,8,["open","image-data"]),f(D5),f(o(LR)),f(OR)]),_:1})}}}),sE=ks(tE,[["__scopeId","data-v-9fba6c5e"]]),wa=sl({routes:[{path:"/login",name:"login",component:()=>je(()=>import("./index-r_zHR2t9.js"),__vite__mapDeps([15,2,1,3])),meta:{public:!0}},{path:"/",name:"home",component:()=>je(()=>import("./index-GAU7LI1r.js"),__vite__mapDeps([16,2,1,17,3,18]))},{path:"/group-chat/:id",name:"group-chat",component:()=>je(()=>import("./index-o6veAyTB.js"),__vite__mapDeps([19,3,2,1,20,17,21,22,23,24,25]))},{path:"/private-chat/:id",name:"private-chat",component:()=>je(()=>import("./index-iwqJDVMJ.js"),__vite__mapDeps([26,3,2,1,20,17,21,22,23,24,27]))}],history:al()});wa.beforeEach((e,t,s)=>{if(e.meta.public)return s();const n=$n();if(n.requiresAuth&&!n.isAuthenticated)return s({name:"login",query:{redirect:e.fullPath}});s()});wa.afterEach(e=>{document.body.id=`page-${e.name}`});function aE(){requestIdleCallback(()=>{je(()=>import("./index-o6veAyTB.js"),__vite__mapDeps([19,3,2,1,20,17,21,22,23,24,25])),je(()=>import("./index-iwqJDVMJ.js"),__vite__mapDeps([26,3,2,1,20,17,21,22,23,24,27]))})}wa.isReady().then(aE);function nE(e,t){if(e==null)return;let s=e;for(let n=0;n<t.length;n++){if(s===void 0||s[t[n]]===void 0)return;if(s===null||s[t[n]]===null)return null;s=s[t[n]]}return s}function Ln(e,t,s){if(s.length===0)return t;const n=s[0];return s.length>1&&(t=Ln(typeof e!="object"||e===null||!Object.prototype.hasOwnProperty.call(e,n)?Number.isInteger(Number(s[1]))?[]:{}:e[n],t,Array.prototype.slice.call(s,1))),Number.isInteger(Number(n))&&Array.isArray(e)?e.slice()[n]:Object.assign({},e,{[n]:t})}function Pi(e,t){if(e==null||t.length===0)return e;if(t.length===1){if(e==null)return e;if(Number.isInteger(t[0])&&Array.isArray(e))return Array.prototype.slice.call(e,0).splice(t[0],1);const s={};for(const n in e)s[n]=e[n];return delete s[t[0]],s}if(e[t[0]]==null){if(Number.isInteger(t[0])&&Array.isArray(e))return Array.prototype.concat.call([],e);const s={};for(const n in e)s[n]=e[n];return s}return Ln(e,Pi(e[t[0]],Array.prototype.slice.call(t,1)),[t[0]])}function Di(e,t){return t.map(s=>s.split(".")).map(s=>[s,nE(e,s)]).filter(s=>s[1]!==void 0).reduce((s,n)=>Ln(s,n[1],n[0]),{})}function Li(e,t){return t.map(s=>s.split(".")).reduce((s,n)=>Pi(s,n),e)}function ir(e,{storage:t,serializer:s,key:n,debug:a,pick:i,omit:c,beforeHydrate:d,afterHydrate:m},u,y=!0){try{y&&d?.(u);const g=t.getItem(n);if(g){const _=s.deserialize(g),x=i?Di(_,i):_,w=c?Li(x,c):x;e.$patch(w)}y&&m?.(u)}catch(g){a&&console.error("[pinia-plugin-persistedstate]",g)}}function lr(e,{storage:t,serializer:s,key:n,debug:a,pick:i,omit:c}){try{const d=i?Di(e,i):e,m=c?Li(d,c):d,u=s.serialize(m);t.setItem(n,u)}catch(d){a&&console.error("[pinia-plugin-persistedstate]",d)}}function oE(e,t){return typeof e=="function"?e(t):typeof e=="string"?e:t}function rE(e,t,s){const{pinia:n,store:a,options:{persist:i=s}}=e;if(!i)return;if(!(a.$id in n.state.value)){const d=n._s.get(a.$id.replace("__hot:",""));d&&Promise.resolve().then(()=>d.$persist());return}const c=(Array.isArray(i)?i:i===!0?[{}]:[i]).map(t);a.$hydrate=({runHooks:d=!0}={})=>{c.forEach(m=>{ir(a,m,e,d)})},a.$persist=()=>{c.forEach(d=>{lr(a.$state,d)})},c.forEach(d=>{ir(a,d,e),a.$subscribe((m,u)=>lr(u,d),{detached:!0})})}function iE(e={}){return function(t){rE(t,s=>{const n=oE(s.key,t.store.$id);return{key:(e.key?e.key:a=>a)(n),debug:s.debug??e.debug??!1,serializer:s.serializer??e.serializer??{serialize:a=>JSON.stringify(a),deserialize:a=>JSON.parse(a)},storage:s.storage??e.storage??window.localStorage,beforeHydrate:s.beforeHydrate??e.beforeHydrate,afterHydrate:s.afterHydrate??e.afterHydrate,pick:s.pick,omit:s.omit}},e.auto??!1)}}var lE=iE();const cE={install(e,t={}){e.use(nl,t),e.use(ol,t),e.use(rl,t),e.use(il,t)}},js=Ki(sE),Rn=Ll();Rn.use(lE);Rn.use(WR);js.use(Rn);js.use(wa);js.use(cE);js.use(xa);js.mount("#app");export{hE as $,_E as A,dD as B,wi as C,ka as D,Ws as E,Si as F,it as G,bE as H,lt as I,Jd as J,Nt as K,As as L,ps as M,tr as N,gi as O,bi as P,gE as Q,xE as R,Zd as S,Vt as T,eu as U,Qd as V,Rt as W,Pt as X,di as Y,Gd as Z,ks as _,$n as a,ts as b,cu as c,vi as d,St as e,So as f,gs as g,rs as h,dt as i,kt as j,Bt as k,$t as l,yE as m,vE as n,Do as o,pE as p,hn as q,Mn as r,et as s,fE as t,Fe as u,ID as v,Yd as w,gt as x,xt as y,Tn as z};