@mono-agent/tui 0.4.0 → 0.4.1
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/README.md +60 -10
- package/dist/bin/cli.d.ts +4 -1
- package/dist/bin/cli.d.ts.map +1 -1
- package/dist/bin/cli.js +36 -53
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/mono-agent-tui.js +21 -10
- package/dist/bin/mono-agent-tui.js.map +1 -1
- package/dist/config/pane.d.ts +9 -9
- package/dist/config/pane.d.ts.map +1 -1
- package/dist/config/pane.js +15 -196
- package/dist/config/pane.js.map +1 -1
- package/dist/data/instances.d.ts +48 -0
- package/dist/data/instances.d.ts.map +1 -0
- package/dist/data/instances.js +101 -0
- package/dist/data/instances.js.map +1 -0
- package/dist/data/replay.d.ts +68 -0
- package/dist/data/replay.d.ts.map +1 -0
- package/dist/data/replay.js +149 -0
- package/dist/data/replay.js.map +1 -0
- package/dist/index.d.ts +10 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/remote/client.d.ts +44 -0
- package/dist/remote/client.d.ts.map +1 -0
- package/dist/remote/client.js +173 -0
- package/dist/remote/client.js.map +1 -0
- package/dist/runtime/start.d.ts +11 -18
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +19 -33
- package/dist/runtime/start.js.map +1 -1
- package/dist/ui/app.d.ts +142 -0
- package/dist/ui/app.d.ts.map +1 -0
- package/dist/ui/app.js +586 -0
- package/dist/ui/app.js.map +1 -0
- package/dist/ui/components/event-list.d.ts +60 -0
- package/dist/ui/components/event-list.d.ts.map +1 -0
- package/dist/ui/components/event-list.js +369 -0
- package/dist/ui/components/event-list.js.map +1 -0
- package/dist/ui/components/status-bar.d.ts +65 -0
- package/dist/ui/components/status-bar.d.ts.map +1 -0
- package/dist/ui/components/status-bar.js +126 -0
- package/dist/ui/components/status-bar.js.map +1 -0
- package/dist/ui/components/tool-panel.d.ts +30 -0
- package/dist/ui/components/tool-panel.d.ts.map +1 -0
- package/dist/ui/components/tool-panel.js +59 -0
- package/dist/ui/components/tool-panel.js.map +1 -0
- package/dist/ui/components/transcript-cells.d.ts +49 -0
- package/dist/ui/components/transcript-cells.d.ts.map +1 -0
- package/dist/ui/components/transcript-cells.js +110 -0
- package/dist/ui/components/transcript-cells.js.map +1 -0
- package/dist/ui/format.d.ts +29 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +105 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/theme.d.ts +25 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +62 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/turn-presenter.d.ts +72 -0
- package/dist/ui/turn-presenter.d.ts.map +1 -0
- package/dist/ui/turn-presenter.js +334 -0
- package/dist/ui/turn-presenter.js.map +1 -0
- package/dist/ui/views/chat.d.ts +128 -0
- package/dist/ui/views/chat.d.ts.map +1 -0
- package/dist/ui/views/chat.js +313 -0
- package/dist/ui/views/chat.js.map +1 -0
- package/dist/ui/views/config.d.ts +23 -0
- package/dist/ui/views/config.d.ts.map +1 -0
- package/dist/ui/views/config.js +87 -0
- package/dist/ui/views/config.js.map +1 -0
- package/dist/ui/views/picker.d.ts +17 -0
- package/dist/ui/views/picker.d.ts.map +1 -0
- package/dist/ui/views/picker.js +57 -0
- package/dist/ui/views/picker.js.map +1 -0
- package/dist/ui/views/replay-detail.d.ts +60 -0
- package/dist/ui/views/replay-detail.d.ts.map +1 -0
- package/dist/ui/views/replay-detail.js +328 -0
- package/dist/ui/views/replay-detail.js.map +1 -0
- package/dist/ui/views/replay.d.ts +74 -0
- package/dist/ui/views/replay.d.ts.map +1 -0
- package/dist/ui/views/replay.js +460 -0
- package/dist/ui/views/replay.js.map +1 -0
- package/package.json +9 -12
- package/dist/agent/message-stream.d.ts +0 -52
- package/dist/agent/message-stream.d.ts.map +0 -1
- package/dist/agent/message-stream.js +0 -110
- package/dist/agent/message-stream.js.map +0 -1
- package/dist/components/ChatPane.d.ts +0 -20
- package/dist/components/ChatPane.d.ts.map +0 -1
- package/dist/components/ChatPane.js +0 -142
- package/dist/components/ChatPane.js.map +0 -1
- package/dist/components/ConfigPane.d.ts +0 -12
- package/dist/components/ConfigPane.d.ts.map +0 -1
- package/dist/components/ConfigPane.js +0 -70
- package/dist/components/ConfigPane.js.map +0 -1
- package/dist/components/HelpOverlay.d.ts +0 -6
- package/dist/components/HelpOverlay.d.ts.map +0 -1
- package/dist/components/HelpOverlay.js +0 -18
- package/dist/components/HelpOverlay.js.map +0 -1
- package/dist/components/HistoryPane.d.ts +0 -9
- package/dist/components/HistoryPane.d.ts.map +0 -1
- package/dist/components/HistoryPane.js +0 -125
- package/dist/components/HistoryPane.js.map +0 -1
- package/dist/components/StatusBar.d.ts +0 -10
- package/dist/components/StatusBar.d.ts.map +0 -1
- package/dist/components/StatusBar.js +0 -15
- package/dist/components/StatusBar.js.map +0 -1
- package/dist/components/TuiApp.d.ts +0 -29
- package/dist/components/TuiApp.d.ts.map +0 -1
- package/dist/components/TuiApp.js +0 -81
- package/dist/components/TuiApp.js.map +0 -1
- package/dist/components/primitives/Badge.d.ts +0 -8
- package/dist/components/primitives/Badge.d.ts.map +0 -1
- package/dist/components/primitives/Badge.js +0 -14
- package/dist/components/primitives/Badge.js.map +0 -1
- package/dist/components/primitives/Spinner.d.ts +0 -6
- package/dist/components/primitives/Spinner.d.ts.map +0 -1
- package/dist/components/primitives/Spinner.js +0 -8
- package/dist/components/primitives/Spinner.js.map +0 -1
- package/dist/components/primitives/TranscriptLine.d.ts +0 -10
- package/dist/components/primitives/TranscriptLine.d.ts.map +0 -1
- package/dist/components/primitives/TranscriptLine.js +0 -15
- package/dist/components/primitives/TranscriptLine.js.map +0 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { Component } from "@earendil-works/pi-tui";
|
|
2
|
+
import type { ReplayTimelineItem, TimelineTurn } from "../../data/replay.js";
|
|
3
|
+
export interface EventTimelineListOptions {
|
|
4
|
+
/** Max item rows shown at once (marker rows render in addition, uncapped). Default 16. */
|
|
5
|
+
readonly maxVisible?: number;
|
|
6
|
+
}
|
|
7
|
+
/** Color a category label the same way replay's detail view does. Exported so callers besides this component (e.g. the replay detail pane) can reuse the mapping instead of duplicating it. */
|
|
8
|
+
export declare function categoryStyle(category: string): (text: string) => string;
|
|
9
|
+
/**
|
|
10
|
+
* Debugger-style scrollable/filterable event timeline against the stable
|
|
11
|
+
* pi-tui `Component` contract (no `SelectList`, no private-field casts).
|
|
12
|
+
* Selection is an index into the FULL (unfiltered) items array passed to
|
|
13
|
+
* {@link setItems}; `windowStart` (a rank within the visible rows) is nudged
|
|
14
|
+
* the minimum amount to keep the selection inside the render window.
|
|
15
|
+
*/
|
|
16
|
+
export declare class EventTimelineList implements Component {
|
|
17
|
+
onSelectionChange: ((item: ReplayTimelineItem | undefined) => void) | undefined;
|
|
18
|
+
private readonly maxVisible;
|
|
19
|
+
private items;
|
|
20
|
+
private turns;
|
|
21
|
+
private turnByStartPosition;
|
|
22
|
+
private hasTimestamps;
|
|
23
|
+
private categoryFilter;
|
|
24
|
+
private searchQuery;
|
|
25
|
+
private selectedIndex;
|
|
26
|
+
/** Rank (0-based) within the current visible-rows list the render window starts at. */
|
|
27
|
+
private windowStart;
|
|
28
|
+
constructor(options?: EventTimelineListOptions);
|
|
29
|
+
setItems(items: readonly ReplayTimelineItem[], turns: readonly TimelineTurn[]): void;
|
|
30
|
+
setCategoryFilter(categories: ReadonlySet<string> | undefined): void;
|
|
31
|
+
setSearch(query: string | undefined): void;
|
|
32
|
+
selectedItem(): ReplayTimelineItem | undefined;
|
|
33
|
+
setSelectedIndex(index: number): void;
|
|
34
|
+
moveSelection(delta: number): void;
|
|
35
|
+
moveToFirst(): void;
|
|
36
|
+
moveToLast(): void;
|
|
37
|
+
moveToTurn(direction: 1 | -1): void;
|
|
38
|
+
moveToMatch(direction: 1 | -1): void;
|
|
39
|
+
handleInput(data: string): void;
|
|
40
|
+
visibleCount(): number;
|
|
41
|
+
totalCount(): number;
|
|
42
|
+
matchCount(): number;
|
|
43
|
+
selectedVisibleOrdinal(): number | undefined;
|
|
44
|
+
turnOfSelection(): number | undefined;
|
|
45
|
+
render(width: number): string[];
|
|
46
|
+
invalidate(): void;
|
|
47
|
+
private applySelection;
|
|
48
|
+
/** Nudge `windowStart` (a rank within `visible`) the minimum amount to keep the selection's rank inside the window. */
|
|
49
|
+
private syncWindow;
|
|
50
|
+
private isVisible;
|
|
51
|
+
private visiblePositions;
|
|
52
|
+
private firstVisiblePositionInRange;
|
|
53
|
+
/** Nearest visible position to `position` (itself first, then out-and-out alternating, forward-tie-broken). */
|
|
54
|
+
private nearestVisiblePosition;
|
|
55
|
+
private itemMatchesQuery;
|
|
56
|
+
private matchPositions;
|
|
57
|
+
private renderRow;
|
|
58
|
+
private renderMarker;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=event-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-list.d.ts","sourceRoot":"","sources":["../../../src/ui/components/event-list.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAI7E,MAAM,WAAW,wBAAwB;IACvC,0FAA0F;IAC1F,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,+LAA+L;AAC/L,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAaxE;AAgCD;;;;;;GAMG;AACH,qBAAa,iBAAkB,YAAW,SAAS;IACjD,iBAAiB,EAAE,CAAC,CAAC,IAAI,EAAE,kBAAkB,GAAG,SAAS,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAEhF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,mBAAmB,CAAmC;IAC9D,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,aAAa,CAAM;IAC3B,uFAAuF;IACvF,OAAO,CAAC,WAAW,CAAK;gBAEZ,OAAO,GAAE,wBAA6B;IAIlD,QAAQ,CAAC,KAAK,EAAE,SAAS,kBAAkB,EAAE,EAAE,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,IAAI;IAWpF,iBAAiB,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,SAAS,GAAG,IAAI;IAWpE,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAK1C,YAAY,IAAI,kBAAkB,GAAG,SAAS;IAI9C,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQrC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAUlC,WAAW,IAAI,IAAI;IAQnB,UAAU,IAAI,IAAI;IAQlB,UAAU,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI;IAiBnC,WAAW,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI;IAYpC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAiB/B,YAAY,IAAI,MAAM;IAItB,UAAU,IAAI,MAAM;IAIpB,UAAU,IAAI,MAAM;IAIpB,sBAAsB,IAAI,MAAM,GAAG,SAAS;IAK5C,eAAe,IAAI,MAAM,GAAG,SAAS;IAIrC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA+B/B,UAAU,IAAI,IAAI;IAIlB,OAAO,CAAC,cAAc;IAQtB,uHAAuH;IACvH,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,2BAA2B;IASnC,+GAA+G;IAC/G,OAAO,CAAC,sBAAsB;IAoB9B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,SAAS;IA+BjB,OAAO,CAAC,YAAY;CAYrB"}
|
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
import { matchesKey, truncateToWidth } from "@earendil-works/pi-tui";
|
|
2
|
+
import { formatClock, formatDurationMs, formatTokens } from "../format.js";
|
|
3
|
+
import { styles } from "../theme.js";
|
|
4
|
+
/** Color a category label the same way replay's detail view does. Exported so callers besides this component (e.g. the replay detail pane) can reuse the mapping instead of duplicating it. */
|
|
5
|
+
export function categoryStyle(category) {
|
|
6
|
+
switch (category) {
|
|
7
|
+
case "thinking":
|
|
8
|
+
return styles.thinking;
|
|
9
|
+
case "tool":
|
|
10
|
+
return styles.accent;
|
|
11
|
+
case "error":
|
|
12
|
+
return styles.error;
|
|
13
|
+
case "runtime":
|
|
14
|
+
return styles.dim;
|
|
15
|
+
default:
|
|
16
|
+
return (text) => text;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Additive glyph prefixed onto a row's label, drawn from live chat's own
|
|
21
|
+
* vocabulary (∴ thinking, ✓/✗ tool results, ⚠ errors, green "you" for user
|
|
22
|
+
* messages) so the replay timeline and the live transcript read as one
|
|
23
|
+
* interface. Tool rows distinguish CALL vs RESULT via `item.type` (`"assistant"`
|
|
24
|
+
* carries the `tool_use` block, `"user"` carries `tool_result` -- see
|
|
25
|
+
* event-classify.ts's `firstToolUseBlock`/`firstToolResultBlock`): calls get a
|
|
26
|
+
* neutral `→`, results get `✓`/`✗` keyed off the `"error: "` summary prefix
|
|
27
|
+
* `nestedToolBlockSummary` stamps on an errored tool_result. Assistant text
|
|
28
|
+
* rows (category "message", type "assistant") get no glyph -- only the four
|
|
29
|
+
* categories above are additive. Returns "" for rows with no glyph.
|
|
30
|
+
*/
|
|
31
|
+
function rowGlyph(item) {
|
|
32
|
+
switch (item.category) {
|
|
33
|
+
case "thinking":
|
|
34
|
+
return styles.thinking("∴");
|
|
35
|
+
case "error":
|
|
36
|
+
return styles.error("⚠");
|
|
37
|
+
case "tool":
|
|
38
|
+
if (item.type === "user") {
|
|
39
|
+
return item.summary.startsWith("error: ") ? styles.error("✗") : styles.success("✓");
|
|
40
|
+
}
|
|
41
|
+
return styles.accent("→");
|
|
42
|
+
case "message":
|
|
43
|
+
return item.type === "user" ? styles.bold(styles.user("you")) : "";
|
|
44
|
+
default:
|
|
45
|
+
return "";
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Debugger-style scrollable/filterable event timeline against the stable
|
|
50
|
+
* pi-tui `Component` contract (no `SelectList`, no private-field casts).
|
|
51
|
+
* Selection is an index into the FULL (unfiltered) items array passed to
|
|
52
|
+
* {@link setItems}; `windowStart` (a rank within the visible rows) is nudged
|
|
53
|
+
* the minimum amount to keep the selection inside the render window.
|
|
54
|
+
*/
|
|
55
|
+
export class EventTimelineList {
|
|
56
|
+
onSelectionChange;
|
|
57
|
+
maxVisible;
|
|
58
|
+
items = [];
|
|
59
|
+
turns = [];
|
|
60
|
+
turnByStartPosition = new Map();
|
|
61
|
+
hasTimestamps = false;
|
|
62
|
+
categoryFilter;
|
|
63
|
+
searchQuery;
|
|
64
|
+
selectedIndex = -1;
|
|
65
|
+
/** Rank (0-based) within the current visible-rows list the render window starts at. */
|
|
66
|
+
windowStart = 0;
|
|
67
|
+
constructor(options = {}) {
|
|
68
|
+
this.maxVisible = options.maxVisible ?? 16;
|
|
69
|
+
}
|
|
70
|
+
setItems(items, turns) {
|
|
71
|
+
this.items = items;
|
|
72
|
+
this.turns = turns;
|
|
73
|
+
this.turnByStartPosition = new Map(turns.map((turn) => [turn.startItemIndex, turn]));
|
|
74
|
+
this.hasTimestamps = items.some((item) => item.timestampMs !== undefined);
|
|
75
|
+
this.windowStart = 0;
|
|
76
|
+
this.selectedIndex = items.length === 0 ? -1 : (this.nearestVisiblePosition(0) ?? 0);
|
|
77
|
+
this.onSelectionChange?.(this.selectedItem());
|
|
78
|
+
this.invalidate();
|
|
79
|
+
}
|
|
80
|
+
setCategoryFilter(categories) {
|
|
81
|
+
this.categoryFilter = categories;
|
|
82
|
+
if (this.items.length > 0) {
|
|
83
|
+
const nearest = this.nearestVisiblePosition(this.selectedIndex);
|
|
84
|
+
if (nearest !== undefined) {
|
|
85
|
+
this.applySelection(nearest);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
this.invalidate();
|
|
89
|
+
}
|
|
90
|
+
setSearch(query) {
|
|
91
|
+
this.searchQuery = query === undefined || query.length === 0 ? undefined : query;
|
|
92
|
+
this.invalidate();
|
|
93
|
+
}
|
|
94
|
+
selectedItem() {
|
|
95
|
+
return this.items[this.selectedIndex];
|
|
96
|
+
}
|
|
97
|
+
setSelectedIndex(index) {
|
|
98
|
+
if (this.items.length > 0) {
|
|
99
|
+
const clamped = Math.min(Math.max(index, 0), this.items.length - 1);
|
|
100
|
+
this.applySelection(this.nearestVisiblePosition(clamped) ?? clamped);
|
|
101
|
+
}
|
|
102
|
+
this.invalidate();
|
|
103
|
+
}
|
|
104
|
+
moveSelection(delta) {
|
|
105
|
+
const visible = this.visiblePositions();
|
|
106
|
+
if (visible.length > 0) {
|
|
107
|
+
const currentRank = visible.indexOf(this.selectedIndex);
|
|
108
|
+
const nextRank = Math.min(Math.max((currentRank === -1 ? 0 : currentRank) + delta, 0), visible.length - 1);
|
|
109
|
+
this.applySelection(visible[nextRank]);
|
|
110
|
+
}
|
|
111
|
+
this.invalidate();
|
|
112
|
+
}
|
|
113
|
+
moveToFirst() {
|
|
114
|
+
const visible = this.visiblePositions();
|
|
115
|
+
if (visible.length > 0) {
|
|
116
|
+
this.applySelection(visible[0]);
|
|
117
|
+
}
|
|
118
|
+
this.invalidate();
|
|
119
|
+
}
|
|
120
|
+
moveToLast() {
|
|
121
|
+
const visible = this.visiblePositions();
|
|
122
|
+
if (visible.length > 0) {
|
|
123
|
+
this.applySelection(visible[visible.length - 1]);
|
|
124
|
+
}
|
|
125
|
+
this.invalidate();
|
|
126
|
+
}
|
|
127
|
+
moveToTurn(direction) {
|
|
128
|
+
if (this.turns.length > 0) {
|
|
129
|
+
const currentTurn = this.turnOfSelection();
|
|
130
|
+
let candidate = currentTurn !== undefined ? currentTurn + direction : direction === 1 ? 0 : this.turns.length - 1;
|
|
131
|
+
while (candidate >= 0 && candidate < this.turns.length) {
|
|
132
|
+
const turn = this.turns[candidate];
|
|
133
|
+
const firstVisible = this.firstVisiblePositionInRange(turn.startItemIndex, turn.endItemIndex);
|
|
134
|
+
if (firstVisible !== undefined) {
|
|
135
|
+
this.applySelection(firstVisible);
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
candidate += direction;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
this.invalidate();
|
|
142
|
+
}
|
|
143
|
+
moveToMatch(direction) {
|
|
144
|
+
const matches = this.matchPositions();
|
|
145
|
+
if (matches.length > 0) {
|
|
146
|
+
const current = this.selectedIndex;
|
|
147
|
+
const forward = direction === 1;
|
|
148
|
+
let target = forward ? matches.find((p) => p > current) : [...matches].reverse().find((p) => p < current);
|
|
149
|
+
target ??= forward ? matches[0] : matches[matches.length - 1];
|
|
150
|
+
this.applySelection(target);
|
|
151
|
+
}
|
|
152
|
+
this.invalidate();
|
|
153
|
+
}
|
|
154
|
+
handleInput(data) {
|
|
155
|
+
if (matchesKey(data, "up")) {
|
|
156
|
+
this.moveSelection(-1);
|
|
157
|
+
}
|
|
158
|
+
else if (matchesKey(data, "down")) {
|
|
159
|
+
this.moveSelection(1);
|
|
160
|
+
}
|
|
161
|
+
else if (matchesKey(data, "pageUp")) {
|
|
162
|
+
this.moveSelection(-this.maxVisible);
|
|
163
|
+
}
|
|
164
|
+
else if (matchesKey(data, "pageDown")) {
|
|
165
|
+
this.moveSelection(this.maxVisible);
|
|
166
|
+
}
|
|
167
|
+
else if (matchesKey(data, "home")) {
|
|
168
|
+
this.moveToFirst();
|
|
169
|
+
}
|
|
170
|
+
else if (matchesKey(data, "end")) {
|
|
171
|
+
this.moveToLast();
|
|
172
|
+
}
|
|
173
|
+
// Everything else is ignored -- the host view routes remaining keys.
|
|
174
|
+
}
|
|
175
|
+
visibleCount() {
|
|
176
|
+
return this.visiblePositions().length;
|
|
177
|
+
}
|
|
178
|
+
totalCount() {
|
|
179
|
+
return this.items.length;
|
|
180
|
+
}
|
|
181
|
+
matchCount() {
|
|
182
|
+
return this.matchPositions().length;
|
|
183
|
+
}
|
|
184
|
+
selectedVisibleOrdinal() {
|
|
185
|
+
const rank = this.visiblePositions().indexOf(this.selectedIndex);
|
|
186
|
+
return rank === -1 ? undefined : rank + 1;
|
|
187
|
+
}
|
|
188
|
+
turnOfSelection() {
|
|
189
|
+
return this.items[this.selectedIndex]?.turnIndex;
|
|
190
|
+
}
|
|
191
|
+
render(width) {
|
|
192
|
+
if (this.items.length === 0) {
|
|
193
|
+
return [styles.dim("no events")];
|
|
194
|
+
}
|
|
195
|
+
const visible = this.visiblePositions();
|
|
196
|
+
if (visible.length === 0) {
|
|
197
|
+
const hint = this.categoryFilter === undefined ? "" : ` (filter: ${[...this.categoryFilter].sort().join(", ")})`;
|
|
198
|
+
return [styles.dim(`no events match${hint}`)];
|
|
199
|
+
}
|
|
200
|
+
this.syncWindow(visible);
|
|
201
|
+
const windowPositions = visible.slice(this.windowStart, this.windowStart + this.maxVisible);
|
|
202
|
+
const startPos = windowPositions[0];
|
|
203
|
+
const endPos = windowPositions[windowPositions.length - 1];
|
|
204
|
+
const showMarkers = this.turns.length >= 2;
|
|
205
|
+
const lines = [];
|
|
206
|
+
for (let position = startPos; position <= endPos; position += 1) {
|
|
207
|
+
const turn = showMarkers ? this.turnByStartPosition.get(position) : undefined;
|
|
208
|
+
// A turn whose items are ALL filtered out is an orphan marker -- skip it
|
|
209
|
+
// rather than printing a "── turn N/M ──" separator with nothing under it.
|
|
210
|
+
if (turn !== undefined && this.firstVisiblePositionInRange(turn.startItemIndex, turn.endItemIndex) !== undefined) {
|
|
211
|
+
lines.push(truncateToWidth(this.renderMarker(turn), width));
|
|
212
|
+
}
|
|
213
|
+
if (this.isVisible(position)) {
|
|
214
|
+
lines.push(truncateToWidth(this.renderRow(this.items[position], position === this.selectedIndex), width));
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return lines;
|
|
218
|
+
}
|
|
219
|
+
invalidate() {
|
|
220
|
+
// Renders from plain state each call; nothing cached.
|
|
221
|
+
}
|
|
222
|
+
applySelection(position) {
|
|
223
|
+
if (position === this.selectedIndex) {
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
this.selectedIndex = position;
|
|
227
|
+
this.onSelectionChange?.(this.selectedItem());
|
|
228
|
+
}
|
|
229
|
+
/** Nudge `windowStart` (a rank within `visible`) the minimum amount to keep the selection's rank inside the window. */
|
|
230
|
+
syncWindow(visible) {
|
|
231
|
+
const rank = visible.indexOf(this.selectedIndex);
|
|
232
|
+
const effectiveRank = rank === -1 ? 0 : rank;
|
|
233
|
+
const maxStart = Math.max(0, visible.length - this.maxVisible);
|
|
234
|
+
if (effectiveRank < this.windowStart) {
|
|
235
|
+
this.windowStart = effectiveRank;
|
|
236
|
+
}
|
|
237
|
+
else if (effectiveRank > this.windowStart + this.maxVisible - 1) {
|
|
238
|
+
this.windowStart = effectiveRank - this.maxVisible + 1;
|
|
239
|
+
}
|
|
240
|
+
this.windowStart = Math.min(Math.max(this.windowStart, 0), maxStart);
|
|
241
|
+
}
|
|
242
|
+
isVisible(position) {
|
|
243
|
+
const item = this.items[position];
|
|
244
|
+
return item !== undefined && (this.categoryFilter === undefined || this.categoryFilter.has(item.category));
|
|
245
|
+
}
|
|
246
|
+
visiblePositions() {
|
|
247
|
+
const positions = [];
|
|
248
|
+
for (let i = 0; i < this.items.length; i += 1) {
|
|
249
|
+
if (this.isVisible(i)) {
|
|
250
|
+
positions.push(i);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return positions;
|
|
254
|
+
}
|
|
255
|
+
firstVisiblePositionInRange(start, end) {
|
|
256
|
+
for (let position = start; position <= end; position += 1) {
|
|
257
|
+
if (this.isVisible(position)) {
|
|
258
|
+
return position;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return undefined;
|
|
262
|
+
}
|
|
263
|
+
/** Nearest visible position to `position` (itself first, then out-and-out alternating, forward-tie-broken). */
|
|
264
|
+
nearestVisiblePosition(position) {
|
|
265
|
+
if (this.items.length === 0) {
|
|
266
|
+
return undefined;
|
|
267
|
+
}
|
|
268
|
+
if (this.isVisible(position)) {
|
|
269
|
+
return position;
|
|
270
|
+
}
|
|
271
|
+
for (let radius = 1; radius < this.items.length; radius += 1) {
|
|
272
|
+
const forward = position + radius;
|
|
273
|
+
if (forward < this.items.length && this.isVisible(forward)) {
|
|
274
|
+
return forward;
|
|
275
|
+
}
|
|
276
|
+
const backward = position - radius;
|
|
277
|
+
if (backward >= 0 && this.isVisible(backward)) {
|
|
278
|
+
return backward;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return undefined;
|
|
282
|
+
}
|
|
283
|
+
itemMatchesQuery(item) {
|
|
284
|
+
if (this.searchQuery === undefined) {
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
const query = this.searchQuery.toLowerCase();
|
|
288
|
+
return item.label.toLowerCase().includes(query) || item.summary.toLowerCase().includes(query);
|
|
289
|
+
}
|
|
290
|
+
matchPositions() {
|
|
291
|
+
if (this.searchQuery === undefined) {
|
|
292
|
+
return [];
|
|
293
|
+
}
|
|
294
|
+
return this.visiblePositions().filter((position) => this.itemMatchesQuery(this.items[position]));
|
|
295
|
+
}
|
|
296
|
+
renderRow(item, selected) {
|
|
297
|
+
const segments = [styles.dim(`#${String(item.index).padStart(3, "0")}`)];
|
|
298
|
+
if (this.hasTimestamps) {
|
|
299
|
+
const clock = formatClock(item.timestamp);
|
|
300
|
+
if (clock.length > 0) {
|
|
301
|
+
segments.push(styles.muted(clock));
|
|
302
|
+
}
|
|
303
|
+
if (item.deltaMs !== undefined) {
|
|
304
|
+
segments.push(styles.dim(`+${formatDurationMs(item.deltaMs)}`));
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
const color = categoryStyle(item.category);
|
|
308
|
+
let labelPart = color(highlightMatches(item.label, this.searchQuery));
|
|
309
|
+
if (selected) {
|
|
310
|
+
labelPart = styles.bold(labelPart);
|
|
311
|
+
}
|
|
312
|
+
const glyph = rowGlyph(item);
|
|
313
|
+
const glyphPart = glyph.length > 0 ? `${glyph} ` : "";
|
|
314
|
+
const thinkingSuffix = item.category === "thinking" && item.contentChars !== undefined
|
|
315
|
+
? styles.dim(` (${formatThinkingStats(item.contentChars, item.timestamp, item.endTimestamp)})`)
|
|
316
|
+
: "";
|
|
317
|
+
const summaryPart = item.summary.length > 0 ? ` — ${styles.muted(highlightMatches(item.summary, this.searchQuery))}` : "";
|
|
318
|
+
const prefix = selected ? styles.accent("❯ ") : " ";
|
|
319
|
+
return `${prefix}${segments.join(" ")} ${glyphPart}${labelPart}${thinkingSuffix}${summaryPart}`;
|
|
320
|
+
}
|
|
321
|
+
renderMarker(turn) {
|
|
322
|
+
const parts = [`turn ${turn.turnIndex + 1}/${this.turns.length}`];
|
|
323
|
+
const clock = formatClock(turn.startedAt);
|
|
324
|
+
if (clock.length > 0) {
|
|
325
|
+
parts.push(clock);
|
|
326
|
+
}
|
|
327
|
+
if (turn.durationMs !== undefined) {
|
|
328
|
+
parts.push(formatDurationMs(turn.durationMs));
|
|
329
|
+
}
|
|
330
|
+
parts.push(`∴ ${formatTokens(turn.thinkingChars)}`, `${turn.toolCalls} tools`);
|
|
331
|
+
return styles.dim(`── ${parts.join(" · ")} ──`);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/** `contentChars` formatted, plus ` · <duration>` when the item's own (endTimestamp - timestamp) span parses. */
|
|
335
|
+
function formatThinkingStats(contentChars, timestamp, endTimestamp) {
|
|
336
|
+
const chars = formatTokens(contentChars);
|
|
337
|
+
if (timestamp === undefined || endTimestamp === undefined) {
|
|
338
|
+
return chars;
|
|
339
|
+
}
|
|
340
|
+
const start = Date.parse(timestamp);
|
|
341
|
+
const end = Date.parse(endTimestamp);
|
|
342
|
+
if (!Number.isFinite(start) || !Number.isFinite(end)) {
|
|
343
|
+
return chars;
|
|
344
|
+
}
|
|
345
|
+
return `${chars} · ${formatDurationMs(Math.max(0, end - start))}`;
|
|
346
|
+
}
|
|
347
|
+
/** Wrap case-insensitive `query` occurrences in `text` with an inverse-video style; applied BEFORE truncation so `truncateToWidth`'s ANSI-aware slicing handles the rest. */
|
|
348
|
+
function highlightMatches(text, query) {
|
|
349
|
+
if (query === undefined || query.length === 0) {
|
|
350
|
+
return text;
|
|
351
|
+
}
|
|
352
|
+
const lowerText = text.toLowerCase();
|
|
353
|
+
const lowerQuery = query.toLowerCase();
|
|
354
|
+
if (!lowerText.includes(lowerQuery)) {
|
|
355
|
+
return text;
|
|
356
|
+
}
|
|
357
|
+
let result = "";
|
|
358
|
+
let cursor = 0;
|
|
359
|
+
for (;;) {
|
|
360
|
+
const index = lowerText.indexOf(lowerQuery, cursor);
|
|
361
|
+
if (index === -1) {
|
|
362
|
+
result += text.slice(cursor);
|
|
363
|
+
return result;
|
|
364
|
+
}
|
|
365
|
+
result += text.slice(cursor, index) + styles.inverse(text.slice(index, index + query.length));
|
|
366
|
+
cursor = index + query.length;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
//# sourceMappingURL=event-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-list.js","sourceRoot":"","sources":["../../../src/ui/components/event-list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Component } from "@earendil-works/pi-tui";
|
|
2
|
+
export interface StatusBarUsage {
|
|
3
|
+
readonly input: number;
|
|
4
|
+
readonly output: number;
|
|
5
|
+
readonly cacheRead: number;
|
|
6
|
+
readonly cacheCreation: number;
|
|
7
|
+
}
|
|
8
|
+
export interface StatusBarThinkingStats {
|
|
9
|
+
readonly chars: number;
|
|
10
|
+
readonly durationMs?: number;
|
|
11
|
+
readonly active: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Bottom chrome: connection identity on the left, live turn telemetry on the
|
|
15
|
+
* right. Ephemeral text (stream status/hints) overrides the telemetry segment
|
|
16
|
+
* until the next update.
|
|
17
|
+
*/
|
|
18
|
+
export declare class StatusBar implements Component {
|
|
19
|
+
private identity;
|
|
20
|
+
private model;
|
|
21
|
+
private modelOverridden;
|
|
22
|
+
private effort;
|
|
23
|
+
private effortOverridden;
|
|
24
|
+
private usage;
|
|
25
|
+
private cumulativeUsd;
|
|
26
|
+
private thinking;
|
|
27
|
+
private providerNote;
|
|
28
|
+
private ephemeral;
|
|
29
|
+
private hint;
|
|
30
|
+
setIdentity(identity: string): void;
|
|
31
|
+
setModel(model: string | undefined): void;
|
|
32
|
+
/**
|
|
33
|
+
* Marks the model segment as a session override (renders a trailing
|
|
34
|
+
* `(override)` tag). Additive to {@link setModel} — the model string itself is
|
|
35
|
+
* unchanged; this only toggles the annotation.
|
|
36
|
+
*/
|
|
37
|
+
setModelOverridden(overridden: boolean): void;
|
|
38
|
+
/** Persists across turns; only replaced by another setEffort call. */
|
|
39
|
+
setEffort(effort: string | undefined): void;
|
|
40
|
+
/**
|
|
41
|
+
* Marks the effort segment as a session override (renders a trailing
|
|
42
|
+
* `(override)` tag). Additive to {@link setEffort} — the effort string itself
|
|
43
|
+
* is unchanged; this only toggles the annotation. Unlike the model override
|
|
44
|
+
* (reconciled against the harness's authoritative `run_config.overridden`),
|
|
45
|
+
* this is driven by local intent alone: the model-aware picker already
|
|
46
|
+
* prevents choosing an unsupported level, and `run_config.overridden` is a
|
|
47
|
+
* combined model-or-effort flag that can't be split back out for effort.
|
|
48
|
+
*/
|
|
49
|
+
setEffortOverridden(overridden: boolean): void;
|
|
50
|
+
/**
|
|
51
|
+
* Per-turn thinking telemetry. Stays visible after the turn ends (`active:
|
|
52
|
+
* false`) until the next turn's first thought replaces it; `undefined`
|
|
53
|
+
* clears the segment entirely.
|
|
54
|
+
*/
|
|
55
|
+
setThinking(stats: StatusBarThinkingStats | undefined): void;
|
|
56
|
+
setUsage(usage: StatusBarUsage | undefined, cumulativeUsd: number | undefined, model?: string): void;
|
|
57
|
+
setProviderNote(note: string): void;
|
|
58
|
+
setEphemeral(text: string): void;
|
|
59
|
+
setHint(hint: string): void;
|
|
60
|
+
resetTurn(): void;
|
|
61
|
+
render(width: number): string[];
|
|
62
|
+
invalidate(): void;
|
|
63
|
+
private renderThinkingSegment;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=status-bar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-bar.d.ts","sourceRoot":"","sources":["../../../src/ui/components/status-bar.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAKxD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED;;;;GAIG;AACH,qBAAa,SAAU,YAAW,SAAS;IACzC,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,IAAI,CAAkD;IAE9D,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAInC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAIzC;;;;OAIG;IACH,kBAAkB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAI7C,sEAAsE;IACtE,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAI3C;;;;;;;;OAQG;IACH,mBAAmB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAI9C;;;;OAIG;IACH,WAAW,CAAC,KAAK,EAAE,sBAAsB,GAAG,SAAS,GAAG,IAAI;IAI5D,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAYpG,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAInC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIhC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,SAAS,IAAI,IAAI;IAKjB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA+B/B,UAAU,IAAI,IAAI;IAIlB,OAAO,CAAC,qBAAqB;CAU9B"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { Text } from "@earendil-works/pi-tui";
|
|
2
|
+
import { formatDurationMs, formatTokens, formatUsd } from "../format.js";
|
|
3
|
+
import { styles } from "../theme.js";
|
|
4
|
+
/**
|
|
5
|
+
* Bottom chrome: connection identity on the left, live turn telemetry on the
|
|
6
|
+
* right. Ephemeral text (stream status/hints) overrides the telemetry segment
|
|
7
|
+
* until the next update.
|
|
8
|
+
*/
|
|
9
|
+
export class StatusBar {
|
|
10
|
+
identity = "";
|
|
11
|
+
model;
|
|
12
|
+
modelOverridden = false;
|
|
13
|
+
effort;
|
|
14
|
+
effortOverridden = false;
|
|
15
|
+
usage;
|
|
16
|
+
cumulativeUsd;
|
|
17
|
+
thinking;
|
|
18
|
+
providerNote = "";
|
|
19
|
+
ephemeral = "";
|
|
20
|
+
hint = "tab views · esc cancel · ctrl+c quit · /help";
|
|
21
|
+
setIdentity(identity) {
|
|
22
|
+
this.identity = identity;
|
|
23
|
+
}
|
|
24
|
+
setModel(model) {
|
|
25
|
+
this.model = model;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Marks the model segment as a session override (renders a trailing
|
|
29
|
+
* `(override)` tag). Additive to {@link setModel} — the model string itself is
|
|
30
|
+
* unchanged; this only toggles the annotation.
|
|
31
|
+
*/
|
|
32
|
+
setModelOverridden(overridden) {
|
|
33
|
+
this.modelOverridden = overridden;
|
|
34
|
+
}
|
|
35
|
+
/** Persists across turns; only replaced by another setEffort call. */
|
|
36
|
+
setEffort(effort) {
|
|
37
|
+
this.effort = effort;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Marks the effort segment as a session override (renders a trailing
|
|
41
|
+
* `(override)` tag). Additive to {@link setEffort} — the effort string itself
|
|
42
|
+
* is unchanged; this only toggles the annotation. Unlike the model override
|
|
43
|
+
* (reconciled against the harness's authoritative `run_config.overridden`),
|
|
44
|
+
* this is driven by local intent alone: the model-aware picker already
|
|
45
|
+
* prevents choosing an unsupported level, and `run_config.overridden` is a
|
|
46
|
+
* combined model-or-effort flag that can't be split back out for effort.
|
|
47
|
+
*/
|
|
48
|
+
setEffortOverridden(overridden) {
|
|
49
|
+
this.effortOverridden = overridden;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Per-turn thinking telemetry. Stays visible after the turn ends (`active:
|
|
53
|
+
* false`) until the next turn's first thought replaces it; `undefined`
|
|
54
|
+
* clears the segment entirely.
|
|
55
|
+
*/
|
|
56
|
+
setThinking(stats) {
|
|
57
|
+
this.thinking = stats;
|
|
58
|
+
}
|
|
59
|
+
setUsage(usage, cumulativeUsd, model) {
|
|
60
|
+
if (usage !== undefined) {
|
|
61
|
+
this.usage = usage;
|
|
62
|
+
}
|
|
63
|
+
if (cumulativeUsd !== undefined) {
|
|
64
|
+
this.cumulativeUsd = cumulativeUsd;
|
|
65
|
+
}
|
|
66
|
+
if (model !== undefined) {
|
|
67
|
+
this.model = model;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
setProviderNote(note) {
|
|
71
|
+
this.providerNote = note;
|
|
72
|
+
}
|
|
73
|
+
setEphemeral(text) {
|
|
74
|
+
this.ephemeral = text;
|
|
75
|
+
}
|
|
76
|
+
setHint(hint) {
|
|
77
|
+
this.hint = hint;
|
|
78
|
+
}
|
|
79
|
+
resetTurn() {
|
|
80
|
+
this.providerNote = "";
|
|
81
|
+
this.ephemeral = "";
|
|
82
|
+
}
|
|
83
|
+
render(width) {
|
|
84
|
+
const segments = [];
|
|
85
|
+
if (this.identity.length > 0) {
|
|
86
|
+
segments.push(styles.accent(this.identity));
|
|
87
|
+
}
|
|
88
|
+
if (this.model !== undefined && this.model.length > 0) {
|
|
89
|
+
segments.push(styles.muted(this.modelOverridden ? `${this.model} (override)` : this.model));
|
|
90
|
+
}
|
|
91
|
+
if (this.effort !== undefined && this.effort.length > 0) {
|
|
92
|
+
segments.push(styles.muted(this.effortOverridden ? `effort:${this.effort} (override)` : `effort:${this.effort}`));
|
|
93
|
+
}
|
|
94
|
+
if (this.usage !== undefined) {
|
|
95
|
+
const cache = this.usage.cacheRead > 0 ? ` (cache ${formatTokens(this.usage.cacheRead)})` : "";
|
|
96
|
+
segments.push(styles.muted(`↑${formatTokens(this.usage.input)} ↓${formatTokens(this.usage.output)}${cache}`));
|
|
97
|
+
}
|
|
98
|
+
if (this.cumulativeUsd !== undefined && this.cumulativeUsd > 0) {
|
|
99
|
+
segments.push(styles.muted(formatUsd(this.cumulativeUsd)));
|
|
100
|
+
}
|
|
101
|
+
if (this.thinking !== undefined) {
|
|
102
|
+
segments.push(this.renderThinkingSegment(this.thinking));
|
|
103
|
+
}
|
|
104
|
+
if (this.providerNote.length > 0) {
|
|
105
|
+
segments.push(styles.warning(this.providerNote));
|
|
106
|
+
}
|
|
107
|
+
if (this.ephemeral.length > 0) {
|
|
108
|
+
segments.push(styles.dim(this.ephemeral));
|
|
109
|
+
}
|
|
110
|
+
segments.push(styles.dim(this.hint));
|
|
111
|
+
return ["", ...new Text(segments.join(styles.dim(" · ")), 1, 0).render(width)];
|
|
112
|
+
}
|
|
113
|
+
invalidate() {
|
|
114
|
+
// Stateless render.
|
|
115
|
+
}
|
|
116
|
+
renderThinkingSegment(stats) {
|
|
117
|
+
if (stats.active) {
|
|
118
|
+
return styles.thinking(`∴ thinking ${formatTokens(stats.chars)}`);
|
|
119
|
+
}
|
|
120
|
+
// Negative durations (clock skew, injected test clocks) are omitted rather
|
|
121
|
+
// than rendered as a nonsensical negative time.
|
|
122
|
+
const durationPart = stats.durationMs !== undefined && stats.durationMs >= 0 ? ` · ${formatDurationMs(stats.durationMs)}` : "";
|
|
123
|
+
return styles.thinking(`∴ ${formatTokens(stats.chars)} chars${durationPart}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=status-bar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-bar.js","sourceRoot":"","sources":["../../../src/ui/components/status-bar.ts"],"names":[],"mappings":"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"}
|