@usenaive-sdk/cli 0.2.0 → 0.2.2
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 +25 -0
- package/dist/client.d.ts +10 -0
- package/dist/client.js +25 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/billing.d.ts +2 -0
- package/dist/commands/billing.js +204 -0
- package/dist/commands/billing.js.map +1 -0
- package/dist/commands/companies.d.ts +2 -0
- package/dist/commands/companies.js +88 -0
- package/dist/commands/companies.js.map +1 -0
- package/dist/commands/domains.d.ts +2 -0
- package/dist/commands/domains.js +252 -0
- package/dist/commands/domains.js.map +1 -0
- package/dist/commands/email.d.ts +2 -0
- package/dist/commands/email.js +289 -0
- package/dist/commands/email.js.map +1 -0
- package/dist/commands/identity.d.ts +2 -0
- package/dist/commands/identity.js +109 -0
- package/dist/commands/identity.js.map +1 -0
- package/dist/commands/images.d.ts +2 -0
- package/dist/commands/images.js +291 -0
- package/dist/commands/images.js.map +1 -0
- package/dist/commands/jobs.d.ts +2 -0
- package/dist/commands/jobs.js +143 -0
- package/dist/commands/jobs.js.map +1 -0
- package/dist/commands/keys.d.ts +2 -0
- package/dist/commands/keys.js +133 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/link.d.ts +3 -0
- package/dist/commands/link.js +91 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.js +63 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/register.d.ts +2 -0
- package/dist/commands/register.js +68 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/search.d.ts +2 -0
- package/dist/commands/search.js +209 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/social.d.ts +2 -0
- package/dist/commands/social.js +402 -0
- package/dist/commands/social.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.js +47 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/usage.d.ts +2 -0
- package/dist/commands/usage.js +62 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/commands/video.d.ts +2 -0
- package/dist/commands/video.js +243 -0
- package/dist/commands/video.js.map +1 -0
- package/dist/commands/whoami.d.ts +2 -0
- package/dist/commands/whoami.js +37 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/config.d.ts +10 -0
- package/dist/config.js +40 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +83 -0
- package/dist/index.js.map +1 -0
- package/dist/output.d.ts +37 -0
- package/dist/output.js +84 -0
- package/dist/output.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { apiRequest, handleApiError } from "../client.js";
|
|
3
|
+
import { agentOutput } from "../output.js";
|
|
4
|
+
export const videoCmd = new Command("video")
|
|
5
|
+
.description("Generate AI videos using fal.ai models")
|
|
6
|
+
.addHelpText("after", `
|
|
7
|
+
Subcommands:
|
|
8
|
+
naive video generate <prompt> Generate a video from text or image
|
|
9
|
+
naive video status <job_id> Check video generation status
|
|
10
|
+
naive video models List available video models
|
|
11
|
+
|
|
12
|
+
Examples:
|
|
13
|
+
$ naive video generate "a rocket launching into space" --model fal-ai/kling-video/v3/pro/text-to-video
|
|
14
|
+
$ naive video generate --model fal-ai/kling-video/v3/pro/text-to-video --input '{"prompt":"ocean waves","duration":"5"}'
|
|
15
|
+
$ naive video generate --model fal-ai/kling-video/v3/pro/image-to-video --image-url https://example.com/photo.jpg
|
|
16
|
+
$ naive video status job-uuid-123
|
|
17
|
+
$ naive video models
|
|
18
|
+
|
|
19
|
+
Cost:
|
|
20
|
+
- Video generation: dynamic, model/duration-dependent (use GET /v1/video/pricing to preview)
|
|
21
|
+
- Pricing based on fal.ai model costs, converted to credits ($0.50/credit)
|
|
22
|
+
- Credits deducted only on successful completion
|
|
23
|
+
- Typical generation time: 30-120 seconds
|
|
24
|
+
`);
|
|
25
|
+
videoCmd
|
|
26
|
+
.command("generate [prompt]")
|
|
27
|
+
.description("Generate a video using fal.ai (async — returns job ID)")
|
|
28
|
+
.requiredOption("--model <model>", "fal.ai video model ID (required)")
|
|
29
|
+
.option("--input <json>", "Full fal.ai input parameters as JSON (overrides other options)")
|
|
30
|
+
.option("--duration <seconds>", "Video duration in seconds (model-dependent, e.g., 5 or 10)")
|
|
31
|
+
.option("--image-url <url>", "Source image URL for image-to-video models")
|
|
32
|
+
.option("--wait", "Wait for job to complete (polls until done)")
|
|
33
|
+
.addHelpText("after", `
|
|
34
|
+
Examples:
|
|
35
|
+
$ naive video generate "a timelapse of a flower blooming" --model fal-ai/kling-video/v3/pro/text-to-video
|
|
36
|
+
$ naive video generate "product showcase" --model fal-ai/kling-video/v3/pro/text-to-video --duration 10 --wait
|
|
37
|
+
$ naive video generate --model fal-ai/kling-video/v3/pro/image-to-video --image-url https://example.com/img.jpg --input '{"prompt":"zoom in slowly"}'
|
|
38
|
+
|
|
39
|
+
What this does:
|
|
40
|
+
1. Submits a video generation request to fal.ai
|
|
41
|
+
2. Returns a job ID (async processing, typically 30-120s)
|
|
42
|
+
3. Use --wait to block until done, or check with 'naive video status'
|
|
43
|
+
|
|
44
|
+
Text-to-video:
|
|
45
|
+
Provide a prompt describing the video. Models: kling-video text-to-video, minimax-video
|
|
46
|
+
|
|
47
|
+
Image-to-video:
|
|
48
|
+
Provide --image-url to animate a still image. Models: kling-video image-to-video
|
|
49
|
+
|
|
50
|
+
Available models (use 'naive video models' for full list):
|
|
51
|
+
fal-ai/kling-video/v3/pro/text-to-video Text-to-video, pro quality (~60s)
|
|
52
|
+
fal-ai/kling-video/v3/pro/image-to-video Image-to-video, pro quality (~60s)
|
|
53
|
+
fal-ai/kling-video/v3/standard/text-to-video Text-to-video, standard (~45s)
|
|
54
|
+
fal-ai/minimax-video/video-01-live Text-to-video, fast (~45s)
|
|
55
|
+
fal-ai/wan/v2.7/text-to-video Text-to-video (~60s)
|
|
56
|
+
(Use 'naive video models' for the full dynamic list from fal.ai)
|
|
57
|
+
|
|
58
|
+
Parameters (via --input JSON — passed directly to fal.ai):
|
|
59
|
+
prompt Text description of the video
|
|
60
|
+
duration Duration in seconds: "5" or "10" (model-dependent)
|
|
61
|
+
image_url Source image for image-to-video
|
|
62
|
+
aspect_ratio "16:9", "9:16", "1:1" (model-dependent)
|
|
63
|
+
negative_prompt Text describing what to avoid
|
|
64
|
+
cfg_scale Guidance scale 0-1 (higher = more literal, default 0.5)
|
|
65
|
+
generate_audio Enable native audio generation (boolean, default true for Kling v3)
|
|
66
|
+
|
|
67
|
+
Cost: dynamic — based on fal.ai model pricing ($0.50/credit)
|
|
68
|
+
Use 'GET /v1/video/pricing?model=<id>&duration=<s>' to preview cost.
|
|
69
|
+
Credits deducted only on successful completion. Failed jobs are free.
|
|
70
|
+
`)
|
|
71
|
+
.action(async (prompt, opts) => {
|
|
72
|
+
let input;
|
|
73
|
+
if (opts.input) {
|
|
74
|
+
input = JSON.parse(opts.input);
|
|
75
|
+
}
|
|
76
|
+
else if (prompt) {
|
|
77
|
+
input = { prompt };
|
|
78
|
+
if (opts.duration)
|
|
79
|
+
input.duration = opts.duration;
|
|
80
|
+
if (opts.imageUrl)
|
|
81
|
+
input.image_url = opts.imageUrl;
|
|
82
|
+
}
|
|
83
|
+
else if (opts.imageUrl) {
|
|
84
|
+
input = { image_url: opts.imageUrl };
|
|
85
|
+
if (opts.duration)
|
|
86
|
+
input.duration = opts.duration;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
console.error(JSON.stringify({
|
|
90
|
+
success: false,
|
|
91
|
+
action: "video.generate",
|
|
92
|
+
error: { code: "missing_argument", message: "Provide a prompt, --image-url, or --input JSON" },
|
|
93
|
+
recovery_steps: [
|
|
94
|
+
{ command: 'naive video generate "your prompt" --model <model>', description: "Text-to-video generation" },
|
|
95
|
+
{ command: "naive video generate --model <model> --image-url <url>", description: "Image-to-video generation" },
|
|
96
|
+
{ command: "naive video models", description: "List available video models" },
|
|
97
|
+
],
|
|
98
|
+
}, null, 2));
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
const resp = await apiRequest("POST", "/v1/video/generate", {
|
|
102
|
+
model: opts.model,
|
|
103
|
+
input,
|
|
104
|
+
});
|
|
105
|
+
handleApiError("video.generate", resp);
|
|
106
|
+
if (resp.status === 202) {
|
|
107
|
+
const data = resp.data;
|
|
108
|
+
if (opts.wait) {
|
|
109
|
+
agentOutput({
|
|
110
|
+
action: "video.generate.submitted",
|
|
111
|
+
result: { job_id: data.job_id, status: "polling", model: opts.model },
|
|
112
|
+
next_steps: [],
|
|
113
|
+
hints: ["Waiting for video generation to complete (typically 30-120s)..."],
|
|
114
|
+
});
|
|
115
|
+
await pollJob(data.job_id);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
agentOutput({
|
|
119
|
+
action: "video.generate.submitted",
|
|
120
|
+
result: { job_id: data.job_id, status: "queued", model: opts.model },
|
|
121
|
+
next_steps: [
|
|
122
|
+
{ command: `naive video status ${data.job_id}`, description: "Check generation progress" },
|
|
123
|
+
{ command: `naive jobs get ${data.job_id}`, description: "Get full job details" },
|
|
124
|
+
],
|
|
125
|
+
hints: [
|
|
126
|
+
`Video generation submitted (model: ${opts.model})`,
|
|
127
|
+
"Credits deducted only on successful completion",
|
|
128
|
+
"Typical time: 30-120 seconds depending on model and duration",
|
|
129
|
+
],
|
|
130
|
+
related_commands: ["naive video status", "naive jobs get", "naive jobs"],
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
agentOutput({
|
|
136
|
+
action: "video.generate",
|
|
137
|
+
result: resp.data,
|
|
138
|
+
next_steps: [
|
|
139
|
+
{ command: 'naive video generate "another prompt" --model <model>', description: "Generate another video" },
|
|
140
|
+
],
|
|
141
|
+
hints: ["Video generated synchronously"],
|
|
142
|
+
related_commands: ["naive video models"],
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
videoCmd
|
|
147
|
+
.command("status <job_id>")
|
|
148
|
+
.description("Check the status of a video generation job")
|
|
149
|
+
.addHelpText("after", `
|
|
150
|
+
Examples:
|
|
151
|
+
$ naive video status 550e8400-e29b-41d4-a716-446655440000
|
|
152
|
+
|
|
153
|
+
What this does:
|
|
154
|
+
Returns the current status of a video generation job:
|
|
155
|
+
- queued: waiting to be processed
|
|
156
|
+
- processing: actively generating
|
|
157
|
+
- completed: video ready (includes URL)
|
|
158
|
+
- failed: generation failed (includes error message)
|
|
159
|
+
|
|
160
|
+
When completed, the result includes a video URL.
|
|
161
|
+
`)
|
|
162
|
+
.action(async (jobId) => {
|
|
163
|
+
const resp = await apiRequest("GET", `/v1/video/${jobId}`);
|
|
164
|
+
handleApiError("video.status", resp);
|
|
165
|
+
const data = resp.data;
|
|
166
|
+
agentOutput({
|
|
167
|
+
action: "video.status",
|
|
168
|
+
result: resp.data,
|
|
169
|
+
next_steps: [
|
|
170
|
+
...(data.status === "completed" && data.result?.video
|
|
171
|
+
? [{ command: `# Download: curl -o video.mp4 "${data.result.video.url}"`, description: "Download the generated video" }]
|
|
172
|
+
: []),
|
|
173
|
+
...(data.status === "queued" || data.status === "processing"
|
|
174
|
+
? [{ command: `naive video status ${jobId}`, description: "Check again in 10-30 seconds" }]
|
|
175
|
+
: []),
|
|
176
|
+
{ command: 'naive video generate "new prompt" --model <model>', description: "Generate another video" },
|
|
177
|
+
],
|
|
178
|
+
hints: [
|
|
179
|
+
`Job status: ${data.status}`,
|
|
180
|
+
...(data.status === "processing" ? ["Video generation typically takes 30-120 seconds"] : []),
|
|
181
|
+
],
|
|
182
|
+
related_commands: ["naive video generate", "naive jobs"],
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
videoCmd
|
|
186
|
+
.command("models")
|
|
187
|
+
.description("List available fal.ai video generation models with pricing")
|
|
188
|
+
.addHelpText("after", `
|
|
189
|
+
Examples:
|
|
190
|
+
$ naive video models
|
|
191
|
+
|
|
192
|
+
What this does:
|
|
193
|
+
Returns all supported fal.ai video models with:
|
|
194
|
+
- Model ID (use as --model parameter)
|
|
195
|
+
- Type (text-to-video or image-to-video)
|
|
196
|
+
- Approximate generation time
|
|
197
|
+
- Credit cost per generation
|
|
198
|
+
- Supported durations and parameters
|
|
199
|
+
`)
|
|
200
|
+
.action(async () => {
|
|
201
|
+
const resp = await apiRequest("GET", "/v1/video/models");
|
|
202
|
+
handleApiError("video.models", resp);
|
|
203
|
+
agentOutput({
|
|
204
|
+
action: "video.models",
|
|
205
|
+
result: resp.data,
|
|
206
|
+
next_steps: [
|
|
207
|
+
{ command: 'naive video generate "your prompt" --model <model_id>', description: "Generate a video with one of these models" },
|
|
208
|
+
],
|
|
209
|
+
hints: [
|
|
210
|
+
"Use the model 'id' field as the --model parameter in 'naive video generate'",
|
|
211
|
+
"Text-to-video models accept a text prompt; image-to-video models require --image-url",
|
|
212
|
+
],
|
|
213
|
+
related_commands: ["naive video generate", "naive video status"],
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
async function pollJob(jobId) {
|
|
217
|
+
while (true) {
|
|
218
|
+
await new Promise((r) => setTimeout(r, 5000));
|
|
219
|
+
const resp = await apiRequest("GET", `/v1/jobs/${jobId}`);
|
|
220
|
+
const data = resp.data;
|
|
221
|
+
if (data.status === "completed" || data.status === "failed") {
|
|
222
|
+
agentOutput({
|
|
223
|
+
action: "video.generate.completed",
|
|
224
|
+
result: resp.data,
|
|
225
|
+
next_steps: [
|
|
226
|
+
...(data.status === "completed" && data.result?.video
|
|
227
|
+
? [{ command: `# Download: curl -o video.mp4 "${data.result.video.url}"`, description: "Download the generated video" }]
|
|
228
|
+
: []),
|
|
229
|
+
{ command: 'naive video generate "another prompt" --model <model>', description: "Generate another video" },
|
|
230
|
+
],
|
|
231
|
+
hints: [
|
|
232
|
+
data.status === "completed"
|
|
233
|
+
? "Video generation complete — download URL available"
|
|
234
|
+
: "Video generation failed — no credits deducted",
|
|
235
|
+
],
|
|
236
|
+
related_commands: ["naive video generate", "naive video models", "naive jobs"],
|
|
237
|
+
});
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
process.stderr.write(` Progress: ${data.progress ?? 0}% (${data.status})\n`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=video.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { apiRequest, handleApiError } from "../client.js";
|
|
3
|
+
import { agentOutput } from "../output.js";
|
|
4
|
+
export const whoamiCmd = new Command("whoami")
|
|
5
|
+
.description("Display current authenticated agent identity and company context")
|
|
6
|
+
.addHelpText("after", `
|
|
7
|
+
Examples:
|
|
8
|
+
$ naive whoami
|
|
9
|
+
|
|
10
|
+
What this does:
|
|
11
|
+
Returns the agent name, ID, company name, and company ID associated
|
|
12
|
+
with the currently configured API key.
|
|
13
|
+
|
|
14
|
+
Use this to:
|
|
15
|
+
- Confirm which account is active
|
|
16
|
+
- Verify the API key is valid before running operations
|
|
17
|
+
- Check which company context you're operating under
|
|
18
|
+
`)
|
|
19
|
+
.action(async () => {
|
|
20
|
+
const resp = await apiRequest("GET", "/v1/auth/me");
|
|
21
|
+
handleApiError("whoami", resp);
|
|
22
|
+
const data = resp.data;
|
|
23
|
+
agentOutput({
|
|
24
|
+
action: "whoami",
|
|
25
|
+
result: data,
|
|
26
|
+
next_steps: [
|
|
27
|
+
{ command: "naive status", description: "See full status including credits and resources" },
|
|
28
|
+
{ command: "naive companies", description: "List all companies you have access to" },
|
|
29
|
+
{ command: "naive identity", description: "View provisioned resources (email, phone)" },
|
|
30
|
+
],
|
|
31
|
+
hints: [
|
|
32
|
+
`Currently operating as "${data.agent_name}" under "${data.company_name}"`,
|
|
33
|
+
],
|
|
34
|
+
related_commands: ["naive status", "naive companies", "naive identity", "naive keys list"],
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC3C,WAAW,CAAC,kEAAkE,CAAC;KAC/E,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;CAYvB,CAAC;KACC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACpD,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAE/B,MAAM,IAAI,GAAG,IAAI,CAAC,IAA0F,CAAC;IAE7G,WAAW,CAAC;QACV,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE;YACV,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,iDAAiD,EAAE;YAC3F,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,uCAAuC,EAAE;YACpF,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,2CAA2C,EAAE;SACxF;QACD,KAAK,EAAE;YACL,2BAA2B,IAAI,CAAC,UAAU,YAAY,IAAI,CAAC,YAAY,GAAG;SAC3E;QACD,gBAAgB,EAAE,CAAC,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC;KAC3F,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface NaiveConfig {
|
|
2
|
+
api_key?: string;
|
|
3
|
+
base_url: string;
|
|
4
|
+
agent_id?: string;
|
|
5
|
+
company_id?: string;
|
|
6
|
+
company_name?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function loadConfig(): NaiveConfig;
|
|
9
|
+
export declare function saveConfig(config: Partial<NaiveConfig>): void;
|
|
10
|
+
export declare function getApiKey(): string;
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
const CONFIG_DIR = join(homedir(), ".naive");
|
|
5
|
+
const CONFIG_FILE = join(CONFIG_DIR, "config.json");
|
|
6
|
+
const DEFAULT_CONFIG = {
|
|
7
|
+
base_url: "https://api.usenaive.ai",
|
|
8
|
+
};
|
|
9
|
+
export function loadConfig() {
|
|
10
|
+
let config = { ...DEFAULT_CONFIG };
|
|
11
|
+
if (existsSync(CONFIG_FILE)) {
|
|
12
|
+
try {
|
|
13
|
+
const raw = readFileSync(CONFIG_FILE, "utf-8");
|
|
14
|
+
config = { ...config, ...JSON.parse(raw) };
|
|
15
|
+
}
|
|
16
|
+
catch { }
|
|
17
|
+
}
|
|
18
|
+
if (process.env.NAIVE_BASE_URL)
|
|
19
|
+
config.base_url = process.env.NAIVE_BASE_URL;
|
|
20
|
+
return config;
|
|
21
|
+
}
|
|
22
|
+
export function saveConfig(config) {
|
|
23
|
+
if (!existsSync(CONFIG_DIR))
|
|
24
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
25
|
+
const current = loadConfig();
|
|
26
|
+
const updated = { ...current, ...config };
|
|
27
|
+
writeFileSync(CONFIG_FILE, JSON.stringify(updated, null, 2));
|
|
28
|
+
}
|
|
29
|
+
export function getApiKey() {
|
|
30
|
+
const envKey = process.env.NAIVE_API_KEY;
|
|
31
|
+
if (envKey)
|
|
32
|
+
return envKey;
|
|
33
|
+
const config = loadConfig();
|
|
34
|
+
if (!config.api_key) {
|
|
35
|
+
console.error("No API key found. Run `naive register` or `naive link` first.");
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
return config.api_key;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAUpD,MAAM,cAAc,GAAgB;IAClC,QAAQ,EAAE,yBAAyB;CACpC,CAAC;AAEF,MAAM,UAAU,UAAU;IACxB,IAAI,MAAM,GAAgB,EAAE,GAAG,cAAc,EAAE,CAAC;IAChD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC/C,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;QAAE,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC7E,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAA4B;IACrD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1C,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { registerCmd } from "./commands/register.js";
|
|
4
|
+
import { loginCmd } from "./commands/login.js";
|
|
5
|
+
import { linkCmd, verifyCmd } from "./commands/link.js";
|
|
6
|
+
import { companiesCmd } from "./commands/companies.js";
|
|
7
|
+
import { whoamiCmd } from "./commands/whoami.js";
|
|
8
|
+
import { identityCmd } from "./commands/identity.js";
|
|
9
|
+
import { keysCmd } from "./commands/keys.js";
|
|
10
|
+
import { statusCmd } from "./commands/status.js";
|
|
11
|
+
import { usageCmd } from "./commands/usage.js";
|
|
12
|
+
import { emailCmd } from "./commands/email.js";
|
|
13
|
+
import { searchCmd } from "./commands/search.js";
|
|
14
|
+
import { imagesCmd } from "./commands/images.js";
|
|
15
|
+
import { videoCmd } from "./commands/video.js";
|
|
16
|
+
import { jobsCmd } from "./commands/jobs.js";
|
|
17
|
+
import { domainsCmd } from "./commands/domains.js";
|
|
18
|
+
import { billingCmd } from "./commands/billing.js";
|
|
19
|
+
import { socialCmd } from "./commands/social.js";
|
|
20
|
+
const program = new Command();
|
|
21
|
+
program
|
|
22
|
+
.name("naive")
|
|
23
|
+
.description(`Naive AI Business Primitives CLI — unified agent toolkit for email, search, image/video generation, and more.
|
|
24
|
+
|
|
25
|
+
Built for agentic use: every command returns structured JSON with result data,
|
|
26
|
+
next steps, and contextual guidance for autonomous operation.`)
|
|
27
|
+
.version("0.1.0")
|
|
28
|
+
.addHelpText("after", `
|
|
29
|
+
Getting Started:
|
|
30
|
+
$ naive register --name "My Agent" --email me@example.com --password mypassword
|
|
31
|
+
$ naive status
|
|
32
|
+
$ naive identity
|
|
33
|
+
|
|
34
|
+
Authentication:
|
|
35
|
+
register Create a new account (email + password → API key)
|
|
36
|
+
login Log in to existing account (email + password → API key)
|
|
37
|
+
link Passwordless account linking via email verification
|
|
38
|
+
verify Complete the link flow with verification code
|
|
39
|
+
|
|
40
|
+
Account Management:
|
|
41
|
+
whoami Show current identity
|
|
42
|
+
companies List/switch companies
|
|
43
|
+
domains Manage email domains (list, connect, verify, purchase)
|
|
44
|
+
keys Manage API keys
|
|
45
|
+
status Full status overview
|
|
46
|
+
usage Credit transaction history
|
|
47
|
+
identity View provisioned resources
|
|
48
|
+
billing Manage billing — plans, subscriptions, credit top-ups
|
|
49
|
+
|
|
50
|
+
Primitives:
|
|
51
|
+
email Send/receive email via provisioned inboxes
|
|
52
|
+
search Web search, URL extraction, deep research
|
|
53
|
+
images AI image generation (fal.ai) + stock photos (Pexels)
|
|
54
|
+
video AI video generation (fal.ai)
|
|
55
|
+
social Social media — connect accounts, post, analytics
|
|
56
|
+
jobs Monitor async generation/research jobs
|
|
57
|
+
|
|
58
|
+
Environment Variables:
|
|
59
|
+
NAIVE_API_KEY Override API key (for CI/headless use)
|
|
60
|
+
NAIVE_BASE_URL Override API URL (for local dev, default: https://api.usenaive.ai)
|
|
61
|
+
|
|
62
|
+
Documentation: https://docs.usenaive.ai
|
|
63
|
+
`);
|
|
64
|
+
program.addCommand(registerCmd);
|
|
65
|
+
program.addCommand(loginCmd);
|
|
66
|
+
program.addCommand(linkCmd);
|
|
67
|
+
program.addCommand(verifyCmd);
|
|
68
|
+
program.addCommand(companiesCmd);
|
|
69
|
+
program.addCommand(whoamiCmd);
|
|
70
|
+
program.addCommand(identityCmd);
|
|
71
|
+
program.addCommand(keysCmd);
|
|
72
|
+
program.addCommand(statusCmd);
|
|
73
|
+
program.addCommand(usageCmd);
|
|
74
|
+
program.addCommand(domainsCmd);
|
|
75
|
+
program.addCommand(billingCmd);
|
|
76
|
+
program.addCommand(emailCmd);
|
|
77
|
+
program.addCommand(searchCmd);
|
|
78
|
+
program.addCommand(imagesCmd);
|
|
79
|
+
program.addCommand(videoCmd);
|
|
80
|
+
program.addCommand(socialCmd);
|
|
81
|
+
program.addCommand(jobsCmd);
|
|
82
|
+
program.parse();
|
|
83
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC;;;8DAG+C,CAAC;KAC5D,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCvB,CAAC,CAAC;AAEH,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC7B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAC5B,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC9B,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC9B,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAC5B,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC9B,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC7B,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC7B,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC9B,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC9B,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC7B,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC9B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAE5B,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/output.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent-native structured output for CLI responses.
|
|
3
|
+
* Every tool call returns JSON with result data + contextual guidance
|
|
4
|
+
* following the Meow/Lindy pattern for agentic CLI usage.
|
|
5
|
+
*/
|
|
6
|
+
export interface NextStep {
|
|
7
|
+
command: string;
|
|
8
|
+
description: string;
|
|
9
|
+
when?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface AgentOutput {
|
|
12
|
+
success: boolean;
|
|
13
|
+
action: string;
|
|
14
|
+
result: unknown;
|
|
15
|
+
next_steps: NextStep[];
|
|
16
|
+
hints?: string[];
|
|
17
|
+
related_commands?: string[];
|
|
18
|
+
help_markdown?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function agentOutput(opts: {
|
|
21
|
+
action: string;
|
|
22
|
+
result: unknown;
|
|
23
|
+
next_steps: NextStep[];
|
|
24
|
+
hints?: string[];
|
|
25
|
+
related_commands?: string[];
|
|
26
|
+
help_markdown?: string;
|
|
27
|
+
}): void;
|
|
28
|
+
export declare function agentError(opts: {
|
|
29
|
+
action: string;
|
|
30
|
+
error: {
|
|
31
|
+
code?: string;
|
|
32
|
+
message?: string;
|
|
33
|
+
hint?: string;
|
|
34
|
+
};
|
|
35
|
+
recovery_steps: NextStep[];
|
|
36
|
+
}): void;
|
|
37
|
+
export declare function formatApiError(action: string, data: unknown): void;
|
package/dist/output.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent-native structured output for CLI responses.
|
|
3
|
+
* Every tool call returns JSON with result data + contextual guidance
|
|
4
|
+
* following the Meow/Lindy pattern for agentic CLI usage.
|
|
5
|
+
*/
|
|
6
|
+
export function agentOutput(opts) {
|
|
7
|
+
const output = {
|
|
8
|
+
success: true,
|
|
9
|
+
action: opts.action,
|
|
10
|
+
result: opts.result,
|
|
11
|
+
next_steps: opts.next_steps,
|
|
12
|
+
...(opts.hints && { hints: opts.hints }),
|
|
13
|
+
...(opts.related_commands && { related_commands: opts.related_commands }),
|
|
14
|
+
...(opts.help_markdown && { help_markdown: opts.help_markdown }),
|
|
15
|
+
};
|
|
16
|
+
console.log(JSON.stringify(output, null, 2));
|
|
17
|
+
}
|
|
18
|
+
export function agentError(opts) {
|
|
19
|
+
const output = {
|
|
20
|
+
success: false,
|
|
21
|
+
action: opts.action,
|
|
22
|
+
error: opts.error,
|
|
23
|
+
recovery_steps: opts.recovery_steps,
|
|
24
|
+
};
|
|
25
|
+
console.error(JSON.stringify(output, null, 2));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
export function formatApiError(action, data) {
|
|
29
|
+
const err = data;
|
|
30
|
+
if (err.error) {
|
|
31
|
+
agentError({
|
|
32
|
+
action,
|
|
33
|
+
error: err.error,
|
|
34
|
+
recovery_steps: getRecoverySteps(err.error.code),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
agentError({
|
|
39
|
+
action,
|
|
40
|
+
error: { code: "unknown", message: "Unexpected error response" },
|
|
41
|
+
recovery_steps: [{ command: "naive status", description: "Check API connectivity and auth status" }],
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function getRecoverySteps(code) {
|
|
46
|
+
switch (code) {
|
|
47
|
+
case "unauthorized":
|
|
48
|
+
return [
|
|
49
|
+
{ command: "naive register --name <name> --email <email> --password <pw>", description: "Create a new account" },
|
|
50
|
+
{ command: "naive login --email <email> --password <pw>", description: "Log in to existing account" },
|
|
51
|
+
];
|
|
52
|
+
case "insufficient_credits":
|
|
53
|
+
return [
|
|
54
|
+
{ command: "naive billing topup --pack medium", description: "Buy 50 credits for $23 (Popular)" },
|
|
55
|
+
{ command: "naive billing topup --pack large", description: "Buy 100 credits for $44 (Best Value)" },
|
|
56
|
+
{ command: "naive billing upgrade --plan pro", description: "Upgrade to Pro (200 credits/mo, $149/mo)" },
|
|
57
|
+
{ command: "naive billing packs", description: "See all available credit packs" },
|
|
58
|
+
];
|
|
59
|
+
case "billing_blocked":
|
|
60
|
+
return [
|
|
61
|
+
{ command: "naive billing subscribe --plan starter", description: "Subscribe to Starter ($49/mo, 50 credits)" },
|
|
62
|
+
{ command: "naive billing subscribe --plan pro", description: "Subscribe to Pro ($149/mo, 200 credits)" },
|
|
63
|
+
{ command: "naive billing plans", description: "Compare all plans" },
|
|
64
|
+
];
|
|
65
|
+
case "rate_limited":
|
|
66
|
+
return [
|
|
67
|
+
{ command: "# wait 60 seconds then retry", description: "Rate limits reset after 60s" },
|
|
68
|
+
];
|
|
69
|
+
case "resource_not_found":
|
|
70
|
+
return [
|
|
71
|
+
{ command: "naive identity", description: "List available resources" },
|
|
72
|
+
{ command: "naive companies", description: "Check available companies" },
|
|
73
|
+
];
|
|
74
|
+
case "invalid_input":
|
|
75
|
+
return [
|
|
76
|
+
{ command: "naive <command> --help", description: "See required parameters and examples" },
|
|
77
|
+
];
|
|
78
|
+
default:
|
|
79
|
+
return [
|
|
80
|
+
{ command: "naive status", description: "Check API connectivity and auth status" },
|
|
81
|
+
];
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
|