@sofer_agent/cli 0.3.1 → 0.3.2

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/dist/tui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sofer_agent/cli",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "sofer": "./dist/bin.js"
@@ -26,7 +26,7 @@
26
26
  ],
27
27
  "dependencies": {
28
28
  "@clack/prompts": "^1.5.1",
29
- "@sofer_agent/core": "0.3.0"
29
+ "@sofer_agent/core": "0.3.1"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/node": "^22.10.2",
package/src/bin.ts CHANGED
@@ -45,8 +45,14 @@ async function main(): Promise<void> {
45
45
  main().catch((e) => {
46
46
  const msg = e instanceof Error ? e.message : String(e);
47
47
  console.error(msg);
48
- if (msg.includes("SOFER_SUI_SECRET_KEY") || msg.includes("ANTHROPIC_API_KEY") || msg.includes("SOFER_PACKAGE_ID")) {
49
- console.error(`\nFirst time? Run \`sofer init\` — an interactive wizard (creates ${agentPaths.root}/).`);
48
+ if (
49
+ msg.includes("SOFER_SUI_SECRET_KEY") ||
50
+ msg.includes("ANTHROPIC_API_KEY") ||
51
+ msg.includes("SOFER_PACKAGE_ID")
52
+ ) {
53
+ console.error(
54
+ `\nFirst time? Run \`sofer init\` — an interactive wizard (creates ${agentPaths.root}/).`,
55
+ );
50
56
  }
51
57
  process.exit(1);
52
58
  });
package/src/chat.ts CHANGED
@@ -2,20 +2,23 @@ import { SoferAgent, loadConfig } from "@sofer_agent/core";
2
2
  import { requireSecrets } from "./secrets.js";
3
3
  import { SoferTui } from "./tui.js";
4
4
 
5
- /** Interactive chat TUI with a stats sidebar. */
5
+ /** Interactive chat TUI with promus-style polish. */
6
6
  export async function chatCommand(): Promise<void> {
7
7
  const config = loadConfig();
8
8
  const agent = await SoferAgent.create(config, requireSecrets());
9
9
 
10
- const tui = new SoferTui(agent, config);
10
+ const tui = new SoferTui(agent);
11
11
 
12
- await tui.run(async (line) => {
12
+ await tui.run(async (line, signal) => {
13
13
  try {
14
- const { text, turnUsage } = await agent.chat(line);
14
+ const { text } = await agent.chat(line, signal);
15
15
  tui.addMessage("agent", text);
16
- tui.setUsage(turnUsage.inputTokens, turnUsage.outputTokens);
17
16
  } catch (e) {
18
- tui.addMessage("error", e instanceof Error ? e.message : String(e));
17
+ if (signal?.aborted) {
18
+ tui.addMessage("system", "turn interrupted (esc).");
19
+ } else {
20
+ tui.addMessage("error", e instanceof Error ? e.message : String(e));
21
+ }
19
22
  }
20
23
  tui.render();
21
24
  });
package/src/init.ts CHANGED
@@ -1,16 +1,7 @@
1
+ import { cancel, intro, isCancel, note, outro, password, select, spinner } from "@clack/prompts";
1
2
  import {
2
- cancel,
3
- intro,
4
- isCancel,
5
- note,
6
- outro,
7
- password,
8
- select,
9
- spinner,
10
- } from "@clack/prompts";
11
- import {
12
- type PersistedConfig,
13
3
  AgentClient,
4
+ type PersistedConfig,
14
5
  agentPaths,
15
6
  generateKeypair,
16
7
  keypairFromSecret,
@@ -171,29 +162,37 @@ export async function initCommand(): Promise<void> {
171
162
  }
172
163
 
173
164
  // ── 7. Link memory to agent on-chain ───────────────────────────────────
165
+ if (!agentId || !accountId) {
166
+ cancel("Agent or memory not provisioned. Re-run `sofer init`.");
167
+ return;
168
+ }
174
169
  const sLink = spinner();
175
170
  sLink.start("Linking memory account to agent on-chain");
176
171
  try {
177
172
  const keypair = keypairFromSecret(secret);
178
- await agents.setMemoryAccount(keypair, agentId!, accountId!);
173
+ await agents.setMemoryAccount(keypair, agentId, accountId);
179
174
  sLink.stop("linked");
180
175
  } catch (e) {
181
176
  sLink.stop(`link failed (may already be linked): ${String(e).slice(0, 80)}`);
182
177
  }
183
178
 
184
179
  // ── 8. Persist config + secrets to ~/.sofer/ ───────────────────────────
180
+ if (!delegateKey) {
181
+ cancel("Memory delegate key missing. Re-run `sofer init`.");
182
+ return;
183
+ }
185
184
  const sSave = spinner();
186
185
  sSave.start("Saving to ~/.sofer/");
187
186
  writeSecret(agentPaths.suiKey, secret);
188
187
  writeSecret(agentPaths.brainKey, apiKey);
189
188
  const persisted: PersistedConfig = {
190
189
  network: net,
191
- agentObjectId: agentId!,
190
+ agentObjectId: agentId,
192
191
  agentAddress: address,
193
192
  brain: { model: config.brain.model },
194
193
  memwal: {
195
- accountId: accountId!,
196
- delegateKey: delegateKey!,
194
+ accountId,
195
+ delegateKey,
197
196
  },
198
197
  };
199
198
  writePersistedConfig(persisted);
@@ -201,10 +200,10 @@ export async function initCommand(): Promise<void> {
201
200
 
202
201
  // ── 9. Summary ────────────────────────────────────────────────────────
203
202
  const lines = [
204
- `agent ${agentId!.slice(0, 30)}…`,
203
+ `agent ${agentId.slice(0, 30)}…`,
205
204
  `address ${address.slice(0, 10)}…`,
206
205
  `network ${net}`,
207
- `memory ${accountId!.slice(0, 10)}…`,
206
+ `memory ${accountId.slice(0, 10)}…`,
208
207
  "",
209
208
  "Run `sofer` to chat with your agent.",
210
209
  ];
package/src/secrets.ts CHANGED
@@ -5,10 +5,14 @@ import { loadSecrets } from "./env.js";
5
5
  export function requireSecrets(): AgentSecrets {
6
6
  const { suiSecretKey, anthropicApiKey } = loadSecrets();
7
7
  if (!suiSecretKey) {
8
- throw new Error("SOFER_SUI_SECRET_KEY not found — run `sofer init` first (creates ~/.sofer/sui.key)");
8
+ throw new Error(
9
+ "SOFER_SUI_SECRET_KEY not found — run `sofer init` first (creates ~/.sofer/sui.key)",
10
+ );
9
11
  }
10
12
  if (!anthropicApiKey) {
11
- throw new Error("ANTHROPIC_API_KEY not found — run `sofer init` first (creates ~/.sofer/brain.key)");
13
+ throw new Error(
14
+ "ANTHROPIC_API_KEY not found — run `sofer init` first (creates ~/.sofer/brain.key)",
15
+ );
12
16
  }
13
17
  return { suiSecretKey, anthropicApiKey };
14
18
  }
package/src/tui.ts CHANGED
@@ -1,45 +1,39 @@
1
- import type * as readline from "node:readline";
2
- import type { SoferConfig } from "@sofer_agent/core";
3
1
  import type { SoferAgent } from "@sofer_agent/core";
4
2
 
5
- const SIDEBAR_W = 28;
3
+ const SIDEBAR_W = 26;
6
4
  const MIN_CHAT_W = 30;
7
-
8
- interface ChatLine {
9
- role: "you" | "agent" | "error";
5
+ const GUTTER = " ";
6
+ const LABEL_W = 6;
7
+ const INDENT = `${GUTTER}${" ".repeat(LABEL_W + 1)}`;
8
+ const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
9
+ const SPINNER_MS = 80;
10
+
11
+ export interface ChatLine {
12
+ role: "you" | "agent" | "system" | "error";
10
13
  text: string;
11
14
  }
12
15
 
13
- export interface TuiState {
14
- messages: ChatLine[];
15
- lastTurnIn: number;
16
- lastTurnOut: number;
17
- }
18
-
19
16
  export class SoferTui {
20
- private state: TuiState = { messages: [], lastTurnIn: 0, lastTurnOut: 0 };
17
+ private state: ChatLine[] = [];
21
18
  private inputBuf = "";
22
19
  private cursor = 0;
23
- private rl: readline.Interface | null = null;
24
20
  private columns = 80;
25
21
  private rows = 24;
26
- private chatH = 20;
27
22
  private chatW = 50;
23
+ private chatH = 20;
28
24
  private scrollOff = 0;
25
+ // spinner
26
+ private status: "idle" | "thinking" = "idle";
27
+ private spinnerFrame = 0;
28
+ private spinnerTimer: ReturnType<typeof setInterval> | null = null;
29
+ private turnStartedAt = 0;
30
+ // interrupt
31
+ private abortCtrl: AbortController | null = null;
32
+ // callbacks
29
33
  private resolve: (() => void) | null = null;
30
- private onLine: ((line: string) => void) | null = null;
31
-
32
- constructor(
33
- private readonly agent: SoferAgent,
34
- private readonly config: SoferConfig,
35
- ) {}
34
+ private onLine: ((line: string, signal?: AbortSignal) => Promise<void>) | null = null;
36
35
 
37
- get width() {
38
- return this.columns;
39
- }
40
- get height() {
41
- return this.rows;
42
- }
36
+ constructor(private readonly agent: SoferAgent) {}
43
37
 
44
38
  private measure(): void {
45
39
  this.columns = process.stdout.columns ?? 80;
@@ -49,16 +43,31 @@ export class SoferTui {
49
43
  }
50
44
 
51
45
  addMessage(role: ChatLine["role"], text: string): void {
52
- this.state.messages.push({ role, text });
46
+ this.state.push({ role, text });
53
47
  }
54
48
 
55
- setUsage(lastTurnIn: number, lastTurnOut: number): void {
56
- this.state.lastTurnIn = lastTurnIn;
57
- this.state.lastTurnOut = lastTurnOut;
49
+ private startSpinner(): void {
50
+ if (this.spinnerTimer) return;
51
+ this.status = "thinking";
52
+ this.turnStartedAt = Date.now();
53
+ this.spinnerFrame = 0;
54
+ this.spinnerTimer = setInterval(() => {
55
+ this.spinnerFrame = (this.spinnerFrame + 1) % SPINNER_FRAMES.length;
56
+ this.render();
57
+ }, SPINNER_MS);
58
58
  }
59
59
 
60
- /** Start the interactive TUI loop. Returns when the user exits. */
61
- async run(onLine: (line: string) => Promise<void>): Promise<void> {
60
+ private stopSpinner(): void {
61
+ this.status = "idle";
62
+ this.turnStartedAt = 0;
63
+ if (this.spinnerTimer) {
64
+ clearInterval(this.spinnerTimer);
65
+ this.spinnerTimer = null;
66
+ }
67
+ }
68
+
69
+ /** Start the interactive TUI loop. */
70
+ async run(onLine: (line: string, signal?: AbortSignal) => Promise<void>): Promise<void> {
62
71
  this.onLine = onLine;
63
72
  this.measure();
64
73
 
@@ -74,11 +83,12 @@ export class SoferTui {
74
83
  }
75
84
 
76
85
  private shutdown(): void {
86
+ this.stopSpinner();
77
87
  process.stdin.setRawMode?.(false);
78
88
  process.stdin.removeAllListeners("data");
79
89
  process.stdout.removeAllListeners("resize");
80
90
  process.removeAllListeners("SIGWINCH");
81
- this.render(); // final render in normal mode
91
+ this.render();
82
92
  process.stdout.write("\n");
83
93
  this.resolve?.();
84
94
  }
@@ -90,12 +100,25 @@ export class SoferTui {
90
100
  for (const ch of str) {
91
101
  const code = ch.charCodeAt(0);
92
102
  if (code === 3) {
93
- process.exit(0);
103
+ this.shutdown();
104
+ return;
94
105
  } // Ctrl-C
95
106
  if (code === 4 && this.inputBuf.length === 0) {
96
107
  this.shutdown();
97
108
  return;
98
- } // Ctrl-D on empty
109
+ } // Ctrl-D
110
+ if (code === 27) {
111
+ // Escape
112
+ if (this.status === "thinking" && this.abortCtrl) {
113
+ this.abortCtrl.abort();
114
+ return;
115
+ }
116
+ this.inputBuf = ""; // clear input on Esc when idle
117
+ this.cursor = 0;
118
+ this.render();
119
+ return;
120
+ }
121
+ if (this.status === "thinking") continue; // reject input while thinking
99
122
  if (code === 13) {
100
123
  this.submit();
101
124
  return;
@@ -110,13 +133,6 @@ export class SoferTui {
110
133
  this.render();
111
134
  return;
112
135
  }
113
- if (code === 27 && this.inputBuf.length > 0) {
114
- // Escape clears input
115
- this.inputBuf = "";
116
- this.cursor = 0;
117
- this.render();
118
- return;
119
- }
120
136
  if (ch >= " ") {
121
137
  this.inputBuf = this.inputBuf.slice(0, this.cursor) + ch + this.inputBuf.slice(this.cursor);
122
138
  this.cursor++;
@@ -137,47 +153,51 @@ export class SoferTui {
137
153
  this.shutdown();
138
154
  return;
139
155
  }
156
+
140
157
  this.addMessage("you", line);
141
- this.scrollOff = 0; // auto-scroll to latest
158
+ this.scrollOff = 0;
159
+ this.abortCtrl = new AbortController();
160
+ this.startSpinner();
142
161
  this.render();
143
- await this.onLine?.(line);
144
- }
145
162
 
146
- // ── Terminal rendering ──────────────────────────────────────────────────
163
+ await this.onLine?.(line, this.abortCtrl.signal);
164
+
165
+ this.abortCtrl = null;
166
+ this.stopSpinner();
167
+ this.render();
168
+ }
147
169
 
170
+ // ── Rendering ───────────────────────────────────────────────────────────
148
171
  private handleResize = (): void => {
149
172
  this.measure();
150
173
  this.render();
151
174
  };
152
175
 
153
- /** Reset cursor, clear, redraw everything. */
154
176
  render(): void {
155
177
  this.measure();
156
178
  const out = process.stdout;
157
- out.write("\x1b[?25l"); // hide cursor
179
+ out.write("\x1b[?25l");
180
+ out.write("\x1b[H");
158
181
  out.write(this.buildFrame());
159
- out.write("\x1b[?25h"); // show cursor
182
+ out.write("\x1b[?25h");
160
183
  }
161
184
 
162
185
  private buildFrame(): string {
163
- const { columns, rows, chatW, chatH } = this;
164
- const rightW = columns - chatW - 1; // border column
186
+ const { chatW, chatH } = this;
187
+ const rightW = this.columns - chatW - 1;
188
+ let buf = "";
165
189
 
166
- let buf = "\x1b[H"; // cursor to top-left
167
-
168
- // ── Body ──────────────────────────────────────────────────────────────
169
- // We draw row by row. Each row: chat area | border | sidebar
170
- const msgs = this.state.messages;
171
- const wrappedLines = msgs.flatMap((m) => this.wrapLine(m, chatW));
172
- const totalLines = wrappedLines.length;
173
- const maxScroll = Math.max(0, totalLines - chatH);
190
+ // ── Chat body ─────────────────────────────────────────────────────────
191
+ const wrapped = this.state.flatMap((m) => this.wrapMessage(m, chatW));
192
+ const maxScroll = Math.max(0, wrapped.length - chatH);
174
193
  if (this.scrollOff > maxScroll) this.scrollOff = maxScroll;
175
194
  if (this.scrollOff < 0) this.scrollOff = 0;
176
- const visible = wrappedLines.slice(this.scrollOff, this.scrollOff + chatH);
195
+ const visible = wrapped.slice(this.scrollOff, this.scrollOff + chatH);
177
196
 
178
197
  for (let r = 0; r < chatH; r++) {
179
198
  const line = visible[r];
180
- buf += line ? this.pad(line, chatW) : this.blank(chatW);
199
+ if (line) buf += this.pad(line, chatW);
200
+ else buf += " ".repeat(chatW);
181
201
  if (r === 0) buf += "┬";
182
202
  else if (r === chatH - 1) buf += "┴";
183
203
  else buf += "│";
@@ -188,81 +208,81 @@ export class SoferTui {
188
208
  // ── Divider ───────────────────────────────────────────────────────────
189
209
  buf += `${"─".repeat(chatW)}┴${"─".repeat(rightW)}\n`;
190
210
 
191
- // ── Input line ────────────────────────────────────────────────────────
192
- const prefix = "\x1b[36myou>\x1b[0m ";
193
- const prefixW = 4;
194
- const maxInputW = columns - prefixW - 1;
195
- let typed = this.inputBuf;
196
- if (typed.length > maxInputW) {
197
- const start = typed.length - maxInputW;
198
- typed = typed.slice(start);
211
+ // ── Spinner row ───────────────────────────────────────────────────────
212
+ if (this.status === "thinking") {
213
+ const frame = SPINNER_FRAMES[this.spinnerFrame];
214
+ const elapsed = this.turnStartedAt ? formatElapsed(Date.now() - this.turnStartedAt) : "";
215
+ buf += `\x1b[36m${frame} thinking…${elapsed ? ` ${elapsed}` : ""} (esc to interrupt)\x1b[0m\x1b[K\n`;
199
216
  }
200
- buf += `${prefix}${typed}\x1b[K`; // clear to end of line
201
- // Place cursor at end of input
202
- const cursorCol = prefixW + Math.min(this.cursor, maxInputW);
203
- buf += `\x1b[${chatH + 2};${cursorCol}H`;
217
+
218
+ // ── Input bar ─────────────────────────────────────────────────────────
219
+ const prefix = "\x1b[36m> \x1b[0m";
220
+ const cursorChar = this.status === "idle" ? "\x1b[5m▋\x1b[25m" : "";
221
+ buf += `${prefix}${this.inputBuf}${cursorChar}\x1b[K`;
222
+
223
+ // Footer
224
+ const totalIn = this.agent.usage.tokens.inputTokens;
225
+ const totalOut = this.agent.usage.tokens.outputTokens;
226
+ const cost = this.agent.usage.costUsd.toFixed(4);
227
+ const footer = `\x1b[90m${this.agent.address.slice(0, 10)}… · tokens ${totalIn}/${totalOut} · $${cost} · /exit to quit\x1b[0m`;
228
+ buf += `\n${this.pad(footer, this.columns)}`;
229
+
230
+ // Place cursor at input position
231
+ const cursorCol = 2 + Math.min(this.cursor, this.columns - 5);
232
+ buf += `\x1b[${this.chatH + 2 + (this.status === "thinking" ? 1 : 0)};${cursorCol}H`;
204
233
 
205
234
  return buf;
206
235
  }
207
236
 
208
- private wrapLine(msg: ChatLine, width: number): string[] {
209
- const label =
210
- msg.role === "you"
211
- ? "\x1b[36myou>\x1b[0m "
212
- : msg.role === "agent"
213
- ? `\x1b[32m${this.agent.name.toLowerCase()}>\x1b[0m `
214
- : "\x1b[31merror>\x1b[0m ";
215
- const content = msg.text;
216
- const full = label + content;
217
- if (full.length <= width) return [full];
218
- // simple word-wrap
219
- const lines: string[] = [];
220
- let current = label;
221
- const words = content.split(" ");
222
- for (const word of words) {
223
- if (current.length + 1 + word.length <= width) {
224
- current += (current === label ? "" : " ") + word;
225
- } else {
226
- if (current.length > label.length) lines.push(current);
227
- current = ` ${word}`; // indent continuation
228
- }
237
+ // ── Message wrapping with gutter ────────────────────────────────────────
238
+
239
+ private wrapMessage(msg: ChatLine, width: number): string[] {
240
+ const label = this.roleLabel(msg.role);
241
+ const bodyWidth = width - GUTTER.length - LABEL_W - 1;
242
+ const lines = wrapText(msg.text, bodyWidth);
243
+ return lines.map((l, i) => {
244
+ if (i === 0) return `${GUTTER}${label} ${l}`;
245
+ return `${INDENT}${l}`;
246
+ });
247
+ }
248
+
249
+ private roleLabel(role: ChatLine["role"]): string {
250
+ switch (role) {
251
+ case "you":
252
+ return "\x1b[36myou \x1b[0m"; // cyan "you", padded to LABEL_W
253
+ case "agent":
254
+ return `\x1b[32m${this.agent.name.toLowerCase().slice(0, LABEL_W).padEnd(LABEL_W)}\x1b[0m`;
255
+ case "system":
256
+ return "\x1b[90msys \x1b[0m";
257
+ case "error":
258
+ return "\x1b[31merr \x1b[0m";
229
259
  }
230
- if (current.length > label.length) lines.push(current);
231
- return lines.length > 0 ? lines : [full];
232
260
  }
233
261
 
234
262
  private pad(s: string, w: number): string {
235
- // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape stripping
236
- const ansiRe = /\x1b\[\d*;?\d*m/g;
237
- const stripped = s.replace(ansiRe, "");
238
- const padW = Math.max(0, w - stripped.length);
263
+ const stripped = stripAnsi(s);
264
+ const padW = Math.max(0, w - visibleLen(stripped));
239
265
  return s + " ".repeat(padW);
240
266
  }
241
267
 
242
- private blank(w: number): string {
243
- return " ".repeat(w);
244
- }
245
-
246
268
  // ── Sidebar ─────────────────────────────────────────────────────────────
247
269
 
248
270
  private sidebarRow(row: number, total: number, width: number): string {
249
- const innerW = width - 2; // left & right padding
271
+ const innerW = width - 2;
250
272
  const lines = this.buildSidebar(innerW);
251
-
252
- // center the sidebar content vertically
253
273
  const gap = Math.max(0, total - lines.length);
254
274
  const topPad = Math.floor(gap / 2);
255
275
  const idx = row - topPad;
256
-
257
276
  if (idx < 0 || idx >= lines.length) return " ".repeat(width);
258
277
  const line = lines[idx];
259
278
  if (!line) return " ".repeat(width);
260
- return ` ${this.pad(line, innerW)} `;
279
+ const padded = padRight(line, innerW);
280
+ return ` ${padded} `;
261
281
  }
262
282
 
263
283
  private buildSidebar(width: number): string[] {
264
- const { agent, config, state } = this;
265
- const addr = `${agent.address.slice(0, 6)}...${agent.address.slice(-4)}`;
284
+ const { agent } = this;
285
+ const addr = `${agent.address.slice(0, 6)}…${agent.address.slice(-4)}`;
266
286
  const totalIn = agent.usage.tokens.inputTokens;
267
287
  const totalOut = agent.usage.tokens.outputTokens;
268
288
  const cost = agent.usage.costUsd.toFixed(4);
@@ -270,26 +290,64 @@ export class SoferTui {
270
290
  return [
271
291
  `\x1b[1m${agent.name}\x1b[0m`,
272
292
  "─".repeat(width),
273
- `Model: ${this.shortModel(config.brain.model)}`,
274
- `Max out: ${config.brain.maxOutputTokens}`,
275
- "",
276
- `Turn in: ${state.lastTurnIn}`,
277
- `Turn out: ${state.lastTurnOut}`,
278
- `Total in: ${totalIn}`,
279
- `Total out:${totalOut}`,
280
- `Cost: \x1b[33m$${cost}\x1b[0m`,
293
+ ` \x1b[90maddr\x1b[0m ${addr}`,
281
294
  "",
282
- `Addr: ${addr}`,
283
- `Network: ${config.network}`,
295
+ ` \x1b[90min\x1b[0m ${totalIn}`,
296
+ ` \x1b[90mout\x1b[0m ${totalOut}`,
297
+ ` \x1b[33m$${cost}\x1b[0m`,
284
298
  ];
285
299
  }
300
+ }
286
301
 
287
- private shortModel(model: string): string {
288
- const m = model.toLowerCase();
289
- if (m.includes("sonnet")) return "Sonnet 4";
290
- if (m.includes("haiku")) return "Haiku 3.5";
291
- if (m.includes("opus")) return "Opus 4";
292
- if (m.includes("fable")) return "Fable 5";
293
- return model;
302
+ // ── Helpers ────────────────────────────────────────────────────────────────
303
+
304
+ function wrapText(text: string, width: number): string[] {
305
+ if (!text) return [""];
306
+ const lines: string[] = [];
307
+ const words = text.split(" ");
308
+ let current = "";
309
+ for (const word of words) {
310
+ if (current && current.length + 1 + word.length > width) {
311
+ lines.push(current);
312
+ current = word;
313
+ } else {
314
+ current = current ? `${current} ${word}` : word;
315
+ }
294
316
  }
317
+ if (current) lines.push(current);
318
+ return lines.length > 0 ? lines : [""];
319
+ }
320
+
321
+ function stripAnsi(s: string): string {
322
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape stripping
323
+ return s.replace(/\x1b\[\d*;?\d*m/g, "");
324
+ }
325
+
326
+ function visibleLen(s: string): number {
327
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape stripping
328
+ const ansiRe = /\x1b\[\d*;?\d*m/g;
329
+ let len = 0;
330
+ let lastIdx = 0;
331
+ let match = ansiRe.exec(s);
332
+ while (match !== null) {
333
+ len += match.index - lastIdx;
334
+ lastIdx = match.index + match[0].length;
335
+ match = ansiRe.exec(s);
336
+ }
337
+ len += s.length - lastIdx;
338
+ return len;
339
+ }
340
+
341
+ function padRight(s: string, width: number): string {
342
+ const len = visibleLen(s);
343
+ if (len >= width) return s;
344
+ return s + " ".repeat(width - len);
345
+ }
346
+
347
+ function formatElapsed(ms: number): string {
348
+ const sec = Math.floor(ms / 1000);
349
+ if (sec < 60) return `${sec}s`;
350
+ const m = Math.floor(sec / 60);
351
+ const s = sec % 60;
352
+ return `${m}m${String(s).padStart(2, "0")}s`;
295
353
  }