@zincapp/znvault-cli 4.24.2 → 4.24.3

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 (53) hide show
  1. package/dist/commands/dynamic-secrets/index.d.ts.map +1 -1
  2. package/dist/commands/dynamic-secrets/index.js +65 -2
  3. package/dist/commands/dynamic-secrets/index.js.map +1 -1
  4. package/dist/commands/dynamic-secrets/permit.d.ts +5 -0
  5. package/dist/commands/dynamic-secrets/permit.d.ts.map +1 -0
  6. package/dist/commands/dynamic-secrets/permit.js +104 -0
  7. package/dist/commands/dynamic-secrets/permit.js.map +1 -0
  8. package/dist/commands/dynamic-secrets/recovery-fence.d.ts +5 -0
  9. package/dist/commands/dynamic-secrets/recovery-fence.d.ts.map +1 -0
  10. package/dist/commands/dynamic-secrets/recovery-fence.js +84 -0
  11. package/dist/commands/dynamic-secrets/recovery-fence.js.map +1 -0
  12. package/dist/commands/dynamic-secrets/recovery-parse.d.ts +4 -0
  13. package/dist/commands/dynamic-secrets/recovery-parse.d.ts.map +1 -0
  14. package/dist/commands/dynamic-secrets/recovery-parse.js +22 -0
  15. package/dist/commands/dynamic-secrets/recovery-parse.js.map +1 -0
  16. package/dist/commands/dynamic-secrets/recovery-types.d.ts +117 -0
  17. package/dist/commands/dynamic-secrets/recovery-types.d.ts.map +1 -0
  18. package/dist/commands/dynamic-secrets/recovery-types.js +3 -0
  19. package/dist/commands/dynamic-secrets/recovery-types.js.map +1 -0
  20. package/dist/commands/dynamic-secrets/role.d.ts +2 -5
  21. package/dist/commands/dynamic-secrets/role.d.ts.map +1 -1
  22. package/dist/commands/dynamic-secrets/role.js +10 -2
  23. package/dist/commands/dynamic-secrets/role.js.map +1 -1
  24. package/dist/commands/dynamic-secrets/types.d.ts +10 -0
  25. package/dist/commands/dynamic-secrets/types.d.ts.map +1 -1
  26. package/dist/commands/mysql/index.d.ts +2 -0
  27. package/dist/commands/mysql/index.d.ts.map +1 -1
  28. package/dist/commands/mysql/index.js +70 -2
  29. package/dist/commands/mysql/index.js.map +1 -1
  30. package/dist/commands/mysql/mycnf.d.ts +2 -2
  31. package/dist/commands/mysql/mycnf.d.ts.map +1 -1
  32. package/dist/commands/mysql/mycnf.js +1 -1
  33. package/dist/commands/mysql/mycnf.js.map +1 -1
  34. package/dist/commands/mysql/permit-broker.d.ts +35 -0
  35. package/dist/commands/mysql/permit-broker.d.ts.map +1 -0
  36. package/dist/commands/mysql/permit-broker.js +365 -0
  37. package/dist/commands/mysql/permit-broker.js.map +1 -0
  38. package/dist/commands/mysql/recovery-hpke.d.ts +32 -0
  39. package/dist/commands/mysql/recovery-hpke.d.ts.map +1 -0
  40. package/dist/commands/mysql/recovery-hpke.js +311 -0
  41. package/dist/commands/mysql/recovery-hpke.js.map +1 -0
  42. package/dist/commands/mysql/run.d.ts +59 -19
  43. package/dist/commands/mysql/run.d.ts.map +1 -1
  44. package/dist/commands/mysql/run.js +399 -46
  45. package/dist/commands/mysql/run.js.map +1 -1
  46. package/dist/commands/mysql/types.d.ts +7 -0
  47. package/dist/commands/mysql/types.d.ts.map +1 -1
  48. package/dist/lib/client/http.d.ts.map +1 -1
  49. package/dist/lib/client/http.js +18 -0
  50. package/dist/lib/client/http.js.map +1 -1
  51. package/dist/lib/client/types.d.ts +6 -0
  52. package/dist/lib/client/types.d.ts.map +1 -1
  53. package/package.json +5 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/index.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BzC,cAAc,YAAY,CAAC;AAE3B,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6UrE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/index.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAuCzC,cAAc,YAAY,CAAC;AAE3B,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyZrE"}
@@ -5,6 +5,8 @@ import { generateCredentials } from './creds.js';
5
5
  import { listLeases, getLease, renewLease, revokeLease, } from './lease.js';
6
6
  import { registerAllowedHostsCommands } from './allowed-hosts.js';
7
7
  import { registerTemplatesCommands } from './templates.js';
8
+ import { getMintOperationStatus, issueMintPermit, revokeMintOperation, } from './permit.js';
9
+ import { closeRecoveryFence, getRecoveryFenceStatus, openRecoveryFence, } from './recovery-fence.js';
8
10
  // Re-export types
9
11
  export * from './types.js';
10
12
  export function registerDynamicSecretsCommands(program) {
@@ -192,7 +194,7 @@ Notes:
192
194
  .description('Create a new role for a connection (from a fixed template, or raw SQL as an escape hatch)')
193
195
  .option('--name <name>', 'Role name')
194
196
  .option('--description <desc>', 'Role description')
195
- .option('--template <name>', 'Create from a fixed, versioned server template (e.g. readonly, readwrite, ddl, migrate) — mutually exclusive with the raw SQL flags below')
197
+ .option('--template <name>', 'Create from a fixed, versioned server template (e.g. readonly, readwrite, ddl, migrate, packleader-client-v1-recovery) — mutually exclusive with the raw SQL flags below')
196
198
  .option('--template-version <n>', 'Template version (defaults to latest on the server if omitted)')
197
199
  .option('--creation-statements <sql>', '[raw mode, requires dynamic-secrets:roles:write-raw] SQL statements to create credentials (semicolon-separated)')
198
200
  .option('--revocation-statements <sql>', '[raw mode] SQL statements to revoke credentials (semicolon-separated)')
@@ -217,6 +219,11 @@ Examples:
217
219
  # prints a "bundle_not_applied" warning.
218
220
  znvault dynasec role create <mysql-connection-id> --name migrator --template migrate
219
221
 
222
+ # Recovery Fence v1: the server creates this role permanently disabled.
223
+ # It can mint only through an OPEN fence plus a one-shot permit.
224
+ znvault dynasec role create <mysql-connection-id> --name packleader-recovery \
225
+ --template packleader-client-v1-recovery --template-version 1
226
+
220
227
  # Raw mode (escape hatch): hand-write the SQL yourself. Requires the
221
228
  # separate "dynamic-secrets:roles:write-raw" permission (NOT auto-granted —
222
229
  # ask an admin to grant it if you get a 403).
@@ -225,7 +232,7 @@ Examples:
225
232
  --revocation-statements "DROP ROLE IF EXISTS \\"{{username}}\\""
226
233
 
227
234
  Template catalog (v1, fixed server-side — see "znvault dynasec templates list"):
228
- MySQL: readonly, readwrite, ddl, migrate
235
+ MySQL: readonly, readwrite, ddl, migrate, packleader-client-v1-recovery
229
236
  PostgreSQL: readonly, readwrite (ddl/migrate are MySQL-only; using them
230
237
  on a PostgreSQL connection 400s with
231
238
  ddl_unsupported_for_engine)
@@ -244,6 +251,7 @@ Notes:
244
251
  role
245
252
  .command('update <role-id>')
246
253
  .description('Update a role')
254
+ .requiredOption('--expected-config-revision <n>', 'Exact role CAS revision returned by role get')
247
255
  .option('--description <desc>', 'Role description')
248
256
  .option('--creation-statements <sql>', 'SQL statements to create credentials (semicolon-separated)')
249
257
  .option('--revocation-statements <sql>', 'SQL statements to revoke credentials (semicolon-separated)')
@@ -257,6 +265,7 @@ Notes:
257
265
  .command('delete <role-id>')
258
266
  .alias('rm')
259
267
  .description('Delete a role (blocked while retained lease history exists)')
268
+ .requiredOption('--expected-config-revision <n>', 'Exact role CAS revision returned by role get')
260
269
  .option('--force', 'Skip confirmation only; does not bypass lease-history retention')
261
270
  .option('--json', 'Output as JSON')
262
271
  .action(deleteRole);
@@ -309,5 +318,59 @@ Notes:
309
318
  // Templates Commands
310
319
  // -------------------------------------------------------------------------
311
320
  registerTemplatesCommands(dynasec);
321
+ // -------------------------------------------------------------------------
322
+ // Recovery Fence v1
323
+ // -------------------------------------------------------------------------
324
+ const fence = dynasec
325
+ .command('recovery-fence')
326
+ .description('Open, inspect, and close PostgreSQL-authoritative recovery fences');
327
+ fence
328
+ .command('open <role-id> <run-id>')
329
+ .description('Open an idempotent recovery fence around a disabled MySQL role')
330
+ .requiredOption('--consumer-api-key-id <id>', 'API key bound to all permits in this fence')
331
+ .requiredOption('--expected-role-revision <n>', 'Pinned role configuration revision')
332
+ .requiredOption('--expected-role-config-sha256 <hex>', 'Pinned lowercase role configuration SHA-256')
333
+ .requiredOption('--expires-in-seconds <n>', 'Fence lifetime (PostgreSQL clock)')
334
+ .requiredOption('--purpose <purpose>', 'Bounded operational purpose')
335
+ .option('--json', 'Output as JSON')
336
+ .action(openRecoveryFence);
337
+ fence
338
+ .command('status <role-id> <run-id>')
339
+ .description('Get recovery fence state and drain counters')
340
+ .option('--json', 'Output as JSON')
341
+ .action(getRecoveryFenceStatus);
342
+ fence
343
+ .command('close <role-id> <run-id>')
344
+ .description('Advance the fence epoch, drain operations, and verify final closure')
345
+ .requiredOption('--expected-fence-epoch <n>', 'The OPEN epoch being closed')
346
+ .option('--json', 'Output as JSON')
347
+ .action(closeRecoveryFence);
348
+ const permit = dynasec
349
+ .command('permit')
350
+ .description('Issue and inspect one-shot recovery mint permits');
351
+ permit
352
+ .command('issue <role-id>')
353
+ .description('Issue an idempotent maxMints=1 permit (strict operator permission required)')
354
+ .requiredOption('--fence-id <id>', 'Open recovery fence ID')
355
+ .requiredOption('--consumer-api-key-id <id>', 'Consumer API key bound to the permit')
356
+ .requiredOption('--phase <phase>', 'Recovery phase (issue one permit per phase)')
357
+ .requiredOption('--expires-in-seconds <n>', 'Permit lifetime')
358
+ .requiredOption('--credential-ttl-seconds <n>', 'Target credential lifetime')
359
+ .option('--privilege-overlay <overlay>', 'NONE or MYSQL_SCHEMA_LOCK_TABLES (never arbitrary SQL)', 'NONE')
360
+ .requiredOption('--reason <reason>', 'Auditable recovery reason')
361
+ .requiredOption('--idempotency-key <uuid>', 'UUID persisted with the request; reuse it unchanged after an uncertain response')
362
+ .option('--json', 'Output as JSON')
363
+ .action(issueMintPermit);
364
+ permit
365
+ .command('status <permit-id> <request-id>')
366
+ .description('Get an idempotent permit operation by request ID')
367
+ .option('--json', 'Output as JSON')
368
+ .action(getMintOperationStatus);
369
+ permit
370
+ .command('revoke <permit-id> <request-id>')
371
+ .description('Revoke by request ID, including a pre-acquire tombstone')
372
+ .option('--reason <reason>', 'Revocation reason')
373
+ .option('--json', 'Output as JSON')
374
+ .action(revokeMintOperation);
312
375
  }
313
376
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAO9C,OAAO,EACL,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,SAAS,EACT,OAAO,EACP,UAAU,EACV,UAAU,EACV,UAAU,GACX,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EACL,UAAU,EACV,QAAQ,EACR,UAAU,EACV,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,kBAAkB;AAClB,cAAc,YAAY,CAAC;AAE3B,MAAM,UAAU,8BAA8B,CAAC,OAAgB;IAC7D,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,6DAA6D,CAAC;SAC1E,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;CAsBzB,CAAC,CAAC;IAED,4EAA4E;IAC5E,sBAAsB;IACtB,4EAA4E;IAC5E,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,6BAA6B,CAAC,CAAC;IAE1G,UAAU;SACP,OAAO,CAAC,MAAM,CAAC;SACf,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,eAAe,CAAC,CAAC;IAE3B,UAAU;SACP,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,aAAa,CAAC,CAAC;IAEzB,UAAU;SACP,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,eAAe,EAAE,iBAAiB,CAAC;SAC1C,MAAM,CAAC,eAAe,EAAE,qCAAqC,CAAC;SAC9D,MAAM,CAAC,8BAA8B,EAAE,4BAA4B,CAAC;SACpE,MAAM,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;SACxD,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC;SAC3D,MAAM,CAAC,qBAAqB,EAAE,+BAA+B,CAAC;SAC9D,MAAM,CAAC,yBAAyB,EAAE,wBAAwB,CAAC;SAC3D,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;SACvD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAE5B,UAAU;SACP,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;SACxD,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC;SAC3D,MAAM,CAAC,qBAAqB,EAAE,+BAA+B,CAAC;SAC9D,MAAM,CAAC,yBAAyB,EAAE,wBAAwB,CAAC;SAC3D,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;SACvD,MAAM,CAAC,mBAAmB,EAAE,wCAAwC,CAAC;SACrE,MAAM,CAAC,uCAAuC,EAAE,yHAAyH,CAAC;SAC1K,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAE5B,UAAU;SACP,OAAO,CAAC,qBAAqB,CAAC;SAC9B,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,4EAA4E,CAAC;SACzF,MAAM,CAAC,SAAS,EAAE,iEAAiE,CAAC;SACpF,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAE5B,UAAU;SACP,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,cAAc,CAAC,CAAC;IAE1B,UAAU;SACP,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CACV,qFAAqF;QACrF,6FAA6F;QAC7F,0CAA0C;QAC1C,0FAA0F;QAC1F,4BAA4B,CAC7B;SACA,MAAM,CAAC,eAAe,EAAE,+CAA+C,CAAC;SACxE,MAAM,CACL,oBAAoB,EACpB,0FAA0F;QAC1F,+FAA+F;QAC/F,sGAAsG,CACvG;SACA,MAAM,CAAC,2BAA2B,EAAE,oEAAoE,CAAC;SACzG,MAAM,CAAC,0BAA0B,EAAE,qFAAqF,CAAC;SACzH,MAAM,CAAC,wBAAwB,EAAE,iFAAiF,CAAC;SACnH,MAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC;SAC1D,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CzB,CAAC;SACG,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,UAAU;SACP,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CACV,sFAAsF;QACtF,mFAAmF,CACpF;SACA,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;CAgBzB,CAAC;SACG,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAEjC,4EAA4E;IAC5E,gBAAgB;IAChB,4EAA4E;IAC5E,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;IAE5E,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,gBAAgB,CAAC;SAC7B,MAAM,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,SAAS,CAAC,CAAC;IAErB,IAAI;SACD,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,kBAAkB,CAAC;SAC/B,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnB,IAAI;SACD,OAAO,CAAC,wBAAwB,CAAC;SACjC,WAAW,CAAC,2FAA2F,CAAC;SACxG,MAAM,CAAC,eAAe,EAAE,WAAW,CAAC;SACpC,MAAM,CAAC,sBAAsB,EAAE,kBAAkB,CAAC;SAClD,MAAM,CAAC,mBAAmB,EAAE,2IAA2I,CAAC;SACxK,MAAM,CAAC,wBAAwB,EAAE,gEAAgE,CAAC;SAClG,MAAM,CAAC,6BAA6B,EAAE,iHAAiH,CAAC;SACxJ,MAAM,CAAC,+BAA+B,EAAE,uEAAuE,CAAC;SAChH,MAAM,CAAC,0BAA0B,EAAE,sEAAsE,CAAC;SAC1G,MAAM,CAAC,yBAAyB,EAAE,wBAAwB,CAAC;SAC3D,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;SACvD,MAAM,CAAC,gCAAgC,EAAE,mEAAmE,CAAC;SAC7G,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCzB,CAAC;SACG,MAAM,CAAC,UAAU,CAAC,CAAC;IAEtB,IAAI;SACD,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,eAAe,CAAC;SAC5B,MAAM,CAAC,sBAAsB,EAAE,kBAAkB,CAAC;SAClD,MAAM,CAAC,6BAA6B,EAAE,4DAA4D,CAAC;SACnG,MAAM,CAAC,+BAA+B,EAAE,4DAA4D,CAAC;SACrG,MAAM,CAAC,0BAA0B,EAAE,2DAA2D,CAAC;SAC/F,MAAM,CAAC,yBAAyB,EAAE,wBAAwB,CAAC;SAC3D,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;SACvD,MAAM,CAAC,kBAAkB,EAAE,qCAAqC,CAAC;SACjE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEtB,IAAI;SACD,OAAO,CAAC,kBAAkB,CAAC;SAC3B,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,SAAS,EAAE,iEAAiE,CAAC;SACpF,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEtB,4EAA4E;IAC5E,uBAAuB;IACvB,4EAA4E;IAC5E,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,WAAW,CAAC,+BAA+B,CAAC,CAAC;IAEzG,KAAK;SACF,OAAO,CAAC,oBAAoB,CAAC;SAC7B,KAAK,CAAC,KAAK,CAAC;SACZ,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,iBAAiB,EAAE,2BAA2B,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,4EAA4E;IAC5E,iBAAiB;IACjB,4EAA4E;IAC5E,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAE/E,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,aAAa,EAAE,mBAAmB,CAAC;SAC1C,MAAM,CAAC,mBAAmB,EAAE,8DAA8D,CAAC;SAC3F,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEtB,KAAK;SACF,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEpB,KAAK;SACF,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,eAAe,CAAC;SAC5B,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;SAC/C,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEtB,KAAK;SACF,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,2DAA2D,CAAC;SACxE,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;SAChD,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAAC;SACtC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,WAAW,CAAC,CAAC;IAEvB,4EAA4E;IAC5E,yBAAyB;IACzB,4EAA4E;IAC5E,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAEtC,4EAA4E;IAC5E,qBAAqB;IACrB,4EAA4E;IAC5E,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAO9C,OAAO,EACL,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,SAAS,EACT,OAAO,EACP,UAAU,EACV,UAAU,EACV,UAAU,GACX,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EACL,UAAU,EACV,QAAQ,EACR,UAAU,EACV,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAE7B,kBAAkB;AAClB,cAAc,YAAY,CAAC;AAE3B,MAAM,UAAU,8BAA8B,CAAC,OAAgB;IAC7D,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,6DAA6D,CAAC;SAC1E,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;CAsBzB,CAAC,CAAC;IAED,4EAA4E;IAC5E,sBAAsB;IACtB,4EAA4E;IAC5E,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,6BAA6B,CAAC,CAAC;IAE1G,UAAU;SACP,OAAO,CAAC,MAAM,CAAC;SACf,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,eAAe,CAAC,CAAC;IAE3B,UAAU;SACP,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,aAAa,CAAC,CAAC;IAEzB,UAAU;SACP,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,eAAe,EAAE,iBAAiB,CAAC;SAC1C,MAAM,CAAC,eAAe,EAAE,qCAAqC,CAAC;SAC9D,MAAM,CAAC,8BAA8B,EAAE,4BAA4B,CAAC;SACpE,MAAM,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;SACxD,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC;SAC3D,MAAM,CAAC,qBAAqB,EAAE,+BAA+B,CAAC;SAC9D,MAAM,CAAC,yBAAyB,EAAE,wBAAwB,CAAC;SAC3D,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;SACvD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAE5B,UAAU;SACP,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;SACxD,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC;SAC3D,MAAM,CAAC,qBAAqB,EAAE,+BAA+B,CAAC;SAC9D,MAAM,CAAC,yBAAyB,EAAE,wBAAwB,CAAC;SAC3D,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;SACvD,MAAM,CAAC,mBAAmB,EAAE,wCAAwC,CAAC;SACrE,MAAM,CAAC,uCAAuC,EAAE,yHAAyH,CAAC;SAC1K,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAE5B,UAAU;SACP,OAAO,CAAC,qBAAqB,CAAC;SAC9B,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,4EAA4E,CAAC;SACzF,MAAM,CAAC,SAAS,EAAE,iEAAiE,CAAC;SACpF,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAE5B,UAAU;SACP,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,cAAc,CAAC,CAAC;IAE1B,UAAU;SACP,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CACV,qFAAqF;QACrF,6FAA6F;QAC7F,0CAA0C;QAC1C,0FAA0F;QAC1F,4BAA4B,CAC7B;SACA,MAAM,CAAC,eAAe,EAAE,+CAA+C,CAAC;SACxE,MAAM,CACL,oBAAoB,EACpB,0FAA0F;QAC1F,+FAA+F;QAC/F,sGAAsG,CACvG;SACA,MAAM,CAAC,2BAA2B,EAAE,oEAAoE,CAAC;SACzG,MAAM,CAAC,0BAA0B,EAAE,qFAAqF,CAAC;SACzH,MAAM,CAAC,wBAAwB,EAAE,iFAAiF,CAAC;SACnH,MAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC;SAC1D,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CzB,CAAC;SACG,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,UAAU;SACP,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CACV,sFAAsF;QACtF,mFAAmF,CACpF;SACA,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;CAgBzB,CAAC;SACG,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAEjC,4EAA4E;IAC5E,gBAAgB;IAChB,4EAA4E;IAC5E,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;IAE5E,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,gBAAgB,CAAC;SAC7B,MAAM,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,SAAS,CAAC,CAAC;IAErB,IAAI;SACD,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,kBAAkB,CAAC;SAC/B,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnB,IAAI;SACD,OAAO,CAAC,wBAAwB,CAAC;SACjC,WAAW,CAAC,2FAA2F,CAAC;SACxG,MAAM,CAAC,eAAe,EAAE,WAAW,CAAC;SACpC,MAAM,CAAC,sBAAsB,EAAE,kBAAkB,CAAC;SAClD,MAAM,CAAC,mBAAmB,EAAE,0KAA0K,CAAC;SACvM,MAAM,CAAC,wBAAwB,EAAE,gEAAgE,CAAC;SAClG,MAAM,CAAC,6BAA6B,EAAE,iHAAiH,CAAC;SACxJ,MAAM,CAAC,+BAA+B,EAAE,uEAAuE,CAAC;SAChH,MAAM,CAAC,0BAA0B,EAAE,sEAAsE,CAAC;SAC1G,MAAM,CAAC,yBAAyB,EAAE,wBAAwB,CAAC;SAC3D,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;SACvD,MAAM,CAAC,gCAAgC,EAAE,mEAAmE,CAAC;SAC7G,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2CzB,CAAC;SACG,MAAM,CAAC,UAAU,CAAC,CAAC;IAEtB,IAAI;SACD,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,eAAe,CAAC;SAC5B,cAAc,CAAC,gCAAgC,EAAE,8CAA8C,CAAC;SAChG,MAAM,CAAC,sBAAsB,EAAE,kBAAkB,CAAC;SAClD,MAAM,CAAC,6BAA6B,EAAE,4DAA4D,CAAC;SACnG,MAAM,CAAC,+BAA+B,EAAE,4DAA4D,CAAC;SACrG,MAAM,CAAC,0BAA0B,EAAE,2DAA2D,CAAC;SAC/F,MAAM,CAAC,yBAAyB,EAAE,wBAAwB,CAAC;SAC3D,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;SACvD,MAAM,CAAC,kBAAkB,EAAE,qCAAqC,CAAC;SACjE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEtB,IAAI;SACD,OAAO,CAAC,kBAAkB,CAAC;SAC3B,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,6DAA6D,CAAC;SAC1E,cAAc,CAAC,gCAAgC,EAAE,8CAA8C,CAAC;SAChG,MAAM,CAAC,SAAS,EAAE,iEAAiE,CAAC;SACpF,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEtB,4EAA4E;IAC5E,uBAAuB;IACvB,4EAA4E;IAC5E,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,WAAW,CAAC,+BAA+B,CAAC,CAAC;IAEzG,KAAK;SACF,OAAO,CAAC,oBAAoB,CAAC;SAC7B,KAAK,CAAC,KAAK,CAAC;SACZ,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,iBAAiB,EAAE,2BAA2B,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,4EAA4E;IAC5E,iBAAiB;IACjB,4EAA4E;IAC5E,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAE/E,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,aAAa,EAAE,mBAAmB,CAAC;SAC1C,MAAM,CAAC,mBAAmB,EAAE,8DAA8D,CAAC;SAC3F,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEtB,KAAK;SACF,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEpB,KAAK;SACF,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,eAAe,CAAC;SAC5B,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;SAC/C,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEtB,KAAK;SACF,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,2DAA2D,CAAC;SACxE,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;SAChD,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAAC;SACtC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,WAAW,CAAC,CAAC;IAEvB,4EAA4E;IAC5E,yBAAyB;IACzB,4EAA4E;IAC5E,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAEtC,4EAA4E;IAC5E,qBAAqB;IACrB,4EAA4E;IAC5E,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAEnC,4EAA4E;IAC5E,oBAAoB;IACpB,4EAA4E;IAC5E,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,mEAAmE,CAAC,CAAC;IAEpF,KAAK;SACF,OAAO,CAAC,yBAAyB,CAAC;SAClC,WAAW,CAAC,gEAAgE,CAAC;SAC7E,cAAc,CAAC,4BAA4B,EAAE,4CAA4C,CAAC;SAC1F,cAAc,CAAC,8BAA8B,EAAE,oCAAoC,CAAC;SACpF,cAAc,CAAC,qCAAqC,EAAE,6CAA6C,CAAC;SACpG,cAAc,CAAC,0BAA0B,EAAE,mCAAmC,CAAC;SAC/E,cAAc,CAAC,qBAAqB,EAAE,6BAA6B,CAAC;SACpE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAE7B,KAAK;SACF,OAAO,CAAC,2BAA2B,CAAC;SACpC,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAElC,KAAK;SACF,OAAO,CAAC,0BAA0B,CAAC;SACnC,WAAW,CAAC,qEAAqE,CAAC;SAClF,cAAc,CAAC,4BAA4B,EAAE,6BAA6B,CAAC;SAC3E,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAE9B,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kDAAkD,CAAC,CAAC;IAEnE,MAAM;SACH,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,6EAA6E,CAAC;SAC1F,cAAc,CAAC,iBAAiB,EAAE,wBAAwB,CAAC;SAC3D,cAAc,CAAC,4BAA4B,EAAE,sCAAsC,CAAC;SACpF,cAAc,CAAC,iBAAiB,EAAE,6CAA6C,CAAC;SAChF,cAAc,CAAC,0BAA0B,EAAE,iBAAiB,CAAC;SAC7D,cAAc,CAAC,8BAA8B,EAAE,4BAA4B,CAAC;SAC5E,MAAM,CACL,+BAA+B,EAC/B,wDAAwD,EACxD,MAAM,CACP;SACA,cAAc,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;SAChE,cAAc,CACb,0BAA0B,EAC1B,iFAAiF,CAClF;SACA,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,eAAe,CAAC,CAAC;IAE3B,MAAM;SACH,OAAO,CAAC,iCAAiC,CAAC;SAC1C,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAElC,MAAM;SACH,OAAO,CAAC,iCAAiC,CAAC;SAC1C,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;SAChD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,mBAAmB,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { PermitIssueOptions, PermitRevokeOptions, PermitStatusOptions } from './recovery-types.js';
2
+ export declare function issueMintPermit(roleId: string, options: PermitIssueOptions): Promise<void>;
3
+ export declare function getMintOperationStatus(permitId: string, requestId: string, options: PermitStatusOptions): Promise<void>;
4
+ export declare function revokeMintOperation(permitId: string, requestId: string, options: PermitRevokeOptions): Promise<void>;
5
+ //# sourceMappingURL=permit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permit.d.ts","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/permit.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAoC7B,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqChG;AAED,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAgBf"}
@@ -0,0 +1,104 @@
1
+ import { client } from '../../lib/client.js';
2
+ import * as output from '../../lib/output.js';
3
+ import { idempotencyUuid, positiveSafeInteger } from './recovery-parse.js';
4
+ function printPermit(permit) {
5
+ output.keyValue({
6
+ 'Permit ID': permit.permitId,
7
+ 'Fence ID': permit.fenceId,
8
+ 'Fence epoch': permit.fenceEpoch,
9
+ 'State': permit.state,
10
+ 'Consumer API key': permit.consumerApiKeyId,
11
+ 'Phase': permit.phase,
12
+ 'Overlay': permit.privilegeOverlay,
13
+ 'Mints': `${permit.mintsConsumed.toString()}/${permit.maxMints.toString()}`,
14
+ 'Credential TTL': `${permit.credentialTtlSeconds.toString()}s`,
15
+ 'Expires': permit.expiresAt,
16
+ 'Role revision': permit.roleRevision,
17
+ 'Role config SHA-256': permit.roleConfigSha256,
18
+ 'Effective grant plan SHA-256': permit.effectiveGrantPlanSha256,
19
+ });
20
+ }
21
+ function printOperation(operation) {
22
+ output.keyValue({
23
+ 'Operation ID': operation.operationId,
24
+ 'Permit ID': operation.permitId,
25
+ 'Request ID': operation.requestId,
26
+ 'State': operation.state,
27
+ 'Fence ID': operation.fenceId,
28
+ 'Fence epoch': operation.fenceEpoch,
29
+ 'Role ID': operation.roleId,
30
+ 'Role revision': operation.roleRevision,
31
+ 'Lease ID': operation.leaseId ?? '-',
32
+ 'Credential expires': operation.credentialExpiresAt ?? '-',
33
+ 'Last error': operation.lastErrorCode ?? '-',
34
+ });
35
+ }
36
+ export async function issueMintPermit(roleId, options) {
37
+ const spinner = output.spinner('Issuing one-shot recovery mint permit...').start();
38
+ try {
39
+ if (options.privilegeOverlay !== 'NONE'
40
+ && options.privilegeOverlay !== 'MYSQL_SCHEMA_LOCK_TABLES') {
41
+ throw new Error('--privilege-overlay must be NONE or MYSQL_SCHEMA_LOCK_TABLES');
42
+ }
43
+ const privilegeOverlay = options.privilegeOverlay;
44
+ const response = await client.request({
45
+ method: 'POST',
46
+ path: `/v1/dynamic-secrets/roles/${encodeURIComponent(roleId)}/mint-permits`,
47
+ headers: { 'Idempotency-Key': idempotencyUuid(options.idempotencyKey) },
48
+ body: {
49
+ fenceId: options.fenceId,
50
+ consumerApiKeyId: options.consumerApiKeyId,
51
+ phase: options.phase,
52
+ expiresInSeconds: positiveSafeInteger(options.expiresInSeconds, '--expires-in-seconds'),
53
+ credentialTtlSeconds: positiveSafeInteger(options.credentialTtlSeconds, '--credential-ttl-seconds'),
54
+ privilegeOverlay,
55
+ reason: options.reason,
56
+ },
57
+ });
58
+ spinner.succeed('Recovery mint permit issued');
59
+ if (options.json)
60
+ output.json(response);
61
+ else
62
+ printPermit(response);
63
+ }
64
+ catch (err) {
65
+ spinner.fail('Failed to issue recovery mint permit');
66
+ output.error(err instanceof Error ? err.message : String(err));
67
+ process.exit(1);
68
+ }
69
+ }
70
+ export async function getMintOperationStatus(permitId, requestId, options) {
71
+ const spinner = output.spinner('Fetching recovery mint operation...').start();
72
+ try {
73
+ const response = await client.get(`/v1/dynamic-secrets/mint-permits/${encodeURIComponent(permitId)}` +
74
+ `/operations/${encodeURIComponent(requestId)}`);
75
+ spinner.stop();
76
+ if (options.json)
77
+ output.json(response);
78
+ else
79
+ printOperation(response);
80
+ }
81
+ catch (err) {
82
+ spinner.fail('Failed to fetch recovery mint operation');
83
+ output.error(err instanceof Error ? err.message : String(err));
84
+ process.exit(1);
85
+ }
86
+ }
87
+ export async function revokeMintOperation(permitId, requestId, options) {
88
+ const spinner = output.spinner('Revoking recovery mint operation...').start();
89
+ try {
90
+ const response = await client.put(`/v1/dynamic-secrets/mint-permits/${encodeURIComponent(permitId)}` +
91
+ `/operations/${encodeURIComponent(requestId)}/revoke`, options.reason ? { reason: options.reason } : {});
92
+ spinner.succeed('Recovery mint operation revoked');
93
+ if (options.json)
94
+ output.json(response);
95
+ else
96
+ printOperation(response);
97
+ }
98
+ catch (err) {
99
+ spinner.fail('Failed to revoke recovery mint operation');
100
+ output.error(err instanceof Error ? err.message : String(err));
101
+ process.exit(1);
102
+ }
103
+ }
104
+ //# sourceMappingURL=permit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permit.js","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/permit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { RecoveryFenceCloseOptions, RecoveryFenceOpenOptions, RecoveryFenceStatusOptions } from './recovery-types.js';
2
+ export declare function openRecoveryFence(roleId: string, runId: string, options: RecoveryFenceOpenOptions): Promise<void>;
3
+ export declare function getRecoveryFenceStatus(roleId: string, runId: string, options: RecoveryFenceStatusOptions): Promise<void>;
4
+ export declare function closeRecoveryFence(roleId: string, runId: string, options: RecoveryFenceCloseOptions): Promise<void>;
5
+ //# sourceMappingURL=recovery-fence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-fence.d.ts","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/recovery-fence.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,yBAAyB,EACzB,wBAAwB,EACxB,0BAA0B,EAC3B,MAAM,qBAAqB,CAAC;AA4B7B,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAcf"}
@@ -0,0 +1,84 @@
1
+ import { client } from '../../lib/client.js';
2
+ import * as output from '../../lib/output.js';
3
+ import { positiveSafeInteger, sha256Hex } from './recovery-parse.js';
4
+ function fencePath(roleId, runId) {
5
+ return `/v1/dynamic-secrets/roles/${encodeURIComponent(roleId)}` +
6
+ `/recovery-fences/${encodeURIComponent(runId)}`;
7
+ }
8
+ function printFence(fence) {
9
+ output.keyValue({
10
+ 'Fence ID': fence.fenceId,
11
+ 'Run ID': fence.runId,
12
+ 'State': fence.state,
13
+ 'Fence epoch': fence.fenceEpoch,
14
+ 'Close epoch': fence.closeEpoch ?? '-',
15
+ 'Role enabled': String(fence.roleEnabled),
16
+ 'Role revision': fence.roleRevision,
17
+ 'Role config SHA-256': fence.roleConfigSha256,
18
+ 'Grant plan SHA-256': fence.grantPlanSha256,
19
+ 'In-flight mints': fence.inFlightMints,
20
+ 'Active leases': fence.activeLeases,
21
+ 'Recovery required': fence.recoveryRequired,
22
+ 'Non-terminal operations': fence.nonterminalOperations,
23
+ 'Ready permits': fence.readyPermits,
24
+ 'Expires': fence.expiresAt,
25
+ 'Closed': fence.closedAt ?? '-',
26
+ });
27
+ }
28
+ export async function openRecoveryFence(roleId, runId, options) {
29
+ const spinner = output.spinner('Opening PostgreSQL-authoritative recovery fence...').start();
30
+ try {
31
+ const response = await client.put(fencePath(roleId, runId), {
32
+ consumerApiKeyId: options.consumerApiKeyId,
33
+ expectedRoleRevision: positiveSafeInteger(options.expectedRoleRevision, '--expected-role-revision'),
34
+ expectedRoleConfigSha256: sha256Hex(options.expectedRoleConfigSha256, '--expected-role-config-sha256'),
35
+ expiresInSeconds: positiveSafeInteger(options.expiresInSeconds, '--expires-in-seconds'),
36
+ purpose: options.purpose,
37
+ });
38
+ spinner.succeed('Recovery fence opened');
39
+ if (options.json)
40
+ output.json(response);
41
+ else
42
+ printFence(response);
43
+ }
44
+ catch (err) {
45
+ spinner.fail('Failed to open recovery fence');
46
+ output.error(err instanceof Error ? err.message : String(err));
47
+ process.exit(1);
48
+ }
49
+ }
50
+ export async function getRecoveryFenceStatus(roleId, runId, options) {
51
+ const spinner = output.spinner('Fetching recovery fence...').start();
52
+ try {
53
+ const response = await client.get(fencePath(roleId, runId));
54
+ spinner.stop();
55
+ if (options.json)
56
+ output.json(response);
57
+ else
58
+ printFence(response);
59
+ }
60
+ catch (err) {
61
+ spinner.fail('Failed to fetch recovery fence');
62
+ output.error(err instanceof Error ? err.message : String(err));
63
+ process.exit(1);
64
+ }
65
+ }
66
+ export async function closeRecoveryFence(roleId, runId, options) {
67
+ const spinner = output.spinner('Closing and verifying recovery fence...').start();
68
+ try {
69
+ const response = await client.put(`${fencePath(roleId, runId)}/close`, {
70
+ expectedFenceEpoch: positiveSafeInteger(options.expectedFenceEpoch, '--expected-fence-epoch'),
71
+ });
72
+ spinner.succeed('Recovery fence closed and verified');
73
+ if (options.json)
74
+ output.json(response);
75
+ else
76
+ printFence(response);
77
+ }
78
+ catch (err) {
79
+ spinner.fail('Failed to close recovery fence');
80
+ output.error(err instanceof Error ? err.message : String(err));
81
+ process.exit(1);
82
+ }
83
+ }
84
+ //# sourceMappingURL=recovery-fence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-fence.js","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/recovery-fence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function positiveSafeInteger(raw: string, option: string): number;
2
+ export declare function sha256Hex(raw: string, option: string): string;
3
+ export declare function idempotencyUuid(raw: string): string;
4
+ //# sourceMappingURL=recovery-parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-parse.d.ts","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/recovery-parse.ts"],"names":[],"mappings":"AAGA,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAMvE;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAK7D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKnD"}
@@ -0,0 +1,22 @@
1
+ const SHA256_HEX = /^[0-9a-f]{64}$/;
2
+ const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
3
+ export function positiveSafeInteger(raw, option) {
4
+ const value = Number(raw);
5
+ if (!Number.isSafeInteger(value) || value <= 0) {
6
+ throw new Error(`${option} must be a positive integer`);
7
+ }
8
+ return value;
9
+ }
10
+ export function sha256Hex(raw, option) {
11
+ if (!SHA256_HEX.test(raw)) {
12
+ throw new Error(`${option} must be a lowercase SHA-256 hex digest`);
13
+ }
14
+ return raw;
15
+ }
16
+ export function idempotencyUuid(raw) {
17
+ if (!UUID.test(raw)) {
18
+ throw new Error('--idempotency-key must be a UUID');
19
+ }
20
+ return raw;
21
+ }
22
+ //# sourceMappingURL=recovery-parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-parse.js","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/recovery-parse.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG,gBAAgB,CAAC;AACpC,MAAM,IAAI,GAAG,4EAA4E,CAAC;AAE1F,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,MAAc;IAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,6BAA6B,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,MAAc;IACnD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,yCAAyC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,117 @@
1
+ /** Wire contracts for Dynamic Secrets Recovery Fence v1. */
2
+ export type RecoveryPrivilegeOverlay = 'NONE' | 'MYSQL_SCHEMA_LOCK_TABLES';
3
+ export type RecoveryFenceState = 'OPEN' | 'CLOSING' | 'CLOSED';
4
+ export type MintPermitState = 'READY' | 'CONSUMED';
5
+ export type MintOperationState = 'READY' | 'CLAIMED' | 'UNKNOWN' | 'CONSUMED' | 'DELIVERED' | 'REVOKING' | 'REVOKED' | 'CANCELLED_NO_TARGET' | 'FAILED_NO_TARGET' | 'EXPIRED_REVOKED' | 'RECOVERY_REQUIRED';
6
+ export interface RecoveryFence {
7
+ fenceId: string;
8
+ runId: string;
9
+ fenceEpoch: number;
10
+ closeEpoch: number | null;
11
+ state: RecoveryFenceState;
12
+ roleEnabled: false;
13
+ roleRevision: number;
14
+ roleConfigSha256: string;
15
+ grantPlanSha256: string;
16
+ inFlightMints: number;
17
+ activeLeases: number;
18
+ recoveryRequired: number;
19
+ nonterminalOperations: number;
20
+ readyPermits: number;
21
+ expiresAt: string;
22
+ closedAt: string | null;
23
+ }
24
+ export interface MintPermit {
25
+ permitId: string;
26
+ fenceId: string;
27
+ fenceEpoch: number;
28
+ state: MintPermitState;
29
+ maxMints: 1;
30
+ mintsConsumed: 0 | 1;
31
+ roleRevision: number;
32
+ roleConfigSha256: string;
33
+ grantPlanSha256: string;
34
+ effectiveGrantPlanSha256: string;
35
+ consumerApiKeyId: string;
36
+ phase: string;
37
+ privilegeOverlay: RecoveryPrivilegeOverlay;
38
+ credentialTtlSeconds: number;
39
+ expiresAt: string;
40
+ }
41
+ export interface RecoveryHpkeEnvelope {
42
+ version: 'hpke-v1';
43
+ suite: 'X25519-HKDF-SHA256-ChaCha20Poly1305';
44
+ enc: string;
45
+ ciphertext: string;
46
+ aadSha256: string;
47
+ }
48
+ export interface RecoveryHpkeCredential {
49
+ permitId: string;
50
+ requestId: string;
51
+ state: 'CONSUMED' | 'DELIVERED';
52
+ envelopeSha256: string;
53
+ deliveryFormat: 'hpke-v1';
54
+ envelope: RecoveryHpkeEnvelope;
55
+ aad: string;
56
+ }
57
+ export interface MintOperation {
58
+ operationId: string;
59
+ tenantId: string;
60
+ permitId: string;
61
+ requestId: string;
62
+ state: MintOperationState;
63
+ fenceId: string;
64
+ fenceEpoch: number;
65
+ roleId: string;
66
+ roleRevision: number;
67
+ roleConfigSha256: string;
68
+ grantPlanSha256: string;
69
+ effectiveGrantPlanSha256: string;
70
+ privilegeOverlay: RecoveryPrivilegeOverlay;
71
+ consumerApiKeyId: string;
72
+ leaseId: string | null;
73
+ username: string | null;
74
+ credentialExpiresAt: string | null;
75
+ createdAt: string;
76
+ claimedAt: string | null;
77
+ consumedAt: string | null;
78
+ deliveredAt: string | null;
79
+ terminalAt: string | null;
80
+ lastErrorCode: string | null;
81
+ credential?: RecoveryHpkeCredential;
82
+ }
83
+ export interface PermitIssueOptions {
84
+ fenceId: string;
85
+ consumerApiKeyId: string;
86
+ phase: string;
87
+ expiresInSeconds: string;
88
+ credentialTtlSeconds: string;
89
+ /** Untrusted Commander string; validated before the request is sent. */
90
+ privilegeOverlay: string;
91
+ reason: string;
92
+ idempotencyKey: string;
93
+ json?: boolean;
94
+ }
95
+ export interface PermitStatusOptions {
96
+ json?: boolean;
97
+ }
98
+ export interface PermitRevokeOptions {
99
+ reason?: string;
100
+ json?: boolean;
101
+ }
102
+ export interface RecoveryFenceOpenOptions {
103
+ consumerApiKeyId: string;
104
+ expectedRoleRevision: string;
105
+ expectedRoleConfigSha256: string;
106
+ expiresInSeconds: string;
107
+ purpose: string;
108
+ json?: boolean;
109
+ }
110
+ export interface RecoveryFenceStatusOptions {
111
+ json?: boolean;
112
+ }
113
+ export interface RecoveryFenceCloseOptions {
114
+ expectedFenceEpoch: string;
115
+ json?: boolean;
116
+ }
117
+ //# sourceMappingURL=recovery-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-types.d.ts","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/recovery-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Wire contracts for Dynamic Secrets Recovery Fence v1. */
2
+ export {};
3
+ //# sourceMappingURL=recovery-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-types.js","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/recovery-types.ts"],"names":[],"mappings":"AAAA,4DAA4D"}
@@ -1,4 +1,4 @@
1
- import type { RoleCreateOptions, RoleUpdateOptions } from './types.js';
1
+ import type { RoleCreateOptions, RoleDeleteOptions, RoleUpdateOptions } from './types.js';
2
2
  export declare function listRoles(options: {
3
3
  connection?: string;
4
4
  json?: boolean;
@@ -8,8 +8,5 @@ export declare function getRole(roleId: string, options: {
8
8
  }): Promise<void>;
9
9
  export declare function createRole(connectionId: string, options: RoleCreateOptions): Promise<void>;
10
10
  export declare function updateRole(roleId: string, options: RoleUpdateOptions): Promise<void>;
11
- export declare function deleteRole(roleId: string, options: {
12
- force?: boolean;
13
- json?: boolean;
14
- }): Promise<void>;
11
+ export declare function deleteRole(roleId: string, options: RoleDeleteOptions): Promise<void>;
15
12
  //# sourceMappingURL=role.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"role.d.ts","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/role.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAgC,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGrG,wBAAsB,SAAS,CAAC,OAAO,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C/F;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BxF;AAcD,wBAAsB,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyFhG;AAqDD,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B1F;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B5G"}
1
+ {"version":3,"file":"role.d.ts","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/role.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAGV,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAIpB,wBAAsB,SAAS,CAAC,OAAO,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C/F;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCxF;AAcD,wBAAsB,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyFhG;AAqDD,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B1F;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC1F"}
@@ -7,6 +7,7 @@ import inquirer from 'inquirer';
7
7
  import { client } from '../../lib/client.js';
8
8
  import * as output from '../../lib/output.js';
9
9
  import { formatDate, formatTtl } from './helpers.js';
10
+ import { positiveSafeInteger } from './recovery-parse.js';
10
11
  export async function listRoles(options) {
11
12
  const spinner = output.spinner('Fetching roles...').start();
12
13
  try {
@@ -65,6 +66,9 @@ export async function getRole(roleId, options) {
65
66
  'Username Template': response.usernameTemplate,
66
67
  'Default TTL': formatTtl(response.defaultTtlSeconds),
67
68
  'Max TTL': formatTtl(response.maxTtlSeconds),
69
+ 'Config Revision': response.configRevision?.toString() ?? '-',
70
+ 'Config SHA-256': response.configSha256 ?? '-',
71
+ 'Grant Plan SHA-256': response.grantPlanSha256 ?? '-',
68
72
  'Active Leases': String(response.activeLeases ?? 0),
69
73
  'Created': formatDate(response.createdAt),
70
74
  'Updated': formatDate(response.updatedAt),
@@ -224,7 +228,9 @@ function describeRoleCreateError(err, options) {
224
228
  export async function updateRole(roleId, options) {
225
229
  const spinner = output.spinner('Updating role...').start();
226
230
  try {
227
- const body = {};
231
+ const body = {
232
+ expectedConfigRevision: positiveSafeInteger(options.expectedConfigRevision, '--expected-config-revision'),
233
+ };
228
234
  if (options.description !== undefined)
229
235
  body.description = options.description;
230
236
  if (options.creationStatements)
@@ -269,7 +275,9 @@ export async function deleteRole(roleId, options) {
269
275
  }
270
276
  const spinner = output.spinner('Deleting role...').start();
271
277
  try {
272
- await client.delete(`/v1/dynamic-secrets/roles/${roleId}`);
278
+ const expectedConfigRevision = positiveSafeInteger(options.expectedConfigRevision, '--expected-config-revision');
279
+ await client.delete(`/v1/dynamic-secrets/roles/${roleId}`
280
+ + `?expectedConfigRevision=${expectedConfigRevision.toString()}`);
273
281
  spinner.succeed('Role deleted');
274
282
  if (options.json) {
275
283
  output.json({ success: true, roleId });