@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.
Files changed (124) hide show
  1. package/README.md +60 -10
  2. package/dist/bin/cli.d.ts +4 -1
  3. package/dist/bin/cli.d.ts.map +1 -1
  4. package/dist/bin/cli.js +36 -53
  5. package/dist/bin/cli.js.map +1 -1
  6. package/dist/bin/mono-agent-tui.js +21 -10
  7. package/dist/bin/mono-agent-tui.js.map +1 -1
  8. package/dist/config/pane.d.ts +9 -9
  9. package/dist/config/pane.d.ts.map +1 -1
  10. package/dist/config/pane.js +15 -196
  11. package/dist/config/pane.js.map +1 -1
  12. package/dist/data/instances.d.ts +48 -0
  13. package/dist/data/instances.d.ts.map +1 -0
  14. package/dist/data/instances.js +101 -0
  15. package/dist/data/instances.js.map +1 -0
  16. package/dist/data/replay.d.ts +68 -0
  17. package/dist/data/replay.d.ts.map +1 -0
  18. package/dist/data/replay.js +149 -0
  19. package/dist/data/replay.js.map +1 -0
  20. package/dist/index.d.ts +10 -10
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +5 -5
  23. package/dist/index.js.map +1 -1
  24. package/dist/remote/client.d.ts +44 -0
  25. package/dist/remote/client.d.ts.map +1 -0
  26. package/dist/remote/client.js +173 -0
  27. package/dist/remote/client.js.map +1 -0
  28. package/dist/runtime/start.d.ts +11 -18
  29. package/dist/runtime/start.d.ts.map +1 -1
  30. package/dist/runtime/start.js +19 -33
  31. package/dist/runtime/start.js.map +1 -1
  32. package/dist/ui/app.d.ts +142 -0
  33. package/dist/ui/app.d.ts.map +1 -0
  34. package/dist/ui/app.js +586 -0
  35. package/dist/ui/app.js.map +1 -0
  36. package/dist/ui/components/event-list.d.ts +60 -0
  37. package/dist/ui/components/event-list.d.ts.map +1 -0
  38. package/dist/ui/components/event-list.js +369 -0
  39. package/dist/ui/components/event-list.js.map +1 -0
  40. package/dist/ui/components/status-bar.d.ts +65 -0
  41. package/dist/ui/components/status-bar.d.ts.map +1 -0
  42. package/dist/ui/components/status-bar.js +126 -0
  43. package/dist/ui/components/status-bar.js.map +1 -0
  44. package/dist/ui/components/tool-panel.d.ts +30 -0
  45. package/dist/ui/components/tool-panel.d.ts.map +1 -0
  46. package/dist/ui/components/tool-panel.js +59 -0
  47. package/dist/ui/components/tool-panel.js.map +1 -0
  48. package/dist/ui/components/transcript-cells.d.ts +49 -0
  49. package/dist/ui/components/transcript-cells.d.ts.map +1 -0
  50. package/dist/ui/components/transcript-cells.js +110 -0
  51. package/dist/ui/components/transcript-cells.js.map +1 -0
  52. package/dist/ui/format.d.ts +29 -0
  53. package/dist/ui/format.d.ts.map +1 -0
  54. package/dist/ui/format.js +105 -0
  55. package/dist/ui/format.js.map +1 -0
  56. package/dist/ui/theme.d.ts +25 -0
  57. package/dist/ui/theme.d.ts.map +1 -0
  58. package/dist/ui/theme.js +62 -0
  59. package/dist/ui/theme.js.map +1 -0
  60. package/dist/ui/turn-presenter.d.ts +72 -0
  61. package/dist/ui/turn-presenter.d.ts.map +1 -0
  62. package/dist/ui/turn-presenter.js +334 -0
  63. package/dist/ui/turn-presenter.js.map +1 -0
  64. package/dist/ui/views/chat.d.ts +128 -0
  65. package/dist/ui/views/chat.d.ts.map +1 -0
  66. package/dist/ui/views/chat.js +313 -0
  67. package/dist/ui/views/chat.js.map +1 -0
  68. package/dist/ui/views/config.d.ts +23 -0
  69. package/dist/ui/views/config.d.ts.map +1 -0
  70. package/dist/ui/views/config.js +87 -0
  71. package/dist/ui/views/config.js.map +1 -0
  72. package/dist/ui/views/picker.d.ts +17 -0
  73. package/dist/ui/views/picker.d.ts.map +1 -0
  74. package/dist/ui/views/picker.js +57 -0
  75. package/dist/ui/views/picker.js.map +1 -0
  76. package/dist/ui/views/replay-detail.d.ts +60 -0
  77. package/dist/ui/views/replay-detail.d.ts.map +1 -0
  78. package/dist/ui/views/replay-detail.js +328 -0
  79. package/dist/ui/views/replay-detail.js.map +1 -0
  80. package/dist/ui/views/replay.d.ts +74 -0
  81. package/dist/ui/views/replay.d.ts.map +1 -0
  82. package/dist/ui/views/replay.js +460 -0
  83. package/dist/ui/views/replay.js.map +1 -0
  84. package/package.json +9 -12
  85. package/dist/agent/message-stream.d.ts +0 -52
  86. package/dist/agent/message-stream.d.ts.map +0 -1
  87. package/dist/agent/message-stream.js +0 -110
  88. package/dist/agent/message-stream.js.map +0 -1
  89. package/dist/components/ChatPane.d.ts +0 -20
  90. package/dist/components/ChatPane.d.ts.map +0 -1
  91. package/dist/components/ChatPane.js +0 -142
  92. package/dist/components/ChatPane.js.map +0 -1
  93. package/dist/components/ConfigPane.d.ts +0 -12
  94. package/dist/components/ConfigPane.d.ts.map +0 -1
  95. package/dist/components/ConfigPane.js +0 -70
  96. package/dist/components/ConfigPane.js.map +0 -1
  97. package/dist/components/HelpOverlay.d.ts +0 -6
  98. package/dist/components/HelpOverlay.d.ts.map +0 -1
  99. package/dist/components/HelpOverlay.js +0 -18
  100. package/dist/components/HelpOverlay.js.map +0 -1
  101. package/dist/components/HistoryPane.d.ts +0 -9
  102. package/dist/components/HistoryPane.d.ts.map +0 -1
  103. package/dist/components/HistoryPane.js +0 -125
  104. package/dist/components/HistoryPane.js.map +0 -1
  105. package/dist/components/StatusBar.d.ts +0 -10
  106. package/dist/components/StatusBar.d.ts.map +0 -1
  107. package/dist/components/StatusBar.js +0 -15
  108. package/dist/components/StatusBar.js.map +0 -1
  109. package/dist/components/TuiApp.d.ts +0 -29
  110. package/dist/components/TuiApp.d.ts.map +0 -1
  111. package/dist/components/TuiApp.js +0 -81
  112. package/dist/components/TuiApp.js.map +0 -1
  113. package/dist/components/primitives/Badge.d.ts +0 -8
  114. package/dist/components/primitives/Badge.d.ts.map +0 -1
  115. package/dist/components/primitives/Badge.js +0 -14
  116. package/dist/components/primitives/Badge.js.map +0 -1
  117. package/dist/components/primitives/Spinner.d.ts +0 -6
  118. package/dist/components/primitives/Spinner.d.ts.map +0 -1
  119. package/dist/components/primitives/Spinner.js +0 -8
  120. package/dist/components/primitives/Spinner.js.map +0 -1
  121. package/dist/components/primitives/TranscriptLine.d.ts +0 -10
  122. package/dist/components/primitives/TranscriptLine.d.ts.map +0 -1
  123. package/dist/components/primitives/TranscriptLine.js +0 -15
  124. package/dist/components/primitives/TranscriptLine.js.map +0 -1
@@ -0,0 +1,460 @@
1
+ import { Container, matchesKey, SelectList, Text } from "@earendil-works/pi-tui";
2
+ import { listReplayRuns, readReplayRun, } from "../../data/replay.js";
3
+ import { extractUsage, formatDateClock, formatDurationMs, formatTokens, formatUsd, previewValue } from "../format.js";
4
+ import { selectListTheme, styles } from "../theme.js";
5
+ import { EventTimelineList } from "../components/event-list.js";
6
+ import { buildDetailCell, buildHeadline, buildPayloadHeader, buildRawPayloadBody, buildStatusLine, CATEGORY_KEYS, } from "./replay-detail.js";
7
+ /** `all` means "no source filter" -- see the `s` key cycle in `handleInput`. */
8
+ const ALL_SOURCE_FILTER = "all";
9
+ const SOURCE_FILTER_CYCLE = [
10
+ ALL_SOURCE_FILTER,
11
+ "tui",
12
+ "telegram",
13
+ "slack",
14
+ "cron",
15
+ "webhook",
16
+ "memory",
17
+ "other",
18
+ ];
19
+ const STATUS_FILTER_CYCLE = ["all", "failed", "succeeded"];
20
+ const LIST_HINT = "enter open · r refresh · s source · x status · esc back";
21
+ /** Preview length for a compacted `userInput` label (see {@link runLabelText}). */
22
+ const USER_INPUT_PREVIEW_MAX_CHARS = 40;
23
+ // Content-first labels (source-detail/userInput previews) run longer than the
24
+ // old `<conversationId>`-only label this column was originally tuned for (a
25
+ // fixed 46). Give SelectList a floor/ceiling instead of a fixed width so it
26
+ // shrinks to fit short labels (leaving the description room) and only grows
27
+ // toward the ceiling for genuinely long ones.
28
+ const LIST_PRIMARY_COLUMN_MIN_WIDTH = 20;
29
+ const LIST_PRIMARY_COLUMN_MAX_WIDTH = 72;
30
+ function nextInCycle(cycle, current) {
31
+ const index = cycle.indexOf(current);
32
+ return cycle[(index + 1) % cycle.length] ?? cycle[0];
33
+ }
34
+ function statusGlyph(status) {
35
+ if (status === "succeeded") {
36
+ return styles.success("✓");
37
+ }
38
+ if (status === "cancelled" || status === "running") {
39
+ return styles.warning("◌");
40
+ }
41
+ return styles.error("✗");
42
+ }
43
+ /**
44
+ * Content-first label text (precedence: `sourceDetail` -- cron job id /
45
+ * webhook endpoint name -- then a compacted `userInput` preview, then
46
+ * `conversationId` as a last resort for old, pre-`source` artifacts).
47
+ */
48
+ function runLabelText(run) {
49
+ if (run.sourceDetail !== undefined && run.sourceDetail.trim().length > 0) {
50
+ return run.sourceDetail;
51
+ }
52
+ if (run.userInput !== undefined && run.userInput.trim().length > 0) {
53
+ const compacted = previewValue(run.userInput.replace(/\s+/gu, " ").trim(), USER_INPUT_PREVIEW_MAX_CHARS);
54
+ return `"${compacted}"`;
55
+ }
56
+ return run.conversationId;
57
+ }
58
+ /** Model shortened to its last path/colon segment, e.g. `pi:openai:gpt-5.5` -> `gpt-5.5`. */
59
+ function shortenModel(model) {
60
+ const segments = model.split(/[/:]/u).filter((segment) => segment.length > 0);
61
+ return segments.at(-1) ?? model;
62
+ }
63
+ function modelEffortSegment(run) {
64
+ const model = run.model === undefined ? undefined : shortenModel(run.model);
65
+ if (model === undefined) {
66
+ return run.effort === undefined ? undefined : `@${run.effort}`;
67
+ }
68
+ return run.effort === undefined ? model : `${model}@${run.effort}`;
69
+ }
70
+ function buildRunDescription(run) {
71
+ const segments = [formatDurationMs(run.durationMs), `${run.eventCount} ev`];
72
+ const modelEffort = modelEffortSegment(run);
73
+ if (modelEffort !== undefined) {
74
+ segments.push(modelEffort);
75
+ }
76
+ const usage = extractUsage(run.usage, run.cost);
77
+ if (usage !== undefined) {
78
+ segments.push(`↑${formatTokens(usage.input ?? 0)} ↓${formatTokens(usage.output ?? 0)}`);
79
+ if (usage.usd !== undefined) {
80
+ segments.push(formatUsd(usage.usd));
81
+ }
82
+ }
83
+ if (run.failureKind !== undefined) {
84
+ segments.push(run.failureKind);
85
+ }
86
+ return segments.join(" · ");
87
+ }
88
+ /**
89
+ * Recorded-run replay straight from the agent's artifact dir: run list →
90
+ * debugger-style step-through of any past turn's full event timeline
91
+ * (thinking, tools, telemetry, failover) from ANY channel — richer than the
92
+ * live stream since nothing is dropped.
93
+ */
94
+ export class ReplayView extends Container {
95
+ list;
96
+ options;
97
+ header = new Text("", 1, 0);
98
+ detail = new Container();
99
+ detailHeadline = new Text("", 1, 0);
100
+ detailStatus = new Text("", 1, 0);
101
+ eventList = new EventTimelineList({ maxVisible: 16 });
102
+ /** Selected-event pane: header + chat-style cell (+ raw JSON strip when expanded), rebuilt by {@link rebuildDetailPane}. */
103
+ detailPane = new Container();
104
+ mode = "list";
105
+ artifactDir;
106
+ runs = [];
107
+ totalRuns = 0;
108
+ warnings = [];
109
+ sourceFilter = ALL_SOURCE_FILTER;
110
+ statusFilter = "all";
111
+ // Detail-mode state. `categoryFilter` empty means "no filter" (all visible)
112
+ // -- see setCategoryFilter/toggleCategory below for how that maps onto the
113
+ // component's undefined-means-unfiltered convention.
114
+ currentReplay;
115
+ categoryFilter = new Set();
116
+ committedSearch;
117
+ searchInputOpen = false;
118
+ searchInputBuffer = "";
119
+ payloadExpanded = false;
120
+ selectedItem;
121
+ constructor(options) {
122
+ super();
123
+ this.options = options;
124
+ this.list = new SelectList([], 14, selectListTheme, {
125
+ minPrimaryColumnWidth: LIST_PRIMARY_COLUMN_MIN_WIDTH,
126
+ maxPrimaryColumnWidth: LIST_PRIMARY_COLUMN_MAX_WIDTH,
127
+ });
128
+ this.list.onSelect = (item) => {
129
+ void this.openRun(item.value);
130
+ };
131
+ this.detail.addChild(this.detailHeadline);
132
+ this.detail.addChild(this.detailStatus);
133
+ this.detail.addChild(this.eventList);
134
+ this.detail.addChild(this.detailPane);
135
+ this.eventList.onSelectionChange = (item) => {
136
+ this.selectedItem = item;
137
+ this.refreshPanes();
138
+ };
139
+ this.showList();
140
+ // Self-initialize the empty-state header (no artifact dir until an
141
+ // instance is selected).
142
+ void this.refresh();
143
+ }
144
+ isInDetail() {
145
+ return this.mode === "detail";
146
+ }
147
+ /**
148
+ * Esc layering in detail mode: an open search input closes+clears first;
149
+ * else a committed search clears; else an expanded payload pane collapses;
150
+ * else return to the run list. Returns false only when already at the list
151
+ * (so app-level esc fallthrough, e.g. switching views, still works).
152
+ */
153
+ back() {
154
+ if (this.mode !== "detail") {
155
+ return false;
156
+ }
157
+ if (this.searchInputOpen) {
158
+ this.searchInputOpen = false;
159
+ this.searchInputBuffer = "";
160
+ }
161
+ else if (this.committedSearch !== undefined) {
162
+ this.committedSearch = undefined;
163
+ this.eventList.setSearch(undefined);
164
+ }
165
+ else if (this.payloadExpanded) {
166
+ this.payloadExpanded = false;
167
+ }
168
+ else {
169
+ this.showList();
170
+ this.options.tui.requestRender();
171
+ return true;
172
+ }
173
+ this.refreshPanes();
174
+ this.options.tui.requestRender();
175
+ return true;
176
+ }
177
+ handleInput(data) {
178
+ if (this.mode === "list") {
179
+ if (data === "r" || data === "R") {
180
+ void this.refresh();
181
+ return;
182
+ }
183
+ if (data === "s") {
184
+ this.cycleSourceFilter();
185
+ return;
186
+ }
187
+ if (data === "x") {
188
+ this.cycleStatusFilter();
189
+ return;
190
+ }
191
+ this.list.handleInput(data);
192
+ return;
193
+ }
194
+ this.handleDetailInput(data);
195
+ }
196
+ setArtifactDir(artifactDir) {
197
+ this.artifactDir = artifactDir;
198
+ void this.refresh();
199
+ }
200
+ async refresh() {
201
+ // Snapshot: a rapid agent switch mid-read must not paint the previous
202
+ // agent's runs into the new agent's list.
203
+ const requestedDir = this.artifactDir;
204
+ if (requestedDir === undefined) {
205
+ this.runs = [];
206
+ this.totalRuns = 0;
207
+ this.warnings = [];
208
+ this.header.setText(`${styles.bold("Run replay unavailable")}\n${styles.muted("The selected agent's manifest has no artifact dir.")}`);
209
+ this.syncListItems();
210
+ this.showList();
211
+ this.options.tui.requestRender();
212
+ return;
213
+ }
214
+ try {
215
+ const { runs, warnings, totalRuns } = await listReplayRuns(requestedDir, {
216
+ ...(this.sourceFilter === ALL_SOURCE_FILTER ? {} : { sourceFilter: this.sourceFilter }),
217
+ });
218
+ if (this.artifactDir !== requestedDir) {
219
+ return; // Superseded by a newer agent selection.
220
+ }
221
+ this.runs = runs;
222
+ this.totalRuns = totalRuns;
223
+ this.warnings = warnings;
224
+ this.updateHeader();
225
+ }
226
+ catch (error) {
227
+ if (this.artifactDir !== requestedDir) {
228
+ return;
229
+ }
230
+ this.runs = [];
231
+ this.totalRuns = 0;
232
+ this.warnings = [];
233
+ this.header.setText(styles.error(`Failed to read runs: ${error instanceof Error ? error.message : String(error)}`));
234
+ }
235
+ this.syncListItems();
236
+ if (this.mode === "list") {
237
+ this.showList();
238
+ }
239
+ this.options.tui.requestRender();
240
+ }
241
+ /** Runs after the client-side status filter (source filtering already happened server-side, see `refresh`). */
242
+ filteredRuns() {
243
+ if (this.statusFilter === "all") {
244
+ return this.runs;
245
+ }
246
+ // Strict match on the bucket's own status -- NOT "everything that isn't
247
+ // succeeded" -- so a `running`/`cancelled` run lands in neither bucket
248
+ // rather than being swept into "failed".
249
+ return this.runs.filter((run) => run.status === this.statusFilter);
250
+ }
251
+ updateHeader() {
252
+ const shown = this.filteredRuns().length;
253
+ const filterParts = [];
254
+ if (this.sourceFilter !== ALL_SOURCE_FILTER) {
255
+ filterParts.push(`source: ${this.sourceFilter}`);
256
+ }
257
+ if (this.statusFilter !== "all") {
258
+ filterParts.push(`status: ${this.statusFilter}`);
259
+ }
260
+ const filterText = filterParts.length > 0 ? ` ${styles.dim(`· ${filterParts.join(" · ")}`)}` : "";
261
+ const warningText = this.warnings.length > 0 ? `\n${styles.warning(this.warnings[0] ?? "")}` : "";
262
+ this.header.setText(`${styles.bold(`Recorded runs (${shown}/${this.totalRuns})`)}${filterText} ${styles.dim(LIST_HINT)}${warningText}`);
263
+ }
264
+ cycleSourceFilter() {
265
+ this.sourceFilter = nextInCycle(SOURCE_FILTER_CYCLE, this.sourceFilter);
266
+ void this.refresh();
267
+ }
268
+ cycleStatusFilter() {
269
+ this.statusFilter = nextInCycle(STATUS_FILTER_CYCLE, this.statusFilter);
270
+ this.updateHeader();
271
+ this.syncListItems();
272
+ this.options.tui.requestRender();
273
+ }
274
+ syncListItems() {
275
+ const items = this.filteredRuns().map((run) => {
276
+ const labelParts = [statusGlyph(run.status), formatDateClock(run.startedAt), `[${run.resolvedSource}]`, runLabelText(run)];
277
+ return {
278
+ value: run.runId,
279
+ label: labelParts.filter((part) => part.length > 0).join(" "),
280
+ description: buildRunDescription(run),
281
+ };
282
+ });
283
+ this.list.items = items;
284
+ this.list.setFilter("");
285
+ this.list.setSelectedIndex(0);
286
+ this.list.invalidate();
287
+ }
288
+ showList() {
289
+ this.mode = "list";
290
+ this.clear();
291
+ this.addChild(this.header);
292
+ this.addChild(this.list);
293
+ }
294
+ async openRun(runId) {
295
+ const requestedDir = this.artifactDir;
296
+ if (requestedDir === undefined) {
297
+ return;
298
+ }
299
+ const replay = await readReplayRun(requestedDir, runId, {
300
+ ...(this.sourceFilter === "memory" ? { scope: "memory" } : {}),
301
+ });
302
+ if (this.artifactDir !== requestedDir) {
303
+ return; // Superseded by a newer agent selection.
304
+ }
305
+ if (replay === undefined) {
306
+ this.header.setText(styles.error(`Run ${runId} not found.`));
307
+ this.options.tui.requestRender();
308
+ return;
309
+ }
310
+ this.mode = "detail";
311
+ this.clear();
312
+ this.openDetail(replay);
313
+ this.addChild(this.detail);
314
+ this.options.tui.requestRender();
315
+ }
316
+ /** Reset all detail-mode state for a freshly opened run and populate the panes. */
317
+ openDetail(replay) {
318
+ this.currentReplay = replay;
319
+ this.categoryFilter.clear();
320
+ this.committedSearch = undefined;
321
+ this.searchInputOpen = false;
322
+ this.searchInputBuffer = "";
323
+ this.payloadExpanded = false;
324
+ this.detailHeadline.setText(buildHeadline(replay));
325
+ this.eventList.setCategoryFilter(undefined);
326
+ this.eventList.setSearch(undefined);
327
+ // Triggers onSelectionChange synchronously, which calls refreshPanes().
328
+ this.eventList.setItems(replay.timeline, replay.turns);
329
+ }
330
+ handleDetailInput(data) {
331
+ if (this.searchInputOpen) {
332
+ this.handleSearchInputKey(data);
333
+ this.refreshPanes();
334
+ this.options.tui.requestRender();
335
+ return;
336
+ }
337
+ if (matchesKey(data, "up") || matchesKey(data, "down") || matchesKey(data, "pageUp") || matchesKey(data, "pageDown")) {
338
+ this.eventList.handleInput(data);
339
+ }
340
+ else if (data === "g") {
341
+ this.eventList.moveToFirst();
342
+ }
343
+ else if (data === "G") {
344
+ this.eventList.moveToLast();
345
+ }
346
+ else if (data === "[") {
347
+ this.eventList.moveToTurn(-1);
348
+ }
349
+ else if (data === "]") {
350
+ this.eventList.moveToTurn(1);
351
+ }
352
+ else if (data === "a") {
353
+ this.categoryFilter.clear();
354
+ this.eventList.setCategoryFilter(undefined);
355
+ }
356
+ else if (CATEGORY_KEYS[data] !== undefined) {
357
+ this.toggleCategory(CATEGORY_KEYS[data]);
358
+ }
359
+ else if (matchesKey(data, "enter") || matchesKey(data, "space")) {
360
+ this.payloadExpanded = !this.payloadExpanded;
361
+ }
362
+ else if (data === "/") {
363
+ this.searchInputOpen = true;
364
+ this.searchInputBuffer = "";
365
+ }
366
+ else if (data === "n") {
367
+ this.eventList.moveToMatch(1);
368
+ }
369
+ else if (data === "N") {
370
+ this.eventList.moveToMatch(-1);
371
+ }
372
+ else {
373
+ return;
374
+ }
375
+ this.refreshPanes();
376
+ this.options.tui.requestRender();
377
+ }
378
+ toggleCategory(category) {
379
+ if (this.categoryFilter.has(category)) {
380
+ this.categoryFilter.delete(category);
381
+ }
382
+ else {
383
+ this.categoryFilter.add(category);
384
+ }
385
+ this.eventList.setCategoryFilter(this.categoryFilter.size === 0 ? undefined : new Set(this.categoryFilter));
386
+ }
387
+ handleSearchInputKey(data) {
388
+ if (matchesKey(data, "enter")) {
389
+ this.commitSearch(this.searchInputBuffer);
390
+ }
391
+ else if (matchesKey(data, "backspace")) {
392
+ this.searchInputBuffer = this.searchInputBuffer.slice(0, -1);
393
+ }
394
+ else {
395
+ // Esc never reaches here: app.ts's global input listener intercepts it
396
+ // first and calls back() (which closes the search input as its first
397
+ // layer) before the key would otherwise be forwarded to this view.
398
+ const printable = data.length === 1 && data.charCodeAt(0) >= 32 ? data : undefined;
399
+ if (printable !== undefined) {
400
+ this.searchInputBuffer += printable;
401
+ }
402
+ }
403
+ }
404
+ commitSearch(query) {
405
+ this.searchInputOpen = false;
406
+ const trimmed = query.trim();
407
+ this.committedSearch = trimmed.length > 0 ? trimmed : undefined;
408
+ this.eventList.setSearch(this.committedSearch);
409
+ if (this.committedSearch !== undefined) {
410
+ this.eventList.moveToMatch(1);
411
+ }
412
+ }
413
+ /** Recompute the status line + selected-event payload pane from current state. */
414
+ refreshPanes() {
415
+ const turns = this.currentReplay?.turns ?? [];
416
+ this.detailStatus.setText(buildStatusLine({
417
+ ordinal: this.eventList.selectedVisibleOrdinal(),
418
+ visibleCount: this.eventList.visibleCount(),
419
+ turnIndex: this.eventList.turnOfSelection(),
420
+ turnCount: turns.length,
421
+ categoryFilter: this.categoryFilter,
422
+ searchInputOpen: this.searchInputOpen,
423
+ searchInputBuffer: this.searchInputBuffer,
424
+ committedSearch: this.committedSearch,
425
+ matchCount: this.eventList.matchCount(),
426
+ }));
427
+ // A category filter can leave zero rows visible while `this.selectedItem`
428
+ // still holds the last (now hidden) selection -- eventList remembers that
429
+ // index so widening the filter again snaps back to it, but the payload
430
+ // pane must not show a stale item's content while nothing is visible.
431
+ const visibleSelection = this.eventList.visibleCount() === 0 ? undefined : this.selectedItem;
432
+ this.rebuildDetailPane(visibleSelection);
433
+ }
434
+ /**
435
+ * Rebuild the selected-event pane from scratch: header, then EITHER a
436
+ * chat-style cell (thinking/tool/message/error/notice -- reusing live
437
+ * chat's own components, see buildDetailCell) OR, for runtime/telemetry
438
+ * items and tool-shaped-but-blockless items, the unchanged raw-JSON body.
439
+ * Expanding (`enter`) appends the raw JSON below a chat-style cell too, so
440
+ * the underlying event is always one keystroke away.
441
+ */
442
+ rebuildDetailPane(item) {
443
+ this.detailPane.clear();
444
+ if (item === undefined) {
445
+ return;
446
+ }
447
+ this.detailPane.addChild(new Text(buildPayloadHeader(item), 1, 0));
448
+ this.detailPane.addChild(new Text("", 1, 0));
449
+ const cell = buildDetailCell(item, this.currentReplay?.timeline ?? [], this.currentReplay?.detail.events ?? []);
450
+ if (cell === undefined) {
451
+ this.detailPane.addChild(new Text(buildRawPayloadBody(item, this.payloadExpanded), 1, 0));
452
+ return;
453
+ }
454
+ this.detailPane.addChild(cell);
455
+ if (this.payloadExpanded) {
456
+ this.detailPane.addChild(new Text(buildRawPayloadBody(item, true), 1, 0));
457
+ }
458
+ }
459
+ }
460
+ //# sourceMappingURL=replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.js","sourceRoot":"","sources":["../../../src/ui/views/replay.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mono-agent/tui",
3
- "version": "0.4.0",
4
- "description": "Ink-based React TUI console adapter for agent hosts: chat, history, redacted config view.",
3
+ "version": "0.4.1",
4
+ "description": "pi-tui operator console for mono-agent: live chat with full stream-event insight, recorded-run replay, and read-only config view for running agents.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
7
7
  "private": false,
@@ -21,20 +21,17 @@
21
21
  "README.md"
22
22
  ],
23
23
  "dependencies": {
24
- "@mono-agent/agent-contracts": "0.4.0",
25
- "@mono-agent/config": "0.4.0",
26
- "ink": "^7.0.3",
27
- "ink-spinner": "^5.0.0",
28
- "ink-text-input": "^6.0.0",
29
- "react": "^19.2.0"
30
- },
31
- "devDependencies": {
32
- "@types/react": "^19.2.2",
33
- "ink-testing-library": "^4.0.0"
24
+ "@earendil-works/pi-tui": "^0.79.1",
25
+ "@mono-agent/agent-contracts": "0.4.1",
26
+ "@mono-agent/config": "0.4.1",
27
+ "@mono-agent/observability": "0.4.1"
34
28
  },
35
29
  "publishConfig": {
36
30
  "access": "public"
37
31
  },
32
+ "devDependencies": {
33
+ "@mono-agent/operator-adapter": "0.4.1"
34
+ },
38
35
  "scripts": {
39
36
  "build": "tsc -p tsconfig.build.json",
40
37
  "typecheck": "tsc -p tsconfig.json --noEmit",
@@ -1,52 +0,0 @@
1
- import type { AgentMessageStreamLike } from "./responder.js";
2
- /**
3
- * State snapshot produced by TuiInkMessageStream after every flush.
4
- * The Chat pane re-renders the in-flight assistant block from this.
5
- */
6
- export interface TuiStreamState {
7
- readonly statusText: string;
8
- readonly text: string;
9
- readonly finished: boolean;
10
- readonly hasOutput: boolean;
11
- }
12
- export interface TuiInkMessageStreamOptions {
13
- readonly initialStatusText?: string;
14
- readonly streamDebounceMs?: number;
15
- readonly onState: (state: TuiStreamState) => void;
16
- readonly now?: () => number;
17
- readonly setTimer?: (handler: () => void, ms: number) => unknown;
18
- readonly clearTimer?: (handle: unknown) => void;
19
- }
20
- /**
21
- * AgentMessageStreamLike implementation that buffers incoming deltas and
22
- * emits a single state snapshot per debounce window. This keeps the React
23
- * reconciler from churning when a responder calls `append` in a tight
24
- * loop (typical of token-by-token streaming).
25
- */
26
- export declare class TuiInkMessageStream implements AgentMessageStreamLike {
27
- private readonly emit;
28
- private readonly debounceMs;
29
- private readonly setTimerImpl;
30
- private readonly clearTimerImpl;
31
- private statusText;
32
- private currentText;
33
- private finished;
34
- private hasOutput;
35
- private pendingTimer;
36
- private dirty;
37
- constructor(options: TuiInkMessageStreamOptions);
38
- status(text: string): Promise<void>;
39
- append(delta: string): Promise<void>;
40
- replace(text: string): Promise<void>;
41
- finish(finalText?: string): Promise<void>;
42
- /**
43
- * Flushes any pending state immediately. Useful when the host wants to
44
- * cancel mid-stream and render the partial result before unmounting.
45
- */
46
- flushPending(): void;
47
- snapshot(): TuiStreamState;
48
- private scheduleEmit;
49
- private flushNow;
50
- private assertOpen;
51
- }
52
- //# sourceMappingURL=message-stream.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"message-stream.d.ts","sourceRoot":"","sources":["../../src/agent/message-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAClD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACjE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CACjD;AAKD;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,sBAAsB;IAChE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkC;IACvD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+C;IAC5E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;IAE3D,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,EAAE,0BAA0B;IAiBzC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU/C;;;OAGG;IACH,YAAY,IAAI,IAAI;IAMpB,QAAQ,IAAI,cAAc;IAS1B,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,UAAU;CAKnB"}