claude-discover 1.9.1 → 1.9.4

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.
@@ -70,12 +70,6 @@
70
70
  border-top-right-radius: 4px;
71
71
  }
72
72
 
73
- .heat-strip-label {
74
- fill: #cbd1dc;
75
- font-size: 10px;
76
- font-family: var(--font-mono), monospace;
77
- }
78
-
79
73
  .gantt-canvas {
80
74
  width: 100%;
81
75
  flex: 1;
@@ -580,7 +574,6 @@
580
574
  line-height: 18px;
581
575
  color: var(--text-dim);
582
576
 
583
- &.muted { color: var(--text-dim); }
584
577
  &.warn { color: var(--warn); }
585
578
  &.danger { color: var(--danger); }
586
579
  }
@@ -594,24 +587,6 @@
594
587
  }
595
588
  }
596
589
 
597
- .session-row-top {
598
- display: flex;
599
- justify-content: space-between;
600
- align-items: center;
601
- font-size: 11px;
602
- }
603
-
604
- .source-tag { font-weight: 600; letter-spacing: 0.4px; }
605
-
606
- .session-row-meta {
607
- display: flex;
608
- align-items: center;
609
- gap: 6px;
610
- font-size: 11px;
611
- min-width: 0;
612
- }
613
-
614
- .session-time { color: var(--text-faint); font-family: var(--font-mono), monospace; margin-left: auto; }
615
590
  .session-time-bottom {
616
591
  margin-top: 2px;
617
592
  display: flex;
@@ -620,9 +595,21 @@
620
595
  font-size: 10px;
621
596
  line-height: 14px;
622
597
  color: var(--text-faint);
598
+
599
+ & > * { flex: none; }
600
+ & > * + *::before { content: ', '; }
623
601
  }
624
602
  .session-model { color: var(--text-dim); }
625
- .session-time-meta { color: var(--text-faint); }
603
+
604
+ /* the only part of the line that gives way when the list pane narrows */
605
+ .session-project {
606
+ color: var(--text-dim);
607
+ flex: 0 1 auto;
608
+ min-width: 0;
609
+ overflow: hidden;
610
+ text-overflow: ellipsis;
611
+ white-space: nowrap;
612
+ }
626
613
 
627
614
  .session-name {
628
615
  font-weight: 600;
@@ -663,8 +650,6 @@
663
650
  text-overflow: ellipsis;
664
651
  white-space: nowrap;
665
652
  }
666
-
667
- .model-tag { font-family: var(--font-mono), monospace; color: var(--text-faint); margin-left: auto; }
668
653
  .markdown { white-space: normal; max-height: 500px; overflow: auto; }
669
654
  .markdown > *:first-child { margin-top: 0; }
670
655
  .markdown > *:last-child { margin-bottom: 0; }
@@ -908,7 +893,6 @@ button.msg-summary:hover { color: var(--text); background: var(--bg-elev-2); bor
908
893
 
909
894
  /* Assistant cycle card: header row above, bordered body with the response (tools fold into it). */
910
895
  .assistant-card-body {
911
- /*border: 1px solid var(--border);*/
912
896
  border-radius: 6px;
913
897
  padding: 5px 10px;
914
898
  background: var(--bg-elev);
@@ -916,12 +900,6 @@ button.msg-summary:hover { color: var(--text); background: var(--bg-elev-2); bor
916
900
  flex-direction: column;
917
901
  }
918
902
 
919
- .aux {
920
- & .block-text {
921
- margin: 5px 0 10px 0;
922
- }
923
- }
924
-
925
903
  /* Aux turns kept mounted while the card is folded, so their expanded state survives (see AssistantCard). */
926
904
  .turn-hidden { display: none; }
927
905
 
@@ -1029,6 +1007,7 @@ button.msg-summary:hover { color: var(--text); background: var(--bg-elev-2); bor
1029
1007
  .aux {
1030
1008
  font-size: calc(12px * var(--font-scale, 1));
1031
1009
 
1010
+ & .block-text { margin: 5px 0 10px 0; }
1032
1011
  &.error .aux-toggle { color: var(--danger); }
1033
1012
  }
1034
1013
 
@@ -1100,15 +1079,6 @@ button.msg-summary:hover { color: var(--text); background: var(--bg-elev-2); bor
1100
1079
  margin: 2px 0 4px;
1101
1080
  user-select: all;
1102
1081
  }
1103
-
1104
- .instructions-note {
1105
- font-size: calc(11px * var(--font-scale, 1));
1106
- color: var(--text-faint);
1107
- margin-bottom: 4px;
1108
- padding-bottom: 4px;
1109
- border-bottom: 1px dashed var(--border);
1110
- line-height: 1.5;
1111
- }
1112
1082
  .shorten-more {
1113
1083
  color: var(--warn);
1114
1084
  font-style: italic;
@@ -1213,12 +1183,7 @@ button.msg-summary:hover { color: var(--text); background: var(--bg-elev-2); bor
1213
1183
  border-radius: 2px;
1214
1184
  padding: 0 1px;
1215
1185
  }
1216
- .jsonl-viewer-loading,
1217
- .jsonl-viewer-error {
1218
- color: var(--text-faint);
1219
- }
1220
-
1221
- .jsonl-viewer-error { color: var(--danger); }
1186
+ .jsonl-viewer-loading { color: var(--text-faint); }
1222
1187
  .requests-view {
1223
1188
  flex: 1;
1224
1189
  display: flex;
@@ -1,4 +1,4 @@
1
- import { r as reactExports, j as jsxRuntimeExports, f as format, s as startOfWeek, a as startOfMonth, b as startOfDay, e as endOfWeek, c as endOfMonth, d as endOfDay, g as addWeeks, h as addMonths, i as addDays, k as isSameWeek, l as isSameMonth, m as isSameDay, n as intervalToDuration, o as getDaysInMonth, p as addHours, q as encode, H as Hourglass, G as Gauge, M as MessageSquare, C as Clock, Z as Zap, D as DollarSign, R as React, t as Markdown$1, u as rehypeHighlight, v as remarkGfm, T as Terminal, J as JsonView, w as vscodeTheme, x as tippy, y as reactDomExports, z as sn, X as Xt, A as Zt, B as tn, E as parse, F as delegate, I as clientExports } from "./vendors-S1fS5xz9.js";
1
+ import { r as reactExports, j as jsxRuntimeExports, f as format, s as startOfWeek, a as startOfMonth, b as startOfDay, e as endOfWeek, c as endOfMonth, d as endOfDay, g as addWeeks, h as addMonths, i as addDays, k as isSameWeek, l as isSameMonth, m as isSameDay, n as intervalToDuration, o as getDaysInMonth, p as addHours, q as encode, H as Hourglass, G as Gauge, M as MessageSquare, C as Clock, Z as Zap, D as DollarSign, R as React, t as Markdown$1, u as rehypeHighlight, v as remarkGfm, T as Terminal, J as JsonView, w as vscodeTheme, x as tippy, y as reactDomExports, z as an, A as qt, Q as Qt, B as nn, E as parse, F as delegate, I as clientExports } from "./vendors-JM3FOKMR.js";
2
2
  const SOURCE_COLORS = {
3
3
  scheduled: "#14b8a6",
4
4
  cli: "#3b82f6",
@@ -34,13 +34,13 @@ function useLocalStorage(key, initial) {
34
34
  }
35
35
  function clearOutdatedLocalStorage() {
36
36
  const version = localStorage.getItem(VERSION_KEY);
37
- if (version !== "1.9.1") {
38
- const [MAJOR, MINOR, PATCH] = "1.9.1".split(".");
37
+ if (version !== "1.9.4") {
38
+ const [MAJOR, MINOR, PATCH] = "1.9.4".split(".");
39
39
  const [major, minor, patch] = (version ?? "").split(".");
40
40
  if (MAJOR !== major || MINOR !== minor) {
41
41
  localStorage.clear();
42
42
  }
43
- localStorage.setItem(VERSION_KEY, "1.9.1");
43
+ localStorage.setItem(VERSION_KEY, "1.9.4");
44
44
  }
45
45
  }
46
46
  function useMouseFontScale(storageKey) {
@@ -677,14 +677,6 @@ function Toolbar({
677
677
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", {})
678
678
  ] });
679
679
  }
680
- const HOUR = 60 * 60 * 1e3;
681
- const THRESHOLDS = {
682
- context: { warn: 1e5, danger: 2e5 },
683
- messages: { warn: 250, danger: 500 },
684
- workTime: { warn: 0.5 * HOUR, danger: 2 * HOUR },
685
- cost: { warn: 3, danger: 8 },
686
- tokens: { warn: 3e6, danger: 8e6 }
687
- };
688
680
  function fmtDuration(ms) {
689
681
  if (!ms || ms < 0) return "—";
690
682
  if (ms < 6e4) return `${Math.round(ms / 1e3)}s`;
@@ -872,6 +864,14 @@ function PeriodSummary({ sessions, dayAnchor, granularity = "day" }) {
872
864
  ] })
873
865
  ] });
874
866
  }
867
+ const HOUR = 60 * 60 * 1e3;
868
+ const THRESHOLDS = {
869
+ context: { warn: 1e5, danger: 2e5 },
870
+ messages: { warn: 250, danger: 500 },
871
+ workTime: { warn: 0.5 * HOUR, danger: 2 * HOUR },
872
+ cost: { warn: 3, danger: 8 },
873
+ tokens: { warn: 3e6, danger: 8e6 }
874
+ };
875
875
  const countTokens = (text, model = "") => {
876
876
  if (!text) return 0;
877
877
  const LEGACY_CLAUDE = /-(3|4)(-|$)/;
@@ -983,6 +983,26 @@ ${text}` }]
983
983
  return out;
984
984
  }
985
985
  const currentModel = (turns) => turns.findLast((t) => t.model && t.model !== "<synthetic>")?.model;
986
+ const SMALL_CONTEXT = /* @__PURE__ */ new Set([
987
+ "claude-3-opus",
988
+ "claude-3-sonnet",
989
+ "claude-3-haiku",
990
+ "claude-3-5-sonnet",
991
+ "claude-3-5-haiku",
992
+ "claude-3-7-sonnet",
993
+ "claude-haiku-4-5",
994
+ "claude-opus-4",
995
+ "claude-opus-4-1",
996
+ "claude-opus-4-5",
997
+ "claude-opus-4-6",
998
+ "claude-sonnet-4",
999
+ "claude-sonnet-4-5",
1000
+ "claude-sonnet-4-6"
1001
+ ]);
1002
+ function contextWindow(models = []) {
1003
+ const is200k = (model) => SMALL_CONTEXT.has(model.replace(/[-@]\d{8}.*$/, ""));
1004
+ return models.some((m) => m && !is200k(m)) ? 1e6 : 2e5;
1005
+ }
986
1006
  function normalizeContent(content) {
987
1007
  if (typeof content === "string") return [{ type: "text", text: content }];
988
1008
  if (!Array.isArray(content)) return [];
@@ -1239,12 +1259,10 @@ ${TIPS.time}`, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { size: 11
1239
1259
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "session-label-text", children: sessionLabel(s) })
1240
1260
  ] }),
1241
1261
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "session-time-bottom", children: [
1262
+ s.project && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "session-project", title: s.project, children: s.projectShort }),
1263
+ s.models?.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "session-model", children: s.models.map((m) => m.replace(/^claude-/, "")).join(", ") }),
1242
1264
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { title: format(s.lastActivityAt, "MMM d, HH:mm:ss"), children: fmtAgo(s.lastActivityAt) }),
1243
- s.models?.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "session-model", children: [
1244
- ", ",
1245
- s.models.map((m) => m.replace(/^claude-/, "")).join(", ")
1246
- ] }),
1247
- linked && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "deeplink-note", "data-tippy-content": linkTip, "data-tippy-maxWidth": 560, children: ", opened from deep link" })
1265
+ linked && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "deeplink-note", "data-tippy-content": linkTip, "data-tippy-maxWidth": 560, children: "opened from deep link" })
1248
1266
  ] })
1249
1267
  ] }),
1250
1268
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "session-row-stats", children: [
@@ -1411,22 +1429,23 @@ function ConversationView({ items, instructions = [], expandAll = null }) {
1411
1429
  const durations = reactExports.useMemo(() => cycleDurations(groups), [groups]);
1412
1430
  const findOpen = useFindActive();
1413
1431
  const [scale, zoomRef] = useMouseFontScale("font-scale.conversation");
1432
+ const model = currentModel(turns);
1433
+ const ctxLimit = contextWindow([model]);
1414
1434
  const hasTimeline = points.some(Boolean);
1415
1435
  return /* @__PURE__ */ jsxRuntimeExports.jsx(ExpandAllContext.Provider, { value: expandAll, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: zoomRef, className: `conversation${hasTimeline ? " has-token-timeline" : ""}`, style: { "--font-scale": scale }, children: groups.map((g, i) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: `conv-row conv-row-${g.kind}`, children: [
1416
- /* @__PURE__ */ jsxRuntimeExports.jsx(LazyMount, { eager: i < 8, forceMount: findOpen, placeholderMinHeight: 80, children: g.kind === "user" ? /* @__PURE__ */ jsxRuntimeExports.jsx(UserRow, { turns: g.turns, point: points[i] }) : g.kind === "assistant" ? /* @__PURE__ */ jsxRuntimeExports.jsx(AssistantCard, { turns: g.turns, point: points[i], duration: durations[i], showAuthor: groups[i - 1]?.kind !== "assistant" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(InstructionRun, { turns: g.turns, model: currentModel(turns) }) }),
1436
+ /* @__PURE__ */ jsxRuntimeExports.jsx(LazyMount, { eager: i < 8, forceMount: findOpen, placeholderMinHeight: 80, children: g.kind === "user" ? /* @__PURE__ */ jsxRuntimeExports.jsx(UserRow, { turns: g.turns, point: points[i], ctxLimit }) : g.kind === "assistant" ? /* @__PURE__ */ jsxRuntimeExports.jsx(AssistantCard, { turns: g.turns, point: points[i], ctxLimit, duration: durations[i], showAuthor: groups[i - 1]?.kind !== "assistant" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(InstructionRun, { turns: g.turns, model }) }),
1417
1437
  points[i] ? /* @__PURE__ */ jsxRuntimeExports.jsx(TokenPoint, { point: points[i] }) : hasTimeline && g.kind === "user" && g.turns.some(isCommandTurn) && /* @__PURE__ */ jsxRuntimeExports.jsx(TokenPoint, { point: { role: "command", delta: 0 } })
1418
1438
  ] }, g.turns[0].uuid)) }) });
1419
1439
  }
1420
1440
  const ClaudeIcon = () => /* @__PURE__ */ jsxRuntimeExports.jsx("img", { className: "msg-icon claude-icon", src: claudeIcon, alt: "" });
1421
- const CTX_LIMIT = THRESHOLDS.context.danger;
1422
1441
  function TokenPoint({ point: p }) {
1423
1442
  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: `token-point token-point-${p.role}${p.delta < 0 ? " negative" : ""}`, children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "token-point-dot" }) });
1424
1443
  }
1425
- function TokenStats({ point }) {
1444
+ function TokenStats({ point, ctxLimit }) {
1426
1445
  if (!point) return null;
1427
1446
  const rows = [];
1428
1447
  if (point.ctx != null) {
1429
- const width = Math.min(point.ctx / CTX_LIMIT, 1) * 100;
1448
+ const width = Math.min(point.ctx / ctxLimit, 1) * 100;
1430
1449
  rows.push(`<div class="token-tooltip-ctx">Context <span class="token-point-ctx-bar"><span style="width:${width}%"></span></span> <span class="token-tooltip-ctx-val">${fmtCompact(point.ctx)}</span></div>`);
1431
1450
  }
1432
1451
  const u = point.usage;
@@ -1444,7 +1463,7 @@ function TokenStats({ point }) {
1444
1463
  rows.push(`<div class="token-tooltip-total"><span>Accumulated tokens</span><span>${fmtCompact(point.total)}</span></div>`);
1445
1464
  return /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "msg-tokens", "data-tippy-html": `<div class="token-tooltip">${rows.join("")}</div>`, children: fmtCompact(point.total) });
1446
1465
  }
1447
- function UserRow({ turns, point }) {
1466
+ function UserRow({ turns, point, ctxLimit }) {
1448
1467
  const [open, setOpen] = useCollapsed(false);
1449
1468
  const msg = turns.find((t) => !isContextTurn(t));
1450
1469
  const ctxItems = turns.filter(isContextTurn).flatMap((t) => t.blocks);
@@ -1464,7 +1483,7 @@ function UserRow({ turns, point }) {
1464
1483
  ] })
1465
1484
  ] }),
1466
1485
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "msg-header-right", children: [
1467
- /* @__PURE__ */ jsxRuntimeExports.jsx(TokenStats, { point }),
1486
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TokenStats, { point, ctxLimit }),
1468
1487
  msg.ts != null && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "msg-time", children: format(msg.ts, "HH:mm:ss") })
1469
1488
  ] })
1470
1489
  ] }),
@@ -1472,7 +1491,7 @@ function UserRow({ turns, point }) {
1472
1491
  /* @__PURE__ */ jsxRuntimeExports.jsx(TurnRow, { turn: msg })
1473
1492
  ] });
1474
1493
  }
1475
- function AssistantCard({ turns, point, duration: duration2, showAuthor = true }) {
1494
+ function AssistantCard({ turns, point, ctxLimit, duration: duration2, showAuthor = true }) {
1476
1495
  const [open, setOpen] = useCollapsed(false);
1477
1496
  const toolBlocks = turns.flatMap((t) => t.blocks.filter((b) => b.type === "tool_use"));
1478
1497
  const errorCount = toolBlocks.filter((b) => b.result?.is_error).length;
@@ -1506,7 +1525,7 @@ function AssistantCard({ turns, point, duration: duration2, showAuthor = true })
1506
1525
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: summary })
1507
1526
  ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "msg-summary", children: summary })),
1508
1527
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "msg-header-right", children: [
1509
- /* @__PURE__ */ jsxRuntimeExports.jsx(TokenStats, { point }),
1528
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TokenStats, { point, ctxLimit }),
1510
1529
  end != null && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "msg-time", title: duration2 > 0 ? `Response time: ${fmtDuration(duration2)}` : null, children: format(end, "HH:mm:ss") })
1511
1530
  ] })
1512
1531
  ] }),
@@ -1908,7 +1927,6 @@ function RequestsView({ sessionId, date, granularity = "day", fileSize = 0, expa
1908
1927
  ] })
1909
1928
  ] });
1910
1929
  }
1911
- const CONTEXT_WINDOW$1 = THRESHOLDS.context.danger;
1912
1930
  let MAX_LINES = 10;
1913
1931
  let MAX_LINE_CHARS = 200;
1914
1932
  let MODEL = null;
@@ -1971,7 +1989,8 @@ function markdownSession(meta, items, truncated, instructions = []) {
1971
1989
  const t = meta.tokens;
1972
1990
  const stu = meta.serverToolUse;
1973
1991
  const wallDuration = meta.lastActivityAt - meta.startedAt;
1974
- const contextPct = Math.round(meta.lastContextTokens / CONTEXT_WINDOW$1 * 100);
1992
+ const ctxLimit = contextWindow(meta.models);
1993
+ const contextPct = Math.round(meta.lastContextTokens / ctxLimit * 100);
1975
1994
  const cacheHitPct = (meta.cacheHitRatio * 100).toFixed(0);
1976
1995
  const turns = items ? flatten(items, instructions) : null;
1977
1996
  MODEL = turns ? currentModel(turns) : null;
@@ -1987,7 +2006,7 @@ ${transcript}`;
1987
2006
  - Estimated cost: ${fmtUSD(meta.cost)}
1988
2007
  - Total tokens: ${fmtCompact(meta.totalTokens)}
1989
2008
  - Working time: ${fmtDuration(meta.activeMs)}
1990
- - Context size: ${fmtCompact(meta.lastContextTokens)} / ${fmtCompact(CONTEXT_WINDOW$1)} (${contextPct}%)${meta.savings.using5mCache > 0 ? `
2009
+ - Context size: ${fmtCompact(meta.lastContextTokens)} / ${fmtCompact(ctxLimit)} (${contextPct}%)${meta.savings.using5mCache > 0 ? `
1991
2010
 
1992
2011
  ## Potential savings
1993
2012
  - with 5m cache: ${meta.cost > 0 ? `(${(meta.savings.using5mCache / meta.cost * 100).toFixed(0)}%) ` : ""}−${fmtUSD(meta.savings.using5mCache)}` : ""}
@@ -2155,7 +2174,6 @@ ${body}`;
2155
2174
  ] })
2156
2175
  ] });
2157
2176
  }
2158
- const CONTEXT_WINDOW = THRESHOLDS.context.danger;
2159
2177
  function SessionSummary({ meta, items, instructions, agent, onOpenAgent, granularity = "day" }) {
2160
2178
  const timeFormat = granularity === "day" ? "pp" : "MMM d, pp";
2161
2179
  const onAnalyze = () => {
@@ -2174,7 +2192,8 @@ ${body}`);
2174
2192
  const stu = meta.serverToolUse;
2175
2193
  const hasServerTools = stu.webSearch > 0 || stu.webFetch > 0;
2176
2194
  const modelLabel = meta.models.join(", ") || "—";
2177
- const contextRatio = meta.lastContextTokens / CONTEXT_WINDOW;
2195
+ const ctxLimit = contextWindow(meta.models);
2196
+ const ctxTone = tone(meta.lastContextTokens, THRESHOLDS.context);
2178
2197
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "session-summary", children: [
2179
2198
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "summary-ai", children: [
2180
2199
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "summary-ai-row", children: [
@@ -2209,7 +2228,7 @@ ${body}`);
2209
2228
  ] }) }),
2210
2229
  /* @__PURE__ */ jsxRuntimeExports.jsx(Field, { label: "Total tokens", value: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: tone(totalTokens2, THRESHOLDS.tokens), children: fmtCompact(totalTokens2) }) }),
2211
2230
  /* @__PURE__ */ jsxRuntimeExports.jsx(Field, { label: "Working time", value: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: tone(activeDuration, THRESHOLDS.workTime), children: fmtDuration(activeDuration) }) }),
2212
- /* @__PURE__ */ jsxRuntimeExports.jsx(Field, { label: "Context size", value: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: tone(meta.lastContextTokens, THRESHOLDS.context), children: `${fmtCompact(meta.lastContextTokens)} / ${fmtCompact(CONTEXT_WINDOW)}` }), below: /* @__PURE__ */ jsxRuntimeExports.jsx(Bar, { ratio: contextRatio, tone: tone(meta.lastContextTokens, THRESHOLDS.context) }) })
2231
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Field, { label: "Context size", value: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: ctxTone, children: `${fmtCompact(meta.lastContextTokens)} / ${fmtCompact(ctxLimit)}` }), below: /* @__PURE__ */ jsxRuntimeExports.jsx(Bar, { ratio: meta.lastContextTokens / ctxLimit, tone: ctxTone }) })
2213
2232
  ] }),
2214
2233
  meta.savings.using5mCache > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(Section, { title: "Potential savings", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
2215
2234
  Field,
@@ -2364,10 +2383,10 @@ function Session({ meta, missing, date, granularity = "day" }) {
2364
2383
  };
2365
2384
  }, [sessionId, date, granularity, fileSize]);
2366
2385
  if (!meta) {
2367
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "session-view empty", children: missing ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "session-missing", children: [
2386
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "session-view empty", children: missing?.warn ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "session-missing", children: [
2368
2387
  "⚠ ",
2369
- missing
2370
- ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "Select a session to inspect." }) });
2388
+ missing.text
2389
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: missing?.text || "Select a session to inspect." }) });
2371
2390
  }
2372
2391
  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "session-view", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "view-body", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "view-conversation", children: agentOpen ? /* @__PURE__ */ jsxRuntimeExports.jsx(AgentView, { meta, items, instructions, agent, onClose: () => setAgentOpen(false) }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "view-tab-pane", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "view-tab-pane-row", children: [
2373
2392
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "view-tab-pane-main", children: [
@@ -2467,10 +2486,8 @@ const proxyChanges = /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fr
2467
2486
  /* @__PURE__ */ jsxRuntimeExports.jsx("pre", { children: `"env": {
2468
2487
  "ANTHROPIC_BASE_URL": "http://127.0.0.1:41414",
2469
2488
  "ENABLE_TOOL_SEARCH": "true"
2470
- },
2471
- "hooks": {
2472
- "SessionStart": ["…/bin/claude/hooks.mjs"]
2473
2489
  }` }),
2490
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "Also registers the proxy as a login service so it survives restarts." }),
2474
2491
  /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { children: [
2475
2492
  "Note: ",
2476
2493
  /* @__PURE__ */ jsxRuntimeExports.jsx("code", { children: "/remote-control" }),
@@ -2554,8 +2571,8 @@ function App() {
2554
2571
  const [deepLink, setDeepLink] = reactExports.useState(null);
2555
2572
  const [sourceFilter, setSourceFilter] = reactExports.useState(null);
2556
2573
  const [projectFilter, setProjectFilter] = reactExports.useState(null);
2557
- const { defaultLayout, onLayoutChanged } = sn({ id: "app.body", panelIds: ["list", "detail"], storage: localStorage });
2558
- const { defaultLayout: rootLayout, onLayoutChanged: onRootLayoutChanged } = sn({ id: "app.root", panelIds: ["gantt", "body"], storage: localStorage });
2574
+ const { defaultLayout, onLayoutChanged } = an({ id: "app.body", panelIds: ["list", "detail"], storage: localStorage });
2575
+ const { defaultLayout: rootLayout, onLayoutChanged: onRootLayoutChanged } = an({ id: "app.root", panelIds: ["gantt", "body"], storage: localStorage });
2559
2576
  const dayRange = reactExports.useMemo(() => {
2560
2577
  const start = anchor;
2561
2578
  const end = endOfPeriod(anchor, granularity);
@@ -2598,8 +2615,8 @@ function App() {
2598
2615
  let missing = null;
2599
2616
  if (!selected && scanProgress?.scanning === false) {
2600
2617
  const when = granularity === "day" ? `on ${format(anchor, "MMM d, yyyy")}` : `in this ${granularity}`;
2601
- if (!sessions.length) missing = `No sessions recorded ${when}.`;
2602
- else if (deepLink?.date === format(anchor, "yyyy-MM-dd")) missing = `Session ${selectedId} has no records ${when}.`;
2618
+ if (!sessions.length) missing = { text: `No sessions recorded ${when}.` };
2619
+ else if (deepLink?.date === format(anchor, "yyyy-MM-dd")) missing = { text: `Session ${selectedId} has no records ${when}.`, warn: true };
2603
2620
  }
2604
2621
  const selectSession = reactExports.useCallback((id, link = null) => {
2605
2622
  closeFind();
@@ -2634,14 +2651,14 @@ function App() {
2634
2651
  }
2635
2652
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "app", children: [
2636
2653
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
2637
- Xt,
2654
+ qt,
2638
2655
  {
2639
2656
  orientation: "vertical",
2640
2657
  className: "app-main",
2641
2658
  defaultLayout: rootLayout,
2642
2659
  onLayoutChanged: onRootLayoutChanged,
2643
2660
  children: [
2644
- /* @__PURE__ */ jsxRuntimeExports.jsxs(Zt, { id: "gantt", defaultSize: 400, minSize: 180, className: "gantt-pane", children: [
2661
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Qt, { id: "gantt", defaultSize: 400, minSize: 180, className: "gantt-pane", children: [
2645
2662
  /* @__PURE__ */ jsxRuntimeExports.jsx(
2646
2663
  Toolbar,
2647
2664
  {
@@ -2675,16 +2692,16 @@ function App() {
2675
2692
  /* @__PURE__ */ jsxRuntimeExports.jsx(PeriodSummary, { sessions: dayItems.past, dayAnchor: anchor, granularity })
2676
2693
  ] })
2677
2694
  ] }),
2678
- /* @__PURE__ */ jsxRuntimeExports.jsx(tn, { className: "resize-handle resize-handle-h" }),
2679
- /* @__PURE__ */ jsxRuntimeExports.jsx(Zt, { id: "body", minSize: 20, className: "body-outer", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
2680
- Xt,
2695
+ /* @__PURE__ */ jsxRuntimeExports.jsx(nn, { className: "resize-handle resize-handle-h" }),
2696
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Qt, { id: "body", minSize: 20, className: "body-outer", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
2697
+ qt,
2681
2698
  {
2682
2699
  orientation: "horizontal",
2683
2700
  className: "body",
2684
2701
  defaultLayout,
2685
2702
  onLayoutChanged,
2686
2703
  children: [
2687
- /* @__PURE__ */ jsxRuntimeExports.jsx(Zt, { id: "list", defaultSize: 350, minSize: 200, maxSize: 700, className: "body-pane", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
2704
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Qt, { id: "list", defaultSize: 350, minSize: 200, maxSize: 700, className: "body-pane", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
2688
2705
  SessionList,
2689
2706
  {
2690
2707
  sessions: dayItems.past,
@@ -2693,8 +2710,8 @@ function App() {
2693
2710
  onSelect: selectSession
2694
2711
  }
2695
2712
  ) }),
2696
- /* @__PURE__ */ jsxRuntimeExports.jsx(tn, { className: "resize-handle resize-handle-v" }),
2697
- /* @__PURE__ */ jsxRuntimeExports.jsx(Zt, { id: "detail", minSize: 30, className: "body-pane", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Session, { meta: selected, missing, date: format(anchor, "yyyy-MM-dd"), granularity }) })
2713
+ /* @__PURE__ */ jsxRuntimeExports.jsx(nn, { className: "resize-handle resize-handle-v" }),
2714
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Qt, { id: "detail", minSize: 30, className: "body-pane", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Session, { meta: selected, missing, date: format(anchor, "yyyy-MM-dd"), granularity }) })
2698
2715
  ]
2699
2716
  }
2700
2717
  ) })