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.
- package/dist/assets/{index-D-Kx0cC6.js → index-BbENEGia.js} +172 -170
- package/dist/assets/{index-BXsgYNDX.css → index-CUAI273q.css} +1 -1
- package/dist/index.html +2 -2
- package/interceptor.js +9 -0
- package/lib/context-watcher.js +52 -54
- package/lib/log-watcher.js +1 -3
- package/lib/stats-worker.js +35 -3
- package/package.json +1 -1
- package/server.js +34 -6
|
@@ -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-
|
|
10
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
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
|
|
package/lib/context-watcher.js
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
import { readFileSync, writeFileSync, existsSync, watchFile
|
|
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
|
-
//
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
];
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
62
|
+
/**
|
|
63
|
+
* 从 API 响应中提取 usage 信息,写入 context-window.json
|
|
64
|
+
* 非独占方式:不修改用户的 statusLine 配置
|
|
65
|
+
*/
|
|
66
|
+
export function updateContextWindowFromResponse(responseBody, requestBody, model) {
|
|
82
67
|
try {
|
|
83
|
-
|
|
84
|
-
if (
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
|
|
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
|
}
|
package/lib/log-watcher.js
CHANGED
|
@@ -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 {
|
|
129
|
+
const { watchContextWindow, clients, ...watchOpts } = opts;
|
|
131
130
|
watchLogFile({ ...watchOpts, clients });
|
|
132
|
-
installStatusLine();
|
|
133
131
|
watchContextWindow(clients);
|
|
134
132
|
}
|
|
135
133
|
|
package/lib/stats-worker.js
CHANGED
|
@@ -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 =
|
|
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
|
-
|
|
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
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,
|
|
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),
|
|
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()); });
|