@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
package/dist/output.js CHANGED
@@ -2,8 +2,201 @@
2
2
  * Agent-native structured output for CLI responses.
3
3
  * Every tool call returns JSON with result data + contextual guidance
4
4
  * following the Meow/Lindy pattern for agentic CLI usage.
5
+ *
6
+ * Output mode is OPT-IN human (default machine JSON). Human mode is NEVER inferred from isTTY —
7
+ * a pty-wrapped caller (Claude Code's Bash tool, script(1), tmux, ssh -t, CI runners) reports
8
+ * isTTY===true with no human present, so auto-detect would hang agents in prompts and break their
9
+ * JSON.parse. Machine overrides (--json / NAIVE_JSON / CI) always win.
5
10
  */
11
+ import chalk from "chalk";
12
+ import { loadConfig, saveConfig } from "./config.js";
13
+ let _flagJson = false;
14
+ let _flagHuman = false;
15
+ /** Set by the global --json / --human options in index.ts, parsed before any action runs. */
16
+ export function setOutputFlags(opts) {
17
+ if (opts.json)
18
+ _flagJson = true;
19
+ if (opts.human)
20
+ _flagHuman = true;
21
+ }
22
+ function machineForced() {
23
+ return _flagJson || !!process.env.NAIVE_JSON || !!process.env.CI;
24
+ }
25
+ /** TRUE only on an explicit opt-in; default false. Controls OUTPUT FORMAT. */
26
+ export function humanMode() {
27
+ if (machineForced())
28
+ return false;
29
+ if (_flagHuman || process.env.NAIVE_HUMAN === "1")
30
+ return true;
31
+ try {
32
+ return loadConfig().output === "human";
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ /** Prompts (wizard, destructive confirm) require human mode AND a real interactive stdin — a
39
+ * separate predicate from output format, so a human piping stdout to `tee` still gets the confirm. */
40
+ export function isInteractive() {
41
+ return humanMode() && !!process.stdin.isTTY;
42
+ }
43
+ // One-time stderr nudge so a founder discovers human mode without polluting stdout (stays parseable JSON).
44
+ function maybeDiscoveryHint() {
45
+ if (!process.stdout.isTTY)
46
+ return;
47
+ if (_flagJson || _flagHuman || process.env.NAIVE_JSON || process.env.NAIVE_HUMAN || process.env.CI)
48
+ return;
49
+ let cfg;
50
+ try {
51
+ cfg = loadConfig();
52
+ }
53
+ catch {
54
+ return;
55
+ }
56
+ if (cfg.output !== undefined || cfg.human_hint_shown)
57
+ return;
58
+ process.stderr.write(chalk.dim("\n💡 tip: run `naive config output human` for friendly, readable output.\n"));
59
+ try {
60
+ saveConfig({ human_hint_shown: true });
61
+ }
62
+ catch {
63
+ /* best-effort */
64
+ }
65
+ }
66
+ // Secret guard (security HIGH-2): a key must be shown ONCE, clearly labeled, and NEVER rendered as a
67
+ // runnable/highlighted command (the copy-into-shell-history footgun).
68
+ const SECRET_TOKEN_RE = /nv_sk_[A-Za-z0-9_]+/;
69
+ function isSecretField(key) {
70
+ return key === "api_key" || key === "session_token" || key === "token";
71
+ }
72
+ function fmtVal(v) {
73
+ if (v === null || v === undefined)
74
+ return chalk.dim("—");
75
+ if (typeof v === "object")
76
+ return chalk.dim(JSON.stringify(v));
77
+ return String(v);
78
+ }
79
+ function renderHuman(o) {
80
+ const w = (s) => process.stdout.write(s);
81
+ w(chalk.green.bold(`✓ ${o.action}\n`));
82
+ if (o.result && typeof o.result === "object") {
83
+ for (const [k, v] of Object.entries(o.result)) {
84
+ if (isSecretField(k) && typeof v === "string") {
85
+ w("\n" + chalk.yellow.bold(` ⚠ ${k} — save this now, it won't be shown again:`) + "\n");
86
+ w(" " + chalk.cyan(v) + "\n\n");
87
+ }
88
+ else {
89
+ w(" " + chalk.dim(`${k}:`) + " " + fmtVal(v) + "\n");
90
+ }
91
+ }
92
+ }
93
+ else if (o.result !== null && o.result !== undefined) {
94
+ w(" " + String(o.result) + "\n");
95
+ }
96
+ if (o.hints?.length) {
97
+ w("\n");
98
+ for (const h of o.hints)
99
+ w(chalk.dim(` • ${h}`) + "\n");
100
+ }
101
+ // next_steps as suggested commands — but NEVER one carrying a raw key (secret guard).
102
+ const safe = (o.next_steps ?? []).filter((s) => !SECRET_TOKEN_RE.test(s.command));
103
+ if (safe.length) {
104
+ w("\n" + chalk.dim(" Next:") + "\n");
105
+ for (const s of safe)
106
+ w(" " + chalk.cyan(s.command) + chalk.dim(` — ${s.description}`) + "\n");
107
+ }
108
+ // help_markdown is intentionally NOT rendered in human mode: it's verbose and (in keys create) the
109
+ // place a raw secret would live. The JSON path keeps it for agents.
110
+ }
111
+ function renderHumanError(o) {
112
+ const w = (s) => process.stderr.write(s);
113
+ w(chalk.red.bold(`✗ ${o.action} failed`) + "\n");
114
+ if (o.error.message)
115
+ w(" " + o.error.message + "\n");
116
+ if (o.error.hint)
117
+ w(chalk.dim(" hint: " + o.error.hint) + "\n");
118
+ }
119
+ /**
120
+ * The SINGLE derivation point for the human-readable "Cost:" hint (N7). Reads
121
+ * the authoritative `credits_used` off a response/result object — the exact
122
+ * number the API billed and dropped from the balance — and formats it so the
123
+ * hint can NEVER drift from what was actually charged. Previously commands
124
+ * hardcoded strings like "Cost: 1 credit" while the API charged 10; deriving
125
+ * from the response is the only way to keep them in lockstep.
126
+ *
127
+ * Returns undefined when there is nothing (yet) to charge — the field is
128
+ * absent, or a job is still queued/processing/failed (credits_used is null) —
129
+ * so callers can spread it into a hints array and no line appears.
130
+ */
131
+ export function creditCostHint(result) {
132
+ const raw = result?.credits_used;
133
+ if (typeof raw !== "number" || !Number.isFinite(raw) || raw <= 0)
134
+ return undefined;
135
+ // Trim binary float noise (e.g. 0.30000000000000004) without inventing precision.
136
+ const credits = Math.round(raw * 10000) / 10000;
137
+ return `Cost: ${credits} ${credits === 1 ? "credit" : "credits"}`;
138
+ }
139
+ /**
140
+ * The submit-time counterpart of creditCostHint (N6). Reads a job-submission
141
+ * response's `estimated_credits` — the API's pre-flight quote, derived from the
142
+ * SAME getFalPrice() + usdToCredits() source that settles the final charge — so
143
+ * a customer sees the spend before and at submit, and the echoed number tracks
144
+ * what will actually be billed. Returns undefined when no estimate is present.
145
+ */
146
+ export function creditEstimateHint(result) {
147
+ const raw = result?.estimated_credits;
148
+ if (typeof raw !== "number" || !Number.isFinite(raw) || raw <= 0)
149
+ return undefined;
150
+ const credits = Math.round(raw * 10000) / 10000;
151
+ return `Estimated cost: ${credits} ${credits === 1 ? "credit" : "credits"} (charged only on successful completion)`;
152
+ }
153
+ // A pending, non-fatal update notice discovered by the client layer (from the
154
+ // server version handshake). It rides along on the next successful agentOutput
155
+ // and is cleared once emitted, so it surfaces exactly once per command.
156
+ let _pendingUpdate;
157
+ /** Stash a pending update notice for the next agentOutput call (client layer → output). */
158
+ export function setPendingUpdate(info) {
159
+ _pendingUpdate = info;
160
+ }
161
+ // The same one-shot mechanism for a deprecation notice, set by lib/deprecation.ts
162
+ // from a commander preAction hook. It rides the next successful envelope and is
163
+ // cleared once emitted, so it appears exactly once per command.
164
+ let _pendingDeprecation;
165
+ /** Stash a pending deprecation notice for the next agentOutput call. */
166
+ export function setPendingDeprecation(notice) {
167
+ _pendingDeprecation = notice;
168
+ }
169
+ /** Test seam: read the pending notice without emitting it. */
170
+ export function peekPendingDeprecation() {
171
+ return _pendingDeprecation;
172
+ }
6
173
  export function agentOutput(opts) {
174
+ agentOutputExit(opts);
175
+ }
176
+ /**
177
+ * `agentOutput` plus an explicit process exit code — the mechanism behind the
178
+ * exit-code ladder of 06 §1.3. Exit 2 is "success, and a diff exists"
179
+ * (terraform's `-detailed-exitcode`); exit 3 is "success, and the terminal state
180
+ * is not success" — a CI script reading 0 as "the work is done" would otherwise
181
+ * count an `unverified` task as a pass.
182
+ *
183
+ * It sets `process.exitCode` rather than calling `process.exit()`: the payload it
184
+ * just wrote may still be buffered when stdout is a pipe, and `process.exit()`
185
+ * truncates it. Setting the code lets Node drain and then exit with it.
186
+ */
187
+ export function agentOutputExit(opts) {
188
+ // Consume any pending notices first (so they're cleared even in human mode),
189
+ // then take the human-mode early return.
190
+ const update = _pendingUpdate;
191
+ _pendingUpdate = undefined;
192
+ const deprecation = _pendingDeprecation;
193
+ _pendingDeprecation = undefined;
194
+ if (opts.exitCode)
195
+ process.exitCode = opts.exitCode;
196
+ if (humanMode()) {
197
+ renderHuman(opts);
198
+ return;
199
+ }
7
200
  const output = {
8
201
  success: true,
9
202
  action: opts.action,
@@ -12,10 +205,17 @@ export function agentOutput(opts) {
12
205
  ...(opts.hints && { hints: opts.hints }),
13
206
  ...(opts.related_commands && { related_commands: opts.related_commands }),
14
207
  ...(opts.help_markdown && { help_markdown: opts.help_markdown }),
208
+ ...(update && { update }),
209
+ ...(deprecation && { deprecation }),
15
210
  };
16
211
  console.log(JSON.stringify(output, null, 2));
212
+ maybeDiscoveryHint();
17
213
  }
18
214
  export function agentError(opts) {
215
+ if (humanMode()) {
216
+ renderHumanError(opts);
217
+ process.exit(1);
218
+ }
19
219
  const output = {
20
220
  success: false,
21
221
  action: opts.action,
@@ -25,22 +225,79 @@ export function agentError(opts) {
25
225
  console.error(JSON.stringify(output, null, 2));
26
226
  process.exit(1);
27
227
  }
228
+ /**
229
+ * 06 §1.8 — when a response body carries a governance `verdict`, the DECISION
230
+ * POINT knows the recovery and the CLI's local `switch (code)` does not. The
231
+ * whole point of the denial envelope is that a model recovers instead of
232
+ * looping, and a hand-written table that overwrites the server's steps defeats
233
+ * it. So: a body with a `verdict` and a well-formed `recovery[]` renders the
234
+ * server's steps verbatim, and `getRecoverySteps` is not consulted.
235
+ *
236
+ * Both gates are required. `verdict` alone with no recovery falls back (the
237
+ * server said nothing actionable); `recovery` alone with no verdict is ignored,
238
+ * so this cannot become a way for any endpoint to rewrite the CLI's advice.
239
+ * Each step is validated field by field — an entry that is not
240
+ * `{command:string, description:string}` is dropped rather than printed as
241
+ * `undefined`.
242
+ */
243
+ export function serverRecoverySteps(data) {
244
+ if (typeof data !== "object" || data === null)
245
+ return undefined;
246
+ const body = data;
247
+ const verdict = body.verdict ?? body.error?.verdict;
248
+ if (typeof verdict !== "string" || verdict.length === 0)
249
+ return undefined;
250
+ const raw = body.recovery ?? body.error?.recovery;
251
+ if (!Array.isArray(raw))
252
+ return undefined;
253
+ const steps = [];
254
+ for (const entry of raw) {
255
+ if (typeof entry !== "object" || entry === null)
256
+ continue;
257
+ const { command, description, when } = entry;
258
+ if (typeof command !== "string" || typeof description !== "string")
259
+ continue;
260
+ steps.push({ command, description, ...(typeof when === "string" && { when }) });
261
+ }
262
+ return steps.length > 0 ? steps : undefined;
263
+ }
28
264
  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
- });
265
+ // Accept Naive `{ error: { code, message } }`, proxy shapes where `error` is a
266
+ // string (Supabase Storage), or a bare `{ message }` — never collapse to opaque
267
+ // `unknown` when the upstream already said something useful.
268
+ const payload = data && typeof data === "object" ? data : null;
269
+ const rawError = payload?.error;
270
+ let details;
271
+ if (rawError && typeof rawError === "object" && !Array.isArray(rawError)) {
272
+ details = rawError;
273
+ }
274
+ else if (typeof rawError === "string" && rawError) {
275
+ const message = typeof payload?.message === "string" && payload.message ? payload.message : rawError;
276
+ details = { code: "upstream_error", message };
277
+ }
278
+ else if (typeof payload?.message === "string" && payload.message) {
279
+ details = { code: "upstream_error", message: payload.message };
36
280
  }
37
- else {
281
+ if (details) {
38
282
  agentError({
39
283
  action,
40
- error: { code: "unknown", message: "Unexpected error response" },
41
- recovery_steps: [{ command: "naive status", description: "Check API connectivity and auth status" }],
284
+ error: details,
285
+ // A governance denial carries its own recovery — the DECISION POINT knows
286
+ // the way out and this local table does not. Server steps win when both
287
+ // gates in serverRecoverySteps() are satisfied.
288
+ recovery_steps: serverRecoverySteps(data) ?? getRecoverySteps(details.code),
42
289
  });
290
+ return;
43
291
  }
292
+ agentError({
293
+ action,
294
+ error: {
295
+ code: "unknown",
296
+ message: "Unexpected error response",
297
+ body_snippet: data == null ? undefined : JSON.stringify(data).slice(0, 300),
298
+ },
299
+ recovery_steps: getRecoverySteps("unknown"),
300
+ });
44
301
  }
45
302
  function getRecoverySteps(code) {
46
303
  switch (code) {
@@ -51,15 +308,15 @@ function getRecoverySteps(code) {
51
308
  ];
52
309
  case "insufficient_credits":
53
310
  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)" },
311
+ { command: "naive billing topup --pack medium", description: "Buy 500 credits for $23 (Popular)" },
312
+ { command: "naive billing topup --pack large", description: "Buy 1000 credits for $44 (Best Value)" },
313
+ { command: "naive billing upgrade --plan pro", description: "Upgrade to Pro (2000 credits/mo, $149/mo)" },
57
314
  { command: "naive billing packs", description: "See all available credit packs" },
58
315
  ];
59
316
  case "billing_blocked":
60
317
  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)" },
318
+ { command: "naive billing subscribe --plan starter", description: "Subscribe to Starter ($49/mo, 500 credits)" },
319
+ { command: "naive billing subscribe --plan pro", description: "Subscribe to Pro ($149/mo, 2000 credits)" },
63
320
  { command: "naive billing plans", description: "Compare all plans" },
64
321
  ];
65
322
  case "rate_limited":
@@ -75,6 +332,28 @@ function getRecoverySteps(code) {
75
332
  return [
76
333
  { command: "naive <command> --help", description: "See required parameters and examples" },
77
334
  ];
335
+ case "voice_revoked":
336
+ return [
337
+ { command: "naive voice list", description: "List voices that are still available" },
338
+ { command: "# this voice's consent was revoked", description: "Pick another voice, or have an admin re-create it in the Studio UI" },
339
+ ];
340
+ case "voice_reclone_required":
341
+ return [
342
+ { command: "naive voice list", description: "Check the voice's tier/status" },
343
+ { command: "# the requested tier has no clone", description: "Use the voice's native tier, or have an admin re-clone for that tier in Studio" },
344
+ ];
345
+ // Transport-level failure: the gateway returned a non-JSON body (502/503/504
346
+ // HTML page). Idempotent GETs were already retried in the client; a failed POST
347
+ // (e.g. llm chat) is NOT auto-retried to avoid a double-charge — the user retries.
348
+ case "upstream_error":
349
+ return [
350
+ { command: "# retry — gateway timeouts (502/504) are usually transient", description: "Re-run your command in a moment" },
351
+ { command: "naive status", description: "Check API connectivity" },
352
+ {
353
+ command: 'naive report "<what failed>" --command "<the command you ran>" --kind error',
354
+ description: "Report it to the naive team if it persists",
355
+ },
356
+ ];
78
357
  // Genuinely-broken-on-our-side codes — these are worth reporting (unlike the
79
358
  // self-correctable cases above). Retry first (often transient), then report.
80
359
  case "provider_error":
@@ -86,9 +365,24 @@ function getRecoverySteps(code) {
86
365
  description: "Report it to the naive team if it persists",
87
366
  },
88
367
  ];
368
+ // Opaque / unexpected failures (non-JSON gateway body already mapped, or API
369
+ // returned an untyped error). Agents only file tickets when recovery_steps
370
+ // tell them to — without this, `unknown` silently becomes "check status".
371
+ case "unknown":
372
+ return [
373
+ { command: "naive status", description: "Check API connectivity and auth status" },
374
+ {
375
+ command: 'naive report "<what failed — paste the error JSON>" --command "<the command you ran>" --kind error',
376
+ description: "File a tracked report — unexpected errors are product bugs until proven otherwise",
377
+ },
378
+ ];
89
379
  default:
90
380
  return [
91
381
  { command: "naive status", description: "Check API connectivity and auth status" },
382
+ {
383
+ command: 'naive report "<what failed — paste the error JSON>" --command "<the command you ran>" --kind error',
384
+ description: "If this is not a credits/auth/invalid-input issue you can fix yourself, report it",
385
+ },
92
386
  ];
93
387
  }
94
388
  }
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /** Free-text answer. Returns null on timeout/abort. */
2
+ export declare function ask(label: string, opts?: {
3
+ default?: string;
4
+ }): Promise<string | null>;
5
+ /** Yes/No. Default NO (returns false on timeout, empty, or anything not starting with y). */
6
+ export declare function confirm(label: string): Promise<boolean>;
7
+ /** Affirmation: Enter (empty) OR 'y' = affirm; 'n'/anything else/timeout = cancel. For consent
8
+ * disclosures where the user has read the terms and presses Enter to take responsibility. */
9
+ export declare function affirm(label: string): Promise<boolean>;
10
+ /** Type-to-confirm for irreversible actions (GitHub-delete pattern). True only if the typed text
11
+ * matches `expected` exactly. Default-deny on timeout/mismatch. */
12
+ export declare function confirmExact(label: string, expected: string): Promise<boolean>;
13
+ /** Numbered single-select. Returns the chosen value, or null on timeout/invalid. */
14
+ export declare function select(label: string, choices: {
15
+ value: string;
16
+ label: string;
17
+ }[]): Promise<string | null>;
package/dist/prompt.js ADDED
@@ -0,0 +1,70 @@
1
+ // Minimal interactive prompts built on Node's built-in readline/promises — NO new dependency
2
+ // (deliberate: this is a credential-handling CLI; a prompt lib would run in the same process as the
3
+ // session token + api_key). Every prompt has a hard timeout that resolves to a SAFE default, so a
4
+ // pty-wrapped caller that somehow reaches a prompt times out into abort instead of hanging forever.
5
+ // Callers MUST gate these on isInteractive() (human mode + interactive stdin) — these helpers do not
6
+ // re-check that themselves.
7
+ import * as readline from "node:readline/promises";
8
+ const DEFAULT_TIMEOUT_MS = 30_000;
9
+ async function question(q, timeoutMs = DEFAULT_TIMEOUT_MS) {
10
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
11
+ let timer;
12
+ try {
13
+ const timeout = new Promise((resolve) => {
14
+ timer = setTimeout(() => {
15
+ process.stdout.write("\n(timed out — aborting)\n");
16
+ resolve(null);
17
+ }, timeoutMs);
18
+ });
19
+ const answer = rl.question(q).then((a) => a);
20
+ const result = await Promise.race([answer, timeout]);
21
+ return result;
22
+ }
23
+ finally {
24
+ if (timer)
25
+ clearTimeout(timer);
26
+ rl.close();
27
+ }
28
+ }
29
+ /** Free-text answer. Returns null on timeout/abort. */
30
+ export async function ask(label, opts = {}) {
31
+ const suffix = opts.default ? ` [${opts.default}]` : "";
32
+ const a = await question(`${label}${suffix}: `);
33
+ if (a === null)
34
+ return null;
35
+ const trimmed = a.trim();
36
+ return trimmed === "" && opts.default !== undefined ? opts.default : trimmed;
37
+ }
38
+ /** Yes/No. Default NO (returns false on timeout, empty, or anything not starting with y). */
39
+ export async function confirm(label) {
40
+ const a = await question(`${label} (y/N): `);
41
+ return a !== null && a.trim().toLowerCase().startsWith("y");
42
+ }
43
+ /** Affirmation: Enter (empty) OR 'y' = affirm; 'n'/anything else/timeout = cancel. For consent
44
+ * disclosures where the user has read the terms and presses Enter to take responsibility. */
45
+ export async function affirm(label) {
46
+ const a = await question(`${label} [Enter to affirm, 'n' to cancel]: `);
47
+ if (a === null)
48
+ return false; // timeout = cancel (safe)
49
+ const t = a.trim().toLowerCase();
50
+ return t === "" || t.startsWith("y");
51
+ }
52
+ /** Type-to-confirm for irreversible actions (GitHub-delete pattern). True only if the typed text
53
+ * matches `expected` exactly. Default-deny on timeout/mismatch. */
54
+ export async function confirmExact(label, expected) {
55
+ const a = await question(`${label}: `);
56
+ return a !== null && a.trim() === expected;
57
+ }
58
+ /** Numbered single-select. Returns the chosen value, or null on timeout/invalid. */
59
+ export async function select(label, choices) {
60
+ process.stdout.write(`${label}\n`);
61
+ choices.forEach((c, i) => process.stdout.write(` ${i + 1}) ${c.label}\n`));
62
+ const a = await question(`Choose 1-${choices.length}: `);
63
+ if (a === null)
64
+ return null;
65
+ const n = parseInt(a.trim(), 10);
66
+ if (Number.isNaN(n) || n < 1 || n > choices.length)
67
+ return null;
68
+ return choices[n - 1].value;
69
+ }
70
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usenaive-sdk/cli",
3
- "version": "0.12.2",
3
+ "version": "0.13.0",
4
4
  "type": "module",
5
5
  "description": "Naïve CLI — provision and govern a real-world agent profile per agent (identity, card, comms, runtime). Formerly @usenaive/cli.",
6
6
  "license": "MIT",
@@ -14,18 +14,23 @@
14
14
  "access": "public"
15
15
  },
16
16
  "dependencies": {
17
- "commander": "^13.1.0",
18
17
  "chalk": "^5.4.1",
19
- "jiti": "^2.4.2"
18
+ "commander": "^13.1.0",
19
+ "jiti": "^2.4.2",
20
+ "semver": "^7.6.3",
21
+ "update-notifier": "^7.3.1"
20
22
  },
21
23
  "devDependencies": {
22
- "@types/node": "^22.15.3",
24
+ "@types/node": "^22.19.17",
25
+ "@types/semver": "^7.5.8",
23
26
  "tsx": "^4.19.4",
24
- "typescript": "^5.7.3"
27
+ "typescript": "^5.7.3",
28
+ "vitest": "^2.1.9"
25
29
  },
26
30
  "scripts": {
27
31
  "dev": "tsx src/index.ts",
28
32
  "build": "tsc",
29
- "typecheck": "tsc --noEmit"
33
+ "typecheck": "tsc --noEmit",
34
+ "test": "vitest run"
30
35
  }
31
36
  }
@@ -1,2 +0,0 @@
1
- import { Command } from "commander";
2
- export declare const billingClientCmd: Command;