cc-viewer 1.3.3 → 1.3.5

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.
@@ -0,0 +1 @@
1
+ body{margin:0;background-color:#0d0d0d}*{scrollbar-width:thin;scrollbar-color:#3a3a3a #0d0d0d}*::-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}.diff-view{background:#1a1a2e;border:1px solid #2a2a3e;border-radius:8px;padding:8px 12px}.diff-line-del{background:#ef444426;color:#fca5a5;padding:0 4px}.diff-line-add{background:#22c55e26;color:#86efac;padding:0 4px}.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}._helpBtn_1gxlm_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_1gxlm_1:hover{background:#333}._modalBody_1gxlm_24{max-height:60vh;overflow-y:auto;line-height:1.7}._modalBody_1gxlm_24 h1,._modalBody_1gxlm_24 h2,._modalBody_1gxlm_24 h3{margin-top:.8em}._modalBody_1gxlm_24 p{margin:.5em 0}._modalBody_1gxlm_24 code{background:#2a2a2a;padding:1px 4px;border-radius:3px;font-size:.9em}._modalBody_1gxlm_24 pre{background:#1a1a1a;padding:12px;border-radius:6px;overflow-x:auto}._spinWrap_1gxlm_54{display:flex;justify-content:center;padding:40px 0}._headerBar_19oju_2{display:flex;align-items:center;justify-content:space-between;width:100%;height:100%}._titleText_19oju_11{color:#fff;font-size:18px;cursor:pointer}._logoImage_19oju_17{height:24px;width:24px;margin-right:6px;border-radius:3px;vertical-align:text-bottom}._titleArrow_19oju_25{font-size:12px;margin-left:4px}._tokenStatsTag_19oju_31{border-radius:12px;cursor:pointer;background:#2a2a2a;border:1px solid #3a3a3a;color:#ccc}._tokenStatsIcon_19oju_39{margin-right:4px}._liveTag_19oju_44{border-radius:12px}._liveTag_19oju_44 .ant-badge-status-processing{animation:_breathe_19oju_1 2.5s ease-in-out infinite}@keyframes _breathe_19oju_1{0%,to{opacity:.4;transform:scale(.85)}50%{opacity:1;transform:scale(1.15)}}._liveTagHistory_19oju_57{background:#2a2a2a;border-color:#424242;color:#d1d5db}._liveTagText_19oju_63{margin-left:4px}._countdownStrong_19oju_68{font-variant-numeric:tabular-nums}._langSelector_19oju_73,._settingsBtn_19oju_84{color:#888;font-size:12px;cursor:pointer;-webkit-user-select:none;user-select:none;border:1px solid #555;border-radius:4px;padding:2px 8px}._settingsBtn_19oju_84:hover{color:#bbb;border-color:#777}._settingsItem_19oju_100{display:flex;justify-content:space-between;align-items:center;padding:12px 0}._settingsLabel_19oju_107{font-size:14px}._tokenStatsEmpty_19oju_112{padding:8px 4px;color:#999;font-size:13px}._tokenStatsContainer_19oju_119{display:flex;gap:12px;align-items:flex-start}._tokenStatsColumn_19oju_125{min-width:240px}._toolStatsColumn_19oju_129{min-width:180px}._modelCard_19oju_134{border:1px solid #333;border-radius:6px;padding:8px 10px;background:#111}._modelCardSpaced_19oju_141{margin-bottom:10px}._modelName_19oju_147{font-size:13px;font-weight:600;color:#e5e5e5;margin-bottom:8px;padding-bottom:4px;border-bottom:1px solid #333}._statsTable_19oju_157{width:100%;border-collapse:collapse}._th_19oju_162{padding:2px 12px;font-size:12px;font-family:monospace;white-space:nowrap;color:#888;font-weight:400;text-align:right}._td_19oju_172{padding:2px 12px;font-size:12px;font-family:monospace;white-space:nowrap;color:#e5e5e5;text-align:right}._label_19oju_181{padding:2px 12px;font-size:12px;font-family:monospace;white-space:nowrap;color:#aaa;font-weight:400;text-align:left}._rowBorder_19oju_191{border-bottom:1px solid #2a2a2a}._rebuildCard_19oju_195{border:1px solid #333;border-radius:6px;padding:8px 10px;margin-top:10px;background:#111}._rebuildTotalRow_19oju_203{border-top:1px solid #444}._rebuildTotalRow_19oju_203 td{font-weight:600}._promptExportBar_19oju_212{margin-bottom:12px}._promptScrollArea_19oju_216{max-height:500px;overflow:auto}._promptEmpty_19oju_221{color:#999;padding:12px}._promptTimestamp_19oju_227{color:#666;font-size:12px;margin:12px 0 4px;padding-bottom:6px}._textPromptCard_19oju_235{margin:4px 0;background:#141414;border-radius:6px;border:1px solid #303030;padding:10px 14px}._preText_19oju_244{white-space:pre-wrap;word-break:break-word;font-size:13px;line-height:1.6;color:#d9d9d9;margin:4px 0}._systemCollapse_19oju_254{margin:4px 0;background:#1a1a1a;border:1px solid #303030;border-radius:6px}._systemLabel_19oju_261{color:#888;font-size:12px}._preSys_19oju_266{white-space:pre-wrap;word-break:break-word;font-size:12px;line-height:1.5;color:#999;margin:0}._promptTextarea_19oju_276{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_19oju_292{display:flex;justify-content:center;padding:40px 0}._projectStatsEmpty_19oju_298{color:#999;padding:40px 0;text-align:center;font-size:13px}._projectStatsContent_19oju_305{display:flex;flex-direction:column;gap:16px}._projectStatsUpdated_19oju_311{color:#666;font-size:12px;text-align:right}._projectStatsSummary_19oju_317{display:grid;grid-template-columns:1fr 1fr;gap:10px}._projectStatCard_19oju_323{background:#111;border:1px solid #333;border-radius:8px;padding:14px 12px;text-align:center}._projectStatValue_19oju_331{font-size:22px;font-weight:700;color:#e5e5e5;font-family:monospace;font-variant-numeric:tabular-nums}._projectStatLabel_19oju_339{font-size:12px;color:#888;margin-top:4px}._projectStatsSection_19oju_345{display:flex;flex-direction:column;gap:10px}._projectStatsSectionTitle_19oju_351{font-size:14px;font-weight:600;color:#ccc;padding-bottom:4px;border-bottom:1px solid #333}._projectStatsModelCard_19oju_359{background:#111;border:1px solid #333;border-radius:6px;padding:10px 12px}._projectStatsModelHeader_19oju_366{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;padding-bottom:4px;border-bottom:1px solid #333}._projectStatsModelName_19oju_375{font-size:13px;font-weight:600;color:#e5e5e5}._projectStatsModelCount_19oju_381{font-size:12px;color:#888;font-family:monospace}._centerEmpty_ckz8l_1{display:flex;align-items:center;justify-content:center;height:100%}._scrollContainer_ckz8l_8{overflow:auto;height:100%}._listItem_ckz8l_13{cursor:pointer;padding:8px 12px;border-left:3px solid transparent;border-bottom:1px solid #1f1f1f;transition:background .15s}._listItem_ckz8l_13:hover{background:#151515}._listItemActive_ckz8l_25{background:#1a2332;border-left-color:#3b82f6}._listItemActive_ckz8l_25:hover{background:#1a2332}._itemContent_ckz8l_34{width:100%;min-width:0}._itemHeader_ckz8l_39{display:flex;align-items:center;gap:6px;margin-bottom:4px;font-size:12px}._tagNoMargin_ckz8l_47{margin:0;font-size:12px}._modelName_ckz8l_52{font-size:12px}._time_ckz8l_56{font-size:12px;color:#6b7280;margin-left:auto}._detailRow_ckz8l_62{display:flex;gap:8px;font-size:12px;align-items:center}._urlText_ckz8l_69{color:#555;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}._duration_ckz8l_78{color:#6b7280;flex-shrink:0}._statusOk_ckz8l_83{color:#52c41a;opacity:.5;flex-shrink:0}._statusErr_ckz8l_89{color:#ef4444;flex-shrink:0}._statusDefault_ckz8l_94{color:#9ca3af;flex-shrink:0}._usageBox_ckz8l_99{background:#111;border-radius:4px;padding:3px 6px;margin-top:4px;font-size:12px;color:#6b7280;line-height:1.6}._cacheDot_ckz8l_109{display:inline-block;width:6px;height:6px;border-radius:50%;margin:0 3px;vertical-align:middle}._cacheDotLoss_ckz8l_118{background-color:#8b1a1a;cursor:help}._cacheDotNormal_ckz8l_123{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}._container_y3z3z_1{height:100%;overflow:auto;padding:0 16px}._emptyState_y3z3z_7{display:flex;align-items:center;justify-content:center;height:100%}._urlSection_y3z3z_14{padding:12px 0;border-bottom:1px solid #1f1f1f;display:flex;align-items:flex-start}._urlLeft_y3z3z_21{flex:1;min-width:0}._tokenStatsBox_y3z3z_26{flex-shrink:0;padding-left:12px;display:flex;align-items:center}._tokenGrid_y3z3z_33{display:flex;border:1px solid #303030;border-radius:6px;overflow:hidden;min-width:360px;font-size:11px;line-height:1.6}._tokenRows_y3z3z_43{flex:1}._tokenRow_y3z3z_43{display:flex}._tokenRowBorder_y3z3z_51{border-top:1px solid #303030}._tokenLabel_y3z3z_55{color:#888;padding:4px 8px;white-space:nowrap;font-weight:600}._tokenTd_y3z3z_62{flex:1;color:#d1d5db;text-align:right;padding:4px 8px;font-family:monospace;white-space:nowrap}._tokenHitRate_y3z3z_71{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_y3z3z_84{color:#888;font-size:10px;font-family:sans-serif}._tokenRowBorder_y3z3z_51 td{border-top:1px solid #303030}._urlText_y3z3z_94{color:#d1d5db;font-size:13px;margin-bottom:8px;word-break:break-all}._metaText_y3z3z_101,._headersContainer_y3z3z_105{font-size:12px}._headerRow_y3z3z_109{display:flex;padding:4px 0;border-bottom:1px solid #1f1f1f}._headerKey_y3z3z_115{min-width:200px;flex-shrink:0}._headerValue_y3z3z_120{word-break:break-all;margin-left:8px}._streamingBox_y3z3z_125{padding:20px;background:#1a1a1a;border-radius:6px;border:1px solid #2a2a2a}._bodyToolbar_y3z3z_132{display:flex;gap:8px;margin-bottom:8px}._rawTextPre_y3z3z_138{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_y3z3z_151{padding:12px 0}._collapseSpacing_y3z3z_155{margin-bottom:16px}._bodyLabel_y3z3z_159{margin:0}._bodyHeader_y3z3z_163{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}._diffSection_y3z3z_170{margin-bottom:16px}._diffToggle_y3z3z_174{display:inline-block;margin-bottom:8px;cursor:pointer}._diffIcon_y3z3z_180{font-size:12px;margin-left:4px}._viewInChatBtn_y3z3z_185{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_y3z3z_185:hover{border-color:#666;color:#d1d5db;background:#ffffff0f}._reminderSelect_y3z3z_206{min-width:140px;font-size:12px}._reminderSelect_y3z3z_206 .ant-select-selector{border-radius:2px!important;border-color:#424242!important;background:transparent!important;min-height:26px!important;height:auto!important;padding:0 8px!important;font-family:monospace}._reminderSelect_y3z3z_206 .ant-select-selection-placeholder{font-size:11px}._wrapper_1o255_1{margin:6px 0}._header_1o255_5{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}._filePath_1o255_12{color:#a78bfa;font-size:12px;font-weight:600}._toggle_1o255_18{color:#6b7280;font-size:11px;cursor:pointer;-webkit-user-select:none;user-select:none}._code_1o255_25{margin:0;font-size:12px;line-height:1.5;overflow:auto}._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}._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)}}._avatar_1od17_3{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}._avatarImg_1od17_13{width:32px;height:32px;border-radius:50%;flex-shrink:0;object-fit:cover}._bubble_1od17_21{border-radius:8px;padding:10px 14px;max-width:100%;font-size:14px;line-height:1.6;word-break:break-word}._messageRow_1od17_32{display:flex;gap:10px;padding:8px 0}._messageRowEnd_1od17_38{display:flex;gap:10px;padding:8px 0;justify-content:flex-end}._contentCol_1od17_47{min-width:0;flex:1}._contentColLimited_1od17_52{min-width:0;max-width:80%;width:fit-content}._labelRow_1od17_60{display:flex;justify-content:space-between;align-items:center;margin-bottom:2px}._labelRight_1od17_67{display:flex;align-items:center;gap:4px;flex-shrink:0;margin-left:auto}._labelText_1od17_75{font-size:11px}._timeText_1od17_79,._timeTextNoMargin_1od17_85{font-size:10px;color:#6b7280;flex-shrink:0}._labelTextRight_1od17_91{font-size:11px;margin-left:auto}._bubbleUser_1od17_98{background:#1668dc;color:#e5e7eb}._bubbleAssistant_1od17_104{background:#141414;color:#e5e7eb;transition:box-shadow 0s;position:relative}._bubbleHighlight_1od17_112{box-shadow:0 0 10px #1668dc99}._bubbleHighlightFading_1od17_116{box-shadow:0 0 10px #1668dc00;transition:box-shadow 5s ease-out}._borderSvg_1od17_121{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;pointer-events:none;overflow:visible}._borderSvgFading_1od17_130{opacity:0;transition:opacity 5s ease-out}._borderRect_1od17_135{animation:_dashRotate_1od17_1 4s linear infinite}@keyframes _dashRotate_1od17_1{0%{stroke-dashoffset:0}to{stroke-dashoffset:-100}}._bubblePlan_1od17_144{background:#141428;border:5px solid #1668dc;font-size:12px;color:#e5e7eb}._bubbleSubAgent_1od17_152{background:#1a1a2e;color:#e5e7eb}._bubbleSelection_1od17_158{background:#1a3a1a;color:#e5e7eb}._systemTagLabel_1od17_166{font-size:12px}._skillLabel_1od17_170{font-size:12px;color:#a78bfa}._systemTagPre_1od17_175{font-size:12px;color:#9ca3af;white-space:pre-wrap;word-break:break-all;margin:0}._collapseMargin_1od17_183{margin:4px 0}._collapseNoMargin_1od17_187{margin:0}._thinkingLabel_1od17_193{font-size:12px}._toolBox_1od17_199{background:#1a1a2e;border:1px solid #2a2a3e;border-radius:8px;padding:8px 12px;margin:6px 0;font-size:12px}._toolLabel_1od17_208{color:#a78bfa}._codePre_1od17_214{font-size:12px;margin:4px 0 0;white-space:pre-wrap;word-break:break-all;background:#0d1117;border-radius:4px;padding:6px 8px}._pathTag_1od17_226{color:#7dd3fc;font-size:11px}._descSpan_1od17_233{color:#6b7280;font-weight:400}._secondarySpan_1od17_238{color:#6b7280}._patternSpan_1od17_242{color:#fbbf24}._kvContainer_1od17_248{margin-top:4px;font-size:11px}._kvItem_1od17_253{margin:2px 0}._kvKey_1od17_257{color:#7dd3fc}._kvValue_1od17_261{color:#9ca3af}._toolResult_1od17_267{background:#111827;border:1px solid #1e293b;border-radius:6px;padding:6px 10px;margin:2px 0 6px;font-size:11px}._toolResultLabel_1od17_276{font-size:11px}._compactLabel_1od17_282{font-size:12px;color:#93c5fd}._compactPre_1od17_287{font-size:12px;color:#d1d5db;white-space:pre-wrap;word-break:break-all;margin:0}._viewRequestBtn_1od17_297{font-size:10px;color:#555;cursor:pointer;margin-left:6px;flex-shrink:0}._viewRequestBtn_1od17_297:hover{color:#93c5fd}._optionList_1od17_311{padding-left:8px}._optionDesc_1od17_315{color:#555;margin-left:6px;font-weight:400}._questionText_1od17_323{font-size:13px;color:#ccc;margin-bottom:4px}._questionSpacing_1od17_329{margin-bottom:10px}._option_1od17_311{font-size:12px;padding:1px 0}._centerEmpty_1j3v3_1{display:flex;align-items:center;justify-content:center;height:100%}._container_1j3v3_8{height:100%;overflow:auto;padding:16px 24px;display:flex;flex-direction:column}._sessionDividerText_1j3v3_16{font-size:11px;color:#555}._lastResponseLabel_1j3v3_21{font-size:11px}._resizer_yamj2_1{width:6px;cursor:col-resize;background:#1f1f1f;flex-shrink:0;transition:background .2s}._resizer_yamj2_1:hover{background:#3b82f6}._layout_16uf8_1{height:100vh;overflow:hidden}._header_16uf8_6{background:#111;border-bottom:1px solid #1f1f1f;padding:0 24px;height:60px;line-height:60px}._content_16uf8_14{flex:1;overflow:hidden}._mainContainer_16uf8_19{display:flex;height:100%}._leftPanel_16uf8_24{flex-shrink:0;border-right:1px solid #1f1f1f;display:flex;flex-direction:column;background:#0a0a0a}._leftPanelHeader_16uf8_32{padding:10px 16px;border-bottom:1px solid #1f1f1f;font-size:13px;color:#9ca3af;font-weight:500;display:flex;justify-content:space-between;align-items:center}._leftPanelCount_16uf8_43{font-size:12px;color:#555;font-weight:400}._leftPanelBody_16uf8_49{flex:1;overflow:hidden}._rightPanel_16uf8_54{flex:1;overflow:hidden;background:#0d0d0d}._modalActions_16uf8_60{margin-bottom:12px}._spinCenter_16uf8_64{text-align:center;padding:40px}._emptyCenter_16uf8_69{text-align:center;color:#999;padding:40px}._logCheckbox_16uf8_75{margin-right:8px}._logListContainer_16uf8_79{background:#0d0d0d;border-radius:8px;overflow:hidden}._logListItem_16uf8_85{cursor:pointer;padding:8px 12px;border-bottom:1px solid #222}._logItemRow_16uf8_91{display:flex;align-items:center;width:100%;justify-content:space-between;flex-wrap:nowrap;gap:12px}._logItemRow_16uf8_91>span:first-child{display:flex;align-items:center;flex:1;min-width:0;overflow:hidden}._logFileName_16uf8_108{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._logItemRow_16uf8_91>span:last-child{display:flex;align-items:center;flex-shrink:0;gap:8px}._logFileIcon_16uf8_121{margin-right:8px;color:#3b82f6;flex-shrink:0}._loadingOverlay_16uf8_127{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#000000bf;display:flex;align-items:center;justify-content:center;z-index:9999}._loadingText_16uf8_140{color:#fff;font-size:16px;font-weight:700}._footer_16uf8_146{height:18px;background:#000;display:flex;align-items:center;justify-content:flex-end;padding:0 12px;flex-shrink:0}._footerRight_16uf8_156{display:flex;align-items:center;gap:6px;font-size:11px;color:#555}._footerLink_16uf8_164{display:inline-flex;align-items:center;gap:3px;color:#555;text-decoration:none}._footerLink_16uf8_164:hover{color:#888}._footerIcon_16uf8_176{width:12px;height:12px}._footerDivider_16uf8_181{color:#333}._footerText_16uf8_185{color:#555}._guideContainer_16uf8_189{display:flex;align-items:center;justify-content:center;height:100%;background:#0a0a0a}._guideContent_16uf8_197{max-width:560px;padding:40px}._guideIcon_16uf8_202{margin-bottom:20px;opacity:.6}._guideTitle_16uf8_207{font-size:20px;font-weight:600;color:#e0e0e0;margin:0 0 28px}._guideStep_16uf8_214{display:flex;gap:14px;margin-bottom:22px}._guideStepNum_16uf8_220{flex-shrink:0;width:24px;height:24px;border-radius:50%;background:#1a1a2e;color:#7c8aff;font-size:13px;font-weight:600;display:flex;align-items:center;justify-content:center;margin-top:1px}._guideStepBody_16uf8_235{flex:1;min-width:0}._guideText_16uf8_240{color:#aaa;font-size:14px;line-height:1.6;margin:0 0 8px}._guideCode_16uf8_247{display:block;background:#141414;border:1px solid #252525;border-radius:6px;padding:10px 14px;color:#8b9cf7;font-size:13px;line-height:1.5;word-break:break-all;white-space:pre-wrap}
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-YZa65fAJ.js"></script>
10
- <link rel="stylesheet" crossorigin href="/assets/index-Dsn6K9v-.css">
9
+ <script type="module" crossorigin src="/assets/index-Chsw1Bnp.js"></script>
10
+ <link rel="stylesheet" crossorigin href="/assets/index-DdxzMzrS.css">
11
11
  </head>
12
12
  <body>
13
13
  <div id="root"></div>
package/i18n.js CHANGED
@@ -386,6 +386,86 @@ const i18nData = {
386
386
  "tr": "\nCC Viewer zaten çalışıyor: http://{host}:{port}\n",
387
387
  "uk": "\nCC Viewer вже працює: http://{host}:{port}\n"
388
388
  },
389
+ "update.updating": {
390
+ "zh": "正在更新到 v{version}...",
391
+ "en": "Updating to v{version}...",
392
+ "zh-TW": "正在更新到 v{version}...",
393
+ "ko": "v{version}으로 업데이트 중...",
394
+ "ja": "v{version} に更新中...",
395
+ "de": "Aktualisierung auf v{version}...",
396
+ "es": "Actualizando a v{version}...",
397
+ "fr": "Mise à jour vers v{version}...",
398
+ "it": "Aggiornamento a v{version}...",
399
+ "da": "Opdaterer til v{version}...",
400
+ "pl": "Aktualizacja do v{version}...",
401
+ "ru": "Обновление до v{version}...",
402
+ "ar": "جارٍ التحديث إلى v{version}...",
403
+ "no": "Oppdaterer til v{version}...",
404
+ "pt-BR": "Atualizando para v{version}...",
405
+ "th": "กำลังอัปเดตเป็น v{version}...",
406
+ "tr": "v{version} sürümüne güncelleniyor...",
407
+ "uk": "Оновлення до v{version}..."
408
+ },
409
+ "update.completed": {
410
+ "zh": "已更新到 v{version},下次启动生效",
411
+ "en": "Updated to v{version}, effective on next restart",
412
+ "zh-TW": "已更新到 v{version},下次啟動生效",
413
+ "ko": "v{version}으로 업데이트됨, 다음 시작 시 적용",
414
+ "ja": "v{version} に更新済み、次回起動時に有効",
415
+ "de": "Auf v{version} aktualisiert, wirksam beim nächsten Neustart",
416
+ "es": "Actualizado a v{version}, efectivo en el próximo reinicio",
417
+ "fr": "Mis à jour vers v{version}, effectif au prochain redémarrage",
418
+ "it": "Aggiornato a v{version}, effettivo al prossimo riavvio",
419
+ "da": "Opdateret til v{version}, træder i kraft ved næste genstart",
420
+ "pl": "Zaktualizowano do v{version}, obowiązuje po ponownym uruchomieniu",
421
+ "ru": "Обновлено до v{version}, вступит в силу при следующем запуске",
422
+ "ar": "تم التحديث إلى v{version}، سيسري عند إعادة التشغيل التالية",
423
+ "no": "Oppdatert til v{version}, trer i kraft ved neste omstart",
424
+ "pt-BR": "Atualizado para v{version}, efetivo na próxima reinicialização",
425
+ "th": "อัปเดตเป็น v{version} แล้ว มีผลเมื่อเริ่มใหม่",
426
+ "tr": "v{version} sürümüne güncellendi, bir sonraki başlatmada geçerli",
427
+ "uk": "Оновлено до v{version}, набуде чинності при наступному запуску"
428
+ },
429
+ "update.majorAvailable": {
430
+ "zh": "新大版本 v{version} 可用,请手动更新: npm i -g cc-viewer@latest",
431
+ "en": "Major version v{version} available, please update manually: npm i -g cc-viewer@latest",
432
+ "zh-TW": "新大版本 v{version} 可用,請手動更新: npm i -g cc-viewer@latest",
433
+ "ko": "새 메이저 버전 v{version} 사용 가능, 수동 업데이트 필요: npm i -g cc-viewer@latest",
434
+ "ja": "メジャーバージョン v{version} が利用可能、手動更新してください: npm i -g cc-viewer@latest",
435
+ "de": "Hauptversion v{version} verfügbar, bitte manuell aktualisieren: npm i -g cc-viewer@latest",
436
+ "es": "Versión principal v{version} disponible, actualice manualmente: npm i -g cc-viewer@latest",
437
+ "fr": "Version majeure v{version} disponible, veuillez mettre à jour manuellement : npm i -g cc-viewer@latest",
438
+ "it": "Versione principale v{version} disponibile, aggiornare manualmente: npm i -g cc-viewer@latest",
439
+ "da": "Hovedversion v{version} tilgængelig, opdater manuelt: npm i -g cc-viewer@latest",
440
+ "pl": "Główna wersja v{version} dostępna, zaktualizuj ręcznie: npm i -g cc-viewer@latest",
441
+ "ru": "Доступна основная версия v{version}, обновите вручную: npm i -g cc-viewer@latest",
442
+ "ar": "الإصدار الرئيسي v{version} متاح، يرجى التحديث يدويًا: npm i -g cc-viewer@latest",
443
+ "no": "Hovedversjon v{version} tilgjengelig, oppdater manuelt: npm i -g cc-viewer@latest",
444
+ "pt-BR": "Versão principal v{version} disponível, atualize manualmente: npm i -g cc-viewer@latest",
445
+ "th": "เวอร์ชันหลัก v{version} พร้อมใช้งาน กรุณาอัปเดตด้วยตนเอง: npm i -g cc-viewer@latest",
446
+ "tr": "Ana sürüm v{version} mevcut, lütfen manuel güncelleyin: npm i -g cc-viewer@latest",
447
+ "uk": "Доступна основна версія v{version}, оновіть вручну: npm i -g cc-viewer@latest"
448
+ },
449
+ "update.failed": {
450
+ "zh": "自动更新失败: {error}",
451
+ "en": "Auto-update failed: {error}",
452
+ "zh-TW": "自動更新失敗: {error}",
453
+ "ko": "자동 업데이트 실패: {error}",
454
+ "ja": "自動更新に失敗: {error}",
455
+ "de": "Automatische Aktualisierung fehlgeschlagen: {error}",
456
+ "es": "Actualización automática fallida: {error}",
457
+ "fr": "Mise à jour automatique échouée : {error}",
458
+ "it": "Aggiornamento automatico fallito: {error}",
459
+ "da": "Automatisk opdatering mislykkedes: {error}",
460
+ "pl": "Automatyczna aktualizacja nie powiodła się: {error}",
461
+ "ru": "Автообновление не удалось: {error}",
462
+ "ar": "فشل التحديث التلقائي: {error}",
463
+ "no": "Automatisk oppdatering mislyktes: {error}",
464
+ "pt-BR": "Atualização automática falhou: {error}",
465
+ "th": "อัปเดตอัตโนมัติล้มเหลว: {error}",
466
+ "tr": "Otomatik güncelleme başarısız: {error}",
467
+ "uk": "Автооновлення не вдалося: {error}"
468
+ },
389
469
  "server.portsBusy": {
390
470
  "zh": "⚠️ 端口 {start}-{end} 均被占用,请求监控服务未启动",
391
471
  "en": "⚠️ Ports {start}-{end} are all in use, monitoring service not started",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cc-viewer",
3
- "version": "1.3.3",
3
+ "version": "1.3.5",
4
4
  "description": "Claude Code Logger visualization management tool",
5
5
  "license": "MIT",
6
6
  "main": "server.js",
@@ -49,6 +49,7 @@
49
49
  "i18n.js",
50
50
  "findcc.js",
51
51
  "stats-worker.js",
52
+ "updater.js",
52
53
  "locales/",
53
54
  "concepts/"
54
55
  ],
package/server.js CHANGED
@@ -1,13 +1,14 @@
1
1
  import { createServer } from 'node:http';
2
2
  import { readFileSync, writeFileSync, existsSync, watchFile, unwatchFile, statSync, readdirSync, renameSync, unlinkSync, openSync, readSync, closeSync } from 'node:fs';
3
3
  import { fileURLToPath } from 'node:url';
4
- import { dirname, join, extname, basename } from 'node:path';
4
+ import { dirname, join, extname } from 'node:path';
5
5
  import { homedir, userInfo, platform } from 'node:os';
6
6
  import { execSync } from 'node:child_process';
7
7
  import { Worker } from 'node:worker_threads';
8
8
  import { LOG_FILE, _initPromise, _resumeState, resolveResumeChoice, _projectName, _logDir, _cachedApiKey, _cachedAuthHeader, _cachedHaikuModel } from './interceptor.js';
9
9
  import { LOG_DIR } from './findcc.js';
10
10
  import { t, detectLanguage } from './i18n.js';
11
+ import { checkAndUpdate } from './updater.js';
11
12
 
12
13
  const PREFS_FILE = join(LOG_DIR, 'preferences.json');
13
14
 
@@ -418,6 +419,19 @@ function handleRequest(req, res) {
418
419
  return;
419
420
  }
420
421
 
422
+ // 当前版本号
423
+ if (url === '/api/version-info' && method === 'GET') {
424
+ try {
425
+ const pkg = JSON.parse(readFileSync(join(__dirname, 'package.json'), 'utf-8'));
426
+ res.writeHead(200, { 'Content-Type': 'application/json' });
427
+ res.end(JSON.stringify({ version: pkg.version }));
428
+ } catch {
429
+ res.writeHead(500, { 'Content-Type': 'application/json' });
430
+ res.end(JSON.stringify({ error: 'Failed to read version' }));
431
+ }
432
+ return;
433
+ }
434
+
421
435
  // 项目统计数据
422
436
  if (url === '/api/project-stats' && method === 'GET') {
423
437
  try {
@@ -590,29 +604,6 @@ function handleRequest(req, res) {
590
604
  return;
591
605
  }
592
606
 
593
- // 下载当前日志文件
594
- if (url === '/api/download-log' && method === 'GET') {
595
- try {
596
- if (!existsSync(LOG_FILE)) {
597
- res.writeHead(404, { 'Content-Type': 'application/json' });
598
- res.end(JSON.stringify({ error: 'Log file not found' }));
599
- return;
600
- }
601
- const content = readFileSync(LOG_FILE);
602
- const fileName = basename(LOG_FILE);
603
- res.writeHead(200, {
604
- 'Content-Type': 'application/octet-stream',
605
- 'Content-Disposition': `attachment; filename="${fileName}"`,
606
- 'Content-Length': content.length,
607
- });
608
- res.end(content);
609
- } catch (err) {
610
- res.writeHead(500, { 'Content-Type': 'application/json' });
611
- res.end(JSON.stringify({ error: err.message }));
612
- }
613
- return;
614
- }
615
-
616
607
  // GET /api/concept?lang=zh&doc=Tool-Bash
617
608
  if (method === 'GET' && url.startsWith('/api/concept')) {
618
609
  const conceptParams = new URL(url, 'http://localhost').searchParams;
@@ -749,7 +740,23 @@ export function stopViewer() {
749
740
 
750
741
  // Auto-start the viewer after log file init completes
751
742
  _initPromise.then(() => {
752
- startViewer().catch(err => {
743
+ startViewer().then((srv) => {
744
+ if (!srv) return;
745
+ // 延迟 3 秒异步检查更新
746
+ setTimeout(() => {
747
+ checkAndUpdate().then(result => {
748
+ if (result.status === 'updated') {
749
+ clients.forEach(client => {
750
+ try { client.write(`event: update_completed\ndata: ${JSON.stringify({ version: result.remoteVersion })}\n\n`); } catch { }
751
+ });
752
+ } else if (result.status === 'major_available') {
753
+ clients.forEach(client => {
754
+ try { client.write(`event: update_major_available\ndata: ${JSON.stringify({ version: result.remoteVersion })}\n\n`); } catch { }
755
+ });
756
+ }
757
+ }).catch(() => { });
758
+ }, 3000);
759
+ }).catch(err => {
753
760
  console.error('Failed to start CC Viewer:', err);
754
761
  });
755
762
  });
package/updater.js ADDED
@@ -0,0 +1,118 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
2
+ import { execSync } from 'node:child_process';
3
+ import { join } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { dirname } from 'node:path';
7
+ import { t } from './i18n.js';
8
+
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = dirname(__filename);
11
+
12
+ const CHECK_INTERVAL = 4 * 60 * 60 * 1000; // 4 hours
13
+ const CACHE_DIR = join(homedir(), '.claude', 'cc-viewer');
14
+ const CACHE_FILE = join(CACHE_DIR, 'update-check.json');
15
+ const CC_SETTINGS_FILE = join(homedir(), '.claude', 'settings.json');
16
+
17
+ function getCurrentVersion() {
18
+ const pkg = JSON.parse(readFileSync(join(__dirname, 'package.json'), 'utf-8'));
19
+ return pkg.version;
20
+ }
21
+
22
+ function parseVersion(ver) {
23
+ const [major, minor, patch] = ver.split('.').map(Number);
24
+ return { major, minor, patch };
25
+ }
26
+
27
+ function isNewer(remote, current) {
28
+ const r = parseVersion(remote);
29
+ const c = parseVersion(current);
30
+ if (r.major !== c.major) return r.major > c.major;
31
+ if (r.minor !== c.minor) return r.minor > c.minor;
32
+ return r.patch > c.patch;
33
+ }
34
+
35
+ // 读取 Claude Code 全局配置,判断是否允许自更新
36
+ function isAutoUpdateEnabled() {
37
+ // 环境变量禁用
38
+ if (process.env.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC) return false;
39
+
40
+ try {
41
+ if (!existsSync(CC_SETTINGS_FILE)) return true; // 默认启用
42
+ const settings = JSON.parse(readFileSync(CC_SETTINGS_FILE, 'utf-8'));
43
+ // Claude Code 用 autoUpdates: false 显式禁用
44
+ if (settings.autoUpdates === false) return false;
45
+ } catch { }
46
+
47
+ return true; // 默认启用
48
+ }
49
+
50
+ function shouldCheck() {
51
+ try {
52
+ if (!existsSync(CACHE_FILE)) return true;
53
+ const data = JSON.parse(readFileSync(CACHE_FILE, 'utf-8'));
54
+ return Date.now() - data.lastCheck > CHECK_INTERVAL;
55
+ } catch {
56
+ return true;
57
+ }
58
+ }
59
+
60
+ function saveCheckTime() {
61
+ try {
62
+ if (!existsSync(CACHE_DIR)) mkdirSync(CACHE_DIR, { recursive: true });
63
+ writeFileSync(CACHE_FILE, JSON.stringify({ lastCheck: Date.now() }));
64
+ } catch { }
65
+ }
66
+
67
+ export async function checkAndUpdate() {
68
+ const currentVersion = getCurrentVersion();
69
+
70
+ // 跟随 Claude Code 全局配置
71
+ if (!isAutoUpdateEnabled()) {
72
+ return { status: 'disabled', currentVersion, remoteVersion: null };
73
+ }
74
+
75
+ if (!shouldCheck()) {
76
+ return { status: 'skipped', currentVersion, remoteVersion: null };
77
+ }
78
+
79
+ try {
80
+ const res = await fetch('https://registry.npmjs.org/cc-viewer');
81
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
82
+ const data = await res.json();
83
+ const remoteVersion = data['dist-tags']?.latest;
84
+
85
+ saveCheckTime();
86
+
87
+ if (!remoteVersion) {
88
+ return { status: 'error', currentVersion, remoteVersion: null, error: 'No version found' };
89
+ }
90
+
91
+ if (!isNewer(remoteVersion, currentVersion)) {
92
+ return { status: 'latest', currentVersion, remoteVersion };
93
+ }
94
+
95
+ const remote = parseVersion(remoteVersion);
96
+ const current = parseVersion(currentVersion);
97
+
98
+ // 跨大版本:仅提示
99
+ if (remote.major !== current.major) {
100
+ console.error(`[CC Viewer] ${t('update.majorAvailable', { version: remoteVersion })}`);
101
+ return { status: 'major_available', currentVersion, remoteVersion };
102
+ }
103
+
104
+ // 同大版本:自动更新
105
+ console.error(`[CC Viewer] ${t('update.updating', { version: remoteVersion })}`);
106
+ try {
107
+ execSync(`npm install -g cc-viewer@${remoteVersion}`, { stdio: 'pipe', timeout: 60000 });
108
+ console.error(`[CC Viewer] ${t('update.completed', { version: remoteVersion })}`);
109
+ return { status: 'updated', currentVersion, remoteVersion };
110
+ } catch (err) {
111
+ console.error(`[CC Viewer] ${t('update.failed', { error: err.message })}`);
112
+ return { status: 'error', currentVersion, remoteVersion, error: err.message };
113
+ }
114
+ } catch (err) {
115
+ saveCheckTime();
116
+ return { status: 'error', currentVersion, remoteVersion: null, error: err.message };
117
+ }
118
+ }
@@ -1 +0,0 @@
1
- body{margin:0;background-color:#0d0d0d}*{scrollbar-width:thin;scrollbar-color:#3a3a3a #0d0d0d}*::-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}.diff-view{background:#1a1a2e;border:1px solid #2a2a3e;border-radius:8px;padding:8px 12px}.diff-line-del{background:#ef444426;color:#fca5a5;padding:0 4px}.diff-line-add{background:#22c55e26;color:#86efac;padding:0 4px}.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}._helpBtn_1gxlm_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_1gxlm_1:hover{background:#333}._modalBody_1gxlm_24{max-height:60vh;overflow-y:auto;line-height:1.7}._modalBody_1gxlm_24 h1,._modalBody_1gxlm_24 h2,._modalBody_1gxlm_24 h3{margin-top:.8em}._modalBody_1gxlm_24 p{margin:.5em 0}._modalBody_1gxlm_24 code{background:#2a2a2a;padding:1px 4px;border-radius:3px;font-size:.9em}._modalBody_1gxlm_24 pre{background:#1a1a1a;padding:12px;border-radius:6px;overflow-x:auto}._spinWrap_1gxlm_54{display:flex;justify-content:center;padding:40px 0}._headerBar_m457c_2{display:flex;align-items:center;justify-content:space-between;width:100%;height:100%}._titleText_m457c_11{color:#fff;font-size:18px;cursor:pointer}._logoImage_m457c_17{height:24px;width:24px;margin-right:6px;border-radius:3px;vertical-align:text-bottom}._titleArrow_m457c_25{font-size:12px;margin-left:4px}._tokenStatsTag_m457c_31{border-radius:12px;cursor:pointer;background:#2a2a2a;border:1px solid #3a3a3a;color:#ccc}._tokenStatsIcon_m457c_39{margin-right:4px}._liveTag_m457c_44{border-radius:12px}._liveTag_m457c_44 .ant-badge-status-processing{animation:_breathe_m457c_1 2.5s ease-in-out infinite}@keyframes _breathe_m457c_1{0%,to{opacity:.4;transform:scale(.85)}50%{opacity:1;transform:scale(1.15)}}._liveTagHistory_m457c_57{background:#2a2a2a;border-color:#424242;color:#d1d5db}._liveTagText_m457c_63{margin-left:4px}._countdownStrong_m457c_68{font-variant-numeric:tabular-nums}._langSelector_m457c_73,._settingsBtn_m457c_84{color:#888;font-size:12px;cursor:pointer;-webkit-user-select:none;user-select:none;border:1px solid #555;border-radius:4px;padding:2px 8px}._settingsBtn_m457c_84:hover{color:#bbb;border-color:#777}._settingsItem_m457c_100{display:flex;justify-content:space-between;align-items:center;padding:12px 0}._settingsLabel_m457c_107{font-size:14px}._tokenStatsEmpty_m457c_112{padding:8px 4px;color:#999;font-size:13px}._tokenStatsContainer_m457c_119{display:flex;gap:12px;align-items:flex-start}._tokenStatsColumn_m457c_125{min-width:240px}._toolStatsColumn_m457c_129{min-width:180px}._modelCard_m457c_134{border:1px solid #333;border-radius:6px;padding:8px 10px;background:#111}._modelCardSpaced_m457c_141{margin-bottom:10px}._modelName_m457c_147{font-size:13px;font-weight:600;color:#e5e5e5;margin-bottom:8px;padding-bottom:4px;border-bottom:1px solid #333}._statsTable_m457c_157{width:100%;border-collapse:collapse}._th_m457c_162{padding:2px 12px;font-size:12px;font-family:monospace;white-space:nowrap;color:#888;font-weight:400;text-align:right}._td_m457c_172{padding:2px 12px;font-size:12px;font-family:monospace;white-space:nowrap;color:#e5e5e5;text-align:right}._label_m457c_181{padding:2px 12px;font-size:12px;font-family:monospace;white-space:nowrap;color:#aaa;font-weight:400;text-align:left}._rowBorder_m457c_191{border-bottom:1px solid #2a2a2a}._rebuildCard_m457c_195{border:1px solid #333;border-radius:6px;padding:8px 10px;margin-top:10px;background:#111}._rebuildTotalRow_m457c_203{border-top:1px solid #444}._rebuildTotalRow_m457c_203 td{font-weight:600}._promptExportBar_m457c_212{margin-bottom:12px}._promptScrollArea_m457c_216{max-height:500px;overflow:auto}._promptEmpty_m457c_221{color:#999;padding:12px}._promptTimestamp_m457c_227{color:#666;font-size:12px;margin:12px 0 4px;padding-bottom:6px}._textPromptCard_m457c_235{margin:4px 0;background:#141414;border-radius:6px;border:1px solid #303030;padding:10px 14px}._preText_m457c_244{white-space:pre-wrap;word-break:break-word;font-size:13px;line-height:1.6;color:#d9d9d9;margin:4px 0}._systemCollapse_m457c_254{margin:4px 0;background:#1a1a1a;border:1px solid #303030;border-radius:6px}._systemLabel_m457c_261{color:#888;font-size:12px}._preSys_m457c_266{white-space:pre-wrap;word-break:break-word;font-size:12px;line-height:1.5;color:#999;margin:0}._promptTextarea_m457c_276{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_m457c_291{display:flex;justify-content:center;padding:40px 0}._projectStatsEmpty_m457c_297{color:#999;padding:40px 0;text-align:center;font-size:13px}._projectStatsContent_m457c_304{display:flex;flex-direction:column;gap:16px}._projectStatsUpdated_m457c_310{color:#666;font-size:12px;text-align:right}._projectStatsSummary_m457c_316{display:grid;grid-template-columns:1fr 1fr;gap:10px}._projectStatCard_m457c_322{background:#111;border:1px solid #333;border-radius:8px;padding:14px 12px;text-align:center}._projectStatValue_m457c_330{font-size:22px;font-weight:700;color:#e5e5e5;font-family:monospace;font-variant-numeric:tabular-nums}._projectStatLabel_m457c_338{font-size:12px;color:#888;margin-top:4px}._projectStatsSection_m457c_344{display:flex;flex-direction:column;gap:10px}._projectStatsSectionTitle_m457c_350{font-size:14px;font-weight:600;color:#ccc;padding-bottom:4px;border-bottom:1px solid #333}._projectStatsModelCard_m457c_358{background:#111;border:1px solid #333;border-radius:6px;padding:10px 12px}._projectStatsModelHeader_m457c_365{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;padding-bottom:4px;border-bottom:1px solid #333}._projectStatsModelName_m457c_374{font-size:13px;font-weight:600;color:#e5e5e5}._projectStatsModelCount_m457c_380{font-size:12px;color:#888;font-family:monospace}._centerEmpty_ckz8l_1{display:flex;align-items:center;justify-content:center;height:100%}._scrollContainer_ckz8l_8{overflow:auto;height:100%}._listItem_ckz8l_13{cursor:pointer;padding:8px 12px;border-left:3px solid transparent;border-bottom:1px solid #1f1f1f;transition:background .15s}._listItem_ckz8l_13:hover{background:#151515}._listItemActive_ckz8l_25{background:#1a2332;border-left-color:#3b82f6}._listItemActive_ckz8l_25:hover{background:#1a2332}._itemContent_ckz8l_34{width:100%;min-width:0}._itemHeader_ckz8l_39{display:flex;align-items:center;gap:6px;margin-bottom:4px;font-size:12px}._tagNoMargin_ckz8l_47{margin:0;font-size:12px}._modelName_ckz8l_52{font-size:12px}._time_ckz8l_56{font-size:12px;color:#6b7280;margin-left:auto}._detailRow_ckz8l_62{display:flex;gap:8px;font-size:12px;align-items:center}._urlText_ckz8l_69{color:#555;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}._duration_ckz8l_78{color:#6b7280;flex-shrink:0}._statusOk_ckz8l_83{color:#52c41a;opacity:.5;flex-shrink:0}._statusErr_ckz8l_89{color:#ef4444;flex-shrink:0}._statusDefault_ckz8l_94{color:#9ca3af;flex-shrink:0}._usageBox_ckz8l_99{background:#111;border-radius:4px;padding:3px 6px;margin-top:4px;font-size:12px;color:#6b7280;line-height:1.6}._cacheDot_ckz8l_109{display:inline-block;width:6px;height:6px;border-radius:50%;margin:0 3px;vertical-align:middle}._cacheDotLoss_ckz8l_118{background-color:#8b1a1a;cursor:help}._cacheDotNormal_ckz8l_123{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}._container_y3z3z_1{height:100%;overflow:auto;padding:0 16px}._emptyState_y3z3z_7{display:flex;align-items:center;justify-content:center;height:100%}._urlSection_y3z3z_14{padding:12px 0;border-bottom:1px solid #1f1f1f;display:flex;align-items:flex-start}._urlLeft_y3z3z_21{flex:1;min-width:0}._tokenStatsBox_y3z3z_26{flex-shrink:0;padding-left:12px;display:flex;align-items:center}._tokenGrid_y3z3z_33{display:flex;border:1px solid #303030;border-radius:6px;overflow:hidden;min-width:360px;font-size:11px;line-height:1.6}._tokenRows_y3z3z_43{flex:1}._tokenRow_y3z3z_43{display:flex}._tokenRowBorder_y3z3z_51{border-top:1px solid #303030}._tokenLabel_y3z3z_55{color:#888;padding:4px 8px;white-space:nowrap;font-weight:600}._tokenTd_y3z3z_62{flex:1;color:#d1d5db;text-align:right;padding:4px 8px;font-family:monospace;white-space:nowrap}._tokenHitRate_y3z3z_71{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_y3z3z_84{color:#888;font-size:10px;font-family:sans-serif}._tokenRowBorder_y3z3z_51 td{border-top:1px solid #303030}._urlText_y3z3z_94{color:#d1d5db;font-size:13px;margin-bottom:8px;word-break:break-all}._metaText_y3z3z_101,._headersContainer_y3z3z_105{font-size:12px}._headerRow_y3z3z_109{display:flex;padding:4px 0;border-bottom:1px solid #1f1f1f}._headerKey_y3z3z_115{min-width:200px;flex-shrink:0}._headerValue_y3z3z_120{word-break:break-all;margin-left:8px}._streamingBox_y3z3z_125{padding:20px;background:#1a1a1a;border-radius:6px;border:1px solid #2a2a2a}._bodyToolbar_y3z3z_132{display:flex;gap:8px;margin-bottom:8px}._rawTextPre_y3z3z_138{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_y3z3z_151{padding:12px 0}._collapseSpacing_y3z3z_155{margin-bottom:16px}._bodyLabel_y3z3z_159{margin:0}._bodyHeader_y3z3z_163{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}._diffSection_y3z3z_170{margin-bottom:16px}._diffToggle_y3z3z_174{display:inline-block;margin-bottom:8px;cursor:pointer}._diffIcon_y3z3z_180{font-size:12px;margin-left:4px}._viewInChatBtn_y3z3z_185{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_y3z3z_185:hover{border-color:#666;color:#d1d5db;background:#ffffff0f}._reminderSelect_y3z3z_206{min-width:140px;font-size:12px}._reminderSelect_y3z3z_206 .ant-select-selector{border-radius:2px!important;border-color:#424242!important;background:transparent!important;min-height:26px!important;height:auto!important;padding:0 8px!important;font-family:monospace}._reminderSelect_y3z3z_206 .ant-select-selection-placeholder{font-size:11px}._wrapper_1o255_1{margin:6px 0}._header_1o255_5{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}._filePath_1o255_12{color:#a78bfa;font-size:12px;font-weight:600}._toggle_1o255_18{color:#6b7280;font-size:11px;cursor:pointer;-webkit-user-select:none;user-select:none}._code_1o255_25{margin:0;font-size:12px;line-height:1.5;overflow:auto}._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}._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)}}._avatar_1od17_3{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}._avatarImg_1od17_13{width:32px;height:32px;border-radius:50%;flex-shrink:0;object-fit:cover}._bubble_1od17_21{border-radius:8px;padding:10px 14px;max-width:100%;font-size:14px;line-height:1.6;word-break:break-word}._messageRow_1od17_32{display:flex;gap:10px;padding:8px 0}._messageRowEnd_1od17_38{display:flex;gap:10px;padding:8px 0;justify-content:flex-end}._contentCol_1od17_47{min-width:0;flex:1}._contentColLimited_1od17_52{min-width:0;max-width:80%;width:fit-content}._labelRow_1od17_60{display:flex;justify-content:space-between;align-items:center;margin-bottom:2px}._labelRight_1od17_67{display:flex;align-items:center;gap:4px;flex-shrink:0;margin-left:auto}._labelText_1od17_75{font-size:11px}._timeText_1od17_79,._timeTextNoMargin_1od17_85{font-size:10px;color:#6b7280;flex-shrink:0}._labelTextRight_1od17_91{font-size:11px;margin-left:auto}._bubbleUser_1od17_98{background:#1668dc;color:#e5e7eb}._bubbleAssistant_1od17_104{background:#141414;color:#e5e7eb;transition:box-shadow 0s;position:relative}._bubbleHighlight_1od17_112{box-shadow:0 0 10px #1668dc99}._bubbleHighlightFading_1od17_116{box-shadow:0 0 10px #1668dc00;transition:box-shadow 5s ease-out}._borderSvg_1od17_121{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;pointer-events:none;overflow:visible}._borderSvgFading_1od17_130{opacity:0;transition:opacity 5s ease-out}._borderRect_1od17_135{animation:_dashRotate_1od17_1 4s linear infinite}@keyframes _dashRotate_1od17_1{0%{stroke-dashoffset:0}to{stroke-dashoffset:-100}}._bubblePlan_1od17_144{background:#141428;border:5px solid #1668dc;font-size:12px;color:#e5e7eb}._bubbleSubAgent_1od17_152{background:#1a1a2e;color:#e5e7eb}._bubbleSelection_1od17_158{background:#1a3a1a;color:#e5e7eb}._systemTagLabel_1od17_166{font-size:12px}._skillLabel_1od17_170{font-size:12px;color:#a78bfa}._systemTagPre_1od17_175{font-size:12px;color:#9ca3af;white-space:pre-wrap;word-break:break-all;margin:0}._collapseMargin_1od17_183{margin:4px 0}._collapseNoMargin_1od17_187{margin:0}._thinkingLabel_1od17_193{font-size:12px}._toolBox_1od17_199{background:#1a1a2e;border:1px solid #2a2a3e;border-radius:8px;padding:8px 12px;margin:6px 0;font-size:12px}._toolLabel_1od17_208{color:#a78bfa}._codePre_1od17_214{font-size:12px;margin:4px 0 0;white-space:pre-wrap;word-break:break-all;background:#0d1117;border-radius:4px;padding:6px 8px}._pathTag_1od17_226{color:#7dd3fc;font-size:11px}._descSpan_1od17_233{color:#6b7280;font-weight:400}._secondarySpan_1od17_238{color:#6b7280}._patternSpan_1od17_242{color:#fbbf24}._kvContainer_1od17_248{margin-top:4px;font-size:11px}._kvItem_1od17_253{margin:2px 0}._kvKey_1od17_257{color:#7dd3fc}._kvValue_1od17_261{color:#9ca3af}._toolResult_1od17_267{background:#111827;border:1px solid #1e293b;border-radius:6px;padding:6px 10px;margin:2px 0 6px;font-size:11px}._toolResultLabel_1od17_276{font-size:11px}._compactLabel_1od17_282{font-size:12px;color:#93c5fd}._compactPre_1od17_287{font-size:12px;color:#d1d5db;white-space:pre-wrap;word-break:break-all;margin:0}._viewRequestBtn_1od17_297{font-size:10px;color:#555;cursor:pointer;margin-left:6px;flex-shrink:0}._viewRequestBtn_1od17_297:hover{color:#93c5fd}._optionList_1od17_311{padding-left:8px}._optionDesc_1od17_315{color:#555;margin-left:6px;font-weight:400}._questionText_1od17_323{font-size:13px;color:#ccc;margin-bottom:4px}._questionSpacing_1od17_329{margin-bottom:10px}._option_1od17_311{font-size:12px;padding:1px 0}._centerEmpty_1j3v3_1{display:flex;align-items:center;justify-content:center;height:100%}._container_1j3v3_8{height:100%;overflow:auto;padding:16px 24px;display:flex;flex-direction:column}._sessionDividerText_1j3v3_16{font-size:11px;color:#555}._lastResponseLabel_1j3v3_21{font-size:11px}._resizer_yamj2_1{width:6px;cursor:col-resize;background:#1f1f1f;flex-shrink:0;transition:background .2s}._resizer_yamj2_1:hover{background:#3b82f6}._layout_1drw4_1{height:100vh;overflow:hidden}._header_1drw4_6{background:#111;border-bottom:1px solid #1f1f1f;padding:0 24px;height:60px;line-height:60px}._content_1drw4_14{flex:1;overflow:hidden}._mainContainer_1drw4_19{display:flex;height:100%}._leftPanel_1drw4_24{flex-shrink:0;border-right:1px solid #1f1f1f;display:flex;flex-direction:column;background:#0a0a0a}._leftPanelHeader_1drw4_32{padding:10px 16px;border-bottom:1px solid #1f1f1f;font-size:13px;color:#9ca3af;font-weight:500;display:flex;justify-content:space-between;align-items:center}._leftPanelCount_1drw4_43{font-size:12px;color:#555;font-weight:400}._leftPanelBody_1drw4_49{flex:1;overflow:hidden}._rightPanel_1drw4_54{flex:1;overflow:hidden;background:#0d0d0d}._modalActions_1drw4_60{margin-bottom:12px}._spinCenter_1drw4_64{text-align:center;padding:40px}._emptyCenter_1drw4_69{text-align:center;color:#999;padding:40px}._logCheckbox_1drw4_75{margin-right:8px}._logListItem_1drw4_79{cursor:pointer;padding:8px 12px}._logItemRow_1drw4_84{display:flex;align-items:center;width:100%;justify-content:space-between;flex-wrap:nowrap;gap:12px}._logItemRow_1drw4_84>span:first-child{display:flex;align-items:center;flex:1;min-width:0;overflow:hidden}._logFileName_1drw4_101{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._logItemRow_1drw4_84>span:last-child{display:flex;align-items:center;flex-shrink:0;gap:8px}._logFileIcon_1drw4_114{margin-right:8px;color:#3b82f6;flex-shrink:0}._folderIcon_1drw4_120{margin-right:8px}._logTag_1drw4_124{margin-left:8px}._loadingOverlay_1drw4_128{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#000000bf;display:flex;align-items:center;justify-content:center;z-index:9999}._loadingText_1drw4_141{color:#fff;font-size:16px;font-weight:700}._footer_1drw4_147{height:18px;background:#000;display:flex;align-items:center;justify-content:flex-end;padding:0 12px;flex-shrink:0}._footerRight_1drw4_157{display:flex;align-items:center;gap:6px;font-size:11px;color:#555}._footerLink_1drw4_165{display:inline-flex;align-items:center;gap:3px;color:#555;text-decoration:none}._footerLink_1drw4_165:hover{color:#888}._footerIcon_1drw4_177{width:12px;height:12px}._footerDivider_1drw4_182{color:#333}._footerText_1drw4_186{color:#555}._guideContainer_1drw4_190{display:flex;align-items:center;justify-content:center;height:100%;background:#0a0a0a}._guideContent_1drw4_198{max-width:560px;padding:40px}._guideIcon_1drw4_203{margin-bottom:20px;opacity:.6}._guideTitle_1drw4_208{font-size:20px;font-weight:600;color:#e0e0e0;margin:0 0 28px}._guideStep_1drw4_215{display:flex;gap:14px;margin-bottom:22px}._guideStepNum_1drw4_221{flex-shrink:0;width:24px;height:24px;border-radius:50%;background:#1a1a2e;color:#7c8aff;font-size:13px;font-weight:600;display:flex;align-items:center;justify-content:center;margin-top:1px}._guideStepBody_1drw4_236{flex:1;min-width:0}._guideText_1drw4_241{color:#aaa;font-size:14px;line-height:1.6;margin:0 0 8px}._guideCode_1drw4_248{display:block;background:#141414;border:1px solid #252525;border-radius:6px;padding:10px 14px;color:#8b9cf7;font-size:13px;line-height:1.5;word-break:break-all;white-space:pre-wrap}