coding-tool-x 3.6.4 → 3.6.6

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 (29) hide show
  1. package/dist/web/assets/{Analytics-BTmqXkR-.js → Analytics-CcGKjDkP.js} +1 -1
  2. package/dist/web/assets/{ConfigTemplates-z3w0kyNl.js → ConfigTemplates-DPOa1w5D.js} +1 -1
  3. package/dist/web/assets/{Home-DU-NVre0.js → Home-BP1LxGtp.js} +1 -1
  4. package/dist/web/assets/{PluginManager-44r9LaWV.js → PluginManager-BVbHUdey.js} +1 -1
  5. package/dist/web/assets/{ProjectList-DW_MEKRy.js → ProjectList-BQrz2FKo.js} +1 -1
  6. package/dist/web/assets/SessionList-CRGer64T.js +1 -0
  7. package/dist/web/assets/{SkillManager-DnzRfF_o.js → SkillManager-BhJKtWYM.js} +1 -1
  8. package/dist/web/assets/{WorkspaceManager-BuRpVJRU.js → WorkspaceManager-pc6tpF3m.js} +1 -1
  9. package/dist/web/assets/{icons-U50_Cfbe.js → icons-QFXzEgqM.js} +1 -1
  10. package/dist/web/assets/index-0isNzXNY.css +1 -0
  11. package/dist/web/assets/index-BsdIJwLf.js +2 -0
  12. package/dist/web/assets/{naive-ui-Cjh6GLto.js → naive-ui-DM897mIP.js} +1 -1
  13. package/dist/web/assets/{vendors--KP7Ux0s.js → vendors-DQA4Hw9v.js} +1 -1
  14. package/dist/web/assets/{vue-vendor-C5aMkRmm.js → vue-vendor-B5RqjEjQ.js} +1 -1
  15. package/dist/web/index.html +6 -6
  16. package/package.json +1 -1
  17. package/src/commands/daemon.js +13 -4
  18. package/src/config/paths.js +1 -0
  19. package/src/server/api/channels.js +4 -2
  20. package/src/server/api/codex-channels.js +3 -1
  21. package/src/server/api/codex-sessions.js +24 -1
  22. package/src/server/api/gemini-channels.js +4 -2
  23. package/src/server/api/opencode-channels.js +4 -2
  24. package/src/server/services/channel-balance.js +172 -14
  25. package/src/server/services/gemini-channels.js +8 -0
  26. package/src/server/services/opencode-channels.js +6 -0
  27. package/dist/web/assets/SessionList-B8upyqsp.js +0 -1
  28. package/dist/web/assets/index-BkLQex1R.css +0 -1
  29. package/dist/web/assets/index-gIbIMdSO.js +0 -2
@@ -1,4 +1,4 @@
1
- import{d as t,t as e,A as n,l as i,Q as r,f as o,g as a,w as s,B as l,h as u,i as h,v as c,aa as p,N as d,r as f,c as g,o as v,a as y,W as m,X as _,F as x,a0 as w,Y as b,Z as S,p as M,$ as T,L as C}from"./vue-vendor-C5aMkRmm.js";import{_ as I,y as D,z as k,A}from"./index-gIbIMdSO.js";import{L as P,$ as L,k as O,B as R,N as z,F as E,g as N}from"./naive-ui-Cjh6GLto.js";import{a3 as B,az as F,aA as V}from"./icons-U50_Cfbe.js";import"./markdown-BNJfEgCA.js";import"./vendors--KP7Ux0s.js";
1
+ import{d as t,t as e,A as n,l as i,Q as r,f as o,g as a,w as s,B as l,h as u,i as h,v as c,aa as p,N as d,r as f,c as g,o as v,a as y,W as m,X as _,F as x,$ as w,a0 as b,Y as S,p as M,_ as T,L as C}from"./vue-vendor-B5RqjEjQ.js";import{_ as I,y as D,z as k,A}from"./index-BsdIJwLf.js";import{L as P,$ as L,k as O,B as R,N as z,F as E,g as N}from"./naive-ui-DM897mIP.js";import{a3 as B,az as F,aA as V}from"./icons-QFXzEgqM.js";import"./markdown-BNJfEgCA.js";import"./vendors-DQA4Hw9v.js";
2
2
  /*! *****************************************************************************
3
3
  Copyright (c) Microsoft Corporation.
4
4
 
@@ -1 +1 @@
1
- import{_ as s,x as a}from"./index-gIbIMdSO.js";import{c as e,o,X as r,Z as t,N as i}from"./vue-vendor-C5aMkRmm.js";import{K as d}from"./naive-ui-Cjh6GLto.js";import"./icons-U50_Cfbe.js";import"./vendors--KP7Ux0s.js";import"./markdown-BNJfEgCA.js";const m={class:"config-templates-page"},p=s({__name:"ConfigTemplates",setup:s=>(s,p)=>(o(),e("div",m,[r(i(d),{title:"配置模版管理",bordered:!1},{default:t(()=>[r(a,{"in-drawer":!1,"hide-back":!0})]),_:1})]))},[["__scopeId","data-v-a6c39fe5"]]);export{p as default};
1
+ import{_ as s,x as a}from"./index-BsdIJwLf.js";import{c as e,o,X as r,Y as t,N as i}from"./vue-vendor-B5RqjEjQ.js";import{K as d}from"./naive-ui-DM897mIP.js";import"./icons-QFXzEgqM.js";import"./vendors-DQA4Hw9v.js";import"./markdown-BNJfEgCA.js";const m={class:"config-templates-page"},p=s({__name:"ConfigTemplates",setup:s=>(s,p)=>(o(),e("div",m,[r(i(d),{title:"配置模版管理",bordered:!1},{default:t(()=>[r(a,{"in-drawer":!1,"hide-back":!0})]),_:1})]))},[["__scopeId","data-v-a6c39fe5"]]);export{p as default};
@@ -1 +1 @@
1
- import{d as e}from"./vendors--KP7Ux0s.js";import{a8 as a,f as l,r as n,w as s,h as c,K as t,a7 as o,c as i,o as u,a as d,W as r,X as v,Z as p,N as h,Y as y,a3 as g,$ as m,p as f,L as k,F as T,a0 as b,_ as x,v as w}from"./vue-vendor-C5aMkRmm.js";import{_ as C,u as $,a as _,R as q,g as z,b as S,c as L,d as I,e as j,f as M,h as O,i as N,j as A,k as F,l as D,s as P}from"./index-gIbIMdSO.js";import{E as U,o as E,n as V,m as J,aq as K,ar as R,as as B,at as G,au as Z,a9 as H,i as W,A as X,av as Y,aw as Q,T as ee,a as ae,b as le}from"./icons-U50_Cfbe.js";import{L as ne,N as se,B as ce,s as te,b as oe,c as ie,a as ue,Z as de}from"./naive-ui-Cjh6GLto.js";import"./markdown-BNJfEgCA.js";const re={class:"channel-column"},ve={class:"drag-handle",title:"拖拽排序"},pe={class:"header-icon"},he={class:"channel-title"},ye={key:0,class:"claude-extra-area"},ge={key:0,class:"channel-content"},me={class:"card"},fe={class:"card-header"},ke={key:0,class:"runtime-badge"},Te={class:"card-body",style:{padding:"6px 10px"}},be={class:"proxy-info-row"},xe={class:"proxy-status"},we={class:"proxy-port"},Ce={class:"channel-name"},$e={class:"channel-quick-panel"},_e={class:"panel-title"},qe={key:0,class:"no-channels"},ze={key:1,class:"channel-quick-list"},Se={class:"channel-quick-info"},Le={class:"channel-quick-name"},Ie={key:0,class:"channel-switching-tip"},je={class:"channel-metrics"},Me={class:"metric-item"},Oe={class:"metric-value"},Ne={class:"metric-item"},Ae={class:"metric-value"},Fe={class:"metric-item"},De={class:"metric-value"},Pe={class:"metric-item"},Ue={class:"card"},Ee={class:"card-header compact"},Ve={class:"card-body",style:{padding:"8px 10px"}},Je={class:"quick-access-list"},Ke={class:"access-icon"},Re={class:"access-content"},Be={class:"access-value"},Ge={class:"access-icon"},Ze={class:"access-content"},He={class:"access-value"},We={class:"access-icon"},Xe={class:"access-content"},Ye={class:"access-goto"},Qe={class:"card-header compact"},ea={class:"card-body",style:{padding:"8px 10px"}},aa={class:"stats-inline stats-3col"},la={class:"stat-inline-item stat-requests"},na={class:"stat-info"},sa={class:"stat-inline-item stat-input"},ca={class:"stat-info"},ta={class:"stat-inline-item stat-output"},oa={class:"stat-info"},ia={key:1,class:"card logs-card"},ua={class:"card-header compact"},da={class:"card-body logs-card-body"},ra={class:"logs-table-wrapper"},va={key:0,class:"empty-logs"},pa=["title"],ha={key:0,class:"action-content"},ya={class:"action-msg"},ga={class:"action-time"},ma={key:1,class:"action-content"},fa={class:"action-msg error-msg"},ka={class:"action-time error-time"},Ta={class:"locked-content"},ba={class:"lock-icon"},xa="channelLocks",wa=C({__name:"ChannelColumn",props:{channelType:{type:String,required:!0,validator:e=>["claude","codex","gemini","opencode"].includes(e)}},setup(e){const C=e,D=a(),P=ne(),{claudeProxy:wa,codexProxy:Ca,geminiProxy:$a,opencodeProxy:_a,claudeChannels:qa,codexChannels:za,geminiChannels:Sa,opencodeChannels:La,schedulerState:Ia,getProxyState:ja,startProxy:Ma,stopProxy:Oa,getLogs:Na,clearLogsForSource:Aa,loadChannels:Fa,logLimit:Da,statsInterval:Pa}=$(),{dashboardData:Ua,loadDashboard:Ea}=_(),Va={claude:{title:"ClaudeCode",subtitle:"智能编程助手",icon:J},codex:{title:"Codex-CLI",subtitle:"高效代码生成",icon:V},gemini:{title:"Gemini-CLI",subtitle:"多模态AI助手",icon:E},opencode:{title:"OpenCode",subtitle:"AI 代码助手",icon:U}},Ja=l(()=>Va[C.channelType].title);l(()=>Va[C.channelType].subtitle);const Ka=l(()=>Va[C.channelType].icon),Ra=l(()=>"claude"===C.channelType?wa.value:"codex"===C.channelType?Ca.value:"gemini"===C.channelType?$a.value:"opencode"===C.channelType?_a.value:{}),Ba=l(()=>"claude"===C.channelType?"Claude":"codex"===C.channelType?"Codex":"gemini"===C.channelType?"Gemini":"opencode"===C.channelType?"OpenCode":""),Ga=n({projects:0,sessions:0}),Za=n({requests:0,tokens:0,cost:0}),Ha=n({requests:0,tokens:0,cost:0}),Wa={requests:0,tokens:0,cost:3};let Xa={requests:null,tokens:null,cost:null};const Ya=n({requests:!1,tokens:!1,cost:!1}),Qa=l(()=>{var e,a,l;const n="claude"===C.channelType?"claude":"codex"===C.channelType?"codex":"opencode"===C.channelType?"opencode":"gemini";return(null==(l=null==(a=null==(e=Ua.value)?void 0:e.todayStats)?void 0:a[n])?void 0:l.byModel)||{}});function el(e,a,l,n=600){Xa[e]&&cancelAnimationFrame(Xa[e]),Ya.value[e]=!0;const s=Date.now(),c=()=>{const t=Date.now()-s,o=Math.min(t/n,1),i=1-Math.pow(1-o,2),u=a+(l-a)*i,d=Wa[e]??0,r=Math.pow(10,d),v=d>0?Math.round(u*r)/r:Math.round(u);Ha.value[e]=v,o<1?Xa[e]=requestAnimationFrame(c):Ya.value[e]=!1};Xa[e]=requestAnimationFrame(c)}const al=n(!1);function ll(e){try{const a=localStorage.getItem(xa),l=a?JSON.parse(a):{};l[C.channelType]=e,localStorage.setItem(xa,JSON.stringify(l))}catch(a){}}const nl=n(function(){try{const e=localStorage.getItem(xa);if(e){return JSON.parse(e)[C.channelType]||!1}}catch(e){}return!1}());async function sl(){nl.value=!nl.value,ll(nl.value);try{if(await F("channelLocks",C.channelType,nl.value),Ua.value){const e=Ua.value.uiConfig||{},a={...e.channelLocks||{}};a[C.channelType]=nl.value,Ua.value={...Ua.value,uiConfig:{...e,channelLocks:a}}}}catch(e){}}const cl=n(!0);function tl(e){e.detail&&void 0!==e.detail.showLogs&&(cl.value=e.detail.showLogs)}const ol=n(Date.now()),il=l(()=>{if(!Ra.value.running)return"";const e=Ra.value.startTime;if(!e)return"";const a=ol.value-e;if(a<=0)return"";const l=Math.floor(a/1e3),n=Math.floor(l/3600),s=Math.floor(l%3600/60),c=l%60;let t="已运行 ";return n>0&&(t+=`${n}小时`),s>0&&(t+=`${s}分`),(c>0||0===n&&0===s)&&(t+=`${c}秒`),t}),ul=n(null),dl=l(()=>Da.value),rl={claude:Na("claude"),codex:Na("codex"),gemini:Na("gemini"),opencode:Na("opencode")},vl=l(()=>((rl[C.channelType]||rl.claude).value||[]).slice(0,dl.value));let pl=null,hl=null,yl=null,gl=!1,ml=null;const fl=l(()=>{let e=[];"claude"===C.channelType?e=qa.value||[]:"codex"===C.channelType?e=za.value||[]:"gemini"===C.channelType?e=Sa.value||[]:"opencode"===C.channelType&&(e=La.value||[]);return[...e.filter(e=>!1!==e.enabled),...e.filter(e=>!1===e.enabled)]});function kl(e){const a=Ia[C.channelType];if(!a||!a.channels)return 0;const l=a.channels.find(a=>a.id===e);return l?l.inflight:0}const Tl=l(()=>{var e;const a=fl.value.filter(e=>!1!==e.enabled).length;return(null==(e=Ra.value.proxy)?void 0:e.running)?`${a}个渠道调度中`:fl.value.length>0?`${a}个渠道已启用`:"无渠道"}),bl=n({});function xl(e){return bl.value[e]||{requests:0,tokens:0,cost:0}}async function wl(){var e;try{let a;if("claude"===C.channelType?a=await z():"codex"===C.channelType?a=await S():"gemini"===C.channelType?a=await L():"opencode"===C.channelType&&(a=await I()),a&&a.byChannel){const l={};for(const[n,s]of Object.entries(a.byChannel))l[n]={requests:s.requests||0,tokens:(null==(e=s.tokens)?void 0:e.total)||0,cost:s.cost||0};bl.value=l}}catch(a){}}function Cl(e,a){var l;return(null==e?void 0:e.usageMissing)?"--":(null==(l=null==e?void 0:e.tokens)?void 0:l[a])||0}function $l(e){if(!e||"action"===e.type||"error"===e.status)return"";const a=[];return e.model&&a.push(`模型: ${e.model}`),e.originalModel&&e.originalModel!==e.model&&a.push(`重定向: ${e.originalModel} -> ${e.model}`),e.usageMissing&&a.push("上游响应未返回 usage,当前无法计算 token。"),a.join("\n")}async function _l(e){var a,l;const n=ja(C.channelType);n.value.loading=!0;try{let a;a=e?await Ma(C.channelType):await Oa(C.channelType,{refreshChannelsDrawer:!0}),!1!==a.success?P.success(e?`${Ja.value} 代理已启动`:`${Ja.value} 代理已停止`):(P.error(a.error||"操作失败"),n.value.running=!e)}catch(s){P.error((null==(l=null==(a=s.response)?void 0:a.data)?void 0:l.error)||s.message||"操作失败"),n.value.running=!e}finally{n.value.loading=!1}}function ql(){D.push({name:`${C.channelType}-projects`})}function zl(){D.push({name:`${C.channelType}-projects`})}s(vl,e=>{var a;const l=(null==(a=e[0])?void 0:a.id)||null;if(!l||l===pl)return void(pl=l);pl=l,ml&&clearTimeout(ml),ml=setTimeout(()=>{wl()},5e3);(!ul.value||ul.value.scrollTop<20)&&w(()=>{ul.value&&(ul.value.scrollTop=0)})}),s(()=>Za.value.requests,e=>{el("requests",Ha.value.requests,e,600)}),s(()=>Za.value.tokens,e=>{el("tokens",Ha.value.tokens,e,600)}),s(()=>Za.value.cost,e=>{el("cost",Ha.value.cost,e,600)}),s(()=>C.channelType,()=>{var e;pl=(null==(e=vl.value[0])?void 0:e.id)||null}),s(()=>{var e,a;return null==(a=null==(e=Ua.value)?void 0:e.counts)?void 0:a[C.channelType]},()=>{jl()}),s(Pa,()=>{gl&&function(){hl&&(clearInterval(hl),hl=null);const e=Pa.value||30,a=Math.max(1e3*e,1e4);hl=setInterval(()=>{Ml(),wl()},a)}()});const Sl=n({});function Ll(e){return!!Sl.value[e]}function Il(e,a){e&&(Sl.value={...Sl.value,[e]:!!a})}function jl(){var e,a;const l=null==(a=null==(e=Ua.value)?void 0:e.counts)?void 0:a[C.channelType];Ga.value.projects=(null==l?void 0:l.projectCount)||0,Ga.value.sessions=(null==l?void 0:l.sessionCount)||0}async function Ml(){if(Ua.value&&Ua.value.todayStats){const e=Ua.value.todayStats[C.channelType];e&&(Za.value.requests=e.requests||0,Za.value.tokens=e.tokens||0,Za.value.cost=e.cost||0)}jl()}function Ol(){Aa(C.channelType)}function Nl(){window.dispatchEvent(new CustomEvent("open-skills-drawer",{detail:{platform:C.channelType}}))}return c(async()=>{await Promise.all([Ea().then(()=>Ml()),wl()]),async function(){var e,a;try{if(Ua.value&&Ua.value.uiConfig)cl.value=!1!==(null==(e=Ua.value.uiConfig.panelVisibility)?void 0:e.showLogs);else{const e=await j();e.success&&e.config&&(cl.value=!1!==(null==(a=e.config.panelVisibility)?void 0:a.showLogs))}}catch(l){}}(),async function(){var e,a;try{let l=!1;if(Ua.value&&Ua.value.uiConfig)l=(null==(e=Ua.value.uiConfig.channelLocks)?void 0:e[C.channelType])||!1;else{const e=await j();e.success&&e.config&&(l=(null==(a=e.config.channelLocks)?void 0:a[C.channelType])||!1)}nl.value=l,ll(l)}catch(l){}}(),window.addEventListener("panel-visibility-change",tl),Ha.value={...Za.value},gl=!0,yl=setInterval(()=>{ol.value=Date.now()},1e3)}),t(()=>{gl=!1,hl&&clearInterval(hl),yl&&clearInterval(yl),ml&&clearTimeout(ml),window.removeEventListener("panel-visibility-change",tl),Object.values(Xa).forEach(e=>{e&&cancelAnimationFrame(e)})}),(a,l)=>{const n=o("n-collapse");return u(),i("div",re,[d("div",{class:k(["channel-header",e.channelType])},[d("div",ve,[v(h(se),{size:16},{default:p(()=>[v(h(K))]),_:1})]),d("div",pe,[v(h(se),{size:20},{default:p(()=>[(u(),y(g(Ka.value)))]),_:1})]),d("h2",he,m(Ja.value),1),["claude","codex","gemini","opencode"].includes(e.channelType)?(u(),i("div",ye,[v(h(te),{trigger:"hover"},{trigger:p(()=>[v(h(ce),{text:"",class:"skills-button",onClick:Nl,title:"Skills 技能管理"},{icon:p(()=>[v(h(se),{size:18},{default:p(()=>[v(h(U))]),_:1})]),_:1})]),default:p(()=>[l[3]||(l[3]=f(" Skills 技能管理 ",-1))]),_:1})])):r("",!0),v(h(ce),{text:"",class:"lock-button",onClick:sl,title:nl.value?"解锁此列":"锁定此列"},{icon:p(()=>[v(h(se),{size:18},{default:p(()=>[nl.value?(u(),y(h(R),{key:0})):(u(),y(h(B),{key:1}))]),_:1})]),_:1},8,["title"])],2),nl.value?r("",!0):(u(),i("div",ge,[d("div",me,[d("div",fe,[v(h(se),{size:16},{default:p(()=>[v(h(G))]),_:1}),l[4]||(l[4]=d("h3",{class:"card-title"},"代理控制",-1)),Ra.value.running&&il.value?(u(),i("span",ke,m(il.value),1)):r("",!0),v(h(oe),{value:Ra.value.running,"onUpdate:value":[l[0]||(l[0]=e=>Ra.value.running=e),_l],loading:Ra.value.loading,size:"small",style:{"margin-left":"auto"}},null,8,["value","loading"])]),d("div",Te,[d("div",be,[d("div",xe,[d("div",{class:k(["status-dot",{active:Ra.value.running}])},null,2),v(h(ie),{type:Ra.value.running?"success":"default",style:{"font-size":"12px"}},{default:p(()=>[f(m(Ra.value.running?"运行中":"已停止"),1)]),_:1},8,["type"]),d("span",we,"端口: "+m(Ra.value.port),1)]),v(h(de),{trigger:"click",placement:"bottom",width:320,class:"channel-popover"},{trigger:p(()=>[v(h(ce),{text:"",size:"tiny",class:"channel-status"},{default:p(()=>[d("span",Ce,m(Tl.value),1)]),_:1})]),default:p(()=>[d("div",$e,[d("div",_e,[l[6]||(l[6]=d("span",null,"渠道快捷管理",-1)),v(h(ie),{depth:"3",style:{"font-size":"11px"}},{default:p(()=>[...l[5]||(l[5]=[f("点击开关切换状态",-1)])]),_:1})]),0===fl.value.length?(u(),i("div",qe,[v(h(ie),{depth:"3"},{default:p(()=>[...l[7]||(l[7]=[f("暂无配置渠道",-1)])]),_:1})])):(u(),i("div",ze,[(u(!0),i(T,null,b(fl.value,e=>{var a,n;return u(),i("div",{key:e.id,class:k(["channel-quick-item",{disabled:!1===e.enabled}])},[d("div",Se,[d("span",Le,m(e.name),1),"frozen"===(null==(a=e.health)?void 0:a.status)?(u(),y(h(ue),{key:0,size:"tiny",type:"error",bordered:!1},{default:p(()=>[...l[8]||(l[8]=[f(" 冻结 ",-1)])]),_:1})):r("",!0),v(h(oe),{size:"small",value:!1!==e.enabled,"onUpdate:value":a=>async function(e,a){if(e&&!Ll(e.id)){Il(e.id,!0);try{let l;"claude"===C.channelType?l=M:"codex"===C.channelType?l=O:"gemini"===C.channelType?l=N:"opencode"===C.channelType&&(l=A),l&&(await l(e.id,{enabled:a}),P.success(a?`渠道「${e.name}」已启用`:`渠道「${e.name}」已停用`),await Fa())}catch(l){P.error("操作失败: "+l.message)}finally{Il(e.id,!1)}}}(e,a),loading:Ll(e.id),disabled:Ll(e.id),style:{"margin-left":"auto"}},null,8,["value","onUpdate:value","loading","disabled"])]),Ll(e.id)?(u(),i("div",Ie," 正在切换渠道状态... ")):r("",!0),d("div",je,[d("span",Me,[l[9]||(l[9]=d("span",{class:"metric-label"},"请求",-1)),d("span",Oe,m(xl(e.id).requests),1)]),d("span",Ne,[l[10]||(l[10]=d("span",{class:"metric-label"},"Tokens",-1)),d("span",Ae,m((n=xl(e.id).tokens,n>=1e6?(n/1e6).toFixed(1)+"M":n>=1e3?(n/1e3).toFixed(1)+"K":n.toString())),1)]),d("span",Fe,[l[11]||(l[11]=d("span",{class:"metric-label"},"权重",-1)),d("span",De,m(e.weight||1),1)]),d("span",Pe,[l[12]||(l[12]=d("span",{class:"metric-label"},"并发",-1)),d("span",{class:k(["metric-value",{active:kl(e.id)>0}])},m(kl(e.id))+m(e.maxConcurrency?`/${e.maxConcurrency}`:""),3)])])],2)}),128))]))])]),_:1})])])]),d("div",Ue,[d("div",Ee,[v(h(se),{size:14},{default:p(()=>[v(h(Z))]),_:1}),l[13]||(l[13]=d("h3",{class:"card-title"},"快速访问",-1))]),d("div",Ve,[d("div",Je,[d("div",{class:"access-card access-card-projects clickable",onClick:ql},[d("div",Ke,[v(h(se),{size:16},{default:p(()=>[v(h(H))]),_:1})]),d("div",Re,[l[14]||(l[14]=d("span",{class:"access-label"},"项目",-1)),d("span",Be,m(Ga.value.projects),1)])]),d("div",{class:"access-card access-card-sessions clickable",onClick:l[1]||(l[1]=e=>al.value=!0)},[d("div",Ge,[v(h(se),{size:16},{default:p(()=>[v(h(W))]),_:1})]),d("div",Ze,[l[15]||(l[15]=d("span",{class:"access-label"},"最新对话",-1)),d("span",He,m(Ga.value.sessions),1)])]),d("div",{class:"access-card access-card-goto clickable",onClick:zl},[d("div",We,[v(h(se),{size:16},{default:p(()=>[v(h(X))]),_:1})]),d("div",Xe,[l[16]||(l[16]=d("span",{class:"access-label"},"前往",-1)),d("span",Ye,m(Ba.value),1)])])])])]),d("div",{class:k(["card stats-card",`stats-card-${e.channelType}`])},[d("div",Qe,[v(h(se),{size:14},{default:p(()=>[v(h(Y))]),_:1}),l[17]||(l[17]=d("h3",{class:"card-title"},"今日数据",-1))]),d("div",ea,[d("div",aa,[d("div",la,[l[19]||(l[19]=d("div",{class:"stat-icon-dot requests"},null,-1)),d("div",na,[l[18]||(l[18]=d("span",{class:"stat-label"},"请求",-1)),d("span",{class:k(["stat-value",{animating:Ya.value.requests}])},m(Ha.value.requests),3)])]),d("div",sa,[l[21]||(l[21]=d("div",{class:"stat-icon-dot tokens"},null,-1)),d("div",ca,[l[20]||(l[20]=d("span",{class:"stat-label"},"总 Tokens",-1)),d("span",{class:k(["stat-value",{animating:Ya.value.tokens}])},m((c=Ha.value.tokens,c>=1e6?(c/1e6).toFixed(1)+"M":c>=1e3?(c/1e3).toFixed(1)+"K":c.toString())),3)])]),d("div",ta,[l[23]||(l[23]=d("div",{class:"stat-icon-dot cost"},null,-1)),d("div",oa,[l[22]||(l[22]=d("span",{class:"stat-label"},"成本 / USD",-1)),d("span",{class:k(["stat-value",{animating:Ya.value.cost}])},m((s=Ha.value.cost,!s||Number.isNaN(s)?"$0":"$"+Number(s).toFixed(3))),3)])])])])],2),Object.keys(Qa.value).length>0?(u(),i("div",{key:0,class:k(["card chart-card",`chart-card-${e.channelType}`])},[v(n,{"default-expanded-names":[],accordion:""})],2)):r("",!0),cl.value?(u(),i("div",ia,[d("div",ua,[v(h(se),{size:14},{default:p(()=>[v(h(Q))]),_:1}),l[24]||(l[24]=d("h3",{class:"card-title"},"实时日志",-1)),v(h(ce),{text:"",size:"tiny",onClick:x(Ol,["stop"]),style:{"margin-left":"auto"},title:"清空日志"},{icon:p(()=>[v(h(se),{size:14},{default:p(()=>[v(h(ee))]),_:1})]),_:1})]),d("div",da,[d("div",ra,[d("div",{class:k(["logs-table-header",`logs-header-${e.channelType}`])},[d("div",{class:k(["log-col col-channel",`col-channel-${e.channelType}`])},"渠道",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"请求",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"回复",2),"claude"===e.channelType?(u(),i(T,{key:0},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"写入",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"命中",2)],64)):"codex"===e.channelType?(u(),i(T,{key:1},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"推理",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"总计",2)],64)):"gemini"===e.channelType?(u(),i(T,{key:2},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"总计",2)],64)):"opencode"===e.channelType?(u(),i(T,{key:3},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"推理",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"总计",2)],64)):r("",!0),d("div",{class:k(["log-col col-time",`col-time-${e.channelType}`])},"时间",2)],2),d("div",{class:"logs-container",ref_key:"logsContainer",ref:ul},[0===vl.value.length?(u(),i("div",va,[v(h(se),{size:32,depth:"3",style:{"margin-bottom":"8px"}},{default:p(()=>[v(h(Q))]),_:1}),v(h(ie),{depth:"3",style:{"font-size":"12px","font-weight":"500"}},{default:p(()=>[...l[25]||(l[25]=[f("暂无实时日志",-1)])]),_:1}),v(h(ie),{depth:"3",style:{"font-size":"11px","margin-top":"4px"}},{default:p(()=>[...l[26]||(l[26]=[f("开启代理后将显示请求记录",-1)])]),_:1})])):r("",!0),(u(!0),i(T,null,b(vl.value,a=>(u(),i("div",{key:a.id,class:k(["log-row",{"action-row":"action"===a.type,"error-row":"error"===a.status,"new-log":a.isNew}]),title:$l(a)},["action"===a.type?(u(),i("div",ha,[v(h(se),{size:12,color:"#18a058"},{default:p(()=>[v(h(ae))]),_:1}),d("span",ya,m(a.message),1),d("span",ga,m(a.time),1)])):"error"===a.status?(u(),i("div",ma,[v(h(se),{size:12,color:"#d03050"},{default:p(()=>[v(h(le))]),_:1}),d("span",fa,m(a.channel)+": "+m(a.error||a.message||"请求失败"),1),d("span",ka,m(a.time),1)])):(u(),i(T,{key:2},[d("div",{class:k(["log-col col-channel",`col-channel-${e.channelType}`])},[v(h(ue),{size:"tiny",type:"success"},{default:p(()=>[f(m(a.channel),1)]),_:2},1024)],2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"input")),3),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"output")),3),"claude"===e.channelType?(u(),i(T,{key:0},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"cacheCreation")),3),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"cacheRead")),3)],64)):"codex"===e.channelType?(u(),i(T,{key:1},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"reasoning")),3),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"cached")),3),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"total")),3)],64)):"gemini"===e.channelType?(u(),i(T,{key:2},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"cached")),3),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"total")),3)],64)):"opencode"===e.channelType?(u(),i(T,{key:3},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"reasoning")),3),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"cached")),3),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"total")),3)],64)):r("",!0),d("div",{class:k(["log-col col-time",`col-time-${e.channelType}`])},m(a.time),3)],64))],10,pa))),128))],512)])])])):r("",!0)])),nl.value?(u(),i("div",{key:1,class:k(["locked-overlay",`locked-${e.channelType}`])},[d("div",Ta,[d("div",ba,[v(h(se),{size:48},{default:p(()=>[v(h(R))]),_:1})]),l[28]||(l[28]=d("h3",{class:"locked-title"},"该渠道已锁定",-1)),v(h(ie),{depth:"3",class:"locked-hint"},{default:p(()=>[...l[27]||(l[27]=[f(" 点击上方按钮解锁以查看内容 ",-1)])]),_:1})])],2)):r("",!0),v(q,{visible:al.value,"onUpdate:visible":l[2]||(l[2]=e=>al.value=e),channel:e.channelType},null,8,["visible","channel"])]);var s,c}}},[["__scopeId","data-v-849862db"]]),Ca=n({theme:"light",panelVisibility:{showChannels:!0,showLogs:!0},channelBalance:{showRemaining:!1},channelLocks:{claude:!1,codex:!1,gemini:!1},channelCollapse:{claude:[],codex:[],gemini:[]},channelOrder:{claude:[],codex:[],gemini:[]}});let $a=!1,_a=null;async function qa(){return $a?Ca.value:_a||(_a=(async()=>{try{const e=await j();e.success&&e.config&&(Ca.value=e.config,$a=!0)}catch(e){}finally{_a=null}return Ca.value})(),_a)}const za={class:"dashboard-container"},Sa="dashboardChannelOrder",La=C({__name:"Home",setup(a){const l=["claude","codex","gemini","opencode"],{uiConfig:s,updateConfig:t,loadUIConfig:o}=($a||qa(),{uiConfig:Ca,loadUIConfig:qa,saveConfig:async function(e){try{const a=await P(e);return!!a.success&&(Ca.value=a.config,!0)}catch(a){return!1}},updateConfig:async function(e,a){try{const l=await D(e,a);return!!l.success&&(Ca.value=l.config,!0)}catch(l){return!1}},updateNestedConfig:async function(e,a,l){try{const n=await F(e,a,l);return!!n.success&&(Ca.value=n.config,!0)}catch(n){return!1}}});function d(e){try{localStorage.setItem(Sa,JSON.stringify(e))}catch(a){}}const r=n(function(){try{const e=localStorage.getItem(Sa);if(e){const a=JSON.parse(e);if(Array.isArray(a)&&4===a.length)return a}}catch(e){}return l}().map(e=>({type:e})));async function g(){const e=r.value.map(e=>e.type);d(e),await t("dashboardChannelOrder",e)}return c(async()=>{if(await o(),s.value.dashboardChannelOrder&&Array.isArray(s.value.dashboardChannelOrder)&&4===s.value.dashboardChannelOrder.length){const e=s.value.dashboardChannelOrder;r.value=e.map(e=>({type:e})),d(e)}}),(a,l)=>(u(),i("div",za,[v(h(e),{modelValue:r.value,"onUpdate:modelValue":l[0]||(l[0]=e=>r.value=e),class:"dashboard-grid","item-key":"type",animation:200,handle:".drag-handle",onEnd:g},{item:p(({element:e})=>[(u(),y(wa,{"channel-type":e.type,key:e.type},null,8,["channel-type"]))]),_:1},8,["modelValue"])]))}},[["__scopeId","data-v-a6410dd2"]]);export{La as default};
1
+ import{d as e}from"./vendors-DQA4Hw9v.js";import{a8 as a,f as l,r as n,w as s,h as c,K as t,a7 as o,c as i,o as u,a as d,W as r,X as v,Y as p,N as h,a0 as y,a3 as g,_ as m,p as f,L as k,F as T,$ as b,Z as x,v as w}from"./vue-vendor-B5RqjEjQ.js";import{_ as C,u as $,a as _,R as q,g as z,b as S,c as L,d as I,e as j,f as M,h as O,i as N,j as A,k as F,l as D,s as P}from"./index-BsdIJwLf.js";import{E as U,o as E,n as V,m as J,aq as K,ar as R,as as B,at as G,au as Z,a9 as H,i as W,A as X,av as Y,aw as Q,T as ee,a as ae,b as le}from"./icons-QFXzEgqM.js";import{L as ne,N as se,B as ce,s as te,b as oe,c as ie,a as ue,Z as de}from"./naive-ui-DM897mIP.js";import"./markdown-BNJfEgCA.js";const re={class:"channel-column"},ve={class:"drag-handle",title:"拖拽排序"},pe={class:"header-icon"},he={class:"channel-title"},ye={key:0,class:"claude-extra-area"},ge={key:0,class:"channel-content"},me={class:"card"},fe={class:"card-header"},ke={key:0,class:"runtime-badge"},Te={class:"card-body",style:{padding:"6px 10px"}},be={class:"proxy-info-row"},xe={class:"proxy-status"},we={class:"proxy-port"},Ce={class:"channel-name"},$e={class:"channel-quick-panel"},_e={class:"panel-title"},qe={key:0,class:"no-channels"},ze={key:1,class:"channel-quick-list"},Se={class:"channel-quick-info"},Le={class:"channel-quick-name"},Ie={key:0,class:"channel-switching-tip"},je={class:"channel-metrics"},Me={class:"metric-item"},Oe={class:"metric-value"},Ne={class:"metric-item"},Ae={class:"metric-value"},Fe={class:"metric-item"},De={class:"metric-value"},Pe={class:"metric-item"},Ue={class:"card"},Ee={class:"card-header compact"},Ve={class:"card-body",style:{padding:"8px 10px"}},Je={class:"quick-access-list"},Ke={class:"access-icon"},Re={class:"access-content"},Be={class:"access-value"},Ge={class:"access-icon"},Ze={class:"access-content"},He={class:"access-value"},We={class:"access-icon"},Xe={class:"access-content"},Ye={class:"access-goto"},Qe={class:"card-header compact"},ea={class:"card-body",style:{padding:"8px 10px"}},aa={class:"stats-inline stats-3col"},la={class:"stat-inline-item stat-requests"},na={class:"stat-info"},sa={class:"stat-inline-item stat-input"},ca={class:"stat-info"},ta={class:"stat-inline-item stat-output"},oa={class:"stat-info"},ia={key:1,class:"card logs-card"},ua={class:"card-header compact"},da={class:"card-body logs-card-body"},ra={class:"logs-table-wrapper"},va={key:0,class:"empty-logs"},pa=["title"],ha={key:0,class:"action-content"},ya={class:"action-msg"},ga={class:"action-time"},ma={key:1,class:"action-content"},fa={class:"action-msg error-msg"},ka={class:"action-time error-time"},Ta={class:"locked-content"},ba={class:"lock-icon"},xa="channelLocks",wa=C({__name:"ChannelColumn",props:{channelType:{type:String,required:!0,validator:e=>["claude","codex","gemini","opencode"].includes(e)}},setup(e){const C=e,D=a(),P=ne(),{claudeProxy:wa,codexProxy:Ca,geminiProxy:$a,opencodeProxy:_a,claudeChannels:qa,codexChannels:za,geminiChannels:Sa,opencodeChannels:La,schedulerState:Ia,getProxyState:ja,startProxy:Ma,stopProxy:Oa,getLogs:Na,clearLogsForSource:Aa,loadChannels:Fa,logLimit:Da,statsInterval:Pa}=$(),{dashboardData:Ua,loadDashboard:Ea}=_(),Va={claude:{title:"ClaudeCode",subtitle:"智能编程助手",icon:J},codex:{title:"Codex-CLI",subtitle:"高效代码生成",icon:V},gemini:{title:"Gemini-CLI",subtitle:"多模态AI助手",icon:E},opencode:{title:"OpenCode",subtitle:"AI 代码助手",icon:U}},Ja=l(()=>Va[C.channelType].title);l(()=>Va[C.channelType].subtitle);const Ka=l(()=>Va[C.channelType].icon),Ra=l(()=>"claude"===C.channelType?wa.value:"codex"===C.channelType?Ca.value:"gemini"===C.channelType?$a.value:"opencode"===C.channelType?_a.value:{}),Ba=l(()=>"claude"===C.channelType?"Claude":"codex"===C.channelType?"Codex":"gemini"===C.channelType?"Gemini":"opencode"===C.channelType?"OpenCode":""),Ga=n({projects:0,sessions:0}),Za=n({requests:0,tokens:0,cost:0}),Ha=n({requests:0,tokens:0,cost:0}),Wa={requests:0,tokens:0,cost:3};let Xa={requests:null,tokens:null,cost:null};const Ya=n({requests:!1,tokens:!1,cost:!1}),Qa=l(()=>{var e,a,l;const n="claude"===C.channelType?"claude":"codex"===C.channelType?"codex":"opencode"===C.channelType?"opencode":"gemini";return(null==(l=null==(a=null==(e=Ua.value)?void 0:e.todayStats)?void 0:a[n])?void 0:l.byModel)||{}});function el(e,a,l,n=600){Xa[e]&&cancelAnimationFrame(Xa[e]),Ya.value[e]=!0;const s=Date.now(),c=()=>{const t=Date.now()-s,o=Math.min(t/n,1),i=1-Math.pow(1-o,2),u=a+(l-a)*i,d=Wa[e]??0,r=Math.pow(10,d),v=d>0?Math.round(u*r)/r:Math.round(u);Ha.value[e]=v,o<1?Xa[e]=requestAnimationFrame(c):Ya.value[e]=!1};Xa[e]=requestAnimationFrame(c)}const al=n(!1);function ll(e){try{const a=localStorage.getItem(xa),l=a?JSON.parse(a):{};l[C.channelType]=e,localStorage.setItem(xa,JSON.stringify(l))}catch(a){}}const nl=n(function(){try{const e=localStorage.getItem(xa);if(e){return JSON.parse(e)[C.channelType]||!1}}catch(e){}return!1}());async function sl(){nl.value=!nl.value,ll(nl.value);try{if(await F("channelLocks",C.channelType,nl.value),Ua.value){const e=Ua.value.uiConfig||{},a={...e.channelLocks||{}};a[C.channelType]=nl.value,Ua.value={...Ua.value,uiConfig:{...e,channelLocks:a}}}}catch(e){}}const cl=n(!0);function tl(e){e.detail&&void 0!==e.detail.showLogs&&(cl.value=e.detail.showLogs)}const ol=n(Date.now()),il=l(()=>{if(!Ra.value.running)return"";const e=Ra.value.startTime;if(!e)return"";const a=ol.value-e;if(a<=0)return"";const l=Math.floor(a/1e3),n=Math.floor(l/3600),s=Math.floor(l%3600/60),c=l%60;let t="已运行 ";return n>0&&(t+=`${n}小时`),s>0&&(t+=`${s}分`),(c>0||0===n&&0===s)&&(t+=`${c}秒`),t}),ul=n(null),dl=l(()=>Da.value),rl={claude:Na("claude"),codex:Na("codex"),gemini:Na("gemini"),opencode:Na("opencode")},vl=l(()=>((rl[C.channelType]||rl.claude).value||[]).slice(0,dl.value));let pl=null,hl=null,yl=null,gl=!1,ml=null;const fl=l(()=>{let e=[];"claude"===C.channelType?e=qa.value||[]:"codex"===C.channelType?e=za.value||[]:"gemini"===C.channelType?e=Sa.value||[]:"opencode"===C.channelType&&(e=La.value||[]);return[...e.filter(e=>!1!==e.enabled),...e.filter(e=>!1===e.enabled)]});function kl(e){const a=Ia[C.channelType];if(!a||!a.channels)return 0;const l=a.channels.find(a=>a.id===e);return l?l.inflight:0}const Tl=l(()=>{var e;const a=fl.value.filter(e=>!1!==e.enabled).length;return(null==(e=Ra.value.proxy)?void 0:e.running)?`${a}个渠道调度中`:fl.value.length>0?`${a}个渠道已启用`:"无渠道"}),bl=n({});function xl(e){return bl.value[e]||{requests:0,tokens:0,cost:0}}async function wl(){var e;try{let a;if("claude"===C.channelType?a=await z():"codex"===C.channelType?a=await S():"gemini"===C.channelType?a=await L():"opencode"===C.channelType&&(a=await I()),a&&a.byChannel){const l={};for(const[n,s]of Object.entries(a.byChannel))l[n]={requests:s.requests||0,tokens:(null==(e=s.tokens)?void 0:e.total)||0,cost:s.cost||0};bl.value=l}}catch(a){}}function Cl(e,a){var l;return(null==e?void 0:e.usageMissing)?"--":(null==(l=null==e?void 0:e.tokens)?void 0:l[a])||0}function $l(e){if(!e||"action"===e.type||"error"===e.status)return"";const a=[];return e.model&&a.push(`模型: ${e.model}`),e.originalModel&&e.originalModel!==e.model&&a.push(`重定向: ${e.originalModel} -> ${e.model}`),e.usageMissing&&a.push("上游响应未返回 usage,当前无法计算 token。"),a.join("\n")}async function _l(e){var a,l;const n=ja(C.channelType);n.value.loading=!0;try{let a;a=e?await Ma(C.channelType):await Oa(C.channelType,{refreshChannelsDrawer:!0}),!1!==a.success?P.success(e?`${Ja.value} 代理已启动`:`${Ja.value} 代理已停止`):(P.error(a.error||"操作失败"),n.value.running=!e)}catch(s){P.error((null==(l=null==(a=s.response)?void 0:a.data)?void 0:l.error)||s.message||"操作失败"),n.value.running=!e}finally{n.value.loading=!1}}function ql(){D.push({name:`${C.channelType}-projects`})}function zl(){D.push({name:`${C.channelType}-projects`})}s(vl,e=>{var a;const l=(null==(a=e[0])?void 0:a.id)||null;if(!l||l===pl)return void(pl=l);pl=l,ml&&clearTimeout(ml),ml=setTimeout(()=>{wl()},5e3);(!ul.value||ul.value.scrollTop<20)&&w(()=>{ul.value&&(ul.value.scrollTop=0)})}),s(()=>Za.value.requests,e=>{el("requests",Ha.value.requests,e,600)}),s(()=>Za.value.tokens,e=>{el("tokens",Ha.value.tokens,e,600)}),s(()=>Za.value.cost,e=>{el("cost",Ha.value.cost,e,600)}),s(()=>C.channelType,()=>{var e;pl=(null==(e=vl.value[0])?void 0:e.id)||null}),s(()=>{var e,a;return null==(a=null==(e=Ua.value)?void 0:e.counts)?void 0:a[C.channelType]},()=>{jl()}),s(Pa,()=>{gl&&function(){hl&&(clearInterval(hl),hl=null);const e=Pa.value||30,a=Math.max(1e3*e,1e4);hl=setInterval(()=>{Ml(),wl()},a)}()});const Sl=n({});function Ll(e){return!!Sl.value[e]}function Il(e,a){e&&(Sl.value={...Sl.value,[e]:!!a})}function jl(){var e,a;const l=null==(a=null==(e=Ua.value)?void 0:e.counts)?void 0:a[C.channelType];Ga.value.projects=(null==l?void 0:l.projectCount)||0,Ga.value.sessions=(null==l?void 0:l.sessionCount)||0}async function Ml(){if(Ua.value&&Ua.value.todayStats){const e=Ua.value.todayStats[C.channelType];e&&(Za.value.requests=e.requests||0,Za.value.tokens=e.tokens||0,Za.value.cost=e.cost||0)}jl()}function Ol(){Aa(C.channelType)}function Nl(){window.dispatchEvent(new CustomEvent("open-skills-drawer",{detail:{platform:C.channelType}}))}return c(async()=>{await Promise.all([Ea().then(()=>Ml()),wl()]),async function(){var e,a;try{if(Ua.value&&Ua.value.uiConfig)cl.value=!1!==(null==(e=Ua.value.uiConfig.panelVisibility)?void 0:e.showLogs);else{const e=await j();e.success&&e.config&&(cl.value=!1!==(null==(a=e.config.panelVisibility)?void 0:a.showLogs))}}catch(l){}}(),async function(){var e,a;try{let l=!1;if(Ua.value&&Ua.value.uiConfig)l=(null==(e=Ua.value.uiConfig.channelLocks)?void 0:e[C.channelType])||!1;else{const e=await j();e.success&&e.config&&(l=(null==(a=e.config.channelLocks)?void 0:a[C.channelType])||!1)}nl.value=l,ll(l)}catch(l){}}(),window.addEventListener("panel-visibility-change",tl),Ha.value={...Za.value},gl=!0,yl=setInterval(()=>{ol.value=Date.now()},1e3)}),t(()=>{gl=!1,hl&&clearInterval(hl),yl&&clearInterval(yl),ml&&clearTimeout(ml),window.removeEventListener("panel-visibility-change",tl),Object.values(Xa).forEach(e=>{e&&cancelAnimationFrame(e)})}),(a,l)=>{const n=o("n-collapse");return u(),i("div",re,[d("div",{class:k(["channel-header",e.channelType])},[d("div",ve,[v(h(se),{size:16},{default:p(()=>[v(h(K))]),_:1})]),d("div",pe,[v(h(se),{size:20},{default:p(()=>[(u(),y(g(Ka.value)))]),_:1})]),d("h2",he,m(Ja.value),1),["claude","codex","gemini","opencode"].includes(e.channelType)?(u(),i("div",ye,[v(h(te),{trigger:"hover"},{trigger:p(()=>[v(h(ce),{text:"",class:"skills-button",onClick:Nl,title:"Skills 技能管理"},{icon:p(()=>[v(h(se),{size:18},{default:p(()=>[v(h(U))]),_:1})]),_:1})]),default:p(()=>[l[3]||(l[3]=f(" Skills 技能管理 ",-1))]),_:1})])):r("",!0),v(h(ce),{text:"",class:"lock-button",onClick:sl,title:nl.value?"解锁此列":"锁定此列"},{icon:p(()=>[v(h(se),{size:18},{default:p(()=>[nl.value?(u(),y(h(R),{key:0})):(u(),y(h(B),{key:1}))]),_:1})]),_:1},8,["title"])],2),nl.value?r("",!0):(u(),i("div",ge,[d("div",me,[d("div",fe,[v(h(se),{size:16},{default:p(()=>[v(h(G))]),_:1}),l[4]||(l[4]=d("h3",{class:"card-title"},"代理控制",-1)),Ra.value.running&&il.value?(u(),i("span",ke,m(il.value),1)):r("",!0),v(h(oe),{value:Ra.value.running,"onUpdate:value":[l[0]||(l[0]=e=>Ra.value.running=e),_l],loading:Ra.value.loading,size:"small",style:{"margin-left":"auto"}},null,8,["value","loading"])]),d("div",Te,[d("div",be,[d("div",xe,[d("div",{class:k(["status-dot",{active:Ra.value.running}])},null,2),v(h(ie),{type:Ra.value.running?"success":"default",style:{"font-size":"12px"}},{default:p(()=>[f(m(Ra.value.running?"运行中":"已停止"),1)]),_:1},8,["type"]),d("span",we,"端口: "+m(Ra.value.port),1)]),v(h(de),{trigger:"click",placement:"bottom",width:320,class:"channel-popover"},{trigger:p(()=>[v(h(ce),{text:"",size:"tiny",class:"channel-status"},{default:p(()=>[d("span",Ce,m(Tl.value),1)]),_:1})]),default:p(()=>[d("div",$e,[d("div",_e,[l[6]||(l[6]=d("span",null,"渠道快捷管理",-1)),v(h(ie),{depth:"3",style:{"font-size":"11px"}},{default:p(()=>[...l[5]||(l[5]=[f("点击开关切换状态",-1)])]),_:1})]),0===fl.value.length?(u(),i("div",qe,[v(h(ie),{depth:"3"},{default:p(()=>[...l[7]||(l[7]=[f("暂无配置渠道",-1)])]),_:1})])):(u(),i("div",ze,[(u(!0),i(T,null,b(fl.value,e=>{var a,n;return u(),i("div",{key:e.id,class:k(["channel-quick-item",{disabled:!1===e.enabled}])},[d("div",Se,[d("span",Le,m(e.name),1),"frozen"===(null==(a=e.health)?void 0:a.status)?(u(),y(h(ue),{key:0,size:"tiny",type:"error",bordered:!1},{default:p(()=>[...l[8]||(l[8]=[f(" 冻结 ",-1)])]),_:1})):r("",!0),v(h(oe),{size:"small",value:!1!==e.enabled,"onUpdate:value":a=>async function(e,a){if(e&&!Ll(e.id)){Il(e.id,!0);try{let l;"claude"===C.channelType?l=M:"codex"===C.channelType?l=O:"gemini"===C.channelType?l=N:"opencode"===C.channelType&&(l=A),l&&(await l(e.id,{enabled:a}),P.success(a?`渠道「${e.name}」已启用`:`渠道「${e.name}」已停用`),await Fa())}catch(l){P.error("操作失败: "+l.message)}finally{Il(e.id,!1)}}}(e,a),loading:Ll(e.id),disabled:Ll(e.id),style:{"margin-left":"auto"}},null,8,["value","onUpdate:value","loading","disabled"])]),Ll(e.id)?(u(),i("div",Ie," 正在切换渠道状态... ")):r("",!0),d("div",je,[d("span",Me,[l[9]||(l[9]=d("span",{class:"metric-label"},"请求",-1)),d("span",Oe,m(xl(e.id).requests),1)]),d("span",Ne,[l[10]||(l[10]=d("span",{class:"metric-label"},"Tokens",-1)),d("span",Ae,m((n=xl(e.id).tokens,n>=1e6?(n/1e6).toFixed(1)+"M":n>=1e3?(n/1e3).toFixed(1)+"K":n.toString())),1)]),d("span",Fe,[l[11]||(l[11]=d("span",{class:"metric-label"},"权重",-1)),d("span",De,m(e.weight||1),1)]),d("span",Pe,[l[12]||(l[12]=d("span",{class:"metric-label"},"并发",-1)),d("span",{class:k(["metric-value",{active:kl(e.id)>0}])},m(kl(e.id))+m(e.maxConcurrency?`/${e.maxConcurrency}`:""),3)])])],2)}),128))]))])]),_:1})])])]),d("div",Ue,[d("div",Ee,[v(h(se),{size:14},{default:p(()=>[v(h(Z))]),_:1}),l[13]||(l[13]=d("h3",{class:"card-title"},"快速访问",-1))]),d("div",Ve,[d("div",Je,[d("div",{class:"access-card access-card-projects clickable",onClick:ql},[d("div",Ke,[v(h(se),{size:16},{default:p(()=>[v(h(H))]),_:1})]),d("div",Re,[l[14]||(l[14]=d("span",{class:"access-label"},"项目",-1)),d("span",Be,m(Ga.value.projects),1)])]),d("div",{class:"access-card access-card-sessions clickable",onClick:l[1]||(l[1]=e=>al.value=!0)},[d("div",Ge,[v(h(se),{size:16},{default:p(()=>[v(h(W))]),_:1})]),d("div",Ze,[l[15]||(l[15]=d("span",{class:"access-label"},"最新对话",-1)),d("span",He,m(Ga.value.sessions),1)])]),d("div",{class:"access-card access-card-goto clickable",onClick:zl},[d("div",We,[v(h(se),{size:16},{default:p(()=>[v(h(X))]),_:1})]),d("div",Xe,[l[16]||(l[16]=d("span",{class:"access-label"},"前往",-1)),d("span",Ye,m(Ba.value),1)])])])])]),d("div",{class:k(["card stats-card",`stats-card-${e.channelType}`])},[d("div",Qe,[v(h(se),{size:14},{default:p(()=>[v(h(Y))]),_:1}),l[17]||(l[17]=d("h3",{class:"card-title"},"今日数据",-1))]),d("div",ea,[d("div",aa,[d("div",la,[l[19]||(l[19]=d("div",{class:"stat-icon-dot requests"},null,-1)),d("div",na,[l[18]||(l[18]=d("span",{class:"stat-label"},"请求",-1)),d("span",{class:k(["stat-value",{animating:Ya.value.requests}])},m(Ha.value.requests),3)])]),d("div",sa,[l[21]||(l[21]=d("div",{class:"stat-icon-dot tokens"},null,-1)),d("div",ca,[l[20]||(l[20]=d("span",{class:"stat-label"},"总 Tokens",-1)),d("span",{class:k(["stat-value",{animating:Ya.value.tokens}])},m((c=Ha.value.tokens,c>=1e6?(c/1e6).toFixed(1)+"M":c>=1e3?(c/1e3).toFixed(1)+"K":c.toString())),3)])]),d("div",ta,[l[23]||(l[23]=d("div",{class:"stat-icon-dot cost"},null,-1)),d("div",oa,[l[22]||(l[22]=d("span",{class:"stat-label"},"成本 / USD",-1)),d("span",{class:k(["stat-value",{animating:Ya.value.cost}])},m((s=Ha.value.cost,!s||Number.isNaN(s)?"$0":"$"+Number(s).toFixed(3))),3)])])])])],2),Object.keys(Qa.value).length>0?(u(),i("div",{key:0,class:k(["card chart-card",`chart-card-${e.channelType}`])},[v(n,{"default-expanded-names":[],accordion:""})],2)):r("",!0),cl.value?(u(),i("div",ia,[d("div",ua,[v(h(se),{size:14},{default:p(()=>[v(h(Q))]),_:1}),l[24]||(l[24]=d("h3",{class:"card-title"},"实时日志",-1)),v(h(ce),{text:"",size:"tiny",onClick:x(Ol,["stop"]),style:{"margin-left":"auto"},title:"清空日志"},{icon:p(()=>[v(h(se),{size:14},{default:p(()=>[v(h(ee))]),_:1})]),_:1})]),d("div",da,[d("div",ra,[d("div",{class:k(["logs-table-header",`logs-header-${e.channelType}`])},[d("div",{class:k(["log-col col-channel",`col-channel-${e.channelType}`])},"渠道",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"请求",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"回复",2),"claude"===e.channelType?(u(),i(T,{key:0},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"写入",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"命中",2)],64)):"codex"===e.channelType?(u(),i(T,{key:1},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"推理",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"总计",2)],64)):"gemini"===e.channelType?(u(),i(T,{key:2},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"总计",2)],64)):"opencode"===e.channelType?(u(),i(T,{key:3},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"推理",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"总计",2)],64)):r("",!0),d("div",{class:k(["log-col col-time",`col-time-${e.channelType}`])},"时间",2)],2),d("div",{class:"logs-container",ref_key:"logsContainer",ref:ul},[0===vl.value.length?(u(),i("div",va,[v(h(se),{size:32,depth:"3",style:{"margin-bottom":"8px"}},{default:p(()=>[v(h(Q))]),_:1}),v(h(ie),{depth:"3",style:{"font-size":"12px","font-weight":"500"}},{default:p(()=>[...l[25]||(l[25]=[f("暂无实时日志",-1)])]),_:1}),v(h(ie),{depth:"3",style:{"font-size":"11px","margin-top":"4px"}},{default:p(()=>[...l[26]||(l[26]=[f("开启代理后将显示请求记录",-1)])]),_:1})])):r("",!0),(u(!0),i(T,null,b(vl.value,a=>(u(),i("div",{key:a.id,class:k(["log-row",{"action-row":"action"===a.type,"error-row":"error"===a.status,"new-log":a.isNew}]),title:$l(a)},["action"===a.type?(u(),i("div",ha,[v(h(se),{size:12,color:"#18a058"},{default:p(()=>[v(h(ae))]),_:1}),d("span",ya,m(a.message),1),d("span",ga,m(a.time),1)])):"error"===a.status?(u(),i("div",ma,[v(h(se),{size:12,color:"#d03050"},{default:p(()=>[v(h(le))]),_:1}),d("span",fa,m(a.channel)+": "+m(a.error||a.message||"请求失败"),1),d("span",ka,m(a.time),1)])):(u(),i(T,{key:2},[d("div",{class:k(["log-col col-channel",`col-channel-${e.channelType}`])},[v(h(ue),{size:"tiny",type:"success"},{default:p(()=>[f(m(a.channel),1)]),_:2},1024)],2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"input")),3),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"output")),3),"claude"===e.channelType?(u(),i(T,{key:0},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"cacheCreation")),3),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"cacheRead")),3)],64)):"codex"===e.channelType?(u(),i(T,{key:1},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"reasoning")),3),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"cached")),3),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"total")),3)],64)):"gemini"===e.channelType?(u(),i(T,{key:2},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"cached")),3),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"total")),3)],64)):"opencode"===e.channelType?(u(),i(T,{key:3},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"reasoning")),3),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"cached")),3),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},m(Cl(a,"total")),3)],64)):r("",!0),d("div",{class:k(["log-col col-time",`col-time-${e.channelType}`])},m(a.time),3)],64))],10,pa))),128))],512)])])])):r("",!0)])),nl.value?(u(),i("div",{key:1,class:k(["locked-overlay",`locked-${e.channelType}`])},[d("div",Ta,[d("div",ba,[v(h(se),{size:48},{default:p(()=>[v(h(R))]),_:1})]),l[28]||(l[28]=d("h3",{class:"locked-title"},"该渠道已锁定",-1)),v(h(ie),{depth:"3",class:"locked-hint"},{default:p(()=>[...l[27]||(l[27]=[f(" 点击上方按钮解锁以查看内容 ",-1)])]),_:1})])],2)):r("",!0),v(q,{visible:al.value,"onUpdate:visible":l[2]||(l[2]=e=>al.value=e),channel:e.channelType},null,8,["visible","channel"])]);var s,c}}},[["__scopeId","data-v-849862db"]]),Ca=n({theme:"light",panelVisibility:{showChannels:!0,showLogs:!0},channelBalance:{showRemaining:!1},channelLocks:{claude:!1,codex:!1,gemini:!1},channelCollapse:{claude:[],codex:[],gemini:[]},channelOrder:{claude:[],codex:[],gemini:[]}});let $a=!1,_a=null;async function qa(){return $a?Ca.value:_a||(_a=(async()=>{try{const e=await j();e.success&&e.config&&(Ca.value=e.config,$a=!0)}catch(e){}finally{_a=null}return Ca.value})(),_a)}const za={class:"dashboard-container"},Sa="dashboardChannelOrder",La=C({__name:"Home",setup(a){const l=["claude","codex","gemini","opencode"],{uiConfig:s,updateConfig:t,loadUIConfig:o}=($a||qa(),{uiConfig:Ca,loadUIConfig:qa,saveConfig:async function(e){try{const a=await P(e);return!!a.success&&(Ca.value=a.config,!0)}catch(a){return!1}},updateConfig:async function(e,a){try{const l=await D(e,a);return!!l.success&&(Ca.value=l.config,!0)}catch(l){return!1}},updateNestedConfig:async function(e,a,l){try{const n=await F(e,a,l);return!!n.success&&(Ca.value=n.config,!0)}catch(n){return!1}}});function d(e){try{localStorage.setItem(Sa,JSON.stringify(e))}catch(a){}}const r=n(function(){try{const e=localStorage.getItem(Sa);if(e){const a=JSON.parse(e);if(Array.isArray(a)&&4===a.length)return a}}catch(e){}return l}().map(e=>({type:e})));async function g(){const e=r.value.map(e=>e.type);d(e),await t("dashboardChannelOrder",e)}return c(async()=>{if(await o(),s.value.dashboardChannelOrder&&Array.isArray(s.value.dashboardChannelOrder)&&4===s.value.dashboardChannelOrder.length){const e=s.value.dashboardChannelOrder;r.value=e.map(e=>({type:e})),d(e)}}),(a,l)=>(u(),i("div",za,[v(h(e),{modelValue:r.value,"onUpdate:modelValue":l[0]||(l[0]=e=>r.value=e),class:"dashboard-grid","item-key":"type",animation:200,handle:".drag-handle",onEnd:g},{item:p(({element:e})=>[(u(),y(wa,{"channel-type":e.type,key:e.type},null,8,["channel-type"]))]),_:1},8,["modelValue"])]))}},[["__scopeId","data-v-a6410dd2"]]);export{La as default};
@@ -1 +1 @@
1
- import{_ as a,P as s}from"./index-gIbIMdSO.js";import{c as r,o as e,X as o,Z as i,N as d}from"./vue-vendor-C5aMkRmm.js";import{K as n}from"./naive-ui-Cjh6GLto.js";import"./icons-U50_Cfbe.js";import"./vendors--KP7Ux0s.js";import"./markdown-BNJfEgCA.js";const t={class:"plugin-manager"},m=a({__name:"PluginManager",setup:a=>(a,m)=>(e(),r("div",t,[o(d(n),{title:"Plugins 插件管理",bordered:!1},{default:i(()=>[o(s,{"in-drawer":!1,"hide-back":!0})]),_:1})]))},[["__scopeId","data-v-6d92033b"]]);export{m as default};
1
+ import{_ as a,P as s}from"./index-BsdIJwLf.js";import{c as r,o as e,X as o,Y as i,N as d}from"./vue-vendor-B5RqjEjQ.js";import{K as n}from"./naive-ui-DM897mIP.js";import"./icons-QFXzEgqM.js";import"./vendors-DQA4Hw9v.js";import"./markdown-BNJfEgCA.js";const t={class:"plugin-manager"},m=a({__name:"PluginManager",setup:a=>(a,m)=>(e(),r("div",t,[o(d(n),{title:"Plugins 插件管理",bordered:!1},{default:i(()=>[o(s,{"in-drawer":!1,"hide-back":!0})]),_:1})]))},[["__scopeId","data-v-6d92033b"]]);export{m as default};
@@ -1 +1 @@
1
- import{r as e,f as a,c as t,o as s,a as l,X as n,s as o,Z as r,N as c,$ as i,G as u,_ as d,p,Y as v,W as m,a8 as f,a5 as h,w as y,h as g,K as _,F as k,a0 as j,a6 as w,R as x,v as C}from"./vue-vendor-C5aMkRmm.js";import{d as b}from"./vendors--KP7Ux0s.js";import{_ as $,m as z,n as L,o as N,p as P,q as M,r as D}from"./index-gIbIMdSO.js";import{a8 as I,T,d as E,ac as K,h as U}from"./icons-U50_Cfbe.js";import{N as R,B as q,c as V,a as H,_ as O,q as S,n as A,g as B,x as F,h as G,p as W}from"./naive-ui-Cjh6GLto.js";import"./markdown-BNJfEgCA.js";const X={class:"card-content"},Y={class:"header-row"},Z={class:"project-name"},J={class:"stats-row"},Q=$({__name:"ProjectCard",props:{project:{type:Object,required:!0}},emits:["click","delete"],setup(f,{emit:h}){const y=f,g=h,_=e(!1);function k(){g("click")}function j(){g("delete",y.project)}const w=a(()=>{var e,a;return(null==(e=y.project)?void 0:e.displayName)||(null==(a=y.project)?void 0:a.name)||""}),x=a(()=>{var e,a,t;return(null==(e=y.project)?void 0:e.path)||(null==(a=y.project)?void 0:a.fullPath)||(null==(t=y.project)?void 0:t.name)||""}),C=a(()=>{var e;return(null==(e=y.project)?void 0:e.sessionCount)||0}),b=a(()=>{var e;return null==(e=y.project)?void 0:e.lastUsed}),$=a(()=>{var e;const a=["#18a058","#2080f0","#f0a020","#d03050","#9333ea","#06b6d4"];return a[((null==(e=y.project)?void 0:e.name)||"").split("").reduce((e,a)=>e+a.charCodeAt(0),0)%a.length]});function z(e){if(!e)return"";const a=new Date(e),t=new Date-a;return t<6e4?"刚刚":t<36e5?`${Math.floor(t/6e4)}分钟前`:t<864e5?`${Math.floor(t/36e5)}小时前`:t<6048e5?`${Math.floor(t/864e5)}天前`:a.toLocaleDateString("zh-CN")}return(e,a)=>(s(),t("div",{class:"project-card",onClick:k,onMouseenter:a[0]||(a[0]=e=>_.value=!0),onMouseleave:a[1]||(a[1]=e=>_.value=!1)},[l("div",X,[l("div",Y,[n(c(R),{size:"18",color:$.value},{default:r(()=>[n(c(I))]),_:1},8,["color"]),l("span",Z,i(w.value),1),o(n(c(q),{text:"",type:"error",size:"tiny",class:"delete-btn",onClick:d(j,["stop"])},{icon:r(()=>[n(c(R),{size:"14"},{default:r(()=>[n(c(T))]),_:1})]),_:1},512),[[u,_.value]])]),n(c(V),{depth:"3",class:"project-path"},{default:r(()=>[p(i(x.value),1)]),_:1}),l("div",J,[n(c(H),{size:"tiny",bordered:!1,type:"success"},{default:r(()=>[p(i(C.value)+" 会话 ",1)]),_:1}),b.value?(s(),v(c(V),{key:0,depth:"3",class:"last-used"},{default:r(()=>[p(i(z(b.value)),1)]),_:1})):m("",!0)])])],32))}},[["__scopeId","data-v-3a18e66d"]]),ee={class:"project-list-container"},ae={class:"header"},te={class:"header-text"},se={key:0,class:"loading-container"},le={key:3,class:"projects-grid"},ne={class:"search-hint"},oe={style:{"margin-bottom":"16px"}},re={key:0,style:{"max-height":"60vh","overflow-y":"auto"}},ce={class:"search-result-header"},ie={class:"search-result-title"},ue=$({__name:"ProjectList",setup(o){const u=f(),d=h(),$=z(),T=a(()=>d.meta.channel||"claude"),X=e(""),Y=e([]),Z=e(null),J=e(!1),ue=e(""),de=e(null),pe=e(!1),ve=e(null),me=a(()=>{const e=X.value.toLowerCase();return Y.value.filter(a=>{const t=(a.displayName||"").toLowerCase(),s=(a.fullPath||"").toLowerCase();return t.includes(e)||s.includes(e)})});function fe(e){const a=d.meta.channel||"claude";u.push({name:`${a}-sessions`,params:{projectName:e}})}async function he(){const e=Y.value.map(e=>e.name);await $.saveProjectOrder(e)}function ye(e){const a=e.fullPath||e.name,t=e.sessionCount||0;P.warning({title:"删除项目",content:`确定要删除项目 "${a}" 吗?\n\n当前项目包含 ${t} 个会话,删除后所有会话数据将无法恢复!`,positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{try{await $.deleteProject(e.name),N.success("项目已删除")}catch(a){N.error("删除失败: "+a.message)}}})}async function ge(){try{const a="codex"===(e=T.value||"claude")?"codex":"gemini"===e?"gemini":"opencode"===e?"opencode":"claude",t=await L(a);if("manual"===(null==t?void 0:t.method))return void N.warning("自动复制失败,已弹出手动复制框");N.success("基础启动命令已复制到剪贴板")}catch(a){N.error("复制失败: "+a.message)}var e}async function _e(){if(ue.value){pe.value=!0;try{const e=await M(ue.value,35,T.value);de.value=e}catch(e){N.error("搜索失败: "+e.message)}finally{pe.value=!1}}}function ke(e,a){if(!a||!e)return e;const t=new RegExp(`(${a})`,"gi");return e.replace(t,'<mark style="background-color: #ffd700; padding: 2px 4px; border-radius: 2px; font-weight: 600;">$1</mark>')}function je(e){(e.metaKey||e.ctrlKey)&&"k"===e.key&&(e.preventDefault(),J.value=!0,C(()=>{var e;null==(e=ve.value)||e.focus()}))}return y(()=>$.projects,e=>{Y.value=[...e]},{immediate:!0}),y(J,e=>{e||(ue.value="",de.value=null)}),y(T,e=>{$.setChannel(e),$.fetchProjects()},{immediate:!0}),g(()=>{document.addEventListener("keydown",je)}),_(()=>{document.removeEventListener("keydown",je)}),(e,a)=>(s(),t("div",ee,[l("div",ae,[l("div",te,[n(c(O),{style:{margin:"0"}},{default:r(()=>[...a[4]||(a[4]=[p("我的项目",-1)])]),_:1}),n(c(V),{depth:"3"},{default:r(()=>[...a[5]||(a[5]=[p("选择一个项目查看会话,拖拽可调整顺序",-1)])]),_:1})]),n(c(A),null,{default:r(()=>[n(c(q),{type:"primary",size:"medium",onClick:ge},{icon:r(()=>[n(c(R),null,{default:r(()=>[n(c(E))]),_:1})]),default:r(()=>[a[6]||(a[6]=p(" 新建项目 ",-1))]),_:1}),n(c(S),{value:X.value,"onUpdate:value":a[0]||(a[0]=e=>X.value=e),placeholder:"搜索项目...",clearable:"",class:"search-input"},{prefix:r(()=>[n(c(R),null,{default:r(()=>[n(c(K))]),_:1})]),_:1},8,["value"])]),_:1})]),l("div",{class:"content",ref_key:"contentEl",ref:Z},[c($).loading?(s(),t("div",se,[n(c(B),{size:"large"},{description:r(()=>[...a[7]||(a[7]=[p(" 加载项目列表... ",-1)])]),_:1})])):c($).error?(s(),v(c(F),{key:1,type:"error",title:"加载失败",style:{"margin-top":"20px"}},{default:r(()=>[p(i(c($).error),1)]),_:1})):X.value?(s(),t("div",le,[(s(!0),t(k,null,j(me.value,e=>(s(),v(Q,{key:e.name,project:e,onClick:a=>fe(e.name),onDelete:ye},null,8,["project","onClick"]))),128))])):(s(),v(c(b),{key:2,modelValue:Y.value,"onUpdate:modelValue":a[1]||(a[1]=e=>Y.value=e),"item-key":"name",class:"projects-grid","ghost-class":"ghost","chosen-class":"chosen","drag-class":"drag",animation:"200",onEnd:he},{item:r(({element:e})=>[n(Q,{project:e,onClick:a=>fe(e.name),onDelete:ye},null,8,["project","onClick"])]),_:1},8,["modelValue"])),c($).loading||c($).error||0!==c($).projects.length?m("",!0):(s(),v(c(G),{key:4,description:"没有找到项目",style:{"margin-top":"60px"}},{icon:r(()=>[n(c(R),null,{default:r(()=>[n(c(I))]),_:1})]),_:1}))],512),l("div",ne,[n(c(V),{depth:"3",style:{"font-size":"12px"}},{default:r(()=>[...a[8]||(a[8]=[l("kbd",null,"Cmd",-1),p(" / ",-1),l("kbd",null,"Ctrl",-1),p(" + ",-1),l("kbd",null,"K",-1),p(" 全局搜索 ",-1)])]),_:1})]),n(c(W),{show:J.value,"onUpdate:show":a[3]||(a[3]=e=>J.value=e),preset:"card",title:"全局搜索",style:x([{width:"800px","max-width":"90vw"},{marginTop:"80px"}])},{default:r(()=>[l("div",oe,[n(c(S),{ref_key:"globalSearchInputRef",ref:ve,value:ue.value,"onUpdate:value":a[2]||(a[2]=e=>ue.value=e),placeholder:"搜索所有项目的对话内容...",clearable:"",onKeyup:w(_e,["enter"]),disabled:pe.value},{prefix:r(()=>[n(c(R),null,{default:r(()=>[n(c(K))]),_:1})]),suffix:r(()=>[n(c(q),{text:"",onClick:_e,disabled:!ue.value||pe.value,loading:pe.value},{default:r(()=>[...a[9]||(a[9]=[p(" 搜索 ",-1)])]),_:1},8,["disabled","loading"])]),_:1},8,["value","disabled"])]),de.value?(s(),t("div",re,[n(c(F),{type:"info",style:{"margin-bottom":"16px"}},{default:r(()=>[p(' 关键词 "'+i(de.value.keyword)+'" 共找到 '+i(de.value.totalMatches)+" 处匹配 ",1)]),_:1}),(s(!0),t(k,null,j(de.value.sessions,e=>(s(),t("div",{key:`${e.projectName}-${e.sessionId}`,class:"search-result-item"},[l("div",ce,[l("div",ie,[n(c(V),{strong:"",style:{"font-size":"15px","font-weight":"700"}},{default:r(()=>[p(i(e.projectDisplayName),1)]),_:2},1024),n(c(V),{depth:"2",style:{margin:"0 8px"}},{default:r(()=>[...a[10]||(a[10]=[p("·",-1)])]),_:1}),n(c(V),{strong:""},{default:r(()=>[p(i(e.alias?`${e.alias} (${e.sessionId.substring(0,8)})`:e.sessionId.substring(0,8)),1)]),_:2},1024),n(c(H),{size:"small",bordered:!1},{default:r(()=>[p(i(e.matchCount)+" 个匹配",1)]),_:2},1024)]),n(c(q),{size:"small",type:"primary",onClick:a=>async function(e,a){try{const{copyResult:t}=await D(e,a,T.value);"manual"===(null==t?void 0:t.method)?N.warning("自动复制失败,已弹出手动复制框"):N.success("启动命令已复制到剪贴板"),J.value=!1}catch(t){N.error("复制失败: "+t.message)}}(e.projectName,e.sessionId)},{icon:r(()=>[n(c(R),null,{default:r(()=>[n(c(U))]),_:1})]),default:r(()=>[a[11]||(a[11]=p(" 使用对话 ",-1))]),_:1},8,["onClick"])]),(s(!0),t(k,null,j(e.matches,(e,a)=>(s(),t("div",{key:a,class:"search-match"},[n(c(H),{size:"tiny",type:"user"===e.role?"info":"success",bordered:!1},{default:r(()=>[p(i("user"===e.role?"用户":"助手"),1)]),_:2},1032,["type"]),n(c(V),{depth:"3",class:"search-match-text",innerHTML:ke(e.context,de.value.keyword)},null,8,["innerHTML"])]))),128))]))),128)),0===de.value.sessions.length?(s(),v(c(G),{key:0,description:"没有找到匹配的内容"})):m("",!0)])):m("",!0)]),_:1},8,["show"])]))}},[["__scopeId","data-v-23cf7fe1"]]);export{ue as default};
1
+ import{r as e,f as a,c as t,o as s,a as l,X as n,s as o,Y as r,N as c,_ as i,G as u,Z as d,p,a0 as v,W as m,a8 as f,a5 as h,w as y,h as g,K as _,F as k,$ as j,a6 as w,R as x,v as C}from"./vue-vendor-B5RqjEjQ.js";import{d as b}from"./vendors-DQA4Hw9v.js";import{_ as $,m as z,n as L,o as N,p as P,q as M,r as D}from"./index-BsdIJwLf.js";import{a8 as I,T,d as E,ac as K,h as U}from"./icons-QFXzEgqM.js";import{N as R,B as q,c as V,a as H,_ as O,q as S,n as A,g as B,x as F,h as G,p as W}from"./naive-ui-DM897mIP.js";import"./markdown-BNJfEgCA.js";const X={class:"card-content"},Y={class:"header-row"},Z={class:"project-name"},J={class:"stats-row"},Q=$({__name:"ProjectCard",props:{project:{type:Object,required:!0}},emits:["click","delete"],setup(f,{emit:h}){const y=f,g=h,_=e(!1);function k(){g("click")}function j(){g("delete",y.project)}const w=a(()=>{var e,a;return(null==(e=y.project)?void 0:e.displayName)||(null==(a=y.project)?void 0:a.name)||""}),x=a(()=>{var e,a,t;return(null==(e=y.project)?void 0:e.path)||(null==(a=y.project)?void 0:a.fullPath)||(null==(t=y.project)?void 0:t.name)||""}),C=a(()=>{var e;return(null==(e=y.project)?void 0:e.sessionCount)||0}),b=a(()=>{var e;return null==(e=y.project)?void 0:e.lastUsed}),$=a(()=>{var e;const a=["#18a058","#2080f0","#f0a020","#d03050","#9333ea","#06b6d4"];return a[((null==(e=y.project)?void 0:e.name)||"").split("").reduce((e,a)=>e+a.charCodeAt(0),0)%a.length]});function z(e){if(!e)return"";const a=new Date(e),t=new Date-a;return t<6e4?"刚刚":t<36e5?`${Math.floor(t/6e4)}分钟前`:t<864e5?`${Math.floor(t/36e5)}小时前`:t<6048e5?`${Math.floor(t/864e5)}天前`:a.toLocaleDateString("zh-CN")}return(e,a)=>(s(),t("div",{class:"project-card",onClick:k,onMouseenter:a[0]||(a[0]=e=>_.value=!0),onMouseleave:a[1]||(a[1]=e=>_.value=!1)},[l("div",X,[l("div",Y,[n(c(R),{size:"18",color:$.value},{default:r(()=>[n(c(I))]),_:1},8,["color"]),l("span",Z,i(w.value),1),o(n(c(q),{text:"",type:"error",size:"tiny",class:"delete-btn",onClick:d(j,["stop"])},{icon:r(()=>[n(c(R),{size:"14"},{default:r(()=>[n(c(T))]),_:1})]),_:1},512),[[u,_.value]])]),n(c(V),{depth:"3",class:"project-path"},{default:r(()=>[p(i(x.value),1)]),_:1}),l("div",J,[n(c(H),{size:"tiny",bordered:!1,type:"success"},{default:r(()=>[p(i(C.value)+" 会话 ",1)]),_:1}),b.value?(s(),v(c(V),{key:0,depth:"3",class:"last-used"},{default:r(()=>[p(i(z(b.value)),1)]),_:1})):m("",!0)])])],32))}},[["__scopeId","data-v-3a18e66d"]]),ee={class:"project-list-container"},ae={class:"header"},te={class:"header-text"},se={key:0,class:"loading-container"},le={key:3,class:"projects-grid"},ne={class:"search-hint"},oe={style:{"margin-bottom":"16px"}},re={key:0,style:{"max-height":"60vh","overflow-y":"auto"}},ce={class:"search-result-header"},ie={class:"search-result-title"},ue=$({__name:"ProjectList",setup(o){const u=f(),d=h(),$=z(),T=a(()=>d.meta.channel||"claude"),X=e(""),Y=e([]),Z=e(null),J=e(!1),ue=e(""),de=e(null),pe=e(!1),ve=e(null),me=a(()=>{const e=X.value.toLowerCase();return Y.value.filter(a=>{const t=(a.displayName||"").toLowerCase(),s=(a.fullPath||"").toLowerCase();return t.includes(e)||s.includes(e)})});function fe(e){const a=d.meta.channel||"claude";u.push({name:`${a}-sessions`,params:{projectName:e}})}async function he(){const e=Y.value.map(e=>e.name);await $.saveProjectOrder(e)}function ye(e){const a=e.fullPath||e.name,t=e.sessionCount||0;P.warning({title:"删除项目",content:`确定要删除项目 "${a}" 吗?\n\n当前项目包含 ${t} 个会话,删除后所有会话数据将无法恢复!`,positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{try{await $.deleteProject(e.name),N.success("项目已删除")}catch(a){N.error("删除失败: "+a.message)}}})}async function ge(){try{const a="codex"===(e=T.value||"claude")?"codex":"gemini"===e?"gemini":"opencode"===e?"opencode":"claude",t=await L(a);if("manual"===(null==t?void 0:t.method))return void N.warning("自动复制失败,已弹出手动复制框");N.success("基础启动命令已复制到剪贴板")}catch(a){N.error("复制失败: "+a.message)}var e}async function _e(){if(ue.value){pe.value=!0;try{const e=await M(ue.value,35,T.value);de.value=e}catch(e){N.error("搜索失败: "+e.message)}finally{pe.value=!1}}}function ke(e,a){if(!a||!e)return e;const t=new RegExp(`(${a})`,"gi");return e.replace(t,'<mark style="background-color: #ffd700; padding: 2px 4px; border-radius: 2px; font-weight: 600;">$1</mark>')}function je(e){(e.metaKey||e.ctrlKey)&&"k"===e.key&&(e.preventDefault(),J.value=!0,C(()=>{var e;null==(e=ve.value)||e.focus()}))}return y(()=>$.projects,e=>{Y.value=[...e]},{immediate:!0}),y(J,e=>{e||(ue.value="",de.value=null)}),y(T,e=>{$.setChannel(e),$.fetchProjects()},{immediate:!0}),g(()=>{document.addEventListener("keydown",je)}),_(()=>{document.removeEventListener("keydown",je)}),(e,a)=>(s(),t("div",ee,[l("div",ae,[l("div",te,[n(c(O),{style:{margin:"0"}},{default:r(()=>[...a[4]||(a[4]=[p("我的项目",-1)])]),_:1}),n(c(V),{depth:"3"},{default:r(()=>[...a[5]||(a[5]=[p("选择一个项目查看会话,拖拽可调整顺序",-1)])]),_:1})]),n(c(A),null,{default:r(()=>[n(c(q),{type:"primary",size:"medium",onClick:ge},{icon:r(()=>[n(c(R),null,{default:r(()=>[n(c(E))]),_:1})]),default:r(()=>[a[6]||(a[6]=p(" 新建项目 ",-1))]),_:1}),n(c(S),{value:X.value,"onUpdate:value":a[0]||(a[0]=e=>X.value=e),placeholder:"搜索项目...",clearable:"",class:"search-input"},{prefix:r(()=>[n(c(R),null,{default:r(()=>[n(c(K))]),_:1})]),_:1},8,["value"])]),_:1})]),l("div",{class:"content",ref_key:"contentEl",ref:Z},[c($).loading?(s(),t("div",se,[n(c(B),{size:"large"},{description:r(()=>[...a[7]||(a[7]=[p(" 加载项目列表... ",-1)])]),_:1})])):c($).error?(s(),v(c(F),{key:1,type:"error",title:"加载失败",style:{"margin-top":"20px"}},{default:r(()=>[p(i(c($).error),1)]),_:1})):X.value?(s(),t("div",le,[(s(!0),t(k,null,j(me.value,e=>(s(),v(Q,{key:e.name,project:e,onClick:a=>fe(e.name),onDelete:ye},null,8,["project","onClick"]))),128))])):(s(),v(c(b),{key:2,modelValue:Y.value,"onUpdate:modelValue":a[1]||(a[1]=e=>Y.value=e),"item-key":"name",class:"projects-grid","ghost-class":"ghost","chosen-class":"chosen","drag-class":"drag",animation:"200",onEnd:he},{item:r(({element:e})=>[n(Q,{project:e,onClick:a=>fe(e.name),onDelete:ye},null,8,["project","onClick"])]),_:1},8,["modelValue"])),c($).loading||c($).error||0!==c($).projects.length?m("",!0):(s(),v(c(G),{key:4,description:"没有找到项目",style:{"margin-top":"60px"}},{icon:r(()=>[n(c(R),null,{default:r(()=>[n(c(I))]),_:1})]),_:1}))],512),l("div",ne,[n(c(V),{depth:"3",style:{"font-size":"12px"}},{default:r(()=>[...a[8]||(a[8]=[l("kbd",null,"Cmd",-1),p(" / ",-1),l("kbd",null,"Ctrl",-1),p(" + ",-1),l("kbd",null,"K",-1),p(" 全局搜索 ",-1)])]),_:1})]),n(c(W),{show:J.value,"onUpdate:show":a[3]||(a[3]=e=>J.value=e),preset:"card",title:"全局搜索",style:x([{width:"800px","max-width":"90vw"},{marginTop:"80px"}])},{default:r(()=>[l("div",oe,[n(c(S),{ref_key:"globalSearchInputRef",ref:ve,value:ue.value,"onUpdate:value":a[2]||(a[2]=e=>ue.value=e),placeholder:"搜索所有项目的对话内容...",clearable:"",onKeyup:w(_e,["enter"]),disabled:pe.value},{prefix:r(()=>[n(c(R),null,{default:r(()=>[n(c(K))]),_:1})]),suffix:r(()=>[n(c(q),{text:"",onClick:_e,disabled:!ue.value||pe.value,loading:pe.value},{default:r(()=>[...a[9]||(a[9]=[p(" 搜索 ",-1)])]),_:1},8,["disabled","loading"])]),_:1},8,["value","disabled"])]),de.value?(s(),t("div",re,[n(c(F),{type:"info",style:{"margin-bottom":"16px"}},{default:r(()=>[p(' 关键词 "'+i(de.value.keyword)+'" 共找到 '+i(de.value.totalMatches)+" 处匹配 ",1)]),_:1}),(s(!0),t(k,null,j(de.value.sessions,e=>(s(),t("div",{key:`${e.projectName}-${e.sessionId}`,class:"search-result-item"},[l("div",ce,[l("div",ie,[n(c(V),{strong:"",style:{"font-size":"15px","font-weight":"700"}},{default:r(()=>[p(i(e.projectDisplayName),1)]),_:2},1024),n(c(V),{depth:"2",style:{margin:"0 8px"}},{default:r(()=>[...a[10]||(a[10]=[p("·",-1)])]),_:1}),n(c(V),{strong:""},{default:r(()=>[p(i(e.alias?`${e.alias} (${e.sessionId.substring(0,8)})`:e.sessionId.substring(0,8)),1)]),_:2},1024),n(c(H),{size:"small",bordered:!1},{default:r(()=>[p(i(e.matchCount)+" 个匹配",1)]),_:2},1024)]),n(c(q),{size:"small",type:"primary",onClick:a=>async function(e,a){try{const{copyResult:t}=await D(e,a,T.value);"manual"===(null==t?void 0:t.method)?N.warning("自动复制失败,已弹出手动复制框"):N.success("启动命令已复制到剪贴板"),J.value=!1}catch(t){N.error("复制失败: "+t.message)}}(e.projectName,e.sessionId)},{icon:r(()=>[n(c(R),null,{default:r(()=>[n(c(U))]),_:1})]),default:r(()=>[a[11]||(a[11]=p(" 使用对话 ",-1))]),_:1},8,["onClick"])]),(s(!0),t(k,null,j(e.matches,(e,a)=>(s(),t("div",{key:a,class:"search-match"},[n(c(H),{size:"tiny",type:"user"===e.role?"info":"success",bordered:!1},{default:r(()=>[p(i("user"===e.role?"用户":"助手"),1)]),_:2},1032,["type"]),n(c(V),{depth:"3",class:"search-match-text",innerHTML:ke(e.context,de.value.keyword)},null,8,["innerHTML"])]))),128))]))),128)),0===de.value.sessions.length?(s(),v(c(G),{key:0,description:"没有找到匹配的内容"})):m("",!0)])):m("",!0)]),_:1},8,["show"])]))}},[["__scopeId","data-v-23cf7fe1"]]);export{ue as default};
@@ -0,0 +1 @@
1
+ import{a8 as e,a5 as a,f as s,r as l,w as t,h as n,K as i,c as o,o as u,a as r,X as d,a0 as c,W as v,Y as f,N as p,p as m,_ as h,F as y,a6 as g,L as k,Z as _,s as w,G as b,y as I,$ as C,v as j}from"./vue-vendor-B5RqjEjQ.js";import{d as z}from"./vendors-DQA4Hw9v.js";import{_ as x,m as N,t as F,C as S,v as $,o as M,p as B,w as U,r as L}from"./index-BsdIJwLf.js";import{X as P,T,ac as A,ax as E,j as K,G as V,a2 as G,ay as H,p as O,h as R,V as q}from"./icons-QFXzEgqM.js";import{N as D,B as W,_ as X,c as Y,a as Z,G as J,q as Q,g as ee,x as ae,s as se,n as le,h as te,p as ne,k as ie}from"./naive-ui-DM897mIP.js";import"./markdown-BNJfEgCA.js";const oe={class:"session-list-container"},ue={class:"header"},re={class:"title-bar"},de={class:"title-section"},ce={class:"title-with-count"},ve={class:"header-actions"},fe={key:0,class:"loading-container"},pe=["onMouseenter","onClick"],me={key:0,class:"drag-handle"},he={class:"session-left"},ye={class:"session-icon"},ge={class:"session-info"},ke={class:"session-header"},_e={class:"session-title-row"},we={class:"session-title"},be={class:"session-meta"},Ie={class:"session-right"},Ce={class:"session-tags-area"},je={key:0,class:"session-actions"},ze={key:0,style:{"max-height":"70vh","overflow-y":"auto"}},xe={class:"search-result-header"},Ne={class:"search-result-title"},Fe="__full__",Se=x({__name:"SessionList",props:{projectName:{type:String,required:!0}},setup(x){const Se=x,$e=e(),Me=a(),Be=N(),{addFavorite:Ue,removeFavorite:Le,isFavorite:Pe}=F(),Te=s(()=>Me.meta.channel||"claude"),Ae=l(Se.projectName),Ee=s(()=>Ae.value||Se.projectName),Ke=l(""),Ve=l(!1),Ge=l(null),He=l(""),Oe=l(null),Re=l([]),qe=l(null),De=l(!1),We=l(null),Xe=l(!1),Ye=l(!1),Ze=l([]),Je=l(!1),Qe=l(!1),ea=l(null),aa=l(""),sa=l(Fe),la=l(!1),ta=l(!1),na=l([]),ia=l(!1),oa=l(""),ua=l(""),ra=l(null),da={group:{name:`${Te.value}-sessions`,pull:!1,put:!1},forceFallback:!0,fallbackOnBody:!1,fallbackTolerance:4,scroll:!0},ca=s(()=>{var e;return(null==(e=Be.currentProjectInfo)?void 0:e.displayName)||Se.projectName}),va=s(()=>{var e;return(null==(e=Be.currentProjectInfo)?void 0:e.fullPath)||Ee.value}),fa=s(()=>new Set(Ze.value)),pa=s(()=>Ze.value.length),ma=s(()=>Re.value.length>0&&Re.value.every(e=>fa.value.has(e.sessionId))),ha=s(()=>pa.value>0&&!ma.value);async function ya(){const e=await async function(){Be.projects.length||await Be.fetchProjects();const e=Be.projects.find(e=>e.name===Se.projectName);if(e)return Ae.value=e.name,e.name;const a=Be.projects.find(e=>e.displayName===Se.projectName||e.fullPath===Se.projectName);return a?(Ae.value=a.name,a.name!==Se.projectName&&await $e.replace({name:`${Te.value}-sessions`,params:{projectName:a.name}}),a.name):(Ae.value=Se.projectName,Se.projectName)}();await Be.fetchSessions(e)}t(()=>Be.sessionsWithAlias,e=>{Re.value=[...e];const a=new Set(e.map(e=>e.sessionId));Ze.value=Ze.value.filter(e=>a.has(e)),Ye.value&&0===e.length&&Ia()},{immediate:!0});const ga=s(()=>{if(!Ke.value)return Re.value;const e=Ke.value.toLowerCase();return Re.value.filter(a=>a.sessionId.toLowerCase().includes(e)||a.alias&&a.alias.toLowerCase().includes(e)||a.firstMessage&&a.firstMessage.toLowerCase().includes(e)||a.gitBranch&&a.gitBranch.toLowerCase().includes(e))});function ka(){const e=Me.meta.channel||"claude";$e.push({name:`${e}-projects`})}async function _a(){if(Ke.value){Xe.value=!0;try{const e=await $(Ee.value,Ke.value,35,Te.value);qe.value=e,De.value=!0}catch(e){M.error("搜索失败: "+e.message)}finally{Xe.value=!1}}}async function wa(){const e=Re.value.map(e=>e.sessionId);await Be.saveSessionOrder(e)}function ba(){Ye.value=!0,Oe.value=null}function Ia(){Ye.value=!1,Ze.value=[],Oe.value=null}function Ca(e){return fa.value.has(e)}function ja(e,a=!Ca(e)){const s=new Set(Ze.value);a?s.add(e):s.delete(e),Ze.value=Array.from(s)}function za(e){Ze.value=e?Re.value.map(e=>e.sessionId):[]}function xa(e){Ye.value?ja(e.sessionId):function(e){oa.value=e.sessionId,ua.value=e.alias||"",ia.value=!0,j(()=>{var e;null==(e=ra.value)||e.open()})}(e)}async function Na(){if(Ge.value)try{const e=Ge.value.sessionId;He.value?(await Be.setAlias(e,He.value),M.success("别名设置成功")):(await Be.deleteAlias(e),M.success("别名已删除")),Ve.value=!1,Ge.value=null,He.value=""}catch(e){M.error("操作失败: "+e.message)}}function Fa(){Qe.value=!1,ea.value=null,aa.value="",sa.value=Fe,na.value=[],la.value=!1,ta.value=!1}async function Sa(){var e;if(ea.value)try{ta.value=!0,await Be.forkSession(ea.value.sessionId,{afterUserMessageNumber:sa.value===Fe?null:sa.value,alias:(null==(e=aa.value)?void 0:e.trim())||void 0}),M.success("Fork 成功!"),Fa()}catch(a){M.error("Fork 失败: "+a.message)}finally{ta.value=!1}}function $a(e){M.error(e)}function Ma(e){const a=new Set((e||[]).filter(Boolean));0!==a.size&&(Ze.value=Ze.value.filter(e=>!a.has(e)),oa.value&&a.has(oa.value)&&(ia.value=!1,oa.value="",ua.value=""))}async function Ba(e){try{const{copyResult:a}=await L(Ee.value,e,Te.value);if("manual"===(null==a?void 0:a.method))return void M.warning("自动复制失败,已弹出手动复制框");M.success("启动命令已复制到剪贴板")}catch(a){M.error("复制失败: "+a.message)}}function Ua(){if(0===pa.value)return void M.warning("请先选择要删除的会话");const e=[...Ze.value];B.warning({title:"批量删除会话",content:`确定要删除选中的 ${e.length} 个会话吗?此操作不可恢复!`,positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{Je.value=!0;try{const a=await Be.deleteSessions(e);if(Ma(a.deletedSessionIds),0===a.failed.length)return M.success(`已删除 ${a.deletedSessionIds.length} 个会话`),void Ia();Ze.value=a.failed.map(e=>e.sessionId),a.deletedSessionIds.length>0?M.warning(`已删除 ${a.deletedSessionIds.length} 个会话,${a.failed.length} 个删除失败`):M.error(`删除失败: ${a.failed[0].error.message}`)}finally{Je.value=!1}}})}function La(e){if(!e)return"";return new Date(e).toLocaleString("zh-CN")}function Pa(e){if(!e)return"0 B";const a=1024;return e<a?e+" B":e<a*a?(e/a).toFixed(1)+" KB":(e/a/a).toFixed(1)+" MB"}function Ta(e,a){if(!a||!e)return e;const s=new RegExp(`(${a})`,"gi");return e.replace(s,'<mark style="background-color: #ffd700; padding: 2px 4px; border-radius: 2px; font-weight: 600;">$1</mark>')}function Aa(e,a=80){return e?e.length>a?e.substring(0,a)+"...":e:""}return t([Te,()=>Se.projectName],([e])=>{Ia(),Be.setChannel(e),ya()},{immediate:!0}),n(()=>{}),i(()=>{}),(e,a)=>(u(),o("div",oe,[r("div",ue,[r("div",re,[d(p(W),{size:"small",onClick:ka,class:"back-button"},{icon:f(()=>[d(p(D),{size:"18"},{default:f(()=>[d(p(P))]),_:1})]),_:1}),r("div",de,[r("div",ce,[d(p(X),null,{default:f(()=>[m(h(ca.value),1)]),_:1}),d(p(Y),{depth:"3",class:"session-count"},{default:f(()=>[m("("+h(p(Be).sessions.length)+" 个对话)",1)]),_:1}),d(p(Z),{size:"small",bordered:!1,type:"info",class:"total-size-tag"},{default:f(()=>[m(h(Pa(p(Be).totalSize)),1)]),_:1}),r("div",ve,[Ye.value?(u(),o(y,{key:0},[d(p(J),{checked:ma.value,indeterminate:ha.value,disabled:0===Re.value.length||Je.value,"onUpdate:checked":za},{default:f(()=>[...a[12]||(a[12]=[m(" 全选 ",-1)])]),_:1},8,["checked","indeterminate","disabled"]),d(p(Y),{depth:"3"},{default:f(()=>[m("已选 "+h(pa.value)+" 个",1)]),_:1}),d(p(W),{size:"small",type:"error",disabled:0===pa.value,loading:Je.value,onClick:Ua},{icon:f(()=>[d(p(D),null,{default:f(()=>[d(p(T))]),_:1})]),default:f(()=>[a[13]||(a[13]=m(" 删除 ",-1))]),_:1},8,["disabled","loading"]),d(p(W),{size:"small",disabled:Je.value,onClick:Ia},{default:f(()=>[...a[14]||(a[14]=[m(" 完成 ",-1)])]),_:1},8,["disabled"])],64)):(u(),c(p(W),{key:1,size:"small",type:"error",secondary:"",onClick:ba},{icon:f(()=>[d(p(D),null,{default:f(()=>[d(p(T))]),_:1})]),default:f(()=>[a[15]||(a[15]=m(" 管理 ",-1))]),_:1}))])]),d(p(Y),{depth:"3",class:"project-path"},{default:f(()=>[m(h(va.value),1)]),_:1})]),d(p(Q),{value:Ke.value,"onUpdate:value":a[0]||(a[0]=e=>Ke.value=e),placeholder:"搜索会话...",clearable:"",class:"search-input",onKeyup:g(_a,["enter"]),disabled:Xe.value},{prefix:f(()=>[d(p(D),null,{default:f(()=>[d(p(A))]),_:1})]),suffix:f(()=>[d(p(W),{text:"",onClick:_a,disabled:!Ke.value||Xe.value,loading:Xe.value},{default:f(()=>[...a[16]||(a[16]=[m(" 搜索 ",-1)])]),_:1},8,["disabled","loading"])]),_:1},8,["value","disabled"])])]),r("div",{class:"content",ref_key:"contentEl",ref:We},[p(Be).loading?(u(),o("div",fe,[d(p(ee),{size:"large"},{description:f(()=>[...a[17]||(a[17]=[m(" 加载会话列表... ",-1)])]),_:1})])):p(Be).error?(u(),c(p(ae),{key:1,type:"error",title:"加载失败",style:{"margin-bottom":"16px"}},{default:f(()=>[m(h(p(Be).error),1)]),_:1})):ga.value.length>0?(u(),c(p(z),I({key:2,modelValue:Re.value,"onUpdate:modelValue":a[3]||(a[3]=e=>Re.value=e),"item-key":"sessionId",class:"sessions-list",handle:".drag-handle",disabled:Ye.value||Je.value},da,{"ghost-class":"ghost","chosen-class":"chosen",animation:"200",onEnd:wa}),{item:f(({element:e})=>[r("div",{class:k(["session-item",{"session-item-selected":Ca(e.sessionId),"session-item-selection-mode":Ye.value}]),onMouseenter:a=>Oe.value=e.sessionId,onMouseleave:a[2]||(a[2]=e=>Oe.value=null),onClick:a=>xa(e)},[Ye.value?(u(),o("div",{key:1,class:"selection-checkbox",onClick:a[1]||(a[1]=_(()=>{},["stop"]))},[d(p(J),{checked:Ca(e.sessionId),"onUpdate:checked":a=>ja(e.sessionId,a)},null,8,["checked","onUpdate:checked"])])):(u(),o("div",me,[d(p(D),{size:"16",color:"#999"},{default:f(()=>[d(p(E))]),_:1})])),r("div",he,[r("div",ye,[d(p(D),{size:"24",color:"#18a058"},{default:f(()=>[d(p(K))]),_:1})]),r("div",ge,[r("div",ke,[r("div",_e,[r("span",we,h(e.alias?`${e.alias} (${e.sessionId.substring(0,8)})`:e.sessionId),1),e.forkedFrom?(u(),c(p(se),{key:0,placement:"top"},{trigger:f(()=>[d(p(Z),{size:"small",type:"warning",bordered:!1,style:{"margin-left":"8px",cursor:"help"}},{icon:f(()=>[d(p(D),null,{default:f(()=>[d(p(V))]),_:1})]),default:f(()=>[a[18]||(a[18]=m(" Fork ",-1))]),_:1})]),default:f(()=>[m(" Fork 自: "+h(e.forkedFrom),1)]),_:2},1024)):v("",!0)])]),r("div",be,[d(p(Y),{depth:"3"},{default:f(()=>[m(h(La(e.mtime)),1)]),_:2},1024),d(p(Y),{depth:"3"},{default:f(()=>[...a[19]||(a[19]=[m("•",-1)])]),_:1}),d(p(Z),{size:"small",bordered:!1},{default:f(()=>[m(h(Pa(e.size)),1)]),_:2},1024)]),e.firstMessage?(u(),c(p(Y),{key:0,depth:"3",class:"session-message"},{default:f(()=>[m(h(Aa(e.firstMessage,80)),1)]),_:2},1024)):e.gitBranch||e.summary?v("",!0):(u(),c(p(Y),{key:1,depth:"3",class:"session-message session-message-empty"},{default:f(()=>[...a[20]||(a[20]=[m(" 暂未读取到对话内容 ",-1)])]),_:1}))])]),r("div",Ie,[r("div",Ce,[e.gitBranch?(u(),c(p(Z),{key:0,size:"small",type:"info",bordered:!1},{icon:f(()=>[d(p(D),null,{default:f(()=>[d(p(V))]),_:1})]),default:f(()=>[m(" "+h(e.gitBranch),1)]),_:2},1024)):v("",!0)]),Ye.value?v("",!0):(u(),o("div",je,[d(p(le),null,{default:f(()=>[w(d(p(W),{size:"small",type:"error",onClick:_(a=>{return s=e.sessionId,void B.warning({title:"删除会话",content:"确定要删除这个会话吗?此操作不可恢复!",positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{try{await Be.deleteSession(s),Ma([s]),M.success("会话已删除")}catch(e){M.error("删除失败: "+e.message)}}});var s},["stop"])},{icon:f(()=>[d(p(D),null,{default:f(()=>[d(p(T))]),_:1})]),default:f(()=>[a[21]||(a[21]=m(" 删除 ",-1))]),_:1},8,["onClick"]),[[b,Oe.value===e.sessionId]]),d(p(W),{size:"small",onClick:_(a=>function(e){Ge.value=e,He.value=e.alias||"",Ve.value=!0}(e),["stop"])},{icon:f(()=>[d(p(D),null,{default:f(()=>[d(p(G))]),_:1})]),default:f(()=>[a[22]||(a[22]=m(" 别名 ",-1))]),_:1},8,["onClick"]),d(p(W),{size:"small",type:p(Pe)(Te.value,Ee.value,e.sessionId)?"warning":"default",onClick:_(a=>async function(e){const a=Te.value,s=Pe(a,Ee.value,e.sessionId);try{if(s)await Le(a,Ee.value,e.sessionId),M.success("已取消收藏");else{const s={sessionId:e.sessionId,projectName:Ee.value,projectDisplayName:ca.value,projectFullPath:va.value,alias:e.alias||"",firstMessage:e.firstMessage||"",mtime:e.mtime,size:e.size,gitBranch:e.gitBranch||"",forkedFrom:e.forkedFrom||""};await Ue(a,s),M.success("已添加到收藏")}}catch(l){M.error("操作失败: "+l.message)}}(e),["stop"])},{icon:f(()=>[d(p(D),null,{default:f(()=>[p(Pe)(Te.value,Ee.value,e.sessionId)?(u(),c(p(H),{key:0})):(u(),c(p(O),{key:1}))]),_:2},1024)]),default:f(()=>[m(" "+h(p(Pe)(Te.value,Ee.value,e.sessionId)?"已收藏":"收藏"),1)]),_:2},1032,["type","onClick"]),"opencode"!==Te.value?(u(),c(p(W),{key:0,size:"small",onClick:_(a=>async function(e){if("opencode"!==Te.value)try{const a=Re.value.find(a=>a.sessionId===e);ea.value=a||{sessionId:e},aa.value="",sa.value=Fe,na.value=[{label:"完整会话末尾(保留全部消息)",value:Fe}],Qe.value=!0,la.value=!0;const s=await U(Ee.value,e,Te.value),l=Array.isArray(null==s?void 0:s.items)?s.items:[];na.value=[{label:"完整会话末尾(保留全部消息)",value:Fe},...l.map(e=>({label:`保留到第 ${e.userMessageNumber} 条用户消息这一轮 · ${e.preview}`,value:e.userMessageNumber}))]}catch(a){M.error("加载 Fork 位置失败: "+a.message),Fa()}finally{la.value=!1}else M.warning("OpenCode 当前不支持该 Fork 操作")}(e.sessionId),["stop"])},{icon:f(()=>[d(p(D),null,{default:f(()=>[d(p(V))]),_:1})]),default:f(()=>[a[23]||(a[23]=m(" Fork ",-1))]),_:1},8,["onClick"])):v("",!0),d(p(W),{size:"small",type:"primary",onClick:_(a=>Ba(e.sessionId),["stop"])},{icon:f(()=>[d(p(D),null,{default:f(()=>[d(p(R))]),_:1})]),default:f(()=>[a[24]||(a[24]=m(" 使用对话 ",-1))]),_:1},8,["onClick"])]),_:2},1024)]))])],42,pe)]),_:1},16,["modelValue","disabled"])):(u(),c(p(te),{key:3,description:"没有找到会话",style:{"margin-top":"60px"}},{icon:f(()=>[d(p(D),null,{default:f(()=>[d(p(q))]),_:1})]),_:1}))],512),d(p(ne),{show:Ve.value,"onUpdate:show":a[6]||(a[6]=e=>Ve.value=e),preset:"dialog",title:"设置别名"},{action:f(()=>[d(p(le),null,{default:f(()=>[d(p(W),{onClick:a[5]||(a[5]=e=>Ve.value=!1)},{default:f(()=>[...a[25]||(a[25]=[m("取消",-1)])]),_:1}),d(p(W),{type:"primary",onClick:Na},{default:f(()=>[...a[26]||(a[26]=[m("确定",-1)])]),_:1})]),_:1})]),default:f(()=>[d(p(Q),{value:He.value,"onUpdate:value":a[4]||(a[4]=e=>He.value=e),placeholder:"输入别名(留空删除)",onKeyup:g(Na,["enter"])},null,8,["value"])]),_:1},8,["show"]),d(p(ne),{show:Qe.value,"onUpdate:show":a[9]||(a[9]=e=>Qe.value=e),preset:"dialog",title:"Fork 对话"},{action:f(()=>[d(p(le),null,{default:f(()=>[d(p(W),{disabled:ta.value,onClick:Fa},{default:f(()=>[...a[28]||(a[28]=[m("取消",-1)])]),_:1},8,["disabled"]),d(p(W),{type:"primary",loading:ta.value,onClick:Sa},{default:f(()=>[...a[29]||(a[29]=[m(" 确认 Fork ",-1)])]),_:1},8,["loading"])]),_:1})]),default:f(()=>[d(p(le),{vertical:"",size:14},{default:f(()=>[d(p(Y),{depth:"3"},{default:f(()=>[...a[27]||(a[27]=[m(" 可选择保留到第几条用户消息所在轮次;会包含这条消息后 AI 的完整输出。 ",-1)])]),_:1}),d(p(ie),{value:sa.value,"onUpdate:value":a[7]||(a[7]=e=>sa.value=e),options:na.value,loading:la.value,clearable:"",placeholder:"选择保留到哪一轮(默认完整会话)"},null,8,["value","options","loading"]),d(p(Q),{value:aa.value,"onUpdate:value":a[8]||(a[8]=e=>aa.value=e),placeholder:"输入新会话别名(可选)",maxlength:"120"},null,8,["value"])]),_:1})]),_:1},8,["show"]),d(p(ne),{show:De.value,"onUpdate:show":a[10]||(a[10]=e=>De.value=e),preset:"card",title:"搜索结果",style:{width:"1200px"}},{default:f(()=>[qe.value?(u(),o("div",ze,[d(p(ae),{type:"info",style:{"margin-bottom":"16px"}},{default:f(()=>[m(' 关键词 "'+h(qe.value.keyword)+'" 共找到 '+h(qe.value.totalMatches)+" 处匹配 ",1)]),_:1}),(u(!0),o(y,null,C(qe.value.sessions,e=>(u(),o("div",{key:e.sessionId,class:"search-result-item"},[r("div",xe,[r("div",Ne,[d(p(Y),{strong:""},{default:f(()=>[m(h(e.alias?`${e.alias} (${e.sessionId.substring(0,8)})`:e.sessionId.substring(0,8)),1)]),_:2},1024),d(p(Z),{size:"small",bordered:!1},{default:f(()=>[m(h(e.matchCount)+" 个匹配",1)]),_:2},1024)]),d(p(W),{size:"small",type:"primary",onClick:a=>Ba(e.sessionId)},{icon:f(()=>[d(p(D),null,{default:f(()=>[d(p(R))]),_:1})]),default:f(()=>[a[30]||(a[30]=m(" 使用对话 ",-1))]),_:1},8,["onClick"])]),(u(!0),o(y,null,C(e.matches,(e,a)=>(u(),o("div",{key:a,class:"search-match"},[d(p(Z),{size:"tiny",type:"user"===e.role?"info":"success",bordered:!1},{default:f(()=>[m(h("user"===e.role?"用户":"助手"),1)]),_:2},1032,["type"]),d(p(Y),{depth:"3",class:"search-match-text",innerHTML:Ta(e.context,qe.value.keyword)},null,8,["innerHTML"])]))),128))]))),128)),0===qe.value.sessions.length?(u(),c(p(te),{key:0,description:"没有找到匹配的内容"})):v("",!0)])):v("",!0)]),_:1},8,["show"]),oa.value?(u(),c(S,{key:0,ref_key:"chatHistoryRef",ref:ra,show:ia.value,"onUpdate:show":a[11]||(a[11]=e=>ia.value=e),"project-name":Ee.value,"session-id":oa.value,"session-alias":ua.value,channel:Te.value,onError:$a},null,8,["show","project-name","session-id","session-alias","channel"])):v("",!0)]))}},[["__scopeId","data-v-528553dd"]]);export{Se as default};
@@ -1 +1 @@
1
- import{_ as a,S as s}from"./index-gIbIMdSO.js";import{c as e,o as r,X as o,Z as i,N as t}from"./vue-vendor-C5aMkRmm.js";import{K as d}from"./naive-ui-Cjh6GLto.js";import"./icons-U50_Cfbe.js";import"./vendors--KP7Ux0s.js";import"./markdown-BNJfEgCA.js";const m={class:"skill-manager"},n=a({__name:"SkillManager",setup:a=>(a,n)=>(r(),e("div",m,[o(t(d),{title:"Skills 技能管理",bordered:!1},{default:i(()=>[o(s,{"in-drawer":!1,"hide-back":!0})]),_:1})]))},[["__scopeId","data-v-6ebc8a84"]]);export{n as default};
1
+ import{_ as a,S as s}from"./index-BsdIJwLf.js";import{c as e,o as r,X as o,Y as i,N as t}from"./vue-vendor-B5RqjEjQ.js";import{K as d}from"./naive-ui-DM897mIP.js";import"./icons-QFXzEgqM.js";import"./vendors-DQA4Hw9v.js";import"./markdown-BNJfEgCA.js";const m={class:"skill-manager"},n=a({__name:"SkillManager",setup:a=>(a,n)=>(r(),e("div",m,[o(t(d),{title:"Skills 技能管理",bordered:!1},{default:i(()=>[o(s,{"in-drawer":!1,"hide-back":!0})]),_:1})]))},[["__scopeId","data-v-6ebc8a84"]]);export{n as default};
@@ -1 +1 @@
1
- import{_ as a,W as s}from"./index-gIbIMdSO.js";import{c as r,o as e,X as o,Z as d,N as i}from"./vue-vendor-C5aMkRmm.js";import{K as t}from"./naive-ui-Cjh6GLto.js";import"./icons-U50_Cfbe.js";import"./vendors--KP7Ux0s.js";import"./markdown-BNJfEgCA.js";const m={class:"workspace-manager"},n=a({__name:"WorkspaceManager",setup:a=>(a,n)=>(e(),r("div",m,[o(i(t),{title:"工作区管理",bordered:!1},{default:d(()=>[o(s,{"in-drawer":!1,"hide-back":!0})]),_:1})]))},[["__scopeId","data-v-c6211fd6"]]);export{n as default};
1
+ import{_ as a,W as s}from"./index-BsdIJwLf.js";import{c as r,o as e,X as o,Y as d,N as i}from"./vue-vendor-B5RqjEjQ.js";import{K as t}from"./naive-ui-DM897mIP.js";import"./icons-QFXzEgqM.js";import"./vendors-DQA4Hw9v.js";import"./markdown-BNJfEgCA.js";const m={class:"workspace-manager"},n=a({__name:"WorkspaceManager",setup:a=>(a,n)=>(e(),r("div",m,[o(i(t),{title:"工作区管理",bordered:!1},{default:d(()=>[o(s,{"in-drawer":!1,"hide-back":!0})]),_:1})]))},[["__scopeId","data-v-c6211fd6"]]);export{n as default};