@memnexus-ai/mx-agent-cli 0.1.66 → 0.1.67
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/lib/agent-session.d.ts +2 -0
- package/dist/lib/agent-session.d.ts.map +1 -1
- package/dist/lib/agent-session.js +195 -154
- package/dist/lib/agent-session.js.map +1 -1
- package/dist/lib/terminal-ui.d.ts +14 -1
- package/dist/lib/terminal-ui.d.ts.map +1 -1
- package/dist/lib/terminal-ui.js +131 -10
- package/dist/lib/terminal-ui.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
* - Streaming terminal output via stream_event/content_block_delta
|
|
8
8
|
* - SDK hook callbacks for Stop (session sync) and PreCompact (checkpoint)
|
|
9
9
|
* - Worktree isolation guard reimplemented in canUseTool (defense-in-depth)
|
|
10
|
+
* - Esc to pause mid-session and inject a prompt (resumes via session ID)
|
|
11
|
+
* - /model slash command at the Esc prompt — interactive model picker
|
|
10
12
|
*
|
|
11
13
|
* Config loading:
|
|
12
14
|
* settingSources: ['project', 'local'] loads:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../../src/lib/agent-session.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../../src/lib/agent-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAgLH,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4JjF"}
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
* - Streaming terminal output via stream_event/content_block_delta
|
|
8
8
|
* - SDK hook callbacks for Stop (session sync) and PreCompact (checkpoint)
|
|
9
9
|
* - Worktree isolation guard reimplemented in canUseTool (defense-in-depth)
|
|
10
|
+
* - Esc to pause mid-session and inject a prompt (resumes via session ID)
|
|
11
|
+
* - /model slash command at the Esc prompt — interactive model picker
|
|
10
12
|
*
|
|
11
13
|
* Config loading:
|
|
12
14
|
* settingSources: ['project', 'local'] loads:
|
|
@@ -24,7 +26,7 @@ import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
|
24
26
|
import { createInterface } from 'readline';
|
|
25
27
|
import { spawnSync } from 'child_process';
|
|
26
28
|
import chalk from 'chalk';
|
|
27
|
-
import { handleStreamEvent, renderQuestion, renderResult } from './terminal-ui.js';
|
|
29
|
+
import { handleStreamEvent, renderQuestion, renderResult, renderModelPicker, ensureNewLine, } from './terminal-ui.js';
|
|
28
30
|
// ── Terminal appearance (mirrors claude.ts) ────────────────────────────
|
|
29
31
|
const AGENT_COLORS = [
|
|
30
32
|
'#4CAF50', '#2196F3', '#FF9800', '#E91E63', '#9C27B0',
|
|
@@ -48,97 +50,123 @@ function resetTerminalAppearance() {
|
|
|
48
50
|
process.stdout.write(`\x1b]633;P;tabColor=\x07`);
|
|
49
51
|
}
|
|
50
52
|
// ── Session sync (mirrors Stop shell hook) ────────────────────────────
|
|
51
|
-
let syncFired = false;
|
|
52
53
|
function runSessionSync() {
|
|
53
|
-
|
|
54
|
-
return;
|
|
55
|
-
syncFired = true;
|
|
56
|
-
// Same as Stop shell hook: mx-agent sync --quiet
|
|
57
|
-
// Reads API URL + token from ~/.mx-agent/config.json
|
|
58
|
-
spawnSync('mx-agent', ['sync', '--quiet'], {
|
|
59
|
-
stdio: 'pipe',
|
|
60
|
-
encoding: 'utf-8',
|
|
61
|
-
});
|
|
54
|
+
spawnSync('mx-agent', ['sync', '--quiet'], { stdio: 'pipe', encoding: 'utf-8' });
|
|
62
55
|
}
|
|
63
56
|
// ── Worktree guard (TypeScript port of worktree-guard.sh) ─────────────
|
|
64
|
-
/**
|
|
65
|
-
* Checks if a Bash command violates worktree isolation rules.
|
|
66
|
-
* Returns a denial message if blocked, or null if allowed.
|
|
67
|
-
*
|
|
68
|
-
* Rules mirrored from mx-agent-system/agent-config/hooks/worktree-guard.sh:
|
|
69
|
-
* 1. Block cd outside worktree (except /tmp, ~/*)
|
|
70
|
-
* 2. Block git checkout/switch to main
|
|
71
|
-
* 3. Block git checkout -b / git switch -c (new branches)
|
|
72
|
-
* 4. Block git merge
|
|
73
|
-
* 5. Block git push to main
|
|
74
|
-
*/
|
|
75
57
|
function checkWorktreeGuard(command, worktreePath, worktreeName) {
|
|
76
58
|
if (!worktreePath || !command)
|
|
77
59
|
return null;
|
|
78
60
|
const cmd = command.trim();
|
|
79
|
-
// Rule 1: cd outside worktree
|
|
80
61
|
if (/\bcd\s+/.test(cmd)) {
|
|
81
|
-
const
|
|
82
|
-
for (const match of cdMatches) {
|
|
62
|
+
for (const match of cmd.matchAll(/\bcd\s+([^\s;&|]+)/g)) {
|
|
83
63
|
const target = match[1].replace(/^["']|["']$/g, '');
|
|
84
64
|
if (!target)
|
|
85
65
|
continue;
|
|
86
|
-
// Allow relative paths (stay within cwd → worktree)
|
|
87
66
|
if (!target.startsWith('/') && !target.startsWith('~'))
|
|
88
67
|
continue;
|
|
89
|
-
// Allow /tmp
|
|
90
68
|
if (target.startsWith('/tmp') || target.startsWith('/var/tmp'))
|
|
91
69
|
continue;
|
|
92
|
-
// Allow within worktree
|
|
93
70
|
if (target.startsWith(worktreePath))
|
|
94
71
|
continue;
|
|
95
|
-
// Allow home directory
|
|
96
72
|
const home = process.env.HOME ?? '';
|
|
97
73
|
if (home && target.startsWith(home))
|
|
98
74
|
continue;
|
|
99
|
-
// Allow /workspace (needed for some cross-repo lookups in practice)
|
|
100
|
-
// Keep this narrow — only /workspace itself, not arbitrary paths
|
|
101
75
|
if (target === '/workspace')
|
|
102
76
|
continue;
|
|
103
77
|
return `BLOCKED: Cannot navigate outside worktree\n Target: ${target}\n Allowed: ${worktreePath} (and /tmp)\n Worktree: ${worktreeName}`;
|
|
104
78
|
}
|
|
105
79
|
}
|
|
106
|
-
|
|
107
|
-
if (/git\s+(checkout|switch)\s+main(\s|$)/.test(cmd)) {
|
|
80
|
+
if (/git\s+(checkout|switch)\s+main(\s|$)/.test(cmd))
|
|
108
81
|
return `BLOCKED: Cannot switch to main branch\n Command: ${cmd.slice(0, 100)}\n Worktree: ${worktreeName}`;
|
|
109
|
-
|
|
110
|
-
// Rule 3: new branch creation
|
|
111
|
-
if (/git\s+(checkout\s+-b|switch\s+(-c|--create))/.test(cmd)) {
|
|
82
|
+
if (/git\s+(checkout\s+-b|switch\s+(-c|--create))/.test(cmd))
|
|
112
83
|
return `BLOCKED: Cannot create new branches\n Command: ${cmd.slice(0, 100)}\n Worktree: ${worktreeName}`;
|
|
113
|
-
|
|
114
|
-
// Rule 4: merge
|
|
115
|
-
if (/git\s+merge\s/.test(cmd)) {
|
|
84
|
+
if (/git\s+merge\s/.test(cmd))
|
|
116
85
|
return `BLOCKED: Cannot merge branches directly\n Command: ${cmd.slice(0, 100)}\n Worktree: ${worktreeName}`;
|
|
117
|
-
|
|
118
|
-
// Rule 5: push to main
|
|
119
|
-
if (/git\s+push\s+.*origin\s+main/.test(cmd)) {
|
|
86
|
+
if (/git\s+push\s+.*origin\s+main/.test(cmd))
|
|
120
87
|
return `BLOCKED: Cannot push to main\n Command: ${cmd.slice(0, 100)}`;
|
|
121
|
-
}
|
|
122
88
|
return null;
|
|
123
89
|
}
|
|
124
|
-
// ── Terminal input
|
|
125
|
-
|
|
90
|
+
// ── Terminal input helpers ─────────────────────────────────────────────
|
|
91
|
+
/** Read a line in raw mode, echoing characters + supporting backspace. */
|
|
92
|
+
async function readPromptLine(prompt) {
|
|
93
|
+
process.stdout.write(prompt);
|
|
94
|
+
let buffer = '';
|
|
95
|
+
return new Promise((resolve) => {
|
|
96
|
+
process.stdin.setRawMode(true);
|
|
97
|
+
process.stdin.resume();
|
|
98
|
+
const handler = (key) => {
|
|
99
|
+
const ch = key.toString();
|
|
100
|
+
if (ch === '\x03') {
|
|
101
|
+
process.stdin.removeListener('data', handler);
|
|
102
|
+
process.stdin.setRawMode(false);
|
|
103
|
+
process.stdout.write('\n');
|
|
104
|
+
runSessionSync();
|
|
105
|
+
resetTerminalAppearance();
|
|
106
|
+
process.exit(0);
|
|
107
|
+
}
|
|
108
|
+
if (ch === '\r' || ch === '\n') {
|
|
109
|
+
process.stdout.write('\n');
|
|
110
|
+
process.stdin.removeListener('data', handler);
|
|
111
|
+
process.stdin.setRawMode(false);
|
|
112
|
+
resolve(buffer);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (key[0] === 0x7f || key[0] === 0x08) {
|
|
116
|
+
if (buffer.length > 0) {
|
|
117
|
+
buffer = buffer.slice(0, -1);
|
|
118
|
+
process.stdout.write('\b \b');
|
|
119
|
+
}
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (key[0] < 0x20)
|
|
123
|
+
return; // ignore other control chars
|
|
124
|
+
buffer += ch;
|
|
125
|
+
process.stdout.write(ch);
|
|
126
|
+
};
|
|
127
|
+
process.stdin.on('data', handler);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
/** Read an answer from stdin using readline (cooked mode — for AskUserQuestion). */
|
|
131
|
+
async function readLine() {
|
|
126
132
|
return new Promise((resolve) => {
|
|
127
133
|
const rl = createInterface({ input: process.stdin, output: process.stdout, terminal: false });
|
|
128
|
-
rl.once('line', (line) => {
|
|
129
|
-
rl.close();
|
|
130
|
-
resolve(line.trim());
|
|
131
|
-
});
|
|
132
|
-
// If stdin closes without a line, resolve with empty string
|
|
134
|
+
rl.once('line', (line) => { rl.close(); resolve(line.trim()); });
|
|
133
135
|
rl.once('close', () => resolve(''));
|
|
134
136
|
});
|
|
135
137
|
}
|
|
138
|
+
// ── Esc prompt: read message or handle /model ──────────────────────────
|
|
139
|
+
/**
|
|
140
|
+
* Show the ❯ prompt after an Esc interrupt. Loops until the user either
|
|
141
|
+
* provides a non-empty message or exits with empty input. Handles /model
|
|
142
|
+
* by showing the interactive picker and then re-showing the prompt.
|
|
143
|
+
*
|
|
144
|
+
* Returns { message, model } to resume with, or null to exit.
|
|
145
|
+
*/
|
|
146
|
+
async function getResumeInput(models, currentModel) {
|
|
147
|
+
let pendingModel;
|
|
148
|
+
while (true) {
|
|
149
|
+
console.log();
|
|
150
|
+
console.log(chalk.dim(' ─────────────────────────────────────────────'));
|
|
151
|
+
const input = await readPromptLine(chalk.bold(' ❯ '));
|
|
152
|
+
if (input.trim() === '/model') {
|
|
153
|
+
const picked = await renderModelPicker(models, pendingModel ?? currentModel);
|
|
154
|
+
if (picked !== null)
|
|
155
|
+
pendingModel = picked;
|
|
156
|
+
continue; // show prompt again
|
|
157
|
+
}
|
|
158
|
+
const message = input.trim();
|
|
159
|
+
if (!message && pendingModel === undefined) {
|
|
160
|
+
// Nothing entered, no model change → exit
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
// Use "Continue." as the message if only a model change was made
|
|
164
|
+
return { message: message || 'Continue.', model: pendingModel };
|
|
165
|
+
}
|
|
166
|
+
}
|
|
136
167
|
export async function launchAgentSession(opts) {
|
|
137
168
|
const { worktreePath, worktreeName, branch, slot, initialPrompt, teamName } = opts;
|
|
138
169
|
// ── Build env: inherit all vars, strip CLAUDECODE ──────────────────
|
|
139
|
-
// CLAUDECODE is set by the outer Claude Code process and prevents the SDK
|
|
140
|
-
// from spawning a nested session. In production mx-agent is the outer process
|
|
141
|
-
// so CLAUDECODE is never set — but this guard is needed for dev/test.
|
|
142
170
|
const sessionEnv = {};
|
|
143
171
|
for (const [k, v] of Object.entries(process.env)) {
|
|
144
172
|
if (k !== 'CLAUDECODE' && v !== undefined)
|
|
@@ -151,117 +179,130 @@ export async function launchAgentSession(opts) {
|
|
|
151
179
|
// ── UI setup ───────────────────────────────────────────────────────
|
|
152
180
|
console.log();
|
|
153
181
|
console.log(chalk.bold(' Starting Agent SDK session (experimental)...'));
|
|
154
|
-
console.log(chalk.dim(' Press Ctrl+C to exit'));
|
|
182
|
+
console.log(chalk.dim(' Press Esc to pause · /model to switch models · Ctrl+C to exit'));
|
|
155
183
|
console.log();
|
|
156
184
|
setTerminalAppearance(teamName);
|
|
157
|
-
// ──
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
185
|
+
// ── canUseTool (shared across all sessions in the resume loop) ─────
|
|
186
|
+
const canUseTool = async (toolName, input) => {
|
|
187
|
+
if (toolName === 'AskUserQuestion') {
|
|
188
|
+
const questions = input.questions ?? [];
|
|
189
|
+
renderQuestion(questions);
|
|
190
|
+
const answer = await readLine();
|
|
191
|
+
process.stdout.write('\n');
|
|
192
|
+
const answers = {};
|
|
193
|
+
for (const q of questions)
|
|
194
|
+
answers[q.question] = answer;
|
|
195
|
+
return { behavior: 'allow', updatedInput: { ...input, answers } };
|
|
196
|
+
}
|
|
197
|
+
if (toolName === 'Bash') {
|
|
198
|
+
const block = checkWorktreeGuard(String(input.command ?? ''), worktreePath, worktreeName);
|
|
199
|
+
if (block)
|
|
200
|
+
return { behavior: 'deny', message: block };
|
|
201
|
+
}
|
|
202
|
+
return { behavior: 'allow', updatedInput: input };
|
|
203
|
+
};
|
|
204
|
+
// ── Session loop: initial run + resumes after Esc ──────────────────
|
|
205
|
+
let currentPrompt = initialPrompt;
|
|
206
|
+
let resumeSessionId;
|
|
207
|
+
let selectedModel;
|
|
166
208
|
try {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
209
|
+
while (true) {
|
|
210
|
+
const session = query({
|
|
211
|
+
prompt: currentPrompt,
|
|
212
|
+
options: {
|
|
213
|
+
cwd: worktreePath,
|
|
214
|
+
settingSources: ['project', 'local'],
|
|
215
|
+
systemPrompt: { type: 'preset', preset: 'claude_code' },
|
|
216
|
+
includePartialMessages: true,
|
|
217
|
+
env: sessionEnv,
|
|
218
|
+
mcpServers: { MX: { command: 'mx', args: ['mcp-server'] } },
|
|
219
|
+
...(selectedModel ? { model: selectedModel } : {}),
|
|
220
|
+
...(resumeSessionId ? { resume: resumeSessionId } : {}),
|
|
221
|
+
canUseTool,
|
|
222
|
+
hooks: {
|
|
223
|
+
Stop: [{ hooks: [async (_) => { runSessionSync(); return { continue: true }; }] }],
|
|
224
|
+
PreCompact: [{ hooks: [async (_) => { return { continue: true }; }] }],
|
|
225
|
+
},
|
|
226
|
+
stderr: (data) => {
|
|
227
|
+
if (data.trim())
|
|
228
|
+
console.error(chalk.dim(` [sdk] ${data.trimEnd()}`));
|
|
229
|
+
},
|
|
181
230
|
},
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
231
|
+
});
|
|
232
|
+
// Per-session state
|
|
233
|
+
let escaped = false;
|
|
234
|
+
let capturedSessionId = '';
|
|
235
|
+
let capturedModel;
|
|
236
|
+
let modelsPromise = Promise.resolve([]);
|
|
237
|
+
// ── Keypress handler (raw mode) ───────────────────────────────
|
|
238
|
+
process.stdin.setRawMode(true);
|
|
239
|
+
process.stdin.resume();
|
|
240
|
+
const handleKey = (key) => {
|
|
241
|
+
const ch = key.toString();
|
|
242
|
+
if (ch === '\x03') {
|
|
243
|
+
ensureNewLine();
|
|
244
|
+
session.close();
|
|
245
|
+
escaped = false; // Ctrl+C = exit, not resume
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
if (key[0] === 0x1b && key.length === 1) {
|
|
249
|
+
if (escaped)
|
|
250
|
+
return; // already handling
|
|
251
|
+
escaped = true;
|
|
252
|
+
ensureNewLine();
|
|
253
|
+
// Fetch models while session is still alive, then close
|
|
254
|
+
modelsPromise = session.supportedModels()
|
|
255
|
+
.catch(() => [])
|
|
256
|
+
.finally(() => { session.close(); });
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
process.stdin.on('data', handleKey);
|
|
260
|
+
// ── Event loop ────────────────────────────────────────────────
|
|
261
|
+
try {
|
|
262
|
+
for await (const msg of session) {
|
|
263
|
+
if (escaped)
|
|
264
|
+
continue; // mute output while fetching models
|
|
265
|
+
if (handleStreamEvent(msg))
|
|
266
|
+
continue;
|
|
267
|
+
switch (msg.type) {
|
|
268
|
+
case 'result':
|
|
269
|
+
renderResult(msg);
|
|
270
|
+
break;
|
|
271
|
+
case 'system': {
|
|
272
|
+
const sys = msg;
|
|
273
|
+
if (sys.session_id)
|
|
274
|
+
capturedSessionId = sys.session_id;
|
|
275
|
+
if (sys.subtype === 'init' && sys.model)
|
|
276
|
+
capturedModel = sys.model;
|
|
277
|
+
break;
|
|
207
278
|
}
|
|
279
|
+
default:
|
|
280
|
+
break;
|
|
208
281
|
}
|
|
209
|
-
return { behavior: 'allow', updatedInput: input };
|
|
210
|
-
},
|
|
211
|
-
// ── SDK hook callbacks ─────────────────────────────────────
|
|
212
|
-
hooks: {
|
|
213
|
-
// Stop: run session sync (supplements the Stop shell hook in settings.json)
|
|
214
|
-
Stop: [{
|
|
215
|
-
hooks: [async (_input) => {
|
|
216
|
-
runSessionSync();
|
|
217
|
-
return { continue: true };
|
|
218
|
-
}],
|
|
219
|
-
}],
|
|
220
|
-
// PreCompact: shell hook auto-checkpoint.sh fires from settings.json.
|
|
221
|
-
// SDK callback here is a lightweight signal that compaction occurred.
|
|
222
|
-
PreCompact: [{
|
|
223
|
-
hooks: [async (_input) => {
|
|
224
|
-
// auto-checkpoint.sh (from settings.json) saves the checkpoint memory.
|
|
225
|
-
// Nothing extra needed here in Phase 1.
|
|
226
|
-
return { continue: true };
|
|
227
|
-
}],
|
|
228
|
-
}],
|
|
229
|
-
},
|
|
230
|
-
// Capture stderr for surfacing SDK errors without flooding terminal
|
|
231
|
-
stderr: (data) => {
|
|
232
|
-
if (data.trim())
|
|
233
|
-
console.error(chalk.dim(` [sdk] ${data.trimEnd()}`));
|
|
234
|
-
},
|
|
235
|
-
},
|
|
236
|
-
});
|
|
237
|
-
// ── Event loop ────────────────────────────────────────────────
|
|
238
|
-
for await (const msg of session) {
|
|
239
|
-
// stream_event: real-time text rendering
|
|
240
|
-
if (handleStreamEvent(msg))
|
|
241
|
-
continue;
|
|
242
|
-
switch (msg.type) {
|
|
243
|
-
case 'result':
|
|
244
|
-
renderResult(msg);
|
|
245
|
-
break;
|
|
246
|
-
case 'system': {
|
|
247
|
-
// SessionStart hook output, init message — suppress most of it
|
|
248
|
-
const sys = msg;
|
|
249
|
-
if (sys.subtype === 'init') {
|
|
250
|
-
// Could log available tools here for debug purposes
|
|
251
|
-
}
|
|
252
|
-
break;
|
|
253
282
|
}
|
|
254
|
-
default:
|
|
255
|
-
// Other message types (user tool results, partial messages, etc.)
|
|
256
|
-
// are handled implicitly — text output comes through stream_event
|
|
257
|
-
break;
|
|
258
283
|
}
|
|
284
|
+
catch (err) {
|
|
285
|
+
if (!escaped) {
|
|
286
|
+
console.error(chalk.red(`\n Session error: ${err instanceof Error ? err.message : String(err)}`));
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
finally {
|
|
290
|
+
process.stdin.removeListener('data', handleKey);
|
|
291
|
+
process.stdin.setRawMode(false);
|
|
292
|
+
}
|
|
293
|
+
if (!escaped)
|
|
294
|
+
break; // Normal completion or Ctrl+C
|
|
295
|
+
// ── Esc: wait for models, then show prompt ────────────────────
|
|
296
|
+
const models = await modelsPromise;
|
|
297
|
+
const resume = await getResumeInput(models, capturedModel ?? selectedModel);
|
|
298
|
+
if (resume === null)
|
|
299
|
+
break; // user exited with empty input
|
|
300
|
+
currentPrompt = resume.message;
|
|
301
|
+
resumeSessionId = capturedSessionId;
|
|
302
|
+
if (resume.model !== undefined)
|
|
303
|
+
selectedModel = resume.model;
|
|
259
304
|
}
|
|
260
305
|
}
|
|
261
|
-
catch (err) {
|
|
262
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
263
|
-
console.error(chalk.red(`\n Session error: ${msg}`));
|
|
264
|
-
}
|
|
265
306
|
finally {
|
|
266
307
|
runSessionSync();
|
|
267
308
|
resetTerminalAppearance();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session.js","sourceRoot":"","sources":["../../src/lib/agent-session.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent-session.js","sourceRoot":"","sources":["../../src/lib/agent-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* - Questions: highlighted block with options list
|
|
12
12
|
* - Result: cost/token summary footer
|
|
13
13
|
*/
|
|
14
|
-
import type { SDKMessage } from '@anthropic-ai/claude-agent-sdk';
|
|
14
|
+
import type { SDKMessage, ModelInfo } from '@anthropic-ai/claude-agent-sdk';
|
|
15
15
|
/**
|
|
16
16
|
* Handle a raw SDKMessage from the query() event loop.
|
|
17
17
|
* Call this for every message yielded by the session.
|
|
@@ -45,4 +45,17 @@ export declare function renderQuestion(questions: Array<{
|
|
|
45
45
|
* Render the final result summary (cost, tokens, duration).
|
|
46
46
|
*/
|
|
47
47
|
export declare function renderResult(msg: SDKMessage): void;
|
|
48
|
+
/**
|
|
49
|
+
* Interactive model picker — renders an arrow-key navigable list below the
|
|
50
|
+
* current cursor position. Returns the selected model value, or null if
|
|
51
|
+
* the user cancelled with Esc.
|
|
52
|
+
*
|
|
53
|
+
* Rendered like Claude Code's native /model picker:
|
|
54
|
+
* ── Select model ──────────────────────────────────────
|
|
55
|
+
* Claude Opus 4.6 — Most capable model
|
|
56
|
+
* ❯ Claude Sonnet 4.6 — Fast and capable (current)
|
|
57
|
+
* Claude Haiku 4.5 — Fastest
|
|
58
|
+
*/
|
|
59
|
+
export declare function renderModelPicker(models: ModelInfo[], currentModel?: string): Promise<string | null>;
|
|
60
|
+
export declare function ensureNewLine(): void;
|
|
48
61
|
//# sourceMappingURL=terminal-ui.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-ui.d.ts","sourceRoot":"","sources":["../../src/lib/terminal-ui.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"terminal-ui.d.ts","sourceRoot":"","sources":["../../src/lib/terminal-ui.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAS5E;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAoD1D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,IAAI,CAc5H;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC,GAAG,IAAI,CAmBR;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CA6BlD;AAmBD;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,SAAS,EAAE,EACnB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA0FxB;AAED,wBAAgB,aAAa,IAAI,IAAI,CAKpC"}
|
package/dist/lib/terminal-ui.js
CHANGED
|
@@ -14,6 +14,9 @@
|
|
|
14
14
|
import chalk from 'chalk';
|
|
15
15
|
// Track whether we're currently mid-stream (need a newline before tool output)
|
|
16
16
|
let midLine = false;
|
|
17
|
+
// Buffer tool input JSON as it streams, so we can print the key arg on block_stop
|
|
18
|
+
let currentToolName = null;
|
|
19
|
+
let inputBuffer = '';
|
|
17
20
|
/**
|
|
18
21
|
* Handle a raw SDKMessage from the query() event loop.
|
|
19
22
|
* Call this for every message yielded by the session.
|
|
@@ -27,10 +30,16 @@ export function handleStreamEvent(msg) {
|
|
|
27
30
|
return true;
|
|
28
31
|
switch (ev.type) {
|
|
29
32
|
case 'content_block_start':
|
|
30
|
-
// Announce tool use blocks (not text blocks)
|
|
31
33
|
if (ev.content_block?.type === 'tool_use' && ev.content_block?.name) {
|
|
32
34
|
ensureNewLine();
|
|
35
|
+
currentToolName = ev.content_block.name;
|
|
36
|
+
inputBuffer = '';
|
|
33
37
|
process.stdout.write(chalk.dim(` [${ev.content_block.name}] `));
|
|
38
|
+
midLine = true;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
currentToolName = null;
|
|
42
|
+
inputBuffer = '';
|
|
34
43
|
}
|
|
35
44
|
break;
|
|
36
45
|
case 'content_block_delta':
|
|
@@ -39,15 +48,25 @@ export function handleStreamEvent(msg) {
|
|
|
39
48
|
midLine = !ev.delta.text.endsWith('\n');
|
|
40
49
|
}
|
|
41
50
|
else if (ev.delta?.type === 'input_json_delta') {
|
|
42
|
-
//
|
|
43
|
-
|
|
44
|
-
midLine = true;
|
|
51
|
+
// Accumulate JSON — print summary on content_block_stop
|
|
52
|
+
inputBuffer += ev.delta.partial_json ?? '';
|
|
45
53
|
}
|
|
46
54
|
break;
|
|
47
55
|
case 'content_block_stop':
|
|
48
|
-
if (
|
|
49
|
-
|
|
50
|
-
|
|
56
|
+
if (currentToolName && inputBuffer) {
|
|
57
|
+
try {
|
|
58
|
+
const parsed = JSON.parse(inputBuffer);
|
|
59
|
+
const summary = extractToolSummary(currentToolName, parsed);
|
|
60
|
+
if (summary)
|
|
61
|
+
process.stdout.write(chalk.dim(summary));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Incomplete JSON (empty input tools) — print nothing extra
|
|
65
|
+
}
|
|
66
|
+
process.stdout.write('\n');
|
|
67
|
+
midLine = false;
|
|
68
|
+
currentToolName = null;
|
|
69
|
+
inputBuffer = '';
|
|
51
70
|
}
|
|
52
71
|
break;
|
|
53
72
|
case 'message_stop':
|
|
@@ -71,8 +90,9 @@ export function renderAssistantMessage(content) {
|
|
|
71
90
|
}
|
|
72
91
|
else if (block.type === 'tool_use') {
|
|
73
92
|
ensureNewLine();
|
|
74
|
-
const
|
|
75
|
-
|
|
93
|
+
const name = block.name ?? 'Tool';
|
|
94
|
+
const inputSummary = block.input ? extractToolSummary(name, block.input) : '';
|
|
95
|
+
process.stdout.write(chalk.dim(` [${name}] ${inputSummary}\n`));
|
|
76
96
|
}
|
|
77
97
|
}
|
|
78
98
|
}
|
|
@@ -126,7 +146,108 @@ export function renderResult(msg) {
|
|
|
126
146
|
}
|
|
127
147
|
}
|
|
128
148
|
// ── Internal helpers ──────────────────────────────────────────────────
|
|
129
|
-
function
|
|
149
|
+
function extractToolSummary(toolName, input) {
|
|
150
|
+
switch (toolName) {
|
|
151
|
+
case 'Read': return String(input.file_path ?? '');
|
|
152
|
+
case 'Write': return String(input.file_path ?? '');
|
|
153
|
+
case 'Edit': return String(input.file_path ?? '');
|
|
154
|
+
case 'Glob': return String(input.pattern ?? '');
|
|
155
|
+
case 'Grep': return `"${input.pattern ?? ''}"${input.path ? ` in ${input.path}` : ''}`;
|
|
156
|
+
case 'Bash': return String(input.command ?? '').split('\n')[0].slice(0, 120);
|
|
157
|
+
case 'Agent': return String(input.description ?? '');
|
|
158
|
+
case 'WebFetch': return String(input.url ?? '');
|
|
159
|
+
case 'WebSearch': return String(input.query ?? '');
|
|
160
|
+
default: return JSON.stringify(input).slice(0, 100);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Interactive model picker — renders an arrow-key navigable list below the
|
|
165
|
+
* current cursor position. Returns the selected model value, or null if
|
|
166
|
+
* the user cancelled with Esc.
|
|
167
|
+
*
|
|
168
|
+
* Rendered like Claude Code's native /model picker:
|
|
169
|
+
* ── Select model ──────────────────────────────────────
|
|
170
|
+
* Claude Opus 4.6 — Most capable model
|
|
171
|
+
* ❯ Claude Sonnet 4.6 — Fast and capable (current)
|
|
172
|
+
* Claude Haiku 4.5 — Fastest
|
|
173
|
+
*/
|
|
174
|
+
export async function renderModelPicker(models, currentModel) {
|
|
175
|
+
if (models.length === 0) {
|
|
176
|
+
console.log(chalk.dim(' No models available'));
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
let selected = Math.max(0, models.findIndex(m => m.value === currentModel));
|
|
180
|
+
function printList() {
|
|
181
|
+
const lines = [
|
|
182
|
+
chalk.dim(' ── Select model (↑↓ navigate · Enter select · Esc cancel) ──'),
|
|
183
|
+
];
|
|
184
|
+
for (let i = 0; i < models.length; i++) {
|
|
185
|
+
const m = models[i];
|
|
186
|
+
const isCurrent = m.value === currentModel;
|
|
187
|
+
const isSel = i === selected;
|
|
188
|
+
const cursor = isSel ? chalk.cyan('❯') : ' ';
|
|
189
|
+
const label = (isSel ? chalk.bold.white : chalk.reset)((m.displayName || m.value).padEnd(22));
|
|
190
|
+
const desc = m.description
|
|
191
|
+
? chalk.dim(' — ' + m.description.slice(0, 48))
|
|
192
|
+
: '';
|
|
193
|
+
const tag = isCurrent ? chalk.dim(' (current)') : '';
|
|
194
|
+
lines.push(` ${cursor} ${label}${desc}${tag}`);
|
|
195
|
+
}
|
|
196
|
+
for (const line of lines)
|
|
197
|
+
process.stdout.write(line + '\n');
|
|
198
|
+
return lines.length;
|
|
199
|
+
}
|
|
200
|
+
let printed = printList();
|
|
201
|
+
return new Promise((resolve) => {
|
|
202
|
+
process.stdin.setRawMode(true);
|
|
203
|
+
process.stdin.resume();
|
|
204
|
+
const handler = (key) => {
|
|
205
|
+
const ch = key.toString();
|
|
206
|
+
if (ch === '\x03') {
|
|
207
|
+
// Ctrl+C — propagate up (caller handles exit)
|
|
208
|
+
cleanup(null);
|
|
209
|
+
process.stdin.emit('data', key); // re-emit so outer handler sees it
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (key[0] === 0x1b && key.length === 1) {
|
|
213
|
+
// Esc — cancel
|
|
214
|
+
cleanup(null);
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
if (ch === '\x1b[A' && selected > 0) {
|
|
218
|
+
selected--;
|
|
219
|
+
redraw();
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
if (ch === '\x1b[B' && selected < models.length - 1) {
|
|
223
|
+
selected++;
|
|
224
|
+
redraw();
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
if (ch === '\r' || ch === '\n') {
|
|
228
|
+
const chosen = models[selected];
|
|
229
|
+
clearList();
|
|
230
|
+
process.stdout.write(chalk.green(` ✓ ${chosen.displayName || chosen.value}\n`));
|
|
231
|
+
cleanup(chosen.value);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
function redraw() {
|
|
236
|
+
clearList();
|
|
237
|
+
printed = printList();
|
|
238
|
+
}
|
|
239
|
+
function clearList() {
|
|
240
|
+
process.stdout.write(`\x1b[${printed}F\x1b[J`);
|
|
241
|
+
}
|
|
242
|
+
function cleanup(result) {
|
|
243
|
+
process.stdin.removeListener('data', handler);
|
|
244
|
+
process.stdin.setRawMode(false);
|
|
245
|
+
resolve(result);
|
|
246
|
+
}
|
|
247
|
+
process.stdin.on('data', handler);
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
export function ensureNewLine() {
|
|
130
251
|
if (midLine) {
|
|
131
252
|
process.stdout.write('\n');
|
|
132
253
|
midLine = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-ui.js","sourceRoot":"","sources":["../../src/lib/terminal-ui.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,+EAA+E;AAC/E,IAAI,OAAO,GAAG,KAAK,CAAC;AAEpB;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAe;IAC/C,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,KAAK,CAAC;IAE9C,MAAM,EAAE,GAAI,GAAuJ,CAAC,KAAK,CAAC;IAC1K,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAErB,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,qBAAqB;YACxB,
|
|
1
|
+
{"version":3,"file":"terminal-ui.js","sourceRoot":"","sources":["../../src/lib/terminal-ui.ts"],"names":[],"mappings":"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"}
|