agent-media-cli 1.0.0
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/LICENSE +199 -0
- package/README.md +59 -0
- package/dist/commands/alias.d.ts +3 -0
- package/dist/commands/alias.d.ts.map +1 -0
- package/dist/commands/alias.js +245 -0
- package/dist/commands/alias.js.map +1 -0
- package/dist/commands/apikey.d.ts +3 -0
- package/dist/commands/apikey.d.ts.map +1 -0
- package/dist/commands/apikey.js +282 -0
- package/dist/commands/apikey.js.map +1 -0
- package/dist/commands/cancel.d.ts +9 -0
- package/dist/commands/cancel.d.ts.map +1 -0
- package/dist/commands/cancel.js +101 -0
- package/dist/commands/cancel.js.map +1 -0
- package/dist/commands/completions.d.ts +15 -0
- package/dist/commands/completions.d.ts.map +1 -0
- package/dist/commands/completions.js +293 -0
- package/dist/commands/completions.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +327 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/credits.d.ts +18 -0
- package/dist/commands/credits.d.ts.map +1 -0
- package/dist/commands/credits.js +459 -0
- package/dist/commands/credits.js.map +1 -0
- package/dist/commands/debug.d.ts +20 -0
- package/dist/commands/debug.d.ts.map +1 -0
- package/dist/commands/debug.js +291 -0
- package/dist/commands/debug.js.map +1 -0
- package/dist/commands/delete.d.ts +3 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +273 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/doctor.d.ts +14 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +468 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/download.d.ts +3 -0
- package/dist/commands/download.d.ts.map +1 -0
- package/dist/commands/download.js +165 -0
- package/dist/commands/download.js.map +1 -0
- package/dist/commands/generate.d.ts +3 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +358 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/inspect.d.ts +10 -0
- package/dist/commands/inspect.d.ts.map +1 -0
- package/dist/commands/inspect.js +376 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/list.d.ts +13 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +198 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +15 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +123 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +12 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +85 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/models.d.ts +10 -0
- package/dist/commands/models.d.ts.map +1 -0
- package/dist/commands/models.js +137 -0
- package/dist/commands/models.js.map +1 -0
- package/dist/commands/plan.d.ts +13 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +134 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/pricing.d.ts +14 -0
- package/dist/commands/pricing.d.ts.map +1 -0
- package/dist/commands/pricing.js +166 -0
- package/dist/commands/pricing.js.map +1 -0
- package/dist/commands/profile.d.ts +9 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +236 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/retry.d.ts +3 -0
- package/dist/commands/retry.d.ts.map +1 -0
- package/dist/commands/retry.js +424 -0
- package/dist/commands/retry.js.map +1 -0
- package/dist/commands/status.d.ts +9 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +182 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/subscribe.d.ts +3 -0
- package/dist/commands/subscribe.d.ts.map +1 -0
- package/dist/commands/subscribe.js +263 -0
- package/dist/commands/subscribe.js.map +1 -0
- package/dist/commands/text.d.ts +3 -0
- package/dist/commands/text.d.ts.map +1 -0
- package/dist/commands/text.js +263 -0
- package/dist/commands/text.js.map +1 -0
- package/dist/commands/update.d.ts +13 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +211 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/usage.d.ts +13 -0
- package/dist/commands/usage.d.ts.map +1 -0
- package/dist/commands/usage.js +344 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/commands/version.d.ts +8 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +26 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/commands/whoami.d.ts +9 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +76 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +85 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +518 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +582 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/config.d.ts +33 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +91 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/credentials.d.ts +60 -0
- package/dist/lib/credentials.d.ts.map +1 -0
- package/dist/lib/credentials.js +152 -0
- package/dist/lib/credentials.js.map +1 -0
- package/dist/lib/errors.d.ts +20 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +77 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/output.d.ts +33 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +77 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
// Copyright 2026 agent-media contributors. Apache-2.0 license.
|
|
2
|
+
/**
|
|
3
|
+
* `agent-media retry <job-id>` command.
|
|
4
|
+
*
|
|
5
|
+
* Re-submits a failed or canceled generation job with the same parameters.
|
|
6
|
+
* Flow:
|
|
7
|
+
* 1. Load API key from the credential store.
|
|
8
|
+
* 2. Fetch the original job and verify it is in a retryable state.
|
|
9
|
+
* 3. Display a retry summary with cost estimate.
|
|
10
|
+
* 4. Confirm with the user (unless --no-confirm).
|
|
11
|
+
* 5. Submit a new generation via api.retryJob().
|
|
12
|
+
* 6. Optionally wait for completion (--wait) and download output (--download).
|
|
13
|
+
*
|
|
14
|
+
* Supports human, JSON, and quiet output modes.
|
|
15
|
+
*/
|
|
16
|
+
import { createInterface } from 'node:readline';
|
|
17
|
+
import { existsSync } from 'node:fs';
|
|
18
|
+
import { resolve, extname } from 'node:path';
|
|
19
|
+
import chalk from 'chalk';
|
|
20
|
+
import { detectOutputMode, printJson, printQuiet, createSpinner, } from '../lib/output.js';
|
|
21
|
+
import { getApiKey, resolveProfileName } from '../lib/credentials.js';
|
|
22
|
+
import { AgentMediaAPI, } from '../lib/api.js';
|
|
23
|
+
import { CLIError, handleError } from '../lib/errors.js';
|
|
24
|
+
import { getConfigValue } from '../lib/config.js';
|
|
25
|
+
// -- Watch / download helper constants ----------------------------------------
|
|
26
|
+
/** Poll interval for --wait mode, in milliseconds. */
|
|
27
|
+
const POLL_INTERVAL_MS = 3_000;
|
|
28
|
+
/** Terminal job statuses that end the polling loop. */
|
|
29
|
+
const TERMINAL_STATUSES = new Set(['completed', 'failed', 'canceled']);
|
|
30
|
+
/** Status labels with color coding. */
|
|
31
|
+
const STATUS_COLORS = {
|
|
32
|
+
pending: chalk.yellow,
|
|
33
|
+
processing: chalk.blue,
|
|
34
|
+
completed: chalk.green,
|
|
35
|
+
failed: chalk.red,
|
|
36
|
+
canceled: chalk.dim,
|
|
37
|
+
};
|
|
38
|
+
/** Map content-type to file extension. */
|
|
39
|
+
const EXTENSION_BY_CONTENT_TYPE = {
|
|
40
|
+
'video/mp4': '.mp4',
|
|
41
|
+
'video/webm': '.webm',
|
|
42
|
+
'video/quicktime': '.mov',
|
|
43
|
+
'image/png': '.png',
|
|
44
|
+
'image/jpeg': '.jpg',
|
|
45
|
+
'image/webp': '.webp',
|
|
46
|
+
'image/gif': '.gif',
|
|
47
|
+
};
|
|
48
|
+
// -- Helpers ------------------------------------------------------------------
|
|
49
|
+
/**
|
|
50
|
+
* Format a status string with color.
|
|
51
|
+
*/
|
|
52
|
+
function formatStatus(status) {
|
|
53
|
+
const colorize = STATUS_COLORS[status] ?? chalk.white;
|
|
54
|
+
return colorize(status.toUpperCase());
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Detect the file extension from a URL path or content-type header.
|
|
58
|
+
*/
|
|
59
|
+
function detectExtension(url, contentType) {
|
|
60
|
+
if (contentType) {
|
|
61
|
+
const baseType = contentType.split(';')[0].trim().toLowerCase();
|
|
62
|
+
const ext = EXTENSION_BY_CONTENT_TYPE[baseType];
|
|
63
|
+
if (ext)
|
|
64
|
+
return ext;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const pathname = new URL(url).pathname;
|
|
68
|
+
const ext = extname(pathname).toLowerCase();
|
|
69
|
+
if (ext)
|
|
70
|
+
return ext;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Invalid URL, fall through
|
|
74
|
+
}
|
|
75
|
+
return '.mp4';
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Format bytes to a human-readable string (e.g., "15.2 MB").
|
|
79
|
+
*/
|
|
80
|
+
function formatBytes(bytes) {
|
|
81
|
+
if (bytes < 1024)
|
|
82
|
+
return `${bytes} B`;
|
|
83
|
+
if (bytes < 1024 * 1024)
|
|
84
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
85
|
+
if (bytes < 1024 * 1024 * 1024)
|
|
86
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
87
|
+
return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Format elapsed seconds as a human-readable duration (e.g., "1m 23s").
|
|
91
|
+
*/
|
|
92
|
+
function formatElapsed(seconds) {
|
|
93
|
+
if (seconds < 60)
|
|
94
|
+
return `${seconds}s`;
|
|
95
|
+
const mins = Math.floor(seconds / 60);
|
|
96
|
+
const secs = seconds % 60;
|
|
97
|
+
return `${mins}m ${secs}s`;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Poll a generation job until it reaches a terminal state.
|
|
101
|
+
*
|
|
102
|
+
* Displays a spinner with live status updates in human mode.
|
|
103
|
+
* Returns the final job state, or `null` if interrupted by SIGINT.
|
|
104
|
+
*/
|
|
105
|
+
async function waitForJob(api, jobId, mode) {
|
|
106
|
+
const startTime = Date.now();
|
|
107
|
+
let interrupted = false;
|
|
108
|
+
const onSigint = () => {
|
|
109
|
+
interrupted = true;
|
|
110
|
+
};
|
|
111
|
+
process.on('SIGINT', onSigint);
|
|
112
|
+
const spinner = createSpinner('Waiting for job to complete...');
|
|
113
|
+
if (mode === 'human')
|
|
114
|
+
spinner.start();
|
|
115
|
+
try {
|
|
116
|
+
while (!interrupted) {
|
|
117
|
+
const job = await api.getJob(jobId);
|
|
118
|
+
const elapsed = Math.floor((Date.now() - startTime) / 1000);
|
|
119
|
+
if (mode === 'human') {
|
|
120
|
+
spinner.text = `${formatStatus(job.status)} elapsed ${formatElapsed(elapsed)} (Ctrl+C to stop)`;
|
|
121
|
+
}
|
|
122
|
+
if (TERMINAL_STATUSES.has(job.status)) {
|
|
123
|
+
if (mode === 'human') {
|
|
124
|
+
if (job.status === 'completed') {
|
|
125
|
+
spinner.succeed(`Job ${chalk.cyan(jobId)} completed in ${formatElapsed(elapsed)}`);
|
|
126
|
+
}
|
|
127
|
+
else if (job.status === 'failed') {
|
|
128
|
+
spinner.fail(`Job ${chalk.cyan(jobId)} failed after ${formatElapsed(elapsed)}` +
|
|
129
|
+
(job.error_message ? `: ${job.error_message}` : ''));
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
spinner.warn(`Job ${chalk.cyan(jobId)} was canceled after ${formatElapsed(elapsed)}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return job;
|
|
136
|
+
}
|
|
137
|
+
// Wait before next poll, allowing early exit on SIGINT
|
|
138
|
+
await new Promise((resolve) => {
|
|
139
|
+
const timer = setTimeout(resolve, POLL_INTERVAL_MS);
|
|
140
|
+
const earlyExit = () => {
|
|
141
|
+
clearTimeout(timer);
|
|
142
|
+
resolve();
|
|
143
|
+
};
|
|
144
|
+
process.once('SIGINT', earlyExit);
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
// Interrupted by SIGINT
|
|
148
|
+
if (mode === 'human') {
|
|
149
|
+
spinner.stop();
|
|
150
|
+
console.log();
|
|
151
|
+
console.log(chalk.dim(' Stopped waiting.'));
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
process.removeListener('SIGINT', onSigint);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Download the output media from a completed job.
|
|
161
|
+
*
|
|
162
|
+
* Resolves the output directory from the `download_dir` config key,
|
|
163
|
+
* falling back to the current working directory. Returns the saved
|
|
164
|
+
* file path, or `null` if the download was skipped.
|
|
165
|
+
*/
|
|
166
|
+
async function downloadJobOutput(api, job, mode) {
|
|
167
|
+
if (!job.output_media_url) {
|
|
168
|
+
if (mode === 'human') {
|
|
169
|
+
console.log(chalk.yellow(' No media available for download.'));
|
|
170
|
+
}
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
// Determine output directory and filename (matches download.ts pattern)
|
|
174
|
+
const downloadDir = getConfigValue('download_dir') ?? '.';
|
|
175
|
+
const ext = detectExtension(job.output_media_url);
|
|
176
|
+
const shortId = job.id.slice(0, 8);
|
|
177
|
+
const filename = `${job.model_slug}-${shortId}${ext}`;
|
|
178
|
+
const outputPath = resolve(downloadDir, filename);
|
|
179
|
+
// Warn on overwrite
|
|
180
|
+
if (existsSync(outputPath) && mode === 'human') {
|
|
181
|
+
console.log(chalk.yellow(` Warning: overwriting existing file ${outputPath}`));
|
|
182
|
+
}
|
|
183
|
+
const downloadSpinner = createSpinner('Downloading...');
|
|
184
|
+
if (mode === 'human')
|
|
185
|
+
downloadSpinner.start();
|
|
186
|
+
const totalBytes = await api.downloadMedia(job.output_media_url, outputPath, (received, total) => {
|
|
187
|
+
if (mode === 'human') {
|
|
188
|
+
const progress = total
|
|
189
|
+
? `${formatBytes(received)} / ${formatBytes(total)}`
|
|
190
|
+
: formatBytes(received);
|
|
191
|
+
downloadSpinner.text = `Downloading... ${progress}`;
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
if (mode === 'human') {
|
|
195
|
+
downloadSpinner.succeed(`Downloaded to ${outputPath} (${formatBytes(totalBytes)})`);
|
|
196
|
+
}
|
|
197
|
+
return outputPath;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Ask a yes/no question on stdin and return the result.
|
|
201
|
+
* Defaults to "yes" if the user presses Enter without typing.
|
|
202
|
+
*/
|
|
203
|
+
function askConfirmation(question) {
|
|
204
|
+
return new Promise((resolve) => {
|
|
205
|
+
const rl = createInterface({
|
|
206
|
+
input: process.stdin,
|
|
207
|
+
output: process.stdout,
|
|
208
|
+
});
|
|
209
|
+
rl.question(question, (answer) => {
|
|
210
|
+
rl.close();
|
|
211
|
+
const trimmed = answer.trim().toLowerCase();
|
|
212
|
+
resolve(trimmed === '' || trimmed === 'y' || trimmed === 'yes');
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Truncate a string to a maximum length, appending "..." if truncated.
|
|
218
|
+
*/
|
|
219
|
+
function truncate(text, maxLen) {
|
|
220
|
+
if (text.length <= maxLen)
|
|
221
|
+
return text;
|
|
222
|
+
return text.slice(0, maxLen) + '...';
|
|
223
|
+
}
|
|
224
|
+
export function registerRetryCommand(program) {
|
|
225
|
+
program
|
|
226
|
+
.command('retry <job-id>')
|
|
227
|
+
.description('Retry a failed or canceled generation job')
|
|
228
|
+
.option('-p, --prompt <text>', 'Override the original prompt')
|
|
229
|
+
.option('--seed <number>', 'Override the seed')
|
|
230
|
+
.option('--no-confirm', 'Skip the cost confirmation prompt')
|
|
231
|
+
.option('-w, --wait', 'Wait for the new job to complete before exiting')
|
|
232
|
+
.option('-d, --download', 'Download output after completion (requires --wait)')
|
|
233
|
+
.action(async (jobId, cmdOpts) => {
|
|
234
|
+
const globalOpts = program.opts();
|
|
235
|
+
const mode = detectOutputMode(globalOpts);
|
|
236
|
+
const profileName = resolveProfileName(globalOpts.profile);
|
|
237
|
+
const apiKey = getApiKey(profileName);
|
|
238
|
+
if (!apiKey) {
|
|
239
|
+
throw new CLIError('Not logged in.', {
|
|
240
|
+
code: 'NOT_AUTHENTICATED',
|
|
241
|
+
suggestion: "Run 'agent-media login' to authenticate.",
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
// -- Validate flag combinations -----------------------------------------
|
|
245
|
+
if (cmdOpts.download && !cmdOpts.wait) {
|
|
246
|
+
throw new CLIError('--download requires --wait.', {
|
|
247
|
+
code: 'INVALID_FLAGS',
|
|
248
|
+
suggestion: "Add '--wait' to wait for the job to finish before downloading, e.g.:\n agent-media retry <job-id> --wait --download",
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
try {
|
|
252
|
+
const api = new AgentMediaAPI(apiKey);
|
|
253
|
+
// -- Step 1: Fetch the original job -----------------------------------
|
|
254
|
+
const fetchSpinner = createSpinner('Fetching original job...');
|
|
255
|
+
if (mode === 'human')
|
|
256
|
+
fetchSpinner.start();
|
|
257
|
+
const originalJob = await api.getJob(jobId);
|
|
258
|
+
if (mode === 'human')
|
|
259
|
+
fetchSpinner.stop();
|
|
260
|
+
// -- Step 2: Verify job is retryable ----------------------------------
|
|
261
|
+
if (originalJob.status !== 'failed' && originalJob.status !== 'canceled') {
|
|
262
|
+
throw new CLIError(`Cannot retry job with status "${originalJob.status}". Only failed or canceled jobs can be retried.`, {
|
|
263
|
+
code: 'INVALID_JOB_STATUS',
|
|
264
|
+
suggestion: `Job ${jobId} is currently ${originalJob.status}. Use 'agent-media status ${jobId}' to check details.`,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
// -- Step 3: Build overrides ------------------------------------------
|
|
268
|
+
const overrides = {};
|
|
269
|
+
if (cmdOpts.prompt)
|
|
270
|
+
overrides.prompt = cmdOpts.prompt;
|
|
271
|
+
if (cmdOpts.seed)
|
|
272
|
+
overrides.seed = parseInt(cmdOpts.seed, 10);
|
|
273
|
+
const effectivePrompt = overrides.prompt ?? originalJob.prompt;
|
|
274
|
+
// -- Step 4: Display retry summary and cost estimate ------------------
|
|
275
|
+
const estimateSpinner = createSpinner('Calculating cost...');
|
|
276
|
+
if (mode === 'human')
|
|
277
|
+
estimateSpinner.start();
|
|
278
|
+
const estimate = (await api.submitGeneration({
|
|
279
|
+
modelSlug: originalJob.model_slug,
|
|
280
|
+
prompt: effectivePrompt,
|
|
281
|
+
duration: originalJob.duration_seconds ?? undefined,
|
|
282
|
+
resolution: originalJob.resolution ?? undefined,
|
|
283
|
+
aspectRatio: originalJob.aspect_ratio ?? undefined,
|
|
284
|
+
seed: overrides.seed ?? originalJob.seed ?? undefined,
|
|
285
|
+
dryRun: true,
|
|
286
|
+
}));
|
|
287
|
+
if (mode === 'human')
|
|
288
|
+
estimateSpinner.stop();
|
|
289
|
+
if (!estimate.canAfford) {
|
|
290
|
+
throw new CLIError(`Insufficient credits. This retry costs ${estimate.credits} credits but you only have ${estimate.availableCredits}.`, {
|
|
291
|
+
code: 'INSUFFICIENT_CREDITS',
|
|
292
|
+
suggestion: 'Buy more credits at https://agent-media.ai/billing or choose a cheaper model/resolution.',
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
if (cmdOpts.confirm && mode === 'human') {
|
|
296
|
+
console.log();
|
|
297
|
+
console.log(chalk.bold(' Retry Summary'));
|
|
298
|
+
console.log(` ${chalk.bold('Original:')} ${chalk.cyan(originalJob.id)} ${chalk.red(`[${originalJob.status.toUpperCase()}]`)}`);
|
|
299
|
+
console.log(` ${chalk.bold('Model:')} ${estimate.modelDisplayName}`);
|
|
300
|
+
console.log(` ${chalk.bold('Prompt:')} "${truncate(effectivePrompt, 60)}"`);
|
|
301
|
+
if (overrides.prompt) {
|
|
302
|
+
console.log(chalk.yellow(' (overridden)'));
|
|
303
|
+
}
|
|
304
|
+
console.log(` ${chalk.bold('Cost:')} ${chalk.yellow(String(estimate.credits))} credits` +
|
|
305
|
+
` (${chalk.dim(`$${estimate.costUsd.toFixed(2)}`)})`);
|
|
306
|
+
console.log(` ${chalk.bold('Balance:')} ${estimate.availableCredits} credits available`);
|
|
307
|
+
// Warn if credits were not refunded on the failed job
|
|
308
|
+
if (!originalJob.credits_refunded && originalJob.credits_charged != null && originalJob.credits_charged > 0) {
|
|
309
|
+
console.log();
|
|
310
|
+
console.log(chalk.yellow(` Warning: The original job's ${originalJob.credits_charged} credits were not refunded.`));
|
|
311
|
+
console.log(chalk.yellow(' This retry will charge new credits.'));
|
|
312
|
+
}
|
|
313
|
+
console.log();
|
|
314
|
+
const confirmed = await askConfirmation(` Retry for ${chalk.yellow(String(estimate.credits))} credits` +
|
|
315
|
+
` (you have ${chalk.green(String(estimate.availableCredits))})? [Y/n] `);
|
|
316
|
+
if (!confirmed) {
|
|
317
|
+
console.log(chalk.dim(' Retry cancelled.'));
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// -- Step 5: Submit retry ---------------------------------------------
|
|
322
|
+
const submitSpinner = createSpinner('Submitting retry...');
|
|
323
|
+
if (mode === 'human')
|
|
324
|
+
submitSpinner.start();
|
|
325
|
+
const result = await api.retryJob(jobId, overrides);
|
|
326
|
+
if (mode === 'human')
|
|
327
|
+
submitSpinner.succeed('Retry submitted');
|
|
328
|
+
// -- Step 6: Display result -------------------------------------------
|
|
329
|
+
if (!cmdOpts.wait) {
|
|
330
|
+
switch (mode) {
|
|
331
|
+
case 'json':
|
|
332
|
+
printJson({
|
|
333
|
+
original_job_id: originalJob.id,
|
|
334
|
+
new_job_id: result.job_id,
|
|
335
|
+
model: originalJob.model_slug,
|
|
336
|
+
credits_charged: result.credits_deducted,
|
|
337
|
+
status: result.status,
|
|
338
|
+
});
|
|
339
|
+
break;
|
|
340
|
+
case 'quiet':
|
|
341
|
+
printQuiet(result.job_id);
|
|
342
|
+
break;
|
|
343
|
+
default: {
|
|
344
|
+
console.log();
|
|
345
|
+
console.log(` ${chalk.bold('New Job ID:')} ${chalk.cyan(result.job_id)}`);
|
|
346
|
+
console.log(` ${chalk.bold('Status:')} ${chalk.yellow(result.status)}`);
|
|
347
|
+
console.log(` ${chalk.bold('Credits:')} ${result.credits_deducted} deducted`);
|
|
348
|
+
if (result.estimated_duration) {
|
|
349
|
+
console.log(` ${chalk.bold('ETA:')} ~${result.estimated_duration}s`);
|
|
350
|
+
}
|
|
351
|
+
console.log();
|
|
352
|
+
console.log(chalk.dim(` Run 'agent-media status ${result.job_id}' to check progress`));
|
|
353
|
+
console.log();
|
|
354
|
+
break;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
// -- Step 7: Wait for completion (--wait) -----------------------------
|
|
360
|
+
if (mode === 'human') {
|
|
361
|
+
console.log();
|
|
362
|
+
console.log(` ${chalk.bold('New Job ID:')} ${chalk.cyan(result.job_id)}`);
|
|
363
|
+
console.log(` ${chalk.bold('Credits:')} ${result.credits_deducted} deducted`);
|
|
364
|
+
console.log();
|
|
365
|
+
}
|
|
366
|
+
const finishedJob = await waitForJob(api, result.job_id, mode);
|
|
367
|
+
// SIGINT interrupted the wait -- exit without downloading
|
|
368
|
+
if (!finishedJob) {
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
// In JSON mode, emit the final job state
|
|
372
|
+
if (mode === 'json') {
|
|
373
|
+
const payload = {
|
|
374
|
+
original_job_id: originalJob.id,
|
|
375
|
+
new_job_id: finishedJob.id,
|
|
376
|
+
model: originalJob.model_slug,
|
|
377
|
+
credits_charged: result.credits_deducted,
|
|
378
|
+
status: finishedJob.status,
|
|
379
|
+
};
|
|
380
|
+
if (finishedJob.status === 'failed') {
|
|
381
|
+
payload['error'] = finishedJob.error_message ?? 'Unknown error';
|
|
382
|
+
}
|
|
383
|
+
if (finishedJob.output_media_url) {
|
|
384
|
+
payload['output_url'] = finishedJob.output_media_url;
|
|
385
|
+
}
|
|
386
|
+
// If --download, include the downloaded path in JSON output
|
|
387
|
+
if (cmdOpts.download && finishedJob.status === 'completed') {
|
|
388
|
+
const downloadedPath = await downloadJobOutput(api, finishedJob, mode);
|
|
389
|
+
if (downloadedPath) {
|
|
390
|
+
payload['downloaded_to'] = downloadedPath;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
printJson(payload);
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
if (mode === 'quiet') {
|
|
397
|
+
printQuiet(finishedJob.status === 'completed' ? finishedJob.id : `error:${finishedJob.status}`);
|
|
398
|
+
if (cmdOpts.download && finishedJob.status === 'completed') {
|
|
399
|
+
const downloadedPath = await downloadJobOutput(api, finishedJob, mode);
|
|
400
|
+
if (downloadedPath) {
|
|
401
|
+
printQuiet(downloadedPath);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
// -- Step 8: Download output (--download) -----------------------------
|
|
407
|
+
if (cmdOpts.download) {
|
|
408
|
+
if (finishedJob.status !== 'completed') {
|
|
409
|
+
console.log();
|
|
410
|
+
console.log(chalk.yellow(' Skipping download -- job did not complete successfully.'));
|
|
411
|
+
console.log();
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
console.log();
|
|
415
|
+
await downloadJobOutput(api, finishedJob, mode);
|
|
416
|
+
console.log();
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
catch (error) {
|
|
420
|
+
handleError(error);
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/commands/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent-media status <job-id>` command.
|
|
3
|
+
*
|
|
4
|
+
* Fetches and displays the current state of a generation job.
|
|
5
|
+
* Supports --watch mode for live polling, plus JSON and quiet output modes.
|
|
6
|
+
*/
|
|
7
|
+
import type { Command } from 'commander';
|
|
8
|
+
export declare function registerStatusCommand(program: Command): void;
|
|
9
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkHzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsG5D"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
// Copyright 2026 agent-media contributors. Apache-2.0 license.
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { detectOutputMode, printJson, printQuiet, createSpinner, } from '../lib/output.js';
|
|
4
|
+
import { getApiKey, resolveProfileName } from '../lib/credentials.js';
|
|
5
|
+
import { AgentMediaAPI } from '../lib/api.js';
|
|
6
|
+
import { CLIError, handleError } from '../lib/errors.js';
|
|
7
|
+
/** Status labels with color coding. */
|
|
8
|
+
const STATUS_COLORS = {
|
|
9
|
+
pending: chalk.yellow,
|
|
10
|
+
processing: chalk.blue,
|
|
11
|
+
completed: chalk.green,
|
|
12
|
+
failed: chalk.red,
|
|
13
|
+
canceled: chalk.dim,
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Format a status string with color and brackets.
|
|
17
|
+
*/
|
|
18
|
+
function formatStatus(status) {
|
|
19
|
+
const colorize = STATUS_COLORS[status] ?? chalk.white;
|
|
20
|
+
return colorize(`[${status.toUpperCase()}] ${status}`);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Format a relative time string (e.g., "2 minutes ago").
|
|
24
|
+
*/
|
|
25
|
+
function timeAgo(dateStr) {
|
|
26
|
+
const now = Date.now();
|
|
27
|
+
const then = new Date(dateStr).getTime();
|
|
28
|
+
const diffMs = now - then;
|
|
29
|
+
const seconds = Math.floor(diffMs / 1000);
|
|
30
|
+
if (seconds < 60)
|
|
31
|
+
return `${seconds}s ago`;
|
|
32
|
+
const minutes = Math.floor(seconds / 60);
|
|
33
|
+
if (minutes < 60)
|
|
34
|
+
return `${minutes} minute${minutes === 1 ? '' : 's'} ago`;
|
|
35
|
+
const hours = Math.floor(minutes / 60);
|
|
36
|
+
if (hours < 24)
|
|
37
|
+
return `${hours} hour${hours === 1 ? '' : 's'} ago`;
|
|
38
|
+
const days = Math.floor(hours / 24);
|
|
39
|
+
return `${days} day${days === 1 ? '' : 's'} ago`;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Format the duration and resolution string.
|
|
43
|
+
*/
|
|
44
|
+
function formatDurationRes(job) {
|
|
45
|
+
const parts = [];
|
|
46
|
+
if (job.duration_seconds != null)
|
|
47
|
+
parts.push(`${job.duration_seconds}s`);
|
|
48
|
+
if (job.resolution)
|
|
49
|
+
parts.push(`@ ${job.resolution}`);
|
|
50
|
+
return parts.join(' ') || 'N/A';
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Print the human-readable job detail card.
|
|
54
|
+
*/
|
|
55
|
+
function printJobCard(job) {
|
|
56
|
+
const modelDisplay = job.model_display_name
|
|
57
|
+
? `${job.model_display_name} (${job.model_slug})`
|
|
58
|
+
: job.model_slug;
|
|
59
|
+
console.log();
|
|
60
|
+
console.log(` ${chalk.bold('Job')} ${chalk.cyan(job.id)}`);
|
|
61
|
+
console.log(` ${chalk.bold('Model:')} ${modelDisplay}`);
|
|
62
|
+
console.log(` ${chalk.bold('Status:')} ${formatStatus(job.status)}`);
|
|
63
|
+
console.log(` ${chalk.bold('Created:')} ${timeAgo(job.created_at)}`);
|
|
64
|
+
console.log(` ${chalk.bold('Duration:')} ${formatDurationRes(job)}`);
|
|
65
|
+
// Credits line: show "(refunded)" when applicable
|
|
66
|
+
const creditsStr = job.credits_charged != null ? String(job.credits_charged) : 'N/A';
|
|
67
|
+
const refundedSuffix = job.credits_refunded ? chalk.yellow(' (refunded)') : '';
|
|
68
|
+
console.log(` ${chalk.bold('Credits:')} ${creditsStr}${refundedSuffix}`);
|
|
69
|
+
// Truncate long prompts for display
|
|
70
|
+
const maxPromptLen = 60;
|
|
71
|
+
const promptDisplay = job.prompt.length > maxPromptLen
|
|
72
|
+
? `"${job.prompt.slice(0, maxPromptLen)}..."`
|
|
73
|
+
: `"${job.prompt}"`;
|
|
74
|
+
console.log(` ${chalk.bold('Prompt:')} ${promptDisplay}`);
|
|
75
|
+
// Completed: show output URL and download suggestion
|
|
76
|
+
if (job.status === 'completed' && job.output_media_url) {
|
|
77
|
+
console.log();
|
|
78
|
+
console.log(` ${chalk.bold('Output:')} ${chalk.underline(job.output_media_url)}`);
|
|
79
|
+
console.log();
|
|
80
|
+
console.log(chalk.dim(` Download with: agent-media download ${job.id}`));
|
|
81
|
+
}
|
|
82
|
+
// Failed: show error message
|
|
83
|
+
if (job.status === 'failed' && job.error_message) {
|
|
84
|
+
console.log();
|
|
85
|
+
console.log(` ${chalk.bold('Error:')} ${chalk.red(job.error_message)}`);
|
|
86
|
+
}
|
|
87
|
+
console.log();
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Clear the terminal and move cursor to top for --watch redraws.
|
|
91
|
+
*/
|
|
92
|
+
function clearScreen() {
|
|
93
|
+
process.stdout.write('\x1B[2J\x1B[H');
|
|
94
|
+
}
|
|
95
|
+
export function registerStatusCommand(program) {
|
|
96
|
+
program
|
|
97
|
+
.command('status <job-id>')
|
|
98
|
+
.description('Check the status of a generation job')
|
|
99
|
+
.option('-w, --watch', 'Poll for updates until the job completes')
|
|
100
|
+
.action(async (jobId, cmdOpts) => {
|
|
101
|
+
const globalOpts = program.opts();
|
|
102
|
+
const mode = detectOutputMode(globalOpts);
|
|
103
|
+
const profileName = resolveProfileName(globalOpts.profile);
|
|
104
|
+
const apiKey = getApiKey(profileName);
|
|
105
|
+
if (!apiKey) {
|
|
106
|
+
throw new CLIError('Not logged in.', {
|
|
107
|
+
code: 'NOT_AUTHENTICATED',
|
|
108
|
+
suggestion: "Run 'agent-media login' to authenticate.",
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
const api = new AgentMediaAPI(apiKey);
|
|
113
|
+
if (cmdOpts.watch && mode === 'human') {
|
|
114
|
+
// ── Watch mode: poll every 3s, update in-place ─────────────
|
|
115
|
+
const POLL_INTERVAL_MS = 3000;
|
|
116
|
+
const startTime = Date.now();
|
|
117
|
+
let running = true;
|
|
118
|
+
// Handle Ctrl+C gracefully
|
|
119
|
+
const onSigint = () => {
|
|
120
|
+
running = false;
|
|
121
|
+
console.log();
|
|
122
|
+
console.log(chalk.dim(' Stopped watching.'));
|
|
123
|
+
process.exit(0);
|
|
124
|
+
};
|
|
125
|
+
process.on('SIGINT', onSigint);
|
|
126
|
+
try {
|
|
127
|
+
while (running) {
|
|
128
|
+
const job = await api.getJob(jobId);
|
|
129
|
+
const elapsed = Math.floor((Date.now() - startTime) / 1000);
|
|
130
|
+
clearScreen();
|
|
131
|
+
printJobCard(job);
|
|
132
|
+
console.log(chalk.dim(` Watching... elapsed ${elapsed}s (Ctrl+C to stop)`));
|
|
133
|
+
console.log();
|
|
134
|
+
// Exit when terminal status reached
|
|
135
|
+
if (job.status === 'completed' ||
|
|
136
|
+
job.status === 'failed' ||
|
|
137
|
+
job.status === 'canceled') {
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
// Wait before next poll
|
|
141
|
+
await new Promise((resolve) => {
|
|
142
|
+
const timer = setTimeout(resolve, POLL_INTERVAL_MS);
|
|
143
|
+
// Allow early exit on SIGINT
|
|
144
|
+
const earlyExit = () => {
|
|
145
|
+
clearTimeout(timer);
|
|
146
|
+
resolve();
|
|
147
|
+
};
|
|
148
|
+
process.once('SIGINT', earlyExit);
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
process.removeListener('SIGINT', onSigint);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
// ── Single fetch ───────────────────────────────────────────
|
|
158
|
+
const spinner = createSpinner('Fetching job status...');
|
|
159
|
+
if (mode === 'human')
|
|
160
|
+
spinner.start();
|
|
161
|
+
const job = await api.getJob(jobId);
|
|
162
|
+
if (mode === 'human')
|
|
163
|
+
spinner.stop();
|
|
164
|
+
switch (mode) {
|
|
165
|
+
case 'json':
|
|
166
|
+
printJson(job);
|
|
167
|
+
break;
|
|
168
|
+
case 'quiet':
|
|
169
|
+
printQuiet(job.status);
|
|
170
|
+
break;
|
|
171
|
+
default:
|
|
172
|
+
printJobCard(job);
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
handleError(error);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|