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.
Files changed (142) hide show
  1. package/README.md +14 -2
  2. package/cli.js +116 -37
  3. package/dist/assets/App-DTkacfRW.js +2 -0
  4. package/dist/assets/App-dYPa5-df.css +1 -0
  5. package/dist/assets/{MdxEditorPanel-C8ITEOzT.js → MdxEditorPanel-C5Q6uUyH.js} +1 -1
  6. package/dist/assets/Mobile-MoBp9c8k.js +1 -0
  7. package/dist/assets/{_baseUniq-CG81mgN_.js → _baseUniq-D9_E5ZDp.js} +1 -1
  8. package/dist/assets/{arc-C161J4f2.js → arc-D4iFrlhb.js} +1 -1
  9. package/dist/assets/{architectureDiagram-Q4EWVU46-BmbDMdn9.js → architectureDiagram-Q4EWVU46-f1neo7hg.js} +1 -1
  10. package/dist/assets/{blockDiagram-DXYQGD6D-DXpMvdxd.js → blockDiagram-DXYQGD6D-DWi9e9tG.js} +1 -1
  11. package/dist/assets/{c4Diagram-AHTNJAMY-8Mypg0IU.js → c4Diagram-AHTNJAMY-DAdj49A2.js} +1 -1
  12. package/dist/assets/{channel-B2khdmvc.js → channel-B3VthT0m.js} +1 -1
  13. package/dist/assets/{chunk-4BX2VUAB-I61r1g6z.js → chunk-4BX2VUAB-BrPcAHV3.js} +1 -1
  14. package/dist/assets/{chunk-4TB4RGXK-VFPlRE5E.js → chunk-4TB4RGXK-Bvopc1V9.js} +1 -1
  15. package/dist/assets/{chunk-55IACEB6-DvCamg_6.js → chunk-55IACEB6-Juw-7Z3i.js} +1 -1
  16. package/dist/assets/{chunk-EDXVE4YY-Dj4Q8RwR.js → chunk-EDXVE4YY-DVYP9tpB.js} +1 -1
  17. package/dist/assets/{chunk-FMBD7UC4-_bgQuuJh.js → chunk-FMBD7UC4-VQ7VOXl3.js} +1 -1
  18. package/dist/assets/{chunk-OYMX7WX6-3to38LyN.js → chunk-OYMX7WX6-F8Rj4ZUZ.js} +1 -1
  19. package/dist/assets/{chunk-QZHKN3VN-Zl26wKKz.js → chunk-QZHKN3VN-Dn7K3yi9.js} +1 -1
  20. package/dist/assets/{chunk-YZCP3GAM-RLYPrlh0.js → chunk-YZCP3GAM-UjO-KTsn.js} +1 -1
  21. package/dist/assets/classDiagram-6PBFFD2Q-DmSozxoO.js +1 -0
  22. package/dist/assets/classDiagram-v2-HSJHXN6E-DmSozxoO.js +1 -0
  23. package/dist/assets/clone-BQtvy9Ae.js +1 -0
  24. package/dist/assets/{cose-bilkent-S5V4N54A-CsYOjJ0V.js → cose-bilkent-S5V4N54A-BDhNj8rq.js} +1 -1
  25. package/dist/assets/{dagre-KV5264BT-C3YXXaFU.js → dagre-KV5264BT-BzdcDuyt.js} +1 -1
  26. package/dist/assets/{diagram-5BDNPKRD-DUCOg1ld.js → diagram-5BDNPKRD-DP_SX65N.js} +1 -1
  27. package/dist/assets/{diagram-G4DWMVQ6-BtlLl_zX.js → diagram-G4DWMVQ6-B-pBFw8Q.js} +1 -1
  28. package/dist/assets/{diagram-MMDJMWI5-1Qp9xfOk.js → diagram-MMDJMWI5-6XSfN1eN.js} +1 -1
  29. package/dist/assets/{diagram-TYMM5635-Cj7VMp3L.js → diagram-TYMM5635-DJvGxvpE.js} +1 -1
  30. package/dist/assets/{erDiagram-SMLLAGMA-CVZVn541.js → erDiagram-SMLLAGMA-CpqdpGYj.js} +1 -1
  31. package/dist/assets/{flowDiagram-DWJPFMVM-CiU9Fkkv.js → flowDiagram-DWJPFMVM-C9m7wjwI.js} +1 -1
  32. package/dist/assets/{ganttDiagram-T4ZO3ILL-aRaG97ID.js → ganttDiagram-T4ZO3ILL-CU0XOfY3.js} +1 -1
  33. package/dist/assets/{gitGraphDiagram-UUTBAWPF-Cr2LJlvX.js → gitGraphDiagram-UUTBAWPF-ipyGULnP.js} +1 -1
  34. package/dist/assets/{graph-B59lDyMn.js → graph-BR2KmES9.js} +1 -1
  35. package/dist/assets/{index-C1ptnCpq.js → index--wgRW_OB.js} +1 -1
  36. package/dist/assets/index-Ac8vnV3v.js +2 -0
  37. package/dist/assets/{index-CRAWA8PC.js → index-C-be29ey.js} +1 -1
  38. package/dist/assets/{index-CSM1Kw8l.js → index-C16fiVhv.js} +1 -1
  39. package/dist/assets/{index-Ddk-kg22.js → index-D5YruOKD.js} +1 -1
  40. package/dist/assets/{index-BnhNIjbj.js → index-D5tSeMU7.js} +1 -1
  41. package/dist/assets/{index-vFEQq-NB.js → index-DuZQ6FqR.js} +1 -1
  42. package/dist/assets/{index-CO2hZ1s4.js → index-OWzSX2T8.js} +1 -1
  43. package/dist/assets/{infoDiagram-42DDH7IO-CnO22bw8.js → infoDiagram-42DDH7IO-BQWQjfFX.js} +1 -1
  44. package/dist/assets/{ishikawaDiagram-UXIWVN3A-ByNzpScH.js → ishikawaDiagram-UXIWVN3A-Df-KH_Hz.js} +1 -1
  45. package/dist/assets/{journeyDiagram-VCZTEJTY-yaVaCWPq.js → journeyDiagram-VCZTEJTY-CMbB_4G9.js} +1 -1
  46. package/dist/assets/{jszip.min-BdVFP3OW.js → jszip.min-B6k2t9Ch.js} +1 -1
  47. package/dist/assets/{kanban-definition-6JOO6SKY-RIPR_RQ3.js → kanban-definition-6JOO6SKY-CImdlKN3.js} +1 -1
  48. package/dist/assets/{layout-0rzel0v_.js → layout-DQl4aw09.js} +1 -1
  49. package/dist/assets/{linear-sktN0tB6.js → linear-CLD3aPlK.js} +1 -1
  50. package/dist/assets/mermaid.core-CN35dvKJ.js +7 -0
  51. package/dist/assets/{min-rspGOkz_.js → min-_D86henJ.js} +1 -1
  52. package/dist/assets/{mindmap-definition-QFDTVHPH-BsVzZzTz.js → mindmap-definition-QFDTVHPH-2JVcu1nk.js} +1 -1
  53. package/dist/assets/{pieDiagram-DEJITSTG-CsoWsw4f.js → pieDiagram-DEJITSTG-Dik-m5u7.js} +1 -1
  54. package/dist/assets/{quadrantDiagram-34T5L4WZ-CTMKuCAI.js → quadrantDiagram-34T5L4WZ-Bm5l40Jq.js} +1 -1
  55. package/dist/assets/{requirementDiagram-MS252O5E-C67256te.js → requirementDiagram-MS252O5E-Ck9w5rTj.js} +1 -1
  56. package/dist/assets/{sankeyDiagram-XADWPNL6-X8Y7KnW0.js → sankeyDiagram-XADWPNL6-BbGVCFEf.js} +1 -1
  57. package/dist/assets/seqResourceLoaders-Cd_TAXTb.js +2 -0
  58. package/dist/assets/{seqResourceLoaders-B3TSSS6T.css → seqResourceLoaders-CxuD1CYl.css} +1 -1
  59. package/dist/assets/{sequenceDiagram-FGHM5R23-Cils0TAp.js → sequenceDiagram-FGHM5R23-vjvEdksk.js} +1 -1
  60. package/dist/assets/{stateDiagram-FHFEXIEX-DFnohvpG.js → stateDiagram-FHFEXIEX-DTqMoiB2.js} +1 -1
  61. package/dist/assets/{stateDiagram-v2-QKLJ7IA2-BTX_4o81.js → stateDiagram-v2-QKLJ7IA2-CNbAwnhu.js} +1 -1
  62. package/dist/assets/{timeline-definition-GMOUNBTQ-DrIYFrzZ.js → timeline-definition-GMOUNBTQ-Cw8O-52d.js} +1 -1
  63. package/dist/assets/{vendor-antd-D5HmSDSg.js → vendor-antd-DI7JL-mE.js} +1 -1
  64. package/dist/assets/{vendor-codemirror-C5yuj7ze.js → vendor-codemirror-B9c49dtM.js} +1 -1
  65. package/dist/assets/{vendor-mdxeditor-BcEooTvb.js → vendor-mdxeditor-B6cpBtIE.js} +2 -2
  66. package/dist/assets/{vendor-qrcode-d9LCn0-9.js → vendor-qrcode-Dn90-s-u.js} +1 -1
  67. package/dist/assets/{vendor-virtuoso-K9m4MN6a.js → vendor-virtuoso-CpdSKD_6.js} +1 -1
  68. package/dist/assets/{vennDiagram-DHZGUBPP-lRqBYTr9.js → vennDiagram-DHZGUBPP-DCuqymb7.js} +1 -1
  69. package/dist/assets/{wardley-RL74JXVD-e8YfxpOe.js → wardley-RL74JXVD-BJ20wJUU.js} +1 -1
  70. package/dist/assets/{wardleyDiagram-NUSXRM2D-Bxrg774h.js → wardleyDiagram-NUSXRM2D-Vz6US3qt.js} +1 -1
  71. package/dist/assets/{xychartDiagram-5P7HB3ND-DWhZqhq8.js → xychartDiagram-5P7HB3ND-CzkLKrmi.js} +1 -1
  72. package/dist/index.html +4 -4
  73. package/findcc.js +79 -7
  74. package/package.json +2 -1
  75. package/server/i18n.js +21 -141
  76. package/server/interceptor.js +211 -403
  77. package/server/lib/adapters/dingtalk-adapter.js +16 -2
  78. package/server/lib/adapters/discord-adapter.js +28 -6
  79. package/server/lib/adapters/feishu-adapter.js +50 -4
  80. package/server/lib/adapters/wecom-adapter.js +24 -0
  81. package/server/lib/async-write-queue.js +12 -1
  82. package/server/lib/create_system_prompt.js +13 -7
  83. package/server/lib/delta-reconstructor.js +3 -3
  84. package/server/lib/error-report.js +45 -0
  85. package/server/lib/im-bridge-core.js +71 -4
  86. package/server/lib/im-lock.js +16 -2
  87. package/server/lib/im-log-watcher.js +68 -8
  88. package/server/lib/im-process-manager.js +7 -1
  89. package/server/lib/interceptor-core.js +19 -174
  90. package/server/lib/log-management.js +214 -247
  91. package/server/lib/log-stream.js +59 -108
  92. package/server/lib/log-watcher.js +34 -272
  93. package/server/lib/log-zip.js +148 -0
  94. package/server/lib/model-system-prompts.js +10 -6
  95. package/server/lib/session-boundary.js +266 -0
  96. package/server/lib/session-pin-store.js +10 -19
  97. package/server/lib/spawn-model-resolver.js +109 -0
  98. package/server/lib/stats-worker.js +138 -267
  99. package/server/lib/system-prompt-files.js +7 -3
  100. package/server/lib/system-prompt-render.js +79 -0
  101. package/server/lib/user-prompt-extract.js +250 -0
  102. package/server/lib/v2/adapter.js +1059 -0
  103. package/server/lib/v2/blob-store.js +44 -0
  104. package/server/lib/v2/conversation-store.js +217 -0
  105. package/server/lib/v2/convert-manager.js +79 -0
  106. package/server/lib/v2/convert-worker.js +42 -0
  107. package/server/lib/v2/convert.js +409 -0
  108. package/server/lib/v2/identity.js +204 -0
  109. package/server/lib/v2/journal.js +62 -0
  110. package/server/lib/v2/layout.js +167 -0
  111. package/server/lib/v2/live-feed.js +451 -0
  112. package/server/lib/v2/migrate-prompt.js +54 -0
  113. package/server/lib/v2/replay.js +191 -0
  114. package/server/lib/v2/session-select.js +222 -0
  115. package/server/lib/v2/singleflight.js +104 -0
  116. package/server/lib/v2/v2-writer.js +513 -0
  117. package/server/lib/v2/verify.js +233 -0
  118. package/server/pty-manager.js +115 -36
  119. package/server/routes/dingtalk.js +9 -3
  120. package/server/routes/events.js +30 -130
  121. package/server/routes/files-fs.js +4 -2
  122. package/server/routes/im.js +67 -20
  123. package/server/routes/logs.js +194 -152
  124. package/server/routes/preferences.js +0 -3
  125. package/server/routes/project-meta.js +2 -3
  126. package/server/routes/session-pin.js +7 -8
  127. package/server/routes/workspaces.js +44 -9
  128. package/server/server.js +59 -66
  129. package/server/workspace-registry.js +24 -4
  130. package/dist/assets/App-BjHJ9KJ6.css +0 -1
  131. package/dist/assets/App-CCmR0aki.js +0 -2
  132. package/dist/assets/Mobile-DCHg97f1.js +0 -1
  133. package/dist/assets/classDiagram-6PBFFD2Q-BXnyUgsj.js +0 -1
  134. package/dist/assets/classDiagram-v2-HSJHXN6E-BXnyUgsj.js +0 -1
  135. package/dist/assets/clone-md-Mc1-T.js +0 -1
  136. package/dist/assets/index-CfPXhStV.js +0 -2
  137. package/dist/assets/mermaid.core-C2Parj1q.js +0 -7
  138. package/dist/assets/seqResourceLoaders-CAYxnMSH.js +0 -2
  139. package/server/lib/instance-registry.js +0 -57
  140. package/server/lib/jsonl-archive.js +0 -180
  141. package/server/lib/teammate-detect.js +0 -32
  142. 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 { LOG_FILE, _initPromise, _resumeState, _projectName, _logDir, streamingState, resetStreamingState, PROFILE_PATH, setLivePort, getImLiveText, resetImLiveText } from './interceptor.js';
78
- import { recordInstance, listInstances } from './lib/instance-registry.js';
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 { watchLogFile, startWatching, unwatchAll, sendEventToClients, sendToClients } from './lib/log-watcher.js';
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
- watchLogFile(_logWatcherOpts(LOG_FILE));
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
- // Helper to build log-watcher options object
422
- function _logWatcherOpts(logFile) {
423
- return {
424
- logFile: logFile || LOG_FILE,
425
- clients,
426
- getClaudePid,
427
- runParallelHook,
428
- notifyStatsWorker,
429
- getLogFile: () => LOG_FILE,
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
- logWatcherOpts: _logWatcherOpts,
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, async () => {
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
- startWatching(_logWatcherOpts(LOG_FILE));
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 and _logWatcherOpts() hold this same reference.
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
- function handleExit() {
2393
- if (_resumeState && _resumeState.tempFile) {
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
- let logCount = 0;
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
- logCount++;
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
- return { ...w, logCount, totalSize };
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)}