@vivipilot/cli 0.1.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 (58) hide show
  1. package/README.md +57 -0
  2. package/dist/api.d.ts +86 -0
  3. package/dist/api.d.ts.map +1 -0
  4. package/dist/api.js +77 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/args.d.ts +11 -0
  7. package/dist/args.d.ts.map +1 -0
  8. package/dist/args.js +53 -0
  9. package/dist/args.js.map +1 -0
  10. package/dist/browser.d.ts +31 -0
  11. package/dist/browser.d.ts.map +1 -0
  12. package/dist/browser.js +162 -0
  13. package/dist/browser.js.map +1 -0
  14. package/dist/cli.d.ts +12 -0
  15. package/dist/cli.d.ts.map +1 -0
  16. package/dist/cli.js +536 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/config.d.ts +15 -0
  19. package/dist/config.d.ts.map +1 -0
  20. package/dist/config.js +58 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/errors.d.ts +6 -0
  23. package/dist/errors.d.ts.map +1 -0
  24. package/dist/errors.js +12 -0
  25. package/dist/errors.js.map +1 -0
  26. package/dist/index.d.ts +7 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +7 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/manifest.d.ts +40 -0
  31. package/dist/manifest.d.ts.map +1 -0
  32. package/dist/manifest.js +90 -0
  33. package/dist/manifest.js.map +1 -0
  34. package/dist/mcp.d.ts +13 -0
  35. package/dist/mcp.d.ts.map +1 -0
  36. package/dist/mcp.js +392 -0
  37. package/dist/mcp.js.map +1 -0
  38. package/dist/render.d.ts +21 -0
  39. package/dist/render.d.ts.map +1 -0
  40. package/dist/render.js +369 -0
  41. package/dist/render.js.map +1 -0
  42. package/package.json +42 -0
  43. package/src/api.ts +163 -0
  44. package/src/args.test.ts +21 -0
  45. package/src/args.ts +64 -0
  46. package/src/browser.test.ts +103 -0
  47. package/src/browser.ts +174 -0
  48. package/src/cli.ts +656 -0
  49. package/src/config.test.ts +30 -0
  50. package/src/config.ts +71 -0
  51. package/src/errors.ts +14 -0
  52. package/src/index.ts +25 -0
  53. package/src/manifest.test.ts +105 -0
  54. package/src/manifest.ts +126 -0
  55. package/src/mcp.test.ts +48 -0
  56. package/src/mcp.ts +438 -0
  57. package/src/render.ts +424 -0
  58. package/tsconfig.json +26 -0
package/dist/cli.js ADDED
@@ -0,0 +1,536 @@
1
+ #!/usr/bin/env node
2
+ import { randomUUID } from "node:crypto";
3
+ import { createInterface } from "node:readline";
4
+ import { mkdir, writeFile } from "node:fs/promises";
5
+ import { dirname } from "node:path";
6
+ import { flagBoolean, flagNumber, flagString, parseArgv } from "./args.js";
7
+ import { defaultConfigPath, deleteConfig, readConfig, resolveApiKey, resolveApiUrl, writeConfig, } from "./config.js";
8
+ import { VivipilotApiClient } from "./api.js";
9
+ import { CliError, isCliError } from "./errors.js";
10
+ import { verifyManifestFile } from "./manifest.js";
11
+ import { renderManifest } from "./render.js";
12
+ // ---------------------------------------------------------------------------
13
+ // Spinner / progress display
14
+ // ---------------------------------------------------------------------------
15
+ const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
16
+ class ProgressDisplay {
17
+ io;
18
+ frame = 0;
19
+ timer = null;
20
+ lastMessage = "";
21
+ lastStage = "";
22
+ constructor(io) {
23
+ this.io = io;
24
+ }
25
+ start(message) {
26
+ this.lastMessage = message;
27
+ this.io.stderr.write(`\r${SPINNER_FRAMES[0]} ${message}`);
28
+ this.timer = setInterval(() => {
29
+ this.frame = (this.frame + 1) % SPINNER_FRAMES.length;
30
+ this.io.stderr.write(`\r${SPINNER_FRAMES[this.frame]} ${this.lastMessage}`);
31
+ }, 80);
32
+ }
33
+ update(stage, message) {
34
+ if (stage !== this.lastStage) {
35
+ // Complete the previous stage with a checkmark
36
+ if (this.lastStage) {
37
+ this.io.stderr.write(`\r\x1b[32m✓\x1b[0m ${this.lastMessage}\n`);
38
+ }
39
+ this.lastStage = stage;
40
+ }
41
+ this.lastMessage = message;
42
+ }
43
+ succeed(message) {
44
+ if (this.timer)
45
+ clearInterval(this.timer);
46
+ this.timer = null;
47
+ this.io.stderr.write(`\r\x1b[32m✓\x1b[0m ${message}\n`);
48
+ }
49
+ fail(message) {
50
+ if (this.timer)
51
+ clearInterval(this.timer);
52
+ this.timer = null;
53
+ this.io.stderr.write(`\r\x1b[31m✗\x1b[0m ${message}\n`);
54
+ }
55
+ stop() {
56
+ if (this.timer)
57
+ clearInterval(this.timer);
58
+ this.timer = null;
59
+ }
60
+ }
61
+ const HELP = `Vivipilot CLI (paid-only)
62
+
63
+ Usage:
64
+ vivipilot login --api-key <key> [--api-url <url>]
65
+ vivipilot logout
66
+ vivipilot whoami
67
+ vivipilot balance
68
+ vivipilot topup
69
+ vivipilot estimate --prompt "..." [--width 1280 --height 720 --fps 30 --duration 6 --engine auto]
70
+ vivipilot generate --prompt "..." --out scene.vivi.json [--idempotency-key <key>]
71
+ vivipilot chat [--out-dir ./scenes] [--width 1280 --height 720 --fps 30 --duration 6]
72
+ vivipilot verify scene.vivi.json
73
+ vivipilot render scene.vivi.json --out video.mp4
74
+ vivipilot mcp
75
+
76
+ Commands:
77
+ generate Create a motion graphics scene (shows live progress)
78
+ chat Interactive multi-turn session (like the browser editor)
79
+ render Render a signed manifest to video locally
80
+ verify Verify a manifest's signature
81
+ estimate Preview credit cost without generating
82
+ balance Check your paid credit balance
83
+ topup Get a link to buy more credits
84
+
85
+ Environment:
86
+ VIVIPILOT_API_KEY Paid API key for non-interactive use
87
+ VIVIPILOT_API_URL Defaults to https://vivipilot.com
88
+ VIVIPILOT_MANIFEST_PUBLIC_KEYS JSON map of keyId to Ed25519 public key
89
+
90
+ CLI/MCP generation is paid-only: no trial credits and no free generations.
91
+ `;
92
+ function writeJson(io, value) {
93
+ io.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
94
+ }
95
+ function requirePrompt(parsed) {
96
+ const prompt = flagString(parsed, ["prompt", "p"]) ?? parsed.positionals.join(" ");
97
+ if (!prompt.trim())
98
+ throw new CliError("Missing prompt. Pass --prompt \"...\".", 2);
99
+ return prompt.trim();
100
+ }
101
+ function estimateRequestFromArgs(parsed) {
102
+ const width = flagNumber(parsed, ["width", "w"]);
103
+ const height = flagNumber(parsed, ["height", "h"]);
104
+ const fps = flagNumber(parsed, ["fps"]);
105
+ const durationSeconds = flagNumber(parsed, ["duration", "duration-seconds"]);
106
+ const engineFlag = flagString(parsed, ["engine"]);
107
+ const enginePreference = engineFlag === "pixi" || engineFlag === "three" || engineFlag === "auto" ? engineFlag : undefined;
108
+ return {
109
+ prompt: requirePrompt(parsed),
110
+ ...(width || height || fps ? { canvas: { width, height, fps } } : {}),
111
+ ...(durationSeconds ? { durationSeconds } : {}),
112
+ ...(enginePreference ? { enginePreference } : {}),
113
+ };
114
+ }
115
+ function estimateRequestFromPrompt(prompt, defaults) {
116
+ return {
117
+ prompt,
118
+ ...(defaults.width || defaults.height || defaults.fps
119
+ ? { canvas: { width: defaults.width, height: defaults.height, fps: defaults.fps } }
120
+ : {}),
121
+ ...(defaults.durationSeconds ? { durationSeconds: defaults.durationSeconds } : {}),
122
+ };
123
+ }
124
+ async function writeOutputFile(path, value) {
125
+ await mkdir(dirname(path), { recursive: true });
126
+ await writeFile(path, `${JSON.stringify(value, null, 2)}\n`, "utf8");
127
+ }
128
+ function requireManifestPath(parsed) {
129
+ const path = parsed.positionals[0];
130
+ if (!path)
131
+ throw new CliError("Missing manifest path.", 2);
132
+ return path;
133
+ }
134
+ async function handleLogin(parsed, env, io) {
135
+ const configPath = defaultConfigPath(env);
136
+ const currentConfig = await readConfig(configPath);
137
+ const apiKey = flagString(parsed, ["api-key"]) ?? env.VIVIPILOT_API_KEY;
138
+ if (!apiKey)
139
+ throw new CliError("Missing paid API key. Pass --api-key or set VIVIPILOT_API_KEY.", 2);
140
+ const nextConfig = {
141
+ ...currentConfig,
142
+ apiKey,
143
+ apiUrl: flagString(parsed, ["api-url"]) ?? env.VIVIPILOT_API_URL ?? currentConfig.apiUrl,
144
+ };
145
+ await writeConfig(nextConfig, configPath);
146
+ writeJson(io, { ok: true, configPath, paidOnly: true });
147
+ }
148
+ async function handleLogout(env, io) {
149
+ const configPath = defaultConfigPath(env);
150
+ await deleteConfig(configPath);
151
+ writeJson(io, { ok: true, configPath });
152
+ }
153
+ function apiClient(config, env) {
154
+ return new VivipilotApiClient({ config, env });
155
+ }
156
+ async function handleTopup(config, env, io) {
157
+ const apiUrl = resolveApiUrl(config, env);
158
+ writeJson(io, {
159
+ paidOnly: true,
160
+ topupUrl: `${apiUrl}/edit?billing=topup`,
161
+ message: "CLI/MCP generation requires paid top-up credits.",
162
+ });
163
+ }
164
+ // ---------------------------------------------------------------------------
165
+ // Generate with live progress
166
+ // ---------------------------------------------------------------------------
167
+ const POLL_INTERVAL_MS = 1500;
168
+ const MAX_POLL_MS = 300_000; // 5 minute total timeout
169
+ async function generateWithProgress(client, request, idempotencyKey, outPath, io) {
170
+ const progress = new ProgressDisplay(io);
171
+ progress.start("Starting generation...");
172
+ // Start the async generation
173
+ const startResult = await client.startGenerate({ ...request, outputFormat: "manifest" }, idempotencyKey);
174
+ const { generationId } = startResult;
175
+ progress.update("start", `Generation ${generationId} started (est. ${startResult.estimatedCredits} credits, engine: ${startResult.engine})`);
176
+ // If it was an idempotent replay and already completed, try to get the data
177
+ if (startResult.idempotentReplay && startResult.status === "completed") {
178
+ const status = await client.generationProgress(generationId);
179
+ if (status.manifestData) {
180
+ await writeOutputFile(outPath, status.manifestData);
181
+ progress.succeed(`Scene saved to ${outPath} (${status.creditsCharged ?? 0} credits)`);
182
+ return { generationId, manifestPath: outPath, creditsCharged: status.creditsCharged };
183
+ }
184
+ }
185
+ // Poll for progress
186
+ const startTime = Date.now();
187
+ let lastProgressMessage = "";
188
+ while (Date.now() - startTime < MAX_POLL_MS) {
189
+ await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
190
+ let status;
191
+ try {
192
+ status = await client.generationProgress(generationId);
193
+ }
194
+ catch {
195
+ continue; // Transient network error, keep polling
196
+ }
197
+ // Show progress update
198
+ if (status.progressMessage && status.progressMessage !== lastProgressMessage) {
199
+ lastProgressMessage = status.progressMessage;
200
+ progress.update(status.workflowStatus ?? status.status, status.progressMessage);
201
+ }
202
+ // Terminal states
203
+ if (status.status === "completed") {
204
+ if (status.manifestData) {
205
+ await writeOutputFile(outPath, status.manifestData);
206
+ progress.succeed(`Scene saved to ${outPath} (${status.creditsCharged ?? 0} credits)`);
207
+ return { generationId, manifestPath: outPath, creditsCharged: status.creditsCharged };
208
+ }
209
+ progress.succeed("Generation complete.");
210
+ return { generationId, manifestPath: outPath, creditsCharged: status.creditsCharged };
211
+ }
212
+ if (status.status === "failed") {
213
+ progress.fail(status.error ?? "Generation failed.");
214
+ throw new CliError(status.error ?? "Generation failed.", 1);
215
+ }
216
+ if (status.status === "refunded") {
217
+ progress.fail("Generation refunded.");
218
+ throw new CliError("Generation was refunded.", 1);
219
+ }
220
+ }
221
+ progress.fail("Generation timed out after 5 minutes.");
222
+ throw new CliError(`Generation ${generationId} timed out. Check status with: vivipilot status ${generationId}`, 1);
223
+ }
224
+ async function handleGenerate(parsed, config, env, io) {
225
+ if (!resolveApiKey(config, env)) {
226
+ throw new CliError("Vivipilot generate is paid-only. Set VIVIPILOT_API_KEY or run `vivipilot login --api-key <key>`.", 2);
227
+ }
228
+ const out = flagString(parsed, ["out", "o"]) ?? "scene.vivi.json";
229
+ const idempotencyKey = flagString(parsed, ["idempotency-key"]) ?? `cli_${randomUUID()}`;
230
+ const request = estimateRequestFromArgs(parsed);
231
+ const result = await generateWithProgress(apiClient(config, env), request, idempotencyKey, out, io);
232
+ writeJson(io, {
233
+ ok: true,
234
+ generationId: result.generationId,
235
+ manifestPath: result.manifestPath,
236
+ creditsCharged: result.creditsCharged,
237
+ paidOnly: true,
238
+ });
239
+ }
240
+ function chatBanner(io) {
241
+ io.stderr.write("\n\x1b[1m\x1b[36m Vivipilot Chat\x1b[0m (paid-only)\n");
242
+ io.stderr.write(" Type a prompt to generate a motion graphics scene.\n");
243
+ io.stderr.write(" Commands: /render <n>, /verify <n>, /list, /balance, /help, /quit\n\n");
244
+ }
245
+ function chatHelp(io) {
246
+ io.stderr.write(`
247
+ \x1b[1mChat Commands:\x1b[0m
248
+ <prompt> Generate a new scene from your description
249
+ /render <n> Render scene #n to video (e.g. /render 1)
250
+ /verify <n> Verify scene #n manifest signature
251
+ /list List all generated scenes in this session
252
+ /balance Check your credit balance
253
+ /estimate <p> Estimate credits for a prompt
254
+ /help Show this help
255
+ /quit Exit chat
256
+
257
+ \x1b[1mTips:\x1b[0m
258
+ - Each prompt generates a new scene with live progress
259
+ - Scenes are saved as scene_1.vivi.json, scene_2.vivi.json, etc.
260
+ - Use /render to render any scene to video after generation
261
+ - All generations are paid-only and charged to your API key
262
+ \n`);
263
+ }
264
+ async function handleChat(parsed, config, env, io) {
265
+ if (!resolveApiKey(config, env)) {
266
+ throw new CliError("Vivipilot chat is paid-only. Set VIVIPILOT_API_KEY or run `vivipilot login --api-key <key>`.", 2);
267
+ }
268
+ const outDir = flagString(parsed, ["out-dir"]) ?? ".";
269
+ const width = flagNumber(parsed, ["width", "w"]);
270
+ const height = flagNumber(parsed, ["height", "h"]);
271
+ const fps = flagNumber(parsed, ["fps"]);
272
+ const durationSeconds = flagNumber(parsed, ["duration", "duration-seconds"]);
273
+ const client = apiClient(config, env);
274
+ const session = { scenes: [], turnNumber: 0 };
275
+ chatBanner(io);
276
+ // Show balance at start
277
+ try {
278
+ const bal = await client.balance();
279
+ io.stderr.write(` \x1b[33mBalance:\x1b[0m ${bal.paidBalance ?? bal.balance} credits\n\n`);
280
+ }
281
+ catch {
282
+ io.stderr.write(" \x1b[33mCould not fetch balance.\x1b[0m\n\n");
283
+ }
284
+ const rl = createInterface({
285
+ input: process.stdin,
286
+ output: process.stderr,
287
+ prompt: "\x1b[36mvivipilot>\x1b[0m ",
288
+ });
289
+ rl.prompt();
290
+ for await (const line of rl) {
291
+ const trimmed = line.trim();
292
+ if (!trimmed) {
293
+ rl.prompt();
294
+ continue;
295
+ }
296
+ // Handle slash commands
297
+ if (trimmed.startsWith("/")) {
298
+ const [cmd, ...rest] = trimmed.split(/\s+/);
299
+ const arg = rest.join(" ");
300
+ switch (cmd) {
301
+ case "/quit":
302
+ case "/exit":
303
+ case "/q":
304
+ io.stderr.write("\nGoodbye!\n");
305
+ rl.close();
306
+ return;
307
+ case "/help":
308
+ case "/h":
309
+ chatHelp(io);
310
+ break;
311
+ case "/list":
312
+ case "/ls": {
313
+ if (session.scenes.length === 0) {
314
+ io.stderr.write(" No scenes generated yet.\n");
315
+ }
316
+ else {
317
+ io.stderr.write("\n \x1b[1mGenerated Scenes:\x1b[0m\n");
318
+ for (let i = 0; i < session.scenes.length; i++) {
319
+ const s = session.scenes[i];
320
+ io.stderr.write(` ${i + 1}. ${s.manifestPath} (${s.creditsCharged ?? "?"} credits)\n`);
321
+ io.stderr.write(` \x1b[2m${s.prompt.slice(0, 80)}${s.prompt.length > 80 ? "..." : ""}\x1b[0m\n`);
322
+ }
323
+ io.stderr.write("\n");
324
+ }
325
+ break;
326
+ }
327
+ case "/balance":
328
+ case "/bal": {
329
+ try {
330
+ const bal = await client.balance();
331
+ io.stderr.write(` \x1b[33mBalance:\x1b[0m ${bal.paidBalance ?? bal.balance} credits\n`);
332
+ }
333
+ catch (e) {
334
+ io.stderr.write(` \x1b[31mError:\x1b[0m ${e instanceof Error ? e.message : String(e)}\n`);
335
+ }
336
+ break;
337
+ }
338
+ case "/estimate":
339
+ case "/est": {
340
+ if (!arg) {
341
+ io.stderr.write(" Usage: /estimate <prompt>\n");
342
+ break;
343
+ }
344
+ try {
345
+ const est = await client.estimate(estimateRequestFromPrompt(arg, { width, height, fps, durationSeconds }));
346
+ io.stderr.write(` \x1b[33mEstimate:\x1b[0m ${est.estimatedCredits} credits (engine: ${est.engine})\n`);
347
+ }
348
+ catch (e) {
349
+ io.stderr.write(` \x1b[31mError:\x1b[0m ${e instanceof Error ? e.message : String(e)}\n`);
350
+ }
351
+ break;
352
+ }
353
+ case "/render": {
354
+ const idx = parseInt(arg, 10) - 1;
355
+ if (isNaN(idx) || idx < 0 || idx >= session.scenes.length) {
356
+ io.stderr.write(` Usage: /render <scene number 1-${session.scenes.length}>\n`);
357
+ break;
358
+ }
359
+ const scene = session.scenes[idx];
360
+ const videoOut = scene.manifestPath.replace(/\.vivi\.json$/, ".mp4");
361
+ io.stderr.write(` Rendering ${scene.manifestPath} -> ${videoOut}...\n`);
362
+ try {
363
+ const result = await renderManifest({ manifestPath: scene.manifestPath, outPath: videoOut }, config, env);
364
+ io.stderr.write(` \x1b[32m✓\x1b[0m Rendered to ${result.outPath} (${result.size} bytes)\n`);
365
+ }
366
+ catch (e) {
367
+ io.stderr.write(` \x1b[31m✗\x1b[0m Render failed: ${e instanceof Error ? e.message : String(e)}\n`);
368
+ }
369
+ break;
370
+ }
371
+ case "/verify": {
372
+ const vidx = parseInt(arg, 10) - 1;
373
+ if (isNaN(vidx) || vidx < 0 || vidx >= session.scenes.length) {
374
+ io.stderr.write(` Usage: /verify <scene number 1-${session.scenes.length}>\n`);
375
+ break;
376
+ }
377
+ const sc = session.scenes[vidx];
378
+ try {
379
+ const vResult = await verifyManifestFile(sc.manifestPath, config, env);
380
+ if (vResult.ok) {
381
+ io.stderr.write(` \x1b[32m✓\x1b[0m Manifest verified: ${vResult.manifest.manifestId}\n`);
382
+ }
383
+ else {
384
+ io.stderr.write(` \x1b[31m✗\x1b[0m Verification failed: ${vResult.message}\n`);
385
+ }
386
+ }
387
+ catch (e) {
388
+ io.stderr.write(` \x1b[31m✗\x1b[0m ${e instanceof Error ? e.message : String(e)}\n`);
389
+ }
390
+ break;
391
+ }
392
+ default:
393
+ io.stderr.write(` Unknown command: ${cmd}. Type /help for available commands.\n`);
394
+ }
395
+ rl.prompt();
396
+ continue;
397
+ }
398
+ // It's a prompt — generate a scene
399
+ session.turnNumber++;
400
+ const sceneNum = session.turnNumber;
401
+ const outPath = `${outDir}/scene_${sceneNum}.vivi.json`.replace(/^\.\//, "");
402
+ const idempotencyKey = `chat_${randomUUID()}`;
403
+ io.stderr.write("\n");
404
+ try {
405
+ const result = await generateWithProgress(client, estimateRequestFromPrompt(trimmed, { width, height, fps, durationSeconds }), idempotencyKey, outPath, io);
406
+ session.scenes.push({
407
+ generationId: result.generationId,
408
+ manifestPath: result.manifestPath,
409
+ prompt: trimmed,
410
+ creditsCharged: result.creditsCharged,
411
+ });
412
+ io.stderr.write(` \x1b[2mScene #${sceneNum} saved. Use /render ${sceneNum} to render, or type another prompt.\x1b[0m\n\n`);
413
+ }
414
+ catch (e) {
415
+ io.stderr.write(` \x1b[31mGeneration failed:\x1b[0m ${e instanceof Error ? e.message : String(e)}\n\n`);
416
+ }
417
+ rl.prompt();
418
+ }
419
+ // Stream ended (stdin closed)
420
+ if (session.scenes.length > 0) {
421
+ io.stderr.write(`\n Session complete. ${session.scenes.length} scene(s) generated.\n`);
422
+ }
423
+ }
424
+ // ---------------------------------------------------------------------------
425
+ // Other command handlers (unchanged)
426
+ // ---------------------------------------------------------------------------
427
+ async function handleVerify(parsed, config, env, io) {
428
+ const manifestPath = requireManifestPath(parsed);
429
+ const result = await verifyManifestFile(manifestPath, config, env);
430
+ if (!result.ok)
431
+ throw new CliError(`Manifest verification failed: ${result.message}`, 1);
432
+ writeJson(io, {
433
+ ok: true,
434
+ manifestId: result.manifest.manifestId,
435
+ generationId: result.manifest.generationId,
436
+ canonicalPayloadHash: result.canonicalPayloadHash,
437
+ });
438
+ }
439
+ async function handleRender(parsed, config, env, io) {
440
+ const manifestPath = requireManifestPath(parsed);
441
+ const out = flagString(parsed, ["out", "o"]) ?? "video.mp4";
442
+ const format = flagString(parsed, ["format"]);
443
+ const scale = flagNumber(parsed, ["scale"]);
444
+ const fpsFlag = flagNumber(parsed, ["fps"]);
445
+ const transparent = flagBoolean(parsed, ["transparent"]);
446
+ const verifyOnly = flagBoolean(parsed, ["verify-only"]);
447
+ const result = await renderManifest({
448
+ manifestPath,
449
+ outPath: out,
450
+ ...(format ? { format } : {}),
451
+ ...(scale ? { scale } : {}),
452
+ ...(fpsFlag ? { fps: fpsFlag } : {}),
453
+ ...(transparent ? { transparent } : {}),
454
+ verifyOnly,
455
+ }, config, env);
456
+ writeJson(io, {
457
+ ok: true,
458
+ manifestId: result.manifestId,
459
+ out: result.outPath,
460
+ size: result.size,
461
+ paidOnly: true,
462
+ });
463
+ }
464
+ async function handleMcp(config, env, io) {
465
+ const { startMcpServer } = await import("./mcp.js");
466
+ await startMcpServer({
467
+ config,
468
+ env,
469
+ stdin: process.stdin,
470
+ stdout: io.stdout,
471
+ stderr: io.stderr,
472
+ });
473
+ }
474
+ export async function runCli(argv = process.argv.slice(2), env = process.env, io = { stdout: process.stdout, stderr: process.stderr }) {
475
+ const parsed = parseArgv(argv);
476
+ if (!parsed.command || parsed.command === "help" || flagBoolean(parsed, ["help"])) {
477
+ io.stdout.write(HELP);
478
+ return;
479
+ }
480
+ const configPath = defaultConfigPath(env);
481
+ const config = await readConfig(configPath);
482
+ switch (parsed.command) {
483
+ case "login":
484
+ await handleLogin(parsed, env, io);
485
+ return;
486
+ case "logout":
487
+ await handleLogout(env, io);
488
+ return;
489
+ case "whoami":
490
+ writeJson(io, await apiClient(config, env).whoami());
491
+ return;
492
+ case "balance":
493
+ writeJson(io, await apiClient(config, env).balance());
494
+ return;
495
+ case "topup":
496
+ await handleTopup(config, env, io);
497
+ return;
498
+ case "estimate":
499
+ writeJson(io, await apiClient(config, env).estimate(estimateRequestFromArgs(parsed)));
500
+ return;
501
+ case "generate":
502
+ await handleGenerate(parsed, config, env, io);
503
+ return;
504
+ case "chat":
505
+ await handleChat(parsed, config, env, io);
506
+ return;
507
+ case "status": {
508
+ const generationId = parsed.positionals[0];
509
+ if (!generationId)
510
+ throw new CliError("Missing generation id.", 2);
511
+ writeJson(io, await apiClient(config, env).generationStatus(generationId));
512
+ return;
513
+ }
514
+ case "verify":
515
+ await handleVerify(parsed, config, env, io);
516
+ return;
517
+ case "render":
518
+ await handleRender(parsed, config, env, io);
519
+ return;
520
+ case "mcp":
521
+ await handleMcp(config, env, io);
522
+ return;
523
+ default:
524
+ throw new CliError(`Unknown command: ${parsed.command}\n\n${HELP}`, 2);
525
+ }
526
+ }
527
+ runCli().catch((error) => {
528
+ if (isCliError(error)) {
529
+ process.stderr.write(`${error.message}\n`);
530
+ process.exitCode = error.exitCode;
531
+ return;
532
+ }
533
+ process.stderr.write(`${error instanceof Error ? error.stack ?? error.message : String(error)}\n`);
534
+ process.exitCode = 1;
535
+ });
536
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare const DEFAULT_API_URL = "https://vivipilot.com";
2
+ export type CliConfig = {
3
+ apiUrl?: string;
4
+ apiKey?: string;
5
+ publicKeys?: Record<string, string>;
6
+ };
7
+ export type Env = Record<string, string | undefined>;
8
+ export declare function defaultConfigPath(env?: Env): string;
9
+ export declare function readConfig(path?: string): Promise<CliConfig>;
10
+ export declare function writeConfig(config: CliConfig, path?: string): Promise<void>;
11
+ export declare function deleteConfig(path?: string): Promise<void>;
12
+ export declare function resolveApiUrl(config: CliConfig, env?: Env): string;
13
+ export declare function resolveApiKey(config: CliConfig, env?: Env): string | undefined;
14
+ export declare function resolvePublicKeys(config: CliConfig, env?: Env): Record<string, string>;
15
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,eAAe,0BAA0B,CAAC;AAEvD,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAQrD,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,GAAiB,GAAG,MAAM,CAEhE;AASD,wBAAsB,UAAU,CAAC,IAAI,SAAsB,GAAG,OAAO,CAAC,SAAS,CAAC,CAS/E;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,SAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9F;AAED,wBAAsB,YAAY,CAAC,IAAI,SAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,GAAE,GAAiB,GAAG,MAAM,CAE/E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,GAAE,GAAiB,GAAG,MAAM,GAAG,SAAS,CAG3F;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,GAAE,GAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASnG"}
package/dist/config.js ADDED
@@ -0,0 +1,58 @@
1
+ import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ export const DEFAULT_API_URL = "https://vivipilot.com";
5
+ function configRoot(env) {
6
+ if (env.XDG_CONFIG_HOME)
7
+ return env.XDG_CONFIG_HOME;
8
+ if (env.APPDATA)
9
+ return env.APPDATA;
10
+ return join(homedir(), ".config");
11
+ }
12
+ export function defaultConfigPath(env = process.env) {
13
+ return env.VIVIPILOT_CONFIG ?? join(configRoot(env), "vivipilot", "config.json");
14
+ }
15
+ function isNotFound(error) {
16
+ return typeof error === "object"
17
+ && error !== null
18
+ && "code" in error
19
+ && error.code === "ENOENT";
20
+ }
21
+ export async function readConfig(path = defaultConfigPath()) {
22
+ try {
23
+ const raw = await readFile(path, "utf8");
24
+ const parsed = JSON.parse(raw);
25
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
26
+ }
27
+ catch (error) {
28
+ if (isNotFound(error))
29
+ return {};
30
+ throw error;
31
+ }
32
+ }
33
+ export async function writeConfig(config, path = defaultConfigPath()) {
34
+ await mkdir(dirname(path), { recursive: true });
35
+ await writeFile(path, `${JSON.stringify(config, null, 2)}\n`, { mode: 0o600 });
36
+ }
37
+ export async function deleteConfig(path = defaultConfigPath()) {
38
+ await rm(path, { force: true });
39
+ }
40
+ export function resolveApiUrl(config, env = process.env) {
41
+ return (env.VIVIPILOT_API_URL ?? config.apiUrl ?? DEFAULT_API_URL).replace(/\/+$/, "");
42
+ }
43
+ export function resolveApiKey(config, env = process.env) {
44
+ const key = env.VIVIPILOT_API_KEY ?? config.apiKey;
45
+ return key && key.trim().length > 0 ? key.trim() : undefined;
46
+ }
47
+ export function resolvePublicKeys(config, env = process.env) {
48
+ if (env.VIVIPILOT_MANIFEST_PUBLIC_KEYS) {
49
+ const parsed = JSON.parse(env.VIVIPILOT_MANIFEST_PUBLIC_KEYS);
50
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed))
51
+ return parsed;
52
+ }
53
+ if (env.VIVIPILOT_MANIFEST_PUBLIC_KEY_ID && env.VIVIPILOT_MANIFEST_PUBLIC_KEY) {
54
+ return { [env.VIVIPILOT_MANIFEST_PUBLIC_KEY_ID]: env.VIVIPILOT_MANIFEST_PUBLIC_KEY };
55
+ }
56
+ return config.publicKeys ?? {};
57
+ }
58
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}