@usenaive-sdk/cli 0.12.2 → 0.13.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 (193) hide show
  1. package/README.md +76 -5
  2. package/dist/client.d.ts +74 -1
  3. package/dist/client.js +351 -17
  4. package/dist/client.js.map +1 -1
  5. package/dist/commands/aeo.js +69 -27
  6. package/dist/commands/aeo.js.map +1 -1
  7. package/dist/commands/app-data.js +29 -11
  8. package/dist/commands/app-data.js.map +1 -1
  9. package/dist/commands/apps.d.ts +7 -0
  10. package/dist/commands/apps.js +255 -18
  11. package/dist/commands/apps.js.map +1 -1
  12. package/dist/commands/audio.d.ts +9 -0
  13. package/dist/commands/audio.js +391 -0
  14. package/dist/commands/audio.js.map +1 -0
  15. package/dist/commands/auth.d.ts +31 -0
  16. package/dist/commands/auth.js +403 -0
  17. package/dist/commands/auth.js.map +1 -0
  18. package/dist/commands/billing.js +12 -12
  19. package/dist/commands/billing.js.map +1 -1
  20. package/dist/commands/brain.d.ts +2 -0
  21. package/dist/commands/brain.js +1255 -0
  22. package/dist/commands/brain.js.map +1 -0
  23. package/dist/commands/browser.js +35 -8
  24. package/dist/commands/browser.js.map +1 -1
  25. package/dist/commands/business.js +117 -16
  26. package/dist/commands/business.js.map +1 -1
  27. package/dist/commands/clone.d.ts +2 -0
  28. package/dist/commands/clone.js +203 -0
  29. package/dist/commands/clone.js.map +1 -0
  30. package/dist/commands/companies.d.ts +8 -0
  31. package/dist/commands/companies.js +137 -47
  32. package/dist/commands/companies.js.map +1 -1
  33. package/dist/commands/company-data.d.ts +2 -0
  34. package/dist/commands/company-data.js +168 -0
  35. package/dist/commands/company-data.js.map +1 -0
  36. package/dist/commands/compute.js +10 -3
  37. package/dist/commands/compute.js.map +1 -1
  38. package/dist/commands/config.d.ts +2 -0
  39. package/dist/commands/config.js +36 -0
  40. package/dist/commands/config.js.map +1 -0
  41. package/dist/commands/connections.d.ts +6 -0
  42. package/dist/commands/connections.js +29 -1
  43. package/dist/commands/connections.js.map +1 -1
  44. package/dist/commands/domains.js +1 -1
  45. package/dist/commands/ecommerce.js +19 -9
  46. package/dist/commands/ecommerce.js.map +1 -1
  47. package/dist/commands/email.js +56 -9
  48. package/dist/commands/email.js.map +1 -1
  49. package/dist/commands/env.d.ts +3 -3
  50. package/dist/commands/env.js +68 -4
  51. package/dist/commands/env.js.map +1 -1
  52. package/dist/commands/formation.js +3 -3
  53. package/dist/commands/identity.js +4 -3
  54. package/dist/commands/identity.js.map +1 -1
  55. package/dist/commands/images.js +87 -13
  56. package/dist/commands/images.js.map +1 -1
  57. package/dist/commands/init.d.ts +3 -0
  58. package/dist/commands/init.js +39 -36
  59. package/dist/commands/init.js.map +1 -1
  60. package/dist/commands/jobs.js +1 -0
  61. package/dist/commands/jobs.js.map +1 -1
  62. package/dist/commands/keys.js +26 -3
  63. package/dist/commands/keys.js.map +1 -1
  64. package/dist/commands/legacy-auth.d.ts +27 -0
  65. package/dist/commands/legacy-auth.js +64 -0
  66. package/dist/commands/legacy-auth.js.map +1 -0
  67. package/dist/commands/llm.js +13 -0
  68. package/dist/commands/llm.js.map +1 -1
  69. package/dist/commands/login.js +2 -0
  70. package/dist/commands/login.js.map +1 -1
  71. package/dist/commands/loops.d.ts +2 -0
  72. package/dist/commands/loops.js +260 -0
  73. package/dist/commands/loops.js.map +1 -0
  74. package/dist/commands/media.js +3 -3
  75. package/dist/commands/media.js.map +1 -1
  76. package/dist/commands/mobile.d.ts +4 -0
  77. package/dist/commands/mobile.js +382 -0
  78. package/dist/commands/mobile.js.map +1 -0
  79. package/dist/commands/payments.d.ts +2 -0
  80. package/dist/commands/payments.js +131 -0
  81. package/dist/commands/payments.js.map +1 -0
  82. package/dist/commands/people.d.ts +2 -0
  83. package/dist/commands/people.js +193 -0
  84. package/dist/commands/people.js.map +1 -0
  85. package/dist/commands/phone.js +3 -3
  86. package/dist/commands/phone.js.map +1 -1
  87. package/dist/commands/projects.d.ts +13 -0
  88. package/dist/commands/projects.js +220 -0
  89. package/dist/commands/projects.js.map +1 -0
  90. package/dist/commands/register.js +16 -8
  91. package/dist/commands/register.js.map +1 -1
  92. package/dist/commands/sandbox.d.ts +2 -0
  93. package/dist/commands/sandbox.js +245 -0
  94. package/dist/commands/sandbox.js.map +1 -0
  95. package/dist/commands/search.js +26 -12
  96. package/dist/commands/search.js.map +1 -1
  97. package/dist/commands/seo.js +16 -8
  98. package/dist/commands/seo.js.map +1 -1
  99. package/dist/commands/sessions.d.ts +6 -0
  100. package/dist/commands/sessions.js +109 -0
  101. package/dist/commands/sessions.js.map +1 -0
  102. package/dist/commands/social-data.d.ts +2 -0
  103. package/dist/commands/social-data.js +244 -0
  104. package/dist/commands/social-data.js.map +1 -0
  105. package/dist/commands/social.js +8 -6
  106. package/dist/commands/social.js.map +1 -1
  107. package/dist/commands/teams.d.ts +69 -0
  108. package/dist/commands/teams.js +503 -0
  109. package/dist/commands/teams.js.map +1 -0
  110. package/dist/commands/up.d.ts +150 -0
  111. package/dist/commands/up.js +415 -15
  112. package/dist/commands/up.js.map +1 -1
  113. package/dist/commands/usage.js +15 -4
  114. package/dist/commands/usage.js.map +1 -1
  115. package/dist/commands/use.d.ts +9 -0
  116. package/dist/commands/use.js +76 -11
  117. package/dist/commands/use.js.map +1 -1
  118. package/dist/commands/users.d.ts +8 -0
  119. package/dist/commands/users.js +28 -9
  120. package/dist/commands/users.js.map +1 -1
  121. package/dist/commands/vault.js +28 -1
  122. package/dist/commands/vault.js.map +1 -1
  123. package/dist/commands/video.js +190 -270
  124. package/dist/commands/video.js.map +1 -1
  125. package/dist/commands/voice.d.ts +2 -0
  126. package/dist/commands/voice.js +516 -0
  127. package/dist/commands/voice.js.map +1 -0
  128. package/dist/commands/wallet.d.ts +2 -0
  129. package/dist/commands/wallet.js +244 -0
  130. package/dist/commands/wallet.js.map +1 -0
  131. package/dist/commands/whoami.js +17 -1
  132. package/dist/commands/whoami.js.map +1 -1
  133. package/dist/config.d.ts +24 -1
  134. package/dist/config.js +36 -7
  135. package/dist/config.js.map +1 -1
  136. package/dist/index.d.ts +2 -1
  137. package/dist/index.js +290 -20
  138. package/dist/index.js.map +1 -1
  139. package/dist/lib/brain-select.d.ts +193 -0
  140. package/dist/lib/brain-select.js +403 -0
  141. package/dist/lib/brain-select.js.map +1 -0
  142. package/dist/lib/cli-validation.d.ts +12 -0
  143. package/dist/lib/cli-validation.js +46 -0
  144. package/dist/lib/cli-validation.js.map +1 -0
  145. package/dist/lib/deprecation.d.ts +158 -0
  146. package/dist/lib/deprecation.js +140 -0
  147. package/dist/lib/deprecation.js.map +1 -0
  148. package/dist/lib/duration.d.ts +8 -0
  149. package/dist/lib/duration.js +11 -0
  150. package/dist/lib/duration.js.map +1 -0
  151. package/dist/lib/http-response.d.ts +11 -0
  152. package/dist/lib/http-response.js +96 -0
  153. package/dist/lib/http-response.js.map +1 -0
  154. package/dist/lib/pricing.d.ts +132 -0
  155. package/dist/lib/pricing.js +148 -0
  156. package/dist/lib/pricing.js.map +1 -0
  157. package/dist/lib/stream-frames.d.ts +114 -0
  158. package/dist/lib/stream-frames.js +169 -0
  159. package/dist/lib/stream-frames.js.map +1 -0
  160. package/dist/lib/teams-catalog.d.ts +141 -0
  161. package/dist/lib/teams-catalog.js +765 -0
  162. package/dist/lib/teams-catalog.js.map +1 -0
  163. package/dist/lib/unknown-command.d.ts +57 -0
  164. package/dist/lib/unknown-command.js +93 -0
  165. package/dist/lib/unknown-command.js.map +1 -0
  166. package/dist/lib/version-check.d.ts +26 -0
  167. package/dist/lib/version-check.js +21 -0
  168. package/dist/lib/version-check.js.map +1 -0
  169. package/dist/output.d.ts +119 -10
  170. package/dist/output.js +309 -15
  171. package/dist/output.js.map +1 -1
  172. package/dist/prompt.d.ts +17 -0
  173. package/dist/prompt.js +70 -0
  174. package/dist/prompt.js.map +1 -0
  175. package/package.json +11 -6
  176. package/dist/commands/billing-client.d.ts +0 -2
  177. package/dist/commands/billing-client.js +0 -271
  178. package/dist/commands/billing-client.js.map +0 -1
  179. package/dist/commands/crm-app.d.ts +0 -2
  180. package/dist/commands/crm-app.js +0 -306
  181. package/dist/commands/crm-app.js.map +0 -1
  182. package/dist/commands/crm.d.ts +0 -2
  183. package/dist/commands/crm.js +0 -319
  184. package/dist/commands/crm.js.map +0 -1
  185. package/dist/commands/integrations.d.ts +0 -2
  186. package/dist/commands/integrations.js +0 -199
  187. package/dist/commands/integrations.js.map +0 -1
  188. package/dist/commands/link.d.ts +0 -3
  189. package/dist/commands/link.js +0 -91
  190. package/dist/commands/link.js.map +0 -1
  191. package/dist/commands/operators.d.ts +0 -11
  192. package/dist/commands/operators.js +0 -120
  193. package/dist/commands/operators.js.map +0 -1
@@ -0,0 +1,403 @@
1
+ import { Command } from "commander";
2
+ import http from "node:http";
3
+ import { randomBytes } from "node:crypto";
4
+ import { spawn } from "node:child_process";
5
+ import { apiRequest, sessionLogin, sessionRequest } from "../client.js";
6
+ import { loadConfig, saveConfig, clearSession } from "../config.js";
7
+ import { agentError, agentOutput } from "../output.js";
8
+ /**
9
+ * Build the server authorize URL for the CLI loopback Google flow.
10
+ *
11
+ * The `redirect` value is the bare loopback origin `http://127.0.0.1:<port>` with
12
+ * NO trailing slash and NO query — the server re-validates this exact shape
13
+ * (`isLoopbackRedirect`) before it will hand a code back, so any drift here is
14
+ * rejected server-side. `URLSearchParams` percent-encodes the redirect and leaves
15
+ * the base64url `cliState` untouched (it only uses `A-Za-z0-9-_`).
16
+ */
17
+ export function buildAuthorizeUrl(baseUrl, port, cliState) {
18
+ const redirect = `http://127.0.0.1:${port}`;
19
+ const params = new URLSearchParams({ mode: "cli", redirect, cli_state: cliState });
20
+ return `${baseUrl.replace(/\/+$/, "")}/v1/auth/oauth/google?${params.toString()}`;
21
+ }
22
+ /**
23
+ * Parse the request the server bounced back to our loopback listener.
24
+ *
25
+ * Order matters: the server's ERROR redirect carries `?error=...` with NO
26
+ * `cli_state`, so `error` must be checked first or every error would surface as a
27
+ * spurious `state_mismatch`. The `cli_state` check is the CSRF guard [D8] — a
28
+ * mismatch means the callback wasn't initiated by this process, so we abort
29
+ * without saving anything.
30
+ */
31
+ export function parseLoopbackRequest(reqUrl, expectedState) {
32
+ let params;
33
+ try {
34
+ params = new URL(reqUrl, "http://127.0.0.1").searchParams;
35
+ }
36
+ catch {
37
+ return { ok: false, reason: "invalid_request" };
38
+ }
39
+ const error = params.get("error");
40
+ if (error)
41
+ return { ok: false, reason: error };
42
+ if (params.get("cli_state") !== expectedState)
43
+ return { ok: false, reason: "state_mismatch" };
44
+ const code = params.get("code");
45
+ if (!code)
46
+ return { ok: false, reason: "missing_code" };
47
+ return { ok: true, code };
48
+ }
49
+ const TIMEOUT_MS = 180_000;
50
+ const SUCCESS_PAGE = `<!doctype html><html lang="en"><head><meta charset="utf-8">` +
51
+ `<meta name="viewport" content="width=device-width,initial-scale=1">` +
52
+ `<meta name="referrer" content="no-referrer"><title>Naive CLI</title></head>` +
53
+ `<body style="font-family:system-ui,-apple-system,sans-serif;text-align:center;padding:3rem;color:#111">` +
54
+ `<h1>Signed in</h1><p>Signed in &mdash; you can close this tab and return to your terminal.</p></body></html>`;
55
+ const FAILURE_PAGE = `<!doctype html><html lang="en"><head><meta charset="utf-8">` +
56
+ `<meta name="viewport" content="width=device-width,initial-scale=1">` +
57
+ `<meta name="referrer" content="no-referrer"><title>Naive CLI</title></head>` +
58
+ `<body style="font-family:system-ui,-apple-system,sans-serif;text-align:center;padding:3rem;color:#111">` +
59
+ `<h1>Sign-in failed</h1><p>Something went wrong. Return to your terminal for details.</p></body></html>`;
60
+ /** Map an internal/raw reason to a human-facing message. */
61
+ function describeReason(reason) {
62
+ switch (reason) {
63
+ case "state_mismatch":
64
+ return "Sign-in state did not match the request that started this flow (possible CSRF). Aborted without saving.";
65
+ case "missing_code":
66
+ return "Sign-in did not return an authorization code.";
67
+ case "invalid_request":
68
+ return "The browser callback could not be parsed.";
69
+ default:
70
+ // A message the server bounced back (e.g. "access_denied").
71
+ return reason;
72
+ }
73
+ }
74
+ /**
75
+ * Shared browser-loopback login used by BOTH `auth google` and `auth email`:
76
+ * 1. start a one-shot loopback listener on a random 127.0.0.1 port,
77
+ * 2. let the flow turn (port, cliState) into a URL to open (or an emailed-link
78
+ * message, or an error),
79
+ * 3. accept the single callback, exchange the one-time code for an API key at
80
+ * POST /v1/auth/cli/exchange (identical for both flows),
81
+ * 4. persist the key and print structured success — or fail loudly.
82
+ *
83
+ * The raw API key and the one-time code are NEVER written to stdout/stderr.
84
+ */
85
+ async function runLoopbackLogin(action, start) {
86
+ const cliState = randomBytes(32).toString("base64url");
87
+ await new Promise((resolve) => {
88
+ let settled = false;
89
+ let port = 0;
90
+ let timer;
91
+ const server = http.createServer(handler);
92
+ function teardown() {
93
+ clearTimeout(timer);
94
+ server.close();
95
+ server.closeAllConnections?.();
96
+ }
97
+ function succeed(data) {
98
+ if (settled)
99
+ return;
100
+ settled = true;
101
+ teardown();
102
+ const companies = data.companies ?? [];
103
+ const hasMultiple = companies.length > 1;
104
+ agentOutput({
105
+ action,
106
+ result: {
107
+ agent_id: data.agent_id,
108
+ company_id: data.company_id,
109
+ company_name: data.company_name,
110
+ credentials_saved: "~/.naive/config.json",
111
+ companies,
112
+ },
113
+ next_steps: [
114
+ { command: "naive status", description: "Check current credits and resources" },
115
+ { command: "naive identity", description: "View available resources for this company" },
116
+ ...(hasMultiple
117
+ ? [{ command: "naive companies select <id>", description: "Switch to a different company", when: "You want to operate under a different company" }]
118
+ : []),
119
+ ],
120
+ hints: [
121
+ "Signed in — API key saved to ~/.naive/config.json for automatic auth",
122
+ ...(hasMultiple
123
+ ? [`You have ${companies.length} companies. Currently using "${data.company_name}". Use 'naive companies' to see all.`]
124
+ : []),
125
+ ],
126
+ related_commands: ["naive whoami", "naive companies", "naive status", "naive keys list"],
127
+ });
128
+ resolve();
129
+ }
130
+ function fail(error) {
131
+ if (settled)
132
+ return;
133
+ settled = true;
134
+ teardown();
135
+ agentError({
136
+ action,
137
+ error,
138
+ recovery_steps: [
139
+ { command: "naive auth google", description: "Sign in with Google in the browser" },
140
+ { command: "naive auth email <email>", description: "Sign in with an email magic link" },
141
+ { command: "naive login --email <email> --password <pw>", description: "Sign in with email and password instead" },
142
+ ],
143
+ });
144
+ }
145
+ function writePage(res, status, body, onDone) {
146
+ res.writeHead(status, {
147
+ "Content-Type": "text/html; charset=utf-8",
148
+ "Referrer-Policy": "no-referrer",
149
+ Connection: "close",
150
+ });
151
+ res.end(body, onDone);
152
+ }
153
+ async function exchange(code, res) {
154
+ let resp;
155
+ try {
156
+ resp = await apiRequest("POST", "/v1/auth/cli/exchange", { code }, { noAuth: true });
157
+ }
158
+ catch {
159
+ writePage(res, 502, FAILURE_PAGE, () => fail({ code: "network_error", message: "Could not reach the Naive API to complete sign-in." }));
160
+ return;
161
+ }
162
+ if (resp.status !== 200) {
163
+ const err = resp.data?.error;
164
+ writePage(res, 401, FAILURE_PAGE, () => fail({ code: err?.code ?? "unauthorized", message: err?.message ?? "Sign-in code exchange failed." }));
165
+ return;
166
+ }
167
+ const data = resp.data;
168
+ saveConfig({
169
+ api_key: data.api_key,
170
+ agent_id: data.agent_id,
171
+ company_id: data.company_id,
172
+ company_name: data.company_name,
173
+ });
174
+ writePage(res, 200, SUCCESS_PAGE, () => succeed(data));
175
+ }
176
+ function handler(req, res) {
177
+ // Anti-DNS-rebind: a real browser hitting our loopback sends
178
+ // `Host: 127.0.0.1:<port>`. Anything else is a rebind attempt [SEC-4].
179
+ if (req.headers.host !== `127.0.0.1:${port}`) {
180
+ writePage(res, 404, FAILURE_PAGE, () => { });
181
+ return;
182
+ }
183
+ const path = (req.url ?? "").split("?")[0];
184
+ if (path !== "/") {
185
+ // Ignore incidental requests (favicon, etc.) without settling the flow.
186
+ writePage(res, 404, FAILURE_PAGE, () => { });
187
+ return;
188
+ }
189
+ const parsed = parseLoopbackRequest(req.url ?? "", cliState);
190
+ if (!parsed.ok) {
191
+ writePage(res, 400, FAILURE_PAGE, () => fail({ code: "oauth_failed", message: describeReason(parsed.reason) }));
192
+ return;
193
+ }
194
+ void exchange(parsed.code, res);
195
+ }
196
+ server.listen(0, "127.0.0.1", () => {
197
+ // The port is only known once listening, so the URL and browser open must
198
+ // happen inside this callback [FAL-4/SEC-4].
199
+ port = server.address().port;
200
+ start(port, cliState)
201
+ .then((result) => {
202
+ if ("error" in result) {
203
+ fail({ code: "start_failed", message: result.error });
204
+ return;
205
+ }
206
+ if ("url" in result) {
207
+ openBrowser(result.url);
208
+ const copied = copyToClipboard(result.url);
209
+ // ALWAYS surface the URL so a headless/locked-down environment can finish
210
+ // the flow manually. Printed to stderr to keep stdout a single JSON doc.
211
+ process.stderr.write(`Opening your browser to sign in...\nIf it didn't open${copied ? " (the link is also copied to your clipboard)" : ""}, visit:\n${result.url}\n`);
212
+ }
213
+ else {
214
+ // No URL to open here (e.g. prod emailed the link) — tell the user.
215
+ process.stderr.write(`${result.message}\n`);
216
+ }
217
+ })
218
+ .catch((e) => fail({ code: "start_failed", message: e instanceof Error ? e.message : "Failed to start sign-in" }));
219
+ });
220
+ server.on("error", (err) => {
221
+ fail({ code: "listen_failed", message: `Could not start the local sign-in listener: ${err.message}` });
222
+ });
223
+ timer = setTimeout(() => {
224
+ fail({ code: "timeout", message: `Timed out after ${TIMEOUT_MS / 1000}s waiting for sign-in. Please try again.` });
225
+ }, TIMEOUT_MS);
226
+ });
227
+ }
228
+ /**
229
+ * Open the system browser at `url`. Uses an argv array (never a shell string) so
230
+ * the URL can't be interpreted as a shell command [SEC-5]. Best-effort: any failure
231
+ * is swallowed because the URL is always printed as a fallback.
232
+ */
233
+ function openBrowser(url) {
234
+ try {
235
+ const { command, args } = process.platform === "darwin"
236
+ ? { command: "open", args: [url] }
237
+ : process.platform === "win32"
238
+ ? { command: "cmd", args: ["/c", "start", "", url] }
239
+ : { command: "xdg-open", args: [url] };
240
+ const child = spawn(command, args, { stdio: "ignore", detached: true });
241
+ child.on("error", () => { });
242
+ child.unref();
243
+ }
244
+ catch {
245
+ // Ignore — the URL was/will be printed as a manual fallback.
246
+ }
247
+ }
248
+ /**
249
+ * Best-effort copy of `text` to the system clipboard (argv array, never a shell
250
+ * string). Returns whether the copy was attempted; failures are swallowed because
251
+ * the URL is always printed too.
252
+ */
253
+ function copyToClipboard(text) {
254
+ try {
255
+ const { command, args } = process.platform === "darwin"
256
+ ? { command: "pbcopy", args: [] }
257
+ : process.platform === "win32"
258
+ ? { command: "clip", args: [] }
259
+ : { command: "xclip", args: ["-selection", "clipboard"] };
260
+ const child = spawn(command, args, { stdio: ["pipe", "ignore", "ignore"] });
261
+ child.on("error", () => { });
262
+ child.stdin?.end(text);
263
+ return true;
264
+ }
265
+ catch {
266
+ return false;
267
+ }
268
+ }
269
+ export async function runEmailLogin(email, action = "auth_email") {
270
+ await runLoopbackLogin(action, async (port, cliState) => {
271
+ let resp;
272
+ try {
273
+ resp = await apiRequest("POST", "/v1/auth/magic/start", { email, redirect: `http://127.0.0.1:${port}`, cli_state: cliState }, { noAuth: true });
274
+ }
275
+ catch {
276
+ return { error: "Could not reach the Naive API to start email sign-in." };
277
+ }
278
+ if (resp.status !== 200) {
279
+ const err = resp.data?.error;
280
+ return { error: err?.message ?? "Could not start email sign-in." };
281
+ }
282
+ const data = resp.data;
283
+ if (data.magic_url)
284
+ return { url: data.magic_url };
285
+ return { message: data.message ?? "Check your email for the sign-in link, then return here." };
286
+ });
287
+ }
288
+ export const authCmd = new Command("auth")
289
+ .description("Browser-based authentication (Google / email magic-link sign-in)")
290
+ .addHelpText("after", `
291
+ Subcommands:
292
+ google Sign in or sign up with Google in your browser
293
+ email <email> Sign in or sign up with an email magic link
294
+
295
+ Examples:
296
+ $ naive auth google
297
+ $ naive auth email you@example.com
298
+ `);
299
+ authCmd
300
+ .command("google")
301
+ .description("Sign in or sign up with Google via your browser (no password)")
302
+ .addHelpText("after", `
303
+ What this does:
304
+ 1. Opens your browser to Google's consent screen
305
+ 2. Google redirects back to a one-time local listener on 127.0.0.1
306
+ 3. Exchanges the returned code for an API key (signup provisions a new account)
307
+ 4. Saves credentials to ~/.naive/config.json (mode 0600)
308
+ `)
309
+ .action(async () => {
310
+ await runLoopbackLogin("auth_google", async (port, cliState) => ({
311
+ url: buildAuthorizeUrl(loadConfig().base_url, port, cliState),
312
+ }));
313
+ });
314
+ authCmd
315
+ .command("email")
316
+ .argument("<email>", "Email address to sign in / sign up with")
317
+ .description("Sign in or sign up with an email magic link (no password)")
318
+ .addHelpText("after", `
319
+ What this does:
320
+ 1. Asks the API for a one-time sign-in link for <email>
321
+ 2. In dev the link is returned and opened automatically (and copied to your clipboard);
322
+ in production it is emailed to you to click
323
+ 3. Opening the link bounces a one-time code back to a local listener on 127.0.0.1
324
+ 4. Exchanges it for an API key and saves it to ~/.naive/config.json (mode 0600)
325
+
326
+ Notes:
327
+ - New emails are provisioned a fresh account automatically; existing ones sign in
328
+ - Respects NAIVE_BASE_URL for local/staging targets
329
+ `)
330
+ .action(async (email) => {
331
+ await runEmailLogin(email);
332
+ });
333
+ // ── Human session auth (session-login / logout) — from the clone/voice branch ──
334
+ // Distinct from the agent api_key and the browser sign-in above; needed for
335
+ // human-only ops like `naive voice clone`/`revoke`.
336
+ authCmd
337
+ .command("session-login")
338
+ .description("Log in as a human (session cookie) — needed for `naive voice clone`/`revoke`")
339
+ .requiredOption("--email <email>", "Account email (same as the Studio dashboard)")
340
+ .requiredOption("--password <password>", "Account password")
341
+ .addHelpText("after", `
342
+ What this does:
343
+ 1. Authenticates as a HUMAN (not an agent key) and stores a session token (~/.naive/config.json, 0600)
344
+ 2. Unlocks human-only commands: naive voice clone / naive voice revoke
345
+ 3. The agent api_key (from 'naive login') is unaffected and still used for agent commands
346
+
347
+ Note: this is separate from 'naive login'. Cloning a voice is a human-only action by design.
348
+ `)
349
+ .action(async (opts) => {
350
+ const { token, data } = await sessionLogin(opts.email, opts.password);
351
+ const user = (data.user ?? {});
352
+ const company = (data.company ?? {});
353
+ saveConfig({
354
+ session_token: token,
355
+ user_email: user.email,
356
+ session_company_id: company.id,
357
+ session_company_name: company.name,
358
+ });
359
+ agentOutput({
360
+ action: "auth.session-login",
361
+ result: {
362
+ // deliberately NOT returning the token
363
+ user_email: user.email,
364
+ company_id: company.id,
365
+ company_name: company.name,
366
+ session_saved: "~/.naive/config.json (0600)",
367
+ },
368
+ next_steps: [
369
+ { command: "naive voice clone <file> --name <name> --consent-type self --i-affirm --consenter-name <you> --attestation <text>", description: "Clone a voice you have consent for" },
370
+ { command: "naive auth logout", description: "End the human session" },
371
+ ],
372
+ hints: ["Human session active — voice clone/revoke are now available."],
373
+ });
374
+ });
375
+ authCmd
376
+ .command("logout")
377
+ .description("End the human session (server-side + local)")
378
+ .action(async () => {
379
+ const cfg = loadConfig();
380
+ if (!cfg.session_token) {
381
+ agentOutput({
382
+ action: "auth.logout",
383
+ result: { status: "no_session" },
384
+ next_steps: [{ command: "naive auth session-login --email <e> --password <p>", description: "Start a human session" }],
385
+ });
386
+ return;
387
+ }
388
+ // Invalidate server-side first; clearing only the local file would leave the token
389
+ // live for its full 30-day TTL.
390
+ try {
391
+ await sessionRequest("POST", "/v1/auth/session/logout");
392
+ }
393
+ catch {
394
+ // even if the server call fails, still clear local state below
395
+ }
396
+ clearSession();
397
+ agentOutput({
398
+ action: "auth.logout",
399
+ result: { status: "logged_out" },
400
+ next_steps: [{ command: "naive auth session-login --email <e> --password <p>", description: "Start a new human session" }],
401
+ });
402
+ });
403
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { Command } from "commander";
2
2
  import { apiRequest, handleApiError } from "../client.js";
3
3
  import { agentOutput } from "../output.js";
4
+ import { CREDIT_PACKS, packInline, packPrice, packRow } from "../lib/pricing.js";
4
5
  export const billingCmd = new Command("billing")
5
6
  .description("Manage billing — plans, subscriptions, credit packs, upgrades")
6
7
  .addHelpText("after", `
@@ -14,16 +15,13 @@ Subcommands:
14
15
  naive billing topup Buy a credit pack (returns checkout URL)
15
16
 
16
17
  Plans:
17
- Starter $49/mo 50 credits/month All primitives, system email domain
18
- Pro $149/mo 200 credits/month All primitives, custom domains, priority support
18
+ Starter $49/mo 500 credits/month All primitives, system email domain
19
+ Pro $149/mo 2000 credits/month All primitives, custom domains, priority support
19
20
 
20
21
  Credit Packs (one-time purchase):
21
- small 20 credits $10
22
- medium 50 credits $23 (Popular)
23
- large 100 credits $44 (Best Value)
24
- xl 250 credits $100
22
+ ${CREDIT_PACKS.map(packRow).join("\n")}
25
23
 
26
- New accounts start with 1 free credit — buy more anytime with a credit pack or a plan.
24
+ New accounts start with 20 free credits — buy more anytime with a credit pack or a plan.
27
25
 
28
26
  Examples:
29
27
  $ naive billing plans
@@ -167,10 +165,12 @@ billingCmd
167
165
  agentOutput({
168
166
  action: "billing.packs",
169
167
  result: resp.data,
170
- next_steps: [
171
- { command: "naive billing topup --pack medium", description: "Buy 50 credits for $23 (Popular)" },
172
- { command: "naive billing topup --pack large", description: "Buy 100 credits for $44 (Best Value)" },
173
- ],
168
+ // The badged packs, described from the same table `--help` prints and the
169
+ // API bills — never a second hand-typed "500 credits for $23".
170
+ next_steps: CREDIT_PACKS.filter((p) => p.badge).map((p) => ({
171
+ command: `naive billing topup --pack ${p.id}`,
172
+ description: `Buy ${p.credits} credits for ${packPrice(p)} (${p.badge})`,
173
+ })),
174
174
  hints: [
175
175
  `Credits remaining: ${data.credits_remaining}`,
176
176
  "Larger packs are more cost-effective",
@@ -182,7 +182,7 @@ billingCmd
182
182
  billingCmd
183
183
  .command("topup")
184
184
  .description("Purchase a credit pack — returns a checkout URL")
185
- .requiredOption("--pack <pack_id>", "Pack ID: small (20/$10), medium (50/$23), large (100/$44), xl (250/$100)")
185
+ .requiredOption("--pack <pack_id>", `Pack ID: ${CREDIT_PACKS.map(packInline).join(", ")}`)
186
186
  .action(async (opts) => {
187
187
  const resp = await apiRequest("POST", "/v1/billing/topup", { pack_id: opts.pack });
188
188
  handleApiError("billing.topup", resp);
@@ -1 +1 @@
1
- {"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/commands/billing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/commands/billing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const brainCmd: Command;