cc-viewer 1.9.0 → 1.9.2
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/README.md +3 -1
- package/cli.js +33 -4
- package/concepts/ar/UltraPlan.md +1 -1
- package/concepts/da/UltraPlan.md +1 -1
- package/concepts/de/UltraPlan.md +1 -1
- package/concepts/en/UltraPlan.md +1 -1
- package/concepts/es/UltraPlan.md +1 -1
- package/concepts/fr/UltraPlan.md +1 -1
- package/concepts/it/UltraPlan.md +1 -1
- package/concepts/ja/UltraPlan.md +1 -1
- package/concepts/ko/UltraPlan.md +1 -1
- package/concepts/no/UltraPlan.md +1 -1
- package/concepts/pl/UltraPlan.md +1 -1
- package/concepts/pt-BR/UltraPlan.md +1 -1
- package/concepts/ru/UltraPlan.md +1 -1
- package/concepts/th/UltraPlan.md +1 -1
- package/concepts/tr/UltraPlan.md +1 -1
- package/concepts/uk/UltraPlan.md +1 -1
- package/concepts/zh/UltraPlan.md +1 -1
- package/concepts/zh-TW/UltraPlan.md +1 -1
- package/dist/assets/App-DJ4yNvwz.css +1 -0
- package/dist/assets/App-DPRn6oGn.js +2 -0
- package/dist/assets/{MdxEditorPanel-3j8rS3IT.js → MdxEditorPanel-Ci4ldhd7.js} +1 -1
- package/dist/assets/{MdxEditorPanel-Dpn-4ydO.css → MdxEditorPanel-DTfdj6GS.css} +1 -1
- package/dist/assets/Mobile-Dq-KcO1s.js +1 -0
- package/dist/assets/ProxyStatsModal-CUFpqt1s.js +1 -0
- package/dist/assets/{_baseUniq-B3e4JaL0.js → _baseUniq-CwQykUuc.js} +1 -1
- package/dist/assets/{arc-DnoPn_qY.js → arc-EdUdBxtG.js} +1 -1
- package/dist/assets/{architectureDiagram-Q4EWVU46-DrPKTbxH.js → architectureDiagram-Q4EWVU46-DtBIdElY.js} +1 -1
- package/dist/assets/{blockDiagram-DXYQGD6D-CEaO0Vcw.js → blockDiagram-DXYQGD6D-guNZIKkZ.js} +1 -1
- package/dist/assets/{c4Diagram-AHTNJAMY-BLaawFeg.js → c4Diagram-AHTNJAMY-xV5vB-Z9.js} +1 -1
- package/dist/assets/{channel-DnYR1fF4.js → channel-DYEktNap.js} +1 -1
- package/dist/assets/{chunk-4BX2VUAB-Bfd4edKZ.js → chunk-4BX2VUAB-ZTkItpvj.js} +1 -1
- package/dist/assets/{chunk-4TB4RGXK-t2nMQmY7.js → chunk-4TB4RGXK-dYIewyyR.js} +1 -1
- package/dist/assets/{chunk-55IACEB6-C6tLOjGX.js → chunk-55IACEB6-CSsPNgPX.js} +1 -1
- package/dist/assets/{chunk-EDXVE4YY-dWCvxbCb.js → chunk-EDXVE4YY-CnMiuqzQ.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-BHELZLPK.js → chunk-FMBD7UC4-CVpATPZ3.js} +1 -1
- package/dist/assets/{chunk-OYMX7WX6-C8XTkH1S.js → chunk-OYMX7WX6-Dpq4s8dW.js} +1 -1
- package/dist/assets/{chunk-QZHKN3VN-CD0j6SAs.js → chunk-QZHKN3VN-Bnojh6X6.js} +1 -1
- package/dist/assets/{chunk-YZCP3GAM-D4dKfXJJ.js → chunk-YZCP3GAM-BYqK4Dsa.js} +1 -1
- package/dist/assets/classDiagram-6PBFFD2Q-ClGF33bF.js +1 -0
- package/dist/assets/classDiagram-v2-HSJHXN6E-ClGF33bF.js +1 -0
- package/dist/assets/clone-CFj55h49.js +1 -0
- package/dist/assets/{cose-bilkent-S5V4N54A-BF2HsiSD.js → cose-bilkent-S5V4N54A-OJ7mmWyV.js} +1 -1
- package/dist/assets/{dagre-KV5264BT-f3h967yx.js → dagre-KV5264BT-B1Kwd_Rk.js} +1 -1
- package/dist/assets/{diagram-5BDNPKRD-B9PzHQfh.js → diagram-5BDNPKRD-D8qrw8sp.js} +1 -1
- package/dist/assets/{diagram-G4DWMVQ6-kR953Bqm.js → diagram-G4DWMVQ6-ip-N4ho8.js} +1 -1
- package/dist/assets/{diagram-MMDJMWI5-DAewa2eg.js → diagram-MMDJMWI5-2PZaskUF.js} +1 -1
- package/dist/assets/{diagram-TYMM5635-C8HNTH6I.js → diagram-TYMM5635-CeAOQUZP.js} +1 -1
- package/dist/assets/{erDiagram-SMLLAGMA-BQ5P8wWK.js → erDiagram-SMLLAGMA-BCBaEYEb.js} +1 -1
- package/dist/assets/{flowDiagram-DWJPFMVM-BIpEkrMR.js → flowDiagram-DWJPFMVM-CsGyIqcX.js} +1 -1
- package/dist/assets/{ganttDiagram-T4ZO3ILL-CWqSfB5v.js → ganttDiagram-T4ZO3ILL-COsj3FZ-.js} +1 -1
- package/dist/assets/{gitGraphDiagram-UUTBAWPF-Ba-9yEbQ.js → gitGraphDiagram-UUTBAWPF-DvQVQGJG.js} +1 -1
- package/dist/assets/{graph-D3zXKQ6P.js → graph-BSB9fDSP.js} +1 -1
- package/dist/assets/index-BLzca-ta.css +1 -0
- package/dist/assets/{index-G3xd-gLo.js → index-BRw4Iz2O.js} +1 -1
- package/dist/assets/{index-DClD_EkN.js → index-Bo-12bug.js} +1 -1
- package/dist/assets/{index-DSd5P3WQ.js → index-BuVComcY.js} +1 -1
- package/dist/assets/{index-HLrnYsI1.js → index-CNNAYjkF.js} +1 -1
- package/dist/assets/index-Ci38xZiX.js +2 -0
- package/dist/assets/{index-Bm3A5VLb.js → index-DKufsAzx.js} +1 -1
- package/dist/assets/{index-C9N0rZ7Z.js → index-DXBfwPYD.js} +1 -1
- package/dist/assets/{index-Q8wp4Nof.js → index-eM2ih5n7.js} +1 -1
- package/dist/assets/{infoDiagram-42DDH7IO-Cxm79ZJR.js → infoDiagram-42DDH7IO-eNucS4iW.js} +1 -1
- package/dist/assets/{ishikawaDiagram-UXIWVN3A-Cd0vZP1B.js → ishikawaDiagram-UXIWVN3A-Dxxj-gUX.js} +1 -1
- package/dist/assets/{journeyDiagram-VCZTEJTY-B2b57HXk.js → journeyDiagram-VCZTEJTY-yJJzVEBb.js} +1 -1
- package/dist/assets/{jszip.min-Bj5uiEb2.js → jszip.min-ByI0ds5u.js} +1 -1
- package/dist/assets/{kanban-definition-6JOO6SKY-YCERiUCO.js → kanban-definition-6JOO6SKY-2rfTi2zw.js} +1 -1
- package/dist/assets/{layout-Do5TlO2U.js → layout-DTmHj0Wm.js} +1 -1
- package/dist/assets/{linear-BiJNTDgN.js → linear-BOA3a9FE.js} +1 -1
- package/dist/assets/{mermaid.core-Dg0McRZt.js → mermaid.core-5H-NR79H.js} +3 -3
- package/dist/assets/{min-T51iefht.js → min-CpjFTEec.js} +1 -1
- package/dist/assets/{mindmap-definition-QFDTVHPH-Cu_GJxY3.js → mindmap-definition-QFDTVHPH-B8KCjFgB.js} +1 -1
- package/dist/assets/{pieDiagram-DEJITSTG-DldHHZXi.js → pieDiagram-DEJITSTG-BARy96g5.js} +1 -1
- package/dist/assets/{quadrantDiagram-34T5L4WZ-BzyTPNAJ.js → quadrantDiagram-34T5L4WZ-DYoTapuI.js} +1 -1
- package/dist/assets/{requirementDiagram-MS252O5E-C5xxFkvG.js → requirementDiagram-MS252O5E-EeANLLK2.js} +1 -1
- package/dist/assets/{sankeyDiagram-XADWPNL6-OxdjoaE1.js → sankeyDiagram-XADWPNL6-DmQ-YVPj.js} +1 -1
- package/dist/assets/seqResourceLoaders-B0p7e_lM.js +2 -0
- package/dist/assets/seqResourceLoaders-BsMFNfvR.css +41 -0
- package/dist/assets/{sequenceDiagram-FGHM5R23-C7c89uIS.js → sequenceDiagram-FGHM5R23-SZtW0rYC.js} +1 -1
- package/dist/assets/{stateDiagram-FHFEXIEX-ssdJnDrO.js → stateDiagram-FHFEXIEX-CEygsIld.js} +1 -1
- package/dist/assets/{stateDiagram-v2-QKLJ7IA2-BP-0WClK.js → stateDiagram-v2-QKLJ7IA2-BU1XPhBe.js} +1 -1
- package/dist/assets/{timeline-definition-GMOUNBTQ-sWScEpSM.js → timeline-definition-GMOUNBTQ-DhPBaQBt.js} +1 -1
- package/dist/assets/{vendor-antd-DKIytXho.js → vendor-antd-CS_S2mBN.js} +1 -1
- package/dist/assets/{vendor-codemirror-4qgXq03k.js → vendor-codemirror-B5l-VbBO.js} +1 -1
- package/dist/assets/{vendor-mdxeditor-D5Z5D9fq.js → vendor-mdxeditor-Cz09a1_I.js} +2 -2
- package/dist/assets/{vendor-qrcode-B7lb5qk1.js → vendor-qrcode-qbbntD6-.js} +1 -1
- package/dist/assets/{vendor-virtuoso-BqoXlbhH.js → vendor-virtuoso-Sk8fQ4Hx.js} +1 -1
- package/dist/assets/{vennDiagram-DHZGUBPP-DNfXR0ge.js → vennDiagram-DHZGUBPP-NniTHxDw.js} +1 -1
- package/dist/assets/{wardley-RL74JXVD-JXd--CRD.js → wardley-RL74JXVD-D9SNOrDw.js} +1 -1
- package/dist/assets/{wardleyDiagram-NUSXRM2D-DHmNyVPM.js → wardleyDiagram-NUSXRM2D-DvHXKNza.js} +1 -1
- package/dist/assets/{xychartDiagram-5P7HB3ND-CTb0gltZ.js → xychartDiagram-5P7HB3ND-CaiwPTQB.js} +1 -1
- package/dist/index.html +5 -5
- package/package.json +1 -1
- package/server/interceptor.js +192 -24
- package/server/lib/ask/ask-store.js +7 -3
- package/server/lib/async-file-lock.js +29 -5
- package/server/lib/auth.js +71 -54
- package/server/lib/chat-queue.js +67 -4
- package/server/lib/config-backup.js +8 -5
- package/server/lib/credential-access.js +233 -0
- package/server/lib/credential-migrate.js +147 -0
- package/server/lib/credential-store.js +120 -0
- package/server/lib/credential-vault.js +112 -0
- package/server/lib/file-access-policy.js +16 -0
- package/server/lib/git-diff.js +49 -20
- package/server/lib/im/im-config.js +81 -31
- package/server/lib/im-deny.js +22 -8
- package/server/lib/json-store.js +264 -0
- package/server/lib/log-watcher.js +9 -1
- package/server/lib/prefs-store.js +8 -33
- package/server/lib/same-origin.js +22 -0
- package/server/lib/session-pin-store.js +7 -14
- package/server/lib/v2/convert.js +1 -1
- package/server/lib/v2/layout.js +53 -3
- package/server/lib/v2/live-feed.js +41 -4
- package/server/lib/v2/resume-list.js +150 -0
- package/server/lib/v2/session-select.js +63 -14
- package/server/lib/v2/v2-writer.js +172 -34
- package/server/lib/v2/view-router.js +83 -0
- package/server/lib/view-root.js +209 -0
- package/server/pty-manager.js +809 -163
- package/server/routes/ask-perm.js +21 -1
- package/server/routes/auth.js +21 -1
- package/server/routes/events.js +123 -7
- package/server/routes/expert.js +46 -14
- package/server/routes/files-content.js +72 -7
- package/server/routes/files-fs.js +28 -3
- package/server/routes/git.js +31 -5
- package/server/routes/im.js +15 -2
- package/server/routes/preferences.js +59 -46
- package/server/routes/project-meta.js +32 -3
- package/server/routes/proxy-stats.js +33 -5
- package/server/routes/resume.js +457 -0
- package/server/routes/search.js +23 -1
- package/server/routes/skills.js +18 -2
- package/server/routes/v2.js +6 -1
- package/server/routes/workspaces.js +18 -5
- package/server/server.js +199 -25
- package/server/system-prompt-templates/presets/GLM-5.2.md +0 -1
- package/server/system-prompt-templates/presets/GLM-5.3.md +0 -1
- package/server/system-prompt-templates/presets/Qwen-3.md +0 -1
- package/server/system-prompt-templates/presets/deepseek-v4-flash.md +0 -1
- package/server/system-prompt-templates/presets/deepseek-v4-pro.md +0 -1
- package/server/system-prompt-templates/presets/kimi-k2.7-code.md +0 -1
- package/server/system-prompt-templates/presets/kimi-k3.md +1 -1
- package/server/system-prompt-templates/systemPromptModel.md +0 -1
- package/server/workspace-registry.js +150 -75
- package/ultraAgents/code-expert.json +1 -1
- package/dist/assets/App-M61pqQEx.css +0 -1
- package/dist/assets/App-_HfxMJvv.js +0 -2
- package/dist/assets/Mobile-DaRLB7Gh.js +0 -1
- package/dist/assets/ProxyStatsModal-dlPIDlx-.js +0 -1
- package/dist/assets/classDiagram-6PBFFD2Q-BecPAAuk.js +0 -1
- package/dist/assets/classDiagram-v2-HSJHXN6E-BecPAAuk.js +0 -1
- package/dist/assets/clone-B0_ghF3F.js +0 -1
- package/dist/assets/index-CjbBUDGP.js +0 -2
- package/dist/assets/index-Nvk8r3tO.css +0 -1
- package/dist/assets/seqResourceLoaders-B_FSQh3U.css +0 -41
- package/dist/assets/seqResourceLoaders-hqLhsiGO.js +0 -2
|
@@ -1,42 +1,31 @@
|
|
|
1
1
|
// Workspace Registry - 工作区持久化管理
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { dirSizeSync } from './lib/v2/layout.js';
|
|
2
|
+
import { readdir, stat, readFile } from 'node:fs/promises';
|
|
3
|
+
import { statSync } from 'node:fs';
|
|
4
|
+
import { mutateJson, readJsonSafe, writeJsonAtomic } from './lib/json-store.js';
|
|
5
|
+
import { dirSizeAsync } from './lib/v2/layout.js';
|
|
7
6
|
import { isDiscardableSession } from './lib/v2/session-select.js';
|
|
8
|
-
import { join, basename, resolve } from 'node:path';
|
|
7
|
+
import { join, basename, resolve, dirname } from 'node:path';
|
|
9
8
|
import { randomBytes } from 'node:crypto';
|
|
10
9
|
import { LOG_DIR } from '../findcc.js';
|
|
11
10
|
|
|
11
|
+
// 与 stats-worker.js 的磁盘缓存对齐(2026-10-08):getWorkspaces 富化时优先读
|
|
12
|
+
// LOG_DIR/<project>/<project>.json 的 files["sessions/<sid>"],以 journalSize+lastModified
|
|
13
|
+
// 作新鲜度 key;命中即跳过 dirSizeSync。版本不一致或 key 缺失则回退到实时遍历。
|
|
14
|
+
// 版本号必须与 stats-worker.js 的 STATS_VERSION 保持一致,否则旧缓存被错误信任。
|
|
15
|
+
const STATS_CACHE_VERSION = 12;
|
|
16
|
+
|
|
12
17
|
// 动态获取(LOG_DIR 可能在运行时被 setLogDir 修改)
|
|
13
18
|
function getWorkspacesFile() { return join(LOG_DIR, 'workspaces.json'); }
|
|
14
|
-
function getLockFile() { return join(LOG_DIR, 'workspaces.lock'); }
|
|
15
19
|
|
|
16
20
|
export function loadWorkspaces() {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const data = JSON.parse(readFileSync(getWorkspacesFile(), 'utf-8'));
|
|
20
|
-
return Array.isArray(data.workspaces) ? data.workspaces : [];
|
|
21
|
-
} catch {
|
|
22
|
-
return [];
|
|
23
|
-
}
|
|
21
|
+
const data = readJsonSafe(getWorkspacesFile(), {});
|
|
22
|
+
return Array.isArray(data.workspaces) ? data.workspaces : [];
|
|
24
23
|
}
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
writeFileSync(tmpFile, JSON.stringify({ workspaces: list }, null, 2));
|
|
31
|
-
|
|
32
|
-
// Windows 上 renameSync 可能会因为目标文件存在或被占用而失败。统一走 server/lib/file-api.js
|
|
33
|
-
// renameSyncWithRetry helper(同款重试策略,跟 interceptor / log-management 一致)。
|
|
34
|
-
renameSyncWithRetry(tmpFile, getWorkspacesFile());
|
|
35
|
-
} catch (err) {
|
|
36
|
-
console.error('[CC Viewer] Failed to save workspaces:', err.message);
|
|
37
|
-
// 尝试清理临时文件
|
|
38
|
-
try { unlinkSync(tmpFile); } catch { }
|
|
39
|
-
}
|
|
25
|
+
// Full-list rewrite on every mutation; non-secret so no 0600 (mode:false → umask).
|
|
26
|
+
// Atomicity + cross-process mutex come from mutateJson below.
|
|
27
|
+
function _saveWorkspaces(list) {
|
|
28
|
+
return { workspaces: list };
|
|
40
29
|
}
|
|
41
30
|
|
|
42
31
|
// 失效 file-access-policy 的 allowlist roots 缓存。lazy import 避免循环依赖。
|
|
@@ -47,10 +36,10 @@ function _invalidatePolicyCache() {
|
|
|
47
36
|
}
|
|
48
37
|
|
|
49
38
|
export async function registerWorkspace(absolutePath) {
|
|
50
|
-
const result = await
|
|
39
|
+
const result = await mutateJson(getWorkspacesFile(), (data) => {
|
|
51
40
|
const resolvedPath = resolve(absolutePath);
|
|
52
41
|
const projectName = basename(resolvedPath).replace(/[^a-zA-Z0-9_\-\.]/g, '_');
|
|
53
|
-
|
|
42
|
+
let list = Array.isArray(data.workspaces) ? data.workspaces : [];
|
|
54
43
|
// Windows NTFS 不分大小写——`C:\App` 跟 `c:\app` 是同目录但 `===` 视为不同。
|
|
55
44
|
// 仅 Win 下小写化比较;POSIX 保持原样不引入回归。
|
|
56
45
|
const pathEq = (a, b) => process.platform === 'win32' ? a.toLowerCase() === b.toLowerCase() : a === b;
|
|
@@ -58,9 +47,22 @@ export async function registerWorkspace(absolutePath) {
|
|
|
58
47
|
if (existing) {
|
|
59
48
|
existing.lastUsed = new Date().toISOString();
|
|
60
49
|
existing.projectName = projectName;
|
|
61
|
-
|
|
50
|
+
data.workspaces = list;
|
|
62
51
|
return existing;
|
|
63
52
|
}
|
|
53
|
+
// Gentle self-heal (2026-10-05): a same-name entry whose path no longer
|
|
54
|
+
// exists (moved/deleted checkout residue) is pruned on register — otherwise
|
|
55
|
+
// the collision makes view-root's no-live-PTY branch 400. Same-name entries
|
|
56
|
+
// whose path still exists are kept (never auto-delete user data).
|
|
57
|
+
// Only ENOENT/ENOTDIR count as "gone": existsSync() also returns false on
|
|
58
|
+
// EIO/EACCES/EPERM/a transiently unmounted volume, which must NOT prune a
|
|
59
|
+
// legitimate workspace.
|
|
60
|
+
const isGone = (p) => {
|
|
61
|
+
try { statSync(p); return false; }
|
|
62
|
+
catch (e) { return e && (e.code === 'ENOENT' || e.code === 'ENOTDIR'); }
|
|
63
|
+
};
|
|
64
|
+
list = list.filter(w =>
|
|
65
|
+
w.projectName !== projectName || pathEq(w.path, resolvedPath) || !isGone(w.path));
|
|
64
66
|
const now = new Date().toISOString();
|
|
65
67
|
const entry = {
|
|
66
68
|
id: randomBytes(6).toString('hex'),
|
|
@@ -70,66 +72,139 @@ export async function registerWorkspace(absolutePath) {
|
|
|
70
72
|
createdAt: now,
|
|
71
73
|
};
|
|
72
74
|
list.push(entry);
|
|
73
|
-
|
|
75
|
+
data.workspaces = list;
|
|
74
76
|
return entry;
|
|
75
|
-
}, { ensureDir: LOG_DIR });
|
|
77
|
+
}, { mode: false, fallback: {}, ensureDir: LOG_DIR });
|
|
76
78
|
_invalidatePolicyCache();
|
|
77
79
|
return result;
|
|
78
80
|
}
|
|
79
81
|
|
|
80
82
|
export async function removeWorkspace(id) {
|
|
81
|
-
const result = await
|
|
82
|
-
const list =
|
|
83
|
+
const result = await mutateJson(getWorkspacesFile(), (data) => {
|
|
84
|
+
const list = Array.isArray(data.workspaces) ? data.workspaces : [];
|
|
83
85
|
const filtered = list.filter(w => w.id !== id);
|
|
84
86
|
if (filtered.length !== list.length) {
|
|
85
|
-
|
|
87
|
+
data.workspaces = filtered;
|
|
86
88
|
return true;
|
|
87
89
|
}
|
|
88
90
|
return false;
|
|
89
|
-
}, { ensureDir: LOG_DIR });
|
|
91
|
+
}, { mode: false, fallback: {}, ensureDir: LOG_DIR });
|
|
90
92
|
if (result) _invalidatePolicyCache();
|
|
91
93
|
return result;
|
|
92
94
|
}
|
|
93
95
|
|
|
94
|
-
|
|
96
|
+
// Legacy sync save entry kept for any direct caller: writes the full list atomically via the
|
|
97
|
+
// kernel (non-secret → umask). mkdirSync is handled inside writeJsonAtomic.
|
|
98
|
+
export function saveWorkspaces(list) {
|
|
99
|
+
try {
|
|
100
|
+
writeJsonAtomic(getWorkspacesFile(), _saveWorkspaces(list), { mode: false });
|
|
101
|
+
} catch (err) {
|
|
102
|
+
console.error('[CC Viewer] Failed to save workspaces:', err.message);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export async function getWorkspaces(opts = {}) {
|
|
107
|
+
const limit = Number.isFinite(opts.limit) && opts.limit > 0 ? Math.floor(opts.limit) : null;
|
|
95
108
|
const list = loadWorkspaces();
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
109
|
+
// 先按 lastUsed 降序(几乎免费,只是 8.5 KB JSON 的内存排序),再切片、再富化。
|
|
110
|
+
// 不调换顺序的话:全量富化 40 个工作区 ≈ 3.3s;先切片后富化,limit=5 ≈ 200ms。
|
|
111
|
+
const sorted = list.slice().sort((a, b) => new Date(b.lastUsed) - new Date(a.lastUsed));
|
|
112
|
+
const total = sorted.length;
|
|
113
|
+
const toEnrich = limit ? sorted.slice(0, limit) : sorted;
|
|
114
|
+
// 一次性读出涉及项目的 stats 磁盘缓存(每个项目一次读盘,富化期全部命中内存)。
|
|
115
|
+
// Map + Promise.all 的 has/set 不防重:同一 projectName 的多个 entry 在 await 之前都通过 has 检查,
|
|
116
|
+
// 导致重复读盘。先 Set 去重再读。
|
|
117
|
+
const uniqueProjects = [...new Set(toEnrich.map((w) => w.projectName))];
|
|
118
|
+
const cacheByProject = new Map();
|
|
119
|
+
await Promise.all(uniqueProjects.map(async (projectName) => {
|
|
120
|
+
cacheByProject.set(projectName, await _readStatsCache(projectName));
|
|
121
|
+
}));
|
|
122
|
+
const enriched = await Promise.all(toEnrich.map((w) => _enrichWorkspace(w, cacheByProject.get(w.projectName))));
|
|
123
|
+
return { workspaces: enriched, total };
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* 读一个工作区的 stats 磁盘缓存(若存在且版本匹配)。
|
|
128
|
+
* 缓存 schema:LOG_DIR/<project>/<project>.json 的 files["sessions/<sid>"] = {
|
|
129
|
+
* size, journalSize, lastModified, ...
|
|
130
|
+
* },以 (journalSize, lastModified) 作新鲜度 key —— session 文件一变动,journal.jsonl
|
|
131
|
+
* 的 size/mtime 就变,缓存自然 miss 走实时遍历。
|
|
132
|
+
* 返回 files 对象;失败/版本不匹配返回 null(调用方整体回退到实时遍历)。
|
|
133
|
+
*/
|
|
134
|
+
async function _readStatsCache(projectName) {
|
|
135
|
+
// 防御:projectName 来自 workspaces.json(用户可手改),registerWorkspace 写入时只保证
|
|
136
|
+
// basename 级别消毒。若 workspaces.json 被改成包含 '/' / '\\' / '..' 的 projectName,
|
|
137
|
+
// 这里的 join 会越出 LOG_DIR。命中即拒,回退到实时遍历(性能降级但安全)。
|
|
138
|
+
if (typeof projectName !== 'string'
|
|
139
|
+
|| projectName.includes('/')
|
|
140
|
+
|| projectName.includes('\\')
|
|
141
|
+
|| projectName.includes('..')) {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
const statsFile = join(LOG_DIR, projectName, `${projectName}.json`);
|
|
146
|
+
const raw = await readFile(statsFile, 'utf-8');
|
|
147
|
+
const parsed = JSON.parse(raw);
|
|
148
|
+
if (!parsed || parsed._v !== STATS_CACHE_VERSION || !parsed.files || typeof parsed.files !== 'object') return null;
|
|
149
|
+
return parsed.files;
|
|
150
|
+
} catch {
|
|
151
|
+
return null; // 缓存不存在/损坏都算 miss,调用方走实时路径
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* 富化单个工作区的日志统计。命中 stats 缓存的 session 直接用缓存的 size;
|
|
157
|
+
* 未命中的 session 用 dirSizeAsync 异步递归(不阻塞事件循环,SSE/PTY 不再被冻结)。
|
|
158
|
+
* isDiscardableSession 仍是同步调用 —— 它只读 meta.json + 扫 journal 头几行,
|
|
159
|
+
* 远比 dirSizeSync 便宜;完全异步化留作后续。
|
|
160
|
+
*/
|
|
161
|
+
async function _enrichWorkspace(w, statsCache) {
|
|
162
|
+
// wire-v2 (1.7.0): logs live in per-session dirs under sessions/. The v1
|
|
163
|
+
// *.jsonl glob is kept as unmigratedV1Count — the combined logCount must
|
|
164
|
+
// stay non-zero for a declined-migration workspace, because the launcher's
|
|
165
|
+
// `logCount > 0 → auto -c` heuristic hangs off it (WorkspaceList.jsx).
|
|
166
|
+
let sessionCount = 0;
|
|
167
|
+
let unmigratedV1Count = 0;
|
|
168
|
+
let totalSize = 0;
|
|
169
|
+
const logDir = join(LOG_DIR, w.projectName);
|
|
170
|
+
try {
|
|
171
|
+
const files = await readdir(logDir);
|
|
172
|
+
for (const f of files) {
|
|
173
|
+
if (f.endsWith('.jsonl') && !f.endsWith('_temp.jsonl')) {
|
|
174
|
+
unmigratedV1Count++;
|
|
175
|
+
try { totalSize += (await stat(join(logDir, f))).size; } catch { }
|
|
112
176
|
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
177
|
+
}
|
|
178
|
+
} catch { }
|
|
179
|
+
try {
|
|
180
|
+
const sids = await readdir(join(logDir, 'sessions'), { withFileTypes: true });
|
|
181
|
+
for (const e of sids) {
|
|
182
|
+
if (!e.isDirectory()) continue;
|
|
183
|
+
const sessionDir = join(logDir, 'sessions', e.name);
|
|
184
|
+
const unitKey = `sessions/${e.name}`;
|
|
185
|
+
try {
|
|
186
|
+
const journalStat = await stat(join(sessionDir, 'journal.jsonl'));
|
|
187
|
+
// 缓存命中条件与 stats-worker 相同:journalSize + lastModified 双 key。
|
|
188
|
+
// 命中即非 discardable(stats-worker v11+ 的缓存条目写入前已过滤 probe-only session),
|
|
189
|
+
// 所以命中路径可以跳过 isDiscardableSession 的同步读 —— 省 ~200ms(实测 1787 session 的
|
|
190
|
+
// 热路径成本)。未命中再走原顺序:先判 probe,再递归 dirSizeAsync。
|
|
191
|
+
const cached = statsCache?.[unitKey];
|
|
192
|
+
const lastModified = journalStat.mtime.toISOString();
|
|
193
|
+
if (cached && cached.journalSize === journalStat.size && cached.lastModified === lastModified && typeof cached.size === 'number') {
|
|
194
|
+
totalSize += cached.size;
|
|
128
195
|
sessionCount++;
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
// Quota-probe orphans must not count: logCount>0 drives the
|
|
199
|
+
// auto -c heuristic, and a probe-only workspace would auto-continue
|
|
200
|
+
// into a conversation that does not exist (2026-07-16).
|
|
201
|
+
if (isDiscardableSession(sessionDir)) continue;
|
|
202
|
+
// Folder size, not journal size — conv/blob/response files carry
|
|
203
|
+
// most of a session's bytes (journal alone undercounts ~12x).
|
|
204
|
+
totalSize += await dirSizeAsync(sessionDir);
|
|
205
|
+
sessionCount++;
|
|
206
|
+
} catch { /* dir without a journal is not a session yet */ }
|
|
207
|
+
}
|
|
208
|
+
} catch { }
|
|
209
|
+
return { ...w, logCount: sessionCount + unmigratedV1Count, sessionCount, unmigratedV1Count, totalSize };
|
|
135
210
|
}
|
|
@@ -41,5 +41,5 @@
|
|
|
41
41
|
"tr": "Kıdemli mühendis: çoklu ajan keşfi, plan incelemesi ve yüksek kaliteli uygulama — kod incelemesi, yeniden düzenleme, performans, sürdürülebilirlik.",
|
|
42
42
|
"uk": "Senior-інженер: багатоагентне дослідження, рев'ю плану та якісна реалізація — рев'ю коду, рефакторинг, продуктивність, супровід."
|
|
43
43
|
},
|
|
44
|
-
"content": "<system-reminder>\n[SCOPED INSTRUCTION] The following instructions apply only to the next 1–3 interactions. Once the task is complete, these instructions should gradually decrease in priority and no longer affect subsequent interactions. You should be adept at utilizing tools such as `AskUserQuestion`, `EnterPlanMode`, and `TeamCreate`, rather than relying solely on plain text processing. Before execution, you must ensure that the `EnterPlanMode`, `ExitPlanMode`, `SendMessage`, `TaskCreate`, `TaskUpdate`, `TaskStop`, `TaskGet`, `TaskOutput` and `TaskList` tools are loaded.\n\nPre-requisite: Use `AskUserQuestion` to clarify user intent whenever the request is ambiguous (target element, interaction style, scope of platforms, etc.). Skip only if the intent is unambiguous.\n\nLeverage a multi-agent exploration mechanism to formulate a highly detailed implementation plan.\n\nInstructions:\n1. Use the `Agent` tool to spawn parallel agents that simultaneously explore different aspects of the codebase:\n- If necessary, assign a preliminary researcher to use the `webSearch` tool to first investigate cutting-edge solutions in the relevant industry domain;\n- One agent responsible for understanding the relevant existing code and architecture;\n- One agent responsible for identifying all files that need to be modified;\n- One agent responsible for identifying potential risks, edge cases, and dependencies;\n- You may add other roles or deploy additional agents beyond the three listed above; the maximum number of concurrently dispatched agents is 5.\n\n2. Synthesize the findings from all agents into a detailed, step-by-step implementation plan.\n\n3. Use the `Agent` tool to spawn 2-3 review agents that examine the plan from different perspectives, checking for missing steps, potential risks, or corresponding mitigation strategies.\n\n4. Integrate the feedback gathered during the review process, then call `ExitPlanMode` to submit your final plan.\n\n5. Once `ExitPlanMode` returns a result:\n- If approved: proceed to execute the plan within this session.\n- If rejected: revise the plan based on the feedback provided and call `ExitPlanMode` again.\n- If an error occurs (including receiving a \"Not in Plan Mode\" message): do **not** follow the suggestions provided in the error message; instead, prompt the user for further instructions.\n\nYour final plan must include the following elements:\n- A clear summary of the implementation strategy;\n- An ordered list of files to be created or modified, with precise details of the required changes for each file;\n- A step-by-step execution sequence;\n- Testing and validation procedures;\n- Potential risks and their corresponding mitigation strategies;\n\n6. After the final plan has been successfully executed:\nFirst run `git diff --quiet && git diff --cached --quiet` (or equivalent) to detect whether the working tree actually has non-trivial changes; if there are no real changes (or only whitespace/comment-only edits), skip the UltraReview step.\nOtherwise, if the project is managed with Git:\nInitiate a team (`TeamCreate`), dynamically allocating the number of teammates based on task complexity (5 is recommended);\nIf the `TeamCreate` tool is unavailable, spawn teammates directly with the `Agent` tool (note: as teammates, not plain subagents);\nTask: Conduct a Code Review of the current git changes from multiple perspectives;\nPre-requisites:\n- The git repository may be located in a subdirectory of the current directory; prefer `git rev-parse --show-toplevel` (fall back to recursive lookup) before proceeding;\n- In the case of multiple repositories, tasks may be executed separately;\nThe team's goal is to analyze the current Git change log and validate each modification from different perspectives, specifically including:\n- Whether requirements/objectives have been met and functionality is complete;\n- Whether newly added code introduces side effects, breaks existing functionality, or poses potential risks;\n- Code quality: naming, readability, complexity, technical debt, maintainability;\n- Testing and documentation: whether there is adequate test coverage, and whether critical logic has necessary comments or documentation;\n- Dependencies and compatibility: whether new dependencies or version compatibility issues have been introduced;\nWorkflow:\n- Each teammate, according to their own role, covers the review dimensions one by one and independently outputs a report;\n- After consolidating the reports, perform a cross-review to identify conflicts or shared concerns;\n- Distill specific, actionable modification suggestions and annotate them with priority levels (P0/P1/P2/P3);\n- Upon completion, adopt P0 items
|
|
44
|
+
"content": "<system-reminder>\n[SCOPED INSTRUCTION] The following instructions apply only to the next 1–3 interactions. Once the task is complete, these instructions should gradually decrease in priority and no longer affect subsequent interactions. You should be adept at utilizing tools such as `AskUserQuestion`, `EnterPlanMode`, and `TeamCreate`, rather than relying solely on plain text processing. Before execution, you must ensure that the `EnterPlanMode`, `ExitPlanMode`, `SendMessage`, `TaskCreate`, `TaskUpdate`, `TaskStop`, `TaskGet`, `TaskOutput` and `TaskList` tools are loaded.\n\nPre-requisite: Use `AskUserQuestion` to clarify user intent whenever the request is ambiguous (target element, interaction style, scope of platforms, etc.). Skip only if the intent is unambiguous.\n\nLeverage a multi-agent exploration mechanism to formulate a highly detailed implementation plan.\n\nInstructions:\n1. Use the `Agent` tool to spawn parallel agents that simultaneously explore different aspects of the codebase:\n- If necessary, assign a preliminary researcher to use the `webSearch` tool to first investigate cutting-edge solutions in the relevant industry domain;\n- One agent responsible for understanding the relevant existing code and architecture;\n- One agent responsible for identifying all files that need to be modified;\n- One agent responsible for identifying potential risks, edge cases, and dependencies;\n- You may add other roles or deploy additional agents beyond the three listed above; the maximum number of concurrently dispatched agents is 5.\n\n2. Synthesize the findings from all agents into a detailed, step-by-step implementation plan.\n\n3. Use the `Agent` tool to spawn 2-3 review agents that examine the plan from different perspectives, checking for missing steps, potential risks, or corresponding mitigation strategies.\n\n4. Integrate the feedback gathered during the review process, then call `ExitPlanMode` to submit your final plan.\n\n5. Once `ExitPlanMode` returns a result:\n- If approved: proceed to execute the plan within this session.\n- If rejected: revise the plan based on the feedback provided and call `ExitPlanMode` again.\n- If an error occurs (including receiving a \"Not in Plan Mode\" message): do **not** follow the suggestions provided in the error message; instead, prompt the user for further instructions.\n\nYour final plan must include the following elements:\n- A clear summary of the implementation strategy;\n- An ordered list of files to be created or modified, with precise details of the required changes for each file;\n- A step-by-step execution sequence;\n- Testing and validation procedures;\n- Potential risks and their corresponding mitigation strategies;\n\n6. After the final plan has been successfully executed:\nFirst run `git diff --quiet && git diff --cached --quiet` (or equivalent) to detect whether the working tree actually has non-trivial changes; if there are no real changes (or only whitespace/comment-only edits), skip the UltraReview step.\nOtherwise, if the project is managed with Git:\nInitiate a team (`TeamCreate`), dynamically allocating the number of teammates based on task complexity (5 is recommended);\nIf the `TeamCreate` tool is unavailable, spawn teammates directly with the `Agent` tool (note: as teammates, not plain subagents);\nTask: Conduct a Code Review of the current git changes from multiple perspectives;\nPre-requisites:\n- The git repository may be located in a subdirectory of the current directory; prefer `git rev-parse --show-toplevel` (fall back to recursive lookup) before proceeding;\n- In the case of multiple repositories, tasks may be executed separately;\nThe team's goal is to analyze the current Git change log and validate each modification from different perspectives, specifically including:\n- Whether requirements/objectives have been met and functionality is complete;\n- Whether newly added code introduces side effects, breaks existing functionality, or poses potential risks;\n- Code quality: naming, readability, complexity, technical debt, maintainability;\n- Testing and documentation: whether there is adequate test coverage, and whether critical logic has necessary comments or documentation;\n- Dependencies and compatibility: whether new dependencies or version compatibility issues have been introduced;\nWorkflow:\n- Each teammate, according to their own role, covers the review dimensions one by one and independently outputs a report;\n- After consolidating the reports, perform a cross-review to identify conflicts or shared concerns;\n- Distill specific, actionable modification suggestions and annotate them with priority levels (P0/P1/P2/P3);\n- Upon completion, adopt P0 items; adopt P1 and P2 items selectively based on evaluation; disregard P3 items.\n- After execution is complete, close the team (`TeamDelete`);\n- If the `TeamDelete` tool is unavailable, notify each teammate to exit individually;\n</system-reminder>"
|
|
45
45
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._liveTag_8g4c3_3{position:relative;display:inline-flex;align-items:center;justify-content:flex-start;border-radius:999px;border:1px solid;border-color:var(--ctx-color);color:var(--ctx-color);padding:0 10px;height:100%;font-size:12px;line-height:1;overflow:hidden;transition:border-color .3s,color .3s;white-space:nowrap;background:var(--bg-base-pure)}._liveTagFill_8g4c3_23{position:absolute;left:0;top:0;bottom:0;width:var(--ctx-percent, 0);background-color:var(--ctx-color);background-image:repeating-linear-gradient(135deg,rgba(255,255,255,.25) 0,rgba(255,255,255,.25) 2px,transparent 2px,transparent 7px);opacity:.35;transition:width .5s ease,background-color .3s;pointer-events:none}._liveTagContent_8g4c3_44{position:relative;z-index:1;display:inline-flex;align-items:center}._liveTagHistory_8g4c3_52{background:var(--bg-surface);border-color:var(--border-light);color:var(--text-primary)}._liveTagText_8g4c3_59{margin-left:4px;font-variant-numeric:tabular-nums}._cachePopoverPlaceholder_8g4c3_65{min-width:300px}._modeRow_fpcoi_1{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:10px}._modeLeft_fpcoi_9{display:flex;align-items:center;gap:10px}._modeRight_fpcoi_15{display:flex;align-items:center;gap:8px}._overrideWarn_fpcoi_22{font-size:12px;color:var(--color-warning, #d4810a)}._previewLabel_fpcoi_27{font-size:13px;color:var(--text-secondary, #888)}._previewBox_fpcoi_36{border:1px solid var(--border-primary);border-radius:8px;background:transparent;padding:12px 14px;min-height:320px;max-height:60vh;overflow:auto}._previewEmpty_fpcoi_46{font-size:13px;color:var(--text-secondary, #888)}._hint_fpcoi_51{margin-top:10px;font-size:12px;color:var(--text-secondary, #888);line-height:1.6}._dirLine_fpcoi_58{word-break:break-all}._warn_fpcoi_62{margin-top:10px;font-size:12px;color:var(--color-warning, #d4810a)}._tabRow_fpcoi_71{display:flex;align-items:flex-end;gap:8px;padding:0 4px;flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}._tabRow_fpcoi_71::-webkit-scrollbar{display:none}._tabBtn_fpcoi_90{display:inline-flex;align-items:center;gap:5px;padding:9px 14px;font-size:12px;line-height:1.6;border:1px solid transparent;border-radius:14px;background:transparent;color:var(--text-secondary);cursor:pointer;transition:all .2s;-webkit-user-select:none;user-select:none;white-space:nowrap;flex-shrink:0}._tabBtn_fpcoi_90:hover{color:var(--color-primary)}._tabBtn_fpcoi_90:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}._tabBtn_fpcoi_90._tabActive_fpcoi_118{background:var(--bg-container);color:var(--color-primary);border-color:var(--border-primary);border-bottom-color:var(--bg-container);border-radius:10px 10px 0 0;font-weight:500;margin-bottom:-1px;position:relative;z-index:1}._tabRow_fpcoi_71>._tabBtn_fpcoi_90._tabActive_fpcoi_118,._tabWrap_fpcoi_132:has(>._tabBtn_fpcoi_90._tabActive_fpcoi_118){position:sticky;left:0;right:0;z-index:2}[data-theme=light] ._tabBtn_fpcoi_90._tabActive_fpcoi_118{box-shadow:0 -3px 8px #0000000f}._editorBox_fpcoi_33{background:var(--bg-container);border-radius:8px;overflow:hidden;padding:4px;position:relative}[data-theme=light] ._editorBox_fpcoi_33{box-shadow:0 3px 8px #00000014}._editorBox_fpcoi_33 .ant-input{background:transparent;border:1px solid var(--border-primary);border-radius:8px;box-shadow:none;padding:12px 14px;font-size:12px;line-height:1.5;color:var(--text-primary)}._editorBox_fpcoi_33 .ant-input:hover{border-color:var(--border-primary);background:transparent}._editorBox_fpcoi_33 .ant-input:focus{border-color:var(--color-primary-pale);box-shadow:none}._editorBox_fpcoi_33 .ant-input[disabled]{color:var(--text-muted);background:transparent}._tabWrap_fpcoi_132{position:relative;display:inline-flex;align-items:center;flex-shrink:0}._tabTitle_fpcoi_199{white-space:nowrap}._tabDelete_fpcoi_204{position:absolute;top:2px;inset-inline-end:4px;width:14px;height:14px;border-radius:50%;background:var(--bg-elevated);border:1px solid var(--border-primary);color:var(--text-secondary);font-size:10px;line-height:1;display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:0;transition:opacity .15s;z-index:2}._tabWrap_fpcoi_132:hover ._tabDelete_fpcoi_204{opacity:1}._tabDelete_fpcoi_204:hover{color:var(--color-error, #d4380d);border-color:var(--color-error, #d4380d)}@media(max-width:768px){._tabDelete_fpcoi_204{opacity:1}}._addBtn_fpcoi_237{display:inline-flex;align-items:center;align-self:center;gap:5px;padding:6px 14px;font-size:12px;line-height:1.6;margin-left:4px;margin-bottom:2px;border:none;border-radius:14px;background:transparent;color:var(--text-muted);cursor:pointer;transition:background .15s,color .15s;-webkit-user-select:none;user-select:none;white-space:nowrap;flex-shrink:0}._addBtn_fpcoi_237:hover{color:var(--color-primary);background:var(--bg-surface)}._addBtn_fpcoi_237:disabled{cursor:not-allowed;opacity:.5}[data-theme=light] ._addBtn_fpcoi_237{color:var(--text-secondary)}._scopeBadge_fpcoi_270{font-size:10px;line-height:1.4;padding:0 4px;border-radius:6px;background:var(--bg-surface);color:var(--text-muted)}._scopeBadgeDisabled_fpcoi_280{color:var(--color-warning, #d48806)}._tabBtn_fpcoi_90._tabDisabled_fpcoi_285{opacity:.55}._builtinScopeRow_fpcoi_290{display:inline-flex;align-items:center;gap:6px;margin-left:12px}._dirtyDot_fpcoi_298{width:6px;height:6px;border-radius:50%;background:var(--color-primary);flex-shrink:0}._titleRow_fpcoi_307{display:inline-flex;align-items:center;gap:8px}._helpBtn_fpcoi_315{align-self:center;width:16px;height:16px;border-radius:50%;border:1px solid var(--border-primary);background:var(--bg-elevated);color:var(--text-secondary);font-size:11px;line-height:1;display:inline-flex;align-items:center;justify-content:center;cursor:help;flex-shrink:0;-webkit-user-select:none;user-select:none}._helpBtn_fpcoi_315:hover{color:var(--color-primary);border-color:var(--color-primary)}._paramDocBtn_fpcoi_338{align-self:center;height:18px;padding:0 8px;border-radius:999px;border:1px solid var(--border-primary);background:var(--bg-elevated);color:var(--text-secondary);font-size:11px;font-weight:400;line-height:1;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;-webkit-user-select:none;user-select:none;white-space:nowrap;max-width:40vw;overflow:hidden;text-overflow:ellipsis}._paramDocBtn_fpcoi_338:hover{color:var(--color-primary);border-color:var(--color-primary)}._paramDocBtn_fpcoi_338:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}._docBox_fpcoi_370{max-height:65vh;overflow:auto;font-size:13px;line-height:1.6}._docIntro_fpcoi_379{color:var(--text-secondary);font-size:12px;line-height:1.6;margin:0 0 12px;padding-bottom:10px;border-bottom:1px solid var(--border-primary)}._addModalBody_fpcoi_389{display:flex;flex-direction:column;gap:14px;margin-top:4px}._addModalField_fpcoi_395{display:flex;flex-direction:column;gap:6px}._fieldLabelRow_fpcoi_400{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--text-secondary, #888)}._addError_fpcoi_408{font-size:12px;color:var(--color-error, #d4380d)}._presetSelect_fpcoi_412,._addNameAutoComplete_fpcoi_416{width:100%}._presetMatched_fpcoi_419{font-size:11px;color:var(--color-text-secondary, #888)}._editButton_1r9yr_10{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;background:transparent;border:none;padding:0 2px;margin-left:4px;cursor:pointer;font-size:inherit;line-height:1;color:var(--text-secondary, #888);opacity:0;border-radius:3px;transition:opacity .12s ease,color .12s ease,background-color .12s ease}._editButton_1r9yr_10 .anticon{display:inline-flex;align-items:center;line-height:1;position:relative;top:-1px}._editButton_1r9yr_10:hover,._editButton_1r9yr_10:focus-visible{opacity:1;color:var(--text-primary, #333);background-color:var(--bg-hover, rgba(0, 0, 0, .04));outline:none}._editButton_1r9yr_10:focus-visible{box-shadow:0 0 0 2px var(--focus-ring, rgba(64, 158, 255, .4))}._footer_1r9yr_55{display:flex;justify-content:space-between;align-items:center;gap:8px}._footerLeft_1r9yr_61,._footerRight_1r9yr_65{display:flex;gap:8px}._projectNameRow_1r9yr_70{display:flex;align-items:center;gap:8px;margin-bottom:12px;padding:6px 10px;background:var(--bg-secondary, rgba(0, 0, 0, .03));border-radius:4px;font-size:12px}._projectNameLabel_1r9yr_80{color:var(--text-secondary, #888)}._projectNameValue_1r9yr_83{color:var(--text-primary, #333);font-family:var(--font-mono);word-break:break-all}._panel_1nxl3_1{display:flex;flex-direction:column;gap:14px}._required_1nxl3_7{margin-left:2px;color:var(--color-error-light, #ff7b7b)}._optional_1nxl3_12{margin-left:6px;font-size:12px;font-weight:400;color:var(--text-secondary)}._row_1nxl3_19{display:flex;align-items:center;justify-content:space-between;gap:12px}._label_1nxl3_26{font-size:14px;font-weight:500}._control_1nxl3_31{display:inline-flex;align-items:center;gap:10px}._field_1nxl3_37{display:flex;flex-direction:column;gap:6px}._fieldLabel_1nxl3_43{font-size:13px;color:var(--text-secondary)}._help_1nxl3_48{font-size:12px;color:var(--text-secondary);line-height:1.4}._warn_1nxl3_54{font-size:12px;line-height:1.5;color:var(--color-error-light, #ff7b7b)}._hint_1nxl3_60{font-size:12px;line-height:1.5;color:var(--text-secondary)}._helpIcon_1nxl3_67{margin-left:6px;color:var(--text-tertiary, #999);cursor:help;font-size:13px}._detailsToggle_1nxl3_74{display:inline-flex;align-items:center;gap:5px;align-self:flex-start;padding:0;border:none;background:none;cursor:pointer;font-size:12px;color:var(--text-secondary)}._detailsToggle_1nxl3_74:hover{color:var(--text-primary, var(--text-secondary))}._details_1nxl3_74{display:flex;flex-direction:column;gap:10px}._actions_1nxl3_98{display:flex;justify-content:flex-end;gap:10px;margin-top:16px;padding-top:16px;border-top:1px solid var(--border-secondary)}._testBtn_1nxl3_108{margin-right:auto}._tabRow_1q32a_4{display:flex;align-items:flex-end;gap:6px;padding:0 8px;flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}._tabRow_1q32a_4::-webkit-scrollbar{display:none}._tabBtn_1q32a_24{display:inline-flex;align-items:center;gap:7px;padding:8px 16px;font-size:14px;line-height:1.5;border:1px solid transparent;border-radius:10px;background:transparent;color:var(--text-secondary);cursor:pointer;transition:color .18s,border-color .18s,background .18s;white-space:nowrap;flex-shrink:0;-webkit-user-select:none;user-select:none}._tabBtn_1q32a_24:hover{color:var(--color-primary)}._tabBtn_1q32a_24._tabBtnActive_1q32a_52,._tabBtn_1q32a_24._tabBtnActive_1q32a_52:hover{background:var(--bg-container);color:var(--color-primary);border-color:var(--border-primary);border-bottom:2px solid var(--bg-container);border-radius:10px 10px 0 0;font-weight:500;margin-bottom:-1px;position:relative;z-index:2}._toolBody_1q32a_8{border:1px solid var(--border-primary);border-top:none;border-radius:8px;background:var(--bg-container);padding:18px 20px;min-width:0}[data-theme=light] ._toolBody_1q32a_8{box-shadow:0 3px 8px #00000014}[data-theme=light] ._tabBtnActive_1q32a_52{box-shadow:0 -3px 8px #0000000f}[data-theme=dark] ._toolBody_1q32a_8 .ant-input,[data-theme=dark] ._toolBody_1q32a_8 .ant-input-affix-wrapper,[data-theme=dark] ._toolBody_1q32a_8 .ant-select-selector{background-color:var(--bg-elevated)}._scrollBody_mzpnt_1{height:100%;box-sizing:border-box;overflow-y:auto;overflow-x:hidden;scrollbar-gutter:stable;padding:4px 2px;background:var(--bg-container)}._headerBar_mzpnt_15{display:flex;align-items:center;gap:8px}._refreshBtn_mzpnt_21{flex:0 0 auto}._statusTag_mzpnt_27{display:inline-flex;align-items:center;gap:8px;margin-left:auto}._statusTag_mzpnt_27 .ant-tag{margin-inline-end:0}._center_mzpnt_38{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:40px 0;color:var(--text-secondary)}._hint_mzpnt_48{color:var(--text-secondary);font-size:13px}._chip_dnl8s_4{position:relative;line-height:0;cursor:pointer;-webkit-user-select:none;user-select:none;transition:opacity .15s}._chip_dnl8s_4:hover{opacity:.75}._logo_dnl8s_16{display:block;transition:color .15s}._connecting_dnl8s_22{opacity:.5}._dotError_dnl8s_27{position:absolute;right:-2px;top:-2px;width:6px;height:6px;border-radius:50%;background:var(--color-error, #ff4d4f);pointer-events:none}._dotReconnecting_dnl8s_39{position:absolute;right:-2px;top:-2px;width:6px;height:6px;border-radius:50%;background:var(--color-warning, #f59e0b);pointer-events:none;animation:_imDotPulse_dnl8s_1 1.2s ease-in-out infinite}@keyframes _imDotPulse_dnl8s_1{0%,to{opacity:1}50%{opacity:.3}}@media(prefers-reduced-motion:reduce){._dotReconnecting_dnl8s_39{animation:none}}._modelCard_1tsd3_3{border:1px solid var(--border-secondary);border-radius:6px;padding:8px 10px;background:var(--bg-container)}._modelName_1tsd3_9{font-size:13px;font-weight:600;color:var(--text-primary);margin-bottom:8px;padding-bottom:4px;border-bottom:1px solid var(--border-secondary)}._statsTable_1tsd3_17{width:100%;border-collapse:collapse}._th_1tsd3_21{padding:2px 12px;font-size:12px;font-family:var(--font-mono);white-space:nowrap;color:var(--text-tertiary);font-weight:400;text-align:right}._td_1tsd3_30{padding:2px 12px;font-size:12px;font-family:var(--font-mono);white-space:nowrap;color:var(--text-primary);text-align:right}._label_1tsd3_38{padding:2px 12px;font-size:12px;font-family:var(--font-mono);white-space:nowrap;color:var(--text-light);font-weight:400;text-align:left}._rowBorder_1tsd3_47{border-bottom:1px solid var(--border-primary)}._rebuildTotalRow_1tsd3_50{border-top:1px solid var(--border-light)}._rebuildTotalRow_1tsd3_50 td{font-weight:600}._cachePopoverEmpty_1tsd3_56{padding:8px 4px;color:var(--text-tertiary);font-size:13px}._toolChipGrid_1tsd3_61{display:flex;flex-wrap:wrap;gap:4px;padding:2px 0 6px 2px}._cacheToolChip_1tsd3_67{font-size:11px;padding:0 6px;border-radius:3px;background:var(--bg-surface);color:var(--text-secondary);line-height:18px;max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border:1px solid var(--border-primary);cursor:help}._titleIcon_1tsd3_81{margin-right:8px}._detailMarkdownCard_1tsd3_86{border:1px solid var(--border-secondary);border-radius:6px;padding:8px 10px;background:var(--bg-container)}._memoryMarkdown_1tsd3_93{font-size:12.5px;line-height:1.55;color:var(--text-primary);word-break:break-word}._memoryMarkdown_1tsd3_93 p{margin:0 0 6px}._memoryMarkdown_1tsd3_93 ul,._memoryMarkdown_1tsd3_93 ol{margin:4px 0 6px;padding-left:20px}._memoryMarkdown_1tsd3_93 li{margin:2px 0}._memoryMarkdown_1tsd3_93 h1,._memoryMarkdown_1tsd3_93 h2,._memoryMarkdown_1tsd3_93 h3,._memoryMarkdown_1tsd3_93 h4{font-size:13px;font-weight:600;margin:8px 0 4px;color:var(--text-primary)}._memoryMarkdown_1tsd3_93 h1{font-size:14px}._memoryMarkdown_1tsd3_93 a{color:var(--primary-color, #1677ff);text-decoration:none;cursor:pointer}._memoryMarkdown_1tsd3_93 a:hover{text-decoration:underline}._memoryMarkdown_1tsd3_93 code{font-family:var(--font-mono);font-size:12px;padding:1px 4px;border-radius:3px;background:var(--bg-surface);color:var(--text-primary)}._memoryMarkdown_1tsd3_93 pre{margin:6px 0;padding:8px 10px;border-radius:4px;background:var(--bg-surface);overflow-x:auto}._memoryMarkdown_1tsd3_93 pre code{padding:0;background:transparent;font-size:12px}._memoryMarkdown_1tsd3_93 blockquote{margin:4px 0;padding:2px 8px;border-left:3px solid var(--border-hover);color:var(--text-secondary)}._memoryMarkdown_1tsd3_93 hr{margin:8px 0;border:none;border-top:1px solid var(--border-secondary)}._quickMenuGroup_1tsd3_164{position:relative}._quickMenuRow_1tsd3_168{display:flex;align-items:center;gap:6px;width:100%;background:none;border:none;color:var(--text-primary);font-size:13px;padding:6px 12px;text-align:left;cursor:pointer;border-radius:4px;white-space:nowrap}._quickMenuGroup_1tsd3_164:hover ._quickMenuRow_1tsd3_168,._quickMenuGroupOpen_1tsd3_185 ._quickMenuRow_1tsd3_168{background:var(--border-secondary)}._quickMenuRowIcon_1tsd3_189{display:flex;align-items:center;color:var(--text-tertiary)}._quickMenuRowIcon_1tsd3_189 svg{width:14px;height:14px}._quickMenuLabel_1tsd3_200{flex:1}._quickMenuValue_1tsd3_205{color:var(--text-tertiary);font-size:12px}._quickMenuCaret_1tsd3_210{color:var(--text-tertiary);font-size:10px}._quickMenuSubWrap_1tsd3_218{display:none;position:absolute;left:100%;bottom:-5px;padding-left:6px;z-index:1}._quickMenuGroupOpen_1tsd3_185 ._quickMenuSubWrap_1tsd3_218{display:block}._quickMenuSub_1tsd3_218{display:flex;flex-direction:column;background:var(--bg-elevated);border:1px solid var(--border-hover);border-radius:8px;padding:4px;min-width:76px;max-height:60vh;overflow-y:auto;box-shadow:0 6px 16px #0000002e}._quickMenuOption_1tsd3_248{background:none;border:none;color:var(--text-primary);font-size:13px;padding:5px 12px;text-align:left;cursor:pointer;border-radius:4px;white-space:nowrap}._quickMenuOption_1tsd3_248:hover{background:var(--border-secondary)}._quickMenuOption_1tsd3_248._quickMenuOptionActive_1tsd3_264{color:var(--color-primary);font-weight:500}._headerBar_jseur_2{display:flex;align-items:center;justify-content:space-between;width:100%;height:100%}._logoWrap_jseur_10{display:inline-flex;align-items:center;position:relative;margin-top:14px}._logoWrapActive_jseur_17:after{content:"";position:absolute;top:-10px;bottom:-10px;left:0;right:-200px}._logoImage_jseur_26{height:24px;width:24px;border-radius:3px;vertical-align:middle;opacity:.75;transition:opacity .2s;cursor:pointer}._logoImageActive_jseur_36{opacity:1}._compactBtn_jseur_43{font-size:12px;height:30px;display:inline-flex;align-items:center;justify-content:center}._compactBtnNoBorder_jseur_52{width:30px;height:30px;min-width:30px;padding:0;border:none;font-size:18px;line-height:1;display:inline-flex;align-items:center;justify-content:center}._compactBtnNoBorder_jseur_52 .anticon{display:inline-flex;align-items:center;justify-content:center;line-height:0}._headerProjectName_jseur_79{font-size:12px;color:inherit;white-space:nowrap}._headerProjectName_jseur_79:hover [data-alias-edit-trigger],._headerProjectName_jseur_79:focus-within [data-alias-edit-trigger]{opacity:.55}._countdownStrong_jseur_96{font-variant-numeric:tabular-nums}._qrcodePopover_jseur_101{display:flex;flex-direction:column;align-items:center;padding:8px}._qrcodeSection_jseur_108{display:flex;flex-direction:column;align-items:center;padding:16px;margin-bottom:12px;border:1px solid var(--border-secondary);border-radius:8px;background:var(--bg-container)}._qrcodeTitle_jseur_119{font-size:14px;font-weight:600;color:var(--text-primary);margin-bottom:12px}._qrcodeUrlInput_jseur_126{margin-top:12px;font-size:12px;font-family:var(--font-mono)}._qrcodeUrlCopy_jseur_132{cursor:pointer;color:var(--text-tertiary);transition:color .2s}._qrcodeUrlCopy_jseur_132:hover{color:var(--color-primary-light)}._authSection_jseur_143{display:flex;flex-direction:column;align-items:stretch;box-sizing:border-box;width:100%;margin-top:12px;padding:12px;border:1px solid var(--border-secondary);border-radius:8px;background:var(--bg-container);gap:8px}._authHeaderRow_jseur_157{display:flex;align-items:center;justify-content:space-between}._authTitle_jseur_163{font-size:13px;font-weight:600;color:var(--text-primary)}._authPasswordLabel_jseur_169{font-size:12px;color:var(--text-secondary)}._authPasswordInput_jseur_174{font-size:12px;font-family:var(--font-mono)}._authSaveBtn_jseur_179{align-self:flex-end}._authEmptyWarn_jseur_183{font-size:12px;color:var(--color-error-light);line-height:1.4}._settingsGroupBox_jseur_191{border:1px solid var(--border-secondary);border-radius:8px;background:var(--bg-container);padding:4px 16px;margin-bottom:12px}._settingsGroupTitle_jseur_199{font-size:14px;font-weight:600;color:var(--text-primary);padding:12px 0 4px;border-bottom:1px solid var(--border-secondary)}._settingsItem_jseur_208{display:flex;justify-content:space-between;align-items:center;padding:12px 0}._settingsLabel_jseur_215{font-size:14px}._settingsHelpIcon_jseur_220{font-size:16px;color:var(--text-disabled);cursor:help;margin-left:4px}._settingsDivider_jseur_227{border-top:1px solid var(--border-primary);margin:12px 0}._logDirInput_jseur_232{margin-top:8px;background:var(--bg-base-alt);border-color:var(--border-light);color:var(--text-primary);font-family:var(--font-mono);font-size:13px}._claudeExecutableInput_jseur_241{width:100%;margin-top:8px;font-family:var(--font-mono);font-size:12px}._claudeExecutableHint_jseur_248{margin-top:6px;color:var(--text-tertiary);font-size:12px;line-height:1.5;overflow-wrap:anywhere}._tokenStatsEmpty_jseur_257{padding:8px 4px;color:var(--text-tertiary);font-size:13px}._tokenStatsContainer_jseur_264{display:flex;gap:12px;align-items:flex-start}._tokenStatsColumn_jseur_270{min-width:240px}._toolStatsColumn_jseur_274{min-width:180px}._modelCardSpaced_jseur_280{margin-bottom:10px}._rebuildCard_jseur_289{border:1px solid var(--border-secondary);border-radius:6px;padding:8px 10px;margin-top:10px;background:var(--bg-container)}._promptExportBar_jseur_298{margin-bottom:12px}._promptScrollArea_jseur_302{max-height:500px;overflow:auto}._promptEmpty_jseur_307{color:var(--text-tertiary);padding:12px}._promptTimestamp_jseur_313{color:var(--text-muted);font-size:12px;margin:12px 0 4px;padding-bottom:6px}._textPromptCard_jseur_321{margin:4px 0;background:var(--bg-container);border-radius:6px;border:1px solid var(--border-secondary);padding:10px 14px}._preText_jseur_330{white-space:pre-wrap;word-break:break-word;font-size:13px;line-height:1.6;color:var(--text-primary);margin:4px 0}._systemCollapse_jseur_340{margin:4px 0;background:var(--bg-elevated);border:1px solid var(--border-secondary);border-radius:6px}._systemLabel_jseur_347{color:var(--text-tertiary);font-size:12px}._preSys_jseur_352{white-space:pre-wrap;word-break:break-word;font-size:12px;line-height:1.5;color:var(--text-tertiary);margin:0}._promptTextarea_jseur_362{box-sizing:border-box;background:var(--bg-base-pure);width:100%;min-height:400px;color:var(--text-primary);font-family:var(--font-mono);font-size:13px;line-height:1.6;border:none;resize:vertical;padding:10px 14px;outline:none}._projectStatsCenter_jseur_378{display:flex;justify-content:center;padding:40px 0}._projectStatsEmpty_jseur_384{color:var(--text-tertiary);padding:40px 0;text-align:center;font-size:13px}._projectStatsContent_jseur_391{display:flex;flex-direction:column;gap:16px}._projectStatsUpdated_jseur_397{color:var(--text-muted);font-size:12px;text-align:right}._projectStatsSummary_jseur_403{display:grid;grid-template-columns:1fr 1fr;gap:10px}._projectStatCard_jseur_409{background:var(--bg-container);border:1px solid var(--border-secondary);border-radius:8px;padding:14px 12px;text-align:center}._projectStatValue_jseur_417{font-size:22px;font-weight:700;color:var(--text-primary);font-family:var(--font-mono);font-variant-numeric:tabular-nums}._projectStatLabel_jseur_425{font-size:12px;color:var(--text-tertiary);margin-top:4px}._projectStatsSection_jseur_431{display:flex;flex-direction:column;gap:10px}._projectStatsSectionTitle_jseur_437{font-size:14px;font-weight:600;color:var(--text-secondary);padding-bottom:4px;border-bottom:1px solid var(--border-secondary)}._projectStatsModelCard_jseur_445{background:var(--bg-container);border:1px solid var(--border-secondary);border-radius:6px;padding:10px 12px}._projectStatsModelHeader_jseur_452{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;padding-bottom:4px;border-bottom:1px solid var(--border-secondary)}._projectStatsModelName_jseur_461{font-size:13px;font-weight:600;color:var(--text-primary)}._projectStatsModelCount_jseur_467{font-size:12px;color:var(--text-tertiary);font-family:var(--font-mono)}._cacheCopyBtn_jseur_475{font-size:14px;color:var(--text-tertiary);cursor:pointer;transition:color .2s;margin-left:8px}._cacheCopyBtn_jseur_475:hover{color:var(--text-primary)}._cacheTokenInfo_jseur_487{display:flex;align-items:center;font-size:12px;font-family:var(--font-mono);color:var(--text-light);margin-bottom:8px}._cacheCodeBlock_jseur_500{white-space:pre-wrap;word-break:break-word;font-size:12px;line-height:1.5;color:var(--text-secondary);background:var(--bg-container);border:1px solid var(--border-primary);border-radius:4px;padding:8px;margin:4px 0;font-family:var(--font-mono)}._cacheCodeBlockSystem_jseur_514{white-space:pre-wrap;word-break:break-word;font-size:12px;line-height:1.5;color:var(--text-secondary);background:var(--bg-code-system);border:1px solid var(--border-code-system);border-radius:4px;padding:8px;margin:4px 0;font-family:var(--font-mono)}._cacheNavBtn_jseur_528{margin-left:auto;font-size:11px;color:var(--color-primary);cursor:pointer;border:1px solid var(--color-primary);border-radius:3px;padding:1px 6px;white-space:nowrap}._cacheNavBtn_jseur_528:hover{background:var(--color-primary-bg-light)}._cacheNavList_jseur_543{width:600px;max-height:300px;overflow-y:auto}._cacheNavItem_jseur_549{padding:4px 8px;font-size:12px;color:var(--text-secondary);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-radius:3px}._cacheNavItem_jseur_549:hover{background:var(--color-primary-bg-lighter);color:var(--text-white)}._cacheBlockHighlight_jseur_565{box-shadow:0 0 10px var(--color-primary-shadow);transition:box-shadow .2s ease-in}._cacheBlockHighlightFading_jseur_570{box-shadow:0 0 10px transparent;transition:box-shadow 3s ease-out}._cacheBorderSvg_jseur_575{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;pointer-events:none;overflow:visible}._cacheBorderSvgFading_jseur_584{opacity:0;transition:opacity 3s ease-out}._cacheBorderRect_jseur_589{animation:_cacheDashRotate_jseur_1 4s linear infinite}@keyframes _cacheDashRotate_jseur_1{0%{stroke-dashoffset:0}to{stroke-dashoffset:-100}}._thLeft_jseur_599{text-align:left}._cacheWriteToken_jseur_614{color:var(--color-code-orange)}._cacheReadToken_jseur_618{color:var(--color-success)}._cacheCtxPercent_jseur_622{color:var(--text-tertiary);margin-left:6px}._qrcodeIcon_jseur_642{width:30px;height:30px;padding:6px;box-sizing:border-box;color:var(--text-secondary);cursor:pointer;border-radius:6px;transition:color .15s ease,background-color .15s ease;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;background:none;border:none}._qrcodeIcon_jseur_642:hover{color:var(--text-primary);background:var(--bg-hover, rgba(0, 0, 0, .04))}._qrcodeIcon_jseur_642:focus-visible{outline:2px solid var(--primary-color, #1677ff);outline-offset:1px}._approvalBell_jseur_668{position:relative;width:30px;height:30px;padding:6px;box-sizing:border-box;color:var(--color-warning, #faad14);cursor:pointer;border-radius:6px;transition:color .15s ease,background-color .15s ease;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;background:none;border:none}._approvalBell_jseur_668:hover{color:var(--text-primary);background:var(--bg-hover, rgba(0, 0, 0, .04))}._approvalBell_jseur_668:focus-visible{outline:2px solid var(--primary-color, #1677ff);outline-offset:1px}._approvalBellBadge_jseur_693{position:absolute;top:0;right:0;min-width:14px;height:14px;padding:0 3px;box-sizing:border-box;background:var(--color-error, #ff4d4f);color:#fff;font-size:9px;line-height:14px;border-radius:7px;text-align:center;font-weight:600}._proxySwapIcon_jseur_710{margin-right:4px;font-size:11px}._proxyProfileTag_jseur_716{border-radius:12px;background:var(--border-secondary);border:1px solid var(--border-light);color:var(--text-tertiary);font-size:12px;cursor:pointer;transition:color .2s,border-color .2s}._proxyProfileTag_jseur_716:hover{color:var(--text-secondary);border-color:var(--text-disabled)}._pinnedShortcut_jseur_732{height:24px;margin-top:11px;display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1;color:var(--text-tertiary);opacity:.75;cursor:pointer;transition:opacity .2s,color .2s}._pinnedShortcut_jseur_732:hover{opacity:1;color:var(--text-secondary)}._pinnedShortcut_jseur_732 .anticon{display:inline-flex;align-items:center;justify-content:center;line-height:0}._themeToggle_jseur_761{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;width:30px;height:30px;padding:0;border:none;border-radius:6px;background:transparent;color:var(--text-secondary);cursor:pointer;transition:background-color .2s ease,color .2s ease;flex-shrink:0;outline:none}._themeToggle_jseur_761:hover{background:var(--color-bg-hover, rgba(127, 127, 127, .12));color:var(--text-primary)}._themeToggle_jseur_761:focus-visible{box-shadow:0 0 0 2px var(--primary-color, #1677ff)}._themeToggleIcon_jseur_787{display:block}._headerRightRow_jseur_792 .ant-space-item{display:inline-flex;align-items:center}._headerCountdownTag_jseur_798{height:30px;margin:0;padding:0 10px;display:inline-flex;align-items:center;background:var(--bg-surface);border:1px solid var(--border-hover);border-radius:6px;line-height:1}._centerEmpty_1ivpu_1{display:flex;align-items:center;justify-content:center;height:100%}._scrollContainer_1ivpu_8{overflow:auto;height:100%;-webkit-overflow-scrolling:touch;will-change:scroll-position}._listItem_1ivpu_15{cursor:pointer;padding:8px 12px;border-left:6px solid transparent;border-right:1px solid var(--border-primary);border-top:1px solid transparent;border-bottom:1px solid var(--border-primary);transition:background .15s}._listItem_1ivpu_15:hover{border-left-color:var(--border-hover)}._listItemActive_1ivpu_29{background:var(--color-primary-bg-faint);border-left-color:var(--color-primary-light);border-right:1px solid var(--color-primary-light);border-top:1px solid var(--color-primary-light);border-bottom:1px solid var(--color-primary-light)}._listItemActive_1ivpu_29,._listItemActive_1ivpu_29:hover{background:var(--color-primary-bg-faint);border-left-color:var(--color-primary-light);border-right-color:var(--color-primary-light);border-top-color:var(--color-primary-light);border-bottom-color:var(--color-primary-light)}._itemContent_1ivpu_46{width:100%;min-width:0}._itemHeader_1ivpu_51{display:flex;align-items:center;gap:6px;margin-bottom:4px;font-size:12px}._tagNoMargin_1ivpu_59{margin:0;font-size:12px}._modelName_1ivpu_64{font-size:12px;color:var(--text-tertiary)}._modelNameMain_1ivpu_69{color:var(--color-code-orange)}._time_1ivpu_73{font-size:12px;color:var(--text-gray);margin-left:auto}._detailRow_1ivpu_79{display:flex;gap:8px;font-size:12px;align-items:center}._urlText_1ivpu_86{color:var(--text-disabled);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}._duration_1ivpu_95{color:var(--text-gray);flex-shrink:0}._statusOk_1ivpu_100{color:var(--color-success);opacity:.5;flex-shrink:0}._statusErr_1ivpu_106{color:var(--color-error);flex-shrink:0}._statusDefault_1ivpu_111{color:var(--text-tertiary);flex-shrink:0}._usageBox_1ivpu_116{background:var(--bg-container);border-radius:4px;padding:3px 6px;margin-top:4px;font-size:12px;color:var(--text-gray);line-height:1.6}._cacheDot_1ivpu_126{display:inline-block;width:6px;height:6px;border-radius:50%;margin:0 3px;vertical-align:middle}._cacheDotLoss_1ivpu_135{background-color:var(--color-red-dark-bg);cursor:help}._cacheDotNormal_1ivpu_140{background-color:var(--border-hover)}._cacheDotTools_1ivpu_145{background-color:var(--color-code-purple);box-shadow:0 0 0 1.5px var(--color-purple-border)}._tagMainAgent_1ivpu_150{color:var(--color-code-orange);border-color:var(--color-code-orange-border);background:var(--color-code-orange-bg)}._tagPlan_1ivpu_156{color:var(--color-error-muted);border-color:var(--color-error-muted);background-color:var(--bg-base-pure)}._tagMuted_1ivpu_162{color:var(--text-muted);border-color:var(--border-light);background-color:var(--bg-base-pure)}._tooltipPreLine_1ivpu_168{white-space:pre-line}._GzYRV{line-height:1.2;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}._3eOF8{margin-right:5px;font-weight:700}._3eOF8+._3eOF8{margin-left:-5px}._1MFti{cursor:pointer}._f10Tu{font-size:1.2em;margin-right:5px;-webkit-user-select:none;-moz-user-select:none;user-select:none}._1UmXx:after{content:"▸"}._1LId0:after{content:"▾"}._1pNG9{margin-right:5px}._1pNG9:after{content:"...";font-size:.8em}._2IvMF{background:#eee}._2bkNM{margin:0;padding:0 10px}._1BXBN{margin:0;padding:0}._1MGIk{font-weight:600;margin-right:5px;color:#000}._3uHL6{color:#000}._2T6PJ,._1Gho6{color:#df113a}._vGjyY{color:#2a3f3c}._1bQdo{color:#0b75f5}._3zQKs{color:#469038}._1xvuR{color:#43413d}._oLqym,._2AXVT,._2KJWg{color:#000}._11RoI{background:#002b36}._17H2C,._3QHg2,._3fDAz{color:#fdf6e3}._2bSDX{font-weight:bolder;margin-right:5px;color:#fdf6e3}._gsbQL{color:#fdf6e3}._LaAZe,._GTKgm{color:#81b5ac}._Chy1W{color:#cb4b16}._2bveF{color:#d33682}._2vRm-{color:#ae81ff}._1prJR{color:#268bd2}._container_b5r6a_1{background:var(--bg-container);border-radius:6px;border:1px solid var(--border-primary);padding:12px;font-size:13px;font-family:var(--font-mono);overflow:auto}._root_5oh1m_1{display:flex;height:100%;min-height:0;gap:0}._sidebar_5oh1m_9{width:220px;flex-shrink:0;border-right:1px solid var(--border-primary);overflow-y:auto;padding:4px 0;-webkit-overflow-scrolling:touch}._section_5oh1m_18{-webkit-user-select:none;user-select:none}._sectionHeader_5oh1m_22{display:flex;align-items:center;gap:6px;width:100%;padding:6px 10px;cursor:pointer;color:var(--text-primary);font-size:12px;font-weight:600;transition:background .15s;background:none;border:0;text-align:left;font:inherit}._sectionHeader_5oh1m_22:hover{background:var(--overlay-light-faint)}._sectionHeader_5oh1m_22:focus-visible{outline:1px solid var(--color-primary-outline);outline-offset:-1px}._arrow_5oh1m_48{font-size:10px;color:var(--text-tertiary);flex-shrink:0}._sectionTitle_5oh1m_54{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._sectionCount_5oh1m_62{font-size:11px;color:var(--text-muted);background:var(--bg-elevated);border-radius:10px;padding:0 6px;line-height:18px}._sectionBody_5oh1m_71{padding:2px 0}._historyToggle_5oh1m_76{display:flex;align-items:center;gap:6px;width:100%;padding:4px 10px 4px 14px;cursor:pointer;color:var(--text-muted);font-size:11px;transition:color .15s,background .15s;background:none;border:0;text-align:left;font:inherit}._historyToggle_5oh1m_76:hover{color:var(--text-tertiary);background:var(--overlay-light-faint)}._historyToggle_5oh1m_76:focus-visible{outline:1px solid var(--color-primary-outline);outline-offset:-1px}._historyToggleLabel_5oh1m_102{flex:1}._item_5oh1m_107{display:flex;align-items:center;justify-content:space-between;width:100%;padding:4px 9px 4px 23px;font-size:12px;color:var(--text-tertiary);cursor:pointer;transition:background .15s,color .15s;background:none;border:1px solid transparent;border-radius:4px;box-sizing:border-box;text-align:left;font:inherit}._item_5oh1m_107:hover{background:var(--overlay-light-faint);color:var(--text-primary)}._item_5oh1m_107:focus-visible{outline:1px solid var(--color-primary-outline);outline-offset:-1px}._itemActive_5oh1m_135,._itemActive_5oh1m_135:hover{background:var(--color-primary-bg-faint);color:var(--color-primary);border-color:var(--color-primary-light)}._itemContent_5oh1m_142{flex:1;min-width:0;overflow:hidden}._itemLabel_5oh1m_148{font-family:var(--font-mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}._itemSublabel_5oh1m_156{font-size:10px;color:var(--text-disabled);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:1px}._itemTime_5oh1m_165{font-size:9px;color:var(--text-disabled);flex-shrink:0;margin-left:4px;font-family:var(--font-mono)}._contentWrap_5oh1m_176{flex:1;min-width:0;display:flex;flex-direction:column}._content_5oh1m_174{flex:1;min-width:0;min-height:0;overflow:auto;padding:12px 16px;-webkit-overflow-scrolling:touch}._contentEmpty_5oh1m_192{height:100%;display:flex;align-items:center;justify-content:center}._contentInner_5oh1m_199{padding-bottom:20px}._emptyWrap_5oh1m_203{display:flex;align-items:center;justify-content:center;height:200px}._roleHeader_5oh1m_211{display:flex;align-items:center;gap:8px;margin-bottom:8px;flex-wrap:nowrap}._roleBadge_5oh1m_219{font-size:10px;font-weight:600;letter-spacing:.04em;padding:2px 7px;border-radius:4px;flex-shrink:0}._role_user_5oh1m_228{background:var(--color-primary-bg-lighter);color:var(--color-primary-lighter);border:1px solid var(--color-primary-bg-medium)}._role_assistant_5oh1m_234{background:var(--color-purple-bg);color:var(--color-code-purple);border:1px solid var(--color-purple-border)}._role_system_5oh1m_240{background:var(--color-warning-bg-faint);color:var(--color-warning);border:1px solid var(--color-warning-border-light)}._roleLabel_5oh1m_246{font-size:11px;color:var(--text-muted);flex:1;min-width:0}._contentTime_5oh1m_253{margin-left:auto;font-size:10px;color:var(--text-disabled);font-family:var(--font-mono);flex-shrink:0}._stepDivider_5oh1m_261{border:none;border-top:1px solid var(--border-primary);margin:14px 0}._textBlock_5oh1m_268{margin-bottom:8px;border:1px solid var(--border-primary);border-radius:6px;overflow:hidden}._textBlockBar_5oh1m_275{display:flex;align-items:center;gap:6px;padding:4px 10px;background:var(--bg-container);border-bottom:1px solid var(--border-primary)}._textBlockBody_5oh1m_284{padding:10px 12px;font-size:13px;line-height:1.7;color:var(--text-primary);word-break:break-word}._textBlockCompact_5oh1m_292{position:relative;padding:8px 10px;font-size:12px;color:var(--text-light)}._textBlockCompactFloat_5oh1m_299{float:right;margin-left:6px;margin-bottom:2px}._thinkingBlock_5oh1m_306{margin-bottom:8px;border:1px solid var(--color-thinking-border);border-radius:6px;overflow:hidden;background:var(--color-thinking-bg)}._thinkingHeader_5oh1m_314{display:flex;align-items:center;gap:6px;padding:5px 10px;cursor:pointer;font-size:12px;color:var(--text-tertiary);transition:background .15s}._thinkingHeader_5oh1m_314:hover{background:var(--overlay-light-faint)}._thinkingPreview_5oh1m_329{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-muted);font-size:11px}._thinkingBody_5oh1m_339{padding:8px 12px;border-top:1px solid var(--color-thinking-border)}._toolBlock_5oh1m_345{margin-bottom:8px;border:1px solid var(--border-primary);border-radius:6px;overflow:hidden}._toolBlockResult_5oh1m_352{border-color:var(--color-green-border)}._toolBlockError_5oh1m_356{border-color:var(--color-red-dark-border)}._toolBlockHeader_5oh1m_360{display:flex;align-items:center;gap:8px;padding:5px 10px;background:var(--bg-container);border-bottom:1px solid var(--border-primary);font-size:12px;flex-wrap:wrap}._toolBlockBody_5oh1m_371{padding:8px 10px;font-size:12px}._toolName_5oh1m_376{color:var(--text-primary);font-weight:500;font-family:var(--font-mono)}._toolId_5oh1m_382{color:var(--text-disabled);font-size:10px;font-family:var(--font-mono);margin-left:auto}._errorLabel_5oh1m_389{font-size:10px;color:var(--color-error-light);background:var(--color-error-bg-light);border:1px solid var(--color-error-border);border-radius:3px;padding:1px 5px}._blockTag_5oh1m_399{font-size:9px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;padding:1px 5px;border-radius:3px;background:var(--bg-elevated);color:var(--text-muted);border:1px solid var(--border-primary);flex-shrink:0}._blockTagText_5oh1m_412{background:var(--color-primary-bg-faint);color:var(--color-primary-lighter);border-color:var(--color-primary-bg-lighter)}._blockTagThinking_5oh1m_418{background:var(--color-warning-bg-faint);color:var(--color-warning);border-color:var(--color-warning-border-light)}._blockTagResult_5oh1m_424{background:var(--color-green-dark-bg);color:var(--color-success);border-color:var(--color-green-dark-border)}._blockTagError_5oh1m_430{background:var(--color-error-bg-faint);color:var(--color-error-light);border-color:var(--color-error-border-light)}._jsonBlock_5oh1m_437{margin-bottom:8px;border:1px solid var(--border-primary);border-radius:6px;overflow:hidden}._jsonBlockLabel_5oh1m_444{font-size:10px;color:var(--text-muted);padding:3px 10px;background:var(--bg-container);border-bottom:1px solid var(--border-primary);font-family:var(--font-mono)}._blockSeparator_5oh1m_454{border:none;border-top:1px solid var(--border-primary);margin:16px 0}._markdownBody_5oh1m_461{font-size:13px;line-height:1.7;color:var(--text-primary);word-break:break-word}._contentToolbar_5oh1m_469{display:flex;justify-content:flex-end;align-items:center;gap:8px;padding:8px 16px 0;flex-shrink:0}._contentToolbarLabel_5oh1m_478{font-size:11px;color:var(--text-muted)}._rawPre_5oh1m_484{background:var(--bg-code-dark);border:1px solid var(--border-primary);border-radius:6px;padding:12px;font-size:12px;color:var(--text-primary);white-space:pre-wrap;word-break:break-all;margin:0}._toolAdded_5oh1m_497{color:var(--color-success)}._toolRemoved_5oh1m_501{color:var(--color-error);text-decoration:line-through}._toolDiffTag_5oh1m_506{margin-left:6px;font-size:9px;font-family:var(--font-ui);text-decoration:none;opacity:.85}._toolDiffSummary_5oh1m_514{margin-left:6px;font-size:11px;font-family:var(--font-mono);display:inline-flex;gap:4px;flex-shrink:0}._toolDiffSummaryAdd_5oh1m_523{color:var(--color-success)}._toolDiffSummaryRemove_5oh1m_527{color:var(--color-error)}._container_1958y_1{height:100%;overflow:hidden;padding:0 16px;display:flex;flex-direction:column;background:var(--bg-base)}._emptyState_1958y_10{display:flex;align-items:center;justify-content:center;height:100%}._urlSection_1958y_17{padding:12px 0;border-bottom:1px solid var(--border-primary);display:flex;align-items:flex-start;flex-shrink:0}._urlLeft_1958y_25{flex:1;min-width:0}._tokenStatsBox_1958y_30{flex-shrink:0;padding-left:12px;display:flex;align-items:center}._tokenGrid_1958y_37{display:flex;border:1px solid var(--border-secondary);border-radius:6px;overflow:hidden;min-width:360px;font-size:11px;line-height:1.6}._tokenRows_1958y_47{flex:1}._tokenRow_1958y_47{display:flex}._tokenRowBorder_1958y_55{border-top:1px solid var(--border-secondary)}._tokenLabel_1958y_59{color:var(--text-tertiary);padding:4px 8px;white-space:nowrap;font-weight:600}._tokenTd_1958y_66{flex:1;color:var(--text-primary);text-align:right;padding:4px 8px;font-family:var(--font-mono);white-space:nowrap}._tokenHitRate_1958y_75{display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--text-primary);padding:4px 8px;font-family:var(--font-mono);white-space:nowrap;border-left:1px solid var(--border-secondary);min-width:100px}._tokenHitRateLabel_1958y_88{color:var(--text-tertiary);font-size:10px;font-family:var(--font-ui)}._tokenRowBorder_1958y_55 td{border-top:1px solid var(--border-secondary)}._urlText_1958y_98{color:var(--text-primary);font-size:13px;margin-bottom:8px;word-break:break-all}._metaText_1958y_105,._headersContainer_1958y_109{font-size:12px}._headerRow_1958y_113{display:flex;padding:4px 0;border-bottom:1px solid var(--border-primary)}._headerKey_1958y_119{min-width:200px;flex-shrink:0}._headerValue_1958y_124{word-break:break-all;margin-left:8px}._streamingBox_1958y_129{padding:20px;background:var(--bg-elevated);border-radius:6px;border:1px solid var(--border-primary)}._bodyToolbar_1958y_136{display:flex;gap:8px;margin-bottom:8px}._rawTextPre_1958y_142{background:var(--bg-code-dark);border:1px solid var(--border-primary);border-radius:6px;padding:12px;font-size:12px;color:var(--text-primary);overflow:auto;max-height:600px;white-space:pre-wrap;word-break:break-all}._tabContent_1958y_155{padding:16px 0 0;height:100%;overflow-y:auto;-webkit-overflow-scrolling:touch}._collapseSpacing_1958y_163{margin-bottom:16px}._bodyLabel_1958y_167{margin:0}._bodyHeader_1958y_171{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}._diffSection_1958y_178{margin-bottom:16px}._diffToggle_1958y_182{display:inline-block;margin-bottom:8px;cursor:pointer}._diffIcon_1958y_188{font-size:12px;margin-left:4px}._viewInChatBtn_1958y_193{display:inline-flex;align-items:center;height:26px;border-radius:13px;border:1px solid var(--border-light);background:#0000;color:var(--text-tertiary);cursor:pointer;font-size:12px;transition:all .2s;padding:0 10px;white-space:nowrap}._viewInChatBtn_1958y_193:hover{border-color:var(--text-muted);color:var(--text-primary);background:var(--overlay-light-faint)}._reminderSelect_1958y_214{min-width:140px;font-size:12px}._reminderSelect_1958y_214 .ant-select-selector.ant-select-selector{border-radius:2px;border-color:var(--border-light);background:#0000;min-height:26px;height:auto;padding:0 8px;font-family:var(--font-mono)}._reminderSelect_1958y_214 .ant-select-selection-placeholder{font-size:11px}._diffHeaderRow_1958y_233{display:flex;align-items:center;gap:8px}._diffSpaceRight_1958y_239{margin-left:auto}._reminderFilterWrapper_1958y_243{display:inline-flex;align-items:center;gap:4px}._reminderLabel_1958y_249{color:var(--text-tertiary);font-size:12px;font-family:var(--font-mono)}._cacheTabContent_1958y_255{padding-top:0;overflow:hidden}._userPromptList_1958y_260{width:600px;max-height:300px;overflow-y:auto}._userPromptItem_1958y_266{padding:4px 8px;font-size:12px;color:var(--text-secondary);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-radius:3px}._userPromptNavBtn_1958y_277{margin-left:auto;font-size:11px;color:var(--color-primary);cursor:pointer;border:1px solid var(--color-primary);border-radius:3px;padding:1px 6px;white-space:nowrap}._cacheContent_1958y_288{padding:8px 0;height:100%;display:flex;flex-direction:column}._cacheTokenBar_1958y_295{display:flex;align-items:center;font-size:12px;font-family:var(--font-mono);color:var(--text-light);margin-bottom:12px;flex-shrink:0}._cacheTokenWrite_1958y_305{color:var(--color-code-orange)}._cacheTokenRead_1958y_309{color:var(--color-success)}._cacheCopyIcon_1958y_313{margin-left:8px;cursor:pointer;color:var(--text-tertiary);transition:color .2s}._cacheScrollArea_1958y_320{flex:1;overflow-y:auto;min-height:0}._cacheSectionBlock_1958y_326{margin-bottom:12px}._cacheSectionHeader_1958y_330{font-size:13px;font-weight:600;color:var(--text-primary);margin-bottom:6px;cursor:pointer;-webkit-user-select:none;user-select:none;display:flex;align-items:center;gap:4px}._cacheCollapseArrow_1958y_342{display:inline-block;transition:transform .2s;font-size:10px}._cachePre_1958y_348{white-space:pre-wrap;word-break:break-word;font-size:12px;line-height:1.5;color:var(--text-secondary);background:var(--bg-container);border:1px solid var(--border-primary);border-radius:4px;padding:8px;margin:4px 0;font-family:var(--font-mono)}._cacheHighlightSvg_1958y_362{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;pointer-events:none;overflow:visible}._cachePreSystem_1958y_371{white-space:pre-wrap;word-break:break-word;font-size:12px;line-height:1.5;color:var(--text-secondary);background:var(--bg-code-system);border:1px solid var(--border-code-system);border-radius:4px;padding:8px;margin:4px 0;font-family:var(--font-mono)}._container_1958y_1 .ant-tabs>.ant-tabs-nav{margin-bottom:0}._container_1958y_1 .ant-tabs{flex:1;min-height:0;display:flex;flex-direction:column}._container_1958y_1 .ant-tabs>.ant-tabs-content-holder{flex:1;min-height:0}._container_1958y_1 .ant-tabs-content,._container_1958y_1 .ant-tabs-tabpane-active{height:100%}._resizer_pzn4b_1{width:6px;cursor:col-resize;background:var(--bg-elevated);flex-shrink:0;transition:background .2s}._resizer_pzn4b_1:hover{background:var(--color-primary-light)}._flag_1q4ri_3{display:inline-flex;align-items:center;justify-content:center;font-size:13px;line-height:1;cursor:help;-webkit-user-select:none;user-select:none;height:14px;background:none;border:none;padding:0;color:inherit;font-family:inherit}._flag_1q4ri_3:focus-visible{outline:2px solid var(--primary-color, #1677ff);outline-offset:2px;border-radius:2px}._popover_1q4ri_27{color:var(--text-secondary);font-size:13px;line-height:22px}._meta_1q4ri_33{color:var(--text-tertiary);font-size:12px}._usagePill_4carx_4{position:relative;display:inline-flex;align-items:center;justify-content:flex-start;border-radius:999px;border:1px solid;border-color:var(--text-disabled);color:var(--text-disabled);padding:0 7px;height:15px;font-size:11px;line-height:1;overflow:hidden;white-space:nowrap;cursor:default;background:var(--bg-base-pure)}._usageFill_4carx_12{position:absolute;left:0;top:0;bottom:0;width:var(--usage-percent, 0);background-color:#999;opacity:.2;transition:width .5s ease;pointer-events:none}._usageContent_4carx_38{position:relative;z-index:1;display:inline-flex;align-items:center}._usageText_4carx_45{font-variant-numeric:tabular-nums}._pop_4carx_50{min-width:220px;font-size:12px;color:var(--text-primary)}._popTitle_4carx_56{font-weight:600;margin-bottom:6px}._popTable_4carx_62{border-collapse:collapse}._popTable_4carx_62 td{padding-top:3px;padding-bottom:3px;vertical-align:middle}._tdName_4carx_67{color:var(--text-secondary);padding-right:5px;white-space:nowrap}._tdBar_4carx_67{padding-right:5px;white-space:nowrap}._tdReset_4carx_85{color:var(--text-secondary);font-variant-numeric:tabular-nums;white-space:nowrap}._bar_4carx_94{position:relative;display:inline-flex;align-items:center;justify-content:center;width:100px;height:14px;border-radius:999px;border:1px solid var(--text-disabled);overflow:hidden;background:var(--bg-base-pure);vertical-align:middle}._barFill_4carx_108{position:absolute;left:0;top:0;bottom:0;background-color:var(--text-secondary);opacity:.15;pointer-events:none}._barText_4carx_118{position:relative;z-index:1;font-size:11px;line-height:1;font-variant-numeric:tabular-nums;color:var(--text-primary)}
|