@sofer_agent/cli 0.3.1 → 0.3.3

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