@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.
- package/README.md +57 -0
- package/dist/api.d.ts +86 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +77 -0
- package/dist/api.js.map +1 -0
- package/dist/args.d.ts +11 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +53 -0
- package/dist/args.js.map +1 -0
- package/dist/browser.d.ts +31 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +162 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +536 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +58 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +6 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +12 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +40 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +90 -0
- package/dist/manifest.js.map +1 -0
- package/dist/mcp.d.ts +13 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +392 -0
- package/dist/mcp.js.map +1 -0
- package/dist/render.d.ts +21 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +369 -0
- package/dist/render.js.map +1 -0
- package/package.json +42 -0
- package/src/api.ts +163 -0
- package/src/args.test.ts +21 -0
- package/src/args.ts +64 -0
- package/src/browser.test.ts +103 -0
- package/src/browser.ts +174 -0
- package/src/cli.ts +656 -0
- package/src/config.test.ts +30 -0
- package/src/config.ts +71 -0
- package/src/errors.ts +14 -0
- package/src/index.ts +25 -0
- package/src/manifest.test.ts +105 -0
- package/src/manifest.ts +126 -0
- package/src/mcp.test.ts +48 -0
- package/src/mcp.ts +438 -0
- package/src/render.ts +424 -0
- 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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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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"}
|