@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/bin.js +3 -1
- package/dist/bin.js.map +1 -1
- package/dist/chat.d.ts +1 -1
- package/dist/chat.d.ts.map +1 -1
- package/dist/chat.js +10 -6
- package/dist/chat.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +11 -3
- package/dist/init.js.map +1 -1
- package/dist/secrets.d.ts.map +1 -1
- package/dist/secrets.js.map +1 -1
- package/dist/tui.d.ts +15 -22
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +178 -116
- package/dist/tui.js.map +1 -1
- package/package.json +2 -2
- package/src/bin.ts +8 -2
- package/src/chat.ts +9 -6
- package/src/init.ts +16 -17
- package/src/secrets.ts +6 -2
- package/src/tui.ts +187 -129
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.
|
|
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.
|
|
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 (
|
|
49
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
196
|
-
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
|
|
203
|
+
`agent ${agentId.slice(0, 30)}…`,
|
|
205
204
|
`address ${address.slice(0, 10)}…`,
|
|
206
205
|
`network ${net}`,
|
|
207
|
-
`memory ${accountId
|
|
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(
|
|
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(
|
|
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 =
|
|
3
|
+
const SIDEBAR_W = 26;
|
|
6
4
|
const MIN_CHAT_W = 30;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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:
|
|
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
|
-
|
|
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.
|
|
46
|
+
this.state.push({ role, text });
|
|
53
47
|
}
|
|
54
48
|
|
|
55
|
-
|
|
56
|
-
this.
|
|
57
|
-
this.
|
|
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
|
-
|
|
61
|
-
|
|
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();
|
|
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
|
-
|
|
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
|
|
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;
|
|
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
|
-
|
|
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");
|
|
179
|
+
out.write("\x1b[?25l");
|
|
180
|
+
out.write("\x1b[H");
|
|
158
181
|
out.write(this.buildFrame());
|
|
159
|
-
out.write("\x1b[?25h");
|
|
182
|
+
out.write("\x1b[?25h");
|
|
160
183
|
}
|
|
161
184
|
|
|
162
185
|
private buildFrame(): string {
|
|
163
|
-
const {
|
|
164
|
-
const rightW = columns - chatW - 1;
|
|
186
|
+
const { chatW, chatH } = this;
|
|
187
|
+
const rightW = this.columns - chatW - 1;
|
|
188
|
+
let buf = "";
|
|
165
189
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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 =
|
|
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 +=
|
|
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
|
-
// ──
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
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
|
-
|
|
201
|
-
//
|
|
202
|
-
const
|
|
203
|
-
|
|
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
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
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
|
-
|
|
236
|
-
const
|
|
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;
|
|
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
|
-
|
|
279
|
+
const padded = padRight(line, innerW);
|
|
280
|
+
return ` ${padded} `;
|
|
261
281
|
}
|
|
262
282
|
|
|
263
283
|
private buildSidebar(width: number): string[] {
|
|
264
|
-
const { agent
|
|
265
|
-
const addr = `${agent.address.slice(0, 6)}
|
|
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
|
-
`
|
|
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
|
-
`
|
|
283
|
-
`
|
|
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
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
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
|
}
|