@ravi-hq/ravi 0.1.0 → 0.2.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 (63) hide show
  1. package/README.md +56 -6
  2. package/dist/auth.d.ts +39 -0
  3. package/dist/auth.d.ts.map +1 -0
  4. package/dist/auth.js +97 -0
  5. package/dist/auth.js.map +1 -0
  6. package/dist/bin/ravi-secrets.d.ts +23 -0
  7. package/dist/bin/ravi-secrets.d.ts.map +1 -0
  8. package/dist/bin/ravi-secrets.js +113 -0
  9. package/dist/bin/ravi-secrets.js.map +1 -0
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +142 -188
  12. package/dist/cli.js.map +1 -1
  13. package/dist/client.d.ts +4 -1
  14. package/dist/client.d.ts.map +1 -1
  15. package/dist/client.js +26 -17
  16. package/dist/client.js.map +1 -1
  17. package/dist/crypto.d.ts +13 -0
  18. package/dist/crypto.d.ts.map +1 -1
  19. package/dist/crypto.js +45 -5
  20. package/dist/crypto.js.map +1 -1
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +68 -46
  23. package/dist/index.js.map +1 -1
  24. package/dist/service.d.ts +7 -0
  25. package/dist/service.d.ts.map +1 -1
  26. package/dist/service.js +11 -0
  27. package/dist/service.js.map +1 -1
  28. package/dist/sse.d.ts +9 -0
  29. package/dist/sse.d.ts.map +1 -1
  30. package/dist/sse.js +20 -2
  31. package/dist/sse.js.map +1 -1
  32. package/dist/tools/email-send.js +1 -1
  33. package/dist/tools/email-send.js.map +1 -1
  34. package/dist/tools/feedback.d.ts +2 -3
  35. package/dist/tools/feedback.d.ts.map +1 -1
  36. package/dist/tools/feedback.js +26 -18
  37. package/dist/tools/feedback.js.map +1 -1
  38. package/dist/tools/inbox.d.ts.map +1 -1
  39. package/dist/tools/inbox.js +15 -56
  40. package/dist/tools/inbox.js.map +1 -1
  41. package/dist/tools/passwords.d.ts.map +1 -1
  42. package/dist/tools/passwords.js +21 -51
  43. package/dist/tools/passwords.js.map +1 -1
  44. package/dist/tools/vault.d.ts.map +1 -1
  45. package/dist/tools/vault.js +4 -8
  46. package/dist/tools/vault.js.map +1 -1
  47. package/dist/types.d.ts +10 -9
  48. package/dist/types.d.ts.map +1 -1
  49. package/dist/utils.d.ts +6 -0
  50. package/dist/utils.d.ts.map +1 -1
  51. package/dist/utils.js +18 -0
  52. package/dist/utils.js.map +1 -1
  53. package/openclaw.plugin.json +3 -23
  54. package/package.json +5 -3
  55. package/skills/CLAUDE.md +0 -36
  56. package/skills/ravi/SKILL.md +0 -46
  57. package/skills/ravi-email-send/SKILL.md +0 -44
  58. package/skills/ravi-feedback/SKILL.md +0 -37
  59. package/skills/ravi-identity/SKILL.md +0 -50
  60. package/skills/ravi-inbox/SKILL.md +0 -58
  61. package/skills/ravi-login/SKILL.md +0 -42
  62. package/skills/ravi-passwords/SKILL.md +0 -48
  63. package/skills/ravi-vault/SKILL.md +0 -54
package/dist/cli.js CHANGED
@@ -1,10 +1,8 @@
1
1
  import { execFile } from "node:child_process";
2
- import { createInterface } from "node:readline";
3
- import { mkdirSync, writeFileSync } from "node:fs";
4
- import { join } from "node:path";
5
- import { homedir, platform } from "node:os";
2
+ import { platform } from "node:os";
6
3
  import { RAVI_API_URL } from "./config.js";
7
4
  import { RaviClient, RaviApiError } from "./client.js";
5
+ import { loadAuth, saveAuth, saveConfig, saveRecoveryKey } from "./auth.js";
8
6
  /** Try to open a URL in the user's default browser. Non-fatal on failure. */
9
7
  function openBrowser(url) {
10
8
  const cmd = platform() === "darwin" ? "open" :
@@ -15,49 +13,69 @@ function openBrowser(url) {
15
13
  // Silently ignore errors — user can open the URL manually
16
14
  });
17
15
  }
16
+ /**
17
+ * Try to set an OpenClaw config value via `openclaw config set`.
18
+ * Returns true on success, false on failure (command not found, schema error, etc.).
19
+ */
20
+ function openclawConfigSet(path, value) {
21
+ return new Promise((resolve) => {
22
+ execFile("openclaw", ["config", "set", path, value], (err) => {
23
+ resolve(!err);
24
+ });
25
+ });
26
+ }
18
27
  /**
19
28
  * Prompt the user for a 6-digit PIN via stdin (hidden input).
20
29
  * Matches the CLI's interactive PIN prompt behavior.
21
30
  */
22
31
  async function promptPIN(prompt) {
23
32
  return new Promise((resolve, reject) => {
24
- const rl = createInterface({ input: process.stdin, output: process.stderr });
25
- // Mute output to hide PIN typing (write prompt to stderr like the CLI)
26
33
  process.stderr.write(prompt);
27
34
  const stdin = process.stdin;
28
35
  const wasRaw = stdin.isRaw;
29
36
  if (stdin.isTTY && stdin.setRawMode) {
30
37
  stdin.setRawMode(true);
31
38
  }
39
+ stdin.resume();
32
40
  let pin = "";
41
+ const timeout = setTimeout(() => {
42
+ cleanup();
43
+ reject(new Error("PIN prompt timed out — no input received within 60 seconds."));
44
+ }, 60_000);
45
+ const cleanup = () => {
46
+ clearTimeout(timeout);
47
+ if (stdin.isTTY && stdin.setRawMode)
48
+ stdin.setRawMode(wasRaw ?? false);
49
+ stdin.removeListener("data", onData);
50
+ stdin.removeListener("end", onEnd);
51
+ stdin.pause();
52
+ };
53
+ const onEnd = () => {
54
+ cleanup();
55
+ reject(new Error("stdin closed — cannot read PIN in non-interactive mode."));
56
+ };
33
57
  const onData = (key) => {
34
58
  const ch = key.toString();
35
59
  if (ch === "\r" || ch === "\n") {
36
- // Done
37
- if (stdin.isTTY && stdin.setRawMode)
38
- stdin.setRawMode(wasRaw ?? false);
39
- stdin.removeListener("data", onData);
60
+ cleanup();
40
61
  process.stderr.write("\n");
41
- rl.close();
42
62
  resolve(pin);
43
63
  }
44
64
  else if (ch === "\x03") {
45
65
  // Ctrl+C
46
- if (stdin.isTTY && stdin.setRawMode)
47
- stdin.setRawMode(wasRaw ?? false);
48
- stdin.removeListener("data", onData);
49
- rl.close();
66
+ cleanup();
50
67
  reject(new Error("Cancelled"));
51
68
  }
52
69
  else if (ch === "\x7f" || ch === "\b") {
53
70
  // Backspace
54
71
  pin = pin.slice(0, -1);
55
72
  }
56
- else if (ch.length === 1 && ch >= " ") {
73
+ else if (/^\d$/.test(ch)) {
57
74
  pin += ch;
58
75
  }
59
76
  };
60
77
  stdin.on("data", onData);
78
+ stdin.on("end", onEnd);
61
79
  });
62
80
  }
63
81
  /**
@@ -82,17 +100,6 @@ async function promptExistingPIN() {
82
100
  }
83
101
  return pin;
84
102
  }
85
- /**
86
- * Save recovery key to ~/.ravi/recovery-key.txt (same location as CLI).
87
- * Creates ~/.ravi/ directory if needed. File permissions: 0600.
88
- */
89
- function saveRecoveryKey(recoveryKey) {
90
- const raviDir = join(homedir(), ".ravi");
91
- mkdirSync(raviDir, { recursive: true, mode: 0o700 });
92
- const filePath = join(raviDir, "recovery-key.txt");
93
- writeFileSync(filePath, recoveryKey + "\n", { mode: 0o600 });
94
- return filePath;
95
- }
96
103
  // ─── Command Definitions ────────────────────────────────────────────────────
97
104
  /**
98
105
  * All CLI commands exposed by the Ravi plugin.
@@ -105,7 +112,7 @@ export const cliCommands = [
105
112
  {
106
113
  name: "login",
107
114
  description: "Authenticate with Ravi using device code flow. Opens a browser for login.",
108
- handler: async (_args, config) => {
115
+ handler: async (_args, _config) => {
109
116
  const apiUrl = RAVI_API_URL;
110
117
  // Step 1: Initiate device code flow
111
118
  const response = await fetch(`${apiUrl}/api/auth/device/`, {
@@ -118,8 +125,9 @@ export const cliCommands = [
118
125
  }
119
126
  const data = (await response.json());
120
127
  // Step 2: Open browser and display user code
121
- // Pass user_code as query param so the verify page auto-fills it
122
- const verifyUrl = `${data.verification_uri}?user_code=${data.user_code}`;
128
+ const url = new URL(data.verification_uri);
129
+ url.searchParams.set("user_code", data.user_code);
130
+ const verifyUrl = url.toString();
123
131
  openBrowser(verifyUrl);
124
132
  let output = `\nTo authenticate, visit: ${verifyUrl}\n`;
125
133
  output += `Code: ${data.user_code}\n`;
@@ -150,126 +158,125 @@ export const cliCommands = [
150
158
  consecutiveNetworkErrors = 0;
151
159
  if (tokenResponse.ok) {
152
160
  const tokenData = (await tokenResponse.json());
153
- // Step 4: Check encryption status and handle PIN setup/verification
154
161
  const client = new RaviClient({ apiUrl, token: tokenData.access });
155
162
  output += `\nAuthenticated as ${tokenData.user.email}\n\n`;
156
- // Track PIN resolved during this session (from config or prompted)
157
- let resolvedPin = config.pin;
158
- // Check encryption status
159
- // Backend uses get_or_create — always returns 200 with empty public_key for new users
163
+ // Build auth.json tokens first, encryption keys added below
164
+ const authData = {
165
+ access_token: tokenData.access,
166
+ refresh_token: tokenData.refresh,
167
+ user_email: tokenData.user.email,
168
+ };
169
+ // Step 4: Encryption setup — derive keypair and store in auth.json
160
170
  let meta = null;
161
171
  try {
162
172
  meta = await client.getEncryptionMeta();
163
173
  }
164
174
  catch (err) {
165
175
  const msg = err instanceof Error ? err.message : String(err);
166
- output += `WARNING: Could not check encryption status: ${msg}\n`;
167
- output += `Encryption features may not work correctly.\n\n`;
176
+ output += `WARNING: Could not check encryption status: ${msg}\n\n`;
168
177
  }
169
178
  if (meta && !meta.public_key) {
170
- // First-time setup — prompt for PIN if not in config
171
- if (!resolvedPin) {
172
- try {
173
- resolvedPin = await promptAndConfirmPIN();
174
- }
175
- catch (err) {
176
- const msg = err instanceof Error ? err.message : String(err);
177
- output += `PIN setup cancelled: ${msg}\n`;
178
- output += `Run 'openclaw ravi login' again to set up encryption.\n\n`;
179
- }
179
+ // First-time setup — prompt for PIN, derive keypair, store keys
180
+ try {
181
+ const pin = await promptAndConfirmPIN();
182
+ const { setupEncryption } = await import("./crypto.js");
183
+ const setup = await setupEncryption(pin);
184
+ const recoveryPath = saveRecoveryKey(setup.recoveryKey);
185
+ await client.updateEncryptionMeta({
186
+ salt: setup.salt,
187
+ public_key: setup.publicKey,
188
+ verifier: setup.verifier,
189
+ });
190
+ // Store derived keypair in auth.json (returned by setupEncryption)
191
+ const { bytesToBase64 } = await import("./crypto.js");
192
+ authData.pin_salt = setup.salt;
193
+ authData.public_key = setup.publicKey;
194
+ authData.private_key = bytesToBase64(setup.keyPair.secretKey);
195
+ output += `E2E encryption set up successfully!\n`;
196
+ output += `Recovery key saved to ${recoveryPath} — back this up!\n\n`;
180
197
  }
181
- if (resolvedPin) {
182
- try {
183
- const { setupEncryption } = await import("./crypto.js");
184
- const setup = await setupEncryption(resolvedPin);
185
- // Save recovery key to ~/.ravi/recovery-key.txt (same as CLI)
186
- const recoveryPath = saveRecoveryKey(setup.recoveryKey);
187
- // Register with server
188
- await client.updateEncryptionMeta({
189
- salt: setup.salt,
190
- public_key: setup.publicKey,
191
- verifier: setup.verifier,
192
- });
193
- output += `E2E encryption set up successfully!\n`;
194
- output += `Recovery key saved to ${recoveryPath} — back this up!\n\n`;
195
- }
196
- catch (err) {
197
- const msg = err instanceof Error ? err.message : String(err);
198
- output += `Failed to set up encryption: ${msg}\n`;
199
- output += `You can try again by running 'openclaw ravi login'.\n\n`;
200
- }
198
+ catch (err) {
199
+ if (err instanceof Error && err.message === "Cancelled")
200
+ throw err;
201
+ const msg = err instanceof Error ? err.message : String(err);
202
+ output += `PIN setup skipped: ${msg}\n`;
203
+ output += `Run 'openclaw ravi login' again to set up encryption.\n\n`;
201
204
  }
202
205
  }
203
206
  else if (meta && meta.public_key) {
204
- // Existing encryption — verify PIN (prompt if not in config)
205
- if (!resolvedPin) {
206
- try {
207
- resolvedPin = await promptExistingPIN();
207
+ // Existing encryption — verify PIN, derive and store keypair
208
+ try {
209
+ const pin = await promptExistingPIN();
210
+ const { deriveKeyPair, verify } = await import("./crypto.js");
211
+ const kp = await deriveKeyPair(pin, meta.salt);
212
+ const valid = await verify(kp, meta.verifier);
213
+ if (valid) {
214
+ const { bytesToBase64 } = await import("./crypto.js");
215
+ authData.pin_salt = meta.salt;
216
+ authData.public_key = meta.public_key;
217
+ authData.private_key = bytesToBase64(kp.secretKey);
218
+ output += `PIN verified — E2E encryption is ready.\n\n`;
208
219
  }
209
- catch (err) {
210
- const msg = err instanceof Error ? err.message : String(err);
211
- output += `PIN entry cancelled: ${msg}\n\n`;
220
+ else {
221
+ output += `WARNING: PIN does not match! Encryption keys not saved.\n`;
222
+ output += `Run 'openclaw ravi login' again with the correct PIN.\n\n`;
212
223
  }
213
224
  }
214
- if (resolvedPin) {
215
- try {
216
- const { deriveKeyPair, verify } = await import("./crypto.js");
217
- const kp = await deriveKeyPair(resolvedPin, meta.salt);
218
- const valid = await verify(kp, meta.verifier);
219
- if (valid) {
220
- output += `PIN verified — E2E encryption is ready.\n\n`;
221
- }
222
- else {
223
- output += `WARNING: PIN does not match! Check your PIN.\n\n`;
224
- }
225
- }
226
- catch (err) {
227
- const msg = err instanceof Error ? err.message : String(err);
228
- output += `PIN verification failed: ${msg}\n\n`;
229
- }
225
+ catch (err) {
226
+ if (err instanceof Error && err.message === "Cancelled")
227
+ throw err;
228
+ const msg = err instanceof Error ? err.message : String(err);
229
+ output += `PIN entry skipped: ${msg}\n\n`;
230
230
  }
231
231
  }
232
- // Fetch identities to auto-include identityUuid
233
- let identityUuidLine = "";
232
+ // Save auth to ~/.ravi/auth.json (like CLI)
233
+ saveAuth(authData);
234
+ output += `Credentials saved to ~/.ravi/auth.json\n\n`;
235
+ // Step 5: Identity selection + OpenClaw config update
234
236
  try {
235
237
  const identities = await client.listIdentities();
238
+ let selectedUuid;
236
239
  if (identities.length === 1) {
237
- identityUuidLine = ` "identityUuid": "${identities[0].uuid}",\n`;
238
- output += `Auto-selected identity: ${identities[0].name} (${identities[0].uuid})\n\n`;
240
+ selectedUuid = identities[0].uuid;
241
+ saveConfig({
242
+ identity_uuid: identities[0].uuid,
243
+ identity_name: identities[0].name,
244
+ });
245
+ output += `Auto-selected identity: ${identities[0].name}\n\n`;
239
246
  }
240
247
  else if (identities.length > 1) {
241
- output += `Multiple identities found. Add one to your config as "identityUuid":\n`;
248
+ // Default to first identity; user can change later
249
+ selectedUuid = identities[0].uuid;
250
+ saveConfig({
251
+ identity_uuid: identities[0].uuid,
252
+ identity_name: identities[0].name,
253
+ });
254
+ output += `Identities:\n`;
242
255
  for (const identity of identities) {
243
- output += ` - ${identity.name}: ${identity.uuid}\n`;
256
+ output += ` ${identity.name}: ${identity.uuid}\n`;
244
257
  }
245
- output += `\n`;
258
+ output += `\nUsing: ${identities[0].name} (first identity)\n\n`;
246
259
  }
247
260
  else {
248
- output += `No identities found. Create one first, then add its UUID to config as "identityUuid".\n\n`;
261
+ output += `No identities found. Create one with the ravi_identity_create tool.\n`;
262
+ }
263
+ // Try to auto-configure OpenClaw with the selected identity
264
+ if (selectedUuid) {
265
+ const configPath = "plugins.entries.ravi.config.identityUuid";
266
+ const ok = await openclawConfigSet(configPath, selectedUuid);
267
+ if (ok) {
268
+ output += `OpenClaw config updated automatically (identityUuid set).\n`;
269
+ }
270
+ else {
271
+ output += `To complete setup, run:\n\n`;
272
+ output += ` openclaw config set ${configPath} "${selectedUuid}"\n`;
273
+ }
249
274
  }
250
275
  }
251
- catch {
252
- // Can't list identities skip auto-include
276
+ catch (err) {
277
+ const detail = err instanceof Error ? err.message : String(err);
278
+ output += `Could not list identities: ${detail}\nAdd identityUuid to your config manually.\n`;
253
279
  }
254
- // Output config snippet
255
- output += `Plugin config:\n\n`;
256
- output += `{\n`;
257
- output += ` "plugins": {\n`;
258
- output += ` "entries": {\n`;
259
- output += ` "ravi": {\n`;
260
- output += ` "enabled": true,\n`;
261
- output += ` "config": {\n`;
262
- // apiUrl is baked in at build time — not part of user config
263
- output += ` "token": "${tokenData.access}",\n`;
264
- output += ` "refreshToken": "${tokenData.refresh}",\n`;
265
- output += identityUuidLine;
266
- output += ` "pin": "${resolvedPin ?? "YOUR_6_DIGIT_PIN"}"\n`;
267
- output += ` }\n`;
268
- output += ` }\n`;
269
- output += ` }\n`;
270
- output += ` }\n`;
271
- output += `}\n\n`;
272
- output += `Run 'openclaw ravi setup' to configure channels.\n`;
273
280
  return output;
274
281
  }
275
282
  // Check whether the error is "still waiting" or a terminal failure
@@ -285,16 +292,18 @@ export const cliCommands = [
285
292
  {
286
293
  name: "status",
287
294
  description: "Show authentication status and available identities.",
288
- handler: async (_args, config) => {
289
- if (!config.token) {
290
- return `Not configured. Run 'openclaw ravi login' to authenticate.`;
295
+ handler: async (_args, _config) => {
296
+ const auth = loadAuth();
297
+ if (!auth?.access_token) {
298
+ return `Not logged in. Run 'openclaw ravi login' to authenticate.`;
291
299
  }
292
300
  const apiUrl = RAVI_API_URL;
293
- const client = new RaviClient({ apiUrl, token: config.token });
301
+ const client = new RaviClient({ apiUrl, token: auth.access_token });
294
302
  try {
295
303
  const identities = await client.listIdentities();
304
+ const hasKeypair = !!(auth.public_key && auth.private_key);
296
305
  let output = `Authenticated to ${apiUrl}\n`;
297
- output += `PIN configured: ${config.pin ? "Yes" : "No"}\n`;
306
+ output += `E2E encryption: ${hasKeypair ? "Yes" : "No"}\n`;
298
307
  output += `\nIdentities (${identities.length}):\n`;
299
308
  for (const identity of identities) {
300
309
  output += ` - ${identity.name} (${identity.uuid})\n`;
@@ -303,9 +312,9 @@ export const cliCommands = [
303
312
  if (identity.phone)
304
313
  output += ` Phone: ${identity.phone}\n`;
305
314
  }
306
- if (!config.pin) {
307
- output += `\nWARNING: No PIN configured — encrypted data (passwords, vault) will not be readable.\n`;
308
- output += `Add your PIN to the plugin config to enable E2E decryption.\n`;
315
+ if (!hasKeypair) {
316
+ output += `\nWARNING: No encryption keypair — encrypted data (passwords, vault) will not be readable.\n`;
317
+ output += `Run 'openclaw ravi login' to set up E2E encryption.\n`;
309
318
  }
310
319
  return output;
311
320
  }
@@ -321,69 +330,14 @@ export const cliCommands = [
321
330
  }
322
331
  },
323
332
  },
324
- // ── setup ───────────────────────────────────────────────────────────────
333
+ // ── setup (alias for login) ─────────────────────────────────────────────
325
334
  {
326
335
  name: "setup",
327
- description: "Interactive setup for email and SMS channels.",
328
- handler: async (_args, config) => {
329
- const apiUrl = RAVI_API_URL;
330
- const client = new RaviClient({ apiUrl, token: config.token });
331
- const identities = await client.listIdentities();
332
- if (identities.length === 0) {
333
- return "No identities found. Create one first with the 'ravi_identity_create' tool.";
334
- }
335
- let output = "Channel Configuration\n";
336
- output += "=====================\n\n";
337
- // Suggest identityUuid for plugin config
338
- if (identities.length === 1) {
339
- output += `Tip: Add this to your plugin config to scope all tools to this identity:\n`;
340
- output += ` "identityUuid": "${identities[0].uuid}"\n\n`;
341
- }
342
- else {
343
- output += `Tip: Add "identityUuid" to your plugin config to scope all tools to one identity:\n`;
344
- for (const identity of identities) {
345
- output += ` - ${identity.name}: "${identity.uuid}"\n`;
346
- }
347
- output += `\n`;
348
- }
349
- output += "Add this to your OpenClaw config under the 'channels' key.\n\n";
350
- output += `"channels": {\n`;
351
- // Email accounts
352
- const emailIdentities = identities.filter(i => i.email);
353
- if (emailIdentities.length > 0) {
354
- output += ` "ravi-email": {\n`;
355
- output += ` "accounts": {\n`;
356
- for (const [idx, identity] of emailIdentities.entries()) {
357
- output += ` "${identity.uuid}": {\n`;
358
- output += ` "identityUuid": "${identity.uuid}",\n`;
359
- output += ` "identityName": "${identity.name}",\n`;
360
- output += ` "email": "${identity.email}"\n`;
361
- output += ` }${idx < emailIdentities.length - 1 ? "," : ""}\n`;
362
- }
363
- output += ` }\n`;
364
- output += ` },\n`;
365
- }
366
- // SMS accounts
367
- const phoneIdentities = identities.filter(i => i.phone);
368
- if (phoneIdentities.length > 0) {
369
- output += ` "ravi-sms": {\n`;
370
- output += ` "accounts": {\n`;
371
- for (const [idx, identity] of phoneIdentities.entries()) {
372
- output += ` "${identity.uuid}": {\n`;
373
- output += ` "identityUuid": "${identity.uuid}",\n`;
374
- output += ` "identityName": "${identity.name}",\n`;
375
- output += ` "phone": "${identity.phone}"\n`;
376
- output += ` }${idx < phoneIdentities.length - 1 ? "," : ""}\n`;
377
- }
378
- output += ` }\n`;
379
- output += ` }\n`;
380
- }
381
- output += `}\n\n`;
382
- output += `NOTE: Messages from your personal email (owner) and other Ravi identities (self)\n`;
383
- output += `give the agent full access. Messages from unknown senders (external) are delivered\n`;
384
- output += `as read-only context — the agent can see them but cannot respond or use write tools.\n`;
385
- output += `To allow someone full access, add them as a personal email on the Ravi dashboard.\n`;
386
- return output;
336
+ description: "Alias for 'login' — authenticates and configures everything in one step.",
337
+ handler: async (args, config) => {
338
+ // Delegate to the login handler
339
+ const loginCmd = cliCommands.find((c) => c.name === "login");
340
+ return loginCmd.handler(args, config);
387
341
  },
388
342
  },
389
343
  ];
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -9,6 +9,8 @@ export interface RaviClientConfig {
9
9
  refreshToken?: string;
10
10
  /** Optional identity UUID — sets the `X-Ravi-Identity` header on scoped requests. */
11
11
  identityUuid?: string;
12
+ /** Callback invoked after a successful token refresh — use to persist the new token. */
13
+ onTokenRefresh?: (newToken: string) => void;
12
14
  }
13
15
  /**
14
16
  * Error thrown when the Ravi API returns a non-OK response.
@@ -43,7 +45,8 @@ export declare class RaviClient {
43
45
  private token;
44
46
  private refreshToken?;
45
47
  private identityUuid?;
46
- private isRefreshing;
48
+ private refreshPromise;
49
+ private onTokenRefresh?;
47
50
  constructor(config: RaviClientConfig);
48
51
  /**
49
52
  * Set the identity UUID used for scoped requests.
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js CHANGED
@@ -40,12 +40,14 @@ export class RaviClient {
40
40
  token;
41
41
  refreshToken;
42
42
  identityUuid;
43
- isRefreshing = false;
43
+ refreshPromise = null;
44
+ onTokenRefresh;
44
45
  constructor(config) {
45
46
  this.apiUrl = config.apiUrl.replace(/\/$/, "");
46
47
  this.token = config.token;
47
48
  this.refreshToken = config.refreshToken;
48
49
  this.identityUuid = config.identityUuid;
50
+ this.onTokenRefresh = config.onTokenRefresh;
49
51
  }
50
52
  /**
51
53
  * Set the identity UUID used for scoped requests.
@@ -82,28 +84,35 @@ export class RaviClient {
82
84
  });
83
85
  };
84
86
  let response = await doFetch();
85
- // Auto-refresh: on 401, try refreshing the token once and retry
86
- if (response.status === 401 && this.refreshToken && !this.isRefreshing) {
87
- this.isRefreshing = true;
88
- try {
89
- const refreshResponse = await fetch(`${this.apiUrl}/api/auth/token/refresh/`, {
90
- method: "POST",
91
- headers: { "Content-Type": "application/json" },
92
- body: JSON.stringify({ refresh: this.refreshToken }),
87
+ // Auto-refresh: on 401, try refreshing the token once and retry.
88
+ // Uses a shared promise so concurrent requests coalesce into a single refresh.
89
+ if (response.status === 401 && this.refreshToken) {
90
+ const tokenBefore = this.token;
91
+ if (!this.refreshPromise) {
92
+ this.refreshPromise = (async () => {
93
+ const refreshResponse = await fetch(`${this.apiUrl}/api/auth/token/refresh/`, {
94
+ method: "POST",
95
+ headers: { "Content-Type": "application/json" },
96
+ body: JSON.stringify({ refresh: this.refreshToken }),
97
+ });
98
+ if (refreshResponse.ok) {
99
+ const data = (await refreshResponse.json());
100
+ this.token = data.access;
101
+ this.onTokenRefresh?.(data.access);
102
+ }
103
+ })().finally(() => {
104
+ this.refreshPromise = null;
93
105
  });
94
- if (refreshResponse.ok) {
95
- const data = (await refreshResponse.json());
96
- this.token = data.access;
97
- response = await doFetch();
98
- }
99
106
  }
100
- finally {
101
- this.isRefreshing = false;
107
+ await this.refreshPromise;
108
+ // Only retry if the token was actually refreshed
109
+ if (this.token !== tokenBefore) {
110
+ response = await doFetch();
102
111
  }
103
112
  }
104
113
  if (!response.ok) {
105
114
  const detail = await response.text().catch(() => "(unable to read response body)");
106
- throw new RaviApiError(method, path, response.status, detail);
115
+ throw new RaviApiError(method, path, response.status, detail.slice(0, 500));
107
116
  }
108
117
  // 204 No Content — nothing to parse
109
118
  if (response.status === 204)