cc-viewer 1.6.345 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -2
- package/cli.js +116 -37
- package/dist/assets/App-DTkacfRW.js +2 -0
- package/dist/assets/App-dYPa5-df.css +1 -0
- package/dist/assets/{MdxEditorPanel-C8ITEOzT.js → MdxEditorPanel-C5Q6uUyH.js} +1 -1
- package/dist/assets/Mobile-MoBp9c8k.js +1 -0
- package/dist/assets/{_baseUniq-CG81mgN_.js → _baseUniq-D9_E5ZDp.js} +1 -1
- package/dist/assets/{arc-C161J4f2.js → arc-D4iFrlhb.js} +1 -1
- package/dist/assets/{architectureDiagram-Q4EWVU46-BmbDMdn9.js → architectureDiagram-Q4EWVU46-f1neo7hg.js} +1 -1
- package/dist/assets/{blockDiagram-DXYQGD6D-DXpMvdxd.js → blockDiagram-DXYQGD6D-DWi9e9tG.js} +1 -1
- package/dist/assets/{c4Diagram-AHTNJAMY-8Mypg0IU.js → c4Diagram-AHTNJAMY-DAdj49A2.js} +1 -1
- package/dist/assets/{channel-B2khdmvc.js → channel-B3VthT0m.js} +1 -1
- package/dist/assets/{chunk-4BX2VUAB-I61r1g6z.js → chunk-4BX2VUAB-BrPcAHV3.js} +1 -1
- package/dist/assets/{chunk-4TB4RGXK-VFPlRE5E.js → chunk-4TB4RGXK-Bvopc1V9.js} +1 -1
- package/dist/assets/{chunk-55IACEB6-DvCamg_6.js → chunk-55IACEB6-Juw-7Z3i.js} +1 -1
- package/dist/assets/{chunk-EDXVE4YY-Dj4Q8RwR.js → chunk-EDXVE4YY-DVYP9tpB.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-_bgQuuJh.js → chunk-FMBD7UC4-VQ7VOXl3.js} +1 -1
- package/dist/assets/{chunk-OYMX7WX6-3to38LyN.js → chunk-OYMX7WX6-F8Rj4ZUZ.js} +1 -1
- package/dist/assets/{chunk-QZHKN3VN-Zl26wKKz.js → chunk-QZHKN3VN-Dn7K3yi9.js} +1 -1
- package/dist/assets/{chunk-YZCP3GAM-RLYPrlh0.js → chunk-YZCP3GAM-UjO-KTsn.js} +1 -1
- package/dist/assets/classDiagram-6PBFFD2Q-DmSozxoO.js +1 -0
- package/dist/assets/classDiagram-v2-HSJHXN6E-DmSozxoO.js +1 -0
- package/dist/assets/clone-BQtvy9Ae.js +1 -0
- package/dist/assets/{cose-bilkent-S5V4N54A-CsYOjJ0V.js → cose-bilkent-S5V4N54A-BDhNj8rq.js} +1 -1
- package/dist/assets/{dagre-KV5264BT-C3YXXaFU.js → dagre-KV5264BT-BzdcDuyt.js} +1 -1
- package/dist/assets/{diagram-5BDNPKRD-DUCOg1ld.js → diagram-5BDNPKRD-DP_SX65N.js} +1 -1
- package/dist/assets/{diagram-G4DWMVQ6-BtlLl_zX.js → diagram-G4DWMVQ6-B-pBFw8Q.js} +1 -1
- package/dist/assets/{diagram-MMDJMWI5-1Qp9xfOk.js → diagram-MMDJMWI5-6XSfN1eN.js} +1 -1
- package/dist/assets/{diagram-TYMM5635-Cj7VMp3L.js → diagram-TYMM5635-DJvGxvpE.js} +1 -1
- package/dist/assets/{erDiagram-SMLLAGMA-CVZVn541.js → erDiagram-SMLLAGMA-CpqdpGYj.js} +1 -1
- package/dist/assets/{flowDiagram-DWJPFMVM-CiU9Fkkv.js → flowDiagram-DWJPFMVM-C9m7wjwI.js} +1 -1
- package/dist/assets/{ganttDiagram-T4ZO3ILL-aRaG97ID.js → ganttDiagram-T4ZO3ILL-CU0XOfY3.js} +1 -1
- package/dist/assets/{gitGraphDiagram-UUTBAWPF-Cr2LJlvX.js → gitGraphDiagram-UUTBAWPF-ipyGULnP.js} +1 -1
- package/dist/assets/{graph-B59lDyMn.js → graph-BR2KmES9.js} +1 -1
- package/dist/assets/{index-C1ptnCpq.js → index--wgRW_OB.js} +1 -1
- package/dist/assets/index-Ac8vnV3v.js +2 -0
- package/dist/assets/{index-CRAWA8PC.js → index-C-be29ey.js} +1 -1
- package/dist/assets/{index-CSM1Kw8l.js → index-C16fiVhv.js} +1 -1
- package/dist/assets/{index-Ddk-kg22.js → index-D5YruOKD.js} +1 -1
- package/dist/assets/{index-BnhNIjbj.js → index-D5tSeMU7.js} +1 -1
- package/dist/assets/{index-vFEQq-NB.js → index-DuZQ6FqR.js} +1 -1
- package/dist/assets/{index-CO2hZ1s4.js → index-OWzSX2T8.js} +1 -1
- package/dist/assets/{infoDiagram-42DDH7IO-CnO22bw8.js → infoDiagram-42DDH7IO-BQWQjfFX.js} +1 -1
- package/dist/assets/{ishikawaDiagram-UXIWVN3A-ByNzpScH.js → ishikawaDiagram-UXIWVN3A-Df-KH_Hz.js} +1 -1
- package/dist/assets/{journeyDiagram-VCZTEJTY-yaVaCWPq.js → journeyDiagram-VCZTEJTY-CMbB_4G9.js} +1 -1
- package/dist/assets/{jszip.min-BdVFP3OW.js → jszip.min-B6k2t9Ch.js} +1 -1
- package/dist/assets/{kanban-definition-6JOO6SKY-RIPR_RQ3.js → kanban-definition-6JOO6SKY-CImdlKN3.js} +1 -1
- package/dist/assets/{layout-0rzel0v_.js → layout-DQl4aw09.js} +1 -1
- package/dist/assets/{linear-sktN0tB6.js → linear-CLD3aPlK.js} +1 -1
- package/dist/assets/mermaid.core-CN35dvKJ.js +7 -0
- package/dist/assets/{min-rspGOkz_.js → min-_D86henJ.js} +1 -1
- package/dist/assets/{mindmap-definition-QFDTVHPH-BsVzZzTz.js → mindmap-definition-QFDTVHPH-2JVcu1nk.js} +1 -1
- package/dist/assets/{pieDiagram-DEJITSTG-CsoWsw4f.js → pieDiagram-DEJITSTG-Dik-m5u7.js} +1 -1
- package/dist/assets/{quadrantDiagram-34T5L4WZ-CTMKuCAI.js → quadrantDiagram-34T5L4WZ-Bm5l40Jq.js} +1 -1
- package/dist/assets/{requirementDiagram-MS252O5E-C67256te.js → requirementDiagram-MS252O5E-Ck9w5rTj.js} +1 -1
- package/dist/assets/{sankeyDiagram-XADWPNL6-X8Y7KnW0.js → sankeyDiagram-XADWPNL6-BbGVCFEf.js} +1 -1
- package/dist/assets/seqResourceLoaders-Cd_TAXTb.js +2 -0
- package/dist/assets/{seqResourceLoaders-B3TSSS6T.css → seqResourceLoaders-CxuD1CYl.css} +1 -1
- package/dist/assets/{sequenceDiagram-FGHM5R23-Cils0TAp.js → sequenceDiagram-FGHM5R23-vjvEdksk.js} +1 -1
- package/dist/assets/{stateDiagram-FHFEXIEX-DFnohvpG.js → stateDiagram-FHFEXIEX-DTqMoiB2.js} +1 -1
- package/dist/assets/{stateDiagram-v2-QKLJ7IA2-BTX_4o81.js → stateDiagram-v2-QKLJ7IA2-CNbAwnhu.js} +1 -1
- package/dist/assets/{timeline-definition-GMOUNBTQ-DrIYFrzZ.js → timeline-definition-GMOUNBTQ-Cw8O-52d.js} +1 -1
- package/dist/assets/{vendor-antd-D5HmSDSg.js → vendor-antd-DI7JL-mE.js} +1 -1
- package/dist/assets/{vendor-codemirror-C5yuj7ze.js → vendor-codemirror-B9c49dtM.js} +1 -1
- package/dist/assets/{vendor-mdxeditor-BcEooTvb.js → vendor-mdxeditor-B6cpBtIE.js} +2 -2
- package/dist/assets/{vendor-qrcode-d9LCn0-9.js → vendor-qrcode-Dn90-s-u.js} +1 -1
- package/dist/assets/{vendor-virtuoso-K9m4MN6a.js → vendor-virtuoso-CpdSKD_6.js} +1 -1
- package/dist/assets/{vennDiagram-DHZGUBPP-lRqBYTr9.js → vennDiagram-DHZGUBPP-DCuqymb7.js} +1 -1
- package/dist/assets/{wardley-RL74JXVD-e8YfxpOe.js → wardley-RL74JXVD-BJ20wJUU.js} +1 -1
- package/dist/assets/{wardleyDiagram-NUSXRM2D-Bxrg774h.js → wardleyDiagram-NUSXRM2D-Vz6US3qt.js} +1 -1
- package/dist/assets/{xychartDiagram-5P7HB3ND-DWhZqhq8.js → xychartDiagram-5P7HB3ND-CzkLKrmi.js} +1 -1
- package/dist/index.html +4 -4
- package/findcc.js +79 -7
- package/package.json +2 -1
- package/server/i18n.js +21 -141
- package/server/interceptor.js +211 -403
- package/server/lib/adapters/dingtalk-adapter.js +16 -2
- package/server/lib/adapters/discord-adapter.js +28 -6
- package/server/lib/adapters/feishu-adapter.js +50 -4
- package/server/lib/adapters/wecom-adapter.js +24 -0
- package/server/lib/async-write-queue.js +12 -1
- package/server/lib/create_system_prompt.js +13 -7
- package/server/lib/delta-reconstructor.js +3 -3
- package/server/lib/error-report.js +45 -0
- package/server/lib/im-bridge-core.js +71 -4
- package/server/lib/im-lock.js +16 -2
- package/server/lib/im-log-watcher.js +68 -8
- package/server/lib/im-process-manager.js +7 -1
- package/server/lib/interceptor-core.js +19 -174
- package/server/lib/log-management.js +214 -247
- package/server/lib/log-stream.js +59 -108
- package/server/lib/log-watcher.js +34 -272
- package/server/lib/log-zip.js +148 -0
- package/server/lib/model-system-prompts.js +10 -6
- package/server/lib/session-boundary.js +266 -0
- package/server/lib/session-pin-store.js +10 -19
- package/server/lib/spawn-model-resolver.js +109 -0
- package/server/lib/stats-worker.js +138 -267
- package/server/lib/system-prompt-files.js +7 -3
- package/server/lib/system-prompt-render.js +79 -0
- package/server/lib/user-prompt-extract.js +250 -0
- package/server/lib/v2/adapter.js +1059 -0
- package/server/lib/v2/blob-store.js +44 -0
- package/server/lib/v2/conversation-store.js +217 -0
- package/server/lib/v2/convert-manager.js +79 -0
- package/server/lib/v2/convert-worker.js +42 -0
- package/server/lib/v2/convert.js +409 -0
- package/server/lib/v2/identity.js +204 -0
- package/server/lib/v2/journal.js +62 -0
- package/server/lib/v2/layout.js +167 -0
- package/server/lib/v2/live-feed.js +451 -0
- package/server/lib/v2/migrate-prompt.js +54 -0
- package/server/lib/v2/replay.js +191 -0
- package/server/lib/v2/session-select.js +222 -0
- package/server/lib/v2/singleflight.js +104 -0
- package/server/lib/v2/v2-writer.js +513 -0
- package/server/lib/v2/verify.js +233 -0
- package/server/pty-manager.js +115 -36
- package/server/routes/dingtalk.js +9 -3
- package/server/routes/events.js +30 -130
- package/server/routes/files-fs.js +4 -2
- package/server/routes/im.js +67 -20
- package/server/routes/logs.js +194 -152
- package/server/routes/preferences.js +0 -3
- package/server/routes/project-meta.js +2 -3
- package/server/routes/session-pin.js +7 -8
- package/server/routes/workspaces.js +44 -9
- package/server/server.js +59 -66
- package/server/workspace-registry.js +24 -4
- package/dist/assets/App-BjHJ9KJ6.css +0 -1
- package/dist/assets/App-CCmR0aki.js +0 -2
- package/dist/assets/Mobile-DCHg97f1.js +0 -1
- package/dist/assets/classDiagram-6PBFFD2Q-BXnyUgsj.js +0 -1
- package/dist/assets/classDiagram-v2-HSJHXN6E-BXnyUgsj.js +0 -1
- package/dist/assets/clone-md-Mc1-T.js +0 -1
- package/dist/assets/index-CfPXhStV.js +0 -2
- package/dist/assets/mermaid.core-C2Parj1q.js +0 -7
- package/dist/assets/seqResourceLoaders-CAYxnMSH.js +0 -2
- package/server/lib/instance-registry.js +0 -57
- package/server/lib/jsonl-archive.js +0 -180
- package/server/lib/teammate-detect.js +0 -32
- package/server/lib/zip-safety.js +0 -68
package/server/server.js
CHANGED
|
@@ -74,18 +74,19 @@ function execWithStdin(cmd, args, input, options) {
|
|
|
74
74
|
child.stdin.end();
|
|
75
75
|
});
|
|
76
76
|
}
|
|
77
|
-
import {
|
|
78
|
-
import {
|
|
77
|
+
import { _initPromise, _projectName, _logDir, _v2Writer, streamingState, resetStreamingState, PROFILE_PATH, setLivePort, getImLiveText, resetImLiveText } from './interceptor.js';
|
|
78
|
+
import { V2LiveFeed } from './lib/v2/live-feed.js';
|
|
79
|
+
import { sanitizePathComponent } from './lib/v2/layout.js';
|
|
80
|
+
import { maybeResumeConvert } from './lib/v2/convert-manager.js';
|
|
79
81
|
import { LOG_DIR, setLogDir, getClaudeConfigDir, isBrowserOpenSuppressed } from '../findcc.js';
|
|
80
82
|
import { t, getLang, setLang } from './i18n.js';
|
|
81
83
|
import { loadAuthConfig, loadAuthState, saveAuthConfig, clearProjectOverride, generatePassword, decideAuth, parseCookies, renderLoginPage, localeFromAcceptLanguage } from './lib/auth.js';
|
|
82
84
|
import { checkAndUpdate } from './lib/updater.js';
|
|
83
85
|
import { loadPlugins, runWaterfallHook, runParallelHook } from './lib/plugin-loader.js';
|
|
84
86
|
import { CONTEXT_WINDOW_FILE, readModelContextSize } from './lib/context-watcher.js';
|
|
85
|
-
import {
|
|
87
|
+
import { sendEventToClients, sendToClients } from './lib/log-watcher.js';
|
|
86
88
|
import { createImLogWatcher } from './lib/im-log-watcher.js';
|
|
87
89
|
import { unwatchAllWorkflows } from './lib/workflow-watcher.js';
|
|
88
|
-
import { cleanupExtractCache } from './lib/jsonl-archive.js';
|
|
89
90
|
import { backupConfigs } from './lib/config-backup.js';
|
|
90
91
|
import { normalizeBasePath, validateBasePath, stripBasePath } from './lib/base-path.js';
|
|
91
92
|
import { createHardenedCleanup } from './lib/term-signals.js';
|
|
@@ -111,12 +112,6 @@ try {
|
|
|
111
112
|
const isCliMode = process.env.CCV_CLI_MODE === '1';
|
|
112
113
|
const isSdkMode = process.env.CCV_SDK_MODE === '1';
|
|
113
114
|
const isWorkspaceMode = process.env.CCV_WORKSPACE_MODE === '1';
|
|
114
|
-
// Instance id from `ccv --pid <name>` (sanitized in cli.js). null = default mode (no
|
|
115
|
-
// per-instance isolation): the session-pin file falls back to the project-shared key.
|
|
116
|
-
const INSTANCE_ID = process.env.CCV_INSTANCE_ID || null;
|
|
117
|
-
// Remember this id under the project so the CLI banner can list past ids next run (memory
|
|
118
|
-
// aid only). Fire-and-forget; no-ops when there's no active project (e.g. workspace mode).
|
|
119
|
-
if (INSTANCE_ID && _logDir) recordInstance(_logDir, INSTANCE_ID).catch(() => {});
|
|
120
115
|
const _defaultProxyProfiles = { active: 'max', profiles: [{ id: 'max', name: 'Default' }] };
|
|
121
116
|
const _maskApiKey = (k) => k && typeof k === 'string' && k.length > 4 ? '****' + k.slice(-4) : k ? '****' : '';
|
|
122
117
|
const _maskProfiles = (data) => {
|
|
@@ -305,9 +300,12 @@ let _launchCallback = null;
|
|
|
305
300
|
export function setLaunchCallback(fn) { _launchCallback = fn; }
|
|
306
301
|
export function setWorkspaceLaunched(v) { _workspaceLaunched = v; }
|
|
307
302
|
export function initPostLaunch() {
|
|
308
|
-
|
|
303
|
+
startLogWatch();
|
|
309
304
|
if (!statsWorker) startStatsWorker();
|
|
310
305
|
startStreamingStatusTimer();
|
|
306
|
+
// wire-v2 S8: a migration the previous process left unfinished resumes here
|
|
307
|
+
// (resident-until-done, user decision; file-level checkpoints make it cheap).
|
|
308
|
+
try { if (_projectName) maybeResumeConvert(LOG_DIR, _projectName); } catch (err) { console.error('[CC Viewer] wire-v2 convert resume failed:', err.message); }
|
|
311
309
|
}
|
|
312
310
|
|
|
313
311
|
// Global POST body size limit (10MB) to prevent OOM from malicious/buggy clients
|
|
@@ -418,16 +416,34 @@ const MIME_TYPES = {
|
|
|
418
416
|
'.woff2': 'font/woff2',
|
|
419
417
|
};
|
|
420
418
|
|
|
421
|
-
//
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
419
|
+
// S6b: v2 live feed — the live channel when the v2 writer is active. Lazy
|
|
420
|
+
// singleton so worker/test paths that never watch anything pay nothing.
|
|
421
|
+
let _v2LiveFeed = null;
|
|
422
|
+
function _ensureV2LiveFeed() {
|
|
423
|
+
if (!_v2LiveFeed) {
|
|
424
|
+
_v2LiveFeed = new V2LiveFeed({
|
|
425
|
+
clients,
|
|
426
|
+
getClaudePid,
|
|
427
|
+
runParallelHook,
|
|
428
|
+
// The stats worker's v2 units are session dirs (stats-worker.js v9).
|
|
429
|
+
notifyStatsWorker,
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
return _v2LiveFeed;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/** Start the live channel for the current project (v2 live feed). No-op until
|
|
436
|
+
* a project is bound (workspace mode defers to the launch route). */
|
|
437
|
+
function startLogWatch() {
|
|
438
|
+
if (!_projectName) return;
|
|
439
|
+
const feed = _ensureV2LiveFeed();
|
|
440
|
+
feed.start(join(LOG_DIR, sanitizePathComponent(_projectName)));
|
|
441
|
+
_v2Writer.setOnActivity((dir) => feed.tick(dir));
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
function stopLogWatch() {
|
|
445
|
+
if (_v2LiveFeed) _v2LiveFeed.stop();
|
|
446
|
+
_v2Writer.setOnActivity(null);
|
|
431
447
|
}
|
|
432
448
|
|
|
433
449
|
function getLocalIp() {
|
|
@@ -516,7 +532,8 @@ const deps = {
|
|
|
516
532
|
persistAskEntry: _persistAskEntry,
|
|
517
533
|
persistAskDelete: _persistAskDelete,
|
|
518
534
|
notifyParentPending: _notifyParentPending,
|
|
519
|
-
|
|
535
|
+
startLogWatch,
|
|
536
|
+
stopLogWatch,
|
|
520
537
|
scheduleTurnEndBroadcast: _scheduleTurnEndBroadcast,
|
|
521
538
|
ensureImWatch: _ensureImWatch,
|
|
522
539
|
maskProfiles: _maskProfiles,
|
|
@@ -578,7 +595,6 @@ const deps = {
|
|
|
578
595
|
isCliMode,
|
|
579
596
|
isSdkMode,
|
|
580
597
|
isWorkspaceMode,
|
|
581
|
-
instanceId: INSTANCE_ID,
|
|
582
598
|
defaultProxyProfiles: _defaultProxyProfiles,
|
|
583
599
|
};
|
|
584
600
|
|
|
@@ -855,9 +871,6 @@ export async function startViewer() {
|
|
|
855
871
|
// 加载插件(需要在创建服务器之前,以便通过 hook 获取 HTTPS 证书)
|
|
856
872
|
await loadPlugins();
|
|
857
873
|
|
|
858
|
-
// 清理过期解压缓存(fire-and-forget;任何错误吞掉)
|
|
859
|
-
setImmediate(() => { try { cleanupExtractCache(); } catch { /* ignore */ } });
|
|
860
|
-
|
|
861
874
|
// 启动期配置备份:preferences/profile/workspaces → LOG_DIR 外的 cc-viewer-config-backups/
|
|
862
875
|
// (滚动留 10 份)。2026-06-06 事故:配置随 LOG_DIR 整树丢失后无处可恢复。fire-and-forget。
|
|
863
876
|
setImmediate(() => { try { backupConfigs(); } catch { /* ignore */ } });
|
|
@@ -968,9 +981,15 @@ export async function startViewer() {
|
|
|
968
981
|
currentServer = createServer(handleRequest);
|
|
969
982
|
}
|
|
970
983
|
|
|
971
|
-
currentServer.listen(port, HOST,
|
|
984
|
+
currentServer.listen(port, HOST, () => {
|
|
972
985
|
server = currentServer;
|
|
973
986
|
actualPort = port;
|
|
987
|
+
// 整段异步启动逻辑包进 fire-and-forget try-catch(PR#128):端口已绑定、cli.js 的
|
|
988
|
+
// 端口轮询即将放行并继续 spawnClaude——此后任何 await 拒绝(setupTerminalWebSocket /
|
|
989
|
+
// runParallelHook / startBridge)都不能变成 unhandled rejection 打死进程;
|
|
990
|
+
// resolve(server) 必达。
|
|
991
|
+
(async () => {
|
|
992
|
+
try {
|
|
974
993
|
// 把服务端 i18n 的 currentLang 同步成用户在 UI 配置的语言(preferences.lang)。
|
|
975
994
|
// 否则服务端 t() 恒为默认 'zh'——DingTalk 桥接的系统提示、登录页回落语言都不跟随配置。
|
|
976
995
|
// setLang 自带 locale 校验,非法/缺失值回落 en,读 prefs 失败也安全跳过。
|
|
@@ -1019,9 +1038,11 @@ export async function startViewer() {
|
|
|
1019
1038
|
// 工作区模式下延迟到选择工作区后再启动监听
|
|
1020
1039
|
if (!isWorkspaceMode) {
|
|
1021
1040
|
readModelContextSize(); // Cache model→size mapping at startup
|
|
1022
|
-
|
|
1041
|
+
startLogWatch();
|
|
1023
1042
|
startStatsWorker();
|
|
1024
1043
|
startStreamingStatusTimer();
|
|
1044
|
+
// wire-v2 S8: resume an unfinished migration (see initPostLaunch)
|
|
1045
|
+
try { if (_projectName) maybeResumeConvert(LOG_DIR, _projectName); } catch (err) { console.error('[CC Viewer] wire-v2 convert resume failed:', err.message); }
|
|
1025
1046
|
}
|
|
1026
1047
|
// CLI 模式下启动 WebSocket 服务 (必须 await,否则插件 hook 拿不到 upgrade listeners)
|
|
1027
1048
|
if (isCliMode) {
|
|
@@ -1118,6 +1139,11 @@ export async function startViewer() {
|
|
|
1118
1139
|
imProcMgr.reconcileImProcesses().catch((e) => console.error('[CC Viewer] IM reconcile failed:', e?.message || e));
|
|
1119
1140
|
}
|
|
1120
1141
|
resolve(server);
|
|
1142
|
+
} catch (err) {
|
|
1143
|
+
console.error('[CC Viewer] server start callback error:', err?.message || err);
|
|
1144
|
+
try { resolve(server); } catch { /* already settled */ }
|
|
1145
|
+
}
|
|
1146
|
+
})();
|
|
1121
1147
|
});
|
|
1122
1148
|
|
|
1123
1149
|
currentServer.on('error', (err) => {
|
|
@@ -1993,15 +2019,6 @@ export function getAuthConfig() {
|
|
|
1993
2019
|
return authConfig;
|
|
1994
2020
|
}
|
|
1995
2021
|
|
|
1996
|
-
// Instance id (`--pid`) + the project's previously-used ids — printed by cli.js in the
|
|
1997
|
-
// CLI-mode startup banner so the user can recall which id to reuse with `-c` next time.
|
|
1998
|
-
export function getInstanceId() {
|
|
1999
|
-
return INSTANCE_ID;
|
|
2000
|
-
}
|
|
2001
|
-
export function getKnownInstances() {
|
|
2002
|
-
try { return listInstances(_logDir); } catch { return []; }
|
|
2003
|
-
}
|
|
2004
|
-
|
|
2005
2022
|
// In-process broadcast helper for the `turn_end` SSE event. Two callers:
|
|
2006
2023
|
// 1. /api/turn-end-notify POST handler (PTY/CLI mode via Stop hook bridge)
|
|
2007
2024
|
// 2. cli.js runSdkMode → sdkManager.initSdkSession({ onTurnEnd }) (SDK mode —
|
|
@@ -2227,28 +2244,12 @@ async function _doStop() {
|
|
|
2227
2244
|
new Promise(r => setTimeout(r, 3000)),
|
|
2228
2245
|
]);
|
|
2229
2246
|
} catch { }
|
|
2230
|
-
|
|
2231
|
-
if (_resumeState && _resumeState.tempFile) {
|
|
2232
|
-
try {
|
|
2233
|
-
const { tempFile } = _resumeState;
|
|
2234
|
-
if (existsSync(tempFile)) {
|
|
2235
|
-
// 只有非空 temp 文件才 rename 为正式文件,空文件直接删除
|
|
2236
|
-
const sz = statSync(tempFile).size;
|
|
2237
|
-
if (sz > 0) {
|
|
2238
|
-
const newPath = tempFile.replace('_temp.jsonl', '.jsonl');
|
|
2239
|
-
renameSync(tempFile, newPath);
|
|
2240
|
-
} else {
|
|
2241
|
-
unlinkSync(tempFile);
|
|
2242
|
-
}
|
|
2243
|
-
}
|
|
2244
|
-
} catch { }
|
|
2245
|
-
}
|
|
2246
|
-
unwatchAll();
|
|
2247
|
+
stopLogWatch();
|
|
2247
2248
|
unwatchAllWorkflows();
|
|
2248
2249
|
unwatchFile(CONTEXT_WINDOW_FILE);
|
|
2249
2250
|
clients.forEach(client => client.end());
|
|
2250
2251
|
// Truncate in place (not `clients = []`) so the array reference stays stable across
|
|
2251
|
-
// stop/start cycles — deps.clients
|
|
2252
|
+
// stop/start cycles — deps.clients holds this same reference.
|
|
2252
2253
|
clients.length = 0;
|
|
2253
2254
|
if (server) {
|
|
2254
2255
|
// 销毁所有活跃连接,防止 keep-alive 阻止进程退出
|
|
@@ -2388,17 +2389,9 @@ if (!isWorkspaceMode) {
|
|
|
2388
2389
|
});
|
|
2389
2390
|
}
|
|
2390
2391
|
|
|
2391
|
-
//
|
|
2392
|
-
|
|
2393
|
-
|
|
2394
|
-
try {
|
|
2395
|
-
if (existsSync(_resumeState.tempFile)) {
|
|
2396
|
-
const newPath = _resumeState.tempFile.replace('_temp.jsonl', '.jsonl');
|
|
2397
|
-
renameSync(_resumeState.tempFile, newPath);
|
|
2398
|
-
}
|
|
2399
|
-
} catch { }
|
|
2400
|
-
}
|
|
2401
|
-
}
|
|
2392
|
+
// 进程退出钩子(v1 时代负责临时文件转正;v2 无暂存文件,保留空挂点防
|
|
2393
|
+
// 未来清理动作无处可挂)
|
|
2394
|
+
function handleExit() {}
|
|
2402
2395
|
// 防御性单次注册:ESM cache 已保证模块顶层只执行一次,但若未来重构把这段
|
|
2403
2396
|
// 移入函数(cleanupViewer 等)或用 dev hot-reload,缺守卫会导致 handler 堆积
|
|
2404
2397
|
// → 进程退出时多次调用 stopViewer。globalThis flag 兼容所有 import 路径。
|
|
@@ -3,6 +3,7 @@ import { readFileSync, writeFileSync, existsSync, mkdirSync, unlinkSync } from '
|
|
|
3
3
|
import { readdir, stat } from 'node:fs/promises';
|
|
4
4
|
import { renameSyncWithRetry } from './lib/file-api.js';
|
|
5
5
|
import { withFileLockAsync } from './lib/async-file-lock.js';
|
|
6
|
+
import { dirSizeSync } from './lib/v2/layout.js';
|
|
6
7
|
import { join, basename, resolve } from 'node:path';
|
|
7
8
|
import { randomBytes } from 'node:crypto';
|
|
8
9
|
import { LOG_DIR } from '../findcc.js';
|
|
@@ -92,19 +93,38 @@ export async function removeWorkspace(id) {
|
|
|
92
93
|
export async function getWorkspaces() {
|
|
93
94
|
const list = loadWorkspaces();
|
|
94
95
|
const enriched = await Promise.all(list.map(async (w) => {
|
|
95
|
-
|
|
96
|
+
// wire-v2 (1.7.0): logs live in per-session dirs under sessions/. The v1
|
|
97
|
+
// *.jsonl glob is kept as unmigratedV1Count — the combined logCount must
|
|
98
|
+
// stay non-zero for a declined-migration workspace, because the launcher's
|
|
99
|
+
// `logCount > 0 → auto -c` heuristic hangs off it (WorkspaceList.jsx).
|
|
100
|
+
let sessionCount = 0;
|
|
101
|
+
let unmigratedV1Count = 0;
|
|
96
102
|
let totalSize = 0;
|
|
97
103
|
const logDir = join(LOG_DIR, w.projectName);
|
|
98
104
|
try {
|
|
99
105
|
const files = await readdir(logDir);
|
|
100
106
|
for (const f of files) {
|
|
101
|
-
if (f.endsWith('.jsonl')) {
|
|
102
|
-
|
|
107
|
+
if (f.endsWith('.jsonl') && !f.endsWith('_temp.jsonl')) {
|
|
108
|
+
unmigratedV1Count++;
|
|
103
109
|
try { totalSize += (await stat(join(logDir, f))).size; } catch { }
|
|
104
110
|
}
|
|
105
111
|
}
|
|
106
112
|
} catch { }
|
|
107
|
-
|
|
113
|
+
try {
|
|
114
|
+
const sids = await readdir(join(logDir, 'sessions'), { withFileTypes: true });
|
|
115
|
+
for (const e of sids) {
|
|
116
|
+
if (!e.isDirectory()) continue;
|
|
117
|
+
const sessionDir = join(logDir, 'sessions', e.name);
|
|
118
|
+
try {
|
|
119
|
+
await stat(join(sessionDir, 'journal.jsonl'));
|
|
120
|
+
// Folder size, not journal size — conv/blob/response files carry
|
|
121
|
+
// most of a session's bytes (journal alone undercounts ~12x).
|
|
122
|
+
totalSize += dirSizeSync(sessionDir);
|
|
123
|
+
sessionCount++;
|
|
124
|
+
} catch { /* dir without a journal is not a session yet */ }
|
|
125
|
+
}
|
|
126
|
+
} catch { }
|
|
127
|
+
return { ...w, logCount: sessionCount + unmigratedV1Count, sessionCount, unmigratedV1Count, totalSize };
|
|
108
128
|
}));
|
|
109
129
|
return enriched.sort((a, b) => new Date(b.lastUsed) - new Date(a.lastUsed));
|
|
110
130
|
}
|
|
@@ -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_1hjkn_1{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:10px}._modeLeft_1hjkn_9{display:flex;align-items:center;gap:10px}._modeRight_1hjkn_15{display:flex;align-items:center;gap:8px}._overrideWarn_1hjkn_22{font-size:12px;color:var(--color-warning, #d4810a)}._previewLabel_1hjkn_27{font-size:13px;color:var(--text-secondary, #888)}._previewBox_1hjkn_36{border:1px solid var(--border-primary);border-radius:8px;background:transparent;padding:12px 14px;min-height:320px;max-height:60vh;overflow:auto}._previewEmpty_1hjkn_46{font-size:13px;color:var(--text-secondary, #888)}._hint_1hjkn_51{margin-top:10px;font-size:12px;color:var(--text-secondary, #888);line-height:1.6}._dirLine_1hjkn_58{word-break:break-all}._warn_1hjkn_62{margin-top:10px;font-size:12px;color:var(--color-warning, #d4810a)}._tabRow_1hjkn_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_1hjkn_71::-webkit-scrollbar{display:none}._tabBtn_1hjkn_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_1hjkn_90:hover{color:var(--color-primary)}._tabBtn_1hjkn_90:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}._tabBtn_1hjkn_90._tabActive_1hjkn_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_1hjkn_71>._tabBtn_1hjkn_90._tabActive_1hjkn_118,._tabWrap_1hjkn_132:has(>._tabBtn_1hjkn_90._tabActive_1hjkn_118){position:sticky;left:0;right:0;z-index:2}[data-theme=light] ._tabBtn_1hjkn_90._tabActive_1hjkn_118{box-shadow:0 -3px 8px #0000000f}._editorBox_1hjkn_33{background:var(--bg-container);border-radius:8px;overflow:hidden;padding:4px;position:relative}[data-theme=light] ._editorBox_1hjkn_33{box-shadow:0 3px 8px #00000014}._editorBox_1hjkn_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_1hjkn_33 .ant-input:hover{border-color:var(--border-primary);background:transparent}._editorBox_1hjkn_33 .ant-input:focus{border-color:var(--color-primary-pale);box-shadow:none}._editorBox_1hjkn_33 .ant-input[disabled]{color:var(--text-muted);background:transparent}._tabWrap_1hjkn_132{position:relative;display:inline-flex;align-items:center;flex-shrink:0}._tabTitle_1hjkn_199{white-space:nowrap}._tabDelete_1hjkn_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_1hjkn_132:hover ._tabDelete_1hjkn_204{opacity:1}._tabDelete_1hjkn_204:hover{color:var(--color-error, #d4380d);border-color:var(--color-error, #d4380d)}@media(max-width:768px){._tabDelete_1hjkn_204{opacity:1}}._addBtn_1hjkn_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_1hjkn_237:hover{color:var(--color-primary);background:var(--bg-surface)}._addBtn_1hjkn_237:disabled{cursor:not-allowed;opacity:.5}[data-theme=light] ._addBtn_1hjkn_237{color:var(--text-secondary)}._scopeBadge_1hjkn_270{font-size:10px;line-height:1.4;padding:0 4px;border-radius:6px;background:var(--bg-surface);color:var(--text-muted)}._dirtyDot_1hjkn_280{width:6px;height:6px;border-radius:50%;background:var(--color-primary);flex-shrink:0}._titleRow_1hjkn_289{display:inline-flex;align-items:center;gap:8px}._helpBtn_1hjkn_297{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_1hjkn_297:hover{color:var(--color-primary);border-color:var(--color-primary)}._paramDocBtn_1hjkn_320{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_1hjkn_320:hover{color:var(--color-primary);border-color:var(--color-primary)}._paramDocBtn_1hjkn_320:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}._docBox_1hjkn_352{max-height:65vh;overflow:auto;font-size:13px;line-height:1.6}._docIntro_1hjkn_361{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_1hjkn_371{display:flex;flex-direction:column;gap:14px;margin-top:4px}._addModalField_1hjkn_377{display:flex;flex-direction:column;gap:6px}._fieldLabelRow_1hjkn_382{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--text-secondary, #888)}._addError_1hjkn_390{font-size:12px;color:var(--color-error, #d4380d)}._presetSelect_1hjkn_394{width:100%}._presetMatched_1hjkn_397{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_riojj_1{height:100%;box-sizing:border-box;overflow-y:auto;overflow-x:hidden;scrollbar-gutter:stable;padding:4px 2px;background:var(--bg-container)}._headerBar_riojj_15{display:flex;align-items:center;gap:8px}._refreshBtn_riojj_21{flex:0 0 auto}._statusTag_riojj_27{display:inline-flex;align-items:center;margin-left:auto}._statusTag_riojj_27 .ant-tag{margin-inline-end:0}._center_riojj_36{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:40px 0;color:var(--text-secondary)}._hint_riojj_46{color:var(--text-secondary);font-size:13px}._chip_bvaji_4{position:relative;line-height:0;cursor:pointer;-webkit-user-select:none;user-select:none;transition:opacity .15s}._chip_bvaji_4:hover{opacity:.75}._logo_bvaji_16{display:block;transition:color .15s}._connecting_bvaji_22{opacity:.5}._dotError_bvaji_27{position:absolute;right:-2px;top:-2px;width:6px;height:6px;border-radius:50%;background:var(--color-error, #ff4d4f);pointer-events: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_18pw5_2{display:flex;align-items:center;justify-content:space-between;width:100%;height:100%}._logoWrap_18pw5_10{display:inline-flex;align-items:center;position:relative;margin-top:14px}._logoWrapActive_18pw5_17:after{content:"";position:absolute;top:-10px;bottom:-10px;left:0;right:-200px}._logoImage_18pw5_26{height:24px;width:24px;border-radius:3px;vertical-align:middle;opacity:.75;transition:opacity .2s;cursor:pointer}._logoImageActive_18pw5_36{opacity:1}._compactBtn_18pw5_43{font-size:12px;height:30px;display:inline-flex;align-items:center;justify-content:center}._compactBtnNoBorder_18pw5_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_18pw5_52 .anticon{display:inline-flex;align-items:center;justify-content:center;line-height:0}._headerProjectName_18pw5_79{font-size:12px;color:inherit;white-space:nowrap}._headerProjectName_18pw5_79:hover [data-alias-edit-trigger],._headerProjectName_18pw5_79:focus-within [data-alias-edit-trigger]{opacity:.55}._countdownStrong_18pw5_96{font-variant-numeric:tabular-nums}._qrcodePopover_18pw5_101{display:flex;flex-direction:column;align-items:center;padding:8px}._qrcodeSection_18pw5_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_18pw5_119{font-size:14px;font-weight:600;color:var(--text-primary);margin-bottom:12px}._qrcodeUrlInput_18pw5_126{margin-top:12px;font-size:12px;font-family:var(--font-mono)}._qrcodeUrlCopy_18pw5_132{cursor:pointer;color:var(--text-tertiary);transition:color .2s}._qrcodeUrlCopy_18pw5_132:hover{color:var(--color-primary-light)}._authSection_18pw5_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_18pw5_157{display:flex;align-items:center;justify-content:space-between}._authTitle_18pw5_163{font-size:13px;font-weight:600;color:var(--text-primary)}._authPasswordLabel_18pw5_169{font-size:12px;color:var(--text-secondary)}._authPasswordInput_18pw5_174{font-size:12px;font-family:var(--font-mono)}._authSaveBtn_18pw5_179{align-self:flex-end}._authEmptyWarn_18pw5_183{font-size:12px;color:var(--color-error-light);line-height:1.4}._settingsGroupBox_18pw5_191{border:1px solid var(--border-secondary);border-radius:8px;background:var(--bg-container);padding:4px 16px;margin-bottom:12px}._settingsGroupTitle_18pw5_199{font-size:14px;font-weight:600;color:var(--text-primary);padding:12px 0 4px;border-bottom:1px solid var(--border-secondary)}._settingsItem_18pw5_208{display:flex;justify-content:space-between;align-items:center;padding:12px 0}._settingsLabel_18pw5_215{font-size:14px}._settingsHelpIcon_18pw5_220{font-size:16px;color:var(--text-disabled);cursor:help;margin-left:4px}._settingsDivider_18pw5_227{border-top:1px solid var(--border-primary);margin:12px 0}._logDirInput_18pw5_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}._tokenStatsEmpty_18pw5_242{padding:8px 4px;color:var(--text-tertiary);font-size:13px}._tokenStatsContainer_18pw5_249{display:flex;gap:12px;align-items:flex-start}._tokenStatsColumn_18pw5_255{min-width:240px}._toolStatsColumn_18pw5_259{min-width:180px}._modelCardSpaced_18pw5_265{margin-bottom:10px}._rebuildCard_18pw5_274{border:1px solid var(--border-secondary);border-radius:6px;padding:8px 10px;margin-top:10px;background:var(--bg-container)}._promptExportBar_18pw5_283{margin-bottom:12px}._promptScrollArea_18pw5_287{max-height:500px;overflow:auto}._promptEmpty_18pw5_292{color:var(--text-tertiary);padding:12px}._promptTimestamp_18pw5_298{color:var(--text-muted);font-size:12px;margin:12px 0 4px;padding-bottom:6px}._textPromptCard_18pw5_306{margin:4px 0;background:var(--bg-container);border-radius:6px;border:1px solid var(--border-secondary);padding:10px 14px}._preText_18pw5_315{white-space:pre-wrap;word-break:break-word;font-size:13px;line-height:1.6;color:var(--text-primary);margin:4px 0}._systemCollapse_18pw5_325{margin:4px 0;background:var(--bg-elevated);border:1px solid var(--border-secondary);border-radius:6px}._systemLabel_18pw5_332{color:var(--text-tertiary);font-size:12px}._preSys_18pw5_337{white-space:pre-wrap;word-break:break-word;font-size:12px;line-height:1.5;color:var(--text-tertiary);margin:0}._promptTextarea_18pw5_347{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_18pw5_363{display:flex;justify-content:center;padding:40px 0}._projectStatsEmpty_18pw5_369{color:var(--text-tertiary);padding:40px 0;text-align:center;font-size:13px}._projectStatsContent_18pw5_376{display:flex;flex-direction:column;gap:16px}._projectStatsUpdated_18pw5_382{color:var(--text-muted);font-size:12px;text-align:right}._projectStatsSummary_18pw5_388{display:grid;grid-template-columns:1fr 1fr;gap:10px}._projectStatCard_18pw5_394{background:var(--bg-container);border:1px solid var(--border-secondary);border-radius:8px;padding:14px 12px;text-align:center}._projectStatValue_18pw5_402{font-size:22px;font-weight:700;color:var(--text-primary);font-family:var(--font-mono);font-variant-numeric:tabular-nums}._projectStatLabel_18pw5_410{font-size:12px;color:var(--text-tertiary);margin-top:4px}._projectStatsSection_18pw5_416{display:flex;flex-direction:column;gap:10px}._projectStatsSectionTitle_18pw5_422{font-size:14px;font-weight:600;color:var(--text-secondary);padding-bottom:4px;border-bottom:1px solid var(--border-secondary)}._projectStatsModelCard_18pw5_430{background:var(--bg-container);border:1px solid var(--border-secondary);border-radius:6px;padding:10px 12px}._projectStatsModelHeader_18pw5_437{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;padding-bottom:4px;border-bottom:1px solid var(--border-secondary)}._projectStatsModelName_18pw5_446{font-size:13px;font-weight:600;color:var(--text-primary)}._projectStatsModelCount_18pw5_452{font-size:12px;color:var(--text-tertiary);font-family:var(--font-mono)}._cacheCopyBtn_18pw5_460{font-size:14px;color:var(--text-tertiary);cursor:pointer;transition:color .2s;margin-left:8px}._cacheCopyBtn_18pw5_460:hover{color:var(--text-primary)}._cacheTokenInfo_18pw5_472{display:flex;align-items:center;font-size:12px;font-family:var(--font-mono);color:var(--text-light);margin-bottom:8px}._cacheCodeBlock_18pw5_485{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_18pw5_499{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_18pw5_513{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_18pw5_513:hover{background:var(--color-primary-bg-light)}._cacheNavList_18pw5_528{width:600px;max-height:300px;overflow-y:auto}._cacheNavItem_18pw5_534{padding:4px 8px;font-size:12px;color:var(--text-secondary);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-radius:3px}._cacheNavItem_18pw5_534:hover{background:var(--color-primary-bg-lighter);color:var(--text-white)}._cacheBlockHighlight_18pw5_550{box-shadow:0 0 10px var(--color-primary-shadow);transition:box-shadow .2s ease-in}._cacheBlockHighlightFading_18pw5_555{box-shadow:0 0 10px transparent;transition:box-shadow 3s ease-out}._cacheBorderSvg_18pw5_560{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;pointer-events:none;overflow:visible}._cacheBorderSvgFading_18pw5_569{opacity:0;transition:opacity 3s ease-out}._cacheBorderRect_18pw5_574{animation:_cacheDashRotate_18pw5_1 4s linear infinite}@keyframes _cacheDashRotate_18pw5_1{0%{stroke-dashoffset:0}to{stroke-dashoffset:-100}}._thLeft_18pw5_584{text-align:left}._cacheWriteToken_18pw5_599{color:var(--color-code-orange)}._cacheReadToken_18pw5_603{color:var(--color-success)}._cacheCtxPercent_18pw5_607{color:var(--text-tertiary);margin-left:6px}._qrcodeIcon_18pw5_627{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_18pw5_627:hover{color:var(--text-primary);background:var(--bg-hover, rgba(0, 0, 0, .04))}._qrcodeIcon_18pw5_627:focus-visible{outline:2px solid var(--primary-color, #1677ff);outline-offset:1px}._approvalBell_18pw5_653{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_18pw5_653:hover{color:var(--text-primary);background:var(--bg-hover, rgba(0, 0, 0, .04))}._approvalBell_18pw5_653:focus-visible{outline:2px solid var(--primary-color, #1677ff);outline-offset:1px}._approvalBellBadge_18pw5_678{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_18pw5_695{margin-right:4px;font-size:11px}._proxyProfileTag_18pw5_701{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_18pw5_701:hover{color:var(--text-secondary);border-color:var(--text-disabled)}._pinnedShortcut_18pw5_717{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_18pw5_717:hover{opacity:1;color:var(--text-secondary)}._pinnedShortcut_18pw5_717 .anticon{display:inline-flex;align-items:center;justify-content:center;line-height:0}._themeToggle_18pw5_746{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_18pw5_746:hover{background:var(--color-bg-hover, rgba(127, 127, 127, .12));color:var(--text-primary)}._themeToggle_18pw5_746:focus-visible{box-shadow:0 0 0 2px var(--primary-color, #1677ff)}._themeToggleIcon_18pw5_772{display:block}._headerRightRow_18pw5_777 .ant-space-item{display:inline-flex;align-items:center}._headerCountdownTag_18pw5_783{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_1eor3_1{display:flex;height:100%;min-height:0;gap:0}._sidebar_1eor3_9{width:220px;flex-shrink:0;border-right:1px solid var(--border-primary);overflow-y:auto;padding:4px 0;-webkit-overflow-scrolling:touch}._section_1eor3_18{-webkit-user-select:none;user-select:none}._sectionHeader_1eor3_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_1eor3_22:hover{background:var(--overlay-light-faint)}._sectionHeader_1eor3_22:focus-visible{outline:1px solid var(--color-primary-outline);outline-offset:-1px}._arrow_1eor3_48{font-size:10px;color:var(--text-tertiary);flex-shrink:0}._sectionTitle_1eor3_54{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._sectionCount_1eor3_62{font-size:11px;color:var(--text-muted);background:var(--bg-elevated);border-radius:10px;padding:0 6px;line-height:18px}._sectionBody_1eor3_71{padding:2px 0}._historyToggle_1eor3_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_1eor3_76:hover{color:var(--text-tertiary);background:var(--overlay-light-faint)}._historyToggle_1eor3_76:focus-visible{outline:1px solid var(--color-primary-outline);outline-offset:-1px}._historyToggleLabel_1eor3_102{flex:1}._item_1eor3_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_1eor3_107:hover{background:var(--overlay-light-faint);color:var(--text-primary)}._item_1eor3_107:focus-visible{outline:1px solid var(--color-primary-outline);outline-offset:-1px}._itemActive_1eor3_135,._itemActive_1eor3_135:hover{background:var(--color-primary-bg-faint);color:var(--color-primary);border-color:var(--color-primary-light)}._itemContent_1eor3_142{flex:1;min-width:0;overflow:hidden}._itemLabel_1eor3_148{font-family:var(--font-mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}._itemSublabel_1eor3_156{font-size:10px;color:var(--text-disabled);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:1px}._itemTime_1eor3_165{font-size:9px;color:var(--text-disabled);flex-shrink:0;margin-left:4px;font-family:var(--font-mono)}._contentWrap_1eor3_176{flex:1;min-width:0;display:flex;flex-direction:column}._content_1eor3_174{flex:1;min-width:0;min-height:0;overflow:auto;padding:12px 16px;-webkit-overflow-scrolling:touch}._contentEmpty_1eor3_192{height:100%;display:flex;align-items:center;justify-content:center}._contentInner_1eor3_199{padding-bottom:20px}._emptyWrap_1eor3_203{display:flex;align-items:center;justify-content:center;height:200px}._roleHeader_1eor3_211{display:flex;align-items:center;gap:8px;margin-bottom:8px;flex-wrap:nowrap}._roleBadge_1eor3_219{font-size:10px;font-weight:600;letter-spacing:.04em;padding:2px 7px;border-radius:4px;flex-shrink:0}._role_user_1eor3_228{background:var(--color-primary-bg-lighter);color:var(--color-primary-lighter);border:1px solid var(--color-primary-bg-medium)}._role_assistant_1eor3_234{background:var(--color-purple-bg);color:var(--color-code-purple);border:1px solid var(--color-purple-border)}._role_system_1eor3_240{background:var(--color-warning-bg-faint);color:var(--color-warning);border:1px solid var(--color-warning-border-light)}._roleLabel_1eor3_246{font-size:11px;color:var(--text-muted);flex:1;min-width:0}._contentTime_1eor3_253{margin-left:auto;font-size:10px;color:var(--text-disabled);font-family:var(--font-mono);flex-shrink:0}._turnDivider_1eor3_261{border:none;border-top:1px solid var(--border-primary);margin:14px 0}._textBlock_1eor3_268{margin-bottom:8px;border:1px solid var(--border-primary);border-radius:6px;overflow:hidden}._textBlockBar_1eor3_275{display:flex;align-items:center;gap:6px;padding:4px 10px;background:var(--bg-container);border-bottom:1px solid var(--border-primary)}._textBlockBody_1eor3_284{padding:10px 12px;font-size:13px;line-height:1.7;color:var(--text-primary);word-break:break-word}._textBlockCompact_1eor3_292{position:relative;padding:8px 10px;font-size:12px;color:var(--text-light)}._textBlockCompactFloat_1eor3_299{float:right;margin-left:6px;margin-bottom:2px}._thinkingBlock_1eor3_306{margin-bottom:8px;border:1px solid var(--color-thinking-border);border-radius:6px;overflow:hidden;background:var(--color-thinking-bg)}._thinkingHeader_1eor3_314{display:flex;align-items:center;gap:6px;padding:5px 10px;cursor:pointer;font-size:12px;color:var(--text-tertiary);transition:background .15s}._thinkingHeader_1eor3_314:hover{background:var(--overlay-light-faint)}._thinkingPreview_1eor3_329{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-muted);font-size:11px}._thinkingBody_1eor3_339{padding:8px 12px;border-top:1px solid var(--color-thinking-border)}._toolBlock_1eor3_345{margin-bottom:8px;border:1px solid var(--border-primary);border-radius:6px;overflow:hidden}._toolBlockResult_1eor3_352{border-color:var(--color-green-border)}._toolBlockError_1eor3_356{border-color:var(--color-red-dark-border)}._toolBlockHeader_1eor3_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_1eor3_371{padding:8px 10px;font-size:12px}._toolName_1eor3_376{color:var(--text-primary);font-weight:500;font-family:var(--font-mono)}._toolId_1eor3_382{color:var(--text-disabled);font-size:10px;font-family:var(--font-mono);margin-left:auto}._errorLabel_1eor3_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_1eor3_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_1eor3_412{background:var(--color-primary-bg-faint);color:var(--color-primary-lighter);border-color:var(--color-primary-bg-lighter)}._blockTagThinking_1eor3_418{background:var(--color-warning-bg-faint);color:var(--color-warning);border-color:var(--color-warning-border-light)}._blockTagResult_1eor3_424{background:var(--color-green-dark-bg);color:var(--color-success);border-color:var(--color-green-dark-border)}._blockTagError_1eor3_430{background:var(--color-error-bg-faint);color:var(--color-error-light);border-color:var(--color-error-border-light)}._jsonBlock_1eor3_437{margin-bottom:8px;border:1px solid var(--border-primary);border-radius:6px;overflow:hidden}._jsonBlockLabel_1eor3_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_1eor3_454{border:none;border-top:1px solid var(--border-primary);margin:16px 0}._markdownBody_1eor3_461{font-size:13px;line-height:1.7;color:var(--text-primary);word-break:break-word}._contentToolbar_1eor3_469{display:flex;justify-content:flex-end;align-items:center;gap:8px;padding:8px 16px 0;flex-shrink:0}._contentToolbarLabel_1eor3_478{font-size:11px;color:var(--text-muted)}._rawPre_1eor3_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_1eor3_497{color:var(--color-success)}._toolRemoved_1eor3_501{color:var(--color-error);text-decoration:line-through}._toolDiffTag_1eor3_506{margin-left:6px;font-size:9px;font-family:var(--font-ui);text-decoration:none;opacity:.85}._toolDiffSummary_1eor3_514{margin-left:6px;font-size:11px;font-family:var(--font-mono);display:inline-flex;gap:4px;flex-shrink:0}._toolDiffSummaryAdd_1eor3_523{color:var(--color-success)}._toolDiffSummaryRemove_1eor3_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_18dz6_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_18dz6_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_18dz6_38{position:relative;z-index:1;display:inline-flex;align-items:center}._usageText_18dz6_45{font-variant-numeric:tabular-nums}._muted_18dz6_50{border-color:var(--border-light);color:var(--text-disabled);background:var(--bg-surface)}._pop_18dz6_57{min-width:220px;font-size:12px;color:var(--text-primary)}._popTitle_18dz6_63{font-weight:600;margin-bottom:6px}._popTable_18dz6_69{border-collapse:collapse}._popTable_18dz6_69 td{padding-top:3px;padding-bottom:3px;vertical-align:middle}._tdName_18dz6_74{color:var(--text-secondary);padding-right:5px;white-space:nowrap}._tdBar_18dz6_74{padding-right:5px;white-space:nowrap}._tdReset_18dz6_92{color:var(--text-secondary);font-variant-numeric:tabular-nums;white-space:nowrap}._bar_18dz6_101{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_18dz6_115{position:absolute;left:0;top:0;bottom:0;background-color:var(--text-secondary);opacity:.15;pointer-events:none}._barText_18dz6_125{position:relative;z-index:1;font-size:11px;line-height:1;font-variant-numeric:tabular-nums;color:var(--text-primary)}
|