@adversity/coding-tool-x 3.1.1 → 3.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +41 -0
- package/dist/web/assets/Analytics-BIqc8Rin.css +1 -0
- package/dist/web/assets/Analytics-D2V09DHH.js +39 -0
- package/dist/web/assets/{ConfigTemplates-ZrK_s7ma.js → ConfigTemplates-Bf_11LhH.js} +1 -1
- package/dist/web/assets/Home-BRnW4FTS.js +1 -0
- package/dist/web/assets/Home-CyCIx4BA.css +1 -0
- package/dist/web/assets/{PluginManager-BD7QUZbU.js → PluginManager-B9J32GhW.js} +1 -1
- package/dist/web/assets/{ProjectList-DRb1DuHV.js → ProjectList-5a19MWJk.js} +1 -1
- package/dist/web/assets/SessionList-CXUr6S7w.css +1 -0
- package/dist/web/assets/SessionList-Cxg5bAdT.js +1 -0
- package/dist/web/assets/{SkillManager-C1xG5B4Q.js → SkillManager-CVBr0CLi.js} +1 -1
- package/dist/web/assets/{Terminal-DksBo_lM.js → Terminal-D2Xe_Q0H.js} +1 -1
- package/dist/web/assets/{WorkspaceManager-Burx7XOo.js → WorkspaceManager-C7dwV94C.js} +1 -1
- package/dist/web/assets/icons-BxcwoY5F.js +1 -0
- package/dist/web/assets/index-BS9RA6SN.js +2 -0
- package/dist/web/assets/index-DUNAVDGb.css +1 -0
- package/dist/web/assets/naive-ui-BIXcURHZ.js +1 -0
- package/dist/web/assets/{vendors-CO3Upi1d.js → vendors-i5CBGnlm.js} +1 -1
- package/dist/web/assets/{vue-vendor-DqyWIXEb.js → vue-vendor-PKd8utv_.js} +1 -1
- package/dist/web/index.html +6 -6
- package/package.json +1 -1
- package/src/config/default.js +7 -27
- package/src/config/loader.js +6 -3
- package/src/config/model-metadata.js +167 -0
- package/src/config/model-metadata.json +125 -0
- package/src/config/model-pricing.js +23 -93
- package/src/server/api/channels.js +16 -39
- package/src/server/api/codex-channels.js +15 -43
- package/src/server/api/commands.js +0 -77
- package/src/server/api/config.js +4 -1
- package/src/server/api/gemini-channels.js +16 -40
- package/src/server/api/opencode-channels.js +108 -56
- package/src/server/api/opencode-proxy.js +42 -33
- package/src/server/api/opencode-sessions.js +4 -69
- package/src/server/api/sessions.js +11 -68
- package/src/server/api/settings.js +138 -0
- package/src/server/api/skills.js +0 -44
- package/src/server/api/statistics.js +115 -1
- package/src/server/codex-proxy-server.js +32 -59
- package/src/server/gemini-proxy-server.js +21 -18
- package/src/server/index.js +13 -7
- package/src/server/opencode-proxy-server.js +1232 -197
- package/src/server/proxy-server.js +8 -8
- package/src/server/services/codex-sessions.js +105 -6
- package/src/server/services/commands-service.js +0 -29
- package/src/server/services/config-templates-service.js +38 -28
- package/src/server/services/env-checker.js +97 -9
- package/src/server/services/env-manager.js +29 -1
- package/src/server/services/opencode-channels.js +3 -1
- package/src/server/services/opencode-sessions.js +486 -218
- package/src/server/services/opencode-settings-manager.js +172 -36
- package/src/server/services/plugins-service.js +37 -28
- package/src/server/services/pty-manager.js +22 -18
- package/src/server/services/response-decoder.js +21 -0
- package/src/server/services/skill-service.js +1 -49
- package/src/server/services/speed-test.js +40 -3
- package/src/server/services/statistics-service.js +238 -1
- package/src/server/utils/pricing.js +51 -60
- package/src/server/websocket-server.js +24 -5
- package/dist/web/assets/Home-B8YfhZ3c.js +0 -1
- package/dist/web/assets/Home-Di2qsylF.css +0 -1
- package/dist/web/assets/SessionList-BGJWyneI.css +0 -1
- package/dist/web/assets/SessionList-lZ0LKzfT.js +0 -1
- package/dist/web/assets/icons-kcfLIMBB.js +0 -1
- package/dist/web/assets/index-Ufv5rCa5.css +0 -1
- package/dist/web/assets/index-lAkrRC3h.js +0 -2
- package/dist/web/assets/naive-ui-CSrLusZZ.js +0 -1
- package/src/server/api/convert.js +0 -260
- package/src/server/services/session-converter.js +0 -577
|
@@ -378,9 +378,246 @@ function getTodayStatistics() {
|
|
|
378
378
|
return loadDailyStats(today);
|
|
379
379
|
}
|
|
380
380
|
|
|
381
|
+
/**
|
|
382
|
+
* 从统计对象中提取指定指标值
|
|
383
|
+
*/
|
|
384
|
+
function extractMetric(stats, metric) {
|
|
385
|
+
if (!stats) return 0;
|
|
386
|
+
if (metric === 'tokens') return stats.tokens?.total || stats.tokens || 0;
|
|
387
|
+
if (metric === 'cost') return stats.cost || 0;
|
|
388
|
+
if (metric === 'requests') return stats.requests || 0;
|
|
389
|
+
return 0;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* 从 JSONL 日志文件读取指定日期+小时的数据(按 model 或 channel 聚合)
|
|
394
|
+
*/
|
|
395
|
+
function readJsonlForHour(year, month, day, hour, groupBy) {
|
|
396
|
+
const filePath = getRequestLogFilePath(year, month, day);
|
|
397
|
+
const result = {};
|
|
398
|
+
|
|
399
|
+
try {
|
|
400
|
+
if (!fs.existsSync(filePath)) return result;
|
|
401
|
+
const lines = fs.readFileSync(filePath, 'utf8').split('\n');
|
|
402
|
+
|
|
403
|
+
for (const line of lines) {
|
|
404
|
+
if (!line.trim()) continue;
|
|
405
|
+
let entry;
|
|
406
|
+
try { entry = JSON.parse(line); } catch { continue; }
|
|
407
|
+
|
|
408
|
+
const ts = new Date(entry.timestamp);
|
|
409
|
+
if (ts.getHours() !== hour) continue;
|
|
410
|
+
|
|
411
|
+
let key;
|
|
412
|
+
if (groupBy === 'model') key = entry.model || 'unknown';
|
|
413
|
+
else if (groupBy === 'channel') key = entry.channel || entry.channelId || 'unknown';
|
|
414
|
+
else continue;
|
|
415
|
+
|
|
416
|
+
if (!result[key]) result[key] = { tokens: { total: 0 }, cost: 0, requests: 0 };
|
|
417
|
+
result[key].tokens.total += entry.tokens?.total || 0;
|
|
418
|
+
result[key].cost += entry.cost || 0;
|
|
419
|
+
result[key].requests += 1;
|
|
420
|
+
}
|
|
421
|
+
} catch (err) {
|
|
422
|
+
console.error('Failed to read JSONL for hour:', err);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
return result;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* 获取趋势统计数据
|
|
430
|
+
* @param {Object} options
|
|
431
|
+
* @param {string} options.startDate - YYYY-MM-DD
|
|
432
|
+
* @param {string} options.endDate - YYYY-MM-DD
|
|
433
|
+
* @param {string} options.granularity - 'day' | 'hour'
|
|
434
|
+
* @param {string} options.groupBy - 'model' | 'channel' | 'toolType'
|
|
435
|
+
* @param {string} options.metric - 'tokens' | 'cost' | 'requests'
|
|
436
|
+
*/
|
|
437
|
+
|
|
438
|
+
// 工具类型到 daily-stats 目录前缀的映射
|
|
439
|
+
const TOOL_PREFIXES = {
|
|
440
|
+
'claude-code': '',
|
|
441
|
+
'codex': 'codex-',
|
|
442
|
+
'gemini': 'gemini-',
|
|
443
|
+
'opencode': 'opencode-'
|
|
444
|
+
};
|
|
445
|
+
|
|
446
|
+
// 加载指定工具的某天统计(toolPrefix 为 '' | 'codex-' | 'gemini-' | 'opencode-')
|
|
447
|
+
function loadDailyStatsByTool(dateStr, toolPrefix) {
|
|
448
|
+
const dir = path.join(os.homedir(), '.cc-tool', `${toolPrefix}daily-stats`);
|
|
449
|
+
const filePath = path.join(dir, `${dateStr}.json`);
|
|
450
|
+
try {
|
|
451
|
+
if (fs.existsSync(filePath)) {
|
|
452
|
+
return JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
|
453
|
+
}
|
|
454
|
+
} catch (e) {}
|
|
455
|
+
return null;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// 合并所有工具的某天 daily-stats,groupBy 决定合并维度
|
|
459
|
+
// 对于 toolType 分组:key 就是工具名(claude-code/codex/gemini/opencode)
|
|
460
|
+
// 对于 model/channel 分组:合并各工具的 byModel/byChannel,key 可能重名(不同工具用同名模型)则加前缀
|
|
461
|
+
function mergeAllToolsDailyStats(dateStr, groupBy) {
|
|
462
|
+
const merged = {};
|
|
463
|
+
|
|
464
|
+
for (const [toolType, prefix] of Object.entries(TOOL_PREFIXES)) {
|
|
465
|
+
const stats = loadDailyStatsByTool(dateStr, prefix);
|
|
466
|
+
if (!stats) continue;
|
|
467
|
+
|
|
468
|
+
if (groupBy === 'toolType') {
|
|
469
|
+
// key = toolType,汇总整天 summary
|
|
470
|
+
if (!merged[toolType]) merged[toolType] = { requests: 0, tokens: { total: 0 }, cost: 0 };
|
|
471
|
+
const s = stats.summary || {};
|
|
472
|
+
merged[toolType].requests += s.requests || 0;
|
|
473
|
+
merged[toolType].tokens.total += (s.tokens && typeof s.tokens === 'object' ? s.tokens.total : s.tokens) || 0;
|
|
474
|
+
merged[toolType].cost += s.cost || 0;
|
|
475
|
+
} else if (groupBy === 'model') {
|
|
476
|
+
const byModel = stats.byModel || {};
|
|
477
|
+
for (const [model, mStats] of Object.entries(byModel)) {
|
|
478
|
+
if (!merged[model]) merged[model] = { requests: 0, tokens: { total: 0 }, cost: 0 };
|
|
479
|
+
merged[model].requests += mStats.requests || 0;
|
|
480
|
+
const t = mStats.tokens || {};
|
|
481
|
+
merged[model].tokens.total += (typeof t === 'object' ? t.total : t) || 0;
|
|
482
|
+
merged[model].cost += mStats.cost || 0;
|
|
483
|
+
}
|
|
484
|
+
} else if (groupBy === 'channel') {
|
|
485
|
+
const byChannel = stats.byChannel || {};
|
|
486
|
+
for (const [chId, chStats] of Object.entries(byChannel)) {
|
|
487
|
+
const key = chStats.name || chId;
|
|
488
|
+
if (!merged[key]) merged[key] = { requests: 0, tokens: { total: 0 }, cost: 0 };
|
|
489
|
+
merged[key].requests += chStats.requests || 0;
|
|
490
|
+
const t = chStats.tokens || {};
|
|
491
|
+
merged[key].tokens.total += (typeof t === 'object' ? t.total : t) || 0;
|
|
492
|
+
merged[key].cost += chStats.cost || 0;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
return merged;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
async function getTrendStatistics({ startDate, endDate, granularity = 'day', step = 1, groupBy = 'model', metric = 'tokens' }) {
|
|
500
|
+
step = parseInt(step) || 1;
|
|
501
|
+
const labels = [];
|
|
502
|
+
const seriesMap = {}; // { dimensionName: number[] }
|
|
503
|
+
const totals = {};
|
|
504
|
+
|
|
505
|
+
const start = new Date(startDate + 'T00:00:00');
|
|
506
|
+
const end = new Date(endDate + 'T00:00:00');
|
|
507
|
+
|
|
508
|
+
// Iterate each day
|
|
509
|
+
for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) {
|
|
510
|
+
const year = d.getFullYear();
|
|
511
|
+
const month = d.getMonth() + 1;
|
|
512
|
+
const day = d.getDate();
|
|
513
|
+
const dateStr = `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`;
|
|
514
|
+
|
|
515
|
+
if (granularity === 'day') {
|
|
516
|
+
labels.push(dateStr);
|
|
517
|
+
const byDimension = mergeAllToolsDailyStats(dateStr, groupBy);
|
|
518
|
+
|
|
519
|
+
// Accumulate dimensions seen so far with 0 for this label position
|
|
520
|
+
const labelIdx = labels.length - 1;
|
|
521
|
+
|
|
522
|
+
// Fill existing series with 0 for this position first
|
|
523
|
+
for (const key of Object.keys(seriesMap)) {
|
|
524
|
+
seriesMap[key].push(0);
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
for (const [key, stats] of Object.entries(byDimension)) {
|
|
528
|
+
const val = extractMetric(stats, metric);
|
|
529
|
+
if (!seriesMap[key]) {
|
|
530
|
+
// New dimension: backfill with zeros for previous labels
|
|
531
|
+
seriesMap[key] = new Array(labelIdx).fill(0);
|
|
532
|
+
seriesMap[key].push(val);
|
|
533
|
+
} else {
|
|
534
|
+
// Already pushed 0 above, replace last element
|
|
535
|
+
seriesMap[key][labelIdx] = val;
|
|
536
|
+
}
|
|
537
|
+
totals[key] = (totals[key] || 0) + val;
|
|
538
|
+
}
|
|
539
|
+
} else {
|
|
540
|
+
// granularity === 'hour'
|
|
541
|
+
for (let h = 0; h < 24; h += step) {
|
|
542
|
+
const hourEnd = Math.min(h + step, 24);
|
|
543
|
+
const hourStr = h.toString().padStart(2, '0');
|
|
544
|
+
const label = step === 1
|
|
545
|
+
? `${dateStr} ${hourStr}:00`
|
|
546
|
+
: `${dateStr} ${hourStr}:00-${String(hourEnd).padStart(2, '0')}:00`;
|
|
547
|
+
labels.push(label);
|
|
548
|
+
const labelIdx = labels.length - 1;
|
|
549
|
+
|
|
550
|
+
// Fill existing series with 0 for this label
|
|
551
|
+
for (const key of Object.keys(seriesMap)) {
|
|
552
|
+
seriesMap[key].push(0);
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
// Accumulate all hours in this step bucket
|
|
556
|
+
for (let hh = h; hh < hourEnd; hh++) {
|
|
557
|
+
const hhStr = hh.toString().padStart(2, '0');
|
|
558
|
+
let byDimension = {};
|
|
559
|
+
|
|
560
|
+
if (groupBy === 'toolType') {
|
|
561
|
+
// 合并所有工具的该小时数据
|
|
562
|
+
for (const [toolType, prefix] of Object.entries(TOOL_PREFIXES)) {
|
|
563
|
+
const ds = loadDailyStatsByTool(dateStr, prefix);
|
|
564
|
+
const hourData = ds?.hourly?.[hhStr];
|
|
565
|
+
const val = hourData ? extractMetric(hourData, metric) : 0;
|
|
566
|
+
if (val > 0) {
|
|
567
|
+
if (!byDimension[toolType]) byDimension[toolType] = { requests: 0, tokens: { total: 0 }, cost: 0 };
|
|
568
|
+
byDimension[toolType].requests += hourData.requests || 0;
|
|
569
|
+
byDimension[toolType].tokens.total += (hourData.tokens?.total || 0);
|
|
570
|
+
byDimension[toolType].cost += hourData.cost || 0;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
} else {
|
|
574
|
+
byDimension = readJsonlForHour(year, month, day, hh, groupBy);
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
for (const [key, stats] of Object.entries(byDimension)) {
|
|
578
|
+
const val = extractMetric(stats, metric);
|
|
579
|
+
if (!seriesMap[key]) {
|
|
580
|
+
seriesMap[key] = new Array(labelIdx).fill(0);
|
|
581
|
+
seriesMap[key].push(val);
|
|
582
|
+
} else {
|
|
583
|
+
if (seriesMap[key].length <= labelIdx) seriesMap[key].push(0);
|
|
584
|
+
seriesMap[key][labelIdx] = (seriesMap[key][labelIdx] || 0) + val;
|
|
585
|
+
}
|
|
586
|
+
totals[key] = (totals[key] || 0) + val;
|
|
587
|
+
}
|
|
588
|
+
} // end hh loop
|
|
589
|
+
} // end h loop
|
|
590
|
+
} // end else (hour granularity)
|
|
591
|
+
} // end for day loop
|
|
592
|
+
|
|
593
|
+
// Sort series by total desc, keep top 10, merge rest into 'Other'
|
|
594
|
+
const sorted = Object.entries(totals).sort((a, b) => b[1] - a[1]);
|
|
595
|
+
const top10 = sorted.slice(0, 10);
|
|
596
|
+
const rest = sorted.slice(10);
|
|
597
|
+
|
|
598
|
+
const series = top10.map(([name]) => ({
|
|
599
|
+
name,
|
|
600
|
+
data: seriesMap[name] || []
|
|
601
|
+
}));
|
|
602
|
+
|
|
603
|
+
if (rest.length > 0) {
|
|
604
|
+
const otherData = labels.map((_, i) =>
|
|
605
|
+
rest.reduce((sum, [name]) => sum + (seriesMap[name]?.[i] || 0), 0)
|
|
606
|
+
);
|
|
607
|
+
const otherTotal = rest.reduce((sum, [, total]) => sum + total, 0);
|
|
608
|
+
series.push({ name: 'Other', data: otherData });
|
|
609
|
+
totals['Other'] = otherTotal;
|
|
610
|
+
// Remove merged keys from totals
|
|
611
|
+
for (const [name] of rest) delete totals[name];
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
return { labels, series, totals };
|
|
615
|
+
}
|
|
616
|
+
|
|
381
617
|
module.exports = {
|
|
382
618
|
recordRequest,
|
|
383
619
|
getStatistics,
|
|
384
620
|
getDailyStatistics,
|
|
385
|
-
getTodayStatistics
|
|
621
|
+
getTodayStatistics,
|
|
622
|
+
getTrendStatistics
|
|
386
623
|
};
|
|
@@ -1,79 +1,70 @@
|
|
|
1
1
|
const { loadConfig } = require('../../config/loader');
|
|
2
|
-
const
|
|
3
|
-
const { CLAUDE_MODEL_PRICING, CLAUDE_MODEL_ALIASES } = require('../../config/model-pricing');
|
|
2
|
+
const { resolveModelMetadata } = require('../../config/model-metadata');
|
|
4
3
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
function getPricingConfig(toolKey) {
|
|
8
|
-
try {
|
|
9
|
-
const config = loadConfig();
|
|
10
|
-
if (config.pricing && config.pricing[toolKey]) {
|
|
11
|
-
return config.pricing[toolKey];
|
|
12
|
-
}
|
|
13
|
-
} catch (err) {
|
|
14
|
-
console.error('[Pricing] Failed to load pricing config:', err);
|
|
15
|
-
}
|
|
16
|
-
return DEFAULT_CONFIG.pricing[toolKey];
|
|
4
|
+
function normalizeModelId(model) {
|
|
5
|
+
return String(model || '').trim().toLowerCase();
|
|
17
6
|
}
|
|
18
7
|
|
|
19
|
-
function
|
|
20
|
-
|
|
21
|
-
const
|
|
8
|
+
function getModelMetadataOverride(overrides, model) {
|
|
9
|
+
if (!overrides || typeof overrides !== 'object') return null;
|
|
10
|
+
const modelId = normalizeModelId(model);
|
|
11
|
+
if (!modelId) return null;
|
|
22
12
|
|
|
23
|
-
|
|
24
|
-
|
|
13
|
+
let directMatch = null;
|
|
14
|
+
for (const [id, override] of Object.entries(overrides)) {
|
|
15
|
+
if (normalizeModelId(id) === modelId) {
|
|
16
|
+
directMatch = override;
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
25
19
|
}
|
|
20
|
+
if (directMatch) return directMatch;
|
|
26
21
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
22
|
+
let bestMatch = null;
|
|
23
|
+
let bestLen = 0;
|
|
24
|
+
for (const [id, override] of Object.entries(overrides)) {
|
|
25
|
+
const key = normalizeModelId(id);
|
|
26
|
+
if (!key) continue;
|
|
27
|
+
if (modelId.startsWith(key) || key.startsWith(modelId)) {
|
|
28
|
+
if (key.length > bestLen) {
|
|
29
|
+
bestLen = key.length;
|
|
30
|
+
bestMatch = override;
|
|
32
31
|
}
|
|
33
|
-
}
|
|
34
|
-
return result;
|
|
32
|
+
}
|
|
35
33
|
}
|
|
36
|
-
|
|
37
|
-
return base;
|
|
34
|
+
return bestMatch;
|
|
38
35
|
}
|
|
39
36
|
|
|
40
|
-
function
|
|
41
|
-
|
|
37
|
+
function resolveMetadataPricing(model) {
|
|
38
|
+
if (!model) return null;
|
|
42
39
|
|
|
43
|
-
|
|
44
|
-
const modelConfig = config?.models?.[model];
|
|
45
|
-
if (modelConfig && modelConfig.mode === 'custom') {
|
|
46
|
-
const result = { ...hardcodedPricing };
|
|
47
|
-
RATE_KEYS.forEach((key) => {
|
|
48
|
-
if (typeof modelConfig[key] === 'number' && Number.isFinite(modelConfig[key])) {
|
|
49
|
-
result[key] = modelConfig[key];
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
return result;
|
|
53
|
-
}
|
|
40
|
+
const builtInPricing = resolveModelMetadata(model)?.pricing || null;
|
|
54
41
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
|
|
42
|
+
try {
|
|
43
|
+
const config = loadConfig();
|
|
44
|
+
const override = getModelMetadataOverride(config.modelMetadataOverrides, model);
|
|
45
|
+
const overridePricing = override?.pricing || null;
|
|
46
|
+
if (!builtInPricing && !overridePricing) return null;
|
|
47
|
+
return {
|
|
48
|
+
...(builtInPricing || {}),
|
|
49
|
+
...(overridePricing || {})
|
|
50
|
+
};
|
|
51
|
+
} catch (err) {
|
|
52
|
+
console.error('[Pricing] Failed to load model metadata overrides:', err);
|
|
53
|
+
return builtInPricing;
|
|
64
54
|
}
|
|
55
|
+
}
|
|
65
56
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const centralizedPricing = CLAUDE_MODEL_PRICING[normalizedModel];
|
|
70
|
-
|
|
71
|
-
if (centralizedPricing) {
|
|
72
|
-
return { ...defaultPricing, ...centralizedPricing };
|
|
73
|
-
}
|
|
57
|
+
function resolvePricing(_toolKey, modelPricing = {}, defaultPricing = {}) {
|
|
58
|
+
return { ...defaultPricing, ...(modelPricing || {}) };
|
|
59
|
+
}
|
|
74
60
|
|
|
75
|
-
|
|
76
|
-
|
|
61
|
+
function resolveModelPricing(_toolKey, model, fallbackPricing = {}, defaultPricing = {}) {
|
|
62
|
+
const pricingFromMetadata = resolveMetadataPricing(model);
|
|
63
|
+
return {
|
|
64
|
+
...defaultPricing,
|
|
65
|
+
...(fallbackPricing || {}),
|
|
66
|
+
...(pricingFromMetadata || {})
|
|
67
|
+
};
|
|
77
68
|
}
|
|
78
69
|
|
|
79
70
|
module.exports = {
|
|
@@ -33,6 +33,29 @@ let websocketOptions = {
|
|
|
33
33
|
host: '127.0.0.1',
|
|
34
34
|
allowRemoteTerminal: false
|
|
35
35
|
};
|
|
36
|
+
const HISTORY_CHUNK_SIZE = 50;
|
|
37
|
+
|
|
38
|
+
function sendPersistedLogsInChunks(ws, logs) {
|
|
39
|
+
let index = 0;
|
|
40
|
+
|
|
41
|
+
const sendChunk = () => {
|
|
42
|
+
if (ws.readyState !== WebSocket.OPEN) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const end = Math.min(index + HISTORY_CHUNK_SIZE, logs.length);
|
|
47
|
+
for (let i = index; i < end; i++) {
|
|
48
|
+
ws.send(JSON.stringify(logs[i]));
|
|
49
|
+
}
|
|
50
|
+
index = end;
|
|
51
|
+
|
|
52
|
+
if (index < logs.length) {
|
|
53
|
+
setImmediate(sendChunk);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
setImmediate(sendChunk);
|
|
58
|
+
}
|
|
36
59
|
|
|
37
60
|
function parseHostHeader(hostHeader) {
|
|
38
61
|
const value = String(hostHeader || '').trim();
|
|
@@ -309,11 +332,7 @@ function startWebSocketServer(httpServer, options = {}) {
|
|
|
309
332
|
|
|
310
333
|
// 发送历史日志给新连接的客户端
|
|
311
334
|
if (logsCache.length > 0) {
|
|
312
|
-
|
|
313
|
-
if (ws.readyState === WebSocket.OPEN) {
|
|
314
|
-
ws.send(JSON.stringify(log));
|
|
315
|
-
}
|
|
316
|
-
});
|
|
335
|
+
sendPersistedLogsInChunks(ws, logsCache);
|
|
317
336
|
}
|
|
318
337
|
|
|
319
338
|
// 处理客户端消息
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{d as e}from"./vendors-CO3Upi1d.js";import{a6 as a,f as l,r as n,w as s,h as c,K as t,a8 as o,c as i,o as u,a as d,W as r,X as v,a0 as p,Y as h,N as y,a3 as g,_ as m,p as k,F as f,$ as T,L as b,Z as x,v as _}from"./vue-vendor-DqyWIXEb.js";import{_ as C,u as w,a as $,R as q,g as z,b as S,c as L,d as I,e as O,f as j,h as M,t as N,i as A,j as F,k as P,l as U,m as D,n as E,o as V,s as J}from"./index-lAkrRC3h.js";import{E as G,r as K,q as R,p as Y,ar as B,Y as H,as as W,at as X,au as Z,av as Q,ac as ee,i as ae,A as le,aw as ne,ax as se,a as ce,T as te}from"./icons-kcfLIMBB.js";import{M as oe,N as ie,c as ue,b as de,a as re,_ as ve,B as pe,s as he}from"./naive-ui-CSrLusZZ.js";import"./markdown-C9MYpaSi.js";const ye={class:"channel-column"},ge={class:"drag-handle",title:"拖拽排序"},me={class:"header-icon"},ke={class:"channel-title"},fe={class:"mcp-quick-panel"},Te={class:"panel-title"},be={key:0,class:"no-items"},xe={key:1,class:"mcp-quick-list"},_e={class:"mcp-item-icon"},Ce={class:"mcp-item-info"},we={class:"mcp-item-name"},$e={class:"mcp-item-type"},qe={key:1,class:"claude-extra-area"},ze={class:"skills-quick-panel"},Se={class:"panel-title"},Le={key:0,class:"no-items"},Ie={key:1,class:"skills-quick-list"},Oe={class:"skill-item-icon"},je={class:"skill-item-info"},Me={class:"skill-item-name"},Ne={class:"skill-item-desc"},Ae={key:0,class:"channel-content"},Fe={class:"card"},Pe={class:"card-header"},Ue={key:0,class:"runtime-badge"},De={class:"card-body",style:{padding:"6px 10px"}},Ee={class:"proxy-info-row"},Ve={class:"proxy-status"},Je={class:"proxy-port"},Ge={class:"channel-name"},Ke={class:"channel-quick-panel"},Re={class:"panel-title"},Ye={key:0,class:"no-channels"},Be={key:1,class:"channel-quick-list"},He={class:"channel-quick-info"},We={class:"channel-quick-name"},Xe={class:"channel-metrics"},Ze={class:"metric-item"},Qe={class:"metric-value"},ea={class:"metric-item"},aa={class:"metric-value"},la={class:"metric-item"},na={class:"metric-value"},sa={class:"metric-item"},ca={class:"card"},ta={class:"card-header compact"},oa={class:"card-body",style:{padding:"8px 10px"}},ia={class:"quick-access-list"},ua={class:"access-icon"},da={class:"access-content"},ra={class:"access-value"},va={class:"access-icon"},pa={class:"access-content"},ha={class:"access-value"},ya={class:"access-icon"},ga={class:"access-content"},ma={class:"access-goto"},ka={class:"card-header compact"},fa={class:"card-body",style:{padding:"8px 10px"}},Ta={class:"stats-inline stats-3col"},ba={class:"stat-inline-item stat-requests"},xa={class:"stat-info"},_a={class:"stat-inline-item stat-input"},Ca={class:"stat-info"},wa={class:"stat-inline-item stat-output"},$a={class:"stat-info"},qa={key:1,class:"card logs-card"},za={class:"collapse-header"},Sa={class:"collapse-content scrollable-content"},La={class:"logs-table-wrapper"},Ia={key:0,class:"empty-logs"},Oa={key:0,class:"action-content"},ja={class:"action-msg"},Ma={class:"action-time"},Na={class:"locked-content"},Aa={class:"lock-icon"},Fa="channelLocks",Pa=C({__name:"ChannelColumn",props:{channelType:{type:String,required:!0,validator:e=>["claude","codex","gemini","opencode"].includes(e)}},setup(e){const C=e,V=a(),J=oe(),{claudeProxy:Pa,codexProxy:Ua,geminiProxy:Da,opencodeProxy:Ea,claudeChannels:Va,codexChannels:Ja,geminiChannels:Ga,opencodeChannels:Ka,schedulerState:Ra,getProxyState:Ya,startProxy:Ba,stopProxy:Ha,getLogs:Wa,clearLogsForSource:Xa,loadChannels:Za,logLimit:Qa,statsInterval:el}=w(),{dashboardData:al,loadDashboard:ll}=$(),nl={claude:{title:"ClaudeCode",subtitle:"智能编程助手",icon:Y},codex:{title:"Codex-CLI",subtitle:"高效代码生成",icon:R},gemini:{title:"Gemini-CLI",subtitle:"多模态AI助手",icon:K},opencode:{title:"OpenCode",subtitle:"AI 代码助手",icon:G}},sl=l(()=>nl[C.channelType].title);l(()=>nl[C.channelType].subtitle);const cl=l(()=>nl[C.channelType].icon),tl=l(()=>"claude"===C.channelType?Pa.value:"codex"===C.channelType?Ua.value:"gemini"===C.channelType?Da.value:"opencode"===C.channelType?Ea.value:{}),ol=l(()=>"claude"===C.channelType?"Claude":"codex"===C.channelType?"Codex":"gemini"===C.channelType?"Gemini":"opencode"===C.channelType?"OpenCode":""),il=n({projects:0,sessions:0}),ul=n({requests:0,tokens:0,cost:0}),dl=n({requests:0,tokens:0,cost:0}),rl={requests:0,tokens:0,cost:3};let vl={requests:null,tokens:null,cost:null};const pl=n({requests:!1,tokens:!1,cost:!1}),hl=l(()=>{var e,a,l;const n="claude"===C.channelType?"claude":"codex"===C.channelType?"codex":"opencode"===C.channelType?"opencode":"gemini";return(null==(l=null==(a=null==(e=al.value)?void 0:e.todayStats)?void 0:a[n])?void 0:l.byModel)||{}});function yl(e,a,l,n=600){vl[e]&&cancelAnimationFrame(vl[e]),pl.value[e]=!0;const s=Date.now(),c=()=>{const t=Date.now()-s,o=Math.min(t/n,1),i=1-Math.pow(1-o,2),u=a+(l-a)*i,d=rl[e]??0,r=Math.pow(10,d),v=d>0?Math.round(u*r)/r:Math.round(u);dl.value[e]=v,o<1?vl[e]=requestAnimationFrame(c):pl.value[e]=!1};vl[e]=requestAnimationFrame(c)}const gl=n(!1),ml=n(0),kl=n([]),fl=n(0),Tl=n([]),bl=l(()=>({claude:"Claude",codex:"Codex",gemini:"Gemini",opencode:"OpenCode"}[C.channelType]||""));async function xl(){if(["claude","codex","opencode"].includes(C.channelType))try{const e=await O(!1,C.channelType);if(e.success&&e.skills){const a=e.skills.filter(e=>e.installed);ml.value=a.length,kl.value=a.slice(0,10).map(e=>({...e,_uninstalling:!1}))}}catch(e){}}async function _l(){try{const e=await j();if(e.success&&e.servers){const a=Object.values(e.servers).filter(e=>{var a;return!0===(null==(a=e.apps)?void 0:a[C.channelType])});fl.value=a.length,Tl.value=a.slice(0,10).map(e=>({...e,_toggling:!1}))}}catch(e){}}function Cl(e){try{const a=localStorage.getItem(Fa),l=a?JSON.parse(a):{};l[C.channelType]=e,localStorage.setItem(Fa,JSON.stringify(l))}catch(a){}}const wl=n(function(){try{const e=localStorage.getItem(Fa);if(e){return JSON.parse(e)[C.channelType]||!1}}catch(e){}return!1}());async function $l(){wl.value=!wl.value,Cl(wl.value);try{if(await E("channelLocks",C.channelType,wl.value),al.value){const e=al.value.uiConfig||{},a={...e.channelLocks||{}};a[C.channelType]=wl.value,al.value={...al.value,uiConfig:{...e,channelLocks:a}}}}catch(e){}}const ql=n(!0);function zl(e){e.detail&&void 0!==e.detail.showLogs&&(ql.value=e.detail.showLogs)}const Sl=n(Date.now()),Ll=l(()=>{if(!tl.value.running)return"";const e=tl.value.startTime;if(!e)return"";const a=Sl.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}),Il=n(null),Ol=l(()=>Qa.value),jl={claude:Wa("claude"),codex:Wa("codex"),gemini:Wa("gemini"),opencode:Wa("opencode")},Ml=l(()=>((jl[C.channelType]||jl.claude).value||[]).slice(0,Ol.value));let Nl=null,Al=null,Fl=null,Pl=!1,Ul=null;const Dl=l(()=>{let e=[];"claude"===C.channelType?e=Va.value||[]:"codex"===C.channelType?e=Ja.value||[]:"gemini"===C.channelType?e=Ga.value||[]:"opencode"===C.channelType&&(e=Ka.value||[]);return[...e.filter(e=>!1!==e.enabled),...e.filter(e=>!1===e.enabled)]});function El(e){const a=Ra[C.channelType];if(!a||!a.channels)return 0;const l=a.channels.find(a=>a.id===e);return l?l.inflight:0}const Vl=l(()=>{var e;const a=Dl.value.filter(e=>!1!==e.enabled).length;return(null==(e=tl.value.proxy)?void 0:e.running)?`${a}个渠道调度中`:Dl.value.length>0?`${a}个渠道已启用`:"无渠道"}),Jl=n({});function Gl(e){return Jl.value[e]||{requests:0,tokens:0,cost:0}}async function Kl(){var e;try{let a;if("claude"===C.channelType?a=await z():"codex"===C.channelType?a=await S():"gemini"===C.channelType?a=await L():"opencode"===C.channelType&&(a=await I()),a&&a.byChannel){const l={};for(const[n,s]of Object.entries(a.byChannel))l[n]={requests:s.requests||0,tokens:(null==(e=s.tokens)?void 0:e.total)||0,cost:s.cost||0};Jl.value=l}}catch(a){}}async function Rl(e){var a,l;const n=Ya(C.channelType);n.value.loading=!0;try{let a;a=e?await Ba(C.channelType):await Ha(C.channelType),!1!==a.success?J.success(e?`${sl.value} 代理已启动`:`${sl.value} 代理已停止`):(J.error(a.error||"操作失败"),n.value.running=!e)}catch(s){J.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 Yl(){V.push({name:`${C.channelType}-projects`})}function Bl(){V.push({name:`${C.channelType}-projects`})}function Hl(){var e,a;const l=null==(a=null==(e=al.value)?void 0:e.counts)?void 0:a[C.channelType];il.value.projects=(null==l?void 0:l.projectCount)||0,il.value.sessions=(null==l?void 0:l.sessionCount)||0}async function Wl(){if(al.value&&al.value.todayStats){const e=al.value.todayStats[C.channelType];e&&(ul.value.requests=e.requests||0,ul.value.tokens=e.tokens||0,ul.value.cost=e.cost||0)}Hl()}function Xl(){Xa(C.channelType)}function Zl(){window.dispatchEvent(new CustomEvent("open-skills-drawer"))}return s(Ml,e=>{var a;const l=(null==(a=e[0])?void 0:a.id)||null;if(!l||l===Nl)return void(Nl=l);Nl=l,Ul&&clearTimeout(Ul),Ul=setTimeout(()=>{Kl()},5e3);(!Il.value||Il.value.scrollTop<20)&&_(()=>{Il.value&&(Il.value.scrollTop=0)})}),s(()=>ul.value.requests,e=>{yl("requests",dl.value.requests,e,600)}),s(()=>ul.value.tokens,e=>{yl("tokens",dl.value.tokens,e,600)}),s(()=>ul.value.cost,e=>{yl("cost",dl.value.cost,e,600)}),s(()=>C.channelType,()=>{var e;Nl=(null==(e=Ml.value[0])?void 0:e.id)||null}),s(()=>{var e,a;return null==(a=null==(e=al.value)?void 0:e.counts)?void 0:a[C.channelType]},()=>{Hl()}),s(el,()=>{Pl&&function(){Al&&(clearInterval(Al),Al=null);const e=el.value||30,a=Math.max(1e3*e,1e4);Al=setInterval(()=>{Wl(),Kl()},a)}()}),c(async()=>{await ll(),await Wl(),await Kl(),xl(),_l(),async function(){var e,a;try{if(al.value&&al.value.uiConfig)ql.value=!1!==(null==(e=al.value.uiConfig.panelVisibility)?void 0:e.showLogs);else{const e=await M();e.success&&e.config&&(ql.value=!1!==(null==(a=e.config.panelVisibility)?void 0:a.showLogs))}}catch(l){}}(),async function(){var e,a;try{let l=!1;if(al.value&&al.value.uiConfig)l=(null==(e=al.value.uiConfig.channelLocks)?void 0:e[C.channelType])||!1;else{const e=await M();e.success&&e.config&&(l=(null==(a=e.config.channelLocks)?void 0:a[C.channelType])||!1)}wl.value=l,Cl(l)}catch(l){}}(),window.addEventListener("panel-visibility-change",zl),dl.value={...ul.value},Pl=!0,Fl=setInterval(()=>{Sl.value=Date.now()},1e3)}),t(()=>{Pl=!1,Al&&clearInterval(Al),Fl&&clearInterval(Fl),Ul&&clearTimeout(Ul),window.removeEventListener("panel-visibility-change",zl),Object.values(vl).forEach(e=>{e&&cancelAnimationFrame(e)})}),(a,l)=>{const n=o("n-collapse"),s=o("n-collapse-item");return u(),i("div",ye,[d("div",{class:b(["channel-header",e.channelType])},[d("div",ge,[v(y(ie),{size:16},{default:h(()=>[v(y(B))]),_:1})]),d("div",me,[v(y(ie),{size:20},{default:h(()=>[(u(),p(g(cl.value)))]),_:1})]),d("h2",ke,m(sl.value),1),fl.value>0?(u(),p(y(ve),{key:0,trigger:"click",placement:"bottom",width:340,class:"mcp-popover"},{trigger:h(()=>[v(y(re),{type:"info",size:"small",bordered:!1,class:"mcp-count-tag clickable"},{default:h(()=>[k(" 已启用 "+m(fl.value)+" 个 MCP ",1)]),_:1})]),default:h(()=>[d("div",fe,[d("div",Te,[l[3]||(l[3]=d("span",null,"已启用的 MCP 服务",-1)),v(y(ue),{depth:"3",style:{"font-size":"11px"}},{default:h(()=>[k(m(bl.value)+" 平台",1)]),_:1})]),0===Tl.value.length?(u(),i("div",be,[v(y(ue),{depth:"3"},{default:h(()=>[...l[4]||(l[4]=[k("暂无启用的 MCP 服务",-1)])]),_:1})])):(u(),i("div",xe,[(u(!0),i(f,null,T(Tl.value,e=>(u(),i("div",{key:e.id,class:"mcp-quick-item"},[d("div",_e,[v(y(ie),{size:14},{default:h(()=>[v(y(H))]),_:1})]),d("div",Ce,[d("span",we,m(e.name),1),d("span",$e,m(e.transportType||"stdio"),1)]),v(y(de),{size:"small",value:!0,"onUpdate:value":a=>async function(e,a){e._toggling=!0;try{await N(e.id,C.channelType,a),J.success(a?`已启用 ${e.name}`:`已禁用 ${e.name}`),await _l()}catch(l){J.error("操作失败: "+(l.message||"未知错误"))}finally{e._toggling=!1}}(e,a),loading:e._toggling},null,8,["onUpdate:value","loading"])]))),128))]))])]),_:1})):r("",!0),"claude"===e.channelType?(u(),i("div",qe,[ml.value>0?(u(),p(y(ve),{key:0,trigger:"click",placement:"bottom",width:340,class:"skills-popover"},{trigger:h(()=>[v(y(re),{type:"success",size:"small",bordered:!1,class:"skills-count-tag clickable"},{default:h(()=>[k(m(ml.value)+" 个技能 ",1)]),_:1})]),default:h(()=>[d("div",ze,[d("div",Se,[l[6]||(l[6]=d("span",null,"已安装的技能",-1)),v(y(pe),{text:"",size:"tiny",onClick:Zl},{default:h(()=>[...l[5]||(l[5]=[k(" 管理全部 ",-1)])]),_:1})]),0===kl.value.length?(u(),i("div",Le,[v(y(ue),{depth:"3"},{default:h(()=>[...l[7]||(l[7]=[k("暂无已安装的技能",-1)])]),_:1})])):(u(),i("div",Ie,[(u(!0),i(f,null,T(kl.value,e=>(u(),i("div",{key:e.id,class:"skill-quick-item"},[d("div",Oe,[v(y(ie),{size:14},{default:h(()=>[v(y(G))]),_:1})]),d("div",je,[d("span",Me,m(e.name),1),d("span",Ne,m(e.description||"无描述"),1)]),v(y(pe),{size:"tiny",tertiary:"",type:"error",onClick:a=>async function(e){e._uninstalling=!0;try{const a=await A(e.directory,C.channelType);a.success?(J.success(`已卸载 ${e.name}`),await xl()):J.error(a.error||"卸载失败")}catch(a){J.error("卸载失败: "+(a.message||"未知错误"))}finally{e._uninstalling=!1}}(e),loading:e._uninstalling},{default:h(()=>[...l[8]||(l[8]=[k(" 卸载 ",-1)])]),_:1},8,["onClick","loading"])]))),128))]))])]),_:1})):r("",!0),v(y(he),{trigger:"hover"},{trigger:h(()=>[v(y(pe),{text:"",class:"skills-button",onClick:Zl,title:"Skills 技能管理"},{icon:h(()=>[v(y(ie),{size:18},{default:h(()=>[v(y(G))]),_:1})]),_:1})]),default:h(()=>[l[9]||(l[9]=k(" Skills 技能管理 ",-1))]),_:1})])):r("",!0),v(y(pe),{text:"",class:"lock-button",onClick:$l,title:wl.value?"解锁此列":"锁定此列"},{icon:h(()=>[v(y(ie),{size:18},{default:h(()=>[wl.value?(u(),p(y(W),{key:0})):(u(),p(y(X),{key:1}))]),_:1})]),_:1},8,["title"])],2),wl.value?r("",!0):(u(),i("div",Ae,[d("div",Fe,[d("div",Pe,[v(y(ie),{size:16},{default:h(()=>[v(y(Z))]),_:1}),l[10]||(l[10]=d("h3",{class:"card-title"},"代理控制",-1)),tl.value.running&&Ll.value?(u(),i("span",Ue,m(Ll.value),1)):r("",!0),v(y(de),{value:tl.value.running,"onUpdate:value":[l[0]||(l[0]=e=>tl.value.running=e),Rl],loading:tl.value.loading,size:"small",style:{"margin-left":"auto"}},null,8,["value","loading"])]),d("div",De,[d("div",Ee,[d("div",Ve,[d("div",{class:b(["status-dot",{active:tl.value.running}])},null,2),v(y(ue),{type:tl.value.running?"success":"default",style:{"font-size":"12px"}},{default:h(()=>[k(m(tl.value.running?"运行中":"已停止"),1)]),_:1},8,["type"]),d("span",Je,"端口: "+m(tl.value.port),1)]),v(y(ve),{trigger:"click",placement:"bottom",width:320,class:"channel-popover"},{trigger:h(()=>[v(y(pe),{text:"",size:"tiny",class:"channel-status"},{default:h(()=>[d("span",Ge,m(Vl.value),1)]),_:1})]),default:h(()=>[d("div",Ke,[d("div",Re,[l[12]||(l[12]=d("span",null,"渠道快捷管理",-1)),v(y(ue),{depth:"3",style:{"font-size":"11px"}},{default:h(()=>[...l[11]||(l[11]=[k("点击开关切换状态",-1)])]),_:1})]),0===Dl.value.length?(u(),i("div",Ye,[v(y(ue),{depth:"3"},{default:h(()=>[...l[13]||(l[13]=[k("暂无配置渠道",-1)])]),_:1})])):(u(),i("div",Be,[(u(!0),i(f,null,T(Dl.value,e=>{var a,n;return u(),i("div",{key:e.id,class:b(["channel-quick-item",{disabled:!1===e.enabled}])},[d("div",He,[d("span",We,m(e.name),1),"frozen"===(null==(a=e.health)?void 0:a.status)?(u(),p(y(re),{key:0,size:"tiny",type:"error",bordered:!1},{default:h(()=>[...l[14]||(l[14]=[k(" 冻结 ",-1)])]),_:1})):r("",!0),v(y(de),{size:"small",value:!1!==e.enabled,"onUpdate:value":a=>async function(e,a){try{let l;"claude"===C.channelType?l=F:"codex"===C.channelType?l=P:"gemini"===C.channelType?l=U:"opencode"===C.channelType&&(l=D),l&&(await l(e.id,{enabled:a}),J.success(a?`渠道「${e.name}」已启用`:`渠道「${e.name}」已停用`),await Za())}catch(l){J.error("操作失败: "+l.message)}}(e,a),style:{"margin-left":"auto"}},null,8,["value","onUpdate:value"])]),d("div",Xe,[d("span",Ze,[l[15]||(l[15]=d("span",{class:"metric-label"},"请求",-1)),d("span",Qe,m(Gl(e.id).requests),1)]),d("span",ea,[l[16]||(l[16]=d("span",{class:"metric-label"},"Tokens",-1)),d("span",aa,m((n=Gl(e.id).tokens,n>=1e6?(n/1e6).toFixed(1)+"M":n>=1e3?(n/1e3).toFixed(1)+"K":n.toString())),1)]),d("span",la,[l[17]||(l[17]=d("span",{class:"metric-label"},"权重",-1)),d("span",na,m(e.weight||1),1)]),d("span",sa,[l[18]||(l[18]=d("span",{class:"metric-label"},"并发",-1)),d("span",{class:b(["metric-value",{active:El(e.id)>0}])},m(El(e.id))+m(e.maxConcurrency?`/${e.maxConcurrency}`:""),3)])])],2)}),128))]))])]),_:1})])])]),d("div",ca,[d("div",ta,[v(y(ie),{size:14},{default:h(()=>[v(y(Q))]),_:1}),l[19]||(l[19]=d("h3",{class:"card-title"},"快速访问",-1))]),d("div",oa,[d("div",ia,[d("div",{class:"access-card access-card-projects clickable",onClick:Yl},[d("div",ua,[v(y(ie),{size:16},{default:h(()=>[v(y(ee))]),_:1})]),d("div",da,[l[20]||(l[20]=d("span",{class:"access-label"},"项目",-1)),d("span",ra,m(il.value.projects),1)])]),d("div",{class:"access-card access-card-sessions clickable",onClick:l[1]||(l[1]=e=>gl.value=!0)},[d("div",va,[v(y(ie),{size:16},{default:h(()=>[v(y(ae))]),_:1})]),d("div",pa,[l[21]||(l[21]=d("span",{class:"access-label"},"最新对话",-1)),d("span",ha,m(il.value.sessions),1)])]),d("div",{class:"access-card access-card-goto clickable",onClick:Bl},[d("div",ya,[v(y(ie),{size:16},{default:h(()=>[v(y(le))]),_:1})]),d("div",ga,[l[22]||(l[22]=d("span",{class:"access-label"},"前往",-1)),d("span",ma,m(ol.value),1)])])])])]),d("div",{class:b(["card stats-card",`stats-card-${e.channelType}`])},[d("div",ka,[v(y(ie),{size:14},{default:h(()=>[v(y(ne))]),_:1}),l[23]||(l[23]=d("h3",{class:"card-title"},"今日数据",-1))]),d("div",fa,[d("div",Ta,[d("div",ba,[l[25]||(l[25]=d("div",{class:"stat-icon-dot requests"},null,-1)),d("div",xa,[l[24]||(l[24]=d("span",{class:"stat-label"},"请求",-1)),d("span",{class:b(["stat-value",{animating:pl.value.requests}])},m(dl.value.requests),3)])]),d("div",_a,[l[27]||(l[27]=d("div",{class:"stat-icon-dot tokens"},null,-1)),d("div",Ca,[l[26]||(l[26]=d("span",{class:"stat-label"},"总 Tokens",-1)),d("span",{class:b(["stat-value",{animating:pl.value.tokens}])},m((t=dl.value.tokens,t>=1e6?(t/1e6).toFixed(1)+"M":t>=1e3?(t/1e3).toFixed(1)+"K":t.toString())),3)])]),d("div",wa,[l[29]||(l[29]=d("div",{class:"stat-icon-dot cost"},null,-1)),d("div",$a,[l[28]||(l[28]=d("span",{class:"stat-label"},"成本 / USD",-1)),d("span",{class:b(["stat-value",{animating:pl.value.cost}])},m((c=dl.value.cost,!c||Number.isNaN(c)?"$0":"$"+Number(c).toFixed(3))),3)])])])])],2),Object.keys(hl.value).length>0?(u(),i("div",{key:0,class:b(["card chart-card",`chart-card-${e.channelType}`])},[v(n,{"default-expanded-names":[],accordion:""})],2)):r("",!0),ql.value?(u(),i("div",qa,[v(n,{"default-expanded-names":[],accordion:""},{default:h(()=>[v(s,{name:"realtime-logs"},{header:h(()=>[d("div",za,[v(y(ie),{size:14,style:{"margin-right":"8px"}},{default:h(()=>[v(y(se))]),_:1}),l[30]||(l[30]=d("span",{class:"collapse-title"},"实时日志",-1)),v(y(pe),{text:"",size:"tiny",onClick:x(Xl,["stop"]),style:{"margin-left":"auto"},title:"清空日志"},{icon:h(()=>[v(y(ie),{size:14},{default:h(()=>[v(y(te))]),_:1})]),_:1})])]),default:h(()=>[d("div",Sa,[d("div",La,[d("div",{class:b(["logs-table-header",`logs-header-${e.channelType}`])},[d("div",{class:b(["log-col col-channel",`col-channel-${e.channelType}`])},"渠道",2),d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},"请求",2),d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},"回复",2),"claude"===e.channelType?(u(),i(f,{key:0},[d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},"写入",2),d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},"命中",2)],64)):"codex"===e.channelType?(u(),i(f,{key:1},[d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},"推理",2),d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2)],64)):"gemini"===e.channelType?(u(),i(f,{key:2},[d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2),d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},"总计",2)],64)):"opencode"===e.channelType?(u(),i(f,{key:3},[d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2),d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},"总计",2)],64)):r("",!0),d("div",{class:b(["log-col col-time",`col-time-${e.channelType}`])},"时间",2)],2),d("div",{class:"logs-container",ref_key:"logsContainer",ref:Il},[0===Ml.value.length?(u(),i("div",Ia,[v(y(ie),{size:32,depth:"3",style:{"margin-bottom":"8px"}},{default:h(()=>[v(y(se))]),_:1}),v(y(ue),{depth:"3",style:{"font-size":"12px","font-weight":"500"}},{default:h(()=>[...l[31]||(l[31]=[k("暂无实时日志",-1)])]),_:1}),v(y(ue),{depth:"3",style:{"font-size":"11px","margin-top":"4px"}},{default:h(()=>[...l[32]||(l[32]=[k("开启代理后将显示请求记录",-1)])]),_:1})])):r("",!0),(u(!0),i(f,null,T(Ml.value,a=>{var l,n,s,c,t,o,p,g,T,x;return u(),i("div",{key:a.id,class:b(["log-row",{"action-row":"action"===a.type,"new-log":a.isNew}])},["action"===a.type?(u(),i("div",Oa,[v(y(ie),{size:12,color:"#18a058"},{default:h(()=>[v(y(ce))]),_:1}),d("span",ja,m(a.message),1),d("span",Ma,m(a.time),1)])):(u(),i(f,{key:1},[d("div",{class:b(["log-col col-channel",`col-channel-${e.channelType}`])},[v(y(re),{size:"tiny",type:"success"},{default:h(()=>[k(m(a.channel),1)]),_:2},1024)],2),d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},m((null==(l=a.tokens)?void 0:l.input)||0),3),d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},m((null==(n=a.tokens)?void 0:n.output)||0),3),"claude"===e.channelType?(u(),i(f,{key:0},[d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},m((null==(s=a.tokens)?void 0:s.cacheCreation)||0),3),d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},m((null==(c=a.tokens)?void 0:c.cacheRead)||0),3)],64)):"codex"===e.channelType?(u(),i(f,{key:1},[d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},m((null==(t=a.tokens)?void 0:t.reasoning)||0),3),d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},m((null==(o=a.tokens)?void 0:o.cached)||0),3)],64)):"gemini"===e.channelType?(u(),i(f,{key:2},[d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},m((null==(p=a.tokens)?void 0:p.cached)||0),3),d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},m((null==(g=a.tokens)?void 0:g.total)||0),3)],64)):"opencode"===e.channelType?(u(),i(f,{key:3},[d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},m((null==(T=a.tokens)?void 0:T.cached)||0),3),d("div",{class:b(["log-col col-token",`col-token-${e.channelType}`])},m((null==(x=a.tokens)?void 0:x.total)||0),3)],64)):r("",!0),d("div",{class:b(["log-col col-time",`col-time-${e.channelType}`])},m(a.time),3)],64))],2)}),128))],512)])])]),_:1})]),_:1})])):r("",!0)])),wl.value?(u(),i("div",{key:1,class:b(["locked-overlay",`locked-${e.channelType}`])},[d("div",Na,[d("div",Aa,[v(y(ie),{size:48},{default:h(()=>[v(y(W))]),_:1})]),l[34]||(l[34]=d("h3",{class:"locked-title"},"该渠道已锁定",-1)),v(y(ue),{depth:"3",class:"locked-hint"},{default:h(()=>[...l[33]||(l[33]=[k(" 点击上方按钮解锁以查看内容 ",-1)])]),_:1})])],2)):r("",!0),v(q,{visible:gl.value,"onUpdate:visible":l[2]||(l[2]=e=>gl.value=e),channel:e.channelType},null,8,["visible","channel"])]);var c,t}}},[["__scopeId","data-v-6e326af1"]]),Ua=n({theme:"light",panelVisibility:{showChannels:!0,showLogs:!0},channelLocks:{claude:!1,codex:!1,gemini:!1},channelCollapse:{claude:[],codex:[],gemini:[]},channelOrder:{claude:[],codex:[],gemini:[]}});let Da=!1;async function Ea(){if(Da)return Ua.value;try{const e=await M();e.success&&e.config&&(Ua.value=e.config,Da=!0)}catch(e){}return Ua.value}const Va={class:"dashboard-container"},Ja="dashboardChannelOrder",Ga=C({__name:"Home",setup(a){const l=["claude","codex","gemini","opencode"],{uiConfig:s,updateConfig:t,loadUIConfig:o}=(Da||Ea(),{uiConfig:Ua,loadUIConfig:Ea,saveConfig:async function(e){try{const a=await J(e);return!!a.success&&(Ua.value=a.config,!0)}catch(a){return!1}},updateConfig:async function(e,a){try{const l=await V(e,a);return!!l.success&&(Ua.value=l.config,!0)}catch(l){return!1}},updateNestedConfig:async function(e,a,l){try{const n=await E(e,a,l);return!!n.success&&(Ua.value=n.config,!0)}catch(n){return!1}}});function d(e){try{localStorage.setItem(Ja,JSON.stringify(e))}catch(a){}}const r=n(function(){try{const e=localStorage.getItem(Ja);if(e){const a=JSON.parse(e);if(Array.isArray(a)&&4===a.length)return a}}catch(e){}return l}().map(e=>({type:e})));async function g(){const e=r.value.map(e=>e.type);d(e),await t("dashboardChannelOrder",e)}return c(async()=>{if(await o(),s.value.dashboardChannelOrder&&Array.isArray(s.value.dashboardChannelOrder)&&4===s.value.dashboardChannelOrder.length){const e=s.value.dashboardChannelOrder;r.value=e.map(e=>({type:e})),d(e)}}),(a,l)=>(u(),i("div",Va,[v(y(e),{modelValue:r.value,"onUpdate:modelValue":l[0]||(l[0]=e=>r.value=e),class:"dashboard-grid","item-key":"type",animation:200,handle:".drag-handle",onEnd:g},{item:h(({element:e})=>[(u(),p(Pa,{"channel-type":e.type,key:e.type},null,8,["channel-type"]))]),_:1},8,["modelValue"])]))}},[["__scopeId","data-v-4a01933c"]]);export{Ga as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.channel-column[data-v-6e326af1]{display:flex;flex-direction:column;height:100%;min-height:0;background:var(--gradient-card);border:1px solid var(--border-primary);border-radius:8px;overflow:hidden;box-shadow:var(--shadow-sm)}.channel-header[data-v-6e326af1]{display:flex;align-items:center;gap:10px;padding:12px 14px;background:var(--bg-primary);position:relative}.drag-handle[data-v-6e326af1]{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-6e326af1]:hover{color:var(--text-secondary);background:var(--bg-tertiary)}.drag-handle[data-v-6e326af1]:active{cursor:grabbing}.channel-header[data-v-6e326af1]:after{content:"";position:absolute;bottom:0;left:14px;right:14px;height:2px;border-radius:1px}.channel-header.claude[data-v-6e326af1]{background:linear-gradient(135deg,rgba(24,160,88,.08) 0%,transparent 100%)}.channel-header.claude[data-v-6e326af1]:after{background:linear-gradient(90deg,#18a058,#18a0584d)}.channel-header.codex[data-v-6e326af1]{background:linear-gradient(135deg,rgba(59,130,246,.08) 0%,transparent 100%)}.channel-header.codex[data-v-6e326af1]:after{background:linear-gradient(90deg,#3b82f6,#3b82f64d)}.channel-header.gemini[data-v-6e326af1]{background:linear-gradient(135deg,rgba(168,85,247,.08) 0%,transparent 100%)}.channel-header.gemini[data-v-6e326af1]:after{background:linear-gradient(90deg,#a855f7,#a855f74d)}.channel-header.opencode[data-v-6e326af1]{background:linear-gradient(135deg,rgba(234,88,12,.08) 0%,transparent 100%)}.channel-header.opencode[data-v-6e326af1]:after{background:linear-gradient(90deg,#ea580c,#ea580c4d)}.header-icon[data-v-6e326af1]{width:32px;height:32px;border-radius:6px;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 8px #0000001a}.channel-header.claude .header-icon[data-v-6e326af1]{background:linear-gradient(135deg,#18a058,#15803d);color:#fff}.channel-header.codex .header-icon[data-v-6e326af1]{background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff}.channel-header.gemini .header-icon[data-v-6e326af1]{background:linear-gradient(135deg,#a855f7,#9333ea);color:#fff}.channel-header.opencode .header-icon[data-v-6e326af1]{background:linear-gradient(135deg,#ea580c,#c2410c);color:#fff}.channel-title[data-v-6e326af1]{font-size:15px;font-weight:700;margin:0;color:var(--text-primary);letter-spacing:.3px}.channel-content[data-v-6e326af1]{flex:1;min-height:0;overflow:hidden;padding:10px;display:flex;flex-direction:column;gap:8px}.card[data-v-6e326af1]{background:var(--bg-primary);border:1px solid var(--border-primary);border-radius:8px;overflow:hidden;transition:all .3s cubic-bezier(.4,0,.2,1);box-shadow:0 2px 12px #0000000d;position:relative}.card[data-v-6e326af1]: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-6e326af1]:hover{box-shadow:0 6px 20px #0000001a;border-color:var(--border-secondary)}.card[data-v-6e326af1]:hover:before{opacity:1}.card.clickable[data-v-6e326af1]{cursor:pointer}.card.clickable[data-v-6e326af1]:hover{border-color:#18a058;transform:translateY(-2px);box-shadow:0 8px 24px #18a0582e}.card.clickable[data-v-6e326af1]: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-6e326af1]:hover:after{opacity:1}.card-header[data-v-6e326af1]{display:flex;align-items:center;gap:8px;padding:10px 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-6e326af1]{padding:8px 12px}.card-header .n-icon[data-v-6e326af1]{color:var(--text-tertiary);transition:color .2s ease}.card:hover .card-header .n-icon[data-v-6e326af1]{color:var(--text-secondary)}.card-title[data-v-6e326af1]{font-size:11px;font-weight:700;margin:0;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.8px}.runtime-badge[data-v-6e326af1]{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:4px;white-space:nowrap;animation:pulse-runtime-6e326af1 2s ease-in-out infinite}@keyframes pulse-runtime-6e326af1{0%,to{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(.98)}}.card-body[data-v-6e326af1]{padding:12px;background:var(--bg-primary)}.card-body.compact[data-v-6e326af1]{padding:10px 12px}.proxy-control[data-v-6e326af1]{display:flex;justify-content:space-between;align-items:center;gap:16px}.proxy-info[data-v-6e326af1]{display:flex;flex-direction:column;gap:4px}.proxy-info-row[data-v-6e326af1]{display:flex;align-items:center;justify-content:space-between}.proxy-status[data-v-6e326af1]{display:flex;align-items:center;gap:6px}.proxy-port[data-v-6e326af1]{font-size:11px;color:var(--text-secondary);margin-left:6px}.channel-selector[data-v-6e326af1]{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-6e326af1]:hover{background:var(--hover-bg);border-color:var(--border-secondary);color:var(--text-primary)}.channel-selector[data-v-6e326af1]:disabled{opacity:.5;cursor:not-allowed}.channel-name[data-v-6e326af1]{font-size:11px;font-weight:500;max-width:90px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-dot[data-v-6e326af1]{width:8px;height:8px;border-radius:50%;background:var(--border-secondary);transition:all .3s ease}.status-dot.active[data-v-6e326af1]{background:#18a058;box-shadow:0 0 8px #18a05880}.quick-stats[data-v-6e326af1]{display:flex;gap:16px;padding:4px 0}.stat-item[data-v-6e326af1]{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;padding:4px 0}.stat-divider[data-v-6e326af1]{width:1px;background:linear-gradient(180deg,transparent 0%,var(--border-primary) 50%,transparent 100%)}.quick-access-list[data-v-6e326af1]{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}.access-card[data-v-6e326af1]{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:6px;background:var(--bg-secondary);border:1px solid var(--border-color);transition:all .3s cubic-bezier(.4,0,.2,1);position:relative;min-height:52px;overflow:hidden}.access-card[data-v-6e326af1]: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-6e326af1]{width:32px;height:32px;border-radius:5px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all .3s ease}.access-content[data-v-6e326af1]{display:flex;flex-direction:column;gap:4px;flex:1}.access-card-projects .access-icon[data-v-6e326af1]{background:linear-gradient(135deg,#6366f126,#8b5cf626);color:#6366f1}.access-card-projects[data-v-6e326af1]:before{background:linear-gradient(135deg,#6366f114,#8b5cf614)}.access-card-projects:hover .access-icon[data-v-6e326af1]{background:linear-gradient(135deg,#6366f140,#8b5cf640);transform:scale(1.1) rotate(-5deg)}.access-card-sessions .access-icon[data-v-6e326af1]{background:linear-gradient(135deg,#10b98126,#05966926);color:#10b981}.access-card-sessions[data-v-6e326af1]:before{background:linear-gradient(135deg,#10b98114,#05966914)}.access-card-sessions:hover .access-icon[data-v-6e326af1]{background:linear-gradient(135deg,#10b98140,#05966940);transform:scale(1.1) rotate(5deg)}.access-card-goto .access-icon[data-v-6e326af1]{background:linear-gradient(135deg,#f59e0b26,#fb923c26);color:#f59e0b}.access-card-goto[data-v-6e326af1]:before{background:linear-gradient(135deg,#f59e0b14,#fb923c14)}.access-card-goto:hover .access-icon[data-v-6e326af1]{background:linear-gradient(135deg,#f59e0b40,#fb923c40);transform:scale(1.1) translate(3px)}.access-card.clickable[data-v-6e326af1]:hover{transform:translateY(-2px);box-shadow:0 8px 20px #0000001a;border-color:var(--border-secondary)}.access-card.clickable[data-v-6e326af1]:hover:before{opacity:1}.access-card.clickable[data-v-6e326af1]:active{transform:translateY(0)}.access-label[data-v-6e326af1]{display:block;font-size:10px;font-weight:600;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.3px}.access-value[data-v-6e326af1]{display:block;font-size:18px;font-weight:800;color:var(--text-primary);line-height:1}.access-goto[data-v-6e326af1]{display:block;font-size:12px;font-weight:700;color:var(--text-primary);line-height:1.2;white-space:nowrap}.stats-inline[data-v-6e326af1]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}.stats-inline.stats-3col[data-v-6e326af1]{grid-template-columns:repeat(3,1fr)}.stat-inline-item[data-v-6e326af1]{display:flex;align-items:center;gap:8px;padding:10px;background:var(--bg-secondary);border-radius:6px;border:1px solid var(--border-primary);transition:all .2s ease}.stat-inline-item[data-v-6e326af1]:hover{border-color:var(--border-secondary);background:var(--hover-bg)}.stat-icon-dot[data-v-6e326af1]{width:8px;height:8px;border-radius:50%;flex-shrink:0}.stat-icon-dot.requests[data-v-6e326af1]{background:#3b82f6;box-shadow:0 0 6px #3b82f680}.stat-icon-dot.tokens[data-v-6e326af1]{background:#18a058;box-shadow:0 0 6px #18a05880}.stat-icon-dot.cost[data-v-6e326af1]{background:#f59e0b;box-shadow:0 0 6px #f59e0b80}.stat-info[data-v-6e326af1]{display:flex;flex-direction:column;gap:1px;min-width:0}.stat-label[data-v-6e326af1]{font-size:10px;color:var(--text-tertiary);font-weight:500;text-transform:uppercase;letter-spacing:.2px}.stat-value[data-v-6e326af1]{font-size:16px;font-weight:700;color:var(--text-primary);line-height:1.2;transition:all .3s ease}.stat-value.animating[data-v-6e326af1]{animation:numberChange-6e326af1 .6s ease}@keyframes numberChange-6e326af1{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-6e326af1],.chart-card[data-v-6e326af1]{border-left:2px solid transparent}.stats-card-claude[data-v-6e326af1],.chart-card[data-v-6e326af1]:has(+.stats-card-claude),.card[data-v-6e326af1]:has(.panel-card):nth-child(4){border-left-color:#18a058}.chart-card.chart-card-claude[data-v-6e326af1]{border-left-color:#18a058}.stats-card-codex[data-v-6e326af1],.chart-card[data-v-6e326af1]:has(+.stats-card-codex),.card[data-v-6e326af1]:has(.panel-card):nth-child(4){border-left-color:#3b82f6}.chart-card.chart-card-codex[data-v-6e326af1]{border-left-color:#3b82f6}.stats-card-gemini[data-v-6e326af1],.chart-card[data-v-6e326af1]:has(+.stats-card-gemini),.card[data-v-6e326af1]:has(.panel-card):nth-child(4){border-left-color:#a855f7}.chart-card.chart-card-gemini[data-v-6e326af1]{border-left-color:#a855f7}.stats-card-opencode[data-v-6e326af1],.chart-card[data-v-6e326af1]:has(+.stats-card-opencode),.card[data-v-6e326af1]:has(.panel-card):nth-child(4){border-left-color:#ea580c}.chart-card.chart-card-opencode[data-v-6e326af1]{border-left-color:#ea580c}.chart-card[data-v-6e326af1]{padding:0;overflow:hidden}.chart-card[data-v-6e326af1] .panel-card{border:none;border-radius:0;box-shadow:none;background:transparent}.stat-requests .stat-value[data-v-6e326af1]{color:#3b82f6}.stat-input .stat-value[data-v-6e326af1]{color:#18a058}.stat-output .stat-value[data-v-6e326af1]{color:#f59e0b}.token-label[data-v-6e326af1]{display:flex;align-items:center;gap:8px}.token-dot[data-v-6e326af1]{width:8px;height:8px;border-radius:50%}.logs-card[data-v-6e326af1]{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--border-primary);border-radius:6px}.logs-card[data-v-6e326af1] .n-collapse,.logs-card[data-v-6e326af1] .n-collapse-item{flex:1;min-height:0;display:flex;flex-direction:column;background:transparent}.logs-card .card-header[data-v-6e326af1]{background:linear-gradient(135deg,var(--bg-secondary) 0%,var(--bg-tertiary) 100%)}.logs-table-wrapper[data-v-6e326af1]{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;background:var(--bg-primary)}.logs-table-header[data-v-6e326af1]{display:flex;padding:10px 12px;background:linear-gradient(180deg,var(--bg-tertiary) 0%,var(--bg-secondary) 100%);border-bottom:2px 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-6e326af1]{color:#18a058b3;font-weight:600}.logs-header-codex .log-col[data-v-6e326af1]{color:#3b82f6b3;font-weight:600}.logs-header-gemini .log-col[data-v-6e326af1]{color:#a855f7b3;font-weight:600}.logs-header-opencode .log-col[data-v-6e326af1]{color:#ea580cb3;font-weight:600}[data-theme=dark] .logs-header-claude .log-col[data-v-6e326af1]{color:#34d399a6}[data-theme=dark] .logs-header-codex .log-col[data-v-6e326af1]{color:#60a5faa6}[data-theme=dark] .logs-header-gemini .log-col[data-v-6e326af1]{color:#c084fca6}[data-theme=dark] .logs-header-opencode .log-col[data-v-6e326af1]{color:#fb923ca6}.logs-container[data-v-6e326af1]{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden}.logs-container[data-v-6e326af1]::-webkit-scrollbar{width:4px}.logs-container[data-v-6e326af1]::-webkit-scrollbar-thumb{background:#18a0584d;border-radius:2px}.logs-container[data-v-6e326af1]::-webkit-scrollbar-thumb:hover{background:#18a05880}.empty-logs[data-v-6e326af1]{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-6e326af1]{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-6e326af1]:nth-child(2n){background:var(--bg-secondary)}.log-row[data-v-6e326af1]:hover{background:var(--hover-bg);transform:translate(2px)}.log-row.new-log[data-v-6e326af1]{animation:newLogPulse-6e326af1 4.5s cubic-bezier(.25,.46,.45,.94) forwards;border-left:3px solid #18a058}@keyframes newLogPulse-6e326af1{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-6e326af1]{animation:newLogPulseDark-6e326af1 4.5s cubic-bezier(.25,.46,.45,.94) forwards}@keyframes newLogPulseDark-6e326af1{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-6e326af1]{border-left:3px solid #18a058}.log-row.action-row[data-v-6e326af1]{background:linear-gradient(90deg,#18a0581f,#18a0580a);border-left:3px solid #18a058;padding-left:8px}.log-row.action-row[data-v-6e326af1]:hover{background:linear-gradient(90deg,#18a0582e,#18a05814)}.action-content[data-v-6e326af1]{display:flex;align-items:center;gap:8px;width:100%}.action-msg[data-v-6e326af1]{flex:1;font-size:11px;color:#18a058;font-weight:600;letter-spacing:.2px}.action-time[data-v-6e326af1]{font-size:10px;font-family:SF Mono,Monaco,monospace;color:var(--text-tertiary);background:#18a0581a;padding:2px 6px;border-radius:4px}.log-col[data-v-6e326af1]{display:flex;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-channel[data-v-6e326af1]{min-width:0}.col-channel .n-tag[data-v-6e326af1]{max-width:100%;font-size:11px;font-weight:600;border-radius:4px;padding:3px 10px}.col-token[data-v-6e326af1]{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-6e326af1]{background:#ffffff0f}.col-time[data-v-6e326af1]{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-6e326af1]{opacity:1;color:var(--text-secondary)}.col-channel-claude[data-v-6e326af1]{flex:2 1 60px;min-width:50px}.col-token-claude[data-v-6e326af1]{flex:1 1 40px;min-width:35px}.col-time-claude[data-v-6e326af1]{flex:1.5 1 55px;min-width:50px}.col-channel-codex[data-v-6e326af1]{flex:2 1 60px;min-width:50px}.col-token-codex[data-v-6e326af1]{flex:1 1 40px;min-width:35px}.col-time-codex[data-v-6e326af1]{flex:1.5 1 55px;min-width:50px}.col-channel-gemini[data-v-6e326af1]{flex:2.5 1 70px;min-width:55px}.col-token-gemini[data-v-6e326af1]{flex:1.2 1 45px;min-width:40px}.col-time-gemini[data-v-6e326af1]{flex:1.8 1 60px;min-width:55px}.col-channel-opencode[data-v-6e326af1]{flex:2.5 1 70px;min-width:55px}.col-token-opencode[data-v-6e326af1]{flex:1.2 1 45px;min-width:40px}.col-time-opencode[data-v-6e326af1]{flex:1.8 1 60px;min-width:55px}.claude-extra-area[data-v-6e326af1]{display:flex;align-items:center;gap:6px;margin-left:auto}.mcp-count-tag[data-v-6e326af1],.skills-count-tag[data-v-6e326af1]{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-6e326af1]:hover,.skills-count-tag.clickable[data-v-6e326af1]:hover{transform:scale(1.03);filter:brightness(1.1)}.mcp-quick-panel[data-v-6e326af1],.skills-quick-panel[data-v-6e326af1]{padding:2px 0}.mcp-quick-panel .panel-title[data-v-6e326af1],.skills-quick-panel .panel-title[data-v-6e326af1]{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-6e326af1]:first-child,.skills-quick-panel .panel-title span[data-v-6e326af1]:first-child{font-size:13px;font-weight:600;color:var(--text-primary)}.no-items[data-v-6e326af1]{padding:16px 10px;text-align:center}.mcp-quick-list[data-v-6e326af1],.skills-quick-list[data-v-6e326af1]{max-height:300px;overflow-y:auto;padding:0 4px 4px}.mcp-quick-item[data-v-6e326af1],.skill-quick-item[data-v-6e326af1]{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-6e326af1]:hover,.skill-quick-item[data-v-6e326af1]:hover{background:var(--hover-bg)}.mcp-item-icon[data-v-6e326af1],.skill-item-icon[data-v-6e326af1]{width:24px;height:24px;border-radius:5px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.mcp-item-icon[data-v-6e326af1]{background:linear-gradient(135deg,#3b82f626,#3b82f60d);color:#3b82f6}.skill-item-icon[data-v-6e326af1]{background:linear-gradient(135deg,#18a05826,#18a0580d);color:#18a058}.mcp-item-info[data-v-6e326af1],.skill-item-info[data-v-6e326af1]{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.mcp-item-name[data-v-6e326af1],.skill-item-name[data-v-6e326af1]{font-size:12px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mcp-item-type[data-v-6e326af1]{font-size:10px;color:var(--text-tertiary);text-transform:uppercase}.skill-item-desc[data-v-6e326af1]{font-size:10px;color:var(--text-tertiary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mcp-item-status[data-v-6e326af1]{flex-shrink:0}.mcp-item-status .status-dot[data-v-6e326af1]{width:8px;height:8px;border-radius:50%;background:var(--border-secondary)}.mcp-item-status.online .status-dot[data-v-6e326af1]{background:#18a058;box-shadow:0 0 6px #18a05880}.mcp-item-status.error .status-dot[data-v-6e326af1]{background:#d03050;box-shadow:0 0 6px #d0305080}.mcp-quick-list[data-v-6e326af1]::-webkit-scrollbar,.skills-quick-list[data-v-6e326af1]::-webkit-scrollbar{width:4px}.mcp-quick-list[data-v-6e326af1]::-webkit-scrollbar-thumb,.skills-quick-list[data-v-6e326af1]::-webkit-scrollbar-thumb{background:#00000026;border-radius:2px}[data-theme=dark] .mcp-quick-list[data-v-6e326af1]::-webkit-scrollbar-thumb,[data-theme=dark] .skills-quick-list[data-v-6e326af1]::-webkit-scrollbar-thumb{background:#ffffff26}.skills-button[data-v-6e326af1]{padding:6px!important;width:30px;height:30px;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}.skills-button .n-icon[data-v-6e326af1]{color:var(--text-color-3);transition:all .25s ease}.skills-button[data-v-6e326af1]:hover{background:linear-gradient(135deg,#18a0581a,#18a0580d);border-color:#18a0584d;box-shadow:0 4px 12px #18a05826;transform:translateY(-1px)}.skills-button:hover .n-icon[data-v-6e326af1]{color:#18a058;transform:scale(1.1)}.skills-button[data-v-6e326af1]:active{transform:translateY(0);box-shadow:0 2px 4px #0000000d}.lock-button[data-v-6e326af1]{margin-left:6px;padding:6px!important;width:30px;height:30px;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-6e326af1]{color:var(--text-color-3);transition:all .25s ease}.lock-button[data-v-6e326af1]: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-6e326af1]{color:var(--text-color-1);transform:scale(1.1)}.lock-button[data-v-6e326af1]:active{transform:translateY(0);box-shadow:0 2px 4px #0000000d}.locked-overlay[data-v-6e326af1]{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-6e326af1]: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-6e326af1]{background:linear-gradient(135deg,rgba(24,160,88,.03) 0%,var(--bg-secondary) 50%,rgba(24,160,88,.02) 100%)}.locked-claude[data-v-6e326af1]:before{background:radial-gradient(circle,rgba(24,160,88,.15) 0%,transparent 70%)}.locked-codex[data-v-6e326af1]{background:linear-gradient(135deg,rgba(59,130,246,.03) 0%,var(--bg-secondary) 50%,rgba(59,130,246,.02) 100%)}.locked-codex[data-v-6e326af1]:before{background:radial-gradient(circle,rgba(59,130,246,.15) 0%,transparent 70%)}.locked-gemini[data-v-6e326af1]{background:linear-gradient(135deg,rgba(168,85,247,.03) 0%,var(--bg-secondary) 50%,rgba(168,85,247,.02) 100%)}.locked-gemini[data-v-6e326af1]:before{background:radial-gradient(circle,rgba(168,85,247,.15) 0%,transparent 70%)}.locked-opencode[data-v-6e326af1]{background:linear-gradient(135deg,rgba(234,88,12,.03) 0%,var(--bg-secondary) 50%,rgba(234,88,12,.02) 100%)}.locked-opencode[data-v-6e326af1]:before{background:radial-gradient(circle,rgba(234,88,12,.15) 0%,transparent 70%)}.locked-content[data-v-6e326af1]{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-6e326af1]{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-6e326af1 3s ease-in-out infinite}@keyframes lock-float-6e326af1{0%,to{transform:translateY(0)}50%{transform:translateY(-6px)}}.lock-icon[data-v-6e326af1]: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-6e326af1]{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-6e326af1]:before{background:radial-gradient(circle,rgba(24,160,88,.3) 0%,transparent 60%)}.locked-claude .lock-icon .n-icon[data-v-6e326af1]{color:#18a058;filter:drop-shadow(0 2px 4px rgba(24,160,88,.3))}.locked-codex .lock-icon[data-v-6e326af1]{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-6e326af1]:before{background:radial-gradient(circle,rgba(59,130,246,.3) 0%,transparent 60%)}.locked-codex .lock-icon .n-icon[data-v-6e326af1]{color:#3b82f6;filter:drop-shadow(0 2px 4px rgba(59,130,246,.3))}.locked-gemini .lock-icon[data-v-6e326af1]{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-6e326af1]:before{background:radial-gradient(circle,rgba(168,85,247,.3) 0%,transparent 60%)}.locked-gemini .lock-icon .n-icon[data-v-6e326af1]{color:#a855f7;filter:drop-shadow(0 2px 4px rgba(168,85,247,.3))}.locked-opencode .lock-icon[data-v-6e326af1]{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-6e326af1]:before{background:radial-gradient(circle,rgba(234,88,12,.3) 0%,transparent 60%)}.locked-opencode .lock-icon .n-icon[data-v-6e326af1]{color:#ea580c;filter:drop-shadow(0 2px 4px rgba(234,88,12,.3))}.lock-icon .n-icon[data-v-6e326af1]{opacity:.85;position:relative;z-index:1}.locked-title[data-v-6e326af1]{font-size:17px;font-weight:600;color:var(--text-color-1);margin:0;letter-spacing:.3px}.locked-hint[data-v-6e326af1]{font-size:13px;color:var(--text-color-3);max-width:220px;line-height:1.7;opacity:.9}.channel-status[data-v-6e326af1]{cursor:pointer;padding:4px 8px!important;border-radius:4px;transition:all .2s ease}.channel-status[data-v-6e326af1]:hover{background:var(--hover-bg)}.channel-quick-panel[data-v-6e326af1]{padding:4px 0}.panel-title[data-v-6e326af1]{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-6e326af1]:first-child{font-size:13px;font-weight:600;color:var(--text-primary)}.no-channels[data-v-6e326af1]{padding:24px 12px;text-align:center}.channel-quick-list[data-v-6e326af1]{max-height:360px;overflow-y:auto}.channel-quick-item[data-v-6e326af1]{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-6e326af1]:hover{background:var(--hover-bg)}.channel-quick-item.disabled[data-v-6e326af1]{opacity:.6}.channel-quick-info[data-v-6e326af1]{display:flex;align-items:center;gap:8px;width:100%}.channel-quick-name[data-v-6e326af1]{font-size:13px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.channel-metrics[data-v-6e326af1]{display:flex;gap:6px;width:100%}.channel-metrics .metric-item[data-v-6e326af1]{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-6e326af1]{font-size:10px;color:var(--text-tertiary);font-weight:500}.channel-metrics .metric-value[data-v-6e326af1]{font-size:12px;font-weight:700;color:var(--text-primary);font-family:SF Mono,Monaco,monospace}.channel-metrics .metric-value.active[data-v-6e326af1]{color:#f59e0b}.channel-quick-item.disabled .channel-metrics .metric-value[data-v-6e326af1]{color:var(--text-tertiary)}.channel-quick-list[data-v-6e326af1]::-webkit-scrollbar{width:4px}.channel-quick-list[data-v-6e326af1]::-webkit-scrollbar-thumb{background:#00000026;border-radius:2px}[data-theme=dark] .channel-quick-list[data-v-6e326af1]::-webkit-scrollbar-thumb{background:#ffffff26}@media (max-width: 1024px){.channel-column[data-v-6e326af1]{border-radius:6px}.card-header[data-v-6e326af1]{padding:8px 10px}.card-title[data-v-6e326af1]{font-size:13px}.stats-inline[data-v-6e326af1]{gap:6px}.stat-inline-item[data-v-6e326af1]{padding:8px}.stat-value[data-v-6e326af1]{font-size:14px}.stat-label[data-v-6e326af1]{font-size:9px}.logs-table-header[data-v-6e326af1]{padding:8px 10px;font-size:10px}.log-row[data-v-6e326af1]{padding:8px 10px;font-size:11px}}@media (max-width: 768px){.channel-column[data-v-6e326af1]{border-radius:6px;min-height:300px;height:auto;max-height:400px}.card-header[data-v-6e326af1]{padding:8px;gap:6px}.card-title[data-v-6e326af1]{font-size:12px}.stats-inline[data-v-6e326af1]{gap:4px}.stat-inline-item[data-v-6e326af1]{padding:6px;gap:6px}.stat-icon-dot[data-v-6e326af1]{width:6px;height:6px}.stat-value[data-v-6e326af1]{font-size:13px}.stat-label[data-v-6e326af1]{font-size:8px}.logs-card[data-v-6e326af1]{min-height:150px}.logs-table-header[data-v-6e326af1]{padding:6px 8px;font-size:9px}.log-row[data-v-6e326af1]{padding:6px 8px;font-size:10px;min-height:32px}.col-token[data-v-6e326af1]{font-size:10px;padding:2px 4px}.col-time[data-v-6e326af1]{font-size:9px}.mcp-count-tag[data-v-6e326af1],.skills-count-tag[data-v-6e326af1]{font-size:9px;padding:0 6px;height:18px;line-height:18px}.skills-button[data-v-6e326af1]{padding:4px 8px;font-size:10px;gap:4px}.lock-button[data-v-6e326af1]{width:26px;height:26px}}@media (max-width: 640px){.channel-column[data-v-6e326af1]{min-height:250px;max-height:350px}.card-header[data-v-6e326af1]{padding:6px;gap:4px;flex-wrap:wrap}.card-title[data-v-6e326af1]{font-size:11px}.stats-card .card-content[data-v-6e326af1]{padding:6px}.stats-inline[data-v-6e326af1]{gap:3px;flex-wrap:wrap}.stat-inline-item[data-v-6e326af1]{padding:5px;gap:4px;min-width:calc(33% - 3px);flex:1 1 auto}.stat-icon-dot[data-v-6e326af1]{width:5px;height:5px}.stat-value[data-v-6e326af1]{font-size:12px}.stat-label[data-v-6e326af1]{font-size:7px}.logs-card[data-v-6e326af1]{min-height:120px}.logs-table-header[data-v-6e326af1]{padding:5px 6px;font-size:8px;letter-spacing:.3px}.log-row[data-v-6e326af1]{padding:5px 6px;font-size:9px;min-height:28px}.col-channel .n-tag[data-v-6e326af1]{font-size:9px;padding:2px 6px}.col-token[data-v-6e326af1]{font-size:9px;padding:2px 3px;margin:0 1px}.col-time[data-v-6e326af1]{font-size:8px}.claude-extra-area[data-v-6e326af1]{gap:4px}.mcp-count-tag[data-v-6e326af1],.skills-count-tag[data-v-6e326af1]{font-size:8px;padding:0 4px;height:16px;line-height:16px}.skills-button[data-v-6e326af1]{padding:3px 6px;font-size:9px;gap:3px}.skills-button .n-icon[data-v-6e326af1]{font-size:12px!important}.lock-button[data-v-6e326af1]{width:24px;height:24px;margin-left:4px}.lock-button .n-icon[data-v-6e326af1]{font-size:12px!important}.locked-content[data-v-6e326af1]{padding:30px 20px;gap:12px}.lock-icon[data-v-6e326af1]{width:64px;height:64px}.lock-icon .n-icon[data-v-6e326af1]{font-size:28px!important}.lock-title[data-v-6e326af1]{font-size:14px}.lock-subtitle[data-v-6e326af1]{font-size:10px}.unlock-btn[data-v-6e326af1]{padding:8px 16px;font-size:11px}}@media (max-width: 480px){.channel-column[data-v-6e326af1]{min-height:220px;max-height:300px}.card-header[data-v-6e326af1]{padding:5px}.card-title[data-v-6e326af1]{font-size:10px}.stats-inline[data-v-6e326af1]{gap:2px}.stat-inline-item[data-v-6e326af1]{padding:4px;gap:3px}.stat-value[data-v-6e326af1]{font-size:11px}.stat-label[data-v-6e326af1]{font-size:6px}.logs-table-header[data-v-6e326af1]{padding:4px 5px;font-size:7px}.log-row[data-v-6e326af1]{padding:4px 5px;font-size:8px;min-height:24px}.col-token[data-v-6e326af1]{font-size:8px}.col-time[data-v-6e326af1]{font-size:7px}}.collapse-header[data-v-6e326af1]{display:flex;align-items:center;width:100%;font-weight:500;font-size:13px;color:var(--text-color-1)}.collapse-title[data-v-6e326af1]{flex:1}.collapse-content[data-v-6e326af1]{flex:1;min-height:0;display:flex;flex-direction:column;padding-top:8px}.scrollable-content[data-v-6e326af1]{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden}.scrollable-content[data-v-6e326af1]::-webkit-scrollbar{width:6px}.scrollable-content[data-v-6e326af1]::-webkit-scrollbar-track{background:#0000000d;border-radius:3px}.scrollable-content[data-v-6e326af1]::-webkit-scrollbar-thumb{background:#0003;border-radius:3px;transition:background .2s}.scrollable-content[data-v-6e326af1]::-webkit-scrollbar-thumb:hover{background:#0000004d}.card[data-v-6e326af1]:not(.logs-card) .n-collapse{background:transparent}.card[data-v-6e326af1]:not(.logs-card) .n-collapse-item{background:transparent}.card[data-v-6e326af1] .n-collapse-item__header{padding:12px 16px;background:transparent;transition:all .3s ease}.card[data-v-6e326af1] .n-collapse-item__header:hover{background:#00000005}.card[data-v-6e326af1] .n-collapse-item__header-main{width:100%}.card[data-v-6e326af1]:not(.logs-card) .n-collapse-item__content-wrapper{padding:0 16px 12px}.card[data-v-6e326af1]:not(.logs-card) .n-collapse-item__content-inner{padding-top:0}.logs-card[data-v-6e326af1] .n-collapse-item__content-wrapper{padding:0 16px;flex:1;min-height:0;display:flex;flex-direction:column}.logs-card[data-v-6e326af1] .n-collapse-item__content-inner{padding-top:0;flex:1;min-height:0;display:flex;flex-direction:column}.chart-card[data-v-6e326af1]:has(.n-collapse),.logs-card[data-v-6e326af1]:has(.n-collapse){padding:0}.collapse-content .logs-table-wrapper[data-v-6e326af1]{margin:0}@media (max-width: 480px){.collapse-header[data-v-6e326af1]{font-size:11px}}.dashboard-container[data-v-4a01933c]{height:100%;background:var(--bg-primary);overflow:hidden;padding:12px;box-sizing:border-box;display:flex;flex-direction:column}.dashboard-grid[data-v-4a01933c]{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;flex:1;min-height:0;overflow:hidden;box-sizing:border-box}.dashboard-grid[data-v-4a01933c] .sortable-ghost{opacity:.4}.dashboard-grid[data-v-4a01933c] .sortable-chosen{box-shadow:0 8px 24px #00000026}@media (max-width: 1600px){.dashboard-grid[data-v-4a01933c]{grid-template-columns:repeat(3,1fr)}}@media (max-width: 1200px){.dashboard-grid[data-v-4a01933c]{grid-template-columns:repeat(2,1fr)}}@media (max-width: 1024px){.dashboard-container[data-v-4a01933c]{padding:10px}.dashboard-grid[data-v-4a01933c]{gap:10px}}@media (max-width: 900px){.dashboard-grid[data-v-4a01933c]{grid-template-columns:1fr}}@media (max-width: 768px){.dashboard-container[data-v-4a01933c]{padding:8px;overflow-y:auto}.dashboard-grid[data-v-4a01933c]{gap:8px;overflow:visible;min-height:auto}}@media (max-width: 640px){.dashboard-container[data-v-4a01933c]{padding:6px}.dashboard-grid[data-v-4a01933c]{gap:6px}}@media (max-width: 480px){.dashboard-container[data-v-4a01933c]{padding:4px}.dashboard-grid[data-v-4a01933c]{gap:4px}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.session-list-container[data-v-5b86eea5]{width:100%;height:100%;display:flex;flex-direction:column;box-sizing:border-box}.header[data-v-5b86eea5]{flex-shrink:0;padding:24px 24px 16px;background:var(--bg-primary);border-bottom:1px solid var(--border-primary)}.content[data-v-5b86eea5]{flex:1;overflow-y:auto;padding:16px 24px 24px}.back-button[data-v-5b86eea5]{flex-shrink:0;margin-right:12px}.title-bar[data-v-5b86eea5]{display:flex;align-items:center;gap:16px}.title-section[data-v-5b86eea5]{flex:1;min-width:0}.title-with-count[data-v-5b86eea5]{display:flex;align-items:baseline;gap:8px;margin-bottom:2px}.title-section h2[data-v-5b86eea5]{margin:0;font-size:20px}.session-count[data-v-5b86eea5]{font-size:14px;color:#666}.total-size-tag[data-v-5b86eea5]{margin-left:8px}.project-path[data-v-5b86eea5]{font-size:13px;display:block;color:#666;margin-bottom:2px}.search-input[data-v-5b86eea5]{width:320px;flex-shrink:0}.loading-container[data-v-5b86eea5]{display:flex;justify-content:center;align-items:center;min-height:400px}.session-item[data-v-5b86eea5]{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-5b86eea5]:hover{border-color:#18a058;box-shadow:0 2px 8px #18a0581a}.drag-handle[data-v-5b86eea5]{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-5b86eea5]{opacity:1;background-color:#18a0581a;border-radius:4px}.session-left[data-v-5b86eea5]{flex:1;display:flex;align-items:center;gap:16px;min-width:0}.session-icon[data-v-5b86eea5]{flex-shrink:0}.session-info[data-v-5b86eea5]{flex:1;min-width:0}.session-header[data-v-5b86eea5]{display:flex;align-items:center;margin-bottom:6px}.session-title-row[data-v-5b86eea5]{display:flex;align-items:center;gap:8px}.session-title[data-v-5b86eea5]{font-size:15px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:1;min-width:0}.session-meta[data-v-5b86eea5]{display:flex;align-items:center;gap:8px;margin-bottom:6px;font-size:13px}.session-message[data-v-5b86eea5]{display:block;max-width:600px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}.session-message-empty[data-v-5b86eea5]{font-style:italic;opacity:.5}.session-right[data-v-5b86eea5]{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-5b86eea5]{min-height:24px;display:flex;align-items:flex-start;justify-content:flex-end}.session-actions[data-v-5b86eea5]{display:flex;align-items:center;margin-top:auto}.ghost[data-v-5b86eea5]{opacity:.4}.chosen[data-v-5b86eea5]{box-shadow:0 4px 16px #00000026}.search-result-item[data-v-5b86eea5]{margin-bottom:16px;padding:12px;border:1px solid var(--border-primary);border-radius:6px;background:var(--bg-elevated)}.search-result-header[data-v-5b86eea5]{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.search-result-title[data-v-5b86eea5]{display:flex;align-items:center;gap:8px}.search-match[data-v-5b86eea5]{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-5b86eea5]{flex:1;line-height:1.6}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a6 as e,a5 as a,f as s,r as l,t,w as n,h as o,K as i,c as u,o as r,a as c,X as d,a0 as v,W as p,Y as f,N as m,p as y,_ as h,a7 as g,s as k,Z as _,G as w,F as b,$ as C,v as j}from"./vue-vendor-DqyWIXEb.js";import{d as x}from"./vendors-CO3Upi1d.js";import{_ as I,p as z,x as N,C as F,y as S,r as M,q as B,z as $}from"./index-lAkrRC3h.js";import{G as P,D as L,_ as T,d as U,ae as q,ay as D,j as W,k as E,T as G,a5 as K,az as O,s as A,C as H,h as R,Z as V}from"./icons-kcfLIMBB.js";import{N as Z,B as X,$ as Y,c as J,a as Q,q as ee,g as ae,x as se,s as le,n as te,t as ne,h as oe,p as ie}from"./naive-ui-CSrLusZZ.js";import"./markdown-C9MYpaSi.js";const ue={class:"session-list-container"},re={class:"header"},ce={class:"title-bar"},de={class:"title-section"},ve={class:"title-with-count"},pe={key:0,class:"loading-container"},fe=["onMouseenter","onClick"],me={class:"drag-handle"},ye={class:"session-left"},he={class:"session-icon"},ge={class:"session-info"},ke={class:"session-header"},_e={class:"session-title-row"},we={class:"session-title"},be={class:"session-meta"},Ce={class:"session-right"},je={class:"session-tags-area"},xe={class:"session-actions"},Ie={key:0,style:{"max-height":"70vh","overflow-y":"auto"}},ze={class:"search-result-header"},Ne={class:"search-result-title"},Fe=I({__name:"SessionList",props:{projectName:{type:String,required:!0}},setup(I){const Fe=I,Se=e(),Me=a(),Be=z(),{addFavorite:$e,removeFavorite:Pe,isFavorite:Le}=N(),Te=s(()=>Me.meta.channel||"claude"),Ue=l(Fe.projectName),qe=s(()=>Ue.value||Fe.projectName),De=s(()=>"opencode"===Te.value?[{type:"group",label:"Web 终端",key:"web-group",children:[{label:"OpenCode",key:"web-opencode",icon:()=>t(Z,null,{default:()=>t(P)})}]},{type:"group",label:"本地终端",key:"local-group",children:[{label:"OpenCode",key:"local-opencode",icon:()=>t(Z,null,{default:()=>t(L)})}]}]:[{type:"group",label:"Web 终端",key:"web-group",children:[{label:"Claude Code",key:"web-claude",icon:()=>t(Z,null,{default:()=>t(P)})},{label:"Codex",key:"web-codex",icon:()=>t(Z,null,{default:()=>t(P)})},{label:"Gemini",key:"web-gemini",icon:()=>t(Z,null,{default:()=>t(P)})}]},{type:"group",label:"本地终端",key:"local-group",children:[{label:"Claude Code",key:"local-claude",icon:()=>t(Z,null,{default:()=>t(L)})},{label:"Codex",key:"local-codex",icon:()=>t(Z,null,{default:()=>t(L)})},{label:"Gemini",key:"local-gemini",icon:()=>t(Z,null,{default:()=>t(L)})}]}]);function We(e,a){const[s,l]=e.split("-");"web"===s?function(e,a=null){const s=a||Te.value;Se.push({name:"terminal-session",params:{channel:s,projectName:encodeURIComponent(qe.value),sessionId:e},query:{targetTool:a||void 0,cwd:la.value||void 0,openTs:Date.now().toString()}})}(a,l):async function(e,a=null){try{await $(qe.value,e,a,!1,Te.value),M.success(`已启动终端 (${a||Te.value})`)}catch(s){M.error("启动失败: "+s.message)}}(a,l)}const Ee=l(""),Ge=l(!1),Ke=l(null),Oe=l(""),Ae=l(null),He=l([]),Re=l(null),Ve=l(!1),Ze=l(null),Xe=l(!1),Ye=l(!1),Je=l(""),Qe=l(""),ea=l(null),aa=l(!1),sa=s(()=>{var e;return(null==(e=Be.currentProjectInfo)?void 0:e.displayName)||Fe.projectName}),la=s(()=>{var e;return(null==(e=Be.currentProjectInfo)?void 0:e.fullPath)||qe.value});async function ta(){const e=await async function(){Be.projects.length||await Be.fetchProjects();const e=Be.projects.find(e=>e.name===Fe.projectName);if(e)return Ue.value=e.name,e.name;const a=Be.projects.find(e=>e.displayName===Fe.projectName||e.fullPath===Fe.projectName);return a?(Ue.value=a.name,a.name!==Fe.projectName&&await Se.replace({name:`${Te.value}-sessions`,params:{projectName:a.name}}),a.name):(Ue.value=Fe.projectName,Fe.projectName)}();await Be.fetchSessions(e)}function na(e){return!(!e||"string"!=typeof e)&&(e.includes("/")||e.includes("\\")||e.startsWith("~"))}n(()=>Be.sessionsWithAlias,e=>{He.value=[...e]},{immediate:!0});const oa=s(()=>{if(!Ee.value)return He.value;const e=Ee.value.toLowerCase();return He.value.filter(a=>a.sessionId.toLowerCase().includes(e)||a.alias&&a.alias.toLowerCase().includes(e)||a.firstMessage&&a.firstMessage.toLowerCase().includes(e)||a.gitBranch&&a.gitBranch.toLowerCase().includes(e))});function ia(){const e=Me.meta.channel||"claude";Se.push({name:`${e}-projects`})}async function ua(){if(Ee.value){Xe.value=!0;try{const e=await S(qe.value,Ee.value,35,Te.value);Re.value=e,Ve.value=!0}catch(e){M.error("搜索失败: "+e.message)}finally{Xe.value=!1}}}async function ra(){const e=He.value.map(e=>e.sessionId);await Be.saveSessionOrder(e)}async function ca(){if(Ke.value)try{const e=Ke.value.sessionId;Oe.value?(await Be.setAlias(e,Oe.value),M.success("别名设置成功")):(await Be.deleteAlias(e),M.success("别名已删除")),Ge.value=!1,Ke.value=null,Oe.value=""}catch(e){M.error("操作失败: "+e.message)}}function da(e){M.error(e)}async function va(){aa.value=!0;try{const e=Te.value||"claude",a=function(){var e;const a=null==(e=Be.currentProjectInfo)?void 0:e.fullPath;if(na(a))return a;const s=Be.projects.find(e=>e.name===qe.value),l=(null==s?void 0:s.fullPath)||(null==s?void 0:s.path);return na(l)?l:na(la.value)?la.value:null}();await Se.push({name:"terminal-channel",params:{channel:e},query:{cwd:a||void 0,projectName:qe.value||void 0,openTs:Date.now().toString()}})}catch(e){M.error("打开终端失败: "+e.message)}finally{aa.value=!1}}function pa(e){if(!e)return"";return new Date(e).toLocaleString("zh-CN")}function fa(e){if(!e)return"0 B";const a=1024;return e<a?e+" B":e<a*a?(e/a).toFixed(1)+" KB":(e/a/a).toFixed(1)+" MB"}function ma(e,a){if(!a||!e)return e;const s=new RegExp(`(${a})`,"gi");return e.replace(s,'<mark style="background-color: #ffd700; padding: 2px 4px; border-radius: 2px; font-weight: 600;">$1</mark>')}function ya(e,a=80){return e?e.length>a?e.substring(0,a)+"...":e:""}return n([Te,()=>Fe.projectName],([e])=>{Be.setChannel(e),ta()},{immediate:!0}),o(()=>{}),i(()=>{}),(e,a)=>(r(),u("div",ue,[c("div",re,[c("div",ce,[d(m(X),{size:"small",onClick:ia,class:"back-button"},{icon:f(()=>[d(m(Z),{size:"18"},{default:f(()=>[d(m(T))]),_:1})]),_:1}),c("div",de,[c("div",ve,[d(m(Y),null,{default:f(()=>[y(h(sa.value),1)]),_:1}),d(m(J),{depth:"3",class:"session-count"},{default:f(()=>[y("("+h(m(Be).sessions.length)+" 个对话)",1)]),_:1}),d(m(Q),{size:"small",bordered:!1,type:"info",class:"total-size-tag"},{default:f(()=>[y(h(fa(m(Be).totalSize)),1)]),_:1}),d(m(X),{type:"primary",size:"small",loading:aa.value,onClick:va,style:{"margin-left":"12px"}},{icon:f(()=>[d(m(Z),null,{default:f(()=>[d(m(U))]),_:1})]),default:f(()=>[a[9]||(a[9]=y(" 新建会话 ",-1))]),_:1},8,["loading"])]),d(m(J),{depth:"3",class:"project-path"},{default:f(()=>[y(h(la.value),1)]),_:1})]),d(m(ee),{value:Ee.value,"onUpdate:value":a[0]||(a[0]=e=>Ee.value=e),placeholder:"搜索会话...",clearable:"",class:"search-input",onKeyup:g(ua,["enter"]),disabled:Xe.value},{prefix:f(()=>[d(m(Z),null,{default:f(()=>[d(m(q))]),_:1})]),suffix:f(()=>[d(m(X),{text:"",onClick:ua,disabled:!Ee.value||Xe.value,loading:Xe.value},{default:f(()=>[...a[10]||(a[10]=[y(" 搜索 ",-1)])]),_:1},8,["disabled","loading"])]),_:1},8,["value","disabled"])])]),c("div",{class:"content",ref_key:"contentEl",ref:Ze},[m(Be).loading?(r(),u("div",pe,[d(m(ae),{size:"large"},{description:f(()=>[...a[11]||(a[11]=[y(" 加载会话列表... ",-1)])]),_:1})])):m(Be).error?(r(),v(m(se),{key:1,type:"error",title:"加载失败",style:{"margin-bottom":"16px"}},{default:f(()=>[y(h(m(Be).error),1)]),_:1})):oa.value.length>0?(r(),v(m(x),{key:2,modelValue:He.value,"onUpdate:modelValue":a[3]||(a[3]=e=>He.value=e),"item-key":"sessionId",handle:".drag-handle","ghost-class":"ghost","chosen-class":"chosen",animation:"200",onEnd:ra},{item:f(({element:e})=>[c("div",{class:"session-item",onMouseenter:a=>Ae.value=e.sessionId,onMouseleave:a[2]||(a[2]=e=>Ae.value=null),onClick:a=>function(e){Je.value=e.sessionId,Qe.value=e.alias||"",Ye.value=!0,j(()=>{var e;null==(e=ea.value)||e.open()})}(e)},[c("div",me,[d(m(Z),{size:"16",color:"#999"},{default:f(()=>[d(m(D))]),_:1})]),c("div",ye,[c("div",he,[d(m(Z),{size:"24",color:"#18a058"},{default:f(()=>[d(m(W))]),_:1})]),c("div",ge,[c("div",ke,[c("div",_e,[c("span",we,h(e.alias?`${e.alias} (${e.sessionId.substring(0,8)})`:e.sessionId),1),e.forkedFrom?(r(),v(m(le),{key:0,placement:"top"},{trigger:f(()=>[d(m(Q),{size:"small",type:"warning",bordered:!1,style:{"margin-left":"8px",cursor:"help"}},{icon:f(()=>[d(m(Z),null,{default:f(()=>[d(m(E))]),_:1})]),default:f(()=>[a[12]||(a[12]=y(" Fork ",-1))]),_:1})]),default:f(()=>[y(" Fork 自: "+h(e.forkedFrom),1)]),_:2},1024)):p("",!0)])]),c("div",be,[d(m(J),{depth:"3"},{default:f(()=>[y(h(pa(e.mtime)),1)]),_:2},1024),d(m(J),{depth:"3"},{default:f(()=>[...a[13]||(a[13]=[y("•",-1)])]),_:1}),d(m(Q),{size:"small",bordered:!1},{default:f(()=>[y(h(fa(e.size)),1)]),_:2},1024)]),e.firstMessage?(r(),v(m(J),{key:0,depth:"3",class:"session-message"},{default:f(()=>[y(h(ya(e.firstMessage,80)),1)]),_:2},1024)):e.gitBranch||e.summary?p("",!0):(r(),v(m(J),{key:1,depth:"3",class:"session-message session-message-empty"},{default:f(()=>[...a[14]||(a[14]=[y(" 暂未读取到对话内容 ",-1)])]),_:1}))])]),c("div",Ce,[c("div",je,[e.gitBranch?(r(),v(m(Q),{key:0,size:"small",type:"info",bordered:!1},{icon:f(()=>[d(m(Z),null,{default:f(()=>[d(m(E))]),_:1})]),default:f(()=>[y(" "+h(e.gitBranch),1)]),_:2},1024)):p("",!0)]),c("div",xe,[d(m(te),null,{default:f(()=>[k(d(m(X),{size:"small",type:"error",onClick:_(a=>{return s=e.sessionId,void B.warning({title:"删除会话",content:"确定要删除这个会话吗?此操作不可恢复!",positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{try{await Be.deleteSession(s),M.success("会话已删除")}catch(e){M.error("删除失败: "+e.message)}}});var s},["stop"])},{icon:f(()=>[d(m(Z),null,{default:f(()=>[d(m(G))]),_:1})]),default:f(()=>[a[15]||(a[15]=y(" 删除 ",-1))]),_:1},8,["onClick"]),[[w,Ae.value===e.sessionId]]),d(m(X),{size:"small",onClick:_(a=>function(e){Ke.value=e,Oe.value=e.alias||"",Ge.value=!0}(e),["stop"])},{icon:f(()=>[d(m(Z),null,{default:f(()=>[d(m(K))]),_:1})]),default:f(()=>[a[16]||(a[16]=y(" 别名 ",-1))]),_:1},8,["onClick"]),d(m(X),{size:"small",type:m(Le)(Te.value,qe.value,e.sessionId)?"warning":"default",onClick:_(a=>async function(e){const a=Te.value,s=Le(a,qe.value,e.sessionId);try{if(s)await Pe(a,qe.value,e.sessionId),M.success("已取消收藏");else{const s={sessionId:e.sessionId,projectName:qe.value,projectDisplayName:sa.value,projectFullPath:la.value,alias:e.alias||"",firstMessage:e.firstMessage||"",mtime:e.mtime,size:e.size,gitBranch:e.gitBranch||"",forkedFrom:e.forkedFrom||""};await $e(a,s),M.success("已添加到收藏")}}catch(l){M.error("操作失败: "+l.message)}}(e),["stop"])},{icon:f(()=>[d(m(Z),null,{default:f(()=>[m(Le)(Te.value,qe.value,e.sessionId)?(r(),v(m(O),{key:0})):(r(),v(m(A),{key:1}))]),_:2},1024)]),default:f(()=>[y(" "+h(m(Le)(Te.value,qe.value,e.sessionId)?"已收藏":"收藏"),1)]),_:2},1032,["type","onClick"]),"opencode"!==Te.value?(r(),v(m(X),{key:0,size:"small",onClick:_(a=>async function(e){if("opencode"!==Te.value)try{await Be.forkSession(e),M.success("Fork 成功!")}catch(a){M.error("Fork 失败: "+a.message)}else M.warning("OpenCode 当前不支持该 Fork 操作")}(e.sessionId),["stop"])},{icon:f(()=>[d(m(Z),null,{default:f(()=>[d(m(E))]),_:1})]),default:f(()=>[a[17]||(a[17]=y(" Fork ",-1))]),_:1},8,["onClick"])):p("",!0),d(m(ne),{options:De.value,onSelect:a=>We(a,e.sessionId)},{default:f(()=>[d(m(X),{size:"small",type:"primary",onClick:a[1]||(a[1]=_(()=>{},["stop"]))},{icon:f(()=>[d(m(Z),null,{default:f(()=>[d(m(R))]),_:1})]),default:f(()=>[a[18]||(a[18]=y(" 使用对话 ",-1)),d(m(Z),{size:"14",style:{"margin-left":"4px"}},{default:f(()=>[d(m(H))]),_:1})]),_:1})]),_:1},8,["options","onSelect"])]),_:2},1024)])])],40,fe)]),_:1},8,["modelValue"])):(r(),v(m(oe),{key:3,description:"没有找到会话",style:{"margin-top":"60px"}},{icon:f(()=>[d(m(Z),null,{default:f(()=>[d(m(V))]),_:1})]),_:1}))],512),d(m(ie),{show:Ge.value,"onUpdate:show":a[6]||(a[6]=e=>Ge.value=e),preset:"dialog",title:"设置别名"},{action:f(()=>[d(m(te),null,{default:f(()=>[d(m(X),{onClick:a[5]||(a[5]=e=>Ge.value=!1)},{default:f(()=>[...a[19]||(a[19]=[y("取消",-1)])]),_:1}),d(m(X),{type:"primary",onClick:ca},{default:f(()=>[...a[20]||(a[20]=[y("确定",-1)])]),_:1})]),_:1})]),default:f(()=>[d(m(ee),{value:Oe.value,"onUpdate:value":a[4]||(a[4]=e=>Oe.value=e),placeholder:"输入别名(留空删除)",onKeyup:g(ca,["enter"])},null,8,["value"])]),_:1},8,["show"]),d(m(ie),{show:Ve.value,"onUpdate:show":a[7]||(a[7]=e=>Ve.value=e),preset:"card",title:"搜索结果",style:{width:"1200px"}},{default:f(()=>[Re.value?(r(),u("div",Ie,[d(m(se),{type:"info",style:{"margin-bottom":"16px"}},{default:f(()=>[y(' 关键词 "'+h(Re.value.keyword)+'" 共找到 '+h(Re.value.totalMatches)+" 处匹配 ",1)]),_:1}),(r(!0),u(b,null,C(Re.value.sessions,e=>(r(),u("div",{key:e.sessionId,class:"search-result-item"},[c("div",ze,[c("div",Ne,[d(m(J),{strong:""},{default:f(()=>[y(h(e.alias?`${e.alias} (${e.sessionId.substring(0,8)})`:e.sessionId.substring(0,8)),1)]),_:2},1024),d(m(Q),{size:"small",bordered:!1},{default:f(()=>[y(h(e.matchCount)+" 个匹配",1)]),_:2},1024)]),d(m(ne),{options:De.value,onSelect:a=>We(a,e.sessionId)},{default:f(()=>[d(m(X),{size:"small",type:"primary"},{icon:f(()=>[d(m(Z),null,{default:f(()=>[d(m(R))]),_:1})]),default:f(()=>[a[21]||(a[21]=y(" 使用对话 ",-1)),d(m(Z),{size:"14",style:{"margin-left":"4px"}},{default:f(()=>[d(m(H))]),_:1})]),_:1})]),_:1},8,["options","onSelect"])]),(r(!0),u(b,null,C(e.matches,(e,a)=>(r(),u("div",{key:a,class:"search-match"},[d(m(Q),{size:"tiny",type:"user"===e.role?"info":"success",bordered:!1},{default:f(()=>[y(h("user"===e.role?"用户":"助手"),1)]),_:2},1032,["type"]),d(m(J),{depth:"3",class:"search-match-text",innerHTML:ma(e.context,Re.value.keyword)},null,8,["innerHTML"])]))),128))]))),128)),0===Re.value.sessions.length?(r(),v(m(oe),{key:0,description:"没有找到匹配的内容"})):p("",!0)])):p("",!0)]),_:1},8,["show"]),Je.value?(r(),v(F,{key:0,ref_key:"chatHistoryRef",ref:ea,show:Ye.value,"onUpdate:show":a[8]||(a[8]=e=>Ye.value=e),"project-name":qe.value,"session-id":Je.value,"session-alias":Qe.value,channel:Te.value,onError:da},null,8,["show","project-name","session-id","session-alias","channel"])):p("",!0)]))}},[["__scopeId","data-v-5b86eea5"]]);export{Fe as default};
|