@agent-deck/cli 2.0.0 → 2.1.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/dist/agent-harness.d.ts +3 -0
- package/dist/agent-harness.d.ts.map +1 -1
- package/dist/agent-harness.js +64 -6
- package/dist/agent-harness.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp-bridge.d.ts +83 -1
- package/dist/mcp-bridge.d.ts.map +1 -1
- package/dist/mcp-bridge.js +252 -7
- package/dist/mcp-bridge.js.map +1 -1
- package/dist/mcp-config.d.ts +13 -1
- package/dist/mcp-config.d.ts.map +1 -1
- package/dist/mcp-config.js +49 -1
- package/dist/mcp-config.js.map +1 -1
- package/dist/muse-skills/agent-deck-playbooks/SKILL.md +23 -0
- package/dist/muse-skills/agent-deck-run/SKILL.md +86 -0
- package/dist/muse-skills/agent-deck-session/SKILL.md +59 -0
- package/dist/muse-skills/agent-deck-setup/SKILL.md +32 -0
- package/dist/muse-skills.d.ts +42 -0
- package/dist/muse-skills.d.ts.map +1 -0
- package/dist/muse-skills.js +149 -0
- package/dist/muse-skills.js.map +1 -0
- package/dist/run-adapter.d.ts +100 -0
- package/dist/run-adapter.d.ts.map +1 -0
- package/dist/run-adapter.js +73 -0
- package/dist/run-adapter.js.map +1 -0
- package/dist/run-claude.d.ts +41 -0
- package/dist/run-claude.d.ts.map +1 -0
- package/dist/run-claude.js +91 -0
- package/dist/run-claude.js.map +1 -0
- package/dist/run-codex.d.ts +75 -0
- package/dist/run-codex.d.ts.map +1 -0
- package/dist/run-codex.js +337 -0
- package/dist/run-codex.js.map +1 -0
- package/dist/run-cursor.d.ts +79 -0
- package/dist/run-cursor.d.ts.map +1 -0
- package/dist/run-cursor.js +455 -0
- package/dist/run-cursor.js.map +1 -0
- package/dist/run-detach.d.ts +36 -0
- package/dist/run-detach.d.ts.map +1 -0
- package/dist/run-detach.js +233 -0
- package/dist/run-detach.js.map +1 -0
- package/dist/run-muse.d.ts +127 -0
- package/dist/run-muse.d.ts.map +1 -0
- package/dist/run-muse.js +499 -0
- package/dist/run-muse.js.map +1 -0
- package/dist/run-status.d.ts +62 -0
- package/dist/run-status.d.ts.map +1 -0
- package/dist/run-status.js +552 -0
- package/dist/run-status.js.map +1 -0
- package/dist/run.d.ts +191 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +680 -0
- package/dist/run.js.map +1 -0
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +51 -10
- package/dist/setup.js.map +1 -1
- package/dist/use.d.ts +1 -1
- package/dist/use.d.ts.map +1 -1
- package/dist/use.js +16 -15
- package/dist/use.js.map +1 -1
- package/package.json +5 -4
|
@@ -0,0 +1,552 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.RUN_LIST_DEFAULT_LIMIT = void 0;
|
|
7
|
+
exports.isRunPidAlive = isRunPidAlive;
|
|
8
|
+
exports.collectRunStatus = collectRunStatus;
|
|
9
|
+
exports.printRunStatusHelp = printRunStatusHelp;
|
|
10
|
+
exports.parseRunStatusArgs = parseRunStatusArgs;
|
|
11
|
+
exports.runRunStatusCommand = runRunStatusCommand;
|
|
12
|
+
exports.printRunLogHelp = printRunLogHelp;
|
|
13
|
+
exports.parseRunLogArgs = parseRunLogArgs;
|
|
14
|
+
exports.runRunLogCommand = runRunLogCommand;
|
|
15
|
+
exports.printRunListHelp = printRunListHelp;
|
|
16
|
+
exports.parseRunListArgs = parseRunListArgs;
|
|
17
|
+
exports.listRunInfos = listRunInfos;
|
|
18
|
+
exports.runRunListCommand = runRunListCommand;
|
|
19
|
+
/**
|
|
20
|
+
* `agent-deck run status|log|list` — poll a run without parsing files (NOT-402).
|
|
21
|
+
*
|
|
22
|
+
* Reads the run record (`meta.json`) and JSONL log written by NOT-400
|
|
23
|
+
* (`run.ts`). Works for foreground and detached runs: a `running` meta whose
|
|
24
|
+
* pid is no longer alive is reported as `died` so orchestrators never wait
|
|
25
|
+
* forever. Pid-reuse is mitigated by comparing `startedAt` with the process
|
|
26
|
+
* start time where `ps` is available.
|
|
27
|
+
*/
|
|
28
|
+
const node_child_process_1 = require("node:child_process");
|
|
29
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
30
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
31
|
+
const paths_1 = require("./managed/paths");
|
|
32
|
+
const runtime_state_1 = require("./runtime-state");
|
|
33
|
+
const terminal_style_1 = require("./terminal-style");
|
|
34
|
+
exports.RUN_LIST_DEFAULT_LIMIT = 20;
|
|
35
|
+
function runsRoot(homeDir) {
|
|
36
|
+
return node_path_1.default.join(homeDir, 'runs');
|
|
37
|
+
}
|
|
38
|
+
function runPaths(homeDir, runId) {
|
|
39
|
+
const dir = node_path_1.default.join(runsRoot(homeDir), runId);
|
|
40
|
+
return { dir, metaPath: node_path_1.default.join(dir, 'meta.json'), logPath: node_path_1.default.join(dir, 'run.jsonl') };
|
|
41
|
+
}
|
|
42
|
+
function resolveHomeDir(deps) {
|
|
43
|
+
return deps?.homeDir ?? (0, paths_1.agentDeckHome)();
|
|
44
|
+
}
|
|
45
|
+
function readMetaFile(metaPath) {
|
|
46
|
+
let raw;
|
|
47
|
+
try {
|
|
48
|
+
raw = node_fs_1.default.readFileSync(metaPath, 'utf8');
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return { ok: false, reason: 'unreadable', partial: {} };
|
|
52
|
+
}
|
|
53
|
+
let parsed;
|
|
54
|
+
try {
|
|
55
|
+
parsed = JSON.parse(raw);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return { ok: false, reason: 'invalid JSON', partial: {} };
|
|
59
|
+
}
|
|
60
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
61
|
+
return { ok: false, reason: 'not an object', partial: {} };
|
|
62
|
+
}
|
|
63
|
+
const partial = parsed;
|
|
64
|
+
if (typeof partial.runId !== 'string' ||
|
|
65
|
+
typeof partial.deck !== 'string' ||
|
|
66
|
+
typeof partial.client !== 'string' ||
|
|
67
|
+
typeof partial.startedAt !== 'string' ||
|
|
68
|
+
(partial.state !== 'running' && partial.state !== 'ended' && partial.state !== 'error')) {
|
|
69
|
+
return { ok: false, reason: 'missing required fields', partial };
|
|
70
|
+
}
|
|
71
|
+
return { ok: true, meta: partial };
|
|
72
|
+
}
|
|
73
|
+
function sessionOf(event) {
|
|
74
|
+
const value = event.sessionId;
|
|
75
|
+
return typeof value === 'string' && value ? value : null;
|
|
76
|
+
}
|
|
77
|
+
function readLogFile(logPath) {
|
|
78
|
+
const empty = {
|
|
79
|
+
exists: false,
|
|
80
|
+
events: [],
|
|
81
|
+
truncated: false,
|
|
82
|
+
lastTs: null,
|
|
83
|
+
lastSessionId: null,
|
|
84
|
+
sawEnd: false,
|
|
85
|
+
sawError: false,
|
|
86
|
+
};
|
|
87
|
+
let raw;
|
|
88
|
+
try {
|
|
89
|
+
raw = node_fs_1.default.readFileSync(logPath, 'utf8');
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return empty;
|
|
93
|
+
}
|
|
94
|
+
empty.exists = true;
|
|
95
|
+
if (!raw) {
|
|
96
|
+
return empty;
|
|
97
|
+
}
|
|
98
|
+
const endsWithNewline = raw.endsWith('\n');
|
|
99
|
+
const chunks = raw.split('\n');
|
|
100
|
+
// A trailing newline leaves an empty final chunk that is not a line.
|
|
101
|
+
const lines = endsWithNewline ? chunks.slice(0, -1) : chunks;
|
|
102
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
103
|
+
const line = lines[i];
|
|
104
|
+
const isLast = i === lines.length - 1;
|
|
105
|
+
if (!line) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
let parsed;
|
|
109
|
+
try {
|
|
110
|
+
parsed = JSON.parse(line);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Only the last chunk of a file without a trailing newline can be a
|
|
114
|
+
// torn write; anything else is a corrupt line. Both are skipped.
|
|
115
|
+
void isLast;
|
|
116
|
+
empty.truncated = true;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (!parsed || typeof parsed !== 'object' || typeof parsed.t !== 'string') {
|
|
120
|
+
empty.truncated = true;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const event = parsed;
|
|
124
|
+
empty.events.push({ raw: line, event });
|
|
125
|
+
if (typeof event.ts === 'string' && event.ts) {
|
|
126
|
+
empty.lastTs = event.ts;
|
|
127
|
+
}
|
|
128
|
+
const sessionId = sessionOf(event);
|
|
129
|
+
if (sessionId) {
|
|
130
|
+
empty.lastSessionId = sessionId;
|
|
131
|
+
}
|
|
132
|
+
if (event.t === 'end') {
|
|
133
|
+
empty.sawEnd = true;
|
|
134
|
+
}
|
|
135
|
+
else if (event.t === 'error') {
|
|
136
|
+
empty.sawError = true;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return empty;
|
|
140
|
+
}
|
|
141
|
+
/** Best-effort process start time via `ps`; null when unavailable. */
|
|
142
|
+
function getProcessStartTime(pid) {
|
|
143
|
+
try {
|
|
144
|
+
const out = (0, node_child_process_1.execFileSync)('ps', ['-o', 'lstart=', '-p', String(pid)], {
|
|
145
|
+
encoding: 'utf8',
|
|
146
|
+
timeout: 2000,
|
|
147
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
148
|
+
}).trim();
|
|
149
|
+
if (!out) {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
const parsed = new Date(out);
|
|
153
|
+
return Number.isNaN(parsed.getTime()) ? null : parsed;
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* True when `pid` is alive and not obviously recycled: the runner process
|
|
161
|
+
* started before it wrote `startedAt`, so a live pid whose start time is
|
|
162
|
+
* well after `startedAt` must be a different process.
|
|
163
|
+
*/
|
|
164
|
+
function isRunPidAlive(pid, startedAt) {
|
|
165
|
+
if (!(0, runtime_state_1.isProcessAlive)(pid)) {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
const procStart = getProcessStartTime(pid);
|
|
169
|
+
const runStart = new Date(startedAt);
|
|
170
|
+
if (!procStart || Number.isNaN(runStart.getTime())) {
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
// 2s tolerance for `ps` one-second resolution and clock skew.
|
|
174
|
+
return procStart.getTime() <= runStart.getTime() + 2000;
|
|
175
|
+
}
|
|
176
|
+
function effectiveState(meta) {
|
|
177
|
+
if (meta.state === 'ended' || meta.state === 'error') {
|
|
178
|
+
return meta.state;
|
|
179
|
+
}
|
|
180
|
+
return isRunPidAlive(meta.pid, meta.startedAt) ? 'running' : 'died';
|
|
181
|
+
}
|
|
182
|
+
function collectRunStatus(runId, homeDir) {
|
|
183
|
+
const { metaPath, logPath } = runPaths(homeDir, runId);
|
|
184
|
+
if (!node_fs_1.default.existsSync(metaPath)) {
|
|
185
|
+
return { found: false };
|
|
186
|
+
}
|
|
187
|
+
const metaRead = readMetaFile(metaPath);
|
|
188
|
+
const log = readLogFile(logPath);
|
|
189
|
+
const warnings = [];
|
|
190
|
+
if (metaRead.ok) {
|
|
191
|
+
const meta = metaRead.meta;
|
|
192
|
+
const sessionId = typeof meta.sessionId === 'string' && meta.sessionId ? meta.sessionId : log.lastSessionId;
|
|
193
|
+
if (log.truncated) {
|
|
194
|
+
warnings.push(`truncated log line in ${logPath} (ignored)`);
|
|
195
|
+
}
|
|
196
|
+
return {
|
|
197
|
+
found: true,
|
|
198
|
+
corruptMeta: false,
|
|
199
|
+
warnings,
|
|
200
|
+
info: {
|
|
201
|
+
runId: meta.runId,
|
|
202
|
+
deck: meta.deck,
|
|
203
|
+
client: meta.client,
|
|
204
|
+
state: effectiveState(meta),
|
|
205
|
+
sessionId,
|
|
206
|
+
startedAt: meta.startedAt,
|
|
207
|
+
lastLogTs: log.lastTs,
|
|
208
|
+
logPath,
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
warnings.push(`meta.json is corrupt (${metaRead.reason}); showing log-derived info`);
|
|
213
|
+
if (log.truncated) {
|
|
214
|
+
warnings.push(`truncated log line in ${logPath} (ignored)`);
|
|
215
|
+
}
|
|
216
|
+
const partial = metaRead.partial;
|
|
217
|
+
return {
|
|
218
|
+
found: true,
|
|
219
|
+
corruptMeta: true,
|
|
220
|
+
warnings,
|
|
221
|
+
info: {
|
|
222
|
+
runId: typeof partial.runId === 'string' ? partial.runId : runId,
|
|
223
|
+
deck: typeof partial.deck === 'string' ? partial.deck : 'unknown',
|
|
224
|
+
client: typeof partial.client === 'string' ? partial.client : 'unknown',
|
|
225
|
+
state: 'error',
|
|
226
|
+
sessionId: (typeof partial.sessionId === 'string' && partial.sessionId ? partial.sessionId : null) ??
|
|
227
|
+
log.lastSessionId,
|
|
228
|
+
startedAt: typeof partial.startedAt === 'string' ? partial.startedAt : 'unknown',
|
|
229
|
+
lastLogTs: log.lastTs,
|
|
230
|
+
logPath,
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
function formatState(state, color) {
|
|
235
|
+
if (state === 'error' || state === 'died') {
|
|
236
|
+
return terminal_style_1.terminalStyle.error(state, color);
|
|
237
|
+
}
|
|
238
|
+
if (state === 'running') {
|
|
239
|
+
return terminal_style_1.terminalStyle.bold(state, color);
|
|
240
|
+
}
|
|
241
|
+
return terminal_style_1.terminalStyle.dim(state, color);
|
|
242
|
+
}
|
|
243
|
+
function printStatusHuman(info) {
|
|
244
|
+
const color = (0, terminal_style_1.terminalColorsEnabled)(process.stdout);
|
|
245
|
+
console.log(`run ${terminal_style_1.terminalStyle.bold(info.runId, color)} ${formatState(info.state, color)}`);
|
|
246
|
+
console.log(` deck ${info.deck}`);
|
|
247
|
+
console.log(` client ${info.client}`);
|
|
248
|
+
console.log(` started ${info.startedAt}`);
|
|
249
|
+
if (info.sessionId) {
|
|
250
|
+
console.log(` session ${info.sessionId}`);
|
|
251
|
+
}
|
|
252
|
+
console.log(` last log ${info.lastLogTs ?? 'never'}`);
|
|
253
|
+
console.log(` log ${info.logPath}`);
|
|
254
|
+
}
|
|
255
|
+
function warnAll(warnings) {
|
|
256
|
+
for (const warning of warnings) {
|
|
257
|
+
console.warn(`Warning: ${warning}`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// --- status ---------------------------------------------------------------
|
|
261
|
+
function printRunStatusHelp() {
|
|
262
|
+
console.log(`Usage:
|
|
263
|
+
agent-deck run status <runId> [--json]
|
|
264
|
+
|
|
265
|
+
Prints runId, deck, client, state (running|ended|error|died), sessionId when
|
|
266
|
+
known, startedAt, last log line time, and the log path. A running meta whose
|
|
267
|
+
pid is no longer alive is reported as died. Exit 0 for any state; non-zero
|
|
268
|
+
only when the run id is unknown.`);
|
|
269
|
+
}
|
|
270
|
+
function parseRunStatusArgs(args) {
|
|
271
|
+
let runId;
|
|
272
|
+
let json = false;
|
|
273
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
274
|
+
const arg = args[i];
|
|
275
|
+
if (arg === '--json') {
|
|
276
|
+
json = true;
|
|
277
|
+
}
|
|
278
|
+
else if (arg === '--help' || arg === '-h') {
|
|
279
|
+
return { error: 'help' };
|
|
280
|
+
}
|
|
281
|
+
else if (arg.startsWith('-')) {
|
|
282
|
+
return { error: `Unknown run status option: ${arg}` };
|
|
283
|
+
}
|
|
284
|
+
else if (!runId) {
|
|
285
|
+
runId = arg;
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
return { error: `Unexpected argument: ${arg}` };
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
if (!runId) {
|
|
292
|
+
return { error: 'run id is required' };
|
|
293
|
+
}
|
|
294
|
+
return { runId, json };
|
|
295
|
+
}
|
|
296
|
+
async function runRunStatusCommand(args, deps) {
|
|
297
|
+
const parsed = parseRunStatusArgs(args);
|
|
298
|
+
if ('error' in parsed) {
|
|
299
|
+
if (parsed.error === 'help') {
|
|
300
|
+
printRunStatusHelp();
|
|
301
|
+
return 0;
|
|
302
|
+
}
|
|
303
|
+
console.error(parsed.error);
|
|
304
|
+
return 1;
|
|
305
|
+
}
|
|
306
|
+
const collected = collectRunStatus(parsed.runId, resolveHomeDir(deps));
|
|
307
|
+
if (!collected.found) {
|
|
308
|
+
console.error(`Unknown run: ${parsed.runId}`);
|
|
309
|
+
return 1;
|
|
310
|
+
}
|
|
311
|
+
warnAll(collected.warnings);
|
|
312
|
+
if (parsed.json) {
|
|
313
|
+
console.log(JSON.stringify(collected.info));
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
printStatusHuman(collected.info);
|
|
317
|
+
}
|
|
318
|
+
return 0;
|
|
319
|
+
}
|
|
320
|
+
// --- log ------------------------------------------------------------------
|
|
321
|
+
function printRunLogHelp() {
|
|
322
|
+
console.log(`Usage:
|
|
323
|
+
agent-deck run log <runId> [--tail <n>] [--follow] [--json]
|
|
324
|
+
|
|
325
|
+
Prints one line per log event (text, tool, result, end, error); --json prints
|
|
326
|
+
raw JSONL. --tail prints the last n events. --follow prints new lines until
|
|
327
|
+
an end or error line is seen, then exits 0.`);
|
|
328
|
+
}
|
|
329
|
+
function parseRunLogArgs(args) {
|
|
330
|
+
let runId;
|
|
331
|
+
let tail = null;
|
|
332
|
+
let follow = false;
|
|
333
|
+
let json = false;
|
|
334
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
335
|
+
const arg = args[i];
|
|
336
|
+
if (arg === '--json') {
|
|
337
|
+
json = true;
|
|
338
|
+
}
|
|
339
|
+
else if (arg === '--follow' || arg === '-f') {
|
|
340
|
+
follow = true;
|
|
341
|
+
}
|
|
342
|
+
else if (arg === '--tail') {
|
|
343
|
+
const value = args[++i];
|
|
344
|
+
const parsed = Number.parseInt(value ?? '', 10);
|
|
345
|
+
if (!Number.isFinite(parsed) || parsed < 0) {
|
|
346
|
+
return { error: `--tail must be a non-negative integer (got "${value ?? ''}")` };
|
|
347
|
+
}
|
|
348
|
+
tail = parsed;
|
|
349
|
+
}
|
|
350
|
+
else if (arg === '--help' || arg === '-h') {
|
|
351
|
+
return { error: 'help' };
|
|
352
|
+
}
|
|
353
|
+
else if (arg.startsWith('-')) {
|
|
354
|
+
return { error: `Unknown run log option: ${arg}` };
|
|
355
|
+
}
|
|
356
|
+
else if (!runId) {
|
|
357
|
+
runId = arg;
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
return { error: `Unexpected argument: ${arg}` };
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
if (!runId) {
|
|
364
|
+
return { error: 'run id is required' };
|
|
365
|
+
}
|
|
366
|
+
return { runId, tail, follow, json };
|
|
367
|
+
}
|
|
368
|
+
function singleLine(value) {
|
|
369
|
+
return value.replace(/\r?\n/g, '\\n');
|
|
370
|
+
}
|
|
371
|
+
function formatLogHuman(event) {
|
|
372
|
+
const ts = typeof event.ts === 'string' && event.ts ? event.ts : 'unknown-time';
|
|
373
|
+
switch (event.t) {
|
|
374
|
+
case 'text':
|
|
375
|
+
return `${ts} text ${singleLine(typeof event.text === 'string' ? event.text : '')}`;
|
|
376
|
+
case 'tool':
|
|
377
|
+
return `${ts} tool ${typeof event.name === 'string' ? event.name : 'unknown'}`;
|
|
378
|
+
case 'result': {
|
|
379
|
+
const subtype = typeof event.subtype === 'string' ? event.subtype : '';
|
|
380
|
+
const result = event.result;
|
|
381
|
+
const rendered = typeof result === 'string' ? singleLine(result) : singleLine(JSON.stringify(result ?? null));
|
|
382
|
+
return `${ts} result ${subtype} sessionId=${sessionOf(event) ?? 'unknown'}${rendered ? ` ${rendered}` : ''}`;
|
|
383
|
+
}
|
|
384
|
+
case 'end':
|
|
385
|
+
return `${ts} end sessionId=${sessionOf(event) ?? 'unknown'}`;
|
|
386
|
+
case 'error': {
|
|
387
|
+
const message = typeof event.message === 'string' ? event.message : '';
|
|
388
|
+
return `${ts} error sessionId=${sessionOf(event) ?? 'unknown'}${message ? ` ${singleLine(message)}` : ''}`;
|
|
389
|
+
}
|
|
390
|
+
default: {
|
|
391
|
+
// Runtime tolerance for a future/unknown `t` value that still parses.
|
|
392
|
+
const unknown = event;
|
|
393
|
+
return `${ts} ${String(unknown.t ?? 'unknown')} ${singleLine(JSON.stringify(event))}`;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
function sleep(ms) {
|
|
398
|
+
return new Promise((resolve) => {
|
|
399
|
+
setTimeout(resolve, ms);
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
async function runRunLogCommand(args, deps) {
|
|
403
|
+
const parsed = parseRunLogArgs(args);
|
|
404
|
+
if ('error' in parsed) {
|
|
405
|
+
if (parsed.error === 'help') {
|
|
406
|
+
printRunLogHelp();
|
|
407
|
+
return 0;
|
|
408
|
+
}
|
|
409
|
+
console.error(parsed.error);
|
|
410
|
+
return 1;
|
|
411
|
+
}
|
|
412
|
+
const homeDir = resolveHomeDir(deps);
|
|
413
|
+
const { metaPath, logPath } = runPaths(homeDir, parsed.runId);
|
|
414
|
+
if (!node_fs_1.default.existsSync(metaPath)) {
|
|
415
|
+
console.error(`Unknown run: ${parsed.runId}`);
|
|
416
|
+
return 1;
|
|
417
|
+
}
|
|
418
|
+
const metaRead = readMetaFile(metaPath);
|
|
419
|
+
if (!metaRead.ok) {
|
|
420
|
+
console.warn(`Warning: meta.json is corrupt (${metaRead.reason}); showing the log anyway`);
|
|
421
|
+
}
|
|
422
|
+
const printEvent = (entry) => {
|
|
423
|
+
console.log(parsed.json ? entry.raw : formatLogHuman(entry.event));
|
|
424
|
+
};
|
|
425
|
+
let read = readLogFile(logPath);
|
|
426
|
+
if (read.truncated) {
|
|
427
|
+
console.warn(`Warning: truncated log line in ${logPath} (ignored)`);
|
|
428
|
+
}
|
|
429
|
+
const initial = parsed.tail === null ? read.events : read.events.slice(Math.max(0, read.events.length - parsed.tail));
|
|
430
|
+
for (const entry of initial) {
|
|
431
|
+
printEvent(entry);
|
|
432
|
+
}
|
|
433
|
+
if (initial.some((entry) => entry.event.t === 'end' || entry.event.t === 'error')) {
|
|
434
|
+
return 0;
|
|
435
|
+
}
|
|
436
|
+
if (!parsed.follow) {
|
|
437
|
+
return 0;
|
|
438
|
+
}
|
|
439
|
+
// Follow: poll for appended lines until end/error. A torn final line is
|
|
440
|
+
// re-read on the next poll, so track printed valid events only.
|
|
441
|
+
let printed = read.events.length;
|
|
442
|
+
let warnedTruncated = read.truncated;
|
|
443
|
+
const pollMs = deps?.followPollMs ?? 100;
|
|
444
|
+
for (;;) {
|
|
445
|
+
await sleep(pollMs);
|
|
446
|
+
read = readLogFile(logPath);
|
|
447
|
+
if (read.truncated && !warnedTruncated) {
|
|
448
|
+
warnedTruncated = true;
|
|
449
|
+
console.warn(`Warning: truncated log line in ${logPath} (ignored)`);
|
|
450
|
+
}
|
|
451
|
+
if (read.events.length > printed) {
|
|
452
|
+
const fresh = read.events.slice(printed);
|
|
453
|
+
printed = read.events.length;
|
|
454
|
+
for (const entry of fresh) {
|
|
455
|
+
printEvent(entry);
|
|
456
|
+
}
|
|
457
|
+
if (fresh.some((entry) => entry.event.t === 'end' || entry.event.t === 'error')) {
|
|
458
|
+
return 0;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
// A run that died without an end/error line must still release followers.
|
|
462
|
+
const collected = collectRunStatus(parsed.runId, homeDir);
|
|
463
|
+
if (collected.found && collected.info.state !== 'running' && read.events.length >= printed) {
|
|
464
|
+
return 0;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
// --- list -----------------------------------------------------------------
|
|
469
|
+
function printRunListHelp() {
|
|
470
|
+
console.log(`Usage:
|
|
471
|
+
agent-deck run list [--json] [--limit <n>]
|
|
472
|
+
|
|
473
|
+
Lists recent runs, newest first. Default limit ${exports.RUN_LIST_DEFAULT_LIMIT}.`);
|
|
474
|
+
}
|
|
475
|
+
function parseRunListArgs(args) {
|
|
476
|
+
let json = false;
|
|
477
|
+
let limit = exports.RUN_LIST_DEFAULT_LIMIT;
|
|
478
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
479
|
+
const arg = args[i];
|
|
480
|
+
if (arg === '--json') {
|
|
481
|
+
json = true;
|
|
482
|
+
}
|
|
483
|
+
else if (arg === '--limit') {
|
|
484
|
+
const value = args[++i];
|
|
485
|
+
const parsed = Number.parseInt(value ?? '', 10);
|
|
486
|
+
if (!Number.isFinite(parsed) || parsed < 0) {
|
|
487
|
+
return { error: `--limit must be a non-negative integer (got "${value ?? ''}")` };
|
|
488
|
+
}
|
|
489
|
+
limit = parsed;
|
|
490
|
+
}
|
|
491
|
+
else if (arg === '--help' || arg === '-h') {
|
|
492
|
+
return { error: 'help' };
|
|
493
|
+
}
|
|
494
|
+
else if (arg.startsWith('-')) {
|
|
495
|
+
return { error: `Unknown run list option: ${arg}` };
|
|
496
|
+
}
|
|
497
|
+
else {
|
|
498
|
+
return { error: `Unexpected argument: ${arg}` };
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
return { json, limit };
|
|
502
|
+
}
|
|
503
|
+
function listRunInfos(homeDir, limit) {
|
|
504
|
+
let entries;
|
|
505
|
+
try {
|
|
506
|
+
entries = node_fs_1.default.readdirSync(runsRoot(homeDir));
|
|
507
|
+
}
|
|
508
|
+
catch {
|
|
509
|
+
return [];
|
|
510
|
+
}
|
|
511
|
+
const infos = [];
|
|
512
|
+
for (const runId of entries) {
|
|
513
|
+
const collected = collectRunStatus(runId, homeDir);
|
|
514
|
+
if (collected.found) {
|
|
515
|
+
infos.push(collected.info);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
infos.sort((a, b) => {
|
|
519
|
+
if (a.startedAt !== b.startedAt) {
|
|
520
|
+
return a.startedAt < b.startedAt ? 1 : -1;
|
|
521
|
+
}
|
|
522
|
+
return a.runId < b.runId ? 1 : -1;
|
|
523
|
+
});
|
|
524
|
+
return infos.slice(0, limit);
|
|
525
|
+
}
|
|
526
|
+
async function runRunListCommand(args, deps) {
|
|
527
|
+
const parsed = parseRunListArgs(args);
|
|
528
|
+
if ('error' in parsed) {
|
|
529
|
+
if (parsed.error === 'help') {
|
|
530
|
+
printRunListHelp();
|
|
531
|
+
return 0;
|
|
532
|
+
}
|
|
533
|
+
console.error(parsed.error);
|
|
534
|
+
return 1;
|
|
535
|
+
}
|
|
536
|
+
const infos = listRunInfos(resolveHomeDir(deps), parsed.limit);
|
|
537
|
+
if (parsed.json) {
|
|
538
|
+
console.log(JSON.stringify(infos));
|
|
539
|
+
return 0;
|
|
540
|
+
}
|
|
541
|
+
if (infos.length === 0) {
|
|
542
|
+
console.log('No runs yet');
|
|
543
|
+
return 0;
|
|
544
|
+
}
|
|
545
|
+
const color = (0, terminal_style_1.terminalColorsEnabled)(process.stdout);
|
|
546
|
+
for (const info of infos) {
|
|
547
|
+
const session = info.sessionId ? ` ${info.sessionId}` : '';
|
|
548
|
+
console.log(`${terminal_style_1.terminalStyle.bold(info.runId, color)} ${formatState(info.state, color)} ${info.deck} ${info.startedAt}${session}`);
|
|
549
|
+
}
|
|
550
|
+
return 0;
|
|
551
|
+
}
|
|
552
|
+
//# sourceMappingURL=run-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-status.js","sourceRoot":"","sources":["../src/run-status.ts"],"names":[],"mappings":"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"}
|