coding-tool-x 3.5.9 → 3.5.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +4 -25
  3. package/bin/ctx.js +1 -6
  4. package/dist/web/assets/{Analytics-C5W3axXs.js → Analytics-Bw-0r4Ys.js} +2 -2
  5. package/dist/web/assets/Analytics-RNn1BUbG.css +1 -0
  6. package/dist/web/assets/{ConfigTemplates-DzyVFDx9.js → ConfigTemplates-C6QRIeDj.js} +1 -1
  7. package/dist/web/assets/Home-BQxQ1LhR.css +1 -0
  8. package/dist/web/assets/{Home-C9TQNB6f.js → Home-B_Z9ythw.js} +1 -1
  9. package/dist/web/assets/{PluginManager-9B_brLWT.js → PluginManager-Ce-mws6Q.js} +1 -1
  10. package/dist/web/assets/ProjectList-9Z7FFCIT.js +1 -0
  11. package/dist/web/assets/ProjectList-DL4JK6ci.css +1 -0
  12. package/dist/web/assets/SessionList-CyETQcs8.js +1 -0
  13. package/dist/web/assets/SessionList-D12muXvx.css +1 -0
  14. package/dist/web/assets/{SkillManager-vST8DRRg.js → SkillManager-DSUcP1se.js} +1 -1
  15. package/dist/web/assets/{WorkspaceManager-ov1KgRXR.js → WorkspaceManager-Cvbc11bJ.js} +1 -1
  16. package/dist/web/assets/icons-lKCTySl7.js +1 -0
  17. package/dist/web/assets/index-BS7aplYp.css +1 -0
  18. package/dist/web/assets/index-CTeg1xG-.js +2 -0
  19. package/dist/web/assets/{markdown-DyTJGI4N.js → markdown-BNJfEgCA.js} +1 -1
  20. package/dist/web/assets/{naive-ui-Cg4_ZeoT.js → naive-ui-DM897mIP.js} +1 -1
  21. package/dist/web/assets/vendors-DQA4Hw9v.js +7 -0
  22. package/dist/web/assets/vue-vendor-B5RqjEjQ.js +45 -0
  23. package/dist/web/index.html +8 -8
  24. package/package.json +1 -2
  25. package/src/commands/daemon.js +5 -33
  26. package/src/commands/export-config.js +6 -6
  27. package/src/commands/stats.js +4 -41
  28. package/src/commands/ui.js +3 -12
  29. package/src/config/channel-preset-websites.js +114 -0
  30. package/src/config/default.js +9 -5
  31. package/src/config/loader.js +2 -2
  32. package/src/config/model-metadata.json +16 -20
  33. package/src/config/paths.js +33 -166
  34. package/src/index.js +34 -125
  35. package/src/server/api/agents.js +2 -52
  36. package/src/server/api/codex-channels.js +4 -0
  37. package/src/server/api/codex-proxy.js +45 -2
  38. package/src/server/api/codex-sessions.js +89 -12
  39. package/src/server/api/commands.js +2 -38
  40. package/src/server/api/dashboard.js +1 -25
  41. package/src/server/api/gemini-proxy.js +4 -2
  42. package/src/server/api/gemini-sessions.js +86 -9
  43. package/src/server/api/hooks.js +1 -17
  44. package/src/server/api/opencode-proxy.js +7 -2
  45. package/src/server/api/opencode-sessions.js +83 -10
  46. package/src/server/api/plugins.js +34 -128
  47. package/src/server/api/proxy.js +5 -3
  48. package/src/server/api/sessions.js +181 -27
  49. package/src/server/api/workspaces.js +0 -14
  50. package/src/server/index.js +9 -31
  51. package/src/server/services/agents-service.js +62 -269
  52. package/src/server/services/base/base-channel-service.js +3 -1
  53. package/src/server/services/channels.js +5 -0
  54. package/src/server/services/codex-channels.js +2 -0
  55. package/src/server/services/codex-sessions.js +88 -108
  56. package/src/server/services/commands-service.js +81 -281
  57. package/src/server/services/config-export-service.js +7 -7
  58. package/src/server/services/config-registry-service.js +9 -8
  59. package/src/server/services/config-sync-manager.js +41 -61
  60. package/src/server/services/config-sync-service.js +3 -3
  61. package/src/server/services/gemini-channels.js +17 -6
  62. package/src/server/services/gemini-config.js +4 -3
  63. package/src/server/services/gemini-sessions.js +59 -26
  64. package/src/server/services/gemini-settings-manager.js +3 -2
  65. package/src/server/services/mcp-service.js +14 -9
  66. package/src/server/services/native-oauth-adapters.js +3 -3
  67. package/src/server/services/network-access.js +2 -61
  68. package/src/server/services/notification-hooks.js +19 -184
  69. package/src/server/services/opencode-channels.js +9 -0
  70. package/src/server/services/opencode-sessions.js +6 -16
  71. package/src/server/services/opencode-settings-manager.js +3 -3
  72. package/src/server/services/plugins-service.js +62 -996
  73. package/src/server/services/prompts-service.js +9 -5
  74. package/src/server/services/sessions.js +171 -183
  75. package/src/server/services/skill-service.js +18 -155
  76. package/src/server/websocket-server.js +4 -35
  77. package/dist/web/assets/Analytics-vQS5IWvs.css +0 -1
  78. package/dist/web/assets/Home-qzk118Of.css +0 -1
  79. package/dist/web/assets/ProjectList-Bjt6mrsV.js +0 -1
  80. package/dist/web/assets/ProjectList-GCC2QOmq.css +0 -1
  81. package/dist/web/assets/SessionList-BsHPgmUR.css +0 -1
  82. package/dist/web/assets/SessionList-DcBH13uA.js +0 -1
  83. package/dist/web/assets/icons-CEq2hYB-.js +0 -1
  84. package/dist/web/assets/index-Dih_bOsv.css +0 -1
  85. package/dist/web/assets/index-Duc7QP4e.js +0 -2
  86. package/dist/web/assets/vendors-Bsp-dq2d.js +0 -7
  87. package/dist/web/assets/vue-vendor-BxIT0uQq.js +0 -45
  88. package/docs/Caddyfile.example +0 -19
  89. package/docs/reverse-proxy-https.md +0 -57
  90. package/src/server/services/https-cert.js +0 -171
  91. package/src/server/services/session-launch-command.js +0 -58
  92. package/src/server/services/web-ui-runtime.js +0 -54
@@ -18,7 +18,7 @@ const {
18
18
  parseSkillContent,
19
19
  } = require('./format-converter');
20
20
  const { maskToken } = require('./oauth-utils');
21
- const { NATIVE_PATHS, HOME_DIR, PATHS, getNativePlatformSkillsDir } = require('../../config/paths');
21
+ const { NATIVE_PATHS, HOME_DIR, PATHS } = require('../../config/paths');
22
22
 
23
23
  const SUPPORTED_PLATFORMS = ['claude', 'codex', 'gemini', 'opencode'];
24
24
  const SUPPORTED_REPO_PROVIDERS = ['github', 'gitlab', 'local'];
@@ -166,25 +166,25 @@ const DEFAULT_REPOS_BY_PLATFORM = {
166
166
 
167
167
  const PLATFORM_CONFIG = {
168
168
  claude: {
169
- installDir: getNativePlatformSkillsDir('claude'),
169
+ installDir: path.join(HOME_DIR, '.claude', 'skills'),
170
170
  storageDir: PATHS.localSkills.claude,
171
171
  reposFile: PATHS.skillRepos.claude,
172
172
  cacheFile: PATHS.skillCaches.claude
173
173
  },
174
174
  codex: {
175
- installDir: getNativePlatformSkillsDir('codex'),
175
+ installDir: path.join(HOME_DIR, '.codex', 'skills'),
176
176
  storageDir: PATHS.localSkills.codex,
177
177
  reposFile: PATHS.skillRepos.codex,
178
178
  cacheFile: PATHS.skillCaches.codex
179
179
  },
180
180
  gemini: {
181
- installDir: getNativePlatformSkillsDir('gemini'),
181
+ installDir: path.join(HOME_DIR, '.gemini', 'skills'),
182
182
  storageDir: PATHS.localSkills.gemini,
183
183
  reposFile: PATHS.skillRepos.gemini,
184
184
  cacheFile: PATHS.skillCaches.gemini
185
185
  },
186
186
  opencode: {
187
- installDir: getNativePlatformSkillsDir('opencode'),
187
+ installDir: path.join(NATIVE_PATHS.opencode.config, 'skills'),
188
188
  storageDir: PATHS.localSkills.opencode,
189
189
  reposFile: PATHS.skillRepos.opencode,
190
190
  cacheFile: PATHS.skillCaches.opencode
@@ -248,12 +248,11 @@ class SkillService {
248
248
  }
249
249
  }
250
250
 
251
- prepareSkills(skills = [], options = {}) {
251
+ prepareSkills(skills = []) {
252
252
  const preparedSkills = Array.isArray(skills)
253
253
  ? skills.map(skill => ({ ...skill }))
254
254
  : [];
255
255
 
256
- this.mergeInstalledSkills(preparedSkills, options);
257
256
  this.mergeLocalSkills(preparedSkills);
258
257
  this.deduplicateSkills(preparedSkills);
259
258
  preparedSkills.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()));
@@ -538,8 +537,6 @@ class SkillService {
538
537
  * 获取所有技能列表(带缓存)
539
538
  */
540
539
  async listSkills(forceRefresh = false) {
541
- const prepareOptions = { syncManagedLocalSkills: forceRefresh };
542
-
543
540
  // 强制刷新时仅清空内存缓存,保留磁盘缓存作为回退来源
544
541
  if (forceRefresh) {
545
542
  this.clearCache();
@@ -550,11 +547,11 @@ class SkillService {
550
547
  // 检查内存缓存
551
548
  if (!forceRefresh && Array.isArray(this.skillsCache) && this.skillsCache.length > 0) {
552
549
  if (Array.isArray(fileCache) && fileCache.length > this.skillsCache.length) {
553
- this.skillsCache = this.prepareSkills(fileCache, prepareOptions);
550
+ this.skillsCache = this.prepareSkills(fileCache);
554
551
  this.cacheTime = Date.now();
555
552
  return this.skillsCache;
556
553
  }
557
- this.skillsCache = this.prepareSkills(this.skillsCache, prepareOptions);
554
+ this.skillsCache = this.prepareSkills(this.skillsCache);
558
555
  this.cacheTime = Date.now();
559
556
  return this.skillsCache;
560
557
  }
@@ -562,7 +559,7 @@ class SkillService {
562
559
  // 检查文件缓存
563
560
  if (!forceRefresh) {
564
561
  if (fileCache && fileCache.length > 0) {
565
- this.skillsCache = this.prepareSkills(fileCache, prepareOptions);
562
+ this.skillsCache = this.prepareSkills(fileCache);
566
563
  this.cacheTime = Date.now();
567
564
  return this.skillsCache;
568
565
  }
@@ -603,10 +600,10 @@ class SkillService {
603
600
  }
604
601
  }
605
602
 
606
- const preparedSkills = this.prepareSkills(skills, prepareOptions);
603
+ const preparedSkills = this.prepareSkills(skills);
607
604
 
608
605
  const hasUsableFileCache = Array.isArray(fileCache) && fileCache.length > 0;
609
- const preparedFileCache = hasUsableFileCache ? this.prepareSkills(fileCache, prepareOptions) : null;
606
+ const preparedFileCache = hasUsableFileCache ? this.prepareSkills(fileCache) : null;
610
607
  const shouldUseStaleFileCache = hasUsableFileCache && (
611
608
  (enabledRemoteRepos.length > 0 && remoteFailureCount === enabledRemoteRepos.length) ||
612
609
  (remoteFailureCount > 0 && preparedFileCache.length > preparedSkills.length)
@@ -1350,75 +1347,6 @@ class SkillService {
1350
1347
  this.scanLocalDir(this.storageDir, this.storageDir, skills);
1351
1348
  }
1352
1349
 
1353
- /**
1354
- * 合并平台原生安装目录中的技能,补齐“已安装但未被仓库/本地托管覆盖”的条目
1355
- */
1356
- mergeInstalledSkills(skills, options = {}) {
1357
- if (!fs.existsSync(this.installDir)) return;
1358
-
1359
- const syncManagedLocalSkills = options.syncManagedLocalSkills === true;
1360
- const installedSkills = [];
1361
- this.scanInstalledDir(this.installDir, this.installDir, installedSkills);
1362
-
1363
- for (const installedSkill of installedSkills) {
1364
- const normalizedDirectory = normalizeRepoPath(installedSkill.directory).toLowerCase();
1365
- const existing = skills.find(skill =>
1366
- normalizeRepoPath(skill.directory).toLowerCase() === normalizedDirectory
1367
- );
1368
-
1369
- if (existing) {
1370
- const managedSkillMdPath = path.join(this.storageDir, installedSkill.directory, 'SKILL.md');
1371
- if (syncManagedLocalSkills && fs.existsSync(managedSkillMdPath)) {
1372
- const installedSkillPath = path.join(this.installDir, installedSkill.directory);
1373
- this.ensureManagedSkillCopy(installedSkill.directory, installedSkillPath, { overwrite: true });
1374
- }
1375
- existing.installed = true;
1376
- if (!existing.name && installedSkill.name) {
1377
- existing.name = installedSkill.name;
1378
- }
1379
- if (!existing.description && installedSkill.description) {
1380
- existing.description = installedSkill.description;
1381
- }
1382
- if (!existing.license && installedSkill.license) {
1383
- existing.license = installedSkill.license;
1384
- }
1385
- continue;
1386
- }
1387
-
1388
- const installedSkillPath = path.join(this.installDir, installedSkill.directory);
1389
- this.ensureManagedSkillCopy(installedSkill.directory, installedSkillPath, {
1390
- overwrite: syncManagedLocalSkills
1391
- });
1392
- skills.push(installedSkill);
1393
- }
1394
- }
1395
-
1396
- ensureManagedSkillCopy(directory, sourceDir, options = {}) {
1397
- const normalizedDirectory = normalizeRepoPath(directory);
1398
- const overwrite = options.overwrite === true;
1399
- if (!normalizedDirectory || !sourceDir || !fs.existsSync(sourceDir)) {
1400
- return false;
1401
- }
1402
-
1403
- const sourceSkillMdPath = path.join(sourceDir, 'SKILL.md');
1404
- if (!fs.existsSync(sourceSkillMdPath)) {
1405
- return false;
1406
- }
1407
-
1408
- const managedDir = path.join(this.storageDir, normalizedDirectory);
1409
- const managedSkillMdPath = path.join(managedDir, 'SKILL.md');
1410
- if (fs.existsSync(managedSkillMdPath)) {
1411
- if (!overwrite) {
1412
- return false;
1413
- }
1414
- fs.rmSync(managedDir, { recursive: true, force: true });
1415
- }
1416
-
1417
- fs.mkdirSync(managedDir, { recursive: true });
1418
- this.copyDirRecursive(sourceDir, managedDir);
1419
- return true;
1420
- }
1421
-
1422
1350
  /**
1423
1351
  * 递归扫描本地目录
1424
1352
  */
@@ -1482,54 +1410,6 @@ class SkillService {
1482
1410
  }
1483
1411
  }
1484
1412
 
1485
- /**
1486
- * 递归扫描平台原生安装目录
1487
- */
1488
- scanInstalledDir(currentDir, baseDir, skills) {
1489
- const skillMdPath = path.join(currentDir, 'SKILL.md');
1490
-
1491
- if (fs.existsSync(skillMdPath)) {
1492
- const directory = currentDir === baseDir
1493
- ? path.basename(currentDir)
1494
- : path.relative(baseDir, currentDir);
1495
-
1496
- try {
1497
- const content = fs.readFileSync(skillMdPath, 'utf-8');
1498
- const metadata = this.parseSkillMd(content);
1499
-
1500
- skills.push({
1501
- key: `installed:${directory}`,
1502
- name: metadata.name || directory,
1503
- description: metadata.description || '',
1504
- directory,
1505
- installed: true,
1506
- isLocal: false,
1507
- readmeUrl: null,
1508
- repoOwner: null,
1509
- repoName: null,
1510
- repoBranch: null,
1511
- license: metadata.license,
1512
- source: 'native-installed'
1513
- });
1514
- } catch (err) {
1515
- console.warn(`[SkillService] Parse installed skill ${directory} error:`, err.message);
1516
- }
1517
-
1518
- return;
1519
- }
1520
-
1521
- try {
1522
- const entries = fs.readdirSync(currentDir, { withFileTypes: true });
1523
- for (const entry of entries) {
1524
- if (entry.isDirectory() && !entry.name.startsWith('.')) {
1525
- this.scanInstalledDir(path.join(currentDir, entry.name), baseDir, skills);
1526
- }
1527
- }
1528
- } catch (err) {
1529
- // 忽略读取错误
1530
- }
1531
- }
1532
-
1533
1413
  /**
1534
1414
  * 去重技能列表
1535
1415
  */
@@ -2041,8 +1921,11 @@ ${content}
2041
1921
  * 获取技能详情(完整内容)
2042
1922
  */
2043
1923
  async getSkillDetail(directory, repoHint = null, fullDirectoryHint = '') {
2044
- const parseLocalSkillDetail = (skillMdPath, { installed, isLocal }) => {
2045
- const content = fs.readFileSync(skillMdPath, 'utf-8');
1924
+ // 先检查本地是否安装
1925
+ const localPath = path.join(this.installDir, directory, 'SKILL.md');
1926
+
1927
+ if (fs.existsSync(localPath)) {
1928
+ const content = fs.readFileSync(localPath, 'utf-8');
2046
1929
  const metadata = this.parseSkillMd(content);
2047
1930
 
2048
1931
  // 提取正文内容(去除 frontmatter)
@@ -2055,29 +1938,9 @@ ${content}
2055
1938
  description: metadata.description || '',
2056
1939
  content: body,
2057
1940
  fullContent: content,
2058
- installed,
2059
- isLocal,
1941
+ installed: true,
2060
1942
  source: 'local'
2061
1943
  };
2062
- };
2063
-
2064
- // 先检查本地是否安装
2065
- const localPath = path.join(this.installDir, directory, 'SKILL.md');
2066
-
2067
- if (fs.existsSync(localPath)) {
2068
- const managedSkillMdPath = path.join(this.storageDir, directory, 'SKILL.md');
2069
- return parseLocalSkillDetail(localPath, {
2070
- installed: true,
2071
- isLocal: fs.existsSync(managedSkillMdPath)
2072
- });
2073
- }
2074
-
2075
- const managedLocalPath = path.join(this.storageDir, directory, 'SKILL.md');
2076
- if (fs.existsSync(managedLocalPath)) {
2077
- return parseLocalSkillDetail(managedLocalPath, {
2078
- installed: false,
2079
- isLocal: true
2080
- });
2081
1944
  }
2082
1945
 
2083
1946
  const parseRemoteSkillContent = (content, repo, fullDirectory = '') => {
@@ -2225,7 +2088,7 @@ ${content}
2225
2088
  */
2226
2089
  getInstalledSkills() {
2227
2090
  const skills = [];
2228
- this.scanInstalledDir(this.installDir, this.installDir, skills);
2091
+ this.scanLocalDir(this.installDir, this.installDir, skills);
2229
2092
  return skills;
2230
2093
  }
2231
2094
  }
@@ -7,9 +7,7 @@ const { PATHS } = require('../config/paths');
7
7
  const {
8
8
  normalizeAddress,
9
9
  isLoopbackAddress,
10
- isLoopbackRequest,
11
- getRequestProtocol,
12
- getRequestHost
10
+ isLoopbackRequest
13
11
  } = require('./services/network-access');
14
12
 
15
13
  const MAX_PERSISTED_LOGS = 500;
@@ -113,8 +111,8 @@ function isAllowedWebSocketOrigin(req) {
113
111
  return false;
114
112
  }
115
113
 
116
- const requestHost = parseHostHeader(getRequestHost(req));
117
- const requestProtocol = getRequestProtocol(req);
114
+ const requestHost = parseHostHeader(req.headers.host);
115
+ const requestProtocol = req.socket && req.socket.encrypted ? 'https:' : 'http:';
118
116
  const requestHostname = normalizeAddress(requestHost.hostname).toLowerCase();
119
117
  const requestPort = requestHost.port || defaultPortForProtocol(requestProtocol);
120
118
 
@@ -506,40 +504,11 @@ function broadcastSchedulerState(source, schedulerState) {
506
504
  }
507
505
  }
508
506
 
509
- function broadcastBrowserNotification(event = {}) {
510
- const notification = {
511
- type: 'browser-notification',
512
- title: String(event.title || '').trim() || 'Coding Tool',
513
- source: String(event.source || '').trim() || 'claude',
514
- sourceLabel: String(event.sourceLabel || '').trim() || 'Claude Code',
515
- mode: String(event.mode || '').trim() || 'notification',
516
- eventType: String(event.eventType || '').trim(),
517
- message: String(event.message || '').trim() || '任务已完成 | 等待交互',
518
- timestamp: typeof event.timestamp === 'number' ? event.timestamp : Date.now()
519
- };
520
-
521
- if (wss && wsClients.size > 0) {
522
- const message = JSON.stringify(notification);
523
-
524
- wsClients.forEach(client => {
525
- if (client.readyState === WebSocket.OPEN) {
526
- client.send(message);
527
- }
528
- });
529
- }
530
- }
531
-
532
507
  module.exports = {
533
508
  startWebSocketServer,
534
509
  stopWebSocketServer,
535
510
  broadcastLog,
536
511
  clearAllLogs,
537
512
  broadcastProxyState,
538
- broadcastSchedulerState,
539
- broadcastBrowserNotification,
540
- _test: {
541
- parseHostHeader,
542
- defaultPortForProtocol,
543
- isAllowedWebSocketOrigin
544
- }
513
+ broadcastSchedulerState
545
514
  };
@@ -1 +0,0 @@
1
- .analytics-page[data-v-8a2d577b]{background:transparent}.analytics-header[data-v-8a2d577b]{align-items:flex-end}.analytics-content[data-v-8a2d577b]{display:flex;flex-direction:column;gap:16px}.toolbar[data-v-8a2d577b]{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-left:auto}.range-buttons[data-v-8a2d577b]{display:flex;align-items:center;gap:4px}.range-btn[data-v-8a2d577b]{padding:8px 12px;font-size:12px;border:1px solid var(--border-primary);background:var(--surface-panel-strong);color:var(--text-secondary);border-radius:999px;cursor:pointer;transition:all .18s ease}.range-btn[data-v-8a2d577b]:hover{border-color:var(--primary-color, #18a058);color:var(--primary-color, #18a058);transform:translateY(-1px)}.range-btn.active[data-v-8a2d577b]{background:var(--accent-soft);border-color:#18a05847;color:var(--primary-color)}.custom-range-wrapper[data-v-8a2d577b]{margin-left:4px}.loading-overlay[data-v-8a2d577b]{display:flex;justify-content:center;padding:20px 0}.summary-cards[data-v-8a2d577b]{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;flex-shrink:0}.summary-card[data-v-8a2d577b]{position:relative;overflow:hidden;background:var(--surface-panel);border:1px solid var(--border-primary);border-radius:18px;padding:16px 18px;box-shadow:var(--shadow-sm)}.summary-card[data-v-8a2d577b]:after{content:"";position:absolute;inset:0 auto auto 0;width:100%;height:3px;opacity:.9}.summary-card-tokens[data-v-8a2d577b]:after{background:linear-gradient(90deg,#18a058,#18a05847)}.summary-card-cost[data-v-8a2d577b]:after{background:linear-gradient(90deg,#f59e0b,#f59e0b47)}.summary-card-requests[data-v-8a2d577b]:after{background:linear-gradient(90deg,#3b82f6,#3b82f647)}.summary-card-average[data-v-8a2d577b]:after{background:linear-gradient(90deg,#8b5cf6,#8b5cf647)}.summary-label[data-v-8a2d577b]{font-size:11px;color:var(--text-secondary);margin-bottom:6px;text-transform:uppercase;letter-spacing:.05em}.summary-value[data-v-8a2d577b]{font-size:24px;font-weight:760;color:var(--text-primary);line-height:1.2}.chart-section[data-v-8a2d577b]{background:var(--surface-panel);border:1px solid var(--border-primary);border-radius:20px;padding:16px 18px;flex-shrink:0;box-shadow:var(--shadow-sm)}.chart-section.fullscreen[data-v-8a2d577b]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;border-radius:0;padding:20px;background:var(--surface-panel-strong);overflow:auto}.cumulative-section[data-v-8a2d577b]{margin-bottom:8px}.chart-section-header[data-v-8a2d577b]{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.chart-title[data-v-8a2d577b]{font-size:13px;font-weight:600;color:var(--text-primary)}.chart-controls[data-v-8a2d577b]{display:flex;align-items:center;gap:8px}.chart-type-toggle[data-v-8a2d577b]{display:flex;border:1px solid var(--border-primary);border-radius:999px;overflow:hidden;background:var(--surface-panel-muted)}.toggle-btn[data-v-8a2d577b]{padding:8px 12px;font-size:12px;border:none;background:transparent;color:var(--text-secondary);cursor:pointer;transition:all .18s ease}.toggle-btn.active[data-v-8a2d577b]{background:var(--accent-soft);color:var(--primary-color)}.icon-btn[data-v-8a2d577b]{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid var(--border-primary);border-radius:12px;background:var(--surface-panel-muted);cursor:pointer;color:var(--text-secondary);transition:all .18s ease}.icon-btn[data-v-8a2d577b]:hover{border-color:var(--primary-color, #18a058);color:var(--primary-color, #18a058);transform:translateY(-1px)}.main-chart[data-v-8a2d577b]{height:560px;width:100%}.chart-section.fullscreen .main-chart[data-v-8a2d577b]{height:calc(100vh - 100px)}.cumulative-chart[data-v-8a2d577b]{height:200px;width:100%}.empty-state[data-v-8a2d577b]{height:120px;display:flex;align-items:center;justify-content:center;color:var(--text-secondary);font-size:13px}@media (max-width: 768px){.summary-cards[data-v-8a2d577b]{grid-template-columns:repeat(2,1fr)}.analytics-header[data-v-8a2d577b]{align-items:flex-start}.toolbar[data-v-8a2d577b]{width:100%;margin-left:0}}@media (max-width: 480px){.summary-cards[data-v-8a2d577b]{grid-template-columns:1fr 1fr}.summary-value[data-v-8a2d577b]{font-size:18px}}
@@ -1 +0,0 @@
1
- .channel-column[data-v-cb1ff380]{display:flex;flex-direction:column;height:100%;min-height:0;max-height:100%;min-width:0;background:var(--surface-panel);border:1px solid var(--border-primary);border-radius:22px;overflow:hidden;box-shadow:var(--shadow-md)}.channel-header[data-v-cb1ff380]{display:flex;align-items:center;gap:10px;padding:14px 16px;background:var(--surface-panel-strong);position:relative}.drag-handle[data-v-cb1ff380]{cursor:grab;color:var(--text-tertiary);display:flex;align-items:center;padding:4px;margin:-4px 0 -4px -4px;border-radius:10px;transition:all .2s}.drag-handle[data-v-cb1ff380]:hover{color:var(--text-secondary);background:var(--bg-tertiary)}.drag-handle[data-v-cb1ff380]:active{cursor:grabbing}.channel-header[data-v-cb1ff380]:after{content:"";position:absolute;bottom:0;left:16px;right:16px;height:2px;border-radius:1px}.channel-header.claude[data-v-cb1ff380]{background:linear-gradient(135deg,rgba(24,160,88,.08) 0%,transparent 100%)}.channel-header.claude[data-v-cb1ff380]:after{background:linear-gradient(90deg,#18a058,#18a0584d)}.channel-header.codex[data-v-cb1ff380]{background:linear-gradient(135deg,rgba(59,130,246,.08) 0%,transparent 100%)}.channel-header.codex[data-v-cb1ff380]:after{background:linear-gradient(90deg,#3b82f6,#3b82f64d)}.channel-header.gemini[data-v-cb1ff380]{background:linear-gradient(135deg,rgba(168,85,247,.08) 0%,transparent 100%)}.channel-header.gemini[data-v-cb1ff380]:after{background:linear-gradient(90deg,#a855f7,#a855f74d)}.channel-header.opencode[data-v-cb1ff380]{background:linear-gradient(135deg,rgba(234,88,12,.08) 0%,transparent 100%)}.channel-header.opencode[data-v-cb1ff380]:after{background:linear-gradient(90deg,#ea580c,#ea580c4d)}.header-icon[data-v-cb1ff380]{width:36px;height:36px;border-radius:12px;display:flex;align-items:center;justify-content:center;box-shadow:0 10px 24px #09141829}.channel-header.claude .header-icon[data-v-cb1ff380]{background:linear-gradient(135deg,#18a058,#15803d);color:#fff}.channel-header.codex .header-icon[data-v-cb1ff380]{background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff}.channel-header.gemini .header-icon[data-v-cb1ff380]{background:linear-gradient(135deg,#a855f7,#9333ea);color:#fff}.channel-header.opencode .header-icon[data-v-cb1ff380]{background:linear-gradient(135deg,#ea580c,#c2410c);color:#fff}.channel-title[data-v-cb1ff380]{font-size:16px;font-weight:760;margin:0;color:var(--text-primary);letter-spacing:-.02em}.channel-content[data-v-cb1ff380]{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;scrollbar-gutter:stable;padding:12px;display:flex;flex-direction:column;gap:10px}.channel-content[data-v-cb1ff380]::-webkit-scrollbar{width:6px}.channel-content[data-v-cb1ff380]::-webkit-scrollbar-thumb{background:#00000024;border-radius:999px}.channel-content[data-v-cb1ff380]::-webkit-scrollbar-thumb:hover{background:#00000038}[data-theme=dark] .channel-content[data-v-cb1ff380]::-webkit-scrollbar-thumb{background:#ffffff29}[data-theme=dark] .channel-content[data-v-cb1ff380]::-webkit-scrollbar-thumb:hover{background:#ffffff3d}.card[data-v-cb1ff380]{background:var(--surface-panel-strong);border:1px solid var(--border-primary);border-radius:18px;overflow:hidden;flex-shrink:0;transition:all .3s cubic-bezier(.4,0,.2,1);box-shadow:var(--shadow-sm);position:relative}.card[data-v-cb1ff380]: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-cb1ff380]:hover{box-shadow:var(--shadow-md);border-color:var(--border-secondary)}.card[data-v-cb1ff380]:hover:before{opacity:1}.card.clickable[data-v-cb1ff380]{cursor:pointer}.card.clickable[data-v-cb1ff380]:hover{border-color:#18a05847;transform:translateY(-2px);box-shadow:var(--shadow-md)}.card.clickable[data-v-cb1ff380]: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-cb1ff380]:hover:after{opacity:1}.card-header[data-v-cb1ff380]{display:flex;align-items:center;gap:8px;padding:12px 14px;background:linear-gradient(180deg,var(--surface-panel-muted) 0%,var(--surface-panel-strong) 100%);border-bottom:1px solid var(--border-primary);position:relative;min-height:24px}.card-header.compact[data-v-cb1ff380]{padding:10px 14px}.card-header .n-icon[data-v-cb1ff380]{color:var(--text-tertiary);transition:color .2s ease}.card:hover .card-header .n-icon[data-v-cb1ff380]{color:var(--text-secondary)}.card-title[data-v-cb1ff380]{font-size:11px;font-weight:700;margin:0;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.8px}.runtime-badge[data-v-cb1ff380]{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-cb1ff380 2s ease-in-out infinite}@keyframes pulse-runtime-cb1ff380{0%,to{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(.98)}}.card-body[data-v-cb1ff380]{padding:14px;background:var(--surface-panel-strong)}.card-body.compact[data-v-cb1ff380]{padding:10px 12px}.proxy-control[data-v-cb1ff380]{display:flex;justify-content:space-between;align-items:center;gap:16px}.proxy-info[data-v-cb1ff380]{display:flex;flex-direction:column;gap:4px}.proxy-info-row[data-v-cb1ff380]{display:flex;align-items:center;justify-content:space-between}.proxy-status[data-v-cb1ff380]{display:flex;align-items:center;gap:6px}.proxy-port[data-v-cb1ff380]{font-size:11px;color:var(--text-secondary);margin-left:6px}.channel-selector[data-v-cb1ff380]{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-cb1ff380]:hover{background:var(--hover-bg);border-color:var(--border-secondary);color:var(--text-primary)}.channel-selector[data-v-cb1ff380]:disabled{opacity:.5;cursor:not-allowed}.channel-name[data-v-cb1ff380]{font-size:11px;font-weight:500;max-width:90px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-dot[data-v-cb1ff380]{width:8px;height:8px;border-radius:50%;background:var(--border-secondary);transition:all .3s ease}.status-dot.active[data-v-cb1ff380]{background:#18a058;box-shadow:0 0 8px #18a05880}.quick-stats[data-v-cb1ff380]{display:flex;gap:16px;padding:4px 0}.stat-item[data-v-cb1ff380]{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;padding:4px 0}.stat-divider[data-v-cb1ff380]{width:1px;background:linear-gradient(180deg,transparent 0%,var(--border-primary) 50%,transparent 100%)}.quick-access-list[data-v-cb1ff380]{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.access-card[data-v-cb1ff380]{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:14px;background:var(--surface-panel-muted);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-cb1ff380]: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-cb1ff380]{width:34px;height:34px;border-radius:12px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all .3s ease}.access-content[data-v-cb1ff380]{display:flex;flex-direction:column;gap:4px;flex:1}.access-card-projects .access-icon[data-v-cb1ff380]{background:linear-gradient(135deg,#6366f126,#8b5cf626);color:#6366f1}.access-card-projects[data-v-cb1ff380]:before{background:linear-gradient(135deg,#6366f114,#8b5cf614)}.access-card-projects:hover .access-icon[data-v-cb1ff380]{background:linear-gradient(135deg,#6366f140,#8b5cf640);transform:scale(1.1) rotate(-5deg)}.access-card-sessions .access-icon[data-v-cb1ff380]{background:linear-gradient(135deg,#10b98126,#05966926);color:#10b981}.access-card-sessions[data-v-cb1ff380]:before{background:linear-gradient(135deg,#10b98114,#05966914)}.access-card-sessions:hover .access-icon[data-v-cb1ff380]{background:linear-gradient(135deg,#10b98140,#05966940);transform:scale(1.1) rotate(5deg)}.access-card-goto .access-icon[data-v-cb1ff380]{background:linear-gradient(135deg,#f59e0b26,#fb923c26);color:#f59e0b}.access-card-goto[data-v-cb1ff380]:before{background:linear-gradient(135deg,#f59e0b14,#fb923c14)}.access-card-goto:hover .access-icon[data-v-cb1ff380]{background:linear-gradient(135deg,#f59e0b40,#fb923c40);transform:scale(1.1) translate(3px)}.access-card.clickable[data-v-cb1ff380]:hover{transform:translateY(-2px);box-shadow:var(--shadow-sm);border-color:var(--border-secondary)}.access-card.clickable[data-v-cb1ff380]:hover:before{opacity:1}.access-card.clickable[data-v-cb1ff380]:active{transform:translateY(0)}.access-label[data-v-cb1ff380]{display:block;font-size:10px;font-weight:600;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.3px}.access-value[data-v-cb1ff380]{display:block;font-size:18px;font-weight:800;color:var(--text-primary);line-height:1}.access-goto[data-v-cb1ff380]{display:block;font-size:12px;font-weight:700;color:var(--text-primary);line-height:1.2;white-space:nowrap}.stats-inline[data-v-cb1ff380]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}.stats-inline.stats-3col[data-v-cb1ff380]{grid-template-columns:repeat(3,1fr)}.stat-inline-item[data-v-cb1ff380]{display:flex;align-items:center;gap:8px;padding:12px;background:var(--surface-panel-muted);border-radius:14px;border:1px solid var(--border-primary);transition:all .2s ease}.stat-inline-item[data-v-cb1ff380]:hover{border-color:var(--border-secondary);background:var(--hover-bg)}.stat-icon-dot[data-v-cb1ff380]{width:8px;height:8px;border-radius:50%;flex-shrink:0}.stat-icon-dot.requests[data-v-cb1ff380]{background:#3b82f6;box-shadow:0 0 6px #3b82f680}.stat-icon-dot.tokens[data-v-cb1ff380]{background:#18a058;box-shadow:0 0 6px #18a05880}.stat-icon-dot.cost[data-v-cb1ff380]{background:#f59e0b;box-shadow:0 0 6px #f59e0b80}.stat-info[data-v-cb1ff380]{display:flex;flex-direction:column;gap:1px;min-width:0}.stat-label[data-v-cb1ff380]{font-size:10px;color:var(--text-tertiary);font-weight:500;text-transform:uppercase;letter-spacing:.2px}.stat-value[data-v-cb1ff380]{font-size:16px;font-weight:700;color:var(--text-primary);line-height:1.2;transition:all .3s ease}.stat-value.animating[data-v-cb1ff380]{animation:numberChange-cb1ff380 .6s ease}@keyframes numberChange-cb1ff380{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-cb1ff380],.chart-card[data-v-cb1ff380]{border-left:2px solid transparent}.stats-card-claude[data-v-cb1ff380],.chart-card[data-v-cb1ff380]:has(+.stats-card-claude),.card[data-v-cb1ff380]:has(.panel-card):nth-child(4){border-left-color:#18a058}.chart-card.chart-card-claude[data-v-cb1ff380]{border-left-color:#18a058}.stats-card-codex[data-v-cb1ff380],.chart-card[data-v-cb1ff380]:has(+.stats-card-codex),.card[data-v-cb1ff380]:has(.panel-card):nth-child(4){border-left-color:#3b82f6}.chart-card.chart-card-codex[data-v-cb1ff380]{border-left-color:#3b82f6}.stats-card-gemini[data-v-cb1ff380],.chart-card[data-v-cb1ff380]:has(+.stats-card-gemini),.card[data-v-cb1ff380]:has(.panel-card):nth-child(4){border-left-color:#a855f7}.chart-card.chart-card-gemini[data-v-cb1ff380]{border-left-color:#a855f7}.stats-card-opencode[data-v-cb1ff380],.chart-card[data-v-cb1ff380]:has(+.stats-card-opencode),.card[data-v-cb1ff380]:has(.panel-card):nth-child(4){border-left-color:#ea580c}.chart-card.chart-card-opencode[data-v-cb1ff380]{border-left-color:#ea580c}.chart-card[data-v-cb1ff380]{padding:0;overflow:hidden}.chart-card[data-v-cb1ff380] .panel-card{border:none;border-radius:0;box-shadow:none;background:transparent}.stat-requests .stat-value[data-v-cb1ff380]{color:#3b82f6}.stat-input .stat-value[data-v-cb1ff380]{color:#18a058}.stat-output .stat-value[data-v-cb1ff380]{color:#f59e0b}.token-label[data-v-cb1ff380]{display:flex;align-items:center;gap:8px}.token-dot[data-v-cb1ff380]{width:8px;height:8px;border-radius:50%}.logs-card[data-v-cb1ff380]{flex:1 0 220px;min-height:220px;display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--border-primary);border-radius:18px}.logs-card-body[data-v-cb1ff380]{flex:1;min-height:0;display:flex;flex-direction:column;padding:0}.logs-card .card-header[data-v-cb1ff380]{background:linear-gradient(135deg,var(--surface-panel-muted) 0%,var(--surface-panel-strong) 100%)}.logs-table-wrapper[data-v-cb1ff380]{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;background:var(--surface-panel-strong)}.logs-table-header[data-v-cb1ff380]{display:flex;padding:12px 14px;background:linear-gradient(180deg,var(--surface-panel-muted) 0%,var(--surface-panel-strong) 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-cb1ff380]{color:#18a058b3;font-weight:600}.logs-header-codex .log-col[data-v-cb1ff380]{color:#3b82f6b3;font-weight:600}.logs-header-gemini .log-col[data-v-cb1ff380]{color:#a855f7b3;font-weight:600}.logs-header-opencode .log-col[data-v-cb1ff380]{color:#ea580cb3;font-weight:600}[data-theme=dark] .logs-header-claude .log-col[data-v-cb1ff380]{color:#34d399a6}[data-theme=dark] .logs-header-codex .log-col[data-v-cb1ff380]{color:#60a5faa6}[data-theme=dark] .logs-header-gemini .log-col[data-v-cb1ff380]{color:#c084fca6}[data-theme=dark] .logs-header-opencode .log-col[data-v-cb1ff380]{color:#fb923ca6}.logs-container[data-v-cb1ff380]{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden}.logs-container[data-v-cb1ff380]::-webkit-scrollbar{width:4px}.logs-container[data-v-cb1ff380]::-webkit-scrollbar-thumb{background:#18a0584d;border-radius:2px}.logs-container[data-v-cb1ff380]::-webkit-scrollbar-thumb:hover{background:#18a05880}.empty-logs[data-v-cb1ff380]{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-cb1ff380]{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-cb1ff380]:nth-child(2n){background:var(--bg-secondary)}.log-row[data-v-cb1ff380]:hover{background:var(--hover-bg);transform:translate(2px)}.log-row.new-log[data-v-cb1ff380]{animation:newLogPulse-cb1ff380 4.5s cubic-bezier(.25,.46,.45,.94) forwards;border-left:3px solid #18a058}@keyframes newLogPulse-cb1ff380{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-cb1ff380]{animation:newLogPulseDark-cb1ff380 4.5s cubic-bezier(.25,.46,.45,.94) forwards}@keyframes newLogPulseDark-cb1ff380{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-cb1ff380]{border-left:3px solid #18a058}.log-row.action-row[data-v-cb1ff380]{background:linear-gradient(90deg,#18a0581f,#18a0580a);border-left:3px solid #18a058;padding-left:8px}.log-row.error-row[data-v-cb1ff380]{background:linear-gradient(90deg,#d0305024,#d030500a);border-left:3px solid #d03050;padding-left:8px}.log-row.action-row[data-v-cb1ff380]:hover{background:linear-gradient(90deg,#18a0582e,#18a05814)}.log-row.error-row[data-v-cb1ff380]:hover{background:linear-gradient(90deg,#d0305033,#d0305014)}.action-content[data-v-cb1ff380]{display:flex;align-items:center;gap:8px;width:100%}.action-msg[data-v-cb1ff380]{flex:1;font-size:11px;color:#18a058;font-weight:600;letter-spacing:.2px}.action-msg.error-msg[data-v-cb1ff380]{color:#d03050}.action-time[data-v-cb1ff380]{font-size:10px;font-family:SF Mono,Monaco,monospace;color:var(--text-tertiary);background:#18a0581a;padding:2px 6px;border-radius:4px}.action-time.error-time[data-v-cb1ff380]{background:#d030501f}.log-col[data-v-cb1ff380]{display:flex;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-channel[data-v-cb1ff380]{min-width:0}.col-channel .n-tag[data-v-cb1ff380]{max-width:100%;font-size:11px;font-weight:600;border-radius:4px;padding:3px 10px}.col-token[data-v-cb1ff380]{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-cb1ff380]{background:#ffffff0f}.col-time[data-v-cb1ff380]{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-cb1ff380]{opacity:1;color:var(--text-secondary)}.col-channel-claude[data-v-cb1ff380]{flex:2 1 60px;min-width:50px}.col-token-claude[data-v-cb1ff380]{flex:1 1 40px;min-width:35px}.col-time-claude[data-v-cb1ff380]{flex:1.5 1 55px;min-width:50px}.col-channel-codex[data-v-cb1ff380]{flex:2 1 60px;min-width:50px}.col-token-codex[data-v-cb1ff380]{flex:1 1 40px;min-width:35px}.col-time-codex[data-v-cb1ff380]{flex:1.5 1 55px;min-width:50px}.col-channel-gemini[data-v-cb1ff380]{flex:2.5 1 70px;min-width:55px}.col-token-gemini[data-v-cb1ff380]{flex:1.2 1 45px;min-width:40px}.col-time-gemini[data-v-cb1ff380]{flex:1.8 1 60px;min-width:55px}.col-channel-opencode[data-v-cb1ff380]{flex:2.5 1 70px;min-width:55px}.col-token-opencode[data-v-cb1ff380]{flex:1.2 1 45px;min-width:40px}.col-time-opencode[data-v-cb1ff380]{flex:1.8 1 60px;min-width:55px}.claude-extra-area[data-v-cb1ff380]{display:flex;align-items:center;gap:6px;margin-left:auto}.mcp-count-tag[data-v-cb1ff380],.skills-count-tag[data-v-cb1ff380]{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-cb1ff380]:hover,.skills-count-tag.clickable[data-v-cb1ff380]:hover{transform:scale(1.03);filter:brightness(1.1)}.mcp-quick-panel[data-v-cb1ff380],.skills-quick-panel[data-v-cb1ff380]{padding:2px 0}.mcp-quick-panel .panel-title[data-v-cb1ff380],.skills-quick-panel .panel-title[data-v-cb1ff380]{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-cb1ff380]:first-child,.skills-quick-panel .panel-title span[data-v-cb1ff380]:first-child{font-size:13px;font-weight:600;color:var(--text-primary)}.no-items[data-v-cb1ff380]{padding:16px 10px;text-align:center}.mcp-quick-list[data-v-cb1ff380],.skills-quick-list[data-v-cb1ff380]{max-height:300px;overflow-y:auto;padding:0 4px 4px}.mcp-quick-item[data-v-cb1ff380],.skill-quick-item[data-v-cb1ff380]{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-cb1ff380]:hover,.skill-quick-item[data-v-cb1ff380]:hover{background:var(--hover-bg)}.mcp-item-icon[data-v-cb1ff380],.skill-item-icon[data-v-cb1ff380]{width:24px;height:24px;border-radius:5px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.mcp-item-icon[data-v-cb1ff380]{background:linear-gradient(135deg,#3b82f626,#3b82f60d);color:#3b82f6}.skill-item-icon[data-v-cb1ff380]{background:linear-gradient(135deg,#18a05826,#18a0580d);color:#18a058}.mcp-item-info[data-v-cb1ff380],.skill-item-info[data-v-cb1ff380]{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.mcp-item-name[data-v-cb1ff380],.skill-item-name[data-v-cb1ff380]{font-size:12px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mcp-item-type[data-v-cb1ff380]{font-size:10px;color:var(--text-tertiary);text-transform:uppercase}.skill-item-desc[data-v-cb1ff380]{font-size:10px;color:var(--text-tertiary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mcp-item-status[data-v-cb1ff380]{flex-shrink:0}.mcp-item-status .status-dot[data-v-cb1ff380]{width:8px;height:8px;border-radius:50%;background:var(--border-secondary)}.mcp-item-status.online .status-dot[data-v-cb1ff380]{background:#18a058;box-shadow:0 0 6px #18a05880}.mcp-item-status.error .status-dot[data-v-cb1ff380]{background:#d03050;box-shadow:0 0 6px #d0305080}.mcp-quick-list[data-v-cb1ff380]::-webkit-scrollbar,.skills-quick-list[data-v-cb1ff380]::-webkit-scrollbar{width:4px}.mcp-quick-list[data-v-cb1ff380]::-webkit-scrollbar-thumb,.skills-quick-list[data-v-cb1ff380]::-webkit-scrollbar-thumb{background:#00000026;border-radius:2px}[data-theme=dark] .mcp-quick-list[data-v-cb1ff380]::-webkit-scrollbar-thumb,[data-theme=dark] .skills-quick-list[data-v-cb1ff380]::-webkit-scrollbar-thumb{background:#ffffff26}.skills-button[data-v-cb1ff380]{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-cb1ff380]{color:var(--text-color-3);transition:all .25s ease}.skills-button[data-v-cb1ff380]: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-cb1ff380]{color:#18a058;transform:scale(1.1)}.skills-button[data-v-cb1ff380]:active{transform:translateY(0);box-shadow:0 2px 4px #0000000d}.lock-button[data-v-cb1ff380]{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-cb1ff380]{color:var(--text-color-3);transition:all .25s ease}.lock-button[data-v-cb1ff380]: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-cb1ff380]{color:var(--text-color-1);transform:scale(1.1)}.lock-button[data-v-cb1ff380]:active{transform:translateY(0);box-shadow:0 2px 4px #0000000d}.locked-overlay[data-v-cb1ff380]{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-cb1ff380]: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-cb1ff380]{background:linear-gradient(135deg,rgba(24,160,88,.03) 0%,var(--bg-secondary) 50%,rgba(24,160,88,.02) 100%)}.locked-claude[data-v-cb1ff380]:before{background:radial-gradient(circle,rgba(24,160,88,.15) 0%,transparent 70%)}.locked-codex[data-v-cb1ff380]{background:linear-gradient(135deg,rgba(59,130,246,.03) 0%,var(--bg-secondary) 50%,rgba(59,130,246,.02) 100%)}.locked-codex[data-v-cb1ff380]:before{background:radial-gradient(circle,rgba(59,130,246,.15) 0%,transparent 70%)}.locked-gemini[data-v-cb1ff380]{background:linear-gradient(135deg,rgba(168,85,247,.03) 0%,var(--bg-secondary) 50%,rgba(168,85,247,.02) 100%)}.locked-gemini[data-v-cb1ff380]:before{background:radial-gradient(circle,rgba(168,85,247,.15) 0%,transparent 70%)}.locked-opencode[data-v-cb1ff380]{background:linear-gradient(135deg,rgba(234,88,12,.03) 0%,var(--bg-secondary) 50%,rgba(234,88,12,.02) 100%)}.locked-opencode[data-v-cb1ff380]:before{background:radial-gradient(circle,rgba(234,88,12,.15) 0%,transparent 70%)}.locked-content[data-v-cb1ff380]{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-cb1ff380]{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-cb1ff380 3s ease-in-out infinite}@keyframes lock-float-cb1ff380{0%,to{transform:translateY(0)}50%{transform:translateY(-6px)}}.lock-icon[data-v-cb1ff380]: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-cb1ff380]{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-cb1ff380]:before{background:radial-gradient(circle,rgba(24,160,88,.3) 0%,transparent 60%)}.locked-claude .lock-icon .n-icon[data-v-cb1ff380]{color:#18a058;filter:drop-shadow(0 2px 4px rgba(24,160,88,.3))}.locked-codex .lock-icon[data-v-cb1ff380]{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-cb1ff380]:before{background:radial-gradient(circle,rgba(59,130,246,.3) 0%,transparent 60%)}.locked-codex .lock-icon .n-icon[data-v-cb1ff380]{color:#3b82f6;filter:drop-shadow(0 2px 4px rgba(59,130,246,.3))}.locked-gemini .lock-icon[data-v-cb1ff380]{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-cb1ff380]:before{background:radial-gradient(circle,rgba(168,85,247,.3) 0%,transparent 60%)}.locked-gemini .lock-icon .n-icon[data-v-cb1ff380]{color:#a855f7;filter:drop-shadow(0 2px 4px rgba(168,85,247,.3))}.locked-opencode .lock-icon[data-v-cb1ff380]{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-cb1ff380]:before{background:radial-gradient(circle,rgba(234,88,12,.3) 0%,transparent 60%)}.locked-opencode .lock-icon .n-icon[data-v-cb1ff380]{color:#ea580c;filter:drop-shadow(0 2px 4px rgba(234,88,12,.3))}.lock-icon .n-icon[data-v-cb1ff380]{opacity:.85;position:relative;z-index:1}.locked-title[data-v-cb1ff380]{font-size:17px;font-weight:600;color:var(--text-color-1);margin:0;letter-spacing:.3px}.locked-hint[data-v-cb1ff380]{font-size:13px;color:var(--text-color-3);max-width:220px;line-height:1.7;opacity:.9}.channel-status[data-v-cb1ff380]{cursor:pointer;padding:4px 8px!important;border-radius:4px;transition:all .2s ease}.channel-status[data-v-cb1ff380]:hover{background:var(--hover-bg)}.channel-quick-panel[data-v-cb1ff380]{padding:4px 0}.panel-title[data-v-cb1ff380]{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-cb1ff380]:first-child{font-size:13px;font-weight:600;color:var(--text-primary)}.no-channels[data-v-cb1ff380]{padding:24px 12px;text-align:center}.channel-quick-list[data-v-cb1ff380]{max-height:360px;overflow-y:auto}.channel-quick-item[data-v-cb1ff380]{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-cb1ff380]:hover{background:var(--hover-bg)}.channel-quick-item.disabled[data-v-cb1ff380]{opacity:.6}.channel-quick-info[data-v-cb1ff380]{display:flex;align-items:center;gap:8px;width:100%}.channel-quick-name[data-v-cb1ff380]{font-size:13px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.channel-metrics[data-v-cb1ff380]{display:flex;gap:6px;width:100%}.channel-metrics .metric-item[data-v-cb1ff380]{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-cb1ff380]{font-size:10px;color:var(--text-tertiary);font-weight:500}.channel-metrics .metric-value[data-v-cb1ff380]{font-size:12px;font-weight:700;color:var(--text-primary);font-family:SF Mono,Monaco,monospace}.channel-metrics .metric-value.active[data-v-cb1ff380]{color:#f59e0b}.channel-switching-tip[data-v-cb1ff380]{font-size:11px;color:var(--text-tertiary);padding:0 2px}.channel-quick-item.disabled .channel-metrics .metric-value[data-v-cb1ff380]{color:var(--text-tertiary)}.channel-quick-list[data-v-cb1ff380]::-webkit-scrollbar{width:4px}.channel-quick-list[data-v-cb1ff380]::-webkit-scrollbar-thumb{background:#00000026;border-radius:2px}[data-theme=dark] .channel-quick-list[data-v-cb1ff380]::-webkit-scrollbar-thumb{background:#ffffff26}@media (max-width: 1024px){.channel-column[data-v-cb1ff380]{border-radius:6px}.card-header[data-v-cb1ff380]{padding:8px 10px}.card-title[data-v-cb1ff380]{font-size:13px}.stats-inline[data-v-cb1ff380]{gap:6px}.stat-inline-item[data-v-cb1ff380]{padding:8px}.stat-value[data-v-cb1ff380]{font-size:14px}.stat-label[data-v-cb1ff380]{font-size:9px}.logs-table-header[data-v-cb1ff380]{padding:8px 10px;font-size:10px}.log-row[data-v-cb1ff380]{padding:8px 10px;font-size:11px}}@media (max-width: 768px){.channel-column[data-v-cb1ff380]{border-radius:6px;height:100%;max-height:100%}.card-header[data-v-cb1ff380]{padding:8px;gap:6px}.card-title[data-v-cb1ff380]{font-size:12px}.stats-inline[data-v-cb1ff380]{gap:4px}.stat-inline-item[data-v-cb1ff380]{padding:6px;gap:6px}.stat-icon-dot[data-v-cb1ff380]{width:6px;height:6px}.stat-value[data-v-cb1ff380]{font-size:13px}.stat-label[data-v-cb1ff380]{font-size:8px}.logs-card[data-v-cb1ff380]{flex-basis:180px;min-height:180px}.logs-table-header[data-v-cb1ff380]{padding:6px 8px;font-size:9px}.log-row[data-v-cb1ff380]{padding:6px 8px;font-size:10px;min-height:32px}.col-token[data-v-cb1ff380]{font-size:10px;padding:2px 4px}.col-time[data-v-cb1ff380]{font-size:9px}.mcp-count-tag[data-v-cb1ff380],.skills-count-tag[data-v-cb1ff380]{font-size:9px;padding:0 6px;height:18px;line-height:18px}.skills-button[data-v-cb1ff380]{padding:4px 8px;font-size:10px;gap:4px}.lock-button[data-v-cb1ff380]{width:26px;height:26px}}@media (max-width: 640px){.channel-column[data-v-cb1ff380]{height:100%;max-height:100%}.card-header[data-v-cb1ff380]{padding:6px;gap:4px;flex-wrap:wrap}.card-title[data-v-cb1ff380]{font-size:11px}.stats-card .card-content[data-v-cb1ff380]{padding:6px}.stats-inline[data-v-cb1ff380]{gap:3px;flex-wrap:wrap}.stat-inline-item[data-v-cb1ff380]{padding:5px;gap:4px;min-width:calc(33% - 3px);flex:1 1 auto}.stat-icon-dot[data-v-cb1ff380]{width:5px;height:5px}.stat-value[data-v-cb1ff380]{font-size:12px}.stat-label[data-v-cb1ff380]{font-size:7px}.logs-card[data-v-cb1ff380]{flex-basis:160px;min-height:160px}.logs-table-header[data-v-cb1ff380]{padding:5px 6px;font-size:8px;letter-spacing:.3px}.log-row[data-v-cb1ff380]{padding:5px 6px;font-size:9px;min-height:28px}.col-channel .n-tag[data-v-cb1ff380]{font-size:9px;padding:2px 6px}.col-token[data-v-cb1ff380]{font-size:9px;padding:2px 3px;margin:0 1px}.col-time[data-v-cb1ff380]{font-size:8px}.claude-extra-area[data-v-cb1ff380]{gap:4px}.mcp-count-tag[data-v-cb1ff380],.skills-count-tag[data-v-cb1ff380]{font-size:8px;padding:0 4px;height:16px;line-height:16px}.skills-button[data-v-cb1ff380]{padding:3px 6px;font-size:9px;gap:3px}.skills-button .n-icon[data-v-cb1ff380]{font-size:12px!important}.lock-button[data-v-cb1ff380]{width:24px;height:24px;margin-left:4px}.lock-button .n-icon[data-v-cb1ff380]{font-size:12px!important}.locked-content[data-v-cb1ff380]{padding:30px 20px;gap:12px}.lock-icon[data-v-cb1ff380]{width:64px;height:64px}.lock-icon .n-icon[data-v-cb1ff380]{font-size:28px!important}.lock-title[data-v-cb1ff380]{font-size:14px}.lock-subtitle[data-v-cb1ff380]{font-size:10px}.unlock-btn[data-v-cb1ff380]{padding:8px 16px;font-size:11px}}@media (max-width: 480px){.channel-column[data-v-cb1ff380]{height:100%;max-height:100%}.card-header[data-v-cb1ff380]{padding:5px}.card-title[data-v-cb1ff380]{font-size:10px}.stats-inline[data-v-cb1ff380]{gap:2px}.stat-inline-item[data-v-cb1ff380]{padding:4px;gap:3px}.logs-card[data-v-cb1ff380]{flex-basis:140px;min-height:140px}.stat-value[data-v-cb1ff380]{font-size:11px}.stat-label[data-v-cb1ff380]{font-size:6px}.logs-table-header[data-v-cb1ff380]{padding:4px 5px;font-size:7px}.log-row[data-v-cb1ff380]{padding:4px 5px;font-size:8px;min-height:24px}.col-token[data-v-cb1ff380]{font-size:8px}.col-time[data-v-cb1ff380]{font-size:7px}}.card[data-v-cb1ff380]:not(.logs-card) .n-collapse{background:transparent}.card[data-v-cb1ff380]:not(.logs-card) .n-collapse-item{background:transparent}.card[data-v-cb1ff380] .n-collapse-item__header{padding:12px 16px;background:transparent;transition:all .3s ease}.card[data-v-cb1ff380] .n-collapse-item__header:hover{background:#00000005}.card[data-v-cb1ff380] .n-collapse-item__header-main{width:100%}.card[data-v-cb1ff380]:not(.logs-card) .n-collapse-item__content-wrapper{padding:0 16px 12px}.card[data-v-cb1ff380]:not(.logs-card) .n-collapse-item__content-inner{padding-top:0}.chart-card[data-v-cb1ff380]:has(.n-collapse){padding:0}.dashboard-page[data-v-2fa76615]{background:transparent}.dashboard-content[data-v-2fa76615]{--dashboard-column-height: clamp(560px, calc(100dvh - 116px) , 820px);background:transparent;display:flex;flex-direction:column;min-height:100%;overflow-x:hidden;overflow-y:auto;padding-top:12px}.dashboard-grid[data-v-2fa76615]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));grid-auto-rows:minmax(0,1fr);align-content:stretch;align-items:stretch;gap:16px;flex:1 1 auto;min-height:0;height:100%;overflow:visible;box-sizing:border-box}.dashboard-grid[data-v-2fa76615]>*{min-height:0}.dashboard-grid[data-v-2fa76615] .sortable-ghost{opacity:.4}.dashboard-grid[data-v-2fa76615] .sortable-chosen{box-shadow:0 8px 24px #00000026}@media (max-width: 1600px){.dashboard-content[data-v-2fa76615]{--dashboard-column-height: clamp(540px, calc(100dvh - 120px) , 760px)}.dashboard-grid[data-v-2fa76615]{grid-auto-rows:var(--dashboard-column-height);grid-template-columns:repeat(3,1fr);align-content:start;flex:0 0 auto;height:auto}}@media (max-width: 1200px){.dashboard-content[data-v-2fa76615]{--dashboard-column-height: clamp(500px, calc((100dvh - 132px)/2) , 660px)}.dashboard-grid[data-v-2fa76615]{grid-template-columns:repeat(2,1fr)}}@media (max-width: 1024px){.dashboard-grid[data-v-2fa76615]{gap:12px}}@media (max-width: 900px){.dashboard-content[data-v-2fa76615]{--dashboard-column-height: 540px}.dashboard-grid[data-v-2fa76615]{grid-template-columns:1fr}}@media (max-width: 768px){.dashboard-content[data-v-2fa76615]{--dashboard-column-height: 500px}.dashboard-grid[data-v-2fa76615]{gap:8px}}@media (max-width: 640px){.dashboard-content[data-v-2fa76615]{--dashboard-column-height: 420px}.dashboard-grid[data-v-2fa76615]{gap:6px}}@media (max-width: 480px){.dashboard-content[data-v-2fa76615]{--dashboard-column-height: 380px}.dashboard-grid[data-v-2fa76615]{gap:4px}}
@@ -1 +0,0 @@
1
- import{r as e,f as a,c as s,o as t,a as l,X as o,s as n,Y as r,N as c,_ as i,G as u,Z as d,p,a0 as v,W as m,a9 as f,a5 as h,w as y,h as g,K as k,F as j,$ as _,a6 as C,v as b}from"./vue-vendor-BxIT0uQq.js";import{d as w}from"./vendors-Bsp-dq2d.js";import{_ as x,m as $,n as z,o as L,p as N,q as P,r as D}from"./index-Duc7QP4e.js";import{a8 as M,T as I,d as E,ac as K,h as T}from"./icons-CEq2hYB-.js";import{N as U,B as q,c as O,a as R,q as V,g as W,x as G,h as H}from"./naive-ui-Cg4_ZeoT.js";import"./markdown-DyTJGI4N.js";const S={class:"card-content"},A={class:"header-row"},B={class:"project-name"},F={class:"stats-row"},X=x({__name:"ProjectCard",props:{project:{type:Object,required:!0}},emits:["click","delete"],setup(f,{emit:h}){const y=f,g=h,k=e(!1);function j(){g("click")}function _(){g("delete",y.project)}const C=a(()=>{var e,a;return(null==(e=y.project)?void 0:e.displayName)||(null==(a=y.project)?void 0:a.name)||""}),b=a(()=>{var e,a,s;return(null==(e=y.project)?void 0:e.path)||(null==(a=y.project)?void 0:a.fullPath)||(null==(s=y.project)?void 0:s.name)||""}),w=a(()=>{var e;return(null==(e=y.project)?void 0:e.sessionCount)||0}),x=a(()=>{var e;return null==(e=y.project)?void 0:e.lastUsed}),$=a(()=>{var e;const a=["#18a058","#2080f0","#f0a020","#d03050","#9333ea","#06b6d4"];return a[((null==(e=y.project)?void 0:e.name)||"").split("").reduce((e,a)=>e+a.charCodeAt(0),0)%a.length]});function z(e){if(!e)return"";const a=new Date(e),s=new Date-a;return s<6e4?"刚刚":s<36e5?`${Math.floor(s/6e4)}分钟前`:s<864e5?`${Math.floor(s/36e5)}小时前`:s<6048e5?`${Math.floor(s/864e5)}天前`:a.toLocaleDateString("zh-CN")}return(e,a)=>(t(),s("div",{class:"project-card",onClick:j,onMouseenter:a[0]||(a[0]=e=>k.value=!0),onMouseleave:a[1]||(a[1]=e=>k.value=!1)},[l("div",S,[l("div",A,[o(c(U),{size:"18",color:$.value},{default:r(()=>[o(c(M))]),_:1},8,["color"]),l("span",B,i(C.value),1),n(o(c(q),{text:"",type:"error",size:"tiny",class:"delete-btn",onClick:d(_,["stop"])},{icon:r(()=>[o(c(U),{size:"14"},{default:r(()=>[o(c(I))]),_:1})]),_:1},512),[[u,k.value]])]),o(c(O),{depth:"3",class:"project-path"},{default:r(()=>[p(i(b.value),1)]),_:1}),l("div",F,[o(c(R),{size:"tiny",bordered:!1,type:"success"},{default:r(()=>[p(i(w.value)+" 会话 ",1)]),_:1}),x.value?(t(),v(c(O),{key:0,depth:"3",class:"last-used"},{default:r(()=>[p(i(z(x.value)),1)]),_:1})):m("",!0)])])],32))}},[["__scopeId","data-v-3a18e66d"]]),Y={class:"page-shell project-list-container"},Z={class:"page-header project-header"},J={class:"page-header-meta"},Q={class:"page-eyebrow"},ee={class:"page-toolbar project-toolbar"},ae={key:0,class:"loading-container"},se={key:3,class:"projects-grid"},te={class:"floating-shortcut search-hint"},le={class:"project-search-header"},oe={class:"project-search-input-row"},ne={key:0,class:"project-search-results"},re={class:"search-result-header"},ce={class:"search-result-title"},ie=x({__name:"ProjectList",setup(n){const u=f(),x=h(),I=$(),S=a(()=>x.meta.channel||"claude"),A=a(()=>({claude:"Claude Code",codex:"Codex",gemini:"Gemini",opencode:"OpenCode"}[S.value]||"Workspace")),B=e(""),F=e([]),ie=e(null),ue=e(!1),de=e(""),pe=e(null),ve=e(!1),me=e(null),fe=a(()=>{const e=B.value.toLowerCase();return F.value.filter(a=>{const s=(a.displayName||"").toLowerCase(),t=(a.fullPath||"").toLowerCase();return s.includes(e)||t.includes(e)})});function he(e){const a=x.meta.channel||"claude";u.push({name:`${a}-sessions`,params:{projectName:e}})}async function ye(){const e=F.value.map(e=>e.name);await I.saveProjectOrder(e)}function ge(e){const a=e.fullPath||e.name,s=e.sessionCount||0;z.warning({title:"删除项目",content:`确定要删除项目 "${a}" 吗?\n\n当前项目包含 ${s} 个会话,删除后所有会话数据将无法恢复!`,positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{try{await I.deleteProject(e.name),L.success("项目已删除")}catch(a){L.error("删除失败: "+a.message)}}})}async function ke(){try{const a="codex"===(e=S.value||"claude")?"codex":"gemini"===e?"gemini":"opencode"===e?"opencode":"claude",s=await P(a);if("manual"===(null==s?void 0:s.method))return void L.warning("自动复制失败,已弹出手动复制框");L.success("基础启动命令已复制到剪贴板")}catch(a){L.error("复制失败: "+a.message)}var e}async function je(){if(de.value){ve.value=!0;try{const e=await N(de.value,35,S.value);pe.value=e}catch(e){L.error("搜索失败: "+e.message)}finally{ve.value=!1}}}function _e(e,a){if(!a||!e)return e;const s=new RegExp(`(${a})`,"gi");return e.replace(s,'<mark class="keyword-highlight">$1</mark>')}function Ce(){ue.value=!1}function be(e){if((e.metaKey||e.ctrlKey)&&"k"===e.key)return e.preventDefault(),void(ue.value=!0);"Escape"===e.key&&ue.value&&(e.preventDefault(),Ce())}return y(()=>I.projects,e=>{F.value=[...e]},{immediate:!0}),y(ue,e=>{e?b(()=>{var e;null==(e=me.value)||e.focus()}):e||(de.value="",pe.value=null)}),y(S,e=>{I.setChannel(e),I.fetchProjects()},{immediate:!0}),g(()=>{document.addEventListener("keydown",be)}),k(()=>{document.removeEventListener("keydown",be)}),(e,a)=>(t(),s("div",Y,[l("div",Z,[l("div",J,[l("span",Q,i(A.value)+" Workspace",1),a[4]||(a[4]=l("h2",{class:"page-title"},"项目空间",-1)),a[5]||(a[5]=l("p",{class:"page-description"},"选择一个项目查看会话,拖拽可调整顺序,搜索会同时匹配显示名称与完整路径。",-1))]),l("div",ee,[o(c(q),{type:"primary",size:"medium",onClick:ke},{icon:r(()=>[o(c(U),null,{default:r(()=>[o(c(E))]),_:1})]),default:r(()=>[a[6]||(a[6]=p(" 复制启动命令 ",-1))]),_:1}),o(c(V),{value:B.value,"onUpdate:value":a[0]||(a[0]=e=>B.value=e),placeholder:"搜索项目...",clearable:"",class:"search-input"},{prefix:r(()=>[o(c(U),null,{default:r(()=>[o(c(K))]),_:1})]),_:1},8,["value"])])]),l("div",{class:"page-content project-content",ref_key:"contentEl",ref:ie},[c(I).loading?(t(),s("div",ae,[o(c(W),{size:"large"},{description:r(()=>[...a[7]||(a[7]=[p(" 加载项目列表... ",-1)])]),_:1})])):c(I).error?(t(),v(c(G),{key:1,type:"error",title:"加载失败",style:{"margin-top":"20px"}},{default:r(()=>[p(i(c(I).error),1)]),_:1})):B.value?(t(),s("div",se,[(t(!0),s(j,null,_(fe.value,e=>(t(),v(X,{key:e.name,project:e,onClick:a=>he(e.name),onDelete:ge},null,8,["project","onClick"]))),128))])):(t(),v(c(w),{key:2,modelValue:F.value,"onUpdate:modelValue":a[1]||(a[1]=e=>F.value=e),"item-key":"name",class:"projects-grid","ghost-class":"ghost","chosen-class":"chosen","drag-class":"drag",animation:"200",onEnd:ye},{item:r(({element:e})=>[o(X,{project:e,onClick:a=>he(e.name),onDelete:ge},null,8,["project","onClick"])]),_:1},8,["modelValue"])),c(I).loading||c(I).error||0!==c(I).projects.length?m("",!0):(t(),v(c(H),{key:4,description:"没有找到项目",style:{"margin-top":"60px"}},{icon:r(()=>[o(c(U),null,{default:r(()=>[o(c(M))]),_:1})]),_:1}))],512),l("div",te,[o(c(O),{depth:"3",style:{"font-size":"12px"}},{default:r(()=>[...a[8]||(a[8]=[l("kbd",{class:"ui-kbd"},"Cmd",-1),p(" / ",-1),l("kbd",{class:"ui-kbd"},"Ctrl",-1),p(" + ",-1),l("kbd",{class:"ui-kbd"},"K",-1),p(" 全局搜索 ",-1)])]),_:1})]),ue.value?(t(),s("div",{key:0,class:"project-search-overlay",onClick:d(Ce,["self"])},[l("div",{class:"project-search-panel surface-block",onClick:a[3]||(a[3]=d(()=>{},["stop"]))},[l("div",le,[a[10]||(a[10]=l("div",{class:"project-search-copy"},[l("span",{class:"project-search-title"},"全局搜索"),l("span",{class:"project-search-subtitle"},"在当前渠道的所有项目中搜索对话内容")],-1)),o(c(q),{text:"",onClick:Ce},{default:r(()=>[...a[9]||(a[9]=[p("关闭",-1)])]),_:1})]),l("div",oe,[o(c(V),{ref_key:"globalSearchInputRef",ref:me,value:de.value,"onUpdate:value":a[2]||(a[2]=e=>de.value=e),placeholder:"搜索所有项目的对话内容...",clearable:"",onKeyup:C(je,["enter"]),disabled:ve.value},{prefix:r(()=>[o(c(U),null,{default:r(()=>[o(c(K))]),_:1})]),suffix:r(()=>[o(c(q),{text:"",onClick:je,disabled:!de.value||ve.value,loading:ve.value},{default:r(()=>[...a[11]||(a[11]=[p(" 搜索 ",-1)])]),_:1},8,["disabled","loading"])]),_:1},8,["value","disabled"])]),pe.value?(t(),s("div",ne,[o(c(G),{type:"info",style:{"margin-bottom":"16px"}},{default:r(()=>[p(' 关键词 "'+i(pe.value.keyword)+'" 共找到 '+i(pe.value.totalMatches)+" 处匹配 ",1)]),_:1}),(t(!0),s(j,null,_(pe.value.sessions,e=>(t(),s("div",{key:`${e.projectName}-${e.sessionId}`,class:"search-result-item"},[l("div",re,[l("div",ce,[o(c(O),{strong:"",style:{"font-size":"15px","font-weight":"700"}},{default:r(()=>[p(i(e.projectDisplayName),1)]),_:2},1024),o(c(O),{depth:"2",style:{margin:"0 8px"}},{default:r(()=>[...a[12]||(a[12]=[p("·",-1)])]),_:1}),o(c(O),{strong:""},{default:r(()=>[p(i(e.alias?`${e.alias} (${e.sessionId.substring(0,8)})`:e.sessionId.substring(0,8)),1)]),_:2},1024),o(c(R),{size:"small",bordered:!1},{default:r(()=>[p(i(e.matchCount)+" 个匹配",1)]),_:2},1024)]),o(c(q),{size:"small",type:"primary",onClick:a=>async function(e,a){try{const{copyResult:s}=await D(e,a,S.value);"manual"===(null==s?void 0:s.method)?L.warning("自动复制失败,已弹出手动复制框"):L.success("启动命令已复制到剪贴板"),ue.value=!1}catch(s){L.error("复制失败: "+s.message)}}(e.projectName,e.sessionId)},{icon:r(()=>[o(c(U),null,{default:r(()=>[o(c(T))]),_:1})]),default:r(()=>[a[13]||(a[13]=p(" 使用对话 ",-1))]),_:1},8,["onClick"])]),(t(!0),s(j,null,_(e.matches,(e,a)=>(t(),s("div",{key:a,class:"search-match"},[o(c(R),{size:"tiny",type:"user"===e.role?"info":"success",bordered:!1},{default:r(()=>[p(i("user"===e.role?"用户":"助手"),1)]),_:2},1032,["type"]),o(c(O),{depth:"3",class:"search-match-text",innerHTML:_e(e.context,pe.value.keyword)},null,8,["innerHTML"])]))),128))]))),128)),0===pe.value.sessions.length?(t(),v(c(H),{key:0,description:"没有找到匹配的内容"})):m("",!0)])):m("",!0)])])):m("",!0)]))}},[["__scopeId","data-v-1586bb2f"]]);export{ie as default};
@@ -1 +0,0 @@
1
- .project-card[data-v-3a18e66d]{padding:12px 14px;cursor:pointer;transition:all .25s cubic-bezier(.4,0,.2,1);border-radius:8px;border:1px solid var(--border-primary);box-shadow:0 1px 3px #0000000a;background:var(--bg-primary);position:relative;overflow:hidden}.project-card[data-v-3a18e66d]:before{content:"";position:absolute;top:0;left:0;width:3px;height:100%;background:linear-gradient(180deg,#18a058,#18a05866);opacity:0;transition:opacity .25s ease}.project-card[data-v-3a18e66d]:hover{transform:translateY(-3px);box-shadow:0 8px 20px #18a0581f,0 2px 6px #0000000f;border-color:#18a05866}.project-card[data-v-3a18e66d]:hover:before{opacity:1}.card-content[data-v-3a18e66d]{display:flex;flex-direction:column;gap:6px}.header-row[data-v-3a18e66d]{display:flex;align-items:center;gap:8px}.project-name[data-v-3a18e66d]{font-size:14px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;color:var(--text-primary);letter-spacing:-.2px}.delete-btn[data-v-3a18e66d]{opacity:.7;transition:opacity .2s;padding:2px!important}.delete-btn[data-v-3a18e66d]:hover{opacity:1}.project-path[data-v-3a18e66d]{font-size:11px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.3}.stats-row[data-v-3a18e66d]{display:flex;align-items:center;justify-content:space-between;margin-top:4px;padding-top:8px;border-top:1px dashed var(--border-primary)}.stats-row[data-v-3a18e66d] .n-tag{font-size:11px;font-weight:600;padding:0 6px;height:18px;border-radius:4px}.last-used[data-v-3a18e66d]{font-size:11px;font-weight:500}.project-list-container[data-v-1586bb2f]{width:100%;position:relative}.project-header[data-v-1586bb2f]{align-items:center}.project-content[data-v-1586bb2f]{padding-bottom:88px}.project-toolbar[data-v-1586bb2f]{min-width:min(420px,100%)}.search-input[data-v-1586bb2f]{width:320px;min-width:min(320px,100%)}.search-input[data-v-1586bb2f] .n-input{border-radius:14px;background:var(--surface-panel-strong);border:1px solid var(--border-primary);transition:all .2s ease}.search-input[data-v-1586bb2f] .n-input:hover{border-color:var(--border-secondary);box-shadow:var(--shadow-sm)}.search-input[data-v-1586bb2f] .n-input:focus-within{border-color:var(--primary-color);box-shadow:var(--focus-ring)}.loading-container[data-v-1586bb2f]{display:flex;justify-content:center;align-items:center;min-height:400px}.projects-grid[data-v-1586bb2f]{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:16px}.ghost[data-v-1586bb2f]{opacity:.4}.chosen[data-v-1586bb2f]{transform:scale(1.05);box-shadow:0 8px 24px #0003!important;cursor:move!important}.drag[data-v-1586bb2f]{opacity:.8;transform:rotate(2deg);box-shadow:0 12px 32px #00000040!important}.search-hint[data-v-1586bb2f]{position:absolute;right:24px;bottom:24px;opacity:.92}.search-hint[data-v-1586bb2f]:hover{opacity:1;transform:translateY(-2px)}.project-search-overlay[data-v-1586bb2f]{position:absolute;top:0;right:0;bottom:0;left:0;z-index:30;display:flex;justify-content:center;align-items:flex-start;padding:72px 24px 24px;background:#f4f7f580;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.project-search-panel[data-v-1586bb2f]{width:min(800px,100%);max-height:calc(100% - 48px);display:flex;flex-direction:column;padding:18px;border-radius:20px;box-shadow:0 18px 42px #0914182e}.project-search-header[data-v-1586bb2f]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:16px}.project-search-copy[data-v-1586bb2f]{display:flex;flex-direction:column;gap:4px;min-width:0}.project-search-title[data-v-1586bb2f]{font-size:18px;font-weight:700;color:var(--text-primary)}.project-search-subtitle[data-v-1586bb2f]{font-size:12px;line-height:1.5;color:var(--text-secondary)}.project-search-input-row[data-v-1586bb2f]{margin-bottom:16px}.project-search-results[data-v-1586bb2f]{min-height:0;overflow:auto;padding-right:2px}.search-result-item[data-v-1586bb2f]{margin-bottom:16px;padding:14px;border:1px solid var(--border-primary);border-radius:14px;background:var(--surface-panel);box-shadow:var(--shadow-sm)}.search-result-header[data-v-1586bb2f]{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.search-result-title[data-v-1586bb2f]{display:flex;align-items:center;gap:8px}.search-match[data-v-1586bb2f]{display:flex;align-items:flex-start;gap:8px;margin-top:8px;padding:10px 12px;background:var(--surface-panel-muted);border-radius:12px}.search-match-text[data-v-1586bb2f]{flex:1;line-height:1.6}@media (max-width: 900px){.project-toolbar[data-v-1586bb2f]{width:100%;min-width:0}.search-input[data-v-1586bb2f]{width:100%}.project-content[data-v-1586bb2f]{padding-bottom:80px}.search-hint[data-v-1586bb2f]{right:16px;bottom:16px}.project-search-overlay[data-v-1586bb2f]{padding:56px 16px 16px}.project-search-panel[data-v-1586bb2f]{padding:14px}}@media (max-width: 640px){.project-search-overlay[data-v-1586bb2f]{padding:16px 12px 12px;align-items:stretch}.project-search-panel[data-v-1586bb2f]{width:100%;max-height:100%;border-radius:16px}.project-search-header[data-v-1586bb2f]{flex-direction:column;align-items:stretch}}
@@ -1 +0,0 @@
1
- .session-list-container[data-v-e1cf2619]{width:100%}.sessions-list[data-v-e1cf2619]{position:relative;overflow:hidden}.session-header[data-v-e1cf2619]{align-items:flex-start;gap:14px}.session-header-main[data-v-e1cf2619]{display:flex;align-items:flex-start;gap:12px;min-width:0;flex:1}.back-button[data-v-e1cf2619]{flex-shrink:0}.title-section[data-v-e1cf2619]{flex:1;min-width:0}.title-with-count[data-v-e1cf2619]{display:flex;align-items:center;gap:6px;margin-bottom:0;flex-wrap:wrap}.title-section h2[data-v-e1cf2619]{margin:0}.session-page-title[data-v-e1cf2619]{font-size:clamp(22px,1.75vw,27px);line-height:1.08;letter-spacing:-.03em}.session-count[data-v-e1cf2619]{font-size:13px;color:var(--text-secondary)}.total-size-tag[data-v-e1cf2619]{margin-left:0}.project-path[data-v-e1cf2619]{margin-top:0}.header-actions[data-v-e1cf2619]{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.session-toolbar[data-v-e1cf2619]{min-width:min(420px,100%)}.search-input[data-v-e1cf2619]{width:300px;min-width:min(300px,100%)}.search-input[data-v-e1cf2619] .n-input{border-radius:14px;background:var(--surface-panel-strong);border:1px solid var(--border-primary);transition:all .2s ease}.search-input[data-v-e1cf2619] .n-input:hover{border-color:var(--border-secondary);box-shadow:var(--shadow-sm)}.search-input[data-v-e1cf2619] .n-input:focus-within{border-color:var(--primary-color);box-shadow:var(--focus-ring)}.loading-container[data-v-e1cf2619]{display:flex;justify-content:center;align-items:center;min-height:400px}.session-item[data-v-e1cf2619]{display:flex;align-items:center;gap:12px;padding:18px;background:var(--surface-panel);border:1px solid var(--border-primary);border-radius:18px;margin-bottom:10px;transition:all .22s ease;cursor:pointer;box-shadow:var(--shadow-sm)}.session-item[data-v-e1cf2619]:hover{border-color:#18a05842;box-shadow:var(--shadow-md);transform:translateY(-1px)}.session-item-selection-mode[data-v-e1cf2619]{cursor:default}.session-item-selected[data-v-e1cf2619]{border-color:#18a0585c;box-shadow:0 0 0 3px #18a0581f;background:#18a0580a}.drag-handle[data-v-e1cf2619]{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-e1cf2619]{opacity:1;background-color:#18a0581a;border-radius:10px}.selection-checkbox[data-v-e1cf2619]{width:24px;min-width:24px;display:flex;align-items:center;justify-content:center}.session-left[data-v-e1cf2619]{flex:1;display:flex;align-items:center;gap:16px;min-width:0}.session-icon[data-v-e1cf2619]{flex-shrink:0}.session-info[data-v-e1cf2619]{flex:1;min-width:0}.session-header[data-v-e1cf2619]{display:flex;align-items:center;margin-bottom:6px}.session-title-row[data-v-e1cf2619]{display:flex;align-items:center;gap:8px}.session-title[data-v-e1cf2619]{font-size:15px;font-weight:650;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:1;min-width:0}.session-meta[data-v-e1cf2619]{display:flex;align-items:center;gap:8px;margin-bottom:6px;font-size:13px}.session-message[data-v-e1cf2619]{display:block;max-width:680px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}.session-message-empty[data-v-e1cf2619]{font-style:italic;opacity:.5}.session-right[data-v-e1cf2619]{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-end;min-width:248px;flex-shrink:0;gap:12px}.session-tags-area[data-v-e1cf2619]{min-height:24px;display:flex;align-items:flex-start;justify-content:flex-end}.session-actions[data-v-e1cf2619]{display:flex;align-items:center;margin-top:auto}.session-actions[data-v-e1cf2619] .n-button{border-radius:12px}.ghost[data-v-e1cf2619]{opacity:.4}.chosen[data-v-e1cf2619]{box-shadow:0 4px 16px #00000026}.search-result-item[data-v-e1cf2619]{margin-bottom:16px;padding:14px;border:1px solid var(--border-primary);border-radius:14px;background:var(--surface-panel);box-shadow:var(--shadow-sm)}.search-result-header[data-v-e1cf2619]{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.search-result-title[data-v-e1cf2619]{display:flex;align-items:center;gap:8px}.search-match[data-v-e1cf2619]{display:flex;align-items:flex-start;gap:8px;margin-top:8px;padding:10px 12px;background:var(--surface-panel-muted);border-radius:12px}.search-match-text[data-v-e1cf2619]{flex:1;line-height:1.6}@media (max-width: 1024px){.session-header[data-v-e1cf2619]{align-items:stretch}.session-toolbar[data-v-e1cf2619]{width:100%;min-width:0}.search-input[data-v-e1cf2619]{width:100%}}@media (max-width: 900px){.session-page-title[data-v-e1cf2619]{font-size:20px}.session-item[data-v-e1cf2619]{flex-direction:column;align-items:stretch}.session-right[data-v-e1cf2619]{min-width:0;align-items:flex-start}.session-tags-area[data-v-e1cf2619],.session-actions[data-v-e1cf2619]{width:100%;justify-content:flex-start}}
@@ -1 +0,0 @@
1
- import{a9 as e,a5 as s,f as a,r as l,w as t,h as n,K as i,c as o,o as u,a as r,X as c,a0 as d,W as v,Y as f,N as p,_ as m,p as h,F as g,a6 as y,L as k,Z as _,s as w,G as I,y as C,$ as b,v as j}from"./vue-vendor-BxIT0uQq.js";import{d as z}from"./vendors-Bsp-dq2d.js";import{_ as x,m as N,t as S,C as F,v as $,o as B,n as M,r as L}from"./index-Duc7QP4e.js";import{X as U,T as P,ac as T,ay as A,j as E,G,a2 as K,az as V,p as H,h as O,V as R}from"./icons-CEq2hYB-.js";import{N as W,B as q,c as D,a as X,G as Y,q as Z,g as J,x as Q,s as ee,n as se,h as ae,p as le}from"./naive-ui-Cg4_ZeoT.js";import"./markdown-DyTJGI4N.js";const te={class:"page-shell session-list-container"},ne={class:"page-header session-header"},ie={class:"session-header-main"},oe={class:"page-header-meta title-section"},ue={class:"page-eyebrow"},re={class:"title-with-count"},ce={class:"page-title session-page-title"},de={class:"page-description project-path"},ve={class:"page-toolbar session-toolbar"},fe={class:"header-actions"},pe={key:0,class:"loading-container"},me=["onMouseenter","onClick"],he={key:0,class:"drag-handle"},ge={class:"session-left"},ye={class:"session-icon"},ke={class:"session-info"},_e={class:"session-header"},we={class:"session-title-row"},Ie={class:"session-title"},Ce={class:"session-meta"},be={class:"session-right"},je={class:"session-tags-area"},ze={key:0,class:"session-actions"},xe={key:0,style:{"max-height":"70vh","overflow-y":"auto"}},Ne={class:"search-result-header"},Se={class:"search-result-title"},Fe=x({__name:"SessionList",props:{projectName:{type:String,required:!0}},setup(x){const Fe=x,$e=e(),Be=s(),Me=N(),{addFavorite:Le,removeFavorite:Ue,isFavorite:Pe}=S(),Te=a(()=>Be.meta.channel||"claude"),Ae=a(()=>({claude:"Claude Code",codex:"Codex",gemini:"Gemini",opencode:"OpenCode"}[Te.value]||"Workspace")),Ee=l(Fe.projectName),Ge=a(()=>Ee.value||Fe.projectName),Ke=l(""),Ve=l(!1),He=l(null),Oe=l(""),Re=l(null),We=l([]),qe=l(null),De=l(!1),Xe=l(null),Ye=l(!1),Ze=l(!1),Je=l([]),Qe=l(!1),es=l(!1),ss=l(""),as=l(""),ls=l(null),ts={group:{name:`${Te.value}-sessions`,pull:!1,put:!1},forceFallback:!0,fallbackOnBody:!1,fallbackTolerance:4,scroll:!0},ns=a(()=>{var e;return(null==(e=Me.currentProjectInfo)?void 0:e.displayName)||Fe.projectName}),is=a(()=>{var e;return(null==(e=Me.currentProjectInfo)?void 0:e.fullPath)||Ge.value}),os=a(()=>new Set(Je.value)),us=a(()=>Je.value.length),rs=a(()=>We.value.length>0&&We.value.every(e=>os.value.has(e.sessionId))),cs=a(()=>us.value>0&&!rs.value);async function ds(){const e=await async function(){Me.projects.length||await Me.fetchProjects();const e=Me.projects.find(e=>e.name===Fe.projectName);if(e)return Ee.value=e.name,e.name;const s=Me.projects.find(e=>e.displayName===Fe.projectName||e.fullPath===Fe.projectName);return s?(Ee.value=s.name,s.name!==Fe.projectName&&await $e.replace({name:`${Te.value}-sessions`,params:{projectName:s.name}}),s.name):(Ee.value=Fe.projectName,Fe.projectName)}();await Me.fetchSessions(e)}t(()=>Me.sessionsWithAlias,e=>{We.value=[...e];const s=new Set(e.map(e=>e.sessionId));Je.value=Je.value.filter(e=>s.has(e)),Ze.value&&0===e.length&&gs()},{immediate:!0});const vs=a(()=>{if(!Ke.value)return We.value;const e=Ke.value.toLowerCase();return We.value.filter(s=>s.sessionId.toLowerCase().includes(e)||s.alias&&s.alias.toLowerCase().includes(e)||s.firstMessage&&s.firstMessage.toLowerCase().includes(e)||s.gitBranch&&s.gitBranch.toLowerCase().includes(e))});function fs(){const e=Be.meta.channel||"claude";$e.push({name:`${e}-projects`})}async function ps(){if(Ke.value){Ye.value=!0;try{const e=await $(Ge.value,Ke.value,35,Te.value);qe.value=e,De.value=!0}catch(e){B.error("搜索失败: "+e.message)}finally{Ye.value=!1}}}async function ms(){const e=We.value.map(e=>e.sessionId);await Me.saveSessionOrder(e)}function hs(){Ze.value=!0,Re.value=null}function gs(){Ze.value=!1,Je.value=[],Re.value=null}function ys(e){return os.value.has(e)}function ks(e,s=!ys(e)){const a=new Set(Je.value);s?a.add(e):a.delete(e),Je.value=Array.from(a)}function _s(e){Je.value=e?We.value.map(e=>e.sessionId):[]}function ws(e){Ze.value?ks(e.sessionId):function(e){ss.value=e.sessionId,as.value=e.alias||"",es.value=!0,j(()=>{var e;null==(e=ls.value)||e.open()})}(e)}async function Is(){if(He.value)try{const e=He.value.sessionId;Oe.value?(await Me.setAlias(e,Oe.value),B.success("别名设置成功")):(await Me.deleteAlias(e),B.success("别名已删除")),Ve.value=!1,He.value=null,Oe.value=""}catch(e){B.error("操作失败: "+e.message)}}function Cs(e){B.error(e)}function bs(e){const s=new Set((e||[]).filter(Boolean));0!==s.size&&(Je.value=Je.value.filter(e=>!s.has(e)),ss.value&&s.has(ss.value)&&(es.value=!1,ss.value="",as.value=""))}async function js(e){try{const{copyResult:s}=await L(Ge.value,e,Te.value);if("manual"===(null==s?void 0:s.method))return void B.warning("自动复制失败,已弹出手动复制框");B.success("启动命令已复制到剪贴板")}catch(s){B.error("复制失败: "+s.message)}}function zs(){if(0===us.value)return void B.warning("请先选择要删除的会话");const e=[...Je.value];M.warning({title:"批量删除会话",content:`确定要删除选中的 ${e.length} 个会话吗?此操作不可恢复!`,positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{Qe.value=!0;try{const s=await Me.deleteSessions(e);if(bs(s.deletedSessionIds),0===s.failed.length)return B.success(`已删除 ${s.deletedSessionIds.length} 个会话`),void gs();Je.value=s.failed.map(e=>e.sessionId),s.deletedSessionIds.length>0?B.warning(`已删除 ${s.deletedSessionIds.length} 个会话,${s.failed.length} 个删除失败`):B.error(`删除失败: ${s.failed[0].error.message}`)}finally{Qe.value=!1}}})}function xs(e){if(!e)return"";return new Date(e).toLocaleString("zh-CN")}function Ns(e){if(!e)return"0 B";const s=1024;return e<s?e+" B":e<s*s?(e/s).toFixed(1)+" KB":(e/s/s).toFixed(1)+" MB"}function Ss(e,s){if(!s||!e)return e;const a=new RegExp(`(${s})`,"gi");return e.replace(a,'<mark class="keyword-highlight">$1</mark>')}function Fs(e,s=80){return e?e.length>s?e.substring(0,s)+"...":e:""}return t([Te,()=>Fe.projectName],([e])=>{gs(),Me.setChannel(e),ds()},{immediate:!0}),n(()=>{}),i(()=>{}),(e,s)=>(u(),o("div",te,[r("div",ne,[r("div",ie,[c(p(q),{size:"small",tertiary:"",onClick:fs,class:"back-button"},{icon:f(()=>[c(p(W),{size:"18"},{default:f(()=>[c(p(U))]),_:1})]),_:1}),r("div",oe,[r("span",ue,m(Ae.value)+" Sessions",1),r("div",re,[r("h2",ce,m(ns.value),1),c(p(D),{depth:"3",class:"session-count"},{default:f(()=>[h(m(p(Me).sessions.length)+" 个对话",1)]),_:1}),c(p(X),{size:"small",bordered:!1,type:"info",class:"total-size-tag"},{default:f(()=>[h(m(Ns(p(Me).totalSize)),1)]),_:1})]),r("p",de,m(is.value),1)])]),r("div",ve,[r("div",fe,[Ze.value?(u(),o(g,{key:0},[c(p(Y),{checked:rs.value,indeterminate:cs.value,disabled:0===We.value.length||Qe.value,"onUpdate:checked":_s},{default:f(()=>[...s[9]||(s[9]=[h(" 全选 ",-1)])]),_:1},8,["checked","indeterminate","disabled"]),c(p(D),{depth:"3"},{default:f(()=>[h("已选 "+m(us.value)+" 个",1)]),_:1}),c(p(q),{size:"small",type:"error",disabled:0===us.value,loading:Qe.value,onClick:zs},{icon:f(()=>[c(p(W),null,{default:f(()=>[c(p(P))]),_:1})]),default:f(()=>[s[10]||(s[10]=h(" 删除 ",-1))]),_:1},8,["disabled","loading"]),c(p(q),{size:"small",disabled:Qe.value,onClick:gs},{default:f(()=>[...s[11]||(s[11]=[h(" 完成 ",-1)])]),_:1},8,["disabled"])],64)):(u(),d(p(q),{key:1,size:"small",secondary:"",onClick:hs},{icon:f(()=>[c(p(W),null,{default:f(()=>[c(p(P))]),_:1})]),default:f(()=>[s[12]||(s[12]=h(" 管理 ",-1))]),_:1}))]),c(p(Z),{value:Ke.value,"onUpdate:value":s[0]||(s[0]=e=>Ke.value=e),placeholder:"搜索会话...",clearable:"",class:"search-input",onKeyup:y(ps,["enter"]),disabled:Ye.value},{prefix:f(()=>[c(p(W),null,{default:f(()=>[c(p(T))]),_:1})]),suffix:f(()=>[c(p(q),{text:"",onClick:ps,disabled:!Ke.value||Ye.value,loading:Ye.value},{default:f(()=>[...s[13]||(s[13]=[h(" 搜索 ",-1)])]),_:1},8,["disabled","loading"])]),_:1},8,["value","disabled"])])]),r("div",{class:"page-content session-content",ref_key:"contentEl",ref:Xe},[p(Me).loading?(u(),o("div",pe,[c(p(J),{size:"large"},{description:f(()=>[...s[14]||(s[14]=[h(" 加载会话列表... ",-1)])]),_:1})])):p(Me).error?(u(),d(p(Q),{key:1,type:"error",title:"加载失败",style:{"margin-bottom":"16px"}},{default:f(()=>[h(m(p(Me).error),1)]),_:1})):vs.value.length>0?(u(),d(p(z),C({key:2,modelValue:We.value,"onUpdate:modelValue":s[3]||(s[3]=e=>We.value=e),"item-key":"sessionId",class:"sessions-list",handle:".drag-handle",disabled:Ze.value||Qe.value},ts,{"ghost-class":"ghost","chosen-class":"chosen",animation:"200",onEnd:ms}),{item:f(({element:e})=>[r("div",{class:k(["session-item",{"session-item-selected":ys(e.sessionId),"session-item-selection-mode":Ze.value}]),onMouseenter:s=>Re.value=e.sessionId,onMouseleave:s[2]||(s[2]=e=>Re.value=null),onClick:s=>ws(e)},[Ze.value?(u(),o("div",{key:1,class:"selection-checkbox",onClick:s[1]||(s[1]=_(()=>{},["stop"]))},[c(p(Y),{checked:ys(e.sessionId),"onUpdate:checked":s=>ks(e.sessionId,s)},null,8,["checked","onUpdate:checked"])])):(u(),o("div",he,[c(p(W),{size:"16",color:"#999"},{default:f(()=>[c(p(A))]),_:1})])),r("div",ge,[r("div",ye,[c(p(W),{size:"24",color:"#18a058"},{default:f(()=>[c(p(E))]),_:1})]),r("div",ke,[r("div",_e,[r("div",we,[r("span",Ie,m(e.alias?`${e.alias} (${e.sessionId.substring(0,8)})`:e.sessionId),1),e.forkedFrom?(u(),d(p(ee),{key:0,placement:"top"},{trigger:f(()=>[c(p(X),{size:"small",type:"warning",bordered:!1,style:{"margin-left":"8px",cursor:"help"}},{icon:f(()=>[c(p(W),null,{default:f(()=>[c(p(G))]),_:1})]),default:f(()=>[s[15]||(s[15]=h(" Fork ",-1))]),_:1})]),default:f(()=>[h(" Fork 自: "+m(e.forkedFrom),1)]),_:2},1024)):v("",!0)])]),r("div",Ce,[c(p(D),{depth:"3"},{default:f(()=>[h(m(xs(e.mtime)),1)]),_:2},1024),c(p(D),{depth:"3"},{default:f(()=>[...s[16]||(s[16]=[h("•",-1)])]),_:1}),c(p(X),{size:"small",bordered:!1},{default:f(()=>[h(m(Ns(e.size)),1)]),_:2},1024)]),e.firstMessage?(u(),d(p(D),{key:0,depth:"3",class:"session-message"},{default:f(()=>[h(m(Fs(e.firstMessage,80)),1)]),_:2},1024)):e.gitBranch||e.summary?v("",!0):(u(),d(p(D),{key:1,depth:"3",class:"session-message session-message-empty"},{default:f(()=>[...s[17]||(s[17]=[h(" 暂未读取到对话内容 ",-1)])]),_:1}))])]),r("div",be,[r("div",je,[e.gitBranch?(u(),d(p(X),{key:0,size:"small",type:"info",bordered:!1},{icon:f(()=>[c(p(W),null,{default:f(()=>[c(p(G))]),_:1})]),default:f(()=>[h(" "+m(e.gitBranch),1)]),_:2},1024)):v("",!0)]),Ze.value?v("",!0):(u(),o("div",ze,[c(p(se),null,{default:f(()=>[w(c(p(q),{size:"small",type:"error",onClick:_(s=>{return a=e.sessionId,void M.warning({title:"删除会话",content:"确定要删除这个会话吗?此操作不可恢复!",positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{try{await Me.deleteSession(a),bs([a]),B.success("会话已删除")}catch(e){B.error("删除失败: "+e.message)}}});var a},["stop"])},{icon:f(()=>[c(p(W),null,{default:f(()=>[c(p(P))]),_:1})]),default:f(()=>[s[18]||(s[18]=h(" 删除 ",-1))]),_:1},8,["onClick"]),[[I,Re.value===e.sessionId]]),c(p(q),{size:"small",onClick:_(s=>function(e){He.value=e,Oe.value=e.alias||"",Ve.value=!0}(e),["stop"])},{icon:f(()=>[c(p(W),null,{default:f(()=>[c(p(K))]),_:1})]),default:f(()=>[s[19]||(s[19]=h(" 别名 ",-1))]),_:1},8,["onClick"]),c(p(q),{size:"small",type:p(Pe)(Te.value,Ge.value,e.sessionId)?"warning":"default",onClick:_(s=>async function(e){const s=Te.value,a=Pe(s,Ge.value,e.sessionId);try{if(a)await Ue(s,Ge.value,e.sessionId),B.success("已取消收藏");else{const a={sessionId:e.sessionId,projectName:Ge.value,projectDisplayName:ns.value,projectFullPath:is.value,alias:e.alias||"",firstMessage:e.firstMessage||"",mtime:e.mtime,size:e.size,gitBranch:e.gitBranch||"",forkedFrom:e.forkedFrom||""};await Le(s,a),B.success("已添加到收藏")}}catch(l){B.error("操作失败: "+l.message)}}(e),["stop"])},{icon:f(()=>[c(p(W),null,{default:f(()=>[p(Pe)(Te.value,Ge.value,e.sessionId)?(u(),d(p(V),{key:0})):(u(),d(p(H),{key:1}))]),_:2},1024)]),default:f(()=>[h(" "+m(p(Pe)(Te.value,Ge.value,e.sessionId)?"已收藏":"收藏"),1)]),_:2},1032,["type","onClick"]),c(p(q),{size:"small",onClick:_(s=>async function(e){try{await Me.forkSession(e),B.success("Fork 成功!")}catch(s){B.error("Fork 失败: "+s.message)}}(e.sessionId),["stop"])},{icon:f(()=>[c(p(W),null,{default:f(()=>[c(p(G))]),_:1})]),default:f(()=>[s[20]||(s[20]=h(" Fork ",-1))]),_:1},8,["onClick"]),c(p(q),{size:"small",type:"primary",onClick:_(s=>js(e.sessionId),["stop"])},{icon:f(()=>[c(p(W),null,{default:f(()=>[c(p(O))]),_:1})]),default:f(()=>[s[21]||(s[21]=h(" 使用对话 ",-1))]),_:1},8,["onClick"])]),_:2},1024)]))])],42,me)]),_:1},16,["modelValue","disabled"])):(u(),d(p(ae),{key:3,description:"没有找到会话",style:{"margin-top":"60px"}},{icon:f(()=>[c(p(W),null,{default:f(()=>[c(p(R))]),_:1})]),_:1}))],512),c(p(le),{show:Ve.value,"onUpdate:show":s[6]||(s[6]=e=>Ve.value=e),preset:"dialog",title:"设置别名"},{action:f(()=>[c(p(se),null,{default:f(()=>[c(p(q),{onClick:s[5]||(s[5]=e=>Ve.value=!1)},{default:f(()=>[...s[22]||(s[22]=[h("取消",-1)])]),_:1}),c(p(q),{type:"primary",onClick:Is},{default:f(()=>[...s[23]||(s[23]=[h("确定",-1)])]),_:1})]),_:1})]),default:f(()=>[c(p(Z),{value:Oe.value,"onUpdate:value":s[4]||(s[4]=e=>Oe.value=e),placeholder:"输入别名(留空删除)",onKeyup:y(Is,["enter"])},null,8,["value"])]),_:1},8,["show"]),c(p(le),{show:De.value,"onUpdate:show":s[7]||(s[7]=e=>De.value=e),preset:"card",title:"搜索结果",style:{width:"1200px"}},{default:f(()=>[qe.value?(u(),o("div",xe,[c(p(Q),{type:"info",style:{"margin-bottom":"16px"}},{default:f(()=>[h(' 关键词 "'+m(qe.value.keyword)+'" 共找到 '+m(qe.value.totalMatches)+" 处匹配 ",1)]),_:1}),(u(!0),o(g,null,b(qe.value.sessions,e=>(u(),o("div",{key:e.sessionId,class:"search-result-item"},[r("div",Ne,[r("div",Se,[c(p(D),{strong:""},{default:f(()=>[h(m(e.alias?`${e.alias} (${e.sessionId.substring(0,8)})`:e.sessionId.substring(0,8)),1)]),_:2},1024),c(p(X),{size:"small",bordered:!1},{default:f(()=>[h(m(e.matchCount)+" 个匹配",1)]),_:2},1024)]),c(p(q),{size:"small",type:"primary",onClick:s=>js(e.sessionId)},{icon:f(()=>[c(p(W),null,{default:f(()=>[c(p(O))]),_:1})]),default:f(()=>[s[24]||(s[24]=h(" 使用对话 ",-1))]),_:1},8,["onClick"])]),(u(!0),o(g,null,b(e.matches,(e,s)=>(u(),o("div",{key:s,class:"search-match"},[c(p(X),{size:"tiny",type:"user"===e.role?"info":"success",bordered:!1},{default:f(()=>[h(m("user"===e.role?"用户":"助手"),1)]),_:2},1032,["type"]),c(p(D),{depth:"3",class:"search-match-text",innerHTML:Ss(e.context,qe.value.keyword)},null,8,["innerHTML"])]))),128))]))),128)),0===qe.value.sessions.length?(u(),d(p(ae),{key:0,description:"没有找到匹配的内容"})):v("",!0)])):v("",!0)]),_:1},8,["show"]),ss.value?(u(),d(F,{key:0,ref_key:"chatHistoryRef",ref:ls,show:es.value,"onUpdate:show":s[8]||(s[8]=e=>es.value=e),"project-name":Ge.value,"session-id":ss.value,"session-alias":as.value,channel:Te.value,onError:Cs},null,8,["show","project-name","session-id","session-alias","channel"])):v("",!0)]))}},[["__scopeId","data-v-e1cf2619"]]);export{Fe as default};