@sofer_agent/cli 0.3.0 → 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 CHANGED
@@ -1,28 +1,32 @@
1
- const SIDEBAR_W = 28;
1
+ const SIDEBAR_W = 26;
2
2
  const MIN_CHAT_W = 30;
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;
3
8
  export class SoferTui {
4
9
  agent;
5
- config;
6
- state = { messages: [], lastTurnIn: 0, lastTurnOut: 0 };
10
+ state = [];
7
11
  inputBuf = "";
8
12
  cursor = 0;
9
- rl = null;
10
13
  columns = 80;
11
14
  rows = 24;
12
- chatH = 20;
13
15
  chatW = 50;
16
+ chatH = 20;
14
17
  scrollOff = 0;
18
+ // spinner
19
+ status = "idle";
20
+ spinnerFrame = 0;
21
+ spinnerTimer = null;
22
+ turnStartedAt = 0;
23
+ // interrupt
24
+ abortCtrl = null;
25
+ // callbacks
15
26
  resolve = null;
16
27
  onLine = null;
17
- constructor(agent, config) {
28
+ constructor(agent) {
18
29
  this.agent = agent;
19
- this.config = config;
20
- }
21
- get width() {
22
- return this.columns;
23
- }
24
- get height() {
25
- return this.rows;
26
30
  }
27
31
  measure() {
28
32
  this.columns = process.stdout.columns ?? 80;
@@ -31,13 +35,28 @@ export class SoferTui {
31
35
  this.chatH = this.rows - 3;
32
36
  }
33
37
  addMessage(role, text) {
34
- this.state.messages.push({ role, text });
38
+ this.state.push({ role, text });
39
+ }
40
+ startSpinner() {
41
+ if (this.spinnerTimer)
42
+ return;
43
+ this.status = "thinking";
44
+ this.turnStartedAt = Date.now();
45
+ this.spinnerFrame = 0;
46
+ this.spinnerTimer = setInterval(() => {
47
+ this.spinnerFrame = (this.spinnerFrame + 1) % SPINNER_FRAMES.length;
48
+ this.render();
49
+ }, SPINNER_MS);
35
50
  }
36
- setUsage(lastTurnIn, lastTurnOut) {
37
- this.state.lastTurnIn = lastTurnIn;
38
- this.state.lastTurnOut = lastTurnOut;
51
+ stopSpinner() {
52
+ this.status = "idle";
53
+ this.turnStartedAt = 0;
54
+ if (this.spinnerTimer) {
55
+ clearInterval(this.spinnerTimer);
56
+ this.spinnerTimer = null;
57
+ }
39
58
  }
40
- /** Start the interactive TUI loop. Returns when the user exits. */
59
+ /** Start the interactive TUI loop. */
41
60
  async run(onLine) {
42
61
  this.onLine = onLine;
43
62
  this.measure();
@@ -52,11 +71,12 @@ export class SoferTui {
52
71
  });
53
72
  }
54
73
  shutdown() {
74
+ this.stopSpinner();
55
75
  process.stdin.setRawMode?.(false);
56
76
  process.stdin.removeAllListeners("data");
57
77
  process.stdout.removeAllListeners("resize");
58
78
  process.removeAllListeners("SIGWINCH");
59
- this.render(); // final render in normal mode
79
+ this.render();
60
80
  process.stdout.write("\n");
61
81
  this.resolve?.();
62
82
  }
@@ -66,12 +86,26 @@ export class SoferTui {
66
86
  for (const ch of str) {
67
87
  const code = ch.charCodeAt(0);
68
88
  if (code === 3) {
69
- process.exit(0);
89
+ this.shutdown();
90
+ return;
70
91
  } // Ctrl-C
71
92
  if (code === 4 && this.inputBuf.length === 0) {
72
93
  this.shutdown();
73
94
  return;
74
- } // Ctrl-D on empty
95
+ } // Ctrl-D
96
+ if (code === 27) {
97
+ // Escape
98
+ if (this.status === "thinking" && this.abortCtrl) {
99
+ this.abortCtrl.abort();
100
+ return;
101
+ }
102
+ this.inputBuf = ""; // clear input on Esc when idle
103
+ this.cursor = 0;
104
+ this.render();
105
+ return;
106
+ }
107
+ if (this.status === "thinking")
108
+ continue; // reject input while thinking
75
109
  if (code === 13) {
76
110
  this.submit();
77
111
  return;
@@ -86,13 +120,6 @@ export class SoferTui {
86
120
  this.render();
87
121
  return;
88
122
  }
89
- if (code === 27 && this.inputBuf.length > 0) {
90
- // Escape clears input
91
- this.inputBuf = "";
92
- this.cursor = 0;
93
- this.render();
94
- return;
95
- }
96
123
  if (ch >= " ") {
97
124
  this.inputBuf = this.inputBuf.slice(0, this.cursor) + ch + this.inputBuf.slice(this.cursor);
98
125
  this.cursor++;
@@ -113,41 +140,46 @@ export class SoferTui {
113
140
  return;
114
141
  }
115
142
  this.addMessage("you", line);
116
- this.scrollOff = 0; // auto-scroll to latest
143
+ this.scrollOff = 0;
144
+ this.abortCtrl = new AbortController();
145
+ this.startSpinner();
146
+ this.render();
147
+ await this.onLine?.(line, this.abortCtrl.signal);
148
+ this.abortCtrl = null;
149
+ this.stopSpinner();
117
150
  this.render();
118
- await this.onLine?.(line);
119
151
  }
120
- // ── Terminal rendering ──────────────────────────────────────────────────
152
+ // ── Rendering ───────────────────────────────────────────────────────────
121
153
  handleResize = () => {
122
154
  this.measure();
123
155
  this.render();
124
156
  };
125
- /** Reset cursor, clear, redraw everything. */
126
157
  render() {
127
158
  this.measure();
128
159
  const out = process.stdout;
129
- out.write("\x1b[?25l"); // hide cursor
160
+ out.write("\x1b[?25l");
161
+ out.write("\x1b[H");
130
162
  out.write(this.buildFrame());
131
- out.write("\x1b[?25h"); // show cursor
163
+ out.write("\x1b[?25h");
132
164
  }
133
165
  buildFrame() {
134
- const { columns, rows, chatW, chatH } = this;
135
- const rightW = columns - chatW - 1; // border column
136
- let buf = "\x1b[H"; // cursor to top-left
137
- // ── Body ──────────────────────────────────────────────────────────────
138
- // We draw row by row. Each row: chat area | border | sidebar
139
- const msgs = this.state.messages;
140
- const wrappedLines = msgs.flatMap((m) => this.wrapLine(m, chatW));
141
- const totalLines = wrappedLines.length;
142
- const maxScroll = Math.max(0, totalLines - chatH);
166
+ const { chatW, chatH } = this;
167
+ const rightW = this.columns - chatW - 1;
168
+ let buf = "";
169
+ // ── Chat body ─────────────────────────────────────────────────────────
170
+ const wrapped = this.state.flatMap((m) => this.wrapMessage(m, chatW));
171
+ const maxScroll = Math.max(0, wrapped.length - chatH);
143
172
  if (this.scrollOff > maxScroll)
144
173
  this.scrollOff = maxScroll;
145
174
  if (this.scrollOff < 0)
146
175
  this.scrollOff = 0;
147
- const visible = wrappedLines.slice(this.scrollOff, this.scrollOff + chatH);
176
+ const visible = wrapped.slice(this.scrollOff, this.scrollOff + chatH);
148
177
  for (let r = 0; r < chatH; r++) {
149
178
  const line = visible[r];
150
- buf += line ? this.pad(line, chatW) : this.blank(chatW);
179
+ if (line)
180
+ buf += this.pad(line, chatW);
181
+ else
182
+ buf += " ".repeat(chatW);
151
183
  if (r === 0)
152
184
  buf += "┬";
153
185
  else if (r === chatH - 1)
@@ -159,64 +191,59 @@ export class SoferTui {
159
191
  }
160
192
  // ── Divider ───────────────────────────────────────────────────────────
161
193
  buf += `${"─".repeat(chatW)}┴${"─".repeat(rightW)}\n`;
162
- // ── Input line ────────────────────────────────────────────────────────
163
- const prefix = "\x1b[36myou>\x1b[0m ";
164
- const prefixW = 4;
165
- const maxInputW = columns - prefixW - 1;
166
- let typed = this.inputBuf;
167
- if (typed.length > maxInputW) {
168
- const start = typed.length - maxInputW;
169
- typed = typed.slice(start);
194
+ // ── Spinner row ───────────────────────────────────────────────────────
195
+ if (this.status === "thinking") {
196
+ const frame = SPINNER_FRAMES[this.spinnerFrame];
197
+ const elapsed = this.turnStartedAt ? formatElapsed(Date.now() - this.turnStartedAt) : "";
198
+ buf += `\x1b[36m${frame} thinking…${elapsed ? ` ${elapsed}` : ""} (esc to interrupt)\x1b[0m\x1b[K\n`;
170
199
  }
171
- buf += `${prefix}${typed}\x1b[K`; // clear to end of line
172
- // Place cursor at end of input
173
- const cursorCol = prefixW + Math.min(this.cursor, maxInputW);
174
- buf += `\x1b[${chatH + 2};${cursorCol}H`;
200
+ // ── Input bar ─────────────────────────────────────────────────────────
201
+ const prefix = "\x1b[36m> \x1b[0m";
202
+ const cursorChar = this.status === "idle" ? "\x1b[5m▋\x1b[25m" : "";
203
+ buf += `${prefix}${this.inputBuf}${cursorChar}\x1b[K`;
204
+ // Footer
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 footer = `\x1b[90m${this.agent.address.slice(0, 10)}… · tokens ${totalIn}/${totalOut} · $${cost} · /exit to quit\x1b[0m`;
209
+ buf += `\n${this.pad(footer, this.columns)}`;
210
+ // Place cursor at input position
211
+ const cursorCol = 2 + Math.min(this.cursor, this.columns - 5);
212
+ buf += `\x1b[${this.chatH + 2 + (this.status === "thinking" ? 1 : 0)};${cursorCol}H`;
175
213
  return buf;
176
214
  }
177
- wrapLine(msg, width) {
178
- const label = msg.role === "you"
179
- ? "\x1b[36myou>\x1b[0m "
180
- : msg.role === "agent"
181
- ? `\x1b[32m${this.agent.name.toLowerCase()}>\x1b[0m `
182
- : "\x1b[31merror>\x1b[0m ";
183
- const content = msg.text;
184
- const full = label + content;
185
- if (full.length <= width)
186
- return [full];
187
- // simple word-wrap
188
- const lines = [];
189
- let current = label;
190
- const words = content.split(" ");
191
- for (const word of words) {
192
- if (current.length + 1 + word.length <= width) {
193
- current += (current === label ? "" : " ") + word;
194
- }
195
- else {
196
- if (current.length > label.length)
197
- lines.push(current);
198
- current = ` ${word}`; // indent continuation
199
- }
215
+ // ── Message wrapping with gutter ────────────────────────────────────────
216
+ wrapMessage(msg, width) {
217
+ const label = this.roleLabel(msg.role);
218
+ const bodyWidth = width - GUTTER.length - LABEL_W - 1;
219
+ const lines = wrapText(msg.text, bodyWidth);
220
+ return lines.map((l, i) => {
221
+ if (i === 0)
222
+ return `${GUTTER}${label} ${l}`;
223
+ return `${INDENT}${l}`;
224
+ });
225
+ }
226
+ roleLabel(role) {
227
+ switch (role) {
228
+ case "you":
229
+ return "\x1b[36myou \x1b[0m"; // cyan "you", padded to LABEL_W
230
+ case "agent":
231
+ return `\x1b[32m${this.agent.name.toLowerCase().slice(0, LABEL_W).padEnd(LABEL_W)}\x1b[0m`;
232
+ case "system":
233
+ return "\x1b[90msys \x1b[0m";
234
+ case "error":
235
+ return "\x1b[31merr \x1b[0m";
200
236
  }
201
- if (current.length > label.length)
202
- lines.push(current);
203
- return lines.length > 0 ? lines : [full];
204
237
  }
205
238
  pad(s, w) {
206
- // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape stripping
207
- const ansiRe = /\x1b\[\d*;?\d*m/g;
208
- const stripped = s.replace(ansiRe, "");
209
- const padW = Math.max(0, w - stripped.length);
239
+ const stripped = stripAnsi(s);
240
+ const padW = Math.max(0, w - visibleLen(stripped));
210
241
  return s + " ".repeat(padW);
211
242
  }
212
- blank(w) {
213
- return " ".repeat(w);
214
- }
215
243
  // ── Sidebar ─────────────────────────────────────────────────────────────
216
244
  sidebarRow(row, total, width) {
217
- const innerW = width - 2; // left & right padding
245
+ const innerW = width - 2;
218
246
  const lines = this.buildSidebar(innerW);
219
- // center the sidebar content vertically
220
247
  const gap = Math.max(0, total - lines.length);
221
248
  const topPad = Math.floor(gap / 2);
222
249
  const idx = row - topPad;
@@ -225,41 +252,76 @@ export class SoferTui {
225
252
  const line = lines[idx];
226
253
  if (!line)
227
254
  return " ".repeat(width);
228
- return ` ${this.pad(line, innerW)} `;
255
+ const padded = padRight(line, innerW);
256
+ return ` ${padded} `;
229
257
  }
230
258
  buildSidebar(width) {
231
- const { agent, config, state } = this;
232
- const addr = `${agent.address.slice(0, 6)}...${agent.address.slice(-4)}`;
259
+ const { agent } = this;
260
+ const addr = `${agent.address.slice(0, 6)}…${agent.address.slice(-4)}`;
233
261
  const totalIn = agent.usage.tokens.inputTokens;
234
262
  const totalOut = agent.usage.tokens.outputTokens;
235
263
  const cost = agent.usage.costUsd.toFixed(4);
236
264
  return [
237
265
  `\x1b[1m${agent.name}\x1b[0m`,
238
266
  "─".repeat(width),
239
- `Model: ${this.shortModel(config.brain.model)}`,
240
- `Max out: ${config.brain.maxOutputTokens}`,
241
- "",
242
- `Turn in: ${state.lastTurnIn}`,
243
- `Turn out: ${state.lastTurnOut}`,
244
- `Total in: ${totalIn}`,
245
- `Total out:${totalOut}`,
246
- `Cost: \x1b[33m$${cost}\x1b[0m`,
267
+ ` \x1b[90maddr\x1b[0m ${addr}`,
247
268
  "",
248
- `Addr: ${addr}`,
249
- `Network: ${config.network}`,
269
+ ` \x1b[90min\x1b[0m ${totalIn}`,
270
+ ` \x1b[90mout\x1b[0m ${totalOut}`,
271
+ ` \x1b[33m$${cost}\x1b[0m`,
250
272
  ];
251
273
  }
252
- shortModel(model) {
253
- const m = model.toLowerCase();
254
- if (m.includes("sonnet"))
255
- return "Sonnet 4";
256
- if (m.includes("haiku"))
257
- return "Haiku 3.5";
258
- if (m.includes("opus"))
259
- return "Opus 4";
260
- if (m.includes("fable"))
261
- return "Fable 5";
262
- return model;
274
+ }
275
+ // ── Helpers ────────────────────────────────────────────────────────────────
276
+ function wrapText(text, width) {
277
+ if (!text)
278
+ return [""];
279
+ const lines = [];
280
+ const words = text.split(" ");
281
+ let current = "";
282
+ for (const word of words) {
283
+ if (current && current.length + 1 + word.length > width) {
284
+ lines.push(current);
285
+ current = word;
286
+ }
287
+ else {
288
+ current = current ? `${current} ${word}` : word;
289
+ }
263
290
  }
291
+ if (current)
292
+ lines.push(current);
293
+ return lines.length > 0 ? lines : [""];
294
+ }
295
+ function stripAnsi(s) {
296
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape stripping
297
+ return s.replace(/\x1b\[\d*;?\d*m/g, "");
298
+ }
299
+ function visibleLen(s) {
300
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape stripping
301
+ const ansiRe = /\x1b\[\d*;?\d*m/g;
302
+ let len = 0;
303
+ let lastIdx = 0;
304
+ let match = ansiRe.exec(s);
305
+ while (match !== null) {
306
+ len += match.index - lastIdx;
307
+ lastIdx = match.index + match[0].length;
308
+ match = ansiRe.exec(s);
309
+ }
310
+ len += s.length - lastIdx;
311
+ return len;
312
+ }
313
+ function padRight(s, width) {
314
+ const len = visibleLen(s);
315
+ if (len >= width)
316
+ return s;
317
+ return s + " ".repeat(width - len);
318
+ }
319
+ function formatElapsed(ms) {
320
+ const sec = Math.floor(ms / 1000);
321
+ if (sec < 60)
322
+ return `${sec}s`;
323
+ const m = Math.floor(sec / 60);
324
+ const s = sec % 60;
325
+ return `${m}m${String(s).padStart(2, "0")}s`;
264
326
  }
265
327
  //# sourceMappingURL=tui.js.map
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.0",
3
+ "version": "0.3.2",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "sofer": "./dist/bin.js"
@@ -25,7 +25,8 @@
25
25
  "cli"
26
26
  ],
27
27
  "dependencies": {
28
- "@sofer_agent/core": "0.3.0"
28
+ "@clack/prompts": "^1.5.1",
29
+ "@sofer_agent/core": "0.3.1"
29
30
  },
30
31
  "devDependencies": {
31
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
  });