@sofer_agent/cli 0.3.16 → 0.3.18

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/src/tui.tsx ADDED
@@ -0,0 +1,247 @@
1
+ import { render, useKeyboard, useTerminalDimensions } from "@opentui/solid";
2
+ import type { SoferAgent, SoferConfig } from "@sofer_agent/core";
3
+ import { For, createEffect, createSignal, onCleanup } from "solid-js";
4
+
5
+ const SPINNER_FRAMES = ["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"] as const;
6
+ const SPINNER_MS = 80;
7
+
8
+ export interface TuiState {
9
+ rows: ReturnType<typeof createSignal<ChatLine[]>>;
10
+ status: ReturnType<typeof createSignal<"idle" | "thinking">>;
11
+ input: ReturnType<typeof createSignal<string>>;
12
+ info: ReturnType<typeof createSignal<TuiInfo>>;
13
+ spinnerFrame: ReturnType<typeof createSignal<number>>;
14
+ turnStartedAt: ReturnType<typeof createSignal<number | null>>;
15
+ activeAbort: ReturnType<typeof createSignal<AbortController | null>>;
16
+ }
17
+
18
+ export interface ChatLine {
19
+ role: "you" | "agent" | "system" | "error";
20
+ text: string;
21
+ }
22
+
23
+ export interface TuiInfo {
24
+ lastTurnIn: number;
25
+ lastTurnOut: number;
26
+ balance?: string;
27
+ }
28
+
29
+ function formatElapsed(startedAt: number | null): string {
30
+ if (!startedAt) return "";
31
+ const sec = Math.floor((Date.now() - startedAt) / 1000);
32
+ if (sec < 60) return `${sec}s`;
33
+ const m = Math.floor(sec / 60);
34
+ return `${m}m${String(sec % 60).padStart(2, "0")}s`;
35
+ }
36
+
37
+ function shortModel(model: string): string {
38
+ const m = model.toLowerCase();
39
+ if (m.includes("sonnet")) return "sonnet-4";
40
+ if (m.includes("haiku")) return "haiku";
41
+ if (m.includes("opus")) return "opus-4";
42
+ return model.length > 14 ? `${model.slice(0, 13)}…` : model;
43
+ }
44
+
45
+ function App(props: {
46
+ state: TuiState;
47
+ agent: SoferAgent;
48
+ config: SoferConfig;
49
+ onSubmit: (line: string, signal: AbortSignal) => Promise<void>;
50
+ onExit: () => void;
51
+ }) {
52
+ const { state, agent, config } = props;
53
+ const dims = useTerminalDimensions();
54
+
55
+ const [rows] = state.rows;
56
+ const [status] = state.status;
57
+ const [input, setInput] = state.input;
58
+ const [info] = state.info;
59
+ const [spinnerFrame, setSpinnerFrame] = state.spinnerFrame;
60
+ const [turnStartedAt] = state.turnStartedAt;
61
+ const [, setActiveAbort] = state.activeAbort;
62
+ const [activeAbort] = state.activeAbort;
63
+
64
+ createEffect(() => {
65
+ if (status() !== "thinking") { setSpinnerFrame(0); return; }
66
+ const id = setInterval(
67
+ () => setSpinnerFrame((f) => (f + 1) % SPINNER_FRAMES.length),
68
+ SPINNER_MS,
69
+ );
70
+ onCleanup(() => clearInterval(id));
71
+ });
72
+
73
+ useKeyboard((evt) => {
74
+ if (evt.ctrl && evt.name === "c") { evt.preventDefault(); props.onExit(); return; }
75
+
76
+ if (evt.name === "escape") {
77
+ const ab = activeAbort();
78
+ if (ab && !ab.signal.aborted) ab.abort();
79
+ return;
80
+ }
81
+
82
+ if (status() === "thinking") return;
83
+
84
+ if (evt.name === "return") {
85
+ const text = input().trim();
86
+ if (!text) return;
87
+ if (text === "/exit" || text === "/quit") { props.onExit(); return; }
88
+ const ctrl = new AbortController();
89
+ setActiveAbort(ctrl);
90
+ state.rows[1](prev => [...prev, { role: "you", text }]);
91
+ setInput("");
92
+ state.status[1]("thinking");
93
+ state.turnStartedAt[1](Date.now());
94
+ props.onSubmit(text, ctrl.signal).finally(() => {
95
+ state.status[1]("idle");
96
+ state.turnStartedAt[1](null);
97
+ setActiveAbort(null);
98
+ });
99
+ return;
100
+ }
101
+
102
+ if (evt.name === "backspace" || evt.name === "delete") {
103
+ setInput((p) => p.slice(0, -1));
104
+ return;
105
+ }
106
+
107
+ if (evt.sequence && !evt.ctrl && !evt.meta && !evt.option) {
108
+ setInput((p) => p + evt.sequence);
109
+ }
110
+ });
111
+
112
+ const sidebarW = Math.min(30, Math.floor(dims().width * 0.22));
113
+ const chatW = dims().width - sidebarW;
114
+ const addr = () => `${agent.address.slice(0, 6)}…${agent.address.slice(-4)}`;
115
+
116
+ return (
117
+ <box flexDirection="row" width={dims().width} height={dims().height}>
118
+ {/* Chat area */}
119
+ <box flexDirection="column" width={chatW} height={dims().height}>
120
+ <scrollbox
121
+ flexGrow={1}
122
+ flexShrink={1}
123
+ stickyScroll
124
+ stickyStart="bottom"
125
+ contentOptions={{ flexDirection: "column", paddingLeft: 1, paddingRight: 1, paddingTop: 1, paddingBottom: 1 }}
126
+ >
127
+ <For each={rows()}>
128
+ {(line) => {
129
+ const color = line.role === "you" ? "#67e8f9"
130
+ : line.role === "agent" ? "#86efac"
131
+ : line.role === "error" ? "#fca5a5"
132
+ : "#9ca3af";
133
+ const label = line.role === "you" ? "you"
134
+ : line.role === "agent" ? agent.name.toLowerCase().slice(0, 5)
135
+ : line.role === "error" ? "err"
136
+ : "sys";
137
+ return (
138
+ <box flexDirection="row">
139
+ <text fg={color} flexShrink={0}>{` ${label.padEnd(5)} `}</text>
140
+ <text wrapMode="word" flexGrow={1} fg="#e5e7eb">
141
+ {line.text}
142
+ </text>
143
+ </box>
144
+ );
145
+ }}
146
+ </For>
147
+ </scrollbox>
148
+
149
+ <box flexDirection="row" flexShrink={0} paddingLeft={3} paddingRight={2} marginTop={1}>
150
+ <text fg="#67e8f9" flexGrow={1}>
151
+ {(() => {
152
+ if (status() !== "thinking") return " ";
153
+ const frame = SPINNER_FRAMES[spinnerFrame()];
154
+ const elapsed = formatElapsed(turnStartedAt());
155
+ return elapsed
156
+ ? `${frame} thinking… ${elapsed} (esc to interrupt)`
157
+ : `${frame} thinking… (esc to interrupt)`;
158
+ })()}
159
+ </text>
160
+ </box>
161
+
162
+ <box
163
+ flexDirection="row"
164
+ flexShrink={0}
165
+ minHeight={3}
166
+ maxHeight={8}
167
+ borderStyle="rounded"
168
+ borderColor="#374151"
169
+ paddingLeft={1} paddingRight={1}
170
+ marginLeft={2} marginRight={2}
171
+ >
172
+ <text fg="#67e8f9" flexShrink={0}>{"› "}</text>
173
+ <text wrapMode="word" flexGrow={1} fg="#e5e7eb">
174
+ {`${input()}${status() === "idle" ? "▋" : ""}`}
175
+ </text>
176
+ </box>
177
+
178
+ <box flexDirection="row" flexShrink={0} paddingLeft={2} paddingRight={2}>
179
+ <text fg="#9ca3af">
180
+ {[
181
+ addr(),
182
+ config.network,
183
+ shortModel(config.brain.model),
184
+ info().balance ? `${info().balance} SUI` : null,
185
+ `in ${agent.usage.tokens.inputTokens} out ${agent.usage.tokens.outputTokens} $${agent.usage.costUsd.toFixed(4)}`,
186
+ "/exit",
187
+ ].filter(Boolean).join(" · ")}
188
+ </text>
189
+ </box>
190
+ </box>
191
+
192
+ {/* Sidebar */}
193
+ <box
194
+ flexDirection="column"
195
+ width={sidebarW}
196
+ borderStyle="single"
197
+ borderColor="#374151"
198
+ paddingLeft={2} paddingRight={1}
199
+ >
200
+ <text fg="#86efac">{agent.name}</text>
201
+ <text fg="#9ca3af">{addr()}</text>
202
+ <text>{" "}</text>
203
+ <text fg="#6b7280">{"─".repeat(sidebarW - 4)}</text>
204
+ <text fg="#9ca3af">{`network ${config.network}`}</text>
205
+ <text fg="#9ca3af">{`model ${shortModel(config.brain.model)}`}</text>
206
+ {info().balance ? <text fg="#fbbf24">{`balance ${info().balance} SUI`}</text> : null}
207
+ <text>{" "}</text>
208
+ <text fg="#6b7280">{"─".repeat(sidebarW - 4)}</text>
209
+ <text fg="#9ca3af">{`last in ${info().lastTurnIn} out ${info().lastTurnOut}`}</text>
210
+ <text fg="#9ca3af">{`total in ${agent.usage.tokens.inputTokens}`}</text>
211
+ <text fg="#9ca3af">{` out ${agent.usage.tokens.outputTokens}`}</text>
212
+ <text fg="#fbbf24">{` $${agent.usage.costUsd.toFixed(6)}`}</text>
213
+ </box>
214
+ </box>
215
+ );
216
+ }
217
+
218
+ export function createTuiState(): TuiState {
219
+ return {
220
+ rows: createSignal<ChatLine[]>([]),
221
+ status: createSignal<"idle" | "thinking">("idle"),
222
+ input: createSignal(""),
223
+ info: createSignal<TuiInfo>({ lastTurnIn: 0, lastTurnOut: 0 }),
224
+ spinnerFrame: createSignal(0),
225
+ turnStartedAt: createSignal<number | null>(null),
226
+ activeAbort: createSignal<AbortController | null>(null),
227
+ };
228
+ }
229
+
230
+ export async function runTui(
231
+ state: TuiState,
232
+ agent: SoferAgent,
233
+ config: SoferConfig,
234
+ onSubmit: (line: string, signal: AbortSignal) => Promise<void>,
235
+ ): Promise<void> {
236
+ return new Promise<void>((resolve) => {
237
+ render(() => (
238
+ <App
239
+ state={state}
240
+ agent={agent}
241
+ config={config}
242
+ onSubmit={onSubmit}
243
+ onExit={resolve}
244
+ />
245
+ ));
246
+ });
247
+ }
package/dist/tui.js DELETED
@@ -1,350 +0,0 @@
1
- const SIDEBAR_W = 28;
2
- const MIN_CHAT_W = 34;
3
- const GUTTER = " ";
4
- const LABEL_W = 6;
5
- const INDENT = `${GUTTER}${" ".repeat(LABEL_W + 1)}`;
6
- const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
7
- const SPINNER_MS = 80;
8
- const B = {
9
- tl: "╭", tr: "╮", bl: "╰", br: "╯",
10
- h: "─", v: "│",
11
- lt: "├", rt: "┤", tt: "┬", bt: "┴",
12
- };
13
- export class SoferTui {
14
- agent;
15
- config;
16
- state = [];
17
- inputBuf = "";
18
- cursor = 0;
19
- columns = 90;
20
- rows = 28;
21
- chatW = 58;
22
- sideW = 26;
23
- bodyH = 22;
24
- scrollOff = Number.MAX_SAFE_INTEGER;
25
- status = "idle";
26
- spinnerFrame = 0;
27
- spinnerTimer = null;
28
- turnStartedAt = 0;
29
- abortCtrl = null;
30
- info = { lastTurnIn: 0, lastTurnOut: 0 };
31
- resolve = null;
32
- onLine = null;
33
- constructor(agent, config) {
34
- this.agent = agent;
35
- this.config = config;
36
- }
37
- measure() {
38
- this.columns = Math.max(80, process.stdout.columns ?? 80);
39
- this.rows = Math.max(24, process.stdout.rows ?? 24);
40
- this.chatW = Math.min(120, Math.max(MIN_CHAT_W, this.columns - SIDEBAR_W - 3));
41
- this.sideW = this.columns - this.chatW - 3;
42
- this.bodyH = this.rows - 5;
43
- }
44
- addMessage(role, text) {
45
- this.state.push({ role, text });
46
- this.scrollOff = Number.MAX_SAFE_INTEGER;
47
- }
48
- setInfo(info) {
49
- Object.assign(this.info, info);
50
- }
51
- startSpinner() {
52
- if (this.spinnerTimer)
53
- return;
54
- this.status = "thinking";
55
- this.turnStartedAt = Date.now();
56
- this.spinnerFrame = 0;
57
- this.spinnerTimer = setInterval(() => {
58
- this.spinnerFrame = (this.spinnerFrame + 1) % SPINNER_FRAMES.length;
59
- this.render();
60
- }, SPINNER_MS);
61
- }
62
- stopSpinner() {
63
- this.status = "idle";
64
- this.turnStartedAt = 0;
65
- if (this.spinnerTimer) {
66
- clearInterval(this.spinnerTimer);
67
- this.spinnerTimer = null;
68
- }
69
- }
70
- async run(onLine) {
71
- this.onLine = onLine;
72
- this.measure();
73
- if (process.stdin.isTTY)
74
- process.stdin.setRawMode?.(true);
75
- process.stdin.on("data", this.handleInput);
76
- process.stdout.on("resize", this.handleResize);
77
- process.on("SIGWINCH", this.handleResize);
78
- this.render();
79
- return new Promise((resolve) => { this.resolve = resolve; });
80
- }
81
- shutdown() {
82
- this.stopSpinner();
83
- process.stdin.setRawMode?.(false);
84
- process.stdin.removeAllListeners("data");
85
- process.stdout.removeAllListeners("resize");
86
- process.removeAllListeners("SIGWINCH");
87
- this.render();
88
- process.stdout.write("\n");
89
- this.resolve?.();
90
- }
91
- handleInput = (data) => {
92
- const str = data.toString();
93
- for (const ch of str) {
94
- const code = ch.charCodeAt(0);
95
- if (code === 3) {
96
- this.shutdown();
97
- return;
98
- }
99
- if (code === 4 && this.inputBuf.length === 0) {
100
- this.shutdown();
101
- return;
102
- }
103
- if (code === 27) {
104
- if (this.status === "thinking" && this.abortCtrl) {
105
- this.abortCtrl.abort();
106
- return;
107
- }
108
- this.inputBuf = "";
109
- this.cursor = 0;
110
- this.render();
111
- return;
112
- }
113
- if (this.status === "thinking")
114
- continue;
115
- if (code === 13) {
116
- this.submit();
117
- return;
118
- }
119
- if (code === 127) {
120
- if (this.cursor > 0) {
121
- this.inputBuf = this.inputBuf.slice(0, this.cursor - 1) + this.inputBuf.slice(this.cursor);
122
- this.cursor--;
123
- }
124
- this.render();
125
- return;
126
- }
127
- if (ch >= " ") {
128
- this.inputBuf = this.inputBuf.slice(0, this.cursor) + ch + this.inputBuf.slice(this.cursor);
129
- this.cursor++;
130
- this.render();
131
- }
132
- }
133
- };
134
- async submit() {
135
- const line = this.inputBuf.trim();
136
- this.inputBuf = "";
137
- this.cursor = 0;
138
- if (!line) {
139
- this.render();
140
- return;
141
- }
142
- if (line === "/exit" || line === "/quit") {
143
- this.shutdown();
144
- return;
145
- }
146
- this.addMessage("you", line);
147
- this.abortCtrl = new AbortController();
148
- this.startSpinner();
149
- this.render();
150
- await this.onLine?.(line, this.abortCtrl.signal);
151
- this.abortCtrl = null;
152
- this.stopSpinner();
153
- this.render();
154
- }
155
- handleResize = () => { this.measure(); this.render(); };
156
- render() {
157
- this.measure();
158
- process.stdout.write("\x1b[?25l\x1b[2J\x1b[H" + this.buildFrame() + "\x1b[?25h");
159
- }
160
- buildFrame() {
161
- const { columns, chatW, sideW, bodyH } = this;
162
- const innerSideW = sideW - 2;
163
- const sep = `${B.lt}${B.h.repeat(chatW)}${B.bt}${B.h.repeat(sideW)}${B.rt}`;
164
- const inputW = columns - 2;
165
- let buf = `${B.tl}${B.h.repeat(chatW)}${B.tt}${B.h.repeat(sideW)}${B.tr}\n`;
166
- const wrapped = this.state.flatMap((m) => this.wrapMessage(m, chatW));
167
- const maxScroll = Math.max(0, wrapped.length - bodyH);
168
- if (this.scrollOff > maxScroll)
169
- this.scrollOff = maxScroll;
170
- if (this.scrollOff < 0)
171
- this.scrollOff = 0;
172
- const visible = wrapped.slice(this.scrollOff, this.scrollOff + bodyH);
173
- const sidebarLines = this.buildSidebar(innerSideW);
174
- const sbTop = Math.max(0, Math.floor((bodyH - sidebarLines.length) / 2));
175
- for (let r = 0; r < bodyH; r++) {
176
- buf += B.v;
177
- const line = visible[r];
178
- if (line)
179
- buf += padTrunc(line, chatW);
180
- else
181
- buf += " ".repeat(chatW);
182
- buf += B.v;
183
- const sbIdx = r - sbTop;
184
- const sbLine = (sbIdx >= 0 && sbIdx < sidebarLines.length) ? sidebarLines[sbIdx] : "";
185
- buf += ` ${padRight(sbLine, innerSideW)} `;
186
- buf += `${B.v}\n`;
187
- }
188
- buf += `${sep}\n`;
189
- if (this.status === "thinking") {
190
- const frame = SPINNER_FRAMES[this.spinnerFrame];
191
- const elapsed = this.turnStartedAt ? formatElapsed(Date.now() - this.turnStartedAt) : "";
192
- const spinnerText = `${frame} thinking…${elapsed ? ` ${elapsed}` : ""} (esc to interrupt)`;
193
- const padLen = Math.max(0, inputW - 1 - spinnerText.length);
194
- buf += `${B.v} \x1b[36m${spinnerText}\x1b[0m${" ".repeat(padLen)}${B.v}\n`;
195
- }
196
- buf += `${B.tl}${B.h.repeat(inputW)}${B.tr}\n`;
197
- const cursorCh = this.status === "idle" ? "\x1b[5m▋\x1b[25m" : "";
198
- const inputMaxW = inputW - 3;
199
- const visibleInput = this.inputBuf.length > inputMaxW
200
- ? this.inputBuf.slice(this.inputBuf.length - inputMaxW)
201
- : this.inputBuf;
202
- const inputPad = inputMaxW - visibleInput.length;
203
- buf += `${B.v} \x1b[36m>\x1b[0m ${visibleInput}${cursorCh}${" ".repeat(Math.max(0, inputPad))} ${B.v}\n`;
204
- buf += `${B.bl}${B.h.repeat(inputW)}${B.br}\n`;
205
- const totalIn = this.agent.usage.tokens.inputTokens;
206
- const totalOut = this.agent.usage.tokens.outputTokens;
207
- const cost = this.agent.usage.costUsd.toFixed(4);
208
- const ft = `\x1b[90m${this.agent.address.slice(0, 10)}… · in ${totalIn} out ${totalOut} $${cost} /exit\x1b[0m`;
209
- buf += `${padTrunc(ft, columns)}\n`;
210
- const cursorRow = bodyH + 4 + (this.status === "thinking" ? 1 : 0);
211
- const cursorCol = 4 + Math.min(this.cursor, inputMaxW);
212
- buf += `\x1b[${cursorRow};${cursorCol}H`;
213
- return buf;
214
- }
215
- wrapMessage(msg, width) {
216
- const label = this.roleLabel(msg.role);
217
- const bodyWidth = Math.max(10, width - GUTTER.length - LABEL_W - 1);
218
- const lines = wrapText(msg.text, bodyWidth);
219
- return lines.map((l, i) => i === 0 ? `${GUTTER}${label} ${l}` : `${INDENT}${l}`);
220
- }
221
- roleLabel(role) {
222
- switch (role) {
223
- case "you": return "\x1b[36myou \x1b[0m";
224
- case "agent": return `\x1b[32m${this.agent.name.toLowerCase().padEnd(LABEL_W)}\x1b[0m`;
225
- case "system": return "\x1b[90msys \x1b[0m";
226
- case "error": return "\x1b[31merr \x1b[0m";
227
- }
228
- }
229
- buildSidebar(width) {
230
- const { agent, config, info } = this;
231
- const addr = `${agent.address.slice(0, 6)}…${agent.address.slice(-4)}`;
232
- const totalIn = agent.usage.tokens.inputTokens;
233
- const totalOut = agent.usage.tokens.outputTokens;
234
- const cost = agent.usage.costUsd.toFixed(6);
235
- const rows = [
236
- `\x1b[1;36m${agent.name}\x1b[0m`,
237
- `\x1b[90m${addr}\x1b[0m`,
238
- "",
239
- `${B.h.repeat(width)}`,
240
- `\x1b[90mnetwork\x1b[0m ${config.network}`,
241
- `\x1b[90mmodel\x1b[0m ${shortModel(config.brain.model)}`,
242
- ];
243
- if (info.balance) {
244
- rows.push("", `\x1b[90mbalance\x1b[0m \x1b[33m${info.balance} SUI\x1b[0m`);
245
- }
246
- rows.push("", `\x1b[90mlast\x1b[0m in ${info.lastTurnIn} out ${info.lastTurnOut}`, "", `\x1b[90mtotal\x1b[0m in ${totalIn} out ${totalOut}`, ` \x1b[33m$${cost}\x1b[0m`);
247
- return rows;
248
- }
249
- }
250
- function wrapText(text, width) {
251
- if (!text)
252
- return [""];
253
- const lines = [];
254
- for (const para of text.split("\n")) {
255
- const words = para.split(" ");
256
- let cur = "";
257
- for (const w of words) {
258
- if (w.length > width) {
259
- if (cur) {
260
- lines.push(cur);
261
- cur = "";
262
- }
263
- for (let i = 0; i < w.length; i += width)
264
- lines.push(w.slice(i, i + width));
265
- }
266
- else if (cur && cur.length + 1 + w.length > width) {
267
- lines.push(cur);
268
- cur = w;
269
- }
270
- else {
271
- cur = cur ? `${cur} ${w}` : w;
272
- }
273
- }
274
- if (cur)
275
- lines.push(cur);
276
- }
277
- return lines.length > 0 ? lines : [""];
278
- }
279
- function stripAnsi(s) {
280
- // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape stripping
281
- return s.replace(/\x1b\[\d*;?\d*m/g, "");
282
- }
283
- function visibleLen(s) {
284
- // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape stripping
285
- const re = /\x1b\[\d*;?\d*m/g;
286
- let len = 0;
287
- let last = 0;
288
- let m = re.exec(s);
289
- while (m !== null) {
290
- len += m.index - last;
291
- last = m.index + m[0].length;
292
- m = re.exec(s);
293
- }
294
- return len + s.length - last;
295
- }
296
- function padRight(s, w) {
297
- const vl = visibleLen(s);
298
- return vl >= w ? s : s + " ".repeat(w - vl);
299
- }
300
- function padTrunc(s, w) {
301
- const vl = visibleLen(s);
302
- if (vl < w)
303
- return s + " ".repeat(w - vl);
304
- if (vl === w)
305
- return s;
306
- // Truncate preserving ANSI codes — walk through character by character
307
- let out = "";
308
- let visible = 0;
309
- let i = 0;
310
- while (i < s.length && visible < w) {
311
- if (s[i] === "\x1b" && s[i + 1] === "[") {
312
- // ANSI escape sequence — copy until 'm'
313
- const end = s.indexOf("m", i);
314
- if (end !== -1) {
315
- out += s.slice(i, end + 1);
316
- i = end + 1;
317
- }
318
- else {
319
- out += s[i];
320
- i++;
321
- }
322
- }
323
- else {
324
- out += s[i];
325
- visible++;
326
- i++;
327
- }
328
- }
329
- return out;
330
- }
331
- function formatElapsed(ms) {
332
- const sec = Math.floor(ms / 1000);
333
- if (sec < 60)
334
- return `${sec}s`;
335
- const m = Math.floor(sec / 60);
336
- return `${m}m${String(sec % 60).padStart(2, "0")}s`;
337
- }
338
- function shortModel(model) {
339
- const m = model.toLowerCase();
340
- if (m.includes("sonnet"))
341
- return "Sonnet 4";
342
- if (m.includes("haiku"))
343
- return "Haiku";
344
- if (m.includes("opus"))
345
- return "Opus 4";
346
- if (m.includes("fable"))
347
- return "Fable 5";
348
- return model.length > 14 ? `${model.slice(0, 13)}…` : model;
349
- }
350
- //# sourceMappingURL=tui.js.map
package/dist/tui.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}