@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,244 @@
1
+ import { Command } from "commander";
2
+ import { apiRequest, sessionRequest, handleApiError, activeUserId } from "../client.js";
3
+ import { agentOutput, agentError } from "../output.js";
4
+ export const walletCmd = new Command("wallet")
5
+ .description("Wallet — the agent's crypto wallet, its balance, and its spend policy")
6
+ .addHelpText("after", `
7
+ Subcommands:
8
+ naive wallet show Show the agent's wallet (address, network, custody)
9
+ naive wallet balance Read USDC balances
10
+
11
+ Operator subcommands (human-only — see Governance):
12
+ naive wallet create Provision the wallet
13
+ naive wallet fund Credit it from the treasury or a testnet faucet
14
+ naive wallet transfer Send USDC to an address or another agent
15
+ naive wallet policy Set the spend policy (per-tx max / daily budget)
16
+ naive wallet sweep Drain it back to the treasury (decommission)
17
+
18
+ How it works:
19
+ Each agent gets its own crypto wallet. The agent SPENDS from it via
20
+ 'naive payments pay' (x402), but cannot administer it — funding, transferring,
21
+ re-policying and sweeping are the operator surface.
22
+
23
+ Spend control:
24
+ There is NO approval queue here, and that is deliberate — unlike cards and
25
+ trading, the cap is enforced inside the custody plane at signing time:
26
+ 1. Balance is the primary budget — an agent can never spend what isn't there.
27
+ 2. perTxMax is enforced TWICE: at runtime, AND as a static account policy in
28
+ the custody plane. The second check survives a fully compromised runtime,
29
+ which an approval queue would not.
30
+ 3. dailyBudget (optional) is a rolling runtime counter.
31
+ Fund the wallet with what you can afford to lose, and set perTxMax.
32
+
33
+ Governance:
34
+ create/fund/transfer/policy/sweep require an OPERATOR credential — a signed-in
35
+ session ('naive auth login'), or an api key minted with the "wallet:admin"
36
+ scope for CI. An agent's key is refused. Reads (show/balance) are agent-safe.
37
+
38
+ Examples:
39
+ $ naive use alice
40
+ $ naive wallet create
41
+ $ naive wallet policy --per-tx-max 1.00 --daily-budget 10.00
42
+ $ naive wallet fund --amount 5.00 --source faucet
43
+ $ naive wallet balance
44
+ $ naive wallet transfer --to 0xabc... --amount 1.50 --purpose "settle invoice"
45
+ $ naive wallet sweep
46
+ `);
47
+ /**
48
+ * The user-scoped wallet base. `wallet` has no company-level mount, so a
49
+ * subject is required. Operator verbs go through sessionRequest (which does no
50
+ * path rewriting), so they need the resolved path up front.
51
+ */
52
+ function walletBase(action) {
53
+ const userId = activeUserId();
54
+ if (!userId) {
55
+ agentError({
56
+ action,
57
+ error: {
58
+ code: "no_active_user",
59
+ message: "The wallet is per-agent, so this command needs an active user.",
60
+ hint: "Select one with 'naive use <user>'. Unlike cards, the wallet has no company-level fallback — it exists only per-agent.",
61
+ },
62
+ recovery_steps: [
63
+ { command: "naive users list", description: "List the tenant users" },
64
+ { command: "naive use <user>", description: "Set the active user" },
65
+ ],
66
+ });
67
+ process.exit(1);
68
+ }
69
+ return `/v1/users/${userId}/wallet`;
70
+ }
71
+ walletCmd
72
+ .command("show")
73
+ .description("Show the agent's crypto wallet")
74
+ .action(async () => {
75
+ const resp = await apiRequest("GET", "/v1/wallet");
76
+ if (resp.status === 404) {
77
+ agentError({
78
+ action: "wallet.show",
79
+ error: {
80
+ code: "no_wallet",
81
+ message: "This agent has no wallet yet.",
82
+ hint: "Provision one with 'naive wallet create', or declare has.crypto on the agent in naive.config.ts.",
83
+ },
84
+ recovery_steps: [{ command: "naive wallet create", description: "Provision the wallet" }],
85
+ });
86
+ return;
87
+ }
88
+ handleApiError("wallet.show", resp);
89
+ agentOutput({
90
+ action: "wallet.show",
91
+ result: resp.data,
92
+ next_steps: [
93
+ { command: "naive wallet balance", description: "Read the USDC balance" },
94
+ { command: "naive payments receipts", description: "See what it has paid for" },
95
+ ],
96
+ related_commands: ["naive wallet balance", "naive payments pay"],
97
+ });
98
+ });
99
+ walletCmd
100
+ .command("balance")
101
+ .description("Read the wallet's USDC balances")
102
+ .option("--network <network>", "Filter to one network (CAIP-2, e.g. eip155:8453)")
103
+ .action(async (opts) => {
104
+ const query = opts.network ? `?network=${encodeURIComponent(opts.network)}` : "";
105
+ const resp = await apiRequest("GET", `/v1/wallet/balances${query}`);
106
+ handleApiError("wallet.balance", resp);
107
+ // getBalances returns a bare WalletBalance[] (not { balances: [...] }).
108
+ const balances = Array.isArray(resp.data) ? resp.data : [];
109
+ const usdc = balances.find((b) => b.asset === "USDC");
110
+ agentOutput({
111
+ action: "wallet.balance",
112
+ result: resp.data,
113
+ next_steps: [{ command: "naive payments pay --url <url>", description: "Pay for an x402 resource" }],
114
+ hints: [
115
+ usdc
116
+ ? `USDC balance: ${usdc.amount}. The balance IS the budget — an agent cannot spend past it.`
117
+ : "No USDC balance. Fund the wallet with 'naive wallet fund' before paying.",
118
+ ],
119
+ related_commands: ["naive wallet fund", "naive wallet show"],
120
+ });
121
+ });
122
+ walletCmd
123
+ .command("create")
124
+ .description("Provision the agent's wallet (OPERATOR)")
125
+ .option("--custody <custody>", "Custody backend: cdp | local | fake (default: the configured provider)")
126
+ .option("--network <network>", "Network to provision on (CAIP-2, e.g. eip155:8453)")
127
+ .option("--per-tx-max <amount>", "Max value of a single payment, decimal USDC (e.g. 1.00)")
128
+ .option("--daily-budget <amount>", "Optional rolling daily cap, decimal USDC")
129
+ .option("--smart-account", "Provision as a smart account")
130
+ .action(async (opts) => {
131
+ const policy = opts.perTxMax || opts.dailyBudget
132
+ ? { perTxMax: opts.perTxMax, dailyBudget: opts.dailyBudget }
133
+ : undefined;
134
+ const resp = await sessionRequest("POST", walletBase("wallet.create"), {
135
+ body: {
136
+ ...(opts.custody && { custody: opts.custody }),
137
+ ...(opts.network && { networks: [opts.network] }),
138
+ ...(policy && { policy }),
139
+ ...(opts.smartAccount && { smartAccount: true }),
140
+ },
141
+ });
142
+ handleApiError("wallet.create", resp);
143
+ agentOutput({
144
+ action: "wallet.create",
145
+ result: resp.data,
146
+ next_steps: [
147
+ { command: "naive wallet policy --per-tx-max 1.00", description: "Set the spend cap" },
148
+ { command: "naive wallet fund --amount 5.00 --source faucet", description: "Fund it" },
149
+ ],
150
+ hints: [
151
+ "Provisioning is idempotent — re-running returns the existing wallet.",
152
+ "perTxMax is written into the custody plane as a static account policy, so it holds even if the agent runtime is compromised.",
153
+ ],
154
+ related_commands: ["naive wallet fund", "naive wallet policy"],
155
+ });
156
+ });
157
+ walletCmd
158
+ .command("fund")
159
+ .description("Credit the wallet from the treasury or a testnet faucet (OPERATOR)")
160
+ .requiredOption("--amount <amount>", "Decimal USDC amount (e.g. 5.00)")
161
+ .requiredOption("--source <source>", "treasury | faucet (faucet is testnet only)")
162
+ .option("--asset <asset>", "Asset to credit (default: USDC)")
163
+ .action(async (opts) => {
164
+ const resp = await sessionRequest("POST", `${walletBase("wallet.fund")}/fund`, {
165
+ body: { amount: opts.amount, source: opts.source, ...(opts.asset && { asset: opts.asset }) },
166
+ });
167
+ handleApiError("wallet.fund", resp);
168
+ agentOutput({
169
+ action: "wallet.fund",
170
+ result: resp.data,
171
+ next_steps: [{ command: "naive wallet balance", description: "Confirm the credit landed" }],
172
+ hints: ["The balance is the agent's real budget — fund only what you can afford to lose."],
173
+ related_commands: ["naive wallet balance", "naive wallet policy"],
174
+ });
175
+ });
176
+ walletCmd
177
+ .command("transfer")
178
+ .description("Send USDC from the wallet to an address or another agent (OPERATOR)")
179
+ .requiredOption("--to <to>", "Destination address, or an agent id to target that agent's wallet")
180
+ .requiredOption("--amount <amount>", "Decimal USDC amount")
181
+ .requiredOption("--purpose <purpose>", "Why — recorded on the transfer for audit")
182
+ .option("--asset <asset>", "Asset (default: USDC)")
183
+ .option("--network <network>", "Network (CAIP-2)")
184
+ .action(async (opts) => {
185
+ const resp = await sessionRequest("POST", `${walletBase("wallet.transfer")}/transfer`, {
186
+ body: {
187
+ to: opts.to,
188
+ amount: opts.amount,
189
+ purpose: opts.purpose,
190
+ ...(opts.asset && { asset: opts.asset }),
191
+ ...(opts.network && { network: opts.network }),
192
+ },
193
+ });
194
+ handleApiError("wallet.transfer", resp);
195
+ agentOutput({
196
+ action: "wallet.transfer",
197
+ result: resp.data,
198
+ next_steps: [{ command: "naive wallet balance", description: "Confirm the new balance" }],
199
+ hints: ["Transfers are bounded by the wallet's perTxMax, the same cap that bounds agent payments."],
200
+ related_commands: ["naive wallet balance", "naive wallet policy"],
201
+ });
202
+ });
203
+ walletCmd
204
+ .command("policy")
205
+ .description("Set the wallet's spend policy (OPERATOR)")
206
+ .requiredOption("--per-tx-max <amount>", "Max value of a single payment, decimal USDC (required)")
207
+ .option("--daily-budget <amount>", "Optional rolling daily cap, decimal USDC")
208
+ .action(async (opts) => {
209
+ const resp = await sessionRequest("POST", `${walletBase("wallet.policy")}/policy`, {
210
+ body: {
211
+ policy: { perTxMax: opts.perTxMax, ...(opts.dailyBudget && { dailyBudget: opts.dailyBudget }) },
212
+ },
213
+ });
214
+ handleApiError("wallet.policy", resp);
215
+ agentOutput({
216
+ action: "wallet.policy",
217
+ result: resp.data,
218
+ next_steps: [{ command: "naive wallet show", description: "Read back the wallet" }],
219
+ hints: [
220
+ "perTxMax is now enforced twice — at runtime AND re-issued into the custody plane, so it holds at signing time even if the agent runtime is compromised.",
221
+ "If the custody plane can't be reached the change fails and nothing is saved, rather than storing a cap that isn't really enforced.",
222
+ "The spend policy is the control that replaces an approval queue for payments.",
223
+ ],
224
+ related_commands: ["naive wallet show", "naive payments receipts"],
225
+ });
226
+ });
227
+ walletCmd
228
+ .command("sweep")
229
+ .description("Drain the wallet back to the treasury — decommission (OPERATOR)")
230
+ .option("--to <address>", "Destination address (default: the treasury)")
231
+ .action(async (opts) => {
232
+ const resp = await sessionRequest("POST", `${walletBase("wallet.sweep")}/sweep`, {
233
+ body: { ...(opts.to && { to: opts.to }) },
234
+ });
235
+ handleApiError("wallet.sweep", resp);
236
+ agentOutput({
237
+ action: "wallet.sweep",
238
+ result: resp.data,
239
+ next_steps: [{ command: "naive wallet balance", description: "Confirm the wallet is drained" }],
240
+ hints: ["Sweeping moves the funds out but does not delete the wallet — the agent simply has nothing to spend."],
241
+ related_commands: ["naive wallet balance", "naive wallet show"],
242
+ });
243
+ });
244
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { Command } from "commander";
2
2
  import { apiRequest, handleApiError } from "../client.js";
3
+ import { loadConfig } from "../config.js";
3
4
  import { agentOutput } from "../output.js";
4
5
  export const whoamiCmd = new Command("whoami")
5
6
  .description("Display current authenticated agent identity and company context")
@@ -20,9 +21,21 @@ Use this to:
20
21
  const resp = await apiRequest("GET", "/v1/auth/me");
21
22
  handleApiError("whoami", resp);
22
23
  const data = resp.data;
24
+ // WHICH PROJECT AM I IN is half of "who am I" now. The selection is local
25
+ // (`naive projects use` / `naive use`) and every command silently carries
26
+ // it, so an answer that omits it lets an operator read a `staging` result as
27
+ // a production one.
28
+ const config = loadConfig();
23
29
  agentOutput({
24
30
  action: "whoami",
25
- result: data,
31
+ result: {
32
+ ...data,
33
+ organization_id: data.company_id,
34
+ organization_name: data.company_name,
35
+ active_project_id: config.active_project_id ?? null,
36
+ active_project_name: config.active_project_name ?? null,
37
+ active_child_project_id: config.active_user_id ?? null,
38
+ },
26
39
  next_steps: [
27
40
  { command: "naive status", description: "See full status including credits and resources" },
28
41
  { command: "naive companies", description: "List all companies you have access to" },
@@ -30,6 +43,9 @@ Use this to:
30
43
  ],
31
44
  hints: [
32
45
  `Currently operating as "${data.agent_name}" under "${data.company_name}"`,
46
+ config.active_project_id
47
+ ? `Inside project ${config.active_project_name ?? config.active_project_id}.`
48
+ : "Inside the organization's default project (`naive projects use <id>` to switch).",
33
49
  ],
34
50
  related_commands: ["naive status", "naive companies", "naive identity", "naive keys list"],
35
51
  });
@@ -1 +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"}
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,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,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,0EAA0E;IAC1E,0EAA0E;IAC1E,6EAA6E;IAC7E,oBAAoB;IACpB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,WAAW,CAAC;QACV,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE;YACN,GAAG,IAAI;YACP,eAAe,EAAE,IAAI,CAAC,UAAU;YAChC,iBAAiB,EAAE,IAAI,CAAC,YAAY;YACpC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,IAAI;YACnD,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,IAAI;YACvD,uBAAuB,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;SACvD;QACD,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;YAC1E,MAAM,CAAC,iBAAiB;gBACtB,CAAC,CAAC,kBAAkB,MAAM,CAAC,mBAAmB,IAAI,MAAM,CAAC,iBAAiB,GAAG;gBAC7E,CAAC,CAAC,kFAAkF;SACvF;QACD,gBAAgB,EAAE,CAAC,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC;KAC3F,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/config.d.ts CHANGED
@@ -4,9 +4,32 @@ export interface NaiveConfig {
4
4
  agent_id?: string;
5
5
  company_id?: string;
6
6
  company_name?: string;
7
- /** Active subject tenant_user — the user CLI commands act on by default. */
7
+ session_token?: string;
8
+ user_email?: string;
9
+ session_company_id?: string;
10
+ session_company_name?: string;
11
+ /** Active subject tenant_user — the child project CLI commands act on by default. */
8
12
  active_user_id?: string;
13
+ /**
14
+ * Active project — the project CLI commands act inside by default. Unset means
15
+ * the organization's DEFAULT project, which is where every row created before
16
+ * projects existed lives, so an unset value is not an unscoped one.
17
+ */
18
+ active_project_id?: string;
19
+ /** Display name of {@link active_project_id}, for `naive whoami` / `status`. */
20
+ active_project_name?: string;
21
+ /** Output format preference. Default (unset) = machine JSON — safe for agents/pipes/CI/pty
22
+ * callers. "human" opts into chalk-rendered output + interactive wizards/confirms. Set via
23
+ * `naive config output human`. Never inferred from isTTY (a pty-wrapped agent looks like a TTY). */
24
+ output?: "human" | "json";
25
+ /** One-time flag: the "run 'naive config output human'" discovery hint has been shown. */
26
+ human_hint_shown?: boolean;
9
27
  }
10
28
  export declare function loadConfig(): NaiveConfig;
11
29
  export declare function saveConfig(config: Partial<NaiveConfig>): void;
12
30
  export declare function getApiKey(): string;
31
+ /** Human session token for human-only operations (voice clone/revoke). NEVER falls back
32
+ * to the agent api_key — the two auth modes are deliberately separate. */
33
+ export declare function getSessionToken(): string;
34
+ /** Clear only the session fields (used by `naive auth logout`). */
35
+ export declare function clearSession(): void;
package/dist/config.js CHANGED
@@ -1,4 +1,4 @@
1
- import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
1
+ import { readFileSync, writeFileSync, mkdirSync, existsSync, chmodSync, renameSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { homedir } from "node:os";
4
4
  const CONFIG_DIR = join(homedir(), ".naive");
@@ -19,12 +19,19 @@ export function loadConfig() {
19
19
  config.base_url = process.env.NAIVE_BASE_URL;
20
20
  return config;
21
21
  }
22
+ // Atomic, owner-only write. The file holds an api_key AND a 30-day session token, so it
23
+ // must never be world-readable. Write to a fresh temp path (mode 0600, never world-
24
+ // readable since umask only clears bits), rename into place, then chmod the final file
25
+ // (the writeFileSync `mode` is ignored when the destination already exists).
26
+ function writeConfigFile(config) {
27
+ mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
28
+ const tmp = `${CONFIG_FILE}.${process.pid}.tmp`;
29
+ writeFileSync(tmp, JSON.stringify(config, null, 2), { mode: 0o600 });
30
+ renameSync(tmp, CONFIG_FILE);
31
+ chmodSync(CONFIG_FILE, 0o600);
32
+ }
22
33
  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));
34
+ writeConfigFile({ ...loadConfig(), ...config });
28
35
  }
29
36
  export function getApiKey() {
30
37
  const envKey = process.env.NAIVE_API_KEY;
@@ -32,9 +39,31 @@ export function getApiKey() {
32
39
  return envKey;
33
40
  const config = loadConfig();
34
41
  if (!config.api_key) {
35
- console.error("No API key found. Run `naive register` or `naive link` first.");
42
+ console.error("No API key found. Run `naive register` or `naive auth email <email>` first.");
36
43
  process.exit(1);
37
44
  }
38
45
  return config.api_key;
39
46
  }
47
+ /** Human session token for human-only operations (voice clone/revoke). NEVER falls back
48
+ * to the agent api_key — the two auth modes are deliberately separate. */
49
+ export function getSessionToken() {
50
+ const envToken = process.env.NAIVE_SESSION_TOKEN;
51
+ if (envToken)
52
+ return envToken;
53
+ const config = loadConfig();
54
+ if (!config.session_token) {
55
+ console.error("No human session found. Run `naive auth session-login --email <e> --password <p>` first.");
56
+ process.exit(1);
57
+ }
58
+ return config.session_token;
59
+ }
60
+ /** Clear only the session fields (used by `naive auth logout`). */
61
+ export function clearSession() {
62
+ const current = loadConfig();
63
+ delete current.session_token;
64
+ delete current.user_email;
65
+ delete current.session_company_id;
66
+ delete current.session_company_name;
67
+ writeConfigFile(current);
68
+ }
40
69
  //# sourceMappingURL=config.js.map
@@ -1 +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;AAYpD,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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  #!/usr/bin/env node
2
- export {};
2
+ import { type DeprecationRecord } from "./lib/deprecation.js";
3
+ export declare const LEGACY_DEPRECATIONS: DeprecationRecord[];