agent-media-cli 1.8.4 → 1.9.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/index.js CHANGED
@@ -39,6 +39,7 @@ import { registerProductActingCommand } from './commands/product-acting.js';
39
39
  import { registerLaptopUgcCommand } from './commands/laptop-ugc.js';
40
40
  import { registerCharacterVideoCommand } from './commands/character-video.js';
41
41
  import { registerTextToVideoCommand } from './commands/text-to-video.js';
42
+ import { registerV2Commands } from './v2/commands/index.js';
42
43
  import { handleError } from './lib/errors.js';
43
44
  const require = createRequire(import.meta.url);
44
45
  const pkg = require('../package.json');
@@ -85,6 +86,10 @@ registerProductActingCommand(program);
85
86
  registerLaptopUgcCommand(program);
86
87
  registerCharacterVideoCommand(program);
87
88
  registerTextToVideoCommand(program);
89
+ // ── v2 surface — Selfie + character_create + future v2 products ─────────
90
+ // Each v2 command lives under src/v2/. Adding the next one = drop a file
91
+ // in src/v2/commands/ + add it to src/v2/commands/index.ts.
92
+ registerV2Commands(program);
88
93
  // Parse and execute
89
94
  try {
90
95
  program.parse();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `agent-media character` — manage saved v2 characters.
3
+ *
4
+ * Subcommands:
5
+ * create — generate portrait + sheet, pin seed, persist row, return char_xxxxxxxxxx
6
+ * list — list the user's active characters (TBD; deferred until /v2/characters GET lands)
7
+ * show — print details for a single character (TBD)
8
+ * delete — archive a character (TBD)
9
+ */
10
+ import type { Command } from 'commander';
11
+ export declare function registerCharacterCommand(program: Command): void;
12
+ //# sourceMappingURL=character.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"character.d.ts","sourceRoot":"","sources":["../../../src/v2/commands/character.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBzC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqI/D"}
@@ -0,0 +1,132 @@
1
+ // Copyright 2026 agent-media contributors. Apache-2.0 license.
2
+ import chalk from 'chalk';
3
+ import { V2_GENERATORS, V2_SHOT_PRESETS, quoteV2Credits } from '@agentmedia/schema/v2';
4
+ import { AgentMediaAPI } from '../../lib/api.js';
5
+ import { getApiKey, resolveProfileName } from '../../lib/credentials.js';
6
+ import { CLIError, handleError } from '../../lib/errors.js';
7
+ import { detectOutputMode, printJson, printQuiet, createSpinner } from '../../lib/output.js';
8
+ import { resolvePhotoOrUrl, postJSON, pollV2 } from '../lib.js';
9
+ export function registerCharacterCommand(program) {
10
+ const root = program.command('character').description('Manage saved v2 characters.');
11
+ // ── create ───────────────────────────────────────────────────────────
12
+ const def = V2_GENERATORS.character_create;
13
+ root
14
+ .command('create')
15
+ .summary(def.summary)
16
+ .description(def.description)
17
+ .requiredOption('--photo <file|url>', 'Reference photo (local file or https URL).')
18
+ .requiredOption('--name <text>', 'Display name (letters, digits, space, _, -).')
19
+ .requiredOption('--description <text>', 'One-line character description (8-400 chars).')
20
+ .option('--voice-brief <text>', 'One-line voice direction.')
21
+ .option('--preset <name>', `Default shot preset (one of: ${V2_SHOT_PRESETS.join(', ')})`)
22
+ .option('--profile <name>', 'Credentials profile.')
23
+ .action(async (opts, cmd) => {
24
+ try {
25
+ const globals = cmd.optsWithGlobals();
26
+ const mode = detectOutputMode(globals);
27
+ const profile = resolveProfileName(globals.profile);
28
+ const apiKey = getApiKey(profile);
29
+ if (!apiKey) {
30
+ throw new CLIError('Not authenticated. Run `agent-media login` first.', {
31
+ code: 'UNAUTHENTICATED',
32
+ });
33
+ }
34
+ const api = new AgentMediaAPI(apiKey);
35
+ const credits = quoteV2Credits('character_create');
36
+ if (mode === 'human') {
37
+ console.log(chalk.dim(`Creating character will cost ${chalk.white(credits)} credits ($${(credits / 100).toFixed(2)}).`));
38
+ }
39
+ // Upload photo if local
40
+ const photo = String(opts.photo);
41
+ const upload = createSpinner('Uploading photo…');
42
+ if (mode === 'human')
43
+ upload.start();
44
+ let photoUrl;
45
+ try {
46
+ photoUrl = await resolvePhotoOrUrl(api, photo);
47
+ }
48
+ finally {
49
+ if (mode === 'human')
50
+ upload.succeed('Photo ready');
51
+ }
52
+ // Submit
53
+ const { status, data } = await postJSON(api, def.rest.path, {
54
+ photo_url: photoUrl,
55
+ display_name: opts.name,
56
+ description: opts.description,
57
+ ...(opts.voiceBrief ? { voice_brief: opts.voiceBrief } : {}),
58
+ ...(opts.preset ? { preset_default: opts.preset } : {}),
59
+ });
60
+ if (status !== 201) {
61
+ const err = data?.error;
62
+ throw new CLIError(err?.message ?? `Submission failed (HTTP ${status})`, { code: err?.code ?? 'SUBMIT_FAILED' });
63
+ }
64
+ const submission = data;
65
+ const spin = createSpinner('Generating portrait + sheet…');
66
+ if (mode === 'human')
67
+ spin.start();
68
+ const final = (await pollV2(api, submission.job_id, {
69
+ onTick: (s) => {
70
+ if (mode === 'human')
71
+ spin.text = `Generating… ${s.status ?? ''}`;
72
+ },
73
+ }));
74
+ if (final.status === 'failed') {
75
+ if (mode === 'human')
76
+ spin.fail(final.error_message ?? 'Character creation failed');
77
+ throw new CLIError(final.error_message ?? 'Character creation failed', {
78
+ code: 'JOB_FAILED',
79
+ });
80
+ }
81
+ if (mode === 'human')
82
+ spin.succeed('Character created');
83
+ const charId = final.character_id ?? null;
84
+ if (mode === 'json') {
85
+ printJson({
86
+ character_id: charId,
87
+ credits_deducted: submission.credits_deducted,
88
+ ...final,
89
+ });
90
+ }
91
+ else if (mode === 'quiet') {
92
+ printQuiet(charId ?? submission.job_id);
93
+ }
94
+ else {
95
+ console.log(`${chalk.green('●')} ${chalk.bold(charId ?? '(missing id)')}`);
96
+ if (charId) {
97
+ console.log(chalk.dim(`Pass --character ${charId} to any v2 video command.`));
98
+ }
99
+ }
100
+ }
101
+ catch (err) {
102
+ handleError(err);
103
+ }
104
+ });
105
+ // ── list / show / delete — deferred until /v2/characters GET lands ───
106
+ // Stubs that explain status, so users get a clear "not yet" instead
107
+ // of a silent missing command.
108
+ root
109
+ .command('list')
110
+ .description('List your saved v2 characters.')
111
+ .action(() => {
112
+ console.error(chalk.yellow('Not implemented yet — the GET /v2/characters endpoint ships with the v2 dashboard. For now, `agent-media character create` prints the new char_xxx id on success; save it locally.'));
113
+ process.exit(2);
114
+ });
115
+ root
116
+ .command('show')
117
+ .description('Show details for a saved v2 character.')
118
+ .argument('<character_id>', 'char_XXXXXXXXXX')
119
+ .action(() => {
120
+ console.error(chalk.yellow('Not implemented yet — coming with `character list`.'));
121
+ process.exit(2);
122
+ });
123
+ root
124
+ .command('delete')
125
+ .description('Archive a saved v2 character.')
126
+ .argument('<character_id>', 'char_XXXXXXXXXX')
127
+ .action(() => {
128
+ console.error(chalk.yellow('Not implemented yet — coming with `character list`.'));
129
+ process.exit(2);
130
+ });
131
+ }
132
+ //# sourceMappingURL=character.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"character.js","sourceRoot":"","sources":["../../../src/v2/commands/character.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * v2 CLI surface — register all v2 commands on the program.
3
+ *
4
+ * Single entry-point so apps/cli/src/index.ts only adds one import +
5
+ * one call. Adding the next v2 command (Product-in-hands) means
6
+ * dropping a file here and adding it to the array below.
7
+ */
8
+ import type { Command } from 'commander';
9
+ export declare function registerV2Commands(program: Command): void;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/v2/commands/index.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAIzD"}
@@ -0,0 +1,10 @@
1
+ // Copyright 2026 agent-media contributors. Apache-2.0 license.
2
+ import { registerSelfieCommand } from './selfie.js';
3
+ import { registerCharacterCommand } from './character.js';
4
+ import { registerSubtitleCommand } from './subtitle.js';
5
+ export function registerV2Commands(program) {
6
+ registerSelfieCommand(program);
7
+ registerCharacterCommand(program);
8
+ registerSubtitleCommand(program);
9
+ }
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/v2/commands/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAW/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExD,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAClC,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `agent-media selfie` — generate a v2 Selfie video.
3
+ *
4
+ * Two character paths:
5
+ * - saved character: --character char_xxxxxxxxxx
6
+ * - inline character: --photo <file|url> --description "..."
7
+ *
8
+ * Cost / pricing comes from V2_GENERATORS.selfie.pricing — single source.
9
+ */
10
+ import type { Command } from 'commander';
11
+ export declare function registerSelfieCommand(program: Command): void;
12
+ //# sourceMappingURL=selfie.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selfie.d.ts","sourceRoot":"","sources":["../../../src/v2/commands/selfie.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwI5D"}
@@ -0,0 +1,138 @@
1
+ // Copyright 2026 agent-media contributors. Apache-2.0 license.
2
+ import chalk from 'chalk';
3
+ import { readFileSync } from 'node:fs';
4
+ import { V2_GENERATORS, V2_SHOT_PRESETS, V2_VIBES, quoteV2Credits } from '@agentmedia/schema/v2';
5
+ import { AgentMediaAPI } from '../../lib/api.js';
6
+ import { getApiKey, resolveProfileName } from '../../lib/credentials.js';
7
+ import { CLIError, handleError } from '../../lib/errors.js';
8
+ import { detectOutputMode, printJson, printQuiet, createSpinner } from '../../lib/output.js';
9
+ import { resolvePhotoOrUrl, postJSON, pollV2 } from '../lib.js';
10
+ export function registerSelfieCommand(program) {
11
+ const def = V2_GENERATORS.selfie;
12
+ program
13
+ .command(def.cli.command)
14
+ .summary(def.summary)
15
+ .description(def.description)
16
+ .option('--character <id>', 'Saved character id (char_XXXXXXXXXX). Use this OR --photo + --description.')
17
+ .option('--photo <file|url>', 'Reference photo (local file or https URL).')
18
+ .option('--description <text>', 'One-line character description (only with --photo).')
19
+ .requiredOption('--script <text|@file>', 'What the character says. Prefix with @ to read from a file.')
20
+ .option('--preset <name>', `Shot preset (one of: ${V2_SHOT_PRESETS.join(', ')})`, 'bedroom-morning-ritual')
21
+ .option('--vibe <name>', `Vibe (${V2_VIBES.join(' | ')})`, 'excited')
22
+ .option('--duration <seconds>', 'Clip duration: 5 | 8 | 12 | 15', (v) => Number(v), 8)
23
+ .option('--voice-brief <text>', 'One-line voice direction (auto-inferred when omitted).')
24
+ .option('--subtitles <bool>', 'Burn Hormozi-style subs', (v) => v !== 'false', true)
25
+ .option('--profile <name>', 'Credentials profile.')
26
+ .action(async (opts, cmd) => {
27
+ try {
28
+ const globals = cmd.optsWithGlobals();
29
+ const mode = detectOutputMode(globals);
30
+ const profile = resolveProfileName(globals.profile);
31
+ const apiKey = getApiKey(profile);
32
+ if (!apiKey) {
33
+ throw new CLIError('Not authenticated. Run `agent-media login` first.', {
34
+ code: 'UNAUTHENTICATED',
35
+ });
36
+ }
37
+ const api = new AgentMediaAPI(apiKey);
38
+ // Validation
39
+ const character = typeof opts.character === 'string' ? opts.character : undefined;
40
+ const photo = typeof opts.photo === 'string' ? opts.photo : undefined;
41
+ const description = typeof opts.description === 'string' ? opts.description : undefined;
42
+ const hasCharacter = !!character;
43
+ const hasInline = !!photo && !!description;
44
+ if (!hasCharacter && !hasInline) {
45
+ throw new CLIError('Provide either --character <id>, OR both --photo and --description.', { code: 'MISSING_CHARACTER_INPUT' });
46
+ }
47
+ if (hasCharacter && (photo || description)) {
48
+ throw new CLIError('Use --character OR (--photo + --description), not both.', { code: 'AMBIGUOUS_CHARACTER_INPUT' });
49
+ }
50
+ // Resolve script: literal or @file
51
+ let script = String(opts.script);
52
+ if (script.startsWith('@')) {
53
+ script = readFileSync(script.slice(1), 'utf-8').trim();
54
+ }
55
+ // Resolve photo if inline
56
+ let photoUrl;
57
+ if (hasInline && photo) {
58
+ const spin = createSpinner('Uploading photo…');
59
+ if (mode === 'human')
60
+ spin.start();
61
+ try {
62
+ photoUrl = await resolvePhotoOrUrl(api, photo);
63
+ }
64
+ finally {
65
+ if (mode === 'human')
66
+ spin.succeed('Photo ready');
67
+ }
68
+ }
69
+ const duration = typeof opts.duration === 'number' ? opts.duration : 8;
70
+ const credits = quoteV2Credits('selfie', { durationSeconds: duration });
71
+ if (mode === 'human') {
72
+ console.log(chalk.dim(`This Selfie will cost ${chalk.white(credits)} credits ($${(credits / 100).toFixed(2)}).`));
73
+ }
74
+ // Submit
75
+ const body = {
76
+ ...(hasCharacter ? { character_id: character } : {}),
77
+ ...(hasInline ? { photo_url: photoUrl, description } : {}),
78
+ script,
79
+ preset: opts.preset,
80
+ vibe: opts.vibe,
81
+ duration,
82
+ ...(opts.voiceBrief ? { voice_brief: opts.voiceBrief } : {}),
83
+ subtitles: opts.subtitles,
84
+ };
85
+ const { status, data } = await postJSON(api, def.rest.path, body);
86
+ if (status !== 201) {
87
+ const err = data?.error;
88
+ throw new CLIError(err?.message ?? `Submission failed (HTTP ${status})`, { code: err?.code ?? 'SUBMIT_FAILED' });
89
+ }
90
+ const submission = data;
91
+ if (mode === 'json') {
92
+ printJson(submission);
93
+ }
94
+ else if (mode === 'quiet') {
95
+ printQuiet(submission.job_id);
96
+ }
97
+ else {
98
+ console.log(`${chalk.green('✓')} submitted ${chalk.bold(submission.job_id)} — ${submission.credits_deducted ?? credits} credits debited`);
99
+ }
100
+ // Poll until done
101
+ const spin = createSpinner('Generating…');
102
+ if (mode === 'human')
103
+ spin.start();
104
+ let lastStatus = '';
105
+ const final = (await pollV2(api, submission.job_id, {
106
+ onTick: (s) => {
107
+ const cur = s.status ?? '';
108
+ if (cur !== lastStatus) {
109
+ lastStatus = cur;
110
+ if (mode === 'human')
111
+ spin.text = `Generating… ${cur}`;
112
+ }
113
+ },
114
+ }));
115
+ if (final.status === 'failed') {
116
+ if (mode === 'human')
117
+ spin.fail(final.error_message ?? 'Generation failed');
118
+ throw new CLIError(final.error_message ?? 'Generation failed', { code: 'JOB_FAILED' });
119
+ }
120
+ const url = final.video_url || final.result_url;
121
+ if (mode === 'human')
122
+ spin.succeed('Video ready');
123
+ if (mode === 'json') {
124
+ printJson(final);
125
+ }
126
+ else if (mode === 'quiet') {
127
+ printQuiet(url ?? submission.job_id);
128
+ }
129
+ else {
130
+ console.log(`${chalk.green('●')} ${chalk.bold(url ?? '(no url returned)')}`);
131
+ }
132
+ }
133
+ catch (err) {
134
+ handleError(err);
135
+ }
136
+ });
137
+ }
138
+ //# sourceMappingURL=selfie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selfie.js","sourceRoot":"","sources":["../../../src/v2/commands/selfie.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `agent-media subtitle` — burn styled subtitles onto a video.
3
+ *
4
+ * agent-media subtitle --video https://… --style hormozi
5
+ * agent-media subtitle --video https://… --transcript "exact words" --style neon
6
+ *
7
+ * Pricing comes from V2_GENERATORS.subtitle.pricing — single source.
8
+ */
9
+ import type { Command } from 'commander';
10
+ export declare function registerSubtitleCommand(program: Command): void;
11
+ //# sourceMappingURL=subtitle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subtitle.d.ts","sourceRoot":"","sources":["../../../src/v2/commands/subtitle.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0BzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+G9D"}
@@ -0,0 +1,108 @@
1
+ // Copyright 2026 agent-media contributors. Apache-2.0 license.
2
+ import chalk from 'chalk';
3
+ import { readFileSync } from 'node:fs';
4
+ import { V2_GENERATORS, V2_SUBTITLE_STYLES, quoteV2Credits, } from '@agentmedia/schema/v2';
5
+ import { AgentMediaAPI } from '../../lib/api.js';
6
+ import { getApiKey, resolveProfileName } from '../../lib/credentials.js';
7
+ import { CLIError, handleError } from '../../lib/errors.js';
8
+ import { detectOutputMode, printJson, printQuiet, createSpinner } from '../../lib/output.js';
9
+ import { postJSON, pollV2 } from '../lib.js';
10
+ export function registerSubtitleCommand(program) {
11
+ const def = V2_GENERATORS.subtitle;
12
+ program
13
+ .command(def.cli.command)
14
+ .summary(def.summary)
15
+ .description(def.description)
16
+ .requiredOption('--video <url>', 'Public URL of the source video (mp4/webm/mov).')
17
+ .option('--style <name>', `Subtitle style (one of: ${V2_SUBTITLE_STYLES.join(', ')})`, 'hormozi')
18
+ .option('--transcript <text|@file>', 'Exact transcript to use (skips Whisper). Prefix with @ to read from a file.')
19
+ .option('--language <code>', 'ISO 639-1 language hint for Whisper (e.g. "en", "es").')
20
+ .option('--profile <name>', 'Credentials profile.')
21
+ .action(async (opts, cmd) => {
22
+ try {
23
+ const globals = cmd.optsWithGlobals();
24
+ const mode = detectOutputMode(globals);
25
+ const profile = resolveProfileName(globals.profile);
26
+ const apiKey = getApiKey(profile);
27
+ if (!apiKey) {
28
+ throw new CLIError('Not authenticated. Run `agent-media login` first.', {
29
+ code: 'UNAUTHENTICATED',
30
+ });
31
+ }
32
+ const api = new AgentMediaAPI(apiKey);
33
+ const videoUrl = String(opts.video);
34
+ const style = String(opts.style ?? 'hormozi');
35
+ // Resolve transcript: literal or @file
36
+ let transcript;
37
+ if (typeof opts.transcript === 'string') {
38
+ transcript = opts.transcript;
39
+ if (transcript.startsWith('@')) {
40
+ transcript = readFileSync(transcript.slice(1), 'utf-8').trim();
41
+ }
42
+ }
43
+ // Quote up-front. The api-v2 route uses a 30s placeholder; we
44
+ // mirror that here so the user sees the same number it will
45
+ // debit.
46
+ const credits = quoteV2Credits('subtitle', { durationSeconds: 30 });
47
+ if (mode === 'human') {
48
+ console.log(chalk.dim(`Subtitle: up to ${chalk.white(credits)} credits ($${(credits / 100).toFixed(2)}) for a ≤30s clip · longer clips are billed by the second.`));
49
+ }
50
+ const body = {
51
+ video_url: videoUrl,
52
+ style,
53
+ ...(transcript ? { transcript } : {}),
54
+ ...(opts.language ? { language: opts.language } : {}),
55
+ };
56
+ const { status, data } = await postJSON(api, def.rest.path, body);
57
+ if (status !== 201) {
58
+ const err = data?.error;
59
+ throw new CLIError(err?.message ?? `Submission failed (HTTP ${status})`, { code: err?.code ?? 'SUBMIT_FAILED' });
60
+ }
61
+ const submission = data;
62
+ if (mode === 'json') {
63
+ printJson(submission);
64
+ }
65
+ else if (mode === 'quiet') {
66
+ printQuiet(submission.job_id);
67
+ }
68
+ else {
69
+ console.log(`${chalk.green('✓')} submitted ${chalk.bold(submission.job_id)} — ${submission.credits_deducted ?? credits} credits debited`);
70
+ }
71
+ const spin = createSpinner('Subtitling…');
72
+ if (mode === 'human')
73
+ spin.start();
74
+ let lastStatus = '';
75
+ const final = (await pollV2(api, submission.job_id, {
76
+ onTick: (s) => {
77
+ const cur = s.status ?? '';
78
+ if (cur !== lastStatus) {
79
+ lastStatus = cur;
80
+ if (mode === 'human')
81
+ spin.text = `Subtitling… ${cur}`;
82
+ }
83
+ },
84
+ }));
85
+ if (final.status === 'failed') {
86
+ if (mode === 'human')
87
+ spin.fail(final.error_message ?? 'Subtitle failed');
88
+ throw new CLIError(final.error_message ?? 'Subtitle failed', { code: 'JOB_FAILED' });
89
+ }
90
+ const url = final.video_url || final.result_url;
91
+ if (mode === 'human')
92
+ spin.succeed('Subtitled video ready');
93
+ if (mode === 'json') {
94
+ printJson(final);
95
+ }
96
+ else if (mode === 'quiet') {
97
+ printQuiet(url ?? submission.job_id);
98
+ }
99
+ else {
100
+ console.log(`${chalk.green('●')} ${chalk.bold(url ?? '(no url returned)')}`);
101
+ }
102
+ }
103
+ catch (err) {
104
+ handleError(err);
105
+ }
106
+ });
107
+ }
108
+ //# sourceMappingURL=subtitle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subtitle.js","sourceRoot":"","sources":["../../../src/v2/commands/subtitle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { AgentMediaAPI } from '../lib/api.js';
2
+ /**
3
+ * Accepts either a `https://…` URL or a local file path.
4
+ * - URL: returned verbatim
5
+ * - File: uploaded via the existing presigned-url helper, returns the public URL
6
+ *
7
+ * Same upload path the legacy commands use (see laptop-ugc.ts line 109+).
8
+ */
9
+ export declare function resolvePhotoOrUrl(api: AgentMediaAPI, pathOrUrl: string): Promise<string>;
10
+ /**
11
+ * Make an authenticated POST to api-v2 at an arbitrary path. The
12
+ * existing AgentMediaAPI.request() is private; this hits the same
13
+ * baseUrl + auth chain via a fresh fetch using fields the class
14
+ * already exposes.
15
+ */
16
+ export declare function postJSON(api: AgentMediaAPI, path: string, body: unknown): Promise<{
17
+ status: number;
18
+ data: unknown;
19
+ }>;
20
+ /**
21
+ * Poll a v2 job until terminal. Returns the final job row (same
22
+ * shape the legacy CLI commands consume).
23
+ */
24
+ export declare function pollV2(api: AgentMediaAPI, jobId: string, opts?: {
25
+ intervalMs?: number;
26
+ timeoutMs?: number;
27
+ onTick?: (s: unknown) => void;
28
+ }): Promise<unknown>;
29
+ //# sourceMappingURL=lib.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../src/v2/lib.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAkB9C;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,aAAa,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CA6BjB;AAED;;;;;GAKG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CA2B5C;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAC1B,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;CAAO,GACpF,OAAO,CAAC,OAAO,CAAC,CAiBlB"}
package/dist/v2/lib.js ADDED
@@ -0,0 +1,110 @@
1
+ // Copyright 2026 agent-media contributors. Apache-2.0 license.
2
+ /**
3
+ * v2 CLI helpers — shared upload + dispatch + poll logic so each v2
4
+ * command stays a thin wrapper around the registry.
5
+ */
6
+ import { readFileSync, statSync } from 'node:fs';
7
+ import { extname, basename } from 'node:path';
8
+ import { CLIError } from '../lib/errors.js';
9
+ const PHOTO_MIME = new Map([
10
+ ['.png', 'image/png'],
11
+ ['.jpg', 'image/jpeg'],
12
+ ['.jpeg', 'image/jpeg'],
13
+ ['.webp', 'image/webp'],
14
+ ['.heic', 'image/heic'],
15
+ ]);
16
+ // Supabase public-asset URL for the generation-inputs bucket. The
17
+ // `upload-url` edge function returns only `storage_path`; the CLI
18
+ // constructs the public URL itself. Same constant the legacy commands
19
+ // (character-video, laptop-ugc, review, subtitle) already hard-code.
20
+ const SUPABASE_PUBLIC_BASE = 'https://ppwvarkmpffljlqxkjux.supabase.co/storage/v1/object/public/generation-inputs';
21
+ /**
22
+ * Accepts either a `https://…` URL or a local file path.
23
+ * - URL: returned verbatim
24
+ * - File: uploaded via the existing presigned-url helper, returns the public URL
25
+ *
26
+ * Same upload path the legacy commands use (see laptop-ugc.ts line 109+).
27
+ */
28
+ export async function resolvePhotoOrUrl(api, pathOrUrl) {
29
+ if (/^https?:\/\//i.test(pathOrUrl))
30
+ return pathOrUrl;
31
+ // Local path
32
+ let st;
33
+ try {
34
+ st = statSync(pathOrUrl);
35
+ }
36
+ catch {
37
+ throw new CLIError(`File not found: ${pathOrUrl}`, {
38
+ code: 'FILE_NOT_FOUND',
39
+ suggestion: 'Check the path and try again.',
40
+ });
41
+ }
42
+ if (!st.isFile()) {
43
+ throw new CLIError(`${pathOrUrl} is not a regular file`, { code: 'FILE_NOT_FILE' });
44
+ }
45
+ const ext = extname(pathOrUrl).toLowerCase();
46
+ const mime = PHOTO_MIME.get(ext);
47
+ if (!mime) {
48
+ throw new CLIError(`Unsupported photo type "${ext}". Accepts: ${Array.from(PHOTO_MIME.keys()).join(', ')}`, { code: 'UNSUPPORTED_PHOTO_TYPE' });
49
+ }
50
+ const buf = readFileSync(pathOrUrl);
51
+ const { upload_url, storage_path } = await api.getUploadUrl(basename(pathOrUrl), mime);
52
+ await api.uploadFile(upload_url, buf.buffer, mime);
53
+ return `${SUPABASE_PUBLIC_BASE}/${storage_path}`;
54
+ }
55
+ /**
56
+ * Make an authenticated POST to api-v2 at an arbitrary path. The
57
+ * existing AgentMediaAPI.request() is private; this hits the same
58
+ * baseUrl + auth chain via a fresh fetch using fields the class
59
+ * already exposes.
60
+ */
61
+ export async function postJSON(api, path, body) {
62
+ // baseUrl is public on AgentMediaAPI; apiKey/anonKey are not, so we
63
+ // read them off the instance with a narrow cast (private fields, not
64
+ // type holes — the data lives on the same object).
65
+ const reader = api;
66
+ const url = `${api.baseUrl}${path}`;
67
+ const headers = {
68
+ 'Content-Type': 'application/json',
69
+ Authorization: `Bearer ${reader.apiKey}`,
70
+ };
71
+ if (reader.anonKey)
72
+ headers['apikey'] = reader.anonKey;
73
+ const resp = await fetch(url, {
74
+ method: 'POST',
75
+ headers,
76
+ body: JSON.stringify(body),
77
+ });
78
+ const text = await resp.text();
79
+ let data = null;
80
+ if (text) {
81
+ try {
82
+ data = JSON.parse(text);
83
+ }
84
+ catch {
85
+ /* leave as null; caller handles non-JSON */
86
+ }
87
+ }
88
+ return { status: resp.status, data };
89
+ }
90
+ /**
91
+ * Poll a v2 job until terminal. Returns the final job row (same
92
+ * shape the legacy CLI commands consume).
93
+ */
94
+ export async function pollV2(api, jobId, opts = {}) {
95
+ const intervalMs = opts.intervalMs ?? 5_000;
96
+ const timeoutMs = opts.timeoutMs ?? 30 * 60_000;
97
+ const deadline = Date.now() + timeoutMs;
98
+ while (Date.now() < deadline) {
99
+ const job = await api.getJob(jobId);
100
+ if (opts.onTick)
101
+ opts.onTick(job);
102
+ const status = job.status;
103
+ if (status === 'completed' || status === 'failed' || status === 'canceled') {
104
+ return job;
105
+ }
106
+ await new Promise((r) => setTimeout(r, intervalMs));
107
+ }
108
+ throw new CLIError(`Polling timed out after ${Math.round(timeoutMs / 1000)}s for job ${jobId}`, { code: 'POLL_TIMEOUT' });
109
+ }
110
+ //# sourceMappingURL=lib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/v2/lib.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-media-cli",
3
- "version": "1.8.4",
3
+ "version": "1.9.1",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "license": "Apache-2.0",
@@ -39,15 +39,8 @@
39
39
  "README.md",
40
40
  "LICENSE"
41
41
  ],
42
- "scripts": {
43
- "build": "tsc",
44
- "typecheck": "tsc --noEmit",
45
- "lint": "eslint src/",
46
- "pretest": "tsc -p tsconfig.test.json",
47
- "test": "node --test test-out/commands.test.js",
48
- "prepublishOnly": "npm run build"
49
- },
50
42
  "dependencies": {
43
+ "@agentmedia/schema": "^0.4.0",
51
44
  "chalk": "^5.4.1",
52
45
  "commander": "^13.1.0",
53
46
  "open": "^10.1.0",
@@ -56,5 +49,12 @@
56
49
  "devDependencies": {
57
50
  "@types/node": "^22.13.4",
58
51
  "typescript": "^5.7.3"
52
+ },
53
+ "scripts": {
54
+ "build": "tsc",
55
+ "typecheck": "tsc --noEmit",
56
+ "lint": "eslint src/",
57
+ "pretest": "tsc -p tsconfig.test.json",
58
+ "test": "node --test test-out/commands.test.js"
59
59
  }
60
- }
60
+ }