coding-tool-x 3.8.1 → 3.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/dist/web/assets/{Analytics-8dRv1aYW.js → Analytics-COEUXmd4.js} +1 -1
- package/dist/web/assets/{ConfigTemplates-BQRXSICO.js → ConfigTemplates-DLLkS53H.js} +1 -1
- package/dist/web/assets/{Home-BtzWhKIa.js → Home-DCEyLzwX.js} +1 -1
- package/dist/web/assets/{PluginManager-BTa-Ygf6.js → PluginManager-Oe1ZHoMO.js} +1 -1
- package/dist/web/assets/{ProjectList-F_cB8ldA.js → ProjectList-CWjuAFof.js} +1 -1
- package/dist/web/assets/{SessionList-LOrbPQvu.js → SessionList-v3ehGg9U.js} +1 -1
- package/dist/web/assets/{SkillManager-BzI_t-yV.js → SkillManager-DUF_qP5S.js} +1 -1
- package/dist/web/assets/{WorkspaceManager-Db9RGiz7.js → WorkspaceManager-CjAWBosO.js} +1 -1
- package/dist/web/assets/index-D5hyHPj7.js +2 -0
- package/dist/web/index.html +1 -1
- package/docs/superpowers/plans/2026-08-10-codex-conversion-compatibility.md +251 -0
- package/docs/superpowers/plans/2026-08-11-windows-command-window-hiding.md +90 -0
- package/docs/superpowers/plans/2026-08-13-omp-restart-recovery.md +48 -0
- package/docs/superpowers/specs/2026-08-10-codex-conversion-compatibility-design.md +61 -0
- package/docs/superpowers/specs/2026-08-11-windows-command-window-hiding-design.md +44 -0
- package/docs/superpowers/specs/2026-08-13-omp-restart-recovery-design.md +22 -0
- package/package.json +1 -1
- package/src/commands/daemon.js +3 -12
- package/src/commands/update.js +1 -1
- package/src/index.js +8 -1
- package/src/server/omp-proxy-server.js +9 -6
- package/src/server/opencode-proxy-server.js +55 -1037
- package/src/server/services/claude-wire.js +694 -0
- package/src/server/services/codex-wire.js +219 -0
- package/src/server/services/gemini-wire.js +759 -0
- package/src/server/services/model-detector.js +49 -131
- package/src/server/services/omp-channels.js +23 -4
- package/src/server/services/omp-gateway.js +29 -1
- package/src/server/services/omp-settings-manager.js +27 -3
- package/src/server/services/opencode-gateway-adapters.js +22 -1147
- package/src/server/services/opencode-normalization.js +546 -0
- package/src/server/services/session-history-index.js +1 -1
- package/src/server/services/session-history-worker.js +2 -1
- package/src/server/services/speed-test.js +85 -303
- package/dist/web/assets/index-DIWJmyL6.js +0 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
9
|
### Fixed
|
|
10
|
+
- **Claude / Gemini 原生 wire 兼容** - OpenCode Claude / Gemini 代理、模型探测和测速统一使用 Anthropic Messages 与 Google Generative AI(含 Gemini CLI)原生请求格式、认证头与目标 URL;OMP managed provider 写入 `anthropic-messages` / `google-generative-ai` 标识,避免代理、adapter 与探测各自维护不一致的请求格式
|
|
11
|
+
- **OMP Codex Responses 路径兼容** - managed gateway 将 OMP 原生 `openai-codex-responses` 的 `/codex/responses` 请求映射到 OpenAI-compatible 渠道的 `/v1/responses`,避免 Codex-only 服务返回 HTTP 404
|
|
10
12
|
- **OMP 渠道失败不再冻结** - OMP 动态切换开启后,失败渠道不再进入冻结状态。OMP 网关按请求即时回退其他渠道,冻结会导致短暂故障的渠道在恢复前被排除在后续分配之外
|
|
11
13
|
- **OMP 动态切换凭据稳定** - 同步当前 OMP 渠道时不再把动态切换生成的本地网关 `base_url` 和 capability API Key 覆盖真实渠道配置;同一渠道的受管 provider 生成值现在复用持久化网关密钥保持稳定
|
|
12
14
|
|
|
@@ -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,$ as w,a0 as b,Y as S,p as M,_ as T,L as C}from"./vue-vendor-B5RqjEjQ.js";import{_ as I,x as D,y as k,z as A}from"./index-
|
|
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,x as D,y as k,z as A}from"./index-D5hyHPj7.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-BALVpMgd.js";import{a4 as B,aA as F,aB as V}from"./icons-nGdSKQn2.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,w as a}from"./index-
|
|
1
|
+
import{_ as s,w as a}from"./index-D5hyHPj7.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-BALVpMgd.js";import"./icons-nGdSKQn2.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-DQA4Hw9v.js";import{r as a,a8 as l,f as n,w as s,h as c,K as t,a7 as o,c as i,o as u,a as r,W as d,a0 as v,X as p,Y as h,N as y,a3 as m,_ as g,p as f,R as k,L as T,F as C,$ as b,Z as w,v as x}from"./vue-vendor-B5RqjEjQ.js";import{g as $,u as _,a as S,s as z,D as P,_ as q,b as j,c as M,d as L,R as O,e as I,f as E,h as N,i as F,j as A,n as D}from"./index-DIWJmyL6.js";import{h as U,ar as J,E as V,P as R,as as K,at as B,au as Z,av as G,aa as H,i as W,A as X,aw as Y,ax as Q,T as ee,a as ae,b as le}from"./icons-nGdSKQn2.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 re}from"./naive-ui-BALVpMgd.js";import"./markdown-BNJfEgCA.js";const de=a({theme:"light",panelVisibility:{showChannels:!0,showLogs:!0},channelBalance:{showRemaining:!1},channelLocks:{claude:!1,codex:!1,gemini:!1,opencode:!1,omp:!1},channelCollapse:{claude:[],codex:[],gemini:[],opencode:[],omp:[]},channelOrder:{claude:[],codex:[],gemini:[],opencode:[],omp:[]},dashboardChannelOrder:P,homeCliColumns:P,customCliPlatforms:[]});let ve=!1,pe=null;async function he(){return ve?de.value:pe||(pe=(async()=>{try{const e=await $();e.success&&e.config&&(de.value=e.config,ve=!0)}catch(e){}finally{pe=null}return de.value})(),pe)}function ye(){return ve||he(),{uiConfig:de,loadUIConfig:he,saveConfig:async function(e){try{const a=await z(e);return!!a.success&&(de.value=a.config,!0)}catch(a){return!1}},updateConfig:async function(e,a){try{const l=await S(e,a);return!!l.success&&(de.value=l.config,!0)}catch(l){return!1}},updateNestedConfig:async function(e,a,l){try{const n=await _(e,a,l);return!!n.success&&(de.value=n.config,!0)}catch(n){return!1}}}}const me={class:"channel-column"},ge={class:"drag-handle",title:"拖拽排序"},fe={class:"header-icon"},ke={class:"channel-title"},Te={key:0,class:"claude-extra-area"},Ce={key:0,class:"channel-content"},be={key:0,class:"card"},we={class:"card-header"},xe={class:"card-title"},$e={key:0,class:"runtime-badge"},_e={class:"card-body",style:{padding:"6px 10px"}},Se={class:"proxy-info-row"},ze={class:"proxy-status"},Pe={key:0,class:"proxy-port"},qe={class:"channel-name"},je={class:"channel-quick-panel"},Me={class:"panel-title"},Le={key:0,class:"no-channels"},Oe={key:1,class:"channel-quick-list"},Ie={class:"channel-quick-info"},Ee={class:"channel-quick-name"},Ne={key:0,class:"channel-switching-tip"},Fe={class:"channel-metrics"},Ae={class:"metric-item"},De={class:"metric-value"},Ue={class:"metric-item"},Je={class:"metric-value"},Ve={class:"metric-item"},Re={class:"metric-value"},Ke={class:"metric-item"},Be={class:"card"},Ze={class:"card-header compact"},Ge={class:"card-body",style:{padding:"8px 10px"}},He={class:"quick-access-list"},We={class:"access-icon"},Xe={class:"access-content"},Ye={class:"access-value"},Qe={class:"access-icon"},ea={class:"access-content"},aa={class:"access-value"},la={class:"access-icon"},na={class:"access-content"},sa={class:"access-goto"},ca={class:"card-header compact"},ta={class:"card-body",style:{padding:"8px 10px"}},oa={class:"stats-inline stats-3col"},ia={class:"stat-inline-item stat-requests"},ua={class:"stat-info"},ra={class:"stat-inline-item stat-input"},da={class:"stat-info"},va={class:"stat-inline-item stat-output"},pa={class:"stat-info"},ha={key:2,class:"card logs-card"},ya={class:"card-header compact"},ma={class:"card-body logs-card-body"},ga={class:"logs-table-wrapper"},fa={key:0,class:"empty-logs"},ka=["title"],Ta={key:0,class:"action-content"},Ca={class:"action-msg"},ba={class:"action-time"},wa={key:1,class:"action-content"},xa={class:"action-msg error-msg"},$a={class:"action-time error-time"},_a={class:"locked-content"},Sa={class:"lock-icon"},za="channelLocks",Pa=q({__name:"ChannelColumn",props:{channelType:{type:String,required:!0}},setup(e){const S=e,z=l(),P=ne(),{uiConfig:q}=ye(),{claudeProxy:D,codexProxy:de,geminiProxy:ve,opencodeProxy:pe,ompProxy:he,claudeChannels:Pa,codexChannels:qa,geminiChannels:ja,opencodeChannels:Ma,ompChannels:La,schedulerState:Oa,getProxyState:Ia,startProxy:Ea,stopProxy:Na,getLogs:Fa,clearLogsForSource:Aa,loadChannels:Da,logLimit:Ua,statsInterval:Ja}=j(),{dashboardData:Va,loadDashboard:Ra}=M(),Ka=n(()=>L(S.channelType,q.value.customCliPlatforms)),Ba=n(()=>Ka.value.title||Ka.value.label||S.channelType),Za=n(()=>Ka.value.icon||U),Ga=n(()=>Ka.value.color||"#64748b"),Ha=n(()=>"claude"===S.channelType?D.value:"codex"===S.channelType?de.value:"gemini"===S.channelType?ve.value:"opencode"===S.channelType?pe.value:"omp"===S.channelType?he.value:Ka.value.custom?{running:!1,loading:!1,activeChannel:null,port:null,runtime:null,startTime:null}:{}),Wa=n(()=>"claude"===S.channelType?"Claude":"codex"===S.channelType?"Codex":"gemini"===S.channelType?"Gemini":"opencode"===S.channelType?"OpenCode":"omp"===S.channelType?"OMP":Ka.value.label||S.channelType),Xa=a({projects:0,sessions:0}),Ya=a({requests:0,tokens:0,cost:0}),Qa=a({requests:0,tokens:0,cost:0}),el={requests:0,tokens:0,cost:3};let al={requests:null,tokens:null,cost:null};const ll=a({requests:!1,tokens:!1,cost:!1}),nl=n(()=>{var e,a,l;return(null==(l=null==(a=null==(e=Va.value)?void 0:e.todayStats)?void 0:a[S.channelType])?void 0:l.byModel)||{}});function sl(e,a,l,n=600){al[e]&&cancelAnimationFrame(al[e]),ll.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,r=el[e]??0,d=Math.pow(10,r),v=r>0?Math.round(u*d)/d:Math.round(u);Qa.value[e]=v,o<1?al[e]=requestAnimationFrame(c):ll.value[e]=!1};al[e]=requestAnimationFrame(c)}const cl=a(!1),tl={claude:"claudeChannelCollapse",codex:"codexChannelCollapse",gemini:"geminiChannelCollapse",opencode:"opencodeChannelCollapse",omp:"ompChannelCollapse"};function ol(e){try{const a=localStorage.getItem(za),l=a?JSON.parse(a):{};l[S.channelType]=e,localStorage.setItem(za,JSON.stringify(l))}catch(a){}}const il=a(function(){try{const e=localStorage.getItem(za);if(e){return JSON.parse(e)[S.channelType]||!1}}catch(e){}return!1}());async function ul(){il.value=!il.value,ol(il.value);try{if(await _("channelLocks",S.channelType,il.value),Va.value){const e=Va.value.uiConfig||{},a={...e.channelLocks||{}};a[S.channelType]=il.value,Va.value={...Va.value,uiConfig:{...e,channelLocks:a}}}}catch(e){}}const rl=a(!0);function dl(e){e.detail&&void 0!==e.detail.showLogs&&(rl.value=e.detail.showLogs)}const vl=a(Date.now()),pl=n(()=>{if(!Ha.value.running)return"";const e=Ha.value.startTime;if(!e)return"";const a=vl.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}),hl=a(null),yl=n(()=>Ua.value),ml={claude:Fa("claude"),codex:Fa("codex"),gemini:Fa("gemini"),opencode:Fa("opencode"),omp:Fa("omp")},gl=n(()=>{if(!Pl())return[];const e=ml[S.channelType];if(!e)return[];return(e.value||[]).slice(0,yl.value)});let fl=null,kl=null,Tl=null,Cl=!1,bl=null;const wl=n(()=>{let e=[];"claude"===S.channelType?e=Pa.value||[]:"codex"===S.channelType?e=qa.value||[]:"gemini"===S.channelType?e=ja.value||[]:"opencode"===S.channelType?e=Ma.value||[]:"omp"===S.channelType&&(e=La.value||[]);return[...e.filter(e=>!1!==e.enabled),...e.filter(e=>!1===e.enabled)]});function xl(e){const a=Oa[S.channelType];if(!a||!a.channels)return 0;const l=a.channels.find(a=>a.id===e);return l?l.inflight:0}const $l=n(()=>{const e=wl.value.filter(e=>!1!==e.enabled).length;return Ha.value.running?`${e}个渠道动态切换中`:wl.value.length>0?`${e}个渠道已启用`:"无渠道"}),_l=n(()=>{var e,a,l;return(null==(l=null==(a=null==(e=Va.value)?void 0:e.todayStats)?void 0:a[S.channelType])?void 0:l.byChannel)||{}});function Sl(e){return _l.value[e]||{requests:0,tokens:0,cost:0}}function zl(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 Pl(){return["claude","codex","gemini","opencode","omp"].includes(S.channelType)}function ql(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 jl(e){var a,l;if(!1===Ka.value.supportsProxy||!Pl())return void P.warning(`${Ba.value} 暂未接入动态代理`);const n=Ia(S.channelType);n.value.loading=!0;try{let a;a=e?await Ea(S.channelType):await Na(S.channelType,{refreshChannelsDrawer:!0}),!1!==a.success?"omp"===S.channelType?P.success(e?"OMP 动态切换与会话日志观察已启用":"OMP 已切换为单渠道直连模式"):P.success(e?`${Ba.value} 代理已启动`:`${Ba.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 Ml(){!1!==Ka.value.supportsProjects&&Pl()?z.push({name:`${S.channelType}-projects`}):P.info(`${Ba.value} 当前仅作为首页显示项`)}function Ll(){!1!==Ka.value.supportsProjects&&Pl()?z.push({name:`${S.channelType}-projects`}):P.info(`${Ba.value} 当前仅作为首页显示项`)}function Ol(){!1!==Ka.value.supportsSessions&&Pl()?cl.value=!0:P.info(`${Ba.value} 当前没有托管会话列表`)}s(gl,e=>{var a;const l=(null==(a=e[0])?void 0:a.id)||null;if(!l||l===fl)return void(fl=l);fl=l,bl&&clearTimeout(bl),bl=setTimeout(()=>{Ra(!0,{fresh:!0}).then(()=>Dl()).catch(()=>{})},5e3);(!hl.value||hl.value.scrollTop<20)&&x(()=>{hl.value&&(hl.value.scrollTop=0)})}),s(()=>Ya.value.requests,e=>{sl("requests",Qa.value.requests,e,600)}),s(()=>Ya.value.tokens,e=>{sl("tokens",Qa.value.tokens,e,600)}),s(()=>Ya.value.cost,e=>{sl("cost",Qa.value.cost,e,600)}),s(()=>S.channelType,()=>{var e;fl=(null==(e=gl.value[0])?void 0:e.id)||null}),s(()=>{var e,a;return null==(a=null==(e=Va.value)?void 0:e.counts)?void 0:a[S.channelType]},()=>{Al()}),s(()=>{var e,a;return null==(a=null==(e=Va.value)?void 0:e.todayStats)?void 0:a[S.channelType]},()=>{Dl()},{deep:!0}),s(Ja,()=>{Cl&&function(){kl&&(clearInterval(kl),kl=null);const e=Ja.value||30,a=Math.max(1e3*e,1e4);kl=setInterval(()=>{Ra(!0,{fresh:!0}).then(()=>Dl()).catch(()=>{})},a)}()});const Il=a({});function El(e){return!!Il.value[e]}function Nl(e,a){e&&(Il.value={...Il.value,[e]:!!a})}async function Fl(e,a){if(e&&!El(e.id)){Nl(e.id,!0);try{let l;"claude"===S.channelType?l=I:"codex"===S.channelType?l=E:"gemini"===S.channelType?l=N:"opencode"===S.channelType?l=F:"omp"===S.channelType&&(l=A),l&&(await l(e.id,{enabled:a}),await async function(e,a){if(!e)return;const l=tl[S.channelType];let n={};try{const e=l?localStorage.getItem(l):null;n=e?JSON.parse(e):{}}catch(s){n={}}a?delete n[e]:n[e]=!0;try{l&&localStorage.setItem(l,JSON.stringify(n))}catch(s){}try{await _("channelCollapse",S.channelType,n)}catch(s){}}(e.id,a),P.success(a?`渠道「${e.name}」已启用`:`渠道「${e.name}」已停用`),await Da(),window.dispatchEvent(new CustomEvent("channel-management-refresh",{detail:{channel:S.channelType}})))}catch(l){P.error("操作失败: "+l.message)}finally{Nl(e.id,!1)}}}function Al(){var e,a;const l=null==(a=null==(e=Va.value)?void 0:e.counts)?void 0:a[S.channelType];Xa.value.projects=(null==l?void 0:l.projectCount)||0,Xa.value.sessions=(null==l?void 0:l.sessionCount)||0}async function Dl(){if(Va.value&&Va.value.todayStats){const e=Va.value.todayStats[S.channelType];e&&(Ya.value.requests=e.requests||0,Ya.value.tokens=e.tokens||0,Ya.value.cost=e.cost||0)}Al()}function Ul(){Aa(S.channelType)}function Jl(e){var a,l;null==(l=null==(a=null==e?void 0:e.currentTarget)?void 0:a.blur)||l.call(a)}function Vl(e){window.dispatchEvent(new CustomEvent("open-skills-drawer",{detail:{platform:S.channelType}})),Jl(e)}function Rl(e){window.dispatchEvent(new CustomEvent("open-commands-drawer",{detail:{platform:S.channelType}})),Jl(e)}function Kl(e){if(!1===Ka.value.supportsAgents)return P.info(`${Ba.value} 的 Agent 能力通过插件/扩展提供`),void Jl(e);window.dispatchEvent(new CustomEvent("open-agents-drawer",{detail:{platform:S.channelType}})),Jl(e)}return c(async()=>{await Ra().then(()=>Dl()),async function(){var e,a;try{if(Va.value&&Va.value.uiConfig)rl.value=!1!==(null==(e=Va.value.uiConfig.panelVisibility)?void 0:e.showLogs);else{const e=await $();e.success&&e.config&&(rl.value=!1!==(null==(a=e.config.panelVisibility)?void 0:a.showLogs))}}catch(l){}}(),async function(){var e,a;try{let l=!1;if(Va.value&&Va.value.uiConfig)l=(null==(e=Va.value.uiConfig.channelLocks)?void 0:e[S.channelType])||!1;else{const e=await $();e.success&&e.config&&(l=(null==(a=e.config.channelLocks)?void 0:a[S.channelType])||!1)}il.value=l,ol(l)}catch(l){}}(),window.addEventListener("panel-visibility-change",dl),Qa.value={...Ya.value},Cl=!0,Tl=setInterval(()=>{vl.value=Date.now()},1e3)}),t(()=>{Cl=!1,kl&&clearInterval(kl),Tl&&clearInterval(Tl),bl&&clearTimeout(bl),window.removeEventListener("panel-visibility-change",dl),Object.values(al).forEach(e=>{e&&cancelAnimationFrame(e)})}),(a,l)=>{const n=o("n-collapse");return u(),i("div",me,[r("div",{class:T(["channel-header",[e.channelType,{"custom-cli":Ka.value.custom}]]),style:k(Ka.value.custom?{"--channel-accent":Ga.value}:null)},[r("div",ge,[p(y(se),{size:16},{default:h(()=>[p(y(J))]),_:1})]),r("div",fe,[p(y(se),{size:20},{default:h(()=>[(u(),v(m(Za.value)))]),_:1})]),r("h2",ke,g(Ba.value),1),!1!==Ka.value.supportsManagedConfig?(u(),i("div",Te,[p(y(te),{trigger:"hover"},{trigger:h(()=>[p(y(ce),{text:"",class:"config-shortcut-button",onClick:Vl,title:"Skills 技能管理"},{icon:h(()=>[p(y(se),{size:18},{default:h(()=>[p(y(V))]),_:1})]),_:1})]),default:h(()=>[l[2]||(l[2]=f(" Skills 技能管理 ",-1))]),_:1}),p(y(te),{trigger:"hover"},{trigger:h(()=>[p(y(ce),{text:"",class:"config-shortcut-button",onClick:Rl,title:"Commands 命令管理"},{icon:h(()=>[p(y(se),{size:18},{default:h(()=>[p(y(U))]),_:1})]),_:1})]),default:h(()=>[l[3]||(l[3]=f(" Commands 命令管理 ",-1))]),_:1}),!1!==Ka.value.supportsAgents?(u(),v(y(te),{key:0,trigger:"hover"},{trigger:h(()=>[p(y(ce),{text:"",class:"config-shortcut-button",onClick:Kl,title:"Agents 代理管理"},{icon:h(()=>[p(y(se),{size:18},{default:h(()=>[p(y(R))]),_:1})]),_:1})]),default:h(()=>[l[4]||(l[4]=f(" Agents 代理管理 ",-1))]),_:1})):d("",!0)])):d("",!0),p(y(ce),{text:"",class:"lock-button",onClick:ul,title:il.value?"解锁此列":"锁定此列"},{icon:h(()=>[p(y(se),{size:18},{default:h(()=>[il.value?(u(),v(y(K),{key:0})):(u(),v(y(B),{key:1}))]),_:1})]),_:1},8,["title"])],6),il.value?d("",!0):(u(),i("div",Ce,[!1!==Ka.value.supportsProxy?(u(),i("div",be,[r("div",we,[p(y(se),{size:16},{default:h(()=>[p(y(Z))]),_:1}),r("h3",xe,g("omp"===e.channelType?"动态切换":"代理控制"),1),Ha.value.running&&pl.value?(u(),i("span",$e,g(pl.value),1)):d("",!0),p(y(oe),{value:Ha.value.running,"onUpdate:value":[l[0]||(l[0]=e=>Ha.value.running=e),jl],loading:Ha.value.loading,size:"small",style:{"margin-left":"auto"}},null,8,["value","loading"])]),r("div",_e,[r("div",Se,[r("div",ze,[r("div",{class:T(["status-dot",{active:Ha.value.running}])},null,2),p(y(ie),{type:Ha.value.running?"success":"default",style:{"font-size":"12px"}},{default:h(()=>[f(g(Ha.value.running?"运行中":"已停止"),1)]),_:1},8,["type"]),"omp"!==e.channelType?(u(),i("span",Pe,"端口: "+g(Ha.value.port),1)):d("",!0)]),p(y(re),{trigger:"click",placement:"bottom",width:320,class:"channel-popover"},{trigger:h(()=>[p(y(ce),{text:"",size:"tiny",class:"channel-status"},{default:h(()=>[r("span",qe,g($l.value),1)]),_:1})]),default:h(()=>[r("div",je,[r("div",Me,[l[6]||(l[6]=r("span",null,"渠道快捷管理",-1)),p(y(ie),{depth:"3",style:{"font-size":"11px"}},{default:h(()=>[...l[5]||(l[5]=[f("点击开关切换状态",-1)])]),_:1})]),0===wl.value.length?(u(),i("div",Le,[p(y(ie),{depth:"3"},{default:h(()=>[...l[7]||(l[7]=[f("暂无配置渠道",-1)])]),_:1})])):(u(),i("div",Oe,[(u(!0),i(C,null,b(wl.value,e=>{var a,n;return u(),i("div",{key:e.id,class:T(["channel-quick-item",{disabled:!1===e.enabled}])},[r("div",Ie,[r("span",Ee,g(e.name),1),"frozen"===(null==(a=e.health)?void 0:a.status)?(u(),v(y(ue),{key:0,size:"tiny",type:"error",bordered:!1},{default:h(()=>[...l[8]||(l[8]=[f(" 冻结 ",-1)])]),_:1})):d("",!0),p(y(oe),{size:"small",value:!1!==e.enabled,"onUpdate:value":a=>Fl(e,a),loading:El(e.id),disabled:El(e.id),style:{"margin-left":"auto"}},null,8,["value","onUpdate:value","loading","disabled"])]),El(e.id)?(u(),i("div",Ne," 正在切换渠道状态... ")):d("",!0),r("div",Fe,[r("span",Ae,[l[9]||(l[9]=r("span",{class:"metric-label"},"请求",-1)),r("span",De,g(Sl(e.id).requests),1)]),r("span",Ue,[l[10]||(l[10]=r("span",{class:"metric-label"},"Tokens",-1)),r("span",Je,g((n=Sl(e.id).tokens,n>=1e6?(n/1e6).toFixed(1)+"M":n>=1e3?(n/1e3).toFixed(1)+"K":n.toString())),1)]),r("span",Ve,[l[11]||(l[11]=r("span",{class:"metric-label"},"权重",-1)),r("span",Re,g(e.weight||1),1)]),r("span",Ke,[l[12]||(l[12]=r("span",{class:"metric-label"},"并发",-1)),r("span",{class:T(["metric-value",{active:xl(e.id)>0}])},g(xl(e.id))+g(e.maxConcurrency?`/${e.maxConcurrency}`:""),3)])])],2)}),128))]))])]),_:1})])])])):d("",!0),r("div",Be,[r("div",Ze,[p(y(se),{size:14},{default:h(()=>[p(y(G))]),_:1}),l[13]||(l[13]=r("h3",{class:"card-title"},"快速访问",-1))]),r("div",Ge,[r("div",He,[r("div",{class:T(["access-card access-card-projects",{clickable:!1!==Ka.value.supportsProjects,disabled:!1===Ka.value.supportsProjects}]),onClick:Ml},[r("div",We,[p(y(se),{size:16},{default:h(()=>[p(y(H))]),_:1})]),r("div",Xe,[l[14]||(l[14]=r("span",{class:"access-label"},"项目",-1)),r("span",Ye,g(Xa.value.projects),1)])],2),r("div",{class:T(["access-card access-card-sessions",{clickable:!1!==Ka.value.supportsSessions,disabled:!1===Ka.value.supportsSessions}]),onClick:Ol},[r("div",Qe,[p(y(se),{size:16},{default:h(()=>[p(y(W))]),_:1})]),r("div",ea,[l[15]||(l[15]=r("span",{class:"access-label"},"最新对话",-1)),r("span",aa,g(Xa.value.sessions),1)])],2),r("div",{class:T(["access-card access-card-goto",{clickable:!1!==Ka.value.supportsProjects,disabled:!1===Ka.value.supportsProjects}]),onClick:Ll},[r("div",la,[p(y(se),{size:16},{default:h(()=>[p(y(X))]),_:1})]),r("div",na,[l[16]||(l[16]=r("span",{class:"access-label"},"前往",-1)),r("span",sa,g(Wa.value),1)])],2)])])]),r("div",{class:T(["card stats-card",`stats-card-${e.channelType}`])},[r("div",ca,[p(y(se),{size:14},{default:h(()=>[p(y(Y))]),_:1}),l[17]||(l[17]=r("h3",{class:"card-title"},"今日数据",-1))]),r("div",ta,[r("div",oa,[r("div",ia,[l[19]||(l[19]=r("div",{class:"stat-icon-dot requests"},null,-1)),r("div",ua,[l[18]||(l[18]=r("span",{class:"stat-label"},"请求",-1)),r("span",{class:T(["stat-value",{animating:ll.value.requests}])},g(Qa.value.requests),3)])]),r("div",ra,[l[21]||(l[21]=r("div",{class:"stat-icon-dot tokens"},null,-1)),r("div",da,[l[20]||(l[20]=r("span",{class:"stat-label"},"总 Tokens",-1)),r("span",{class:T(["stat-value",{animating:ll.value.tokens}])},g((c=Qa.value.tokens,c>=1e6?(c/1e6).toFixed(1)+"M":c>=1e3?(c/1e3).toFixed(1)+"K":c.toString())),3)])]),r("div",va,[l[23]||(l[23]=r("div",{class:"stat-icon-dot cost"},null,-1)),r("div",pa,[l[22]||(l[22]=r("span",{class:"stat-label"},"成本 / USD",-1)),r("span",{class:T(["stat-value",{animating:ll.value.cost}])},g((s=Qa.value.cost,!s||Number.isNaN(s)?"$0":"$"+Number(s).toFixed(3))),3)])])])])],2),Object.keys(nl.value).length>0?(u(),i("div",{key:1,class:T(["card chart-card",`chart-card-${e.channelType}`])},[p(n,{"default-expanded-names":[],accordion:""})],2)):d("",!0),rl.value?(u(),i("div",ha,[r("div",ya,[p(y(se),{size:14},{default:h(()=>[p(y(Q))]),_:1}),l[24]||(l[24]=r("h3",{class:"card-title"},"实时日志",-1)),p(y(ce),{text:"",size:"tiny",onClick:w(Ul,["stop"]),style:{"margin-left":"auto"},title:"清空日志"},{icon:h(()=>[p(y(se),{size:14},{default:h(()=>[p(y(ee))]),_:1})]),_:1})]),r("div",ma,[r("div",ga,[r("div",{class:T(["logs-table-header",`logs-header-${e.channelType}`])},[r("div",{class:T(["log-col col-channel",`col-channel-${e.channelType}`])},"渠道",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"请求",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"回复",2),"claude"===e.channelType?(u(),i(C,{key:0},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"写入",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"命中",2)],64)):"codex"===e.channelType?(u(),i(C,{key:1},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"推理",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"总计",2)],64)):"gemini"===e.channelType?(u(),i(C,{key:2},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"总计",2)],64)):"opencode"===e.channelType||"omp"===e.channelType?(u(),i(C,{key:3},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"推理",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"总计",2)],64)):d("",!0),r("div",{class:T(["log-col col-time",`col-time-${e.channelType}`])},"时间",2)],2),r("div",{class:"logs-container",ref_key:"logsContainer",ref:hl},[0===gl.value.length?(u(),i("div",fa,[p(y(se),{size:32,depth:"3",style:{"margin-bottom":"8px"}},{default:h(()=>[p(y(Q))]),_:1}),p(y(ie),{depth:"3",style:{"font-size":"12px","font-weight":"500"}},{default:h(()=>[...l[25]||(l[25]=[f("暂无实时日志",-1)])]),_:1}),p(y(ie),{depth:"3",style:{"font-size":"11px","margin-top":"4px"}},{default:h(()=>[f(g("omp"===e.channelType?"开启动态切换后将观察新增 OMP 会话用量":"开启代理后将显示请求记录"),1)]),_:1})])):d("",!0),(u(!0),i(C,null,b(gl.value,a=>(u(),i("div",{key:a.id,class:T(["log-row",{"action-row":"action"===a.type,"error-row":"error"===a.status,"new-log":a.isNew}]),title:ql(a)},["action"===a.type?(u(),i("div",Ta,[p(y(se),{size:12,color:"#18a058"},{default:h(()=>[p(y(ae))]),_:1}),r("span",Ca,g(a.message),1),r("span",ba,g(a.time),1)])):"error"===a.status?(u(),i("div",wa,[p(y(se),{size:12,color:"#d03050"},{default:h(()=>[p(y(le))]),_:1}),r("span",xa,g(a.channel)+": "+g(a.error||a.message||"请求失败"),1),r("span",$a,g(a.time),1)])):(u(),i(C,{key:2},[r("div",{class:T(["log-col col-channel",`col-channel-${e.channelType}`])},[p(y(ue),{size:"tiny",type:"success"},{default:h(()=>[f(g(a.channel),1)]),_:2},1024)],2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"input")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"output")),3),"claude"===e.channelType?(u(),i(C,{key:0},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"cacheCreation")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"cacheRead")),3)],64)):"codex"===e.channelType?(u(),i(C,{key:1},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"reasoning")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"cached")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"total")),3)],64)):"gemini"===e.channelType?(u(),i(C,{key:2},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"cached")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"total")),3)],64)):"opencode"===e.channelType||"omp"===e.channelType?(u(),i(C,{key:3},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"reasoning")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"cached")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"total")),3)],64)):d("",!0),r("div",{class:T(["log-col col-time",`col-time-${e.channelType}`])},g(a.time),3)],64))],10,ka))),128))],512)])])])):d("",!0)])),il.value?(u(),i("div",{key:1,class:T(["locked-overlay",`locked-${e.channelType}`])},[r("div",_a,[r("div",Sa,[p(y(se),{size:48},{default:h(()=>[p(y(K))]),_:1})]),l[27]||(l[27]=r("h3",{class:"locked-title"},"该渠道已锁定",-1)),p(y(ie),{depth:"3",class:"locked-hint"},{default:h(()=>[...l[26]||(l[26]=[f(" 点击上方按钮解锁以查看内容 ",-1)])]),_:1})])],2)):d("",!0),!1!==Ka.value.supportsSessions?(u(),v(O,{key:2,visible:cl.value,"onUpdate:visible":l[1]||(l[1]=e=>cl.value=e),channel:e.channelType},null,8,["visible","channel"])):d("",!0)]);var s,c}}},[["__scopeId","data-v-ecbe0ece"]]),qa={class:"dashboard-container"},ja="dashboardChannelOrder",Ma=q({__name:"Home",setup(l){const{uiConfig:n,updateConfig:s,loadUIConfig:o}=ye();function r(e){try{localStorage.setItem(ja,JSON.stringify(e))}catch(a){}}function d(e,a=n.value.customCliPlatforms){const l=D(e,a);return m.value=l.map(e=>({type:e})),r(l),l}const m=a(function(){try{const e=localStorage.getItem(ja);if(e){const a=JSON.parse(e);return D(a,n.value.customCliPlatforms)}}catch(e){}return P}().map(e=>({type:e})));async function g(){const e=D(m.value.map(e=>e.type),n.value.customCliPlatforms);m.value=e.map(e=>({type:e})),r(e),await s("homeCliColumns",e),await s("dashboardChannelOrder",e)}function f(e){const a=(null==e?void 0:e.detail)||{};d(a.homeCliColumns,a.customCliPlatforms)}return c(async()=>{window.addEventListener("home-cli-columns-change",f),await o(),d(n.value.homeCliColumns||n.value.dashboardChannelOrder,n.value.customCliPlatforms)}),t(()=>{window.removeEventListener("home-cli-columns-change",f)}),(a,l)=>(u(),i("div",qa,[p(y(e),{modelValue:m.value,"onUpdate:modelValue":l[0]||(l[0]=e=>m.value=e),class:"dashboard-grid","item-key":"type",animation:200,handle:".drag-handle",onEnd:g},{item:h(({element:e})=>[(u(),v(Pa,{"channel-type":e.type,key:e.type},null,8,["channel-type"]))]),_:1},8,["modelValue"])]))}},[["__scopeId","data-v-276ca51b"]]);export{Ma as default};
|
|
1
|
+
import{d as e}from"./vendors-DQA4Hw9v.js";import{r as a,a8 as l,f as n,w as s,h as c,K as t,a7 as o,c as i,o as u,a as r,W as d,a0 as v,X as p,Y as h,N as y,a3 as m,_ as g,p as f,R as k,L as T,F as C,$ as b,Z as w,v as x}from"./vue-vendor-B5RqjEjQ.js";import{g as $,u as _,a as S,s as z,D as P,_ as q,b as j,c as M,d as L,R as O,e as I,f as E,h as N,i as F,j as A,n as D}from"./index-D5hyHPj7.js";import{h as U,ar as J,E as V,P as R,as as K,at as B,au as Z,av as G,aa as H,i as W,A as X,aw as Y,ax as Q,T as ee,a as ae,b as le}from"./icons-nGdSKQn2.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 re}from"./naive-ui-BALVpMgd.js";import"./markdown-BNJfEgCA.js";const de=a({theme:"light",panelVisibility:{showChannels:!0,showLogs:!0},channelBalance:{showRemaining:!1},channelLocks:{claude:!1,codex:!1,gemini:!1,opencode:!1,omp:!1},channelCollapse:{claude:[],codex:[],gemini:[],opencode:[],omp:[]},channelOrder:{claude:[],codex:[],gemini:[],opencode:[],omp:[]},dashboardChannelOrder:P,homeCliColumns:P,customCliPlatforms:[]});let ve=!1,pe=null;async function he(){return ve?de.value:pe||(pe=(async()=>{try{const e=await $();e.success&&e.config&&(de.value=e.config,ve=!0)}catch(e){}finally{pe=null}return de.value})(),pe)}function ye(){return ve||he(),{uiConfig:de,loadUIConfig:he,saveConfig:async function(e){try{const a=await z(e);return!!a.success&&(de.value=a.config,!0)}catch(a){return!1}},updateConfig:async function(e,a){try{const l=await S(e,a);return!!l.success&&(de.value=l.config,!0)}catch(l){return!1}},updateNestedConfig:async function(e,a,l){try{const n=await _(e,a,l);return!!n.success&&(de.value=n.config,!0)}catch(n){return!1}}}}const me={class:"channel-column"},ge={class:"drag-handle",title:"拖拽排序"},fe={class:"header-icon"},ke={class:"channel-title"},Te={key:0,class:"claude-extra-area"},Ce={key:0,class:"channel-content"},be={key:0,class:"card"},we={class:"card-header"},xe={class:"card-title"},$e={key:0,class:"runtime-badge"},_e={class:"card-body",style:{padding:"6px 10px"}},Se={class:"proxy-info-row"},ze={class:"proxy-status"},Pe={key:0,class:"proxy-port"},qe={class:"channel-name"},je={class:"channel-quick-panel"},Me={class:"panel-title"},Le={key:0,class:"no-channels"},Oe={key:1,class:"channel-quick-list"},Ie={class:"channel-quick-info"},Ee={class:"channel-quick-name"},Ne={key:0,class:"channel-switching-tip"},Fe={class:"channel-metrics"},Ae={class:"metric-item"},De={class:"metric-value"},Ue={class:"metric-item"},Je={class:"metric-value"},Ve={class:"metric-item"},Re={class:"metric-value"},Ke={class:"metric-item"},Be={class:"card"},Ze={class:"card-header compact"},Ge={class:"card-body",style:{padding:"8px 10px"}},He={class:"quick-access-list"},We={class:"access-icon"},Xe={class:"access-content"},Ye={class:"access-value"},Qe={class:"access-icon"},ea={class:"access-content"},aa={class:"access-value"},la={class:"access-icon"},na={class:"access-content"},sa={class:"access-goto"},ca={class:"card-header compact"},ta={class:"card-body",style:{padding:"8px 10px"}},oa={class:"stats-inline stats-3col"},ia={class:"stat-inline-item stat-requests"},ua={class:"stat-info"},ra={class:"stat-inline-item stat-input"},da={class:"stat-info"},va={class:"stat-inline-item stat-output"},pa={class:"stat-info"},ha={key:2,class:"card logs-card"},ya={class:"card-header compact"},ma={class:"card-body logs-card-body"},ga={class:"logs-table-wrapper"},fa={key:0,class:"empty-logs"},ka=["title"],Ta={key:0,class:"action-content"},Ca={class:"action-msg"},ba={class:"action-time"},wa={key:1,class:"action-content"},xa={class:"action-msg error-msg"},$a={class:"action-time error-time"},_a={class:"locked-content"},Sa={class:"lock-icon"},za="channelLocks",Pa=q({__name:"ChannelColumn",props:{channelType:{type:String,required:!0}},setup(e){const S=e,z=l(),P=ne(),{uiConfig:q}=ye(),{claudeProxy:D,codexProxy:de,geminiProxy:ve,opencodeProxy:pe,ompProxy:he,claudeChannels:Pa,codexChannels:qa,geminiChannels:ja,opencodeChannels:Ma,ompChannels:La,schedulerState:Oa,getProxyState:Ia,startProxy:Ea,stopProxy:Na,getLogs:Fa,clearLogsForSource:Aa,loadChannels:Da,logLimit:Ua,statsInterval:Ja}=j(),{dashboardData:Va,loadDashboard:Ra}=M(),Ka=n(()=>L(S.channelType,q.value.customCliPlatforms)),Ba=n(()=>Ka.value.title||Ka.value.label||S.channelType),Za=n(()=>Ka.value.icon||U),Ga=n(()=>Ka.value.color||"#64748b"),Ha=n(()=>"claude"===S.channelType?D.value:"codex"===S.channelType?de.value:"gemini"===S.channelType?ve.value:"opencode"===S.channelType?pe.value:"omp"===S.channelType?he.value:Ka.value.custom?{running:!1,loading:!1,activeChannel:null,port:null,runtime:null,startTime:null}:{}),Wa=n(()=>"claude"===S.channelType?"Claude":"codex"===S.channelType?"Codex":"gemini"===S.channelType?"Gemini":"opencode"===S.channelType?"OpenCode":"omp"===S.channelType?"OMP":Ka.value.label||S.channelType),Xa=a({projects:0,sessions:0}),Ya=a({requests:0,tokens:0,cost:0}),Qa=a({requests:0,tokens:0,cost:0}),el={requests:0,tokens:0,cost:3};let al={requests:null,tokens:null,cost:null};const ll=a({requests:!1,tokens:!1,cost:!1}),nl=n(()=>{var e,a,l;return(null==(l=null==(a=null==(e=Va.value)?void 0:e.todayStats)?void 0:a[S.channelType])?void 0:l.byModel)||{}});function sl(e,a,l,n=600){al[e]&&cancelAnimationFrame(al[e]),ll.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,r=el[e]??0,d=Math.pow(10,r),v=r>0?Math.round(u*d)/d:Math.round(u);Qa.value[e]=v,o<1?al[e]=requestAnimationFrame(c):ll.value[e]=!1};al[e]=requestAnimationFrame(c)}const cl=a(!1),tl={claude:"claudeChannelCollapse",codex:"codexChannelCollapse",gemini:"geminiChannelCollapse",opencode:"opencodeChannelCollapse",omp:"ompChannelCollapse"};function ol(e){try{const a=localStorage.getItem(za),l=a?JSON.parse(a):{};l[S.channelType]=e,localStorage.setItem(za,JSON.stringify(l))}catch(a){}}const il=a(function(){try{const e=localStorage.getItem(za);if(e){return JSON.parse(e)[S.channelType]||!1}}catch(e){}return!1}());async function ul(){il.value=!il.value,ol(il.value);try{if(await _("channelLocks",S.channelType,il.value),Va.value){const e=Va.value.uiConfig||{},a={...e.channelLocks||{}};a[S.channelType]=il.value,Va.value={...Va.value,uiConfig:{...e,channelLocks:a}}}}catch(e){}}const rl=a(!0);function dl(e){e.detail&&void 0!==e.detail.showLogs&&(rl.value=e.detail.showLogs)}const vl=a(Date.now()),pl=n(()=>{if(!Ha.value.running)return"";const e=Ha.value.startTime;if(!e)return"";const a=vl.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}),hl=a(null),yl=n(()=>Ua.value),ml={claude:Fa("claude"),codex:Fa("codex"),gemini:Fa("gemini"),opencode:Fa("opencode"),omp:Fa("omp")},gl=n(()=>{if(!Pl())return[];const e=ml[S.channelType];if(!e)return[];return(e.value||[]).slice(0,yl.value)});let fl=null,kl=null,Tl=null,Cl=!1,bl=null;const wl=n(()=>{let e=[];"claude"===S.channelType?e=Pa.value||[]:"codex"===S.channelType?e=qa.value||[]:"gemini"===S.channelType?e=ja.value||[]:"opencode"===S.channelType?e=Ma.value||[]:"omp"===S.channelType&&(e=La.value||[]);return[...e.filter(e=>!1!==e.enabled),...e.filter(e=>!1===e.enabled)]});function xl(e){const a=Oa[S.channelType];if(!a||!a.channels)return 0;const l=a.channels.find(a=>a.id===e);return l?l.inflight:0}const $l=n(()=>{const e=wl.value.filter(e=>!1!==e.enabled).length;return Ha.value.running?`${e}个渠道动态切换中`:wl.value.length>0?`${e}个渠道已启用`:"无渠道"}),_l=n(()=>{var e,a,l;return(null==(l=null==(a=null==(e=Va.value)?void 0:e.todayStats)?void 0:a[S.channelType])?void 0:l.byChannel)||{}});function Sl(e){return _l.value[e]||{requests:0,tokens:0,cost:0}}function zl(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 Pl(){return["claude","codex","gemini","opencode","omp"].includes(S.channelType)}function ql(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 jl(e){var a,l;if(!1===Ka.value.supportsProxy||!Pl())return void P.warning(`${Ba.value} 暂未接入动态代理`);const n=Ia(S.channelType);n.value.loading=!0;try{let a;a=e?await Ea(S.channelType):await Na(S.channelType,{refreshChannelsDrawer:!0}),!1!==a.success?"omp"===S.channelType?P.success(e?"OMP 动态切换与会话日志观察已启用":"OMP 已切换为单渠道直连模式"):P.success(e?`${Ba.value} 代理已启动`:`${Ba.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 Ml(){!1!==Ka.value.supportsProjects&&Pl()?z.push({name:`${S.channelType}-projects`}):P.info(`${Ba.value} 当前仅作为首页显示项`)}function Ll(){!1!==Ka.value.supportsProjects&&Pl()?z.push({name:`${S.channelType}-projects`}):P.info(`${Ba.value} 当前仅作为首页显示项`)}function Ol(){!1!==Ka.value.supportsSessions&&Pl()?cl.value=!0:P.info(`${Ba.value} 当前没有托管会话列表`)}s(gl,e=>{var a;const l=(null==(a=e[0])?void 0:a.id)||null;if(!l||l===fl)return void(fl=l);fl=l,bl&&clearTimeout(bl),bl=setTimeout(()=>{Ra(!0,{fresh:!0}).then(()=>Dl()).catch(()=>{})},5e3);(!hl.value||hl.value.scrollTop<20)&&x(()=>{hl.value&&(hl.value.scrollTop=0)})}),s(()=>Ya.value.requests,e=>{sl("requests",Qa.value.requests,e,600)}),s(()=>Ya.value.tokens,e=>{sl("tokens",Qa.value.tokens,e,600)}),s(()=>Ya.value.cost,e=>{sl("cost",Qa.value.cost,e,600)}),s(()=>S.channelType,()=>{var e;fl=(null==(e=gl.value[0])?void 0:e.id)||null}),s(()=>{var e,a;return null==(a=null==(e=Va.value)?void 0:e.counts)?void 0:a[S.channelType]},()=>{Al()}),s(()=>{var e,a;return null==(a=null==(e=Va.value)?void 0:e.todayStats)?void 0:a[S.channelType]},()=>{Dl()},{deep:!0}),s(Ja,()=>{Cl&&function(){kl&&(clearInterval(kl),kl=null);const e=Ja.value||30,a=Math.max(1e3*e,1e4);kl=setInterval(()=>{Ra(!0,{fresh:!0}).then(()=>Dl()).catch(()=>{})},a)}()});const Il=a({});function El(e){return!!Il.value[e]}function Nl(e,a){e&&(Il.value={...Il.value,[e]:!!a})}async function Fl(e,a){if(e&&!El(e.id)){Nl(e.id,!0);try{let l;"claude"===S.channelType?l=I:"codex"===S.channelType?l=E:"gemini"===S.channelType?l=N:"opencode"===S.channelType?l=F:"omp"===S.channelType&&(l=A),l&&(await l(e.id,{enabled:a}),await async function(e,a){if(!e)return;const l=tl[S.channelType];let n={};try{const e=l?localStorage.getItem(l):null;n=e?JSON.parse(e):{}}catch(s){n={}}a?delete n[e]:n[e]=!0;try{l&&localStorage.setItem(l,JSON.stringify(n))}catch(s){}try{await _("channelCollapse",S.channelType,n)}catch(s){}}(e.id,a),P.success(a?`渠道「${e.name}」已启用`:`渠道「${e.name}」已停用`),await Da(),window.dispatchEvent(new CustomEvent("channel-management-refresh",{detail:{channel:S.channelType}})))}catch(l){P.error("操作失败: "+l.message)}finally{Nl(e.id,!1)}}}function Al(){var e,a;const l=null==(a=null==(e=Va.value)?void 0:e.counts)?void 0:a[S.channelType];Xa.value.projects=(null==l?void 0:l.projectCount)||0,Xa.value.sessions=(null==l?void 0:l.sessionCount)||0}async function Dl(){if(Va.value&&Va.value.todayStats){const e=Va.value.todayStats[S.channelType];e&&(Ya.value.requests=e.requests||0,Ya.value.tokens=e.tokens||0,Ya.value.cost=e.cost||0)}Al()}function Ul(){Aa(S.channelType)}function Jl(e){var a,l;null==(l=null==(a=null==e?void 0:e.currentTarget)?void 0:a.blur)||l.call(a)}function Vl(e){window.dispatchEvent(new CustomEvent("open-skills-drawer",{detail:{platform:S.channelType}})),Jl(e)}function Rl(e){window.dispatchEvent(new CustomEvent("open-commands-drawer",{detail:{platform:S.channelType}})),Jl(e)}function Kl(e){if(!1===Ka.value.supportsAgents)return P.info(`${Ba.value} 的 Agent 能力通过插件/扩展提供`),void Jl(e);window.dispatchEvent(new CustomEvent("open-agents-drawer",{detail:{platform:S.channelType}})),Jl(e)}return c(async()=>{await Ra().then(()=>Dl()),async function(){var e,a;try{if(Va.value&&Va.value.uiConfig)rl.value=!1!==(null==(e=Va.value.uiConfig.panelVisibility)?void 0:e.showLogs);else{const e=await $();e.success&&e.config&&(rl.value=!1!==(null==(a=e.config.panelVisibility)?void 0:a.showLogs))}}catch(l){}}(),async function(){var e,a;try{let l=!1;if(Va.value&&Va.value.uiConfig)l=(null==(e=Va.value.uiConfig.channelLocks)?void 0:e[S.channelType])||!1;else{const e=await $();e.success&&e.config&&(l=(null==(a=e.config.channelLocks)?void 0:a[S.channelType])||!1)}il.value=l,ol(l)}catch(l){}}(),window.addEventListener("panel-visibility-change",dl),Qa.value={...Ya.value},Cl=!0,Tl=setInterval(()=>{vl.value=Date.now()},1e3)}),t(()=>{Cl=!1,kl&&clearInterval(kl),Tl&&clearInterval(Tl),bl&&clearTimeout(bl),window.removeEventListener("panel-visibility-change",dl),Object.values(al).forEach(e=>{e&&cancelAnimationFrame(e)})}),(a,l)=>{const n=o("n-collapse");return u(),i("div",me,[r("div",{class:T(["channel-header",[e.channelType,{"custom-cli":Ka.value.custom}]]),style:k(Ka.value.custom?{"--channel-accent":Ga.value}:null)},[r("div",ge,[p(y(se),{size:16},{default:h(()=>[p(y(J))]),_:1})]),r("div",fe,[p(y(se),{size:20},{default:h(()=>[(u(),v(m(Za.value)))]),_:1})]),r("h2",ke,g(Ba.value),1),!1!==Ka.value.supportsManagedConfig?(u(),i("div",Te,[p(y(te),{trigger:"hover"},{trigger:h(()=>[p(y(ce),{text:"",class:"config-shortcut-button",onClick:Vl,title:"Skills 技能管理"},{icon:h(()=>[p(y(se),{size:18},{default:h(()=>[p(y(V))]),_:1})]),_:1})]),default:h(()=>[l[2]||(l[2]=f(" Skills 技能管理 ",-1))]),_:1}),p(y(te),{trigger:"hover"},{trigger:h(()=>[p(y(ce),{text:"",class:"config-shortcut-button",onClick:Rl,title:"Commands 命令管理"},{icon:h(()=>[p(y(se),{size:18},{default:h(()=>[p(y(U))]),_:1})]),_:1})]),default:h(()=>[l[3]||(l[3]=f(" Commands 命令管理 ",-1))]),_:1}),!1!==Ka.value.supportsAgents?(u(),v(y(te),{key:0,trigger:"hover"},{trigger:h(()=>[p(y(ce),{text:"",class:"config-shortcut-button",onClick:Kl,title:"Agents 代理管理"},{icon:h(()=>[p(y(se),{size:18},{default:h(()=>[p(y(R))]),_:1})]),_:1})]),default:h(()=>[l[4]||(l[4]=f(" Agents 代理管理 ",-1))]),_:1})):d("",!0)])):d("",!0),p(y(ce),{text:"",class:"lock-button",onClick:ul,title:il.value?"解锁此列":"锁定此列"},{icon:h(()=>[p(y(se),{size:18},{default:h(()=>[il.value?(u(),v(y(K),{key:0})):(u(),v(y(B),{key:1}))]),_:1})]),_:1},8,["title"])],6),il.value?d("",!0):(u(),i("div",Ce,[!1!==Ka.value.supportsProxy?(u(),i("div",be,[r("div",we,[p(y(se),{size:16},{default:h(()=>[p(y(Z))]),_:1}),r("h3",xe,g("omp"===e.channelType?"动态切换":"代理控制"),1),Ha.value.running&&pl.value?(u(),i("span",$e,g(pl.value),1)):d("",!0),p(y(oe),{value:Ha.value.running,"onUpdate:value":[l[0]||(l[0]=e=>Ha.value.running=e),jl],loading:Ha.value.loading,size:"small",style:{"margin-left":"auto"}},null,8,["value","loading"])]),r("div",_e,[r("div",Se,[r("div",ze,[r("div",{class:T(["status-dot",{active:Ha.value.running}])},null,2),p(y(ie),{type:Ha.value.running?"success":"default",style:{"font-size":"12px"}},{default:h(()=>[f(g(Ha.value.running?"运行中":"已停止"),1)]),_:1},8,["type"]),"omp"!==e.channelType?(u(),i("span",Pe,"端口: "+g(Ha.value.port),1)):d("",!0)]),p(y(re),{trigger:"click",placement:"bottom",width:320,class:"channel-popover"},{trigger:h(()=>[p(y(ce),{text:"",size:"tiny",class:"channel-status"},{default:h(()=>[r("span",qe,g($l.value),1)]),_:1})]),default:h(()=>[r("div",je,[r("div",Me,[l[6]||(l[6]=r("span",null,"渠道快捷管理",-1)),p(y(ie),{depth:"3",style:{"font-size":"11px"}},{default:h(()=>[...l[5]||(l[5]=[f("点击开关切换状态",-1)])]),_:1})]),0===wl.value.length?(u(),i("div",Le,[p(y(ie),{depth:"3"},{default:h(()=>[...l[7]||(l[7]=[f("暂无配置渠道",-1)])]),_:1})])):(u(),i("div",Oe,[(u(!0),i(C,null,b(wl.value,e=>{var a,n;return u(),i("div",{key:e.id,class:T(["channel-quick-item",{disabled:!1===e.enabled}])},[r("div",Ie,[r("span",Ee,g(e.name),1),"frozen"===(null==(a=e.health)?void 0:a.status)?(u(),v(y(ue),{key:0,size:"tiny",type:"error",bordered:!1},{default:h(()=>[...l[8]||(l[8]=[f(" 冻结 ",-1)])]),_:1})):d("",!0),p(y(oe),{size:"small",value:!1!==e.enabled,"onUpdate:value":a=>Fl(e,a),loading:El(e.id),disabled:El(e.id),style:{"margin-left":"auto"}},null,8,["value","onUpdate:value","loading","disabled"])]),El(e.id)?(u(),i("div",Ne," 正在切换渠道状态... ")):d("",!0),r("div",Fe,[r("span",Ae,[l[9]||(l[9]=r("span",{class:"metric-label"},"请求",-1)),r("span",De,g(Sl(e.id).requests),1)]),r("span",Ue,[l[10]||(l[10]=r("span",{class:"metric-label"},"Tokens",-1)),r("span",Je,g((n=Sl(e.id).tokens,n>=1e6?(n/1e6).toFixed(1)+"M":n>=1e3?(n/1e3).toFixed(1)+"K":n.toString())),1)]),r("span",Ve,[l[11]||(l[11]=r("span",{class:"metric-label"},"权重",-1)),r("span",Re,g(e.weight||1),1)]),r("span",Ke,[l[12]||(l[12]=r("span",{class:"metric-label"},"并发",-1)),r("span",{class:T(["metric-value",{active:xl(e.id)>0}])},g(xl(e.id))+g(e.maxConcurrency?`/${e.maxConcurrency}`:""),3)])])],2)}),128))]))])]),_:1})])])])):d("",!0),r("div",Be,[r("div",Ze,[p(y(se),{size:14},{default:h(()=>[p(y(G))]),_:1}),l[13]||(l[13]=r("h3",{class:"card-title"},"快速访问",-1))]),r("div",Ge,[r("div",He,[r("div",{class:T(["access-card access-card-projects",{clickable:!1!==Ka.value.supportsProjects,disabled:!1===Ka.value.supportsProjects}]),onClick:Ml},[r("div",We,[p(y(se),{size:16},{default:h(()=>[p(y(H))]),_:1})]),r("div",Xe,[l[14]||(l[14]=r("span",{class:"access-label"},"项目",-1)),r("span",Ye,g(Xa.value.projects),1)])],2),r("div",{class:T(["access-card access-card-sessions",{clickable:!1!==Ka.value.supportsSessions,disabled:!1===Ka.value.supportsSessions}]),onClick:Ol},[r("div",Qe,[p(y(se),{size:16},{default:h(()=>[p(y(W))]),_:1})]),r("div",ea,[l[15]||(l[15]=r("span",{class:"access-label"},"最新对话",-1)),r("span",aa,g(Xa.value.sessions),1)])],2),r("div",{class:T(["access-card access-card-goto",{clickable:!1!==Ka.value.supportsProjects,disabled:!1===Ka.value.supportsProjects}]),onClick:Ll},[r("div",la,[p(y(se),{size:16},{default:h(()=>[p(y(X))]),_:1})]),r("div",na,[l[16]||(l[16]=r("span",{class:"access-label"},"前往",-1)),r("span",sa,g(Wa.value),1)])],2)])])]),r("div",{class:T(["card stats-card",`stats-card-${e.channelType}`])},[r("div",ca,[p(y(se),{size:14},{default:h(()=>[p(y(Y))]),_:1}),l[17]||(l[17]=r("h3",{class:"card-title"},"今日数据",-1))]),r("div",ta,[r("div",oa,[r("div",ia,[l[19]||(l[19]=r("div",{class:"stat-icon-dot requests"},null,-1)),r("div",ua,[l[18]||(l[18]=r("span",{class:"stat-label"},"请求",-1)),r("span",{class:T(["stat-value",{animating:ll.value.requests}])},g(Qa.value.requests),3)])]),r("div",ra,[l[21]||(l[21]=r("div",{class:"stat-icon-dot tokens"},null,-1)),r("div",da,[l[20]||(l[20]=r("span",{class:"stat-label"},"总 Tokens",-1)),r("span",{class:T(["stat-value",{animating:ll.value.tokens}])},g((c=Qa.value.tokens,c>=1e6?(c/1e6).toFixed(1)+"M":c>=1e3?(c/1e3).toFixed(1)+"K":c.toString())),3)])]),r("div",va,[l[23]||(l[23]=r("div",{class:"stat-icon-dot cost"},null,-1)),r("div",pa,[l[22]||(l[22]=r("span",{class:"stat-label"},"成本 / USD",-1)),r("span",{class:T(["stat-value",{animating:ll.value.cost}])},g((s=Qa.value.cost,!s||Number.isNaN(s)?"$0":"$"+Number(s).toFixed(3))),3)])])])])],2),Object.keys(nl.value).length>0?(u(),i("div",{key:1,class:T(["card chart-card",`chart-card-${e.channelType}`])},[p(n,{"default-expanded-names":[],accordion:""})],2)):d("",!0),rl.value?(u(),i("div",ha,[r("div",ya,[p(y(se),{size:14},{default:h(()=>[p(y(Q))]),_:1}),l[24]||(l[24]=r("h3",{class:"card-title"},"实时日志",-1)),p(y(ce),{text:"",size:"tiny",onClick:w(Ul,["stop"]),style:{"margin-left":"auto"},title:"清空日志"},{icon:h(()=>[p(y(se),{size:14},{default:h(()=>[p(y(ee))]),_:1})]),_:1})]),r("div",ma,[r("div",ga,[r("div",{class:T(["logs-table-header",`logs-header-${e.channelType}`])},[r("div",{class:T(["log-col col-channel",`col-channel-${e.channelType}`])},"渠道",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"请求",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"回复",2),"claude"===e.channelType?(u(),i(C,{key:0},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"写入",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"命中",2)],64)):"codex"===e.channelType?(u(),i(C,{key:1},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"推理",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"总计",2)],64)):"gemini"===e.channelType?(u(),i(C,{key:2},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"总计",2)],64)):"opencode"===e.channelType||"omp"===e.channelType?(u(),i(C,{key:3},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"推理",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"总计",2)],64)):d("",!0),r("div",{class:T(["log-col col-time",`col-time-${e.channelType}`])},"时间",2)],2),r("div",{class:"logs-container",ref_key:"logsContainer",ref:hl},[0===gl.value.length?(u(),i("div",fa,[p(y(se),{size:32,depth:"3",style:{"margin-bottom":"8px"}},{default:h(()=>[p(y(Q))]),_:1}),p(y(ie),{depth:"3",style:{"font-size":"12px","font-weight":"500"}},{default:h(()=>[...l[25]||(l[25]=[f("暂无实时日志",-1)])]),_:1}),p(y(ie),{depth:"3",style:{"font-size":"11px","margin-top":"4px"}},{default:h(()=>[f(g("omp"===e.channelType?"开启动态切换后将观察新增 OMP 会话用量":"开启代理后将显示请求记录"),1)]),_:1})])):d("",!0),(u(!0),i(C,null,b(gl.value,a=>(u(),i("div",{key:a.id,class:T(["log-row",{"action-row":"action"===a.type,"error-row":"error"===a.status,"new-log":a.isNew}]),title:ql(a)},["action"===a.type?(u(),i("div",Ta,[p(y(se),{size:12,color:"#18a058"},{default:h(()=>[p(y(ae))]),_:1}),r("span",Ca,g(a.message),1),r("span",ba,g(a.time),1)])):"error"===a.status?(u(),i("div",wa,[p(y(se),{size:12,color:"#d03050"},{default:h(()=>[p(y(le))]),_:1}),r("span",xa,g(a.channel)+": "+g(a.error||a.message||"请求失败"),1),r("span",$a,g(a.time),1)])):(u(),i(C,{key:2},[r("div",{class:T(["log-col col-channel",`col-channel-${e.channelType}`])},[p(y(ue),{size:"tiny",type:"success"},{default:h(()=>[f(g(a.channel),1)]),_:2},1024)],2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"input")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"output")),3),"claude"===e.channelType?(u(),i(C,{key:0},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"cacheCreation")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"cacheRead")),3)],64)):"codex"===e.channelType?(u(),i(C,{key:1},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"reasoning")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"cached")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"total")),3)],64)):"gemini"===e.channelType?(u(),i(C,{key:2},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"cached")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"total")),3)],64)):"opencode"===e.channelType||"omp"===e.channelType?(u(),i(C,{key:3},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"reasoning")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"cached")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"total")),3)],64)):d("",!0),r("div",{class:T(["log-col col-time",`col-time-${e.channelType}`])},g(a.time),3)],64))],10,ka))),128))],512)])])])):d("",!0)])),il.value?(u(),i("div",{key:1,class:T(["locked-overlay",`locked-${e.channelType}`])},[r("div",_a,[r("div",Sa,[p(y(se),{size:48},{default:h(()=>[p(y(K))]),_:1})]),l[27]||(l[27]=r("h3",{class:"locked-title"},"该渠道已锁定",-1)),p(y(ie),{depth:"3",class:"locked-hint"},{default:h(()=>[...l[26]||(l[26]=[f(" 点击上方按钮解锁以查看内容 ",-1)])]),_:1})])],2)):d("",!0),!1!==Ka.value.supportsSessions?(u(),v(O,{key:2,visible:cl.value,"onUpdate:visible":l[1]||(l[1]=e=>cl.value=e),channel:e.channelType},null,8,["visible","channel"])):d("",!0)]);var s,c}}},[["__scopeId","data-v-ecbe0ece"]]),qa={class:"dashboard-container"},ja="dashboardChannelOrder",Ma=q({__name:"Home",setup(l){const{uiConfig:n,updateConfig:s,loadUIConfig:o}=ye();function r(e){try{localStorage.setItem(ja,JSON.stringify(e))}catch(a){}}function d(e,a=n.value.customCliPlatforms){const l=D(e,a);return m.value=l.map(e=>({type:e})),r(l),l}const m=a(function(){try{const e=localStorage.getItem(ja);if(e){const a=JSON.parse(e);return D(a,n.value.customCliPlatforms)}}catch(e){}return P}().map(e=>({type:e})));async function g(){const e=D(m.value.map(e=>e.type),n.value.customCliPlatforms);m.value=e.map(e=>({type:e})),r(e),await s("homeCliColumns",e),await s("dashboardChannelOrder",e)}function f(e){const a=(null==e?void 0:e.detail)||{};d(a.homeCliColumns,a.customCliPlatforms)}return c(async()=>{window.addEventListener("home-cli-columns-change",f),await o(),d(n.value.homeCliColumns||n.value.dashboardChannelOrder,n.value.customCliPlatforms)}),t(()=>{window.removeEventListener("home-cli-columns-change",f)}),(a,l)=>(u(),i("div",qa,[p(y(e),{modelValue:m.value,"onUpdate:modelValue":l[0]||(l[0]=e=>m.value=e),class:"dashboard-grid","item-key":"type",animation:200,handle:".drag-handle",onEnd:g},{item:h(({element:e})=>[(u(),v(Pa,{"channel-type":e.type,key:e.type},null,8,["channel-type"]))]),_:1},8,["modelValue"])]))}},[["__scopeId","data-v-276ca51b"]]);export{Ma as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as a,P as s}from"./index-
|
|
1
|
+
import{_ as a,P as s}from"./index-D5hyHPj7.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-BALVpMgd.js";import"./icons-nGdSKQn2.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 l,a as s,X as n,s as o,Y as r,N as i,_ as c,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 j,$ as k,a6 as w,R as x,v as C}from"./vue-vendor-B5RqjEjQ.js";import{d as b}from"./vendors-DQA4Hw9v.js";import{_ as z,k as $,l as P,m as L,o as N,p as M,q as D}from"./index-
|
|
1
|
+
import{r as e,f as a,c as t,o as l,a as s,X as n,s as o,Y as r,N as i,_ as c,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 j,$ as k,a6 as w,R as x,v as C}from"./vue-vendor-B5RqjEjQ.js";import{d as b}from"./vendors-DQA4Hw9v.js";import{_ as z,k as $,l as P,m as L,o as N,p as M,q as D}from"./index-D5hyHPj7.js";import{a9 as I,T,d as E,ad as K,h as U}from"./icons-nGdSKQn2.js";import{N as R,B as q,c as V,a as H,_ as O,p as S,m as A,g as B,x as F,h as G,q as W}from"./naive-ui-BALVpMgd.js";import"./markdown-BNJfEgCA.js";const X={class:"card-content"},Y={class:"header-row"},Z={class:"project-name"},J={class:"stats-row"},Q=z({__name:"ProjectCard",props:{project:{type:Object,required:!0}},emits:["click","delete"],setup(f,{emit:h}){const y=f,g=h,_=e(!1);function j(){g("click")}function k(){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}),z=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 $(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)=>(l(),t("div",{class:"project-card",onClick:j,onMouseenter:a[0]||(a[0]=e=>_.value=!0),onMouseleave:a[1]||(a[1]=e=>_.value=!1)},[s("div",X,[s("div",Y,[n(i(R),{size:"18",color:z.value},{default:r(()=>[n(i(I))]),_:1},8,["color"]),s("span",Z,c(w.value),1),o(n(i(q),{text:"",type:"error",size:"tiny",class:"delete-btn",onClick:d(k,["stop"])},{icon:r(()=>[n(i(R),{size:"14"},{default:r(()=>[n(i(T))]),_:1})]),_:1},512),[[u,_.value]])]),n(i(V),{depth:"3",class:"project-path"},{default:r(()=>[p(c(x.value),1)]),_:1}),s("div",J,[n(i(H),{size:"tiny",bordered:!1,type:"success"},{default:r(()=>[p(c(C.value)+" 会话 ",1)]),_:1}),b.value?(l(),v(i(V),{key:0,depth:"3",class:"last-used"},{default:r(()=>[p(c($(b.value)),1)]),_:1})):m("",!0)])])],32))}},[["__scopeId","data-v-3a18e66d"]]),ee={class:"project-list-container"},ae={class:"header"},te={class:"header-text"},le={key:0,class:"loading-container"},se={key:1,class:"loading-container compact"},ne={key:4,class:"projects-grid"},oe={class:"search-hint"},re={style:{"margin-bottom":"16px"}},ie={key:0,style:{"max-height":"60vh","overflow-y":"auto"}},ce={class:"search-result-header"},ue={class:"search-result-title"},de=z({__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),de=e(""),pe=e(null),ve=e(!1),me=e(null),fe=a(()=>{const e=X.value.toLowerCase();return Y.value.filter(a=>{const t=(a.displayName||"").toLowerCase(),l=(a.fullPath||"").toLowerCase();return t.includes(e)||l.includes(e)})});function he(e){const a=d.meta.channel||"claude";u.push({name:`${a}-sessions`,params:{projectName:e}})}async function ye(){const e=Y.value.map(e=>e.name);await z.saveProjectOrder(e)}function ge(e){const a=e.fullPath||e.name,t=e.sessionCount||0;N.warning({title:"删除项目",content:`确定要删除项目 "${a}" 吗?\n\n当前项目包含 ${t} 个会话,删除后所有会话数据将无法恢复!`,positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{try{await z.deleteProject(e.name),L.success("项目已删除")}catch(a){L.error("删除失败: "+a.message)}}})}async function _e(){try{const a="codex"===(e=T.value||"claude")?"codex":"gemini"===e?"gemini":"opencode"===e?"opencode":"omp"===e?"omp":"claude",t=await P(a);if("manual"===(null==t?void 0:t.method))return void L.warning("自动复制失败,已弹出手动复制框");L.success("基础启动命令已复制到剪贴板")}catch(a){L.error("复制失败: "+a.message)}var e}async function je(){if(de.value){ve.value=!0;try{const e=await M(de.value,35,T.value);pe.value=e}catch(e){L.error("搜索失败: "+e.message)}finally{ve.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 we(e){(e.metaKey||e.ctrlKey)&&"k"===e.key&&(e.preventDefault(),J.value=!0,C(()=>{var e;null==(e=me.value)||e.focus()}))}return y(()=>z.projects,e=>{Y.value=[...e]},{immediate:!0}),y(J,e=>{e||(de.value="",pe.value=null)}),y(T,e=>{z.setChannel(e),z.fetchProjects()},{immediate:!0}),g(()=>{document.addEventListener("keydown",we)}),_(()=>{document.removeEventListener("keydown",we)}),(e,a)=>(l(),t("div",ee,[s("div",ae,[s("div",te,[n(i(O),{style:{margin:"0"}},{default:r(()=>[...a[4]||(a[4]=[p("我的项目",-1)])]),_:1}),n(i(V),{depth:"3"},{default:r(()=>[...a[5]||(a[5]=[p("选择一个项目查看会话,拖拽可调整顺序",-1)])]),_:1})]),n(i(A),null,{default:r(()=>[n(i(q),{type:"primary",size:"medium",onClick:_e},{icon:r(()=>[n(i(R),null,{default:r(()=>[n(i(E))]),_:1})]),default:r(()=>[a[6]||(a[6]=p(" 新建项目 ",-1))]),_:1}),n(i(S),{value:X.value,"onUpdate:value":a[0]||(a[0]=e=>X.value=e),placeholder:"搜索项目...",clearable:"",class:"search-input"},{prefix:r(()=>[n(i(R),null,{default:r(()=>[n(i(K))]),_:1})]),_:1},8,["value"])]),_:1})]),s("div",{class:"content",ref_key:"contentEl",ref:Z},[i(z).loading&&0===i(z).projects.length&&!i(z).projectsPending?(l(),t("div",le,[n(i(B),{size:"large"},{description:r(()=>[...a[7]||(a[7]=[p(" 加载项目列表... ",-1)])]),_:1})])):i(z).projectsPending?(l(),t("div",se,[n(i(B),{size:"small"},{description:r(()=>[...a[8]||(a[8]=[p(" 正在生成项目列表... ",-1)])]),_:1})])):i(z).error&&0===i(z).projects.length?(l(),v(i(F),{key:2,type:"error",title:"加载失败",style:{"margin-top":"20px"}},{default:r(()=>[p(c(i(z).error),1)]),_:1})):!X.value&&Y.value.length>0?(l(),v(i(b),{key:3,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:ye},{item:r(({element:e})=>[n(Q,{project:e,onClick:a=>he(e.name),onDelete:ge},null,8,["project","onClick"])]),_:1},8,["modelValue"])):X.value&&fe.value.length>0?(l(),t("div",ne,[(l(!0),t(j,null,k(fe.value,e=>(l(),v(Q,{key:e.name,project:e,onClick:a=>he(e.name),onDelete:ge},null,8,["project","onClick"]))),128))])):m("",!0),i(z).loading||i(z).error||i(z).projectsPending||!(!X.value&&0===i(z).projects.length||X.value&&0===fe.value.length)?m("",!0):(l(),v(i(G),{key:5,description:X.value?"没有匹配的项目":"没有找到项目",style:{"margin-top":"60px"}},{icon:r(()=>[n(i(R),null,{default:r(()=>[n(i(I))]),_:1})]),_:1},8,["description"]))],512),s("div",oe,[n(i(V),{depth:"3",style:{"font-size":"12px"}},{default:r(()=>[...a[9]||(a[9]=[s("kbd",null,"Cmd",-1),p(" / ",-1),s("kbd",null,"Ctrl",-1),p(" + ",-1),s("kbd",null,"K",-1),p(" 全局搜索 ",-1)])]),_:1})]),n(i(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(()=>[s("div",re,[n(i(S),{ref_key:"globalSearchInputRef",ref:me,value:de.value,"onUpdate:value":a[2]||(a[2]=e=>de.value=e),placeholder:"搜索所有项目的对话内容...",clearable:"",onKeyup:w(je,["enter"]),disabled:ve.value},{prefix:r(()=>[n(i(R),null,{default:r(()=>[n(i(K))]),_:1})]),suffix:r(()=>[n(i(q),{text:"",onClick:je,disabled:!de.value||ve.value,loading:ve.value},{default:r(()=>[...a[10]||(a[10]=[p(" 搜索 ",-1)])]),_:1},8,["disabled","loading"])]),_:1},8,["value","disabled"])]),pe.value?(l(),t("div",ie,[n(i(F),{type:"info",style:{"margin-bottom":"16px"}},{default:r(()=>[p(' 关键词 "'+c(pe.value.keyword)+'" 共找到 '+c(pe.value.totalMatches)+" 处匹配 ",1)]),_:1}),(l(!0),t(j,null,k(pe.value.sessions,e=>(l(),t("div",{key:`${e.projectName}-${e.sessionId}`,class:"search-result-item"},[s("div",ce,[s("div",ue,[n(i(V),{strong:"",style:{"font-size":"15px","font-weight":"700"}},{default:r(()=>[p(c(e.projectDisplayName),1)]),_:2},1024),n(i(V),{depth:"2",style:{margin:"0 8px"}},{default:r(()=>[...a[11]||(a[11]=[p("·",-1)])]),_:1}),n(i(V),{strong:""},{default:r(()=>[p(c(e.alias?`${e.alias} (${e.sessionId.substring(0,8)})`:e.sessionId.substring(0,8)),1)]),_:2},1024),n(i(H),{size:"small",bordered:!1},{default:r(()=>[p(c(e.matchCount)+" 个匹配",1)]),_:2},1024)]),n(i(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)?L.warning("自动复制失败,已弹出手动复制框"):L.success("启动命令已复制到剪贴板"),J.value=!1}catch(t){L.error("复制失败: "+t.message)}}(e.projectName,e.sessionId)},{icon:r(()=>[n(i(R),null,{default:r(()=>[n(i(U))]),_:1})]),default:r(()=>[a[12]||(a[12]=p(" 使用对话 ",-1))]),_:1},8,["onClick"])]),(l(!0),t(j,null,k(e.matches,(e,a)=>(l(),t("div",{key:a,class:"search-match"},[n(i(H),{size:"tiny",type:"user"===e.role?"info":"success",bordered:!1},{default:r(()=>[p(c("user"===e.role?"用户":"助手"),1)]),_:2},1032,["type"]),n(i(V),{depth:"3",class:"search-match-text",innerHTML:ke(e.context,pe.value.keyword)},null,8,["innerHTML"])]))),128))]))),128)),0===pe.value.sessions.length?(l(),v(i(G),{key:0,description:"没有找到匹配的内容"})):m("",!0)])):m("",!0)]),_:1},8,["show"])]))}},[["__scopeId","data-v-4a39735f"]]);export{de as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a8 as e,a5 as a,f as s,r as l,w as n,h as t,K as i,c as o,o as u,a as r,X as c,a0 as d,W as v,Y as f,N as m,p,_ 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,k as N,r as F,C as S,t as $,m as M,o as B,v as L,q as U}from"./index-DIWJmyL6.js";import{Z as P,T,ad as E,ay as A,k as q,G as K,a3 as D,az as G,q as H,h as O,Y as R}from"./icons-nGdSKQn2.js";import{N as V,B as W,_ as Y,c as Z,a as X,G as J,p as Q,g as ee,x as ae,s as se,m as le,h as ne,q as te,k as ie}from"./naive-ui-BALVpMgd.js";import"./markdown-BNJfEgCA.js";const oe={class:"session-list-container"},ue={class:"header"},re={class:"title-bar"},ce={class:"title-section"},de={class:"title-with-count"},ve={class:"header-actions"},fe={key:0,class:"loading-container"},me={key:1,class:"loading-container compact"},pe=["onMouseenter","onClick"],he={key:0,class:"drag-handle"},ye={class:"session-left"},ge={class:"session-icon"},ke={class:"session-info"},_e={class:"session-header"},we={class:"session-title-row"},be={class:"session-title"},Ie={class:"session-meta"},Ce={class:"session-right"},je={class:"session-tags-area"},ze={key:0,class:"session-actions"},xe={key:0,style:{"max-height":"70vh","overflow-y":"auto"}},Ne={class:"search-result-header"},Fe={class:"search-result-title"},Se="__full__",$e=x({__name:"SessionList",props:{projectName:{type:String,required:!0}},setup(x){const $e=x,Me=e(),Be=a(),Le=N(),{addFavorite:Ue,removeFavorite:Pe,isFavorite:Te}=F(),Ee=s(()=>Be.meta.channel||"claude"),Ae=l($e.projectName),qe=s(()=>Ae.value||$e.projectName),Ke=l(""),De=l(!1),Ge=l(null),He=l(""),Oe=l(null),Re=l([]),Ve=l(null),We=l(!1),Ye=l(null),Ze=l(!1),Xe=l(!1),Je=l([]),Qe=l(!1),ea=l(!1),aa=l(null),sa=l(""),la=l(Se),na=l(!1),ta=l(!1),ia=l([]),oa=l(!1),ua=l(""),ra=l(""),ca=l(null),da={group:{name:`${Ee.value}-sessions`,pull:!1,put:!1},forceFallback:!0,fallbackOnBody:!1,fallbackTolerance:4,scroll:!0},va=s(()=>{var e;return(null==(e=Le.currentProjectInfo)?void 0:e.displayName)||$e.projectName}),fa=s(()=>{var e;return(null==(e=Le.currentProjectInfo)?void 0:e.fullPath)||qe.value}),ma=s(()=>new Set(Je.value)),pa=s(()=>Je.value.length),ha=s(()=>Re.value.length>0&&Re.value.every(e=>ma.value.has(e.sessionId))),ya=s(()=>pa.value>0&&!ha.value);async function ga(){Le.projects.length||await Le.fetchProjects();const e=Le.projects.find(e=>e.name===$e.projectName);if(e)return Ae.value=e.name,e.name;const a=Le.projects.find(e=>e.displayName===$e.projectName||e.fullPath===$e.projectName);return a?(Ae.value=a.name,a.name!==$e.projectName&&await Me.replace({name:`${Ee.value}-sessions`,params:{projectName:a.name}}),a.name):(Ae.value=$e.projectName,$e.projectName)}n(()=>Le.sessionsWithAlias,e=>{Re.value=[...e];const a=new Set(e.map(e=>e.sessionId));Je.value=Je.value.filter(e=>a.has(e)),Xe.value&&0===e.length&&Ca()},{immediate:!0});const ka=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 _a(){const e=Be.meta.channel||"claude";Me.push({name:`${e}-projects`})}async function wa(){if(Ke.value){Ze.value=!0;try{const e=await $(qe.value,Ke.value,35,Ee.value);Ve.value=e,We.value=!0}catch(e){M.error("搜索失败: "+e.message)}finally{Ze.value=!1}}}async function ba(){const e=Re.value.map(e=>e.sessionId);await Le.saveSessionOrder(e)}function Ia(){Xe.value=!0,Oe.value=null}function Ca(){Xe.value=!1,Je.value=[],Oe.value=null}function ja(e){return ma.value.has(e)}function za(e,a=!ja(e)){const s=new Set(Je.value);a?s.add(e):s.delete(e),Je.value=Array.from(s)}function xa(e){Je.value=e?Re.value.map(e=>e.sessionId):[]}function Na(e){Xe.value?za(e.sessionId):function(e){ua.value=e.sessionId,ra.value=e.alias||"",oa.value=!0,j(()=>{var e;null==(e=ca.value)||e.open()})}(e)}async function Fa(){if(Ge.value)try{const e=Ge.value.sessionId;He.value?(await Le.setAlias(e,He.value),M.success("别名设置成功")):(await Le.deleteAlias(e),M.success("别名已删除")),De.value=!1,Ge.value=null,He.value=""}catch(e){M.error("操作失败: "+e.message)}}function Sa(){ea.value=!1,aa.value=null,sa.value="",la.value=Se,ia.value=[],na.value=!1,ta.value=!1}async function $a(){var e;if(aa.value)try{ta.value=!0,await Le.forkSession(aa.value.sessionId,{afterUserMessageNumber:la.value===Se?null:la.value,alias:(null==(e=sa.value)?void 0:e.trim())||void 0}),M.success("Fork 成功!"),Sa()}catch(a){M.error("Fork 失败: "+a.message)}finally{ta.value=!1}}function Ma(e){M.error(e)}function Ba(e){const a=new Set((e||[]).filter(Boolean));0!==a.size&&(Je.value=Je.value.filter(e=>!a.has(e)),ua.value&&a.has(ua.value)&&(oa.value=!1,ua.value="",ra.value=""))}async function La(e){try{const{copyResult:a}=await U(qe.value,e,Ee.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=[...Je.value];B.warning({title:"批量删除会话",content:`确定要删除选中的 ${e.length} 个会话吗?此操作不可恢复!`,positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{Qe.value=!0;try{const a=await Le.deleteSessions(e);if(Ba(a.deletedSessionIds),0===a.failed.length)return M.success(`已删除 ${a.deletedSessionIds.length} 个会话`),void Ca();Je.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{Qe.value=!1}}})}function Pa(e){if(!e)return"";return new Date(e).toLocaleString("zh-CN")}function Ta(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 Ea(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:""}let qa=0,Ka=!1;async function Da(){var e;if("visible"!==document.visibilityState||Ka)return;const a=Date.now();if(!(a-qa<3e4)){Ka=!0,qa=a;try{const a=(null==(e=Ye.value)?void 0:e.scrollTop)||0,s=await ga();await Le.fetchSessions(s,{force:!0,silent:!0,fresh:!0}),await j(),Ye.value&&(Ye.value.scrollTop=a)}finally{Ka=!1}}}function Ga(){"visible"===document.visibilityState&&Da().catch(()=>{})}function Ha(){Da().catch(()=>{})}return n([Ee,()=>$e.projectName],([e])=>{Ca(),Le.setChannel(e),async function(e={}){const a=await ga();await Le.fetchSessions(a,e)}()},{immediate:!0}),t(()=>{document.addEventListener("visibilitychange",Ga),window.addEventListener("focus",Ha)}),i(()=>{document.removeEventListener("visibilitychange",Ga),window.removeEventListener("focus",Ha)}),(e,a)=>(u(),o("div",oe,[r("div",ue,[r("div",re,[c(m(W),{size:"small",onClick:_a,class:"back-button"},{icon:f(()=>[c(m(V),{size:"18"},{default:f(()=>[c(m(P))]),_:1})]),_:1}),r("div",ce,[r("div",de,[c(m(Y),null,{default:f(()=>[p(h(va.value),1)]),_:1}),c(m(Z),{depth:"3",class:"session-count"},{default:f(()=>[p("("+h(m(Le).sessions.length)+" 个对话)",1)]),_:1}),c(m(X),{size:"small",bordered:!1,type:"info",class:"total-size-tag"},{default:f(()=>[p(h(Ta(m(Le).totalSize)),1)]),_:1}),r("div",ve,[Xe.value?(u(),o(y,{key:0},[c(m(J),{checked:ha.value,indeterminate:ya.value,disabled:0===Re.value.length||Qe.value,"onUpdate:checked":xa},{default:f(()=>[...a[12]||(a[12]=[p(" 全选 ",-1)])]),_:1},8,["checked","indeterminate","disabled"]),c(m(Z),{depth:"3"},{default:f(()=>[p("已选 "+h(pa.value)+" 个",1)]),_:1}),c(m(W),{size:"small",type:"error",disabled:0===pa.value,loading:Qe.value,onClick:Ua},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(T))]),_:1})]),default:f(()=>[a[13]||(a[13]=p(" 删除 ",-1))]),_:1},8,["disabled","loading"]),c(m(W),{size:"small",disabled:Qe.value,onClick:Ca},{default:f(()=>[...a[14]||(a[14]=[p(" 完成 ",-1)])]),_:1},8,["disabled"])],64)):(u(),d(m(W),{key:1,size:"small",type:"error",secondary:"",onClick:Ia},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(T))]),_:1})]),default:f(()=>[a[15]||(a[15]=p(" 管理 ",-1))]),_:1}))])]),c(m(Z),{depth:"3",class:"project-path"},{default:f(()=>[p(h(fa.value),1)]),_:1})]),c(m(Q),{value:Ke.value,"onUpdate:value":a[0]||(a[0]=e=>Ke.value=e),placeholder:"搜索会话...",clearable:"",class:"search-input",onKeyup:g(wa,["enter"]),disabled:Ze.value},{prefix:f(()=>[c(m(V),null,{default:f(()=>[c(m(E))]),_:1})]),suffix:f(()=>[c(m(W),{text:"",onClick:wa,disabled:!Ke.value||Ze.value,loading:Ze.value},{default:f(()=>[...a[16]||(a[16]=[p(" 搜索 ",-1)])]),_:1},8,["disabled","loading"])]),_:1},8,["value","disabled"])])]),r("div",{class:"content",ref_key:"contentEl",ref:Ye},[m(Le).loading&&0===m(Le).sessions.length&&!m(Le).sessionsPending?(u(),o("div",fe,[c(m(ee),{size:"large"},{description:f(()=>[...a[17]||(a[17]=[p(" 加载会话列表... ",-1)])]),_:1})])):m(Le).sessionsPending?(u(),o("div",me,[c(m(ee),{size:"small"},{description:f(()=>[...a[18]||(a[18]=[p(" 正在生成会话列表... ",-1)])]),_:1})])):m(Le).error&&0===m(Le).sessions.length?(u(),d(m(ae),{key:2,type:"error",title:"加载失败",style:{"margin-bottom":"16px"}},{default:f(()=>[p(h(m(Le).error),1)]),_:1})):ka.value.length>0?(u(),d(m(z),I({key:3,modelValue:Re.value,"onUpdate:modelValue":a[3]||(a[3]=e=>Re.value=e),"item-key":"sessionId",class:"sessions-list",handle:".drag-handle",disabled:Xe.value||Qe.value},da,{"ghost-class":"ghost","chosen-class":"chosen",animation:"200",onEnd:ba}),{item:f(({element:e})=>[r("div",{class:k(["session-item",{"session-item-selected":ja(e.sessionId),"session-item-selection-mode":Xe.value}]),onMouseenter:a=>Oe.value=e.sessionId,onMouseleave:a[2]||(a[2]=e=>Oe.value=null),onClick:a=>Na(e)},[Xe.value?(u(),o("div",{key:1,class:"selection-checkbox",onClick:a[1]||(a[1]=_(()=>{},["stop"]))},[c(m(J),{checked:ja(e.sessionId),"onUpdate:checked":a=>za(e.sessionId,a)},null,8,["checked","onUpdate:checked"])])):(u(),o("div",he,[c(m(V),{size:"16",color:"#999"},{default:f(()=>[c(m(A))]),_:1})])),r("div",ye,[r("div",ge,[c(m(V),{size:"24",color:"#18a058"},{default:f(()=>[c(m(q))]),_:1})]),r("div",ke,[r("div",_e,[r("div",we,[r("span",be,h(e.alias?`${e.alias} (${e.sessionId.substring(0,8)})`:e.sessionId),1),e.forkedFrom?(u(),d(m(se),{key:0,placement:"top"},{trigger:f(()=>[c(m(X),{size:"small",type:"warning",bordered:!1,style:{"margin-left":"8px",cursor:"help"}},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(K))]),_:1})]),default:f(()=>[a[19]||(a[19]=p(" Fork ",-1))]),_:1})]),default:f(()=>[p(" Fork 自: "+h(e.forkedFrom),1)]),_:2},1024)):v("",!0)])]),r("div",Ie,[c(m(Z),{depth:"3"},{default:f(()=>[p(h(Pa(e.mtime)),1)]),_:2},1024),c(m(Z),{depth:"3"},{default:f(()=>[...a[20]||(a[20]=[p("•",-1)])]),_:1}),c(m(X),{size:"small",bordered:!1},{default:f(()=>[p(h(Ta(e.size)),1)]),_:2},1024)]),e.firstMessage?(u(),d(m(Z),{key:0,depth:"3",class:"session-message"},{default:f(()=>[p(h(Aa(e.firstMessage,80)),1)]),_:2},1024)):e.gitBranch||e.summary?v("",!0):(u(),d(m(Z),{key:1,depth:"3",class:"session-message session-message-empty"},{default:f(()=>[...a[21]||(a[21]=[p(" 暂未读取到对话内容 ",-1)])]),_:1}))])]),r("div",Ce,[r("div",je,[e.gitBranch?(u(),d(m(X),{key:0,size:"small",type:"info",bordered:!1},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(K))]),_:1})]),default:f(()=>[p(" "+h(e.gitBranch),1)]),_:2},1024)):v("",!0)]),Xe.value?v("",!0):(u(),o("div",ze,[c(m(le),null,{default:f(()=>[w(c(m(W),{size:"small",type:"error",onClick:_(a=>{return s=e.sessionId,void B.warning({title:"删除会话",content:"确定要删除这个会话吗?此操作不可恢复!",positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{try{await Le.deleteSession(s),Ba([s]),M.success("会话已删除")}catch(e){M.error("删除失败: "+e.message)}}});var s},["stop"])},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(T))]),_:1})]),default:f(()=>[a[22]||(a[22]=p(" 删除 ",-1))]),_:1},8,["onClick"]),[[b,Oe.value===e.sessionId]]),c(m(W),{size:"small",onClick:_(a=>function(e){Ge.value=e,He.value=e.alias||"",De.value=!0}(e),["stop"])},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(D))]),_:1})]),default:f(()=>[a[23]||(a[23]=p(" 别名 ",-1))]),_:1},8,["onClick"]),c(m(W),{size:"small",type:m(Te)(Ee.value,qe.value,e.sessionId)?"warning":"default",onClick:_(a=>async function(e){const a=Ee.value,s=Te(a,qe.value,e.sessionId);try{if(s)await Pe(a,qe.value,e.sessionId),M.success("已取消收藏");else{const s={sessionId:e.sessionId,projectName:qe.value,projectDisplayName:va.value,projectFullPath:fa.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(()=>[c(m(V),null,{default:f(()=>[m(Te)(Ee.value,qe.value,e.sessionId)?(u(),d(m(G),{key:0})):(u(),d(m(H),{key:1}))]),_:2},1024)]),default:f(()=>[p(" "+h(m(Te)(Ee.value,qe.value,e.sessionId)?"已收藏":"收藏"),1)]),_:2},1032,["type","onClick"]),"opencode"!==Ee.value?(u(),d(m(W),{key:0,size:"small",onClick:_(a=>async function(e){if("opencode"!==Ee.value)try{const a=Re.value.find(a=>a.sessionId===e);aa.value=a||{sessionId:e},sa.value="",la.value=Se,ia.value=[{label:"完整会话末尾(保留全部消息)",value:Se}],ea.value=!0,na.value=!0;const s=await L(qe.value,e,Ee.value),l=Array.isArray(null==s?void 0:s.items)?s.items:[];ia.value=[{label:"完整会话末尾(保留全部消息)",value:Se},...l.map(e=>({label:`保留到第 ${e.userMessageNumber} 条用户消息这一轮 · ${e.preview}`,value:e.userMessageNumber}))]}catch(a){M.error("加载 Fork 位置失败: "+a.message),Sa()}finally{na.value=!1}else M.warning("OpenCode 当前不支持该 Fork 操作")}(e.sessionId),["stop"])},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(K))]),_:1})]),default:f(()=>[a[24]||(a[24]=p(" Fork ",-1))]),_:1},8,["onClick"])):v("",!0),c(m(W),{size:"small",type:"primary",onClick:_(a=>La(e.sessionId),["stop"])},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(O))]),_:1})]),default:f(()=>[a[25]||(a[25]=p(" 使用对话 ",-1))]),_:1},8,["onClick"])]),_:2},1024)]))])],42,pe)]),_:1},16,["modelValue","disabled"])):(u(),d(m(ne),{key:4,description:"没有找到会话",style:{"margin-top":"60px"}},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(R))]),_:1})]),_:1}))],512),c(m(te),{show:De.value,"onUpdate:show":a[6]||(a[6]=e=>De.value=e),preset:"dialog",title:"设置别名"},{action:f(()=>[c(m(le),null,{default:f(()=>[c(m(W),{onClick:a[5]||(a[5]=e=>De.value=!1)},{default:f(()=>[...a[26]||(a[26]=[p("取消",-1)])]),_:1}),c(m(W),{type:"primary",onClick:Fa},{default:f(()=>[...a[27]||(a[27]=[p("确定",-1)])]),_:1})]),_:1})]),default:f(()=>[c(m(Q),{value:He.value,"onUpdate:value":a[4]||(a[4]=e=>He.value=e),placeholder:"输入别名(留空删除)",onKeyup:g(Fa,["enter"])},null,8,["value"])]),_:1},8,["show"]),c(m(te),{show:ea.value,"onUpdate:show":a[9]||(a[9]=e=>ea.value=e),preset:"dialog",title:"Fork 对话"},{action:f(()=>[c(m(le),null,{default:f(()=>[c(m(W),{disabled:ta.value,onClick:Sa},{default:f(()=>[...a[29]||(a[29]=[p("取消",-1)])]),_:1},8,["disabled"]),c(m(W),{type:"primary",loading:ta.value,onClick:$a},{default:f(()=>[...a[30]||(a[30]=[p(" 确认 Fork ",-1)])]),_:1},8,["loading"])]),_:1})]),default:f(()=>[c(m(le),{vertical:"",size:14},{default:f(()=>[c(m(Z),{depth:"3"},{default:f(()=>[...a[28]||(a[28]=[p(" 可选择保留到第几条用户消息所在轮次;会包含这条消息后 AI 的完整输出。 ",-1)])]),_:1}),c(m(ie),{value:la.value,"onUpdate:value":a[7]||(a[7]=e=>la.value=e),options:ia.value,loading:na.value,clearable:"",placeholder:"选择保留到哪一轮(默认完整会话)"},null,8,["value","options","loading"]),c(m(Q),{value:sa.value,"onUpdate:value":a[8]||(a[8]=e=>sa.value=e),placeholder:"输入新会话别名(可选)",maxlength:"120"},null,8,["value"])]),_:1})]),_:1},8,["show"]),c(m(te),{show:We.value,"onUpdate:show":a[10]||(a[10]=e=>We.value=e),preset:"card",title:"搜索结果",style:{width:"1200px"}},{default:f(()=>[Ve.value?(u(),o("div",xe,[c(m(ae),{type:"info",style:{"margin-bottom":"16px"}},{default:f(()=>[p(' 关键词 "'+h(Ve.value.keyword)+'" 共找到 '+h(Ve.value.totalMatches)+" 处匹配 ",1)]),_:1}),(u(!0),o(y,null,C(Ve.value.sessions,e=>(u(),o("div",{key:e.sessionId,class:"search-result-item"},[r("div",Ne,[r("div",Fe,[c(m(Z),{strong:""},{default:f(()=>[p(h(e.alias?`${e.alias} (${e.sessionId.substring(0,8)})`:e.sessionId.substring(0,8)),1)]),_:2},1024),c(m(X),{size:"small",bordered:!1},{default:f(()=>[p(h(e.matchCount)+" 个匹配",1)]),_:2},1024)]),c(m(W),{size:"small",type:"primary",onClick:a=>La(e.sessionId)},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(O))]),_:1})]),default:f(()=>[a[31]||(a[31]=p(" 使用对话 ",-1))]),_:1},8,["onClick"])]),(u(!0),o(y,null,C(e.matches,(e,a)=>(u(),o("div",{key:a,class:"search-match"},[c(m(X),{size:"tiny",type:"user"===e.role?"info":"success",bordered:!1},{default:f(()=>[p(h("user"===e.role?"用户":"助手"),1)]),_:2},1032,["type"]),c(m(Z),{depth:"3",class:"search-match-text",innerHTML:Ea(e.context,Ve.value.keyword)},null,8,["innerHTML"])]))),128))]))),128)),0===Ve.value.sessions.length?(u(),d(m(ne),{key:0,description:"没有找到匹配的内容"})):v("",!0)])):v("",!0)]),_:1},8,["show"]),ua.value?(u(),d(S,{key:0,ref_key:"chatHistoryRef",ref:ca,show:oa.value,"onUpdate:show":a[11]||(a[11]=e=>oa.value=e),"project-name":qe.value,"session-id":ua.value,"session-alias":ra.value,channel:Ee.value,onError:Ma},null,8,["show","project-name","session-id","session-alias","channel"])):v("",!0)]))}},[["__scopeId","data-v-34bebfb4"]]);export{$e as default};
|
|
1
|
+
import{a8 as e,a5 as a,f as s,r as l,w as n,h as t,K as i,c as o,o as u,a as r,X as c,a0 as d,W as v,Y as f,N as m,p,_ 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,k as N,r as F,C as S,t as $,m as M,o as B,v as L,q as U}from"./index-D5hyHPj7.js";import{Z as P,T,ad as E,ay as A,k as q,G as K,a3 as D,az as G,q as H,h as O,Y as R}from"./icons-nGdSKQn2.js";import{N as V,B as W,_ as Y,c as Z,a as X,G as J,p as Q,g as ee,x as ae,s as se,m as le,h as ne,q as te,k as ie}from"./naive-ui-BALVpMgd.js";import"./markdown-BNJfEgCA.js";const oe={class:"session-list-container"},ue={class:"header"},re={class:"title-bar"},ce={class:"title-section"},de={class:"title-with-count"},ve={class:"header-actions"},fe={key:0,class:"loading-container"},me={key:1,class:"loading-container compact"},pe=["onMouseenter","onClick"],he={key:0,class:"drag-handle"},ye={class:"session-left"},ge={class:"session-icon"},ke={class:"session-info"},_e={class:"session-header"},we={class:"session-title-row"},be={class:"session-title"},Ie={class:"session-meta"},Ce={class:"session-right"},je={class:"session-tags-area"},ze={key:0,class:"session-actions"},xe={key:0,style:{"max-height":"70vh","overflow-y":"auto"}},Ne={class:"search-result-header"},Fe={class:"search-result-title"},Se="__full__",$e=x({__name:"SessionList",props:{projectName:{type:String,required:!0}},setup(x){const $e=x,Me=e(),Be=a(),Le=N(),{addFavorite:Ue,removeFavorite:Pe,isFavorite:Te}=F(),Ee=s(()=>Be.meta.channel||"claude"),Ae=l($e.projectName),qe=s(()=>Ae.value||$e.projectName),Ke=l(""),De=l(!1),Ge=l(null),He=l(""),Oe=l(null),Re=l([]),Ve=l(null),We=l(!1),Ye=l(null),Ze=l(!1),Xe=l(!1),Je=l([]),Qe=l(!1),ea=l(!1),aa=l(null),sa=l(""),la=l(Se),na=l(!1),ta=l(!1),ia=l([]),oa=l(!1),ua=l(""),ra=l(""),ca=l(null),da={group:{name:`${Ee.value}-sessions`,pull:!1,put:!1},forceFallback:!0,fallbackOnBody:!1,fallbackTolerance:4,scroll:!0},va=s(()=>{var e;return(null==(e=Le.currentProjectInfo)?void 0:e.displayName)||$e.projectName}),fa=s(()=>{var e;return(null==(e=Le.currentProjectInfo)?void 0:e.fullPath)||qe.value}),ma=s(()=>new Set(Je.value)),pa=s(()=>Je.value.length),ha=s(()=>Re.value.length>0&&Re.value.every(e=>ma.value.has(e.sessionId))),ya=s(()=>pa.value>0&&!ha.value);async function ga(){Le.projects.length||await Le.fetchProjects();const e=Le.projects.find(e=>e.name===$e.projectName);if(e)return Ae.value=e.name,e.name;const a=Le.projects.find(e=>e.displayName===$e.projectName||e.fullPath===$e.projectName);return a?(Ae.value=a.name,a.name!==$e.projectName&&await Me.replace({name:`${Ee.value}-sessions`,params:{projectName:a.name}}),a.name):(Ae.value=$e.projectName,$e.projectName)}n(()=>Le.sessionsWithAlias,e=>{Re.value=[...e];const a=new Set(e.map(e=>e.sessionId));Je.value=Je.value.filter(e=>a.has(e)),Xe.value&&0===e.length&&Ca()},{immediate:!0});const ka=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 _a(){const e=Be.meta.channel||"claude";Me.push({name:`${e}-projects`})}async function wa(){if(Ke.value){Ze.value=!0;try{const e=await $(qe.value,Ke.value,35,Ee.value);Ve.value=e,We.value=!0}catch(e){M.error("搜索失败: "+e.message)}finally{Ze.value=!1}}}async function ba(){const e=Re.value.map(e=>e.sessionId);await Le.saveSessionOrder(e)}function Ia(){Xe.value=!0,Oe.value=null}function Ca(){Xe.value=!1,Je.value=[],Oe.value=null}function ja(e){return ma.value.has(e)}function za(e,a=!ja(e)){const s=new Set(Je.value);a?s.add(e):s.delete(e),Je.value=Array.from(s)}function xa(e){Je.value=e?Re.value.map(e=>e.sessionId):[]}function Na(e){Xe.value?za(e.sessionId):function(e){ua.value=e.sessionId,ra.value=e.alias||"",oa.value=!0,j(()=>{var e;null==(e=ca.value)||e.open()})}(e)}async function Fa(){if(Ge.value)try{const e=Ge.value.sessionId;He.value?(await Le.setAlias(e,He.value),M.success("别名设置成功")):(await Le.deleteAlias(e),M.success("别名已删除")),De.value=!1,Ge.value=null,He.value=""}catch(e){M.error("操作失败: "+e.message)}}function Sa(){ea.value=!1,aa.value=null,sa.value="",la.value=Se,ia.value=[],na.value=!1,ta.value=!1}async function $a(){var e;if(aa.value)try{ta.value=!0,await Le.forkSession(aa.value.sessionId,{afterUserMessageNumber:la.value===Se?null:la.value,alias:(null==(e=sa.value)?void 0:e.trim())||void 0}),M.success("Fork 成功!"),Sa()}catch(a){M.error("Fork 失败: "+a.message)}finally{ta.value=!1}}function Ma(e){M.error(e)}function Ba(e){const a=new Set((e||[]).filter(Boolean));0!==a.size&&(Je.value=Je.value.filter(e=>!a.has(e)),ua.value&&a.has(ua.value)&&(oa.value=!1,ua.value="",ra.value=""))}async function La(e){try{const{copyResult:a}=await U(qe.value,e,Ee.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=[...Je.value];B.warning({title:"批量删除会话",content:`确定要删除选中的 ${e.length} 个会话吗?此操作不可恢复!`,positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{Qe.value=!0;try{const a=await Le.deleteSessions(e);if(Ba(a.deletedSessionIds),0===a.failed.length)return M.success(`已删除 ${a.deletedSessionIds.length} 个会话`),void Ca();Je.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{Qe.value=!1}}})}function Pa(e){if(!e)return"";return new Date(e).toLocaleString("zh-CN")}function Ta(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 Ea(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:""}let qa=0,Ka=!1;async function Da(){var e;if("visible"!==document.visibilityState||Ka)return;const a=Date.now();if(!(a-qa<3e4)){Ka=!0,qa=a;try{const a=(null==(e=Ye.value)?void 0:e.scrollTop)||0,s=await ga();await Le.fetchSessions(s,{force:!0,silent:!0,fresh:!0}),await j(),Ye.value&&(Ye.value.scrollTop=a)}finally{Ka=!1}}}function Ga(){"visible"===document.visibilityState&&Da().catch(()=>{})}function Ha(){Da().catch(()=>{})}return n([Ee,()=>$e.projectName],([e])=>{Ca(),Le.setChannel(e),async function(e={}){const a=await ga();await Le.fetchSessions(a,e)}()},{immediate:!0}),t(()=>{document.addEventListener("visibilitychange",Ga),window.addEventListener("focus",Ha)}),i(()=>{document.removeEventListener("visibilitychange",Ga),window.removeEventListener("focus",Ha)}),(e,a)=>(u(),o("div",oe,[r("div",ue,[r("div",re,[c(m(W),{size:"small",onClick:_a,class:"back-button"},{icon:f(()=>[c(m(V),{size:"18"},{default:f(()=>[c(m(P))]),_:1})]),_:1}),r("div",ce,[r("div",de,[c(m(Y),null,{default:f(()=>[p(h(va.value),1)]),_:1}),c(m(Z),{depth:"3",class:"session-count"},{default:f(()=>[p("("+h(m(Le).sessions.length)+" 个对话)",1)]),_:1}),c(m(X),{size:"small",bordered:!1,type:"info",class:"total-size-tag"},{default:f(()=>[p(h(Ta(m(Le).totalSize)),1)]),_:1}),r("div",ve,[Xe.value?(u(),o(y,{key:0},[c(m(J),{checked:ha.value,indeterminate:ya.value,disabled:0===Re.value.length||Qe.value,"onUpdate:checked":xa},{default:f(()=>[...a[12]||(a[12]=[p(" 全选 ",-1)])]),_:1},8,["checked","indeterminate","disabled"]),c(m(Z),{depth:"3"},{default:f(()=>[p("已选 "+h(pa.value)+" 个",1)]),_:1}),c(m(W),{size:"small",type:"error",disabled:0===pa.value,loading:Qe.value,onClick:Ua},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(T))]),_:1})]),default:f(()=>[a[13]||(a[13]=p(" 删除 ",-1))]),_:1},8,["disabled","loading"]),c(m(W),{size:"small",disabled:Qe.value,onClick:Ca},{default:f(()=>[...a[14]||(a[14]=[p(" 完成 ",-1)])]),_:1},8,["disabled"])],64)):(u(),d(m(W),{key:1,size:"small",type:"error",secondary:"",onClick:Ia},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(T))]),_:1})]),default:f(()=>[a[15]||(a[15]=p(" 管理 ",-1))]),_:1}))])]),c(m(Z),{depth:"3",class:"project-path"},{default:f(()=>[p(h(fa.value),1)]),_:1})]),c(m(Q),{value:Ke.value,"onUpdate:value":a[0]||(a[0]=e=>Ke.value=e),placeholder:"搜索会话...",clearable:"",class:"search-input",onKeyup:g(wa,["enter"]),disabled:Ze.value},{prefix:f(()=>[c(m(V),null,{default:f(()=>[c(m(E))]),_:1})]),suffix:f(()=>[c(m(W),{text:"",onClick:wa,disabled:!Ke.value||Ze.value,loading:Ze.value},{default:f(()=>[...a[16]||(a[16]=[p(" 搜索 ",-1)])]),_:1},8,["disabled","loading"])]),_:1},8,["value","disabled"])])]),r("div",{class:"content",ref_key:"contentEl",ref:Ye},[m(Le).loading&&0===m(Le).sessions.length&&!m(Le).sessionsPending?(u(),o("div",fe,[c(m(ee),{size:"large"},{description:f(()=>[...a[17]||(a[17]=[p(" 加载会话列表... ",-1)])]),_:1})])):m(Le).sessionsPending?(u(),o("div",me,[c(m(ee),{size:"small"},{description:f(()=>[...a[18]||(a[18]=[p(" 正在生成会话列表... ",-1)])]),_:1})])):m(Le).error&&0===m(Le).sessions.length?(u(),d(m(ae),{key:2,type:"error",title:"加载失败",style:{"margin-bottom":"16px"}},{default:f(()=>[p(h(m(Le).error),1)]),_:1})):ka.value.length>0?(u(),d(m(z),I({key:3,modelValue:Re.value,"onUpdate:modelValue":a[3]||(a[3]=e=>Re.value=e),"item-key":"sessionId",class:"sessions-list",handle:".drag-handle",disabled:Xe.value||Qe.value},da,{"ghost-class":"ghost","chosen-class":"chosen",animation:"200",onEnd:ba}),{item:f(({element:e})=>[r("div",{class:k(["session-item",{"session-item-selected":ja(e.sessionId),"session-item-selection-mode":Xe.value}]),onMouseenter:a=>Oe.value=e.sessionId,onMouseleave:a[2]||(a[2]=e=>Oe.value=null),onClick:a=>Na(e)},[Xe.value?(u(),o("div",{key:1,class:"selection-checkbox",onClick:a[1]||(a[1]=_(()=>{},["stop"]))},[c(m(J),{checked:ja(e.sessionId),"onUpdate:checked":a=>za(e.sessionId,a)},null,8,["checked","onUpdate:checked"])])):(u(),o("div",he,[c(m(V),{size:"16",color:"#999"},{default:f(()=>[c(m(A))]),_:1})])),r("div",ye,[r("div",ge,[c(m(V),{size:"24",color:"#18a058"},{default:f(()=>[c(m(q))]),_:1})]),r("div",ke,[r("div",_e,[r("div",we,[r("span",be,h(e.alias?`${e.alias} (${e.sessionId.substring(0,8)})`:e.sessionId),1),e.forkedFrom?(u(),d(m(se),{key:0,placement:"top"},{trigger:f(()=>[c(m(X),{size:"small",type:"warning",bordered:!1,style:{"margin-left":"8px",cursor:"help"}},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(K))]),_:1})]),default:f(()=>[a[19]||(a[19]=p(" Fork ",-1))]),_:1})]),default:f(()=>[p(" Fork 自: "+h(e.forkedFrom),1)]),_:2},1024)):v("",!0)])]),r("div",Ie,[c(m(Z),{depth:"3"},{default:f(()=>[p(h(Pa(e.mtime)),1)]),_:2},1024),c(m(Z),{depth:"3"},{default:f(()=>[...a[20]||(a[20]=[p("•",-1)])]),_:1}),c(m(X),{size:"small",bordered:!1},{default:f(()=>[p(h(Ta(e.size)),1)]),_:2},1024)]),e.firstMessage?(u(),d(m(Z),{key:0,depth:"3",class:"session-message"},{default:f(()=>[p(h(Aa(e.firstMessage,80)),1)]),_:2},1024)):e.gitBranch||e.summary?v("",!0):(u(),d(m(Z),{key:1,depth:"3",class:"session-message session-message-empty"},{default:f(()=>[...a[21]||(a[21]=[p(" 暂未读取到对话内容 ",-1)])]),_:1}))])]),r("div",Ce,[r("div",je,[e.gitBranch?(u(),d(m(X),{key:0,size:"small",type:"info",bordered:!1},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(K))]),_:1})]),default:f(()=>[p(" "+h(e.gitBranch),1)]),_:2},1024)):v("",!0)]),Xe.value?v("",!0):(u(),o("div",ze,[c(m(le),null,{default:f(()=>[w(c(m(W),{size:"small",type:"error",onClick:_(a=>{return s=e.sessionId,void B.warning({title:"删除会话",content:"确定要删除这个会话吗?此操作不可恢复!",positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{try{await Le.deleteSession(s),Ba([s]),M.success("会话已删除")}catch(e){M.error("删除失败: "+e.message)}}});var s},["stop"])},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(T))]),_:1})]),default:f(()=>[a[22]||(a[22]=p(" 删除 ",-1))]),_:1},8,["onClick"]),[[b,Oe.value===e.sessionId]]),c(m(W),{size:"small",onClick:_(a=>function(e){Ge.value=e,He.value=e.alias||"",De.value=!0}(e),["stop"])},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(D))]),_:1})]),default:f(()=>[a[23]||(a[23]=p(" 别名 ",-1))]),_:1},8,["onClick"]),c(m(W),{size:"small",type:m(Te)(Ee.value,qe.value,e.sessionId)?"warning":"default",onClick:_(a=>async function(e){const a=Ee.value,s=Te(a,qe.value,e.sessionId);try{if(s)await Pe(a,qe.value,e.sessionId),M.success("已取消收藏");else{const s={sessionId:e.sessionId,projectName:qe.value,projectDisplayName:va.value,projectFullPath:fa.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(()=>[c(m(V),null,{default:f(()=>[m(Te)(Ee.value,qe.value,e.sessionId)?(u(),d(m(G),{key:0})):(u(),d(m(H),{key:1}))]),_:2},1024)]),default:f(()=>[p(" "+h(m(Te)(Ee.value,qe.value,e.sessionId)?"已收藏":"收藏"),1)]),_:2},1032,["type","onClick"]),"opencode"!==Ee.value?(u(),d(m(W),{key:0,size:"small",onClick:_(a=>async function(e){if("opencode"!==Ee.value)try{const a=Re.value.find(a=>a.sessionId===e);aa.value=a||{sessionId:e},sa.value="",la.value=Se,ia.value=[{label:"完整会话末尾(保留全部消息)",value:Se}],ea.value=!0,na.value=!0;const s=await L(qe.value,e,Ee.value),l=Array.isArray(null==s?void 0:s.items)?s.items:[];ia.value=[{label:"完整会话末尾(保留全部消息)",value:Se},...l.map(e=>({label:`保留到第 ${e.userMessageNumber} 条用户消息这一轮 · ${e.preview}`,value:e.userMessageNumber}))]}catch(a){M.error("加载 Fork 位置失败: "+a.message),Sa()}finally{na.value=!1}else M.warning("OpenCode 当前不支持该 Fork 操作")}(e.sessionId),["stop"])},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(K))]),_:1})]),default:f(()=>[a[24]||(a[24]=p(" Fork ",-1))]),_:1},8,["onClick"])):v("",!0),c(m(W),{size:"small",type:"primary",onClick:_(a=>La(e.sessionId),["stop"])},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(O))]),_:1})]),default:f(()=>[a[25]||(a[25]=p(" 使用对话 ",-1))]),_:1},8,["onClick"])]),_:2},1024)]))])],42,pe)]),_:1},16,["modelValue","disabled"])):(u(),d(m(ne),{key:4,description:"没有找到会话",style:{"margin-top":"60px"}},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(R))]),_:1})]),_:1}))],512),c(m(te),{show:De.value,"onUpdate:show":a[6]||(a[6]=e=>De.value=e),preset:"dialog",title:"设置别名"},{action:f(()=>[c(m(le),null,{default:f(()=>[c(m(W),{onClick:a[5]||(a[5]=e=>De.value=!1)},{default:f(()=>[...a[26]||(a[26]=[p("取消",-1)])]),_:1}),c(m(W),{type:"primary",onClick:Fa},{default:f(()=>[...a[27]||(a[27]=[p("确定",-1)])]),_:1})]),_:1})]),default:f(()=>[c(m(Q),{value:He.value,"onUpdate:value":a[4]||(a[4]=e=>He.value=e),placeholder:"输入别名(留空删除)",onKeyup:g(Fa,["enter"])},null,8,["value"])]),_:1},8,["show"]),c(m(te),{show:ea.value,"onUpdate:show":a[9]||(a[9]=e=>ea.value=e),preset:"dialog",title:"Fork 对话"},{action:f(()=>[c(m(le),null,{default:f(()=>[c(m(W),{disabled:ta.value,onClick:Sa},{default:f(()=>[...a[29]||(a[29]=[p("取消",-1)])]),_:1},8,["disabled"]),c(m(W),{type:"primary",loading:ta.value,onClick:$a},{default:f(()=>[...a[30]||(a[30]=[p(" 确认 Fork ",-1)])]),_:1},8,["loading"])]),_:1})]),default:f(()=>[c(m(le),{vertical:"",size:14},{default:f(()=>[c(m(Z),{depth:"3"},{default:f(()=>[...a[28]||(a[28]=[p(" 可选择保留到第几条用户消息所在轮次;会包含这条消息后 AI 的完整输出。 ",-1)])]),_:1}),c(m(ie),{value:la.value,"onUpdate:value":a[7]||(a[7]=e=>la.value=e),options:ia.value,loading:na.value,clearable:"",placeholder:"选择保留到哪一轮(默认完整会话)"},null,8,["value","options","loading"]),c(m(Q),{value:sa.value,"onUpdate:value":a[8]||(a[8]=e=>sa.value=e),placeholder:"输入新会话别名(可选)",maxlength:"120"},null,8,["value"])]),_:1})]),_:1},8,["show"]),c(m(te),{show:We.value,"onUpdate:show":a[10]||(a[10]=e=>We.value=e),preset:"card",title:"搜索结果",style:{width:"1200px"}},{default:f(()=>[Ve.value?(u(),o("div",xe,[c(m(ae),{type:"info",style:{"margin-bottom":"16px"}},{default:f(()=>[p(' 关键词 "'+h(Ve.value.keyword)+'" 共找到 '+h(Ve.value.totalMatches)+" 处匹配 ",1)]),_:1}),(u(!0),o(y,null,C(Ve.value.sessions,e=>(u(),o("div",{key:e.sessionId,class:"search-result-item"},[r("div",Ne,[r("div",Fe,[c(m(Z),{strong:""},{default:f(()=>[p(h(e.alias?`${e.alias} (${e.sessionId.substring(0,8)})`:e.sessionId.substring(0,8)),1)]),_:2},1024),c(m(X),{size:"small",bordered:!1},{default:f(()=>[p(h(e.matchCount)+" 个匹配",1)]),_:2},1024)]),c(m(W),{size:"small",type:"primary",onClick:a=>La(e.sessionId)},{icon:f(()=>[c(m(V),null,{default:f(()=>[c(m(O))]),_:1})]),default:f(()=>[a[31]||(a[31]=p(" 使用对话 ",-1))]),_:1},8,["onClick"])]),(u(!0),o(y,null,C(e.matches,(e,a)=>(u(),o("div",{key:a,class:"search-match"},[c(m(X),{size:"tiny",type:"user"===e.role?"info":"success",bordered:!1},{default:f(()=>[p(h("user"===e.role?"用户":"助手"),1)]),_:2},1032,["type"]),c(m(Z),{depth:"3",class:"search-match-text",innerHTML:Ea(e.context,Ve.value.keyword)},null,8,["innerHTML"])]))),128))]))),128)),0===Ve.value.sessions.length?(u(),d(m(ne),{key:0,description:"没有找到匹配的内容"})):v("",!0)])):v("",!0)]),_:1},8,["show"]),ua.value?(u(),d(S,{key:0,ref_key:"chatHistoryRef",ref:ca,show:oa.value,"onUpdate:show":a[11]||(a[11]=e=>oa.value=e),"project-name":qe.value,"session-id":ua.value,"session-alias":ra.value,channel:Ee.value,onError:Ma},null,8,["show","project-name","session-id","session-alias","channel"])):v("",!0)]))}},[["__scopeId","data-v-34bebfb4"]]);export{$e as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a5 as a,f as r,c as s,o as e,X as o,Y as t,N as l}from"./vue-vendor-B5RqjEjQ.js";import{_ as i,B as m,S as n}from"./index-
|
|
1
|
+
import{a5 as a,f as r,c as s,o as e,X as o,Y as t,N as l}from"./vue-vendor-B5RqjEjQ.js";import{_ as i,B as m,S as n}from"./index-D5hyHPj7.js";import{K as p}from"./naive-ui-BALVpMgd.js";import"./markdown-BNJfEgCA.js";import"./icons-nGdSKQn2.js";import"./vendors-DQA4Hw9v.js";const d={class:"skill-manager"},u=i({__name:"SkillManager",setup(i){const u=a(),f=m.filter(a=>!1!==a.supportsSkills).map(a=>a.key),c=r(()=>{const a=Array.isArray(u.query.platform)?u.query.platform[0]:u.query.platform;return f.includes(a)?a:""});return(a,r)=>(e(),s("div",d,[o(l(p),{title:"Skills 技能管理",bordered:!1},{default:t(()=>[o(n,{"in-drawer":!1,"hide-back":!0,platform:c.value},null,8,["platform"])]),_:1})]))}},[["__scopeId","data-v-191a19e2"]]);export{u as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as a,W as s}from"./index-
|
|
1
|
+
import{_ as a,W as s}from"./index-D5hyHPj7.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-BALVpMgd.js";import"./icons-nGdSKQn2.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};
|