blitzreels 0.0.0 → 0.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/README.md CHANGED
@@ -1,3 +1,77 @@
1
- # BlitzReels CLI
1
+ # blitzreels
2
2
 
3
- Placeholder package reserved for the public BlitzReels command-line interface.
3
+ Command-line video editing control surface for BlitzReels.
4
+
5
+ Official website: https://blitzreels.com/
6
+
7
+ This CLI is designed for AI agents to edit videos inside BlitzReels.
8
+
9
+ This is the primary CLI package. The scoped package `@blitzreels/cli` wraps this
10
+ package for users who prefer scoped installs.
11
+
12
+ ## Install
13
+
14
+ After the first real publish:
15
+
16
+ ```bash
17
+ npx blitzreels auth login
18
+ ```
19
+
20
+ Local repo development:
21
+
22
+ ```bash
23
+ pnpm --filter blitzreels dev auth login --base-url http://localhost:3000/api/v1
24
+ ```
25
+
26
+ ## Auth
27
+
28
+ ```bash
29
+ blitzreels auth login
30
+ blitzreels auth set-key --api-key br_live_...
31
+ blitzreels auth whoami
32
+ ```
33
+
34
+ `auth login` opens BlitzReels in your browser, asks you to approve a one-time
35
+ CLI code, then stores the generated API key in macOS Keychain when available or
36
+ `~/.blitzreels/config.json` as a fallback. Use `--no-browser` on remote shells
37
+ and open the printed URL manually.
38
+
39
+ API keys are environment-bounded:
40
+
41
+ - production uses `br_live_...`
42
+ - local/development uses `br_test_...`
43
+
44
+ ## Commands
45
+
46
+ ```bash
47
+ blitzreels project inspect --project-id PROJECT_ID --json
48
+ blitzreels project timeline --project-id PROJECT_ID --json
49
+ blitzreels project snapshot --project-id PROJECT_ID --at 00:03
50
+ blitzreels project snapshots --project-id PROJECT_ID --at 00:01,00:03
51
+
52
+ blitzreels text add --project-id PROJECT_ID --text "Hook" --at 0 --duration 4
53
+ blitzreels text list --project-id PROJECT_ID --json
54
+ blitzreels text update --project-id PROJECT_ID --content-item-id CONTENT_ITEM_ID --text "New hook"
55
+ blitzreels text remove --project-id PROJECT_ID --content-item-id CONTENT_ITEM_ID
56
+
57
+ blitzreels audio add --project-id PROJECT_ID --asset-id ASSET_ID --at 0 --volume 0.6
58
+
59
+ blitzreels silence plan --project-id PROJECT_ID --timeline-item-id TIMELINE_ITEM_ID --json
60
+ blitzreels silence apply --project-id PROJECT_ID --timeline-item-id TIMELINE_ITEM_ID --confirm-preview
61
+
62
+ blitzreels mistakes plan --project-id PROJECT_ID --timeline-item-id TIMELINE_ITEM_ID --json
63
+ blitzreels mistakes apply --project-id PROJECT_ID --timeline-item-id TIMELINE_ITEM_ID --confirm-preview
64
+
65
+ blitzreels captions themes list --json
66
+ blitzreels captions theme set --project-id PROJECT_ID --theme-id THEME_ID
67
+ blitzreels captions theme set-default --theme-id THEME_ID
68
+
69
+ blitzreels exports start --project-id PROJECT_ID
70
+ blitzreels exports wait --export-id EXPORT_ID
71
+ blitzreels exports download --export-id EXPORT_ID --output ./short.mp4
72
+
73
+ blitzreels api docs
74
+ blitzreels api spec
75
+ ```
76
+
77
+ Use `--json` for script and AI-agent workflows.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,995 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "node:child_process";
3
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
4
+ import { homedir } from "node:os";
5
+ import { dirname, join, resolve } from "node:path";
6
+ import { BlitzReelsClient, BlitzReelsError, } from "@blitzreels/sdk";
7
+ const CONFIG_PATH = join(homedir(), ".blitzreels", "config.json");
8
+ const KEYCHAIN_SERVICE = "BlitzReels CLI";
9
+ const KEYCHAIN_ACCOUNT = "api-key";
10
+ const DEFAULT_WAIT_INTERVAL_MS = 3000;
11
+ const DEFAULT_WAIT_TIMEOUT_MS = 20 * 60 * 1000;
12
+ async function main() {
13
+ const parsed = parseArgs({ argv: process.argv.slice(2) });
14
+ if (parsed.command.length === 0 ||
15
+ getBooleanFlag({ flags: parsed.flags, name: "help" })) {
16
+ printHelp();
17
+ return;
18
+ }
19
+ const config = await loadConfig();
20
+ const apiKey = getStringFlag({ flags: parsed.flags, name: "api-key" }) ??
21
+ process.env.BLITZREELS_API_KEY ??
22
+ config.apiKey;
23
+ const baseUrl = getStringFlag({ flags: parsed.flags, name: "base-url" }) ??
24
+ process.env.BLITZREELS_BASE_URL ??
25
+ config.baseUrl;
26
+ const clientConfig = {
27
+ apiKey,
28
+ baseUrl,
29
+ fetchFn: undefined,
30
+ userAgent: "blitzreels-cli/0.0.0",
31
+ };
32
+ const context = {
33
+ args: parsed,
34
+ json: getBooleanFlag({ flags: parsed.flags, name: "json" }),
35
+ client: new BlitzReelsClient(clientConfig),
36
+ config: { apiKey, baseUrl, keyStorage: config.keyStorage },
37
+ };
38
+ await runCommand({ context });
39
+ }
40
+ async function runCommand({ context }) {
41
+ const [group, action, subaction] = context.args.command;
42
+ if (group === "auth" && action === "set-key") {
43
+ await setApiKey({ context });
44
+ return;
45
+ }
46
+ if (group === "auth" && action === "login") {
47
+ await loginWithBrowser({ context });
48
+ return;
49
+ }
50
+ if (group === "auth" && action === "whoami") {
51
+ const result = await context.client.auth.validate();
52
+ printResult({
53
+ json: context.json,
54
+ value: result,
55
+ human: [
56
+ `Workspace: ${result.organization_id}`,
57
+ `User: ${result.user_id}`,
58
+ `Plan: ${result.plan}`,
59
+ `Environment: ${result.environment}`,
60
+ `Docs: ${result.docs_url}`,
61
+ ],
62
+ });
63
+ return;
64
+ }
65
+ if (group === "api" && action === "spec") {
66
+ const url = new URL(context.config.baseUrl ?? "https://www.blitzreels.com/api/v1");
67
+ url.pathname = "/api/openapi.json";
68
+ printResult({
69
+ json: context.json,
70
+ value: { url: url.toString() },
71
+ human: [url.toString()],
72
+ });
73
+ return;
74
+ }
75
+ if (group === "api" && action === "docs") {
76
+ const url = new URL(context.config.baseUrl ?? "https://www.blitzreels.com/api/v1");
77
+ url.pathname = "/api/docs.md";
78
+ printResult({
79
+ json: context.json,
80
+ value: { url: url.toString() },
81
+ human: [url.toString()],
82
+ });
83
+ return;
84
+ }
85
+ requireApiKey({ apiKey: context.config.apiKey });
86
+ if (group === "project" && action === "inspect") {
87
+ const projectId = requireStringFlag({
88
+ flags: context.args.flags,
89
+ name: "project-id",
90
+ });
91
+ const mode = getStringFlag({ flags: context.args.flags, name: "mode" }) ?? "full";
92
+ const result = await context.client.projects.inspect({
93
+ projectId,
94
+ mode: parseContextMode({ value: mode }),
95
+ });
96
+ printResult({
97
+ json: context.json,
98
+ value: result,
99
+ human: [
100
+ `Project context loaded (${result.mode}).`,
101
+ JSON.stringify(result.data, null, 2),
102
+ ],
103
+ });
104
+ return;
105
+ }
106
+ if (group === "project" && action === "timeline") {
107
+ const projectId = requireStringFlag({
108
+ flags: context.args.flags,
109
+ name: "project-id",
110
+ });
111
+ const result = await context.client.projects.timeline({ projectId });
112
+ printResult({
113
+ json: context.json,
114
+ value: result,
115
+ human: [JSON.stringify(result.data, null, 2)],
116
+ });
117
+ return;
118
+ }
119
+ if (group === "project" && action === "snapshot") {
120
+ const result = await context.client.projects.renderSnapshot({
121
+ projectId: requireStringFlag({
122
+ flags: context.args.flags,
123
+ name: "project-id",
124
+ }),
125
+ atSeconds: parseTimecode({
126
+ value: requireStringFlag({ flags: context.args.flags, name: "at" }),
127
+ }),
128
+ targetWidth: getNumberFlag({
129
+ flags: context.args.flags,
130
+ name: "target-width",
131
+ }),
132
+ imageFormat: parseImageFormat({
133
+ value: getStringFlag({
134
+ flags: context.args.flags,
135
+ name: "image-format",
136
+ }),
137
+ }),
138
+ });
139
+ printResult({
140
+ json: context.json,
141
+ value: result,
142
+ human: [`Snapshot: ${result.preview_url}`],
143
+ });
144
+ return;
145
+ }
146
+ if (group === "project" && action === "snapshots") {
147
+ const at = requireStringFlag({ flags: context.args.flags, name: "at" });
148
+ const result = await context.client.projects.renderSnapshots({
149
+ projectId: requireStringFlag({
150
+ flags: context.args.flags,
151
+ name: "project-id",
152
+ }),
153
+ atSeconds: at.split(",").map((value) => parseTimecode({ value })),
154
+ targetWidth: getNumberFlag({
155
+ flags: context.args.flags,
156
+ name: "target-width",
157
+ }),
158
+ imageFormat: parseImageFormat({
159
+ value: getStringFlag({
160
+ flags: context.args.flags,
161
+ name: "image-format",
162
+ }),
163
+ }),
164
+ });
165
+ printResult({
166
+ json: context.json,
167
+ value: result,
168
+ human: result.previews.map((preview) => `${preview.time_seconds}s ${preview.preview_url}`),
169
+ });
170
+ return;
171
+ }
172
+ if (group === "text" && action === "add") {
173
+ const result = await context.client.text.add({
174
+ projectId: requireStringFlag({
175
+ flags: context.args.flags,
176
+ name: "project-id",
177
+ }),
178
+ text: requireStringFlag({ flags: context.args.flags, name: "text" }),
179
+ name: getStringFlag({ flags: context.args.flags, name: "name" }),
180
+ startSeconds: parseTimecode({
181
+ value: getStringFlag({ flags: context.args.flags, name: "at" }) ?? "0",
182
+ }),
183
+ durationSeconds: getNumberFlag({ flags: context.args.flags, name: "duration" }) ?? 4,
184
+ layerIndex: getNumberFlag({
185
+ flags: context.args.flags,
186
+ name: "layer-index",
187
+ }),
188
+ });
189
+ printResult({
190
+ json: context.json,
191
+ value: result,
192
+ human: [`Text added: ${result.content_item_id}`],
193
+ });
194
+ return;
195
+ }
196
+ if (group === "text" && action === "list") {
197
+ const result = await context.client.text.list({
198
+ projectId: requireStringFlag({
199
+ flags: context.args.flags,
200
+ name: "project-id",
201
+ }),
202
+ });
203
+ printResult({
204
+ json: context.json,
205
+ value: result,
206
+ human: result.data.map((item) => `${item.content_item_id} ${item.kind} ${item.name} ${item.start_seconds ?? "-"}s`),
207
+ });
208
+ return;
209
+ }
210
+ if (group === "text" && action === "remove") {
211
+ const result = await context.client.text.remove({
212
+ projectId: requireStringFlag({
213
+ flags: context.args.flags,
214
+ name: "project-id",
215
+ }),
216
+ contentItemId: requireStringFlag({
217
+ flags: context.args.flags,
218
+ name: "content-item-id",
219
+ }),
220
+ });
221
+ printResult({
222
+ json: context.json,
223
+ value: result,
224
+ human: ["Text removed."],
225
+ });
226
+ return;
227
+ }
228
+ if (group === "text" && action === "update") {
229
+ const result = await context.client.text.update({
230
+ projectId: requireStringFlag({
231
+ flags: context.args.flags,
232
+ name: "project-id",
233
+ }),
234
+ contentItemId: requireStringFlag({
235
+ flags: context.args.flags,
236
+ name: "content-item-id",
237
+ }),
238
+ text: getStringFlag({ flags: context.args.flags, name: "text" }),
239
+ name: getStringFlag({ flags: context.args.flags, name: "name" }),
240
+ spec: parseJsonObjectFlag({
241
+ flags: context.args.flags,
242
+ name: "spec-json",
243
+ }),
244
+ });
245
+ printResult({
246
+ json: context.json,
247
+ value: result,
248
+ human: ["Text updated."],
249
+ });
250
+ return;
251
+ }
252
+ if (group === "audio" && action === "add") {
253
+ const result = await context.client.audio.add({
254
+ projectId: requireStringFlag({
255
+ flags: context.args.flags,
256
+ name: "project-id",
257
+ }),
258
+ assetId: requireStringFlag({
259
+ flags: context.args.flags,
260
+ name: "asset-id",
261
+ }),
262
+ startSeconds: parseTimecode({
263
+ value: getStringFlag({ flags: context.args.flags, name: "at" }) ?? "0",
264
+ }),
265
+ durationSeconds: getNumberFlag({
266
+ flags: context.args.flags,
267
+ name: "duration",
268
+ }),
269
+ volume: getNumberFlag({ flags: context.args.flags, name: "volume" }),
270
+ fadeInSeconds: getNumberFlag({
271
+ flags: context.args.flags,
272
+ name: "fade-in",
273
+ }),
274
+ fadeOutSeconds: getNumberFlag({
275
+ flags: context.args.flags,
276
+ name: "fade-out",
277
+ }),
278
+ loop: getOptionalBooleanFlag({ flags: context.args.flags, name: "loop" }),
279
+ });
280
+ printResult({
281
+ json: context.json,
282
+ value: result,
283
+ human: [
284
+ `Inserted ${result.summary.inserted}/${result.summary.total} audio item(s).`,
285
+ ],
286
+ });
287
+ return;
288
+ }
289
+ if (group === "silence" && action === "plan") {
290
+ const result = await context.client.silence.plan({
291
+ projectId: requireStringFlag({
292
+ flags: context.args.flags,
293
+ name: "project-id",
294
+ }),
295
+ timelineItemId: requireStringFlag({
296
+ flags: context.args.flags,
297
+ name: "timeline-item-id",
298
+ }),
299
+ paddingMs: getNumberFlag({
300
+ flags: context.args.flags,
301
+ name: "padding-ms",
302
+ }),
303
+ silenceThresholdDb: getNumberFlag({
304
+ flags: context.args.flags,
305
+ name: "silence-threshold-db",
306
+ }),
307
+ minSilenceDurationSeconds: getNumberFlag({
308
+ flags: context.args.flags,
309
+ name: "min-silence-duration",
310
+ }),
311
+ removeBlipsMaxDurationSeconds: getNumberFlag({
312
+ flags: context.args.flags,
313
+ name: "remove-blips-max-duration",
314
+ }),
315
+ useCaptionValidation: getOptionalBooleanFlag({
316
+ flags: context.args.flags,
317
+ name: "use-caption-validation",
318
+ }),
319
+ });
320
+ printResult({
321
+ json: context.json,
322
+ value: result,
323
+ human: [JSON.stringify(result, null, 2)],
324
+ });
325
+ return;
326
+ }
327
+ if (group === "silence" && action === "apply") {
328
+ const result = await context.client.silence.apply({
329
+ projectId: requireStringFlag({
330
+ flags: context.args.flags,
331
+ name: "project-id",
332
+ }),
333
+ timelineItemId: requireStringFlag({
334
+ flags: context.args.flags,
335
+ name: "timeline-item-id",
336
+ }),
337
+ paddingMs: getNumberFlag({
338
+ flags: context.args.flags,
339
+ name: "padding-ms",
340
+ }),
341
+ silenceThresholdDb: getNumberFlag({
342
+ flags: context.args.flags,
343
+ name: "silence-threshold-db",
344
+ }),
345
+ minSilenceDurationSeconds: getNumberFlag({
346
+ flags: context.args.flags,
347
+ name: "min-silence-duration",
348
+ }),
349
+ removeBlipsMaxDurationSeconds: getNumberFlag({
350
+ flags: context.args.flags,
351
+ name: "remove-blips-max-duration",
352
+ }),
353
+ useCaptionValidation: getOptionalBooleanFlag({
354
+ flags: context.args.flags,
355
+ name: "use-caption-validation",
356
+ }),
357
+ deleteSilentClips: getOptionalBooleanFlag({
358
+ flags: context.args.flags,
359
+ name: "delete-silent-clips",
360
+ }),
361
+ manualSegmentOverrides: parseStringRecordFlag({
362
+ flags: context.args.flags,
363
+ name: "manual-segment-overrides-json",
364
+ }),
365
+ previewConfirmed: requireConfirmPreview({ flags: context.args.flags }),
366
+ });
367
+ printResult({
368
+ json: context.json,
369
+ value: result,
370
+ human: [JSON.stringify(result, null, 2)],
371
+ });
372
+ return;
373
+ }
374
+ if (group === "mistakes" && action === "plan") {
375
+ const result = await context.client.mistakes.plan({
376
+ projectId: requireStringFlag({
377
+ flags: context.args.flags,
378
+ name: "project-id",
379
+ }),
380
+ timelineItemId: requireStringFlag({
381
+ flags: context.args.flags,
382
+ name: "timeline-item-id",
383
+ }),
384
+ });
385
+ printResult({
386
+ json: context.json,
387
+ value: result,
388
+ human: [JSON.stringify(result, null, 2)],
389
+ });
390
+ return;
391
+ }
392
+ if (group === "mistakes" && action === "apply") {
393
+ const result = await context.client.mistakes.apply({
394
+ projectId: requireStringFlag({
395
+ flags: context.args.flags,
396
+ name: "project-id",
397
+ }),
398
+ timelineItemId: requireStringFlag({
399
+ flags: context.args.flags,
400
+ name: "timeline-item-id",
401
+ }),
402
+ plan: parseJsonObjectFlag({
403
+ flags: context.args.flags,
404
+ name: "plan-json",
405
+ }),
406
+ manualVerdicts: parseStringRecordFlag({
407
+ flags: context.args.flags,
408
+ name: "manual-verdicts-json",
409
+ }),
410
+ deleteMistakes: getOptionalBooleanFlag({
411
+ flags: context.args.flags,
412
+ name: "delete-mistakes",
413
+ }),
414
+ previewConfirmed: requireConfirmPreview({ flags: context.args.flags }),
415
+ });
416
+ printResult({
417
+ json: context.json,
418
+ value: result,
419
+ human: [JSON.stringify(result, null, 2)],
420
+ });
421
+ return;
422
+ }
423
+ if (group === "captions" && action === "themes" && subaction === "list") {
424
+ const result = await context.client.captions.listThemes();
425
+ printResult({
426
+ json: context.json,
427
+ value: result,
428
+ human: result.themes.map((theme) => JSON.stringify(theme)),
429
+ });
430
+ return;
431
+ }
432
+ if (group === "captions" && action === "theme" && subaction === "set") {
433
+ const result = await context.client.captions.setProjectTheme({
434
+ projectId: requireStringFlag({
435
+ flags: context.args.flags,
436
+ name: "project-id",
437
+ }),
438
+ themeId: requireStringFlag({
439
+ flags: context.args.flags,
440
+ name: "theme-id",
441
+ }),
442
+ });
443
+ printResult({
444
+ json: context.json,
445
+ value: result,
446
+ human: ["Project caption theme updated."],
447
+ });
448
+ return;
449
+ }
450
+ if (group === "captions" &&
451
+ action === "theme" &&
452
+ subaction === "set-default") {
453
+ const result = await context.client.captions.setDefaultTheme({
454
+ themeId: requireStringFlag({
455
+ flags: context.args.flags,
456
+ name: "theme-id",
457
+ }),
458
+ });
459
+ printResult({
460
+ json: context.json,
461
+ value: result,
462
+ human: ["Default caption theme updated."],
463
+ });
464
+ return;
465
+ }
466
+ if (group === "exports" && action === "start") {
467
+ const result = await context.client.exports.start({
468
+ projectId: requireStringFlag({
469
+ flags: context.args.flags,
470
+ name: "project-id",
471
+ }),
472
+ resolution: getStringFlag({
473
+ flags: context.args.flags,
474
+ name: "resolution",
475
+ }),
476
+ format: getStringFlag({ flags: context.args.flags, name: "format" }),
477
+ includeCaptions: getOptionalBooleanFlag({
478
+ flags: context.args.flags,
479
+ name: "include-captions",
480
+ }),
481
+ });
482
+ printResult({
483
+ json: context.json,
484
+ value: result,
485
+ human: [`Export queued: ${result.export_id ?? result.job_id}`],
486
+ });
487
+ return;
488
+ }
489
+ if (group === "exports" && action === "wait") {
490
+ const result = await context.client.exports.wait({
491
+ exportId: requireStringFlag({
492
+ flags: context.args.flags,
493
+ name: "export-id",
494
+ }),
495
+ intervalMs: getNumberFlag({ flags: context.args.flags, name: "interval-ms" }) ??
496
+ DEFAULT_WAIT_INTERVAL_MS,
497
+ timeoutMs: getNumberFlag({ flags: context.args.flags, name: "timeout-ms" }) ??
498
+ DEFAULT_WAIT_TIMEOUT_MS,
499
+ });
500
+ printResult({
501
+ json: context.json,
502
+ value: result,
503
+ human: [
504
+ `Export ready: ${result.download_url ?? result.short_download_url ?? result.export_id}`,
505
+ ],
506
+ });
507
+ return;
508
+ }
509
+ if (group === "exports" && action === "download") {
510
+ const output = requireStringFlag({
511
+ flags: context.args.flags,
512
+ name: "output",
513
+ });
514
+ const bytes = await context.client.exports.download({
515
+ exportId: requireStringFlag({
516
+ flags: context.args.flags,
517
+ name: "export-id",
518
+ }),
519
+ });
520
+ await writeFile(resolve(output), Buffer.from(bytes));
521
+ printResult({
522
+ json: context.json,
523
+ value: { output },
524
+ human: [`Downloaded export: ${output}`],
525
+ });
526
+ return;
527
+ }
528
+ throw new Error(`Unknown command: ${context.args.command.join(" ")}`);
529
+ }
530
+ async function setApiKey({ context }) {
531
+ const apiKey = getStringFlag({ flags: context.args.flags, name: "api-key" }) ??
532
+ process.env.BLITZREELS_API_KEY;
533
+ if (!apiKey) {
534
+ throw new Error("Pass --api-key or set BLITZREELS_API_KEY.");
535
+ }
536
+ const savedToKeychain = await saveApiKey({ apiKey });
537
+ const config = {
538
+ apiKey: savedToKeychain ? "" : apiKey,
539
+ baseUrl: getStringFlag({ flags: context.args.flags, name: "base-url" }),
540
+ keyStorage: savedToKeychain ? "keychain" : "config",
541
+ };
542
+ await mkdir(dirname(CONFIG_PATH), { recursive: true });
543
+ await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2), {
544
+ mode: 0o600,
545
+ });
546
+ printResult({
547
+ json: context.json,
548
+ value: { configPath: CONFIG_PATH },
549
+ human: [`API key saved to ${CONFIG_PATH}`],
550
+ });
551
+ }
552
+ async function loginWithBrowser({ context, }) {
553
+ const appUrl = resolveAppUrl({ baseUrl: context.config.baseUrl });
554
+ const deviceUrl = `${appUrl}/api/cli/auth/device`;
555
+ const startResponse = await fetch(deviceUrl, {
556
+ method: "POST",
557
+ headers: { Accept: "application/json" },
558
+ });
559
+ const login = parseDeviceLoginResponse({
560
+ value: await readJsonResponse({
561
+ response: startResponse,
562
+ url: deviceUrl,
563
+ action: "start CLI login",
564
+ }),
565
+ });
566
+ const shouldOpenBrowser = !getBooleanFlag({
567
+ flags: context.args.flags,
568
+ name: "no-browser",
569
+ });
570
+ if (shouldOpenBrowser) {
571
+ openBrowser({ url: login.verification_uri_complete });
572
+ }
573
+ const loginInstructions = [
574
+ `First copy your one-time code: ${login.user_code}`,
575
+ `Then open: ${login.verification_uri_complete}`,
576
+ "Waiting for browser approval...",
577
+ ];
578
+ if (context.json) {
579
+ console.error(loginInstructions.join("\n"));
580
+ }
581
+ else {
582
+ printResult({
583
+ json: context.json,
584
+ value: {
585
+ user_code: login.user_code,
586
+ verification_uri: login.verification_uri_complete,
587
+ expires_in: login.expires_in,
588
+ },
589
+ human: loginInstructions,
590
+ });
591
+ }
592
+ const startedAt = Date.now();
593
+ const timeoutMs = Math.min(login.expires_in * 1000, getNumberFlag({ flags: context.args.flags, name: "timeout-ms" }) ??
594
+ login.expires_in * 1000);
595
+ const intervalMs = Math.max(1000, login.interval * 1000);
596
+ while (Date.now() - startedAt <= timeoutMs) {
597
+ await sleep({ ms: intervalMs });
598
+ const tokenUrl = `${appUrl}/api/cli/auth/token`;
599
+ const pollResponse = await fetch(tokenUrl, {
600
+ method: "POST",
601
+ headers: {
602
+ Accept: "application/json",
603
+ "Content-Type": "application/json",
604
+ },
605
+ body: JSON.stringify({ device_code: login.device_code }),
606
+ });
607
+ const result = parseDeviceTokenResponse({
608
+ value: await readJsonResponse({
609
+ response: pollResponse,
610
+ url: tokenUrl,
611
+ action: "poll CLI login",
612
+ }),
613
+ });
614
+ if (result.status === "approved" && result.api_key) {
615
+ await persistLoggedInApiKey({
616
+ apiKey: result.api_key,
617
+ baseUrl: context.config.baseUrl,
618
+ });
619
+ printResult({
620
+ json: context.json,
621
+ value: { success: true, key_prefix: result.key_prefix ?? "" },
622
+ human: [`Logged in. API key prefix: ${result.key_prefix ?? "saved"}`],
623
+ });
624
+ return;
625
+ }
626
+ if (result.status === "expired" ||
627
+ result.status === "denied" ||
628
+ result.status === "invalid" ||
629
+ result.status === "consumed") {
630
+ throw new Error(`Login failed: ${result.status}.`);
631
+ }
632
+ }
633
+ throw new Error("Timed out waiting for browser approval.");
634
+ }
635
+ async function readJsonResponse({ response, url, action, }) {
636
+ const contentType = response.headers.get("content-type") ?? "";
637
+ const text = await response.text();
638
+ const parsed = tryParseJson({ text });
639
+ if (parsed !== undefined) {
640
+ if (!response.ok) {
641
+ throw new Error(`${action} failed with ${response.status}: ${extractJsonErrorMessage({ value: parsed })}`);
642
+ }
643
+ return parsed;
644
+ }
645
+ const hint = contentType.includes("text/html")
646
+ ? "The server returned HTML instead of JSON. For production, deploy the BlitzReels web app with the CLI auth routes first. For local testing, pass --base-url http://localhost:3000/api/v1."
647
+ : "The server returned a non-JSON response.";
648
+ throw new Error(`${action} failed: ${url} returned ${response.status} ${contentType || "unknown content type"}. ${hint}`);
649
+ }
650
+ function tryParseJson({ text }) {
651
+ if (text.trim().length === 0) {
652
+ return null;
653
+ }
654
+ try {
655
+ return JSON.parse(text);
656
+ }
657
+ catch {
658
+ return undefined;
659
+ }
660
+ }
661
+ function extractJsonErrorMessage({ value }) {
662
+ if (value && typeof value === "object") {
663
+ const record = value;
664
+ if (typeof record.error_description === "string") {
665
+ return record.error_description;
666
+ }
667
+ if (typeof record.error === "string") {
668
+ return record.error;
669
+ }
670
+ if (typeof record.message === "string") {
671
+ return record.message;
672
+ }
673
+ }
674
+ return JSON.stringify(value);
675
+ }
676
+ function parseDeviceLoginResponse({ value, }) {
677
+ if (!value || typeof value !== "object") {
678
+ throw new Error("CLI login endpoint returned an invalid response.");
679
+ }
680
+ const record = value;
681
+ if (typeof record.device_code !== "string" ||
682
+ typeof record.user_code !== "string" ||
683
+ typeof record.verification_uri_complete !== "string" ||
684
+ typeof record.expires_in !== "number" ||
685
+ typeof record.interval !== "number") {
686
+ throw new Error("CLI login endpoint returned an incomplete response.");
687
+ }
688
+ return {
689
+ device_code: record.device_code,
690
+ user_code: record.user_code,
691
+ verification_uri_complete: record.verification_uri_complete,
692
+ expires_in: record.expires_in,
693
+ interval: record.interval,
694
+ };
695
+ }
696
+ function parseDeviceTokenResponse({ value, }) {
697
+ if (!value || typeof value !== "object") {
698
+ throw new Error("CLI login polling endpoint returned an invalid response.");
699
+ }
700
+ const record = value;
701
+ if (typeof record.status !== "string") {
702
+ throw new Error("CLI login polling endpoint returned no status.");
703
+ }
704
+ return {
705
+ status: record.status,
706
+ api_key: typeof record.api_key === "string" ? record.api_key : undefined,
707
+ key_prefix: typeof record.key_prefix === "string" ? record.key_prefix : undefined,
708
+ };
709
+ }
710
+ async function loadConfig() {
711
+ try {
712
+ const raw = await readFile(CONFIG_PATH, "utf8");
713
+ const value = JSON.parse(raw);
714
+ const keyStorage = value.keyStorage === "keychain" ? "keychain" : "config";
715
+ const keychainApiKey = keyStorage === "keychain" ? await readKeychainApiKey() : "";
716
+ return {
717
+ apiKey: keychainApiKey ||
718
+ (typeof value.apiKey === "string" ? value.apiKey : ""),
719
+ baseUrl: typeof value.baseUrl === "string" ? value.baseUrl : undefined,
720
+ keyStorage,
721
+ };
722
+ }
723
+ catch {
724
+ return { apiKey: "", baseUrl: undefined, keyStorage: undefined };
725
+ }
726
+ }
727
+ function parseArgs({ argv }) {
728
+ const command = [];
729
+ const flags = {};
730
+ for (let index = 0; index < argv.length; index++) {
731
+ const value = argv[index];
732
+ if (value === undefined) {
733
+ continue;
734
+ }
735
+ if (!value.startsWith("--")) {
736
+ command.push(value);
737
+ continue;
738
+ }
739
+ const [rawKey, inlineValue] = value.slice(2).split("=", 2);
740
+ const key = rawKey ?? "";
741
+ if (inlineValue !== undefined) {
742
+ flags[key] = inlineValue;
743
+ continue;
744
+ }
745
+ const next = argv[index + 1];
746
+ if (next !== undefined && !next.startsWith("--")) {
747
+ flags[key] = next;
748
+ index++;
749
+ continue;
750
+ }
751
+ flags[key] = true;
752
+ }
753
+ return { command, flags };
754
+ }
755
+ function getStringFlag({ flags, name, }) {
756
+ const value = flags[name];
757
+ return typeof value === "string" ? value : undefined;
758
+ }
759
+ function requireStringFlag({ flags, name, }) {
760
+ const value = getStringFlag({ flags, name });
761
+ if (!value) {
762
+ throw new Error(`Missing required --${name}.`);
763
+ }
764
+ return value;
765
+ }
766
+ function getBooleanFlag({ flags, name, }) {
767
+ return flags[name] === true || flags[name] === "true";
768
+ }
769
+ function getOptionalBooleanFlag({ flags, name, }) {
770
+ if (!(name in flags)) {
771
+ return undefined;
772
+ }
773
+ return getBooleanFlag({ flags, name });
774
+ }
775
+ function getNumberFlag({ flags, name, }) {
776
+ const value = getStringFlag({ flags, name });
777
+ if (value === undefined) {
778
+ return undefined;
779
+ }
780
+ const parsed = Number(value);
781
+ if (!Number.isFinite(parsed)) {
782
+ throw new Error(`--${name} must be a number.`);
783
+ }
784
+ return parsed;
785
+ }
786
+ function parseJsonObjectFlag({ flags, name, }) {
787
+ const value = getStringFlag({ flags, name });
788
+ if (value === undefined) {
789
+ return undefined;
790
+ }
791
+ const parsed = JSON.parse(value);
792
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
793
+ throw new Error(`--${name} must be a JSON object.`);
794
+ }
795
+ return parsed;
796
+ }
797
+ function parseStringRecordFlag({ flags, name, }) {
798
+ const value = parseJsonObjectFlag({ flags, name });
799
+ if (value === undefined) {
800
+ return undefined;
801
+ }
802
+ for (const [key, item] of Object.entries(value)) {
803
+ if (typeof item !== "string") {
804
+ throw new Error(`--${name}.${key} must be a string.`);
805
+ }
806
+ }
807
+ return value;
808
+ }
809
+ function requireConfirmPreview({ flags }) {
810
+ if (!getBooleanFlag({ flags, name: "confirm-preview" })) {
811
+ throw new Error("Destructive edits require --confirm-preview after reviewing a plan.");
812
+ }
813
+ return true;
814
+ }
815
+ function parseTimecode({ value }) {
816
+ const trimmed = value.trim();
817
+ if (/^\d+(\.\d+)?$/.test(trimmed)) {
818
+ return Number(trimmed);
819
+ }
820
+ const parts = trimmed.split(":").map((part) => Number(part));
821
+ if (parts.some((part) => !Number.isFinite(part))) {
822
+ throw new Error(`Invalid time value: ${value}`);
823
+ }
824
+ if (parts.length === 2) {
825
+ return (parts[0] ?? 0) * 60 + (parts[1] ?? 0);
826
+ }
827
+ if (parts.length === 3) {
828
+ return (parts[0] ?? 0) * 3600 + (parts[1] ?? 0) * 60 + (parts[2] ?? 0);
829
+ }
830
+ throw new Error(`Invalid time value: ${value}`);
831
+ }
832
+ function resolveAppUrl({ baseUrl }) {
833
+ const url = new URL(baseUrl ?? "https://www.blitzreels.com/api/v1");
834
+ return `${url.protocol}//${url.host}`;
835
+ }
836
+ function openBrowser({ url }) {
837
+ const command = process.platform === "darwin"
838
+ ? "open"
839
+ : process.platform === "win32"
840
+ ? "cmd"
841
+ : "xdg-open";
842
+ const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
843
+ const child = spawn(command, args, {
844
+ detached: true,
845
+ stdio: "ignore",
846
+ });
847
+ child.unref();
848
+ }
849
+ function canUseKeychain() {
850
+ return (process.platform === "darwin" &&
851
+ process.env.BLITZREELS_DISABLE_KEYCHAIN !== "1");
852
+ }
853
+ function runSecurity({ args, }) {
854
+ return new Promise((resolveCommand) => {
855
+ const child = spawn("security", args, {
856
+ stdio: ["ignore", "pipe", "ignore"],
857
+ });
858
+ const chunks = [];
859
+ child.stdout.on("data", (chunk) => chunks.push(Buffer.from(chunk)));
860
+ child.on("error", () => resolveCommand({ stdout: "", ok: false }));
861
+ child.on("close", (code) => resolveCommand({
862
+ stdout: Buffer.concat(chunks).toString("utf8").trim(),
863
+ ok: code === 0,
864
+ }));
865
+ });
866
+ }
867
+ function sleep({ ms }) {
868
+ return new Promise((resolveSleep) => {
869
+ setTimeout(resolveSleep, ms);
870
+ });
871
+ }
872
+ async function saveApiKey({ apiKey }) {
873
+ if (!canUseKeychain()) {
874
+ return false;
875
+ }
876
+ const result = await runSecurity({
877
+ args: [
878
+ "add-generic-password",
879
+ "-a",
880
+ KEYCHAIN_ACCOUNT,
881
+ "-s",
882
+ KEYCHAIN_SERVICE,
883
+ "-w",
884
+ apiKey,
885
+ "-U",
886
+ ],
887
+ });
888
+ return result.ok;
889
+ }
890
+ async function readKeychainApiKey() {
891
+ if (!canUseKeychain()) {
892
+ return "";
893
+ }
894
+ const result = await runSecurity({
895
+ args: [
896
+ "find-generic-password",
897
+ "-a",
898
+ KEYCHAIN_ACCOUNT,
899
+ "-s",
900
+ KEYCHAIN_SERVICE,
901
+ "-w",
902
+ ],
903
+ });
904
+ return result.ok ? result.stdout : "";
905
+ }
906
+ async function persistLoggedInApiKey({ apiKey, baseUrl, }) {
907
+ const savedToKeychain = await saveApiKey({ apiKey });
908
+ const config = {
909
+ apiKey: savedToKeychain ? "" : apiKey,
910
+ baseUrl,
911
+ keyStorage: savedToKeychain ? "keychain" : "config",
912
+ };
913
+ await mkdir(dirname(CONFIG_PATH), { recursive: true });
914
+ await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2), {
915
+ mode: 0o600,
916
+ });
917
+ }
918
+ function parseImageFormat({ value, }) {
919
+ if (value === undefined) {
920
+ return undefined;
921
+ }
922
+ if (value === "jpeg" || value === "png") {
923
+ return value;
924
+ }
925
+ throw new Error("--image-format must be jpeg or png.");
926
+ }
927
+ function parseContextMode({ value, }) {
928
+ if (value === "summary" ||
929
+ value === "assets" ||
930
+ value === "timeline" ||
931
+ value === "transcript" ||
932
+ value === "full") {
933
+ return value;
934
+ }
935
+ throw new Error("--mode must be summary, assets, timeline, transcript, or full.");
936
+ }
937
+ function requireApiKey({ apiKey }) {
938
+ if (!apiKey) {
939
+ throw new Error("Missing API key. Run `blitzreels auth login`, `blitzreels auth set-key --api-key ...`, or set BLITZREELS_API_KEY.");
940
+ }
941
+ }
942
+ function printResult({ json, value, human, }) {
943
+ if (json) {
944
+ console.log(JSON.stringify(value, null, 2));
945
+ return;
946
+ }
947
+ console.log(human.join("\n"));
948
+ }
949
+ function printHelp() {
950
+ console.log(`blitzreels
951
+
952
+ Usage:
953
+ blitzreels auth login [--no-browser]
954
+ blitzreels auth set-key --api-key KEY [--base-url URL]
955
+ blitzreels auth whoami [--json]
956
+ blitzreels project inspect --project-id ID [--mode full] [--json]
957
+ blitzreels project timeline --project-id ID [--json]
958
+ blitzreels project snapshot --project-id ID --at 00:03 [--json]
959
+ blitzreels project snapshots --project-id ID --at 00:01,00:03 [--json]
960
+ blitzreels text add --project-id ID --text "Hook" [--at 0] [--duration 4]
961
+ blitzreels text list --project-id ID [--json]
962
+ blitzreels text update --project-id ID --content-item-id ID [--text "New hook"]
963
+ blitzreels text remove --project-id ID --content-item-id ID
964
+ blitzreels audio add --project-id ID --asset-id ID [--at 0] [--volume 0.6]
965
+ blitzreels silence plan --project-id ID --timeline-item-id ID [--json]
966
+ blitzreels silence apply --project-id ID --timeline-item-id ID --confirm-preview
967
+ blitzreels mistakes plan --project-id ID --timeline-item-id ID [--json]
968
+ blitzreels mistakes apply --project-id ID --timeline-item-id ID --confirm-preview
969
+ blitzreels captions themes list [--json]
970
+ blitzreels captions theme set --project-id ID --theme-id ID
971
+ blitzreels captions theme set-default --theme-id ID
972
+ blitzreels exports start --project-id ID [--resolution 1080p] [--format mp4]
973
+ blitzreels exports wait --export-id ID [--json]
974
+ blitzreels exports download --export-id ID --output ./short.mp4
975
+ blitzreels api docs
976
+ blitzreels api spec
977
+
978
+ Global flags:
979
+ --api-key KEY
980
+ --base-url URL
981
+ --json
982
+ `);
983
+ }
984
+ main().catch((error) => {
985
+ if (error instanceof BlitzReelsError) {
986
+ const requestId = error.requestId ? ` request_id=${error.requestId}` : "";
987
+ console.error(`BlitzReels API error ${error.status}:${requestId} ${error.message}`);
988
+ process.exitCode = 1;
989
+ return;
990
+ }
991
+ const message = error instanceof Error ? error.message : String(error);
992
+ console.error(message);
993
+ process.exitCode = 1;
994
+ });
995
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,13 +1,47 @@
1
1
  {
2
2
  "name": "blitzreels",
3
- "version": "0.0.0",
4
- "description": "Command-line interface for BlitzReels.",
3
+ "version": "0.1.1",
4
+ "description": "CLI for AI agents to edit videos inside BlitzReels.",
5
+ "homepage": "https://blitzreels.com/",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/blitzreels/blitzreels.git",
9
+ "directory": "packages/cli"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/blitzreels/blitzreels/issues"
13
+ },
14
+ "type": "module",
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
5
17
  "bin": {
6
- "blitzreels": "bin/blitzreels.js"
18
+ "blitzreels": "./dist/index.js"
19
+ },
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js"
24
+ }
7
25
  },
8
26
  "files": [
9
- "bin",
27
+ "dist",
10
28
  "README.md"
11
29
  ],
12
- "license": "UNLICENSED"
13
- }
30
+ "dependencies": {
31
+ "@blitzreels/sdk": "^0.1.1"
32
+ },
33
+ "devDependencies": {
34
+ "tsx": "^4.21.0"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "engines": {
40
+ "node": ">=20"
41
+ },
42
+ "scripts": {
43
+ "build": "tsc -p tsconfig.json && node scripts/make-bin-executable.mjs",
44
+ "typecheck": "tsc -p tsconfig.json --noEmit",
45
+ "dev": "tsx src/index.ts"
46
+ }
47
+ }
package/bin/blitzreels.js DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- console.log("BlitzReels CLI is coming soon.");