@mono-agent/tui 0.4.0 → 0.5.0

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,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":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAC3F,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAwBvD,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B;;;;;;;;;GASG;AACH,MAAM,OAAO,aAAa;IACP,OAAO,CAAuB;IACvC,aAAa,CAA4B;IACjD,0FAA0F;IACzE,cAAc,GAAoB,EAAE,CAAC;IACtD,gFAAgF;IACxE,UAAU,GAAG,EAAE,CAAC;IAChB,YAAY,CAA2B;IAC/C,gFAAgF;IACxE,aAAa,GAAG,CAAC,CAAC;IAC1B,0EAA0E;IAClE,gBAAgB,CAAqB;IAC5B,UAAU,GAAG,IAAI,GAAG,EAAqB,CAAC;IACnD,MAAM,GAAG,EAAE,CAAC;IACZ,UAAU,CAA4C;IACtD,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAAY,OAA6B;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa;QACxB,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;QACrB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,sEAAsE;QACtE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAuB;QACjC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,mBAAmB,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC1C,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;gBACxC,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;oBACxC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;gBACvC,CAAC;gBACD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChF,MAAM;YACR,CAAC;YACD,KAAK,mBAAmB,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;gBACnE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBACrC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACxC,MAAM;YACR,CAAC;YACD,KAAK,oBAAoB,CAAC,CAAC,CAAC;gBAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBAChE,MAAM;YACR,CAAC;YACD,KAAK,qBAAqB,CAAC,CAAC,CAAC;gBAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC5C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,KAAK,CAAC,QAAQ,CAAC;wBACb,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;wBAClE,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;wBAClE,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;wBAC9E,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACnE,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBAChF,MAAM;YACR,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;oBACrC,qEAAqE;oBACrE,4DAA4D;oBAC5D,gCAAgC;gBAClC,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;oBAC9C,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBAC1C,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;oBAC7C,MAAM,IAAI,GAAG,YAAY,KAAK,CAAC,IAAI,IAAI,GAAG,MAAM,KAAK,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC;oBAClE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;oBAC7C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;gBACpE,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,eAAe,CACpC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,CAAC,KAAK,aAAa,CACzE,CAAC;gBACJ,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;gBAC3E,MAAM;YACR,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;gBACtF,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;gBAChE,MAAM;YACR,CAAC;YACD,KAAK,mBAAmB,CAAC,CAAC,CAAC;gBACzB,qEAAqE;gBACrE,mEAAmE;gBACnE,qEAAqE;gBACrE,MAAM,eAAe,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;gBACrD,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;oBAClC,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAC1B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC5E,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBACvC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;oBACxB,IAAI,OAAO,IAAI,EAAE,MAAM,KAAK,QAAQ,EAAE,CAAC;wBACrC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAChD,CAAC;oBACD,IAAI,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ,EAAE,CAAC;wBACpC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC9C,CAAC;oBACD,wEAAwE;oBACxE,sEAAsE;oBACtE,0EAA0E;oBAC1E,IAAI,OAAO,IAAI,EAAE,UAAU,KAAK,SAAS,EAAE,CAAC;wBAC1C,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;wBAC3D,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;4BAC1E,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;4BAC9E,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAC9B,IAAI,UAAU,CAAC,6BAA6B,KAAK,EAAE,EAAE,SAAS,CAAC,CAChE,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,MAAM;YACR,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACR,oEAAoE;gBACpE,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAkB;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,0EAA0E;QAC1E,2EAA2E;QAC3E,2EAA2E;QAC3E,uEAAuE;QACvE,2EAA2E;QAC3E,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,yEAAyE;QACzE,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;QACpD,IAAI,mBAAmB,CAAC,SAAS,CAAC,KAAK,mBAAmB,CAAC,aAAa,CAAC,EAAE,CAAC;YAC1E,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC;aAAM,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/E,gEAAgE;YAChE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACtD,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,oEAAoE;YACpE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;IAC/B,CAAC;IAED,6EAA6E;IAC7E,MAAM;QACJ,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAClC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;IACvC,CAAC;IAED,iFAAiF;IACzE,WAAW,CAAC,IAAY;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACvC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAClC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAEO,aAAa;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,gBAAgB,CAAC;QAClE,IAAI,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAC5B,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC,EAAE,QAAQ,CAAC,CAAC;QACb,oDAAoD;QACpD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;IAC5B,CAAC;IAEO,SAAS;QACf,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;IAC/B,CAAC;IAEO,gBAAgB;QACtB,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;YACzC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,IAAI,KAAK,CAAC,CAAC;YACjF,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACK,kBAAkB;QACxB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;IAEO,kBAAkB;QACxB,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAClC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC9B,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,KAAK,CAAC;YACjC,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACxC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBACxD,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;gBAC5C,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/F,CAAC;YACD,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAChC,CAAC;IACH,CAAC;IAEO,KAAK;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5C,CAAC;CACF;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,0BAA0B,GAAG,kBAAkB,CAAC;AAEtD,SAAS,qBAAqB,CAAC,KAAkC;IAC/D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,IACE,KAAK,CAAC,IAAI,KAAK,0BAA0B;QACzC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,0BAA0B;QACxD,QAAQ,KAAK,0BAA0B,EACvC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAAG,QAAQ,KAAK,0BAA0B;QAC1D,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,QAAQ,CAAC;IACb,MAAM,KAAK,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,qBAAqB,oBAAoB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC5H,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC3C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,UAAU,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;IACnD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,iBAAiB,GAAG,WAAW,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IACjE,IAAI,iBAAiB,KAAK,SAAS,IAAI,YAAY,KAAK,eAAe,EAAE,CAAC;QACxE,KAAK,CAAC,IAAI,CAAC,YAAY,iBAAiB,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAyC;IAC1E,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACpD,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC5E,OAAO,GAAG,QAAQ,OAAO,OAAO,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;IACrD,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACpE,OAAO,GAAG,IAAI,OAAO,OAAO,EAAE,CAAC;IACjC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,MAA2C,EAAE,GAAW;IAC3E,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;AACpD,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC"}
@@ -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"}