@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
package/dist/ui/app.js ADDED
@@ -0,0 +1,586 @@
1
+ import { Container, matchesKey, SelectList, Text, TUI } from "@earendil-works/pi-tui";
2
+ import { EFFORT_LEVELS } from "@mono-agent/config";
3
+ import { discoverInstances, resolveInstanceApiKey, toInstance } from "../data/instances.js";
4
+ import { RemoteAgentResponder } from "../remote/client.js";
5
+ import { selectListTheme, styles } from "./theme.js";
6
+ import { StatusBar } from "./components/status-bar.js";
7
+ import { ChatView } from "./views/chat.js";
8
+ import { ConfigView } from "./views/config.js";
9
+ import { PickerView } from "./views/picker.js";
10
+ import { ReplayView } from "./views/replay.js";
11
+ const VIEW_ORDER = ["chat", "replay", "config", "picker"];
12
+ /** Sentinel `SelectItem.value` for the model picker's "clear override" row (never a real model ref). */
13
+ const MODEL_PICKER_DEFAULT_VALUE = "tui-model-picker:__default__";
14
+ /** Sentinel `SelectItem.value` for the effort picker's "clear override" row (never a real level). */
15
+ const EFFORT_PICKER_DEFAULT_VALUE = "tui-effort-picker:__default__";
16
+ /**
17
+ * The effort a toggle-reasoning model's "thinking on" row sends: `"high"` maps
18
+ * to thinking-on via the harness's `thinkingLevelForEffort`. "thinking off"
19
+ * sends `"none"` (→ thinking-off). A toggle model has no graded levels, so
20
+ * these two + the clear-override row are all it offers.
21
+ */
22
+ const TOGGLE_THINKING_ON_EFFORT = "high";
23
+ const TOGGLE_THINKING_OFF_EFFORT = "none";
24
+ /**
25
+ * Root controller: owns the pi-tui instance, the view stack, connection state,
26
+ * and global keys (view cycling, cancel, quit, thinking toggle, help).
27
+ */
28
+ export class MonoAgentTuiApp {
29
+ tui;
30
+ options;
31
+ header = new Text("", 1, 0);
32
+ viewHost = new Container();
33
+ statusBar = new StatusBar();
34
+ chat;
35
+ picker;
36
+ replay;
37
+ config;
38
+ view = "chat";
39
+ helpVisible = false;
40
+ helpHandle;
41
+ /** Candidate models advertised by the connected agent's `/v1/info` (primary first, then fallbacks). */
42
+ availableModels = [];
43
+ /** Per-model effort/reasoning/mode/label options from `/v1/info` (keyed by model ref); drives the model-aware effort picker + `/model` row annotations. */
44
+ modelOptions = {};
45
+ /** The connected agent's own default model ref (from `/v1/info`) — the effort picker's effective model when no `/model` override is active. */
46
+ agentModel;
47
+ /** The single open picker overlay (model or effort); only one at a time. */
48
+ activePicker;
49
+ ctrlCArmedAt = 0;
50
+ exitResolve;
51
+ exitPromise;
52
+ stopped = false;
53
+ constructor(options) {
54
+ this.options = options;
55
+ this.tui = new TUI(options.terminal);
56
+ this.exitPromise = new Promise((resolve) => {
57
+ this.exitResolve = resolve;
58
+ });
59
+ this.chat = new ChatView({
60
+ tui: this.tui,
61
+ statusBar: this.statusBar,
62
+ conversationId: options.conversationId ?? "tui-local",
63
+ ...(options.history === undefined ? {} : { history: options.history }),
64
+ slashCommands: SLASH_COMMANDS,
65
+ onSlashCommand: (command, args) => this.handleSlashCommand(command, args),
66
+ ...(options.logger === undefined ? {} : { logger: options.logger }),
67
+ ...(options.flushIntervalMs === undefined ? {} : { flushIntervalMs: options.flushIntervalMs }),
68
+ });
69
+ this.picker = new PickerView({
70
+ onSelect: (instance) => void this.connectTo(instance),
71
+ onRefresh: () => void this.refreshInstances(),
72
+ });
73
+ this.replay = new ReplayView({ tui: this.tui });
74
+ this.config = new ConfigView({ tui: this.tui, env: options.env ?? process.env });
75
+ this.tui.addChild(this.header);
76
+ this.tui.addChild(this.viewHost);
77
+ this.tui.addChild(this.statusBar);
78
+ this.tui.addInputListener((data) => this.handleGlobalInput(data));
79
+ this.applyStaticIdentity();
80
+ this.wireInitialMode();
81
+ }
82
+ start() {
83
+ this.tui.start();
84
+ this.showView(this.view);
85
+ }
86
+ async waitUntilExit() {
87
+ await this.exitPromise;
88
+ }
89
+ stop() {
90
+ if (this.stopped) {
91
+ return;
92
+ }
93
+ this.stopped = true;
94
+ this.chat.cancelActiveTurn();
95
+ this.tui.stop();
96
+ this.exitResolve?.();
97
+ }
98
+ showView(view) {
99
+ this.view = view;
100
+ this.viewHost.clear();
101
+ const component = view === "chat" ? this.chat : view === "picker" ? this.picker : view === "replay" ? this.replay : this.config;
102
+ this.viewHost.addChild(component);
103
+ this.tui.setFocus(view === "chat" ? this.chat.editor : component);
104
+ this.updateHeader();
105
+ this.tui.requestRender();
106
+ }
107
+ wireInitialMode() {
108
+ const { responder, connection, discovery, instance } = this.options;
109
+ if (responder !== undefined) {
110
+ this.chat.setResponder(responder);
111
+ }
112
+ else if (connection !== undefined) {
113
+ const remote = new RemoteAgentResponder({
114
+ baseUrl: connection.baseUrl,
115
+ ...(connection.apiKey === undefined ? {} : { apiKey: connection.apiKey }),
116
+ });
117
+ this.chat.setResponder(remote);
118
+ void remote
119
+ .info()
120
+ .then((info) => {
121
+ this.applyAgentInfo(info);
122
+ this.tui.requestRender();
123
+ })
124
+ .catch((error) => {
125
+ this.chat.addNotice(`Could not reach the agent: ${error instanceof Error ? error.message : String(error)}`, "error");
126
+ });
127
+ }
128
+ if (instance?.artifactDir !== undefined) {
129
+ this.replay.setArtifactDir(instance.artifactDir);
130
+ }
131
+ const configPath = instance?.configPath ?? this.options.config?.path;
132
+ if (configPath !== undefined) {
133
+ this.config.setConfigPath(configPath, this.options.config?.cwd);
134
+ }
135
+ if (discovery !== undefined && responder === undefined && connection === undefined) {
136
+ this.view = "picker";
137
+ void this.refreshInstances();
138
+ }
139
+ if (this.options.initialStatusText !== undefined) {
140
+ this.statusBar.setEphemeral(this.options.initialStatusText);
141
+ }
142
+ }
143
+ async refreshInstances() {
144
+ const discovery = this.options.discovery;
145
+ const result = await discoverInstances({
146
+ ...(discovery?.registryDir === undefined ? {} : { registryDir: discovery.registryDir }),
147
+ ...(discovery?.registryDirs === undefined ? {} : { registryDirs: discovery.registryDirs }),
148
+ ...(discovery?.staleAfterMs === undefined ? {} : { staleAfterMs: discovery.staleAfterMs }),
149
+ env: this.options.env ?? process.env,
150
+ }).catch((error) => {
151
+ this.options.logger?.error?.("tui.discovery.failed", {
152
+ message: error instanceof Error ? error.message : String(error),
153
+ });
154
+ const registryDirs = discovery?.registryDirs ?? (discovery?.registryDir === undefined ? [] : [discovery.registryDir]);
155
+ return { instances: [], registryDir: registryDirs[0] ?? "", registryDirs, warnings: [] };
156
+ });
157
+ this.picker.setInstances(result.instances, result.registryDirs.join(", "));
158
+ this.tui.requestRender();
159
+ }
160
+ async connectTo(instance) {
161
+ // A newly selected agent ends the previous agent's session-scoped /model
162
+ // and /effort overrides right away -- synchronously, before any async info() round
163
+ // trip. `applyAgentInfo` alone is NOT a sufficient choke point here: it
164
+ // only runs once `info()` resolves successfully, but `setResponder` below
165
+ // (has-endpoint branch) happens before that await, so a turn submitted
166
+ // while info() is still in flight -- or after it fails -- would otherwise
167
+ // still carry the old agent's override to the new one.
168
+ this.chat.setModelOverride(undefined);
169
+ this.chat.setEffortOverride(undefined);
170
+ const normalized = toInstance(instance.source);
171
+ if (normalized.tuiBaseUrl === undefined) {
172
+ this.statusBar.setEphemeral("selected agent has no tui endpoint — replay/config only");
173
+ this.chat.setResponder(undefined);
174
+ }
175
+ else {
176
+ const apiKey = await resolveInstanceApiKey(normalized, this.options.env ?? process.env);
177
+ const remote = new RemoteAgentResponder({
178
+ baseUrl: normalized.tuiBaseUrl,
179
+ ...(apiKey === undefined ? {} : { apiKey }),
180
+ });
181
+ this.chat.setResponder(remote);
182
+ void remote
183
+ .info()
184
+ .then((info) => {
185
+ this.applyAgentInfo(info);
186
+ this.tui.requestRender();
187
+ })
188
+ .catch(() => undefined);
189
+ }
190
+ this.statusBar.setIdentity(instance.source.label);
191
+ // artifactDir is a required manifest field and stands on its own — replay
192
+ // must not be gated on the optional configPath (agentDir derives from it).
193
+ this.replay.setArtifactDir(instance.source.artifactDir);
194
+ this.config.setConfigPath(instance.source.configPath, normalized.agentDir);
195
+ this.chat.addInfo(`connected to ${instance.source.label}`);
196
+ this.showView("chat");
197
+ }
198
+ /**
199
+ * Apply a `/v1/info` snapshot's model/effort to the status bar. Unlike the
200
+ * per-turn finish-metadata correction in ChatView (a delta that never
201
+ * clears), `info` is a full snapshot of the *newly selected agent* — an
202
+ * absent `effort` here means this agent genuinely has none configured, so
203
+ * clearing is correct: otherwise a stale effort from a previously
204
+ * connected agent would misattribute to this one.
205
+ */
206
+ applyAgentInfo(info) {
207
+ // Routed through ChatView (not statusBar directly) so it can remember these
208
+ // as the agent's defaults -- what a later /model|/effort default repaints
209
+ // to, instead of leaving the last override string shown.
210
+ this.chat.setDefaultEffort(info.effort);
211
+ this.agentModel = info.model;
212
+ if (info.model !== undefined) {
213
+ this.chat.setDefaultModel(info.model);
214
+ }
215
+ // A full snapshot of the newly selected agent: an absent list/map means
216
+ // this agent advertises none, so replace (not merge) — stale entries from a
217
+ // previously connected agent must not leak into this one's pickers.
218
+ this.availableModels = info.models ?? [];
219
+ this.modelOptions = info.modelOptions ?? {};
220
+ }
221
+ applyStaticIdentity() {
222
+ const identity = this.options.instance?.label ?? this.options.title ?? "";
223
+ if (identity.length > 0) {
224
+ this.statusBar.setIdentity(identity);
225
+ }
226
+ this.updateHeader();
227
+ }
228
+ updateHeader() {
229
+ const title = this.options.title ?? "mono-agent";
230
+ const subtitle = this.options.subtitle === undefined ? "" : ` ${styles.dim(this.options.subtitle)}`;
231
+ const tabs = VIEW_ORDER.map((view) => view === this.view ? styles.bold(styles.accent(`[${view}]`)) : styles.dim(view)).join(" ");
232
+ this.header.setText(`${styles.bold(title)}${subtitle} ${tabs}`);
233
+ }
234
+ handleGlobalInput(data) {
235
+ // Quit: double ctrl+c (single press arms + hints, mirrors pi's behavior).
236
+ if (matchesKey(data, "ctrl+c")) {
237
+ const now = Date.now();
238
+ if (now - this.ctrlCArmedAt < 1_500) {
239
+ this.stop();
240
+ }
241
+ else {
242
+ this.ctrlCArmedAt = now;
243
+ this.statusBar.setEphemeral("press ctrl+c again to quit");
244
+ this.tui.requestRender();
245
+ }
246
+ return { consume: true };
247
+ }
248
+ // The model/effort picker overlay is a modal: forward navigation/confirm to
249
+ // its SelectList, esc cancels, and every other key is swallowed. This mirrors
250
+ // replay.ts's key-capture pattern -- deliberately NOT the help overlay's
251
+ // "any key closes" behaviour, which would dismiss the picker on arrows.
252
+ if (this.activePicker !== undefined) {
253
+ if (matchesKey(data, "escape")) {
254
+ this.closePicker();
255
+ return { consume: true };
256
+ }
257
+ if (matchesKey(data, "up") ||
258
+ matchesKey(data, "down") ||
259
+ matchesKey(data, "pageUp") ||
260
+ matchesKey(data, "pageDown") ||
261
+ matchesKey(data, "enter")) {
262
+ this.activePicker.list.handleInput(data);
263
+ // A consumed key never reaches pi-tui's focused-component path (which is
264
+ // what would otherwise schedule a paint), and SelectList.handleInput does
265
+ // not self-render -- so without this the moved cursor never repaints in an
266
+ // idle session (a streaming turn's animation would mask it, which is why it
267
+ // only looks frozen once the conversation has gone quiet).
268
+ this.tui.requestRender();
269
+ return { consume: true };
270
+ }
271
+ return { consume: true };
272
+ }
273
+ if (this.helpVisible) {
274
+ this.hideHelp();
275
+ return { consume: true };
276
+ }
277
+ if (matchesKey(data, "escape")) {
278
+ if (this.view === "chat" && this.chat.cancelActiveTurn()) {
279
+ this.statusBar.setEphemeral("cancelling…");
280
+ this.tui.requestRender();
281
+ return { consume: true };
282
+ }
283
+ if (this.view === "replay" && this.replay.back()) {
284
+ return { consume: true };
285
+ }
286
+ if (this.view !== "chat") {
287
+ this.showView("chat");
288
+ return { consume: true };
289
+ }
290
+ return undefined; // Editor may use Esc (autocomplete dismiss).
291
+ }
292
+ if (matchesKey(data, "tab") && this.globalShortcutsAllowedInChat()) {
293
+ // In chat with unsubmitted text, Tab belongs to the editor
294
+ // (autocomplete); an empty buffer has nothing to lose, so Tab cycles
295
+ // views there too.
296
+ this.cycleView(1);
297
+ return { consume: true };
298
+ }
299
+ if (matchesKey(data, "shift+tab")) {
300
+ this.cycleView(-1);
301
+ return { consume: true };
302
+ }
303
+ if (matchesKey(data, "f2")) {
304
+ this.showView("chat");
305
+ return { consume: true };
306
+ }
307
+ if (matchesKey(data, "f3")) {
308
+ this.showView("replay");
309
+ return { consume: true };
310
+ }
311
+ if (matchesKey(data, "f4")) {
312
+ this.showView("config");
313
+ return { consume: true };
314
+ }
315
+ if (matchesKey(data, "f5")) {
316
+ this.showView("picker");
317
+ return { consume: true };
318
+ }
319
+ if (matchesKey(data, "ctrl+t")) {
320
+ this.chat.toggleThinkingExpanded();
321
+ return { consume: true };
322
+ }
323
+ if (data === "?" && this.globalShortcutsAllowedInChat()) {
324
+ this.showHelp();
325
+ return { consume: true };
326
+ }
327
+ return undefined;
328
+ }
329
+ /**
330
+ * Tab/`?` act as global shortcuts (view cycling, help) everywhere except
331
+ * chat with unsubmitted editor text -- there they pass through to the
332
+ * editor instead (autocomplete completion / literal `?`). Shared by both
333
+ * keys so the "empty editor" exception can't drift out of sync between them.
334
+ */
335
+ globalShortcutsAllowedInChat() {
336
+ return this.view !== "chat" || this.chat.isEditorEmpty();
337
+ }
338
+ cycleView(direction) {
339
+ const index = VIEW_ORDER.indexOf(this.view);
340
+ const next = VIEW_ORDER[(index + direction + VIEW_ORDER.length) % VIEW_ORDER.length] ?? "chat";
341
+ this.showView(next);
342
+ }
343
+ handleSlashCommand(command, args) {
344
+ switch (command) {
345
+ case "help":
346
+ this.showHelp();
347
+ return true;
348
+ case "quit":
349
+ case "exit":
350
+ this.stop();
351
+ return true;
352
+ case "agents":
353
+ this.showView("picker");
354
+ void this.refreshInstances();
355
+ return true;
356
+ case "replay":
357
+ this.showView("replay");
358
+ return true;
359
+ case "config":
360
+ this.showView("config");
361
+ return true;
362
+ case "cancel":
363
+ if (!this.chat.cancelActiveTurn()) {
364
+ this.statusBar.setEphemeral("no turn in flight");
365
+ this.tui.requestRender();
366
+ }
367
+ return true;
368
+ case "thinking":
369
+ this.chat.toggleThinkingExpanded();
370
+ return true;
371
+ case "model":
372
+ this.handleModelCommand(args);
373
+ return true;
374
+ case "effort":
375
+ this.handleEffortCommand(args);
376
+ return true;
377
+ case "new": {
378
+ this.chat.addInfo(`conversation continues under a fresh screen${args.length > 0 ? ` (${args})` : ""}`);
379
+ return true;
380
+ }
381
+ default:
382
+ return false;
383
+ }
384
+ }
385
+ showHelp() {
386
+ const help = new Text([
387
+ styles.bold("mono-agent tui"),
388
+ "",
389
+ `${styles.accent("f2/f3/f4/f5")} chat / replay / config / agents`,
390
+ `${styles.accent("tab")} next view (chat: only when the editor is empty) · ${styles.accent("shift+tab")} previous`,
391
+ `${styles.accent("esc")} cancel in-flight turn · back`,
392
+ `${styles.accent("ctrl+t")} expand/collapse thinking`,
393
+ `${styles.accent("ctrl+c ×2")} quit`,
394
+ "",
395
+ `${styles.accent("replay list")} s source filter · x status filter · r refresh`,
396
+ `${styles.accent("replay detail")} ↑↓/pgup/pgdn/g/G step · [ ] turn · t/o/m/y/e/a filter · / search · n/N match · enter raw json · esc layers back`,
397
+ "",
398
+ `${styles.accent("/model")} override this session's model — ${styles.accent("/model <ref>")} or a bare ${styles.accent("/model")} picker; ${styles.accent("/model default")} clears it`,
399
+ styles.dim("an override to a different model runs each turn as a fresh provider session"),
400
+ `${styles.accent("/effort")} override this session's effort — ${styles.accent("/effort <level>")} or a bare ${styles.accent("/effort")} picker; ${styles.accent("/effort default")} clears it`,
401
+ styles.dim("effort options are model-specific"),
402
+ "",
403
+ `${styles.accent("/help /agents /replay /config /cancel /thinking /model /effort /quit")}`,
404
+ "",
405
+ styles.dim("any key closes this help"),
406
+ ].join("\n"), 2, 1);
407
+ this.helpHandle = this.tui.showOverlay(help, { anchor: "center", width: 64 });
408
+ this.helpVisible = true;
409
+ this.tui.requestRender();
410
+ }
411
+ hideHelp() {
412
+ this.helpHandle?.hide();
413
+ this.helpHandle = undefined;
414
+ this.helpVisible = false;
415
+ this.tui.requestRender();
416
+ }
417
+ /**
418
+ * `/model` — with an argument, set (or, for `default`, clear) the session
419
+ * model override directly; with no argument, open the picker overlay. An
420
+ * override to a different model runs each turn as a fresh provider session.
421
+ */
422
+ handleModelCommand(args) {
423
+ const arg = args.trim();
424
+ if (arg.length > 0) {
425
+ const override = arg === "default" ? undefined : arg;
426
+ this.chat.setModelOverride(override);
427
+ this.statusBar.setEphemeral(override === undefined ? "model override cleared" : `model override → ${override}`);
428
+ this.tui.requestRender();
429
+ return;
430
+ }
431
+ this.showModelPicker();
432
+ }
433
+ showModelPicker() {
434
+ if (this.activePicker !== undefined) {
435
+ return; // Already open.
436
+ }
437
+ if (this.availableModels.length === 0) {
438
+ // Older agents (or embedded mode) advertise no candidate list; the direct
439
+ // form still works. Use a persistent transcript notice (not a transient
440
+ // ephemeral) so it doesn't read as "the picker is broken".
441
+ this.chat.addNotice("Model picker unavailable — this agent advertises no model list. Use /model <ref>, or update and restart the agent.", "warning");
442
+ this.tui.requestRender();
443
+ return;
444
+ }
445
+ const current = this.chat.getModelOverride();
446
+ const items = this.availableModels.map((model) => {
447
+ const opts = this.modelOptions[model];
448
+ // Prefer the friendly label for discovered local models; keep the ref as
449
+ // the selection value so the override contract is unchanged. A dim
450
+ // "· no thinking" flags models that don't support reasoning/effort.
451
+ const base = opts?.label ?? model;
452
+ const noThinking = opts?.reasoning === false ? styles.dim(" · no thinking") : "";
453
+ return { value: model, label: `${withCurrentMarker(base, model === current)}${noThinking}` };
454
+ });
455
+ items.push({
456
+ value: MODEL_PICKER_DEFAULT_VALUE,
457
+ label: withCurrentMarker("— default (clear override) —", current === undefined),
458
+ });
459
+ this.openPickerOverlay("Session model override", items, (item) => {
460
+ const choice = item.value === MODEL_PICKER_DEFAULT_VALUE ? undefined : item.value;
461
+ this.chat.setModelOverride(choice);
462
+ this.statusBar.setEphemeral(choice === undefined ? "model override cleared" : `model override → ${choice}`);
463
+ });
464
+ }
465
+ /**
466
+ * `/effort` — with an argument, set (or, for `default`, clear) the session
467
+ * effort override directly; with no argument, open the model-aware picker.
468
+ */
469
+ handleEffortCommand(args) {
470
+ const arg = args.trim();
471
+ if (arg.length > 0) {
472
+ const override = arg === "default" ? undefined : arg;
473
+ this.chat.setEffortOverride(override);
474
+ this.statusBar.setEphemeral(override === undefined ? "effort override cleared" : `effort override → ${override}`);
475
+ this.tui.requestRender();
476
+ return;
477
+ }
478
+ this.showEffortPicker();
479
+ }
480
+ /**
481
+ * Model-aware effort picker: the effective model is the `/model` override if
482
+ * set, else the agent's default. The rows depend on that model's advertised
483
+ * `reasoningMode`:
484
+ * - `reasoning: false` / mode `"none"` / empty `effortLevels` → no adjustable
485
+ * effort, so we surface a persistent notice instead of an empty picker.
486
+ * - mode `"toggle"` (binary-thinking local models, e.g. Ollama qwen3.6) → a
487
+ * two-row on/off picker; graded levels would misrepresent the model.
488
+ * - mode `"effort"` with `effortLevels` → those graded levels (local models).
489
+ * - no mode / no levels (cloud models) → the global {@link EFFORT_LEVELS} enum.
490
+ */
491
+ showEffortPicker() {
492
+ if (this.activePicker !== undefined) {
493
+ return; // Already open.
494
+ }
495
+ const effectiveModel = this.chat.getModelOverride() ?? this.agentModel;
496
+ const opts = effectiveModel === undefined ? undefined : this.modelOptions[effectiveModel];
497
+ const unsupported = opts !== undefined &&
498
+ (opts.reasoning === false ||
499
+ opts.reasoningMode === "none" ||
500
+ (opts.effortLevels !== undefined && opts.effortLevels.length === 0));
501
+ if (unsupported) {
502
+ const name = opts?.label ?? effectiveModel ?? "This model";
503
+ this.chat.addNotice(`${name} does not support adjustable thinking/effort`, "warning");
504
+ this.tui.requestRender();
505
+ return;
506
+ }
507
+ const current = this.chat.getEffortOverride();
508
+ // A toggle-reasoning model supports only on/off, so offer exactly that; an
509
+ // existing non-"none" override reads as "on". Effort-mode + cloud models
510
+ // keep the graded levels (per-model when advertised, else the global enum).
511
+ const items = opts?.reasoningMode === "toggle"
512
+ ? [
513
+ {
514
+ value: TOGGLE_THINKING_ON_EFFORT,
515
+ label: withCurrentMarker("thinking on", current !== undefined && current !== TOGGLE_THINKING_OFF_EFFORT),
516
+ },
517
+ {
518
+ value: TOGGLE_THINKING_OFF_EFFORT,
519
+ label: withCurrentMarker("thinking off", current === TOGGLE_THINKING_OFF_EFFORT),
520
+ },
521
+ ]
522
+ : (opts?.effortLevels ?? EFFORT_LEVELS).map((level) => ({
523
+ value: level,
524
+ label: withCurrentMarker(level, level === current),
525
+ }));
526
+ items.push({
527
+ value: EFFORT_PICKER_DEFAULT_VALUE,
528
+ label: withCurrentMarker("— default (clear override) —", current === undefined),
529
+ });
530
+ this.openPickerOverlay("Session effort override", items, (item) => {
531
+ const choice = item.value === EFFORT_PICKER_DEFAULT_VALUE ? undefined : item.value;
532
+ this.chat.setEffortOverride(choice);
533
+ this.statusBar.setEphemeral(choice === undefined ? "effort override cleared" : `effort override → ${choice}`);
534
+ });
535
+ }
536
+ /**
537
+ * Open a modal select overlay (the model and effort pickers share this).
538
+ * `onChoose` handles the picked item; the overlay always closes afterward.
539
+ * nonCapturing keeps input routed through the global listener (which drives
540
+ * the list explicitly and swallows the rest), so the overlay never contends
541
+ * for focus with the chat editor underneath it.
542
+ */
543
+ openPickerOverlay(title, items, onChoose) {
544
+ const list = new SelectList(items, 10, selectListTheme);
545
+ list.onSelect = (item) => {
546
+ onChoose(item);
547
+ this.closePicker();
548
+ };
549
+ list.onCancel = () => this.closePicker();
550
+ // The current choice is called out by its `(current)` label; the cursor
551
+ // opens at the top so navigation is predictable regardless of which entry
552
+ // is current.
553
+ list.setSelectedIndex(0);
554
+ const overlay = new Container();
555
+ overlay.addChild(new Text(styles.bold(title), 1, 0));
556
+ overlay.addChild(list);
557
+ overlay.addChild(new Text(styles.dim("↑↓ move · enter select · esc cancel"), 1, 0));
558
+ this.activePicker = {
559
+ handle: this.tui.showOverlay(overlay, { anchor: "center", width: 64, nonCapturing: true }),
560
+ list,
561
+ };
562
+ this.tui.requestRender();
563
+ }
564
+ closePicker() {
565
+ this.activePicker?.handle.hide();
566
+ this.activePicker = undefined;
567
+ this.tui.requestRender();
568
+ }
569
+ }
570
+ /** `<label> (current)` when this row is the active override, else `<label>`. */
571
+ function withCurrentMarker(label, isCurrent) {
572
+ return isCurrent ? `${label} (current)` : label;
573
+ }
574
+ const SLASH_COMMANDS = [
575
+ { name: "help", description: "Show keybindings and commands" },
576
+ { name: "agents", description: "Pick another running agent" },
577
+ { name: "replay", description: "Browse recorded runs (full event timeline)" },
578
+ { name: "config", description: "Read-only resolved config" },
579
+ { name: "cancel", description: "Cancel the in-flight turn" },
580
+ { name: "thinking", description: "Expand/collapse thinking blocks" },
581
+ { name: "model", description: "Override this session's model (no arg opens a picker)" },
582
+ { name: "effort", description: "Override this session's effort (no arg opens a model-aware picker)" },
583
+ { name: "new", description: "Visual break in the transcript" },
584
+ { name: "quit", description: "Exit the TUI" },
585
+ ];
586
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/ui/app.ts"],"names":[],"mappings":"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"}