coding-tool-x 3.7.11 → 3.7.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3 -0
- package/README.md +1 -1
- package/dist/web/assets/{Analytics-Ck_00Brj.js → Analytics-8dRv1aYW.js} +1 -1
- package/dist/web/assets/{ConfigTemplates-Cpw2vUa8.js → ConfigTemplates-BQRXSICO.js} +1 -1
- package/dist/web/assets/Home-BtzWhKIa.js +1 -0
- package/dist/web/assets/Home-DYVy4cGZ.css +1 -0
- package/dist/web/assets/{PluginManager-2RlvEJCT.js → PluginManager-BTa-Ygf6.js} +1 -1
- package/dist/web/assets/{ProjectList-_ecCngpl.js → ProjectList-F_cB8ldA.js} +1 -1
- package/dist/web/assets/{SessionList-DlWcw3hO.js → SessionList-LOrbPQvu.js} +1 -1
- package/dist/web/assets/SkillManager-BsX8Qpj0.css +1 -0
- package/dist/web/assets/SkillManager-BzI_t-yV.js +1 -0
- package/dist/web/assets/{WorkspaceManager-3mqghi09.js → WorkspaceManager-Db9RGiz7.js} +1 -1
- package/dist/web/assets/index-DIWJmyL6.js +2 -0
- package/dist/web/assets/{index-BceXgSSe.css → index-bJRG3RXH.css} +1 -1
- package/dist/web/index.html +2 -2
- package/docs/superpowers/plans/2026-08-01-omp-skill-scan-settings.md +759 -0
- package/docs/superpowers/specs/2026-08-01-omp-skill-scan-settings-design.md +224 -0
- package/package.json +1 -1
- package/src/commands/proxy-control.js +12 -12
- package/src/commands/toggle-proxy.js +9 -9
- package/src/config/paths.js +52 -29
- package/src/index.js +1 -1
- package/src/server/api/plugins.js +119 -47
- package/src/server/api/skills.js +63 -10
- package/src/server/omp-proxy-server.js +14 -1
- package/src/server/services/model-definition-schema.js +2 -1
- package/src/server/services/omp-channels.js +71 -12
- package/src/server/services/omp-config.js +71 -6
- package/src/server/services/omp-native-plugin-adapter.js +456 -0
- package/src/server/services/omp-settings-manager.js +3 -1
- package/src/server/services/omp-skill-discovery.js +358 -0
- package/src/server/services/omp-skill-settings-service.js +97 -0
- package/src/server/services/pi-omp-migration.js +273 -0
- package/src/server/services/platform-resolution.js +44 -0
- package/src/server/services/plugins-service.js +85 -561
- package/src/server/services/project-path-validation.js +65 -0
- package/src/server/services/skill-service.js +169 -77
- package/dist/web/assets/Home-Bft3Kztl.js +0 -1
- package/dist/web/assets/Home-CHZJkkjH.css +0 -1
- package/dist/web/assets/SkillManager-CnY7IXkX.js +0 -1
- package/dist/web/assets/SkillManager-D7pd-d_P.css +0 -1
- package/dist/web/assets/index-k5oP7c-A.js +0 -2
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const workspaceService = require('./workspace-service');
|
|
4
|
+
|
|
5
|
+
function realDirectory(candidate) {
|
|
6
|
+
if (!candidate || !path.isAbsolute(candidate)) return '';
|
|
7
|
+
try {
|
|
8
|
+
const stat = fs.statSync(candidate);
|
|
9
|
+
return stat.isDirectory() ? fs.realpathSync(candidate) : '';
|
|
10
|
+
} catch {
|
|
11
|
+
return '';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async function getKnownProjectPaths() {
|
|
16
|
+
const known = new Set();
|
|
17
|
+
const add = candidate => {
|
|
18
|
+
const resolved = realDirectory(candidate);
|
|
19
|
+
if (resolved) known.add(resolved);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
add(process.cwd());
|
|
23
|
+
for (const workspace of workspaceService.listWorkspaces()) {
|
|
24
|
+
add(workspace.path);
|
|
25
|
+
for (const project of workspace.projects || []) {
|
|
26
|
+
add(project.sourcePath);
|
|
27
|
+
if (workspace.path && project.name) {
|
|
28
|
+
add(path.join(workspace.path, project.name));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
const projects = await workspaceService.getAllAvailableProjects();
|
|
35
|
+
for (const project of projects || []) {
|
|
36
|
+
add(project.fullPath || project.path);
|
|
37
|
+
}
|
|
38
|
+
} catch {
|
|
39
|
+
// Workspace configuration remains a valid authoritative fallback.
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return known;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async function validateKnownProjectCwd(rawCwd) {
|
|
46
|
+
if (rawCwd == null || String(rawCwd).trim() === '') return null;
|
|
47
|
+
const input = String(rawCwd).trim();
|
|
48
|
+
if (!path.isAbsolute(input)) {
|
|
49
|
+
throw new Error('Invalid cwd: expected an absolute project or workspace path');
|
|
50
|
+
}
|
|
51
|
+
const resolved = realDirectory(input);
|
|
52
|
+
if (!resolved) {
|
|
53
|
+
throw new Error('Invalid cwd: path does not exist or is not a directory');
|
|
54
|
+
}
|
|
55
|
+
const known = await getKnownProjectPaths();
|
|
56
|
+
if (!known.has(resolved)) {
|
|
57
|
+
throw new Error('Invalid cwd: path is not a known project or workspace');
|
|
58
|
+
}
|
|
59
|
+
return resolved;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
module.exports = {
|
|
63
|
+
getKnownProjectPaths,
|
|
64
|
+
validateKnownProjectCwd
|
|
65
|
+
};
|
|
@@ -19,21 +19,20 @@ const {
|
|
|
19
19
|
} = require('./format-converter');
|
|
20
20
|
const { maskToken } = require('./oauth-utils');
|
|
21
21
|
const { NATIVE_PATHS, HOME_DIR, PATHS } = require('../../config/paths');
|
|
22
|
+
const { getOmpPaths } = require('./omp-config');
|
|
23
|
+
const { discoverOmpSkills } = require('./omp-skill-discovery');
|
|
24
|
+
const { migratePiStorage } = require('./pi-omp-migration');
|
|
25
|
+
const { resolveManagedPlatform } = require('./platform-resolution');
|
|
22
26
|
const {
|
|
23
27
|
normalizeSafeRelativePath,
|
|
24
28
|
pathHasProtectedSegment,
|
|
25
29
|
resolveInsideRoot
|
|
26
30
|
} = require('./config-artifact-paths');
|
|
27
31
|
|
|
28
|
-
const SUPPORTED_PLATFORMS = ['claude', 'codex', 'gemini', 'opencode', 'omp'];
|
|
29
32
|
const SUPPORTED_REPO_PROVIDERS = ['github', 'gitlab', 'local'];
|
|
30
33
|
const DEFAULT_GITHUB_HOST = 'https://github.com';
|
|
31
34
|
const DEFAULT_GITLAB_HOST = 'https://gitlab.com';
|
|
32
35
|
|
|
33
|
-
function normalizePlatform(platform) {
|
|
34
|
-
return SUPPORTED_PLATFORMS.includes(platform) ? platform : 'claude';
|
|
35
|
-
}
|
|
36
|
-
|
|
37
36
|
function cloneRepos(repos = []) {
|
|
38
37
|
return repos.map(repo => ({ ...repo }));
|
|
39
38
|
}
|
|
@@ -206,6 +205,8 @@ const PLATFORM_CONFIG = {
|
|
|
206
205
|
cacheFile: PATHS.skillCaches.opencode
|
|
207
206
|
},
|
|
208
207
|
omp: {
|
|
208
|
+
// Resolved dynamically through getOmpPaths(); this value is only a
|
|
209
|
+
// compatibility fallback for callers inspecting PLATFORM_CONFIG.
|
|
209
210
|
installDir: NATIVE_PATHS.omp.skills,
|
|
210
211
|
storageDir: PATHS.localSkills.omp,
|
|
211
212
|
reposFile: PATHS.skillRepos.omp,
|
|
@@ -218,11 +219,19 @@ const CACHE_TTL = 5 * 60 * 1000;
|
|
|
218
219
|
|
|
219
220
|
class SkillService {
|
|
220
221
|
constructor(platform = 'claude') {
|
|
221
|
-
this.platform =
|
|
222
|
+
this.platform = resolveManagedPlatform(platform).platform;
|
|
223
|
+
if (this.platform === 'omp') {
|
|
224
|
+
const migration = migratePiStorage(PATHS);
|
|
225
|
+
for (const warning of migration.warnings) {
|
|
226
|
+
console.warn(`[SkillService] ${warning}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
222
229
|
this.configDir = PATHS.config;
|
|
223
230
|
|
|
224
231
|
const platformConfig = PLATFORM_CONFIG[this.platform];
|
|
225
|
-
this.installDir =
|
|
232
|
+
this.installDir = this.platform === 'omp'
|
|
233
|
+
? getOmpPaths().skills
|
|
234
|
+
: platformConfig.installDir;
|
|
226
235
|
this.storageDir = platformConfig.storageDir;
|
|
227
236
|
this.reposConfigPath = platformConfig.reposFile;
|
|
228
237
|
this.cachePath = platformConfig.cacheFile;
|
|
@@ -235,6 +244,15 @@ class SkillService {
|
|
|
235
244
|
this.ensureDirs();
|
|
236
245
|
}
|
|
237
246
|
|
|
247
|
+
refreshOmpPaths() {
|
|
248
|
+
if (this.platform !== 'omp') return;
|
|
249
|
+
const nextInstallDir = getOmpPaths().skills;
|
|
250
|
+
if (this.installDir !== nextInstallDir) {
|
|
251
|
+
this.installDir = nextInstallDir;
|
|
252
|
+
this.clearCache();
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
238
256
|
ensureDirs() {
|
|
239
257
|
if (!fs.existsSync(this.installDir)) {
|
|
240
258
|
fs.mkdirSync(this.installDir, { recursive: true });
|
|
@@ -270,13 +288,19 @@ class SkillService {
|
|
|
270
288
|
}
|
|
271
289
|
}
|
|
272
290
|
|
|
273
|
-
prepareSkills(skills = []) {
|
|
291
|
+
prepareSkills(skills = [], options = {}) {
|
|
292
|
+
this.refreshOmpPaths();
|
|
274
293
|
const preparedSkills = Array.isArray(skills)
|
|
275
294
|
? skills.map(skill => ({ ...skill }))
|
|
276
295
|
: [];
|
|
277
296
|
|
|
297
|
+
if (this.platform === 'omp') {
|
|
298
|
+
preparedSkills.unshift(...discoverOmpSkills(this, options));
|
|
299
|
+
}
|
|
278
300
|
this.mergeLocalSkills(preparedSkills);
|
|
279
|
-
this.
|
|
301
|
+
if (this.platform !== 'omp') {
|
|
302
|
+
this.mergeInstalledSkills(preparedSkills);
|
|
303
|
+
}
|
|
280
304
|
this.deduplicateSkills(preparedSkills);
|
|
281
305
|
preparedSkills.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()));
|
|
282
306
|
this.updateInstallStatus(preparedSkills);
|
|
@@ -559,7 +583,10 @@ class SkillService {
|
|
|
559
583
|
/**
|
|
560
584
|
* 获取所有技能列表(带缓存)
|
|
561
585
|
*/
|
|
562
|
-
async listSkills(forceRefresh = false) {
|
|
586
|
+
async listSkills(forceRefresh = false, options = {}) {
|
|
587
|
+
if (this.platform === 'omp') {
|
|
588
|
+
return this.listOmpSkills(options);
|
|
589
|
+
}
|
|
563
590
|
// 强制刷新时仅清空内存缓存,保留磁盘缓存作为回退来源
|
|
564
591
|
if (forceRefresh) {
|
|
565
592
|
this.clearCache();
|
|
@@ -646,6 +673,27 @@ class SkillService {
|
|
|
646
673
|
return preparedSkills;
|
|
647
674
|
}
|
|
648
675
|
|
|
676
|
+
async listOmpSkills(options = {}) {
|
|
677
|
+
this.refreshOmpPaths();
|
|
678
|
+
const skills = [];
|
|
679
|
+
const repos = this.loadRepos().filter(repo => repo.enabled);
|
|
680
|
+
const results = await Promise.allSettled(repos.map(repo => this.fetchRepoSkills(repo)));
|
|
681
|
+
results.forEach((result, index) => {
|
|
682
|
+
if (result.status === 'fulfilled') {
|
|
683
|
+
skills.push(...result.value);
|
|
684
|
+
} else {
|
|
685
|
+
console.warn(
|
|
686
|
+
`[SkillService] Fetch OMP repo ${repos[index]?.label || repos[index]?.id || ''} failed:`,
|
|
687
|
+
result.reason?.message
|
|
688
|
+
);
|
|
689
|
+
}
|
|
690
|
+
});
|
|
691
|
+
const prepared = this.prepareSkills(skills, options);
|
|
692
|
+
this.skillsCache = prepared;
|
|
693
|
+
this.cacheTime = Date.now();
|
|
694
|
+
return prepared;
|
|
695
|
+
}
|
|
696
|
+
|
|
649
697
|
/**
|
|
650
698
|
* 从文件加载缓存
|
|
651
699
|
*/
|
|
@@ -682,7 +730,11 @@ class SkillService {
|
|
|
682
730
|
*/
|
|
683
731
|
updateInstallStatus(skills) {
|
|
684
732
|
for (const skill of skills) {
|
|
685
|
-
skill.
|
|
733
|
+
if (skill.sourceProvider || skill.sourcePath || skill.readonly) {
|
|
734
|
+
skill.installed = skill.installed !== false;
|
|
735
|
+
} else {
|
|
736
|
+
skill.installed = this.isInstalled(skill.directory);
|
|
737
|
+
}
|
|
686
738
|
}
|
|
687
739
|
}
|
|
688
740
|
|
|
@@ -1360,6 +1412,7 @@ class SkillService {
|
|
|
1360
1412
|
}
|
|
1361
1413
|
|
|
1362
1414
|
resolveInstallPath(directory, label = 'skill directory') {
|
|
1415
|
+
this.refreshOmpPaths();
|
|
1363
1416
|
const safeDirectory = this.normalizeSkillDirectory(directory, label);
|
|
1364
1417
|
return {
|
|
1365
1418
|
safeDirectory,
|
|
@@ -1424,12 +1477,6 @@ class SkillService {
|
|
|
1424
1477
|
? path.basename(currentDir)
|
|
1425
1478
|
: path.relative(baseDir, currentDir);
|
|
1426
1479
|
|
|
1427
|
-
// 检查是否已在列表中(比较目录名,去掉前缀路径)
|
|
1428
|
-
const normalizedDirectory = normalizeRepoPath(directory).toLowerCase();
|
|
1429
|
-
const existing = skills.find(s => {
|
|
1430
|
-
return normalizeRepoPath(s.directory).toLowerCase() === normalizedDirectory;
|
|
1431
|
-
});
|
|
1432
|
-
|
|
1433
1480
|
const protectedSkill = this.isProtectedSkillDirectory(directory);
|
|
1434
1481
|
const skillSource = protectedSkill ? 'system-installed' : (options.source || 'local');
|
|
1435
1482
|
|
|
@@ -1443,48 +1490,38 @@ class SkillService {
|
|
|
1443
1490
|
}
|
|
1444
1491
|
}
|
|
1445
1492
|
|
|
1446
|
-
|
|
1447
|
-
|
|
1493
|
+
try {
|
|
1494
|
+
const content = fs.readFileSync(skillMdPath, 'utf-8');
|
|
1495
|
+
const metadata = this.parseSkillMd(content);
|
|
1496
|
+
|
|
1497
|
+
const skill = {
|
|
1498
|
+
key: `local:${directory}`,
|
|
1499
|
+
name: metadata.name || directory,
|
|
1500
|
+
description: metadata.description || '',
|
|
1501
|
+
directory,
|
|
1502
|
+
installed: isInstalled,
|
|
1503
|
+
isLocal: skillSource === 'local',
|
|
1504
|
+
source: skillSource,
|
|
1505
|
+
protected: protectedSkill,
|
|
1506
|
+
readonly: false,
|
|
1507
|
+
sourceProvider: options.source === 'native-installed' ? 'native' : 'cc-tool',
|
|
1508
|
+
sourceScope: 'user',
|
|
1509
|
+
sourcePath: skillMdPath,
|
|
1510
|
+
shadowedSources: [],
|
|
1511
|
+
readmeUrl: null,
|
|
1512
|
+
repoOwner: null,
|
|
1513
|
+
repoName: null,
|
|
1514
|
+
repoBranch: null,
|
|
1515
|
+
license: metadata.license
|
|
1516
|
+
};
|
|
1448
1517
|
if (protectedSkill) {
|
|
1449
|
-
|
|
1450
|
-
existing.protected = true;
|
|
1451
|
-
existing.isLocal = false;
|
|
1452
|
-
existing.key = `system:${this.platform}:${directory}`;
|
|
1518
|
+
skill.key = `system:${this.platform}:${directory}`;
|
|
1453
1519
|
} else if (options.source === 'native-installed') {
|
|
1454
|
-
|
|
1455
|
-
} else {
|
|
1456
|
-
existing.isLocal = true;
|
|
1457
|
-
}
|
|
1458
|
-
} else {
|
|
1459
|
-
// 添加 cc-tool 托管的技能
|
|
1460
|
-
try {
|
|
1461
|
-
const content = fs.readFileSync(skillMdPath, 'utf-8');
|
|
1462
|
-
const metadata = this.parseSkillMd(content);
|
|
1463
|
-
|
|
1464
|
-
const skill = {
|
|
1465
|
-
key: `local:${directory}`,
|
|
1466
|
-
name: metadata.name || directory,
|
|
1467
|
-
description: metadata.description || '',
|
|
1468
|
-
directory,
|
|
1469
|
-
installed: isInstalled,
|
|
1470
|
-
isLocal: skillSource === 'local',
|
|
1471
|
-
source: skillSource,
|
|
1472
|
-
protected: protectedSkill,
|
|
1473
|
-
readmeUrl: null,
|
|
1474
|
-
repoOwner: null,
|
|
1475
|
-
repoName: null,
|
|
1476
|
-
repoBranch: null,
|
|
1477
|
-
license: metadata.license
|
|
1478
|
-
};
|
|
1479
|
-
if (protectedSkill) {
|
|
1480
|
-
skill.key = `system:${this.platform}:${directory}`;
|
|
1481
|
-
} else if (options.source === 'native-installed') {
|
|
1482
|
-
skill.key = `native:${this.platform}:${directory}`;
|
|
1483
|
-
}
|
|
1484
|
-
skills.push(skill);
|
|
1485
|
-
} catch (err) {
|
|
1486
|
-
console.warn(`[SkillService] Parse local skill ${directory} error:`, err.message);
|
|
1520
|
+
skill.key = `native:${this.platform}:${directory}`;
|
|
1487
1521
|
}
|
|
1522
|
+
skills.push(skill);
|
|
1523
|
+
} catch (err) {
|
|
1524
|
+
console.warn(`[SkillService] Parse local skill ${directory} error:`, err.message);
|
|
1488
1525
|
}
|
|
1489
1526
|
|
|
1490
1527
|
return; // 找到 SKILL.md 后不再递归
|
|
@@ -1507,28 +1544,71 @@ class SkillService {
|
|
|
1507
1544
|
* 去重技能列表
|
|
1508
1545
|
*/
|
|
1509
1546
|
deduplicateSkills(skills) {
|
|
1510
|
-
const
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1547
|
+
const deduplicated = [];
|
|
1548
|
+
const identityMap = new Map();
|
|
1549
|
+
const realPathMap = new Map();
|
|
1550
|
+
const managedOverlayTargets = new Map();
|
|
1551
|
+
|
|
1552
|
+
for (const skill of skills) {
|
|
1553
|
+
const normalizedDirectory = normalizeRepoPath(skill.directory).toLowerCase();
|
|
1554
|
+
const identity = this.platform === 'omp'
|
|
1555
|
+
? `name:${String(skill.name || skill.directory).toLowerCase()}`
|
|
1556
|
+
: [
|
|
1557
|
+
normalizedDirectory,
|
|
1558
|
+
skill.repoId || ''
|
|
1559
|
+
].join('::');
|
|
1560
|
+
const realPath = skill.realPath || (() => {
|
|
1561
|
+
try {
|
|
1562
|
+
return skill.sourcePath ? fs.realpathSync(skill.sourcePath) : '';
|
|
1563
|
+
} catch {
|
|
1564
|
+
return skill.sourcePath || '';
|
|
1527
1565
|
}
|
|
1528
|
-
}
|
|
1529
|
-
|
|
1566
|
+
})();
|
|
1567
|
+
const isManagedOverlay = !skill.repoId && (
|
|
1568
|
+
skill.sourceProvider === 'cc-tool'
|
|
1569
|
+
|| skill.sourceProvider === 'native'
|
|
1570
|
+
|| ['local', 'native-installed', 'system-installed'].includes(skill.source)
|
|
1571
|
+
);
|
|
1572
|
+
const existingIndex = identityMap.get(identity)
|
|
1573
|
+
?? (realPath ? realPathMap.get(realPath) : undefined)
|
|
1574
|
+
?? (isManagedOverlay ? managedOverlayTargets.get(normalizedDirectory) : undefined);
|
|
1575
|
+
|
|
1576
|
+
if (existingIndex == null) {
|
|
1577
|
+
identityMap.set(identity, deduplicated.length);
|
|
1578
|
+
if (realPath) realPathMap.set(realPath, deduplicated.length);
|
|
1579
|
+
if (skill.repoId && !managedOverlayTargets.has(normalizedDirectory)) {
|
|
1580
|
+
managedOverlayTargets.set(normalizedDirectory, deduplicated.length);
|
|
1581
|
+
}
|
|
1582
|
+
deduplicated.push(skill);
|
|
1583
|
+
continue;
|
|
1584
|
+
}
|
|
1585
|
+
|
|
1586
|
+
const existing = deduplicated[existingIndex];
|
|
1587
|
+
const shadow = skill.sourceProvider || skill.sourcePath
|
|
1588
|
+
? {
|
|
1589
|
+
sourceProvider: skill.sourceProvider || skill.source || 'unknown',
|
|
1590
|
+
sourceScope: skill.sourceScope || 'user',
|
|
1591
|
+
sourcePath: skill.sourcePath || ''
|
|
1592
|
+
}
|
|
1593
|
+
: null;
|
|
1594
|
+
if (shadow) {
|
|
1595
|
+
existing.shadowedSources = [...(existing.shadowedSources || []), shadow];
|
|
1596
|
+
}
|
|
1597
|
+
|
|
1598
|
+
const shouldPreferIncoming = Boolean(skill.installed && !existing.installed);
|
|
1599
|
+
if (shouldPreferIncoming) {
|
|
1600
|
+
deduplicated[existingIndex] = {
|
|
1601
|
+
...existing,
|
|
1602
|
+
...skill,
|
|
1603
|
+
installed: true,
|
|
1604
|
+
shadowedSources: existing.shadowedSources || []
|
|
1605
|
+
};
|
|
1606
|
+
} else if (skill.installed) {
|
|
1607
|
+
existing.installed = true;
|
|
1530
1608
|
}
|
|
1531
1609
|
}
|
|
1610
|
+
|
|
1611
|
+
skills.splice(0, skills.length, ...deduplicated);
|
|
1532
1612
|
}
|
|
1533
1613
|
|
|
1534
1614
|
/**
|
|
@@ -2030,8 +2110,16 @@ ${content}
|
|
|
2030
2110
|
/**
|
|
2031
2111
|
* 卸载技能
|
|
2032
2112
|
*/
|
|
2033
|
-
uninstallSkill(directory) {
|
|
2034
|
-
const
|
|
2113
|
+
uninstallSkill(directory, options = {}) {
|
|
2114
|
+
const safeDirectory = this.normalizeSkillDirectory(directory);
|
|
2115
|
+
const projectInstallDir = this.platform === 'omp' && options.scope === 'project' && options.cwd
|
|
2116
|
+
? path.join(path.resolve(options.cwd), '.omp', 'skills')
|
|
2117
|
+
: null;
|
|
2118
|
+
const dest = projectInstallDir
|
|
2119
|
+
? resolveInsideRoot(projectInstallDir, safeDirectory, 'skill directory', {
|
|
2120
|
+
allowHiddenSegments: true
|
|
2121
|
+
})
|
|
2122
|
+
: this.resolveInstallPath(safeDirectory).path;
|
|
2035
2123
|
if (this.isProtectedSkillDirectory(safeDirectory)) {
|
|
2036
2124
|
throw new Error('不能卸载 Codex 系统技能');
|
|
2037
2125
|
}
|
|
@@ -2226,6 +2314,10 @@ ${content}
|
|
|
2226
2314
|
* 获取已安装技能列表
|
|
2227
2315
|
*/
|
|
2228
2316
|
getInstalledSkills() {
|
|
2317
|
+
this.refreshOmpPaths();
|
|
2318
|
+
if (this.platform === 'omp') {
|
|
2319
|
+
return this.prepareSkills([]);
|
|
2320
|
+
}
|
|
2229
2321
|
const skills = [];
|
|
2230
2322
|
this.scanLocalDir(this.installDir, this.installDir, skills, {
|
|
2231
2323
|
includeHiddenDirs: this.platform === 'codex',
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{d as e}from"./vendors-DQA4Hw9v.js";import{r as a,a8 as l,f as n,w as s,h as c,K as t,a7 as o,c as i,o as u,a as r,W as d,a0 as v,X as p,Y as h,N as y,a3 as m,_ as g,p as f,R as k,L as T,F as C,$ as b,Z as w,v as x}from"./vue-vendor-B5RqjEjQ.js";import{g as $,u as _,a as S,s as z,D as P,_ as q,b as j,c as M,d as L,R as O,e as I,f as E,h as N,i as F,j as A,n as D}from"./index-k5oP7c-A.js";import{h as U,ar as J,E as V,P as R,as as K,at as B,au as Z,av as G,aa as H,i as W,A as X,aw as Y,ax as Q,T as ee,a as ae,b as le}from"./icons-nGdSKQn2.js";import{L as ne,N as se,B as ce,s as te,b as oe,c as ie,a as ue,Z as re}from"./naive-ui-BALVpMgd.js";import"./markdown-BNJfEgCA.js";const de=a({theme:"light",panelVisibility:{showChannels:!0,showLogs:!0},channelBalance:{showRemaining:!1},channelLocks:{claude:!1,codex:!1,gemini:!1,opencode:!1,omp:!1},channelCollapse:{claude:[],codex:[],gemini:[],opencode:[],omp:[]},channelOrder:{claude:[],codex:[],gemini:[],opencode:[],omp:[]},dashboardChannelOrder:P,homeCliColumns:P,customCliPlatforms:[]});let ve=!1,pe=null;async function he(){return ve?de.value:pe||(pe=(async()=>{try{const e=await $();e.success&&e.config&&(de.value=e.config,ve=!0)}catch(e){}finally{pe=null}return de.value})(),pe)}function ye(){return ve||he(),{uiConfig:de,loadUIConfig:he,saveConfig:async function(e){try{const a=await z(e);return!!a.success&&(de.value=a.config,!0)}catch(a){return!1}},updateConfig:async function(e,a){try{const l=await S(e,a);return!!l.success&&(de.value=l.config,!0)}catch(l){return!1}},updateNestedConfig:async function(e,a,l){try{const n=await _(e,a,l);return!!n.success&&(de.value=n.config,!0)}catch(n){return!1}}}}const me={class:"channel-column"},ge={class:"drag-handle",title:"拖拽排序"},fe={class:"header-icon"},ke={class:"channel-title"},Te={key:0,class:"claude-extra-area"},Ce={key:0,class:"channel-content"},be={key:0,class:"card"},we={class:"card-header"},xe={class:"card-title"},$e={key:0,class:"runtime-badge"},_e={class:"card-body",style:{padding:"6px 10px"}},Se={class:"proxy-info-row"},ze={class:"proxy-status"},Pe={key:0,class:"proxy-port"},qe={class:"channel-name"},je={class:"channel-quick-panel"},Me={class:"panel-title"},Le={key:0,class:"no-channels"},Oe={key:1,class:"channel-quick-list"},Ie={class:"channel-quick-info"},Ee={class:"channel-quick-name"},Ne={key:0,class:"channel-switching-tip"},Fe={class:"channel-metrics"},Ae={class:"metric-item"},De={class:"metric-value"},Ue={class:"metric-item"},Je={class:"metric-value"},Ve={class:"metric-item"},Re={class:"metric-value"},Ke={class:"metric-item"},Be={class:"card"},Ze={class:"card-header compact"},Ge={class:"card-body",style:{padding:"8px 10px"}},He={class:"quick-access-list"},We={class:"access-icon"},Xe={class:"access-content"},Ye={class:"access-value"},Qe={class:"access-icon"},ea={class:"access-content"},aa={class:"access-value"},la={class:"access-icon"},na={class:"access-content"},sa={class:"access-goto"},ca={class:"card-header compact"},ta={class:"card-body",style:{padding:"8px 10px"}},oa={class:"stats-inline stats-3col"},ia={class:"stat-inline-item stat-requests"},ua={class:"stat-info"},ra={class:"stat-inline-item stat-input"},da={class:"stat-info"},va={class:"stat-inline-item stat-output"},pa={class:"stat-info"},ha={key:2,class:"card logs-card"},ya={class:"card-header compact"},ma={class:"card-body logs-card-body"},ga={class:"logs-table-wrapper"},fa={key:0,class:"empty-logs"},ka=["title"],Ta={key:0,class:"action-content"},Ca={class:"action-msg"},ba={class:"action-time"},wa={key:1,class:"action-content"},xa={class:"action-msg error-msg"},$a={class:"action-time error-time"},_a={class:"locked-content"},Sa={class:"lock-icon"},za="channelLocks",Pa=q({__name:"ChannelColumn",props:{channelType:{type:String,required:!0}},setup(e){const S=e,z=l(),P=ne(),{uiConfig:q}=ye(),{claudeProxy:D,codexProxy:de,geminiProxy:ve,opencodeProxy:pe,ompProxy:he,claudeChannels:Pa,codexChannels:qa,geminiChannels:ja,opencodeChannels:Ma,ompChannels:La,schedulerState:Oa,getProxyState:Ia,startProxy:Ea,stopProxy:Na,getLogs:Fa,clearLogsForSource:Aa,loadChannels:Da,logLimit:Ua,statsInterval:Ja}=j(),{dashboardData:Va,loadDashboard:Ra}=M(),Ka=n(()=>L(S.channelType,q.value.customCliPlatforms)),Ba=n(()=>Ka.value.title||Ka.value.label||S.channelType),Za=n(()=>Ka.value.icon||U),Ga=n(()=>Ka.value.color||"#64748b"),Ha=n(()=>"claude"===S.channelType?D.value:"codex"===S.channelType?de.value:"gemini"===S.channelType?ve.value:"opencode"===S.channelType?pe.value:"omp"===S.channelType?he.value:Ka.value.custom?{running:!1,loading:!1,activeChannel:null,port:null,runtime:null,startTime:null}:{}),Wa=n(()=>"claude"===S.channelType?"Claude":"codex"===S.channelType?"Codex":"gemini"===S.channelType?"Gemini":"opencode"===S.channelType?"OpenCode":"omp"===S.channelType?"OMP":Ka.value.label||S.channelType),Xa=a({projects:0,sessions:0}),Ya=a({requests:0,tokens:0,cost:0}),Qa=a({requests:0,tokens:0,cost:0}),el={requests:0,tokens:0,cost:3};let al={requests:null,tokens:null,cost:null};const ll=a({requests:!1,tokens:!1,cost:!1}),nl=n(()=>{var e,a,l;return(null==(l=null==(a=null==(e=Va.value)?void 0:e.todayStats)?void 0:a[S.channelType])?void 0:l.byModel)||{}});function sl(e,a,l,n=600){al[e]&&cancelAnimationFrame(al[e]),ll.value[e]=!0;const s=Date.now(),c=()=>{const t=Date.now()-s,o=Math.min(t/n,1),i=1-Math.pow(1-o,2),u=a+(l-a)*i,r=el[e]??0,d=Math.pow(10,r),v=r>0?Math.round(u*d)/d:Math.round(u);Qa.value[e]=v,o<1?al[e]=requestAnimationFrame(c):ll.value[e]=!1};al[e]=requestAnimationFrame(c)}const cl=a(!1),tl={claude:"claudeChannelCollapse",codex:"codexChannelCollapse",gemini:"geminiChannelCollapse",opencode:"opencodeChannelCollapse",omp:"ompChannelCollapse"};function ol(e){try{const a=localStorage.getItem(za),l=a?JSON.parse(a):{};l[S.channelType]=e,localStorage.setItem(za,JSON.stringify(l))}catch(a){}}const il=a(function(){try{const e=localStorage.getItem(za);if(e){return JSON.parse(e)[S.channelType]||!1}}catch(e){}return!1}());async function ul(){il.value=!il.value,ol(il.value);try{if(await _("channelLocks",S.channelType,il.value),Va.value){const e=Va.value.uiConfig||{},a={...e.channelLocks||{}};a[S.channelType]=il.value,Va.value={...Va.value,uiConfig:{...e,channelLocks:a}}}}catch(e){}}const rl=a(!0);function dl(e){e.detail&&void 0!==e.detail.showLogs&&(rl.value=e.detail.showLogs)}const vl=a(Date.now()),pl=n(()=>{if(!Ha.value.running)return"";const e=Ha.value.startTime;if(!e)return"";const a=vl.value-e;if(a<=0)return"";const l=Math.floor(a/1e3),n=Math.floor(l/3600),s=Math.floor(l%3600/60),c=l%60;let t="已运行 ";return n>0&&(t+=`${n}小时`),s>0&&(t+=`${s}分`),(c>0||0===n&&0===s)&&(t+=`${c}秒`),t}),hl=a(null),yl=n(()=>Ua.value),ml={claude:Fa("claude"),codex:Fa("codex"),gemini:Fa("gemini"),opencode:Fa("opencode"),omp:Fa("omp")},gl=n(()=>{if(!Pl())return[];const e=ml[S.channelType];if(!e)return[];return(e.value||[]).slice(0,yl.value)});let fl=null,kl=null,Tl=null,Cl=!1,bl=null;const wl=n(()=>{let e=[];"claude"===S.channelType?e=Pa.value||[]:"codex"===S.channelType?e=qa.value||[]:"gemini"===S.channelType?e=ja.value||[]:"opencode"===S.channelType?e=Ma.value||[]:"omp"===S.channelType&&(e=La.value||[]);return[...e.filter(e=>!1!==e.enabled),...e.filter(e=>!1===e.enabled)]});function xl(e){const a=Oa[S.channelType];if(!a||!a.channels)return 0;const l=a.channels.find(a=>a.id===e);return l?l.inflight:0}const $l=n(()=>{const e=wl.value.filter(e=>!1!==e.enabled).length;return Ha.value.running?"omp"===S.channelType?`${e}个受管渠道已同步`:`${e}个渠道调度中`:wl.value.length>0?`${e}个渠道已启用`:"无渠道"}),_l=n(()=>{var e,a,l;return(null==(l=null==(a=null==(e=Va.value)?void 0:e.todayStats)?void 0:a[S.channelType])?void 0:l.byChannel)||{}});function Sl(e){return _l.value[e]||{requests:0,tokens:0,cost:0}}function zl(e,a){var l;return(null==e?void 0:e.usageMissing)?"--":(null==(l=null==e?void 0:e.tokens)?void 0:l[a])||0}function Pl(){return["claude","codex","gemini","opencode","omp"].includes(S.channelType)}function ql(e){if(!e||"action"===e.type||"error"===e.status)return"";const a=[];return e.model&&a.push(`模型: ${e.model}`),e.originalModel&&e.originalModel!==e.model&&a.push(`重定向: ${e.originalModel} -> ${e.model}`),e.usageMissing&&a.push("上游响应未返回 usage,当前无法计算 token。"),a.join("\n")}async function jl(e){var a,l;if(!1===Ka.value.supportsProxy||!Pl())return void P.warning(`${Ba.value} 暂未接入动态代理`);const n=Ia(S.channelType);n.value.loading=!0;try{let a;a=e?await Ea(S.channelType):await Na(S.channelType,{refreshChannelsDrawer:!0}),!1!==a.success?"omp"===S.channelType?P.success(e?"OMP 受管配置与会话日志观察已启用":"OMP 受管配置与会话日志观察已关闭"):P.success(e?`${Ba.value} 代理已启动`:`${Ba.value} 代理已停止`):(P.error(a.error||"操作失败"),n.value.running=!e)}catch(s){P.error((null==(l=null==(a=s.response)?void 0:a.data)?void 0:l.error)||s.message||"操作失败"),n.value.running=!e}finally{n.value.loading=!1}}function Ml(){!1!==Ka.value.supportsProjects&&Pl()?z.push({name:`${S.channelType}-projects`}):P.info(`${Ba.value} 当前仅作为首页显示项`)}function Ll(){!1!==Ka.value.supportsProjects&&Pl()?z.push({name:`${S.channelType}-projects`}):P.info(`${Ba.value} 当前仅作为首页显示项`)}function Ol(){!1!==Ka.value.supportsSessions&&Pl()?cl.value=!0:P.info(`${Ba.value} 当前没有托管会话列表`)}s(gl,e=>{var a;const l=(null==(a=e[0])?void 0:a.id)||null;if(!l||l===fl)return void(fl=l);fl=l,bl&&clearTimeout(bl),bl=setTimeout(()=>{Ra(!0,{fresh:!0}).then(()=>Dl()).catch(()=>{})},5e3);(!hl.value||hl.value.scrollTop<20)&&x(()=>{hl.value&&(hl.value.scrollTop=0)})}),s(()=>Ya.value.requests,e=>{sl("requests",Qa.value.requests,e,600)}),s(()=>Ya.value.tokens,e=>{sl("tokens",Qa.value.tokens,e,600)}),s(()=>Ya.value.cost,e=>{sl("cost",Qa.value.cost,e,600)}),s(()=>S.channelType,()=>{var e;fl=(null==(e=gl.value[0])?void 0:e.id)||null}),s(()=>{var e,a;return null==(a=null==(e=Va.value)?void 0:e.counts)?void 0:a[S.channelType]},()=>{Al()}),s(()=>{var e,a;return null==(a=null==(e=Va.value)?void 0:e.todayStats)?void 0:a[S.channelType]},()=>{Dl()},{deep:!0}),s(Ja,()=>{Cl&&function(){kl&&(clearInterval(kl),kl=null);const e=Ja.value||30,a=Math.max(1e3*e,1e4);kl=setInterval(()=>{Ra(!0,{fresh:!0}).then(()=>Dl()).catch(()=>{})},a)}()});const Il=a({});function El(e){return!!Il.value[e]}function Nl(e,a){e&&(Il.value={...Il.value,[e]:!!a})}async function Fl(e,a){if(e&&!El(e.id)){Nl(e.id,!0);try{let l;"claude"===S.channelType?l=I:"codex"===S.channelType?l=E:"gemini"===S.channelType?l=N:"opencode"===S.channelType?l=F:"omp"===S.channelType&&(l=A),l&&(await l(e.id,{enabled:a}),await async function(e,a){if(!e)return;const l=tl[S.channelType];let n={};try{const e=l?localStorage.getItem(l):null;n=e?JSON.parse(e):{}}catch(s){n={}}a?delete n[e]:n[e]=!0;try{l&&localStorage.setItem(l,JSON.stringify(n))}catch(s){}try{await _("channelCollapse",S.channelType,n)}catch(s){}}(e.id,a),P.success(a?`渠道「${e.name}」已启用`:`渠道「${e.name}」已停用`),await Da(),window.dispatchEvent(new CustomEvent("channel-management-refresh",{detail:{channel:S.channelType}})))}catch(l){P.error("操作失败: "+l.message)}finally{Nl(e.id,!1)}}}function Al(){var e,a;const l=null==(a=null==(e=Va.value)?void 0:e.counts)?void 0:a[S.channelType];Xa.value.projects=(null==l?void 0:l.projectCount)||0,Xa.value.sessions=(null==l?void 0:l.sessionCount)||0}async function Dl(){if(Va.value&&Va.value.todayStats){const e=Va.value.todayStats[S.channelType];e&&(Ya.value.requests=e.requests||0,Ya.value.tokens=e.tokens||0,Ya.value.cost=e.cost||0)}Al()}function Ul(){Aa(S.channelType)}function Jl(e){var a,l;null==(l=null==(a=null==e?void 0:e.currentTarget)?void 0:a.blur)||l.call(a)}function Vl(e){window.dispatchEvent(new CustomEvent("open-skills-drawer",{detail:{platform:S.channelType}})),Jl(e)}function Rl(e){window.dispatchEvent(new CustomEvent("open-commands-drawer",{detail:{platform:S.channelType}})),Jl(e)}function Kl(e){if(!1===Ka.value.supportsAgents)return P.info(`${Ba.value} 的 Agent 能力通过插件/扩展提供`),void Jl(e);window.dispatchEvent(new CustomEvent("open-agents-drawer",{detail:{platform:S.channelType}})),Jl(e)}return c(async()=>{await Ra().then(()=>Dl()),async function(){var e,a;try{if(Va.value&&Va.value.uiConfig)rl.value=!1!==(null==(e=Va.value.uiConfig.panelVisibility)?void 0:e.showLogs);else{const e=await $();e.success&&e.config&&(rl.value=!1!==(null==(a=e.config.panelVisibility)?void 0:a.showLogs))}}catch(l){}}(),async function(){var e,a;try{let l=!1;if(Va.value&&Va.value.uiConfig)l=(null==(e=Va.value.uiConfig.channelLocks)?void 0:e[S.channelType])||!1;else{const e=await $();e.success&&e.config&&(l=(null==(a=e.config.channelLocks)?void 0:a[S.channelType])||!1)}il.value=l,ol(l)}catch(l){}}(),window.addEventListener("panel-visibility-change",dl),Qa.value={...Ya.value},Cl=!0,Tl=setInterval(()=>{vl.value=Date.now()},1e3)}),t(()=>{Cl=!1,kl&&clearInterval(kl),Tl&&clearInterval(Tl),bl&&clearTimeout(bl),window.removeEventListener("panel-visibility-change",dl),Object.values(al).forEach(e=>{e&&cancelAnimationFrame(e)})}),(a,l)=>{const n=o("n-collapse");return u(),i("div",me,[r("div",{class:T(["channel-header",[e.channelType,{"custom-cli":Ka.value.custom}]]),style:k(Ka.value.custom?{"--channel-accent":Ga.value}:null)},[r("div",ge,[p(y(se),{size:16},{default:h(()=>[p(y(J))]),_:1})]),r("div",fe,[p(y(se),{size:20},{default:h(()=>[(u(),v(m(Za.value)))]),_:1})]),r("h2",ke,g(Ba.value),1),!1!==Ka.value.supportsManagedConfig?(u(),i("div",Te,[p(y(te),{trigger:"hover"},{trigger:h(()=>[p(y(ce),{text:"",class:"config-shortcut-button",onClick:Vl,title:"Skills 技能管理"},{icon:h(()=>[p(y(se),{size:18},{default:h(()=>[p(y(V))]),_:1})]),_:1})]),default:h(()=>[l[2]||(l[2]=f(" Skills 技能管理 ",-1))]),_:1}),p(y(te),{trigger:"hover"},{trigger:h(()=>[p(y(ce),{text:"",class:"config-shortcut-button",onClick:Rl,title:"Commands 命令管理"},{icon:h(()=>[p(y(se),{size:18},{default:h(()=>[p(y(U))]),_:1})]),_:1})]),default:h(()=>[l[3]||(l[3]=f(" Commands 命令管理 ",-1))]),_:1}),!1!==Ka.value.supportsAgents?(u(),v(y(te),{key:0,trigger:"hover"},{trigger:h(()=>[p(y(ce),{text:"",class:"config-shortcut-button",onClick:Kl,title:"Agents 代理管理"},{icon:h(()=>[p(y(se),{size:18},{default:h(()=>[p(y(R))]),_:1})]),_:1})]),default:h(()=>[l[4]||(l[4]=f(" Agents 代理管理 ",-1))]),_:1})):d("",!0)])):d("",!0),p(y(ce),{text:"",class:"lock-button",onClick:ul,title:il.value?"解锁此列":"锁定此列"},{icon:h(()=>[p(y(se),{size:18},{default:h(()=>[il.value?(u(),v(y(K),{key:0})):(u(),v(y(B),{key:1}))]),_:1})]),_:1},8,["title"])],6),il.value?d("",!0):(u(),i("div",Ce,[!1!==Ka.value.supportsProxy?(u(),i("div",be,[r("div",we,[p(y(se),{size:16},{default:h(()=>[p(y(Z))]),_:1}),r("h3",xe,g("omp"===e.channelType?"受管配置":"代理控制"),1),Ha.value.running&&pl.value?(u(),i("span",$e,g(pl.value),1)):d("",!0),p(y(oe),{value:Ha.value.running,"onUpdate:value":[l[0]||(l[0]=e=>Ha.value.running=e),jl],loading:Ha.value.loading,size:"small",style:{"margin-left":"auto"}},null,8,["value","loading"])]),r("div",_e,[r("div",Se,[r("div",ze,[r("div",{class:T(["status-dot",{active:Ha.value.running}])},null,2),p(y(ie),{type:Ha.value.running?"success":"default",style:{"font-size":"12px"}},{default:h(()=>[f(g(Ha.value.running?"运行中":"已停止"),1)]),_:1},8,["type"]),"omp"!==e.channelType?(u(),i("span",Pe,"端口: "+g(Ha.value.port),1)):d("",!0)]),p(y(re),{trigger:"click",placement:"bottom",width:320,class:"channel-popover"},{trigger:h(()=>[p(y(ce),{text:"",size:"tiny",class:"channel-status"},{default:h(()=>[r("span",qe,g($l.value),1)]),_:1})]),default:h(()=>[r("div",je,[r("div",Me,[l[6]||(l[6]=r("span",null,"渠道快捷管理",-1)),p(y(ie),{depth:"3",style:{"font-size":"11px"}},{default:h(()=>[...l[5]||(l[5]=[f("点击开关切换状态",-1)])]),_:1})]),0===wl.value.length?(u(),i("div",Le,[p(y(ie),{depth:"3"},{default:h(()=>[...l[7]||(l[7]=[f("暂无配置渠道",-1)])]),_:1})])):(u(),i("div",Oe,[(u(!0),i(C,null,b(wl.value,e=>{var a,n;return u(),i("div",{key:e.id,class:T(["channel-quick-item",{disabled:!1===e.enabled}])},[r("div",Ie,[r("span",Ee,g(e.name),1),"frozen"===(null==(a=e.health)?void 0:a.status)?(u(),v(y(ue),{key:0,size:"tiny",type:"error",bordered:!1},{default:h(()=>[...l[8]||(l[8]=[f(" 冻结 ",-1)])]),_:1})):d("",!0),p(y(oe),{size:"small",value:!1!==e.enabled,"onUpdate:value":a=>Fl(e,a),loading:El(e.id),disabled:El(e.id),style:{"margin-left":"auto"}},null,8,["value","onUpdate:value","loading","disabled"])]),El(e.id)?(u(),i("div",Ne," 正在切换渠道状态... ")):d("",!0),r("div",Fe,[r("span",Ae,[l[9]||(l[9]=r("span",{class:"metric-label"},"请求",-1)),r("span",De,g(Sl(e.id).requests),1)]),r("span",Ue,[l[10]||(l[10]=r("span",{class:"metric-label"},"Tokens",-1)),r("span",Je,g((n=Sl(e.id).tokens,n>=1e6?(n/1e6).toFixed(1)+"M":n>=1e3?(n/1e3).toFixed(1)+"K":n.toString())),1)]),r("span",Ve,[l[11]||(l[11]=r("span",{class:"metric-label"},"权重",-1)),r("span",Re,g(e.weight||1),1)]),r("span",Ke,[l[12]||(l[12]=r("span",{class:"metric-label"},"并发",-1)),r("span",{class:T(["metric-value",{active:xl(e.id)>0}])},g(xl(e.id))+g(e.maxConcurrency?`/${e.maxConcurrency}`:""),3)])])],2)}),128))]))])]),_:1})])])])):d("",!0),r("div",Be,[r("div",Ze,[p(y(se),{size:14},{default:h(()=>[p(y(G))]),_:1}),l[13]||(l[13]=r("h3",{class:"card-title"},"快速访问",-1))]),r("div",Ge,[r("div",He,[r("div",{class:T(["access-card access-card-projects",{clickable:!1!==Ka.value.supportsProjects,disabled:!1===Ka.value.supportsProjects}]),onClick:Ml},[r("div",We,[p(y(se),{size:16},{default:h(()=>[p(y(H))]),_:1})]),r("div",Xe,[l[14]||(l[14]=r("span",{class:"access-label"},"项目",-1)),r("span",Ye,g(Xa.value.projects),1)])],2),r("div",{class:T(["access-card access-card-sessions",{clickable:!1!==Ka.value.supportsSessions,disabled:!1===Ka.value.supportsSessions}]),onClick:Ol},[r("div",Qe,[p(y(se),{size:16},{default:h(()=>[p(y(W))]),_:1})]),r("div",ea,[l[15]||(l[15]=r("span",{class:"access-label"},"最新对话",-1)),r("span",aa,g(Xa.value.sessions),1)])],2),r("div",{class:T(["access-card access-card-goto",{clickable:!1!==Ka.value.supportsProjects,disabled:!1===Ka.value.supportsProjects}]),onClick:Ll},[r("div",la,[p(y(se),{size:16},{default:h(()=>[p(y(X))]),_:1})]),r("div",na,[l[16]||(l[16]=r("span",{class:"access-label"},"前往",-1)),r("span",sa,g(Wa.value),1)])],2)])])]),r("div",{class:T(["card stats-card",`stats-card-${e.channelType}`])},[r("div",ca,[p(y(se),{size:14},{default:h(()=>[p(y(Y))]),_:1}),l[17]||(l[17]=r("h3",{class:"card-title"},"今日数据",-1))]),r("div",ta,[r("div",oa,[r("div",ia,[l[19]||(l[19]=r("div",{class:"stat-icon-dot requests"},null,-1)),r("div",ua,[l[18]||(l[18]=r("span",{class:"stat-label"},"请求",-1)),r("span",{class:T(["stat-value",{animating:ll.value.requests}])},g(Qa.value.requests),3)])]),r("div",ra,[l[21]||(l[21]=r("div",{class:"stat-icon-dot tokens"},null,-1)),r("div",da,[l[20]||(l[20]=r("span",{class:"stat-label"},"总 Tokens",-1)),r("span",{class:T(["stat-value",{animating:ll.value.tokens}])},g((c=Qa.value.tokens,c>=1e6?(c/1e6).toFixed(1)+"M":c>=1e3?(c/1e3).toFixed(1)+"K":c.toString())),3)])]),r("div",va,[l[23]||(l[23]=r("div",{class:"stat-icon-dot cost"},null,-1)),r("div",pa,[l[22]||(l[22]=r("span",{class:"stat-label"},"成本 / USD",-1)),r("span",{class:T(["stat-value",{animating:ll.value.cost}])},g((s=Qa.value.cost,!s||Number.isNaN(s)?"$0":"$"+Number(s).toFixed(3))),3)])])])])],2),Object.keys(nl.value).length>0?(u(),i("div",{key:1,class:T(["card chart-card",`chart-card-${e.channelType}`])},[p(n,{"default-expanded-names":[],accordion:""})],2)):d("",!0),rl.value?(u(),i("div",ha,[r("div",ya,[p(y(se),{size:14},{default:h(()=>[p(y(Q))]),_:1}),l[24]||(l[24]=r("h3",{class:"card-title"},"实时日志",-1)),p(y(ce),{text:"",size:"tiny",onClick:w(Ul,["stop"]),style:{"margin-left":"auto"},title:"清空日志"},{icon:h(()=>[p(y(se),{size:14},{default:h(()=>[p(y(ee))]),_:1})]),_:1})]),r("div",ma,[r("div",ga,[r("div",{class:T(["logs-table-header",`logs-header-${e.channelType}`])},[r("div",{class:T(["log-col col-channel",`col-channel-${e.channelType}`])},"渠道",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"请求",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"回复",2),"claude"===e.channelType?(u(),i(C,{key:0},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"写入",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"命中",2)],64)):"codex"===e.channelType?(u(),i(C,{key:1},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"推理",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"总计",2)],64)):"gemini"===e.channelType?(u(),i(C,{key:2},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"总计",2)],64)):"opencode"===e.channelType||"omp"===e.channelType?(u(),i(C,{key:3},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"推理",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"缓存",2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},"总计",2)],64)):d("",!0),r("div",{class:T(["log-col col-time",`col-time-${e.channelType}`])},"时间",2)],2),r("div",{class:"logs-container",ref_key:"logsContainer",ref:hl},[0===gl.value.length?(u(),i("div",fa,[p(y(se),{size:32,depth:"3",style:{"margin-bottom":"8px"}},{default:h(()=>[p(y(Q))]),_:1}),p(y(ie),{depth:"3",style:{"font-size":"12px","font-weight":"500"}},{default:h(()=>[...l[25]||(l[25]=[f("暂无实时日志",-1)])]),_:1}),p(y(ie),{depth:"3",style:{"font-size":"11px","margin-top":"4px"}},{default:h(()=>[f(g("omp"===e.channelType?"启用受管配置后将观察新增 OMP 会话用量":"开启代理后将显示请求记录"),1)]),_:1})])):d("",!0),(u(!0),i(C,null,b(gl.value,a=>(u(),i("div",{key:a.id,class:T(["log-row",{"action-row":"action"===a.type,"error-row":"error"===a.status,"new-log":a.isNew}]),title:ql(a)},["action"===a.type?(u(),i("div",Ta,[p(y(se),{size:12,color:"#18a058"},{default:h(()=>[p(y(ae))]),_:1}),r("span",Ca,g(a.message),1),r("span",ba,g(a.time),1)])):"error"===a.status?(u(),i("div",wa,[p(y(se),{size:12,color:"#d03050"},{default:h(()=>[p(y(le))]),_:1}),r("span",xa,g(a.channel)+": "+g(a.error||a.message||"请求失败"),1),r("span",$a,g(a.time),1)])):(u(),i(C,{key:2},[r("div",{class:T(["log-col col-channel",`col-channel-${e.channelType}`])},[p(y(ue),{size:"tiny",type:"success"},{default:h(()=>[f(g(a.channel),1)]),_:2},1024)],2),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"input")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"output")),3),"claude"===e.channelType?(u(),i(C,{key:0},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"cacheCreation")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"cacheRead")),3)],64)):"codex"===e.channelType?(u(),i(C,{key:1},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"reasoning")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"cached")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"total")),3)],64)):"gemini"===e.channelType?(u(),i(C,{key:2},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"cached")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"total")),3)],64)):"opencode"===e.channelType||"omp"===e.channelType?(u(),i(C,{key:3},[r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"reasoning")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"cached")),3),r("div",{class:T(["log-col col-token",`col-token-${e.channelType}`])},g(zl(a,"total")),3)],64)):d("",!0),r("div",{class:T(["log-col col-time",`col-time-${e.channelType}`])},g(a.time),3)],64))],10,ka))),128))],512)])])])):d("",!0)])),il.value?(u(),i("div",{key:1,class:T(["locked-overlay",`locked-${e.channelType}`])},[r("div",_a,[r("div",Sa,[p(y(se),{size:48},{default:h(()=>[p(y(K))]),_:1})]),l[27]||(l[27]=r("h3",{class:"locked-title"},"该渠道已锁定",-1)),p(y(ie),{depth:"3",class:"locked-hint"},{default:h(()=>[...l[26]||(l[26]=[f(" 点击上方按钮解锁以查看内容 ",-1)])]),_:1})])],2)):d("",!0),!1!==Ka.value.supportsSessions?(u(),v(O,{key:2,visible:cl.value,"onUpdate:visible":l[1]||(l[1]=e=>cl.value=e),channel:e.channelType},null,8,["visible","channel"])):d("",!0)]);var s,c}}},[["__scopeId","data-v-b44aec7b"]]),qa={class:"dashboard-container"},ja="dashboardChannelOrder",Ma=q({__name:"Home",setup(l){const{uiConfig:n,updateConfig:s,loadUIConfig:o}=ye();function r(e){try{localStorage.setItem(ja,JSON.stringify(e))}catch(a){}}function d(e,a=n.value.customCliPlatforms){const l=D(e,a);return m.value=l.map(e=>({type:e})),r(l),l}const m=a(function(){try{const e=localStorage.getItem(ja);if(e){const a=JSON.parse(e);return D(a,n.value.customCliPlatforms)}}catch(e){}return P}().map(e=>({type:e})));async function g(){const e=D(m.value.map(e=>e.type),n.value.customCliPlatforms);m.value=e.map(e=>({type:e})),r(e),await s("homeCliColumns",e),await s("dashboardChannelOrder",e)}function f(e){const a=(null==e?void 0:e.detail)||{};d(a.homeCliColumns,a.customCliPlatforms)}return c(async()=>{window.addEventListener("home-cli-columns-change",f),await o(),d(n.value.homeCliColumns||n.value.dashboardChannelOrder,n.value.customCliPlatforms)}),t(()=>{window.removeEventListener("home-cli-columns-change",f)}),(a,l)=>(u(),i("div",qa,[p(y(e),{modelValue:m.value,"onUpdate:modelValue":l[0]||(l[0]=e=>m.value=e),class:"dashboard-grid","item-key":"type",animation:200,handle:".drag-handle",onEnd:g},{item:h(({element:e})=>[(u(),v(Pa,{"channel-type":e.type,key:e.type},null,8,["channel-type"]))]),_:1},8,["modelValue"])]))}},[["__scopeId","data-v-276ca51b"]]);export{Ma as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.channel-column[data-v-b44aec7b]{display:flex;flex-direction:column;height:100%;min-height:0;background:var(--gradient-card);border:1px solid var(--border-primary);border-radius:18px;overflow:hidden;box-shadow:0 22px 52px #0f171d1a}.channel-header[data-v-b44aec7b]{display:flex;align-items:center;gap:10px;padding:12px 14px;background:linear-gradient(180deg,var(--bg-elevated) 0%,var(--bg-secondary) 100%);position:relative}.drag-handle[data-v-b44aec7b]{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-b44aec7b]:hover{color:var(--text-secondary);background:var(--bg-tertiary)}.drag-handle[data-v-b44aec7b]:active{cursor:grabbing}.channel-header[data-v-b44aec7b]:after{content:"";position:absolute;bottom:0;left:18px;right:18px;height:2px;border-radius:1px}.channel-header.claude[data-v-b44aec7b]{background:linear-gradient(135deg,rgba(24,160,88,.1) 0%,var(--bg-secondary) 100%)}.channel-header.claude[data-v-b44aec7b]:after{background:linear-gradient(90deg,#18a058,#18a0584d)}.channel-header.codex[data-v-b44aec7b]{background:linear-gradient(135deg,rgba(59,130,246,.1) 0%,var(--bg-secondary) 100%)}.channel-header.codex[data-v-b44aec7b]:after{background:linear-gradient(90deg,#3b82f6,#3b82f64d)}.channel-header.gemini[data-v-b44aec7b]{background:linear-gradient(135deg,rgba(168,85,247,.1) 0%,var(--bg-secondary) 100%)}.channel-header.gemini[data-v-b44aec7b]:after{background:linear-gradient(90deg,#a855f7,#a855f74d)}.channel-header.opencode[data-v-b44aec7b]{background:linear-gradient(135deg,rgba(234,88,12,.1) 0%,var(--bg-secondary) 100%)}.channel-header.opencode[data-v-b44aec7b]:after{background:linear-gradient(90deg,#ea580c,#ea580c4d)}.channel-header.omp[data-v-b44aec7b]{background:linear-gradient(135deg,rgba(15,159,154,.1) 0%,var(--bg-secondary) 100%)}.channel-header.omp[data-v-b44aec7b]:after{background:linear-gradient(90deg,#0f9f9a,#0f9f9a4d)}.channel-header.custom-cli[data-v-b44aec7b]{background:linear-gradient(135deg,color-mix(in srgb,var(--channel-accent, #64748b) 12%,transparent) 0%,var(--bg-secondary) 100%)}.channel-header.custom-cli[data-v-b44aec7b]:after{background:linear-gradient(90deg,var(--channel-accent, #64748b),color-mix(in srgb,var(--channel-accent, #64748b) 32%,transparent))}.header-icon[data-v-b44aec7b]{width:36px;height:36px;border-radius:12px;display:flex;align-items:center;justify-content:center;box-shadow:0 10px 24px #0f171d24}.channel-header.claude .header-icon[data-v-b44aec7b]{background:linear-gradient(135deg,#18a058,#15803d);color:#fff}.channel-header.codex .header-icon[data-v-b44aec7b]{background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff}.channel-header.gemini .header-icon[data-v-b44aec7b]{background:linear-gradient(135deg,#a855f7,#9333ea);color:#fff}.channel-header.opencode .header-icon[data-v-b44aec7b]{background:linear-gradient(135deg,#ea580c,#c2410c);color:#fff}.channel-header.omp .header-icon[data-v-b44aec7b]{background:linear-gradient(135deg,#0f9f9a,#0f766e);color:#fff}.channel-header.custom-cli .header-icon[data-v-b44aec7b]{background:linear-gradient(135deg,var(--channel-accent, #64748b) 0%,color-mix(in srgb,var(--channel-accent, #64748b) 72%,#0f172a) 100%);color:#fff}.channel-title[data-v-b44aec7b]{font-size:13px;font-weight:700;margin:0;color:var(--text-primary);letter-spacing:.3px;line-height:1.15;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;flex:1}.channel-content[data-v-b44aec7b]{flex:1;min-height:0;overflow:hidden;padding:10px;display:flex;flex-direction:column;gap:6px}.card[data-v-b44aec7b]{background:var(--gradient-card);border:1px solid var(--border-primary);border-radius:14px;overflow:hidden;transition:border-color .2s ease,box-shadow .2s ease,transform .2s ease;box-shadow:0 10px 28px #0f171d0f;position:relative}.card[data-v-b44aec7b]: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-b44aec7b]:hover{box-shadow:0 18px 38px #0f171d1a;border-color:var(--border-secondary)}.card[data-v-b44aec7b]:hover:before{opacity:1}.card.clickable[data-v-b44aec7b]{cursor:pointer}.card.clickable[data-v-b44aec7b]:hover{border-color:#18a058;transform:translateY(-2px);box-shadow:0 8px 24px #18a0582e}.card.clickable[data-v-b44aec7b]: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-b44aec7b]:hover:after{opacity:1}.card-header[data-v-b44aec7b]{display:flex;align-items:center;gap:8px;padding:9px 12px;background:linear-gradient(180deg,var(--bg-secondary) 0%,var(--bg-primary) 100%);border-bottom:1px solid var(--border-primary);position:relative;min-height:24px}.card-header.compact[data-v-b44aec7b]{padding:8px 12px}.card-header .n-icon[data-v-b44aec7b]{color:var(--text-tertiary);transition:color .2s ease}.card:hover .card-header .n-icon[data-v-b44aec7b]{color:var(--text-secondary)}.card-title[data-v-b44aec7b]{font-size:11px;font-weight:700;margin:0;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.8px}.runtime-badge[data-v-b44aec7b]{display:inline-flex;align-items:center;padding:3px 8px;margin-left:8px;font-size:10px;font-weight:600;color:#10b981;background:linear-gradient(135deg,#10b9811a,#34d3991a);border:1px solid rgba(16,185,129,.2);border-radius:999px;white-space:nowrap;animation:pulse-runtime-b44aec7b 2s ease-in-out infinite}@keyframes pulse-runtime-b44aec7b{0%,to{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(.98)}}.card-body[data-v-b44aec7b]{padding:8px 10px;background:transparent}.card-body.compact[data-v-b44aec7b]{padding:7px 10px}.proxy-control[data-v-b44aec7b]{display:flex;justify-content:space-between;align-items:center;gap:16px}.proxy-info[data-v-b44aec7b]{display:flex;flex-direction:column;gap:4px}.proxy-info-row[data-v-b44aec7b]{display:flex;align-items:center;justify-content:space-between}.proxy-status[data-v-b44aec7b]{display:flex;align-items:center;gap:6px}.proxy-port[data-v-b44aec7b]{font-size:11px;color:var(--text-secondary);margin-left:6px}.channel-selector[data-v-b44aec7b]{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-b44aec7b]:hover{background:var(--hover-bg);border-color:var(--border-secondary);color:var(--text-primary)}.channel-selector[data-v-b44aec7b]:disabled{opacity:.5;cursor:not-allowed}.channel-name[data-v-b44aec7b]{font-size:11px;font-weight:500;max-width:90px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-dot[data-v-b44aec7b]{width:8px;height:8px;border-radius:50%;background:var(--border-secondary);transition:all .3s ease}.status-dot.active[data-v-b44aec7b]{background:#18a058;box-shadow:0 0 8px #18a05880}.quick-stats[data-v-b44aec7b]{display:flex;gap:16px;padding:4px 0}.stat-item[data-v-b44aec7b]{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;padding:4px 0}.stat-divider[data-v-b44aec7b]{width:1px;background:linear-gradient(180deg,transparent 0%,var(--border-primary) 50%,transparent 100%)}.quick-access-list[data-v-b44aec7b]{display:grid;grid-template-columns:repeat(3,1fr);gap:4px}.access-card[data-v-b44aec7b]{display:flex;align-items:center;gap:5px;padding:7px 8px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border-primary);transition:border-color .2s ease,box-shadow .2s ease,transform .2s ease;position:relative;min-height:44px;overflow:hidden}.access-card[data-v-b44aec7b]: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-b44aec7b]{width:28px;height:28px;border-radius:9px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all .3s ease}.access-content[data-v-b44aec7b]{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0;overflow:hidden}.access-card-projects .access-icon[data-v-b44aec7b]{background:linear-gradient(135deg,#6366f126,#8b5cf626);color:#6366f1}.access-card-projects[data-v-b44aec7b]:before{background:linear-gradient(135deg,#6366f114,#8b5cf614)}.access-card-projects:hover .access-icon[data-v-b44aec7b]{background:linear-gradient(135deg,#6366f140,#8b5cf640);transform:translateY(-1px)}.access-card-sessions .access-icon[data-v-b44aec7b]{background:linear-gradient(135deg,#10b98126,#05966926);color:#10b981}.access-card-sessions[data-v-b44aec7b]:before{background:linear-gradient(135deg,#10b98114,#05966914)}.access-card-sessions:hover .access-icon[data-v-b44aec7b]{background:linear-gradient(135deg,#10b98140,#05966940);transform:translateY(-1px)}.access-card-goto .access-icon[data-v-b44aec7b]{background:linear-gradient(135deg,#f59e0b26,#fb923c26);color:#f59e0b}.access-card-goto[data-v-b44aec7b]:before{background:linear-gradient(135deg,#f59e0b14,#fb923c14)}.access-card-goto:hover .access-icon[data-v-b44aec7b]{background:linear-gradient(135deg,#f59e0b40,#fb923c40);transform:translate(2px)}.access-card.clickable[data-v-b44aec7b]:hover{transform:translateY(-2px);box-shadow:0 8px 20px #0000001a;border-color:var(--border-secondary)}.access-card.clickable[data-v-b44aec7b]:hover:before{opacity:1}.access-card.disabled[data-v-b44aec7b]{cursor:default;opacity:.62}.access-card.disabled[data-v-b44aec7b]:hover{transform:none;box-shadow:none;border-color:var(--border-primary)}.access-card.clickable[data-v-b44aec7b]:active{transform:translateY(0)}.access-label[data-v-b44aec7b]{display:block;font-size:8px;font-weight:600;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.3px;white-space:nowrap;line-height:1.1}.access-value[data-v-b44aec7b]{display:block;font-size:13px;font-weight:800;color:var(--text-primary);line-height:1;white-space:nowrap}.access-goto[data-v-b44aec7b]{display:block;font-size:9px;font-weight:700;color:var(--text-primary);line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.stats-inline[data-v-b44aec7b]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}.stats-inline.stats-3col[data-v-b44aec7b]{grid-template-columns:repeat(3,1fr)}.stat-inline-item[data-v-b44aec7b]{display:flex;align-items:center;gap:8px;padding:10px;background:var(--bg-secondary);border-radius:10px;border:1px solid var(--border-primary);transition:all .2s ease}.stat-inline-item[data-v-b44aec7b]:hover{border-color:var(--border-secondary);background:var(--hover-bg)}.stat-icon-dot[data-v-b44aec7b]{width:8px;height:8px;border-radius:50%;flex-shrink:0}.stat-icon-dot.requests[data-v-b44aec7b]{background:#3b82f6;box-shadow:0 0 6px #3b82f680}.stat-icon-dot.tokens[data-v-b44aec7b]{background:#18a058;box-shadow:0 0 6px #18a05880}.stat-icon-dot.cost[data-v-b44aec7b]{background:#f59e0b;box-shadow:0 0 6px #f59e0b80}.stat-info[data-v-b44aec7b]{display:flex;flex-direction:column;gap:1px;min-width:0}.stat-label[data-v-b44aec7b]{font-size:10px;color:var(--text-tertiary);font-weight:500;text-transform:uppercase;letter-spacing:.2px}.stat-value[data-v-b44aec7b]{font-size:16px;font-weight:700;color:var(--text-primary);line-height:1.2;transition:all .3s ease}.stat-value.animating[data-v-b44aec7b]{animation:numberChange-b44aec7b .6s ease}@keyframes numberChange-b44aec7b{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-b44aec7b],.chart-card[data-v-b44aec7b]{border-left:2px solid transparent}.stats-card-claude[data-v-b44aec7b],.chart-card[data-v-b44aec7b]:has(+.stats-card-claude),.card[data-v-b44aec7b]:has(.panel-card):nth-child(4){border-left-color:#18a058}.chart-card.chart-card-claude[data-v-b44aec7b]{border-left-color:#18a058}.stats-card-codex[data-v-b44aec7b],.chart-card[data-v-b44aec7b]:has(+.stats-card-codex),.card[data-v-b44aec7b]:has(.panel-card):nth-child(4){border-left-color:#3b82f6}.chart-card.chart-card-codex[data-v-b44aec7b]{border-left-color:#3b82f6}.stats-card-gemini[data-v-b44aec7b],.chart-card[data-v-b44aec7b]:has(+.stats-card-gemini),.card[data-v-b44aec7b]:has(.panel-card):nth-child(4){border-left-color:#a855f7}.chart-card.chart-card-gemini[data-v-b44aec7b]{border-left-color:#a855f7}.stats-card-opencode[data-v-b44aec7b],.chart-card[data-v-b44aec7b]:has(+.stats-card-opencode),.card[data-v-b44aec7b]:has(.panel-card):nth-child(4){border-left-color:#ea580c}.chart-card.chart-card-opencode[data-v-b44aec7b]{border-left-color:#ea580c}.stats-card-omp[data-v-b44aec7b],.chart-card[data-v-b44aec7b]:has(+.stats-card-omp),.card[data-v-b44aec7b]:has(.panel-card):nth-child(4){border-left-color:#0f9f9a}.chart-card.chart-card-omp[data-v-b44aec7b]{border-left-color:#0f9f9a}.chart-card[data-v-b44aec7b]{padding:0;overflow:hidden}.chart-card[data-v-b44aec7b] .panel-card{border:none;border-radius:0;box-shadow:none;background:transparent}.stat-requests .stat-value[data-v-b44aec7b]{color:#3b82f6}.stat-input .stat-value[data-v-b44aec7b]{color:#18a058}.stat-output .stat-value[data-v-b44aec7b]{color:#f59e0b}.token-label[data-v-b44aec7b]{display:flex;align-items:center;gap:8px}.token-dot[data-v-b44aec7b]{width:8px;height:8px;border-radius:50%}.logs-card[data-v-b44aec7b]{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--border-primary);border-radius:14px}.logs-card-body[data-v-b44aec7b]{flex:1;min-height:0;display:flex;flex-direction:column;padding:0}.logs-card .card-header[data-v-b44aec7b]{background:linear-gradient(135deg,var(--bg-secondary) 0%,var(--bg-tertiary) 100%)}.logs-table-wrapper[data-v-b44aec7b]{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;background:var(--bg-primary)}.logs-table-header[data-v-b44aec7b]{display:flex;padding:8px 12px;background:linear-gradient(180deg,var(--bg-tertiary) 0%,var(--bg-secondary) 100%);border-bottom:1px solid var(--border-primary);font-size:11px;font-weight:700;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.6px;flex-shrink:0}.logs-header-claude .log-col[data-v-b44aec7b]{color:#18a058b3;font-weight:600}.logs-header-codex .log-col[data-v-b44aec7b]{color:#3b82f6b3;font-weight:600}.logs-header-gemini .log-col[data-v-b44aec7b]{color:#a855f7b3;font-weight:600}.logs-header-opencode .log-col[data-v-b44aec7b]{color:#ea580cb3;font-weight:600}.logs-header-omp .log-col[data-v-b44aec7b]{color:#0f9f9ab3;font-weight:600}[data-theme=dark] .logs-header-claude .log-col[data-v-b44aec7b]{color:#34d399a6}[data-theme=dark] .logs-header-codex .log-col[data-v-b44aec7b]{color:#60a5faa6}[data-theme=dark] .logs-header-gemini .log-col[data-v-b44aec7b]{color:#c084fca6}[data-theme=dark] .logs-header-opencode .log-col[data-v-b44aec7b]{color:#fb923ca6}[data-theme=dark] .logs-header-omp .log-col[data-v-b44aec7b]{color:#2dd4bfa6}[data-theme=dark] .channel-column[data-v-b44aec7b]{background:linear-gradient(180deg,#121b22fa,#091016fa);border-color:#364c56d1;box-shadow:0 18px 42px #00000047}[data-theme=dark] .channel-header[data-v-b44aec7b]{background:linear-gradient(180deg,#16222ae6,#0d161dd1)}[data-theme=dark] .card[data-v-b44aec7b],[data-theme=dark] .access-card[data-v-b44aec7b],[data-theme=dark] .stat-inline-item[data-v-b44aec7b]{background:linear-gradient(180deg,#121c23f0,#0c151cf5);border-color:#364c56c7}[data-theme=dark] .card[data-v-b44aec7b]:hover,[data-theme=dark] .access-card.clickable[data-v-b44aec7b]:hover,[data-theme=dark] .stat-inline-item[data-v-b44aec7b]:hover{border-color:#4c6570eb;box-shadow:0 12px 28px #0000003d}[data-theme=dark] .card-header[data-v-b44aec7b]{background:linear-gradient(180deg,#16222aeb,#0e181ff5);border-bottom-color:#364c56b8}[data-theme=dark] .logs-table-wrapper[data-v-b44aec7b]{background:#091016f5}[data-theme=dark] .logs-table-header[data-v-b44aec7b]{background:linear-gradient(180deg,#121d25f5,#0b141bfa);border-bottom-color:#364c56c2}.logs-container[data-v-b44aec7b]{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden}.logs-container[data-v-b44aec7b]::-webkit-scrollbar{width:4px}.logs-container[data-v-b44aec7b]::-webkit-scrollbar-thumb{background:#18a0584d;border-radius:2px}.logs-container[data-v-b44aec7b]::-webkit-scrollbar-thumb:hover{background:#18a05880}.empty-logs[data-v-b44aec7b]{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-b44aec7b]{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-b44aec7b]:nth-child(2n){background:var(--bg-secondary)}[data-theme=dark] .log-row[data-v-b44aec7b]{background:#091016f5;border-bottom-color:#364c5694}[data-theme=dark] .log-row[data-v-b44aec7b]:nth-child(2n){background:#0d161df5}.log-row[data-v-b44aec7b]:hover{background:var(--hover-bg);transform:translate(2px)}.log-row.new-log[data-v-b44aec7b]{animation:newLogPulse-b44aec7b 4.5s cubic-bezier(.25,.46,.45,.94) forwards;border-left:3px solid #18a058}@keyframes newLogPulse-b44aec7b{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-b44aec7b]{animation:newLogPulseDark-b44aec7b 4.5s cubic-bezier(.25,.46,.45,.94) forwards}@keyframes newLogPulseDark-b44aec7b{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-b44aec7b]{border-left:3px solid #18a058}.log-row.action-row[data-v-b44aec7b]{background:linear-gradient(90deg,#18a0581f,#18a0580a);border-left:3px solid #18a058;padding-left:8px}.log-row.error-row[data-v-b44aec7b]{background:linear-gradient(90deg,#d0305024,#d030500a);border-left:3px solid #d03050;padding-left:8px}.log-row.action-row[data-v-b44aec7b]:hover{background:linear-gradient(90deg,#18a0582e,#18a05814)}.log-row.error-row[data-v-b44aec7b]:hover{background:linear-gradient(90deg,#d0305033,#d0305014)}.action-content[data-v-b44aec7b]{display:flex;align-items:center;gap:8px;width:100%}.action-msg[data-v-b44aec7b]{flex:1;font-size:11px;color:#18a058;font-weight:600;letter-spacing:.2px}.action-msg.error-msg[data-v-b44aec7b]{color:#d03050}.action-time[data-v-b44aec7b]{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-b44aec7b]{background:#d030501f}.log-col[data-v-b44aec7b]{display:flex;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-channel[data-v-b44aec7b]{min-width:0}.col-channel .n-tag[data-v-b44aec7b]{max-width:100%;font-size:11px;font-weight:600;border-radius:4px;padding:3px 10px}.col-token[data-v-b44aec7b]{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-b44aec7b]{background:#ffffff0b;color:var(--text-secondary)}.col-time[data-v-b44aec7b]{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-b44aec7b]{opacity:1;color:var(--text-secondary)}.col-channel-claude[data-v-b44aec7b]{flex:2 1 60px;min-width:50px}.col-token-claude[data-v-b44aec7b]{flex:1 1 40px;min-width:35px}.col-time-claude[data-v-b44aec7b]{flex:1.5 1 55px;min-width:50px}.col-channel-codex[data-v-b44aec7b]{flex:2 1 60px;min-width:50px}.col-token-codex[data-v-b44aec7b]{flex:1 1 40px;min-width:35px}.col-time-codex[data-v-b44aec7b]{flex:1.5 1 55px;min-width:50px}.col-channel-gemini[data-v-b44aec7b]{flex:2.5 1 70px;min-width:55px}.col-token-gemini[data-v-b44aec7b]{flex:1.2 1 45px;min-width:40px}.col-time-gemini[data-v-b44aec7b]{flex:1.8 1 60px;min-width:55px}.col-channel-opencode[data-v-b44aec7b]{flex:2.5 1 70px;min-width:55px}.col-token-opencode[data-v-b44aec7b]{flex:1.2 1 45px;min-width:40px}.col-time-opencode[data-v-b44aec7b]{flex:1.8 1 60px;min-width:55px}.col-channel-omp[data-v-b44aec7b]{flex:2.5 1 70px;min-width:55px}.col-token-omp[data-v-b44aec7b]{flex:1.2 1 45px;min-width:40px}.col-time-omp[data-v-b44aec7b]{flex:1.8 1 60px;min-width:55px}.claude-extra-area[data-v-b44aec7b]{display:flex;align-items:center;gap:6px;margin-left:auto}.mcp-count-tag[data-v-b44aec7b],.skills-count-tag[data-v-b44aec7b]{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-b44aec7b]:hover,.skills-count-tag.clickable[data-v-b44aec7b]:hover{transform:scale(1.03);filter:brightness(1.1)}.mcp-quick-panel[data-v-b44aec7b],.skills-quick-panel[data-v-b44aec7b]{padding:2px 0}.mcp-quick-panel .panel-title[data-v-b44aec7b],.skills-quick-panel .panel-title[data-v-b44aec7b]{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-b44aec7b]:first-child,.skills-quick-panel .panel-title span[data-v-b44aec7b]:first-child{font-size:13px;font-weight:600;color:var(--text-primary)}.no-items[data-v-b44aec7b]{padding:16px 10px;text-align:center}.mcp-quick-list[data-v-b44aec7b],.skills-quick-list[data-v-b44aec7b]{max-height:300px;overflow-y:auto;padding:0 4px 4px}.mcp-quick-item[data-v-b44aec7b],.skill-quick-item[data-v-b44aec7b]{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-b44aec7b]:hover,.skill-quick-item[data-v-b44aec7b]:hover{background:var(--hover-bg)}.mcp-item-icon[data-v-b44aec7b],.skill-item-icon[data-v-b44aec7b]{width:24px;height:24px;border-radius:5px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.mcp-item-icon[data-v-b44aec7b]{background:linear-gradient(135deg,#3b82f626,#3b82f60d);color:#3b82f6}.skill-item-icon[data-v-b44aec7b]{background:linear-gradient(135deg,#18a05826,#18a0580d);color:#18a058}.mcp-item-info[data-v-b44aec7b],.skill-item-info[data-v-b44aec7b]{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.mcp-item-name[data-v-b44aec7b],.skill-item-name[data-v-b44aec7b]{font-size:12px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mcp-item-type[data-v-b44aec7b]{font-size:10px;color:var(--text-tertiary);text-transform:uppercase}.skill-item-desc[data-v-b44aec7b]{font-size:10px;color:var(--text-tertiary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mcp-item-status[data-v-b44aec7b]{flex-shrink:0}.mcp-item-status .status-dot[data-v-b44aec7b]{width:8px;height:8px;border-radius:50%;background:var(--border-secondary)}.mcp-item-status.online .status-dot[data-v-b44aec7b]{background:#18a058;box-shadow:0 0 6px #18a05880}.mcp-item-status.error .status-dot[data-v-b44aec7b]{background:#d03050;box-shadow:0 0 6px #d0305080}.mcp-quick-list[data-v-b44aec7b]::-webkit-scrollbar,.skills-quick-list[data-v-b44aec7b]::-webkit-scrollbar{width:4px}.mcp-quick-list[data-v-b44aec7b]::-webkit-scrollbar-thumb,.skills-quick-list[data-v-b44aec7b]::-webkit-scrollbar-thumb{background:#00000026;border-radius:2px}[data-theme=dark] .mcp-quick-list[data-v-b44aec7b]::-webkit-scrollbar-thumb,[data-theme=dark] .skills-quick-list[data-v-b44aec7b]::-webkit-scrollbar-thumb{background:#ffffff26}.config-shortcut-button[data-v-b44aec7b]{--asset-shortcut-text: var(--text-color-3);--n-text-color: var(--asset-shortcut-text) !important;--n-text-color-hover: var(--asset-shortcut-text) !important;--n-text-color-pressed: var(--asset-shortcut-text) !important;--n-text-color-focus: var(--asset-shortcut-text) !important;padding:6px!important;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--bg-secondary);border:1px solid var(--border-primary);color:var(--asset-shortcut-text)!important;transition:transform .18s cubic-bezier(.4,0,.2,1),box-shadow .18s cubic-bezier(.4,0,.2,1);box-shadow:0 2px 4px #0000000d}.config-shortcut-button .n-icon[data-v-b44aec7b]{color:var(--asset-shortcut-text)!important;transition:transform .18s ease}.config-shortcut-button[data-v-b44aec7b] .n-button__content,.config-shortcut-button[data-v-b44aec7b] .n-button__icon{color:var(--asset-shortcut-text)!important}.config-shortcut-button[data-v-b44aec7b]:hover,.config-shortcut-button[data-v-b44aec7b]:focus,.config-shortcut-button[data-v-b44aec7b]:focus-visible{background:var(--bg-secondary);border-color:var(--border-primary);color:var(--asset-shortcut-text)!important;box-shadow:0 3px 8px #00000014;transform:translateY(-1px)}.config-shortcut-button:hover .n-icon[data-v-b44aec7b],.config-shortcut-button:focus .n-icon[data-v-b44aec7b],.config-shortcut-button:focus-visible .n-icon[data-v-b44aec7b]{color:var(--asset-shortcut-text)!important;transform:scale(1.1)}.config-shortcut-button[data-v-b44aec7b]:active{background:var(--bg-secondary);border-color:var(--border-primary);color:var(--asset-shortcut-text)!important;transform:translateY(0);box-shadow:0 2px 4px #0000000d}.lock-button[data-v-b44aec7b]{margin-left:6px;padding:6px!important;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--bg-secondary);border:1px solid var(--border-primary);transition:all .25s cubic-bezier(.4,0,.2,1);box-shadow:0 2px 4px #0000000d}.lock-button .n-icon[data-v-b44aec7b]{color:var(--text-color-3);transition:all .25s ease}.lock-button[data-v-b44aec7b]: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-b44aec7b]{color:var(--text-color-1);transform:scale(1.1)}.lock-button[data-v-b44aec7b]:active{transform:translateY(0);box-shadow:0 2px 4px #0000000d}.locked-overlay[data-v-b44aec7b]{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-b44aec7b]: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-b44aec7b]{background:linear-gradient(135deg,rgba(24,160,88,.03) 0%,var(--bg-secondary) 50%,rgba(24,160,88,.02) 100%)}.locked-claude[data-v-b44aec7b]:before{background:radial-gradient(circle,rgba(24,160,88,.15) 0%,transparent 70%)}.locked-codex[data-v-b44aec7b]{background:linear-gradient(135deg,rgba(59,130,246,.03) 0%,var(--bg-secondary) 50%,rgba(59,130,246,.02) 100%)}.locked-codex[data-v-b44aec7b]:before{background:radial-gradient(circle,rgba(59,130,246,.15) 0%,transparent 70%)}.locked-gemini[data-v-b44aec7b]{background:linear-gradient(135deg,rgba(168,85,247,.03) 0%,var(--bg-secondary) 50%,rgba(168,85,247,.02) 100%)}.locked-gemini[data-v-b44aec7b]:before{background:radial-gradient(circle,rgba(168,85,247,.15) 0%,transparent 70%)}.locked-opencode[data-v-b44aec7b]{background:linear-gradient(135deg,rgba(234,88,12,.03) 0%,var(--bg-secondary) 50%,rgba(234,88,12,.02) 100%)}.locked-opencode[data-v-b44aec7b]:before{background:radial-gradient(circle,rgba(234,88,12,.15) 0%,transparent 70%)}.locked-omp[data-v-b44aec7b]{background:linear-gradient(135deg,rgba(15,159,154,.03) 0%,var(--bg-secondary) 50%,rgba(15,159,154,.02) 100%)}.locked-omp[data-v-b44aec7b]:before{background:radial-gradient(circle,rgba(15,159,154,.15) 0%,transparent 70%)}.locked-content[data-v-b44aec7b]{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-b44aec7b]{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-b44aec7b 3s ease-in-out infinite}@keyframes lock-float-b44aec7b{0%,to{transform:translateY(0)}50%{transform:translateY(-6px)}}.lock-icon[data-v-b44aec7b]: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-b44aec7b]{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-b44aec7b]:before{background:radial-gradient(circle,rgba(24,160,88,.3) 0%,transparent 60%)}.locked-claude .lock-icon .n-icon[data-v-b44aec7b]{color:#18a058;filter:drop-shadow(0 2px 4px rgba(24,160,88,.3))}.locked-codex .lock-icon[data-v-b44aec7b]{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-b44aec7b]:before{background:radial-gradient(circle,rgba(59,130,246,.3) 0%,transparent 60%)}.locked-codex .lock-icon .n-icon[data-v-b44aec7b]{color:#3b82f6;filter:drop-shadow(0 2px 4px rgba(59,130,246,.3))}.locked-gemini .lock-icon[data-v-b44aec7b]{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-b44aec7b]:before{background:radial-gradient(circle,rgba(168,85,247,.3) 0%,transparent 60%)}.locked-gemini .lock-icon .n-icon[data-v-b44aec7b]{color:#a855f7;filter:drop-shadow(0 2px 4px rgba(168,85,247,.3))}.locked-opencode .lock-icon[data-v-b44aec7b]{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-b44aec7b]:before{background:radial-gradient(circle,rgba(234,88,12,.3) 0%,transparent 60%)}.locked-opencode .lock-icon .n-icon[data-v-b44aec7b]{color:#ea580c;filter:drop-shadow(0 2px 4px rgba(234,88,12,.3))}.locked-omp .lock-icon[data-v-b44aec7b]{background:linear-gradient(135deg,rgba(15,159,154,.12) 0%,var(--bg-primary) 100%);border-color:#0f9f9a40;box-shadow:0 8px 24px #0f9f9a26,0 0 0 1px #0f9f9a1a inset}.locked-omp .lock-icon[data-v-b44aec7b]:before{background:radial-gradient(circle,rgba(15,159,154,.3) 0%,transparent 60%)}.locked-omp .lock-icon .n-icon[data-v-b44aec7b]{color:#0f9f9a;filter:drop-shadow(0 2px 4px rgba(15,159,154,.3))}.lock-icon .n-icon[data-v-b44aec7b]{opacity:.85;position:relative;z-index:1}.locked-title[data-v-b44aec7b]{font-size:17px;font-weight:600;color:var(--text-color-1);margin:0;letter-spacing:.3px}.locked-hint[data-v-b44aec7b]{font-size:13px;color:var(--text-color-3);max-width:220px;line-height:1.7;opacity:.9}.channel-status[data-v-b44aec7b]{cursor:pointer;padding:4px 8px!important;border-radius:4px;transition:all .2s ease}.channel-status[data-v-b44aec7b]:hover{background:var(--hover-bg)}.channel-quick-panel[data-v-b44aec7b]{padding:4px 0}.panel-title[data-v-b44aec7b]{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-b44aec7b]:first-child{font-size:13px;font-weight:600;color:var(--text-primary)}.no-channels[data-v-b44aec7b]{padding:24px 12px;text-align:center}.channel-quick-list[data-v-b44aec7b]{max-height:360px;overflow-y:auto}.channel-quick-item[data-v-b44aec7b]{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-b44aec7b]:hover{background:var(--hover-bg)}.channel-quick-item.disabled[data-v-b44aec7b]{opacity:.6}.channel-quick-info[data-v-b44aec7b]{display:flex;align-items:center;gap:8px;width:100%}.channel-quick-name[data-v-b44aec7b]{font-size:13px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.channel-metrics[data-v-b44aec7b]{display:flex;gap:6px;width:100%}.channel-metrics .metric-item[data-v-b44aec7b]{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-b44aec7b]{font-size:10px;color:var(--text-tertiary);font-weight:500}.channel-metrics .metric-value[data-v-b44aec7b]{font-size:12px;font-weight:700;color:var(--text-primary);font-family:SF Mono,Monaco,monospace}.channel-metrics .metric-value.active[data-v-b44aec7b]{color:#f59e0b}.channel-switching-tip[data-v-b44aec7b]{font-size:11px;color:var(--text-tertiary);padding:0 2px}.channel-quick-item.disabled .channel-metrics .metric-value[data-v-b44aec7b]{color:var(--text-tertiary)}.channel-quick-list[data-v-b44aec7b]::-webkit-scrollbar{width:4px}.channel-quick-list[data-v-b44aec7b]::-webkit-scrollbar-thumb{background:#00000026;border-radius:2px}[data-theme=dark] .channel-quick-list[data-v-b44aec7b]::-webkit-scrollbar-thumb{background:#ffffff26}@media (max-width: 1024px){.channel-column[data-v-b44aec7b]{border-radius:6px}.card-header[data-v-b44aec7b]{padding:8px 10px}.card-title[data-v-b44aec7b]{font-size:13px}.stats-inline[data-v-b44aec7b]{gap:6px}.stat-inline-item[data-v-b44aec7b]{padding:8px}.stat-value[data-v-b44aec7b]{font-size:14px}.stat-label[data-v-b44aec7b]{font-size:9px}.logs-table-header[data-v-b44aec7b]{padding:8px 10px;font-size:10px}.log-row[data-v-b44aec7b]{padding:8px 10px;font-size:11px}}@media (max-width: 768px){.channel-column[data-v-b44aec7b]{border-radius:6px;min-height:300px;height:auto;max-height:400px}.card-header[data-v-b44aec7b]{padding:8px;gap:6px}.card-title[data-v-b44aec7b]{font-size:12px}.stats-inline[data-v-b44aec7b]{gap:4px}.stat-inline-item[data-v-b44aec7b]{padding:6px;gap:6px}.stat-icon-dot[data-v-b44aec7b]{width:6px;height:6px}.stat-value[data-v-b44aec7b]{font-size:13px}.stat-label[data-v-b44aec7b]{font-size:8px}.logs-card[data-v-b44aec7b]{min-height:150px}.logs-table-header[data-v-b44aec7b]{padding:6px 8px;font-size:9px}.log-row[data-v-b44aec7b]{padding:6px 8px;font-size:10px;min-height:32px}.col-token[data-v-b44aec7b]{font-size:10px;padding:2px 4px}.col-time[data-v-b44aec7b]{font-size:9px}.mcp-count-tag[data-v-b44aec7b],.skills-count-tag[data-v-b44aec7b]{font-size:9px;padding:0 6px;height:18px;line-height:18px}.config-shortcut-button[data-v-b44aec7b]{padding:4px 8px;font-size:10px;gap:4px}.lock-button[data-v-b44aec7b]{width:26px;height:26px}}@media (max-width: 640px){.channel-column[data-v-b44aec7b]{min-height:250px;max-height:350px}.card-header[data-v-b44aec7b]{padding:6px;gap:4px;flex-wrap:wrap}.card-title[data-v-b44aec7b]{font-size:11px}.stats-card .card-content[data-v-b44aec7b]{padding:6px}.stats-inline[data-v-b44aec7b]{gap:3px;flex-wrap:wrap}.stat-inline-item[data-v-b44aec7b]{padding:5px;gap:4px;min-width:calc(33% - 3px);flex:1 1 auto}.stat-icon-dot[data-v-b44aec7b]{width:5px;height:5px}.stat-value[data-v-b44aec7b]{font-size:12px}.stat-label[data-v-b44aec7b]{font-size:7px}.logs-card[data-v-b44aec7b]{min-height:120px}.logs-table-header[data-v-b44aec7b]{padding:5px 6px;font-size:8px;letter-spacing:.3px}.log-row[data-v-b44aec7b]{padding:5px 6px;font-size:9px;min-height:28px}.col-channel .n-tag[data-v-b44aec7b]{font-size:9px;padding:2px 6px}.col-token[data-v-b44aec7b]{font-size:9px;padding:2px 3px;margin:0 1px}.col-time[data-v-b44aec7b]{font-size:8px}.claude-extra-area[data-v-b44aec7b]{gap:4px}.mcp-count-tag[data-v-b44aec7b],.skills-count-tag[data-v-b44aec7b]{font-size:8px;padding:0 4px;height:16px;line-height:16px}.config-shortcut-button[data-v-b44aec7b]{padding:3px 6px;font-size:9px;gap:3px}.config-shortcut-button .n-icon[data-v-b44aec7b]{font-size:12px!important}.lock-button[data-v-b44aec7b]{width:24px;height:24px;margin-left:4px}.lock-button .n-icon[data-v-b44aec7b]{font-size:12px!important}.locked-content[data-v-b44aec7b]{padding:30px 20px;gap:12px}.lock-icon[data-v-b44aec7b]{width:64px;height:64px}.lock-icon .n-icon[data-v-b44aec7b]{font-size:28px!important}.lock-title[data-v-b44aec7b]{font-size:14px}.lock-subtitle[data-v-b44aec7b]{font-size:10px}.unlock-btn[data-v-b44aec7b]{padding:8px 16px;font-size:11px}}@media (max-width: 480px){.channel-column[data-v-b44aec7b]{min-height:220px;max-height:300px}.card-header[data-v-b44aec7b]{padding:5px}.card-title[data-v-b44aec7b]{font-size:10px}.stats-inline[data-v-b44aec7b]{gap:2px}.stat-inline-item[data-v-b44aec7b]{padding:4px;gap:3px}.stat-value[data-v-b44aec7b]{font-size:11px}.stat-label[data-v-b44aec7b]{font-size:6px}.logs-table-header[data-v-b44aec7b]{padding:4px 5px;font-size:7px}.log-row[data-v-b44aec7b]{padding:4px 5px;font-size:8px;min-height:24px}.col-token[data-v-b44aec7b]{font-size:8px}.col-time[data-v-b44aec7b]{font-size:7px}}.card[data-v-b44aec7b]:not(.logs-card) .n-collapse{background:transparent}.card[data-v-b44aec7b]:not(.logs-card) .n-collapse-item{background:transparent}.card[data-v-b44aec7b] .n-collapse-item__header{padding:12px 16px;background:transparent;transition:all .3s ease}.card[data-v-b44aec7b] .n-collapse-item__header:hover{background:#00000005}.card[data-v-b44aec7b] .n-collapse-item__header-main{width:100%}.card[data-v-b44aec7b]:not(.logs-card) .n-collapse-item__content-wrapper{padding:0 16px 12px}.card[data-v-b44aec7b]:not(.logs-card) .n-collapse-item__content-inner{padding-top:0}.chart-card[data-v-b44aec7b]:has(.n-collapse){padding:0}.dashboard-container[data-v-276ca51b]{height:100%;background:var(--gradient-bg);overflow:hidden;padding:18px;box-sizing:border-box;display:flex;flex-direction:column}.dashboard-toolbar[data-v-276ca51b]{display:flex;justify-content:flex-end;margin-bottom:8px;flex-shrink:0}.analytics-link[data-v-276ca51b]{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--primary-color, #18a058);text-decoration:none;padding:4px 10px;border-radius:4px;background:#18a05814;transition:background .2s}.analytics-link[data-v-276ca51b]:hover{background:#18a05826}.analytics-link-icon[data-v-276ca51b]{font-size:14px}.dashboard-grid[data-v-276ca51b]{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;flex:1;min-height:0;overflow:hidden;box-sizing:border-box;align-items:stretch}.dashboard-grid[data-v-276ca51b] .sortable-ghost{opacity:.4}.dashboard-grid[data-v-276ca51b] .sortable-chosen{box-shadow:0 8px 24px #00000026}@media (max-width: 1240px){.dashboard-grid[data-v-276ca51b]{grid-template-columns:repeat(3,1fr)}}@media (max-width: 960px){.dashboard-grid[data-v-276ca51b]{grid-template-columns:repeat(2,1fr)}}@media (max-width: 1024px){.dashboard-container[data-v-276ca51b]{padding:14px}.dashboard-grid[data-v-276ca51b]{gap:12px}}@media (max-width: 900px){.dashboard-grid[data-v-276ca51b]{grid-template-columns:1fr}}@media (max-width: 768px){.dashboard-container[data-v-276ca51b]{padding:10px;overflow-y:auto}.dashboard-grid[data-v-276ca51b]{gap:10px;overflow:visible;min-height:auto}}@media (max-width: 640px){.dashboard-container[data-v-276ca51b]{padding:6px}.dashboard-grid[data-v-276ca51b]{gap:6px}}@media (max-width: 480px){.dashboard-container[data-v-276ca51b]{padding:4px}.dashboard-grid[data-v-276ca51b]{gap:4px}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as a,S as s}from"./index-k5oP7c-A.js";import{c as e,o as r,X as o,Y as i,N as t}from"./vue-vendor-B5RqjEjQ.js";import{K as d}from"./naive-ui-BALVpMgd.js";import"./icons-nGdSKQn2.js";import"./vendors-DQA4Hw9v.js";import"./markdown-BNJfEgCA.js";const m={class:"skill-manager"},n=a({__name:"SkillManager",setup:a=>(a,n)=>(r(),e("div",m,[o(t(d),{title:"Skills 技能管理",bordered:!1},{default:i(()=>[o(s,{"in-drawer":!1,"hide-back":!0})]),_:1})]))},[["__scopeId","data-v-6ebc8a84"]]);export{n as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.skill-manager[data-v-6ebc8a84]{padding:16px}
|