cc-viewer 1.7.20 → 1.7.22

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 (94) hide show
  1. package/README.md +2 -2
  2. package/concepts/en/ProxySwitch.md +13 -0
  3. package/concepts/zh/ProxySwitch.md +13 -0
  4. package/dist/assets/App-BWajJyJh.css +1 -0
  5. package/dist/assets/App-BaKGIW0-.js +2 -0
  6. package/dist/assets/{MdxEditorPanel-CSO3KK7e.js → MdxEditorPanel-DG-UE0PC.js} +1 -1
  7. package/dist/assets/{Mobile-DEJlXIVB.js → Mobile-CQaUYdaf.js} +1 -1
  8. package/dist/assets/{ProxyStatsModal-B4fWYkT-.js → ProxyStatsModal-j-Aty9Lu.js} +1 -1
  9. package/dist/assets/{_baseUniq-aTokVjQN.js → _baseUniq-BvoL7sea.js} +1 -1
  10. package/dist/assets/{arc-mxp8gSRQ.js → arc-CWSgghLO.js} +1 -1
  11. package/dist/assets/{architectureDiagram-Q4EWVU46-msh8IODx.js → architectureDiagram-Q4EWVU46-hxmrC4g0.js} +1 -1
  12. package/dist/assets/{blockDiagram-DXYQGD6D-BUatNJTI.js → blockDiagram-DXYQGD6D-D3Ie-HJv.js} +1 -1
  13. package/dist/assets/{c4Diagram-AHTNJAMY-CJ92TNZe.js → c4Diagram-AHTNJAMY-Bqi7HUr9.js} +1 -1
  14. package/dist/assets/{channel-CTM7CJrB.js → channel-NrrRrxlA.js} +1 -1
  15. package/dist/assets/{chunk-4BX2VUAB-Bdv98T9c.js → chunk-4BX2VUAB-DJvzFKwQ.js} +1 -1
  16. package/dist/assets/{chunk-4TB4RGXK-DaIEuSP0.js → chunk-4TB4RGXK-BtkeuMYF.js} +1 -1
  17. package/dist/assets/{chunk-55IACEB6-Bi9130Nu.js → chunk-55IACEB6-B9KZe48-.js} +1 -1
  18. package/dist/assets/{chunk-EDXVE4YY-CZw-Vwwn.js → chunk-EDXVE4YY-CrC8aHms.js} +1 -1
  19. package/dist/assets/{chunk-FMBD7UC4-BBI7swjg.js → chunk-FMBD7UC4-CsMZhbHS.js} +1 -1
  20. package/dist/assets/{chunk-OYMX7WX6-CHKotm_J.js → chunk-OYMX7WX6-DzMU24Av.js} +1 -1
  21. package/dist/assets/{chunk-QZHKN3VN-ECW0McUe.js → chunk-QZHKN3VN-DQg8aTq0.js} +1 -1
  22. package/dist/assets/{chunk-YZCP3GAM-DLdAqU2z.js → chunk-YZCP3GAM-DiH0m9X5.js} +1 -1
  23. package/dist/assets/classDiagram-6PBFFD2Q-DiDwaKTt.js +1 -0
  24. package/dist/assets/classDiagram-v2-HSJHXN6E-DiDwaKTt.js +1 -0
  25. package/dist/assets/clone-N9s0k-Pj.js +1 -0
  26. package/dist/assets/{cose-bilkent-S5V4N54A-CfMuBnZy.js → cose-bilkent-S5V4N54A-Cuw7G_qy.js} +1 -1
  27. package/dist/assets/{dagre-KV5264BT-xxdATAWV.js → dagre-KV5264BT-qqKh51pl.js} +1 -1
  28. package/dist/assets/{diagram-5BDNPKRD-s8izYXws.js → diagram-5BDNPKRD-B-pBCkaj.js} +1 -1
  29. package/dist/assets/{diagram-G4DWMVQ6-BaZWrq-d.js → diagram-G4DWMVQ6-sdTDQV0t.js} +1 -1
  30. package/dist/assets/{diagram-MMDJMWI5-DlzU0RKB.js → diagram-MMDJMWI5-CelfzJxz.js} +1 -1
  31. package/dist/assets/{diagram-TYMM5635-Fej8ir1x.js → diagram-TYMM5635-z0RlpFuK.js} +1 -1
  32. package/dist/assets/{erDiagram-SMLLAGMA-Bwg0_DNs.js → erDiagram-SMLLAGMA-BHI2bnGz.js} +1 -1
  33. package/dist/assets/{flowDiagram-DWJPFMVM-pJ8Bv6wt.js → flowDiagram-DWJPFMVM-I1SWP3XA.js} +1 -1
  34. package/dist/assets/{ganttDiagram-T4ZO3ILL-DvgJ4Q6n.js → ganttDiagram-T4ZO3ILL-DZh82zoq.js} +1 -1
  35. package/dist/assets/{gitGraphDiagram-UUTBAWPF-Du8KitZ0.js → gitGraphDiagram-UUTBAWPF-DsMWEHvH.js} +1 -1
  36. package/dist/assets/{graph-57Q-0mNG.js → graph-BHosumIo.js} +1 -1
  37. package/dist/assets/{index-Cn0akK9k.js → index-CGG82Lfj.js} +1 -1
  38. package/dist/assets/{index-Bt7QsK9T.js → index-CiJgRlSn.js} +1 -1
  39. package/dist/assets/{index-_t_rn_h9.js → index-CyiyzBfV.js} +2 -2
  40. package/dist/assets/{index-CVh-Zo2A.js → index-Dn7Vc5py.js} +1 -1
  41. package/dist/assets/{index-BOryMxum.js → index-DnekML0c.js} +1 -1
  42. package/dist/assets/{index-EFFRo37G.js → index-VFaPBr79.js} +1 -1
  43. package/dist/assets/{index-zljZK-NO.js → index-_nQUY-oI.js} +1 -1
  44. package/dist/assets/{index-Cf77lzSr.js → index-s7YuKwmu.js} +1 -1
  45. package/dist/assets/{infoDiagram-42DDH7IO-DZz6OAQe.js → infoDiagram-42DDH7IO-DBi-2oXp.js} +1 -1
  46. package/dist/assets/{ishikawaDiagram-UXIWVN3A-Chrlpw73.js → ishikawaDiagram-UXIWVN3A-fIVocwqv.js} +1 -1
  47. package/dist/assets/{journeyDiagram-VCZTEJTY-D-fCEwg9.js → journeyDiagram-VCZTEJTY-CTSi1qOI.js} +1 -1
  48. package/dist/assets/{jszip.min-mU_-As7x.js → jszip.min-B7ufzfHi.js} +1 -1
  49. package/dist/assets/{kanban-definition-6JOO6SKY-DFdrm5t-.js → kanban-definition-6JOO6SKY-U8kfIi3w.js} +1 -1
  50. package/dist/assets/{layout-Dh-E01gA.js → layout-D5zEy4mK.js} +1 -1
  51. package/dist/assets/{linear-BjXnK-6T.js → linear-BAPnyqP4.js} +1 -1
  52. package/dist/assets/{mermaid.core-Cbqxn86C.js → mermaid.core-C8GuIPOP.js} +2 -2
  53. package/dist/assets/{min-B4n9eIGL.js → min-DP92r0cl.js} +1 -1
  54. package/dist/assets/{mindmap-definition-QFDTVHPH-Bw49x4oU.js → mindmap-definition-QFDTVHPH-CCrRqC11.js} +1 -1
  55. package/dist/assets/{pieDiagram-DEJITSTG-D-iq9rKK.js → pieDiagram-DEJITSTG-BrMSbuT1.js} +1 -1
  56. package/dist/assets/{quadrantDiagram-34T5L4WZ-QtFjo8i4.js → quadrantDiagram-34T5L4WZ-3K-JFsjs.js} +1 -1
  57. package/dist/assets/{requirementDiagram-MS252O5E-BwmEZf4F.js → requirementDiagram-MS252O5E-CiqMG6uM.js} +1 -1
  58. package/dist/assets/{sankeyDiagram-XADWPNL6-CTtXN32x.js → sankeyDiagram-XADWPNL6-CM98y9LX.js} +1 -1
  59. package/dist/assets/{seqResourceLoaders-pADDTbV6.css → seqResourceLoaders-BgD_Rwvc.css} +1 -1
  60. package/dist/assets/seqResourceLoaders-XMiEIVyV.js +2 -0
  61. package/dist/assets/{sequenceDiagram-FGHM5R23-DC00gRqs.js → sequenceDiagram-FGHM5R23-C4x_1BvX.js} +1 -1
  62. package/dist/assets/{stateDiagram-FHFEXIEX-CT963BWJ.js → stateDiagram-FHFEXIEX-DyPisIEy.js} +1 -1
  63. package/dist/assets/{stateDiagram-v2-QKLJ7IA2-1T7yDlvQ.js → stateDiagram-v2-QKLJ7IA2-1n69gYPg.js} +1 -1
  64. package/dist/assets/{timeline-definition-GMOUNBTQ-CDu66c9j.js → timeline-definition-GMOUNBTQ-CRnoneDr.js} +1 -1
  65. package/dist/assets/{vendor-antd-DADYo_zg.js → vendor-antd-CSjy2pdD.js} +1 -1
  66. package/dist/assets/{vendor-codemirror-tF6HNoR6.js → vendor-codemirror-Clv6kvI5.js} +1 -1
  67. package/dist/assets/{vendor-mdxeditor-CFAmRN3Y.js → vendor-mdxeditor-CtujsSUV.js} +2 -2
  68. package/dist/assets/{vendor-qrcode-DYKmbePy.js → vendor-qrcode-Bs-eoLpy.js} +1 -1
  69. package/dist/assets/{vendor-virtuoso-TxPxvPjL.js → vendor-virtuoso-DsaYo4Fi.js} +1 -1
  70. package/dist/assets/{vennDiagram-DHZGUBPP-DSm6yR_C.js → vennDiagram-DHZGUBPP-JQY_eM5i.js} +1 -1
  71. package/dist/assets/{wardley-RL74JXVD-kFdCN4XL.js → wardley-RL74JXVD-CvCX-J_r.js} +1 -1
  72. package/dist/assets/{wardleyDiagram-NUSXRM2D-BY1GQbCO.js → wardleyDiagram-NUSXRM2D-C1ZrJXnG.js} +1 -1
  73. package/dist/assets/{xychartDiagram-5P7HB3ND-ONnFdWbS.js → xychartDiagram-5P7HB3ND-hR1VN6u6.js} +1 -1
  74. package/dist/index.html +4 -4
  75. package/package.json +1 -1
  76. package/server/interceptor.js +192 -51
  77. package/server/lib/interceptor-core.js +91 -0
  78. package/server/lib/v2/adapter.js +1 -1
  79. package/server/lib/v2/live-feed.js +2 -0
  80. package/server/lib/v2/meta-rows.js +3 -0
  81. package/server/lib/v2/v2-writer.js +1 -1
  82. package/server/proxy.js +39 -8
  83. package/server/pty-manager.js +6 -0
  84. package/server/routes/expert.js +47 -2
  85. package/server/routes/preferences.js +24 -7
  86. package/src/utils/modelSuggestions.js +48 -0
  87. package/src/utils/v3Assembler.js +1 -0
  88. package/src/utils/v3Rows.js +1 -0
  89. package/dist/assets/App-Bs6-c4Ov.css +0 -1
  90. package/dist/assets/App-DRYFClM8.js +0 -2
  91. package/dist/assets/classDiagram-6PBFFD2Q-CkmfHfqf.js +0 -1
  92. package/dist/assets/classDiagram-v2-HSJHXN6E-CkmfHfqf.js +0 -1
  93. package/dist/assets/clone-pjnYCaC4.js +0 -1
  94. package/dist/assets/seqResourceLoaders-CaQIrQWb.js +0 -2
@@ -239,6 +239,12 @@ async function _spawnClaudeImpl(proxyPort, cwd, extraArgs = [], claudePath = nul
239
239
  env.CCV_LOG_DIR = LOG_DIR; // 让 fork 出的 Claude Code 进程找到同一份 profile.json 等资源
240
240
  // 剥离 cc-viewer 的内部短路开关,避免泄漏给 claude 子进程
241
241
  delete env.CCV_SKIP_THINKING_DISPLAY;
242
+ // 剥离 server 专属的模式标记:spawned claude(尤其 teammate 子进程,它们会装 fetch hook)
243
+ // 不是 ccv server —— 继承 CCV_WORKSPACE_MODE 会让 interceptor 的 workspace 绑定终生为空
244
+ // (teammate 角色分配静默失效);CCV_ELECTRON_MULTITAB 同理只应由 server 进程持有
245
+ // (im-process-manager 对 IM worker 已有同款剥离先例)。
246
+ delete env.CCV_WORKSPACE_MODE;
247
+ delete env.CCV_ELECTRON_MULTITAB;
242
248
  // Claude Code NO_FLICKER 会让嵌入式 xterm 走 alt-screen 并丢失 scrollback。
243
249
  // cc-viewer 默认剥离继承值;确实需要时可显式设 CCV_KEEP_CLAUDE_CODE_NO_FLICKER=1。
244
250
  stripClaudeNoFlickerUnlessOptedIn(env);
@@ -7,11 +7,15 @@
7
7
  // 鉴权沿用 dispatch 之前的全局鉴权(与 files-fs 写操作一致,不额外 gate isLocal)。
8
8
  import { join } from 'node:path';
9
9
  import { readFileSync } from 'node:fs';
10
- import { readWorkspaceSystemText, writeWorkspaceSystemText } from '../lib/system-prompt-files.js';
10
+ import {
11
+ readWorkspaceSystemText, writeWorkspaceSystemText,
12
+ isNonEmptyFile, SYSTEM_PROMPT_FILE, APPEND_SYSTEM_PROMPT_FILE, DISABLE_AUTO_SYSTEM_PROMPT_ENV,
13
+ } from '../lib/system-prompt-files.js';
11
14
  import {
12
15
  MODEL_PROMPT_DIR, normalizeModelName, listModelPrompts,
13
- writeModelPrompt, deleteModelPrompt,
16
+ writeModelPrompt, deleteModelPrompt, matchModelPrompt,
14
17
  } from '../lib/model-system-prompts.js';
18
+ import { resolveSpawnModel } from '../lib/spawn-model-resolver.js';
15
19
  import { listSystemPromptPresets, groupPresetsByCategory, getSystemPromptVariablesDoc } from '../lib/system-prompt-presets.js';
16
20
  import { LOG_DIR } from '../../findcc.js';
17
21
 
@@ -37,6 +41,30 @@ function sendJson(res, code, obj) {
37
41
  } catch { /* socket 已关闭:忽略 */ }
38
42
  }
39
43
 
44
+ // Single source for "is a custom system prompt configured to inject" — mirrors the
45
+ // spawn-time injection semantics of buildSystemPromptFileArgs: the env kill switch wins;
46
+ // a matched model entry supersedes the Default sentinels for activation purposes.
47
+ // Fidelity note: spawn-only gates this helper cannot see (insideLogDir skip, manual
48
+ // --system-prompt-file flags, one-shot skip tokens) may rarely make "active" a false
49
+ // positive — acceptable for a UI hint.
50
+ function computeSystemPromptStatus(dir) {
51
+ if (process.env[DISABLE_AUTO_SYSTEM_PROMPT_ENV] === '1') {
52
+ return { active: false, modelId: null, matched: null, defaultActive: false };
53
+ }
54
+ const defaultActive = !!dir && (
55
+ isNonEmptyFile(join(dir, SYSTEM_PROMPT_FILE)) || isNonEmptyFile(join(dir, APPEND_SYSTEM_PROMPT_FILE))
56
+ );
57
+ const modelId = resolveSpawnModel(dir, process.env);
58
+ const match = modelId
59
+ ? matchModelPrompt(modelId, [
60
+ { dir: dir ? join(dir, MODEL_PROMPT_DIR) : null, scope: 'workspace' },
61
+ { dir: join(LOG_DIR, MODEL_PROMPT_DIR), scope: 'global' },
62
+ ])
63
+ : null;
64
+ const matched = match ? { scope: match.scope, name: match.name, mode: match.mode } : null;
65
+ return { active: !!matched || defaultActive, modelId, matched, defaultActive };
66
+ }
67
+
40
68
  async function getSystemText(req, res, parsedUrl, isLocal, deps) {
41
69
  try {
42
70
  const dir = await resolveDir(deps);
@@ -95,12 +123,17 @@ async function getModelPrompts(req, res, parsedUrl, isLocal, deps) {
95
123
  try {
96
124
  const dir = await resolveDir(deps);
97
125
  const globalDir = join(LOG_DIR, MODEL_PROMPT_DIR);
126
+ const status = computeSystemPromptStatus(dir);
98
127
  sendJson(res, 200, {
99
128
  workspaceDir: dir || null,
100
129
  workspaceActive: !!dir,
101
130
  globalDir,
102
131
  workspace: dir ? collectModelEntries(join(dir, MODEL_PROMPT_DIR)) : [],
103
132
  global: collectModelEntries(globalDir),
133
+ // 当前生效配置解析出的模型 id 及其命中的条目(未命中为 null)——弹窗据此把默认页签
134
+ // 指向命中条目;matched.name 为规范化大写名,与页签 key 的构成一致。
135
+ modelId: status.modelId,
136
+ matched: status.matched,
104
137
  });
105
138
  } catch (e) {
106
139
  console.error('[CC Viewer] expert model-prompts GET failed:', e.message);
@@ -108,6 +141,17 @@ async function getModelPrompts(req, res, parsedUrl, isLocal, deps) {
108
141
  }
109
142
  }
110
143
 
144
+ // 轻量状态查询(不内联提示词文本):头部工具栏据此决定是否自动露出「系统提示词修改」入口。
145
+ async function getSystemPromptStatus(req, res, parsedUrl, isLocal, deps) {
146
+ try {
147
+ const dir = await resolveDir(deps);
148
+ sendJson(res, 200, computeSystemPromptStatus(dir));
149
+ } catch (e) {
150
+ console.error('[CC Viewer] expert system-prompt-status GET failed:', e.message);
151
+ sendJson(res, 500, { error: 'read_failed' });
152
+ }
153
+ }
154
+
111
155
  function postModelPrompts(req, res, parsedUrl, isLocal, deps) {
112
156
  let body = '';
113
157
  let truncated = false;
@@ -174,4 +218,5 @@ export const expertRoutes = [
174
218
  { method: 'GET', match: 'exact', path: '/api/expert/model-prompts', handler: getModelPrompts },
175
219
  { method: 'POST', match: 'exact', path: '/api/expert/model-prompts', handler: postModelPrompts },
176
220
  { method: 'GET', match: 'exact', path: '/api/expert/system-prompt-presets', handler: getSystemPromptPresets },
221
+ { method: 'GET', match: 'exact', path: '/api/expert/system-prompt-status', handler: getSystemPromptStatus },
177
222
  ];
@@ -3,8 +3,8 @@ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
3
3
  import { join, dirname } from 'node:path';
4
4
  import { homedir } from 'node:os';
5
5
  import { LOG_DIR, setLogDir, getClaudeConfigDir, discoverClaudeExecutables, resolveExplicitClaudePath, CLAUDE_EXECUTABLE_PREF_KEY } from '../../findcc.js';
6
- import { PROFILE_PATH, _defaultConfig, getActiveProfileId, setActiveProfileForWorkspace, _loadProxyProfile, RETRY_CONFIG_PATH, _retryConfigState, _loadRetryConfigState } from '../interceptor.js';
7
- import { migrateProxyProfileList } from '../lib/interceptor-core.js';
6
+ import { PROFILE_PATH, _defaultConfig, getActiveProfileId, getStoredRoles, isOfficialDefaultEndpoint, setActiveProfileForWorkspace, _loadProxyProfile, RETRY_CONFIG_PATH, _retryConfigState, _loadRetryConfigState } from '../interceptor.js';
7
+ import { migrateProxyProfileList, isValidRoleValue, PROXY_ROLE_KEYS } from '../lib/interceptor-core.js';
8
8
  import { DEFAULT_RETRY_CONFIG, validateRetryConfig, resolveRetryConfig } from '../lib/proxy-retry.js';
9
9
  import { discoverCcSwitchProviders, mergeImportedProfiles } from '../lib/ccswitch-import.js';
10
10
  import { reportSwallowed } from '../lib/error-report.js';
@@ -307,7 +307,9 @@ function proxyProfilesGet(req, res, parsedUrl, isLocal, deps) {
307
307
  // 本机(127.0.0.1)= admin:下发明文 profile.apiKey 供本人在编辑表单(👁 折叠)里查阅/复制;已授权
308
308
  // 的远程客户端只拿脱敏值(****+后4位)。保存时若回传脱敏值,POST 侧 isMasked() 会保留磁盘原值。
309
309
  // 镜像 /api/auth/state 的密码、/api/dingtalk/status 的 appSecret 策略。
310
- const full = { ...data, active: effectiveActive };
310
+ // roles 返回**存储值**(不做休眠调整):休眠只是请求侧不生效,若返回有效值,UI 缓存后
311
+ // 在下次无关 POST 回写会把休眠中的分配清掉。officialDefault 驱动 UI 隐藏角色分配区。
312
+ const full = { ...data, active: effectiveActive, roles: getStoredRoles(), officialDefault: isOfficialDefaultEndpoint() };
311
313
  const payload = isLocal ? full : deps.maskProfiles(full);
312
314
  // defaultConfig.apiKey 始终脱敏:它在列表里是常显文本(无 👁 折叠),且 Max/OAuth 默认配置的 key
313
315
  // 可能是 OAuth token;只有可编辑 profile 的 key 才按 isLocal 明文下发。
@@ -351,9 +353,24 @@ function proxyProfilesPost(req, res, parsedUrl, isLocal, deps) {
351
353
  const dir = dirname(PROFILE_PATH);
352
354
  if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
353
355
  writeFileSync(PROFILE_PATH, JSON.stringify(toWrite, null, 2), { mode: 0o600 });
354
- // active 走 workspace 级别存储(当前进程独占)
355
- if (typeof incoming.active === 'string' && incoming.active) {
356
- setActiveProfileForWorkspace(incoming.active);
356
+ // 角色分配校验:只认 subagent/teammate 两个 key(roles.main 之类的杂键直接丢弃);
357
+ // 值必须是 follow / max / 入参 profiles 里存在的 id(按将落盘的列表校验,而非旧文件),
358
+ // 非法值归 'follow'(宽容风格,不 400)。被删 profile 的悬空角色由读取时归 follow 兜底。
359
+ let sanitizedRoles;
360
+ if (incoming.roles && typeof incoming.roles === 'object' && !Array.isArray(incoming.roles)) {
361
+ const byId = new Map(incoming.profiles.map(p => [p.id, p]));
362
+ sanitizedRoles = {};
363
+ for (const k of PROXY_ROLE_KEYS) {
364
+ if (!(k in incoming.roles)) continue; // 未提交的 key 不进 patch → 合并时保留存储值
365
+ const v = incoming.roles[k];
366
+ // key 提交了但值非法(非字符串 / 悬空 id)→ 归 'follow'(显式纠正,不是保留)
367
+ sanitizedRoles[k] = (typeof v === 'string' && v && isValidRoleValue(v, byId)) ? v : 'follow';
368
+ }
369
+ }
370
+ // active/roles 走 workspace 级别存储(当前进程独占);合并语义:缺省字段保留文件现值
371
+ const hasActive = typeof incoming.active === 'string' && incoming.active;
372
+ if (hasActive || sanitizedRoles) {
373
+ setActiveProfileForWorkspace(hasActive ? incoming.active : undefined, sanitizedRoles);
357
374
  } else {
358
375
  _loadProxyProfile(); // 仅列表变化时也刷新一次以反映删除 / 重命名
359
376
  }
@@ -361,7 +378,7 @@ function proxyProfilesPost(req, res, parsedUrl, isLocal, deps) {
361
378
  const effectiveActive = getActiveProfileId();
362
379
  const activeProfile = incoming.profiles?.find(p => p.id === effectiveActive) || null;
363
380
  const maskedProfile = activeProfile?.apiKey ? { ...activeProfile, apiKey: deps.maskApiKey(activeProfile.apiKey) } : activeProfile;
364
- sendEventToClients(deps.clients, 'proxy_profile', { active: effectiveActive, profile: maskedProfile });
381
+ sendEventToClients(deps.clients, 'proxy_profile', { active: effectiveActive, profile: maskedProfile, roles: getStoredRoles() });
365
382
  res.writeHead(200, { 'Content-Type': 'application/json' });
366
383
  res.end(JSON.stringify({ ok: true }));
367
384
  } catch {
@@ -0,0 +1,48 @@
1
+ // Pure collector for the "+ Add model" name field's type-ahead suggestions.
2
+ // Sources: the hot-reload proxy profiles (GET /api/proxy-profiles) and
3
+ // settings.json (GET /api/claude-settings). CLIENT-SAFE (no Node APIs, no
4
+ // imports) so node:test can import it directly.
5
+
6
+ const MODEL_NAME_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/; // keep in sync with server/lib/model-system-prompts.js
7
+
8
+ const PROFILE_MODEL_FIELDS = [
9
+ 'ANTHROPIC_MODEL',
10
+ 'ANTHROPIC_DEFAULT_OPUS_MODEL',
11
+ 'ANTHROPIC_DEFAULT_SONNET_MODEL',
12
+ 'ANTHROPIC_DEFAULT_HAIKU_MODEL',
13
+ 'activeModel', // legacy whole-replacement field; pre-migration files may still carry it
14
+ ];
15
+
16
+ // Claude Code appends "[1m]" to configured model ids; mirror the server's
17
+ // strip1m (server/lib/interceptor-core.js) so e.g. "claude-opus-4-8[1m]"
18
+ // suggests "claude-opus-4-8" instead of being dropped by the name regex.
19
+ const strip1m = (s) => s.replace(/\[1m\]/gi, '').trim();
20
+
21
+ export function collectModelSuggestions(profilesData, claudeSettingsData) {
22
+ const out = [];
23
+ const seen = new Set(); // case-insensitive dedupe; first occurrence keeps its casing
24
+ const push = (raw) => {
25
+ if (typeof raw !== 'string') return;
26
+ const v = strip1m(raw.trim());
27
+ if (!v) return;
28
+ if (v.toLowerCase() === 'default') return; // reserved tab name
29
+ if (/_APPEND$/i.test(v)) return; // reserved suffix (server rule)
30
+ if (!MODEL_NAME_RE.test(v)) return; // e.g. slash/colon ids the server would reject anyway
31
+ const key = v.toLowerCase();
32
+ if (seen.has(key)) return;
33
+ seen.add(key);
34
+ out.push(v);
35
+ };
36
+ // All profiles are merged (an entry matches whatever model a future launch
37
+ // resolves), then the default (Max/OAuth) profile's model signal from the
38
+ // same hot-reload payload, then settings.json.
39
+ for (const p of (profilesData?.profiles || [])) {
40
+ if (!p || typeof p !== 'object') continue;
41
+ for (const f of PROFILE_MODEL_FIELDS) push(p[f]);
42
+ }
43
+ push(profilesData?.defaultConfig?.model);
44
+ const cs = claudeSettingsData || {};
45
+ push(cs.model);
46
+ push(cs.env?.ANTHROPIC_MODEL);
47
+ return out;
48
+ }
@@ -95,6 +95,7 @@ export function createV3Assembler() {
95
95
  // teammates, persisted server-side (see agent-id.js).
96
96
  if (row.agent) entry.agent = row.agent;
97
97
  if (row.proxyUrl) entry.proxyUrl = row.proxyUrl;
98
+ if (row.proxyRole) entry.proxyRole = row.proxyRole;
98
99
  if (isSnapshot) entry._isCheckpoint = true;
99
100
  if (row.inProgress) {
100
101
  entry.inProgress = true;
@@ -17,6 +17,7 @@ export function rowToListItem(row) {
17
17
  timestamp: row.timestamp,
18
18
  url: row.url,
19
19
  proxyUrl: row.proxyUrl,
20
+ proxyRole: row.proxyRole,
20
21
  duration: row.duration,
21
22
  inProgress: row.inProgress === true,
22
23
  isHeartbeat: row.kind === 'heartbeat',
@@ -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_mzpnt_1{height:100%;box-sizing:border-box;overflow-y:auto;overflow-x:hidden;scrollbar-gutter:stable;padding:4px 2px;background:var(--bg-container)}._headerBar_mzpnt_15{display:flex;align-items:center;gap:8px}._refreshBtn_mzpnt_21{flex:0 0 auto}._statusTag_mzpnt_27{display:inline-flex;align-items:center;gap:8px;margin-left:auto}._statusTag_mzpnt_27 .ant-tag{margin-inline-end:0}._center_mzpnt_38{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:40px 0;color:var(--text-secondary)}._hint_mzpnt_48{color:var(--text-secondary);font-size:13px}._chip_dnl8s_4{position:relative;line-height:0;cursor:pointer;-webkit-user-select:none;user-select:none;transition:opacity .15s}._chip_dnl8s_4:hover{opacity:.75}._logo_dnl8s_16{display:block;transition:color .15s}._connecting_dnl8s_22{opacity:.5}._dotError_dnl8s_27{position:absolute;right:-2px;top:-2px;width:6px;height:6px;border-radius:50%;background:var(--color-error, #ff4d4f);pointer-events:none}._dotReconnecting_dnl8s_39{position:absolute;right:-2px;top:-2px;width:6px;height:6px;border-radius:50%;background:var(--color-warning, #f59e0b);pointer-events:none;animation:_imDotPulse_dnl8s_1 1.2s ease-in-out infinite}@keyframes _imDotPulse_dnl8s_1{0%,to{opacity:1}50%{opacity:.3}}@media(prefers-reduced-motion:reduce){._dotReconnecting_dnl8s_39{animation:none}}._modelCard_1tsd3_3{border:1px solid var(--border-secondary);border-radius:6px;padding:8px 10px;background:var(--bg-container)}._modelName_1tsd3_9{font-size:13px;font-weight:600;color:var(--text-primary);margin-bottom:8px;padding-bottom:4px;border-bottom:1px solid var(--border-secondary)}._statsTable_1tsd3_17{width:100%;border-collapse:collapse}._th_1tsd3_21{padding:2px 12px;font-size:12px;font-family:var(--font-mono);white-space:nowrap;color:var(--text-tertiary);font-weight:400;text-align:right}._td_1tsd3_30{padding:2px 12px;font-size:12px;font-family:var(--font-mono);white-space:nowrap;color:var(--text-primary);text-align:right}._label_1tsd3_38{padding:2px 12px;font-size:12px;font-family:var(--font-mono);white-space:nowrap;color:var(--text-light);font-weight:400;text-align:left}._rowBorder_1tsd3_47{border-bottom:1px solid var(--border-primary)}._rebuildTotalRow_1tsd3_50{border-top:1px solid var(--border-light)}._rebuildTotalRow_1tsd3_50 td{font-weight:600}._cachePopoverEmpty_1tsd3_56{padding:8px 4px;color:var(--text-tertiary);font-size:13px}._toolChipGrid_1tsd3_61{display:flex;flex-wrap:wrap;gap:4px;padding:2px 0 6px 2px}._cacheToolChip_1tsd3_67{font-size:11px;padding:0 6px;border-radius:3px;background:var(--bg-surface);color:var(--text-secondary);line-height:18px;max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border:1px solid var(--border-primary);cursor:help}._titleIcon_1tsd3_81{margin-right:8px}._detailMarkdownCard_1tsd3_86{border:1px solid var(--border-secondary);border-radius:6px;padding:8px 10px;background:var(--bg-container)}._memoryMarkdown_1tsd3_93{font-size:12.5px;line-height:1.55;color:var(--text-primary);word-break:break-word}._memoryMarkdown_1tsd3_93 p{margin:0 0 6px}._memoryMarkdown_1tsd3_93 ul,._memoryMarkdown_1tsd3_93 ol{margin:4px 0 6px;padding-left:20px}._memoryMarkdown_1tsd3_93 li{margin:2px 0}._memoryMarkdown_1tsd3_93 h1,._memoryMarkdown_1tsd3_93 h2,._memoryMarkdown_1tsd3_93 h3,._memoryMarkdown_1tsd3_93 h4{font-size:13px;font-weight:600;margin:8px 0 4px;color:var(--text-primary)}._memoryMarkdown_1tsd3_93 h1{font-size:14px}._memoryMarkdown_1tsd3_93 a{color:var(--primary-color, #1677ff);text-decoration:none;cursor:pointer}._memoryMarkdown_1tsd3_93 a:hover{text-decoration:underline}._memoryMarkdown_1tsd3_93 code{font-family:var(--font-mono);font-size:12px;padding:1px 4px;border-radius:3px;background:var(--bg-surface);color:var(--text-primary)}._memoryMarkdown_1tsd3_93 pre{margin:6px 0;padding:8px 10px;border-radius:4px;background:var(--bg-surface);overflow-x:auto}._memoryMarkdown_1tsd3_93 pre code{padding:0;background:transparent;font-size:12px}._memoryMarkdown_1tsd3_93 blockquote{margin:4px 0;padding:2px 8px;border-left:3px solid var(--border-hover);color:var(--text-secondary)}._memoryMarkdown_1tsd3_93 hr{margin:8px 0;border:none;border-top:1px solid var(--border-secondary)}._quickMenuGroup_1tsd3_164{position:relative}._quickMenuRow_1tsd3_168{display:flex;align-items:center;gap:6px;width:100%;background:none;border:none;color:var(--text-primary);font-size:13px;padding:6px 12px;text-align:left;cursor:pointer;border-radius:4px;white-space:nowrap}._quickMenuGroup_1tsd3_164:hover ._quickMenuRow_1tsd3_168,._quickMenuGroupOpen_1tsd3_185 ._quickMenuRow_1tsd3_168{background:var(--border-secondary)}._quickMenuRowIcon_1tsd3_189{display:flex;align-items:center;color:var(--text-tertiary)}._quickMenuRowIcon_1tsd3_189 svg{width:14px;height:14px}._quickMenuLabel_1tsd3_200{flex:1}._quickMenuValue_1tsd3_205{color:var(--text-tertiary);font-size:12px}._quickMenuCaret_1tsd3_210{color:var(--text-tertiary);font-size:10px}._quickMenuSubWrap_1tsd3_218{display:none;position:absolute;left:100%;bottom:-5px;padding-left:6px;z-index:1}._quickMenuGroupOpen_1tsd3_185 ._quickMenuSubWrap_1tsd3_218{display:block}._quickMenuSub_1tsd3_218{display:flex;flex-direction:column;background:var(--bg-elevated);border:1px solid var(--border-hover);border-radius:8px;padding:4px;min-width:76px;max-height:60vh;overflow-y:auto;box-shadow:0 6px 16px #0000002e}._quickMenuOption_1tsd3_248{background:none;border:none;color:var(--text-primary);font-size:13px;padding:5px 12px;text-align:left;cursor:pointer;border-radius:4px;white-space:nowrap}._quickMenuOption_1tsd3_248:hover{background:var(--border-secondary)}._quickMenuOption_1tsd3_248._quickMenuOptionActive_1tsd3_264{color:var(--color-primary);font-weight:500}._headerBar_jseur_2{display:flex;align-items:center;justify-content:space-between;width:100%;height:100%}._logoWrap_jseur_10{display:inline-flex;align-items:center;position:relative;margin-top:14px}._logoWrapActive_jseur_17:after{content:"";position:absolute;top:-10px;bottom:-10px;left:0;right:-200px}._logoImage_jseur_26{height:24px;width:24px;border-radius:3px;vertical-align:middle;opacity:.75;transition:opacity .2s;cursor:pointer}._logoImageActive_jseur_36{opacity:1}._compactBtn_jseur_43{font-size:12px;height:30px;display:inline-flex;align-items:center;justify-content:center}._compactBtnNoBorder_jseur_52{width:30px;height:30px;min-width:30px;padding:0;border:none;font-size:18px;line-height:1;display:inline-flex;align-items:center;justify-content:center}._compactBtnNoBorder_jseur_52 .anticon{display:inline-flex;align-items:center;justify-content:center;line-height:0}._headerProjectName_jseur_79{font-size:12px;color:inherit;white-space:nowrap}._headerProjectName_jseur_79:hover [data-alias-edit-trigger],._headerProjectName_jseur_79:focus-within [data-alias-edit-trigger]{opacity:.55}._countdownStrong_jseur_96{font-variant-numeric:tabular-nums}._qrcodePopover_jseur_101{display:flex;flex-direction:column;align-items:center;padding:8px}._qrcodeSection_jseur_108{display:flex;flex-direction:column;align-items:center;padding:16px;margin-bottom:12px;border:1px solid var(--border-secondary);border-radius:8px;background:var(--bg-container)}._qrcodeTitle_jseur_119{font-size:14px;font-weight:600;color:var(--text-primary);margin-bottom:12px}._qrcodeUrlInput_jseur_126{margin-top:12px;font-size:12px;font-family:var(--font-mono)}._qrcodeUrlCopy_jseur_132{cursor:pointer;color:var(--text-tertiary);transition:color .2s}._qrcodeUrlCopy_jseur_132:hover{color:var(--color-primary-light)}._authSection_jseur_143{display:flex;flex-direction:column;align-items:stretch;box-sizing:border-box;width:100%;margin-top:12px;padding:12px;border:1px solid var(--border-secondary);border-radius:8px;background:var(--bg-container);gap:8px}._authHeaderRow_jseur_157{display:flex;align-items:center;justify-content:space-between}._authTitle_jseur_163{font-size:13px;font-weight:600;color:var(--text-primary)}._authPasswordLabel_jseur_169{font-size:12px;color:var(--text-secondary)}._authPasswordInput_jseur_174{font-size:12px;font-family:var(--font-mono)}._authSaveBtn_jseur_179{align-self:flex-end}._authEmptyWarn_jseur_183{font-size:12px;color:var(--color-error-light);line-height:1.4}._settingsGroupBox_jseur_191{border:1px solid var(--border-secondary);border-radius:8px;background:var(--bg-container);padding:4px 16px;margin-bottom:12px}._settingsGroupTitle_jseur_199{font-size:14px;font-weight:600;color:var(--text-primary);padding:12px 0 4px;border-bottom:1px solid var(--border-secondary)}._settingsItem_jseur_208{display:flex;justify-content:space-between;align-items:center;padding:12px 0}._settingsLabel_jseur_215{font-size:14px}._settingsHelpIcon_jseur_220{font-size:16px;color:var(--text-disabled);cursor:help;margin-left:4px}._settingsDivider_jseur_227{border-top:1px solid var(--border-primary);margin:12px 0}._logDirInput_jseur_232{margin-top:8px;background:var(--bg-base-alt);border-color:var(--border-light);color:var(--text-primary);font-family:var(--font-mono);font-size:13px}._claudeExecutableInput_jseur_241{width:100%;margin-top:8px;font-family:var(--font-mono);font-size:12px}._claudeExecutableHint_jseur_248{margin-top:6px;color:var(--text-tertiary);font-size:12px;line-height:1.5;overflow-wrap:anywhere}._tokenStatsEmpty_jseur_257{padding:8px 4px;color:var(--text-tertiary);font-size:13px}._tokenStatsContainer_jseur_264{display:flex;gap:12px;align-items:flex-start}._tokenStatsColumn_jseur_270{min-width:240px}._toolStatsColumn_jseur_274{min-width:180px}._modelCardSpaced_jseur_280{margin-bottom:10px}._rebuildCard_jseur_289{border:1px solid var(--border-secondary);border-radius:6px;padding:8px 10px;margin-top:10px;background:var(--bg-container)}._promptExportBar_jseur_298{margin-bottom:12px}._promptScrollArea_jseur_302{max-height:500px;overflow:auto}._promptEmpty_jseur_307{color:var(--text-tertiary);padding:12px}._promptTimestamp_jseur_313{color:var(--text-muted);font-size:12px;margin:12px 0 4px;padding-bottom:6px}._textPromptCard_jseur_321{margin:4px 0;background:var(--bg-container);border-radius:6px;border:1px solid var(--border-secondary);padding:10px 14px}._preText_jseur_330{white-space:pre-wrap;word-break:break-word;font-size:13px;line-height:1.6;color:var(--text-primary);margin:4px 0}._systemCollapse_jseur_340{margin:4px 0;background:var(--bg-elevated);border:1px solid var(--border-secondary);border-radius:6px}._systemLabel_jseur_347{color:var(--text-tertiary);font-size:12px}._preSys_jseur_352{white-space:pre-wrap;word-break:break-word;font-size:12px;line-height:1.5;color:var(--text-tertiary);margin:0}._promptTextarea_jseur_362{box-sizing:border-box;background:var(--bg-base-pure);width:100%;min-height:400px;color:var(--text-primary);font-family:var(--font-mono);font-size:13px;line-height:1.6;border:none;resize:vertical;padding:10px 14px;outline:none}._projectStatsCenter_jseur_378{display:flex;justify-content:center;padding:40px 0}._projectStatsEmpty_jseur_384{color:var(--text-tertiary);padding:40px 0;text-align:center;font-size:13px}._projectStatsContent_jseur_391{display:flex;flex-direction:column;gap:16px}._projectStatsUpdated_jseur_397{color:var(--text-muted);font-size:12px;text-align:right}._projectStatsSummary_jseur_403{display:grid;grid-template-columns:1fr 1fr;gap:10px}._projectStatCard_jseur_409{background:var(--bg-container);border:1px solid var(--border-secondary);border-radius:8px;padding:14px 12px;text-align:center}._projectStatValue_jseur_417{font-size:22px;font-weight:700;color:var(--text-primary);font-family:var(--font-mono);font-variant-numeric:tabular-nums}._projectStatLabel_jseur_425{font-size:12px;color:var(--text-tertiary);margin-top:4px}._projectStatsSection_jseur_431{display:flex;flex-direction:column;gap:10px}._projectStatsSectionTitle_jseur_437{font-size:14px;font-weight:600;color:var(--text-secondary);padding-bottom:4px;border-bottom:1px solid var(--border-secondary)}._projectStatsModelCard_jseur_445{background:var(--bg-container);border:1px solid var(--border-secondary);border-radius:6px;padding:10px 12px}._projectStatsModelHeader_jseur_452{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;padding-bottom:4px;border-bottom:1px solid var(--border-secondary)}._projectStatsModelName_jseur_461{font-size:13px;font-weight:600;color:var(--text-primary)}._projectStatsModelCount_jseur_467{font-size:12px;color:var(--text-tertiary);font-family:var(--font-mono)}._cacheCopyBtn_jseur_475{font-size:14px;color:var(--text-tertiary);cursor:pointer;transition:color .2s;margin-left:8px}._cacheCopyBtn_jseur_475:hover{color:var(--text-primary)}._cacheTokenInfo_jseur_487{display:flex;align-items:center;font-size:12px;font-family:var(--font-mono);color:var(--text-light);margin-bottom:8px}._cacheCodeBlock_jseur_500{white-space:pre-wrap;word-break:break-word;font-size:12px;line-height:1.5;color:var(--text-secondary);background:var(--bg-container);border:1px solid var(--border-primary);border-radius:4px;padding:8px;margin:4px 0;font-family:var(--font-mono)}._cacheCodeBlockSystem_jseur_514{white-space:pre-wrap;word-break:break-word;font-size:12px;line-height:1.5;color:var(--text-secondary);background:var(--bg-code-system);border:1px solid var(--border-code-system);border-radius:4px;padding:8px;margin:4px 0;font-family:var(--font-mono)}._cacheNavBtn_jseur_528{margin-left:auto;font-size:11px;color:var(--color-primary);cursor:pointer;border:1px solid var(--color-primary);border-radius:3px;padding:1px 6px;white-space:nowrap}._cacheNavBtn_jseur_528:hover{background:var(--color-primary-bg-light)}._cacheNavList_jseur_543{width:600px;max-height:300px;overflow-y:auto}._cacheNavItem_jseur_549{padding:4px 8px;font-size:12px;color:var(--text-secondary);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-radius:3px}._cacheNavItem_jseur_549:hover{background:var(--color-primary-bg-lighter);color:var(--text-white)}._cacheBlockHighlight_jseur_565{box-shadow:0 0 10px var(--color-primary-shadow);transition:box-shadow .2s ease-in}._cacheBlockHighlightFading_jseur_570{box-shadow:0 0 10px transparent;transition:box-shadow 3s ease-out}._cacheBorderSvg_jseur_575{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;pointer-events:none;overflow:visible}._cacheBorderSvgFading_jseur_584{opacity:0;transition:opacity 3s ease-out}._cacheBorderRect_jseur_589{animation:_cacheDashRotate_jseur_1 4s linear infinite}@keyframes _cacheDashRotate_jseur_1{0%{stroke-dashoffset:0}to{stroke-dashoffset:-100}}._thLeft_jseur_599{text-align:left}._cacheWriteToken_jseur_614{color:var(--color-code-orange)}._cacheReadToken_jseur_618{color:var(--color-success)}._cacheCtxPercent_jseur_622{color:var(--text-tertiary);margin-left:6px}._qrcodeIcon_jseur_642{width:30px;height:30px;padding:6px;box-sizing:border-box;color:var(--text-secondary);cursor:pointer;border-radius:6px;transition:color .15s ease,background-color .15s ease;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;background:none;border:none}._qrcodeIcon_jseur_642:hover{color:var(--text-primary);background:var(--bg-hover, rgba(0, 0, 0, .04))}._qrcodeIcon_jseur_642:focus-visible{outline:2px solid var(--primary-color, #1677ff);outline-offset:1px}._approvalBell_jseur_668{position:relative;width:30px;height:30px;padding:6px;box-sizing:border-box;color:var(--color-warning, #faad14);cursor:pointer;border-radius:6px;transition:color .15s ease,background-color .15s ease;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;background:none;border:none}._approvalBell_jseur_668:hover{color:var(--text-primary);background:var(--bg-hover, rgba(0, 0, 0, .04))}._approvalBell_jseur_668:focus-visible{outline:2px solid var(--primary-color, #1677ff);outline-offset:1px}._approvalBellBadge_jseur_693{position:absolute;top:0;right:0;min-width:14px;height:14px;padding:0 3px;box-sizing:border-box;background:var(--color-error, #ff4d4f);color:#fff;font-size:9px;line-height:14px;border-radius:7px;text-align:center;font-weight:600}._proxySwapIcon_jseur_710{margin-right:4px;font-size:11px}._proxyProfileTag_jseur_716{border-radius:12px;background:var(--border-secondary);border:1px solid var(--border-light);color:var(--text-tertiary);font-size:12px;cursor:pointer;transition:color .2s,border-color .2s}._proxyProfileTag_jseur_716:hover{color:var(--text-secondary);border-color:var(--text-disabled)}._pinnedShortcut_jseur_732{height:24px;margin-top:11px;display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1;color:var(--text-tertiary);opacity:.75;cursor:pointer;transition:opacity .2s,color .2s}._pinnedShortcut_jseur_732:hover{opacity:1;color:var(--text-secondary)}._pinnedShortcut_jseur_732 .anticon{display:inline-flex;align-items:center;justify-content:center;line-height:0}._themeToggle_jseur_761{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;width:30px;height:30px;padding:0;border:none;border-radius:6px;background:transparent;color:var(--text-secondary);cursor:pointer;transition:background-color .2s ease,color .2s ease;flex-shrink:0;outline:none}._themeToggle_jseur_761:hover{background:var(--color-bg-hover, rgba(127, 127, 127, .12));color:var(--text-primary)}._themeToggle_jseur_761:focus-visible{box-shadow:0 0 0 2px var(--primary-color, #1677ff)}._themeToggleIcon_jseur_787{display:block}._headerRightRow_jseur_792 .ant-space-item{display:inline-flex;align-items:center}._headerCountdownTag_jseur_798{height:30px;margin:0;padding:0 10px;display:inline-flex;align-items:center;background:var(--bg-surface);border:1px solid var(--border-hover);border-radius:6px;line-height:1}._centerEmpty_1ivpu_1{display:flex;align-items:center;justify-content:center;height:100%}._scrollContainer_1ivpu_8{overflow:auto;height:100%;-webkit-overflow-scrolling:touch;will-change:scroll-position}._listItem_1ivpu_15{cursor:pointer;padding:8px 12px;border-left:6px solid transparent;border-right:1px solid var(--border-primary);border-top:1px solid transparent;border-bottom:1px solid var(--border-primary);transition:background .15s}._listItem_1ivpu_15:hover{border-left-color:var(--border-hover)}._listItemActive_1ivpu_29{background:var(--color-primary-bg-faint);border-left-color:var(--color-primary-light);border-right:1px solid var(--color-primary-light);border-top:1px solid var(--color-primary-light);border-bottom:1px solid var(--color-primary-light)}._listItemActive_1ivpu_29,._listItemActive_1ivpu_29:hover{background:var(--color-primary-bg-faint);border-left-color:var(--color-primary-light);border-right-color:var(--color-primary-light);border-top-color:var(--color-primary-light);border-bottom-color:var(--color-primary-light)}._itemContent_1ivpu_46{width:100%;min-width:0}._itemHeader_1ivpu_51{display:flex;align-items:center;gap:6px;margin-bottom:4px;font-size:12px}._tagNoMargin_1ivpu_59{margin:0;font-size:12px}._modelName_1ivpu_64{font-size:12px;color:var(--text-tertiary)}._modelNameMain_1ivpu_69{color:var(--color-code-orange)}._time_1ivpu_73{font-size:12px;color:var(--text-gray);margin-left:auto}._detailRow_1ivpu_79{display:flex;gap:8px;font-size:12px;align-items:center}._urlText_1ivpu_86{color:var(--text-disabled);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}._duration_1ivpu_95{color:var(--text-gray);flex-shrink:0}._statusOk_1ivpu_100{color:var(--color-success);opacity:.5;flex-shrink:0}._statusErr_1ivpu_106{color:var(--color-error);flex-shrink:0}._statusDefault_1ivpu_111{color:var(--text-tertiary);flex-shrink:0}._usageBox_1ivpu_116{background:var(--bg-container);border-radius:4px;padding:3px 6px;margin-top:4px;font-size:12px;color:var(--text-gray);line-height:1.6}._cacheDot_1ivpu_126{display:inline-block;width:6px;height:6px;border-radius:50%;margin:0 3px;vertical-align:middle}._cacheDotLoss_1ivpu_135{background-color:var(--color-red-dark-bg);cursor:help}._cacheDotNormal_1ivpu_140{background-color:var(--border-hover)}._cacheDotTools_1ivpu_145{background-color:var(--color-code-purple);box-shadow:0 0 0 1.5px var(--color-purple-border)}._tagMainAgent_1ivpu_150{color:var(--color-code-orange);border-color:var(--color-code-orange-border);background:var(--color-code-orange-bg)}._tagPlan_1ivpu_156{color:var(--color-error-muted);border-color:var(--color-error-muted);background-color:var(--bg-base-pure)}._tagMuted_1ivpu_162{color:var(--text-muted);border-color:var(--border-light);background-color:var(--bg-base-pure)}._tooltipPreLine_1ivpu_168{white-space:pre-line}._GzYRV{line-height:1.2;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}._3eOF8{margin-right:5px;font-weight:700}._3eOF8+._3eOF8{margin-left:-5px}._1MFti{cursor:pointer}._f10Tu{font-size:1.2em;margin-right:5px;-webkit-user-select:none;-moz-user-select:none;user-select:none}._1UmXx:after{content:"▸"}._1LId0:after{content:"▾"}._1pNG9{margin-right:5px}._1pNG9:after{content:"...";font-size:.8em}._2IvMF{background:#eee}._2bkNM{margin:0;padding:0 10px}._1BXBN{margin:0;padding:0}._1MGIk{font-weight:600;margin-right:5px;color:#000}._3uHL6{color:#000}._2T6PJ,._1Gho6{color:#df113a}._vGjyY{color:#2a3f3c}._1bQdo{color:#0b75f5}._3zQKs{color:#469038}._1xvuR{color:#43413d}._oLqym,._2AXVT,._2KJWg{color:#000}._11RoI{background:#002b36}._17H2C,._3QHg2,._3fDAz{color:#fdf6e3}._2bSDX{font-weight:bolder;margin-right:5px;color:#fdf6e3}._gsbQL{color:#fdf6e3}._LaAZe,._GTKgm{color:#81b5ac}._Chy1W{color:#cb4b16}._2bveF{color:#d33682}._2vRm-{color:#ae81ff}._1prJR{color:#268bd2}._container_b5r6a_1{background:var(--bg-container);border-radius:6px;border:1px solid var(--border-primary);padding:12px;font-size:13px;font-family:var(--font-mono);overflow:auto}._root_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)}