cc-viewer 1.5.36 → 1.5.39

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.
@@ -1,4 +1,4 @@
1
- body{margin:0;background-color:#0d0d0d}*{scrollbar-width:thin;scrollbar-color:#3a3a3a #0d0d0d}@media(pointer:coarse){*{scrollbar-width:auto;scrollbar-color:auto}}@media(pointer:fine){*::-webkit-scrollbar{width:6px;height:6px}*::-webkit-scrollbar-track{background:#0d0d0d}*::-webkit-scrollbar-thumb{background:#3a3a3a;border-radius:3px}*::-webkit-scrollbar-thumb:hover{background:#555}}.code-highlight{color:#e6edf3}.hl-keyword{color:#ff7b72}.hl-string{color:#a5d6ff}.hl-comment{color:#8b949e;font-style:italic}.hl-number{color:#79c0ff}.hl-linenum{color:#484f58;-webkit-user-select:none;user-select:none}.chat-md pre{background:#0d1117;border:1px solid #2a2a2a;border-radius:6px;padding:12px;overflow-x:auto;font-size:13px;line-height:1.5}.chat-md code{background:#1a1a2e;padding:2px 6px;border-radius:4px;font-size:13px;color:#e5e7eb}.chat-md pre code{background:none;padding:0}.chat-md p{margin:6px 0}.chat-md ul,.chat-md ol{padding-left:20px;margin:6px 0}.chat-md li{margin:2px 0}.chat-md h1,.chat-md h2,.chat-md h3{margin:12px 0 6px;color:#fff}.chat-md h1{font-size:1.3em}.chat-md h2{font-size:1.15em}.chat-md h3{font-size:1.05em}.chat-md blockquote{border-left:3px solid #3b82f6;margin:8px 0;padding:4px 12px;color:#9ca3af}.chat-md table{border-collapse:collapse;margin:8px 0;font-size:13px}.chat-md th,.chat-md td{border:1px solid #2a2a2a;padding:6px 10px}.chat-md th{background:#1a1a1a;color:#fff}.chat-md a{color:#60a5fa}.chat-md hr{border:none;border-top:1px solid #2a2a2a;margin:12px 0}.chat-md strong{color:#f1f5f9}.chat-md em{color:#cbd5e1}.ant-dropdown .logo-dropdown-menu .ant-dropdown-menu-item,.ant-dropdown .logo-dropdown-menu .ant-dropdown-menu-submenu-title{font-size:12px!important}.ant-tooltip .ant-tooltip-inner{background-color:#090909}.ant-tooltip .ant-tooltip-arrow:before,.ant-tooltip .ant-tooltip-arrow:after{background:#090909}.ant-modal-confirm .ant-modal-content{background-color:#1a1a1a;border:1px solid #2a2a2a}.ant-modal-confirm .ant-modal-confirm-title{color:#e6e6e6}.ant-modal-confirm .ant-modal-confirm-content{color:#aaa}.ant-modal-confirm .ant-btn-default{background-color:transparent;border-color:#444;color:#ccc}.ant-modal-confirm .ant-btn-default.ant-btn-default:hover,.ant-modal-confirm .ant-btn-default.ant-btn-default:focus{background-color:#2a2a2a;border-color:#666;color:#fff}.ant-modal-confirm .ant-btn-primary{background-color:#1668dc;border-color:#1668dc}.ant-modal-confirm .ant-btn-primary:hover{background-color:#1554ad;border-color:#1554ad}._helpBtn_ovmho_1{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:50%;background:#1a1a1a;border:1px solid #444;color:#aaa;font-size:11px;line-height:1;cursor:pointer;margin-left:4px;vertical-align:middle;transition:background .2s;-webkit-user-select:none;user-select:none}._helpBtn_ovmho_1:hover{background:#333}._modalBody_ovmho_24{max-height:60vh;overflow-y:auto;overflow-x:hidden;line-height:1.7;color:#d9d9d9;word-break:break-word}._modalBody_ovmho_24 h1,._modalBody_ovmho_24 h2,._modalBody_ovmho_24 h3{margin-top:.8em;color:#f0f0f0}._modalBody_ovmho_24 p{margin:.5em 0}._modalBody_ovmho_24 code{background:#2a2a2a;padding:1px 4px;border-radius:3px;font-size:.9em;color:#e8ab6a}._modalBody_ovmho_24 pre{background:#1a1a1a;padding:12px;border-radius:6px;overflow-x:auto;color:#d9d9d9;max-width:100%;box-sizing:border-box}._modalBody_ovmho_24 a{color:#5b9bd5}._modalBody_ovmho_24 strong{color:#f0f0f0}._spinWrap_ovmho_70{display:flex;justify-content:center;padding:40px 0}._modalBody_ovmho_24 textarea{width:100%;min-height:200px;background:#1a1a1a;color:#d9d9d9;font-family:monospace;font-size:13px;line-height:1.6;border:1px solid #333;border-radius:6px;padding:10px 14px;resize:vertical;outline:none;box-sizing:border-box}@media(max-width:768px){._modalBody_ovmho_24{font-size:13px;line-height:1.6;max-height:75vh}._modalBody_ovmho_24 h1{font-size:18px}._modalBody_ovmho_24 h2{font-size:16px}._modalBody_ovmho_24 h3{font-size:14px}._modalBody_ovmho_24 pre{font-size:12px;padding:8px}._modalBody_ovmho_24 code,._modalBody_ovmho_24 textarea{font-size:12px}}._headerBar_1pxqw_2{display:flex;align-items:center;justify-content:space-between;width:100%;height:100%}._logoWrap_1pxqw_10{display:inline-flex;align-items:center;position:relative;margin-top:14px}._logoWrapActive_1pxqw_17:after{content:"";position:absolute;top:-10px;bottom:-10px;left:0;right:-200px}._logoImage_1pxqw_26{height:24px;width:24px;border-radius:3px;vertical-align:middle;opacity:.75;transition:opacity .2s;cursor:pointer}._logoImageActive_1pxqw_36{opacity:1}._compactBtn_1pxqw_41{font-size:12px;height:30px;line-height:28px}._compactBtnNoBorder_1pxqw_47{font-size:12px;height:30px;line-height:28px;border:none}._tokenStatsTag_1pxqw_55{border-radius:12px;cursor:pointer;background:#2a2a2a;border:1px solid #3a3a3a;color:#ccc}._tokenStatsIcon_1pxqw_63{margin-right:4px}._liveTag_1pxqw_68{position:relative;display:inline-flex;align-items:center;border-radius:12px;border:1px solid;padding:0 10px;height:22px;font-size:12px;line-height:22px;overflow:hidden;transition:border-color .3s,color .3s;white-space:nowrap}._liveTagFill_1pxqw_83{position:absolute;left:0;top:0;bottom:0;opacity:.35;transition:width .5s ease,background-color .3s;pointer-events:none}._liveTagContent_1pxqw_93{position:relative;z-index:1;display:inline-flex;align-items:center}._liveTagHistory_1pxqw_100{background:#2a2a2a;border-color:#424242;color:#d1d5db}._liveTagText_1pxqw_106{margin-left:4px}._countdownStrong_1pxqw_111{font-variant-numeric:tabular-nums}._qrcodePopover_1pxqw_116{display:flex;flex-direction:column;align-items:center;padding:8px}._qrcodeSection_1pxqw_123{display:flex;flex-direction:column;align-items:center;padding:16px;margin-bottom:12px;border:1px solid #333;border-radius:8px;background:#111}._qrcodeTitle_1pxqw_134{font-size:14px;font-weight:600;color:#e5e5e5;margin-bottom:12px}._qrcodeUrlInput_1pxqw_141{margin-top:12px;font-size:12px;font-family:Menlo,Monaco,monospace}._qrcodeUrlCopy_1pxqw_147{cursor:pointer;color:#888;transition:color .2s}._qrcodeUrlCopy_1pxqw_147:hover{color:#3b82f6}._settingsGroupBox_1pxqw_158{border:1px solid #333;border-radius:8px;background:#111;padding:4px 16px;margin-bottom:12px}._settingsGroupTitle_1pxqw_166{font-size:14px;font-weight:600;color:#e5e5e5;padding:12px 0 4px;border-bottom:1px solid #333}._settingsItem_1pxqw_175{display:flex;justify-content:space-between;align-items:center;padding:12px 0}._settingsLabel_1pxqw_182{font-size:14px}._tokenStatsEmpty_1pxqw_187{padding:8px 4px;color:#999;font-size:13px}._tokenStatsContainer_1pxqw_194{display:flex;gap:12px;align-items:flex-start}._tokenStatsColumn_1pxqw_200{min-width:240px}._toolStatsColumn_1pxqw_204{min-width:180px}._modelCard_1pxqw_209{border:1px solid #333;border-radius:6px;padding:8px 10px;background:#111}._modelCardSpaced_1pxqw_216{margin-bottom:10px}._modelName_1pxqw_222{font-size:13px;font-weight:600;color:#e5e5e5;margin-bottom:8px;padding-bottom:4px;border-bottom:1px solid #333}._statsTable_1pxqw_232{width:100%;border-collapse:collapse}._th_1pxqw_237{padding:2px 12px;font-size:12px;font-family:monospace;white-space:nowrap;color:#888;font-weight:400;text-align:right}._td_1pxqw_247{padding:2px 12px;font-size:12px;font-family:monospace;white-space:nowrap;color:#e5e5e5;text-align:right}._label_1pxqw_256{padding:2px 12px;font-size:12px;font-family:monospace;white-space:nowrap;color:#aaa;font-weight:400;text-align:left}._rowBorder_1pxqw_266{border-bottom:1px solid #2a2a2a}._rebuildCard_1pxqw_270{border:1px solid #333;border-radius:6px;padding:8px 10px;margin-top:10px;background:#111}._rebuildTotalRow_1pxqw_278{border-top:1px solid #444}._rebuildTotalRow_1pxqw_278 td{font-weight:600}._promptExportBar_1pxqw_287{margin-bottom:12px}._promptScrollArea_1pxqw_291{max-height:500px;overflow:auto}._promptEmpty_1pxqw_296{color:#999;padding:12px}._promptTimestamp_1pxqw_302{color:#666;font-size:12px;margin:12px 0 4px;padding-bottom:6px}._textPromptCard_1pxqw_310{margin:4px 0;background:#141414;border-radius:6px;border:1px solid #303030;padding:10px 14px}._preText_1pxqw_319{white-space:pre-wrap;word-break:break-word;font-size:13px;line-height:1.6;color:#d9d9d9;margin:4px 0}._systemCollapse_1pxqw_329{margin:4px 0;background:#1a1a1a;border:1px solid #303030;border-radius:6px}._systemLabel_1pxqw_336{color:#888;font-size:12px}._preSys_1pxqw_341{white-space:pre-wrap;word-break:break-word;font-size:12px;line-height:1.5;color:#999;margin:0}._promptTextarea_1pxqw_351{box-sizing:border-box;background:#000;width:100%;min-height:400px;color:#d9d9d9;font-family:monospace;font-size:13px;line-height:1.6;border:none;resize:vertical;padding:10px 14px;outline:none}._projectStatsCenter_1pxqw_367{display:flex;justify-content:center;padding:40px 0}._projectStatsEmpty_1pxqw_373{color:#999;padding:40px 0;text-align:center;font-size:13px}._projectStatsContent_1pxqw_380{display:flex;flex-direction:column;gap:16px}._projectStatsUpdated_1pxqw_386{color:#666;font-size:12px;text-align:right}._projectStatsSummary_1pxqw_392{display:grid;grid-template-columns:1fr 1fr;gap:10px}._projectStatCard_1pxqw_398{background:#111;border:1px solid #333;border-radius:8px;padding:14px 12px;text-align:center}._projectStatValue_1pxqw_406{font-size:22px;font-weight:700;color:#e5e5e5;font-family:monospace;font-variant-numeric:tabular-nums}._projectStatLabel_1pxqw_414{font-size:12px;color:#888;margin-top:4px}._projectStatsSection_1pxqw_420{display:flex;flex-direction:column;gap:10px}._projectStatsSectionTitle_1pxqw_426{font-size:14px;font-weight:600;color:#ccc;padding-bottom:4px;border-bottom:1px solid #333}._projectStatsModelCard_1pxqw_434{background:#111;border:1px solid #333;border-radius:6px;padding:10px 12px}._projectStatsModelHeader_1pxqw_441{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;padding-bottom:4px;border-bottom:1px solid #333}._projectStatsModelName_1pxqw_450{font-size:13px;font-weight:600;color:#e5e5e5}._projectStatsModelCount_1pxqw_456{font-size:12px;color:#888;font-family:monospace}._pluginDirHint_1pxqw_463{margin-bottom:12px;font-size:12px;color:#888}._pluginDirPath_1pxqw_469{font-family:Menlo,Monaco,monospace;color:#aaa;cursor:pointer;padding:1px 4px;border-radius:3px;background:#1a1a1a}._pluginDirPath_1pxqw_469:hover{color:#3b82f6}._pluginList_1pxqw_482{display:flex;flex-direction:column;gap:8px}._pluginItem_1pxqw_488{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border:1px solid #303030;border-radius:6px;background:#141414}._pluginInfo_1pxqw_498{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}._pluginName_1pxqw_506{font-size:14px;color:#e5e5e5;font-weight:500}._pluginFile_1pxqw_512{font-size:12px;color:#666;font-family:Menlo,Monaco,monospace}._pluginHooks_1pxqw_518{display:flex;gap:4px;flex-wrap:wrap;margin-top:2px}._pluginHookTag_1pxqw_525{font-size:11px;padding:0 5px;border-radius:3px;background:#1e3a5f;color:#6cb6ff;line-height:18px}._pluginActions_1pxqw_534{display:flex;align-items:center;gap:8px;flex-shrink:0;margin-left:12px}._pluginEmpty_1pxqw_542{text-align:center;padding:32px 0;color:#999}._centerEmpty_oxhcp_1{display:flex;align-items:center;justify-content:center;height:100%}._scrollContainer_oxhcp_8{overflow:auto;height:100%;-webkit-overflow-scrolling:touch;will-change:scroll-position}._listItem_oxhcp_15{cursor:pointer;padding:8px 12px;border-left:3px solid transparent;border-bottom:1px solid #1f1f1f;transition:background .15s}._listItem_oxhcp_15:hover{background:#151515}._listItemActive_oxhcp_27{background:#1a2332;border-left-color:#3b82f6}._listItemActive_oxhcp_27:hover{background:#1a2332}._itemContent_oxhcp_36{width:100%;min-width:0}._itemHeader_oxhcp_41{display:flex;align-items:center;gap:6px;margin-bottom:4px;font-size:12px}._tagNoMargin_oxhcp_49{margin:0;font-size:12px}._modelName_oxhcp_54{font-size:12px}._time_oxhcp_58{font-size:12px;color:#6b7280;margin-left:auto}._detailRow_oxhcp_64{display:flex;gap:8px;font-size:12px;align-items:center}._urlText_oxhcp_71{color:#555;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}._duration_oxhcp_80{color:#6b7280;flex-shrink:0}._statusOk_oxhcp_85{color:#52c41a;opacity:.5;flex-shrink:0}._statusErr_oxhcp_91{color:#ef4444;flex-shrink:0}._statusDefault_oxhcp_96{color:#9ca3af;flex-shrink:0}._usageBox_oxhcp_101{background:#111;border-radius:4px;padding:3px 6px;margin-top:4px;font-size:12px;color:#6b7280;line-height:1.6}._cacheDot_oxhcp_111{display:inline-block;width:6px;height:6px;border-radius:50%;margin:0 3px;vertical-align:middle}._cacheDotLoss_oxhcp_120{background-color:#8b1a1a;cursor:help}._cacheDotNormal_oxhcp_125{background-color:#3a3a3a}._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_1h2lr_1{background:#0d1117;border-radius:6px;border:1px solid #2a2a2a;padding:12px;font-size:13px;font-family:monospace;overflow:auto}._tag_17wfp_1{display:inline-block;font-size:10px;color:#6b7280;background:#ffffff0f;border:1px solid rgba(255,255,255,.1);border-radius:3px;padding:0 4px;margin-left:6px;cursor:pointer;line-height:18px;vertical-align:middle;transition:color .2s,border-color .2s;-webkit-user-select:none;user-select:none}._tag_17wfp_1:hover{color:#93c5fd;border-color:#93c5fd4d}._tagActive_17wfp_22{color:#93c5fd;border-color:#93c5fd40}._tagLoading_17wfp_27{cursor:wait;opacity:.7}._spinner_17wfp_32{display:inline-block;width:10px;height:10px;border:1.5px solid rgba(147,197,253,.3);border-top-color:#93c5fd;border-radius:50%;animation:_spin_17wfp_32 .6s linear infinite;margin-right:3px;vertical-align:middle}@keyframes _spin_17wfp_32{to{transform:rotate(360deg)}}._root_1a6ku_1{display:flex;height:100%;min-height:0;gap:0}._sidebar_1a6ku_9{width:220px;flex-shrink:0;border-right:1px solid #2a2a2a;overflow-y:auto;padding:4px 0;-webkit-overflow-scrolling:touch}._section_1a6ku_18{-webkit-user-select:none;user-select:none}._sectionHeader_1a6ku_22{display:flex;align-items:center;gap:6px;width:100%;padding:6px 10px;cursor:pointer;color:#d1d5db;font-size:12px;font-weight:600;transition:background .15s;background:none;border:0;text-align:left;font:inherit}._sectionHeader_1a6ku_22:hover{background:#ffffff0d}._sectionHeader_1a6ku_22:focus-visible{outline:1px solid rgba(99,179,237,.75);outline-offset:-1px}._arrow_1a6ku_48{font-size:10px;color:#888;flex-shrink:0}._sectionTitle_1a6ku_54{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._sectionCount_1a6ku_62{font-size:11px;color:#666;background:#1f1f1f;border-radius:10px;padding:0 6px;line-height:18px}._sectionBody_1a6ku_71{padding:2px 0}._historyToggle_1a6ku_76{display:flex;align-items:center;gap:6px;width:100%;padding:4px 10px 4px 14px;cursor:pointer;color:#666;font-size:11px;transition:color .15s,background .15s;background:none;border:0;text-align:left;font:inherit}._historyToggle_1a6ku_76:hover{color:#888;background:#ffffff08}._historyToggle_1a6ku_76:focus-visible{outline:1px solid rgba(99,179,237,.75);outline-offset:-1px}._historyToggleLabel_1a6ku_102{flex:1}._item_1a6ku_107{display:flex;align-items:center;justify-content:space-between;width:100%;padding:5px 10px 5px 24px;font-size:12px;color:#888;cursor:pointer;transition:background .15s,color .15s;background:none;border:0;text-align:left;font:inherit}._item_1a6ku_107:hover{background:#ffffff0a;color:#d1d5db}._item_1a6ku_107:focus-visible{outline:1px solid rgba(99,179,237,.75);outline-offset:-1px}._itemActive_1a6ku_133{background:#63b3ed1f;color:#63b3ed}._itemActive_1a6ku_133:hover{background:#63b3ed29;color:#63b3ed}._itemContent_1a6ku_143{flex:1;min-width:0;overflow:hidden}._itemLabel_1a6ku_149{font-family:monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}._itemSublabel_1a6ku_157{font-size:10px;color:#555;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:1px}._itemTime_1a6ku_166{font-size:9px;color:#555;flex-shrink:0;margin-left:4px;font-family:monospace}._content_1a6ku_175{flex:1;min-width:0;overflow:auto;padding:12px 16px;-webkit-overflow-scrolling:touch}._contentEmpty_1a6ku_183{height:100%;display:flex;align-items:center;justify-content:center}._contentInner_1a6ku_190{padding-bottom:20px}._emptyWrap_1a6ku_194{display:flex;align-items:center;justify-content:center;height:200px}._roleHeader_1a6ku_202{display:flex;align-items:center;gap:8px;margin-bottom:8px;flex-wrap:nowrap}._roleBadge_1a6ku_210{font-size:10px;font-weight:600;letter-spacing:.04em;padding:2px 7px;border-radius:4px;flex-shrink:0}._role_user_1a6ku_219{background:#3b82f62e;color:#60a5fa;border:1px solid rgba(59,130,246,.3)}._role_assistant_1a6ku_225{background:#8b5cf62e;color:#a78bfa;border:1px solid rgba(139,92,246,.3)}._roleLabel_1a6ku_231{font-size:11px;color:#666;flex:1;min-width:0}._contentTime_1a6ku_238{margin-left:auto;font-size:10px;color:#555;font-family:monospace;flex-shrink:0}._turnDivider_1a6ku_246{border:none;border-top:1px solid #1e1e1e;margin:14px 0}._textBlock_1a6ku_253{margin-bottom:8px;border:1px solid #222;border-radius:6px;overflow:hidden}._textBlockBar_1a6ku_260{display:flex;align-items:center;gap:6px;padding:4px 10px;background:#141414;border-bottom:1px solid #222}._textBlockBody_1a6ku_269{padding:10px 12px;font-size:13px;line-height:1.7;color:#d1d5db;word-break:break-word}._textBlockCompact_1a6ku_277{position:relative;padding:8px 10px;font-size:12px;color:#aaa}._textBlockCompactFloat_1a6ku_284{float:right;margin-left:6px;margin-bottom:2px}._thinkingBlock_1a6ku_291{margin-bottom:8px;border:1px solid #2a2a1e;border-radius:6px;overflow:hidden;background:#111108}._thinkingHeader_1a6ku_299{display:flex;align-items:center;gap:6px;padding:5px 10px;cursor:pointer;font-size:12px;color:#888;transition:background .15s}._thinkingHeader_1a6ku_299:hover{background:#ffffc808}._thinkingPreview_1a6ku_314{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#666;font-size:11px}._thinkingBody_1a6ku_324{padding:8px 12px;border-top:1px solid #2a2a1e}._toolBlock_1a6ku_330{margin-bottom:8px;border:1px solid #222;border-radius:6px;overflow:hidden}._toolBlockResult_1a6ku_337{border-color:#1a2a1a}._toolBlockError_1a6ku_341{border-color:#2a1a1a}._toolBlockHeader_1a6ku_345{display:flex;align-items:center;gap:8px;padding:5px 10px;background:#141414;border-bottom:1px solid #222;font-size:12px;flex-wrap:wrap}._toolBlockBody_1a6ku_356{padding:8px 10px;font-size:12px}._toolName_1a6ku_361{color:#d1d5db;font-weight:500;font-family:monospace}._toolId_1a6ku_367{color:#555;font-size:10px;font-family:monospace;margin-left:auto}._errorLabel_1a6ku_374{font-size:10px;color:#f87171;background:#ef44441f;border:1px solid rgba(239,68,68,.25);border-radius:3px;padding:1px 5px}._blockTag_1a6ku_384{font-size:9px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;padding:1px 5px;border-radius:3px;background:#1a1a1a;color:#666;border:1px solid #2a2a2a;flex-shrink:0}._blockTagText_1a6ku_397{background:#3b82f61a;color:#60a5fa;border-color:#3b82f633}._blockTagThinking_1a6ku_403{background:#eab3081a;color:#ca8a04;border-color:#eab30833}._blockTagResult_1a6ku_409{background:#22c55e1a;color:#4ade80;border-color:#22c55e33}._blockTagError_1a6ku_415{background:#ef44441a;color:#f87171;border-color:#ef444433}._jsonBlock_1a6ku_422{margin-bottom:8px;border:1px solid #222;border-radius:6px;overflow:hidden}._jsonBlockLabel_1a6ku_429{font-size:10px;color:#666;padding:3px 10px;background:#141414;border-bottom:1px solid #222;font-family:monospace}._blockSeparator_1a6ku_439{border:none;border-top:1px solid #2a2a2a;margin:16px 0}._markdownBody_1a6ku_446{font-size:13px;line-height:1.7;color:#d1d5db;word-break:break-word}._container_ty3f8_1{height:100%;overflow:auto;padding:0 16px;-webkit-overflow-scrolling:touch;will-change:scroll-position}._emptyState_ty3f8_9{display:flex;align-items:center;justify-content:center;height:100%}._urlSection_ty3f8_16{padding:12px 0;border-bottom:1px solid #1f1f1f;display:flex;align-items:flex-start}._urlLeft_ty3f8_23{flex:1;min-width:0}._tokenStatsBox_ty3f8_28{flex-shrink:0;padding-left:12px;display:flex;align-items:center}._tokenGrid_ty3f8_35{display:flex;border:1px solid #303030;border-radius:6px;overflow:hidden;min-width:360px;font-size:11px;line-height:1.6}._tokenRows_ty3f8_45{flex:1}._tokenRow_ty3f8_45{display:flex}._tokenRowBorder_ty3f8_53{border-top:1px solid #303030}._tokenLabel_ty3f8_57{color:#888;padding:4px 8px;white-space:nowrap;font-weight:600}._tokenTd_ty3f8_64{flex:1;color:#d1d5db;text-align:right;padding:4px 8px;font-family:monospace;white-space:nowrap}._tokenHitRate_ty3f8_73{display:flex;flex-direction:column;align-items:center;justify-content:center;color:#d1d5db;padding:4px 8px;font-family:monospace;white-space:nowrap;border-left:1px solid #303030;min-width:100px}._tokenHitRateLabel_ty3f8_86{color:#888;font-size:10px;font-family:sans-serif}._tokenRowBorder_ty3f8_53 td{border-top:1px solid #303030}._urlText_ty3f8_96{color:#d1d5db;font-size:13px;margin-bottom:8px;word-break:break-all}._metaText_ty3f8_103,._headersContainer_ty3f8_107{font-size:12px}._headerRow_ty3f8_111{display:flex;padding:4px 0;border-bottom:1px solid #1f1f1f}._headerKey_ty3f8_117{min-width:200px;flex-shrink:0}._headerValue_ty3f8_122{word-break:break-all;margin-left:8px}._streamingBox_ty3f8_127{padding:20px;background:#1a1a1a;border-radius:6px;border:1px solid #2a2a2a}._bodyToolbar_ty3f8_134{display:flex;gap:8px;margin-bottom:8px}._rawTextPre_ty3f8_140{background:#0d1117;border:1px solid #2a2a2a;border-radius:6px;padding:12px;font-size:12px;color:#e5e7eb;overflow:auto;max-height:600px;white-space:pre-wrap;word-break:break-all}._tabContent_ty3f8_153{padding:12px 0}._collapseSpacing_ty3f8_157{margin-bottom:16px}._bodyLabel_ty3f8_161{margin:0}._bodyHeader_ty3f8_165{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}._diffSection_ty3f8_172{margin-bottom:16px}._diffToggle_ty3f8_176{display:inline-block;margin-bottom:8px;cursor:pointer}._diffIcon_ty3f8_182{font-size:12px;margin-left:4px}._viewInChatBtn_ty3f8_187{display:inline-flex;align-items:center;height:26px;border-radius:13px;border:1px solid #424242;background:transparent;color:#888;cursor:pointer;font-size:12px;transition:all .2s;padding:0 10px;white-space:nowrap}._viewInChatBtn_ty3f8_187:hover{border-color:#666;color:#d1d5db;background:#ffffff0f}._reminderSelect_ty3f8_208{min-width:140px;font-size:12px}._reminderSelect_ty3f8_208 .ant-select-selector.ant-select-selector{border-radius:2px;border-color:#424242;background:transparent;min-height:26px;height:auto;padding:0 8px;font-family:monospace}._reminderSelect_ty3f8_208 .ant-select-selection-placeholder{font-size:11px}._wrapper_1rnhz_1{margin:6px 0;background:#1a1a2e;border:1px solid #2a2a3e;border-radius:8px;padding:8px 12px}._header_1rnhz_9{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}._headerRight_1rnhz_16{display:flex;align-items:center;gap:12px;flex-shrink:0;white-space:nowrap}._filePath_1rnhz_24{color:#a78bfa;font-size:12px;font-weight:600}._toggle_1rnhz_30{color:#6b7280;font-size:11px;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;flex-shrink:0}._diffSummary_1rnhz_39{font-size:11px;color:#6b7280}._diffBody_1rnhz_46{display:flex;font-family:SF Mono,Cascadia Code,Fira Code,Menlo,Consolas,monospace;font-size:12px;line-height:1.5}._gutter_1rnhz_54{flex-shrink:0;-webkit-user-select:none;user-select:none}._gutterRow_1rnhz_59{display:flex;height:18px}._lineNumOld_1rnhz_64,._lineNumNew_1rnhz_65{text-align:right;color:#484f58;padding:0 6px 0 2px;box-sizing:border-box}._prefix_1rnhz_72{width:16px;min-width:16px;text-align:center;font-weight:600}._codeWrap_1rnhz_80{flex:1;min-width:0;overflow-x:auto}._codeInner_1rnhz_87{display:inline-block;min-width:100%}._codeLine_1rnhz_92{white-space:pre;padding:0 4px;height:18px}._rowContext_1rnhz_100{background:#1a1a2e;color:#8b949e}._rowDel_1rnhz_105{background:#ef44441f;color:#fca5a5}._rowDel_1rnhz_105._gutterRow_1rnhz_59{background:#341f31}._rowDel_1rnhz_105._gutterRow_1rnhz_59 ._prefix_1rnhz_72{color:#ef4444}._rowAdd_1rnhz_116{background:#22c55e1f;color:#86efac}._rowAdd_1rnhz_116._gutterRow_1rnhz_59{background:#1b2f34}._rowAdd_1rnhz_116._gutterRow_1rnhz_59 ._prefix_1rnhz_72{color:#22c55e}._rowContext_1rnhz_100._gutterRow_1rnhz_59{background:#1a1a2e}._plainResult_1uh60_1{background:#111;border-radius:6px;font-size:12px}._plainTitle_1uh60_7{font-size:11px}._plainPre_1uh60_11{color:#d1d5db;margin:0;white-space:pre-wrap;word-break:break-all;font-size:12px;padding:8px 12px}._codeResult_1uh60_20{background:#0d1117;border-radius:6px;border:1px solid #1e2a3a;overflow:hidden}._codeHeader_1uh60_27{display:flex;justify-content:space-between;align-items:center;padding:4px 10px;background:#161b22;border-bottom:1px solid #1e2a3a}._codeTitle_1uh60_36{font-size:11px;color:#8b949e}._codeToggle_1uh60_41{font-size:11px;color:#484f58;cursor:pointer;-webkit-user-select:none;user-select:none}._codePre_1uh60_48{margin:0;padding:8px 12px;font-size:12px;line-height:1.5;overflow:auto;max-height:500px}._markdownBody_1uh60_57{padding:8px 12px;font-size:13px;line-height:1.6;overflow:auto;max-height:500px}._avatar_1u9yb_3{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}._avatarImg_1u9yb_13{width:32px;height:32px;border-radius:50%;flex-shrink:0;object-fit:cover}._bubble_1u9yb_21{border-radius:8px;padding:10px 14px;max-width:100%;font-size:14px;line-height:1.6;word-break:break-word}._messageRow_1u9yb_32{display:flex;gap:10px;padding:8px 0}._messageRowEnd_1u9yb_38{display:flex;gap:10px;padding:8px 0;justify-content:flex-end}._contentCol_1u9yb_47{min-width:0;flex:1}._contentColLimited_1u9yb_52{min-width:0;max-width:80%;width:fit-content}._labelRow_1u9yb_60{display:flex;justify-content:space-between;align-items:center;margin-bottom:2px}._labelRowEnd_1u9yb_67{display:flex;justify-content:flex-end;align-items:center;margin-bottom:2px}._labelRight_1u9yb_74{display:flex;align-items:center;gap:4px;flex-shrink:0;margin-left:auto}._labelText_1u9yb_82{font-size:11px}._timeText_1u9yb_86,._timeTextNoMargin_1u9yb_92{font-size:10px;color:#6b7280;flex-shrink:0}._labelTextRight_1u9yb_98{font-size:11px;margin-left:auto}._bubbleUser_1u9yb_105{background:#1668dc;color:#e5e7eb}._bubbleAssistant_1u9yb_111{background:#141414;color:#e5e7eb;transition:box-shadow 0s;position:relative}._bubbleHighlight_1u9yb_119{box-shadow:0 0 10px #1668dc99}._bubbleHighlightFading_1u9yb_123{box-shadow:0 0 10px #1668dc00;transition:box-shadow 5s ease-out}._borderSvg_1u9yb_128{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;pointer-events:none;overflow:visible}._borderSvgFading_1u9yb_137{opacity:0;transition:opacity 5s ease-out}._borderRect_1u9yb_142{animation:_dashRotate_1u9yb_1 4s linear infinite}@keyframes _dashRotate_1u9yb_1{0%{stroke-dashoffset:0}to{stroke-dashoffset:-100}}._bubblePlan_1u9yb_151{background:#141428;border:5px solid #1668dc;font-size:12px;color:#e5e7eb}._bubbleSubAgent_1u9yb_159{background:#1a1a2e;color:#e5e7eb}._bubbleSelection_1u9yb_165{background:#1a3a1a;color:#e5e7eb}._systemTagLabel_1u9yb_173{font-size:12px}._skillLabel_1u9yb_177{font-size:12px;color:#a78bfa}._systemTagPre_1u9yb_182{font-size:12px;color:#9ca3af;white-space:pre-wrap;word-break:break-all;margin:0}._collapseMargin_1u9yb_190{margin:4px 0}._collapseNoMargin_1u9yb_194{margin:0}._thinkingLabel_1u9yb_200{font-size:12px}._bashCollapseLabel_1u9yb_204{font-size:12px;color:#9ca3af}._toolBox_1u9yb_211{background:#1a1a2e;border:1px solid #2a2a3e;border-radius:8px;padding:8px 12px;margin:6px 0;font-size:12px}._toolLabel_1u9yb_220{color:#a78bfa}._codePre_1u9yb_226{font-size:12px;margin:4px 0 0;white-space:pre-wrap;word-break:break-all;background:#0d1117;border-radius:4px;padding:6px 8px}._pathTag_1u9yb_238{color:#7dd3fc;font-size:11px}._descSpan_1u9yb_245{color:#6b7280;font-weight:400}._secondarySpan_1u9yb_250{color:#6b7280}._patternSpan_1u9yb_254{color:#fbbf24}._kvContainer_1u9yb_260{margin-top:4px;font-size:11px}._kvItem_1u9yb_265{margin:2px 0}._kvKey_1u9yb_269{color:#7dd3fc}._kvValue_1u9yb_273{color:#9ca3af}._toolResult_1u9yb_279{background:#111827;border:1px solid #1e293b;border-radius:6px;padding:6px 10px;margin:2px 0 6px;font-size:11px}._toolResultLabel_1u9yb_288{font-size:11px}._compactLabel_1u9yb_294{font-size:12px;color:#93c5fd}._compactPre_1u9yb_299{font-size:12px;color:#d1d5db;white-space:pre-wrap;word-break:break-all;margin:0}._viewRequestBtn_1u9yb_309{font-size:10px;color:#555;cursor:pointer;margin-left:6px;flex-shrink:0}._viewRequestBtn_1u9yb_309:hover{color:#93c5fd}._optionList_1u9yb_323{padding-left:8px}._optionDesc_1u9yb_327{color:#555;margin-left:6px;font-weight:400}._questionText_1u9yb_335{font-size:13px;color:#ccc;margin-bottom:4px}._questionSpacing_1u9yb_341{margin-bottom:10px}._option_1u9yb_323{font-size:12px;padding:1px 0}._askQuestionBox_1u9yb_354{background:#0d1f0d;border:1px solid #2ea043;border-radius:8px;padding:8px 12px;margin:6px 0;font-size:12px}._askQuestionHeader_1u9yb_363{display:inline-block;background:#1a3a1a;color:#7ee787;font-size:10px;padding:1px 6px;border-radius:4px;margin-bottom:4px;font-weight:600}._askQuestionText_1u9yb_374{color:#e5e7eb;font-size:13px;margin-bottom:4px}._askOptionItem_1u9yb_380{font-size:12px;color:#9ca3af;padding:1px 0;display:flex;align-items:center;gap:4px}._askOptionSelected_1u9yb_389{color:#e5e7eb;font-weight:600}._askCheckSvg_1u9yb_394{flex-shrink:0;vertical-align:middle}._planModeBox_1u9yb_401{background:#0d1528;border:1px solid #1668dc;border-radius:8px;padding:8px 12px;margin:6px 0;font-size:12px}._planModeLabel_1u9yb_410{color:#93c5fd;font-weight:600}._planModePermissions_1u9yb_415{margin-top:6px;padding-top:6px;border-top:1px solid #1e3a5f}._planModePermLabel_1u9yb_421{color:#6b7280;font-size:11px;margin-bottom:2px}/**
1
+ body{margin:0;background-color:#0d0d0d}*{scrollbar-width:thin;scrollbar-color:#3a3a3a #0d0d0d}@media(pointer:coarse){*{scrollbar-width:auto;scrollbar-color:auto}}@media(pointer:fine){*::-webkit-scrollbar{width:6px;height:6px}*::-webkit-scrollbar-track{background:#0d0d0d}*::-webkit-scrollbar-thumb{background:#3a3a3a;border-radius:3px}*::-webkit-scrollbar-thumb:hover{background:#555}}.code-highlight{color:#e6edf3}.hl-keyword{color:#ff7b72}.hl-string{color:#a5d6ff}.hl-comment{color:#8b949e;font-style:italic}.hl-number{color:#79c0ff}.hl-linenum{color:#484f58;-webkit-user-select:none;user-select:none}.chat-md pre{background:#0d1117;border:1px solid #2a2a2a;border-radius:6px;padding:12px;overflow-x:auto;font-size:13px;line-height:1.5}.chat-md code{background:#1a1a2e;padding:2px 6px;border-radius:4px;font-size:13px;color:#e5e7eb}.chat-md pre code{background:none;padding:0}.chat-md p{margin:6px 0}.chat-md ul,.chat-md ol{padding-left:20px;margin:6px 0}.chat-md li{margin:2px 0}.chat-md h1,.chat-md h2,.chat-md h3{margin:12px 0 6px;color:#fff}.chat-md h1{font-size:1.3em}.chat-md h2{font-size:1.15em}.chat-md h3{font-size:1.05em}.chat-md blockquote{border-left:3px solid #3b82f6;margin:8px 0;padding:4px 12px;color:#9ca3af}.chat-md table{border-collapse:collapse;margin:8px 0;font-size:13px}.chat-md th,.chat-md td{border:1px solid #2a2a2a;padding:6px 10px}.chat-md th{background:#1a1a1a;color:#fff}.chat-md a{color:#60a5fa}.chat-md hr{border:none;border-top:1px solid #2a2a2a;margin:12px 0}.chat-md strong{color:#f1f5f9}.chat-md em{color:#cbd5e1}.ant-dropdown .logo-dropdown-menu .ant-dropdown-menu-item,.ant-dropdown .logo-dropdown-menu .ant-dropdown-menu-submenu-title{font-size:12px!important}.ant-tooltip .ant-tooltip-inner{background-color:#090909}.ant-tooltip .ant-tooltip-arrow:before,.ant-tooltip .ant-tooltip-arrow:after{background:#090909}.ant-modal-confirm .ant-modal-content{background-color:#1a1a1a;border:1px solid #2a2a2a}.ant-modal-confirm .ant-modal-confirm-title{color:#e6e6e6}.ant-modal-confirm .ant-modal-confirm-content{color:#aaa}.ant-modal-confirm .ant-btn-default{background-color:transparent;border-color:#444;color:#ccc}.ant-modal-confirm .ant-btn-default.ant-btn-default:hover,.ant-modal-confirm .ant-btn-default.ant-btn-default:focus{background-color:#2a2a2a;border-color:#666;color:#fff}.ant-modal-confirm .ant-btn-primary{background-color:#1668dc;border-color:#1668dc}.ant-modal-confirm .ant-btn-primary:hover{background-color:#1554ad;border-color:#1554ad}._helpBtn_ovmho_1{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:50%;background:#1a1a1a;border:1px solid #444;color:#aaa;font-size:11px;line-height:1;cursor:pointer;margin-left:4px;vertical-align:middle;transition:background .2s;-webkit-user-select:none;user-select:none}._helpBtn_ovmho_1:hover{background:#333}._modalBody_ovmho_24{max-height:60vh;overflow-y:auto;overflow-x:hidden;line-height:1.7;color:#d9d9d9;word-break:break-word}._modalBody_ovmho_24 h1,._modalBody_ovmho_24 h2,._modalBody_ovmho_24 h3{margin-top:.8em;color:#f0f0f0}._modalBody_ovmho_24 p{margin:.5em 0}._modalBody_ovmho_24 code{background:#2a2a2a;padding:1px 4px;border-radius:3px;font-size:.9em;color:#e8ab6a}._modalBody_ovmho_24 pre{background:#1a1a1a;padding:12px;border-radius:6px;overflow-x:auto;color:#d9d9d9;max-width:100%;box-sizing:border-box}._modalBody_ovmho_24 a{color:#5b9bd5}._modalBody_ovmho_24 strong{color:#f0f0f0}._spinWrap_ovmho_70{display:flex;justify-content:center;padding:40px 0}._modalBody_ovmho_24 textarea{width:100%;min-height:200px;background:#1a1a1a;color:#d9d9d9;font-family:monospace;font-size:13px;line-height:1.6;border:1px solid #333;border-radius:6px;padding:10px 14px;resize:vertical;outline:none;box-sizing:border-box}@media(max-width:768px){._modalBody_ovmho_24{font-size:13px;line-height:1.6;max-height:75vh}._modalBody_ovmho_24 h1{font-size:18px}._modalBody_ovmho_24 h2{font-size:16px}._modalBody_ovmho_24 h3{font-size:14px}._modalBody_ovmho_24 pre{font-size:12px;padding:8px}._modalBody_ovmho_24 code,._modalBody_ovmho_24 textarea{font-size:12px}}._headerBar_1pxqw_2{display:flex;align-items:center;justify-content:space-between;width:100%;height:100%}._logoWrap_1pxqw_10{display:inline-flex;align-items:center;position:relative;margin-top:14px}._logoWrapActive_1pxqw_17:after{content:"";position:absolute;top:-10px;bottom:-10px;left:0;right:-200px}._logoImage_1pxqw_26{height:24px;width:24px;border-radius:3px;vertical-align:middle;opacity:.75;transition:opacity .2s;cursor:pointer}._logoImageActive_1pxqw_36{opacity:1}._compactBtn_1pxqw_41{font-size:12px;height:30px;line-height:28px}._compactBtnNoBorder_1pxqw_47{font-size:12px;height:30px;line-height:28px;border:none}._tokenStatsTag_1pxqw_55{border-radius:12px;cursor:pointer;background:#2a2a2a;border:1px solid #3a3a3a;color:#ccc}._tokenStatsIcon_1pxqw_63{margin-right:4px}._liveTag_1pxqw_68{position:relative;display:inline-flex;align-items:center;border-radius:12px;border:1px solid;padding:0 10px;height:22px;font-size:12px;line-height:22px;overflow:hidden;transition:border-color .3s,color .3s;white-space:nowrap}._liveTagFill_1pxqw_83{position:absolute;left:0;top:0;bottom:0;opacity:.35;transition:width .5s ease,background-color .3s;pointer-events:none}._liveTagContent_1pxqw_93{position:relative;z-index:1;display:inline-flex;align-items:center}._liveTagHistory_1pxqw_100{background:#2a2a2a;border-color:#424242;color:#d1d5db}._liveTagText_1pxqw_106{margin-left:4px}._countdownStrong_1pxqw_111{font-variant-numeric:tabular-nums}._qrcodePopover_1pxqw_116{display:flex;flex-direction:column;align-items:center;padding:8px}._qrcodeSection_1pxqw_123{display:flex;flex-direction:column;align-items:center;padding:16px;margin-bottom:12px;border:1px solid #333;border-radius:8px;background:#111}._qrcodeTitle_1pxqw_134{font-size:14px;font-weight:600;color:#e5e5e5;margin-bottom:12px}._qrcodeUrlInput_1pxqw_141{margin-top:12px;font-size:12px;font-family:Menlo,Monaco,monospace}._qrcodeUrlCopy_1pxqw_147{cursor:pointer;color:#888;transition:color .2s}._qrcodeUrlCopy_1pxqw_147:hover{color:#3b82f6}._settingsGroupBox_1pxqw_158{border:1px solid #333;border-radius:8px;background:#111;padding:4px 16px;margin-bottom:12px}._settingsGroupTitle_1pxqw_166{font-size:14px;font-weight:600;color:#e5e5e5;padding:12px 0 4px;border-bottom:1px solid #333}._settingsItem_1pxqw_175{display:flex;justify-content:space-between;align-items:center;padding:12px 0}._settingsLabel_1pxqw_182{font-size:14px}._tokenStatsEmpty_1pxqw_187{padding:8px 4px;color:#999;font-size:13px}._tokenStatsContainer_1pxqw_194{display:flex;gap:12px;align-items:flex-start}._tokenStatsColumn_1pxqw_200{min-width:240px}._toolStatsColumn_1pxqw_204{min-width:180px}._modelCard_1pxqw_209{border:1px solid #333;border-radius:6px;padding:8px 10px;background:#111}._modelCardSpaced_1pxqw_216{margin-bottom:10px}._modelName_1pxqw_222{font-size:13px;font-weight:600;color:#e5e5e5;margin-bottom:8px;padding-bottom:4px;border-bottom:1px solid #333}._statsTable_1pxqw_232{width:100%;border-collapse:collapse}._th_1pxqw_237{padding:2px 12px;font-size:12px;font-family:monospace;white-space:nowrap;color:#888;font-weight:400;text-align:right}._td_1pxqw_247{padding:2px 12px;font-size:12px;font-family:monospace;white-space:nowrap;color:#e5e5e5;text-align:right}._label_1pxqw_256{padding:2px 12px;font-size:12px;font-family:monospace;white-space:nowrap;color:#aaa;font-weight:400;text-align:left}._rowBorder_1pxqw_266{border-bottom:1px solid #2a2a2a}._rebuildCard_1pxqw_270{border:1px solid #333;border-radius:6px;padding:8px 10px;margin-top:10px;background:#111}._rebuildTotalRow_1pxqw_278{border-top:1px solid #444}._rebuildTotalRow_1pxqw_278 td{font-weight:600}._promptExportBar_1pxqw_287{margin-bottom:12px}._promptScrollArea_1pxqw_291{max-height:500px;overflow:auto}._promptEmpty_1pxqw_296{color:#999;padding:12px}._promptTimestamp_1pxqw_302{color:#666;font-size:12px;margin:12px 0 4px;padding-bottom:6px}._textPromptCard_1pxqw_310{margin:4px 0;background:#141414;border-radius:6px;border:1px solid #303030;padding:10px 14px}._preText_1pxqw_319{white-space:pre-wrap;word-break:break-word;font-size:13px;line-height:1.6;color:#d9d9d9;margin:4px 0}._systemCollapse_1pxqw_329{margin:4px 0;background:#1a1a1a;border:1px solid #303030;border-radius:6px}._systemLabel_1pxqw_336{color:#888;font-size:12px}._preSys_1pxqw_341{white-space:pre-wrap;word-break:break-word;font-size:12px;line-height:1.5;color:#999;margin:0}._promptTextarea_1pxqw_351{box-sizing:border-box;background:#000;width:100%;min-height:400px;color:#d9d9d9;font-family:monospace;font-size:13px;line-height:1.6;border:none;resize:vertical;padding:10px 14px;outline:none}._projectStatsCenter_1pxqw_367{display:flex;justify-content:center;padding:40px 0}._projectStatsEmpty_1pxqw_373{color:#999;padding:40px 0;text-align:center;font-size:13px}._projectStatsContent_1pxqw_380{display:flex;flex-direction:column;gap:16px}._projectStatsUpdated_1pxqw_386{color:#666;font-size:12px;text-align:right}._projectStatsSummary_1pxqw_392{display:grid;grid-template-columns:1fr 1fr;gap:10px}._projectStatCard_1pxqw_398{background:#111;border:1px solid #333;border-radius:8px;padding:14px 12px;text-align:center}._projectStatValue_1pxqw_406{font-size:22px;font-weight:700;color:#e5e5e5;font-family:monospace;font-variant-numeric:tabular-nums}._projectStatLabel_1pxqw_414{font-size:12px;color:#888;margin-top:4px}._projectStatsSection_1pxqw_420{display:flex;flex-direction:column;gap:10px}._projectStatsSectionTitle_1pxqw_426{font-size:14px;font-weight:600;color:#ccc;padding-bottom:4px;border-bottom:1px solid #333}._projectStatsModelCard_1pxqw_434{background:#111;border:1px solid #333;border-radius:6px;padding:10px 12px}._projectStatsModelHeader_1pxqw_441{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;padding-bottom:4px;border-bottom:1px solid #333}._projectStatsModelName_1pxqw_450{font-size:13px;font-weight:600;color:#e5e5e5}._projectStatsModelCount_1pxqw_456{font-size:12px;color:#888;font-family:monospace}._pluginDirHint_1pxqw_463{margin-bottom:12px;font-size:12px;color:#888}._pluginDirPath_1pxqw_469{font-family:Menlo,Monaco,monospace;color:#aaa;cursor:pointer;padding:1px 4px;border-radius:3px;background:#1a1a1a}._pluginDirPath_1pxqw_469:hover{color:#3b82f6}._pluginList_1pxqw_482{display:flex;flex-direction:column;gap:8px}._pluginItem_1pxqw_488{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border:1px solid #303030;border-radius:6px;background:#141414}._pluginInfo_1pxqw_498{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}._pluginName_1pxqw_506{font-size:14px;color:#e5e5e5;font-weight:500}._pluginFile_1pxqw_512{font-size:12px;color:#666;font-family:Menlo,Monaco,monospace}._pluginHooks_1pxqw_518{display:flex;gap:4px;flex-wrap:wrap;margin-top:2px}._pluginHookTag_1pxqw_525{font-size:11px;padding:0 5px;border-radius:3px;background:#1e3a5f;color:#6cb6ff;line-height:18px}._pluginActions_1pxqw_534{display:flex;align-items:center;gap:8px;flex-shrink:0;margin-left:12px}._pluginEmpty_1pxqw_542{text-align:center;padding:32px 0;color:#999}._centerEmpty_oxhcp_1{display:flex;align-items:center;justify-content:center;height:100%}._scrollContainer_oxhcp_8{overflow:auto;height:100%;-webkit-overflow-scrolling:touch;will-change:scroll-position}._listItem_oxhcp_15{cursor:pointer;padding:8px 12px;border-left:3px solid transparent;border-bottom:1px solid #1f1f1f;transition:background .15s}._listItem_oxhcp_15:hover{background:#151515}._listItemActive_oxhcp_27{background:#1a2332;border-left-color:#3b82f6}._listItemActive_oxhcp_27:hover{background:#1a2332}._itemContent_oxhcp_36{width:100%;min-width:0}._itemHeader_oxhcp_41{display:flex;align-items:center;gap:6px;margin-bottom:4px;font-size:12px}._tagNoMargin_oxhcp_49{margin:0;font-size:12px}._modelName_oxhcp_54{font-size:12px}._time_oxhcp_58{font-size:12px;color:#6b7280;margin-left:auto}._detailRow_oxhcp_64{display:flex;gap:8px;font-size:12px;align-items:center}._urlText_oxhcp_71{color:#555;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}._duration_oxhcp_80{color:#6b7280;flex-shrink:0}._statusOk_oxhcp_85{color:#52c41a;opacity:.5;flex-shrink:0}._statusErr_oxhcp_91{color:#ef4444;flex-shrink:0}._statusDefault_oxhcp_96{color:#9ca3af;flex-shrink:0}._usageBox_oxhcp_101{background:#111;border-radius:4px;padding:3px 6px;margin-top:4px;font-size:12px;color:#6b7280;line-height:1.6}._cacheDot_oxhcp_111{display:inline-block;width:6px;height:6px;border-radius:50%;margin:0 3px;vertical-align:middle}._cacheDotLoss_oxhcp_120{background-color:#8b1a1a;cursor:help}._cacheDotNormal_oxhcp_125{background-color:#3a3a3a}._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_1h2lr_1{background:#0d1117;border-radius:6px;border:1px solid #2a2a2a;padding:12px;font-size:13px;font-family:monospace;overflow:auto}._tag_17wfp_1{display:inline-block;font-size:10px;color:#6b7280;background:#ffffff0f;border:1px solid rgba(255,255,255,.1);border-radius:3px;padding:0 4px;margin-left:6px;cursor:pointer;line-height:18px;vertical-align:middle;transition:color .2s,border-color .2s;-webkit-user-select:none;user-select:none}._tag_17wfp_1:hover{color:#93c5fd;border-color:#93c5fd4d}._tagActive_17wfp_22{color:#93c5fd;border-color:#93c5fd40}._tagLoading_17wfp_27{cursor:wait;opacity:.7}._spinner_17wfp_32{display:inline-block;width:10px;height:10px;border:1.5px solid rgba(147,197,253,.3);border-top-color:#93c5fd;border-radius:50%;animation:_spin_17wfp_32 .6s linear infinite;margin-right:3px;vertical-align:middle}@keyframes _spin_17wfp_32{to{transform:rotate(360deg)}}._root_1a6ku_1{display:flex;height:100%;min-height:0;gap:0}._sidebar_1a6ku_9{width:220px;flex-shrink:0;border-right:1px solid #2a2a2a;overflow-y:auto;padding:4px 0;-webkit-overflow-scrolling:touch}._section_1a6ku_18{-webkit-user-select:none;user-select:none}._sectionHeader_1a6ku_22{display:flex;align-items:center;gap:6px;width:100%;padding:6px 10px;cursor:pointer;color:#d1d5db;font-size:12px;font-weight:600;transition:background .15s;background:none;border:0;text-align:left;font:inherit}._sectionHeader_1a6ku_22:hover{background:#ffffff0d}._sectionHeader_1a6ku_22:focus-visible{outline:1px solid rgba(99,179,237,.75);outline-offset:-1px}._arrow_1a6ku_48{font-size:10px;color:#888;flex-shrink:0}._sectionTitle_1a6ku_54{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._sectionCount_1a6ku_62{font-size:11px;color:#666;background:#1f1f1f;border-radius:10px;padding:0 6px;line-height:18px}._sectionBody_1a6ku_71{padding:2px 0}._historyToggle_1a6ku_76{display:flex;align-items:center;gap:6px;width:100%;padding:4px 10px 4px 14px;cursor:pointer;color:#666;font-size:11px;transition:color .15s,background .15s;background:none;border:0;text-align:left;font:inherit}._historyToggle_1a6ku_76:hover{color:#888;background:#ffffff08}._historyToggle_1a6ku_76:focus-visible{outline:1px solid rgba(99,179,237,.75);outline-offset:-1px}._historyToggleLabel_1a6ku_102{flex:1}._item_1a6ku_107{display:flex;align-items:center;justify-content:space-between;width:100%;padding:5px 10px 5px 24px;font-size:12px;color:#888;cursor:pointer;transition:background .15s,color .15s;background:none;border:0;text-align:left;font:inherit}._item_1a6ku_107:hover{background:#ffffff0a;color:#d1d5db}._item_1a6ku_107:focus-visible{outline:1px solid rgba(99,179,237,.75);outline-offset:-1px}._itemActive_1a6ku_133{background:#63b3ed1f;color:#63b3ed}._itemActive_1a6ku_133:hover{background:#63b3ed29;color:#63b3ed}._itemContent_1a6ku_143{flex:1;min-width:0;overflow:hidden}._itemLabel_1a6ku_149{font-family:monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}._itemSublabel_1a6ku_157{font-size:10px;color:#555;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:1px}._itemTime_1a6ku_166{font-size:9px;color:#555;flex-shrink:0;margin-left:4px;font-family:monospace}._content_1a6ku_175{flex:1;min-width:0;overflow:auto;padding:12px 16px;-webkit-overflow-scrolling:touch}._contentEmpty_1a6ku_183{height:100%;display:flex;align-items:center;justify-content:center}._contentInner_1a6ku_190{padding-bottom:20px}._emptyWrap_1a6ku_194{display:flex;align-items:center;justify-content:center;height:200px}._roleHeader_1a6ku_202{display:flex;align-items:center;gap:8px;margin-bottom:8px;flex-wrap:nowrap}._roleBadge_1a6ku_210{font-size:10px;font-weight:600;letter-spacing:.04em;padding:2px 7px;border-radius:4px;flex-shrink:0}._role_user_1a6ku_219{background:#3b82f62e;color:#60a5fa;border:1px solid rgba(59,130,246,.3)}._role_assistant_1a6ku_225{background:#8b5cf62e;color:#a78bfa;border:1px solid rgba(139,92,246,.3)}._roleLabel_1a6ku_231{font-size:11px;color:#666;flex:1;min-width:0}._contentTime_1a6ku_238{margin-left:auto;font-size:10px;color:#555;font-family:monospace;flex-shrink:0}._turnDivider_1a6ku_246{border:none;border-top:1px solid #1e1e1e;margin:14px 0}._textBlock_1a6ku_253{margin-bottom:8px;border:1px solid #222;border-radius:6px;overflow:hidden}._textBlockBar_1a6ku_260{display:flex;align-items:center;gap:6px;padding:4px 10px;background:#141414;border-bottom:1px solid #222}._textBlockBody_1a6ku_269{padding:10px 12px;font-size:13px;line-height:1.7;color:#d1d5db;word-break:break-word}._textBlockCompact_1a6ku_277{position:relative;padding:8px 10px;font-size:12px;color:#aaa}._textBlockCompactFloat_1a6ku_284{float:right;margin-left:6px;margin-bottom:2px}._thinkingBlock_1a6ku_291{margin-bottom:8px;border:1px solid #2a2a1e;border-radius:6px;overflow:hidden;background:#111108}._thinkingHeader_1a6ku_299{display:flex;align-items:center;gap:6px;padding:5px 10px;cursor:pointer;font-size:12px;color:#888;transition:background .15s}._thinkingHeader_1a6ku_299:hover{background:#ffffc808}._thinkingPreview_1a6ku_314{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#666;font-size:11px}._thinkingBody_1a6ku_324{padding:8px 12px;border-top:1px solid #2a2a1e}._toolBlock_1a6ku_330{margin-bottom:8px;border:1px solid #222;border-radius:6px;overflow:hidden}._toolBlockResult_1a6ku_337{border-color:#1a2a1a}._toolBlockError_1a6ku_341{border-color:#2a1a1a}._toolBlockHeader_1a6ku_345{display:flex;align-items:center;gap:8px;padding:5px 10px;background:#141414;border-bottom:1px solid #222;font-size:12px;flex-wrap:wrap}._toolBlockBody_1a6ku_356{padding:8px 10px;font-size:12px}._toolName_1a6ku_361{color:#d1d5db;font-weight:500;font-family:monospace}._toolId_1a6ku_367{color:#555;font-size:10px;font-family:monospace;margin-left:auto}._errorLabel_1a6ku_374{font-size:10px;color:#f87171;background:#ef44441f;border:1px solid rgba(239,68,68,.25);border-radius:3px;padding:1px 5px}._blockTag_1a6ku_384{font-size:9px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;padding:1px 5px;border-radius:3px;background:#1a1a1a;color:#666;border:1px solid #2a2a2a;flex-shrink:0}._blockTagText_1a6ku_397{background:#3b82f61a;color:#60a5fa;border-color:#3b82f633}._blockTagThinking_1a6ku_403{background:#eab3081a;color:#ca8a04;border-color:#eab30833}._blockTagResult_1a6ku_409{background:#22c55e1a;color:#4ade80;border-color:#22c55e33}._blockTagError_1a6ku_415{background:#ef44441a;color:#f87171;border-color:#ef444433}._jsonBlock_1a6ku_422{margin-bottom:8px;border:1px solid #222;border-radius:6px;overflow:hidden}._jsonBlockLabel_1a6ku_429{font-size:10px;color:#666;padding:3px 10px;background:#141414;border-bottom:1px solid #222;font-family:monospace}._blockSeparator_1a6ku_439{border:none;border-top:1px solid #2a2a2a;margin:16px 0}._markdownBody_1a6ku_446{font-size:13px;line-height:1.7;color:#d1d5db;word-break:break-word}._container_ty3f8_1{height:100%;overflow:auto;padding:0 16px;-webkit-overflow-scrolling:touch;will-change:scroll-position}._emptyState_ty3f8_9{display:flex;align-items:center;justify-content:center;height:100%}._urlSection_ty3f8_16{padding:12px 0;border-bottom:1px solid #1f1f1f;display:flex;align-items:flex-start}._urlLeft_ty3f8_23{flex:1;min-width:0}._tokenStatsBox_ty3f8_28{flex-shrink:0;padding-left:12px;display:flex;align-items:center}._tokenGrid_ty3f8_35{display:flex;border:1px solid #303030;border-radius:6px;overflow:hidden;min-width:360px;font-size:11px;line-height:1.6}._tokenRows_ty3f8_45{flex:1}._tokenRow_ty3f8_45{display:flex}._tokenRowBorder_ty3f8_53{border-top:1px solid #303030}._tokenLabel_ty3f8_57{color:#888;padding:4px 8px;white-space:nowrap;font-weight:600}._tokenTd_ty3f8_64{flex:1;color:#d1d5db;text-align:right;padding:4px 8px;font-family:monospace;white-space:nowrap}._tokenHitRate_ty3f8_73{display:flex;flex-direction:column;align-items:center;justify-content:center;color:#d1d5db;padding:4px 8px;font-family:monospace;white-space:nowrap;border-left:1px solid #303030;min-width:100px}._tokenHitRateLabel_ty3f8_86{color:#888;font-size:10px;font-family:sans-serif}._tokenRowBorder_ty3f8_53 td{border-top:1px solid #303030}._urlText_ty3f8_96{color:#d1d5db;font-size:13px;margin-bottom:8px;word-break:break-all}._metaText_ty3f8_103,._headersContainer_ty3f8_107{font-size:12px}._headerRow_ty3f8_111{display:flex;padding:4px 0;border-bottom:1px solid #1f1f1f}._headerKey_ty3f8_117{min-width:200px;flex-shrink:0}._headerValue_ty3f8_122{word-break:break-all;margin-left:8px}._streamingBox_ty3f8_127{padding:20px;background:#1a1a1a;border-radius:6px;border:1px solid #2a2a2a}._bodyToolbar_ty3f8_134{display:flex;gap:8px;margin-bottom:8px}._rawTextPre_ty3f8_140{background:#0d1117;border:1px solid #2a2a2a;border-radius:6px;padding:12px;font-size:12px;color:#e5e7eb;overflow:auto;max-height:600px;white-space:pre-wrap;word-break:break-all}._tabContent_ty3f8_153{padding:12px 0}._collapseSpacing_ty3f8_157{margin-bottom:16px}._bodyLabel_ty3f8_161{margin:0}._bodyHeader_ty3f8_165{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}._diffSection_ty3f8_172{margin-bottom:16px}._diffToggle_ty3f8_176{display:inline-block;margin-bottom:8px;cursor:pointer}._diffIcon_ty3f8_182{font-size:12px;margin-left:4px}._viewInChatBtn_ty3f8_187{display:inline-flex;align-items:center;height:26px;border-radius:13px;border:1px solid #424242;background:transparent;color:#888;cursor:pointer;font-size:12px;transition:all .2s;padding:0 10px;white-space:nowrap}._viewInChatBtn_ty3f8_187:hover{border-color:#666;color:#d1d5db;background:#ffffff0f}._reminderSelect_ty3f8_208{min-width:140px;font-size:12px}._reminderSelect_ty3f8_208 .ant-select-selector.ant-select-selector{border-radius:2px;border-color:#424242;background:transparent;min-height:26px;height:auto;padding:0 8px;font-family:monospace}._reminderSelect_ty3f8_208 .ant-select-selection-placeholder{font-size:11px}._wrapper_1rnhz_1{margin:6px 0;background:#1a1a2e;border:1px solid #2a2a3e;border-radius:8px;padding:8px 12px}._header_1rnhz_9{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}._headerRight_1rnhz_16{display:flex;align-items:center;gap:12px;flex-shrink:0;white-space:nowrap}._filePath_1rnhz_24{color:#a78bfa;font-size:12px;font-weight:600}._toggle_1rnhz_30{color:#6b7280;font-size:11px;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;flex-shrink:0}._diffSummary_1rnhz_39{font-size:11px;color:#6b7280}._diffBody_1rnhz_46{display:flex;font-family:SF Mono,Cascadia Code,Fira Code,Menlo,Consolas,monospace;font-size:12px;line-height:1.5}._gutter_1rnhz_54{flex-shrink:0;-webkit-user-select:none;user-select:none}._gutterRow_1rnhz_59{display:flex;height:18px}._lineNumOld_1rnhz_64,._lineNumNew_1rnhz_65{text-align:right;color:#484f58;padding:0 6px 0 2px;box-sizing:border-box}._prefix_1rnhz_72{width:16px;min-width:16px;text-align:center;font-weight:600}._codeWrap_1rnhz_80{flex:1;min-width:0;overflow-x:auto}._codeInner_1rnhz_87{display:inline-block;min-width:100%}._codeLine_1rnhz_92{white-space:pre;padding:0 4px;height:18px}._rowContext_1rnhz_100{background:#1a1a2e;color:#8b949e}._rowDel_1rnhz_105{background:#ef44441f;color:#fca5a5}._rowDel_1rnhz_105._gutterRow_1rnhz_59{background:#341f31}._rowDel_1rnhz_105._gutterRow_1rnhz_59 ._prefix_1rnhz_72{color:#ef4444}._rowAdd_1rnhz_116{background:#22c55e1f;color:#86efac}._rowAdd_1rnhz_116._gutterRow_1rnhz_59{background:#1b2f34}._rowAdd_1rnhz_116._gutterRow_1rnhz_59 ._prefix_1rnhz_72{color:#22c55e}._rowContext_1rnhz_100._gutterRow_1rnhz_59{background:#1a1a2e}._plainResult_1uh60_1{background:#111;border-radius:6px;font-size:12px}._plainTitle_1uh60_7{font-size:11px}._plainPre_1uh60_11{color:#d1d5db;margin:0;white-space:pre-wrap;word-break:break-all;font-size:12px;padding:8px 12px}._codeResult_1uh60_20{background:#0d1117;border-radius:6px;border:1px solid #1e2a3a;overflow:hidden}._codeHeader_1uh60_27{display:flex;justify-content:space-between;align-items:center;padding:4px 10px;background:#161b22;border-bottom:1px solid #1e2a3a}._codeTitle_1uh60_36{font-size:11px;color:#8b949e}._codeToggle_1uh60_41{font-size:11px;color:#484f58;cursor:pointer;-webkit-user-select:none;user-select:none}._codePre_1uh60_48{margin:0;padding:8px 12px;font-size:12px;line-height:1.5;overflow:auto;max-height:500px}._markdownBody_1uh60_57{padding:8px 12px;font-size:13px;line-height:1.6;overflow:auto;max-height:500px}._avatar_goqrp_3{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}._avatarImg_goqrp_13{width:32px;height:32px;border-radius:50%;flex-shrink:0;object-fit:cover}._bubble_goqrp_21{border-radius:8px;padding:10px 14px;max-width:100%;font-size:14px;line-height:1.6;word-break:break-word}._messageRow_goqrp_32{display:flex;gap:10px;padding:8px 0}._messageRowEnd_goqrp_38{display:flex;gap:10px;padding:8px 0;justify-content:flex-end}._contentCol_goqrp_47{min-width:0;flex:1}._contentColLimited_goqrp_52{min-width:0;max-width:80%;width:fit-content}._labelRow_goqrp_60{display:flex;justify-content:space-between;align-items:center;margin-bottom:2px}._labelRowEnd_goqrp_67{display:flex;justify-content:flex-end;align-items:center;margin-bottom:2px}._labelRight_goqrp_74{display:flex;align-items:center;gap:4px;flex-shrink:0;margin-left:auto}._labelText_goqrp_82{font-size:11px}._timeText_goqrp_86,._timeTextNoMargin_goqrp_92{font-size:10px;color:#6b7280;flex-shrink:0}._labelTextRight_goqrp_98{font-size:11px;margin-left:auto}._bubbleUser_goqrp_105{background:#1668dc;color:#e5e7eb}._bubbleAssistant_goqrp_111{background:#141414;color:#e5e7eb;transition:box-shadow 0s;position:relative}._bubbleHighlight_goqrp_119{box-shadow:0 0 10px #1668dc99}._bubbleHighlightFading_goqrp_123{box-shadow:0 0 10px #1668dc00;transition:box-shadow 5s ease-out}._borderSvg_goqrp_128{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;pointer-events:none;overflow:visible}._borderSvgFading_goqrp_137{opacity:0;transition:opacity 5s ease-out}._borderRect_goqrp_142{animation:_dashRotate_goqrp_1 4s linear infinite}@keyframes _dashRotate_goqrp_1{0%{stroke-dashoffset:0}to{stroke-dashoffset:-100}}._bubblePlan_goqrp_151{background:#141428;border:5px solid #1668dc;font-size:12px;color:#e5e7eb}._bubbleSubAgent_goqrp_159{background:#1a1a2e;color:#e5e7eb}._bubbleSelection_goqrp_165{background:#1a3a1a;color:#e5e7eb}._systemTagLabel_goqrp_173{font-size:12px}._skillLabel_goqrp_177{font-size:12px;color:#a78bfa}._systemTagPre_goqrp_182{font-size:12px;color:#9ca3af;white-space:pre-wrap;word-break:break-all;margin:0}._collapseMargin_goqrp_190{margin:4px 0}._collapseNoMargin_goqrp_194{margin:0}._thinkingLabel_goqrp_200{font-size:12px}._bashCollapseLabel_goqrp_204{font-size:12px;color:#9ca3af}._toolBox_goqrp_211{background:#1a1a2e;border:1px solid #2a2a3e;border-radius:8px;padding:8px 12px;margin:6px 0;font-size:12px}._toolLabel_goqrp_220{color:#a78bfa}._codePre_goqrp_226{font-size:12px;margin:4px 0 0;white-space:pre-wrap;word-break:break-all;background:#0d1117;border-radius:4px;padding:6px 8px}._pathTag_goqrp_238{color:#7dd3fc;font-size:11px}._descSpan_goqrp_245{color:#6b7280;font-weight:400}._secondarySpan_goqrp_250{color:#6b7280}._patternSpan_goqrp_254{color:#fbbf24}._kvContainer_goqrp_260{margin-top:4px;font-size:11px}._kvItem_goqrp_265{margin:2px 0}._kvKey_goqrp_269{color:#7dd3fc}._kvValue_goqrp_273{color:#9ca3af}._toolResult_goqrp_279{background:#111827;border:1px solid #1e293b;border-radius:6px;padding:6px 10px;margin:2px 0 6px;font-size:11px}._toolResultLabel_goqrp_288{font-size:11px}._compactLabel_goqrp_294{font-size:12px;color:#93c5fd}._compactPre_goqrp_299{font-size:12px;color:#d1d5db;white-space:pre-wrap;word-break:break-all;margin:0}._viewRequestBtn_goqrp_309{font-size:10px;color:#555;cursor:pointer;margin-left:6px;flex-shrink:0}._viewRequestBtn_goqrp_309:hover{color:#93c5fd}._optionList_goqrp_323{padding-left:8px}._optionDesc_goqrp_327{color:#555;margin-left:6px;font-weight:400}._questionText_goqrp_335{font-size:13px;color:#ccc;margin-bottom:4px}._questionSpacing_goqrp_341{margin-bottom:10px}._option_goqrp_323{font-size:12px;padding:1px 0}._askQuestionBox_goqrp_354{background:#0d1f0d;border:1px solid #2ea043;border-radius:8px;padding:8px 12px;margin:6px 0;font-size:12px}._askQuestionHeader_goqrp_363{display:inline-block;background:#1a3a1a;color:#7ee787;font-size:10px;padding:1px 6px;border-radius:4px;margin-bottom:4px;font-weight:600}._askQuestionText_goqrp_374{color:#e5e7eb;font-size:13px;margin-bottom:4px}._askOptionItem_goqrp_380{font-size:12px;color:#9ca3af;padding:1px 0;display:flex;align-items:center;gap:4px}._askOptionSelected_goqrp_389{color:#e5e7eb;font-weight:600}._askCheckSvg_goqrp_394{flex-shrink:0;vertical-align:middle}._planModeBox_goqrp_401{background:#0d1528;border:1px solid #1668dc;border-radius:8px;padding:8px 12px;margin:6px 0;font-size:12px}._planModeLabel_goqrp_410{color:#93c5fd;font-weight:600}._planModePermissions_goqrp_415{margin-top:6px;padding-top:6px;border-top:1px solid #1e3a5f}._planModePermLabel_goqrp_421{color:#6b7280;font-size:11px;margin-bottom:2px}._planModeHeader_goqrp_427{display:flex;justify-content:space-between;align-items:center}._planStatusBadge_goqrp_433{font-size:11px;font-weight:600;padding:1px 8px;border-radius:10px;line-height:1.6}._planStatusApproved_goqrp_441{border-color:#22c55e}._planStatusApproved_goqrp_441._planStatusBadge_goqrp_433{background:#22c55e26;color:#4ade80}._planStatusRejected_goqrp_450{border-color:#ef4444}._planStatusRejected_goqrp_450._planStatusBadge_goqrp_433{background:#ef444426;color:#f87171}._planStatusPending_goqrp_459{border-color:#1668dc}._planStatusPending_goqrp_459._planStatusBadge_goqrp_433{background:#1668dc26;color:#93c5fd}._planFeedback_goqrp_468{margin-top:6px;padding:6px 8px;background:#ef444414;border-radius:4px;font-size:12px;color:#e5e7eb}._planFeedbackLabel_goqrp_477{color:#f87171;font-weight:600}._planApprovalActions_goqrp_482{display:flex;gap:8px;margin-top:8px}._planApproveBtn_goqrp_488{padding:4px 16px;border-radius:4px;border:1px solid #22c55e;background:#22c55e26;color:#4ade80;font-size:13px;cursor:pointer;transition:background .15s}._planApproveBtn_goqrp_488:hover{background:#22c55e4d}._planRejectBtn_goqrp_503{padding:4px 16px;border-radius:4px;border:1px solid #ef4444;background:#ef444426;color:#f87171;font-size:13px;cursor:pointer;transition:background .15s}._planRejectBtn_goqrp_503:hover{background:#ef44444d}._planOptionBtn_goqrp_518{padding:4px 16px;border-radius:4px;border:1px solid #6b7280;background:#6b728026;color:#d1d5db;font-size:13px;cursor:pointer;transition:background .15s}._planOptionBtn_goqrp_518:hover{background:#6b72804d}._planFeedbackInputWrap_goqrp_533{margin-top:8px}._planFeedbackTextarea_goqrp_537{width:100%;min-height:60px;max-height:120px;padding:8px 10px;border-radius:4px;border:1px solid #4b5563;background:#1f2937;color:#e5e7eb;font-size:13px;line-height:1.5;resize:vertical;font-family:inherit;outline:none}._planFeedbackTextarea_goqrp_537:focus{border-color:#3b82f6}._planFeedbackBtnRow_goqrp_557{display:flex;gap:8px;margin-top:6px;justify-content:flex-end}._planFeedbackSendBtn_goqrp_564{padding:4px 16px;border-radius:4px;border:1px solid #3b82f6;background:#3b82f633;color:#60a5fa;font-size:13px;cursor:pointer;transition:background .15s}._planFeedbackSendBtn_goqrp_564:hover{background:#3b82f659}._planFeedbackSendBtn_goqrp_564:disabled{opacity:.4;cursor:not-allowed}._planFeedbackCancelBtn_goqrp_584{padding:4px 16px;border-radius:4px;border:1px solid #6b7280;background:#6b728026;color:#d1d5db;font-size:13px;cursor:pointer;transition:background .15s}._planFeedbackCancelBtn_goqrp_584:hover{background:#6b72804d}._askQuestionInteractive_goqrp_601{background:#0d1528;border:1px solid #1668dc;border-radius:8px;padding:8px 12px;margin:6px 0;font-size:12px}._askRadioGroup_goqrp_610{display:flex;flex-direction:column;gap:2px;padding-left:4px;margin-top:4px}._askRadioGroup_goqrp_610 .ant-radio-wrapper,._askCheckboxGroup_goqrp_619 .ant-checkbox-wrapper{color:#d1d5db;font-size:12px;padding:3px 0}._askCheckboxGroup_goqrp_619{display:flex;flex-direction:column;gap:2px;padding-left:4px;margin-top:4px}._askOtherInput_goqrp_633{margin-top:4px;margin-left:24px;width:calc(100% - 24px)}._askOtherInput_goqrp_633 .ant-input{background:#1f2937;border-color:#4b5563;color:#e5e7eb;font-size:12px}._askSubmitRow_goqrp_646{display:flex;justify-content:flex-end;margin-top:8px}._askSubmitBtn_goqrp_652{padding:4px 20px;border-radius:4px;border:1px solid #1668dc;background:#1668dc33;color:#60a5fa;font-size:13px;cursor:pointer;transition:background .15s}._askSubmitBtn_goqrp_652:hover{background:#1668dc59}._askSubmitBtn_goqrp_652:disabled{opacity:.4;cursor:not-allowed}._askMarkdownLayout_goqrp_672{display:flex;gap:12px;margin-top:4px}._askMarkdownLayout_goqrp_672>:first-child{flex:1;min-width:0}._askMarkdownPreview_goqrp_683{flex:1;min-width:0;background:#0d1117;border:1px solid #2a2a3e;border-radius:6px;padding:8px 10px;font-size:12px;color:#d1d5db;max-height:240px;overflow-y:auto}._askMarkdownPreview_goqrp_683 pre{white-space:pre-wrap;word-break:break-all;margin:0;font-family:SF Mono,Menlo,Consolas,monospace;font-size:11px;line-height:1.5}/**
2
2
  * Copyright (c) 2014 The xterm.js authors. All rights reserved.
3
3
  * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
4
4
  * https://github.com/chjj/term.js
package/dist/index.html CHANGED
@@ -6,8 +6,8 @@
6
6
  <title>Claude Code Viewer</title>
7
7
  <link rel="icon" href="/favicon.ico?v=1">
8
8
  <link rel="shortcut icon" href="/favicon.ico?v=1">
9
- <script type="module" crossorigin src="/assets/index-D-Kx0cC6.js"></script>
10
- <link rel="stylesheet" crossorigin href="/assets/index-BXsgYNDX.css">
9
+ <script type="module" crossorigin src="/assets/index-BbENEGia.js"></script>
10
+ <link rel="stylesheet" crossorigin href="/assets/index-CUAI273q.css">
11
11
  </head>
12
12
  <body>
13
13
  <div id="root"></div>
package/interceptor.js CHANGED
@@ -12,6 +12,7 @@ import { fileURLToPath } from 'node:url';
12
12
  import { dirname, join, basename } from 'node:path';
13
13
  import { LOG_DIR } from './findcc.js';
14
14
  import { assembleStreamMessage, cleanupTempFiles, findRecentLog, isAnthropicApiPath, isMainAgentRequest, migrateConversationContext } from './lib/interceptor-core.js';
15
+ import { updateContextWindowFromResponse } from './lib/context-watcher.js';
15
16
 
16
17
 
17
18
  const __filename = fileURLToPath(import.meta.url);
@@ -407,6 +408,10 @@ export function setupInterceptor() {
407
408
  // 直接使用组装后的 message 对象作为 response.body
408
409
  // 如果组装失败(例如非标准 SSE),则使用原始流内容
409
410
  requestEntry.response.body = assembledMessage || streamedContent;
411
+ // 非独占提取 context window 使用率
412
+ if (assembledMessage && requestEntry.mainAgent) {
413
+ updateContextWindowFromResponse(assembledMessage, requestEntry.body, requestEntry.body?.model);
414
+ }
410
415
  // 移除在途请求标记,保持原始报文
411
416
  delete requestEntry.inProgress;
412
417
  delete requestEntry.requestId;
@@ -466,6 +471,10 @@ export function setupInterceptor() {
466
471
  headers: Object.fromEntries(response.headers.entries()),
467
472
  body: responseData
468
473
  };
474
+ // 非独占提取 context window 使用率
475
+ if (responseData && typeof responseData === 'object' && requestEntry.mainAgent) {
476
+ updateContextWindowFromResponse(responseData, requestEntry.body, requestEntry.body?.model);
477
+ }
469
478
  delete requestEntry.inProgress;
470
479
  delete requestEntry.requestId;
471
480
 
@@ -1,14 +1,12 @@
1
- import { readFileSync, writeFileSync, existsSync, watchFile, unlinkSync } from 'node:fs';
1
+ import { readFileSync, writeFileSync, existsSync, watchFile } from 'node:fs';
2
2
  import { join } from 'node:path';
3
3
  import { homedir } from 'node:os';
4
4
 
5
5
  export const CONTEXT_WINDOW_FILE = join(homedir(), '.claude', 'context-window.json');
6
6
  export const CLAUDE_SETTINGS_FILE = join(homedir(), '.claude', 'settings.json');
7
- const CCV_STATUSLINE_SCRIPT = join(homedir(), '.claude', 'ccv-statusline.sh');
8
7
 
9
8
  let _lastContextPct = -1;
10
9
  let _lastContextSize = -1;
11
- let _originalStatusLine = undefined; // undefined = not yet installed
12
10
 
13
11
  /**
14
12
  * Watch context-window.json and push context usage to SSE clients.
@@ -38,62 +36,62 @@ export function watchContextWindow(clients) {
38
36
  });
39
37
  }
40
38
 
41
- // 安装 statusLine wrapper:兼容用户已有配置
42
- export function installStatusLine() {
43
- try {
44
- let settings = {};
45
- if (existsSync(CLAUDE_SETTINGS_FILE)) {
46
- settings = JSON.parse(readFileSync(CLAUDE_SETTINGS_FILE, 'utf-8'));
47
- }
48
-
49
- // 如果已经是我们的脚本(上次未正常清理),视为无原始配置
50
- if (settings.statusLine?.command?.includes('ccv-statusline')) {
51
- _originalStatusLine = null; // 标记为"无原始配置"
52
- } else {
53
- _originalStatusLine = settings.statusLine || null;
54
- }
39
+ // 已知模型的上下文窗口大小(tokens)
40
+ const MODEL_CONTEXT_SIZES = {
41
+ 'opus': 200000,
42
+ 'sonnet': 200000,
43
+ 'haiku': 200000,
44
+ };
55
45
 
56
- // 生成 wrapper 脚本:保存 context-window.json + 链式调用原有命令
57
- const originalCmd = _originalStatusLine?.type === 'command' && _originalStatusLine?.command
58
- ? _originalStatusLine.command : '';
59
- const scriptLines = [
60
- '#!/usr/bin/env bash',
61
- `input=$(cat)`,
62
- `echo "$input" > ${CONTEXT_WINDOW_FILE}`,
63
- ];
64
- if (originalCmd) {
65
- scriptLines.push(`echo "$input" | ${originalCmd}`);
66
- } else {
67
- scriptLines.push(`pct=$(echo "$input" | jq -r '.context_window.used_percentage // 0' 2>/dev/null || echo 0)`);
68
- scriptLines.push(`echo "ctx \${pct}%"`);
69
- }
70
- // 先创建脚本文件,再写入 settings(确保脚本存在后才引用)
71
- writeFileSync(CCV_STATUSLINE_SCRIPT, scriptLines.join('\n') + '\n', { mode: 0o755 });
72
- settings.statusLine = { type: 'command', command: CCV_STATUSLINE_SCRIPT };
73
- writeFileSync(CLAUDE_SETTINGS_FILE, JSON.stringify(settings, null, 2) + '\n');
74
- } catch (err) {
75
- console.error('[CC Viewer] Failed to install statusLine:', err.message);
46
+ // 从模型名中推断上下文窗口大小
47
+ function inferContextWindowSize(model) {
48
+ if (!model) return 200000;
49
+ const lower = model.toLowerCase();
50
+ // 检查是否带有显式大小标注,如 claude-opus-4-6[1m]
51
+ const sizeMatch = lower.match(/\[(\d+)([km])\]/);
52
+ if (sizeMatch) {
53
+ const num = parseInt(sizeMatch[1], 10);
54
+ return sizeMatch[2] === 'm' ? num * 1000000 : num * 1000;
55
+ }
56
+ for (const [key, size] of Object.entries(MODEL_CONTEXT_SIZES)) {
57
+ if (lower.includes(key)) return size;
76
58
  }
59
+ return 200000; // 默认 200k
77
60
  }
78
61
 
79
- // 卸载 statusLine wrapper:先还原 settings,再删脚本
80
- export function uninstallStatusLine() {
81
- if (_originalStatusLine === undefined) return; // 未安装过
62
+ /**
63
+ * API 响应中提取 usage 信息,写入 context-window.json
64
+ * 非独占方式:不修改用户的 statusLine 配置
65
+ */
66
+ export function updateContextWindowFromResponse(responseBody, requestBody, model) {
82
67
  try {
83
- // 先还原 settings.json
84
- if (existsSync(CLAUDE_SETTINGS_FILE)) {
85
- const settings = JSON.parse(readFileSync(CLAUDE_SETTINGS_FILE, 'utf-8'));
86
- if (settings.statusLine?.command?.includes('ccv-statusline')) {
87
- if (_originalStatusLine) {
88
- settings.statusLine = _originalStatusLine;
89
- } else {
90
- delete settings.statusLine;
91
- }
92
- writeFileSync(CLAUDE_SETTINGS_FILE, JSON.stringify(settings, null, 2) + '\n');
68
+ const usage = responseBody?.usage;
69
+ if (!usage) return;
70
+
71
+ const inputTokens = (usage.input_tokens || 0) + (usage.cache_creation_input_tokens || 0) + (usage.cache_read_input_tokens || 0);
72
+ const outputTokens = usage.output_tokens || 0;
73
+ const totalTokens = inputTokens + outputTokens;
74
+ const contextWindowSize = inferContextWindowSize(model);
75
+ const usedPct = Math.round((totalTokens / contextWindowSize) * 100);
76
+
77
+ // 读取现有文件(如果存在),保留 Claude Code 写入的其他字段
78
+ let existing = {};
79
+ try {
80
+ if (existsSync(CONTEXT_WINDOW_FILE)) {
81
+ existing = JSON.parse(readFileSync(CONTEXT_WINDOW_FILE, 'utf-8'));
93
82
  }
94
- }
95
- // 再清理脚本文件
96
- if (existsSync(CCV_STATUSLINE_SCRIPT)) unlinkSync(CCV_STATUSLINE_SCRIPT);
83
+ } catch { }
84
+
85
+ // 仅更新 context_window 字段(如果 Claude Code 的 statusLine 也在写,它的数据更准确会覆盖我们的)
86
+ existing.context_window = {
87
+ total_input_tokens: inputTokens,
88
+ total_output_tokens: outputTokens,
89
+ context_window_size: contextWindowSize,
90
+ current_usage: usage,
91
+ used_percentage: usedPct,
92
+ remaining_percentage: 100 - usedPct,
93
+ };
94
+
95
+ writeFileSync(CONTEXT_WINDOW_FILE, JSON.stringify(existing) + '\n');
97
96
  } catch { }
98
- _originalStatusLine = undefined;
99
97
  }
@@ -122,14 +122,12 @@ export function watchLogFile(opts) {
122
122
  * @param {Function} opts.getClaudePid
123
123
  * @param {Function} opts.runParallelHook
124
124
  * @param {Function} opts.notifyStatsWorker
125
- * @param {Function} opts.installStatusLine
126
125
  * @param {Function} opts.watchContextWindow
127
126
  * @param {Function} opts.getLogFile
128
127
  */
129
128
  export function startWatching(opts) {
130
- const { installStatusLine, watchContextWindow, clients, ...watchOpts } = opts;
129
+ const { watchContextWindow, clients, ...watchOpts } = opts;
131
130
  watchLogFile({ ...watchOpts, clients });
132
- installStatusLine();
133
131
  watchContextWindow(clients);
134
132
  }
135
133
 
@@ -4,7 +4,14 @@ import { readFileSync, writeFileSync, existsSync, readdirSync, statSync } from '
4
4
  import { join, basename } from 'node:path';
5
5
 
6
6
  // 统计 schema 版本号,新增统计字段时递增,强制旧缓存失效重新解析
7
- const STATS_VERSION = 3;
7
+ const STATS_VERSION = 6;
8
+
9
+ /**
10
+ * 过滤系统注入标签(与 src/utils/systemTags.js 保持同步)
11
+ */
12
+ function stripSystemTags(text) {
13
+ return text.replace(/<(system-reminder|local-command-caveat|project-reminder|important-instruction-reminders|file-modified-reminder|todo-reminder|user-prompt-submit-hook|local-command-stdout|command-name|task-notification|environment_details|context)\b[^>]*>[\s\S]*?<\/\1>/gi, '').trim();
14
+ }
8
15
 
9
16
  /**
10
17
  * 检测请求是否为 SUGGESTION MODE(预测用户下一步输入)
@@ -36,10 +43,11 @@ function parseJsonlFile(filePath) {
36
43
  let totalOutput = 0;
37
44
  let totalCacheRead = 0;
38
45
  let totalCacheCreation = 0;
46
+ const preview = [];
39
47
 
40
48
  try {
41
49
  const content = readFileSync(filePath, 'utf-8');
42
- if (!content.trim()) return { models, summary: { requestCount: 0, sessionCount: 0, turnCount: 0, input_tokens: 0, output_tokens: 0, cache_read_input_tokens: 0, cache_creation_input_tokens: 0 } };
50
+ if (!content.trim()) return { models, summary: { requestCount: 0, sessionCount: 0, turnCount: 0, input_tokens: 0, output_tokens: 0, cache_read_input_tokens: 0, cache_creation_input_tokens: 0 }, preview: [] };
43
51
 
44
52
  const entries = content.split('\n---\n').filter(p => p.trim());
45
53
  for (const raw of entries) {
@@ -56,10 +64,31 @@ function parseJsonlFile(filePath) {
56
64
  if (len < maxMsgLen * 0.5 && (maxMsgLen - len) > 4) {
57
65
  maxMsgLen = 0;
58
66
  }
59
- if (len > maxMsgLen) {
67
+ const isNewTurn = len > maxMsgLen;
68
+ if (isNewTurn) {
60
69
  maxMsgLen = len;
61
70
  turnCount++;
62
71
  }
72
+ // 收集用户 prompt:新轮次 或 新会话(len===1 且非首次)
73
+ if (isNewTurn || (len === 1 && sessionCount > 0)) {
74
+ let userMsg = null;
75
+ for (let i = msgs.length - 1; i >= 0; i--) {
76
+ if (msgs[i]?.role === 'user') { userMsg = msgs[i]; break; }
77
+ }
78
+ if (userMsg) {
79
+ let text = '';
80
+ if (typeof userMsg.content === 'string') {
81
+ text = userMsg.content;
82
+ } else if (Array.isArray(userMsg.content)) {
83
+ const tb = userMsg.content.find(b => b.type === 'text');
84
+ if (tb) text = tb.text || '';
85
+ }
86
+ text = stripSystemTags(text).replace(/[\r\n]+/g, ' ').trim();
87
+ if (text && !text.startsWith('<') && !text.startsWith('[SUGGESTION MODE:')) {
88
+ preview.push(text.slice(0, 100));
89
+ }
90
+ }
91
+ }
63
92
  if (len === 1) sessionCount++;
64
93
  }
65
94
  }
@@ -110,6 +139,7 @@ function parseJsonlFile(filePath) {
110
139
  cache_read_input_tokens: totalCacheRead,
111
140
  cache_creation_input_tokens: totalCacheCreation,
112
141
  },
142
+ preview,
113
143
  };
114
144
  }
115
145
 
@@ -181,6 +211,7 @@ function generateProjectStats(projectDir, projectName, onlyFile) {
181
211
  filesStats[f] = {
182
212
  models: parsed.models,
183
213
  summary: parsed.summary,
214
+ preview: parsed.preview,
184
215
  size,
185
216
  lastModified,
186
217
  };
@@ -250,6 +281,7 @@ function scanAllProjects(logDir) {
250
281
  parentPort?.postMessage({ type: 'scan-all-done' });
251
282
  } catch (err) {
252
283
  parentPort?.postMessage({ type: 'error', message: `scan-all failed: ${err.message}` });
284
+ parentPort?.postMessage({ type: 'scan-all-done' });
253
285
  }
254
286
  }
255
287
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cc-viewer",
3
- "version": "1.5.36",
3
+ "version": "1.5.39",
4
4
  "description": "Claude Code Logger visualization management tool",
5
5
  "license": "MIT",
6
6
  "main": "server.js",
package/server.js CHANGED
@@ -40,7 +40,7 @@ import { checkAndUpdate } from './lib/updater.js';
40
40
  import { loadPlugins, runWaterfallHook, runParallelHook, getPluginsInfo, PLUGINS_DIR } from './lib/plugin-loader.js';
41
41
  import { getUserProfile } from './lib/user-profile.js';
42
42
  import { getGitDiffs } from './lib/git-diff.js';
43
- import { watchContextWindow, installStatusLine, uninstallStatusLine, CONTEXT_WINDOW_FILE } from './lib/context-watcher.js';
43
+ import { watchContextWindow, CONTEXT_WINDOW_FILE } from './lib/context-watcher.js';
44
44
  import { readLogFile, watchLogFile, startWatching, getWatchedFiles } from './lib/log-watcher.js';
45
45
 
46
46
  const PREFS_FILE = join(LOG_DIR, 'preferences.json');
@@ -769,6 +769,37 @@ async function handleRequest(req, res) {
769
769
  return;
770
770
  }
771
771
 
772
+ // 刷新统计:强制重新扫描所有项目日志,等待完成后再响应
773
+ if (url === '/api/refresh-stats' && method === 'POST') {
774
+ try {
775
+ if (!statsWorker) startStatsWorker();
776
+ if (statsWorker) {
777
+ const timeout = setTimeout(() => {
778
+ statsWorker?.removeListener('message', onDone);
779
+ res.writeHead(504, { 'Content-Type': 'application/json' });
780
+ res.end(JSON.stringify({ error: 'Stats refresh timed out' }));
781
+ }, 30000);
782
+ const onDone = (m) => {
783
+ if (m.type === 'scan-all-done') {
784
+ clearTimeout(timeout);
785
+ statsWorker?.removeListener('message', onDone);
786
+ res.writeHead(200, { 'Content-Type': 'application/json' });
787
+ res.end(JSON.stringify({ ok: true }));
788
+ }
789
+ };
790
+ statsWorker.on('message', onDone);
791
+ statsWorker.postMessage({ type: 'scan-all', logDir: LOG_DIR });
792
+ } else {
793
+ res.writeHead(500, { 'Content-Type': 'application/json' });
794
+ res.end(JSON.stringify({ error: 'Stats worker not available' }));
795
+ }
796
+ } catch (err) {
797
+ res.writeHead(500, { 'Content-Type': 'application/json' });
798
+ res.end(JSON.stringify({ error: err.message }));
799
+ }
800
+ return;
801
+ }
802
+
772
803
  // macOS 用户头像和显示名
773
804
  if (url === '/api/user-profile' && method === 'GET') {
774
805
  const profile = await getUserProfile();
@@ -1219,7 +1250,7 @@ async function handleRequest(req, res) {
1219
1250
  const size = statSync(filePath).size;
1220
1251
  const turns = statsFiles?.[f]?.summary?.sessionCount || 0;
1221
1252
  if (!grouped[project]) grouped[project] = [];
1222
- grouped[project].push({ file: `${project}/${f}`, timestamp: ts, size, turns });
1253
+ grouped[project].push({ file: `${project}/${f}`, timestamp: ts, size, turns, preview: statsFiles?.[f]?.preview || [] });
1223
1254
  }
1224
1255
  }
1225
1256
  }
@@ -1673,7 +1704,7 @@ export async function startViewer() {
1673
1704
  } catch { }
1674
1705
  // 工作区模式下延迟到选择工作区后再启动监听
1675
1706
  if (!isWorkspaceMode) {
1676
- startWatching({ ..._logWatcherOpts(LOG_FILE), installStatusLine, watchContextWindow });
1707
+ startWatching({ ..._logWatcherOpts(LOG_FILE), watchContextWindow });
1677
1708
  startStatsWorker();
1678
1709
  }
1679
1710
  // CLI 模式下启动 WebSocket 服务
@@ -1864,7 +1895,6 @@ async function _doStop() {
1864
1895
  unwatchFile(logFile);
1865
1896
  }
1866
1897
  unwatchFile(CONTEXT_WINDOW_FILE);
1867
- uninstallStatusLine();
1868
1898
  getWatchedFiles().clear();
1869
1899
  clients.forEach(client => client.end());
1870
1900
  clients = [];
@@ -1913,8 +1943,6 @@ function handleExit() {
1913
1943
  }
1914
1944
  } catch { }
1915
1945
  }
1916
- // 确保异常退出时也还原 statusLine
1917
- uninstallStatusLine();
1918
1946
  }
1919
1947
  process.on('exit', handleExit);
1920
1948
  process.on('SIGINT', () => { stopViewer().finally(() => process.exit()); });