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.
- package/bin/claude/statusline.mjs +3 -9
- package/bin/proxy.mjs +38 -51
- package/out/main/main.js +281 -103
- package/out/renderer/assets/{index-03LlBvFr.css → index-B1hu0QHl.css} +15 -50
- package/out/renderer/assets/{index-BKTnG3v8.js → index-B4cvR_aa.js} +66 -49
- package/out/renderer/assets/{vendors-S1fS5xz9.js → vendors-JM3FOKMR.js} +3173 -1199
- package/out/renderer/index.html +3 -3
- package/package.json +11 -10
- package/bin/claude/hooks.mjs +0 -102
|
@@ -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
|
-
|
|
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
|
|
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.
|
|
38
|
-
const [MAJOR, MINOR, PATCH] = "1.9.
|
|
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.
|
|
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
|
-
|
|
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
|
|
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 /
|
|
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
|
|
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(
|
|
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
|
|
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:
|
|
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 } =
|
|
2558
|
-
const { defaultLayout: rootLayout, onLayoutChanged: onRootLayoutChanged } =
|
|
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
|
-
|
|
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(
|
|
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(
|
|
2679
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
2680
|
-
|
|
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(
|
|
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(
|
|
2697
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
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
|
) })
|