depicta 0.9.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.
Files changed (62) hide show
  1. package/bin/depicta.js +6 -0
  2. package/dist/client.d.ts +59 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +163 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/commands/auth.d.ts +13 -0
  7. package/dist/commands/auth.d.ts.map +1 -0
  8. package/dist/commands/auth.js +188 -0
  9. package/dist/commands/auth.js.map +1 -0
  10. package/dist/commands/docs.d.ts +10 -0
  11. package/dist/commands/docs.d.ts.map +1 -0
  12. package/dist/commands/docs.js +165 -0
  13. package/dist/commands/docs.js.map +1 -0
  14. package/dist/commands/generate.d.ts +17 -0
  15. package/dist/commands/generate.d.ts.map +1 -0
  16. package/dist/commands/generate.js +254 -0
  17. package/dist/commands/generate.js.map +1 -0
  18. package/dist/commands/guidelines.d.ts +9 -0
  19. package/dist/commands/guidelines.d.ts.map +1 -0
  20. package/dist/commands/guidelines.js +58 -0
  21. package/dist/commands/guidelines.js.map +1 -0
  22. package/dist/commands/jobs.d.ts +9 -0
  23. package/dist/commands/jobs.d.ts.map +1 -0
  24. package/dist/commands/jobs.js +89 -0
  25. package/dist/commands/jobs.js.map +1 -0
  26. package/dist/commands/process.d.ts +16 -0
  27. package/dist/commands/process.d.ts.map +1 -0
  28. package/dist/commands/process.js +412 -0
  29. package/dist/commands/process.js.map +1 -0
  30. package/dist/commands/story.d.ts +18 -0
  31. package/dist/commands/story.d.ts.map +1 -0
  32. package/dist/commands/story.js +182 -0
  33. package/dist/commands/story.js.map +1 -0
  34. package/dist/commands/utility.d.ts +11 -0
  35. package/dist/commands/utility.d.ts.map +1 -0
  36. package/dist/commands/utility.js +118 -0
  37. package/dist/commands/utility.js.map +1 -0
  38. package/dist/config.d.ts +50 -0
  39. package/dist/config.d.ts.map +1 -0
  40. package/dist/config.js +103 -0
  41. package/dist/config.js.map +1 -0
  42. package/dist/download.d.ts +38 -0
  43. package/dist/download.d.ts.map +1 -0
  44. package/dist/download.js +98 -0
  45. package/dist/download.js.map +1 -0
  46. package/dist/errors.d.ts +41 -0
  47. package/dist/errors.d.ts.map +1 -0
  48. package/dist/errors.js +62 -0
  49. package/dist/errors.js.map +1 -0
  50. package/dist/flags.d.ts +41 -0
  51. package/dist/flags.d.ts.map +1 -0
  52. package/dist/flags.js +40 -0
  53. package/dist/flags.js.map +1 -0
  54. package/dist/index.d.ts +9 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +80 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/output.d.ts +44 -0
  59. package/dist/output.d.ts.map +1 -0
  60. package/dist/output.js +125 -0
  61. package/dist/output.js.map +1 -0
  62. package/package.json +44 -0
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Generation commands: image, edit, graphic, diagram, combine.
3
+ *
4
+ * All commands share the runGeneration helper:
5
+ * 1. POST to generation endpoint
6
+ * 2. Read X-Depicta-Job-Id header and save for recovery
7
+ * 3. Pick format variant (formats.png/jpeg/webp or fallback image_url)
8
+ * 4. Download image bytes
9
+ * 5. Save to disk
10
+ * 6. Print result in appropriate output mode
11
+ *
12
+ * On network failure: suggest 'depicta jobs list' for recovery.
13
+ */
14
+ import { Command } from 'commander';
15
+ /** Register all generation commands on the parent program. */
16
+ export declare function registerGenerateCommands(program: Command): void;
17
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2KpC,8DAA8D;AAC9D,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuH/D"}
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Generation commands: image, edit, graphic, diagram, combine.
3
+ *
4
+ * All commands share the runGeneration helper:
5
+ * 1. POST to generation endpoint
6
+ * 2. Read X-Depicta-Job-Id header and save for recovery
7
+ * 3. Pick format variant (formats.png/jpeg/webp or fallback image_url)
8
+ * 4. Download image bytes
9
+ * 5. Save to disk
10
+ * 6. Print result in appropriate output mode
11
+ *
12
+ * On network failure: suggest 'depicta jobs list' for recovery.
13
+ */
14
+ import { Command } from 'commander';
15
+ import { DepictaClient } from '../client.js';
16
+ import { resolveApiKey, resolveApiUrl, saveLastJobId } from '../config.js';
17
+ import { saveBytes, resolveInput } from '../download.js';
18
+ import { DepictaError, EXIT_AUTH } from '../errors.js';
19
+ import { addGlobalFlags, addGenerationFlags } from '../flags.js';
20
+ import { detectMode, printGeneration, warnApiKeyFlag } from '../output.js';
21
+ /** Pick the download URL and hash for the requested format variant. */
22
+ function pickFormatUrl(resp, fmt) {
23
+ const formats = resp['formats'];
24
+ // API uses "jpeg" internally; CLI flag accepts "jpg".
25
+ const apiFmt = fmt === 'jpg' ? 'jpeg' : fmt;
26
+ if (formats) {
27
+ const variant = formats[apiFmt];
28
+ if (variant) {
29
+ return {
30
+ url: variant.url,
31
+ hash: variant.hash ?? (typeof resp['image_hash'] === 'string' ? resp['image_hash'] : ''),
32
+ };
33
+ }
34
+ }
35
+ // Fallback to top-level image_url (backwards-compatible PNG).
36
+ return {
37
+ url: typeof resp['image_url'] === 'string' ? resp['image_url'] : '',
38
+ hash: typeof resp['image_hash'] === 'string' ? resp['image_hash'] : '',
39
+ };
40
+ }
41
+ /** Build an authenticated client, warning if --api-key flag is used. */
42
+ function makeClient(opts) {
43
+ const key = resolveApiKey(opts.apiKey);
44
+ if (!key) {
45
+ throw new DepictaError("No API key configured. Run 'depicta auth login' or set DEPICTA_API_KEY.", 'authentication_error', EXIT_AUTH);
46
+ }
47
+ const mode = detectMode({ forceJson: opts.json, forceHuman: opts.human });
48
+ if (opts.apiKey) {
49
+ warnApiKeyFlag(mode, opts.quiet ?? false);
50
+ }
51
+ return new DepictaClient(key, resolveApiUrl(opts.apiUrl));
52
+ }
53
+ /**
54
+ * Try to recover a fresh download URL from a job ID.
55
+ *
56
+ * Called after a download failure to fetch a fresh signed URL from
57
+ * GET /v1/jobs/{job_id}. Returns [url, hash] on success, null on any error.
58
+ */
59
+ async function recoverFromJob(client, jobId, fmt) {
60
+ try {
61
+ const job = await client.get(`/v1/jobs/${jobId}`);
62
+ const { url, hash } = pickFormatUrl(job, fmt);
63
+ return [url, hash];
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ }
69
+ /** Shared generation flow: POST → read header → pick format → download (with retry) → save → print. */
70
+ async function runGeneration(client, endpoint, body, opts, command) {
71
+ const mode = detectMode({ forceJson: opts.json, forceHuman: opts.human });
72
+ const fmt = opts.format ?? 'png';
73
+ let resp;
74
+ let headers;
75
+ try {
76
+ const result = await client.postJson(endpoint, body);
77
+ resp = result[0];
78
+ headers = result[2];
79
+ }
80
+ catch (err) {
81
+ // On network failure, suggest job recovery via 'depicta jobs list'.
82
+ if (err instanceof Error) {
83
+ const msg = err.message.toLowerCase();
84
+ if (msg.includes('connect') ||
85
+ msg.includes('timeout') ||
86
+ msg.includes('network') ||
87
+ msg.includes('abort')) {
88
+ process.stderr.write('Generation may have completed. Check recent jobs with: depicta jobs list\n');
89
+ }
90
+ }
91
+ throw err;
92
+ }
93
+ // Save the job ID for potential recovery.
94
+ const jobId = headers['x-depicta-job-id'];
95
+ if (jobId) {
96
+ saveLastJobId(jobId);
97
+ }
98
+ const { url: initialUrl, hash: initialHash } = pickFormatUrl(resp, fmt);
99
+ let downloadUrl = initialUrl;
100
+ let imageHash = initialHash;
101
+ // Download with retry via job recovery (3 attempts).
102
+ let imageData = null;
103
+ let lastErr;
104
+ for (let attempt = 0; attempt < 3; attempt++) {
105
+ try {
106
+ imageData = await client.downloadBytes(downloadUrl);
107
+ break;
108
+ }
109
+ catch (e) {
110
+ lastErr = e;
111
+ if (attempt < 2 && jobId) {
112
+ if (!(opts.quiet ?? false)) {
113
+ process.stderr.write(`Download failed (attempt ${attempt + 1}/3), retrying via job recovery...\n`);
114
+ }
115
+ await new Promise((r) => setTimeout(r, 1000));
116
+ const recovered = await recoverFromJob(client, jobId, fmt);
117
+ if (recovered) {
118
+ [downloadUrl, imageHash] = recovered;
119
+ }
120
+ }
121
+ }
122
+ }
123
+ if (!imageData)
124
+ throw lastErr;
125
+ const ext = fmt === 'jpg' ? 'jpg' : fmt;
126
+ const filePath = saveBytes(imageData, command, ext, opts.output, opts.outputDir);
127
+ // Override hash in resp for printing.
128
+ const respForOutput = { ...resp, image_hash: imageHash };
129
+ printGeneration(filePath, respForOutput, mode, opts.quiet ?? false);
130
+ }
131
+ /** Add optional body field if value is not undefined. */
132
+ function addOptional(body, key, value) {
133
+ if (value !== undefined && value !== null && value !== '') {
134
+ body[key] = value;
135
+ }
136
+ }
137
+ /** Validate --strictness option value against allowed values. */
138
+ function validateStrictness(value) {
139
+ if (value !== undefined && value !== 'normal' && value !== 'liberal') {
140
+ process.stderr.write(`Error: invalid --strictness value '${value}'. Must be 'normal' or 'liberal'.\n`);
141
+ process.exit(1);
142
+ }
143
+ }
144
+ /** Register all generation commands on the parent program. */
145
+ export function registerGenerateCommands(program) {
146
+ // --- image ---
147
+ const imageCmd = new Command('image')
148
+ .description('Generate image from text')
149
+ .argument('<prompt>', 'Text prompt for image generation');
150
+ addGlobalFlags(imageCmd);
151
+ addGenerationFlags(imageCmd);
152
+ imageCmd.action(async (prompt, opts) => {
153
+ validateStrictness(opts.strictness);
154
+ const client = makeClient(opts);
155
+ const body = { prompt };
156
+ addOptional(body, 'model', opts.model);
157
+ addOptional(body, 'aspect_ratio', opts.size);
158
+ addOptional(body, 'image_size', opts.imageSize);
159
+ addOptional(body, 'strictness', opts.strictness);
160
+ await runGeneration(client, '/v1/generate/image', body, opts, 'image');
161
+ });
162
+ program.addCommand(imageCmd);
163
+ // --- edit ---
164
+ const editCmd = new Command('edit')
165
+ .description('Edit an existing image')
166
+ .argument('<input>', 'Input image path (or - for stdin)')
167
+ .argument('<prompt>', 'Edit instructions');
168
+ addGlobalFlags(editCmd);
169
+ addGenerationFlags(editCmd);
170
+ editCmd.action(async (input, prompt, opts) => {
171
+ validateStrictness(opts.strictness);
172
+ const client = makeClient(opts);
173
+ const resolved = resolveInput(input);
174
+ const uploadResp = await client.uploadFile('/v1/upload', resolved);
175
+ const body = {
176
+ prompt,
177
+ input_image_url: uploadResp.image_url,
178
+ };
179
+ addOptional(body, 'model', opts.model);
180
+ addOptional(body, 'aspect_ratio', opts.size);
181
+ addOptional(body, 'image_size', opts.imageSize);
182
+ addOptional(body, 'strictness', opts.strictness);
183
+ await runGeneration(client, '/v1/generate/edit', body, opts, 'edit');
184
+ });
185
+ program.addCommand(editCmd);
186
+ // --- graphic ---
187
+ const graphicCmd = new Command('graphic')
188
+ .description('Generate icon, logo, or clipart')
189
+ .argument('<prompt>', 'Description of the graphic to generate');
190
+ addGlobalFlags(graphicCmd);
191
+ addGenerationFlags(graphicCmd);
192
+ graphicCmd.action(async (prompt, opts) => {
193
+ validateStrictness(opts.strictness);
194
+ const client = makeClient(opts);
195
+ const body = { prompt };
196
+ addOptional(body, 'model', opts.model);
197
+ addOptional(body, 'aspect_ratio', opts.size);
198
+ addOptional(body, 'image_size', opts.imageSize);
199
+ addOptional(body, 'strictness', opts.strictness);
200
+ await runGeneration(client, '/v1/generate/graphic', body, opts, 'graphic');
201
+ });
202
+ program.addCommand(graphicCmd);
203
+ // --- diagram ---
204
+ const diagramCmd = new Command('diagram')
205
+ .description('Generate a diagram')
206
+ .argument('<prompt>', 'Diagram description');
207
+ addGlobalFlags(diagramCmd);
208
+ addGenerationFlags(diagramCmd);
209
+ diagramCmd.option('-t, --type <type>', 'Diagram type: flowchart, sequence, architecture, mindmap, er, class, timeline, org-chart');
210
+ diagramCmd.action(async (prompt, opts) => {
211
+ validateStrictness(opts.strictness);
212
+ const client = makeClient(opts);
213
+ const body = { prompt };
214
+ addOptional(body, 'model', opts.model);
215
+ addOptional(body, 'diagram_type', opts.type);
216
+ addOptional(body, 'aspect_ratio', opts.size);
217
+ addOptional(body, 'image_size', opts.imageSize);
218
+ addOptional(body, 'strictness', opts.strictness);
219
+ await runGeneration(client, '/v1/generate/diagram', body, opts, 'diagram');
220
+ });
221
+ program.addCommand(diagramCmd);
222
+ // --- combine ---
223
+ const combineCmd = new Command('combine')
224
+ .description('Combine 2-5 images into one composition')
225
+ .argument('<images...>', 'Image paths to combine (2-5, or - for stdin)');
226
+ addGlobalFlags(combineCmd);
227
+ addGenerationFlags(combineCmd);
228
+ combineCmd.option('-p, --prompt <text>', 'Composition instructions', 'Combine these images naturally');
229
+ combineCmd.action(async (images, opts) => {
230
+ validateStrictness(opts.strictness);
231
+ if (images.length < 2 || images.length > 5) {
232
+ process.stderr.write('Error: combine requires 2-5 images\n');
233
+ process.exit(1);
234
+ }
235
+ const client = makeClient(opts);
236
+ const urls = [];
237
+ for (const img of images) {
238
+ const resolved = resolveInput(img);
239
+ const uploadResp = await client.uploadFile('/v1/upload', resolved);
240
+ urls.push(uploadResp.image_url);
241
+ }
242
+ const body = {
243
+ input_image_urls: urls,
244
+ prompt: opts.prompt ?? 'Combine these images naturally',
245
+ };
246
+ addOptional(body, 'model', opts.model);
247
+ addOptional(body, 'aspect_ratio', opts.size);
248
+ addOptional(body, 'image_size', opts.imageSize);
249
+ addOptional(body, 'strictness', opts.strictness);
250
+ await runGeneration(client, '/v1/generate/combine', body, opts, 'combine');
251
+ });
252
+ program.addCommand(combineCmd);
253
+ }
254
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Guidelines commands: guidelines search.
3
+ *
4
+ * GET /v1/guidelines/search?q=<query>
5
+ * Returns up to 5 results ranked by FTS relevance.
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare function registerGuidelinesCommands(program: Command): void;
9
+ //# sourceMappingURL=guidelines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guidelines.d.ts","sourceRoot":"","sources":["../../src/commands/guidelines.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkCjE"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Guidelines commands: guidelines search.
3
+ *
4
+ * GET /v1/guidelines/search?q=<query>
5
+ * Returns up to 5 results ranked by FTS relevance.
6
+ */
7
+ import { Command } from 'commander';
8
+ import { DepictaClient } from '../client.js';
9
+ import { resolveApiKey, resolveApiUrl } from '../config.js';
10
+ import { DepictaError, EXIT_AUTH } from '../errors.js';
11
+ import { addGlobalFlags } from '../flags.js';
12
+ import { detectMode, warnApiKeyFlag } from '../output.js';
13
+ function makeClient(opts) {
14
+ const key = resolveApiKey(opts.apiKey);
15
+ if (!key) {
16
+ throw new DepictaError('No API key configured.', 'authentication_error', EXIT_AUTH);
17
+ }
18
+ const mode = detectMode({ forceJson: opts.json, forceHuman: opts.human });
19
+ if (opts.apiKey)
20
+ warnApiKeyFlag(mode, opts.quiet ?? false);
21
+ return new DepictaClient(key, resolveApiUrl(opts.apiUrl));
22
+ }
23
+ export function registerGuidelinesCommands(program) {
24
+ const guidelines = new Command('guidelines')
25
+ .description('Content guidelines')
26
+ .addHelpCommand(false);
27
+ const searchCmd = new Command('search')
28
+ .description('Search content guidelines by keyword')
29
+ .argument('<query>', 'Search query');
30
+ addGlobalFlags(searchCmd);
31
+ searchCmd.action(async (query, opts) => {
32
+ const mode = detectMode({ forceJson: opts.json, forceHuman: opts.human });
33
+ const client = makeClient(opts);
34
+ const data = await client.getWithQuery('/v1/guidelines/search', { q: query });
35
+ if (mode === 'json') {
36
+ process.stdout.write(JSON.stringify(data) + '\n');
37
+ }
38
+ else if (mode === 'human' && !(opts.quiet ?? false)) {
39
+ const results = data['results'] ?? [];
40
+ if (results.length === 0) {
41
+ process.stderr.write(`No guidelines found for '${query}'\n`);
42
+ }
43
+ else {
44
+ for (const r of results) {
45
+ process.stderr.write(`\n${r.title} (${r.slug})\n`);
46
+ process.stderr.write(r.content + '\n');
47
+ }
48
+ }
49
+ }
50
+ else {
51
+ // Pipe mode — JSON to stdout.
52
+ process.stdout.write(JSON.stringify(data) + '\n');
53
+ }
54
+ });
55
+ guidelines.addCommand(searchCmd);
56
+ program.addCommand(guidelines);
57
+ }
58
+ //# sourceMappingURL=guidelines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guidelines.js","sourceRoot":"","sources":["../../src/commands/guidelines.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Jobs commands: jobs list, jobs get.
3
+ *
4
+ * list: GET /v1/jobs
5
+ * get: GET /v1/jobs/{job_id}
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare function registerJobsCommands(program: Command): void;
9
+ //# sourceMappingURL=jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/commands/jobs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkCpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkD3D"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Jobs commands: jobs list, jobs get.
3
+ *
4
+ * list: GET /v1/jobs
5
+ * get: GET /v1/jobs/{job_id}
6
+ */
7
+ import { Command } from 'commander';
8
+ import { DepictaClient } from '../client.js';
9
+ import { resolveApiKey, resolveApiUrl } from '../config.js';
10
+ import { DepictaError, EXIT_AUTH } from '../errors.js';
11
+ import { addGlobalFlags } from '../flags.js';
12
+ import { detectMode, warnApiKeyFlag } from '../output.js';
13
+ function makeClient(opts) {
14
+ const key = resolveApiKey(opts.apiKey);
15
+ if (!key) {
16
+ throw new DepictaError('No API key configured.', 'authentication_error', EXIT_AUTH);
17
+ }
18
+ const mode = detectMode({ forceJson: opts.json, forceHuman: opts.human });
19
+ if (opts.apiKey)
20
+ warnApiKeyFlag(mode, opts.quiet ?? false);
21
+ return new DepictaClient(key, resolveApiUrl(opts.apiUrl));
22
+ }
23
+ /** Format a jobs list as an ASCII table for human mode. */
24
+ function printJobsTable(jobs) {
25
+ if (jobs.length === 0) {
26
+ process.stderr.write('No recent jobs.\n');
27
+ return;
28
+ }
29
+ // Simple fixed-width table output.
30
+ process.stderr.write('ID STATUS CREATED\n');
31
+ process.stderr.write('\u2500'.repeat(72) + '\n');
32
+ for (const j of jobs) {
33
+ const id = String(j['id'] ?? '').padEnd(36);
34
+ const status = String(j['status'] ?? '').padEnd(10);
35
+ const created = String(j['created_at'] ?? '');
36
+ process.stderr.write(`${id} ${status} ${created}\n`);
37
+ }
38
+ }
39
+ export function registerJobsCommands(program) {
40
+ const jobs = new Command('jobs')
41
+ .description('Generation jobs')
42
+ .addHelpCommand(false);
43
+ // --- jobs list ---
44
+ const listCmd = new Command('list').description('List recent generation jobs');
45
+ addGlobalFlags(listCmd);
46
+ listCmd.action(async (opts) => {
47
+ const mode = detectMode({ forceJson: opts.json, forceHuman: opts.human });
48
+ const client = makeClient(opts);
49
+ const jobList = await client.get('/v1/jobs');
50
+ const jobArray = Array.isArray(jobList) ? jobList : [jobList];
51
+ if (mode === 'json') {
52
+ process.stdout.write(JSON.stringify(jobArray) + '\n');
53
+ }
54
+ else if (mode === 'human' && !(opts.quiet ?? false)) {
55
+ printJobsTable(jobArray);
56
+ }
57
+ else {
58
+ process.stdout.write(JSON.stringify(jobArray) + '\n');
59
+ }
60
+ });
61
+ // --- jobs get ---
62
+ const getCmd = new Command('get')
63
+ .description('Get a specific job by ID')
64
+ .argument('<job_id>', 'Job ID');
65
+ addGlobalFlags(getCmd);
66
+ getCmd.action(async (jobId, opts) => {
67
+ const mode = detectMode({ forceJson: opts.json, forceHuman: opts.human });
68
+ const client = makeClient(opts);
69
+ const job = await client.get(`/v1/jobs/${jobId}`);
70
+ if (mode === 'json') {
71
+ process.stdout.write(JSON.stringify(job) + '\n');
72
+ }
73
+ else if (mode === 'human' && !(opts.quiet ?? false)) {
74
+ process.stderr.write(`Job: ${job['id'] ?? jobId}\n`);
75
+ process.stderr.write(`Status: ${job['status'] ?? 'unknown'}\n`);
76
+ if (job['image_url']) {
77
+ process.stderr.write(`Image: ${job['image_url']}\n`);
78
+ }
79
+ process.stderr.write(`Cost: EUR ${job['cost_eur'] ?? '\u2014'}\n`);
80
+ }
81
+ else {
82
+ process.stdout.write(JSON.stringify(job) + '\n');
83
+ }
84
+ });
85
+ jobs.addCommand(listCmd);
86
+ jobs.addCommand(getCmd);
87
+ program.addCommand(jobs);
88
+ }
89
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/commands/jobs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Processing commands (19 total), all grouped under 'process'.
3
+ *
4
+ * All commands follow the same pattern:
5
+ * 1. Resolve input (file path or stdin via "-")
6
+ * 2. Upload file to /v1/upload
7
+ * 3. POST to processing endpoint with params
8
+ * 4. Download result from resp.image_url
9
+ * 5. Save and print via printProcessing
10
+ *
11
+ * overlay is the exception: it uploads two files before POSTing.
12
+ */
13
+ import { Command } from 'commander';
14
+ /** Register the 'process' command group with all 19 subcommands. */
15
+ export declare function registerProcessCommands(program: Command): void;
16
+ //# sourceMappingURL=process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/commands/process.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyCpC,oEAAoE;AACpE,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsX9D"}