coding-tool-x 3.3.8 → 3.4.0
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 +17 -2
- package/README.md +253 -326
- package/dist/web/assets/{Analytics-DLpoDZ2M.js → Analytics-DEjfL5Jx.js} +4 -4
- package/dist/web/assets/Analytics-RNn1BUbG.css +1 -0
- package/dist/web/assets/{ConfigTemplates-D_hRb55W.js → ConfigTemplates-DkRL_-tf.js} +1 -1
- package/dist/web/assets/Home-BQxQ1LhR.css +1 -0
- package/dist/web/assets/Home-CF-L640I.js +1 -0
- package/dist/web/assets/{PluginManager-JXsyym1s.js → PluginManager-BzNYTdNB.js} +1 -1
- package/dist/web/assets/{ProjectList-DZWSeb-q.js → ProjectList-C0-JgHMM.js} +1 -1
- package/dist/web/assets/{SessionList-Cs624DR3.js → SessionList-CkZUdX5N.js} +1 -1
- package/dist/web/assets/{SkillManager-bEliz7qz.js → SkillManager-Cak0-4d4.js} +1 -1
- package/dist/web/assets/{WorkspaceManager-J3RecFGn.js → WorkspaceManager-CGDJzwEr.js} +1 -1
- package/dist/web/assets/{icons-Cuc23WS7.js → icons-B5Pl4lrD.js} +1 -1
- package/dist/web/assets/index-D_WItvHE.js +2 -0
- package/dist/web/assets/index-Dz7v9OM0.css +1 -0
- package/dist/web/assets/{markdown-C9MYpaSi.js → markdown-DyTJGI4N.js} +1 -1
- package/dist/web/assets/{naive-ui-CxpuzdjU.js → naive-ui-Bdxp09n2.js} +1 -1
- package/dist/web/assets/{vendors-DMjSfzlv.js → vendors-CKPV1OAU.js} +2 -2
- package/dist/web/assets/{vue-vendor-DET08QYg.js → vue-vendor-3bf-fPGP.js} +1 -1
- package/dist/web/index.html +7 -7
- package/docs/home.png +0 -0
- package/package.json +13 -5
- package/src/commands/daemon.js +3 -2
- package/src/commands/security.js +1 -2
- package/src/config/paths.js +638 -93
- package/src/server/api/agents.js +1 -1
- package/src/server/api/claude-hooks.js +13 -8
- package/src/server/api/codex-proxy.js +5 -4
- package/src/server/api/hooks.js +45 -0
- package/src/server/api/plugins.js +0 -1
- package/src/server/api/statistics.js +4 -4
- package/src/server/api/ui-config.js +5 -0
- package/src/server/api/workspaces.js +1 -3
- package/src/server/codex-proxy-server.js +89 -59
- package/src/server/gemini-proxy-server.js +107 -88
- package/src/server/index.js +1 -0
- package/src/server/opencode-proxy-server.js +381 -225
- package/src/server/proxy-server.js +86 -60
- package/src/server/services/alias.js +3 -3
- package/src/server/services/channels.js +3 -2
- package/src/server/services/codex-channels.js +38 -87
- package/src/server/services/codex-env-manager.js +426 -0
- package/src/server/services/codex-settings-manager.js +15 -15
- package/src/server/services/codex-statistics-service.js +3 -27
- package/src/server/services/config-export-service.js +20 -7
- package/src/server/services/config-registry-service.js +3 -2
- package/src/server/services/config-sync-manager.js +1 -1
- package/src/server/services/favorites.js +4 -3
- package/src/server/services/gemini-channels.js +3 -3
- package/src/server/services/gemini-statistics-service.js +3 -25
- package/src/server/services/mcp-service.js +2 -3
- package/src/server/services/model-detector.js +4 -3
- package/src/server/services/native-oauth-adapters.js +2 -1
- package/src/server/services/network-access.js +39 -1
- package/src/server/services/notification-hooks.js +951 -0
- package/src/server/services/opencode-channels.js +6 -6
- package/src/server/services/opencode-sessions.js +2 -2
- package/src/server/services/opencode-statistics-service.js +3 -27
- package/src/server/services/plugins-service.js +110 -31
- package/src/server/services/prompts-service.js +2 -3
- package/src/server/services/proxy-log-helper.js +242 -0
- package/src/server/services/proxy-runtime.js +6 -4
- package/src/server/services/repo-scanner-base.js +12 -4
- package/src/server/services/request-logger.js +7 -7
- package/src/server/services/security-config.js +4 -4
- package/src/server/services/session-cache.js +2 -2
- package/src/server/services/sessions.js +2 -2
- package/src/server/services/skill-service.js +174 -55
- package/src/server/services/statistics-service.js +10 -6
- package/src/server/services/ui-config.js +4 -3
- package/src/server/services/workspace-service.js +101 -156
- package/src/server/websocket-server.js +5 -4
- package/dist/web/assets/Analytics-DuYvId7u.css +0 -1
- package/dist/web/assets/Home-BMoFdAwy.css +0 -1
- package/dist/web/assets/Home-DNwp-0J-.js +0 -1
- package/dist/web/assets/index-BXeSvAwU.js +0 -2
- package/dist/web/assets/index-DWAC3Tdv.css +0 -1
- package/docs/bannel.png +0 -0
- package/docs/model-redirection.md +0 -251
|
@@ -6,7 +6,25 @@ const { PATHS } = require('../../config/paths');
|
|
|
6
6
|
const configTemplatesService = require('./config-templates-service');
|
|
7
7
|
|
|
8
8
|
// 工作区配置文件路径
|
|
9
|
-
const WORKSPACES_CONFIG =
|
|
9
|
+
const WORKSPACES_CONFIG = PATHS.workspaces;
|
|
10
|
+
|
|
11
|
+
function createSymlink(target, linkPath) {
|
|
12
|
+
try {
|
|
13
|
+
fs.symlinkSync(target, linkPath, 'dir');
|
|
14
|
+
} catch (err) {
|
|
15
|
+
if (err.code === 'EPERM' && process.platform === 'win32') {
|
|
16
|
+
throw new Error(
|
|
17
|
+
`创建软链接失败:Windows 需要管理员权限或开启开发者模式。\n` +
|
|
18
|
+
`解决方案:\n` +
|
|
19
|
+
`1. 以管理员身份运行终端后重试\n` +
|
|
20
|
+
`2. 或开启开发者模式:设置 → 系统 → 开发者选项 → 开发者模式\n` +
|
|
21
|
+
`3. 对于 Git 项目,建议保持默认的 worktree 模式(无需软链接)\n` +
|
|
22
|
+
`原始错误: ${err.message}`
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
throw err;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
10
28
|
|
|
11
29
|
function runGitCommand(args, options = {}) {
|
|
12
30
|
const execOptions = {
|
|
@@ -287,7 +305,7 @@ function createWorkspace(options) {
|
|
|
287
305
|
let targetPath = sourcePath;
|
|
288
306
|
let worktrees = [];
|
|
289
307
|
|
|
290
|
-
// Git 仓库且需要创建 worktree
|
|
308
|
+
// Git 仓库且需要创建 worktree:直接在工作区目录内创建,无需额外 symlink
|
|
291
309
|
if (isGit && useWorktree) {
|
|
292
310
|
// 获取当前分支作为默认分支
|
|
293
311
|
let targetBranch = branch;
|
|
@@ -299,72 +317,46 @@ function createWorkspace(options) {
|
|
|
299
317
|
}
|
|
300
318
|
}
|
|
301
319
|
|
|
302
|
-
// worktree
|
|
303
|
-
const worktreePath =
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
if (fs.existsSync(worktreePath)) {
|
|
310
|
-
// 已存在则直接使用
|
|
311
|
-
targetPath = worktreePath;
|
|
312
|
-
worktrees.push({
|
|
313
|
-
branch: targetBranch,
|
|
314
|
-
path: worktreePath
|
|
320
|
+
// worktree 直接创建到工作区目录内的项目路径
|
|
321
|
+
const worktreePath = symlinkPath;
|
|
322
|
+
|
|
323
|
+
try {
|
|
324
|
+
// 尝试检出已有分支
|
|
325
|
+
runGitCommand(['worktree', 'add', worktreePath, targetBranch], {
|
|
326
|
+
cwd: sourcePath
|
|
315
327
|
});
|
|
316
|
-
}
|
|
328
|
+
} catch (error) {
|
|
329
|
+
// 如果分支不存在,尝试创建新分支
|
|
317
330
|
try {
|
|
318
|
-
|
|
319
|
-
|
|
331
|
+
const worktreeArgs = ['worktree', 'add', worktreePath, '-b', targetBranch];
|
|
332
|
+
if (baseBranch && baseBranch.trim()) {
|
|
333
|
+
worktreeArgs.push(baseBranch.trim());
|
|
334
|
+
}
|
|
335
|
+
runGitCommand(worktreeArgs, {
|
|
320
336
|
cwd: sourcePath
|
|
321
337
|
});
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
// 如果分支不存在,尝试创建新分支
|
|
330
|
-
try {
|
|
331
|
-
const worktreeArgs = ['worktree', 'add', worktreePath, '-b', targetBranch];
|
|
332
|
-
if (baseBranch && baseBranch.trim()) {
|
|
333
|
-
worktreeArgs.push(baseBranch.trim());
|
|
334
|
-
}
|
|
335
|
-
runGitCommand(worktreeArgs, {
|
|
336
|
-
cwd: sourcePath
|
|
337
|
-
});
|
|
338
|
-
targetPath = worktreePath;
|
|
339
|
-
worktrees.push({
|
|
340
|
-
branch: targetBranch,
|
|
341
|
-
path: worktreePath
|
|
342
|
-
});
|
|
343
|
-
} catch (err) {
|
|
344
|
-
// Check if it's a "branch already checked out" error
|
|
345
|
-
if (err.message.includes('already checked out')) {
|
|
346
|
-
throw new Error(
|
|
347
|
-
`无法创建 worktree:分支 '${targetBranch}' 已在其他工作树中检出。\n` +
|
|
348
|
-
`错误详情: ${err.message}\n\n` +
|
|
349
|
-
`提示:请为此项目指定不同的分支名,或禁用 worktree 模式。`
|
|
350
|
-
);
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
// For other errors, provide clear message but allow fallback
|
|
354
|
-
console.warn(`创建 worktree 失败,使用软链接: ${err.message}`);
|
|
355
|
-
targetPath = sourcePath;
|
|
356
|
-
worktrees = getGitWorktrees(sourcePath);
|
|
338
|
+
} catch (err) {
|
|
339
|
+
if (err.message.includes('already checked out')) {
|
|
340
|
+
throw new Error(
|
|
341
|
+
`无法创建 worktree:分支 '${targetBranch}' 已在其他工作树中检出。\n` +
|
|
342
|
+
`错误详情: ${err.message}\n\n` +
|
|
343
|
+
`提示:请为此项目指定不同的分支名,或禁用 worktree 模式。`
|
|
344
|
+
);
|
|
357
345
|
}
|
|
346
|
+
throw new Error(`创建 worktree 失败: ${err.message}`);
|
|
358
347
|
}
|
|
359
348
|
}
|
|
349
|
+
|
|
350
|
+
targetPath = worktreePath;
|
|
351
|
+
worktrees.push({ branch: targetBranch, path: worktreePath });
|
|
360
352
|
} else if (isGit) {
|
|
361
|
-
// Git 仓库但不创建 worktree
|
|
353
|
+
// Git 仓库但不创建 worktree:symlink 指向源路径,记录已有 worktrees
|
|
362
354
|
worktrees = getGitWorktrees(sourcePath);
|
|
355
|
+
createSymlink(targetPath, symlinkPath);
|
|
356
|
+
} else {
|
|
357
|
+
// 非 Git 仓库:symlink 指向源路径
|
|
358
|
+
createSymlink(targetPath, symlinkPath);
|
|
363
359
|
}
|
|
364
|
-
// 非 Git 仓库:targetPath 保持为 sourcePath,直接软链接
|
|
365
|
-
|
|
366
|
-
// 创建软链接
|
|
367
|
-
fs.symlinkSync(targetPath, symlinkPath, 'dir');
|
|
368
360
|
|
|
369
361
|
workspaceProjects.push({
|
|
370
362
|
name: symlinkName,
|
|
@@ -438,36 +430,17 @@ function deleteWorkspace(id, removeFiles = false) {
|
|
|
438
430
|
|
|
439
431
|
const workspace = data.workspaces[index];
|
|
440
432
|
|
|
441
|
-
//
|
|
433
|
+
// 注销 worktrees(worktree 目录在工作区内,git 引用需先注销)
|
|
442
434
|
for (const proj of workspace.projects) {
|
|
443
|
-
if (proj.
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
console.log(`清理 worktree: ${wt.path}`);
|
|
452
|
-
runGitCommand(['worktree', 'remove', wt.path, '--force'], {
|
|
453
|
-
cwd: proj.sourcePath
|
|
454
|
-
});
|
|
455
|
-
} catch (error) {
|
|
456
|
-
console.error(`删除 worktree 失败: ${wt.path}`, error.message);
|
|
457
|
-
// 如果 git worktree remove 失败,尝试手动删除目录
|
|
458
|
-
if (fs.existsSync(wt.path)) {
|
|
459
|
-
try {
|
|
460
|
-
fs.rmSync(wt.path, { recursive: true, force: true });
|
|
461
|
-
console.log(`手动删除 worktree 目录: ${wt.path}`);
|
|
462
|
-
} catch (rmError) {
|
|
463
|
-
console.error(`手动删除 worktree 目录失败: ${wt.path}`, rmError.message);
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
}
|
|
435
|
+
if (proj.useWorktree && proj.sourcePath && proj.targetPath) {
|
|
436
|
+
if (fs.existsSync(proj.sourcePath)) {
|
|
437
|
+
try {
|
|
438
|
+
runGitCommand(['worktree', 'remove', proj.targetPath, '--force'], {
|
|
439
|
+
cwd: proj.sourcePath
|
|
440
|
+
});
|
|
441
|
+
} catch (error) {
|
|
442
|
+
console.error(`注销 worktree 失败: ${proj.targetPath}`, error.message);
|
|
468
443
|
}
|
|
469
|
-
} catch (error) {
|
|
470
|
-
console.error(`扫描 worktree 失败: ${proj.sourcePath}`, error.message);
|
|
471
444
|
}
|
|
472
445
|
}
|
|
473
446
|
}
|
|
@@ -533,9 +506,8 @@ function addProjectToWorkspace(workspaceId, projectConfig) {
|
|
|
533
506
|
let targetPath = sourcePath;
|
|
534
507
|
let worktrees = [];
|
|
535
508
|
|
|
536
|
-
// Git 仓库且需要创建 worktree
|
|
509
|
+
// Git 仓库且需要创建 worktree:直接在工作区目录内创建,无需额外 symlink
|
|
537
510
|
if (isGit && useWorktree) {
|
|
538
|
-
// 获取当前分支作为默认分支
|
|
539
511
|
let targetBranch = branch;
|
|
540
512
|
if (!targetBranch) {
|
|
541
513
|
try {
|
|
@@ -545,73 +517,44 @@ function addProjectToWorkspace(workspaceId, projectConfig) {
|
|
|
545
517
|
}
|
|
546
518
|
}
|
|
547
519
|
|
|
548
|
-
const worktreePath =
|
|
549
|
-
path.dirname(sourcePath),
|
|
550
|
-
`${path.basename(sourcePath)}-ws-${targetBranch.replace(/\//g, '-')}`
|
|
551
|
-
);
|
|
520
|
+
const worktreePath = symlinkPath;
|
|
552
521
|
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
}
|
|
522
|
+
try {
|
|
523
|
+
runGitCommand(['worktree', 'add', worktreePath, targetBranch], {
|
|
524
|
+
cwd: sourcePath
|
|
525
|
+
});
|
|
526
|
+
} catch (error) {
|
|
558
527
|
try {
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
} catch (
|
|
565
|
-
|
|
566
|
-
if (error.message && error.message.includes('already checked out')) {
|
|
528
|
+
const worktreeArgs = ['worktree', 'add', worktreePath, '-b', targetBranch];
|
|
529
|
+
if (baseBranch && baseBranch.trim()) {
|
|
530
|
+
worktreeArgs.push(baseBranch.trim());
|
|
531
|
+
}
|
|
532
|
+
runGitCommand(worktreeArgs, { cwd: sourcePath });
|
|
533
|
+
} catch (err) {
|
|
534
|
+
if (err.message && err.message.includes('already checked out')) {
|
|
567
535
|
throw new Error(
|
|
568
536
|
`无法添加项目:分支 '${targetBranch}' 已在其他工作树中检出。\n` +
|
|
569
537
|
`仓库路径: ${sourcePath}\n\n` +
|
|
570
|
-
`Git worktree 不允许在同一仓库的多个工作树中检出相同的分支。\n\n` +
|
|
571
538
|
`解决方案:\n` +
|
|
572
539
|
`1. 指定不同的分支名\n` +
|
|
573
540
|
`2. 或者禁用 worktree 模式(设置 createWorktree: false)`
|
|
574
541
|
);
|
|
575
542
|
}
|
|
576
|
-
|
|
577
|
-
// Branch doesn't exist, try creating it
|
|
578
|
-
try {
|
|
579
|
-
const worktreeArgs = ['worktree', 'add', worktreePath, '-b', targetBranch];
|
|
580
|
-
if (baseBranch && baseBranch.trim()) {
|
|
581
|
-
worktreeArgs.push(baseBranch.trim());
|
|
582
|
-
}
|
|
583
|
-
runGitCommand(worktreeArgs, {
|
|
584
|
-
cwd: sourcePath
|
|
585
|
-
});
|
|
586
|
-
targetPath = worktreePath;
|
|
587
|
-
worktrees.push({ branch: targetBranch, path: worktreePath });
|
|
588
|
-
} catch (err) {
|
|
589
|
-
// Check for "already checked out" error in create branch attempt
|
|
590
|
-
if (err.message && err.message.includes('already checked out')) {
|
|
591
|
-
throw new Error(
|
|
592
|
-
`无法添加项目:分支 '${targetBranch}' 已在其他工作树中检出。\n` +
|
|
593
|
-
`仓库路径: ${sourcePath}\n\n` +
|
|
594
|
-
`Git worktree 不允许在同一仓库的多个工作树中检出相同的分支。\n\n` +
|
|
595
|
-
`解决方案:\n` +
|
|
596
|
-
`1. 指定不同的分支名\n` +
|
|
597
|
-
`2. 或者禁用 worktree 模式(设置 createWorktree: false)`
|
|
598
|
-
);
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
// Other errors: fall back to symlink mode
|
|
602
|
-
console.warn(`创建 worktree 失败,使用软链接: ${err.message}`);
|
|
603
|
-
targetPath = sourcePath;
|
|
604
|
-
worktrees = getGitWorktrees(sourcePath);
|
|
605
|
-
}
|
|
543
|
+
throw new Error(`创建 worktree 失败: ${err.message}`);
|
|
606
544
|
}
|
|
607
545
|
}
|
|
546
|
+
|
|
547
|
+
targetPath = worktreePath;
|
|
548
|
+
worktrees.push({ branch: targetBranch, path: worktreePath });
|
|
608
549
|
} else if (isGit) {
|
|
550
|
+
// Git 仓库但不创建 worktree:symlink 指向源路径
|
|
609
551
|
worktrees = getGitWorktrees(sourcePath);
|
|
552
|
+
createSymlink(targetPath, symlinkPath);
|
|
553
|
+
} else {
|
|
554
|
+
// 非 Git 仓库:symlink 指向源路径
|
|
555
|
+
createSymlink(targetPath, symlinkPath);
|
|
610
556
|
}
|
|
611
557
|
|
|
612
|
-
// 创建软链接
|
|
613
|
-
fs.symlinkSync(targetPath, symlinkPath, 'dir');
|
|
614
|
-
|
|
615
558
|
// 更新配置
|
|
616
559
|
workspace.projects.push({
|
|
617
560
|
name: symlinkName,
|
|
@@ -629,7 +572,7 @@ function addProjectToWorkspace(workspaceId, projectConfig) {
|
|
|
629
572
|
/**
|
|
630
573
|
* 从工作区移除项目
|
|
631
574
|
*/
|
|
632
|
-
function removeProjectFromWorkspace(workspaceId, projectName
|
|
575
|
+
function removeProjectFromWorkspace(workspaceId, projectName) {
|
|
633
576
|
const data = loadWorkspaces();
|
|
634
577
|
const workspace = data.workspaces.find(ws => ws.id === workspaceId);
|
|
635
578
|
|
|
@@ -644,26 +587,28 @@ function removeProjectFromWorkspace(workspaceId, projectName, removeWorktrees =
|
|
|
644
587
|
}
|
|
645
588
|
|
|
646
589
|
const project = workspace.projects[projectIndex];
|
|
647
|
-
const
|
|
590
|
+
const projectPath = path.join(workspace.path, projectName);
|
|
648
591
|
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
fs.
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
});
|
|
662
|
-
} catch (error) {
|
|
663
|
-
console.error(`删除 worktree 失败: ${wt.path}`, error.message);
|
|
592
|
+
if (project.useWorktree) {
|
|
593
|
+
// worktree 项目:用 git worktree remove 注销引用(目录在工作区内)
|
|
594
|
+
if (fs.existsSync(projectPath) && fs.existsSync(project.sourcePath)) {
|
|
595
|
+
try {
|
|
596
|
+
runGitCommand(['worktree', 'remove', projectPath, '--force'], {
|
|
597
|
+
cwd: project.sourcePath
|
|
598
|
+
});
|
|
599
|
+
} catch (error) {
|
|
600
|
+
console.error(`注销 worktree 失败: ${projectPath}`, error.message);
|
|
601
|
+
// git 注销失败时手动删除目录
|
|
602
|
+
if (fs.existsSync(projectPath)) {
|
|
603
|
+
fs.rmSync(projectPath, { recursive: true, force: true });
|
|
664
604
|
}
|
|
665
605
|
}
|
|
666
606
|
}
|
|
607
|
+
} else {
|
|
608
|
+
// symlink 项目:直接删除软链接
|
|
609
|
+
if (fs.existsSync(projectPath)) {
|
|
610
|
+
fs.unlinkSync(projectPath);
|
|
611
|
+
}
|
|
667
612
|
}
|
|
668
613
|
|
|
669
614
|
// 从配置中移除
|
|
@@ -159,11 +159,12 @@ function installOriginGuard(server) {
|
|
|
159
159
|
|
|
160
160
|
// 日志持久化文件路径
|
|
161
161
|
function getLogsFilePath() {
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
|
|
162
|
+
const filePath = PATHS.statistics.proxyLogs;
|
|
163
|
+
const dir = path.dirname(filePath);
|
|
164
|
+
if (!fs.existsSync(dir)) {
|
|
165
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
165
166
|
}
|
|
166
|
-
return
|
|
167
|
+
return filePath;
|
|
167
168
|
}
|
|
168
169
|
|
|
169
170
|
function getTodayRange() {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.analytics-page[data-v-7683ab57]{height:100%;background:var(--bg-primary);overflow-y:auto;padding:16px 20px;box-sizing:border-box;display:flex;flex-direction:column;gap:14px}.analytics-header[data-v-7683ab57]{display:flex;align-items:center;justify-content:space-between;flex-shrink:0;flex-wrap:wrap;gap:10px}.page-title[data-v-7683ab57]{margin:0;font-size:18px;font-weight:700;color:var(--text-primary)}.toolbar[data-v-7683ab57]{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.range-buttons[data-v-7683ab57]{display:flex;align-items:center;gap:4px}.range-btn[data-v-7683ab57]{padding:4px 10px;font-size:12px;border:1px solid var(--border-color, #e0e0e6);background:transparent;color:var(--text-secondary);border-radius:4px;cursor:pointer;transition:all .15s}.range-btn[data-v-7683ab57]:hover{border-color:var(--primary-color, #18a058);color:var(--primary-color, #18a058)}.range-btn.active[data-v-7683ab57]{background:var(--primary-color, #18a058);border-color:var(--primary-color, #18a058);color:#fff}.custom-range-wrapper[data-v-7683ab57]{margin-left:4px}.loading-overlay[data-v-7683ab57]{display:flex;justify-content:center;padding:20px 0}.summary-cards[data-v-7683ab57]{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;flex-shrink:0}.summary-card[data-v-7683ab57]{background:var(--bg-secondary);border:1px solid var(--border-color, #e0e0e6);border-radius:8px;padding:14px 16px}.summary-label[data-v-7683ab57]{font-size:11px;color:var(--text-secondary);margin-bottom:6px;text-transform:uppercase;letter-spacing:.05em}.summary-value[data-v-7683ab57]{font-size:22px;font-weight:700;color:var(--text-primary);line-height:1.2}.chart-section[data-v-7683ab57]{background:var(--bg-secondary);border:1px solid var(--border-color, #e0e0e6);border-radius:8px;padding:14px 16px;flex-shrink:0}.chart-section.fullscreen[data-v-7683ab57]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;border-radius:0;padding:20px;background:var(--bg-secondary);overflow:auto}.cumulative-section[data-v-7683ab57]{margin-bottom:8px}.chart-section-header[data-v-7683ab57]{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.chart-title[data-v-7683ab57]{font-size:13px;font-weight:600;color:var(--text-primary)}.chart-controls[data-v-7683ab57]{display:flex;align-items:center;gap:8px}.chart-type-toggle[data-v-7683ab57]{display:flex;border:1px solid var(--border-color, #e0e0e6);border-radius:4px;overflow:hidden}.toggle-btn[data-v-7683ab57]{padding:3px 10px;font-size:12px;border:none;background:transparent;color:var(--text-secondary);cursor:pointer;transition:all .15s}.toggle-btn.active[data-v-7683ab57]{background:var(--primary-color, #18a058);color:#fff}.icon-btn[data-v-7683ab57]{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:1px solid var(--border-color, #e0e0e6);border-radius:4px;background:transparent;cursor:pointer;color:var(--text-secondary);transition:all .15s}.icon-btn[data-v-7683ab57]:hover{border-color:var(--primary-color, #18a058);color:var(--primary-color, #18a058)}.main-chart[data-v-7683ab57]{height:560px;width:100%}.chart-section.fullscreen .main-chart[data-v-7683ab57]{height:calc(100vh - 100px)}.cumulative-chart[data-v-7683ab57]{height:200px;width:100%}.empty-state[data-v-7683ab57]{height:120px;display:flex;align-items:center;justify-content:center;color:var(--text-secondary);font-size:13px}@media (max-width: 768px){.analytics-page[data-v-7683ab57]{padding:10px 12px}.summary-cards[data-v-7683ab57]{grid-template-columns:repeat(2,1fr)}.analytics-header[data-v-7683ab57]{flex-direction:column;align-items:flex-start}.toolbar[data-v-7683ab57]{width:100%}}@media (max-width: 480px){.summary-cards[data-v-7683ab57]{grid-template-columns:1fr 1fr}.summary-value[data-v-7683ab57]{font-size:18px}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.channel-column[data-v-fb3a530a]{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-fb3a530a]{display:flex;align-items:center;gap:10px;padding:12px 14px;background:var(--bg-primary);position:relative}.drag-handle[data-v-fb3a530a]{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-fb3a530a]:hover{color:var(--text-secondary);background:var(--bg-tertiary)}.drag-handle[data-v-fb3a530a]:active{cursor:grabbing}.channel-header[data-v-fb3a530a]:after{content:"";position:absolute;bottom:0;left:14px;right:14px;height:2px;border-radius:1px}.channel-header.claude[data-v-fb3a530a]{background:linear-gradient(135deg,rgba(24,160,88,.08) 0%,transparent 100%)}.channel-header.claude[data-v-fb3a530a]:after{background:linear-gradient(90deg,#18a058,#18a0584d)}.channel-header.codex[data-v-fb3a530a]{background:linear-gradient(135deg,rgba(59,130,246,.08) 0%,transparent 100%)}.channel-header.codex[data-v-fb3a530a]:after{background:linear-gradient(90deg,#3b82f6,#3b82f64d)}.channel-header.gemini[data-v-fb3a530a]{background:linear-gradient(135deg,rgba(168,85,247,.08) 0%,transparent 100%)}.channel-header.gemini[data-v-fb3a530a]:after{background:linear-gradient(90deg,#a855f7,#a855f74d)}.channel-header.opencode[data-v-fb3a530a]{background:linear-gradient(135deg,rgba(234,88,12,.08) 0%,transparent 100%)}.channel-header.opencode[data-v-fb3a530a]:after{background:linear-gradient(90deg,#ea580c,#ea580c4d)}.header-icon[data-v-fb3a530a]{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-fb3a530a]{background:linear-gradient(135deg,#18a058,#15803d);color:#fff}.channel-header.codex .header-icon[data-v-fb3a530a]{background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff}.channel-header.gemini .header-icon[data-v-fb3a530a]{background:linear-gradient(135deg,#a855f7,#9333ea);color:#fff}.channel-header.opencode .header-icon[data-v-fb3a530a]{background:linear-gradient(135deg,#ea580c,#c2410c);color:#fff}.channel-title[data-v-fb3a530a]{font-size:15px;font-weight:700;margin:0;color:var(--text-primary);letter-spacing:.3px}.channel-content[data-v-fb3a530a]{flex:1;min-height:0;overflow:hidden;padding:10px;display:flex;flex-direction:column;gap:8px}.card[data-v-fb3a530a]{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-fb3a530a]: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-fb3a530a]:hover{box-shadow:0 6px 20px #0000001a;border-color:var(--border-secondary)}.card[data-v-fb3a530a]:hover:before{opacity:1}.card.clickable[data-v-fb3a530a]{cursor:pointer}.card.clickable[data-v-fb3a530a]:hover{border-color:#18a058;transform:translateY(-2px);box-shadow:0 8px 24px #18a0582e}.card.clickable[data-v-fb3a530a]: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-fb3a530a]:hover:after{opacity:1}.card-header[data-v-fb3a530a]{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-fb3a530a]{padding:8px 12px}.card-header .n-icon[data-v-fb3a530a]{color:var(--text-tertiary);transition:color .2s ease}.card:hover .card-header .n-icon[data-v-fb3a530a]{color:var(--text-secondary)}.card-title[data-v-fb3a530a]{font-size:11px;font-weight:700;margin:0;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.8px}.runtime-badge[data-v-fb3a530a]{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-fb3a530a 2s ease-in-out infinite}@keyframes pulse-runtime-fb3a530a{0%,to{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(.98)}}.card-body[data-v-fb3a530a]{padding:12px;background:var(--bg-primary)}.card-body.compact[data-v-fb3a530a]{padding:10px 12px}.proxy-control[data-v-fb3a530a]{display:flex;justify-content:space-between;align-items:center;gap:16px}.proxy-info[data-v-fb3a530a]{display:flex;flex-direction:column;gap:4px}.proxy-info-row[data-v-fb3a530a]{display:flex;align-items:center;justify-content:space-between}.proxy-status[data-v-fb3a530a]{display:flex;align-items:center;gap:6px}.proxy-port[data-v-fb3a530a]{font-size:11px;color:var(--text-secondary);margin-left:6px}.channel-selector[data-v-fb3a530a]{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-fb3a530a]:hover{background:var(--hover-bg);border-color:var(--border-secondary);color:var(--text-primary)}.channel-selector[data-v-fb3a530a]:disabled{opacity:.5;cursor:not-allowed}.channel-name[data-v-fb3a530a]{font-size:11px;font-weight:500;max-width:90px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-dot[data-v-fb3a530a]{width:8px;height:8px;border-radius:50%;background:var(--border-secondary);transition:all .3s ease}.status-dot.active[data-v-fb3a530a]{background:#18a058;box-shadow:0 0 8px #18a05880}.quick-stats[data-v-fb3a530a]{display:flex;gap:16px;padding:4px 0}.stat-item[data-v-fb3a530a]{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;padding:4px 0}.stat-divider[data-v-fb3a530a]{width:1px;background:linear-gradient(180deg,transparent 0%,var(--border-primary) 50%,transparent 100%)}.quick-access-list[data-v-fb3a530a]{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}.access-card[data-v-fb3a530a]{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-fb3a530a]: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-fb3a530a]{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-fb3a530a]{display:flex;flex-direction:column;gap:4px;flex:1}.access-card-projects .access-icon[data-v-fb3a530a]{background:linear-gradient(135deg,#6366f126,#8b5cf626);color:#6366f1}.access-card-projects[data-v-fb3a530a]:before{background:linear-gradient(135deg,#6366f114,#8b5cf614)}.access-card-projects:hover .access-icon[data-v-fb3a530a]{background:linear-gradient(135deg,#6366f140,#8b5cf640);transform:scale(1.1) rotate(-5deg)}.access-card-sessions .access-icon[data-v-fb3a530a]{background:linear-gradient(135deg,#10b98126,#05966926);color:#10b981}.access-card-sessions[data-v-fb3a530a]:before{background:linear-gradient(135deg,#10b98114,#05966914)}.access-card-sessions:hover .access-icon[data-v-fb3a530a]{background:linear-gradient(135deg,#10b98140,#05966940);transform:scale(1.1) rotate(5deg)}.access-card-goto .access-icon[data-v-fb3a530a]{background:linear-gradient(135deg,#f59e0b26,#fb923c26);color:#f59e0b}.access-card-goto[data-v-fb3a530a]:before{background:linear-gradient(135deg,#f59e0b14,#fb923c14)}.access-card-goto:hover .access-icon[data-v-fb3a530a]{background:linear-gradient(135deg,#f59e0b40,#fb923c40);transform:scale(1.1) translate(3px)}.access-card.clickable[data-v-fb3a530a]:hover{transform:translateY(-2px);box-shadow:0 8px 20px #0000001a;border-color:var(--border-secondary)}.access-card.clickable[data-v-fb3a530a]:hover:before{opacity:1}.access-card.clickable[data-v-fb3a530a]:active{transform:translateY(0)}.access-label[data-v-fb3a530a]{display:block;font-size:10px;font-weight:600;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.3px}.access-value[data-v-fb3a530a]{display:block;font-size:18px;font-weight:800;color:var(--text-primary);line-height:1}.access-goto[data-v-fb3a530a]{display:block;font-size:12px;font-weight:700;color:var(--text-primary);line-height:1.2;white-space:nowrap}.stats-inline[data-v-fb3a530a]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}.stats-inline.stats-3col[data-v-fb3a530a]{grid-template-columns:repeat(3,1fr)}.stat-inline-item[data-v-fb3a530a]{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-fb3a530a]:hover{border-color:var(--border-secondary);background:var(--hover-bg)}.stat-icon-dot[data-v-fb3a530a]{width:8px;height:8px;border-radius:50%;flex-shrink:0}.stat-icon-dot.requests[data-v-fb3a530a]{background:#3b82f6;box-shadow:0 0 6px #3b82f680}.stat-icon-dot.tokens[data-v-fb3a530a]{background:#18a058;box-shadow:0 0 6px #18a05880}.stat-icon-dot.cost[data-v-fb3a530a]{background:#f59e0b;box-shadow:0 0 6px #f59e0b80}.stat-info[data-v-fb3a530a]{display:flex;flex-direction:column;gap:1px;min-width:0}.stat-label[data-v-fb3a530a]{font-size:10px;color:var(--text-tertiary);font-weight:500;text-transform:uppercase;letter-spacing:.2px}.stat-value[data-v-fb3a530a]{font-size:16px;font-weight:700;color:var(--text-primary);line-height:1.2;transition:all .3s ease}.stat-value.animating[data-v-fb3a530a]{animation:numberChange-fb3a530a .6s ease}@keyframes numberChange-fb3a530a{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-fb3a530a],.chart-card[data-v-fb3a530a]{border-left:2px solid transparent}.stats-card-claude[data-v-fb3a530a],.chart-card[data-v-fb3a530a]:has(+.stats-card-claude),.card[data-v-fb3a530a]:has(.panel-card):nth-child(4){border-left-color:#18a058}.chart-card.chart-card-claude[data-v-fb3a530a]{border-left-color:#18a058}.stats-card-codex[data-v-fb3a530a],.chart-card[data-v-fb3a530a]:has(+.stats-card-codex),.card[data-v-fb3a530a]:has(.panel-card):nth-child(4){border-left-color:#3b82f6}.chart-card.chart-card-codex[data-v-fb3a530a]{border-left-color:#3b82f6}.stats-card-gemini[data-v-fb3a530a],.chart-card[data-v-fb3a530a]:has(+.stats-card-gemini),.card[data-v-fb3a530a]:has(.panel-card):nth-child(4){border-left-color:#a855f7}.chart-card.chart-card-gemini[data-v-fb3a530a]{border-left-color:#a855f7}.stats-card-opencode[data-v-fb3a530a],.chart-card[data-v-fb3a530a]:has(+.stats-card-opencode),.card[data-v-fb3a530a]:has(.panel-card):nth-child(4){border-left-color:#ea580c}.chart-card.chart-card-opencode[data-v-fb3a530a]{border-left-color:#ea580c}.chart-card[data-v-fb3a530a]{padding:0;overflow:hidden}.chart-card[data-v-fb3a530a] .panel-card{border:none;border-radius:0;box-shadow:none;background:transparent}.stat-requests .stat-value[data-v-fb3a530a]{color:#3b82f6}.stat-input .stat-value[data-v-fb3a530a]{color:#18a058}.stat-output .stat-value[data-v-fb3a530a]{color:#f59e0b}.token-label[data-v-fb3a530a]{display:flex;align-items:center;gap:8px}.token-dot[data-v-fb3a530a]{width:8px;height:8px;border-radius:50%}.logs-card[data-v-fb3a530a]{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--border-primary);border-radius:6px}.logs-card-body[data-v-fb3a530a]{flex:1;min-height:0;display:flex;flex-direction:column;padding:0}.logs-card .card-header[data-v-fb3a530a]{background:linear-gradient(135deg,var(--bg-secondary) 0%,var(--bg-tertiary) 100%)}.logs-table-wrapper[data-v-fb3a530a]{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;background:var(--bg-primary)}.logs-table-header[data-v-fb3a530a]{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-fb3a530a]{color:#18a058b3;font-weight:600}.logs-header-codex .log-col[data-v-fb3a530a]{color:#3b82f6b3;font-weight:600}.logs-header-gemini .log-col[data-v-fb3a530a]{color:#a855f7b3;font-weight:600}.logs-header-opencode .log-col[data-v-fb3a530a]{color:#ea580cb3;font-weight:600}[data-theme=dark] .logs-header-claude .log-col[data-v-fb3a530a]{color:#34d399a6}[data-theme=dark] .logs-header-codex .log-col[data-v-fb3a530a]{color:#60a5faa6}[data-theme=dark] .logs-header-gemini .log-col[data-v-fb3a530a]{color:#c084fca6}[data-theme=dark] .logs-header-opencode .log-col[data-v-fb3a530a]{color:#fb923ca6}.logs-container[data-v-fb3a530a]{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden}.logs-container[data-v-fb3a530a]::-webkit-scrollbar{width:4px}.logs-container[data-v-fb3a530a]::-webkit-scrollbar-thumb{background:#18a0584d;border-radius:2px}.logs-container[data-v-fb3a530a]::-webkit-scrollbar-thumb:hover{background:#18a05880}.empty-logs[data-v-fb3a530a]{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-fb3a530a]{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-fb3a530a]:nth-child(2n){background:var(--bg-secondary)}.log-row[data-v-fb3a530a]:hover{background:var(--hover-bg);transform:translate(2px)}.log-row.new-log[data-v-fb3a530a]{animation:newLogPulse-fb3a530a 4.5s cubic-bezier(.25,.46,.45,.94) forwards;border-left:3px solid #18a058}@keyframes newLogPulse-fb3a530a{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-fb3a530a]{animation:newLogPulseDark-fb3a530a 4.5s cubic-bezier(.25,.46,.45,.94) forwards}@keyframes newLogPulseDark-fb3a530a{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-fb3a530a]{border-left:3px solid #18a058}.log-row.action-row[data-v-fb3a530a]{background:linear-gradient(90deg,#18a0581f,#18a0580a);border-left:3px solid #18a058;padding-left:8px}.log-row.action-row[data-v-fb3a530a]:hover{background:linear-gradient(90deg,#18a0582e,#18a05814)}.action-content[data-v-fb3a530a]{display:flex;align-items:center;gap:8px;width:100%}.action-msg[data-v-fb3a530a]{flex:1;font-size:11px;color:#18a058;font-weight:600;letter-spacing:.2px}.action-time[data-v-fb3a530a]{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-fb3a530a]{display:flex;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-channel[data-v-fb3a530a]{min-width:0}.col-channel .n-tag[data-v-fb3a530a]{max-width:100%;font-size:11px;font-weight:600;border-radius:4px;padding:3px 10px}.col-token[data-v-fb3a530a]{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-fb3a530a]{background:#ffffff0f}.col-time[data-v-fb3a530a]{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-fb3a530a]{opacity:1;color:var(--text-secondary)}.col-channel-claude[data-v-fb3a530a]{flex:2 1 60px;min-width:50px}.col-token-claude[data-v-fb3a530a]{flex:1 1 40px;min-width:35px}.col-time-claude[data-v-fb3a530a]{flex:1.5 1 55px;min-width:50px}.col-channel-codex[data-v-fb3a530a]{flex:2 1 60px;min-width:50px}.col-token-codex[data-v-fb3a530a]{flex:1 1 40px;min-width:35px}.col-time-codex[data-v-fb3a530a]{flex:1.5 1 55px;min-width:50px}.col-channel-gemini[data-v-fb3a530a]{flex:2.5 1 70px;min-width:55px}.col-token-gemini[data-v-fb3a530a]{flex:1.2 1 45px;min-width:40px}.col-time-gemini[data-v-fb3a530a]{flex:1.8 1 60px;min-width:55px}.col-channel-opencode[data-v-fb3a530a]{flex:2.5 1 70px;min-width:55px}.col-token-opencode[data-v-fb3a530a]{flex:1.2 1 45px;min-width:40px}.col-time-opencode[data-v-fb3a530a]{flex:1.8 1 60px;min-width:55px}.claude-extra-area[data-v-fb3a530a]{display:flex;align-items:center;gap:6px;margin-left:auto}.mcp-count-tag[data-v-fb3a530a],.skills-count-tag[data-v-fb3a530a]{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-fb3a530a]:hover,.skills-count-tag.clickable[data-v-fb3a530a]:hover{transform:scale(1.03);filter:brightness(1.1)}.mcp-quick-panel[data-v-fb3a530a],.skills-quick-panel[data-v-fb3a530a]{padding:2px 0}.mcp-quick-panel .panel-title[data-v-fb3a530a],.skills-quick-panel .panel-title[data-v-fb3a530a]{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-fb3a530a]:first-child,.skills-quick-panel .panel-title span[data-v-fb3a530a]:first-child{font-size:13px;font-weight:600;color:var(--text-primary)}.no-items[data-v-fb3a530a]{padding:16px 10px;text-align:center}.mcp-quick-list[data-v-fb3a530a],.skills-quick-list[data-v-fb3a530a]{max-height:300px;overflow-y:auto;padding:0 4px 4px}.mcp-quick-item[data-v-fb3a530a],.skill-quick-item[data-v-fb3a530a]{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-fb3a530a]:hover,.skill-quick-item[data-v-fb3a530a]:hover{background:var(--hover-bg)}.mcp-item-icon[data-v-fb3a530a],.skill-item-icon[data-v-fb3a530a]{width:24px;height:24px;border-radius:5px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.mcp-item-icon[data-v-fb3a530a]{background:linear-gradient(135deg,#3b82f626,#3b82f60d);color:#3b82f6}.skill-item-icon[data-v-fb3a530a]{background:linear-gradient(135deg,#18a05826,#18a0580d);color:#18a058}.mcp-item-info[data-v-fb3a530a],.skill-item-info[data-v-fb3a530a]{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.mcp-item-name[data-v-fb3a530a],.skill-item-name[data-v-fb3a530a]{font-size:12px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mcp-item-type[data-v-fb3a530a]{font-size:10px;color:var(--text-tertiary);text-transform:uppercase}.skill-item-desc[data-v-fb3a530a]{font-size:10px;color:var(--text-tertiary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mcp-item-status[data-v-fb3a530a]{flex-shrink:0}.mcp-item-status .status-dot[data-v-fb3a530a]{width:8px;height:8px;border-radius:50%;background:var(--border-secondary)}.mcp-item-status.online .status-dot[data-v-fb3a530a]{background:#18a058;box-shadow:0 0 6px #18a05880}.mcp-item-status.error .status-dot[data-v-fb3a530a]{background:#d03050;box-shadow:0 0 6px #d0305080}.mcp-quick-list[data-v-fb3a530a]::-webkit-scrollbar,.skills-quick-list[data-v-fb3a530a]::-webkit-scrollbar{width:4px}.mcp-quick-list[data-v-fb3a530a]::-webkit-scrollbar-thumb,.skills-quick-list[data-v-fb3a530a]::-webkit-scrollbar-thumb{background:#00000026;border-radius:2px}[data-theme=dark] .mcp-quick-list[data-v-fb3a530a]::-webkit-scrollbar-thumb,[data-theme=dark] .skills-quick-list[data-v-fb3a530a]::-webkit-scrollbar-thumb{background:#ffffff26}.skills-button[data-v-fb3a530a]{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-fb3a530a]{color:var(--text-color-3);transition:all .25s ease}.skills-button[data-v-fb3a530a]: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-fb3a530a]{color:#18a058;transform:scale(1.1)}.skills-button[data-v-fb3a530a]:active{transform:translateY(0);box-shadow:0 2px 4px #0000000d}.lock-button[data-v-fb3a530a]{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-fb3a530a]{color:var(--text-color-3);transition:all .25s ease}.lock-button[data-v-fb3a530a]: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-fb3a530a]{color:var(--text-color-1);transform:scale(1.1)}.lock-button[data-v-fb3a530a]:active{transform:translateY(0);box-shadow:0 2px 4px #0000000d}.locked-overlay[data-v-fb3a530a]{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-fb3a530a]: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-fb3a530a]{background:linear-gradient(135deg,rgba(24,160,88,.03) 0%,var(--bg-secondary) 50%,rgba(24,160,88,.02) 100%)}.locked-claude[data-v-fb3a530a]:before{background:radial-gradient(circle,rgba(24,160,88,.15) 0%,transparent 70%)}.locked-codex[data-v-fb3a530a]{background:linear-gradient(135deg,rgba(59,130,246,.03) 0%,var(--bg-secondary) 50%,rgba(59,130,246,.02) 100%)}.locked-codex[data-v-fb3a530a]:before{background:radial-gradient(circle,rgba(59,130,246,.15) 0%,transparent 70%)}.locked-gemini[data-v-fb3a530a]{background:linear-gradient(135deg,rgba(168,85,247,.03) 0%,var(--bg-secondary) 50%,rgba(168,85,247,.02) 100%)}.locked-gemini[data-v-fb3a530a]:before{background:radial-gradient(circle,rgba(168,85,247,.15) 0%,transparent 70%)}.locked-opencode[data-v-fb3a530a]{background:linear-gradient(135deg,rgba(234,88,12,.03) 0%,var(--bg-secondary) 50%,rgba(234,88,12,.02) 100%)}.locked-opencode[data-v-fb3a530a]:before{background:radial-gradient(circle,rgba(234,88,12,.15) 0%,transparent 70%)}.locked-content[data-v-fb3a530a]{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-fb3a530a]{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-fb3a530a 3s ease-in-out infinite}@keyframes lock-float-fb3a530a{0%,to{transform:translateY(0)}50%{transform:translateY(-6px)}}.lock-icon[data-v-fb3a530a]: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-fb3a530a]{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-fb3a530a]:before{background:radial-gradient(circle,rgba(24,160,88,.3) 0%,transparent 60%)}.locked-claude .lock-icon .n-icon[data-v-fb3a530a]{color:#18a058;filter:drop-shadow(0 2px 4px rgba(24,160,88,.3))}.locked-codex .lock-icon[data-v-fb3a530a]{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-fb3a530a]:before{background:radial-gradient(circle,rgba(59,130,246,.3) 0%,transparent 60%)}.locked-codex .lock-icon .n-icon[data-v-fb3a530a]{color:#3b82f6;filter:drop-shadow(0 2px 4px rgba(59,130,246,.3))}.locked-gemini .lock-icon[data-v-fb3a530a]{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-fb3a530a]:before{background:radial-gradient(circle,rgba(168,85,247,.3) 0%,transparent 60%)}.locked-gemini .lock-icon .n-icon[data-v-fb3a530a]{color:#a855f7;filter:drop-shadow(0 2px 4px rgba(168,85,247,.3))}.locked-opencode .lock-icon[data-v-fb3a530a]{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-fb3a530a]:before{background:radial-gradient(circle,rgba(234,88,12,.3) 0%,transparent 60%)}.locked-opencode .lock-icon .n-icon[data-v-fb3a530a]{color:#ea580c;filter:drop-shadow(0 2px 4px rgba(234,88,12,.3))}.lock-icon .n-icon[data-v-fb3a530a]{opacity:.85;position:relative;z-index:1}.locked-title[data-v-fb3a530a]{font-size:17px;font-weight:600;color:var(--text-color-1);margin:0;letter-spacing:.3px}.locked-hint[data-v-fb3a530a]{font-size:13px;color:var(--text-color-3);max-width:220px;line-height:1.7;opacity:.9}.channel-status[data-v-fb3a530a]{cursor:pointer;padding:4px 8px!important;border-radius:4px;transition:all .2s ease}.channel-status[data-v-fb3a530a]:hover{background:var(--hover-bg)}.channel-quick-panel[data-v-fb3a530a]{padding:4px 0}.panel-title[data-v-fb3a530a]{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-fb3a530a]:first-child{font-size:13px;font-weight:600;color:var(--text-primary)}.no-channels[data-v-fb3a530a]{padding:24px 12px;text-align:center}.channel-quick-list[data-v-fb3a530a]{max-height:360px;overflow-y:auto}.channel-quick-item[data-v-fb3a530a]{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-fb3a530a]:hover{background:var(--hover-bg)}.channel-quick-item.disabled[data-v-fb3a530a]{opacity:.6}.channel-quick-info[data-v-fb3a530a]{display:flex;align-items:center;gap:8px;width:100%}.channel-quick-name[data-v-fb3a530a]{font-size:13px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.channel-metrics[data-v-fb3a530a]{display:flex;gap:6px;width:100%}.channel-metrics .metric-item[data-v-fb3a530a]{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-fb3a530a]{font-size:10px;color:var(--text-tertiary);font-weight:500}.channel-metrics .metric-value[data-v-fb3a530a]{font-size:12px;font-weight:700;color:var(--text-primary);font-family:SF Mono,Monaco,monospace}.channel-metrics .metric-value.active[data-v-fb3a530a]{color:#f59e0b}.channel-switching-tip[data-v-fb3a530a]{font-size:11px;color:var(--text-tertiary);padding:0 2px}.channel-quick-item.disabled .channel-metrics .metric-value[data-v-fb3a530a]{color:var(--text-tertiary)}.channel-quick-list[data-v-fb3a530a]::-webkit-scrollbar{width:4px}.channel-quick-list[data-v-fb3a530a]::-webkit-scrollbar-thumb{background:#00000026;border-radius:2px}[data-theme=dark] .channel-quick-list[data-v-fb3a530a]::-webkit-scrollbar-thumb{background:#ffffff26}@media (max-width: 1024px){.channel-column[data-v-fb3a530a]{border-radius:6px}.card-header[data-v-fb3a530a]{padding:8px 10px}.card-title[data-v-fb3a530a]{font-size:13px}.stats-inline[data-v-fb3a530a]{gap:6px}.stat-inline-item[data-v-fb3a530a]{padding:8px}.stat-value[data-v-fb3a530a]{font-size:14px}.stat-label[data-v-fb3a530a]{font-size:9px}.logs-table-header[data-v-fb3a530a]{padding:8px 10px;font-size:10px}.log-row[data-v-fb3a530a]{padding:8px 10px;font-size:11px}}@media (max-width: 768px){.channel-column[data-v-fb3a530a]{border-radius:6px;min-height:300px;height:auto;max-height:400px}.card-header[data-v-fb3a530a]{padding:8px;gap:6px}.card-title[data-v-fb3a530a]{font-size:12px}.stats-inline[data-v-fb3a530a]{gap:4px}.stat-inline-item[data-v-fb3a530a]{padding:6px;gap:6px}.stat-icon-dot[data-v-fb3a530a]{width:6px;height:6px}.stat-value[data-v-fb3a530a]{font-size:13px}.stat-label[data-v-fb3a530a]{font-size:8px}.logs-card[data-v-fb3a530a]{min-height:150px}.logs-table-header[data-v-fb3a530a]{padding:6px 8px;font-size:9px}.log-row[data-v-fb3a530a]{padding:6px 8px;font-size:10px;min-height:32px}.col-token[data-v-fb3a530a]{font-size:10px;padding:2px 4px}.col-time[data-v-fb3a530a]{font-size:9px}.mcp-count-tag[data-v-fb3a530a],.skills-count-tag[data-v-fb3a530a]{font-size:9px;padding:0 6px;height:18px;line-height:18px}.skills-button[data-v-fb3a530a]{padding:4px 8px;font-size:10px;gap:4px}.lock-button[data-v-fb3a530a]{width:26px;height:26px}}@media (max-width: 640px){.channel-column[data-v-fb3a530a]{min-height:250px;max-height:350px}.card-header[data-v-fb3a530a]{padding:6px;gap:4px;flex-wrap:wrap}.card-title[data-v-fb3a530a]{font-size:11px}.stats-card .card-content[data-v-fb3a530a]{padding:6px}.stats-inline[data-v-fb3a530a]{gap:3px;flex-wrap:wrap}.stat-inline-item[data-v-fb3a530a]{padding:5px;gap:4px;min-width:calc(33% - 3px);flex:1 1 auto}.stat-icon-dot[data-v-fb3a530a]{width:5px;height:5px}.stat-value[data-v-fb3a530a]{font-size:12px}.stat-label[data-v-fb3a530a]{font-size:7px}.logs-card[data-v-fb3a530a]{min-height:120px}.logs-table-header[data-v-fb3a530a]{padding:5px 6px;font-size:8px;letter-spacing:.3px}.log-row[data-v-fb3a530a]{padding:5px 6px;font-size:9px;min-height:28px}.col-channel .n-tag[data-v-fb3a530a]{font-size:9px;padding:2px 6px}.col-token[data-v-fb3a530a]{font-size:9px;padding:2px 3px;margin:0 1px}.col-time[data-v-fb3a530a]{font-size:8px}.claude-extra-area[data-v-fb3a530a]{gap:4px}.mcp-count-tag[data-v-fb3a530a],.skills-count-tag[data-v-fb3a530a]{font-size:8px;padding:0 4px;height:16px;line-height:16px}.skills-button[data-v-fb3a530a]{padding:3px 6px;font-size:9px;gap:3px}.skills-button .n-icon[data-v-fb3a530a]{font-size:12px!important}.lock-button[data-v-fb3a530a]{width:24px;height:24px;margin-left:4px}.lock-button .n-icon[data-v-fb3a530a]{font-size:12px!important}.locked-content[data-v-fb3a530a]{padding:30px 20px;gap:12px}.lock-icon[data-v-fb3a530a]{width:64px;height:64px}.lock-icon .n-icon[data-v-fb3a530a]{font-size:28px!important}.lock-title[data-v-fb3a530a]{font-size:14px}.lock-subtitle[data-v-fb3a530a]{font-size:10px}.unlock-btn[data-v-fb3a530a]{padding:8px 16px;font-size:11px}}@media (max-width: 480px){.channel-column[data-v-fb3a530a]{min-height:220px;max-height:300px}.card-header[data-v-fb3a530a]{padding:5px}.card-title[data-v-fb3a530a]{font-size:10px}.stats-inline[data-v-fb3a530a]{gap:2px}.stat-inline-item[data-v-fb3a530a]{padding:4px;gap:3px}.stat-value[data-v-fb3a530a]{font-size:11px}.stat-label[data-v-fb3a530a]{font-size:6px}.logs-table-header[data-v-fb3a530a]{padding:4px 5px;font-size:7px}.log-row[data-v-fb3a530a]{padding:4px 5px;font-size:8px;min-height:24px}.col-token[data-v-fb3a530a]{font-size:8px}.col-time[data-v-fb3a530a]{font-size:7px}}.card[data-v-fb3a530a]:not(.logs-card) .n-collapse{background:transparent}.card[data-v-fb3a530a]:not(.logs-card) .n-collapse-item{background:transparent}.card[data-v-fb3a530a] .n-collapse-item__header{padding:12px 16px;background:transparent;transition:all .3s ease}.card[data-v-fb3a530a] .n-collapse-item__header:hover{background:#00000005}.card[data-v-fb3a530a] .n-collapse-item__header-main{width:100%}.card[data-v-fb3a530a]:not(.logs-card) .n-collapse-item__content-wrapper{padding:0 16px 12px}.card[data-v-fb3a530a]:not(.logs-card) .n-collapse-item__content-inner{padding-top:0}.chart-card[data-v-fb3a530a]:has(.n-collapse){padding:0}.dashboard-container[data-v-06100f0f]{height:100%;background:var(--bg-primary);overflow:hidden;padding:12px;box-sizing:border-box;display:flex;flex-direction:column}.dashboard-toolbar[data-v-06100f0f]{display:flex;justify-content:flex-end;margin-bottom:8px;flex-shrink:0}.analytics-link[data-v-06100f0f]{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--primary-color, #18a058);text-decoration:none;padding:4px 10px;border-radius:4px;background:#18a05814;transition:background .2s}.analytics-link[data-v-06100f0f]:hover{background:#18a05826}.analytics-link-icon[data-v-06100f0f]{font-size:14px}.dashboard-grid[data-v-06100f0f]{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-06100f0f] .sortable-ghost{opacity:.4}.dashboard-grid[data-v-06100f0f] .sortable-chosen{box-shadow:0 8px 24px #00000026}@media (max-width: 1600px){.dashboard-grid[data-v-06100f0f]{grid-template-columns:repeat(3,1fr)}}@media (max-width: 1200px){.dashboard-grid[data-v-06100f0f]{grid-template-columns:repeat(2,1fr)}}@media (max-width: 1024px){.dashboard-container[data-v-06100f0f]{padding:10px}.dashboard-grid[data-v-06100f0f]{gap:10px}}@media (max-width: 900px){.dashboard-grid[data-v-06100f0f]{grid-template-columns:1fr}}@media (max-width: 768px){.dashboard-container[data-v-06100f0f]{padding:8px;overflow-y:auto}.dashboard-grid[data-v-06100f0f]{gap:8px;overflow:visible;min-height:auto}}@media (max-width: 640px){.dashboard-container[data-v-06100f0f]{padding:6px}.dashboard-grid[data-v-06100f0f]{gap:6px}}@media (max-width: 480px){.dashboard-container[data-v-06100f0f]{padding:4px}.dashboard-grid[data-v-06100f0f]{gap:4px}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{d as e}from"./vendors-DMjSfzlv.js";import{a8 as a,f as l,r as n,w as s,h as c,K as t,a7 as o,c as i,o as u,a as d,W as r,X as v,Y as p,N as h,a0 as y,a3 as g,_ as f,p as m,L as k,F as T,$ as b,Z as x,v as C}from"./vue-vendor-DET08QYg.js";import{_ as w,u as $,a as _,R as q,g as z,b as S,c as L,d as I,e as j,f as O,h as N,i as M,j as A,k as F,l as D,s as P}from"./index-BXeSvAwU.js";import{E as U,o as E,n as V,m as J,ar as K,as as G,at as R,au as Z,av as B,a9 as H,i as W,A as X,aw as Y,ax as Q,T as ee,a as ae}from"./icons-Cuc23WS7.js";import{L as le,N as ne,B as se,s as ce,b as te,c as oe,a as ie,Z as ue}from"./naive-ui-CxpuzdjU.js";import"./markdown-C9MYpaSi.js";const de={class:"channel-column"},re={class:"drag-handle",title:"拖拽排序"},ve={class:"header-icon"},pe={class:"channel-title"},he={key:0,class:"claude-extra-area"},ye={key:0,class:"channel-content"},ge={class:"card"},fe={class:"card-header"},me={key:0,class:"runtime-badge"},ke={class:"card-body",style:{padding:"6px 10px"}},Te={class:"proxy-info-row"},be={class:"proxy-status"},xe={class:"proxy-port"},Ce={class:"channel-name"},we={class:"channel-quick-panel"},$e={class:"panel-title"},_e={key:0,class:"no-channels"},qe={key:1,class:"channel-quick-list"},ze={class:"channel-quick-info"},Se={class:"channel-quick-name"},Le={key:0,class:"channel-switching-tip"},Ie={class:"channel-metrics"},je={class:"metric-item"},Oe={class:"metric-value"},Ne={class:"metric-item"},Me={class:"metric-value"},Ae={class:"metric-item"},Fe={class:"metric-value"},De={class:"metric-item"},Pe={class:"card"},Ue={class:"card-header compact"},Ee={class:"card-body",style:{padding:"8px 10px"}},Ve={class:"quick-access-list"},Je={class:"access-icon"},Ke={class:"access-content"},Ge={class:"access-value"},Re={class:"access-icon"},Ze={class:"access-content"},Be={class:"access-value"},He={class:"access-icon"},We={class:"access-content"},Xe={class:"access-goto"},Ye={class:"card-header compact"},Qe={class:"card-body",style:{padding:"8px 10px"}},ea={class:"stats-inline stats-3col"},aa={class:"stat-inline-item stat-requests"},la={class:"stat-info"},na={class:"stat-inline-item stat-input"},sa={class:"stat-info"},ca={class:"stat-inline-item stat-output"},ta={class:"stat-info"},oa={key:1,class:"card logs-card"},ia={class:"card-header compact"},ua={class:"card-body logs-card-body"},da={class:"logs-table-wrapper"},ra={key:0,class:"empty-logs"},va={key:0,class:"action-content"},pa={class:"action-msg"},ha={class:"action-time"},ya={class:"locked-content"},ga={class:"lock-icon"},fa="channelLocks",ma=w({__name:"ChannelColumn",props:{channelType:{type:String,required:!0,validator:e=>["claude","codex","gemini","opencode"].includes(e)}},setup(e){const w=e,D=a(),P=le(),{claudeProxy:ma,codexProxy:ka,geminiProxy:Ta,opencodeProxy:ba,claudeChannels:xa,codexChannels:Ca,geminiChannels:wa,opencodeChannels:$a,schedulerState:_a,getProxyState:qa,startProxy:za,stopProxy:Sa,getLogs:La,clearLogsForSource:Ia,loadChannels:ja,logLimit:Oa,statsInterval:Na}=$(),{dashboardData:Ma,loadDashboard:Aa}=_(),Fa={claude:{title:"ClaudeCode",subtitle:"智能编程助手",icon:J},codex:{title:"Codex-CLI",subtitle:"高效代码生成",icon:V},gemini:{title:"Gemini-CLI",subtitle:"多模态AI助手",icon:E},opencode:{title:"OpenCode",subtitle:"AI 代码助手",icon:U}},Da=l(()=>Fa[w.channelType].title);l(()=>Fa[w.channelType].subtitle);const Pa=l(()=>Fa[w.channelType].icon),Ua=l(()=>"claude"===w.channelType?ma.value:"codex"===w.channelType?ka.value:"gemini"===w.channelType?Ta.value:"opencode"===w.channelType?ba.value:{}),Ea=l(()=>"claude"===w.channelType?"Claude":"codex"===w.channelType?"Codex":"gemini"===w.channelType?"Gemini":"opencode"===w.channelType?"OpenCode":""),Va=n({projects:0,sessions:0}),Ja=n({requests:0,tokens:0,cost:0}),Ka=n({requests:0,tokens:0,cost:0}),Ga={requests:0,tokens:0,cost:3};let Ra={requests:null,tokens:null,cost:null};const Za=n({requests:!1,tokens:!1,cost:!1}),Ba=l(()=>{var e,a,l;const n="claude"===w.channelType?"claude":"codex"===w.channelType?"codex":"opencode"===w.channelType?"opencode":"gemini";return(null==(l=null==(a=null==(e=Ma.value)?void 0:e.todayStats)?void 0:a[n])?void 0:l.byModel)||{}});function Ha(e,a,l,n=600){Ra[e]&&cancelAnimationFrame(Ra[e]),Za.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=Ga[e]??0,r=Math.pow(10,d),v=d>0?Math.round(u*r)/r:Math.round(u);Ka.value[e]=v,o<1?Ra[e]=requestAnimationFrame(c):Za.value[e]=!1};Ra[e]=requestAnimationFrame(c)}const Wa=n(!1);function Xa(e){try{const a=localStorage.getItem(fa),l=a?JSON.parse(a):{};l[w.channelType]=e,localStorage.setItem(fa,JSON.stringify(l))}catch(a){}}const Ya=n(function(){try{const e=localStorage.getItem(fa);if(e){return JSON.parse(e)[w.channelType]||!1}}catch(e){}return!1}());async function Qa(){Ya.value=!Ya.value,Xa(Ya.value);try{if(await F("channelLocks",w.channelType,Ya.value),Ma.value){const e=Ma.value.uiConfig||{},a={...e.channelLocks||{}};a[w.channelType]=Ya.value,Ma.value={...Ma.value,uiConfig:{...e,channelLocks:a}}}}catch(e){}}const el=n(!0);function al(e){e.detail&&void 0!==e.detail.showLogs&&(el.value=e.detail.showLogs)}const ll=n(Date.now()),nl=l(()=>{if(!Ua.value.running)return"";const e=Ua.value.startTime;if(!e)return"";const a=ll.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}),sl=n(null),cl=l(()=>Oa.value),tl={claude:La("claude"),codex:La("codex"),gemini:La("gemini"),opencode:La("opencode")},ol=l(()=>((tl[w.channelType]||tl.claude).value||[]).slice(0,cl.value));let il=null,ul=null,dl=null,rl=!1,vl=null;const pl=l(()=>{let e=[];"claude"===w.channelType?e=xa.value||[]:"codex"===w.channelType?e=Ca.value||[]:"gemini"===w.channelType?e=wa.value||[]:"opencode"===w.channelType&&(e=$a.value||[]);return[...e.filter(e=>!1!==e.enabled),...e.filter(e=>!1===e.enabled)]});function hl(e){const a=_a[w.channelType];if(!a||!a.channels)return 0;const l=a.channels.find(a=>a.id===e);return l?l.inflight:0}const yl=l(()=>{var e;const a=pl.value.filter(e=>!1!==e.enabled).length;return(null==(e=Ua.value.proxy)?void 0:e.running)?`${a}个渠道调度中`:pl.value.length>0?`${a}个渠道已启用`:"无渠道"}),gl=n({});function fl(e){return gl.value[e]||{requests:0,tokens:0,cost:0}}async function ml(){var e;try{let a;if("claude"===w.channelType?a=await z():"codex"===w.channelType?a=await S():"gemini"===w.channelType?a=await L():"opencode"===w.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};gl.value=l}}catch(a){}}async function kl(e){var a,l;const n=qa(w.channelType);n.value.loading=!0;try{let a;a=e?await za(w.channelType):await Sa(w.channelType,{refreshChannelsDrawer:!0}),!1!==a.success?P.success(e?`${Da.value} 代理已启动`:`${Da.value} 代理已停止`):(P.error(a.error||"操作失败"),n.value.running=!e)}catch(s){P.error((null==(l=null==(a=s.response)?void 0:a.data)?void 0:l.error)||s.message||"操作失败"),n.value.running=!e}finally{n.value.loading=!1}}function Tl(){D.push({name:`${w.channelType}-projects`})}function bl(){D.push({name:`${w.channelType}-projects`})}s(ol,e=>{var a;const l=(null==(a=e[0])?void 0:a.id)||null;if(!l||l===il)return void(il=l);il=l,vl&&clearTimeout(vl),vl=setTimeout(()=>{ml()},5e3);(!sl.value||sl.value.scrollTop<20)&&C(()=>{sl.value&&(sl.value.scrollTop=0)})}),s(()=>Ja.value.requests,e=>{Ha("requests",Ka.value.requests,e,600)}),s(()=>Ja.value.tokens,e=>{Ha("tokens",Ka.value.tokens,e,600)}),s(()=>Ja.value.cost,e=>{Ha("cost",Ka.value.cost,e,600)}),s(()=>w.channelType,()=>{var e;il=(null==(e=ol.value[0])?void 0:e.id)||null}),s(()=>{var e,a;return null==(a=null==(e=Ma.value)?void 0:e.counts)?void 0:a[w.channelType]},()=>{$l()}),s(Na,()=>{rl&&function(){ul&&(clearInterval(ul),ul=null);const e=Na.value||30,a=Math.max(1e3*e,1e4);ul=setInterval(()=>{_l(),ml()},a)}()});const xl=n({});function Cl(e){return!!xl.value[e]}function wl(e,a){e&&(xl.value={...xl.value,[e]:!!a})}function $l(){var e,a;const l=null==(a=null==(e=Ma.value)?void 0:e.counts)?void 0:a[w.channelType];Va.value.projects=(null==l?void 0:l.projectCount)||0,Va.value.sessions=(null==l?void 0:l.sessionCount)||0}async function _l(){if(Ma.value&&Ma.value.todayStats){const e=Ma.value.todayStats[w.channelType];e&&(Ja.value.requests=e.requests||0,Ja.value.tokens=e.tokens||0,Ja.value.cost=e.cost||0)}$l()}function ql(){Ia(w.channelType)}function zl(){window.dispatchEvent(new CustomEvent("open-skills-drawer",{detail:{platform:w.channelType}}))}return c(async()=>{await Promise.all([Aa().then(()=>_l()),ml()]),async function(){var e,a;try{if(Ma.value&&Ma.value.uiConfig)el.value=!1!==(null==(e=Ma.value.uiConfig.panelVisibility)?void 0:e.showLogs);else{const e=await j();e.success&&e.config&&(el.value=!1!==(null==(a=e.config.panelVisibility)?void 0:a.showLogs))}}catch(l){}}(),async function(){var e,a;try{let l=!1;if(Ma.value&&Ma.value.uiConfig)l=(null==(e=Ma.value.uiConfig.channelLocks)?void 0:e[w.channelType])||!1;else{const e=await j();e.success&&e.config&&(l=(null==(a=e.config.channelLocks)?void 0:a[w.channelType])||!1)}Ya.value=l,Xa(l)}catch(l){}}(),window.addEventListener("panel-visibility-change",al),Ka.value={...Ja.value},rl=!0,dl=setInterval(()=>{ll.value=Date.now()},1e3)}),t(()=>{rl=!1,ul&&clearInterval(ul),dl&&clearInterval(dl),vl&&clearTimeout(vl),window.removeEventListener("panel-visibility-change",al),Object.values(Ra).forEach(e=>{e&&cancelAnimationFrame(e)})}),(a,l)=>{const n=o("n-collapse");return u(),i("div",de,[d("div",{class:k(["channel-header",e.channelType])},[d("div",re,[v(h(ne),{size:16},{default:p(()=>[v(h(K))]),_:1})]),d("div",ve,[v(h(ne),{size:20},{default:p(()=>[(u(),y(g(Pa.value)))]),_:1})]),d("h2",pe,f(Da.value),1),["claude","codex","gemini","opencode"].includes(e.channelType)?(u(),i("div",he,[v(h(ce),{trigger:"hover"},{trigger:p(()=>[v(h(se),{text:"",class:"skills-button",onClick:zl,title:"Skills 技能管理"},{icon:p(()=>[v(h(ne),{size:18},{default:p(()=>[v(h(U))]),_:1})]),_:1})]),default:p(()=>[l[3]||(l[3]=m(" Skills 技能管理 ",-1))]),_:1})])):r("",!0),v(h(se),{text:"",class:"lock-button",onClick:Qa,title:Ya.value?"解锁此列":"锁定此列"},{icon:p(()=>[v(h(ne),{size:18},{default:p(()=>[Ya.value?(u(),y(h(G),{key:0})):(u(),y(h(R),{key:1}))]),_:1})]),_:1},8,["title"])],2),Ya.value?r("",!0):(u(),i("div",ye,[d("div",ge,[d("div",fe,[v(h(ne),{size:16},{default:p(()=>[v(h(Z))]),_:1}),l[4]||(l[4]=d("h3",{class:"card-title"},"代理控制",-1)),Ua.value.running&&nl.value?(u(),i("span",me,f(nl.value),1)):r("",!0),v(h(te),{value:Ua.value.running,"onUpdate:value":[l[0]||(l[0]=e=>Ua.value.running=e),kl],loading:Ua.value.loading,size:"small",style:{"margin-left":"auto"}},null,8,["value","loading"])]),d("div",ke,[d("div",Te,[d("div",be,[d("div",{class:k(["status-dot",{active:Ua.value.running}])},null,2),v(h(oe),{type:Ua.value.running?"success":"default",style:{"font-size":"12px"}},{default:p(()=>[m(f(Ua.value.running?"运行中":"已停止"),1)]),_:1},8,["type"]),d("span",xe,"端口: "+f(Ua.value.port),1)]),v(h(ue),{trigger:"click",placement:"bottom",width:320,class:"channel-popover"},{trigger:p(()=>[v(h(se),{text:"",size:"tiny",class:"channel-status"},{default:p(()=>[d("span",Ce,f(yl.value),1)]),_:1})]),default:p(()=>[d("div",we,[d("div",$e,[l[6]||(l[6]=d("span",null,"渠道快捷管理",-1)),v(h(oe),{depth:"3",style:{"font-size":"11px"}},{default:p(()=>[...l[5]||(l[5]=[m("点击开关切换状态",-1)])]),_:1})]),0===pl.value.length?(u(),i("div",_e,[v(h(oe),{depth:"3"},{default:p(()=>[...l[7]||(l[7]=[m("暂无配置渠道",-1)])]),_:1})])):(u(),i("div",qe,[(u(!0),i(T,null,b(pl.value,e=>{var a,n;return u(),i("div",{key:e.id,class:k(["channel-quick-item",{disabled:!1===e.enabled}])},[d("div",ze,[d("span",Se,f(e.name),1),"frozen"===(null==(a=e.health)?void 0:a.status)?(u(),y(h(ie),{key:0,size:"tiny",type:"error",bordered:!1},{default:p(()=>[...l[8]||(l[8]=[m(" 冻结 ",-1)])]),_:1})):r("",!0),v(h(te),{size:"small",value:!1!==e.enabled,"onUpdate:value":a=>async function(e,a){if(e&&!Cl(e.id)){wl(e.id,!0);try{let l;"claude"===w.channelType?l=O:"codex"===w.channelType?l=N:"gemini"===w.channelType?l=M:"opencode"===w.channelType&&(l=A),l&&(await l(e.id,{enabled:a}),P.success(a?`渠道「${e.name}」已启用`:`渠道「${e.name}」已停用`),await ja())}catch(l){P.error("操作失败: "+l.message)}finally{wl(e.id,!1)}}}(e,a),loading:Cl(e.id),disabled:Cl(e.id),style:{"margin-left":"auto"}},null,8,["value","onUpdate:value","loading","disabled"])]),Cl(e.id)?(u(),i("div",Le," 正在切换渠道状态... ")):r("",!0),d("div",Ie,[d("span",je,[l[9]||(l[9]=d("span",{class:"metric-label"},"请求",-1)),d("span",Oe,f(fl(e.id).requests),1)]),d("span",Ne,[l[10]||(l[10]=d("span",{class:"metric-label"},"Tokens",-1)),d("span",Me,f((n=fl(e.id).tokens,n>=1e6?(n/1e6).toFixed(1)+"M":n>=1e3?(n/1e3).toFixed(1)+"K":n.toString())),1)]),d("span",Ae,[l[11]||(l[11]=d("span",{class:"metric-label"},"权重",-1)),d("span",Fe,f(e.weight||1),1)]),d("span",De,[l[12]||(l[12]=d("span",{class:"metric-label"},"并发",-1)),d("span",{class:k(["metric-value",{active:hl(e.id)>0}])},f(hl(e.id))+f(e.maxConcurrency?`/${e.maxConcurrency}`:""),3)])])],2)}),128))]))])]),_:1})])])]),d("div",Pe,[d("div",Ue,[v(h(ne),{size:14},{default:p(()=>[v(h(B))]),_:1}),l[13]||(l[13]=d("h3",{class:"card-title"},"快速访问",-1))]),d("div",Ee,[d("div",Ve,[d("div",{class:"access-card access-card-projects clickable",onClick:Tl},[d("div",Je,[v(h(ne),{size:16},{default:p(()=>[v(h(H))]),_:1})]),d("div",Ke,[l[14]||(l[14]=d("span",{class:"access-label"},"项目",-1)),d("span",Ge,f(Va.value.projects),1)])]),d("div",{class:"access-card access-card-sessions clickable",onClick:l[1]||(l[1]=e=>Wa.value=!0)},[d("div",Re,[v(h(ne),{size:16},{default:p(()=>[v(h(W))]),_:1})]),d("div",Ze,[l[15]||(l[15]=d("span",{class:"access-label"},"最新对话",-1)),d("span",Be,f(Va.value.sessions),1)])]),d("div",{class:"access-card access-card-goto clickable",onClick:bl},[d("div",He,[v(h(ne),{size:16},{default:p(()=>[v(h(X))]),_:1})]),d("div",We,[l[16]||(l[16]=d("span",{class:"access-label"},"前往",-1)),d("span",Xe,f(Ea.value),1)])])])])]),d("div",{class:k(["card stats-card",`stats-card-${e.channelType}`])},[d("div",Ye,[v(h(ne),{size:14},{default:p(()=>[v(h(Y))]),_:1}),l[17]||(l[17]=d("h3",{class:"card-title"},"今日数据",-1))]),d("div",Qe,[d("div",ea,[d("div",aa,[l[19]||(l[19]=d("div",{class:"stat-icon-dot requests"},null,-1)),d("div",la,[l[18]||(l[18]=d("span",{class:"stat-label"},"请求",-1)),d("span",{class:k(["stat-value",{animating:Za.value.requests}])},f(Ka.value.requests),3)])]),d("div",na,[l[21]||(l[21]=d("div",{class:"stat-icon-dot tokens"},null,-1)),d("div",sa,[l[20]||(l[20]=d("span",{class:"stat-label"},"总 Tokens",-1)),d("span",{class:k(["stat-value",{animating:Za.value.tokens}])},f((c=Ka.value.tokens,c>=1e6?(c/1e6).toFixed(1)+"M":c>=1e3?(c/1e3).toFixed(1)+"K":c.toString())),3)])]),d("div",ca,[l[23]||(l[23]=d("div",{class:"stat-icon-dot cost"},null,-1)),d("div",ta,[l[22]||(l[22]=d("span",{class:"stat-label"},"成本 / USD",-1)),d("span",{class:k(["stat-value",{animating:Za.value.cost}])},f((s=Ka.value.cost,!s||Number.isNaN(s)?"$0":"$"+Number(s).toFixed(3))),3)])])])])],2),Object.keys(Ba.value).length>0?(u(),i("div",{key:0,class:k(["card chart-card",`chart-card-${e.channelType}`])},[v(n,{"default-expanded-names":[],accordion:""})],2)):r("",!0),el.value?(u(),i("div",oa,[d("div",ia,[v(h(ne),{size:14},{default:p(()=>[v(h(Q))]),_:1}),l[24]||(l[24]=d("h3",{class:"card-title"},"实时日志",-1)),v(h(se),{text:"",size:"tiny",onClick:x(ql,["stop"]),style:{"margin-left":"auto"},title:"清空日志"},{icon:p(()=>[v(h(ne),{size:14},{default:p(()=>[v(h(ee))]),_:1})]),_:1})]),d("div",ua,[d("div",da,[d("div",{class:k(["logs-table-header",`logs-header-${e.channelType}`])},[d("div",{class:k(["log-col col-channel",`col-channel-${e.channelType}`])},"渠道",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"请求",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"回复",2),"claude"===e.channelType?(u(),i(T,{key:0},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"写入",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"命中",2)],64)):"codex"===e.channelType?(u(),i(T,{key:1},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"推理",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2)],64)):"gemini"===e.channelType?(u(),i(T,{key:2},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"总计",2)],64)):"opencode"===e.channelType?(u(),i(T,{key:3},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},"总计",2)],64)):r("",!0),d("div",{class:k(["log-col col-time",`col-time-${e.channelType}`])},"时间",2)],2),d("div",{class:"logs-container",ref_key:"logsContainer",ref:sl},[0===ol.value.length?(u(),i("div",ra,[v(h(ne),{size:32,depth:"3",style:{"margin-bottom":"8px"}},{default:p(()=>[v(h(Q))]),_:1}),v(h(oe),{depth:"3",style:{"font-size":"12px","font-weight":"500"}},{default:p(()=>[...l[25]||(l[25]=[m("暂无实时日志",-1)])]),_:1}),v(h(oe),{depth:"3",style:{"font-size":"11px","margin-top":"4px"}},{default:p(()=>[...l[26]||(l[26]=[m("开启代理后将显示请求记录",-1)])]),_:1})])):r("",!0),(u(!0),i(T,null,b(ol.value,a=>{var l,n,s,c,t,o,y,g,b,x;return u(),i("div",{key:a.id,class:k(["log-row",{"action-row":"action"===a.type,"new-log":a.isNew}])},["action"===a.type?(u(),i("div",va,[v(h(ne),{size:12,color:"#18a058"},{default:p(()=>[v(h(ae))]),_:1}),d("span",pa,f(a.message),1),d("span",ha,f(a.time),1)])):(u(),i(T,{key:1},[d("div",{class:k(["log-col col-channel",`col-channel-${e.channelType}`])},[v(h(ie),{size:"tiny",type:"success"},{default:p(()=>[m(f(a.channel),1)]),_:2},1024)],2),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},f((null==(l=a.tokens)?void 0:l.input)||0),3),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},f((null==(n=a.tokens)?void 0:n.output)||0),3),"claude"===e.channelType?(u(),i(T,{key:0},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},f((null==(s=a.tokens)?void 0:s.cacheCreation)||0),3),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},f((null==(c=a.tokens)?void 0:c.cacheRead)||0),3)],64)):"codex"===e.channelType?(u(),i(T,{key:1},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},f((null==(t=a.tokens)?void 0:t.reasoning)||0),3),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},f((null==(o=a.tokens)?void 0:o.cached)||0),3)],64)):"gemini"===e.channelType?(u(),i(T,{key:2},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},f((null==(y=a.tokens)?void 0:y.cached)||0),3),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},f((null==(g=a.tokens)?void 0:g.total)||0),3)],64)):"opencode"===e.channelType?(u(),i(T,{key:3},[d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},f((null==(b=a.tokens)?void 0:b.cached)||0),3),d("div",{class:k(["log-col col-token",`col-token-${e.channelType}`])},f((null==(x=a.tokens)?void 0:x.total)||0),3)],64)):r("",!0),d("div",{class:k(["log-col col-time",`col-time-${e.channelType}`])},f(a.time),3)],64))],2)}),128))],512)])])])):r("",!0)])),Ya.value?(u(),i("div",{key:1,class:k(["locked-overlay",`locked-${e.channelType}`])},[d("div",ya,[d("div",ga,[v(h(ne),{size:48},{default:p(()=>[v(h(G))]),_:1})]),l[28]||(l[28]=d("h3",{class:"locked-title"},"该渠道已锁定",-1)),v(h(oe),{depth:"3",class:"locked-hint"},{default:p(()=>[...l[27]||(l[27]=[m(" 点击上方按钮解锁以查看内容 ",-1)])]),_:1})])],2)):r("",!0),v(q,{visible:Wa.value,"onUpdate:visible":l[2]||(l[2]=e=>Wa.value=e),channel:e.channelType},null,8,["visible","channel"])]);var s,c}}},[["__scopeId","data-v-fb3a530a"]]),ka=n({theme:"light",panelVisibility:{showChannels:!0,showLogs:!0},channelLocks:{claude:!1,codex:!1,gemini:!1},channelCollapse:{claude:[],codex:[],gemini:[]},channelOrder:{claude:[],codex:[],gemini:[]}});let Ta=!1,ba=null;async function xa(){return Ta?ka.value:ba||(ba=(async()=>{try{const e=await j();e.success&&e.config&&(ka.value=e.config,Ta=!0)}catch(e){}finally{ba=null}return ka.value})(),ba)}const Ca={class:"dashboard-container"},wa="dashboardChannelOrder",$a=w({__name:"Home",setup(a){const l=["claude","codex","gemini","opencode"],{uiConfig:s,updateConfig:t,loadUIConfig:o}=(Ta||xa(),{uiConfig:ka,loadUIConfig:xa,saveConfig:async function(e){try{const a=await P(e);return!!a.success&&(ka.value=a.config,!0)}catch(a){return!1}},updateConfig:async function(e,a){try{const l=await D(e,a);return!!l.success&&(ka.value=l.config,!0)}catch(l){return!1}},updateNestedConfig:async function(e,a,l){try{const n=await F(e,a,l);return!!n.success&&(ka.value=n.config,!0)}catch(n){return!1}}});function d(e){try{localStorage.setItem(wa,JSON.stringify(e))}catch(a){}}const r=n(function(){try{const e=localStorage.getItem(wa);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",Ca,[v(h(e),{modelValue:r.value,"onUpdate:modelValue":l[0]||(l[0]=e=>r.value=e),class:"dashboard-grid","item-key":"type",animation:200,handle:".drag-handle",onEnd:g},{item:p(({element:e})=>[(u(),y(ma,{"channel-type":e.type,key:e.type},null,8,["channel-type"]))]),_:1},8,["modelValue"])]))}},[["__scopeId","data-v-06100f0f"]]);export{$a as default};
|