@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.
- package/README.md +60 -10
- package/dist/bin/cli.d.ts +4 -1
- package/dist/bin/cli.d.ts.map +1 -1
- package/dist/bin/cli.js +36 -53
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/mono-agent-tui.js +21 -10
- package/dist/bin/mono-agent-tui.js.map +1 -1
- package/dist/config/pane.d.ts +9 -9
- package/dist/config/pane.d.ts.map +1 -1
- package/dist/config/pane.js +15 -196
- package/dist/config/pane.js.map +1 -1
- package/dist/data/instances.d.ts +48 -0
- package/dist/data/instances.d.ts.map +1 -0
- package/dist/data/instances.js +101 -0
- package/dist/data/instances.js.map +1 -0
- package/dist/data/replay.d.ts +68 -0
- package/dist/data/replay.d.ts.map +1 -0
- package/dist/data/replay.js +149 -0
- package/dist/data/replay.js.map +1 -0
- package/dist/index.d.ts +10 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/remote/client.d.ts +44 -0
- package/dist/remote/client.d.ts.map +1 -0
- package/dist/remote/client.js +173 -0
- package/dist/remote/client.js.map +1 -0
- package/dist/runtime/start.d.ts +11 -18
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +19 -33
- package/dist/runtime/start.js.map +1 -1
- package/dist/ui/app.d.ts +142 -0
- package/dist/ui/app.d.ts.map +1 -0
- package/dist/ui/app.js +586 -0
- package/dist/ui/app.js.map +1 -0
- package/dist/ui/components/event-list.d.ts +60 -0
- package/dist/ui/components/event-list.d.ts.map +1 -0
- package/dist/ui/components/event-list.js +369 -0
- package/dist/ui/components/event-list.js.map +1 -0
- package/dist/ui/components/status-bar.d.ts +65 -0
- package/dist/ui/components/status-bar.d.ts.map +1 -0
- package/dist/ui/components/status-bar.js +126 -0
- package/dist/ui/components/status-bar.js.map +1 -0
- package/dist/ui/components/tool-panel.d.ts +30 -0
- package/dist/ui/components/tool-panel.d.ts.map +1 -0
- package/dist/ui/components/tool-panel.js +59 -0
- package/dist/ui/components/tool-panel.js.map +1 -0
- package/dist/ui/components/transcript-cells.d.ts +49 -0
- package/dist/ui/components/transcript-cells.d.ts.map +1 -0
- package/dist/ui/components/transcript-cells.js +110 -0
- package/dist/ui/components/transcript-cells.js.map +1 -0
- package/dist/ui/format.d.ts +29 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +105 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/theme.d.ts +25 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +62 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/turn-presenter.d.ts +72 -0
- package/dist/ui/turn-presenter.d.ts.map +1 -0
- package/dist/ui/turn-presenter.js +334 -0
- package/dist/ui/turn-presenter.js.map +1 -0
- package/dist/ui/views/chat.d.ts +128 -0
- package/dist/ui/views/chat.d.ts.map +1 -0
- package/dist/ui/views/chat.js +313 -0
- package/dist/ui/views/chat.js.map +1 -0
- package/dist/ui/views/config.d.ts +23 -0
- package/dist/ui/views/config.d.ts.map +1 -0
- package/dist/ui/views/config.js +87 -0
- package/dist/ui/views/config.js.map +1 -0
- package/dist/ui/views/picker.d.ts +17 -0
- package/dist/ui/views/picker.d.ts.map +1 -0
- package/dist/ui/views/picker.js +57 -0
- package/dist/ui/views/picker.js.map +1 -0
- package/dist/ui/views/replay-detail.d.ts +60 -0
- package/dist/ui/views/replay-detail.d.ts.map +1 -0
- package/dist/ui/views/replay-detail.js +328 -0
- package/dist/ui/views/replay-detail.js.map +1 -0
- package/dist/ui/views/replay.d.ts +74 -0
- package/dist/ui/views/replay.d.ts.map +1 -0
- package/dist/ui/views/replay.js +460 -0
- package/dist/ui/views/replay.js.map +1 -0
- package/package.json +9 -12
- package/dist/agent/message-stream.d.ts +0 -52
- package/dist/agent/message-stream.d.ts.map +0 -1
- package/dist/agent/message-stream.js +0 -110
- package/dist/agent/message-stream.js.map +0 -1
- package/dist/components/ChatPane.d.ts +0 -20
- package/dist/components/ChatPane.d.ts.map +0 -1
- package/dist/components/ChatPane.js +0 -142
- package/dist/components/ChatPane.js.map +0 -1
- package/dist/components/ConfigPane.d.ts +0 -12
- package/dist/components/ConfigPane.d.ts.map +0 -1
- package/dist/components/ConfigPane.js +0 -70
- package/dist/components/ConfigPane.js.map +0 -1
- package/dist/components/HelpOverlay.d.ts +0 -6
- package/dist/components/HelpOverlay.d.ts.map +0 -1
- package/dist/components/HelpOverlay.js +0 -18
- package/dist/components/HelpOverlay.js.map +0 -1
- package/dist/components/HistoryPane.d.ts +0 -9
- package/dist/components/HistoryPane.d.ts.map +0 -1
- package/dist/components/HistoryPane.js +0 -125
- package/dist/components/HistoryPane.js.map +0 -1
- package/dist/components/StatusBar.d.ts +0 -10
- package/dist/components/StatusBar.d.ts.map +0 -1
- package/dist/components/StatusBar.js +0 -15
- package/dist/components/StatusBar.js.map +0 -1
- package/dist/components/TuiApp.d.ts +0 -29
- package/dist/components/TuiApp.d.ts.map +0 -1
- package/dist/components/TuiApp.js +0 -81
- package/dist/components/TuiApp.js.map +0 -1
- package/dist/components/primitives/Badge.d.ts +0 -8
- package/dist/components/primitives/Badge.d.ts.map +0 -1
- package/dist/components/primitives/Badge.js +0 -14
- package/dist/components/primitives/Badge.js.map +0 -1
- package/dist/components/primitives/Spinner.d.ts +0 -6
- package/dist/components/primitives/Spinner.d.ts.map +0 -1
- package/dist/components/primitives/Spinner.js +0 -8
- package/dist/components/primitives/Spinner.js.map +0 -1
- package/dist/components/primitives/TranscriptLine.d.ts +0 -10
- package/dist/components/primitives/TranscriptLine.d.ts.map +0 -1
- package/dist/components/primitives/TranscriptLine.js +0 -15
- package/dist/components/primitives/TranscriptLine.js.map +0 -1
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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"}
|