@coralai/sps-cli 0.26.8 → 0.27.1

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/README.md CHANGED
@@ -4,22 +4,31 @@
4
4
 
5
5
  > **中文文档**: See `README-CN.md` in the source repository for Chinese documentation.
6
6
 
7
- **v0.26.1**
7
+ **v0.27.0**
8
8
 
9
- SPS (Smart Pipeline System) is a fully automated development pipeline CLI tool driven by AI Agents. From task card creation to code merging, the entire process runs unattended.
9
+ SPS (Smart Pipeline System) is an AI Agent harness and automated development pipeline. Two modes:
10
10
 
11
- ```
12
- Create cards -> Start pipeline -> Development worker completes branch work -> QA worker integrates branch -> Notify completion
11
+ - **Harness mode** (`sps agent`): Zero-config, direct agent interaction with multi-turn chat
12
+ - **Pipeline mode** (`sps pipeline`): Fully automated card-driven development workflow
13
+
14
+ ```bash
15
+ # Harness mode — talk to any agent instantly
16
+ sps agent "Explain this repo"
17
+ sps agent --chat # multi-turn REPL
18
+ sps agent --tool codex "Fix tests" # choose agent
19
+
20
+ # Pipeline mode — automated development workflow
21
+ sps pipeline start my-project # or: sps tick my-project
13
22
  ```
14
23
 
15
- **v0.26.0 highlights**:
24
+ **v0.27.0 highlights**:
16
25
 
17
- - **ACP SDK Transport**: Worker communication uses structured ACP JSON-RPC over stdio instead of terminal screen-scraping. Claude uses Anthropic's official `claude-agent-sdk`, Codex uses Zed's Rust native `codex-acp` binary. Deterministic state detection — no regex, no guessing.
18
- - **Unified adapter**: One `AcpSdkAdapter` replaces 6 legacy providers (ClaudePrint, CodexExec, ClaudeTmux, CodexTmux + tmux utilities). Adding new agents (Gemini, Cursor, etc.) requires only a registry entry.
19
- - **Real-time worker logs**: ACP events stream to `*-acp-*.log` files. `sps logs` and `sps worker dashboard` display worker output in real-time.
20
- - **Permission handling**: ACP `requestPermission` callback enables programmatic per-tool-call approval (default: auto-approve all).
26
+ - **Harness mode**: `sps agent` for zero-config agent interaction. One-shot and multi-turn chat with context retention. Supports Claude, Codex, and Gemini.
27
+ - **Two-mode architecture**: Harness (`sps agent`) and Pipeline (`sps pipeline`) share the ACP SDK transport but are fully independent different state files, different lifecycles.
28
+ - **Pipeline command group**: `sps pipeline start/stop/status/reset/workers/board/logs`. Old commands (`sps tick`, `sps stop`, etc.) preserved as aliases.
29
+ - **ACP SDK Transport** (v0.26.0): Structured JSON-RPC over stdio. Claude via official `claude-agent-sdk`, Codex via Rust native binary, Gemini via native `--acp` mode.
21
30
 
22
- **Architecture**: Two-phase state machine (`Inprogress` = development, `QA` = integration/merge). WorkerManager ACP interface mediates all worker lifecycle. IntegrationQueue serializes merges. Default transport is `acp-sdk` (structured protocol); `proc` one-shot mode available as fallback via `WORKER_TRANSPORT=proc`.
31
+ **Architecture**: ACP SDK adapter communicates with agents via structured protocol (no terminal scraping). Pipeline mode uses WorkerManager + CompletionJudge for card flow automation. Harness mode talks directly to ACPWorkerRuntime, bypassing card logic entirely.
23
32
 
24
33
  ## Table of Contents
25
34
 
@@ -0,0 +1,2 @@
1
+ export declare function executeAgentCommand(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=agentCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentCommand.d.ts","sourceRoot":"","sources":["../../src/commands/agentCommand.ts"],"names":[],"mappings":"AAgIA,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBvE"}
@@ -0,0 +1,351 @@
1
+ /**
2
+ * sps agent — Harness mode: direct agent interaction without project config.
3
+ *
4
+ * Usage:
5
+ * sps agent "<prompt>" # one-shot
6
+ * sps agent --chat # multi-turn REPL
7
+ * sps agent --chat --name backend # named session
8
+ * sps agent --tool codex "<prompt>" # specify agent
9
+ * sps agent status # show sessions
10
+ * sps agent close [--name NAME] # close session
11
+ */
12
+ import * as readline from 'node:readline/promises';
13
+ import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
14
+ import { resolve } from 'node:path';
15
+ import { createSessionContext } from '../core/sessionContext.js';
16
+ import { readState, writeState } from '../core/state.js';
17
+ import { createSessionRuntime } from '../providers/registry.js';
18
+ import { waitAndStream } from './agentRenderer.js';
19
+ import { loadAgentRegistry } from '../providers/adapters/AcpSdkAdapter.js';
20
+ const DIM = '\x1b[90m';
21
+ const RESET = '\x1b[0m';
22
+ const GREEN = '\x1b[32m';
23
+ const RED = '\x1b[31m';
24
+ function parseAgentArgs(argv) {
25
+ const flags = {};
26
+ const positionals = [];
27
+ const contextFiles = [];
28
+ for (let i = 0; i < argv.length; i++) {
29
+ const arg = argv[i];
30
+ if (arg === '--chat') {
31
+ flags.chat = 'true';
32
+ }
33
+ else if (arg === '--json') {
34
+ flags.json = 'true';
35
+ }
36
+ else if (arg === '--verbose' || arg === '-v') {
37
+ flags.verbose = 'true';
38
+ }
39
+ else if (arg === '--tool' && i + 1 < argv.length) {
40
+ flags.tool = argv[++i];
41
+ }
42
+ else if (arg === '--name' && i + 1 < argv.length) {
43
+ flags.name = argv[++i];
44
+ }
45
+ else if (arg === '-s' && i + 1 < argv.length) {
46
+ flags.name = argv[++i];
47
+ }
48
+ else if (arg === '--cwd' && i + 1 < argv.length) {
49
+ flags.cwd = argv[++i];
50
+ }
51
+ else if (arg === '--context' && i + 1 < argv.length) {
52
+ contextFiles.push(argv[++i]);
53
+ }
54
+ else if (arg === '--system' && i + 1 < argv.length) {
55
+ flags.system = argv[++i];
56
+ }
57
+ else if (arg === '--profile' && i + 1 < argv.length) {
58
+ flags.profile = argv[++i];
59
+ }
60
+ else if (!arg.startsWith('-')) {
61
+ positionals.push(arg);
62
+ }
63
+ }
64
+ // Detect subcommand
65
+ const first = positionals[0];
66
+ const common = {
67
+ name: flags.name || 'default',
68
+ tool: (flags.tool || 'claude'),
69
+ cwd: flags.cwd || process.cwd(),
70
+ verbose: flags.verbose === 'true',
71
+ context: contextFiles,
72
+ system: flags.system || '',
73
+ };
74
+ if (first === 'status') {
75
+ return { subcommand: 'status', prompt: '', json: flags.json === 'true', ...common };
76
+ }
77
+ if (first === 'close') {
78
+ return { subcommand: 'close', prompt: '', json: false, ...common };
79
+ }
80
+ if (first === 'list') {
81
+ return { subcommand: 'list', prompt: '', json: flags.json === 'true', ...common };
82
+ }
83
+ if (first === 'add') {
84
+ // sps agent add <name> <command> [args...]
85
+ return { subcommand: 'add', prompt: positionals.slice(1).join(' '), json: false, ...common };
86
+ }
87
+ const prompt = positionals.join(' ');
88
+ const isChat = flags.chat === 'true' || !prompt;
89
+ return {
90
+ subcommand: isChat ? 'chat' : 'run',
91
+ prompt,
92
+ json: flags.json === 'true',
93
+ ...common,
94
+ };
95
+ }
96
+ /** Build final prompt with optional system instruction and file context. */
97
+ function buildPrompt(userPrompt, contextFiles, system) {
98
+ const parts = [];
99
+ if (system) {
100
+ parts.push(`[System instruction] ${system}\n`);
101
+ }
102
+ if (contextFiles.length > 0) {
103
+ for (const file of contextFiles) {
104
+ try {
105
+ const filePath = resolve(file);
106
+ const content = readFileSync(filePath, 'utf-8');
107
+ parts.push(`[File: ${file}]\n\`\`\`\n${content}\n\`\`\`\n`);
108
+ }
109
+ catch {
110
+ parts.push(`[File: ${file}] (could not read)\n`);
111
+ }
112
+ }
113
+ }
114
+ parts.push(userPrompt);
115
+ return parts.join('\n');
116
+ }
117
+ export async function executeAgentCommand(argv) {
118
+ const args = parseAgentArgs(argv);
119
+ if (args.subcommand === 'status') {
120
+ await agentStatus(args);
121
+ return;
122
+ }
123
+ if (args.subcommand === 'close') {
124
+ await agentClose(args);
125
+ return;
126
+ }
127
+ if (args.subcommand === 'list') {
128
+ agentList(args);
129
+ return;
130
+ }
131
+ if (args.subcommand === 'add') {
132
+ agentAdd(args);
133
+ return;
134
+ }
135
+ if (args.subcommand === 'run') {
136
+ await agentOneShot(args);
137
+ return;
138
+ }
139
+ // chat
140
+ await agentChat(args);
141
+ }
142
+ // ── One-shot mode ───────────────────────────────────────────────
143
+ async function agentOneShot(args) {
144
+ const ctx = createSessionContext({ cwd: args.cwd, tool: args.tool });
145
+ const runtime = createSessionRuntime(ctx);
146
+ const slot = `session-oneshot-${Date.now()}`;
147
+ try {
148
+ await runtime.ensureSession(slot, args.tool, args.cwd);
149
+ const prompt = buildPrompt(args.prompt, args.context, args.system);
150
+ await runtime.startRun(slot, prompt, args.tool, args.cwd);
151
+ const result = await waitAndStream(runtime, slot, {
152
+ stateFile: ctx.paths.stateFile,
153
+ verbose: args.verbose,
154
+ logsDir: ctx.paths.logsDir,
155
+ });
156
+ process.stdout.write('\n');
157
+ if (result.status !== 'completed') {
158
+ process.stderr.write(`${RED}Agent ${result.status}${RESET}\n`);
159
+ process.exitCode = 1;
160
+ }
161
+ }
162
+ finally {
163
+ // Get PID before cleaning state
164
+ let sessionPid = null;
165
+ try {
166
+ const state = readState(ctx.paths.stateFile, 0);
167
+ sessionPid = state.sessions?.[slot]?.pid ?? null;
168
+ if (state.sessions?.[slot]) {
169
+ delete state.sessions[slot];
170
+ writeState(ctx.paths.stateFile, state, 'agent-oneshot-cleanup');
171
+ }
172
+ }
173
+ catch { /* best effort */ }
174
+ // Kill process tree by PID, then exit
175
+ if (sessionPid) {
176
+ try {
177
+ const { execFileSync } = await import('node:child_process');
178
+ // Kill all descendants first
179
+ try {
180
+ const children = execFileSync('pgrep', ['-P', String(sessionPid)], { encoding: 'utf-8', timeout: 2000 })
181
+ .trim().split('\n').filter(Boolean).map(Number);
182
+ for (const p of children) {
183
+ try {
184
+ process.kill(p, 'SIGKILL');
185
+ }
186
+ catch { /* noop */ }
187
+ }
188
+ }
189
+ catch { /* no children */ }
190
+ try {
191
+ process.kill(sessionPid, 'SIGKILL');
192
+ }
193
+ catch { /* already dead */ }
194
+ }
195
+ catch { /* noop */ }
196
+ }
197
+ process.exit(process.exitCode ?? 0);
198
+ }
199
+ }
200
+ // ── Chat REPL mode ──────────────────────────────────────────────
201
+ async function agentChat(args) {
202
+ const ctx = createSessionContext({ cwd: args.cwd, tool: args.tool });
203
+ const runtime = createSessionRuntime(ctx);
204
+ const slot = `session-${args.name}`;
205
+ await runtime.ensureSession(slot, args.tool, args.cwd);
206
+ process.stderr.write(`${DIM}Session "${args.name}" started (${args.tool}) — type your messages, Ctrl+C to exit${RESET}\n\n`);
207
+ const stateFile = ctx.paths.stateFile;
208
+ // If initial prompt provided, run it first
209
+ if (args.prompt) {
210
+ await runTurn(runtime, slot, args, stateFile, ctx.paths.logsDir);
211
+ }
212
+ // REPL loop
213
+ const rl = readline.createInterface({
214
+ input: process.stdin,
215
+ output: process.stderr,
216
+ prompt: `${GREEN}>${RESET} `,
217
+ });
218
+ const cleanup = async () => {
219
+ rl.close();
220
+ process.stderr.write(`\n${DIM}Closing session...${RESET}\n`);
221
+ try {
222
+ await runtime.stopSession(slot);
223
+ }
224
+ catch { /* cleanup */ }
225
+ process.exit(0);
226
+ };
227
+ process.on('SIGINT', () => { cleanup(); });
228
+ rl.prompt();
229
+ for await (const line of rl) {
230
+ const input = line.trim();
231
+ if (!input) {
232
+ rl.prompt();
233
+ continue;
234
+ }
235
+ if (input === '/exit' || input === '/quit') {
236
+ await cleanup();
237
+ return;
238
+ }
239
+ await runTurn(runtime, slot, { ...args, prompt: input }, stateFile, ctx.paths.logsDir);
240
+ rl.prompt();
241
+ }
242
+ await cleanup();
243
+ }
244
+ async function runTurn(runtime, slot, args, stateFile, logsDir) {
245
+ try {
246
+ const prompt = buildPrompt(args.prompt, args.context, args.system);
247
+ await runtime.startRun(slot, prompt, args.tool, args.cwd);
248
+ const result = await waitAndStream(runtime, slot, {
249
+ stateFile, verbose: args.verbose, logsDir,
250
+ });
251
+ process.stdout.write('\n\n');
252
+ if (result.status !== 'completed') {
253
+ process.stderr.write(`${DIM}(${result.status})${RESET}\n`);
254
+ }
255
+ }
256
+ catch (err) {
257
+ const msg = err instanceof Error ? err.message : String(err);
258
+ process.stderr.write(`${RED}Error: ${msg}${RESET}\n`);
259
+ }
260
+ }
261
+ // ── Status ──────────────────────────────────────────────────────
262
+ async function agentStatus(args) {
263
+ const ctx = createSessionContext({ cwd: args.cwd, tool: args.tool });
264
+ const runtime = createSessionRuntime(ctx);
265
+ try {
266
+ const state = await runtime.inspect();
267
+ const sessions = Object.entries(state.sessions);
268
+ if (args.json) {
269
+ console.log(JSON.stringify(state.sessions, null, 2));
270
+ return;
271
+ }
272
+ if (sessions.length === 0) {
273
+ console.log(`${DIM}No active sessions${RESET}`);
274
+ return;
275
+ }
276
+ for (const [name, session] of sessions) {
277
+ const run = session.currentRun;
278
+ const runInfo = run ? `${run.status} "${run.promptPreview}"` : 'idle';
279
+ console.log(` ${name} ${session.tool} ${session.sessionState} — ${runInfo}`);
280
+ }
281
+ }
282
+ catch {
283
+ console.log(`${DIM}No active sessions${RESET}`);
284
+ }
285
+ }
286
+ // ── Close ───────────────────────────────────────────────────────
287
+ async function agentClose(args) {
288
+ const ctx = createSessionContext({ cwd: args.cwd, tool: args.tool });
289
+ const runtime = createSessionRuntime(ctx);
290
+ const slot = `session-${args.name}`;
291
+ try {
292
+ await runtime.stopSession(slot);
293
+ }
294
+ catch { /* session may not exist in runtime */ }
295
+ // Remove from state.json
296
+ try {
297
+ const state = readState(ctx.paths.stateFile, 0);
298
+ if (state.sessions?.[slot]) {
299
+ delete state.sessions[slot];
300
+ writeState(ctx.paths.stateFile, state, 'agent-close');
301
+ }
302
+ console.log(`${GREEN}Session "${args.name}" closed${RESET}`);
303
+ }
304
+ catch (err) {
305
+ const msg = err instanceof Error ? err.message : String(err);
306
+ console.error(`${RED}${msg}${RESET}`);
307
+ process.exitCode = 1;
308
+ }
309
+ }
310
+ // ── List ─────────────────────────────────────────────────────────
311
+ function agentList(args) {
312
+ const registry = loadAgentRegistry();
313
+ if (args.json) {
314
+ console.log(JSON.stringify(registry, null, 2));
315
+ return;
316
+ }
317
+ console.log(`\n Available agents:\n`);
318
+ for (const [name, entry] of Object.entries(registry)) {
319
+ const cmd = `${entry.command} ${entry.args.join(' ')}`.trim();
320
+ const isBuiltin = ['claude', 'codex', 'gemini'].includes(name);
321
+ const tag = isBuiltin ? DIM + '(builtin)' + RESET : GREEN + '(custom)' + RESET;
322
+ console.log(` ${name.padEnd(12)} ${cmd} ${tag}`);
323
+ }
324
+ console.log('');
325
+ }
326
+ // ── Add ──────────────────────────────────────────────────────────
327
+ function agentAdd(args) {
328
+ // prompt contains: "<name> <command> [args...]"
329
+ const parts = args.prompt.split(/\s+/);
330
+ const name = parts[0];
331
+ const command = parts[1];
332
+ const cmdArgs = parts.slice(2);
333
+ if (!name || !command) {
334
+ console.error('Usage: sps agent add <name> <command> [args...]');
335
+ console.error('Example: sps agent add cursor "cursor-agent" acp');
336
+ process.exitCode = 1;
337
+ return;
338
+ }
339
+ const home = process.env.HOME || '/home/coral';
340
+ const agentsFile = resolve(home, '.coral', 'agents.json');
341
+ let existing = {};
342
+ try {
343
+ existing = JSON.parse(readFileSync(agentsFile, 'utf-8'));
344
+ }
345
+ catch { /* new file */ }
346
+ existing[name] = { command, args: cmdArgs };
347
+ mkdirSync(resolve(home, '.coral'), { recursive: true });
348
+ writeFileSync(agentsFile, JSON.stringify(existing, null, 2) + '\n');
349
+ console.log(`${GREEN}Agent "${name}" registered: ${command} ${cmdArgs.join(' ')}${RESET}`);
350
+ }
351
+ //# sourceMappingURL=agentCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentCommand.js","sourceRoot":"","sources":["../../src/commands/agentCommand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { AgentRuntime } from '../interfaces/AgentRuntime.js';
2
+ export interface StreamResult {
3
+ status: 'completed' | 'failed' | 'cancelled' | 'lost';
4
+ output: string;
5
+ }
6
+ export interface WaitAndStreamOpts {
7
+ pollMs?: number;
8
+ signal?: AbortSignal;
9
+ stateFile?: string;
10
+ verbose?: boolean;
11
+ logsDir?: string;
12
+ }
13
+ export declare function waitAndStream(runtime: AgentRuntime, slot: string, opts?: WaitAndStreamOpts): Promise<StreamResult>;
14
+ //# sourceMappingURL=agentRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentRenderer.d.ts","sourceRoot":"","sources":["../../src/commands/agentRenderer.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGlE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;IACtD,MAAM,EAAE,MAAM,CAAC;CAChB;AAQD,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,iBAAiB,GACvB,OAAO,CAAC,YAAY,CAAC,CAqHvB"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Agent output renderer — polls AgentRuntime.inspect() and streams
3
+ * incremental output to stdout. Shared by sps agent (one-shot + chat).
4
+ */
5
+ import { readFileSync, readdirSync, statSync } from 'node:fs';
6
+ import { resolve } from 'node:path';
7
+ import { readState, writeState } from '../core/state.js';
8
+ const SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
9
+ const DIM = '\x1b[90m';
10
+ const CYAN = '\x1b[36m';
11
+ const YELLOW = '\x1b[33m';
12
+ const RESET = '\x1b[0m';
13
+ export async function waitAndStream(runtime, slot, opts) {
14
+ const pollMs = opts?.pollMs ?? 2_000;
15
+ let lastTextLen = 0;
16
+ let lastLogLen = 0;
17
+ let fullOutput = '';
18
+ let spinnerIdx = 0;
19
+ let hasOutput = false;
20
+ const verbose = opts?.verbose ?? false;
21
+ // Find latest ACP log file for verbose mode
22
+ let logFile = null;
23
+ if (verbose && opts?.logsDir) {
24
+ logFile = findLatestAcpLog(opts.logsDir);
25
+ }
26
+ // Print newline before spinner (separate from user input line)
27
+ process.stderr.write('\n');
28
+ // Start spinner
29
+ const spinnerInterval = setInterval(() => {
30
+ if (!hasOutput) {
31
+ const frame = SPINNER[spinnerIdx % SPINNER.length];
32
+ process.stderr.write(`\r${DIM}${frame} thinking...${RESET}`);
33
+ spinnerIdx++;
34
+ }
35
+ }, 80);
36
+ const clearSpinner = () => {
37
+ clearInterval(spinnerInterval);
38
+ if (!hasOutput) {
39
+ process.stderr.write('\r\x1b[K');
40
+ }
41
+ };
42
+ try {
43
+ while (true) {
44
+ if (opts?.signal?.aborted) {
45
+ clearSpinner();
46
+ return { status: 'cancelled', output: fullOutput };
47
+ }
48
+ const state = await runtime.inspect(slot);
49
+ const session = state.sessions[slot];
50
+ if (!session) {
51
+ clearSpinner();
52
+ return { status: 'lost', output: fullOutput };
53
+ }
54
+ // Verbose mode: stream tool calls from ACP log file
55
+ if (verbose && opts?.logsDir) {
56
+ if (!logFile)
57
+ logFile = findLatestAcpLog(opts.logsDir);
58
+ if (logFile) {
59
+ const newLines = readLogIncrement(logFile, lastLogLen);
60
+ if (newLines.content.length > 0) {
61
+ if (!hasOutput) {
62
+ clearSpinner();
63
+ process.stderr.write(`${CYAN}▶ Agent${RESET}\n`);
64
+ hasOutput = true;
65
+ }
66
+ for (const line of newLines.lines) {
67
+ if (line.includes('[tool:') || line.includes('[tool_update]')) {
68
+ process.stderr.write(`${YELLOW} ${line}${RESET}\n`);
69
+ }
70
+ else if (line.includes('[assistant]')) {
71
+ const text = line.replace(/^\S+ \[assistant\] /, '');
72
+ process.stdout.write(text);
73
+ fullOutput += text;
74
+ }
75
+ else if (line.includes('[usage]')) {
76
+ process.stderr.write(`${DIM} ${line}${RESET}\n`);
77
+ }
78
+ else if (!line.match(/^\S+ \[/)) {
79
+ // Continuation text (multi-line assistant output without tag)
80
+ process.stdout.write(line);
81
+ fullOutput += line;
82
+ }
83
+ }
84
+ lastLogLen = newLines.offset;
85
+ }
86
+ }
87
+ }
88
+ else {
89
+ // Normal mode: stream text from lastPaneText
90
+ const paneText = session.lastPaneText || '';
91
+ if (paneText.length > lastTextLen) {
92
+ if (!hasOutput) {
93
+ clearSpinner();
94
+ process.stderr.write(`${CYAN}▶ Agent${RESET}\n`);
95
+ hasOutput = true;
96
+ }
97
+ const newText = paneText.slice(lastTextLen);
98
+ process.stdout.write(newText);
99
+ fullOutput += newText;
100
+ lastTextLen = paneText.length;
101
+ }
102
+ }
103
+ // Check run status
104
+ const runStatus = session.currentRun?.status;
105
+ if (runStatus === 'completed') {
106
+ clearSpinner();
107
+ if (opts?.stateFile)
108
+ clearRunInState(opts.stateFile, slot);
109
+ return { status: 'completed', output: fullOutput };
110
+ }
111
+ if (runStatus === 'failed' || runStatus === 'cancelled' || runStatus === 'lost') {
112
+ clearSpinner();
113
+ if (opts?.stateFile)
114
+ clearRunInState(opts.stateFile, slot);
115
+ return { status: runStatus, output: fullOutput };
116
+ }
117
+ // Session offline with no active run
118
+ if (session.sessionState === 'offline' && !session.currentRun) {
119
+ clearSpinner();
120
+ return { status: 'lost', output: fullOutput };
121
+ }
122
+ await new Promise((r) => setTimeout(r, pollMs));
123
+ }
124
+ }
125
+ finally {
126
+ clearInterval(spinnerInterval);
127
+ }
128
+ }
129
+ /** Find the most recent *-acp-*.log file in a directory. */
130
+ function findLatestAcpLog(logsDir) {
131
+ try {
132
+ const files = readdirSync(logsDir)
133
+ .filter(f => f.includes('-acp-') && f.endsWith('.log'))
134
+ .map(f => resolve(logsDir, f))
135
+ .sort((a, b) => statSync(b).mtimeMs - statSync(a).mtimeMs);
136
+ return files[0] ?? null;
137
+ }
138
+ catch {
139
+ return null;
140
+ }
141
+ }
142
+ /** Read new lines from a log file starting at byte offset. */
143
+ function readLogIncrement(file, fromOffset) {
144
+ try {
145
+ const content = readFileSync(file, 'utf-8');
146
+ if (content.length <= fromOffset)
147
+ return { lines: [], content: '', offset: fromOffset };
148
+ const newContent = content.slice(fromOffset);
149
+ return {
150
+ lines: newContent.split('\n').filter(l => l.length > 0),
151
+ content: newContent,
152
+ offset: content.length,
153
+ };
154
+ }
155
+ catch {
156
+ return { lines: [], content: '', offset: fromOffset };
157
+ }
158
+ }
159
+ /** Clear currentRun from session state so the slot can accept the next prompt. */
160
+ function clearRunInState(stateFile, slot) {
161
+ try {
162
+ const state = readState(stateFile, 0);
163
+ if (state.sessions?.[slot]?.currentRun) {
164
+ state.sessions[slot].currentRun = null;
165
+ state.sessions[slot].status = 'idle';
166
+ writeState(stateFile, state, 'agent-clear-run');
167
+ }
168
+ }
169
+ catch {
170
+ // Best effort
171
+ }
172
+ }
173
+ //# sourceMappingURL=agentRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentRenderer.js","sourceRoot":"","sources":["../../src/commands/agentRenderer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAOzD,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACnE,MAAM,GAAG,GAAG,UAAU,CAAC;AACvB,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,MAAM,GAAG,UAAU,CAAC;AAC1B,MAAM,KAAK,GAAG,SAAS,CAAC;AAUxB,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAqB,EACrB,IAAY,EACZ,IAAwB;IAExB,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC;IACrC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC;IAEvC,4CAA4C;IAC5C,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,OAAO,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;QAC7B,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,+DAA+D;IAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE3B,gBAAgB;IAChB,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,eAAe,KAAK,EAAE,CAAC,CAAC;YAC7D,UAAU,EAAE,CAAC;QACf,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,aAAa,CAAC,eAAe,CAAC,CAAC;QAC/B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;gBAC1B,YAAY,EAAE,CAAC;gBACf,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YACrD,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,YAAY,EAAE,CAAC;gBACf,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YAChD,CAAC;YAED,oDAAoD;YACpD,IAAI,OAAO,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,OAAO;oBAAE,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvD,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;oBACvD,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAChC,IAAI,CAAC,SAAS,EAAE,CAAC;4BACf,YAAY,EAAE,CAAC;4BACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,UAAU,KAAK,IAAI,CAAC,CAAC;4BACjD,SAAS,GAAG,IAAI,CAAC;wBACnB,CAAC;wBACD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;4BAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gCAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC;4BACvD,CAAC;iCAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;gCACxC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;gCACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gCAC3B,UAAU,IAAI,IAAI,CAAC;4BACrB,CAAC;iCAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gCACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC;4BACpD,CAAC;iCAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gCAClC,8DAA8D;gCAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gCAC3B,UAAU,IAAI,IAAI,CAAC;4BACrB,CAAC;wBACH,CAAC;wBACD,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;oBAC/B,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,6CAA6C;gBAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;gBAC5C,IAAI,QAAQ,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;oBAClC,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,YAAY,EAAE,CAAC;wBACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,UAAU,KAAK,IAAI,CAAC,CAAC;wBACjD,SAAS,GAAG,IAAI,CAAC;oBACnB,CAAC;oBACD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;oBAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAC9B,UAAU,IAAI,OAAO,CAAC;oBACtB,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAChC,CAAC;YACH,CAAC;YAED,mBAAmB;YACnB,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC;YAC7C,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;gBAC9B,YAAY,EAAE,CAAC;gBACf,IAAI,IAAI,EAAE,SAAS;oBAAE,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC3D,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YACrD,CAAC;YACD,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,WAAW,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;gBAChF,YAAY,EAAE,CAAC;gBACf,IAAI,IAAI,EAAE,SAAS;oBAAE,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC3D,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YACnD,CAAC;YAED,qCAAqC;YACrC,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;gBAC9D,YAAY,EAAE,CAAC;gBACf,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YAChD,CAAC;YAED,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;YAAS,CAAC;QACT,aAAa,CAAC,eAAe,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,SAAS,gBAAgB,CAAC,OAAe;IACvC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC;aAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aACtD,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;aAC7B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8DAA8D;AAC9D,SAAS,gBAAgB,CAAC,IAAY,EAAE,UAAkB;IACxD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,MAAM,IAAI,UAAU;YAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACxF,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7C,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YACvD,OAAO,EAAE,UAAU;YACnB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IACxD,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,SAAS,eAAe,CAAC,SAAiB,EAAE,IAAY;IACtD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACtC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC;YACvC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC;YACvC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;YACrC,UAAU,CAAC,SAAS,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC"}
@@ -31,5 +31,14 @@ export interface PathOverrides {
31
31
  export declare function resolveProjectPaths(projectName: string, overrides?: PathOverrides): ProjectPaths;
32
32
  export declare function resolveWorktreePath(projectName: string, seq: string | number, worktreeDir?: string): string;
33
33
  export declare function resolveWorkerCardFile(projectName: string, slot: number): string;
34
+ export interface SessionPaths {
35
+ /** ~/.coral/sessions/ */
36
+ stateDir: string;
37
+ /** ~/.coral/sessions/logs/ */
38
+ logsDir: string;
39
+ /** ~/.coral/sessions/state.json */
40
+ stateFile: string;
41
+ }
42
+ export declare function resolveSessionPaths(): SessionPaths;
34
43
  export declare function checkPathExists(path: string): boolean;
35
44
  //# sourceMappingURL=paths.d.ts.map