@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,334 @@
|
|
|
1
|
+
import { Container } from "@earendil-works/pi-tui";
|
|
2
|
+
import { AssistantCell, NoticeCell, ThinkingCell } from "./components/transcript-cells.js";
|
|
3
|
+
import { ToolPanel } from "./components/tool-panel.js";
|
|
4
|
+
const DEFAULT_FLUSH_MS = 50;
|
|
5
|
+
/**
|
|
6
|
+
* Implements AgentMessageStream against pi-tui components: every stream
|
|
7
|
+
* callback mutates transcript cells and requests a coalesced redraw. Identical
|
|
8
|
+
* for in-process and remote responders — the wire protocol replays the same
|
|
9
|
+
* callbacks.
|
|
10
|
+
*
|
|
11
|
+
* Cell ordering mirrors the model's own block order: thinking and tool cells
|
|
12
|
+
* are appended as they arrive; the assistant text cell is (re)opened after
|
|
13
|
+
* each tool call so interleaved text→tool→text turns read chronologically.
|
|
14
|
+
*/
|
|
15
|
+
export class TurnPresenter {
|
|
16
|
+
options;
|
|
17
|
+
assistantCell;
|
|
18
|
+
/** Every assistant cell this turn opened, oldest first (segments split at tool calls). */
|
|
19
|
+
assistantCells = [];
|
|
20
|
+
/** Concatenated text of sealed segments (everything before the live buffer). */
|
|
21
|
+
sealedText = "";
|
|
22
|
+
thinkingCell;
|
|
23
|
+
/** Running total across the whole turn, even across multiple thinking cells. */
|
|
24
|
+
thinkingChars = 0;
|
|
25
|
+
/** Wall-clock time of this turn's first thought; undefined until then. */
|
|
26
|
+
firstThoughtTime;
|
|
27
|
+
toolPanels = new Map();
|
|
28
|
+
buffer = "";
|
|
29
|
+
flushTimer;
|
|
30
|
+
finished = false;
|
|
31
|
+
constructor(options) {
|
|
32
|
+
this.options = options;
|
|
33
|
+
}
|
|
34
|
+
async append(delta) {
|
|
35
|
+
this.buffer += delta;
|
|
36
|
+
this.scheduleFlush();
|
|
37
|
+
}
|
|
38
|
+
async replace(text) {
|
|
39
|
+
// Contract: replaces the whole message so far — collapse to one cell.
|
|
40
|
+
this.reconcileTo(text);
|
|
41
|
+
this.options.requestRender();
|
|
42
|
+
}
|
|
43
|
+
async status(text) {
|
|
44
|
+
this.options.statusBar.setEphemeral(text);
|
|
45
|
+
this.options.requestRender();
|
|
46
|
+
}
|
|
47
|
+
async event(event) {
|
|
48
|
+
switch (event.type) {
|
|
49
|
+
case "assistant_thought": {
|
|
50
|
+
this.thinkingCellFor().append(event.text);
|
|
51
|
+
this.thinkingChars += event.text.length;
|
|
52
|
+
if (this.firstThoughtTime === undefined) {
|
|
53
|
+
this.firstThoughtTime = this.nowMs();
|
|
54
|
+
}
|
|
55
|
+
this.options.statusBar.setThinking({ chars: this.thinkingChars, active: true });
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
case "tool_call_started": {
|
|
59
|
+
this.sealStreamingCells();
|
|
60
|
+
const panel = new ToolPanel(event.id, event.name, event.arguments);
|
|
61
|
+
this.toolPanels.set(event.id, panel);
|
|
62
|
+
this.options.transcript.addChild(panel);
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
case "tool_call_progress": {
|
|
66
|
+
this.toolPanels.get(event.id)?.setProgress(event.partialResult);
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
case "tool_call_completed": {
|
|
70
|
+
const panel = this.toolPanels.get(event.id);
|
|
71
|
+
if (panel !== undefined) {
|
|
72
|
+
panel.complete({
|
|
73
|
+
...(event.isError === undefined ? {} : { isError: event.isError }),
|
|
74
|
+
...(event.content === undefined ? {} : { content: event.content }),
|
|
75
|
+
...(event.executionMs === undefined ? {} : { executionMs: event.executionMs }),
|
|
76
|
+
...(event.metadata?.truncated === true ? { truncated: true } : {}),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
case "usage_update": {
|
|
82
|
+
this.options.statusBar.setUsage(event.tokens, event.cumulativeUsd, event.model);
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
case "provider_status": {
|
|
86
|
+
if (event.kind === "request_started") {
|
|
87
|
+
// No ephemeral status here (removed per user feedback: "too long and
|
|
88
|
+
// awkward, no need for that") — the ChatView loader already
|
|
89
|
+
// indicates in-flight activity.
|
|
90
|
+
}
|
|
91
|
+
else if (event.kind === "request_completed") {
|
|
92
|
+
this.options.statusBar.setEphemeral("");
|
|
93
|
+
}
|
|
94
|
+
else if (event.kind === "failover_started") {
|
|
95
|
+
const note = `failover ${event.from ?? "?"} → ${event.to ?? "?"}`;
|
|
96
|
+
this.options.statusBar.setProviderNote(note);
|
|
97
|
+
this.options.transcript.addChild(new NoticeCell(note, "warning"));
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
this.options.statusBar.setProviderNote(event.model === undefined ? "" : `answered by ${event.model} (failover)`);
|
|
101
|
+
}
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
case "runtime_warning": {
|
|
105
|
+
this.options.transcript.addChild(new NoticeCell(event.message, "warning"));
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
case "memory_recalled": {
|
|
109
|
+
const size = event.bytes === undefined ? "" : ` ${(event.bytes / 1024).toFixed(1)}KB`;
|
|
110
|
+
this.options.statusBar.setEphemeral(`⌁ memory recalled${size}`);
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
case "runtime_telemetry": {
|
|
114
|
+
// Cache/capability/latency details stay off the live transcript; the
|
|
115
|
+
// replay view shows them from run artifacts. run_config is the one
|
|
116
|
+
// exception: it feeds the persistent status-bar model/effort chrome.
|
|
117
|
+
const sessionBoundary = sessionBoundaryNotice(event);
|
|
118
|
+
if (sessionBoundary !== undefined) {
|
|
119
|
+
this.sealStreamingCells();
|
|
120
|
+
this.options.transcript.addChild(new NoticeCell(sessionBoundary, "info"));
|
|
121
|
+
}
|
|
122
|
+
else if (event.kind === "run_config") {
|
|
123
|
+
const data = event.data;
|
|
124
|
+
if (typeof data?.effort === "string") {
|
|
125
|
+
this.options.statusBar.setEffort(data.effort);
|
|
126
|
+
}
|
|
127
|
+
if (typeof data?.model === "string") {
|
|
128
|
+
this.options.statusBar.setModel(data.model);
|
|
129
|
+
}
|
|
130
|
+
// `overridden` is the harness's authoritative "an override was actually
|
|
131
|
+
// applied" — reconcile the status-bar tag with it so the marker never
|
|
132
|
+
// lies (e.g. an ignored or invalid override falling back to the default).
|
|
133
|
+
if (typeof data?.overridden === "boolean") {
|
|
134
|
+
this.options.statusBar.setModelOverridden(data.overridden);
|
|
135
|
+
if (!data.overridden && this.options.requestedModelOverride !== undefined) {
|
|
136
|
+
const ranOn = typeof data.model === "string" ? ` — ran on ${data.model}` : "";
|
|
137
|
+
this.options.transcript.addChild(new NoticeCell(`model override not applied${ranOn}`, "warning"));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
default: {
|
|
144
|
+
// Unknown event from a newer agent: ignore (forward compatibility).
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
this.options.requestRender();
|
|
149
|
+
}
|
|
150
|
+
async finish(finalText) {
|
|
151
|
+
this.finished = true;
|
|
152
|
+
// Deliberate: an EMPTY finalText keeps whatever streamed, same as absent.
|
|
153
|
+
// This is an operator console — the streamed deltas are real model output,
|
|
154
|
+
// and blanking them on an empty-normalized final answer would hide exactly
|
|
155
|
+
// what the operator came to see. Channels render a placeholder instead
|
|
156
|
+
// (DEFAULT_EMPTY_FINAL_TEXT); here the transcript already tells the story.
|
|
157
|
+
if (finalText === undefined || finalText.length === 0) {
|
|
158
|
+
this.flushText();
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
// finalText is the WHOLE answer; streamed segments may already cover it.
|
|
162
|
+
const streamedTotal = this.sealedText + this.buffer;
|
|
163
|
+
if (normalizeForCompare(finalText) === normalizeForCompare(streamedTotal)) {
|
|
164
|
+
this.flushText();
|
|
165
|
+
}
|
|
166
|
+
else if (finalText.startsWith(this.sealedText) && this.sealedText.length > 0) {
|
|
167
|
+
// Streamed prefix matches: only the live tail needs correcting.
|
|
168
|
+
this.buffer = finalText.slice(this.sealedText.length);
|
|
169
|
+
this.flushText();
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
// Divergence (or nothing streamed): show finalText once, not twice.
|
|
173
|
+
this.reconcileTo(finalText);
|
|
174
|
+
}
|
|
175
|
+
this.options.requestRender();
|
|
176
|
+
}
|
|
177
|
+
/** The turn is over (success, error, or cancel): stop timers, seal cells. */
|
|
178
|
+
settle() {
|
|
179
|
+
this.finished = true;
|
|
180
|
+
if (this.flushTimer !== undefined) {
|
|
181
|
+
clearTimeout(this.flushTimer);
|
|
182
|
+
this.flushTimer = undefined;
|
|
183
|
+
}
|
|
184
|
+
this.flushText();
|
|
185
|
+
this.sealThinking();
|
|
186
|
+
}
|
|
187
|
+
assistantText() {
|
|
188
|
+
return this.sealedText + this.buffer;
|
|
189
|
+
}
|
|
190
|
+
/** Collapse all assistant segments into the last cell holding exactly `text`. */
|
|
191
|
+
reconcileTo(text) {
|
|
192
|
+
const last = this.assistantCellFor();
|
|
193
|
+
for (const cell of this.assistantCells) {
|
|
194
|
+
if (cell !== last) {
|
|
195
|
+
this.options.transcript.removeChild(cell);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
this.assistantCells.length = 0;
|
|
199
|
+
this.assistantCells.push(last);
|
|
200
|
+
this.sealedText = "";
|
|
201
|
+
this.buffer = text;
|
|
202
|
+
if (this.flushTimer !== undefined) {
|
|
203
|
+
clearTimeout(this.flushTimer);
|
|
204
|
+
this.flushTimer = undefined;
|
|
205
|
+
}
|
|
206
|
+
last.setText(text);
|
|
207
|
+
}
|
|
208
|
+
scheduleFlush() {
|
|
209
|
+
const interval = this.options.flushIntervalMs ?? DEFAULT_FLUSH_MS;
|
|
210
|
+
if (interval <= 0 || this.finished) {
|
|
211
|
+
this.flushText();
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
if (this.flushTimer !== undefined) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
this.flushTimer = setTimeout(() => {
|
|
218
|
+
this.flushTimer = undefined;
|
|
219
|
+
this.flushText();
|
|
220
|
+
}, interval);
|
|
221
|
+
// Never hold the process open for a pending redraw.
|
|
222
|
+
this.flushTimer.unref?.();
|
|
223
|
+
}
|
|
224
|
+
flushText() {
|
|
225
|
+
if (this.buffer.length > 0) {
|
|
226
|
+
this.assistantCellFor().setText(this.buffer);
|
|
227
|
+
}
|
|
228
|
+
this.options.requestRender();
|
|
229
|
+
}
|
|
230
|
+
assistantCellFor() {
|
|
231
|
+
if (this.assistantCell === undefined) {
|
|
232
|
+
this.sealThinking();
|
|
233
|
+
this.assistantCell = new AssistantCell();
|
|
234
|
+
this.assistantCells.push(this.assistantCell);
|
|
235
|
+
this.options.transcript.addChild(this.assistantCell);
|
|
236
|
+
}
|
|
237
|
+
return this.assistantCell;
|
|
238
|
+
}
|
|
239
|
+
thinkingCellFor() {
|
|
240
|
+
if (this.thinkingCell === undefined) {
|
|
241
|
+
this.thinkingCell = new ThinkingCell(this.options.thinkingExpanded?.() ?? false);
|
|
242
|
+
this.options.transcript.addChild(this.thinkingCell);
|
|
243
|
+
}
|
|
244
|
+
return this.thinkingCell;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* A tool call interrupts the streaming text/thinking cells: whatever comes
|
|
248
|
+
* next starts fresh cells so the transcript stays chronological.
|
|
249
|
+
*/
|
|
250
|
+
sealStreamingCells() {
|
|
251
|
+
this.flushTextImmediate();
|
|
252
|
+
this.sealThinking();
|
|
253
|
+
this.assistantCell = undefined;
|
|
254
|
+
this.sealedText += this.buffer;
|
|
255
|
+
this.buffer = "";
|
|
256
|
+
}
|
|
257
|
+
flushTextImmediate() {
|
|
258
|
+
if (this.flushTimer !== undefined) {
|
|
259
|
+
clearTimeout(this.flushTimer);
|
|
260
|
+
this.flushTimer = undefined;
|
|
261
|
+
}
|
|
262
|
+
if (this.buffer.length > 0) {
|
|
263
|
+
this.assistantCellFor().setText(this.buffer);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
sealThinking() {
|
|
267
|
+
if (this.thinkingCell !== undefined) {
|
|
268
|
+
this.thinkingCell.active = false;
|
|
269
|
+
if (this.firstThoughtTime !== undefined) {
|
|
270
|
+
const durationMs = this.nowMs() - this.firstThoughtTime;
|
|
271
|
+
this.thinkingCell.setDurationMs(durationMs);
|
|
272
|
+
this.options.statusBar.setThinking({ chars: this.thinkingChars, durationMs, active: false });
|
|
273
|
+
}
|
|
274
|
+
this.thinkingCell = undefined;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
nowMs() {
|
|
278
|
+
return this.options.now?.() ?? Date.now();
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
function normalizeForCompare(text) {
|
|
282
|
+
return text.replace(/\s+/gu, " ").trim();
|
|
283
|
+
}
|
|
284
|
+
const SESSION_BOUNDARY_TELEMETRY = "session_boundary";
|
|
285
|
+
function sessionBoundaryNotice(event) {
|
|
286
|
+
const data = event.data;
|
|
287
|
+
const dataKind = stringField(data, "kind");
|
|
288
|
+
if (event.kind !== SESSION_BOUNDARY_TELEMETRY &&
|
|
289
|
+
stringField(data, "type") !== SESSION_BOUNDARY_TELEMETRY &&
|
|
290
|
+
dataKind !== SESSION_BOUNDARY_TELEMETRY) {
|
|
291
|
+
return undefined;
|
|
292
|
+
}
|
|
293
|
+
const boundaryKind = dataKind === SESSION_BOUNDARY_TELEMETRY
|
|
294
|
+
? undefined
|
|
295
|
+
: dataKind;
|
|
296
|
+
const parts = [boundaryKind === undefined ? "session boundary" : `session boundary: ${formatTelemetryLabel(boundaryKind)}`];
|
|
297
|
+
const reason = stringField(data, "reason");
|
|
298
|
+
if (reason !== undefined) {
|
|
299
|
+
parts.push(formatTelemetryLabel(reason));
|
|
300
|
+
}
|
|
301
|
+
const transition = sessionBoundaryTransition(data);
|
|
302
|
+
if (transition !== undefined) {
|
|
303
|
+
parts.push(transition);
|
|
304
|
+
}
|
|
305
|
+
const providerSessionId = stringField(data, "providerSessionId");
|
|
306
|
+
if (providerSessionId !== undefined && boundaryKind === "resume_replay") {
|
|
307
|
+
parts.push(`provider ${providerSessionId}`);
|
|
308
|
+
}
|
|
309
|
+
return parts.join(" · ");
|
|
310
|
+
}
|
|
311
|
+
function sessionBoundaryTransition(data) {
|
|
312
|
+
const previous = stringField(data, "previousConversationId");
|
|
313
|
+
const current = stringField(data, "conversationId");
|
|
314
|
+
if (previous !== undefined && current !== undefined && previous !== current) {
|
|
315
|
+
return `${previous} -> ${current}`;
|
|
316
|
+
}
|
|
317
|
+
const base = stringField(data, "baseConversationId");
|
|
318
|
+
if (base !== undefined && current !== undefined && base !== current) {
|
|
319
|
+
return `${base} -> ${current}`;
|
|
320
|
+
}
|
|
321
|
+
return undefined;
|
|
322
|
+
}
|
|
323
|
+
function stringField(record, key) {
|
|
324
|
+
const value = record?.[key];
|
|
325
|
+
if (typeof value !== "string") {
|
|
326
|
+
return undefined;
|
|
327
|
+
}
|
|
328
|
+
const trimmed = value.trim();
|
|
329
|
+
return trimmed.length === 0 ? undefined : trimmed;
|
|
330
|
+
}
|
|
331
|
+
function formatTelemetryLabel(value) {
|
|
332
|
+
return value.replace(/[_-]+/gu, " ");
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=turn-presenter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-presenter.js","sourceRoot":"","sources":["../../src/ui/turn-presenter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Container, Editor } from "@earendil-works/pi-tui";
|
|
2
|
+
import type { SlashCommand, TUI } from "@earendil-works/pi-tui";
|
|
3
|
+
import { type AgentResponder } from "@mono-agent/agent-contracts";
|
|
4
|
+
import type { TuiHistoryStore } from "../../agent/history.js";
|
|
5
|
+
import type { StatusBar } from "../components/status-bar.js";
|
|
6
|
+
export interface ChatViewOptions {
|
|
7
|
+
readonly tui: TUI;
|
|
8
|
+
readonly statusBar: StatusBar;
|
|
9
|
+
readonly conversationId: string;
|
|
10
|
+
readonly history?: TuiHistoryStore;
|
|
11
|
+
readonly slashCommands: readonly SlashCommand[];
|
|
12
|
+
/** Handle a submitted /command; return true when consumed. */
|
|
13
|
+
readonly onSlashCommand: (command: string, args: string) => boolean;
|
|
14
|
+
readonly logger?: {
|
|
15
|
+
error?(message: string, metadata?: Record<string, unknown>): void;
|
|
16
|
+
};
|
|
17
|
+
readonly flushIntervalMs?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The live chat surface: transcript, in-flight loader, editor, and the turn
|
|
21
|
+
* lifecycle (submit → TurnPresenter → settle). Esc aborts the in-flight turn.
|
|
22
|
+
*/
|
|
23
|
+
export declare class ChatView extends Container {
|
|
24
|
+
readonly editor: Editor;
|
|
25
|
+
private readonly transcript;
|
|
26
|
+
private readonly loader;
|
|
27
|
+
private readonly options;
|
|
28
|
+
private responder;
|
|
29
|
+
/**
|
|
30
|
+
* Every not-yet-settled turn's controller — the in-flight one AND queued
|
|
31
|
+
* follow-ups (the harness queues per conversation). Esc aborts them all;
|
|
32
|
+
* tracking only the latest would orphan the turn that is actually running.
|
|
33
|
+
*/
|
|
34
|
+
private readonly activeControllers;
|
|
35
|
+
private turnCounter;
|
|
36
|
+
private thinkingExpandedFlag;
|
|
37
|
+
/**
|
|
38
|
+
* Session-scoped model override set via `/model`. When present, each turn's
|
|
39
|
+
* request carries `metadata.tui.model` so the harness runs that turn against
|
|
40
|
+
* the chosen model (a fresh provider session) instead of the agent default.
|
|
41
|
+
*/
|
|
42
|
+
private modelOverride;
|
|
43
|
+
/**
|
|
44
|
+
* The connected agent's own default model (from `/v1/info`), tracked so
|
|
45
|
+
* clearing the override has something correct to repaint the status bar
|
|
46
|
+
* to -- otherwise it would fall back to whatever string was last painted,
|
|
47
|
+
* which is the just-cleared override itself. Set via {@link setDefaultModel}.
|
|
48
|
+
*/
|
|
49
|
+
private defaultModel;
|
|
50
|
+
/**
|
|
51
|
+
* Session-scoped effort override set via `/effort`. When present, each turn's
|
|
52
|
+
* request carries `metadata.tui.effort` so the harness runs that turn at the
|
|
53
|
+
* chosen reasoning effort instead of the agent default. Mirrors
|
|
54
|
+
* {@link modelOverride}; the two are independent and can be set together.
|
|
55
|
+
*/
|
|
56
|
+
private effortOverride;
|
|
57
|
+
/**
|
|
58
|
+
* The connected agent's own default effort (from `/v1/info`), tracked so
|
|
59
|
+
* clearing the override repaints the status bar to it (not the just-cleared
|
|
60
|
+
* override string). Mirror of {@link defaultModel}; set via {@link setDefaultEffort}.
|
|
61
|
+
*/
|
|
62
|
+
private defaultEffort;
|
|
63
|
+
constructor(options: ChatViewOptions);
|
|
64
|
+
setResponder(responder: AgentResponder | undefined): void;
|
|
65
|
+
/**
|
|
66
|
+
* Set (model string) or clear (`undefined`) the session model override, and
|
|
67
|
+
* reflect it on the status bar immediately: the model segment shows the
|
|
68
|
+
* chosen model with an `(override)` tag, cleared back to the connected
|
|
69
|
+
* agent's own default (via {@link setDefaultModel}, not the last override
|
|
70
|
+
* string) on `undefined`. The override applies from the next turn onward.
|
|
71
|
+
*/
|
|
72
|
+
setModelOverride(model: string | undefined): void;
|
|
73
|
+
/** The active session override, or `undefined` — drives the picker's `(current)` marker. */
|
|
74
|
+
getModelOverride(): string | undefined;
|
|
75
|
+
/**
|
|
76
|
+
* Set (effort string) or clear (`undefined`) the session effort override, and
|
|
77
|
+
* reflect it on the status bar immediately: the effort segment shows the
|
|
78
|
+
* chosen level with an `(override)` tag, cleared back to the connected agent's
|
|
79
|
+
* own default (via {@link setDefaultEffort}, not the last override string) on
|
|
80
|
+
* `undefined`. The override applies from the next turn onward. Independent of
|
|
81
|
+
* {@link setModelOverride} — both can be active at once.
|
|
82
|
+
*/
|
|
83
|
+
setEffortOverride(effort: string | undefined): void;
|
|
84
|
+
/** The active session effort override, or `undefined` — drives the picker's `(current)` marker. */
|
|
85
|
+
getEffortOverride(): string | undefined;
|
|
86
|
+
/**
|
|
87
|
+
* Record the connected agent's own default model (from `/v1/info`), so a
|
|
88
|
+
* later `setModelOverride(undefined)` knows what to repaint the status bar
|
|
89
|
+
* to. When no override is currently active, also repaints immediately --
|
|
90
|
+
* this is how a fresh `/v1/info` snapshot (e.g. after switching agents)
|
|
91
|
+
* reaches the status bar's model segment.
|
|
92
|
+
*/
|
|
93
|
+
setDefaultModel(model: string | undefined): void;
|
|
94
|
+
/**
|
|
95
|
+
* Record the connected agent's own default effort (from `/v1/info`), so a
|
|
96
|
+
* later `setEffortOverride(undefined)` knows what to repaint the status bar
|
|
97
|
+
* to. When no override is currently active, repaints immediately — this is
|
|
98
|
+
* how a fresh `/v1/info` snapshot (e.g. after switching agents) reaches the
|
|
99
|
+
* status bar's effort segment. Mirror of {@link setDefaultModel}.
|
|
100
|
+
*/
|
|
101
|
+
setDefaultEffort(effort: string | undefined): void;
|
|
102
|
+
/**
|
|
103
|
+
* Whether the editor's buffer is empty. Drives app.ts's chat exception to
|
|
104
|
+
* global tab/`?`: with nothing to lose, both act as global shortcuts (view
|
|
105
|
+
* cycling, help); with unsubmitted text, they pass through to the editor
|
|
106
|
+
* (autocomplete completion / literal `?`) unchanged.
|
|
107
|
+
*/
|
|
108
|
+
isEditorEmpty(): boolean;
|
|
109
|
+
hasActiveTurn(): boolean;
|
|
110
|
+
/** Esc: abort every unsettled turn (in-flight + queued). Returns true when there was one. */
|
|
111
|
+
cancelActiveTurn(): boolean;
|
|
112
|
+
toggleThinkingExpanded(): void;
|
|
113
|
+
addNotice(message: string, kind?: "warning" | "error"): void;
|
|
114
|
+
addInfo(text: string): void;
|
|
115
|
+
private handleSubmit;
|
|
116
|
+
private runTurn;
|
|
117
|
+
/**
|
|
118
|
+
* The authoritative post-turn correction: `metadata.runtime` is set by the
|
|
119
|
+
* harness from the actual run (not the requested config), so it wins over
|
|
120
|
+
* whatever the mid-stream `run_config` event (or nothing, for agents that
|
|
121
|
+
* predate it) already showed. Guarded defensively — `metadata` is
|
|
122
|
+
* `unknown`-shaped wire data. Absence of either field is NOT a signal to
|
|
123
|
+
* clear; only a present string value ever updates the status bar.
|
|
124
|
+
*/
|
|
125
|
+
private applyFinishMetadata;
|
|
126
|
+
private setLoading;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/ui/views/chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,SAAS,EAAE,MAAM,EAAgB,MAAM,wBAAwB,CAAC;AACvG,OAAO,KAAK,EAAa,YAAY,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAG7D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,SAAS,YAAY,EAAE,CAAC;IAChD,8DAA8D;IAC9D,QAAQ,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACpE,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;KAAE,CAAC;IACxF,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED;;;GAGG;AACH,qBAAa,QAAS,SAAQ,SAAS;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,SAAS,CAA6B;IAC9C;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA8B;IAChE,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,oBAAoB,CAAS;IACrC;;;;OAIG;IACH,OAAO,CAAC,aAAa,CAAqB;IAC1C;;;;;OAKG;IACH,OAAO,CAAC,YAAY,CAAqB;IACzC;;;;;OAKG;IACH,OAAO,CAAC,cAAc,CAAqB;IAC3C;;;;OAIG;IACH,OAAO,CAAC,aAAa,CAAqB;gBAE9B,OAAO,EAAE,eAAe;IAepC,YAAY,CAAC,SAAS,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI;IAIzD;;;;;;OAMG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAOjD,4FAA4F;IAC5F,gBAAgB,IAAI,MAAM,GAAG,SAAS;IAItC;;;;;;;OAOG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAOnD,mGAAmG;IACnG,iBAAiB,IAAI,MAAM,GAAG,SAAS;IAIvC;;;;;;OAMG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAQhD;;;;;;OAMG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAQlD;;;;;OAKG;IACH,aAAa,IAAI,OAAO;IAIxB,aAAa,IAAI,OAAO;IAIxB,6FAA6F;IAC7F,gBAAgB,IAAI,OAAO;IAa3B,sBAAsB,IAAI,IAAI;IAa9B,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,SAAS,GAAG,OAAmB,GAAG,IAAI;IAKvE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK3B,OAAO,CAAC,YAAY;YAgBN,OAAO;IAwFrB;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,UAAU;CAgBnB"}
|