coding-tool-x 3.7.3 → 3.7.4

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.
@@ -6,6 +6,11 @@ const path = require('path');
6
6
  const { URL } = require('url');
7
7
  const { PATHS } = require('../../config/paths');
8
8
  const { loadUIConfig } = require('./ui-config');
9
+ const {
10
+ getSnapshot,
11
+ refreshSnapshot,
12
+ invalidateSnapshot
13
+ } = require('./snapshot-cache');
9
14
 
10
15
  const CACHE_TTL_MS = 5 * 60 * 1000;
11
16
  const REQUEST_TIMEOUT_MS = 8000;
@@ -1489,6 +1494,14 @@ function buildCacheKey(source, channel) {
1489
1494
  ].join(':');
1490
1495
  }
1491
1496
 
1497
+ function buildBalanceSnapshotKey(source, channel) {
1498
+ return `channel-balances:${buildCacheKey(source, channel)}`;
1499
+ }
1500
+
1501
+ function makeFallbackBalanceSnapshot(currentTime = Date.now()) {
1502
+ return makeHiddenSnapshot(null, { stale: true, updatedAt: nowIso(currentTime) });
1503
+ }
1504
+
1492
1505
  async function refreshChannelBalanceSnapshot(source, channel, options = {}) {
1493
1506
  const force = options.force === true;
1494
1507
  const currentTime = options.now || Date.now();
@@ -1588,6 +1601,7 @@ function clearChannelBalanceCache(source, channel) {
1588
1601
  let strategyChanged = false;
1589
1602
 
1590
1603
  balanceCache.delete(exactKey);
1604
+ invalidateSnapshot(`channel-balances:${exactKey}`);
1591
1605
  for (const key of Array.from(balanceCache.keys())) {
1592
1606
  if (key.startsWith(prefix)) {
1593
1607
  balanceCache.delete(key);
@@ -1665,19 +1679,45 @@ async function mapWithConcurrency(items, limit, worker) {
1665
1679
  async function getChannelBalances(source, options = {}) {
1666
1680
  const normalizedSource = validateSource(source);
1667
1681
  if (!isBalanceDisplayEnabled()) {
1668
- return { enabled: false, source: normalizedSource, balances: {} };
1682
+ return {
1683
+ enabled: false,
1684
+ source: normalizedSource,
1685
+ balances: {},
1686
+ refreshing: false,
1687
+ updatedAt: null,
1688
+ stale: false
1689
+ };
1669
1690
  }
1670
1691
 
1671
1692
  const channels = getEnabledBalanceChannels(normalizedSource);
1693
+ const currentTime = options.now || Date.now();
1672
1694
  const entries = await mapWithConcurrency(channels, 4, async (channel) => {
1673
- const snapshot = await refreshChannelBalanceSnapshot(normalizedSource, channel, options);
1674
- return [channel.id, snapshot];
1695
+ const snapshot = await getSnapshot(buildBalanceSnapshotKey(normalizedSource, channel), {
1696
+ ttlMs: CACHE_TTL_MS,
1697
+ fallbackValue: makeFallbackBalanceSnapshot(currentTime),
1698
+ refresh: () => refreshChannelBalanceSnapshot(normalizedSource, channel, { ...options, force: true, now: Date.now() })
1699
+ });
1700
+ const value = {
1701
+ ...snapshot.value,
1702
+ stale: Boolean(snapshot.value?.stale || snapshot.meta.stale)
1703
+ };
1704
+ return [channel.id, value, snapshot.meta];
1675
1705
  });
1676
1706
 
1707
+ const metas = entries.map((entry) => entry[2]).filter(Boolean);
1708
+ const updatedAt = metas
1709
+ .map(meta => meta.generatedAt)
1710
+ .filter(Boolean)
1711
+ .sort()
1712
+ .pop() || null;
1713
+
1677
1714
  return {
1678
1715
  enabled: true,
1679
1716
  source: normalizedSource,
1680
- balances: Object.fromEntries(entries.filter(([id]) => id))
1717
+ balances: Object.fromEntries(entries.filter(([id]) => id).map(([id, snapshot]) => [id, snapshot])),
1718
+ refreshing: metas.some(meta => meta.refreshing),
1719
+ updatedAt,
1720
+ stale: metas.some(meta => meta.stale)
1681
1721
  };
1682
1722
  }
1683
1723
 
@@ -1695,7 +1735,11 @@ async function refreshChannelBalance(source, channelId) {
1695
1735
  throw error;
1696
1736
  }
1697
1737
 
1698
- const balance = await refreshChannelBalanceSnapshot(normalizedSource, channel, { force: true });
1738
+ const entry = await refreshSnapshot(
1739
+ buildBalanceSnapshotKey(normalizedSource, channel),
1740
+ () => refreshChannelBalanceSnapshot(normalizedSource, channel, { force: true })
1741
+ );
1742
+ const balance = entry.value;
1699
1743
  return {
1700
1744
  enabled: true,
1701
1745
  source: normalizedSource,
@@ -1707,6 +1751,7 @@ async function refreshChannelBalance(source, channelId) {
1707
1751
  function clearBalanceCache() {
1708
1752
  balanceCache.clear();
1709
1753
  balanceStrategyCache.clear();
1754
+ invalidateSnapshot('channel-balances:');
1710
1755
  strategyCacheLoaded = false;
1711
1756
  }
1712
1757
 
@@ -1739,6 +1784,7 @@ module.exports = {
1739
1784
  build88CodeSubscriptionSnapshot,
1740
1785
  buildNewCliDashboardSnapshot,
1741
1786
  buildBalanceProbeStrategies,
1787
+ buildBalanceSnapshotKey,
1742
1788
  getEnabledBalanceChannels,
1743
1789
  runBalanceStrategy,
1744
1790
  refreshChannelBalanceSnapshot,
@@ -0,0 +1,52 @@
1
+ 'use strict';
2
+
3
+ const {
4
+ getSnapshot,
5
+ invalidateSnapshot
6
+ } = require('./snapshot-cache');
7
+
8
+ const PROJECT_SNAPSHOT_TTL_MS = 60 * 1000;
9
+
10
+ function projectListKey(source) {
11
+ return `projects:list:${source}`;
12
+ }
13
+
14
+ function projectCountKey(source) {
15
+ return `dashboard:counts:${source}`;
16
+ }
17
+
18
+ function emptyProjectList(currentProject = null, extra = {}) {
19
+ return {
20
+ projects: [],
21
+ currentProject,
22
+ ...extra
23
+ };
24
+ }
25
+
26
+ async function getProjectListSnapshot(source, {
27
+ fallbackValue,
28
+ refresh,
29
+ force = false
30
+ }) {
31
+ return getSnapshot(projectListKey(source), {
32
+ ttlMs: PROJECT_SNAPSHOT_TTL_MS,
33
+ fallbackValue,
34
+ refresh,
35
+ force,
36
+ backgroundOnMiss: !force
37
+ });
38
+ }
39
+
40
+ function invalidateProjectSnapshots(source) {
41
+ invalidateSnapshot(projectListKey(source));
42
+ invalidateSnapshot(projectCountKey(source));
43
+ }
44
+
45
+ module.exports = {
46
+ PROJECT_SNAPSHOT_TTL_MS,
47
+ projectListKey,
48
+ projectCountKey,
49
+ emptyProjectList,
50
+ getProjectListSnapshot,
51
+ invalidateProjectSnapshots
52
+ };
@@ -0,0 +1,295 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs');
4
+ const os = require('os');
5
+ const path = require('path');
6
+ const { PATHS } = require('../../config/paths');
7
+
8
+ const DEFAULT_TTL_MS = 60 * 1000;
9
+ const SNAPSHOT_VERSION = 1;
10
+ const DEFAULT_BACKGROUND_DELAY_MS = process.env.NODE_ENV === 'test' ? 0 : 750;
11
+ const DEFAULT_BACKGROUND_GAP_MS = process.env.NODE_ENV === 'test' ? 0 : 100;
12
+
13
+ const snapshots = new Map();
14
+ const inflight = new Map();
15
+ const deferredQueue = [];
16
+ let deferredRunning = false;
17
+
18
+ function getSnapshotDir() {
19
+ return PATHS.snapshotCache
20
+ || path.join(PATHS.cache || path.join(PATHS.storage || os.tmpdir(), 'cache'), 'snapshots');
21
+ }
22
+
23
+ function cloneJson(value) {
24
+ if (value === undefined) return value;
25
+ try {
26
+ return JSON.parse(JSON.stringify(value));
27
+ } catch {
28
+ return value;
29
+ }
30
+ }
31
+
32
+ function encodeKey(key) {
33
+ return Buffer.from(String(key)).toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, '');
34
+ }
35
+
36
+ function getSnapshotPath(key) {
37
+ return path.join(getSnapshotDir(), `${encodeKey(key)}.json`);
38
+ }
39
+
40
+ function normalizeEntry(key, payload) {
41
+ if (!payload || typeof payload !== 'object') return null;
42
+ if (!Object.prototype.hasOwnProperty.call(payload, 'value')) return null;
43
+ const updatedAtMs = Number(payload.updatedAtMs || Date.parse(payload.generatedAt || ''));
44
+ return {
45
+ key,
46
+ value: cloneJson(payload.value),
47
+ generatedAt: payload.generatedAt || (Number.isFinite(updatedAtMs) ? new Date(updatedAtMs).toISOString() : null),
48
+ updatedAtMs: Number.isFinite(updatedAtMs) ? updatedAtMs : 0,
49
+ lastError: typeof payload.lastError === 'string' ? payload.lastError : null
50
+ };
51
+ }
52
+
53
+ function readPersistedSnapshot(key) {
54
+ try {
55
+ const filePath = getSnapshotPath(key);
56
+ if (!fs.existsSync(filePath)) return null;
57
+ const payload = JSON.parse(fs.readFileSync(filePath, 'utf8'));
58
+ return normalizeEntry(key, payload);
59
+ } catch {
60
+ return null;
61
+ }
62
+ }
63
+
64
+ function getEntry(key) {
65
+ if (snapshots.has(key)) {
66
+ return snapshots.get(key);
67
+ }
68
+ const persisted = readPersistedSnapshot(key);
69
+ if (persisted) {
70
+ snapshots.set(key, persisted);
71
+ }
72
+ return persisted;
73
+ }
74
+
75
+ function persistEntry(key, entry) {
76
+ try {
77
+ const filePath = getSnapshotPath(key);
78
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
79
+ const tempPath = `${filePath}.${process.pid}.${Date.now()}.tmp`;
80
+ fs.writeFileSync(tempPath, JSON.stringify({
81
+ version: SNAPSHOT_VERSION,
82
+ key,
83
+ value: entry.value,
84
+ generatedAt: entry.generatedAt,
85
+ updatedAtMs: entry.updatedAtMs,
86
+ lastError: entry.lastError || null
87
+ }, null, 2), 'utf8');
88
+ fs.renameSync(tempPath, filePath);
89
+ } catch {
90
+ // Persistence is an optimization; in-memory snapshots still protect the request path.
91
+ }
92
+ }
93
+
94
+ function makeEntry(key, value, nowMs = Date.now()) {
95
+ return {
96
+ key,
97
+ value: cloneJson(value),
98
+ generatedAt: new Date(nowMs).toISOString(),
99
+ updatedAtMs: nowMs,
100
+ lastError: null
101
+ };
102
+ }
103
+
104
+ function pumpDeferredQueue() {
105
+ if (deferredRunning) return;
106
+ const task = deferredQueue.shift();
107
+ if (!task) return;
108
+
109
+ deferredRunning = true;
110
+ setTimeout(() => {
111
+ Promise.resolve()
112
+ .then(() => task.refresh())
113
+ .then(task.resolve, task.reject)
114
+ .finally(() => {
115
+ deferredRunning = false;
116
+ setTimeout(pumpDeferredQueue, task.gapMs);
117
+ });
118
+ }, task.delayMs);
119
+ }
120
+
121
+ function runDeferredRefresh(refresh, delayMs = DEFAULT_BACKGROUND_DELAY_MS, gapMs = DEFAULT_BACKGROUND_GAP_MS) {
122
+ return new Promise((resolve, reject) => {
123
+ deferredQueue.push({ refresh, resolve, reject, delayMs, gapMs });
124
+ pumpDeferredQueue();
125
+ });
126
+ }
127
+
128
+ function runRefresh(refresh, defer, deferMs) {
129
+ if (!defer) {
130
+ return Promise.resolve().then(() => refresh());
131
+ }
132
+ return runDeferredRefresh(refresh, deferMs);
133
+ }
134
+
135
+ function refreshSnapshot(key, refresh, { defer = false, deferMs = DEFAULT_BACKGROUND_DELAY_MS } = {}) {
136
+ if (inflight.has(key)) {
137
+ return inflight.get(key);
138
+ }
139
+
140
+ const promise = runRefresh(refresh, defer, deferMs)
141
+ .then((value) => {
142
+ const entry = makeEntry(key, value);
143
+ snapshots.set(key, entry);
144
+ persistEntry(key, entry);
145
+ return entry;
146
+ })
147
+ .catch((error) => {
148
+ const existing = getEntry(key);
149
+ if (existing) {
150
+ const retained = {
151
+ ...existing,
152
+ lastError: error?.message || String(error)
153
+ };
154
+ snapshots.set(key, retained);
155
+ persistEntry(key, retained);
156
+ }
157
+ throw error;
158
+ })
159
+ .finally(() => {
160
+ inflight.delete(key);
161
+ });
162
+
163
+ inflight.set(key, promise);
164
+ promise.catch(() => {});
165
+ return promise;
166
+ }
167
+
168
+ function isExpired(entry, ttlMs, nowMs) {
169
+ if (!entry) return true;
170
+ return nowMs - Number(entry.updatedAtMs || 0) >= ttlMs;
171
+ }
172
+
173
+ function makeMeta(entry, {
174
+ stale,
175
+ refreshing,
176
+ fallback,
177
+ error
178
+ }) {
179
+ return {
180
+ generatedAt: entry?.generatedAt || null,
181
+ stale: Boolean(stale),
182
+ refreshing: Boolean(refreshing),
183
+ fallback: Boolean(fallback),
184
+ error: error || entry?.lastError || null
185
+ };
186
+ }
187
+
188
+ async function getSnapshot(key, {
189
+ ttlMs = DEFAULT_TTL_MS,
190
+ fallbackValue = null,
191
+ refresh,
192
+ backgroundOnMiss = true,
193
+ force = false,
194
+ nowMs = Date.now(),
195
+ deferMs = DEFAULT_BACKGROUND_DELAY_MS
196
+ } = {}) {
197
+ if (typeof refresh !== 'function') {
198
+ const entry = getEntry(key);
199
+ return {
200
+ value: cloneJson(entry ? entry.value : fallbackValue),
201
+ meta: makeMeta(entry, {
202
+ stale: !entry,
203
+ refreshing: false,
204
+ fallback: !entry
205
+ })
206
+ };
207
+ }
208
+
209
+ let entry = force ? null : getEntry(key);
210
+ let expired = force || isExpired(entry, ttlMs, nowMs);
211
+ let refreshPromise = null;
212
+ let refreshError = null;
213
+
214
+ if (expired) {
215
+ if (!entry && backgroundOnMiss === false) {
216
+ try {
217
+ entry = await refreshSnapshot(key, refresh);
218
+ expired = false;
219
+ } catch (error) {
220
+ refreshError = error?.message || String(error);
221
+ entry = getEntry(key);
222
+ if (!entry) throw error;
223
+ }
224
+ } else {
225
+ refreshPromise = refreshSnapshot(key, refresh, { defer: true, deferMs });
226
+ }
227
+ }
228
+
229
+ const hasEntry = Boolean(entry);
230
+ return {
231
+ value: cloneJson(hasEntry ? entry.value : fallbackValue),
232
+ meta: makeMeta(entry, {
233
+ stale: !hasEntry || expired,
234
+ refreshing: Boolean(refreshPromise || inflight.has(key)),
235
+ fallback: !hasEntry,
236
+ error: refreshError
237
+ })
238
+ };
239
+ }
240
+
241
+ function invalidateSnapshot(keyOrPrefix) {
242
+ if (!keyOrPrefix) {
243
+ snapshots.clear();
244
+ return;
245
+ }
246
+
247
+ const key = String(keyOrPrefix);
248
+ snapshots.delete(key);
249
+ for (const existingKey of Array.from(snapshots.keys())) {
250
+ if (existingKey.startsWith(key)) {
251
+ snapshots.delete(existingKey);
252
+ }
253
+ }
254
+
255
+ try {
256
+ const dir = getSnapshotDir();
257
+ if (!fs.existsSync(dir)) return;
258
+ const exactFile = getSnapshotPath(key);
259
+ if (fs.existsSync(exactFile)) {
260
+ fs.unlinkSync(exactFile);
261
+ }
262
+ } catch {
263
+ // Best-effort invalidation; the in-memory state has already been cleared.
264
+ }
265
+ }
266
+
267
+ function clearSnapshotCache({ deleteFiles = false } = {}) {
268
+ snapshots.clear();
269
+ inflight.clear();
270
+ deferredQueue.splice(0, deferredQueue.length);
271
+ deferredRunning = false;
272
+ if (!deleteFiles) return;
273
+ try {
274
+ fs.rmSync(getSnapshotDir(), { recursive: true, force: true });
275
+ } catch {
276
+ // ignore cleanup failures in tests
277
+ }
278
+ }
279
+
280
+ module.exports = {
281
+ getSnapshot,
282
+ refreshSnapshot,
283
+ invalidateSnapshot,
284
+ clearSnapshotCache,
285
+ _test: {
286
+ getSnapshotDir,
287
+ getSnapshotPath,
288
+ encodeKey,
289
+ readPersistedSnapshot,
290
+ getEntry,
291
+ inflight,
292
+ snapshots,
293
+ deferredQueue
294
+ }
295
+ };
@@ -1 +0,0 @@
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 w,Z as b,v as x}from"./vue-vendor-B5RqjEjQ.js";import{g as $,u as _,a as S,s as z,D as q,_ as P,b as j,c as L,d as M,R as I,e as O,f as E,h as N,i as F,j as A,k as D,l as U,m as J,n as V,o as R,p as K}from"./index-BovYCFsd.js";import{h as B,ar as Z,E as G,P as H,as as W,at as X,au as Y,av as Q,aa as ee,i as ae,A as le,aw as ne,ax as se,T as ce,a as te,b as oe}from"./icons-nGdSKQn2.js";import{L as ie,N as ue,B as re,s as de,b as ve,c as pe,a as he,Z as ye}from"./naive-ui-CVyvdmg1.js";import"./markdown-BNJfEgCA.js";const me=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:q,homeCliColumns:q,customCliPlatforms:[]});let ge=!1,fe=null;async function ke(){return ge?me.value:fe||(fe=(async()=>{try{const e=await $();e.success&&e.config&&(me.value=e.config,ge=!0)}catch(e){}finally{fe=null}return me.value})(),fe)}function Te(){return ge||ke(),{uiConfig:me,loadUIConfig:ke,saveConfig:async function(e){try{const a=await z(e);return!!a.success&&(me.value=a.config,!0)}catch(a){return!1}},updateConfig:async function(e,a){try{const l=await S(e,a);return!!l.success&&(me.value=l.config,!0)}catch(l){return!1}},updateNestedConfig:async function(e,a,l){try{const n=await _(e,a,l);return!!n.success&&(me.value=n.config,!0)}catch(n){return!1}}}}const Ce={class:"channel-column"},we={class:"drag-handle",title:"拖拽排序"},be={class:"header-icon"},xe={class:"channel-title"},$e={key:0,class:"claude-extra-area"},_e={key:0,class:"channel-content"},Se={key:0,class:"card"},ze={class:"card-header"},qe={key:0,class:"runtime-badge"},Pe={class:"card-body",style:{padding:"6px 10px"}},je={class:"proxy-info-row"},Le={class:"proxy-status"},Me={class:"proxy-port"},Ie={class:"channel-name"},Oe={class:"channel-quick-panel"},Ee={class:"panel-title"},Ne={key:0,class:"no-channels"},Fe={key:1,class:"channel-quick-list"},Ae={class:"channel-quick-info"},De={class:"channel-quick-name"},Ue={key:0,class:"channel-switching-tip"},Je={class:"channel-metrics"},Ve={class:"metric-item"},Re={class:"metric-value"},Ke={class:"metric-item"},Be={class:"metric-value"},Ze={class:"metric-item"},Ge={class:"metric-value"},He={class:"metric-item"},We={class:"card"},Xe={class:"card-header compact"},Ye={class:"card-body",style:{padding:"8px 10px"}},Qe={class:"quick-access-list"},ea={class:"access-icon"},aa={class:"access-content"},la={class:"access-value"},na={class:"access-icon"},sa={class:"access-content"},ca={class:"access-value"},ta={class:"access-icon"},oa={class:"access-content"},ia={class:"access-goto"},ua={class:"card-header compact"},ra={class:"card-body",style:{padding:"8px 10px"}},da={class:"stats-inline stats-3col"},va={class:"stat-inline-item stat-requests"},pa={class:"stat-info"},ha={class:"stat-inline-item stat-input"},ya={class:"stat-info"},ma={class:"stat-inline-item stat-output"},ga={class:"stat-info"},fa={key:2,class:"card logs-card"},ka={class:"card-header compact"},Ta={class:"card-body logs-card-body"},Ca={class:"logs-table-wrapper"},wa={key:0,class:"empty-logs"},ba=["title"],xa={key:0,class:"action-content"},$a={class:"action-msg"},_a={class:"action-time"},Sa={key:1,class:"action-content"},za={class:"action-msg error-msg"},qa={class:"action-time error-time"},Pa={class:"locked-content"},ja={class:"lock-icon"},La="channelLocks",Ma=P({__name:"ChannelColumn",props:{channelType:{type:String,required:!0}},setup(e){const S=e,z=l(),q=ie(),{uiConfig:P}=Te(),{claudeProxy:K,codexProxy:me,geminiProxy:ge,opencodeProxy:fe,ompProxy:ke,claudeChannels:Ma,codexChannels:Ia,geminiChannels:Oa,opencodeChannels:Ea,ompChannels:Na,schedulerState:Fa,getProxyState:Aa,startProxy:Da,stopProxy:Ua,getLogs:Ja,clearLogsForSource:Va,loadChannels:Ra,logLimit:Ka,statsInterval:Ba}=j(),{dashboardData:Za,loadDashboard:Ga}=L(),Ha=n(()=>M(S.channelType,P.value.customCliPlatforms)),Wa=n(()=>Ha.value.title||Ha.value.label||S.channelType),Xa=n(()=>Ha.value.icon||B),Ya=n(()=>Ha.value.color||"#64748b"),Qa=n(()=>"claude"===S.channelType?K.value:"codex"===S.channelType?me.value:"gemini"===S.channelType?ge.value:"opencode"===S.channelType?fe.value:"omp"===S.channelType?ke.value:Ha.value.custom?{running:!1,loading:!1,activeChannel:null,port:null,runtime:null,startTime:null}:{}),el=n(()=>"claude"===S.channelType?"Claude":"codex"===S.channelType?"Codex":"gemini"===S.channelType?"Gemini":"opencode"===S.channelType?"OpenCode":"omp"===S.channelType?"OMP":Ha.value.label||S.channelType),al=a({projects:0,sessions:0}),ll=a({requests:0,tokens:0,cost:0}),nl=a({requests:0,tokens:0,cost:0}),sl={requests:0,tokens:0,cost:3};let cl={requests:null,tokens:null,cost:null};const tl=a({requests:!1,tokens:!1,cost:!1}),ol=n(()=>{var e,a,l;return(null==(l=null==(a=null==(e=Za.value)?void 0:e.todayStats)?void 0:a[S.channelType])?void 0:l.byModel)||{}});function il(e,a,l,n=600){cl[e]&&cancelAnimationFrame(cl[e]),tl.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=sl[e]??0,d=Math.pow(10,r),v=r>0?Math.round(u*d)/d:Math.round(u);nl.value[e]=v,o<1?cl[e]=requestAnimationFrame(c):tl.value[e]=!1};cl[e]=requestAnimationFrame(c)}const ul=a(!1),rl={claude:"claudeChannelCollapse",codex:"codexChannelCollapse",gemini:"geminiChannelCollapse",opencode:"opencodeChannelCollapse",omp:"ompChannelCollapse"};function dl(e){try{const a=localStorage.getItem(La),l=a?JSON.parse(a):{};l[S.channelType]=e,localStorage.setItem(La,JSON.stringify(l))}catch(a){}}const vl=a(function(){try{const e=localStorage.getItem(La);if(e){return JSON.parse(e)[S.channelType]||!1}}catch(e){}return!1}());async function pl(){vl.value=!vl.value,dl(vl.value);try{if(await _("channelLocks",S.channelType,vl.value),Za.value){const e=Za.value.uiConfig||{},a={...e.channelLocks||{}};a[S.channelType]=vl.value,Za.value={...Za.value,uiConfig:{...e,channelLocks:a}}}}catch(e){}}const hl=a(!0);function yl(e){e.detail&&void 0!==e.detail.showLogs&&(hl.value=e.detail.showLogs)}const ml=a(Date.now()),gl=n(()=>{if(!Qa.value.running)return"";const e=Qa.value.startTime;if(!e)return"";const a=ml.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}),fl=a(null),kl=n(()=>Ka.value),Tl={claude:Ja("claude"),codex:Ja("codex"),gemini:Ja("gemini"),opencode:Ja("opencode"),omp:Ja("omp")},Cl=n(()=>{if(!Il())return[];return((Tl[S.channelType]||Tl.claude).value||[]).slice(0,kl.value)});let wl=null,bl=null,xl=null,$l=!1,_l=null;const Sl=n(()=>{let e=[];"claude"===S.channelType?e=Ma.value||[]:"codex"===S.channelType?e=Ia.value||[]:"gemini"===S.channelType?e=Oa.value||[]:"opencode"===S.channelType?e=Ea.value||[]:"omp"===S.channelType&&(e=Na.value||[]);return[...e.filter(e=>!1!==e.enabled),...e.filter(e=>!1===e.enabled)]});function zl(e){const a=Fa[S.channelType];if(!a||!a.channels)return 0;const l=a.channels.find(a=>a.id===e);return l?l.inflight:0}const ql=n(()=>{const e=Sl.value.filter(e=>!1!==e.enabled).length;return Qa.value.running?`${e}个渠道调度中`:Sl.value.length>0?`${e}个渠道已启用`:"无渠道"}),Pl=a({});function jl(e){return Pl.value[e]||{requests:0,tokens:0,cost:0}}async function Ll(){var e;try{let a;if("claude"===S.channelType?a=await O():"codex"===S.channelType?a=await E():"gemini"===S.channelType?a=await N():"opencode"===S.channelType?a=await F():"omp"===S.channelType&&(a=await A()),a&&a.byChannel){const l={};for(const[n,s]of Object.entries(a.byChannel))l[n]={requests:s.requests||0,tokens:(null==(e=s.tokens)?void 0:e.total)||0,cost:s.cost||0};Pl.value=l}}catch(a){}}function Ml(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 Il(){return["claude","codex","gemini","opencode","omp"].includes(S.channelType)}function Ol(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 El(e){var a,l;if(!1===Ha.value.supportsProxy||!Il())return void q.warning(`${Wa.value} 暂未接入动态代理`);const n=Aa(S.channelType);n.value.loading=!0;try{let a;a=e?await Da(S.channelType):await Ua(S.channelType,{refreshChannelsDrawer:!0}),!1!==a.success?q.success(e?`${Wa.value} 代理已启动`:`${Wa.value} 代理已停止`):(q.error(a.error||"操作失败"),n.value.running=!e)}catch(s){q.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 Nl(){!1!==Ha.value.supportsProjects&&Il()?z.push({name:`${S.channelType}-projects`}):q.info(`${Wa.value} 当前仅作为首页显示项`)}function Fl(){!1!==Ha.value.supportsProjects&&Il()?z.push({name:`${S.channelType}-projects`}):q.info(`${Wa.value} 当前仅作为首页显示项`)}function Al(){!1!==Ha.value.supportsSessions&&Il()?ul.value=!0:q.info(`${Wa.value} 当前没有托管会话列表`)}s(Cl,e=>{var a;const l=(null==(a=e[0])?void 0:a.id)||null;if(!l||l===wl)return void(wl=l);wl=l,_l&&clearTimeout(_l),_l=setTimeout(()=>{Ll()},5e3);(!fl.value||fl.value.scrollTop<20)&&x(()=>{fl.value&&(fl.value.scrollTop=0)})}),s(()=>ll.value.requests,e=>{il("requests",nl.value.requests,e,600)}),s(()=>ll.value.tokens,e=>{il("tokens",nl.value.tokens,e,600)}),s(()=>ll.value.cost,e=>{il("cost",nl.value.cost,e,600)}),s(()=>S.channelType,()=>{var e;wl=(null==(e=Cl.value[0])?void 0:e.id)||null}),s(()=>{var e,a;return null==(a=null==(e=Za.value)?void 0:e.counts)?void 0:a[S.channelType]},()=>{Rl()}),s(Ba,()=>{$l&&function(){bl&&(clearInterval(bl),bl=null);const e=Ba.value||30,a=Math.max(1e3*e,1e4);bl=setInterval(()=>{Kl(),Ll()},a)}()});const Dl=a({});function Ul(e){return!!Dl.value[e]}function Jl(e,a){e&&(Dl.value={...Dl.value,[e]:!!a})}async function Vl(e,a){if(e&&!Ul(e.id)){Jl(e.id,!0);try{let l;"claude"===S.channelType?l=D:"codex"===S.channelType?l=U:"gemini"===S.channelType?l=J:"opencode"===S.channelType?l=V:"omp"===S.channelType&&(l=R),l&&(await l(e.id,{enabled:a}),await async function(e,a){if(!e)return;const l=rl[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),q.success(a?`渠道「${e.name}」已启用`:`渠道「${e.name}」已停用`),await Ra(),window.dispatchEvent(new CustomEvent("channel-management-refresh",{detail:{channel:S.channelType}})))}catch(l){q.error("操作失败: "+l.message)}finally{Jl(e.id,!1)}}}function Rl(){var e,a;const l=null==(a=null==(e=Za.value)?void 0:e.counts)?void 0:a[S.channelType];al.value.projects=(null==l?void 0:l.projectCount)||0,al.value.sessions=(null==l?void 0:l.sessionCount)||0}async function Kl(){if(Za.value&&Za.value.todayStats){const e=Za.value.todayStats[S.channelType];e&&(ll.value.requests=e.requests||0,ll.value.tokens=e.tokens||0,ll.value.cost=e.cost||0)}Rl()}function Bl(){Va(S.channelType)}function Zl(e){var a,l;null==(l=null==(a=null==e?void 0:e.currentTarget)?void 0:a.blur)||l.call(a)}function Gl(e){window.dispatchEvent(new CustomEvent("open-skills-drawer",{detail:{platform:S.channelType}})),Zl(e)}function Hl(e){window.dispatchEvent(new CustomEvent("open-commands-drawer",{detail:{platform:S.channelType}})),Zl(e)}function Wl(e){if(!1===Ha.value.supportsAgents)return q.info(`${Wa.value} 的 Agent 能力通过插件/扩展提供`),void Zl(e);window.dispatchEvent(new CustomEvent("open-agents-drawer",{detail:{platform:S.channelType}})),Zl(e)}return c(async()=>{await Promise.all([Ga().then(()=>Kl()),Ll()]),async function(){var e,a;try{if(Za.value&&Za.value.uiConfig)hl.value=!1!==(null==(e=Za.value.uiConfig.panelVisibility)?void 0:e.showLogs);else{const e=await $();e.success&&e.config&&(hl.value=!1!==(null==(a=e.config.panelVisibility)?void 0:a.showLogs))}}catch(l){}}(),async function(){var e,a;try{let l=!1;if(Za.value&&Za.value.uiConfig)l=(null==(e=Za.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)}vl.value=l,dl(l)}catch(l){}}(),window.addEventListener("panel-visibility-change",yl),nl.value={...ll.value},$l=!0,xl=setInterval(()=>{ml.value=Date.now()},1e3)}),t(()=>{$l=!1,bl&&clearInterval(bl),xl&&clearInterval(xl),_l&&clearTimeout(_l),window.removeEventListener("panel-visibility-change",yl),Object.values(cl).forEach(e=>{e&&cancelAnimationFrame(e)})}),(a,l)=>{const n=o("n-collapse");return u(),i("div",Ce,[r("div",{class:T(["channel-header",[e.channelType,{"custom-cli":Ha.value.custom}]]),style:k(Ha.value.custom?{"--channel-accent":Ya.value}:null)},[r("div",we,[p(y(ue),{size:16},{default:h(()=>[p(y(Z))]),_:1})]),r("div",be,[p(y(ue),{size:20},{default:h(()=>[(u(),v(m(Xa.value)))]),_:1})]),r("h2",xe,g(Wa.value),1),!1!==Ha.value.supportsManagedConfig?(u(),i("div",$e,[p(y(de),{trigger:"hover"},{trigger:h(()=>[p(y(re),{text:"",class:"config-shortcut-button",onClick:Gl,title:"Skills 技能管理"},{icon:h(()=>[p(y(ue),{size:18},{default:h(()=>[p(y(G))]),_:1})]),_:1})]),default:h(()=>[l[2]||(l[2]=f(" Skills 技能管理 ",-1))]),_:1}),p(y(de),{trigger:"hover"},{trigger:h(()=>[p(y(re),{text:"",class:"config-shortcut-button",onClick:Hl,title:"Commands 命令管理"},{icon:h(()=>[p(y(ue),{size:18},{default:h(()=>[p(y(B))]),_:1})]),_:1})]),default:h(()=>[l[3]||(l[3]=f(" Commands 命令管理 ",-1))]),_:1}),!1!==Ha.value.supportsAgents?(u(),v(y(de),{key:0,trigger:"hover"},{trigger:h(()=>[p(y(re),{text:"",class:"config-shortcut-button",onClick:Wl,title:"Agents 代理管理"},{icon:h(()=>[p(y(ue),{size:18},{default:h(()=>[p(y(H))]),_:1})]),_:1})]),default:h(()=>[l[4]||(l[4]=f(" Agents 代理管理 ",-1))]),_:1})):d("",!0)])):d("",!0),p(y(re),{text:"",class:"lock-button",onClick:pl,title:vl.value?"解锁此列":"锁定此列"},{icon:h(()=>[p(y(ue),{size:18},{default:h(()=>[vl.value?(u(),v(y(W),{key:0})):(u(),v(y(X),{key:1}))]),_:1})]),_:1},8,["title"])],6),vl.value?d("",!0):(u(),i("div",_e,[!1!==Ha.value.supportsProxy?(u(),i("div",Se,[r("div",ze,[p(y(ue),{size:16},{default:h(()=>[p(y(Y))]),_:1}),l[5]||(l[5]=r("h3",{class:"card-title"},"代理控制",-1)),Qa.value.running&&gl.value?(u(),i("span",qe,g(gl.value),1)):d("",!0),p(y(ve),{value:Qa.value.running,"onUpdate:value":[l[0]||(l[0]=e=>Qa.value.running=e),El],loading:Qa.value.loading,size:"small",style:{"margin-left":"auto"}},null,8,["value","loading"])]),r("div",Pe,[r("div",je,[r("div",Le,[r("div",{class:T(["status-dot",{active:Qa.value.running}])},null,2),p(y(pe),{type:Qa.value.running?"success":"default",style:{"font-size":"12px"}},{default:h(()=>[f(g(Qa.value.running?"运行中":"已停止"),1)]),_:1},8,["type"]),r("span",Me,"端口: "+g(Qa.value.port),1)]),p(y(ye),{trigger:"click",placement:"bottom",width:320,class:"channel-popover"},{trigger:h(()=>[p(y(re),{text:"",size:"tiny",class:"channel-status"},{default:h(()=>[r("span",Ie,g(ql.value),1)]),_:1})]),default:h(()=>[r("div",Oe,[r("div",Ee,[l[7]||(l[7]=r("span",null,"渠道快捷管理",-1)),p(y(pe),{depth:"3",style:{"font-size":"11px"}},{default:h(()=>[...l[6]||(l[6]=[f("点击开关切换状态",-1)])]),_:1})]),0===Sl.value.length?(u(),i("div",Ne,[p(y(pe),{depth:"3"},{default:h(()=>[...l[8]||(l[8]=[f("暂无配置渠道",-1)])]),_:1})])):(u(),i("div",Fe,[(u(!0),i(C,null,w(Sl.value,e=>{var a,n;return u(),i("div",{key:e.id,class:T(["channel-quick-item",{disabled:!1===e.enabled}])},[r("div",Ae,[r("span",De,g(e.name),1),"frozen"===(null==(a=e.health)?void 0:a.status)?(u(),v(y(he),{key:0,size:"tiny",type:"error",bordered:!1},{default:h(()=>[...l[9]||(l[9]=[f(" 冻结 ",-1)])]),_:1})):d("",!0),p(y(ve),{size:"small",value:!1!==e.enabled,"onUpdate:value":a=>Vl(e,a),loading:Ul(e.id),disabled:Ul(e.id),style:{"margin-left":"auto"}},null,8,["value","onUpdate:value","loading","disabled"])]),Ul(e.id)?(u(),i("div",Ue," 正在切换渠道状态... ")):d("",!0),r("div",Je,[r("span",Ve,[l[10]||(l[10]=r("span",{class:"metric-label"},"请求",-1)),r("span",Re,g(jl(e.id).requests),1)]),r("span",Ke,[l[11]||(l[11]=r("span",{class:"metric-label"},"Tokens",-1)),r("span",Be,g((n=jl(e.id).tokens,n>=1e6?(n/1e6).toFixed(1)+"M":n>=1e3?(n/1e3).toFixed(1)+"K":n.toString())),1)]),r("span",Ze,[l[12]||(l[12]=r("span",{class:"metric-label"},"权重",-1)),r("span",Ge,g(e.weight||1),1)]),r("span",He,[l[13]||(l[13]=r("span",{class:"metric-label"},"并发",-1)),r("span",{class:T(["metric-value",{active:zl(e.id)>0}])},g(zl(e.id))+g(e.maxConcurrency?`/${e.maxConcurrency}`:""),3)])])],2)}),128))]))])]),_:1})])])])):d("",!0),r("div",We,[r("div",Xe,[p(y(ue),{size:14},{default:h(()=>[p(y(Q))]),_:1}),l[14]||(l[14]=r("h3",{class:"card-title"},"快速访问",-1))]),r("div",Ye,[r("div",Qe,[r("div",{class:T(["access-card access-card-projects",{clickable:!1!==Ha.value.supportsProjects,disabled:!1===Ha.value.supportsProjects}]),onClick:Nl},[r("div",ea,[p(y(ue),{size:16},{default:h(()=>[p(y(ee))]),_:1})]),r("div",aa,[l[15]||(l[15]=r("span",{class:"access-label"},"项目",-1)),r("span",la,g(al.value.projects),1)])],2),r("div",{class:T(["access-card access-card-sessions",{clickable:!1!==Ha.value.supportsSessions,disabled:!1===Ha.value.supportsSessions}]),onClick:Al},[r("div",na,[p(y(ue),{size:16},{default:h(()=>[p(y(ae))]),_:1})]),r("div",sa,[l[16]||(l[16]=r("span",{class:"access-label"},"最新对话",-1)),r("span",ca,g(al.value.sessions),1)])],2),r("div",{class:T(["access-card access-card-goto",{clickable:!1!==Ha.value.supportsProjects,disabled:!1===Ha.value.supportsProjects}]),onClick:Fl},[r("div",ta,[p(y(ue),{size:16},{default:h(()=>[p(y(le))]),_:1})]),r("div",oa,[l[17]||(l[17]=r("span",{class:"access-label"},"前往",-1)),r("span",ia,g(el.value),1)])],2)])])]),r("div",{class:T(["card stats-card",`stats-card-${e.channelType}`])},[r("div",ua,[p(y(ue),{size:14},{default:h(()=>[p(y(ne))]),_:1}),l[18]||(l[18]=r("h3",{class:"card-title"},"今日数据",-1))]),r("div",ra,[r("div",da,[r("div",va,[l[20]||(l[20]=r("div",{class:"stat-icon-dot requests"},null,-1)),r("div",pa,[l[19]||(l[19]=r("span",{class:"stat-label"},"请求",-1)),r("span",{class:T(["stat-value",{animating:tl.value.requests}])},g(nl.value.requests),3)])]),r("div",ha,[l[22]||(l[22]=r("div",{class:"stat-icon-dot tokens"},null,-1)),r("div",ya,[l[21]||(l[21]=r("span",{class:"stat-label"},"总 Tokens",-1)),r("span",{class:T(["stat-value",{animating:tl.value.tokens}])},g((c=nl.value.tokens,c>=1e6?(c/1e6).toFixed(1)+"M":c>=1e3?(c/1e3).toFixed(1)+"K":c.toString())),3)])]),r("div",ma,[l[24]||(l[24]=r("div",{class:"stat-icon-dot cost"},null,-1)),r("div",ga,[l[23]||(l[23]=r("span",{class:"stat-label"},"成本 / USD",-1)),r("span",{class:T(["stat-value",{animating:tl.value.cost}])},g((s=nl.value.cost,!s||Number.isNaN(s)?"$0":"$"+Number(s).toFixed(3))),3)])])])])],2),Object.keys(ol.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),hl.value?(u(),i("div",fa,[r("div",ka,[p(y(ue),{size:14},{default:h(()=>[p(y(se))]),_:1}),l[25]||(l[25]=r("h3",{class:"card-title"},"实时日志",-1)),p(y(re),{text:"",size:"tiny",onClick:b(Bl,["stop"]),style:{"margin-left":"auto"},title:"清空日志"},{icon:h(()=>[p(y(ue),{size:14},{default:h(()=>[p(y(ce))]),_:1})]),_:1})]),r("div",Ta,[r("div",Ca,[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:fl},[0===Cl.value.length?(u(),i("div",wa,[p(y(ue),{size:32,depth:"3",style:{"margin-bottom":"8px"}},{default:h(()=>[p(y(se))]),_:1}),p(y(pe),{depth:"3",style:{"font-size":"12px","font-weight":"500"}},{default:h(()=>[...l[26]||(l[26]=[f("暂无实时日志",-1)])]),_:1}),p(y(pe),{depth:"3",style:{"font-size":"11px","margin-top":"4px"}},{default:h(()=>[...l[27]||(l[27]=[f("开启代理后将显示请求记录",-1)])]),_:1})])):d("",!0),(u(!0),i(C,null,w(Cl.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:Ol(a)},["action"===a.type?(u(),i("div",xa,[p(y(ue),{size:12,color:"#18a058"},{default:h(()=>[p(y(te))]),_:1}),r("span",$a,g(a.message),1),r("span",_a,g(a.time),1)])):"error"===a.status?(u(),i("div",Sa,[p(y(ue),{size:12,color:"#d03050"},{default:h(()=>[p(y(oe))]),_:1}),r("span",za,g(a.channel)+": "+g(a.error||a.message||"请求失败"),1),r("span",qa,g(a.time),1)])):(u(),i(C,{key:2},[r("div",{class:T(["log-col col-channel",`col-channel-${e.channelType}`])},[p(y(he),{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(Ml(a,"input")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(Ml(a,"output")),3),"claude"===e.channelType?(u(),i(C,{key:0},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(Ml(a,"cacheCreation")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(Ml(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(Ml(a,"reasoning")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(Ml(a,"cached")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(Ml(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(Ml(a,"cached")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(Ml(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(Ml(a,"reasoning")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(Ml(a,"cached")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(Ml(a,"total")),3)],64)):d("",!0),r("div",{class:T(["log-col col-time",`col-time-${e.channelType}`])},g(a.time),3)],64))],10,ba))),128))],512)])])])):d("",!0)])),vl.value?(u(),i("div",{key:1,class:T(["locked-overlay",`locked-${e.channelType}`])},[r("div",Pa,[r("div",ja,[p(y(ue),{size:48},{default:h(()=>[p(y(W))]),_:1})]),l[29]||(l[29]=r("h3",{class:"locked-title"},"该渠道已锁定",-1)),p(y(pe),{depth:"3",class:"locked-hint"},{default:h(()=>[...l[28]||(l[28]=[f(" 点击上方按钮解锁以查看内容 ",-1)])]),_:1})])],2)):d("",!0),!1!==Ha.value.supportsSessions?(u(),v(I,{key:2,visible:ul.value,"onUpdate:visible":l[1]||(l[1]=e=>ul.value=e),channel:e.channelType},null,8,["visible","channel"])):d("",!0)]);var s,c}}},[["__scopeId","data-v-6009b6d9"]]),Ia={class:"dashboard-container"},Oa="dashboardChannelOrder",Ea=P({__name:"Home",setup(l){const{uiConfig:n,updateConfig:s,loadUIConfig:o}=Te();function r(e){try{localStorage.setItem(Oa,JSON.stringify(e))}catch(a){}}function d(e,a=n.value.customCliPlatforms){const l=K(e,a);return m.value=l.map(e=>({type:e})),r(l),l}const m=a(function(){try{const e=localStorage.getItem(Oa);if(e){const a=JSON.parse(e);return K(a,n.value.customCliPlatforms)}}catch(e){}return q}().map(e=>({type:e})));async function g(){const e=K(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",Ia,[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(Ma,{"channel-type":e.type,key:e.type},null,8,["channel-type"]))]),_:1},8,["modelValue"])]))}},[["__scopeId","data-v-276ca51b"]]);export{Ea as default};
@@ -1 +0,0 @@
1
- .channel-column[data-v-6009b6d9]{display:flex;flex-direction:column;height:100%;min-height:0;background:var(--gradient-card);border:1px solid var(--border-primary);border-radius:18px;overflow:hidden;box-shadow:0 22px 52px #0f171d1a}.channel-header[data-v-6009b6d9]{display:flex;align-items:center;gap:10px;padding:12px 14px;background:linear-gradient(180deg,var(--bg-elevated) 0%,var(--bg-secondary) 100%);position:relative}.drag-handle[data-v-6009b6d9]{cursor:grab;color:var(--text-tertiary);display:flex;align-items:center;padding:4px;margin:-4px 0 -4px -4px;border-radius:4px;transition:all .2s}.drag-handle[data-v-6009b6d9]:hover{color:var(--text-secondary);background:var(--bg-tertiary)}.drag-handle[data-v-6009b6d9]:active{cursor:grabbing}.channel-header[data-v-6009b6d9]:after{content:"";position:absolute;bottom:0;left:18px;right:18px;height:2px;border-radius:1px}.channel-header.claude[data-v-6009b6d9]{background:linear-gradient(135deg,rgba(24,160,88,.1) 0%,var(--bg-secondary) 100%)}.channel-header.claude[data-v-6009b6d9]:after{background:linear-gradient(90deg,#18a058,#18a0584d)}.channel-header.codex[data-v-6009b6d9]{background:linear-gradient(135deg,rgba(59,130,246,.1) 0%,var(--bg-secondary) 100%)}.channel-header.codex[data-v-6009b6d9]:after{background:linear-gradient(90deg,#3b82f6,#3b82f64d)}.channel-header.gemini[data-v-6009b6d9]{background:linear-gradient(135deg,rgba(168,85,247,.1) 0%,var(--bg-secondary) 100%)}.channel-header.gemini[data-v-6009b6d9]:after{background:linear-gradient(90deg,#a855f7,#a855f74d)}.channel-header.opencode[data-v-6009b6d9]{background:linear-gradient(135deg,rgba(234,88,12,.1) 0%,var(--bg-secondary) 100%)}.channel-header.opencode[data-v-6009b6d9]:after{background:linear-gradient(90deg,#ea580c,#ea580c4d)}.channel-header.omp[data-v-6009b6d9]{background:linear-gradient(135deg,rgba(15,159,154,.1) 0%,var(--bg-secondary) 100%)}.channel-header.omp[data-v-6009b6d9]:after{background:linear-gradient(90deg,#0f9f9a,#0f9f9a4d)}.channel-header.custom-cli[data-v-6009b6d9]{background:linear-gradient(135deg,color-mix(in srgb,var(--channel-accent, #64748b) 12%,transparent) 0%,var(--bg-secondary) 100%)}.channel-header.custom-cli[data-v-6009b6d9]:after{background:linear-gradient(90deg,var(--channel-accent, #64748b),color-mix(in srgb,var(--channel-accent, #64748b) 32%,transparent))}.header-icon[data-v-6009b6d9]{width:36px;height:36px;border-radius:12px;display:flex;align-items:center;justify-content:center;box-shadow:0 10px 24px #0f171d24}.channel-header.claude .header-icon[data-v-6009b6d9]{background:linear-gradient(135deg,#18a058,#15803d);color:#fff}.channel-header.codex .header-icon[data-v-6009b6d9]{background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff}.channel-header.gemini .header-icon[data-v-6009b6d9]{background:linear-gradient(135deg,#a855f7,#9333ea);color:#fff}.channel-header.opencode .header-icon[data-v-6009b6d9]{background:linear-gradient(135deg,#ea580c,#c2410c);color:#fff}.channel-header.omp .header-icon[data-v-6009b6d9]{background:linear-gradient(135deg,#0f9f9a,#0f766e);color:#fff}.channel-header.custom-cli .header-icon[data-v-6009b6d9]{background:linear-gradient(135deg,var(--channel-accent, #64748b) 0%,color-mix(in srgb,var(--channel-accent, #64748b) 72%,#0f172a) 100%);color:#fff}.channel-title[data-v-6009b6d9]{font-size:13px;font-weight:700;margin:0;color:var(--text-primary);letter-spacing:.3px;line-height:1.15;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;flex:1}.channel-content[data-v-6009b6d9]{flex:1;min-height:0;overflow:hidden;padding:10px;display:flex;flex-direction:column;gap:6px}.card[data-v-6009b6d9]{background:var(--gradient-card);border:1px solid var(--border-primary);border-radius:14px;overflow:hidden;transition:border-color .2s ease,box-shadow .2s ease,transform .2s ease;box-shadow:0 10px 28px #0f171d0f;position:relative}.card[data-v-6009b6d9]:before{content:"";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.1),transparent);opacity:0;transition:opacity .3s ease}.card[data-v-6009b6d9]:hover{box-shadow:0 18px 38px #0f171d1a;border-color:var(--border-secondary)}.card[data-v-6009b6d9]:hover:before{opacity:1}.card.clickable[data-v-6009b6d9]{cursor:pointer}.card.clickable[data-v-6009b6d9]:hover{border-color:#18a058;transform:translateY(-2px);box-shadow:0 8px 24px #18a0582e}.card.clickable[data-v-6009b6d9]:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(135deg,rgba(24,160,88,.02) 0%,transparent 100%);opacity:0;transition:opacity .3s ease;pointer-events:none}.card.clickable[data-v-6009b6d9]:hover:after{opacity:1}.card-header[data-v-6009b6d9]{display:flex;align-items:center;gap:8px;padding:9px 12px;background:linear-gradient(180deg,var(--bg-secondary) 0%,var(--bg-primary) 100%);border-bottom:1px solid var(--border-primary);position:relative;min-height:24px}.card-header.compact[data-v-6009b6d9]{padding:8px 12px}.card-header .n-icon[data-v-6009b6d9]{color:var(--text-tertiary);transition:color .2s ease}.card:hover .card-header .n-icon[data-v-6009b6d9]{color:var(--text-secondary)}.card-title[data-v-6009b6d9]{font-size:11px;font-weight:700;margin:0;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.8px}.runtime-badge[data-v-6009b6d9]{display:inline-flex;align-items:center;padding:3px 8px;margin-left:8px;font-size:10px;font-weight:600;color:#10b981;background:linear-gradient(135deg,#10b9811a,#34d3991a);border:1px solid rgba(16,185,129,.2);border-radius:999px;white-space:nowrap;animation:pulse-runtime-6009b6d9 2s ease-in-out infinite}@keyframes pulse-runtime-6009b6d9{0%,to{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(.98)}}.card-body[data-v-6009b6d9]{padding:8px 10px;background:transparent}.card-body.compact[data-v-6009b6d9]{padding:7px 10px}.proxy-control[data-v-6009b6d9]{display:flex;justify-content:space-between;align-items:center;gap:16px}.proxy-info[data-v-6009b6d9]{display:flex;flex-direction:column;gap:4px}.proxy-info-row[data-v-6009b6d9]{display:flex;align-items:center;justify-content:space-between}.proxy-status[data-v-6009b6d9]{display:flex;align-items:center;gap:6px}.proxy-port[data-v-6009b6d9]{font-size:11px;color:var(--text-secondary);margin-left:6px}.channel-selector[data-v-6009b6d9]{display:flex;align-items:center;padding:4px 8px;background:linear-gradient(135deg,var(--bg-secondary) 0%,var(--bg-tertiary) 100%);border:1px solid var(--border-primary);border-radius:4px;color:var(--text-secondary);transition:all .2s ease}.channel-selector[data-v-6009b6d9]:hover{background:var(--hover-bg);border-color:var(--border-secondary);color:var(--text-primary)}.channel-selector[data-v-6009b6d9]:disabled{opacity:.5;cursor:not-allowed}.channel-name[data-v-6009b6d9]{font-size:11px;font-weight:500;max-width:90px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-dot[data-v-6009b6d9]{width:8px;height:8px;border-radius:50%;background:var(--border-secondary);transition:all .3s ease}.status-dot.active[data-v-6009b6d9]{background:#18a058;box-shadow:0 0 8px #18a05880}.quick-stats[data-v-6009b6d9]{display:flex;gap:16px;padding:4px 0}.stat-item[data-v-6009b6d9]{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;padding:4px 0}.stat-divider[data-v-6009b6d9]{width:1px;background:linear-gradient(180deg,transparent 0%,var(--border-primary) 50%,transparent 100%)}.quick-access-list[data-v-6009b6d9]{display:grid;grid-template-columns:repeat(3,1fr);gap:4px}.access-card[data-v-6009b6d9]{display:flex;align-items:center;gap:5px;padding:7px 8px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border-primary);transition:border-color .2s ease,box-shadow .2s ease,transform .2s ease;position:relative;min-height:44px;overflow:hidden}.access-card[data-v-6009b6d9]:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s ease;pointer-events:none}.access-icon[data-v-6009b6d9]{width:28px;height:28px;border-radius:9px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all .3s ease}.access-content[data-v-6009b6d9]{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0;overflow:hidden}.access-card-projects .access-icon[data-v-6009b6d9]{background:linear-gradient(135deg,#6366f126,#8b5cf626);color:#6366f1}.access-card-projects[data-v-6009b6d9]:before{background:linear-gradient(135deg,#6366f114,#8b5cf614)}.access-card-projects:hover .access-icon[data-v-6009b6d9]{background:linear-gradient(135deg,#6366f140,#8b5cf640);transform:translateY(-1px)}.access-card-sessions .access-icon[data-v-6009b6d9]{background:linear-gradient(135deg,#10b98126,#05966926);color:#10b981}.access-card-sessions[data-v-6009b6d9]:before{background:linear-gradient(135deg,#10b98114,#05966914)}.access-card-sessions:hover .access-icon[data-v-6009b6d9]{background:linear-gradient(135deg,#10b98140,#05966940);transform:translateY(-1px)}.access-card-goto .access-icon[data-v-6009b6d9]{background:linear-gradient(135deg,#f59e0b26,#fb923c26);color:#f59e0b}.access-card-goto[data-v-6009b6d9]:before{background:linear-gradient(135deg,#f59e0b14,#fb923c14)}.access-card-goto:hover .access-icon[data-v-6009b6d9]{background:linear-gradient(135deg,#f59e0b40,#fb923c40);transform:translate(2px)}.access-card.clickable[data-v-6009b6d9]:hover{transform:translateY(-2px);box-shadow:0 8px 20px #0000001a;border-color:var(--border-secondary)}.access-card.clickable[data-v-6009b6d9]:hover:before{opacity:1}.access-card.disabled[data-v-6009b6d9]{cursor:default;opacity:.62}.access-card.disabled[data-v-6009b6d9]:hover{transform:none;box-shadow:none;border-color:var(--border-primary)}.access-card.clickable[data-v-6009b6d9]:active{transform:translateY(0)}.access-label[data-v-6009b6d9]{display:block;font-size:8px;font-weight:600;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.3px;white-space:nowrap;line-height:1.1}.access-value[data-v-6009b6d9]{display:block;font-size:13px;font-weight:800;color:var(--text-primary);line-height:1;white-space:nowrap}.access-goto[data-v-6009b6d9]{display:block;font-size:9px;font-weight:700;color:var(--text-primary);line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.stats-inline[data-v-6009b6d9]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}.stats-inline.stats-3col[data-v-6009b6d9]{grid-template-columns:repeat(3,1fr)}.stat-inline-item[data-v-6009b6d9]{display:flex;align-items:center;gap:8px;padding:10px;background:var(--bg-secondary);border-radius:10px;border:1px solid var(--border-primary);transition:all .2s ease}.stat-inline-item[data-v-6009b6d9]:hover{border-color:var(--border-secondary);background:var(--hover-bg)}.stat-icon-dot[data-v-6009b6d9]{width:8px;height:8px;border-radius:50%;flex-shrink:0}.stat-icon-dot.requests[data-v-6009b6d9]{background:#3b82f6;box-shadow:0 0 6px #3b82f680}.stat-icon-dot.tokens[data-v-6009b6d9]{background:#18a058;box-shadow:0 0 6px #18a05880}.stat-icon-dot.cost[data-v-6009b6d9]{background:#f59e0b;box-shadow:0 0 6px #f59e0b80}.stat-info[data-v-6009b6d9]{display:flex;flex-direction:column;gap:1px;min-width:0}.stat-label[data-v-6009b6d9]{font-size:10px;color:var(--text-tertiary);font-weight:500;text-transform:uppercase;letter-spacing:.2px}.stat-value[data-v-6009b6d9]{font-size:16px;font-weight:700;color:var(--text-primary);line-height:1.2;transition:all .3s ease}.stat-value.animating[data-v-6009b6d9]{animation:numberChange-6009b6d9 .6s ease}@keyframes numberChange-6009b6d9{0%{transform:translateY(-6px);opacity:.5}50%{transform:translateY(0);opacity:1;color:var(--primary-color)}to{transform:translateY(0);opacity:1}}.stats-card[data-v-6009b6d9],.chart-card[data-v-6009b6d9]{border-left:2px solid transparent}.stats-card-claude[data-v-6009b6d9],.chart-card[data-v-6009b6d9]:has(+.stats-card-claude),.card[data-v-6009b6d9]:has(.panel-card):nth-child(4){border-left-color:#18a058}.chart-card.chart-card-claude[data-v-6009b6d9]{border-left-color:#18a058}.stats-card-codex[data-v-6009b6d9],.chart-card[data-v-6009b6d9]:has(+.stats-card-codex),.card[data-v-6009b6d9]:has(.panel-card):nth-child(4){border-left-color:#3b82f6}.chart-card.chart-card-codex[data-v-6009b6d9]{border-left-color:#3b82f6}.stats-card-gemini[data-v-6009b6d9],.chart-card[data-v-6009b6d9]:has(+.stats-card-gemini),.card[data-v-6009b6d9]:has(.panel-card):nth-child(4){border-left-color:#a855f7}.chart-card.chart-card-gemini[data-v-6009b6d9]{border-left-color:#a855f7}.stats-card-opencode[data-v-6009b6d9],.chart-card[data-v-6009b6d9]:has(+.stats-card-opencode),.card[data-v-6009b6d9]:has(.panel-card):nth-child(4){border-left-color:#ea580c}.chart-card.chart-card-opencode[data-v-6009b6d9]{border-left-color:#ea580c}.stats-card-omp[data-v-6009b6d9],.chart-card[data-v-6009b6d9]:has(+.stats-card-omp),.card[data-v-6009b6d9]:has(.panel-card):nth-child(4){border-left-color:#0f9f9a}.chart-card.chart-card-omp[data-v-6009b6d9]{border-left-color:#0f9f9a}.chart-card[data-v-6009b6d9]{padding:0;overflow:hidden}.chart-card[data-v-6009b6d9] .panel-card{border:none;border-radius:0;box-shadow:none;background:transparent}.stat-requests .stat-value[data-v-6009b6d9]{color:#3b82f6}.stat-input .stat-value[data-v-6009b6d9]{color:#18a058}.stat-output .stat-value[data-v-6009b6d9]{color:#f59e0b}.token-label[data-v-6009b6d9]{display:flex;align-items:center;gap:8px}.token-dot[data-v-6009b6d9]{width:8px;height:8px;border-radius:50%}.logs-card[data-v-6009b6d9]{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--border-primary);border-radius:14px}.logs-card-body[data-v-6009b6d9]{flex:1;min-height:0;display:flex;flex-direction:column;padding:0}.logs-card .card-header[data-v-6009b6d9]{background:linear-gradient(135deg,var(--bg-secondary) 0%,var(--bg-tertiary) 100%)}.logs-table-wrapper[data-v-6009b6d9]{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;background:var(--bg-primary)}.logs-table-header[data-v-6009b6d9]{display:flex;padding:8px 12px;background:linear-gradient(180deg,var(--bg-tertiary) 0%,var(--bg-secondary) 100%);border-bottom:1px solid var(--border-primary);font-size:11px;font-weight:700;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.6px;flex-shrink:0}.logs-header-claude .log-col[data-v-6009b6d9]{color:#18a058b3;font-weight:600}.logs-header-codex .log-col[data-v-6009b6d9]{color:#3b82f6b3;font-weight:600}.logs-header-gemini .log-col[data-v-6009b6d9]{color:#a855f7b3;font-weight:600}.logs-header-opencode .log-col[data-v-6009b6d9]{color:#ea580cb3;font-weight:600}.logs-header-omp .log-col[data-v-6009b6d9]{color:#0f9f9ab3;font-weight:600}[data-theme=dark] .logs-header-claude .log-col[data-v-6009b6d9]{color:#34d399a6}[data-theme=dark] .logs-header-codex .log-col[data-v-6009b6d9]{color:#60a5faa6}[data-theme=dark] .logs-header-gemini .log-col[data-v-6009b6d9]{color:#c084fca6}[data-theme=dark] .logs-header-opencode .log-col[data-v-6009b6d9]{color:#fb923ca6}[data-theme=dark] .logs-header-omp .log-col[data-v-6009b6d9]{color:#2dd4bfa6}[data-theme=dark] .channel-column[data-v-6009b6d9]{background:linear-gradient(180deg,#121b22fa,#091016fa);border-color:#364c56d1;box-shadow:0 18px 42px #00000047}[data-theme=dark] .channel-header[data-v-6009b6d9]{background:linear-gradient(180deg,#16222ae6,#0d161dd1)}[data-theme=dark] .card[data-v-6009b6d9],[data-theme=dark] .access-card[data-v-6009b6d9],[data-theme=dark] .stat-inline-item[data-v-6009b6d9]{background:linear-gradient(180deg,#121c23f0,#0c151cf5);border-color:#364c56c7}[data-theme=dark] .card[data-v-6009b6d9]:hover,[data-theme=dark] .access-card.clickable[data-v-6009b6d9]:hover,[data-theme=dark] .stat-inline-item[data-v-6009b6d9]:hover{border-color:#4c6570eb;box-shadow:0 12px 28px #0000003d}[data-theme=dark] .card-header[data-v-6009b6d9]{background:linear-gradient(180deg,#16222aeb,#0e181ff5);border-bottom-color:#364c56b8}[data-theme=dark] .logs-table-wrapper[data-v-6009b6d9]{background:#091016f5}[data-theme=dark] .logs-table-header[data-v-6009b6d9]{background:linear-gradient(180deg,#121d25f5,#0b141bfa);border-bottom-color:#364c56c2}.logs-container[data-v-6009b6d9]{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden}.logs-container[data-v-6009b6d9]::-webkit-scrollbar{width:4px}.logs-container[data-v-6009b6d9]::-webkit-scrollbar-thumb{background:#18a0584d;border-radius:2px}.logs-container[data-v-6009b6d9]::-webkit-scrollbar-thumb:hover{background:#18a05880}.empty-logs[data-v-6009b6d9]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;color:var(--text-tertiary);min-height:200px;text-align:center}.log-row[data-v-6009b6d9]{display:flex;align-items:center;padding:10px 12px;min-height:40px;border-bottom:1px solid var(--border-primary);font-size:12px;transition:all .2s ease;background:var(--bg-primary);position:relative}.log-row[data-v-6009b6d9]:nth-child(2n){background:var(--bg-secondary)}[data-theme=dark] .log-row[data-v-6009b6d9]{background:#091016f5;border-bottom-color:#364c5694}[data-theme=dark] .log-row[data-v-6009b6d9]:nth-child(2n){background:#0d161df5}.log-row[data-v-6009b6d9]:hover{background:var(--hover-bg);transform:translate(2px)}.log-row.new-log[data-v-6009b6d9]{animation:newLogPulse-6009b6d9 4.5s cubic-bezier(.25,.46,.45,.94) forwards;border-left:3px solid #18a058}@keyframes newLogPulse-6009b6d9{0%{background:linear-gradient(90deg,#18a05826,#18a0580f);box-shadow:0 0 8px #18a05833}5%{background:linear-gradient(90deg,#18a0582e,#18a05814);box-shadow:0 0 12px 1px #18a05840}15%{background:linear-gradient(90deg,#18a05829,#18a05812);box-shadow:0 0 10px 1px #18a05833}30%{background:linear-gradient(90deg,#18a0581f,#18a0580d);box-shadow:0 0 6px #18a05826}50%{background:linear-gradient(90deg,#18a05814,#18a05808);box-shadow:0 0 4px #18a0581a}70%{background:linear-gradient(90deg,#18a0580a,#18a05804);box-shadow:0 0 2px #18a0580f}85%{background:linear-gradient(90deg,#18a05805,#18a05802);box-shadow:0 0 1px #18a05808}to{background:transparent;box-shadow:0 0 #18a05800;border-left-color:transparent}}[data-theme=dark] .log-row.new-log[data-v-6009b6d9]{animation:newLogPulseDark-6009b6d9 4.5s cubic-bezier(.25,.46,.45,.94) forwards}@keyframes newLogPulseDark-6009b6d9{0%{background:linear-gradient(90deg,#18a05833,#18a05814);box-shadow:0 0 10px #18a05840}5%{background:linear-gradient(90deg,#18a0583d,#18a0581a);box-shadow:0 0 14px 2px #18a0584d}15%{background:linear-gradient(90deg,#18a05836,#18a05817);box-shadow:0 0 12px 1px #18a05840}30%{background:linear-gradient(90deg,#18a05829,#18a05812);box-shadow:0 0 8px 1px #18a0582e}50%{background:linear-gradient(90deg,#18a0581c,#18a0580b);box-shadow:0 0 5px #18a0581f}70%{background:linear-gradient(90deg,#18a0580f,#18a05806);box-shadow:0 0 3px #18a05814}85%{background:linear-gradient(90deg,#18a05808,#18a05803);box-shadow:0 0 1px #18a0580a}to{background:transparent;box-shadow:0 0 #18a05800;border-left-color:transparent}}.log-row.new-log.action-row[data-v-6009b6d9]{border-left:3px solid #18a058}.log-row.action-row[data-v-6009b6d9]{background:linear-gradient(90deg,#18a0581f,#18a0580a);border-left:3px solid #18a058;padding-left:8px}.log-row.error-row[data-v-6009b6d9]{background:linear-gradient(90deg,#d0305024,#d030500a);border-left:3px solid #d03050;padding-left:8px}.log-row.action-row[data-v-6009b6d9]:hover{background:linear-gradient(90deg,#18a0582e,#18a05814)}.log-row.error-row[data-v-6009b6d9]:hover{background:linear-gradient(90deg,#d0305033,#d0305014)}.action-content[data-v-6009b6d9]{display:flex;align-items:center;gap:8px;width:100%}.action-msg[data-v-6009b6d9]{flex:1;font-size:11px;color:#18a058;font-weight:600;letter-spacing:.2px}.action-msg.error-msg[data-v-6009b6d9]{color:#d03050}.action-time[data-v-6009b6d9]{font-size:10px;font-family:SF Mono,Monaco,monospace;color:var(--text-tertiary);background:#18a0581a;padding:2px 6px;border-radius:4px}.action-time.error-time[data-v-6009b6d9]{background:#d030501f}.log-col[data-v-6009b6d9]{display:flex;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-channel[data-v-6009b6d9]{min-width:0}.col-channel .n-tag[data-v-6009b6d9]{max-width:100%;font-size:11px;font-weight:600;border-radius:4px;padding:3px 10px}.col-token[data-v-6009b6d9]{justify-content:center;font-family:SF Mono,Monaco,Consolas,monospace;font-size:12px;font-weight:600;color:var(--text-secondary);background:#00000008;padding:4px 8px;border-radius:4px;margin:0 3px}[data-theme=dark] .col-token[data-v-6009b6d9]{background:#ffffff0b;color:var(--text-secondary)}.col-time[data-v-6009b6d9]{justify-content:flex-end;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px;font-weight:500;color:var(--text-tertiary);padding-right:2px;opacity:.85}.log-row:hover .col-time[data-v-6009b6d9]{opacity:1;color:var(--text-secondary)}.col-channel-claude[data-v-6009b6d9]{flex:2 1 60px;min-width:50px}.col-token-claude[data-v-6009b6d9]{flex:1 1 40px;min-width:35px}.col-time-claude[data-v-6009b6d9]{flex:1.5 1 55px;min-width:50px}.col-channel-codex[data-v-6009b6d9]{flex:2 1 60px;min-width:50px}.col-token-codex[data-v-6009b6d9]{flex:1 1 40px;min-width:35px}.col-time-codex[data-v-6009b6d9]{flex:1.5 1 55px;min-width:50px}.col-channel-gemini[data-v-6009b6d9]{flex:2.5 1 70px;min-width:55px}.col-token-gemini[data-v-6009b6d9]{flex:1.2 1 45px;min-width:40px}.col-time-gemini[data-v-6009b6d9]{flex:1.8 1 60px;min-width:55px}.col-channel-opencode[data-v-6009b6d9]{flex:2.5 1 70px;min-width:55px}.col-token-opencode[data-v-6009b6d9]{flex:1.2 1 45px;min-width:40px}.col-time-opencode[data-v-6009b6d9]{flex:1.8 1 60px;min-width:55px}.col-channel-omp[data-v-6009b6d9]{flex:2.5 1 70px;min-width:55px}.col-token-omp[data-v-6009b6d9]{flex:1.2 1 45px;min-width:40px}.col-time-omp[data-v-6009b6d9]{flex:1.8 1 60px;min-width:55px}.claude-extra-area[data-v-6009b6d9]{display:flex;align-items:center;gap:6px;margin-left:auto}.mcp-count-tag[data-v-6009b6d9],.skills-count-tag[data-v-6009b6d9]{font-size:10px;font-weight:500;padding:0 8px;height:22px;line-height:22px;border-radius:4px;cursor:pointer;transition:all .2s ease}.mcp-count-tag.clickable[data-v-6009b6d9]:hover,.skills-count-tag.clickable[data-v-6009b6d9]:hover{transform:scale(1.03);filter:brightness(1.1)}.mcp-quick-panel[data-v-6009b6d9],.skills-quick-panel[data-v-6009b6d9]{padding:2px 0}.mcp-quick-panel .panel-title[data-v-6009b6d9],.skills-quick-panel .panel-title[data-v-6009b6d9]{display:flex;justify-content:space-between;align-items:center;padding:6px 10px 8px;border-bottom:1px solid var(--border-primary);margin-bottom:4px}.mcp-quick-panel .panel-title span[data-v-6009b6d9]:first-child,.skills-quick-panel .panel-title span[data-v-6009b6d9]:first-child{font-size:13px;font-weight:600;color:var(--text-primary)}.no-items[data-v-6009b6d9]{padding:16px 10px;text-align:center}.mcp-quick-list[data-v-6009b6d9],.skills-quick-list[data-v-6009b6d9]{max-height:300px;overflow-y:auto;padding:0 4px 4px}.mcp-quick-item[data-v-6009b6d9],.skill-quick-item[data-v-6009b6d9]{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:5px;margin-bottom:4px;background:var(--bg-secondary);transition:all .2s ease}.mcp-quick-item[data-v-6009b6d9]:hover,.skill-quick-item[data-v-6009b6d9]:hover{background:var(--hover-bg)}.mcp-item-icon[data-v-6009b6d9],.skill-item-icon[data-v-6009b6d9]{width:24px;height:24px;border-radius:5px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.mcp-item-icon[data-v-6009b6d9]{background:linear-gradient(135deg,#3b82f626,#3b82f60d);color:#3b82f6}.skill-item-icon[data-v-6009b6d9]{background:linear-gradient(135deg,#18a05826,#18a0580d);color:#18a058}.mcp-item-info[data-v-6009b6d9],.skill-item-info[data-v-6009b6d9]{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.mcp-item-name[data-v-6009b6d9],.skill-item-name[data-v-6009b6d9]{font-size:12px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mcp-item-type[data-v-6009b6d9]{font-size:10px;color:var(--text-tertiary);text-transform:uppercase}.skill-item-desc[data-v-6009b6d9]{font-size:10px;color:var(--text-tertiary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mcp-item-status[data-v-6009b6d9]{flex-shrink:0}.mcp-item-status .status-dot[data-v-6009b6d9]{width:8px;height:8px;border-radius:50%;background:var(--border-secondary)}.mcp-item-status.online .status-dot[data-v-6009b6d9]{background:#18a058;box-shadow:0 0 6px #18a05880}.mcp-item-status.error .status-dot[data-v-6009b6d9]{background:#d03050;box-shadow:0 0 6px #d0305080}.mcp-quick-list[data-v-6009b6d9]::-webkit-scrollbar,.skills-quick-list[data-v-6009b6d9]::-webkit-scrollbar{width:4px}.mcp-quick-list[data-v-6009b6d9]::-webkit-scrollbar-thumb,.skills-quick-list[data-v-6009b6d9]::-webkit-scrollbar-thumb{background:#00000026;border-radius:2px}[data-theme=dark] .mcp-quick-list[data-v-6009b6d9]::-webkit-scrollbar-thumb,[data-theme=dark] .skills-quick-list[data-v-6009b6d9]::-webkit-scrollbar-thumb{background:#ffffff26}.config-shortcut-button[data-v-6009b6d9]{--asset-shortcut-text: var(--text-color-3);--n-text-color: var(--asset-shortcut-text) !important;--n-text-color-hover: var(--asset-shortcut-text) !important;--n-text-color-pressed: var(--asset-shortcut-text) !important;--n-text-color-focus: var(--asset-shortcut-text) !important;padding:6px!important;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--bg-secondary);border:1px solid var(--border-primary);color:var(--asset-shortcut-text)!important;transition:transform .18s cubic-bezier(.4,0,.2,1),box-shadow .18s cubic-bezier(.4,0,.2,1);box-shadow:0 2px 4px #0000000d}.config-shortcut-button .n-icon[data-v-6009b6d9]{color:var(--asset-shortcut-text)!important;transition:transform .18s ease}.config-shortcut-button[data-v-6009b6d9] .n-button__content,.config-shortcut-button[data-v-6009b6d9] .n-button__icon{color:var(--asset-shortcut-text)!important}.config-shortcut-button[data-v-6009b6d9]:hover,.config-shortcut-button[data-v-6009b6d9]:focus,.config-shortcut-button[data-v-6009b6d9]:focus-visible{background:var(--bg-secondary);border-color:var(--border-primary);color:var(--asset-shortcut-text)!important;box-shadow:0 3px 8px #00000014;transform:translateY(-1px)}.config-shortcut-button:hover .n-icon[data-v-6009b6d9],.config-shortcut-button:focus .n-icon[data-v-6009b6d9],.config-shortcut-button:focus-visible .n-icon[data-v-6009b6d9]{color:var(--asset-shortcut-text)!important;transform:scale(1.1)}.config-shortcut-button[data-v-6009b6d9]:active{background:var(--bg-secondary);border-color:var(--border-primary);color:var(--asset-shortcut-text)!important;transform:translateY(0);box-shadow:0 2px 4px #0000000d}.lock-button[data-v-6009b6d9]{margin-left:6px;padding:6px!important;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--bg-secondary);border:1px solid var(--border-primary);transition:all .25s cubic-bezier(.4,0,.2,1);box-shadow:0 2px 4px #0000000d}.lock-button .n-icon[data-v-6009b6d9]{color:var(--text-color-3);transition:all .25s ease}.lock-button[data-v-6009b6d9]:hover{background:linear-gradient(135deg,#6b72801a,#6b72800d);border-color:#6b72804d;box-shadow:0 4px 12px #0000001a;transform:translateY(-1px)}.lock-button:hover .n-icon[data-v-6009b6d9]{color:var(--text-color-1);transform:scale(1.1)}.lock-button[data-v-6009b6d9]:active{transform:translateY(0);box-shadow:0 2px 4px #0000000d}.locked-overlay[data-v-6009b6d9]{flex:1;display:flex;align-items:center;justify-content:center;border-radius:6px;margin:10px;position:relative;overflow:hidden;background:var(--bg-secondary);border:1px solid var(--border-primary);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.locked-overlay[data-v-6009b6d9]:before{content:"";position:absolute;width:400px;height:400px;border-radius:50%;top:50%;left:50%;transform:translate(-50%,-50%);opacity:.4;filter:blur(60px);pointer-events:none}.locked-claude[data-v-6009b6d9]{background:linear-gradient(135deg,rgba(24,160,88,.03) 0%,var(--bg-secondary) 50%,rgba(24,160,88,.02) 100%)}.locked-claude[data-v-6009b6d9]:before{background:radial-gradient(circle,rgba(24,160,88,.15) 0%,transparent 70%)}.locked-codex[data-v-6009b6d9]{background:linear-gradient(135deg,rgba(59,130,246,.03) 0%,var(--bg-secondary) 50%,rgba(59,130,246,.02) 100%)}.locked-codex[data-v-6009b6d9]:before{background:radial-gradient(circle,rgba(59,130,246,.15) 0%,transparent 70%)}.locked-gemini[data-v-6009b6d9]{background:linear-gradient(135deg,rgba(168,85,247,.03) 0%,var(--bg-secondary) 50%,rgba(168,85,247,.02) 100%)}.locked-gemini[data-v-6009b6d9]:before{background:radial-gradient(circle,rgba(168,85,247,.15) 0%,transparent 70%)}.locked-opencode[data-v-6009b6d9]{background:linear-gradient(135deg,rgba(234,88,12,.03) 0%,var(--bg-secondary) 50%,rgba(234,88,12,.02) 100%)}.locked-opencode[data-v-6009b6d9]:before{background:radial-gradient(circle,rgba(234,88,12,.15) 0%,transparent 70%)}.locked-omp[data-v-6009b6d9]{background:linear-gradient(135deg,rgba(15,159,154,.03) 0%,var(--bg-secondary) 50%,rgba(15,159,154,.02) 100%)}.locked-omp[data-v-6009b6d9]:before{background:radial-gradient(circle,rgba(15,159,154,.15) 0%,transparent 70%)}.locked-content[data-v-6009b6d9]{display:flex;flex-direction:column;align-items:center;gap:20px;padding:60px 40px;text-align:center;position:relative;z-index:1}.lock-icon[data-v-6009b6d9]{width:96px;height:96px;display:flex;align-items:center;justify-content:center;border-radius:10px;background:var(--bg-primary);border:2px solid var(--border-primary);margin-bottom:8px;position:relative;box-shadow:0 8px 24px #0000001f;animation:lock-float-6009b6d9 3s ease-in-out infinite}@keyframes lock-float-6009b6d9{0%,to{transform:translateY(0)}50%{transform:translateY(-6px)}}.lock-icon[data-v-6009b6d9]:before{content:"";position:absolute;top:-8px;right:-8px;bottom:-8px;left:-8px;border-radius:20px;opacity:.6;filter:blur(12px)}.locked-claude .lock-icon[data-v-6009b6d9]{background:linear-gradient(135deg,rgba(24,160,88,.12) 0%,var(--bg-primary) 100%);border-color:#18a05840;box-shadow:0 8px 24px #18a05826,0 0 0 1px #18a0581a inset}.locked-claude .lock-icon[data-v-6009b6d9]:before{background:radial-gradient(circle,rgba(24,160,88,.3) 0%,transparent 60%)}.locked-claude .lock-icon .n-icon[data-v-6009b6d9]{color:#18a058;filter:drop-shadow(0 2px 4px rgba(24,160,88,.3))}.locked-codex .lock-icon[data-v-6009b6d9]{background:linear-gradient(135deg,rgba(59,130,246,.12) 0%,var(--bg-primary) 100%);border-color:#3b82f640;box-shadow:0 8px 24px #3b82f626,0 0 0 1px #3b82f61a inset}.locked-codex .lock-icon[data-v-6009b6d9]:before{background:radial-gradient(circle,rgba(59,130,246,.3) 0%,transparent 60%)}.locked-codex .lock-icon .n-icon[data-v-6009b6d9]{color:#3b82f6;filter:drop-shadow(0 2px 4px rgba(59,130,246,.3))}.locked-gemini .lock-icon[data-v-6009b6d9]{background:linear-gradient(135deg,rgba(168,85,247,.12) 0%,var(--bg-primary) 100%);border-color:#a855f740;box-shadow:0 8px 24px #a855f726,0 0 0 1px #a855f71a inset}.locked-gemini .lock-icon[data-v-6009b6d9]:before{background:radial-gradient(circle,rgba(168,85,247,.3) 0%,transparent 60%)}.locked-gemini .lock-icon .n-icon[data-v-6009b6d9]{color:#a855f7;filter:drop-shadow(0 2px 4px rgba(168,85,247,.3))}.locked-opencode .lock-icon[data-v-6009b6d9]{background:linear-gradient(135deg,rgba(234,88,12,.12) 0%,var(--bg-primary) 100%);border-color:#ea580c40;box-shadow:0 8px 24px #ea580c26,0 0 0 1px #ea580c1a inset}.locked-opencode .lock-icon[data-v-6009b6d9]:before{background:radial-gradient(circle,rgba(234,88,12,.3) 0%,transparent 60%)}.locked-opencode .lock-icon .n-icon[data-v-6009b6d9]{color:#ea580c;filter:drop-shadow(0 2px 4px rgba(234,88,12,.3))}.locked-omp .lock-icon[data-v-6009b6d9]{background:linear-gradient(135deg,rgba(15,159,154,.12) 0%,var(--bg-primary) 100%);border-color:#0f9f9a40;box-shadow:0 8px 24px #0f9f9a26,0 0 0 1px #0f9f9a1a inset}.locked-omp .lock-icon[data-v-6009b6d9]:before{background:radial-gradient(circle,rgba(15,159,154,.3) 0%,transparent 60%)}.locked-omp .lock-icon .n-icon[data-v-6009b6d9]{color:#0f9f9a;filter:drop-shadow(0 2px 4px rgba(15,159,154,.3))}.lock-icon .n-icon[data-v-6009b6d9]{opacity:.85;position:relative;z-index:1}.locked-title[data-v-6009b6d9]{font-size:17px;font-weight:600;color:var(--text-color-1);margin:0;letter-spacing:.3px}.locked-hint[data-v-6009b6d9]{font-size:13px;color:var(--text-color-3);max-width:220px;line-height:1.7;opacity:.9}.channel-status[data-v-6009b6d9]{cursor:pointer;padding:4px 8px!important;border-radius:4px;transition:all .2s ease}.channel-status[data-v-6009b6d9]:hover{background:var(--hover-bg)}.channel-quick-panel[data-v-6009b6d9]{padding:4px 0}.panel-title[data-v-6009b6d9]{display:flex;justify-content:space-between;align-items:center;padding:8px 12px 12px;border-bottom:1px solid var(--border-primary);margin-bottom:8px}.panel-title span[data-v-6009b6d9]:first-child{font-size:13px;font-weight:600;color:var(--text-primary)}.no-channels[data-v-6009b6d9]{padding:24px 12px;text-align:center}.channel-quick-list[data-v-6009b6d9]{max-height:360px;overflow-y:auto}.channel-quick-item[data-v-6009b6d9]{display:flex;flex-direction:column;gap:8px;padding:10px 12px;border-radius:6px;margin:0 4px 6px;background:var(--bg-secondary);transition:all .2s ease}.channel-quick-item[data-v-6009b6d9]:hover{background:var(--hover-bg)}.channel-quick-item.disabled[data-v-6009b6d9]{opacity:.6}.channel-quick-info[data-v-6009b6d9]{display:flex;align-items:center;gap:8px;width:100%}.channel-quick-name[data-v-6009b6d9]{font-size:13px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.channel-metrics[data-v-6009b6d9]{display:flex;gap:6px;width:100%}.channel-metrics .metric-item[data-v-6009b6d9]{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;padding:6px 4px;background:var(--bg-primary);border-radius:4px;border:1px solid var(--border-primary)}.channel-metrics .metric-label[data-v-6009b6d9]{font-size:10px;color:var(--text-tertiary);font-weight:500}.channel-metrics .metric-value[data-v-6009b6d9]{font-size:12px;font-weight:700;color:var(--text-primary);font-family:SF Mono,Monaco,monospace}.channel-metrics .metric-value.active[data-v-6009b6d9]{color:#f59e0b}.channel-switching-tip[data-v-6009b6d9]{font-size:11px;color:var(--text-tertiary);padding:0 2px}.channel-quick-item.disabled .channel-metrics .metric-value[data-v-6009b6d9]{color:var(--text-tertiary)}.channel-quick-list[data-v-6009b6d9]::-webkit-scrollbar{width:4px}.channel-quick-list[data-v-6009b6d9]::-webkit-scrollbar-thumb{background:#00000026;border-radius:2px}[data-theme=dark] .channel-quick-list[data-v-6009b6d9]::-webkit-scrollbar-thumb{background:#ffffff26}@media (max-width: 1024px){.channel-column[data-v-6009b6d9]{border-radius:6px}.card-header[data-v-6009b6d9]{padding:8px 10px}.card-title[data-v-6009b6d9]{font-size:13px}.stats-inline[data-v-6009b6d9]{gap:6px}.stat-inline-item[data-v-6009b6d9]{padding:8px}.stat-value[data-v-6009b6d9]{font-size:14px}.stat-label[data-v-6009b6d9]{font-size:9px}.logs-table-header[data-v-6009b6d9]{padding:8px 10px;font-size:10px}.log-row[data-v-6009b6d9]{padding:8px 10px;font-size:11px}}@media (max-width: 768px){.channel-column[data-v-6009b6d9]{border-radius:6px;min-height:300px;height:auto;max-height:400px}.card-header[data-v-6009b6d9]{padding:8px;gap:6px}.card-title[data-v-6009b6d9]{font-size:12px}.stats-inline[data-v-6009b6d9]{gap:4px}.stat-inline-item[data-v-6009b6d9]{padding:6px;gap:6px}.stat-icon-dot[data-v-6009b6d9]{width:6px;height:6px}.stat-value[data-v-6009b6d9]{font-size:13px}.stat-label[data-v-6009b6d9]{font-size:8px}.logs-card[data-v-6009b6d9]{min-height:150px}.logs-table-header[data-v-6009b6d9]{padding:6px 8px;font-size:9px}.log-row[data-v-6009b6d9]{padding:6px 8px;font-size:10px;min-height:32px}.col-token[data-v-6009b6d9]{font-size:10px;padding:2px 4px}.col-time[data-v-6009b6d9]{font-size:9px}.mcp-count-tag[data-v-6009b6d9],.skills-count-tag[data-v-6009b6d9]{font-size:9px;padding:0 6px;height:18px;line-height:18px}.config-shortcut-button[data-v-6009b6d9]{padding:4px 8px;font-size:10px;gap:4px}.lock-button[data-v-6009b6d9]{width:26px;height:26px}}@media (max-width: 640px){.channel-column[data-v-6009b6d9]{min-height:250px;max-height:350px}.card-header[data-v-6009b6d9]{padding:6px;gap:4px;flex-wrap:wrap}.card-title[data-v-6009b6d9]{font-size:11px}.stats-card .card-content[data-v-6009b6d9]{padding:6px}.stats-inline[data-v-6009b6d9]{gap:3px;flex-wrap:wrap}.stat-inline-item[data-v-6009b6d9]{padding:5px;gap:4px;min-width:calc(33% - 3px);flex:1 1 auto}.stat-icon-dot[data-v-6009b6d9]{width:5px;height:5px}.stat-value[data-v-6009b6d9]{font-size:12px}.stat-label[data-v-6009b6d9]{font-size:7px}.logs-card[data-v-6009b6d9]{min-height:120px}.logs-table-header[data-v-6009b6d9]{padding:5px 6px;font-size:8px;letter-spacing:.3px}.log-row[data-v-6009b6d9]{padding:5px 6px;font-size:9px;min-height:28px}.col-channel .n-tag[data-v-6009b6d9]{font-size:9px;padding:2px 6px}.col-token[data-v-6009b6d9]{font-size:9px;padding:2px 3px;margin:0 1px}.col-time[data-v-6009b6d9]{font-size:8px}.claude-extra-area[data-v-6009b6d9]{gap:4px}.mcp-count-tag[data-v-6009b6d9],.skills-count-tag[data-v-6009b6d9]{font-size:8px;padding:0 4px;height:16px;line-height:16px}.config-shortcut-button[data-v-6009b6d9]{padding:3px 6px;font-size:9px;gap:3px}.config-shortcut-button .n-icon[data-v-6009b6d9]{font-size:12px!important}.lock-button[data-v-6009b6d9]{width:24px;height:24px;margin-left:4px}.lock-button .n-icon[data-v-6009b6d9]{font-size:12px!important}.locked-content[data-v-6009b6d9]{padding:30px 20px;gap:12px}.lock-icon[data-v-6009b6d9]{width:64px;height:64px}.lock-icon .n-icon[data-v-6009b6d9]{font-size:28px!important}.lock-title[data-v-6009b6d9]{font-size:14px}.lock-subtitle[data-v-6009b6d9]{font-size:10px}.unlock-btn[data-v-6009b6d9]{padding:8px 16px;font-size:11px}}@media (max-width: 480px){.channel-column[data-v-6009b6d9]{min-height:220px;max-height:300px}.card-header[data-v-6009b6d9]{padding:5px}.card-title[data-v-6009b6d9]{font-size:10px}.stats-inline[data-v-6009b6d9]{gap:2px}.stat-inline-item[data-v-6009b6d9]{padding:4px;gap:3px}.stat-value[data-v-6009b6d9]{font-size:11px}.stat-label[data-v-6009b6d9]{font-size:6px}.logs-table-header[data-v-6009b6d9]{padding:4px 5px;font-size:7px}.log-row[data-v-6009b6d9]{padding:4px 5px;font-size:8px;min-height:24px}.col-token[data-v-6009b6d9]{font-size:8px}.col-time[data-v-6009b6d9]{font-size:7px}}.card[data-v-6009b6d9]:not(.logs-card) .n-collapse{background:transparent}.card[data-v-6009b6d9]:not(.logs-card) .n-collapse-item{background:transparent}.card[data-v-6009b6d9] .n-collapse-item__header{padding:12px 16px;background:transparent;transition:all .3s ease}.card[data-v-6009b6d9] .n-collapse-item__header:hover{background:#00000005}.card[data-v-6009b6d9] .n-collapse-item__header-main{width:100%}.card[data-v-6009b6d9]:not(.logs-card) .n-collapse-item__content-wrapper{padding:0 16px 12px}.card[data-v-6009b6d9]:not(.logs-card) .n-collapse-item__content-inner{padding-top:0}.chart-card[data-v-6009b6d9]:has(.n-collapse){padding:0}.dashboard-container[data-v-276ca51b]{height:100%;background:var(--gradient-bg);overflow:hidden;padding:18px;box-sizing:border-box;display:flex;flex-direction:column}.dashboard-toolbar[data-v-276ca51b]{display:flex;justify-content:flex-end;margin-bottom:8px;flex-shrink:0}.analytics-link[data-v-276ca51b]{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--primary-color, #18a058);text-decoration:none;padding:4px 10px;border-radius:4px;background:#18a05814;transition:background .2s}.analytics-link[data-v-276ca51b]:hover{background:#18a05826}.analytics-link-icon[data-v-276ca51b]{font-size:14px}.dashboard-grid[data-v-276ca51b]{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;flex:1;min-height:0;overflow:hidden;box-sizing:border-box;align-items:stretch}.dashboard-grid[data-v-276ca51b] .sortable-ghost{opacity:.4}.dashboard-grid[data-v-276ca51b] .sortable-chosen{box-shadow:0 8px 24px #00000026}@media (max-width: 1240px){.dashboard-grid[data-v-276ca51b]{grid-template-columns:repeat(3,1fr)}}@media (max-width: 960px){.dashboard-grid[data-v-276ca51b]{grid-template-columns:repeat(2,1fr)}}@media (max-width: 1024px){.dashboard-container[data-v-276ca51b]{padding:14px}.dashboard-grid[data-v-276ca51b]{gap:12px}}@media (max-width: 900px){.dashboard-grid[data-v-276ca51b]{grid-template-columns:1fr}}@media (max-width: 768px){.dashboard-container[data-v-276ca51b]{padding:10px;overflow-y:auto}.dashboard-grid[data-v-276ca51b]{gap:10px;overflow:visible;min-height:auto}}@media (max-width: 640px){.dashboard-container[data-v-276ca51b]{padding:6px}.dashboard-grid[data-v-276ca51b]{gap:6px}}@media (max-width: 480px){.dashboard-container[data-v-276ca51b]{padding:4px}.dashboard-grid[data-v-276ca51b]{gap:4px}}