coding-tool-x 3.7.4 → 3.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/web/assets/{Analytics-BmPIW7oK.js → Analytics-wCRLv26m.js} +1 -1
  2. package/dist/web/assets/{ConfigTemplates-CG4j4ua4.js → ConfigTemplates-aa1blEHh.js} +1 -1
  3. package/dist/web/assets/Home-CqnBXFxj.css +1 -0
  4. package/dist/web/assets/Home-eIxO50-k.js +1 -0
  5. package/dist/web/assets/{PluginManager-CCJ7mo35.js → PluginManager-BAwGFNjN.js} +1 -1
  6. package/dist/web/assets/ProjectList-CRiAEixW.js +1 -0
  7. package/dist/web/assets/ProjectList-Dw2omgOH.css +1 -0
  8. package/dist/web/assets/SessionList-BQ0FW6Gd.js +1 -0
  9. package/dist/web/assets/SessionList-kYJ6-Ies.css +1 -0
  10. package/dist/web/assets/{SkillManager-DmOTHcQ7.js → SkillManager-Bhzs1O5S.js} +1 -1
  11. package/dist/web/assets/{WorkspaceManager-DLVj0zlu.js → WorkspaceManager-CLdX-pTT.js} +1 -1
  12. package/dist/web/assets/index-B_nFqixU.css +1 -0
  13. package/dist/web/assets/index-ClMNA9Hf.js +2 -0
  14. package/dist/web/index.html +2 -2
  15. package/package.json +1 -1
  16. package/src/server/api/codex-projects.js +7 -11
  17. package/src/server/api/codex-sessions.js +30 -21
  18. package/src/server/api/dashboard.js +24 -36
  19. package/src/server/api/gemini-projects.js +7 -11
  20. package/src/server/api/gemini-sessions.js +28 -26
  21. package/src/server/api/omp-channels.js +50 -7
  22. package/src/server/api/omp-projects.js +6 -11
  23. package/src/server/api/omp-sessions.js +31 -17
  24. package/src/server/api/opencode-projects.js +6 -11
  25. package/src/server/api/opencode-sessions.js +28 -21
  26. package/src/server/api/projects.js +7 -28
  27. package/src/server/api/sessions.js +32 -16
  28. package/src/server/services/channel-balance.js +2 -1
  29. package/src/server/services/codex-sessions.js +23 -10
  30. package/src/server/services/dashboard-snapshot-worker.js +216 -0
  31. package/src/server/services/gemini-sessions.js +15 -3
  32. package/src/server/services/native-oauth-adapters.js +2 -1
  33. package/src/server/services/omp-auth-provider-worker.js +29 -0
  34. package/src/server/services/omp-auth-providers.js +137 -11
  35. package/src/server/services/omp-config.js +7 -4
  36. package/src/server/services/omp-sessions.js +38 -14
  37. package/src/server/services/opencode-sessions.js +9 -6
  38. package/src/server/services/plugins-service.js +2 -1
  39. package/src/server/services/project-snapshots.js +8 -1
  40. package/src/server/services/session-snapshot-worker.js +158 -0
  41. package/src/server/services/session-snapshots.js +145 -0
  42. package/src/server/services/sessions.js +6 -4
  43. package/src/server/services/snapshot-cache.js +123 -13
  44. package/dist/web/assets/Home-B9yAAZrD.js +0 -1
  45. package/dist/web/assets/Home-DSTUSxrT.css +0 -1
  46. package/dist/web/assets/ProjectList-D3a0oRum.css +0 -1
  47. package/dist/web/assets/ProjectList-DVUs3o8x.js +0 -1
  48. package/dist/web/assets/SessionList-D12muXvx.css +0 -1
  49. package/dist/web/assets/SessionList-DwssBydw.js +0 -1
  50. package/dist/web/assets/index-BjdNYwSs.js +0 -2
  51. package/dist/web/assets/index-kQCC5dlu.css +0 -1
@@ -0,0 +1,145 @@
1
+ 'use strict';
2
+
3
+ const path = require('path');
4
+ const { fork } = require('child_process');
5
+ const {
6
+ getSnapshot,
7
+ invalidateSnapshot
8
+ } = require('./snapshot-cache');
9
+
10
+ const SESSION_SNAPSHOT_TTL_MS = 60 * 1000;
11
+ const SESSION_SNAPSHOT_DEFER_MS = process.env.NODE_ENV === 'test' ? 0 : 750;
12
+ const SESSION_SNAPSHOT_WORKER_TIMEOUT_MS = 180 * 1000;
13
+ const SESSION_SNAPSHOT_WAIT_ON_MISS_MS = process.env.NODE_ENV === 'test' ? 0 : 2500;
14
+ const SESSION_SNAPSHOT_WAIT_ON_FORCE_MS = process.env.NODE_ENV === 'test' ? 0 : 2500;
15
+
16
+ function sessionListKey(source, projectName) {
17
+ return `sessions:list:${source}:${projectName}`;
18
+ }
19
+
20
+ function defaultProjectInfo(projectName) {
21
+ return {
22
+ name: projectName,
23
+ fullPath: projectName,
24
+ path: projectName,
25
+ displayName: projectName
26
+ };
27
+ }
28
+
29
+ function emptySessionList(projectName, extra = {}) {
30
+ return {
31
+ sessions: [],
32
+ totalSize: 0,
33
+ aliases: {},
34
+ projectInfo: defaultProjectInfo(projectName),
35
+ ...extra
36
+ };
37
+ }
38
+
39
+ function runSessionSnapshotWorker(source, projectName, config = {}, options = {}) {
40
+ if (process.env.NODE_ENV === 'test') {
41
+ const { buildPayload } = require('./session-snapshot-worker');
42
+ return Promise.resolve(buildPayload({ source, projectName, config, options }));
43
+ }
44
+
45
+ return new Promise((resolve, reject) => {
46
+ const workerPath = path.join(__dirname, 'session-snapshot-worker.js');
47
+ const child = fork(workerPath, [], {
48
+ stdio: ['ignore', 'ignore', 'pipe', 'ipc'],
49
+ env: {
50
+ ...process.env,
51
+ CC_TOOL_SESSION_SNAPSHOT_WORKER: '1'
52
+ }
53
+ });
54
+
55
+ let settled = false;
56
+ let stderr = '';
57
+ let timeout = null;
58
+
59
+ const finish = (error, value) => {
60
+ if (settled) return;
61
+ settled = true;
62
+ if (timeout) {
63
+ clearTimeout(timeout);
64
+ }
65
+ child.removeAllListeners();
66
+ if (!child.killed) {
67
+ child.kill();
68
+ }
69
+ if (error) {
70
+ reject(error);
71
+ } else {
72
+ resolve(value);
73
+ }
74
+ };
75
+
76
+ timeout = setTimeout(() => {
77
+ finish(new Error(`Session snapshot refresh timed out for ${source}/${projectName}`));
78
+ }, SESSION_SNAPSHOT_WORKER_TIMEOUT_MS);
79
+
80
+ child.stderr.on('data', (chunk) => {
81
+ stderr += chunk.toString();
82
+ if (stderr.length > 4096) {
83
+ stderr = stderr.slice(-4096);
84
+ }
85
+ });
86
+
87
+ child.on('message', (message) => {
88
+ if (!message || typeof message !== 'object') return;
89
+ if (message.ok) {
90
+ finish(null, message.value);
91
+ } else {
92
+ finish(new Error(message.error || `Session snapshot refresh failed for ${source}/${projectName}`));
93
+ }
94
+ });
95
+
96
+ child.on('error', (error) => finish(error));
97
+ child.on('exit', (code, signal) => {
98
+ if (settled) return;
99
+ const suffix = stderr ? `: ${stderr.trim()}` : '';
100
+ finish(new Error(`Session snapshot worker exited (${code || signal || 'unknown'})${suffix}`));
101
+ });
102
+
103
+ child.send({ source, projectName, config, options });
104
+ });
105
+ }
106
+
107
+ async function getSessionListSnapshot(source, projectName, {
108
+ fallbackValue,
109
+ refresh,
110
+ force = false
111
+ }) {
112
+ return getSnapshot(sessionListKey(source, projectName), {
113
+ ttlMs: SESSION_SNAPSHOT_TTL_MS,
114
+ fallbackValue: fallbackValue || emptySessionList(projectName),
115
+ refresh,
116
+ force: process.env.NODE_ENV === 'test' ? true : force,
117
+ backgroundOnMiss: process.env.NODE_ENV === 'test' ? false : !force,
118
+ staleWhileForce: true,
119
+ waitOnMissMs: SESSION_SNAPSHOT_WAIT_ON_MISS_MS,
120
+ waitOnForceMs: SESSION_SNAPSHOT_WAIT_ON_FORCE_MS,
121
+ deferMs: SESSION_SNAPSHOT_DEFER_MS
122
+ });
123
+ }
124
+
125
+ function invalidateSessionSnapshots(source, projectName = null) {
126
+ if (!source) return;
127
+ if (projectName) {
128
+ invalidateSnapshot(sessionListKey(source, projectName));
129
+ return;
130
+ }
131
+ invalidateSnapshot(`sessions:list:${source}:`);
132
+ }
133
+
134
+ module.exports = {
135
+ SESSION_SNAPSHOT_TTL_MS,
136
+ SESSION_SNAPSHOT_WAIT_ON_MISS_MS,
137
+ SESSION_SNAPSHOT_WAIT_ON_FORCE_MS,
138
+ SESSION_SNAPSHOT_WORKER_TIMEOUT_MS,
139
+ defaultProjectInfo,
140
+ emptySessionList,
141
+ getSessionListSnapshot,
142
+ invalidateSessionSnapshots,
143
+ runSessionSnapshotWorker,
144
+ sessionListKey
145
+ };
@@ -600,12 +600,14 @@ function scanSessionFileForMessagesAsync(filePath) {
600
600
  }
601
601
 
602
602
  // Get sessions for a project - async version
603
- async function getSessionsForProject(config, projectName) {
603
+ async function getSessionsForProject(config, projectName, options = {}) {
604
604
  // Check cache first
605
605
  const cacheKey = `${CacheKeys.SESSIONS}${projectName}`;
606
- const cached = globalCache.get(cacheKey);
607
- if (cached) {
608
- return cached;
606
+ if (!options.force) {
607
+ const cached = globalCache.get(cacheKey);
608
+ if (cached) {
609
+ return cached;
610
+ }
609
611
  }
610
612
 
611
613
  const projectConfig = { ...config, currentProject: projectName };
@@ -9,10 +9,13 @@ const DEFAULT_TTL_MS = 60 * 1000;
9
9
  const SNAPSHOT_VERSION = 1;
10
10
  const DEFAULT_BACKGROUND_DELAY_MS = process.env.NODE_ENV === 'test' ? 0 : 750;
11
11
  const DEFAULT_BACKGROUND_GAP_MS = process.env.NODE_ENV === 'test' ? 0 : 100;
12
+ const WAIT_TIMEOUT = Symbol('snapshot-wait-timeout');
12
13
 
13
14
  const snapshots = new Map();
14
15
  const inflight = new Map();
15
16
  const deferredQueue = [];
17
+ const lastErrors = new Map();
18
+ const invalidationVersions = new Map();
16
19
  let deferredRunning = false;
17
20
 
18
21
  function getSnapshotDir() {
@@ -91,6 +94,16 @@ function persistEntry(key, entry) {
91
94
  }
92
95
  }
93
96
 
97
+ function getInvalidationVersion(key) {
98
+ return invalidationVersions.get(key) || 0;
99
+ }
100
+
101
+ function bumpInvalidationVersion(key) {
102
+ const nextVersion = getInvalidationVersion(key) + 1;
103
+ invalidationVersions.set(key, nextVersion);
104
+ return nextVersion;
105
+ }
106
+
94
107
  function makeEntry(key, value, nowMs = Date.now()) {
95
108
  return {
96
109
  key,
@@ -132,32 +145,46 @@ function runRefresh(refresh, defer, deferMs) {
132
145
  return runDeferredRefresh(refresh, deferMs);
133
146
  }
134
147
 
135
- function refreshSnapshot(key, refresh, { defer = false, deferMs = DEFAULT_BACKGROUND_DELAY_MS } = {}) {
136
- if (inflight.has(key)) {
148
+ function refreshSnapshot(key, refresh, {
149
+ defer = false,
150
+ deferMs = DEFAULT_BACKGROUND_DELAY_MS,
151
+ bypassInflight = false
152
+ } = {}) {
153
+ if (!bypassInflight && inflight.has(key)) {
137
154
  return inflight.get(key);
138
155
  }
139
156
 
157
+ const startedVersion = bypassInflight ? bumpInvalidationVersion(key) : getInvalidationVersion(key);
140
158
  const promise = runRefresh(refresh, defer, deferMs)
141
159
  .then((value) => {
142
160
  const entry = makeEntry(key, value);
143
- snapshots.set(key, entry);
144
- persistEntry(key, entry);
161
+ if (getInvalidationVersion(key) === startedVersion) {
162
+ snapshots.set(key, entry);
163
+ lastErrors.delete(key);
164
+ persistEntry(key, entry);
165
+ }
145
166
  return entry;
146
167
  })
147
168
  .catch((error) => {
169
+ const message = error?.message || String(error);
148
170
  const existing = getEntry(key);
149
- if (existing) {
171
+ if (existing && getInvalidationVersion(key) === startedVersion) {
150
172
  const retained = {
151
173
  ...existing,
152
- lastError: error?.message || String(error)
174
+ lastError: message
153
175
  };
154
176
  snapshots.set(key, retained);
177
+ lastErrors.set(key, message);
155
178
  persistEntry(key, retained);
179
+ } else {
180
+ lastErrors.set(key, message);
156
181
  }
157
182
  throw error;
158
183
  })
159
184
  .finally(() => {
160
- inflight.delete(key);
185
+ if (inflight.get(key) === promise) {
186
+ inflight.delete(key);
187
+ }
161
188
  });
162
189
 
163
190
  inflight.set(key, promise);
@@ -170,7 +197,30 @@ function isExpired(entry, ttlMs, nowMs) {
170
197
  return nowMs - Number(entry.updatedAtMs || 0) >= ttlMs;
171
198
  }
172
199
 
200
+ async function waitForRefresh(promise, waitMs) {
201
+ const timeoutMs = Number(waitMs) || 0;
202
+ if (timeoutMs <= 0) return { skipped: true };
203
+
204
+ let timer = null;
205
+ const result = await Promise.race([
206
+ promise
207
+ .then(entry => ({ entry }))
208
+ .catch(error => ({ error })),
209
+ new Promise(resolve => {
210
+ timer = setTimeout(() => resolve(WAIT_TIMEOUT), timeoutMs);
211
+ })
212
+ ]);
213
+ if (timer) {
214
+ clearTimeout(timer);
215
+ }
216
+ if (result === WAIT_TIMEOUT) {
217
+ return { timedOut: true };
218
+ }
219
+ return result;
220
+ }
221
+
173
222
  function makeMeta(entry, {
223
+ key,
174
224
  stale,
175
225
  refreshing,
176
226
  fallback,
@@ -181,7 +231,7 @@ function makeMeta(entry, {
181
231
  stale: Boolean(stale),
182
232
  refreshing: Boolean(refreshing),
183
233
  fallback: Boolean(fallback),
184
- error: error || entry?.lastError || null
234
+ error: error || entry?.lastError || lastErrors.get(entry?.key || key) || null
185
235
  };
186
236
  }
187
237
 
@@ -191,14 +241,18 @@ async function getSnapshot(key, {
191
241
  refresh,
192
242
  backgroundOnMiss = true,
193
243
  force = false,
244
+ staleWhileForce = false,
194
245
  nowMs = Date.now(),
195
- deferMs = DEFAULT_BACKGROUND_DELAY_MS
246
+ deferMs = DEFAULT_BACKGROUND_DELAY_MS,
247
+ waitOnMissMs = 0,
248
+ waitOnForceMs = 0
196
249
  } = {}) {
197
250
  if (typeof refresh !== 'function') {
198
251
  const entry = getEntry(key);
199
252
  return {
200
253
  value: cloneJson(entry ? entry.value : fallbackValue),
201
254
  meta: makeMeta(entry, {
255
+ key,
202
256
  stale: !entry,
203
257
  refreshing: false,
204
258
  fallback: !entry
@@ -206,15 +260,34 @@ async function getSnapshot(key, {
206
260
  };
207
261
  }
208
262
 
209
- let entry = force ? null : getEntry(key);
263
+ let entry = force && !staleWhileForce ? null : getEntry(key);
210
264
  let expired = force || isExpired(entry, ttlMs, nowMs);
211
265
  let refreshPromise = null;
212
266
  let refreshError = null;
213
267
 
214
268
  if (expired) {
215
- if (!entry && backgroundOnMiss === false) {
269
+ const coldWaitMs = !entry
270
+ ? (force ? (waitOnForceMs || waitOnMissMs) : waitOnMissMs)
271
+ : 0;
272
+
273
+ if (!entry && Number(coldWaitMs) > 0) {
274
+ refreshPromise = refreshSnapshot(key, refresh, { bypassInflight: force });
275
+ const waitResult = await waitForRefresh(refreshPromise, coldWaitMs);
276
+ if (waitResult.entry) {
277
+ entry = waitResult.entry;
278
+ expired = false;
279
+ refreshPromise = null;
280
+ } else if (waitResult.error) {
281
+ refreshError = waitResult.error?.message || String(waitResult.error);
282
+ entry = getEntry(key);
283
+ if (entry) {
284
+ expired = isExpired(entry, ttlMs, nowMs);
285
+ }
286
+ refreshPromise = null;
287
+ }
288
+ } else if (!entry && backgroundOnMiss === false) {
216
289
  try {
217
- entry = await refreshSnapshot(key, refresh);
290
+ entry = await refreshSnapshot(key, refresh, { bypassInflight: force });
218
291
  expired = false;
219
292
  } catch (error) {
220
293
  refreshError = error?.message || String(error);
@@ -222,7 +295,7 @@ async function getSnapshot(key, {
222
295
  if (!entry) throw error;
223
296
  }
224
297
  } else {
225
- refreshPromise = refreshSnapshot(key, refresh, { defer: true, deferMs });
298
+ refreshPromise = refreshSnapshot(key, refresh, { defer: !force, deferMs, bypassInflight: force });
226
299
  }
227
300
  }
228
301
 
@@ -230,6 +303,7 @@ async function getSnapshot(key, {
230
303
  return {
231
304
  value: cloneJson(hasEntry ? entry.value : fallbackValue),
232
305
  meta: makeMeta(entry, {
306
+ key,
233
307
  stale: !hasEntry || expired,
234
308
  refreshing: Boolean(refreshPromise || inflight.has(key)),
235
309
  fallback: !hasEntry,
@@ -240,15 +314,32 @@ async function getSnapshot(key, {
240
314
 
241
315
  function invalidateSnapshot(keyOrPrefix) {
242
316
  if (!keyOrPrefix) {
317
+ for (const key of inflight.keys()) {
318
+ bumpInvalidationVersion(key);
319
+ }
243
320
  snapshots.clear();
321
+ inflight.clear();
322
+ lastErrors.clear();
244
323
  return;
245
324
  }
246
325
 
247
326
  const key = String(keyOrPrefix);
248
327
  snapshots.delete(key);
328
+ inflight.delete(key);
329
+ lastErrors.delete(key);
330
+ bumpInvalidationVersion(key);
249
331
  for (const existingKey of Array.from(snapshots.keys())) {
250
332
  if (existingKey.startsWith(key)) {
251
333
  snapshots.delete(existingKey);
334
+ lastErrors.delete(existingKey);
335
+ bumpInvalidationVersion(existingKey);
336
+ }
337
+ }
338
+ for (const existingKey of Array.from(inflight.keys())) {
339
+ if (existingKey.startsWith(key)) {
340
+ inflight.delete(existingKey);
341
+ lastErrors.delete(existingKey);
342
+ bumpInvalidationVersion(existingKey);
252
343
  }
253
344
  }
254
345
 
@@ -259,14 +350,33 @@ function invalidateSnapshot(keyOrPrefix) {
259
350
  if (fs.existsSync(exactFile)) {
260
351
  fs.unlinkSync(exactFile);
261
352
  }
353
+ const files = fs.readdirSync(dir).filter(file => file.endsWith('.json'));
354
+ files.forEach((file) => {
355
+ const filePath = path.join(dir, file);
356
+ try {
357
+ const payload = JSON.parse(fs.readFileSync(filePath, 'utf8'));
358
+ const persistedKey = typeof payload?.key === 'string' ? payload.key : '';
359
+ if (persistedKey && persistedKey.startsWith(key)) {
360
+ fs.unlinkSync(filePath);
361
+ lastErrors.delete(persistedKey);
362
+ bumpInvalidationVersion(persistedKey);
363
+ }
364
+ } catch {
365
+ // Corrupt non-exact files cannot be matched to a prefix safely.
366
+ }
367
+ });
262
368
  } catch {
263
369
  // Best-effort invalidation; the in-memory state has already been cleared.
264
370
  }
265
371
  }
266
372
 
267
373
  function clearSnapshotCache({ deleteFiles = false } = {}) {
374
+ for (const key of inflight.keys()) {
375
+ bumpInvalidationVersion(key);
376
+ }
268
377
  snapshots.clear();
269
378
  inflight.clear();
379
+ lastErrors.clear();
270
380
  deferredQueue.splice(0, deferredQueue.length);
271
381
  deferredRunning = false;
272
382
  if (!deleteFiles) return;
@@ -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 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 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,n as D}from"./index-BjdNYwSs.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-CVyvdmg1.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:q,homeCliColumns:q,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={key:0,class:"runtime-badge"},$e={class:"card-body",style:{padding:"6px 10px"}},_e={class:"proxy-info-row"},Se={class:"proxy-status"},ze={class:"proxy-port"},qe={class:"channel-name"},Pe={class:"channel-quick-panel"},je={class:"panel-title"},Le={key:0,class:"no-channels"},Me={key:1,class:"channel-quick-list"},Ie={class:"channel-quick-info"},Oe={class:"channel-quick-name"},Ee={key:0,class:"channel-switching-tip"},Ne={class:"channel-metrics"},Fe={class:"metric-item"},Ae={class:"metric-value"},De={class:"metric-item"},Ue={class:"metric-value"},Je={class:"metric-item"},Ve={class:"metric-value"},Re={class:"metric-item"},Ke={class:"card"},Be={class:"card-header compact"},Ze={class:"card-body",style:{padding:"8px 10px"}},Ge={class:"quick-access-list"},He={class:"access-icon"},We={class:"access-content"},Xe={class:"access-value"},Ye={class:"access-icon"},Qe={class:"access-content"},ea={class:"access-value"},aa={class:"access-icon"},la={class:"access-content"},na={class:"access-goto"},sa={class:"card-header compact"},ca={class:"card-body",style:{padding:"8px 10px"}},ta={class:"stats-inline stats-3col"},oa={class:"stat-inline-item stat-requests"},ia={class:"stat-info"},ua={class:"stat-inline-item stat-input"},ra={class:"stat-info"},da={class:"stat-inline-item stat-output"},va={class:"stat-info"},pa={key:2,class:"card logs-card"},ha={class:"card-header compact"},ya={class:"card-body logs-card-body"},ma={class:"logs-table-wrapper"},ga={key:0,class:"empty-logs"},fa=["title"],ka={key:0,class:"action-content"},Ta={class:"action-msg"},Ca={class:"action-time"},ba={key:1,class:"action-content"},wa={class:"action-msg error-msg"},xa={class:"action-time error-time"},$a={class:"locked-content"},_a={class:"lock-icon"},Sa="channelLocks",za=P({__name:"ChannelColumn",props:{channelType:{type:String,required:!0}},setup(e){const S=e,z=l(),q=ne(),{uiConfig:P}=ye(),{claudeProxy:D,codexProxy:de,geminiProxy:ve,opencodeProxy:pe,ompProxy:he,claudeChannels:za,codexChannels:qa,geminiChannels:Pa,opencodeChannels:ja,ompChannels:La,schedulerState:Ma,getProxyState:Ia,startProxy:Oa,stopProxy:Ea,getLogs:Na,clearLogsForSource:Fa,loadChannels:Aa,logLimit:Da,statsInterval:Ua}=j(),{dashboardData:Ja,loadDashboard:Va}=L(),Ra=n(()=>M(S.channelType,P.value.customCliPlatforms)),Ka=n(()=>Ra.value.title||Ra.value.label||S.channelType),Ba=n(()=>Ra.value.icon||U),Za=n(()=>Ra.value.color||"#64748b"),Ga=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:Ra.value.custom?{running:!1,loading:!1,activeChannel:null,port:null,runtime:null,startTime:null}:{}),Ha=n(()=>"claude"===S.channelType?"Claude":"codex"===S.channelType?"Codex":"gemini"===S.channelType?"Gemini":"opencode"===S.channelType?"OpenCode":"omp"===S.channelType?"OMP":Ra.value.label||S.channelType),Wa=a({projects:0,sessions:0}),Xa=a({requests:0,tokens:0,cost:0}),Ya=a({requests:0,tokens:0,cost:0}),Qa={requests:0,tokens:0,cost:3};let el={requests:null,tokens:null,cost:null};const al=a({requests:!1,tokens:!1,cost:!1}),ll=n(()=>{var e,a,l;return(null==(l=null==(a=null==(e=Ja.value)?void 0:e.todayStats)?void 0:a[S.channelType])?void 0:l.byModel)||{}});function nl(e,a,l,n=600){el[e]&&cancelAnimationFrame(el[e]),al.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=Qa[e]??0,d=Math.pow(10,r),v=r>0?Math.round(u*d)/d:Math.round(u);Ya.value[e]=v,o<1?el[e]=requestAnimationFrame(c):al.value[e]=!1};el[e]=requestAnimationFrame(c)}const sl=a(!1),cl={claude:"claudeChannelCollapse",codex:"codexChannelCollapse",gemini:"geminiChannelCollapse",opencode:"opencodeChannelCollapse",omp:"ompChannelCollapse"};function tl(e){try{const a=localStorage.getItem(Sa),l=a?JSON.parse(a):{};l[S.channelType]=e,localStorage.setItem(Sa,JSON.stringify(l))}catch(a){}}const ol=a(function(){try{const e=localStorage.getItem(Sa);if(e){return JSON.parse(e)[S.channelType]||!1}}catch(e){}return!1}());async function il(){ol.value=!ol.value,tl(ol.value);try{if(await _("channelLocks",S.channelType,ol.value),Ja.value){const e=Ja.value.uiConfig||{},a={...e.channelLocks||{}};a[S.channelType]=ol.value,Ja.value={...Ja.value,uiConfig:{...e,channelLocks:a}}}}catch(e){}}const ul=a(!0);function rl(e){e.detail&&void 0!==e.detail.showLogs&&(ul.value=e.detail.showLogs)}const dl=a(Date.now()),vl=n(()=>{if(!Ga.value.running)return"";const e=Ga.value.startTime;if(!e)return"";const a=dl.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}),pl=a(null),hl=n(()=>Da.value),yl={claude:Na("claude"),codex:Na("codex"),gemini:Na("gemini"),opencode:Na("opencode"),omp:Na("omp")},ml=n(()=>{if(!zl())return[];return((yl[S.channelType]||yl.claude).value||[]).slice(0,hl.value)});let gl=null,fl=null,kl=null,Tl=!1,Cl=null;const bl=n(()=>{let e=[];"claude"===S.channelType?e=za.value||[]:"codex"===S.channelType?e=qa.value||[]:"gemini"===S.channelType?e=Pa.value||[]:"opencode"===S.channelType?e=ja.value||[]:"omp"===S.channelType&&(e=La.value||[]);return[...e.filter(e=>!1!==e.enabled),...e.filter(e=>!1===e.enabled)]});function wl(e){const a=Ma[S.channelType];if(!a||!a.channels)return 0;const l=a.channels.find(a=>a.id===e);return l?l.inflight:0}const xl=n(()=>{const e=bl.value.filter(e=>!1!==e.enabled).length;return Ga.value.running?`${e}个渠道调度中`:bl.value.length>0?`${e}个渠道已启用`:"无渠道"}),$l=n(()=>{var e,a,l;return(null==(l=null==(a=null==(e=Ja.value)?void 0:e.todayStats)?void 0:a[S.channelType])?void 0:l.byChannel)||{}});function _l(e){return $l.value[e]||{requests:0,tokens:0,cost:0}}function Sl(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 zl(){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 Pl(e){var a,l;if(!1===Ra.value.supportsProxy||!zl())return void q.warning(`${Ka.value} 暂未接入动态代理`);const n=Ia(S.channelType);n.value.loading=!0;try{let a;a=e?await Oa(S.channelType):await Ea(S.channelType,{refreshChannelsDrawer:!0}),!1!==a.success?q.success(e?`${Ka.value} 代理已启动`:`${Ka.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 jl(){!1!==Ra.value.supportsProjects&&zl()?z.push({name:`${S.channelType}-projects`}):q.info(`${Ka.value} 当前仅作为首页显示项`)}function Ll(){!1!==Ra.value.supportsProjects&&zl()?z.push({name:`${S.channelType}-projects`}):q.info(`${Ka.value} 当前仅作为首页显示项`)}function Ml(){!1!==Ra.value.supportsSessions&&zl()?sl.value=!0:q.info(`${Ka.value} 当前没有托管会话列表`)}s(ml,e=>{var a;const l=(null==(a=e[0])?void 0:a.id)||null;if(!l||l===gl)return void(gl=l);gl=l,Cl&&clearTimeout(Cl),Cl=setTimeout(()=>{Va(!0).then(()=>Al()).catch(()=>{})},5e3);(!pl.value||pl.value.scrollTop<20)&&x(()=>{pl.value&&(pl.value.scrollTop=0)})}),s(()=>Xa.value.requests,e=>{nl("requests",Ya.value.requests,e,600)}),s(()=>Xa.value.tokens,e=>{nl("tokens",Ya.value.tokens,e,600)}),s(()=>Xa.value.cost,e=>{nl("cost",Ya.value.cost,e,600)}),s(()=>S.channelType,()=>{var e;gl=(null==(e=ml.value[0])?void 0:e.id)||null}),s(()=>{var e,a;return null==(a=null==(e=Ja.value)?void 0:e.counts)?void 0:a[S.channelType]},()=>{Fl()}),s(()=>{var e,a;return null==(a=null==(e=Ja.value)?void 0:e.todayStats)?void 0:a[S.channelType]},()=>{Al()},{deep:!0}),s(Ua,()=>{Tl&&function(){fl&&(clearInterval(fl),fl=null);const e=Ua.value||30,a=Math.max(1e3*e,1e4);fl=setInterval(()=>{Va(!0).then(()=>Al()).catch(()=>{})},a)}()});const Il=a({});function Ol(e){return!!Il.value[e]}function El(e,a){e&&(Il.value={...Il.value,[e]:!!a})}async function Nl(e,a){if(e&&!Ol(e.id)){El(e.id,!0);try{let l;"claude"===S.channelType?l=O:"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=cl[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 Aa(),window.dispatchEvent(new CustomEvent("channel-management-refresh",{detail:{channel:S.channelType}})))}catch(l){q.error("操作失败: "+l.message)}finally{El(e.id,!1)}}}function Fl(){var e,a;const l=null==(a=null==(e=Ja.value)?void 0:e.counts)?void 0:a[S.channelType];Wa.value.projects=(null==l?void 0:l.projectCount)||0,Wa.value.sessions=(null==l?void 0:l.sessionCount)||0}async function Al(){if(Ja.value&&Ja.value.todayStats){const e=Ja.value.todayStats[S.channelType];e&&(Xa.value.requests=e.requests||0,Xa.value.tokens=e.tokens||0,Xa.value.cost=e.cost||0)}Fl()}function Dl(){Fa(S.channelType)}function Ul(e){var a,l;null==(l=null==(a=null==e?void 0:e.currentTarget)?void 0:a.blur)||l.call(a)}function Jl(e){window.dispatchEvent(new CustomEvent("open-skills-drawer",{detail:{platform:S.channelType}})),Ul(e)}function Vl(e){window.dispatchEvent(new CustomEvent("open-commands-drawer",{detail:{platform:S.channelType}})),Ul(e)}function Rl(e){if(!1===Ra.value.supportsAgents)return q.info(`${Ka.value} 的 Agent 能力通过插件/扩展提供`),void Ul(e);window.dispatchEvent(new CustomEvent("open-agents-drawer",{detail:{platform:S.channelType}})),Ul(e)}return c(async()=>{await Va().then(()=>Al()),async function(){var e,a;try{if(Ja.value&&Ja.value.uiConfig)ul.value=!1!==(null==(e=Ja.value.uiConfig.panelVisibility)?void 0:e.showLogs);else{const e=await $();e.success&&e.config&&(ul.value=!1!==(null==(a=e.config.panelVisibility)?void 0:a.showLogs))}}catch(l){}}(),async function(){var e,a;try{let l=!1;if(Ja.value&&Ja.value.uiConfig)l=(null==(e=Ja.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)}ol.value=l,tl(l)}catch(l){}}(),window.addEventListener("panel-visibility-change",rl),Ya.value={...Xa.value},Tl=!0,kl=setInterval(()=>{dl.value=Date.now()},1e3)}),t(()=>{Tl=!1,fl&&clearInterval(fl),kl&&clearInterval(kl),Cl&&clearTimeout(Cl),window.removeEventListener("panel-visibility-change",rl),Object.values(el).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":Ra.value.custom}]]),style:k(Ra.value.custom?{"--channel-accent":Za.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(Ba.value)))]),_:1})]),r("h2",ke,g(Ka.value),1),!1!==Ra.value.supportsManagedConfig?(u(),i("div",Te,[p(y(te),{trigger:"hover"},{trigger:h(()=>[p(y(ce),{text:"",class:"config-shortcut-button",onClick:Jl,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:Vl,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!==Ra.value.supportsAgents?(u(),v(y(te),{key:0,trigger:"hover"},{trigger:h(()=>[p(y(ce),{text:"",class:"config-shortcut-button",onClick:Rl,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:il,title:ol.value?"解锁此列":"锁定此列"},{icon:h(()=>[p(y(se),{size:18},{default:h(()=>[ol.value?(u(),v(y(K),{key:0})):(u(),v(y(B),{key:1}))]),_:1})]),_:1},8,["title"])],6),ol.value?d("",!0):(u(),i("div",Ce,[!1!==Ra.value.supportsProxy?(u(),i("div",be,[r("div",we,[p(y(se),{size:16},{default:h(()=>[p(y(Z))]),_:1}),l[5]||(l[5]=r("h3",{class:"card-title"},"代理控制",-1)),Ga.value.running&&vl.value?(u(),i("span",xe,g(vl.value),1)):d("",!0),p(y(oe),{value:Ga.value.running,"onUpdate:value":[l[0]||(l[0]=e=>Ga.value.running=e),Pl],loading:Ga.value.loading,size:"small",style:{"margin-left":"auto"}},null,8,["value","loading"])]),r("div",$e,[r("div",_e,[r("div",Se,[r("div",{class:T(["status-dot",{active:Ga.value.running}])},null,2),p(y(ie),{type:Ga.value.running?"success":"default",style:{"font-size":"12px"}},{default:h(()=>[f(g(Ga.value.running?"运行中":"已停止"),1)]),_:1},8,["type"]),r("span",ze,"端口: "+g(Ga.value.port),1)]),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(xl.value),1)]),_:1})]),default:h(()=>[r("div",Pe,[r("div",je,[l[7]||(l[7]=r("span",null,"渠道快捷管理",-1)),p(y(ie),{depth:"3",style:{"font-size":"11px"}},{default:h(()=>[...l[6]||(l[6]=[f("点击开关切换状态",-1)])]),_:1})]),0===bl.value.length?(u(),i("div",Le,[p(y(ie),{depth:"3"},{default:h(()=>[...l[8]||(l[8]=[f("暂无配置渠道",-1)])]),_:1})])):(u(),i("div",Me,[(u(!0),i(C,null,b(bl.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",Oe,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[9]||(l[9]=[f(" 冻结 ",-1)])]),_:1})):d("",!0),p(y(oe),{size:"small",value:!1!==e.enabled,"onUpdate:value":a=>Nl(e,a),loading:Ol(e.id),disabled:Ol(e.id),style:{"margin-left":"auto"}},null,8,["value","onUpdate:value","loading","disabled"])]),Ol(e.id)?(u(),i("div",Ee," 正在切换渠道状态... ")):d("",!0),r("div",Ne,[r("span",Fe,[l[10]||(l[10]=r("span",{class:"metric-label"},"请求",-1)),r("span",Ae,g(_l(e.id).requests),1)]),r("span",De,[l[11]||(l[11]=r("span",{class:"metric-label"},"Tokens",-1)),r("span",Ue,g((n=_l(e.id).tokens,n>=1e6?(n/1e6).toFixed(1)+"M":n>=1e3?(n/1e3).toFixed(1)+"K":n.toString())),1)]),r("span",Je,[l[12]||(l[12]=r("span",{class:"metric-label"},"权重",-1)),r("span",Ve,g(e.weight||1),1)]),r("span",Re,[l[13]||(l[13]=r("span",{class:"metric-label"},"并发",-1)),r("span",{class:T(["metric-value",{active:wl(e.id)>0}])},g(wl(e.id))+g(e.maxConcurrency?`/${e.maxConcurrency}`:""),3)])])],2)}),128))]))])]),_:1})])])])):d("",!0),r("div",Ke,[r("div",Be,[p(y(se),{size:14},{default:h(()=>[p(y(G))]),_:1}),l[14]||(l[14]=r("h3",{class:"card-title"},"快速访问",-1))]),r("div",Ze,[r("div",Ge,[r("div",{class:T(["access-card access-card-projects",{clickable:!1!==Ra.value.supportsProjects,disabled:!1===Ra.value.supportsProjects}]),onClick:jl},[r("div",He,[p(y(se),{size:16},{default:h(()=>[p(y(H))]),_:1})]),r("div",We,[l[15]||(l[15]=r("span",{class:"access-label"},"项目",-1)),r("span",Xe,g(Wa.value.projects),1)])],2),r("div",{class:T(["access-card access-card-sessions",{clickable:!1!==Ra.value.supportsSessions,disabled:!1===Ra.value.supportsSessions}]),onClick:Ml},[r("div",Ye,[p(y(se),{size:16},{default:h(()=>[p(y(W))]),_:1})]),r("div",Qe,[l[16]||(l[16]=r("span",{class:"access-label"},"最新对话",-1)),r("span",ea,g(Wa.value.sessions),1)])],2),r("div",{class:T(["access-card access-card-goto",{clickable:!1!==Ra.value.supportsProjects,disabled:!1===Ra.value.supportsProjects}]),onClick:Ll},[r("div",aa,[p(y(se),{size:16},{default:h(()=>[p(y(X))]),_:1})]),r("div",la,[l[17]||(l[17]=r("span",{class:"access-label"},"前往",-1)),r("span",na,g(Ha.value),1)])],2)])])]),r("div",{class:T(["card stats-card",`stats-card-${e.channelType}`])},[r("div",sa,[p(y(se),{size:14},{default:h(()=>[p(y(Y))]),_:1}),l[18]||(l[18]=r("h3",{class:"card-title"},"今日数据",-1))]),r("div",ca,[r("div",ta,[r("div",oa,[l[20]||(l[20]=r("div",{class:"stat-icon-dot requests"},null,-1)),r("div",ia,[l[19]||(l[19]=r("span",{class:"stat-label"},"请求",-1)),r("span",{class:T(["stat-value",{animating:al.value.requests}])},g(Ya.value.requests),3)])]),r("div",ua,[l[22]||(l[22]=r("div",{class:"stat-icon-dot tokens"},null,-1)),r("div",ra,[l[21]||(l[21]=r("span",{class:"stat-label"},"总 Tokens",-1)),r("span",{class:T(["stat-value",{animating:al.value.tokens}])},g((c=Ya.value.tokens,c>=1e6?(c/1e6).toFixed(1)+"M":c>=1e3?(c/1e3).toFixed(1)+"K":c.toString())),3)])]),r("div",da,[l[24]||(l[24]=r("div",{class:"stat-icon-dot cost"},null,-1)),r("div",va,[l[23]||(l[23]=r("span",{class:"stat-label"},"成本 / USD",-1)),r("span",{class:T(["stat-value",{animating:al.value.cost}])},g((s=Ya.value.cost,!s||Number.isNaN(s)?"$0":"$"+Number(s).toFixed(3))),3)])])])])],2),Object.keys(ll.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),ul.value?(u(),i("div",pa,[r("div",ha,[p(y(se),{size:14},{default:h(()=>[p(y(Q))]),_:1}),l[25]||(l[25]=r("h3",{class:"card-title"},"实时日志",-1)),p(y(ce),{text:"",size:"tiny",onClick:w(Dl,["stop"]),style:{"margin-left":"auto"},title:"清空日志"},{icon:h(()=>[p(y(se),{size:14},{default:h(()=>[p(y(ee))]),_:1})]),_:1})]),r("div",ya,[r("div",ma,[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:pl},[0===ml.value.length?(u(),i("div",ga,[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[26]||(l[26]=[f("暂无实时日志",-1)])]),_:1}),p(y(ie),{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,b(ml.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",ka,[p(y(se),{size:12,color:"#18a058"},{default:h(()=>[p(y(ae))]),_:1}),r("span",Ta,g(a.message),1),r("span",Ca,g(a.time),1)])):"error"===a.status?(u(),i("div",ba,[p(y(se),{size:12,color:"#d03050"},{default:h(()=>[p(y(le))]),_:1}),r("span",wa,g(a.channel)+": "+g(a.error||a.message||"请求失败"),1),r("span",xa,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(Sl(a,"input")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(Sl(a,"output")),3),"claude"===e.channelType?(u(),i(C,{key:0},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(Sl(a,"cacheCreation")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(Sl(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(Sl(a,"reasoning")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(Sl(a,"cached")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(Sl(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(Sl(a,"cached")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(Sl(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(Sl(a,"reasoning")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(Sl(a,"cached")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(Sl(a,"total")),3)],64)):d("",!0),r("div",{class:T(["log-col col-time",`col-time-${e.channelType}`])},g(a.time),3)],64))],10,fa))),128))],512)])])])):d("",!0)])),ol.value?(u(),i("div",{key:1,class:T(["locked-overlay",`locked-${e.channelType}`])},[r("div",$a,[r("div",_a,[p(y(se),{size:48},{default:h(()=>[p(y(K))]),_:1})]),l[29]||(l[29]=r("h3",{class:"locked-title"},"该渠道已锁定",-1)),p(y(ie),{depth:"3",class:"locked-hint"},{default:h(()=>[...l[28]||(l[28]=[f(" 点击上方按钮解锁以查看内容 ",-1)])]),_:1})])],2)):d("",!0),!1!==Ra.value.supportsSessions?(u(),v(I,{key:2,visible:sl.value,"onUpdate:visible":l[1]||(l[1]=e=>sl.value=e),channel:e.channelType},null,8,["visible","channel"])):d("",!0)]);var s,c}}},[["__scopeId","data-v-edbe1f8c"]]),qa={class:"dashboard-container"},Pa="dashboardChannelOrder",ja=P({__name:"Home",setup(l){const{uiConfig:n,updateConfig:s,loadUIConfig:o}=ye();function r(e){try{localStorage.setItem(Pa,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(Pa);if(e){const a=JSON.parse(e);return D(a,n.value.customCliPlatforms)}}catch(e){}return q}().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(za,{"channel-type":e.type,key:e.type},null,8,["channel-type"]))]),_:1},8,["modelValue"])]))}},[["__scopeId","data-v-276ca51b"]]);export{ja as default};
@@ -1 +0,0 @@
1
- .channel-column[data-v-edbe1f8c]{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-edbe1f8c]{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-edbe1f8c]{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-edbe1f8c]:hover{color:var(--text-secondary);background:var(--bg-tertiary)}.drag-handle[data-v-edbe1f8c]:active{cursor:grabbing}.channel-header[data-v-edbe1f8c]:after{content:"";position:absolute;bottom:0;left:18px;right:18px;height:2px;border-radius:1px}.channel-header.claude[data-v-edbe1f8c]{background:linear-gradient(135deg,rgba(24,160,88,.1) 0%,var(--bg-secondary) 100%)}.channel-header.claude[data-v-edbe1f8c]:after{background:linear-gradient(90deg,#18a058,#18a0584d)}.channel-header.codex[data-v-edbe1f8c]{background:linear-gradient(135deg,rgba(59,130,246,.1) 0%,var(--bg-secondary) 100%)}.channel-header.codex[data-v-edbe1f8c]:after{background:linear-gradient(90deg,#3b82f6,#3b82f64d)}.channel-header.gemini[data-v-edbe1f8c]{background:linear-gradient(135deg,rgba(168,85,247,.1) 0%,var(--bg-secondary) 100%)}.channel-header.gemini[data-v-edbe1f8c]:after{background:linear-gradient(90deg,#a855f7,#a855f74d)}.channel-header.opencode[data-v-edbe1f8c]{background:linear-gradient(135deg,rgba(234,88,12,.1) 0%,var(--bg-secondary) 100%)}.channel-header.opencode[data-v-edbe1f8c]:after{background:linear-gradient(90deg,#ea580c,#ea580c4d)}.channel-header.omp[data-v-edbe1f8c]{background:linear-gradient(135deg,rgba(15,159,154,.1) 0%,var(--bg-secondary) 100%)}.channel-header.omp[data-v-edbe1f8c]:after{background:linear-gradient(90deg,#0f9f9a,#0f9f9a4d)}.channel-header.custom-cli[data-v-edbe1f8c]{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-edbe1f8c]:after{background:linear-gradient(90deg,var(--channel-accent, #64748b),color-mix(in srgb,var(--channel-accent, #64748b) 32%,transparent))}.header-icon[data-v-edbe1f8c]{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-edbe1f8c]{background:linear-gradient(135deg,#18a058,#15803d);color:#fff}.channel-header.codex .header-icon[data-v-edbe1f8c]{background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff}.channel-header.gemini .header-icon[data-v-edbe1f8c]{background:linear-gradient(135deg,#a855f7,#9333ea);color:#fff}.channel-header.opencode .header-icon[data-v-edbe1f8c]{background:linear-gradient(135deg,#ea580c,#c2410c);color:#fff}.channel-header.omp .header-icon[data-v-edbe1f8c]{background:linear-gradient(135deg,#0f9f9a,#0f766e);color:#fff}.channel-header.custom-cli .header-icon[data-v-edbe1f8c]{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-edbe1f8c]{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-edbe1f8c]{flex:1;min-height:0;overflow:hidden;padding:10px;display:flex;flex-direction:column;gap:6px}.card[data-v-edbe1f8c]{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-edbe1f8c]: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-edbe1f8c]:hover{box-shadow:0 18px 38px #0f171d1a;border-color:var(--border-secondary)}.card[data-v-edbe1f8c]:hover:before{opacity:1}.card.clickable[data-v-edbe1f8c]{cursor:pointer}.card.clickable[data-v-edbe1f8c]:hover{border-color:#18a058;transform:translateY(-2px);box-shadow:0 8px 24px #18a0582e}.card.clickable[data-v-edbe1f8c]: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-edbe1f8c]:hover:after{opacity:1}.card-header[data-v-edbe1f8c]{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-edbe1f8c]{padding:8px 12px}.card-header .n-icon[data-v-edbe1f8c]{color:var(--text-tertiary);transition:color .2s ease}.card:hover .card-header .n-icon[data-v-edbe1f8c]{color:var(--text-secondary)}.card-title[data-v-edbe1f8c]{font-size:11px;font-weight:700;margin:0;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.8px}.runtime-badge[data-v-edbe1f8c]{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-edbe1f8c 2s ease-in-out infinite}@keyframes pulse-runtime-edbe1f8c{0%,to{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(.98)}}.card-body[data-v-edbe1f8c]{padding:8px 10px;background:transparent}.card-body.compact[data-v-edbe1f8c]{padding:7px 10px}.proxy-control[data-v-edbe1f8c]{display:flex;justify-content:space-between;align-items:center;gap:16px}.proxy-info[data-v-edbe1f8c]{display:flex;flex-direction:column;gap:4px}.proxy-info-row[data-v-edbe1f8c]{display:flex;align-items:center;justify-content:space-between}.proxy-status[data-v-edbe1f8c]{display:flex;align-items:center;gap:6px}.proxy-port[data-v-edbe1f8c]{font-size:11px;color:var(--text-secondary);margin-left:6px}.channel-selector[data-v-edbe1f8c]{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-edbe1f8c]:hover{background:var(--hover-bg);border-color:var(--border-secondary);color:var(--text-primary)}.channel-selector[data-v-edbe1f8c]:disabled{opacity:.5;cursor:not-allowed}.channel-name[data-v-edbe1f8c]{font-size:11px;font-weight:500;max-width:90px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-dot[data-v-edbe1f8c]{width:8px;height:8px;border-radius:50%;background:var(--border-secondary);transition:all .3s ease}.status-dot.active[data-v-edbe1f8c]{background:#18a058;box-shadow:0 0 8px #18a05880}.quick-stats[data-v-edbe1f8c]{display:flex;gap:16px;padding:4px 0}.stat-item[data-v-edbe1f8c]{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;padding:4px 0}.stat-divider[data-v-edbe1f8c]{width:1px;background:linear-gradient(180deg,transparent 0%,var(--border-primary) 50%,transparent 100%)}.quick-access-list[data-v-edbe1f8c]{display:grid;grid-template-columns:repeat(3,1fr);gap:4px}.access-card[data-v-edbe1f8c]{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-edbe1f8c]: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-edbe1f8c]{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-edbe1f8c]{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0;overflow:hidden}.access-card-projects .access-icon[data-v-edbe1f8c]{background:linear-gradient(135deg,#6366f126,#8b5cf626);color:#6366f1}.access-card-projects[data-v-edbe1f8c]:before{background:linear-gradient(135deg,#6366f114,#8b5cf614)}.access-card-projects:hover .access-icon[data-v-edbe1f8c]{background:linear-gradient(135deg,#6366f140,#8b5cf640);transform:translateY(-1px)}.access-card-sessions .access-icon[data-v-edbe1f8c]{background:linear-gradient(135deg,#10b98126,#05966926);color:#10b981}.access-card-sessions[data-v-edbe1f8c]:before{background:linear-gradient(135deg,#10b98114,#05966914)}.access-card-sessions:hover .access-icon[data-v-edbe1f8c]{background:linear-gradient(135deg,#10b98140,#05966940);transform:translateY(-1px)}.access-card-goto .access-icon[data-v-edbe1f8c]{background:linear-gradient(135deg,#f59e0b26,#fb923c26);color:#f59e0b}.access-card-goto[data-v-edbe1f8c]:before{background:linear-gradient(135deg,#f59e0b14,#fb923c14)}.access-card-goto:hover .access-icon[data-v-edbe1f8c]{background:linear-gradient(135deg,#f59e0b40,#fb923c40);transform:translate(2px)}.access-card.clickable[data-v-edbe1f8c]:hover{transform:translateY(-2px);box-shadow:0 8px 20px #0000001a;border-color:var(--border-secondary)}.access-card.clickable[data-v-edbe1f8c]:hover:before{opacity:1}.access-card.disabled[data-v-edbe1f8c]{cursor:default;opacity:.62}.access-card.disabled[data-v-edbe1f8c]:hover{transform:none;box-shadow:none;border-color:var(--border-primary)}.access-card.clickable[data-v-edbe1f8c]:active{transform:translateY(0)}.access-label[data-v-edbe1f8c]{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-edbe1f8c]{display:block;font-size:13px;font-weight:800;color:var(--text-primary);line-height:1;white-space:nowrap}.access-goto[data-v-edbe1f8c]{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-edbe1f8c]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}.stats-inline.stats-3col[data-v-edbe1f8c]{grid-template-columns:repeat(3,1fr)}.stat-inline-item[data-v-edbe1f8c]{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-edbe1f8c]:hover{border-color:var(--border-secondary);background:var(--hover-bg)}.stat-icon-dot[data-v-edbe1f8c]{width:8px;height:8px;border-radius:50%;flex-shrink:0}.stat-icon-dot.requests[data-v-edbe1f8c]{background:#3b82f6;box-shadow:0 0 6px #3b82f680}.stat-icon-dot.tokens[data-v-edbe1f8c]{background:#18a058;box-shadow:0 0 6px #18a05880}.stat-icon-dot.cost[data-v-edbe1f8c]{background:#f59e0b;box-shadow:0 0 6px #f59e0b80}.stat-info[data-v-edbe1f8c]{display:flex;flex-direction:column;gap:1px;min-width:0}.stat-label[data-v-edbe1f8c]{font-size:10px;color:var(--text-tertiary);font-weight:500;text-transform:uppercase;letter-spacing:.2px}.stat-value[data-v-edbe1f8c]{font-size:16px;font-weight:700;color:var(--text-primary);line-height:1.2;transition:all .3s ease}.stat-value.animating[data-v-edbe1f8c]{animation:numberChange-edbe1f8c .6s ease}@keyframes numberChange-edbe1f8c{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-edbe1f8c],.chart-card[data-v-edbe1f8c]{border-left:2px solid transparent}.stats-card-claude[data-v-edbe1f8c],.chart-card[data-v-edbe1f8c]:has(+.stats-card-claude),.card[data-v-edbe1f8c]:has(.panel-card):nth-child(4){border-left-color:#18a058}.chart-card.chart-card-claude[data-v-edbe1f8c]{border-left-color:#18a058}.stats-card-codex[data-v-edbe1f8c],.chart-card[data-v-edbe1f8c]:has(+.stats-card-codex),.card[data-v-edbe1f8c]:has(.panel-card):nth-child(4){border-left-color:#3b82f6}.chart-card.chart-card-codex[data-v-edbe1f8c]{border-left-color:#3b82f6}.stats-card-gemini[data-v-edbe1f8c],.chart-card[data-v-edbe1f8c]:has(+.stats-card-gemini),.card[data-v-edbe1f8c]:has(.panel-card):nth-child(4){border-left-color:#a855f7}.chart-card.chart-card-gemini[data-v-edbe1f8c]{border-left-color:#a855f7}.stats-card-opencode[data-v-edbe1f8c],.chart-card[data-v-edbe1f8c]:has(+.stats-card-opencode),.card[data-v-edbe1f8c]:has(.panel-card):nth-child(4){border-left-color:#ea580c}.chart-card.chart-card-opencode[data-v-edbe1f8c]{border-left-color:#ea580c}.stats-card-omp[data-v-edbe1f8c],.chart-card[data-v-edbe1f8c]:has(+.stats-card-omp),.card[data-v-edbe1f8c]:has(.panel-card):nth-child(4){border-left-color:#0f9f9a}.chart-card.chart-card-omp[data-v-edbe1f8c]{border-left-color:#0f9f9a}.chart-card[data-v-edbe1f8c]{padding:0;overflow:hidden}.chart-card[data-v-edbe1f8c] .panel-card{border:none;border-radius:0;box-shadow:none;background:transparent}.stat-requests .stat-value[data-v-edbe1f8c]{color:#3b82f6}.stat-input .stat-value[data-v-edbe1f8c]{color:#18a058}.stat-output .stat-value[data-v-edbe1f8c]{color:#f59e0b}.token-label[data-v-edbe1f8c]{display:flex;align-items:center;gap:8px}.token-dot[data-v-edbe1f8c]{width:8px;height:8px;border-radius:50%}.logs-card[data-v-edbe1f8c]{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-edbe1f8c]{flex:1;min-height:0;display:flex;flex-direction:column;padding:0}.logs-card .card-header[data-v-edbe1f8c]{background:linear-gradient(135deg,var(--bg-secondary) 0%,var(--bg-tertiary) 100%)}.logs-table-wrapper[data-v-edbe1f8c]{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;background:var(--bg-primary)}.logs-table-header[data-v-edbe1f8c]{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-edbe1f8c]{color:#18a058b3;font-weight:600}.logs-header-codex .log-col[data-v-edbe1f8c]{color:#3b82f6b3;font-weight:600}.logs-header-gemini .log-col[data-v-edbe1f8c]{color:#a855f7b3;font-weight:600}.logs-header-opencode .log-col[data-v-edbe1f8c]{color:#ea580cb3;font-weight:600}.logs-header-omp .log-col[data-v-edbe1f8c]{color:#0f9f9ab3;font-weight:600}[data-theme=dark] .logs-header-claude .log-col[data-v-edbe1f8c]{color:#34d399a6}[data-theme=dark] .logs-header-codex .log-col[data-v-edbe1f8c]{color:#60a5faa6}[data-theme=dark] .logs-header-gemini .log-col[data-v-edbe1f8c]{color:#c084fca6}[data-theme=dark] .logs-header-opencode .log-col[data-v-edbe1f8c]{color:#fb923ca6}[data-theme=dark] .logs-header-omp .log-col[data-v-edbe1f8c]{color:#2dd4bfa6}[data-theme=dark] .channel-column[data-v-edbe1f8c]{background:linear-gradient(180deg,#121b22fa,#091016fa);border-color:#364c56d1;box-shadow:0 18px 42px #00000047}[data-theme=dark] .channel-header[data-v-edbe1f8c]{background:linear-gradient(180deg,#16222ae6,#0d161dd1)}[data-theme=dark] .card[data-v-edbe1f8c],[data-theme=dark] .access-card[data-v-edbe1f8c],[data-theme=dark] .stat-inline-item[data-v-edbe1f8c]{background:linear-gradient(180deg,#121c23f0,#0c151cf5);border-color:#364c56c7}[data-theme=dark] .card[data-v-edbe1f8c]:hover,[data-theme=dark] .access-card.clickable[data-v-edbe1f8c]:hover,[data-theme=dark] .stat-inline-item[data-v-edbe1f8c]:hover{border-color:#4c6570eb;box-shadow:0 12px 28px #0000003d}[data-theme=dark] .card-header[data-v-edbe1f8c]{background:linear-gradient(180deg,#16222aeb,#0e181ff5);border-bottom-color:#364c56b8}[data-theme=dark] .logs-table-wrapper[data-v-edbe1f8c]{background:#091016f5}[data-theme=dark] .logs-table-header[data-v-edbe1f8c]{background:linear-gradient(180deg,#121d25f5,#0b141bfa);border-bottom-color:#364c56c2}.logs-container[data-v-edbe1f8c]{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden}.logs-container[data-v-edbe1f8c]::-webkit-scrollbar{width:4px}.logs-container[data-v-edbe1f8c]::-webkit-scrollbar-thumb{background:#18a0584d;border-radius:2px}.logs-container[data-v-edbe1f8c]::-webkit-scrollbar-thumb:hover{background:#18a05880}.empty-logs[data-v-edbe1f8c]{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-edbe1f8c]{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-edbe1f8c]:nth-child(2n){background:var(--bg-secondary)}[data-theme=dark] .log-row[data-v-edbe1f8c]{background:#091016f5;border-bottom-color:#364c5694}[data-theme=dark] .log-row[data-v-edbe1f8c]:nth-child(2n){background:#0d161df5}.log-row[data-v-edbe1f8c]:hover{background:var(--hover-bg);transform:translate(2px)}.log-row.new-log[data-v-edbe1f8c]{animation:newLogPulse-edbe1f8c 4.5s cubic-bezier(.25,.46,.45,.94) forwards;border-left:3px solid #18a058}@keyframes newLogPulse-edbe1f8c{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-edbe1f8c]{animation:newLogPulseDark-edbe1f8c 4.5s cubic-bezier(.25,.46,.45,.94) forwards}@keyframes newLogPulseDark-edbe1f8c{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-edbe1f8c]{border-left:3px solid #18a058}.log-row.action-row[data-v-edbe1f8c]{background:linear-gradient(90deg,#18a0581f,#18a0580a);border-left:3px solid #18a058;padding-left:8px}.log-row.error-row[data-v-edbe1f8c]{background:linear-gradient(90deg,#d0305024,#d030500a);border-left:3px solid #d03050;padding-left:8px}.log-row.action-row[data-v-edbe1f8c]:hover{background:linear-gradient(90deg,#18a0582e,#18a05814)}.log-row.error-row[data-v-edbe1f8c]:hover{background:linear-gradient(90deg,#d0305033,#d0305014)}.action-content[data-v-edbe1f8c]{display:flex;align-items:center;gap:8px;width:100%}.action-msg[data-v-edbe1f8c]{flex:1;font-size:11px;color:#18a058;font-weight:600;letter-spacing:.2px}.action-msg.error-msg[data-v-edbe1f8c]{color:#d03050}.action-time[data-v-edbe1f8c]{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-edbe1f8c]{background:#d030501f}.log-col[data-v-edbe1f8c]{display:flex;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-channel[data-v-edbe1f8c]{min-width:0}.col-channel .n-tag[data-v-edbe1f8c]{max-width:100%;font-size:11px;font-weight:600;border-radius:4px;padding:3px 10px}.col-token[data-v-edbe1f8c]{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-edbe1f8c]{background:#ffffff0b;color:var(--text-secondary)}.col-time[data-v-edbe1f8c]{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-edbe1f8c]{opacity:1;color:var(--text-secondary)}.col-channel-claude[data-v-edbe1f8c]{flex:2 1 60px;min-width:50px}.col-token-claude[data-v-edbe1f8c]{flex:1 1 40px;min-width:35px}.col-time-claude[data-v-edbe1f8c]{flex:1.5 1 55px;min-width:50px}.col-channel-codex[data-v-edbe1f8c]{flex:2 1 60px;min-width:50px}.col-token-codex[data-v-edbe1f8c]{flex:1 1 40px;min-width:35px}.col-time-codex[data-v-edbe1f8c]{flex:1.5 1 55px;min-width:50px}.col-channel-gemini[data-v-edbe1f8c]{flex:2.5 1 70px;min-width:55px}.col-token-gemini[data-v-edbe1f8c]{flex:1.2 1 45px;min-width:40px}.col-time-gemini[data-v-edbe1f8c]{flex:1.8 1 60px;min-width:55px}.col-channel-opencode[data-v-edbe1f8c]{flex:2.5 1 70px;min-width:55px}.col-token-opencode[data-v-edbe1f8c]{flex:1.2 1 45px;min-width:40px}.col-time-opencode[data-v-edbe1f8c]{flex:1.8 1 60px;min-width:55px}.col-channel-omp[data-v-edbe1f8c]{flex:2.5 1 70px;min-width:55px}.col-token-omp[data-v-edbe1f8c]{flex:1.2 1 45px;min-width:40px}.col-time-omp[data-v-edbe1f8c]{flex:1.8 1 60px;min-width:55px}.claude-extra-area[data-v-edbe1f8c]{display:flex;align-items:center;gap:6px;margin-left:auto}.mcp-count-tag[data-v-edbe1f8c],.skills-count-tag[data-v-edbe1f8c]{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-edbe1f8c]:hover,.skills-count-tag.clickable[data-v-edbe1f8c]:hover{transform:scale(1.03);filter:brightness(1.1)}.mcp-quick-panel[data-v-edbe1f8c],.skills-quick-panel[data-v-edbe1f8c]{padding:2px 0}.mcp-quick-panel .panel-title[data-v-edbe1f8c],.skills-quick-panel .panel-title[data-v-edbe1f8c]{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-edbe1f8c]:first-child,.skills-quick-panel .panel-title span[data-v-edbe1f8c]:first-child{font-size:13px;font-weight:600;color:var(--text-primary)}.no-items[data-v-edbe1f8c]{padding:16px 10px;text-align:center}.mcp-quick-list[data-v-edbe1f8c],.skills-quick-list[data-v-edbe1f8c]{max-height:300px;overflow-y:auto;padding:0 4px 4px}.mcp-quick-item[data-v-edbe1f8c],.skill-quick-item[data-v-edbe1f8c]{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-edbe1f8c]:hover,.skill-quick-item[data-v-edbe1f8c]:hover{background:var(--hover-bg)}.mcp-item-icon[data-v-edbe1f8c],.skill-item-icon[data-v-edbe1f8c]{width:24px;height:24px;border-radius:5px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.mcp-item-icon[data-v-edbe1f8c]{background:linear-gradient(135deg,#3b82f626,#3b82f60d);color:#3b82f6}.skill-item-icon[data-v-edbe1f8c]{background:linear-gradient(135deg,#18a05826,#18a0580d);color:#18a058}.mcp-item-info[data-v-edbe1f8c],.skill-item-info[data-v-edbe1f8c]{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.mcp-item-name[data-v-edbe1f8c],.skill-item-name[data-v-edbe1f8c]{font-size:12px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mcp-item-type[data-v-edbe1f8c]{font-size:10px;color:var(--text-tertiary);text-transform:uppercase}.skill-item-desc[data-v-edbe1f8c]{font-size:10px;color:var(--text-tertiary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mcp-item-status[data-v-edbe1f8c]{flex-shrink:0}.mcp-item-status .status-dot[data-v-edbe1f8c]{width:8px;height:8px;border-radius:50%;background:var(--border-secondary)}.mcp-item-status.online .status-dot[data-v-edbe1f8c]{background:#18a058;box-shadow:0 0 6px #18a05880}.mcp-item-status.error .status-dot[data-v-edbe1f8c]{background:#d03050;box-shadow:0 0 6px #d0305080}.mcp-quick-list[data-v-edbe1f8c]::-webkit-scrollbar,.skills-quick-list[data-v-edbe1f8c]::-webkit-scrollbar{width:4px}.mcp-quick-list[data-v-edbe1f8c]::-webkit-scrollbar-thumb,.skills-quick-list[data-v-edbe1f8c]::-webkit-scrollbar-thumb{background:#00000026;border-radius:2px}[data-theme=dark] .mcp-quick-list[data-v-edbe1f8c]::-webkit-scrollbar-thumb,[data-theme=dark] .skills-quick-list[data-v-edbe1f8c]::-webkit-scrollbar-thumb{background:#ffffff26}.config-shortcut-button[data-v-edbe1f8c]{--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-edbe1f8c]{color:var(--asset-shortcut-text)!important;transition:transform .18s ease}.config-shortcut-button[data-v-edbe1f8c] .n-button__content,.config-shortcut-button[data-v-edbe1f8c] .n-button__icon{color:var(--asset-shortcut-text)!important}.config-shortcut-button[data-v-edbe1f8c]:hover,.config-shortcut-button[data-v-edbe1f8c]:focus,.config-shortcut-button[data-v-edbe1f8c]: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-edbe1f8c],.config-shortcut-button:focus .n-icon[data-v-edbe1f8c],.config-shortcut-button:focus-visible .n-icon[data-v-edbe1f8c]{color:var(--asset-shortcut-text)!important;transform:scale(1.1)}.config-shortcut-button[data-v-edbe1f8c]: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-edbe1f8c]{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-edbe1f8c]{color:var(--text-color-3);transition:all .25s ease}.lock-button[data-v-edbe1f8c]: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-edbe1f8c]{color:var(--text-color-1);transform:scale(1.1)}.lock-button[data-v-edbe1f8c]:active{transform:translateY(0);box-shadow:0 2px 4px #0000000d}.locked-overlay[data-v-edbe1f8c]{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-edbe1f8c]: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-edbe1f8c]{background:linear-gradient(135deg,rgba(24,160,88,.03) 0%,var(--bg-secondary) 50%,rgba(24,160,88,.02) 100%)}.locked-claude[data-v-edbe1f8c]:before{background:radial-gradient(circle,rgba(24,160,88,.15) 0%,transparent 70%)}.locked-codex[data-v-edbe1f8c]{background:linear-gradient(135deg,rgba(59,130,246,.03) 0%,var(--bg-secondary) 50%,rgba(59,130,246,.02) 100%)}.locked-codex[data-v-edbe1f8c]:before{background:radial-gradient(circle,rgba(59,130,246,.15) 0%,transparent 70%)}.locked-gemini[data-v-edbe1f8c]{background:linear-gradient(135deg,rgba(168,85,247,.03) 0%,var(--bg-secondary) 50%,rgba(168,85,247,.02) 100%)}.locked-gemini[data-v-edbe1f8c]:before{background:radial-gradient(circle,rgba(168,85,247,.15) 0%,transparent 70%)}.locked-opencode[data-v-edbe1f8c]{background:linear-gradient(135deg,rgba(234,88,12,.03) 0%,var(--bg-secondary) 50%,rgba(234,88,12,.02) 100%)}.locked-opencode[data-v-edbe1f8c]:before{background:radial-gradient(circle,rgba(234,88,12,.15) 0%,transparent 70%)}.locked-omp[data-v-edbe1f8c]{background:linear-gradient(135deg,rgba(15,159,154,.03) 0%,var(--bg-secondary) 50%,rgba(15,159,154,.02) 100%)}.locked-omp[data-v-edbe1f8c]:before{background:radial-gradient(circle,rgba(15,159,154,.15) 0%,transparent 70%)}.locked-content[data-v-edbe1f8c]{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-edbe1f8c]{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-edbe1f8c 3s ease-in-out infinite}@keyframes lock-float-edbe1f8c{0%,to{transform:translateY(0)}50%{transform:translateY(-6px)}}.lock-icon[data-v-edbe1f8c]: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-edbe1f8c]{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-edbe1f8c]:before{background:radial-gradient(circle,rgba(24,160,88,.3) 0%,transparent 60%)}.locked-claude .lock-icon .n-icon[data-v-edbe1f8c]{color:#18a058;filter:drop-shadow(0 2px 4px rgba(24,160,88,.3))}.locked-codex .lock-icon[data-v-edbe1f8c]{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-edbe1f8c]:before{background:radial-gradient(circle,rgba(59,130,246,.3) 0%,transparent 60%)}.locked-codex .lock-icon .n-icon[data-v-edbe1f8c]{color:#3b82f6;filter:drop-shadow(0 2px 4px rgba(59,130,246,.3))}.locked-gemini .lock-icon[data-v-edbe1f8c]{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-edbe1f8c]:before{background:radial-gradient(circle,rgba(168,85,247,.3) 0%,transparent 60%)}.locked-gemini .lock-icon .n-icon[data-v-edbe1f8c]{color:#a855f7;filter:drop-shadow(0 2px 4px rgba(168,85,247,.3))}.locked-opencode .lock-icon[data-v-edbe1f8c]{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-edbe1f8c]:before{background:radial-gradient(circle,rgba(234,88,12,.3) 0%,transparent 60%)}.locked-opencode .lock-icon .n-icon[data-v-edbe1f8c]{color:#ea580c;filter:drop-shadow(0 2px 4px rgba(234,88,12,.3))}.locked-omp .lock-icon[data-v-edbe1f8c]{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-edbe1f8c]:before{background:radial-gradient(circle,rgba(15,159,154,.3) 0%,transparent 60%)}.locked-omp .lock-icon .n-icon[data-v-edbe1f8c]{color:#0f9f9a;filter:drop-shadow(0 2px 4px rgba(15,159,154,.3))}.lock-icon .n-icon[data-v-edbe1f8c]{opacity:.85;position:relative;z-index:1}.locked-title[data-v-edbe1f8c]{font-size:17px;font-weight:600;color:var(--text-color-1);margin:0;letter-spacing:.3px}.locked-hint[data-v-edbe1f8c]{font-size:13px;color:var(--text-color-3);max-width:220px;line-height:1.7;opacity:.9}.channel-status[data-v-edbe1f8c]{cursor:pointer;padding:4px 8px!important;border-radius:4px;transition:all .2s ease}.channel-status[data-v-edbe1f8c]:hover{background:var(--hover-bg)}.channel-quick-panel[data-v-edbe1f8c]{padding:4px 0}.panel-title[data-v-edbe1f8c]{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-edbe1f8c]:first-child{font-size:13px;font-weight:600;color:var(--text-primary)}.no-channels[data-v-edbe1f8c]{padding:24px 12px;text-align:center}.channel-quick-list[data-v-edbe1f8c]{max-height:360px;overflow-y:auto}.channel-quick-item[data-v-edbe1f8c]{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-edbe1f8c]:hover{background:var(--hover-bg)}.channel-quick-item.disabled[data-v-edbe1f8c]{opacity:.6}.channel-quick-info[data-v-edbe1f8c]{display:flex;align-items:center;gap:8px;width:100%}.channel-quick-name[data-v-edbe1f8c]{font-size:13px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.channel-metrics[data-v-edbe1f8c]{display:flex;gap:6px;width:100%}.channel-metrics .metric-item[data-v-edbe1f8c]{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-edbe1f8c]{font-size:10px;color:var(--text-tertiary);font-weight:500}.channel-metrics .metric-value[data-v-edbe1f8c]{font-size:12px;font-weight:700;color:var(--text-primary);font-family:SF Mono,Monaco,monospace}.channel-metrics .metric-value.active[data-v-edbe1f8c]{color:#f59e0b}.channel-switching-tip[data-v-edbe1f8c]{font-size:11px;color:var(--text-tertiary);padding:0 2px}.channel-quick-item.disabled .channel-metrics .metric-value[data-v-edbe1f8c]{color:var(--text-tertiary)}.channel-quick-list[data-v-edbe1f8c]::-webkit-scrollbar{width:4px}.channel-quick-list[data-v-edbe1f8c]::-webkit-scrollbar-thumb{background:#00000026;border-radius:2px}[data-theme=dark] .channel-quick-list[data-v-edbe1f8c]::-webkit-scrollbar-thumb{background:#ffffff26}@media (max-width: 1024px){.channel-column[data-v-edbe1f8c]{border-radius:6px}.card-header[data-v-edbe1f8c]{padding:8px 10px}.card-title[data-v-edbe1f8c]{font-size:13px}.stats-inline[data-v-edbe1f8c]{gap:6px}.stat-inline-item[data-v-edbe1f8c]{padding:8px}.stat-value[data-v-edbe1f8c]{font-size:14px}.stat-label[data-v-edbe1f8c]{font-size:9px}.logs-table-header[data-v-edbe1f8c]{padding:8px 10px;font-size:10px}.log-row[data-v-edbe1f8c]{padding:8px 10px;font-size:11px}}@media (max-width: 768px){.channel-column[data-v-edbe1f8c]{border-radius:6px;min-height:300px;height:auto;max-height:400px}.card-header[data-v-edbe1f8c]{padding:8px;gap:6px}.card-title[data-v-edbe1f8c]{font-size:12px}.stats-inline[data-v-edbe1f8c]{gap:4px}.stat-inline-item[data-v-edbe1f8c]{padding:6px;gap:6px}.stat-icon-dot[data-v-edbe1f8c]{width:6px;height:6px}.stat-value[data-v-edbe1f8c]{font-size:13px}.stat-label[data-v-edbe1f8c]{font-size:8px}.logs-card[data-v-edbe1f8c]{min-height:150px}.logs-table-header[data-v-edbe1f8c]{padding:6px 8px;font-size:9px}.log-row[data-v-edbe1f8c]{padding:6px 8px;font-size:10px;min-height:32px}.col-token[data-v-edbe1f8c]{font-size:10px;padding:2px 4px}.col-time[data-v-edbe1f8c]{font-size:9px}.mcp-count-tag[data-v-edbe1f8c],.skills-count-tag[data-v-edbe1f8c]{font-size:9px;padding:0 6px;height:18px;line-height:18px}.config-shortcut-button[data-v-edbe1f8c]{padding:4px 8px;font-size:10px;gap:4px}.lock-button[data-v-edbe1f8c]{width:26px;height:26px}}@media (max-width: 640px){.channel-column[data-v-edbe1f8c]{min-height:250px;max-height:350px}.card-header[data-v-edbe1f8c]{padding:6px;gap:4px;flex-wrap:wrap}.card-title[data-v-edbe1f8c]{font-size:11px}.stats-card .card-content[data-v-edbe1f8c]{padding:6px}.stats-inline[data-v-edbe1f8c]{gap:3px;flex-wrap:wrap}.stat-inline-item[data-v-edbe1f8c]{padding:5px;gap:4px;min-width:calc(33% - 3px);flex:1 1 auto}.stat-icon-dot[data-v-edbe1f8c]{width:5px;height:5px}.stat-value[data-v-edbe1f8c]{font-size:12px}.stat-label[data-v-edbe1f8c]{font-size:7px}.logs-card[data-v-edbe1f8c]{min-height:120px}.logs-table-header[data-v-edbe1f8c]{padding:5px 6px;font-size:8px;letter-spacing:.3px}.log-row[data-v-edbe1f8c]{padding:5px 6px;font-size:9px;min-height:28px}.col-channel .n-tag[data-v-edbe1f8c]{font-size:9px;padding:2px 6px}.col-token[data-v-edbe1f8c]{font-size:9px;padding:2px 3px;margin:0 1px}.col-time[data-v-edbe1f8c]{font-size:8px}.claude-extra-area[data-v-edbe1f8c]{gap:4px}.mcp-count-tag[data-v-edbe1f8c],.skills-count-tag[data-v-edbe1f8c]{font-size:8px;padding:0 4px;height:16px;line-height:16px}.config-shortcut-button[data-v-edbe1f8c]{padding:3px 6px;font-size:9px;gap:3px}.config-shortcut-button .n-icon[data-v-edbe1f8c]{font-size:12px!important}.lock-button[data-v-edbe1f8c]{width:24px;height:24px;margin-left:4px}.lock-button .n-icon[data-v-edbe1f8c]{font-size:12px!important}.locked-content[data-v-edbe1f8c]{padding:30px 20px;gap:12px}.lock-icon[data-v-edbe1f8c]{width:64px;height:64px}.lock-icon .n-icon[data-v-edbe1f8c]{font-size:28px!important}.lock-title[data-v-edbe1f8c]{font-size:14px}.lock-subtitle[data-v-edbe1f8c]{font-size:10px}.unlock-btn[data-v-edbe1f8c]{padding:8px 16px;font-size:11px}}@media (max-width: 480px){.channel-column[data-v-edbe1f8c]{min-height:220px;max-height:300px}.card-header[data-v-edbe1f8c]{padding:5px}.card-title[data-v-edbe1f8c]{font-size:10px}.stats-inline[data-v-edbe1f8c]{gap:2px}.stat-inline-item[data-v-edbe1f8c]{padding:4px;gap:3px}.stat-value[data-v-edbe1f8c]{font-size:11px}.stat-label[data-v-edbe1f8c]{font-size:6px}.logs-table-header[data-v-edbe1f8c]{padding:4px 5px;font-size:7px}.log-row[data-v-edbe1f8c]{padding:4px 5px;font-size:8px;min-height:24px}.col-token[data-v-edbe1f8c]{font-size:8px}.col-time[data-v-edbe1f8c]{font-size:7px}}.card[data-v-edbe1f8c]:not(.logs-card) .n-collapse{background:transparent}.card[data-v-edbe1f8c]:not(.logs-card) .n-collapse-item{background:transparent}.card[data-v-edbe1f8c] .n-collapse-item__header{padding:12px 16px;background:transparent;transition:all .3s ease}.card[data-v-edbe1f8c] .n-collapse-item__header:hover{background:#00000005}.card[data-v-edbe1f8c] .n-collapse-item__header-main{width:100%}.card[data-v-edbe1f8c]:not(.logs-card) .n-collapse-item__content-wrapper{padding:0 16px 12px}.card[data-v-edbe1f8c]:not(.logs-card) .n-collapse-item__content-inner{padding-top:0}.chart-card[data-v-edbe1f8c]: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}}
@@ -1 +0,0 @@
1
- .project-card[data-v-3a18e66d]{padding:12px 14px;cursor:pointer;transition:all .25s cubic-bezier(.4,0,.2,1);border-radius:8px;border:1px solid var(--border-primary);box-shadow:0 1px 3px #0000000a;background:var(--bg-primary);position:relative;overflow:hidden}.project-card[data-v-3a18e66d]:before{content:"";position:absolute;top:0;left:0;width:3px;height:100%;background:linear-gradient(180deg,#18a058,#18a05866);opacity:0;transition:opacity .25s ease}.project-card[data-v-3a18e66d]:hover{transform:translateY(-3px);box-shadow:0 8px 20px #18a0581f,0 2px 6px #0000000f;border-color:#18a05866}.project-card[data-v-3a18e66d]:hover:before{opacity:1}.card-content[data-v-3a18e66d]{display:flex;flex-direction:column;gap:6px}.header-row[data-v-3a18e66d]{display:flex;align-items:center;gap:8px}.project-name[data-v-3a18e66d]{font-size:14px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;color:var(--text-primary);letter-spacing:-.2px}.delete-btn[data-v-3a18e66d]{opacity:.7;transition:opacity .2s;padding:2px!important}.delete-btn[data-v-3a18e66d]:hover{opacity:1}.project-path[data-v-3a18e66d]{font-size:11px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.3}.stats-row[data-v-3a18e66d]{display:flex;align-items:center;justify-content:space-between;margin-top:4px;padding-top:8px;border-top:1px dashed var(--border-primary)}.stats-row[data-v-3a18e66d] .n-tag{font-size:11px;font-weight:600;padding:0 6px;height:18px;border-radius:4px}.last-used[data-v-3a18e66d]{font-size:11px;font-weight:500}.project-list-container[data-v-a76f510b]{width:100%;height:100%;display:flex;flex-direction:column;box-sizing:border-box}.header[data-v-a76f510b]{flex-shrink:0;padding:24px 24px 20px;background:var(--gradient-bg);border-bottom:1px solid var(--border-primary);display:flex;justify-content:space-between;align-items:flex-start;gap:24px;position:relative}.header[data-v-a76f510b]:after{content:"";position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(24,160,88,.1),transparent)}.header-text[data-v-a76f510b]{flex:1}.header-text[data-v-a76f510b] .n-h2{font-size:26px;font-weight:700;background:linear-gradient(135deg,#1f2937,#374151);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;letter-spacing:-.5px}[data-theme=dark] .header-text[data-v-a76f510b] .n-h2{background:linear-gradient(135deg,#f9fafb,#d1d5db);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.search-input[data-v-a76f510b]{width:320px;flex-shrink:0}.search-input[data-v-a76f510b] .n-input{border-radius:10px;background:var(--bg-primary);border:1px solid var(--border-primary);transition:all .2s ease}.search-input[data-v-a76f510b] .n-input:hover{border-color:var(--border-secondary);box-shadow:var(--shadow-sm)}.search-input[data-v-a76f510b] .n-input:focus-within{border-color:#18a058;box-shadow:0 0 0 3px #18a0581a}.content[data-v-a76f510b]{flex:1;overflow-y:auto;padding:20px 24px 24px;background:var(--gradient-bg)}.loading-container[data-v-a76f510b]{display:flex;justify-content:center;align-items:center;min-height:400px}.projects-grid[data-v-a76f510b]{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px}.ghost[data-v-a76f510b]{opacity:.4}.chosen[data-v-a76f510b]{transform:scale(1.05);box-shadow:0 8px 24px #0003!important;cursor:move!important}.drag[data-v-a76f510b]{opacity:.8;transform:rotate(2deg);box-shadow:0 12px 32px #00000040!important}.search-hint[data-v-a76f510b]{position:fixed;bottom:24px;left:24px;padding:10px 14px;background:#ffffffe6;border:1px solid var(--border-primary);border-radius:8px;box-shadow:0 4px 12px #00000014;z-index:10;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:.8;transition:all .2s ease}[data-theme=dark] .search-hint[data-v-a76f510b]{background:#1e293bf2;border:1px solid rgba(71,85,105,.6);box-shadow:0 4px 16px #0006}.search-hint[data-v-a76f510b]:hover{opacity:1;transform:translateY(-2px);box-shadow:0 6px 16px #0000001f}[data-theme=dark] .search-hint[data-v-a76f510b]:hover{box-shadow:0 6px 20px #00000080}.search-hint kbd[data-v-a76f510b]{display:inline-block;padding:4px 8px;font-family:SF Mono,Monaco,monospace;font-size:12px;line-height:1.4;font-weight:600;color:var(--text-secondary);background:var(--bg-primary);border:1px solid var(--border-secondary);border-radius:4px;box-shadow:0 2px 0 var(--border-primary),0 1px 3px #0000001a}[data-theme=dark] .search-hint kbd[data-v-a76f510b]{background:#33415599;border:1px solid rgba(71,85,105,.8);box-shadow:0 2px #1e293bcc,0 1px 4px #0006;color:#e2e8f0}.search-result-item[data-v-a76f510b]{margin-bottom:16px;padding:12px;border:1px solid var(--border-primary);border-radius:6px;background:var(--bg-elevated)}.search-result-header[data-v-a76f510b]{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.search-result-title[data-v-a76f510b]{display:flex;align-items:center;gap:8px}.search-match[data-v-a76f510b]{display:flex;align-items:flex-start;gap:8px;margin-top:6px;padding:6px;background:var(--bg-secondary);border-radius:4px}.search-match-text[data-v-a76f510b]{flex:1;line-height:1.6}
@@ -1 +0,0 @@
1
- import{r as e,f as a,c as t,o as s,a as l,X as n,s as o,Y as r,N as 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 k,$ as j,a6 as w,R as x,v as b}from"./vue-vendor-B5RqjEjQ.js";import{d as C}from"./vendors-DQA4Hw9v.js";import{_ as $,k as z,l as L,m as N,o as P,p as M,q as D}from"./index-BjdNYwSs.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,q as S,m as A,g as B,x as F,h as G,p as W}from"./naive-ui-CVyvdmg1.js";import"./markdown-BNJfEgCA.js";const X={class:"card-content"},Y={class:"header-row"},Z={class:"project-name"},J={class:"stats-row"},Q=$({__name:"ProjectCard",props:{project:{type:Object,required:!0}},emits:["click","delete"],setup(f,{emit:h}){const y=f,g=h,_=e(!1);function k(){g("click")}function j(){g("delete",y.project)}const w=a(()=>{var e,a;return(null==(e=y.project)?void 0:e.displayName)||(null==(a=y.project)?void 0:a.name)||""}),x=a(()=>{var e,a,t;return(null==(e=y.project)?void 0:e.path)||(null==(a=y.project)?void 0:a.fullPath)||(null==(t=y.project)?void 0:t.name)||""}),b=a(()=>{var e;return(null==(e=y.project)?void 0:e.sessionCount)||0}),C=a(()=>{var e;return null==(e=y.project)?void 0:e.lastUsed}),$=a(()=>{var e;const a=["#18a058","#2080f0","#f0a020","#d03050","#9333ea","#06b6d4"];return a[((null==(e=y.project)?void 0:e.name)||"").split("").reduce((e,a)=>e+a.charCodeAt(0),0)%a.length]});function z(e){if(!e)return"";const a=new Date(e),t=new Date-a;return t<6e4?"刚刚":t<36e5?`${Math.floor(t/6e4)}分钟前`:t<864e5?`${Math.floor(t/36e5)}小时前`:t<6048e5?`${Math.floor(t/864e5)}天前`:a.toLocaleDateString("zh-CN")}return(e,a)=>(s(),t("div",{class:"project-card",onClick:k,onMouseenter:a[0]||(a[0]=e=>_.value=!0),onMouseleave:a[1]||(a[1]=e=>_.value=!1)},[l("div",X,[l("div",Y,[n(i(R),{size:"18",color:$.value},{default:r(()=>[n(i(I))]),_:1},8,["color"]),l("span",Z,c(w.value),1),o(n(i(q),{text:"",type:"error",size:"tiny",class:"delete-btn",onClick:d(j,["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}),l("div",J,[n(i(H),{size:"tiny",bordered:!1,type:"success"},{default:r(()=>[p(c(b.value)+" 会话 ",1)]),_:1}),C.value?(s(),v(i(V),{key:0,depth:"3",class:"last-used"},{default:r(()=>[p(c(z(C.value)),1)]),_:1})):m("",!0)])])],32))}},[["__scopeId","data-v-3a18e66d"]]),ee={class:"project-list-container"},ae={class:"header"},te={class:"header-text"},se={key:0,class:"loading-container"},le={key:3,class:"projects-grid"},ne={class:"search-hint"},oe={style:{"margin-bottom":"16px"}},re={key:0,style:{"max-height":"60vh","overflow-y":"auto"}},ie={class:"search-result-header"},ce={class:"search-result-title"},ue=$({__name:"ProjectList",setup(o){const u=f(),d=h(),$=z(),T=a(()=>d.meta.channel||"claude"),X=e(""),Y=e([]),Z=e(null),J=e(!1),ue=e(""),de=e(null),pe=e(!1),ve=e(null),me=a(()=>{const e=X.value.toLowerCase();return Y.value.filter(a=>{const t=(a.displayName||"").toLowerCase(),s=(a.fullPath||"").toLowerCase();return t.includes(e)||s.includes(e)})});function fe(e){const a=d.meta.channel||"claude";u.push({name:`${a}-sessions`,params:{projectName:e}})}async function he(){const e=Y.value.map(e=>e.name);await $.saveProjectOrder(e)}function ye(e){const a=e.fullPath||e.name,t=e.sessionCount||0;P.warning({title:"删除项目",content:`确定要删除项目 "${a}" 吗?\n\n当前项目包含 ${t} 个会话,删除后所有会话数据将无法恢复!`,positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{try{await $.deleteProject(e.name),N.success("项目已删除")}catch(a){N.error("删除失败: "+a.message)}}})}async function ge(){try{const a="codex"===(e=T.value||"claude")?"codex":"gemini"===e?"gemini":"opencode"===e?"opencode":"omp"===e?"omp":"claude",t=await L(a);if("manual"===(null==t?void 0:t.method))return void N.warning("自动复制失败,已弹出手动复制框");N.success("基础启动命令已复制到剪贴板")}catch(a){N.error("复制失败: "+a.message)}var e}async function _e(){if(ue.value){pe.value=!0;try{const e=await M(ue.value,35,T.value);de.value=e}catch(e){N.error("搜索失败: "+e.message)}finally{pe.value=!1}}}function ke(e,a){if(!a||!e)return e;const t=new RegExp(`(${a})`,"gi");return e.replace(t,'<mark style="background-color: #ffd700; padding: 2px 4px; border-radius: 2px; font-weight: 600;">$1</mark>')}function je(e){(e.metaKey||e.ctrlKey)&&"k"===e.key&&(e.preventDefault(),J.value=!0,b(()=>{var e;null==(e=ve.value)||e.focus()}))}return y(()=>$.projects,e=>{Y.value=[...e]},{immediate:!0}),y(J,e=>{e||(ue.value="",de.value=null)}),y(T,e=>{$.setChannel(e),$.fetchProjects()},{immediate:!0}),g(()=>{document.addEventListener("keydown",je)}),_(()=>{document.removeEventListener("keydown",je)}),(e,a)=>(s(),t("div",ee,[l("div",ae,[l("div",te,[n(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:ge},{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})]),l("div",{class:"content",ref_key:"contentEl",ref:Z},[i($).loading?(s(),t("div",se,[n(i(B),{size:"large"},{description:r(()=>[...a[7]||(a[7]=[p(" 加载项目列表... ",-1)])]),_:1})])):i($).error?(s(),v(i(F),{key:1,type:"error",title:"加载失败",style:{"margin-top":"20px"}},{default:r(()=>[p(c(i($).error),1)]),_:1})):X.value?(s(),t("div",le,[(s(!0),t(k,null,j(me.value,e=>(s(),v(Q,{key:e.name,project:e,onClick:a=>fe(e.name),onDelete:ye},null,8,["project","onClick"]))),128))])):(s(),v(i(C),{key:2,modelValue:Y.value,"onUpdate:modelValue":a[1]||(a[1]=e=>Y.value=e),"item-key":"name",class:"projects-grid","ghost-class":"ghost","chosen-class":"chosen","drag-class":"drag",animation:"200",onEnd:he},{item:r(({element:e})=>[n(Q,{project:e,onClick:a=>fe(e.name),onDelete:ye},null,8,["project","onClick"])]),_:1},8,["modelValue"])),i($).loading||i($).error||0!==i($).projects.length?m("",!0):(s(),v(i(G),{key:4,description:"没有找到项目",style:{"margin-top":"60px"}},{icon:r(()=>[n(i(R),null,{default:r(()=>[n(i(I))]),_:1})]),_:1}))],512),l("div",ne,[n(i(V),{depth:"3",style:{"font-size":"12px"}},{default:r(()=>[...a[8]||(a[8]=[l("kbd",null,"Cmd",-1),p(" / ",-1),l("kbd",null,"Ctrl",-1),p(" + ",-1),l("kbd",null,"K",-1),p(" 全局搜索 ",-1)])]),_:1})]),n(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(()=>[l("div",oe,[n(i(S),{ref_key:"globalSearchInputRef",ref:ve,value:ue.value,"onUpdate:value":a[2]||(a[2]=e=>ue.value=e),placeholder:"搜索所有项目的对话内容...",clearable:"",onKeyup:w(_e,["enter"]),disabled:pe.value},{prefix:r(()=>[n(i(R),null,{default:r(()=>[n(i(K))]),_:1})]),suffix:r(()=>[n(i(q),{text:"",onClick:_e,disabled:!ue.value||pe.value,loading:pe.value},{default:r(()=>[...a[9]||(a[9]=[p(" 搜索 ",-1)])]),_:1},8,["disabled","loading"])]),_:1},8,["value","disabled"])]),de.value?(s(),t("div",re,[n(i(F),{type:"info",style:{"margin-bottom":"16px"}},{default:r(()=>[p(' 关键词 "'+c(de.value.keyword)+'" 共找到 '+c(de.value.totalMatches)+" 处匹配 ",1)]),_:1}),(s(!0),t(k,null,j(de.value.sessions,e=>(s(),t("div",{key:`${e.projectName}-${e.sessionId}`,class:"search-result-item"},[l("div",ie,[l("div",ce,[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[10]||(a[10]=[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)?N.warning("自动复制失败,已弹出手动复制框"):N.success("启动命令已复制到剪贴板"),J.value=!1}catch(t){N.error("复制失败: "+t.message)}}(e.projectName,e.sessionId)},{icon:r(()=>[n(i(R),null,{default:r(()=>[n(i(U))]),_:1})]),default:r(()=>[a[11]||(a[11]=p(" 使用对话 ",-1))]),_:1},8,["onClick"])]),(s(!0),t(k,null,j(e.matches,(e,a)=>(s(),t("div",{key:a,class:"search-match"},[n(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,de.value.keyword)},null,8,["innerHTML"])]))),128))]))),128)),0===de.value.sessions.length?(s(),v(i(G),{key:0,description:"没有找到匹配的内容"})):m("",!0)])):m("",!0)]),_:1},8,["show"])]))}},[["__scopeId","data-v-a76f510b"]]);export{ue as default};
@@ -1 +0,0 @@
1
- .session-list-container[data-v-528553dd]{width:100%;height:100%;display:flex;flex-direction:column;box-sizing:border-box}.header[data-v-528553dd]{flex-shrink:0;padding:24px 24px 16px;background:var(--bg-primary);border-bottom:1px solid var(--border-primary)}.content[data-v-528553dd]{flex:1;overflow-y:auto;overflow-x:hidden;padding:16px 24px 24px}.sessions-list[data-v-528553dd]{position:relative;overflow:hidden}.back-button[data-v-528553dd]{flex-shrink:0;margin-right:12px}.title-bar[data-v-528553dd]{display:flex;align-items:center;gap:16px}.title-section[data-v-528553dd]{flex:1;min-width:0}.title-with-count[data-v-528553dd]{display:flex;align-items:center;gap:8px;margin-bottom:2px;flex-wrap:wrap}.title-section h2[data-v-528553dd]{margin:0;font-size:20px}.session-count[data-v-528553dd]{font-size:14px;color:#666}.total-size-tag[data-v-528553dd]{margin-left:8px}.project-path[data-v-528553dd]{font-size:13px;display:block;color:#666;margin-bottom:2px}.header-actions[data-v-528553dd]{display:flex;align-items:center;gap:12px;margin-left:4px}.search-input[data-v-528553dd]{width:320px;flex-shrink:0}.loading-container[data-v-528553dd]{display:flex;justify-content:center;align-items:center;min-height:400px}.session-item[data-v-528553dd]{display:flex;align-items:center;gap:12px;padding:16px;background:var(--bg-primary);border:1px solid var(--border-primary);border-radius:8px;margin-bottom:8px;transition:all .2s;cursor:pointer}.session-item[data-v-528553dd]:hover{border-color:#18a058;box-shadow:0 2px 8px #18a0581a}.session-item-selection-mode[data-v-528553dd]{cursor:default}.session-item-selected[data-v-528553dd]{border-color:#18a058;box-shadow:0 0 0 2px #18a0581f;background:#18a0580a}.drag-handle[data-v-528553dd]{cursor:move;width:24px;height:24px;padding:4px;opacity:.4;transition:all .2s;flex-shrink:0;display:flex;align-items:center;justify-content:center}.session-item:hover .drag-handle[data-v-528553dd]{opacity:1;background-color:#18a0581a;border-radius:4px}.selection-checkbox[data-v-528553dd]{width:24px;min-width:24px;display:flex;align-items:center;justify-content:center}.session-left[data-v-528553dd]{flex:1;display:flex;align-items:center;gap:16px;min-width:0}.session-icon[data-v-528553dd]{flex-shrink:0}.session-info[data-v-528553dd]{flex:1;min-width:0}.session-header[data-v-528553dd]{display:flex;align-items:center;margin-bottom:6px}.session-title-row[data-v-528553dd]{display:flex;align-items:center;gap:8px}.session-title[data-v-528553dd]{font-size:15px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:1;min-width:0}.session-meta[data-v-528553dd]{display:flex;align-items:center;gap:8px;margin-bottom:6px;font-size:13px}.session-message[data-v-528553dd]{display:block;max-width:600px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}.session-message-empty[data-v-528553dd]{font-style:italic;opacity:.5}.session-right[data-v-528553dd]{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-end;min-width:280px;flex-shrink:0;gap:12px}.session-tags-area[data-v-528553dd]{min-height:24px;display:flex;align-items:flex-start;justify-content:flex-end}.session-actions[data-v-528553dd]{display:flex;align-items:center;margin-top:auto}.ghost[data-v-528553dd]{opacity:.4}.chosen[data-v-528553dd]{box-shadow:0 4px 16px #00000026}.search-result-item[data-v-528553dd]{margin-bottom:16px;padding:12px;border:1px solid var(--border-primary);border-radius:6px;background:var(--bg-elevated)}.search-result-header[data-v-528553dd]{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.search-result-title[data-v-528553dd]{display:flex;align-items:center;gap:8px}.search-match[data-v-528553dd]{display:flex;align-items:flex-start;gap:8px;margin-top:6px;padding:6px;background:var(--bg-secondary);border-radius:4px}.search-match-text[data-v-528553dd]{flex:1;line-height:1.6}