cc-viewer 1.5.0 → 1.5.2

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/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-hs4mCtCl.js"></script>
10
- <link rel="stylesheet" crossorigin href="/assets/index-DaYrU_Go.css">
9
+ <script type="module" crossorigin src="/assets/index-DgmtYyOQ.js"></script>
10
+ <link rel="stylesheet" crossorigin href="/assets/index-Bj_6pwE9.css">
11
11
  </head>
12
12
  <body>
13
13
  <div id="root"></div>
package/i18n.js CHANGED
@@ -1378,26 +1378,6 @@ const i18nData = {
1378
1378
  "tr": "İstek gövdesi boyutu küçüldü, muhtemelen /clear, /compact veya oturum değişikliği nedeniyle",
1379
1379
  "uk": "Розмір тіла запиту зменшився, можливо через /clear, /compact або зміну сесії"
1380
1380
  },
1381
- "ui.diffTooltip": {
1382
- "zh": "为了避免看冗长的全文,所以为大家简化展示了 MainAgent 的增量部分,通常只有 message 增加",
1383
- "en": "To avoid reading lengthy full text, only the incremental parts of MainAgent are shown — typically just new messages",
1384
- "zh-TW": "為了避免閱讀冗長的全文,簡化展示了 MainAgent 的增量部分,通常只有 message 增加",
1385
- "ko": "긴 전체 텍스트를 읽지 않도록 MainAgent의 증분 부분만 간략히 표시합니다. 일반적으로 message 추가만 있습니다",
1386
- "ja": "MainAgent の増分部分のみを簡略表示しています。長い全文を読む手間を省くため、通常は message の追加のみです",
1387
- "de": "Um das Lesen langer Volltexte zu vermeiden, werden nur die inkrementellen Teile des MainAgent angezeigt — in der Regel nur neue Nachrichten",
1388
- "es": "Para evitar leer textos completos extensos, solo se muestran las partes incrementales del MainAgent — normalmente solo mensajes nuevos",
1389
- "fr": "Pour éviter de lire de longs textes complets, seules les parties incrémentales du MainAgent sont affichées — généralement uniquement les nouveaux messages",
1390
- "it": "Per evitare di leggere lunghi testi completi, vengono mostrate solo le parti incrementali del MainAgent — di solito solo nuovi messaggi",
1391
- "da": "For at undgå at læse lange fuldtekster vises kun de inkrementelle dele af MainAgent — typisk kun nye beskeder",
1392
- "pl": "Aby uniknąć czytania długich pełnych tekstów, wyświetlane są tylko przyrostowe części MainAgent — zwykle tylko nowe wiadomości",
1393
- "ru": "Чтобы не читать длинный полный текст, отображаются только инкрементальные части MainAgent — обычно только новые сообщения",
1394
- "ar": "لتجنب قراءة النص الكامل الطويل، يتم عرض الأجزاء التزايدية فقط من MainAgent — عادةً فقط الرسائل الجديدة",
1395
- "no": "For å unngå å lese lange fulltekster vises kun de inkrementelle delene av MainAgent — vanligvis bare nye meldinger",
1396
- "pt-BR": "Para evitar ler textos completos longos, apenas as partes incrementais do MainAgent são exibidas — geralmente apenas novas mensagens",
1397
- "th": "เพื่อหลีกเลี่ยงการอ่านข้อความเต็มที่ยาว จึงแสดงเฉพาะส่วนที่เพิ่มขึ้นของ MainAgent เท่านั้น — โดยปกติจะมีเพียง message ใหม่",
1398
- "tr": "Uzun tam metinleri okumaktan kaçınmak için yalnızca MainAgent'ın artımlı kısımları gösterilir — genellikle yalnızca yeni mesajlar",
1399
- "uk": "Щоб не читати довгий повний текст, відображаються лише інкрементальні частини MainAgent — зазвичай лише нові повідомлення"
1400
- },
1401
1381
  "ui.resume.title": {
1402
1382
  "zh": "检测到近期日志",
1403
1383
  "en": "Recent Log Detected",
package/interceptor.js CHANGED
@@ -202,7 +202,7 @@ export function resetWorkspace() {
202
202
  LOG_FILE = '';
203
203
  }
204
204
 
205
- const MAX_LOG_SIZE = 300 * 1024 * 1024; // 300MB
205
+ const MAX_LOG_SIZE = 200 * 1024 * 1024; // 200MB
206
206
 
207
207
  const SUBAGENT_SYSTEM_RE = /command execution specialist|file search specialist|planning specialist|general-purpose agent/i;
208
208
 
@@ -589,7 +589,7 @@ export function setupInterceptor() {
589
589
  }
590
590
  } catch { }
591
591
 
592
- // 用户新指令边界:检查日志文件大小,超过 300MB 则切换新文件
592
+ // 用户新指令边界:检查日志文件大小,超过 200MB 则切换新文件
593
593
  if (requestEntry?.mainAgent) {
594
594
  checkAndRotateLogFile();
595
595
  // 仅 mainAgent 请求时缓存模型名,避免 SubAgent 覆盖
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cc-viewer",
3
- "version": "1.5.0",
3
+ "version": "1.5.2",
4
4
  "description": "Claude Code Logger visualization management tool",
5
5
  "license": "MIT",
6
6
  "main": "server.js",
package/server.js CHANGED
@@ -653,17 +653,39 @@ async function handleRequest(req, res) {
653
653
  }
654
654
 
655
655
  const entries = readLogFile();
656
+ // 增量加载:客户端传 since(最后条目时间戳)和 cc(缓存条目数)
657
+ const since = parsedUrl.searchParams.get('since');
658
+ const cc = parseInt(parsedUrl.searchParams.get('cc') || '0', 10);
659
+ let entriesToSend = entries;
660
+ let incremental = false;
661
+ if (since && cc > 0) {
662
+ const sinceMs = new Date(since).getTime();
663
+ if (!isNaN(sinceMs)) {
664
+ const delta = entries.filter(e => e.timestamp && new Date(e.timestamp).getTime() > sinceMs);
665
+ if (cc + delta.length === entries.length) {
666
+ entriesToSend = delta;
667
+ incremental = true;
668
+ }
669
+ }
670
+ }
656
671
  // 分段发送:先告知总数,再分块传输,让前端能显示真实加载进度
657
672
  const CHUNK_SIZE = 50;
658
- if (entries.length > CHUNK_SIZE) {
659
- res.write(`event: load_start\ndata: ${JSON.stringify({ total: entries.length })}\n\n`);
660
- for (let i = 0; i < entries.length; i += CHUNK_SIZE) {
661
- const chunk = entries.slice(i, i + CHUNK_SIZE);
673
+ if (entriesToSend.length > CHUNK_SIZE) {
674
+ res.write(`event: load_start\ndata: ${JSON.stringify({ total: entriesToSend.length, incremental })}\n\n`);
675
+ for (let i = 0; i < entriesToSend.length; i += CHUNK_SIZE) {
676
+ const chunk = entriesToSend.slice(i, i + CHUNK_SIZE);
662
677
  res.write(`event: load_chunk\ndata: ${JSON.stringify(chunk)}\n\n`);
663
678
  }
664
679
  res.write(`event: load_end\ndata: {}\n\n`);
680
+ } else if (incremental) {
681
+ // 增量模式:即使条目少也走 load_start/load_end 流程(可能 0 条新数据)
682
+ res.write(`event: load_start\ndata: ${JSON.stringify({ total: entriesToSend.length, incremental: true })}\n\n`);
683
+ if (entriesToSend.length > 0) {
684
+ res.write(`event: load_chunk\ndata: ${JSON.stringify(entriesToSend)}\n\n`);
685
+ }
686
+ res.write(`event: load_end\ndata: {}\n\n`);
665
687
  } else {
666
- res.write(`event: full_reload\ndata: ${JSON.stringify(entries)}\n\n`);
688
+ res.write(`event: full_reload\ndata: ${JSON.stringify(entriesToSend)}\n\n`);
667
689
  }
668
690
 
669
691
  req.on('close', () => {