coding-tool-x 3.5.7 → 3.5.8

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 (57) hide show
  1. package/dist/web/assets/{Analytics-C6DEmD3D.js → Analytics-BzoNzfbi.js} +2 -2
  2. package/dist/web/assets/Analytics-vQS5IWvs.css +1 -0
  3. package/dist/web/assets/{ConfigTemplates-Cf_iTpC4.js → ConfigTemplates-O4ikBt1o.js} +1 -1
  4. package/dist/web/assets/{Home-BtBmYLJ1.js → Home-BQjsnblU.js} +1 -1
  5. package/dist/web/assets/Home-qzk118Of.css +1 -0
  6. package/dist/web/assets/{PluginManager-DEk8vSw5.js → PluginManager-DS_DJnVc.js} +1 -1
  7. package/dist/web/assets/ProjectList-CqYDtsHx.js +1 -0
  8. package/dist/web/assets/ProjectList-GCC2QOmq.css +1 -0
  9. package/dist/web/assets/SessionList-CfPtcq6Y.css +1 -0
  10. package/dist/web/assets/SessionList-DMlLtMCz.js +1 -0
  11. package/dist/web/assets/{SkillManager-DcZOiiSf.js → SkillManager-DpNE02r0.js} +1 -1
  12. package/dist/web/assets/{WorkspaceManager-BHqI8aGV.js → WorkspaceManager-DMY7_SHh.js} +1 -1
  13. package/dist/web/assets/icons-CEq2hYB-.js +1 -0
  14. package/dist/web/assets/index-Clf0l3wc.js +2 -0
  15. package/dist/web/assets/index-Dih_bOsv.css +1 -0
  16. package/dist/web/assets/{naive-ui-BaTCPPL5.js → naive-ui-Cg4_ZeoT.js} +1 -1
  17. package/dist/web/assets/{vendors-Fza9uSYn.js → vendors-Bsp-dq2d.js} +1 -1
  18. package/dist/web/assets/vue-vendor-BxIT0uQq.js +45 -0
  19. package/dist/web/index.html +7 -7
  20. package/package.json +1 -1
  21. package/src/commands/export-config.js +6 -6
  22. package/src/config/default.js +2 -6
  23. package/src/config/loader.js +2 -2
  24. package/src/config/paths.js +160 -33
  25. package/src/server/api/agents.js +52 -2
  26. package/src/server/api/commands.js +38 -2
  27. package/src/server/api/plugins.js +104 -1
  28. package/src/server/api/sessions.js +5 -5
  29. package/src/server/services/agents-service.js +269 -62
  30. package/src/server/services/commands-service.js +281 -81
  31. package/src/server/services/config-export-service.js +7 -7
  32. package/src/server/services/config-registry-service.js +4 -5
  33. package/src/server/services/config-sync-manager.js +61 -41
  34. package/src/server/services/config-sync-service.js +3 -3
  35. package/src/server/services/gemini-channels.js +5 -5
  36. package/src/server/services/gemini-config.js +3 -4
  37. package/src/server/services/gemini-sessions.js +23 -20
  38. package/src/server/services/gemini-settings-manager.js +2 -3
  39. package/src/server/services/mcp-service.js +9 -14
  40. package/src/server/services/native-oauth-adapters.js +3 -3
  41. package/src/server/services/notification-hooks.js +3 -3
  42. package/src/server/services/opencode-sessions.js +4 -4
  43. package/src/server/services/opencode-settings-manager.js +3 -3
  44. package/src/server/services/plugins-service.js +499 -23
  45. package/src/server/services/prompts-service.js +5 -9
  46. package/src/server/services/sessions.js +2 -2
  47. package/src/server/services/skill-service.js +155 -18
  48. package/dist/web/assets/Analytics-RNn1BUbG.css +0 -1
  49. package/dist/web/assets/Home-BQxQ1LhR.css +0 -1
  50. package/dist/web/assets/ProjectList-BMVhA_Kh.js +0 -1
  51. package/dist/web/assets/ProjectList-DL4JK6ci.css +0 -1
  52. package/dist/web/assets/SessionList-B5ioAXxg.js +0 -1
  53. package/dist/web/assets/SessionList-B8dXVXfi.css +0 -1
  54. package/dist/web/assets/icons-CQuif85v.js +0 -1
  55. package/dist/web/assets/index-CtByKdkA.js +0 -2
  56. package/dist/web/assets/index-VGAxnLqi.css +0 -1
  57. package/dist/web/assets/vue-vendor-aWwwFAao.js +0 -45
@@ -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 } = require('../../config/paths');
21
+ const { NATIVE_PATHS, HOME_DIR, PATHS, getNativePlatformSkillsDir } = 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: path.join(HOME_DIR, '.claude', 'skills'),
169
+ installDir: getNativePlatformSkillsDir('claude'),
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: path.join(HOME_DIR, '.codex', 'skills'),
175
+ installDir: getNativePlatformSkillsDir('codex'),
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: path.join(HOME_DIR, '.gemini', 'skills'),
181
+ installDir: getNativePlatformSkillsDir('gemini'),
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: path.join(NATIVE_PATHS.opencode.config, 'skills'),
187
+ installDir: getNativePlatformSkillsDir('opencode'),
188
188
  storageDir: PATHS.localSkills.opencode,
189
189
  reposFile: PATHS.skillRepos.opencode,
190
190
  cacheFile: PATHS.skillCaches.opencode
@@ -248,11 +248,12 @@ class SkillService {
248
248
  }
249
249
  }
250
250
 
251
- prepareSkills(skills = []) {
251
+ prepareSkills(skills = [], options = {}) {
252
252
  const preparedSkills = Array.isArray(skills)
253
253
  ? skills.map(skill => ({ ...skill }))
254
254
  : [];
255
255
 
256
+ this.mergeInstalledSkills(preparedSkills, options);
256
257
  this.mergeLocalSkills(preparedSkills);
257
258
  this.deduplicateSkills(preparedSkills);
258
259
  preparedSkills.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()));
@@ -537,6 +538,8 @@ class SkillService {
537
538
  * 获取所有技能列表(带缓存)
538
539
  */
539
540
  async listSkills(forceRefresh = false) {
541
+ const prepareOptions = { syncManagedLocalSkills: forceRefresh };
542
+
540
543
  // 强制刷新时仅清空内存缓存,保留磁盘缓存作为回退来源
541
544
  if (forceRefresh) {
542
545
  this.clearCache();
@@ -547,11 +550,11 @@ class SkillService {
547
550
  // 检查内存缓存
548
551
  if (!forceRefresh && Array.isArray(this.skillsCache) && this.skillsCache.length > 0) {
549
552
  if (Array.isArray(fileCache) && fileCache.length > this.skillsCache.length) {
550
- this.skillsCache = this.prepareSkills(fileCache);
553
+ this.skillsCache = this.prepareSkills(fileCache, prepareOptions);
551
554
  this.cacheTime = Date.now();
552
555
  return this.skillsCache;
553
556
  }
554
- this.skillsCache = this.prepareSkills(this.skillsCache);
557
+ this.skillsCache = this.prepareSkills(this.skillsCache, prepareOptions);
555
558
  this.cacheTime = Date.now();
556
559
  return this.skillsCache;
557
560
  }
@@ -559,7 +562,7 @@ class SkillService {
559
562
  // 检查文件缓存
560
563
  if (!forceRefresh) {
561
564
  if (fileCache && fileCache.length > 0) {
562
- this.skillsCache = this.prepareSkills(fileCache);
565
+ this.skillsCache = this.prepareSkills(fileCache, prepareOptions);
563
566
  this.cacheTime = Date.now();
564
567
  return this.skillsCache;
565
568
  }
@@ -600,10 +603,10 @@ class SkillService {
600
603
  }
601
604
  }
602
605
 
603
- const preparedSkills = this.prepareSkills(skills);
606
+ const preparedSkills = this.prepareSkills(skills, prepareOptions);
604
607
 
605
608
  const hasUsableFileCache = Array.isArray(fileCache) && fileCache.length > 0;
606
- const preparedFileCache = hasUsableFileCache ? this.prepareSkills(fileCache) : null;
609
+ const preparedFileCache = hasUsableFileCache ? this.prepareSkills(fileCache, prepareOptions) : null;
607
610
  const shouldUseStaleFileCache = hasUsableFileCache && (
608
611
  (enabledRemoteRepos.length > 0 && remoteFailureCount === enabledRemoteRepos.length) ||
609
612
  (remoteFailureCount > 0 && preparedFileCache.length > preparedSkills.length)
@@ -1347,6 +1350,75 @@ class SkillService {
1347
1350
  this.scanLocalDir(this.storageDir, this.storageDir, skills);
1348
1351
  }
1349
1352
 
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
+
1350
1422
  /**
1351
1423
  * 递归扫描本地目录
1352
1424
  */
@@ -1410,6 +1482,54 @@ class SkillService {
1410
1482
  }
1411
1483
  }
1412
1484
 
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
+
1413
1533
  /**
1414
1534
  * 去重技能列表
1415
1535
  */
@@ -1921,11 +2041,8 @@ ${content}
1921
2041
  * 获取技能详情(完整内容)
1922
2042
  */
1923
2043
  async getSkillDetail(directory, repoHint = null, fullDirectoryHint = '') {
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');
2044
+ const parseLocalSkillDetail = (skillMdPath, { installed, isLocal }) => {
2045
+ const content = fs.readFileSync(skillMdPath, 'utf-8');
1929
2046
  const metadata = this.parseSkillMd(content);
1930
2047
 
1931
2048
  // 提取正文内容(去除 frontmatter)
@@ -1938,9 +2055,29 @@ ${content}
1938
2055
  description: metadata.description || '',
1939
2056
  content: body,
1940
2057
  fullContent: content,
1941
- installed: true,
2058
+ installed,
2059
+ isLocal,
1942
2060
  source: 'local'
1943
2061
  };
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
+ });
1944
2081
  }
1945
2082
 
1946
2083
  const parseRemoteSkillContent = (content, repo, fullDirectory = '') => {
@@ -2088,7 +2225,7 @@ ${content}
2088
2225
  */
2089
2226
  getInstalledSkills() {
2090
2227
  const skills = [];
2091
- this.scanLocalDir(this.installDir, this.installDir, skills);
2228
+ this.scanInstalledDir(this.installDir, this.installDir, skills);
2092
2229
  return skills;
2093
2230
  }
2094
2231
  }
@@ -1 +0,0 @@
1
- .analytics-page[data-v-34f16206]{height:100%;background:var(--bg-primary);overflow-y:auto;padding:16px 20px;box-sizing:border-box;display:flex;flex-direction:column;gap:14px}.analytics-header[data-v-34f16206]{display:flex;align-items:center;justify-content:space-between;flex-shrink:0;flex-wrap:wrap;gap:10px}.page-title[data-v-34f16206]{margin:0;font-size:18px;font-weight:700;color:var(--text-primary)}.toolbar[data-v-34f16206]{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.range-buttons[data-v-34f16206]{display:flex;align-items:center;gap:4px}.range-btn[data-v-34f16206]{padding:4px 10px;font-size:12px;border:1px solid var(--border-color, #e0e0e6);background:transparent;color:var(--text-secondary);border-radius:4px;cursor:pointer;transition:all .15s}.range-btn[data-v-34f16206]:hover{border-color:var(--primary-color, #18a058);color:var(--primary-color, #18a058)}.range-btn.active[data-v-34f16206]{background:var(--primary-color, #18a058);border-color:var(--primary-color, #18a058);color:#fff}.custom-range-wrapper[data-v-34f16206]{margin-left:4px}.loading-overlay[data-v-34f16206]{display:flex;justify-content:center;padding:20px 0}.summary-cards[data-v-34f16206]{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;flex-shrink:0}.summary-card[data-v-34f16206]{background:var(--bg-secondary);border:1px solid var(--border-color, #e0e0e6);border-radius:8px;padding:14px 16px}.summary-label[data-v-34f16206]{font-size:11px;color:var(--text-secondary);margin-bottom:6px;text-transform:uppercase;letter-spacing:.05em}.summary-value[data-v-34f16206]{font-size:22px;font-weight:700;color:var(--text-primary);line-height:1.2}.chart-section[data-v-34f16206]{background:var(--bg-secondary);border:1px solid var(--border-color, #e0e0e6);border-radius:8px;padding:14px 16px;flex-shrink:0}.chart-section.fullscreen[data-v-34f16206]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;border-radius:0;padding:20px;background:var(--bg-secondary);overflow:auto}.cumulative-section[data-v-34f16206]{margin-bottom:8px}.chart-section-header[data-v-34f16206]{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.chart-title[data-v-34f16206]{font-size:13px;font-weight:600;color:var(--text-primary)}.chart-controls[data-v-34f16206]{display:flex;align-items:center;gap:8px}.chart-type-toggle[data-v-34f16206]{display:flex;border:1px solid var(--border-color, #e0e0e6);border-radius:4px;overflow:hidden}.toggle-btn[data-v-34f16206]{padding:3px 10px;font-size:12px;border:none;background:transparent;color:var(--text-secondary);cursor:pointer;transition:all .15s}.toggle-btn.active[data-v-34f16206]{background:var(--primary-color, #18a058);color:#fff}.icon-btn[data-v-34f16206]{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:1px solid var(--border-color, #e0e0e6);border-radius:4px;background:transparent;cursor:pointer;color:var(--text-secondary);transition:all .15s}.icon-btn[data-v-34f16206]:hover{border-color:var(--primary-color, #18a058);color:var(--primary-color, #18a058)}.main-chart[data-v-34f16206]{height:560px;width:100%}.chart-section.fullscreen .main-chart[data-v-34f16206]{height:calc(100vh - 100px)}.cumulative-chart[data-v-34f16206]{height:200px;width:100%}.empty-state[data-v-34f16206]{height:120px;display:flex;align-items:center;justify-content:center;color:var(--text-secondary);font-size:13px}@media (max-width: 768px){.analytics-page[data-v-34f16206]{padding:10px 12px}.summary-cards[data-v-34f16206]{grid-template-columns:repeat(2,1fr)}.analytics-header[data-v-34f16206]{flex-direction:column;align-items:flex-start}.toolbar[data-v-34f16206]{width:100%}}@media (max-width: 480px){.summary-cards[data-v-34f16206]{grid-template-columns:1fr 1fr}.summary-value[data-v-34f16206]{font-size:18px}}
@@ -1 +0,0 @@
1
- .channel-column[data-v-0bad694b]{display:flex;flex-direction:column;height:100%;min-height:0;background:var(--gradient-card);border:1px solid var(--border-primary);border-radius:8px;overflow:hidden;box-shadow:var(--shadow-sm)}.channel-header[data-v-0bad694b]{display:flex;align-items:center;gap:10px;padding:12px 14px;background:var(--bg-primary);position:relative}.drag-handle[data-v-0bad694b]{cursor:grab;color:var(--text-tertiary);display:flex;align-items:center;padding:4px;margin:-4px 0 -4px -4px;border-radius:4px;transition:all .2s}.drag-handle[data-v-0bad694b]:hover{color:var(--text-secondary);background:var(--bg-tertiary)}.drag-handle[data-v-0bad694b]:active{cursor:grabbing}.channel-header[data-v-0bad694b]:after{content:"";position:absolute;bottom:0;left:14px;right:14px;height:2px;border-radius:1px}.channel-header.claude[data-v-0bad694b]{background:linear-gradient(135deg,rgba(24,160,88,.08) 0%,transparent 100%)}.channel-header.claude[data-v-0bad694b]:after{background:linear-gradient(90deg,#18a058,#18a0584d)}.channel-header.codex[data-v-0bad694b]{background:linear-gradient(135deg,rgba(59,130,246,.08) 0%,transparent 100%)}.channel-header.codex[data-v-0bad694b]:after{background:linear-gradient(90deg,#3b82f6,#3b82f64d)}.channel-header.gemini[data-v-0bad694b]{background:linear-gradient(135deg,rgba(168,85,247,.08) 0%,transparent 100%)}.channel-header.gemini[data-v-0bad694b]:after{background:linear-gradient(90deg,#a855f7,#a855f74d)}.channel-header.opencode[data-v-0bad694b]{background:linear-gradient(135deg,rgba(234,88,12,.08) 0%,transparent 100%)}.channel-header.opencode[data-v-0bad694b]:after{background:linear-gradient(90deg,#ea580c,#ea580c4d)}.header-icon[data-v-0bad694b]{width:32px;height:32px;border-radius:6px;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 8px #0000001a}.channel-header.claude .header-icon[data-v-0bad694b]{background:linear-gradient(135deg,#18a058,#15803d);color:#fff}.channel-header.codex .header-icon[data-v-0bad694b]{background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff}.channel-header.gemini .header-icon[data-v-0bad694b]{background:linear-gradient(135deg,#a855f7,#9333ea);color:#fff}.channel-header.opencode .header-icon[data-v-0bad694b]{background:linear-gradient(135deg,#ea580c,#c2410c);color:#fff}.channel-title[data-v-0bad694b]{font-size:15px;font-weight:700;margin:0;color:var(--text-primary);letter-spacing:.3px}.channel-content[data-v-0bad694b]{flex:1;min-height:0;overflow:hidden;padding:10px;display:flex;flex-direction:column;gap:8px}.card[data-v-0bad694b]{background:var(--bg-primary);border:1px solid var(--border-primary);border-radius:8px;overflow:hidden;transition:all .3s cubic-bezier(.4,0,.2,1);box-shadow:0 2px 12px #0000000d;position:relative}.card[data-v-0bad694b]: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-0bad694b]:hover{box-shadow:0 6px 20px #0000001a;border-color:var(--border-secondary)}.card[data-v-0bad694b]:hover:before{opacity:1}.card.clickable[data-v-0bad694b]{cursor:pointer}.card.clickable[data-v-0bad694b]:hover{border-color:#18a058;transform:translateY(-2px);box-shadow:0 8px 24px #18a0582e}.card.clickable[data-v-0bad694b]: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-0bad694b]:hover:after{opacity:1}.card-header[data-v-0bad694b]{display:flex;align-items:center;gap:8px;padding:10px 12px;background:linear-gradient(180deg,var(--bg-secondary) 0%,var(--bg-primary) 100%);border-bottom:1px solid var(--border-primary);position:relative;min-height:24px}.card-header.compact[data-v-0bad694b]{padding:8px 12px}.card-header .n-icon[data-v-0bad694b]{color:var(--text-tertiary);transition:color .2s ease}.card:hover .card-header .n-icon[data-v-0bad694b]{color:var(--text-secondary)}.card-title[data-v-0bad694b]{font-size:11px;font-weight:700;margin:0;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.8px}.runtime-badge[data-v-0bad694b]{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-0bad694b 2s ease-in-out infinite}@keyframes pulse-runtime-0bad694b{0%,to{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(.98)}}.card-body[data-v-0bad694b]{padding:12px;background:var(--bg-primary)}.card-body.compact[data-v-0bad694b]{padding:10px 12px}.proxy-control[data-v-0bad694b]{display:flex;justify-content:space-between;align-items:center;gap:16px}.proxy-info[data-v-0bad694b]{display:flex;flex-direction:column;gap:4px}.proxy-info-row[data-v-0bad694b]{display:flex;align-items:center;justify-content:space-between}.proxy-status[data-v-0bad694b]{display:flex;align-items:center;gap:6px}.proxy-port[data-v-0bad694b]{font-size:11px;color:var(--text-secondary);margin-left:6px}.channel-selector[data-v-0bad694b]{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-0bad694b]:hover{background:var(--hover-bg);border-color:var(--border-secondary);color:var(--text-primary)}.channel-selector[data-v-0bad694b]:disabled{opacity:.5;cursor:not-allowed}.channel-name[data-v-0bad694b]{font-size:11px;font-weight:500;max-width:90px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-dot[data-v-0bad694b]{width:8px;height:8px;border-radius:50%;background:var(--border-secondary);transition:all .3s ease}.status-dot.active[data-v-0bad694b]{background:#18a058;box-shadow:0 0 8px #18a05880}.quick-stats[data-v-0bad694b]{display:flex;gap:16px;padding:4px 0}.stat-item[data-v-0bad694b]{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;padding:4px 0}.stat-divider[data-v-0bad694b]{width:1px;background:linear-gradient(180deg,transparent 0%,var(--border-primary) 50%,transparent 100%)}.quick-access-list[data-v-0bad694b]{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}.access-card[data-v-0bad694b]{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:6px;background:var(--bg-secondary);border:1px solid var(--border-color);transition:all .3s cubic-bezier(.4,0,.2,1);position:relative;min-height:52px;overflow:hidden}.access-card[data-v-0bad694b]: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-0bad694b]{width:32px;height:32px;border-radius:5px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all .3s ease}.access-content[data-v-0bad694b]{display:flex;flex-direction:column;gap:4px;flex:1}.access-card-projects .access-icon[data-v-0bad694b]{background:linear-gradient(135deg,#6366f126,#8b5cf626);color:#6366f1}.access-card-projects[data-v-0bad694b]:before{background:linear-gradient(135deg,#6366f114,#8b5cf614)}.access-card-projects:hover .access-icon[data-v-0bad694b]{background:linear-gradient(135deg,#6366f140,#8b5cf640);transform:scale(1.1) rotate(-5deg)}.access-card-sessions .access-icon[data-v-0bad694b]{background:linear-gradient(135deg,#10b98126,#05966926);color:#10b981}.access-card-sessions[data-v-0bad694b]:before{background:linear-gradient(135deg,#10b98114,#05966914)}.access-card-sessions:hover .access-icon[data-v-0bad694b]{background:linear-gradient(135deg,#10b98140,#05966940);transform:scale(1.1) rotate(5deg)}.access-card-goto .access-icon[data-v-0bad694b]{background:linear-gradient(135deg,#f59e0b26,#fb923c26);color:#f59e0b}.access-card-goto[data-v-0bad694b]:before{background:linear-gradient(135deg,#f59e0b14,#fb923c14)}.access-card-goto:hover .access-icon[data-v-0bad694b]{background:linear-gradient(135deg,#f59e0b40,#fb923c40);transform:scale(1.1) translate(3px)}.access-card.clickable[data-v-0bad694b]:hover{transform:translateY(-2px);box-shadow:0 8px 20px #0000001a;border-color:var(--border-secondary)}.access-card.clickable[data-v-0bad694b]:hover:before{opacity:1}.access-card.clickable[data-v-0bad694b]:active{transform:translateY(0)}.access-label[data-v-0bad694b]{display:block;font-size:10px;font-weight:600;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.3px}.access-value[data-v-0bad694b]{display:block;font-size:18px;font-weight:800;color:var(--text-primary);line-height:1}.access-goto[data-v-0bad694b]{display:block;font-size:12px;font-weight:700;color:var(--text-primary);line-height:1.2;white-space:nowrap}.stats-inline[data-v-0bad694b]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}.stats-inline.stats-3col[data-v-0bad694b]{grid-template-columns:repeat(3,1fr)}.stat-inline-item[data-v-0bad694b]{display:flex;align-items:center;gap:8px;padding:10px;background:var(--bg-secondary);border-radius:6px;border:1px solid var(--border-primary);transition:all .2s ease}.stat-inline-item[data-v-0bad694b]:hover{border-color:var(--border-secondary);background:var(--hover-bg)}.stat-icon-dot[data-v-0bad694b]{width:8px;height:8px;border-radius:50%;flex-shrink:0}.stat-icon-dot.requests[data-v-0bad694b]{background:#3b82f6;box-shadow:0 0 6px #3b82f680}.stat-icon-dot.tokens[data-v-0bad694b]{background:#18a058;box-shadow:0 0 6px #18a05880}.stat-icon-dot.cost[data-v-0bad694b]{background:#f59e0b;box-shadow:0 0 6px #f59e0b80}.stat-info[data-v-0bad694b]{display:flex;flex-direction:column;gap:1px;min-width:0}.stat-label[data-v-0bad694b]{font-size:10px;color:var(--text-tertiary);font-weight:500;text-transform:uppercase;letter-spacing:.2px}.stat-value[data-v-0bad694b]{font-size:16px;font-weight:700;color:var(--text-primary);line-height:1.2;transition:all .3s ease}.stat-value.animating[data-v-0bad694b]{animation:numberChange-0bad694b .6s ease}@keyframes numberChange-0bad694b{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-0bad694b],.chart-card[data-v-0bad694b]{border-left:2px solid transparent}.stats-card-claude[data-v-0bad694b],.chart-card[data-v-0bad694b]:has(+.stats-card-claude),.card[data-v-0bad694b]:has(.panel-card):nth-child(4){border-left-color:#18a058}.chart-card.chart-card-claude[data-v-0bad694b]{border-left-color:#18a058}.stats-card-codex[data-v-0bad694b],.chart-card[data-v-0bad694b]:has(+.stats-card-codex),.card[data-v-0bad694b]:has(.panel-card):nth-child(4){border-left-color:#3b82f6}.chart-card.chart-card-codex[data-v-0bad694b]{border-left-color:#3b82f6}.stats-card-gemini[data-v-0bad694b],.chart-card[data-v-0bad694b]:has(+.stats-card-gemini),.card[data-v-0bad694b]:has(.panel-card):nth-child(4){border-left-color:#a855f7}.chart-card.chart-card-gemini[data-v-0bad694b]{border-left-color:#a855f7}.stats-card-opencode[data-v-0bad694b],.chart-card[data-v-0bad694b]:has(+.stats-card-opencode),.card[data-v-0bad694b]:has(.panel-card):nth-child(4){border-left-color:#ea580c}.chart-card.chart-card-opencode[data-v-0bad694b]{border-left-color:#ea580c}.chart-card[data-v-0bad694b]{padding:0;overflow:hidden}.chart-card[data-v-0bad694b] .panel-card{border:none;border-radius:0;box-shadow:none;background:transparent}.stat-requests .stat-value[data-v-0bad694b]{color:#3b82f6}.stat-input .stat-value[data-v-0bad694b]{color:#18a058}.stat-output .stat-value[data-v-0bad694b]{color:#f59e0b}.token-label[data-v-0bad694b]{display:flex;align-items:center;gap:8px}.token-dot[data-v-0bad694b]{width:8px;height:8px;border-radius:50%}.logs-card[data-v-0bad694b]{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--border-primary);border-radius:6px}.logs-card-body[data-v-0bad694b]{flex:1;min-height:0;display:flex;flex-direction:column;padding:0}.logs-card .card-header[data-v-0bad694b]{background:linear-gradient(135deg,var(--bg-secondary) 0%,var(--bg-tertiary) 100%)}.logs-table-wrapper[data-v-0bad694b]{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;background:var(--bg-primary)}.logs-table-header[data-v-0bad694b]{display:flex;padding:10px 12px;background:linear-gradient(180deg,var(--bg-tertiary) 0%,var(--bg-secondary) 100%);border-bottom:2px solid var(--border-primary);font-size:11px;font-weight:700;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.6px;flex-shrink:0}.logs-header-claude .log-col[data-v-0bad694b]{color:#18a058b3;font-weight:600}.logs-header-codex .log-col[data-v-0bad694b]{color:#3b82f6b3;font-weight:600}.logs-header-gemini .log-col[data-v-0bad694b]{color:#a855f7b3;font-weight:600}.logs-header-opencode .log-col[data-v-0bad694b]{color:#ea580cb3;font-weight:600}[data-theme=dark] .logs-header-claude .log-col[data-v-0bad694b]{color:#34d399a6}[data-theme=dark] .logs-header-codex .log-col[data-v-0bad694b]{color:#60a5faa6}[data-theme=dark] .logs-header-gemini .log-col[data-v-0bad694b]{color:#c084fca6}[data-theme=dark] .logs-header-opencode .log-col[data-v-0bad694b]{color:#fb923ca6}.logs-container[data-v-0bad694b]{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden}.logs-container[data-v-0bad694b]::-webkit-scrollbar{width:4px}.logs-container[data-v-0bad694b]::-webkit-scrollbar-thumb{background:#18a0584d;border-radius:2px}.logs-container[data-v-0bad694b]::-webkit-scrollbar-thumb:hover{background:#18a05880}.empty-logs[data-v-0bad694b]{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-0bad694b]{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-0bad694b]:nth-child(2n){background:var(--bg-secondary)}.log-row[data-v-0bad694b]:hover{background:var(--hover-bg);transform:translate(2px)}.log-row.new-log[data-v-0bad694b]{animation:newLogPulse-0bad694b 4.5s cubic-bezier(.25,.46,.45,.94) forwards;border-left:3px solid #18a058}@keyframes newLogPulse-0bad694b{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-0bad694b]{animation:newLogPulseDark-0bad694b 4.5s cubic-bezier(.25,.46,.45,.94) forwards}@keyframes newLogPulseDark-0bad694b{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-0bad694b]{border-left:3px solid #18a058}.log-row.action-row[data-v-0bad694b]{background:linear-gradient(90deg,#18a0581f,#18a0580a);border-left:3px solid #18a058;padding-left:8px}.log-row.error-row[data-v-0bad694b]{background:linear-gradient(90deg,#d0305024,#d030500a);border-left:3px solid #d03050;padding-left:8px}.log-row.action-row[data-v-0bad694b]:hover{background:linear-gradient(90deg,#18a0582e,#18a05814)}.log-row.error-row[data-v-0bad694b]:hover{background:linear-gradient(90deg,#d0305033,#d0305014)}.action-content[data-v-0bad694b]{display:flex;align-items:center;gap:8px;width:100%}.action-msg[data-v-0bad694b]{flex:1;font-size:11px;color:#18a058;font-weight:600;letter-spacing:.2px}.action-msg.error-msg[data-v-0bad694b]{color:#d03050}.action-time[data-v-0bad694b]{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-0bad694b]{background:#d030501f}.log-col[data-v-0bad694b]{display:flex;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-channel[data-v-0bad694b]{min-width:0}.col-channel .n-tag[data-v-0bad694b]{max-width:100%;font-size:11px;font-weight:600;border-radius:4px;padding:3px 10px}.col-token[data-v-0bad694b]{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-0bad694b]{background:#ffffff0f}.col-time[data-v-0bad694b]{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-0bad694b]{opacity:1;color:var(--text-secondary)}.col-channel-claude[data-v-0bad694b]{flex:2 1 60px;min-width:50px}.col-token-claude[data-v-0bad694b]{flex:1 1 40px;min-width:35px}.col-time-claude[data-v-0bad694b]{flex:1.5 1 55px;min-width:50px}.col-channel-codex[data-v-0bad694b]{flex:2 1 60px;min-width:50px}.col-token-codex[data-v-0bad694b]{flex:1 1 40px;min-width:35px}.col-time-codex[data-v-0bad694b]{flex:1.5 1 55px;min-width:50px}.col-channel-gemini[data-v-0bad694b]{flex:2.5 1 70px;min-width:55px}.col-token-gemini[data-v-0bad694b]{flex:1.2 1 45px;min-width:40px}.col-time-gemini[data-v-0bad694b]{flex:1.8 1 60px;min-width:55px}.col-channel-opencode[data-v-0bad694b]{flex:2.5 1 70px;min-width:55px}.col-token-opencode[data-v-0bad694b]{flex:1.2 1 45px;min-width:40px}.col-time-opencode[data-v-0bad694b]{flex:1.8 1 60px;min-width:55px}.claude-extra-area[data-v-0bad694b]{display:flex;align-items:center;gap:6px;margin-left:auto}.mcp-count-tag[data-v-0bad694b],.skills-count-tag[data-v-0bad694b]{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-0bad694b]:hover,.skills-count-tag.clickable[data-v-0bad694b]:hover{transform:scale(1.03);filter:brightness(1.1)}.mcp-quick-panel[data-v-0bad694b],.skills-quick-panel[data-v-0bad694b]{padding:2px 0}.mcp-quick-panel .panel-title[data-v-0bad694b],.skills-quick-panel .panel-title[data-v-0bad694b]{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-0bad694b]:first-child,.skills-quick-panel .panel-title span[data-v-0bad694b]:first-child{font-size:13px;font-weight:600;color:var(--text-primary)}.no-items[data-v-0bad694b]{padding:16px 10px;text-align:center}.mcp-quick-list[data-v-0bad694b],.skills-quick-list[data-v-0bad694b]{max-height:300px;overflow-y:auto;padding:0 4px 4px}.mcp-quick-item[data-v-0bad694b],.skill-quick-item[data-v-0bad694b]{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-0bad694b]:hover,.skill-quick-item[data-v-0bad694b]:hover{background:var(--hover-bg)}.mcp-item-icon[data-v-0bad694b],.skill-item-icon[data-v-0bad694b]{width:24px;height:24px;border-radius:5px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.mcp-item-icon[data-v-0bad694b]{background:linear-gradient(135deg,#3b82f626,#3b82f60d);color:#3b82f6}.skill-item-icon[data-v-0bad694b]{background:linear-gradient(135deg,#18a05826,#18a0580d);color:#18a058}.mcp-item-info[data-v-0bad694b],.skill-item-info[data-v-0bad694b]{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.mcp-item-name[data-v-0bad694b],.skill-item-name[data-v-0bad694b]{font-size:12px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mcp-item-type[data-v-0bad694b]{font-size:10px;color:var(--text-tertiary);text-transform:uppercase}.skill-item-desc[data-v-0bad694b]{font-size:10px;color:var(--text-tertiary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mcp-item-status[data-v-0bad694b]{flex-shrink:0}.mcp-item-status .status-dot[data-v-0bad694b]{width:8px;height:8px;border-radius:50%;background:var(--border-secondary)}.mcp-item-status.online .status-dot[data-v-0bad694b]{background:#18a058;box-shadow:0 0 6px #18a05880}.mcp-item-status.error .status-dot[data-v-0bad694b]{background:#d03050;box-shadow:0 0 6px #d0305080}.mcp-quick-list[data-v-0bad694b]::-webkit-scrollbar,.skills-quick-list[data-v-0bad694b]::-webkit-scrollbar{width:4px}.mcp-quick-list[data-v-0bad694b]::-webkit-scrollbar-thumb,.skills-quick-list[data-v-0bad694b]::-webkit-scrollbar-thumb{background:#00000026;border-radius:2px}[data-theme=dark] .mcp-quick-list[data-v-0bad694b]::-webkit-scrollbar-thumb,[data-theme=dark] .skills-quick-list[data-v-0bad694b]::-webkit-scrollbar-thumb{background:#ffffff26}.skills-button[data-v-0bad694b]{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-0bad694b]{color:var(--text-color-3);transition:all .25s ease}.skills-button[data-v-0bad694b]: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-0bad694b]{color:#18a058;transform:scale(1.1)}.skills-button[data-v-0bad694b]:active{transform:translateY(0);box-shadow:0 2px 4px #0000000d}.lock-button[data-v-0bad694b]{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-0bad694b]{color:var(--text-color-3);transition:all .25s ease}.lock-button[data-v-0bad694b]: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-0bad694b]{color:var(--text-color-1);transform:scale(1.1)}.lock-button[data-v-0bad694b]:active{transform:translateY(0);box-shadow:0 2px 4px #0000000d}.locked-overlay[data-v-0bad694b]{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-0bad694b]: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-0bad694b]{background:linear-gradient(135deg,rgba(24,160,88,.03) 0%,var(--bg-secondary) 50%,rgba(24,160,88,.02) 100%)}.locked-claude[data-v-0bad694b]:before{background:radial-gradient(circle,rgba(24,160,88,.15) 0%,transparent 70%)}.locked-codex[data-v-0bad694b]{background:linear-gradient(135deg,rgba(59,130,246,.03) 0%,var(--bg-secondary) 50%,rgba(59,130,246,.02) 100%)}.locked-codex[data-v-0bad694b]:before{background:radial-gradient(circle,rgba(59,130,246,.15) 0%,transparent 70%)}.locked-gemini[data-v-0bad694b]{background:linear-gradient(135deg,rgba(168,85,247,.03) 0%,var(--bg-secondary) 50%,rgba(168,85,247,.02) 100%)}.locked-gemini[data-v-0bad694b]:before{background:radial-gradient(circle,rgba(168,85,247,.15) 0%,transparent 70%)}.locked-opencode[data-v-0bad694b]{background:linear-gradient(135deg,rgba(234,88,12,.03) 0%,var(--bg-secondary) 50%,rgba(234,88,12,.02) 100%)}.locked-opencode[data-v-0bad694b]:before{background:radial-gradient(circle,rgba(234,88,12,.15) 0%,transparent 70%)}.locked-content[data-v-0bad694b]{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-0bad694b]{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-0bad694b 3s ease-in-out infinite}@keyframes lock-float-0bad694b{0%,to{transform:translateY(0)}50%{transform:translateY(-6px)}}.lock-icon[data-v-0bad694b]: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-0bad694b]{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-0bad694b]:before{background:radial-gradient(circle,rgba(24,160,88,.3) 0%,transparent 60%)}.locked-claude .lock-icon .n-icon[data-v-0bad694b]{color:#18a058;filter:drop-shadow(0 2px 4px rgba(24,160,88,.3))}.locked-codex .lock-icon[data-v-0bad694b]{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-0bad694b]:before{background:radial-gradient(circle,rgba(59,130,246,.3) 0%,transparent 60%)}.locked-codex .lock-icon .n-icon[data-v-0bad694b]{color:#3b82f6;filter:drop-shadow(0 2px 4px rgba(59,130,246,.3))}.locked-gemini .lock-icon[data-v-0bad694b]{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-0bad694b]:before{background:radial-gradient(circle,rgba(168,85,247,.3) 0%,transparent 60%)}.locked-gemini .lock-icon .n-icon[data-v-0bad694b]{color:#a855f7;filter:drop-shadow(0 2px 4px rgba(168,85,247,.3))}.locked-opencode .lock-icon[data-v-0bad694b]{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-0bad694b]:before{background:radial-gradient(circle,rgba(234,88,12,.3) 0%,transparent 60%)}.locked-opencode .lock-icon .n-icon[data-v-0bad694b]{color:#ea580c;filter:drop-shadow(0 2px 4px rgba(234,88,12,.3))}.lock-icon .n-icon[data-v-0bad694b]{opacity:.85;position:relative;z-index:1}.locked-title[data-v-0bad694b]{font-size:17px;font-weight:600;color:var(--text-color-1);margin:0;letter-spacing:.3px}.locked-hint[data-v-0bad694b]{font-size:13px;color:var(--text-color-3);max-width:220px;line-height:1.7;opacity:.9}.channel-status[data-v-0bad694b]{cursor:pointer;padding:4px 8px!important;border-radius:4px;transition:all .2s ease}.channel-status[data-v-0bad694b]:hover{background:var(--hover-bg)}.channel-quick-panel[data-v-0bad694b]{padding:4px 0}.panel-title[data-v-0bad694b]{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-0bad694b]:first-child{font-size:13px;font-weight:600;color:var(--text-primary)}.no-channels[data-v-0bad694b]{padding:24px 12px;text-align:center}.channel-quick-list[data-v-0bad694b]{max-height:360px;overflow-y:auto}.channel-quick-item[data-v-0bad694b]{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-0bad694b]:hover{background:var(--hover-bg)}.channel-quick-item.disabled[data-v-0bad694b]{opacity:.6}.channel-quick-info[data-v-0bad694b]{display:flex;align-items:center;gap:8px;width:100%}.channel-quick-name[data-v-0bad694b]{font-size:13px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.channel-metrics[data-v-0bad694b]{display:flex;gap:6px;width:100%}.channel-metrics .metric-item[data-v-0bad694b]{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-0bad694b]{font-size:10px;color:var(--text-tertiary);font-weight:500}.channel-metrics .metric-value[data-v-0bad694b]{font-size:12px;font-weight:700;color:var(--text-primary);font-family:SF Mono,Monaco,monospace}.channel-metrics .metric-value.active[data-v-0bad694b]{color:#f59e0b}.channel-switching-tip[data-v-0bad694b]{font-size:11px;color:var(--text-tertiary);padding:0 2px}.channel-quick-item.disabled .channel-metrics .metric-value[data-v-0bad694b]{color:var(--text-tertiary)}.channel-quick-list[data-v-0bad694b]::-webkit-scrollbar{width:4px}.channel-quick-list[data-v-0bad694b]::-webkit-scrollbar-thumb{background:#00000026;border-radius:2px}[data-theme=dark] .channel-quick-list[data-v-0bad694b]::-webkit-scrollbar-thumb{background:#ffffff26}@media (max-width: 1024px){.channel-column[data-v-0bad694b]{border-radius:6px}.card-header[data-v-0bad694b]{padding:8px 10px}.card-title[data-v-0bad694b]{font-size:13px}.stats-inline[data-v-0bad694b]{gap:6px}.stat-inline-item[data-v-0bad694b]{padding:8px}.stat-value[data-v-0bad694b]{font-size:14px}.stat-label[data-v-0bad694b]{font-size:9px}.logs-table-header[data-v-0bad694b]{padding:8px 10px;font-size:10px}.log-row[data-v-0bad694b]{padding:8px 10px;font-size:11px}}@media (max-width: 768px){.channel-column[data-v-0bad694b]{border-radius:6px;min-height:300px;height:auto;max-height:400px}.card-header[data-v-0bad694b]{padding:8px;gap:6px}.card-title[data-v-0bad694b]{font-size:12px}.stats-inline[data-v-0bad694b]{gap:4px}.stat-inline-item[data-v-0bad694b]{padding:6px;gap:6px}.stat-icon-dot[data-v-0bad694b]{width:6px;height:6px}.stat-value[data-v-0bad694b]{font-size:13px}.stat-label[data-v-0bad694b]{font-size:8px}.logs-card[data-v-0bad694b]{min-height:150px}.logs-table-header[data-v-0bad694b]{padding:6px 8px;font-size:9px}.log-row[data-v-0bad694b]{padding:6px 8px;font-size:10px;min-height:32px}.col-token[data-v-0bad694b]{font-size:10px;padding:2px 4px}.col-time[data-v-0bad694b]{font-size:9px}.mcp-count-tag[data-v-0bad694b],.skills-count-tag[data-v-0bad694b]{font-size:9px;padding:0 6px;height:18px;line-height:18px}.skills-button[data-v-0bad694b]{padding:4px 8px;font-size:10px;gap:4px}.lock-button[data-v-0bad694b]{width:26px;height:26px}}@media (max-width: 640px){.channel-column[data-v-0bad694b]{min-height:250px;max-height:350px}.card-header[data-v-0bad694b]{padding:6px;gap:4px;flex-wrap:wrap}.card-title[data-v-0bad694b]{font-size:11px}.stats-card .card-content[data-v-0bad694b]{padding:6px}.stats-inline[data-v-0bad694b]{gap:3px;flex-wrap:wrap}.stat-inline-item[data-v-0bad694b]{padding:5px;gap:4px;min-width:calc(33% - 3px);flex:1 1 auto}.stat-icon-dot[data-v-0bad694b]{width:5px;height:5px}.stat-value[data-v-0bad694b]{font-size:12px}.stat-label[data-v-0bad694b]{font-size:7px}.logs-card[data-v-0bad694b]{min-height:120px}.logs-table-header[data-v-0bad694b]{padding:5px 6px;font-size:8px;letter-spacing:.3px}.log-row[data-v-0bad694b]{padding:5px 6px;font-size:9px;min-height:28px}.col-channel .n-tag[data-v-0bad694b]{font-size:9px;padding:2px 6px}.col-token[data-v-0bad694b]{font-size:9px;padding:2px 3px;margin:0 1px}.col-time[data-v-0bad694b]{font-size:8px}.claude-extra-area[data-v-0bad694b]{gap:4px}.mcp-count-tag[data-v-0bad694b],.skills-count-tag[data-v-0bad694b]{font-size:8px;padding:0 4px;height:16px;line-height:16px}.skills-button[data-v-0bad694b]{padding:3px 6px;font-size:9px;gap:3px}.skills-button .n-icon[data-v-0bad694b]{font-size:12px!important}.lock-button[data-v-0bad694b]{width:24px;height:24px;margin-left:4px}.lock-button .n-icon[data-v-0bad694b]{font-size:12px!important}.locked-content[data-v-0bad694b]{padding:30px 20px;gap:12px}.lock-icon[data-v-0bad694b]{width:64px;height:64px}.lock-icon .n-icon[data-v-0bad694b]{font-size:28px!important}.lock-title[data-v-0bad694b]{font-size:14px}.lock-subtitle[data-v-0bad694b]{font-size:10px}.unlock-btn[data-v-0bad694b]{padding:8px 16px;font-size:11px}}@media (max-width: 480px){.channel-column[data-v-0bad694b]{min-height:220px;max-height:300px}.card-header[data-v-0bad694b]{padding:5px}.card-title[data-v-0bad694b]{font-size:10px}.stats-inline[data-v-0bad694b]{gap:2px}.stat-inline-item[data-v-0bad694b]{padding:4px;gap:3px}.stat-value[data-v-0bad694b]{font-size:11px}.stat-label[data-v-0bad694b]{font-size:6px}.logs-table-header[data-v-0bad694b]{padding:4px 5px;font-size:7px}.log-row[data-v-0bad694b]{padding:4px 5px;font-size:8px;min-height:24px}.col-token[data-v-0bad694b]{font-size:8px}.col-time[data-v-0bad694b]{font-size:7px}}.card[data-v-0bad694b]:not(.logs-card) .n-collapse{background:transparent}.card[data-v-0bad694b]:not(.logs-card) .n-collapse-item{background:transparent}.card[data-v-0bad694b] .n-collapse-item__header{padding:12px 16px;background:transparent;transition:all .3s ease}.card[data-v-0bad694b] .n-collapse-item__header:hover{background:#00000005}.card[data-v-0bad694b] .n-collapse-item__header-main{width:100%}.card[data-v-0bad694b]:not(.logs-card) .n-collapse-item__content-wrapper{padding:0 16px 12px}.card[data-v-0bad694b]:not(.logs-card) .n-collapse-item__content-inner{padding-top:0}.chart-card[data-v-0bad694b]:has(.n-collapse){padding:0}.dashboard-container[data-v-06100f0f]{height:100%;background:var(--bg-primary);overflow:hidden;padding:12px;box-sizing:border-box;display:flex;flex-direction:column}.dashboard-toolbar[data-v-06100f0f]{display:flex;justify-content:flex-end;margin-bottom:8px;flex-shrink:0}.analytics-link[data-v-06100f0f]{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--primary-color, #18a058);text-decoration:none;padding:4px 10px;border-radius:4px;background:#18a05814;transition:background .2s}.analytics-link[data-v-06100f0f]:hover{background:#18a05826}.analytics-link-icon[data-v-06100f0f]{font-size:14px}.dashboard-grid[data-v-06100f0f]{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;flex:1;min-height:0;overflow:hidden;box-sizing:border-box}.dashboard-grid[data-v-06100f0f] .sortable-ghost{opacity:.4}.dashboard-grid[data-v-06100f0f] .sortable-chosen{box-shadow:0 8px 24px #00000026}@media (max-width: 1600px){.dashboard-grid[data-v-06100f0f]{grid-template-columns:repeat(3,1fr)}}@media (max-width: 1200px){.dashboard-grid[data-v-06100f0f]{grid-template-columns:repeat(2,1fr)}}@media (max-width: 1024px){.dashboard-container[data-v-06100f0f]{padding:10px}.dashboard-grid[data-v-06100f0f]{gap:10px}}@media (max-width: 900px){.dashboard-grid[data-v-06100f0f]{grid-template-columns:1fr}}@media (max-width: 768px){.dashboard-container[data-v-06100f0f]{padding:8px;overflow-y:auto}.dashboard-grid[data-v-06100f0f]{gap:8px;overflow:visible;min-height:auto}}@media (max-width: 640px){.dashboard-container[data-v-06100f0f]{padding:6px}.dashboard-grid[data-v-06100f0f]{gap:6px}}@media (max-width: 480px){.dashboard-container[data-v-06100f0f]{padding:4px}.dashboard-grid[data-v-06100f0f]{gap:4px}}
@@ -1 +0,0 @@
1
- import{r as e,f as a,c as t,o as s,a as l,X as n,s as o,Y as r,N as c,_ as i,G as u,Z as d,p,a0 as v,W as m,a8 as f,a5 as h,w as y,h as g,K as _,F as k,$ as j,a6 as w,R as x,v as C}from"./vue-vendor-aWwwFAao.js";import{d as b}from"./vendors-Fza9uSYn.js";import{_ as $,m as z,n as L,o as N,p as P,q as M,r as D}from"./index-CtByKdkA.js";import{a8 as I,T,d as E,ac as K,h as U}from"./icons-CQuif85v.js";import{N as R,B as q,c as V,a as H,_ as O,q as S,n as A,g as B,x as F,h as G,p as W}from"./naive-ui-BaTCPPL5.js";import"./markdown-DyTJGI4N.js";const X={class:"card-content"},Y={class:"header-row"},Z={class:"project-name"},J={class:"stats-row"},Q=$({__name:"ProjectCard",props:{project:{type:Object,required:!0}},emits:["click","delete"],setup(f,{emit:h}){const y=f,g=h,_=e(!1);function k(){g("click")}function j(){g("delete",y.project)}const w=a(()=>{var e,a;return(null==(e=y.project)?void 0:e.displayName)||(null==(a=y.project)?void 0:a.name)||""}),x=a(()=>{var e,a,t;return(null==(e=y.project)?void 0:e.path)||(null==(a=y.project)?void 0:a.fullPath)||(null==(t=y.project)?void 0:t.name)||""}),C=a(()=>{var e;return(null==(e=y.project)?void 0:e.sessionCount)||0}),b=a(()=>{var e;return null==(e=y.project)?void 0:e.lastUsed}),$=a(()=>{var e;const a=["#18a058","#2080f0","#f0a020","#d03050","#9333ea","#06b6d4"];return a[((null==(e=y.project)?void 0:e.name)||"").split("").reduce((e,a)=>e+a.charCodeAt(0),0)%a.length]});function z(e){if(!e)return"";const a=new Date(e),t=new Date-a;return t<6e4?"刚刚":t<36e5?`${Math.floor(t/6e4)}分钟前`:t<864e5?`${Math.floor(t/36e5)}小时前`:t<6048e5?`${Math.floor(t/864e5)}天前`:a.toLocaleDateString("zh-CN")}return(e,a)=>(s(),t("div",{class:"project-card",onClick:k,onMouseenter:a[0]||(a[0]=e=>_.value=!0),onMouseleave:a[1]||(a[1]=e=>_.value=!1)},[l("div",X,[l("div",Y,[n(c(R),{size:"18",color:$.value},{default:r(()=>[n(c(I))]),_:1},8,["color"]),l("span",Z,i(w.value),1),o(n(c(q),{text:"",type:"error",size:"tiny",class:"delete-btn",onClick:d(j,["stop"])},{icon:r(()=>[n(c(R),{size:"14"},{default:r(()=>[n(c(T))]),_:1})]),_:1},512),[[u,_.value]])]),n(c(V),{depth:"3",class:"project-path"},{default:r(()=>[p(i(x.value),1)]),_:1}),l("div",J,[n(c(H),{size:"tiny",bordered:!1,type:"success"},{default:r(()=>[p(i(C.value)+" 会话 ",1)]),_:1}),b.value?(s(),v(c(V),{key:0,depth:"3",class:"last-used"},{default:r(()=>[p(i(z(b.value)),1)]),_:1})):m("",!0)])])],32))}},[["__scopeId","data-v-3a18e66d"]]),ee={class:"project-list-container"},ae={class:"header"},te={class:"header-text"},se={key:0,class:"loading-container"},le={key:3,class:"projects-grid"},ne={class:"search-hint"},oe={style:{"margin-bottom":"16px"}},re={key:0,style:{"max-height":"60vh","overflow-y":"auto"}},ce={class:"search-result-header"},ie={class:"search-result-title"},ue=$({__name:"ProjectList",setup(o){const u=f(),d=h(),$=z(),T=a(()=>d.meta.channel||"claude"),X=e(""),Y=e([]),Z=e(null),J=e(!1),ue=e(""),de=e(null),pe=e(!1),ve=e(null),me=a(()=>{const e=X.value.toLowerCase();return Y.value.filter(a=>{const t=(a.displayName||"").toLowerCase(),s=(a.fullPath||"").toLowerCase();return t.includes(e)||s.includes(e)})});function fe(e){const a=d.meta.channel||"claude";u.push({name:`${a}-sessions`,params:{projectName:e}})}async function he(){const e=Y.value.map(e=>e.name);await $.saveProjectOrder(e)}function ye(e){const a=e.fullPath||e.name,t=e.sessionCount||0;P.warning({title:"删除项目",content:`确定要删除项目 "${a}" 吗?\n\n当前项目包含 ${t} 个会话,删除后所有会话数据将无法恢复!`,positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{try{await $.deleteProject(e.name),N.success("项目已删除")}catch(a){N.error("删除失败: "+a.message)}}})}async function ge(){try{const a="codex"===(e=T.value||"claude")?"codex":"gemini"===e?"gemini":"opencode"===e?"opencode":"claude",t=await L(a);if("manual"===(null==t?void 0:t.method))return void N.warning("自动复制失败,已弹出手动复制框");N.success("基础启动命令已复制到剪贴板")}catch(a){N.error("复制失败: "+a.message)}var e}async function _e(){if(ue.value){pe.value=!0;try{const e=await M(ue.value,35,T.value);de.value=e}catch(e){N.error("搜索失败: "+e.message)}finally{pe.value=!1}}}function ke(e,a){if(!a||!e)return e;const t=new RegExp(`(${a})`,"gi");return e.replace(t,'<mark style="background-color: #ffd700; padding: 2px 4px; border-radius: 2px; font-weight: 600;">$1</mark>')}function je(e){(e.metaKey||e.ctrlKey)&&"k"===e.key&&(e.preventDefault(),J.value=!0,C(()=>{var e;null==(e=ve.value)||e.focus()}))}return y(()=>$.projects,e=>{Y.value=[...e]},{immediate:!0}),y(J,e=>{e||(ue.value="",de.value=null)}),y(T,e=>{$.setChannel(e),$.fetchProjects()},{immediate:!0}),g(()=>{document.addEventListener("keydown",je)}),_(()=>{document.removeEventListener("keydown",je)}),(e,a)=>(s(),t("div",ee,[l("div",ae,[l("div",te,[n(c(O),{style:{margin:"0"}},{default:r(()=>[...a[4]||(a[4]=[p("我的项目",-1)])]),_:1}),n(c(V),{depth:"3"},{default:r(()=>[...a[5]||(a[5]=[p("选择一个项目查看会话,拖拽可调整顺序",-1)])]),_:1})]),n(c(A),null,{default:r(()=>[n(c(q),{type:"primary",size:"medium",onClick:ge},{icon:r(()=>[n(c(R),null,{default:r(()=>[n(c(E))]),_:1})]),default:r(()=>[a[6]||(a[6]=p(" 新建项目 ",-1))]),_:1}),n(c(S),{value:X.value,"onUpdate:value":a[0]||(a[0]=e=>X.value=e),placeholder:"搜索项目...",clearable:"",class:"search-input"},{prefix:r(()=>[n(c(R),null,{default:r(()=>[n(c(K))]),_:1})]),_:1},8,["value"])]),_:1})]),l("div",{class:"content",ref_key:"contentEl",ref:Z},[c($).loading?(s(),t("div",se,[n(c(B),{size:"large"},{description:r(()=>[...a[7]||(a[7]=[p(" 加载项目列表... ",-1)])]),_:1})])):c($).error?(s(),v(c(F),{key:1,type:"error",title:"加载失败",style:{"margin-top":"20px"}},{default:r(()=>[p(i(c($).error),1)]),_:1})):X.value?(s(),t("div",le,[(s(!0),t(k,null,j(me.value,e=>(s(),v(Q,{key:e.name,project:e,onClick:a=>fe(e.name),onDelete:ye},null,8,["project","onClick"]))),128))])):(s(),v(c(b),{key:2,modelValue:Y.value,"onUpdate:modelValue":a[1]||(a[1]=e=>Y.value=e),"item-key":"name",class:"projects-grid","ghost-class":"ghost","chosen-class":"chosen","drag-class":"drag",animation:"200",onEnd:he},{item:r(({element:e})=>[n(Q,{project:e,onClick:a=>fe(e.name),onDelete:ye},null,8,["project","onClick"])]),_:1},8,["modelValue"])),c($).loading||c($).error||0!==c($).projects.length?m("",!0):(s(),v(c(G),{key:4,description:"没有找到项目",style:{"margin-top":"60px"}},{icon:r(()=>[n(c(R),null,{default:r(()=>[n(c(I))]),_:1})]),_:1}))],512),l("div",ne,[n(c(V),{depth:"3",style:{"font-size":"12px"}},{default:r(()=>[...a[8]||(a[8]=[l("kbd",null,"Cmd",-1),p(" / ",-1),l("kbd",null,"Ctrl",-1),p(" + ",-1),l("kbd",null,"K",-1),p(" 全局搜索 ",-1)])]),_:1})]),n(c(W),{show:J.value,"onUpdate:show":a[3]||(a[3]=e=>J.value=e),preset:"card",title:"全局搜索",style:x([{width:"800px","max-width":"90vw"},{marginTop:"80px"}])},{default:r(()=>[l("div",oe,[n(c(S),{ref_key:"globalSearchInputRef",ref:ve,value:ue.value,"onUpdate:value":a[2]||(a[2]=e=>ue.value=e),placeholder:"搜索所有项目的对话内容...",clearable:"",onKeyup:w(_e,["enter"]),disabled:pe.value},{prefix:r(()=>[n(c(R),null,{default:r(()=>[n(c(K))]),_:1})]),suffix:r(()=>[n(c(q),{text:"",onClick:_e,disabled:!ue.value||pe.value,loading:pe.value},{default:r(()=>[...a[9]||(a[9]=[p(" 搜索 ",-1)])]),_:1},8,["disabled","loading"])]),_:1},8,["value","disabled"])]),de.value?(s(),t("div",re,[n(c(F),{type:"info",style:{"margin-bottom":"16px"}},{default:r(()=>[p(' 关键词 "'+i(de.value.keyword)+'" 共找到 '+i(de.value.totalMatches)+" 处匹配 ",1)]),_:1}),(s(!0),t(k,null,j(de.value.sessions,e=>(s(),t("div",{key:`${e.projectName}-${e.sessionId}`,class:"search-result-item"},[l("div",ce,[l("div",ie,[n(c(V),{strong:"",style:{"font-size":"15px","font-weight":"700"}},{default:r(()=>[p(i(e.projectDisplayName),1)]),_:2},1024),n(c(V),{depth:"2",style:{margin:"0 8px"}},{default:r(()=>[...a[10]||(a[10]=[p("·",-1)])]),_:1}),n(c(V),{strong:""},{default:r(()=>[p(i(e.alias?`${e.alias} (${e.sessionId.substring(0,8)})`:e.sessionId.substring(0,8)),1)]),_:2},1024),n(c(H),{size:"small",bordered:!1},{default:r(()=>[p(i(e.matchCount)+" 个匹配",1)]),_:2},1024)]),n(c(q),{size:"small",type:"primary",onClick:a=>async function(e,a){try{const{copyResult:t}=await D(e,a,T.value);"manual"===(null==t?void 0:t.method)?N.warning("自动复制失败,已弹出手动复制框"):N.success("启动命令已复制到剪贴板"),J.value=!1}catch(t){N.error("复制失败: "+t.message)}}(e.projectName,e.sessionId)},{icon:r(()=>[n(c(R),null,{default:r(()=>[n(c(U))]),_:1})]),default:r(()=>[a[11]||(a[11]=p(" 使用对话 ",-1))]),_:1},8,["onClick"])]),(s(!0),t(k,null,j(e.matches,(e,a)=>(s(),t("div",{key:a,class:"search-match"},[n(c(H),{size:"tiny",type:"user"===e.role?"info":"success",bordered:!1},{default:r(()=>[p(i("user"===e.role?"用户":"助手"),1)]),_:2},1032,["type"]),n(c(V),{depth:"3",class:"search-match-text",innerHTML:ke(e.context,de.value.keyword)},null,8,["innerHTML"])]))),128))]))),128)),0===de.value.sessions.length?(s(),v(c(G),{key:0,description:"没有找到匹配的内容"})):m("",!0)])):m("",!0)]),_:1},8,["show"])]))}},[["__scopeId","data-v-23cf7fe1"]]);export{ue 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-23cf7fe1]{width:100%;height:100%;display:flex;flex-direction:column;box-sizing:border-box}.header[data-v-23cf7fe1]{flex-shrink:0;padding:24px 24px 20px;background:var(--gradient-bg);border-bottom:1px solid var(--border-primary);display:flex;justify-content:space-between;align-items:flex-start;gap:24px;position:relative}.header[data-v-23cf7fe1]:after{content:"";position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(24,160,88,.1),transparent)}.header-text[data-v-23cf7fe1]{flex:1}.header-text[data-v-23cf7fe1] .n-h2{font-size:26px;font-weight:700;background:linear-gradient(135deg,#1f2937,#374151);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;letter-spacing:-.5px}[data-theme=dark] .header-text[data-v-23cf7fe1] .n-h2{background:linear-gradient(135deg,#f9fafb,#d1d5db);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.search-input[data-v-23cf7fe1]{width:320px;flex-shrink:0}.search-input[data-v-23cf7fe1] .n-input{border-radius:10px;background:var(--bg-primary);border:1px solid var(--border-primary);transition:all .2s ease}.search-input[data-v-23cf7fe1] .n-input:hover{border-color:var(--border-secondary);box-shadow:var(--shadow-sm)}.search-input[data-v-23cf7fe1] .n-input:focus-within{border-color:#18a058;box-shadow:0 0 0 3px #18a0581a}.content[data-v-23cf7fe1]{flex:1;overflow-y:auto;padding:20px 24px 24px;background:var(--gradient-bg)}.loading-container[data-v-23cf7fe1]{display:flex;justify-content:center;align-items:center;min-height:400px}.projects-grid[data-v-23cf7fe1]{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px}.ghost[data-v-23cf7fe1]{opacity:.4}.chosen[data-v-23cf7fe1]{transform:scale(1.05);box-shadow:0 8px 24px #0003!important;cursor:move!important}.drag[data-v-23cf7fe1]{opacity:.8;transform:rotate(2deg);box-shadow:0 12px 32px #00000040!important}.search-hint[data-v-23cf7fe1]{position:fixed;bottom:24px;left:24px;padding:10px 14px;background:#ffffffe6;border:1px solid var(--border-primary);border-radius:8px;box-shadow:0 4px 12px #00000014;z-index:10;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:.8;transition:all .2s ease}[data-theme=dark] .search-hint[data-v-23cf7fe1]{background:#1e293bf2;border:1px solid rgba(71,85,105,.6);box-shadow:0 4px 16px #0006}.search-hint[data-v-23cf7fe1]:hover{opacity:1;transform:translateY(-2px);box-shadow:0 6px 16px #0000001f}[data-theme=dark] .search-hint[data-v-23cf7fe1]:hover{box-shadow:0 6px 20px #00000080}.search-hint kbd[data-v-23cf7fe1]{display:inline-block;padding:4px 8px;font-family:SF Mono,Monaco,monospace;font-size:12px;line-height:1.4;font-weight:600;color:var(--text-secondary);background:var(--bg-primary);border:1px solid var(--border-secondary);border-radius:4px;box-shadow:0 2px 0 var(--border-primary),0 1px 3px #0000001a}[data-theme=dark] .search-hint kbd[data-v-23cf7fe1]{background:#33415599;border:1px solid rgba(71,85,105,.8);box-shadow:0 2px #1e293bcc,0 1px 4px #0006;color:#e2e8f0}.search-result-item[data-v-23cf7fe1]{margin-bottom:16px;padding:12px;border:1px solid var(--border-primary);border-radius:6px;background:var(--bg-elevated)}.search-result-header[data-v-23cf7fe1]{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.search-result-title[data-v-23cf7fe1]{display:flex;align-items:center;gap:8px}.search-match[data-v-23cf7fe1]{display:flex;align-items:flex-start;gap:8px;margin-top:6px;padding:6px;background:var(--bg-secondary);border-radius:4px}.search-match-text[data-v-23cf7fe1]{flex:1;line-height:1.6}
@@ -1 +0,0 @@
1
- import{a8 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,p as m,_ as h,F as y,a6 as g,L as k,Z as _,s as w,G as I,y as b,$ as C,v as j}from"./vue-vendor-aWwwFAao.js";import{d as z}from"./vendors-Fza9uSYn.js";import{_ as x,m as N,t as F,C as S,v as $,o as B,p as M,r as L}from"./index-CtByKdkA.js";import{X as U,T as P,ac as T,ay as A,j as E,G as K,a2 as V,az as G,p as H,h as O,V as R}from"./icons-CQuif85v.js";import{N as q,B as D,_ as W,c as X,a as Y,G as Z,q as J,g as Q,x as ee,s as se,n as ae,h as le,p as te}from"./naive-ui-BaTCPPL5.js";import"./markdown-DyTJGI4N.js";const ne={class:"session-list-container"},ie={class:"header"},oe={class:"title-bar"},ue={class:"title-section"},re={class:"title-with-count"},ce={class:"header-actions"},de={key:0,class:"loading-container"},ve=["onMouseenter","onClick"],fe={key:0,class:"drag-handle"},pe={class:"session-left"},me={class:"session-icon"},he={class:"session-info"},ye={class:"session-header"},ge={class:"session-title-row"},ke={class:"session-title"},_e={class:"session-meta"},we={class:"session-right"},Ie={class:"session-tags-area"},be={key:0,class:"session-actions"},Ce={key:0,style:{"max-height":"70vh","overflow-y":"auto"}},je={class:"search-result-header"},ze={class:"search-result-title"},xe=x({__name:"SessionList",props:{projectName:{type:String,required:!0}},setup(x){const xe=x,Ne=e(),Fe=s(),Se=N(),{addFavorite:$e,removeFavorite:Be,isFavorite:Me}=F(),Le=a(()=>Fe.meta.channel||"claude"),Ue=l(xe.projectName),Pe=a(()=>Ue.value||xe.projectName),Te=l(""),Ae=l(!1),Ee=l(null),Ke=l(""),Ve=l(null),Ge=l([]),He=l(null),Oe=l(!1),Re=l(null),qe=l(!1),De=l(!1),We=l([]),Xe=l(!1),Ye=l(!1),Ze=l(""),Je=l(""),Qe=l(null),es={group:{name:`${Le.value}-sessions`,pull:!1,put:!1},forceFallback:!0,fallbackOnBody:!1,fallbackTolerance:4,scroll:!0},ss=a(()=>{var e;return(null==(e=Se.currentProjectInfo)?void 0:e.displayName)||xe.projectName}),as=a(()=>{var e;return(null==(e=Se.currentProjectInfo)?void 0:e.fullPath)||Pe.value}),ls=a(()=>new Set(We.value)),ts=a(()=>We.value.length),ns=a(()=>Ge.value.length>0&&Ge.value.every(e=>ls.value.has(e.sessionId))),is=a(()=>ts.value>0&&!ns.value);async function os(){const e=await async function(){Se.projects.length||await Se.fetchProjects();const e=Se.projects.find(e=>e.name===xe.projectName);if(e)return Ue.value=e.name,e.name;const s=Se.projects.find(e=>e.displayName===xe.projectName||e.fullPath===xe.projectName);return s?(Ue.value=s.name,s.name!==xe.projectName&&await Ne.replace({name:`${Le.value}-sessions`,params:{projectName:s.name}}),s.name):(Ue.value=xe.projectName,xe.projectName)}();await Se.fetchSessions(e)}t(()=>Se.sessionsWithAlias,e=>{Ge.value=[...e];const s=new Set(e.map(e=>e.sessionId));We.value=We.value.filter(e=>s.has(e)),De.value&&0===e.length&&fs()},{immediate:!0});const us=a(()=>{if(!Te.value)return Ge.value;const e=Te.value.toLowerCase();return Ge.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 rs(){const e=Fe.meta.channel||"claude";Ne.push({name:`${e}-projects`})}async function cs(){if(Te.value){qe.value=!0;try{const e=await $(Pe.value,Te.value,35,Le.value);He.value=e,Oe.value=!0}catch(e){B.error("搜索失败: "+e.message)}finally{qe.value=!1}}}async function ds(){const e=Ge.value.map(e=>e.sessionId);await Se.saveSessionOrder(e)}function vs(){De.value=!0,Ve.value=null}function fs(){De.value=!1,We.value=[],Ve.value=null}function ps(e){return ls.value.has(e)}function ms(e,s=!ps(e)){const a=new Set(We.value);s?a.add(e):a.delete(e),We.value=Array.from(a)}function hs(e){We.value=e?Ge.value.map(e=>e.sessionId):[]}function ys(e){De.value?ms(e.sessionId):function(e){Ze.value=e.sessionId,Je.value=e.alias||"",Ye.value=!0,j(()=>{var e;null==(e=Qe.value)||e.open()})}(e)}async function gs(){if(Ee.value)try{const e=Ee.value.sessionId;Ke.value?(await Se.setAlias(e,Ke.value),B.success("别名设置成功")):(await Se.deleteAlias(e),B.success("别名已删除")),Ae.value=!1,Ee.value=null,Ke.value=""}catch(e){B.error("操作失败: "+e.message)}}function ks(e){B.error(e)}function _s(e){const s=new Set((e||[]).filter(Boolean));0!==s.size&&(We.value=We.value.filter(e=>!s.has(e)),Ze.value&&s.has(Ze.value)&&(Ye.value=!1,Ze.value="",Je.value=""))}async function ws(e){try{const{copyResult:s}=await L(Pe.value,e,Le.value);if("manual"===(null==s?void 0:s.method))return void B.warning("自动复制失败,已弹出手动复制框");B.success("启动命令已复制到剪贴板")}catch(s){B.error("复制失败: "+s.message)}}function Is(){if(0===ts.value)return void B.warning("请先选择要删除的会话");const e=[...We.value];M.warning({title:"批量删除会话",content:`确定要删除选中的 ${e.length} 个会话吗?此操作不可恢复!`,positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{Xe.value=!0;try{const s=await Se.deleteSessions(e);if(_s(s.deletedSessionIds),0===s.failed.length)return B.success(`已删除 ${s.deletedSessionIds.length} 个会话`),void fs();We.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{Xe.value=!1}}})}function bs(e){if(!e)return"";return new Date(e).toLocaleString("zh-CN")}function Cs(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 js(e,s){if(!s||!e)return e;const a=new RegExp(`(${s})`,"gi");return e.replace(a,'<mark style="background-color: #ffd700; padding: 2px 4px; border-radius: 2px; font-weight: 600;">$1</mark>')}function zs(e,s=80){return e?e.length>s?e.substring(0,s)+"...":e:""}return t([Le,()=>xe.projectName],([e])=>{fs(),Se.setChannel(e),os()},{immediate:!0}),n(()=>{}),i(()=>{}),(e,s)=>(u(),o("div",ne,[r("div",ie,[r("div",oe,[c(p(D),{size:"small",onClick:rs,class:"back-button"},{icon:f(()=>[c(p(q),{size:"18"},{default:f(()=>[c(p(U))]),_:1})]),_:1}),r("div",ue,[r("div",re,[c(p(W),null,{default:f(()=>[m(h(ss.value),1)]),_:1}),c(p(X),{depth:"3",class:"session-count"},{default:f(()=>[m("("+h(p(Se).sessions.length)+" 个对话)",1)]),_:1}),c(p(Y),{size:"small",bordered:!1,type:"info",class:"total-size-tag"},{default:f(()=>[m(h(Cs(p(Se).totalSize)),1)]),_:1}),r("div",ce,[De.value?(u(),o(y,{key:0},[c(p(Z),{checked:ns.value,indeterminate:is.value,disabled:0===Ge.value.length||Xe.value,"onUpdate:checked":hs},{default:f(()=>[...s[9]||(s[9]=[m(" 全选 ",-1)])]),_:1},8,["checked","indeterminate","disabled"]),c(p(X),{depth:"3"},{default:f(()=>[m("已选 "+h(ts.value)+" 个",1)]),_:1}),c(p(D),{size:"small",type:"error",disabled:0===ts.value,loading:Xe.value,onClick:Is},{icon:f(()=>[c(p(q),null,{default:f(()=>[c(p(P))]),_:1})]),default:f(()=>[s[10]||(s[10]=m(" 删除 ",-1))]),_:1},8,["disabled","loading"]),c(p(D),{size:"small",disabled:Xe.value,onClick:fs},{default:f(()=>[...s[11]||(s[11]=[m(" 完成 ",-1)])]),_:1},8,["disabled"])],64)):(u(),d(p(D),{key:1,size:"small",type:"error",secondary:"",onClick:vs},{icon:f(()=>[c(p(q),null,{default:f(()=>[c(p(P))]),_:1})]),default:f(()=>[s[12]||(s[12]=m(" 管理 ",-1))]),_:1}))])]),c(p(X),{depth:"3",class:"project-path"},{default:f(()=>[m(h(as.value),1)]),_:1})]),c(p(J),{value:Te.value,"onUpdate:value":s[0]||(s[0]=e=>Te.value=e),placeholder:"搜索会话...",clearable:"",class:"search-input",onKeyup:g(cs,["enter"]),disabled:qe.value},{prefix:f(()=>[c(p(q),null,{default:f(()=>[c(p(T))]),_:1})]),suffix:f(()=>[c(p(D),{text:"",onClick:cs,disabled:!Te.value||qe.value,loading:qe.value},{default:f(()=>[...s[13]||(s[13]=[m(" 搜索 ",-1)])]),_:1},8,["disabled","loading"])]),_:1},8,["value","disabled"])])]),r("div",{class:"content",ref_key:"contentEl",ref:Re},[p(Se).loading?(u(),o("div",de,[c(p(Q),{size:"large"},{description:f(()=>[...s[14]||(s[14]=[m(" 加载会话列表... ",-1)])]),_:1})])):p(Se).error?(u(),d(p(ee),{key:1,type:"error",title:"加载失败",style:{"margin-bottom":"16px"}},{default:f(()=>[m(h(p(Se).error),1)]),_:1})):us.value.length>0?(u(),d(p(z),b({key:2,modelValue:Ge.value,"onUpdate:modelValue":s[3]||(s[3]=e=>Ge.value=e),"item-key":"sessionId",class:"sessions-list",handle:".drag-handle",disabled:De.value||Xe.value},es,{"ghost-class":"ghost","chosen-class":"chosen",animation:"200",onEnd:ds}),{item:f(({element:e})=>[r("div",{class:k(["session-item",{"session-item-selected":ps(e.sessionId),"session-item-selection-mode":De.value}]),onMouseenter:s=>Ve.value=e.sessionId,onMouseleave:s[2]||(s[2]=e=>Ve.value=null),onClick:s=>ys(e)},[De.value?(u(),o("div",{key:1,class:"selection-checkbox",onClick:s[1]||(s[1]=_(()=>{},["stop"]))},[c(p(Z),{checked:ps(e.sessionId),"onUpdate:checked":s=>ms(e.sessionId,s)},null,8,["checked","onUpdate:checked"])])):(u(),o("div",fe,[c(p(q),{size:"16",color:"#999"},{default:f(()=>[c(p(A))]),_:1})])),r("div",pe,[r("div",me,[c(p(q),{size:"24",color:"#18a058"},{default:f(()=>[c(p(E))]),_:1})]),r("div",he,[r("div",ye,[r("div",ge,[r("span",ke,h(e.alias?`${e.alias} (${e.sessionId.substring(0,8)})`:e.sessionId),1),e.forkedFrom?(u(),d(p(se),{key:0,placement:"top"},{trigger:f(()=>[c(p(Y),{size:"small",type:"warning",bordered:!1,style:{"margin-left":"8px",cursor:"help"}},{icon:f(()=>[c(p(q),null,{default:f(()=>[c(p(K))]),_:1})]),default:f(()=>[s[15]||(s[15]=m(" Fork ",-1))]),_:1})]),default:f(()=>[m(" Fork 自: "+h(e.forkedFrom),1)]),_:2},1024)):v("",!0)])]),r("div",_e,[c(p(X),{depth:"3"},{default:f(()=>[m(h(bs(e.mtime)),1)]),_:2},1024),c(p(X),{depth:"3"},{default:f(()=>[...s[16]||(s[16]=[m("•",-1)])]),_:1}),c(p(Y),{size:"small",bordered:!1},{default:f(()=>[m(h(Cs(e.size)),1)]),_:2},1024)]),e.firstMessage?(u(),d(p(X),{key:0,depth:"3",class:"session-message"},{default:f(()=>[m(h(zs(e.firstMessage,80)),1)]),_:2},1024)):e.gitBranch||e.summary?v("",!0):(u(),d(p(X),{key:1,depth:"3",class:"session-message session-message-empty"},{default:f(()=>[...s[17]||(s[17]=[m(" 暂未读取到对话内容 ",-1)])]),_:1}))])]),r("div",we,[r("div",Ie,[e.gitBranch?(u(),d(p(Y),{key:0,size:"small",type:"info",bordered:!1},{icon:f(()=>[c(p(q),null,{default:f(()=>[c(p(K))]),_:1})]),default:f(()=>[m(" "+h(e.gitBranch),1)]),_:2},1024)):v("",!0)]),De.value?v("",!0):(u(),o("div",be,[c(p(ae),null,{default:f(()=>[w(c(p(D),{size:"small",type:"error",onClick:_(s=>{return a=e.sessionId,void M.warning({title:"删除会话",content:"确定要删除这个会话吗?此操作不可恢复!",positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{try{await Se.deleteSession(a),_s([a]),B.success("会话已删除")}catch(e){B.error("删除失败: "+e.message)}}});var a},["stop"])},{icon:f(()=>[c(p(q),null,{default:f(()=>[c(p(P))]),_:1})]),default:f(()=>[s[18]||(s[18]=m(" 删除 ",-1))]),_:1},8,["onClick"]),[[I,Ve.value===e.sessionId]]),c(p(D),{size:"small",onClick:_(s=>function(e){Ee.value=e,Ke.value=e.alias||"",Ae.value=!0}(e),["stop"])},{icon:f(()=>[c(p(q),null,{default:f(()=>[c(p(V))]),_:1})]),default:f(()=>[s[19]||(s[19]=m(" 别名 ",-1))]),_:1},8,["onClick"]),c(p(D),{size:"small",type:p(Me)(Le.value,Pe.value,e.sessionId)?"warning":"default",onClick:_(s=>async function(e){const s=Le.value,a=Me(s,Pe.value,e.sessionId);try{if(a)await Be(s,Pe.value,e.sessionId),B.success("已取消收藏");else{const a={sessionId:e.sessionId,projectName:Pe.value,projectDisplayName:ss.value,projectFullPath:as.value,alias:e.alias||"",firstMessage:e.firstMessage||"",mtime:e.mtime,size:e.size,gitBranch:e.gitBranch||"",forkedFrom:e.forkedFrom||""};await $e(s,a),B.success("已添加到收藏")}}catch(l){B.error("操作失败: "+l.message)}}(e),["stop"])},{icon:f(()=>[c(p(q),null,{default:f(()=>[p(Me)(Le.value,Pe.value,e.sessionId)?(u(),d(p(G),{key:0})):(u(),d(p(H),{key:1}))]),_:2},1024)]),default:f(()=>[m(" "+h(p(Me)(Le.value,Pe.value,e.sessionId)?"已收藏":"收藏"),1)]),_:2},1032,["type","onClick"]),"opencode"!==Le.value?(u(),d(p(D),{key:0,size:"small",onClick:_(s=>async function(e){if("opencode"!==Le.value)try{await Se.forkSession(e),B.success("Fork 成功!")}catch(s){B.error("Fork 失败: "+s.message)}else B.warning("OpenCode 当前不支持该 Fork 操作")}(e.sessionId),["stop"])},{icon:f(()=>[c(p(q),null,{default:f(()=>[c(p(K))]),_:1})]),default:f(()=>[s[20]||(s[20]=m(" Fork ",-1))]),_:1},8,["onClick"])):v("",!0),c(p(D),{size:"small",type:"primary",onClick:_(s=>ws(e.sessionId),["stop"])},{icon:f(()=>[c(p(q),null,{default:f(()=>[c(p(O))]),_:1})]),default:f(()=>[s[21]||(s[21]=m(" 使用对话 ",-1))]),_:1},8,["onClick"])]),_:2},1024)]))])],42,ve)]),_:1},16,["modelValue","disabled"])):(u(),d(p(le),{key:3,description:"没有找到会话",style:{"margin-top":"60px"}},{icon:f(()=>[c(p(q),null,{default:f(()=>[c(p(R))]),_:1})]),_:1}))],512),c(p(te),{show:Ae.value,"onUpdate:show":s[6]||(s[6]=e=>Ae.value=e),preset:"dialog",title:"设置别名"},{action:f(()=>[c(p(ae),null,{default:f(()=>[c(p(D),{onClick:s[5]||(s[5]=e=>Ae.value=!1)},{default:f(()=>[...s[22]||(s[22]=[m("取消",-1)])]),_:1}),c(p(D),{type:"primary",onClick:gs},{default:f(()=>[...s[23]||(s[23]=[m("确定",-1)])]),_:1})]),_:1})]),default:f(()=>[c(p(J),{value:Ke.value,"onUpdate:value":s[4]||(s[4]=e=>Ke.value=e),placeholder:"输入别名(留空删除)",onKeyup:g(gs,["enter"])},null,8,["value"])]),_:1},8,["show"]),c(p(te),{show:Oe.value,"onUpdate:show":s[7]||(s[7]=e=>Oe.value=e),preset:"card",title:"搜索结果",style:{width:"1200px"}},{default:f(()=>[He.value?(u(),o("div",Ce,[c(p(ee),{type:"info",style:{"margin-bottom":"16px"}},{default:f(()=>[m(' 关键词 "'+h(He.value.keyword)+'" 共找到 '+h(He.value.totalMatches)+" 处匹配 ",1)]),_:1}),(u(!0),o(y,null,C(He.value.sessions,e=>(u(),o("div",{key:e.sessionId,class:"search-result-item"},[r("div",je,[r("div",ze,[c(p(X),{strong:""},{default:f(()=>[m(h(e.alias?`${e.alias} (${e.sessionId.substring(0,8)})`:e.sessionId.substring(0,8)),1)]),_:2},1024),c(p(Y),{size:"small",bordered:!1},{default:f(()=>[m(h(e.matchCount)+" 个匹配",1)]),_:2},1024)]),c(p(D),{size:"small",type:"primary",onClick:s=>ws(e.sessionId)},{icon:f(()=>[c(p(q),null,{default:f(()=>[c(p(O))]),_:1})]),default:f(()=>[s[24]||(s[24]=m(" 使用对话 ",-1))]),_:1},8,["onClick"])]),(u(!0),o(y,null,C(e.matches,(e,s)=>(u(),o("div",{key:s,class:"search-match"},[c(p(Y),{size:"tiny",type:"user"===e.role?"info":"success",bordered:!1},{default:f(()=>[m(h("user"===e.role?"用户":"助手"),1)]),_:2},1032,["type"]),c(p(X),{depth:"3",class:"search-match-text",innerHTML:js(e.context,He.value.keyword)},null,8,["innerHTML"])]))),128))]))),128)),0===He.value.sessions.length?(u(),d(p(le),{key:0,description:"没有找到匹配的内容"})):v("",!0)])):v("",!0)]),_:1},8,["show"]),Ze.value?(u(),d(S,{key:0,ref_key:"chatHistoryRef",ref:Qe,show:Ye.value,"onUpdate:show":s[8]||(s[8]=e=>Ye.value=e),"project-name":Pe.value,"session-id":Ze.value,"session-alias":Je.value,channel:Le.value,onError:ks},null,8,["show","project-name","session-id","session-alias","channel"])):v("",!0)]))}},[["__scopeId","data-v-b0f9a736"]]);export{xe as default};
@@ -1 +0,0 @@
1
- .session-list-container[data-v-b0f9a736]{width:100%;height:100%;display:flex;flex-direction:column;box-sizing:border-box}.header[data-v-b0f9a736]{flex-shrink:0;padding:24px 24px 16px;background:var(--bg-primary);border-bottom:1px solid var(--border-primary)}.content[data-v-b0f9a736]{flex:1;overflow-y:auto;overflow-x:hidden;padding:16px 24px 24px}.sessions-list[data-v-b0f9a736]{position:relative;overflow:hidden}.back-button[data-v-b0f9a736]{flex-shrink:0;margin-right:12px}.title-bar[data-v-b0f9a736]{display:flex;align-items:center;gap:16px}.title-section[data-v-b0f9a736]{flex:1;min-width:0}.title-with-count[data-v-b0f9a736]{display:flex;align-items:center;gap:8px;margin-bottom:2px;flex-wrap:wrap}.title-section h2[data-v-b0f9a736]{margin:0;font-size:20px}.session-count[data-v-b0f9a736]{font-size:14px;color:#666}.total-size-tag[data-v-b0f9a736]{margin-left:8px}.project-path[data-v-b0f9a736]{font-size:13px;display:block;color:#666;margin-bottom:2px}.header-actions[data-v-b0f9a736]{display:flex;align-items:center;gap:12px;margin-left:4px}.search-input[data-v-b0f9a736]{width:320px;flex-shrink:0}.loading-container[data-v-b0f9a736]{display:flex;justify-content:center;align-items:center;min-height:400px}.session-item[data-v-b0f9a736]{display:flex;align-items:center;gap:12px;padding:16px;background:var(--bg-primary);border:1px solid var(--border-primary);border-radius:8px;margin-bottom:8px;transition:all .2s;cursor:pointer}.session-item[data-v-b0f9a736]:hover{border-color:#18a058;box-shadow:0 2px 8px #18a0581a}.session-item-selection-mode[data-v-b0f9a736]{cursor:default}.session-item-selected[data-v-b0f9a736]{border-color:#18a058;box-shadow:0 0 0 2px #18a0581f;background:#18a0580a}.drag-handle[data-v-b0f9a736]{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-b0f9a736]{opacity:1;background-color:#18a0581a;border-radius:4px}.selection-checkbox[data-v-b0f9a736]{width:24px;min-width:24px;display:flex;align-items:center;justify-content:center}.session-left[data-v-b0f9a736]{flex:1;display:flex;align-items:center;gap:16px;min-width:0}.session-icon[data-v-b0f9a736]{flex-shrink:0}.session-info[data-v-b0f9a736]{flex:1;min-width:0}.session-header[data-v-b0f9a736]{display:flex;align-items:center;margin-bottom:6px}.session-title-row[data-v-b0f9a736]{display:flex;align-items:center;gap:8px}.session-title[data-v-b0f9a736]{font-size:15px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:1;min-width:0}.session-meta[data-v-b0f9a736]{display:flex;align-items:center;gap:8px;margin-bottom:6px;font-size:13px}.session-message[data-v-b0f9a736]{display:block;max-width:600px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}.session-message-empty[data-v-b0f9a736]{font-style:italic;opacity:.5}.session-right[data-v-b0f9a736]{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-end;min-width:280px;flex-shrink:0;gap:12px}.session-tags-area[data-v-b0f9a736]{min-height:24px;display:flex;align-items:flex-start;justify-content:flex-end}.session-actions[data-v-b0f9a736]{display:flex;align-items:center;margin-top:auto}.ghost[data-v-b0f9a736]{opacity:.4}.chosen[data-v-b0f9a736]{box-shadow:0 4px 16px #00000026}.search-result-item[data-v-b0f9a736]{margin-bottom:16px;padding:12px;border:1px solid var(--border-primary);border-radius:6px;background:var(--bg-elevated)}.search-result-header[data-v-b0f9a736]{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.search-result-title[data-v-b0f9a736]{display:flex;align-items:center;gap:8px}.search-match[data-v-b0f9a736]{display:flex;align-items:flex-start;gap:8px;margin-top:6px;padding:6px;background:var(--bg-secondary);border-radius:4px}.search-match-text[data-v-b0f9a736]{flex:1;line-height:1.6}