@zincapp/znvault-cli 3.3.1 → 4.0.2

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 (221) hide show
  1. package/README.md +32 -28
  2. package/dist/commands/advisor.d.ts +14 -1
  3. package/dist/commands/advisor.d.ts.map +1 -1
  4. package/dist/commands/advisor.js +355 -331
  5. package/dist/commands/advisor.js.map +1 -1
  6. package/dist/commands/agent/index.d.ts +2 -1
  7. package/dist/commands/agent/index.d.ts.map +1 -1
  8. package/dist/commands/agent/index.js +23 -19
  9. package/dist/commands/agent/index.js.map +1 -1
  10. package/dist/commands/apikey/conditions.d.ts.map +1 -1
  11. package/dist/commands/apikey/conditions.js +4 -3
  12. package/dist/commands/apikey/conditions.js.map +1 -1
  13. package/dist/commands/apikey/create.d.ts.map +1 -1
  14. package/dist/commands/apikey/create.js +4 -2
  15. package/dist/commands/apikey/create.js.map +1 -1
  16. package/dist/commands/apikey/delete.d.ts.map +1 -1
  17. package/dist/commands/apikey/delete.js +4 -2
  18. package/dist/commands/apikey/delete.js.map +1 -1
  19. package/dist/commands/apikey/enable-disable.d.ts.map +1 -1
  20. package/dist/commands/apikey/enable-disable.js +7 -4
  21. package/dist/commands/apikey/enable-disable.js.map +1 -1
  22. package/dist/commands/apikey/helpers.d.ts +16 -0
  23. package/dist/commands/apikey/helpers.d.ts.map +1 -1
  24. package/dist/commands/apikey/helpers.js +9 -0
  25. package/dist/commands/apikey/helpers.js.map +1 -1
  26. package/dist/commands/apikey/index.d.ts +2 -1
  27. package/dist/commands/apikey/index.d.ts.map +1 -1
  28. package/dist/commands/apikey/index.js +23 -14
  29. package/dist/commands/apikey/index.js.map +1 -1
  30. package/dist/commands/apikey/list.d.ts.map +1 -1
  31. package/dist/commands/apikey/list.js +4 -3
  32. package/dist/commands/apikey/list.js.map +1 -1
  33. package/dist/commands/apikey/managed/bind.d.ts.map +1 -1
  34. package/dist/commands/apikey/managed/bind.js +4 -3
  35. package/dist/commands/apikey/managed/bind.js.map +1 -1
  36. package/dist/commands/apikey/managed/conditions.d.ts.map +1 -1
  37. package/dist/commands/apikey/managed/conditions.js +5 -4
  38. package/dist/commands/apikey/managed/conditions.js.map +1 -1
  39. package/dist/commands/apikey/managed/config.d.ts.map +1 -1
  40. package/dist/commands/apikey/managed/config.js +4 -3
  41. package/dist/commands/apikey/managed/config.js.map +1 -1
  42. package/dist/commands/apikey/managed/create.d.ts.map +1 -1
  43. package/dist/commands/apikey/managed/create.js +4 -1
  44. package/dist/commands/apikey/managed/create.js.map +1 -1
  45. package/dist/commands/apikey/managed/delete.d.ts.map +1 -1
  46. package/dist/commands/apikey/managed/delete.js +4 -2
  47. package/dist/commands/apikey/managed/delete.js.map +1 -1
  48. package/dist/commands/apikey/managed/get.d.ts.map +1 -1
  49. package/dist/commands/apikey/managed/get.js +4 -2
  50. package/dist/commands/apikey/managed/get.js.map +1 -1
  51. package/dist/commands/apikey/managed/list.d.ts.map +1 -1
  52. package/dist/commands/apikey/managed/list.js +4 -2
  53. package/dist/commands/apikey/managed/list.js.map +1 -1
  54. package/dist/commands/apikey/managed/permissions.d.ts.map +1 -1
  55. package/dist/commands/apikey/managed/permissions.js +5 -3
  56. package/dist/commands/apikey/managed/permissions.js.map +1 -1
  57. package/dist/commands/apikey/managed/rotate.d.ts.map +1 -1
  58. package/dist/commands/apikey/managed/rotate.js +4 -3
  59. package/dist/commands/apikey/managed/rotate.js.map +1 -1
  60. package/dist/commands/apikey/permissions.d.ts.map +1 -1
  61. package/dist/commands/apikey/permissions.js +5 -3
  62. package/dist/commands/apikey/permissions.js.map +1 -1
  63. package/dist/commands/apikey/policies.d.ts.map +1 -1
  64. package/dist/commands/apikey/policies.js +10 -7
  65. package/dist/commands/apikey/policies.js.map +1 -1
  66. package/dist/commands/apikey/rotate.d.ts.map +1 -1
  67. package/dist/commands/apikey/rotate.js +4 -3
  68. package/dist/commands/apikey/rotate.js.map +1 -1
  69. package/dist/commands/apikey/show.d.ts.map +1 -1
  70. package/dist/commands/apikey/show.js +5 -4
  71. package/dist/commands/apikey/show.js.map +1 -1
  72. package/dist/commands/audit.d.ts +2 -1
  73. package/dist/commands/audit.d.ts.map +1 -1
  74. package/dist/commands/audit.js +15 -3
  75. package/dist/commands/audit.js.map +1 -1
  76. package/dist/commands/cluster.d.ts.map +1 -1
  77. package/dist/commands/cluster.js +31 -14
  78. package/dist/commands/cluster.js.map +1 -1
  79. package/dist/commands/group.d.ts +2 -1
  80. package/dist/commands/group.d.ts.map +1 -1
  81. package/dist/commands/group.js +61 -39
  82. package/dist/commands/group.js.map +1 -1
  83. package/dist/commands/health.d.ts.map +1 -1
  84. package/dist/commands/health.js +6 -5
  85. package/dist/commands/health.js.map +1 -1
  86. package/dist/commands/host/index.d.ts +2 -1
  87. package/dist/commands/host/index.d.ts.map +1 -1
  88. package/dist/commands/host/index.js +22 -18
  89. package/dist/commands/host/index.js.map +1 -1
  90. package/dist/commands/kms/crud.d.ts +1 -1
  91. package/dist/commands/kms/crud.d.ts.map +1 -1
  92. package/dist/commands/kms/crud.js +6 -6
  93. package/dist/commands/kms/crud.js.map +1 -1
  94. package/dist/commands/kms/index.d.ts +2 -1
  95. package/dist/commands/kms/index.d.ts.map +1 -1
  96. package/dist/commands/kms/index.js +14 -6
  97. package/dist/commands/kms/index.js.map +1 -1
  98. package/dist/commands/kms/lifecycle.d.ts +1 -1
  99. package/dist/commands/kms/lifecycle.d.ts.map +1 -1
  100. package/dist/commands/kms/lifecycle.js +7 -7
  101. package/dist/commands/kms/lifecycle.js.map +1 -1
  102. package/dist/commands/kms/routing.d.ts +5 -0
  103. package/dist/commands/kms/routing.d.ts.map +1 -1
  104. package/dist/commands/kms/routing.js +41 -5
  105. package/dist/commands/kms/routing.js.map +1 -1
  106. package/dist/commands/policy/attachments.d.ts +9 -5
  107. package/dist/commands/policy/attachments.d.ts.map +1 -1
  108. package/dist/commands/policy/attachments.js +16 -13
  109. package/dist/commands/policy/attachments.js.map +1 -1
  110. package/dist/commands/policy/crud.d.ts +6 -5
  111. package/dist/commands/policy/crud.d.ts.map +1 -1
  112. package/dist/commands/policy/crud.js +16 -11
  113. package/dist/commands/policy/crud.js.map +1 -1
  114. package/dist/commands/policy/helpers.d.ts +16 -0
  115. package/dist/commands/policy/helpers.d.ts.map +1 -1
  116. package/dist/commands/policy/helpers.js +9 -0
  117. package/dist/commands/policy/helpers.js.map +1 -1
  118. package/dist/commands/policy/index.d.ts +2 -1
  119. package/dist/commands/policy/index.d.ts.map +1 -1
  120. package/dist/commands/policy/index.js +149 -101
  121. package/dist/commands/policy/index.js.map +1 -1
  122. package/dist/commands/policy/io.d.ts +3 -2
  123. package/dist/commands/policy/io.d.ts.map +1 -1
  124. package/dist/commands/policy/io.js +7 -5
  125. package/dist/commands/policy/io.js.map +1 -1
  126. package/dist/commands/policy/list.d.ts +6 -2
  127. package/dist/commands/policy/list.d.ts.map +1 -1
  128. package/dist/commands/policy/list.js +7 -6
  129. package/dist/commands/policy/list.js.map +1 -1
  130. package/dist/commands/quarantine.d.ts +2 -1
  131. package/dist/commands/quarantine.d.ts.map +1 -1
  132. package/dist/commands/quarantine.js +394 -339
  133. package/dist/commands/quarantine.js.map +1 -1
  134. package/dist/commands/role.d.ts +2 -1
  135. package/dist/commands/role.d.ts.map +1 -1
  136. package/dist/commands/role.js +92 -49
  137. package/dist/commands/role.js.map +1 -1
  138. package/dist/commands/ssh/index.d.ts +2 -1
  139. package/dist/commands/ssh/index.d.ts.map +1 -1
  140. package/dist/commands/ssh/index.js +18 -13
  141. package/dist/commands/ssh/index.js.map +1 -1
  142. package/dist/commands/sso/crud.d.ts +1 -1
  143. package/dist/commands/sso/crud.d.ts.map +1 -1
  144. package/dist/commands/sso/crud.js +16 -16
  145. package/dist/commands/sso/crud.js.map +1 -1
  146. package/dist/commands/sso/helpers.d.ts +7 -1
  147. package/dist/commands/sso/helpers.d.ts.map +1 -1
  148. package/dist/commands/sso/helpers.js +32 -1
  149. package/dist/commands/sso/helpers.js.map +1 -1
  150. package/dist/commands/sso/index.d.ts +2 -1
  151. package/dist/commands/sso/index.d.ts.map +1 -1
  152. package/dist/commands/sso/index.js +13 -5
  153. package/dist/commands/sso/index.js.map +1 -1
  154. package/dist/commands/superadmin/accounts.d.ts +10 -0
  155. package/dist/commands/superadmin/accounts.d.ts.map +1 -0
  156. package/dist/commands/{superadmin.js → superadmin/accounts.js} +16 -15
  157. package/dist/commands/superadmin/accounts.js.map +1 -0
  158. package/dist/commands/superadmin/index.d.ts +20 -0
  159. package/dist/commands/superadmin/index.d.ts.map +1 -0
  160. package/dist/commands/superadmin/index.js +60 -0
  161. package/dist/commands/superadmin/index.js.map +1 -0
  162. package/dist/commands/user.d.ts +2 -1
  163. package/dist/commands/user.d.ts.map +1 -1
  164. package/dist/commands/user.js +26 -13
  165. package/dist/commands/user.js.map +1 -1
  166. package/dist/index.js +18 -13
  167. package/dist/index.js.map +1 -1
  168. package/dist/lib/client/apikeys.d.ts +21 -13
  169. package/dist/lib/client/apikeys.d.ts.map +1 -1
  170. package/dist/lib/client/apikeys.js +30 -26
  171. package/dist/lib/client/apikeys.js.map +1 -1
  172. package/dist/lib/client/audit.d.ts +54 -1
  173. package/dist/lib/client/audit.d.ts.map +1 -1
  174. package/dist/lib/client/audit.js +83 -9
  175. package/dist/lib/client/audit.js.map +1 -1
  176. package/dist/lib/client/index.d.ts +37 -36
  177. package/dist/lib/client/index.d.ts.map +1 -1
  178. package/dist/lib/client/index.js +37 -36
  179. package/dist/lib/client/index.js.map +1 -1
  180. package/dist/lib/client/managed-keys.d.ts +10 -7
  181. package/dist/lib/client/managed-keys.d.ts.map +1 -1
  182. package/dist/lib/client/managed-keys.js +16 -16
  183. package/dist/lib/client/managed-keys.js.map +1 -1
  184. package/dist/lib/client/policies.d.ts +14 -10
  185. package/dist/lib/client/policies.d.ts.map +1 -1
  186. package/dist/lib/client/policies.js +22 -22
  187. package/dist/lib/client/policies.js.map +1 -1
  188. package/dist/lib/client/quarantine.d.ts +25 -9
  189. package/dist/lib/client/quarantine.d.ts.map +1 -1
  190. package/dist/lib/client/quarantine.js +44 -27
  191. package/dist/lib/client/quarantine.js.map +1 -1
  192. package/dist/lib/client/users.d.ts +30 -3
  193. package/dist/lib/client/users.d.ts.map +1 -1
  194. package/dist/lib/client/users.js +39 -15
  195. package/dist/lib/client/users.js.map +1 -1
  196. package/dist/lib/command-context.d.ts +64 -0
  197. package/dist/lib/command-context.d.ts.map +1 -0
  198. package/dist/lib/command-context.js +90 -0
  199. package/dist/lib/command-context.js.map +1 -0
  200. package/dist/lib/context-help.d.ts.map +1 -1
  201. package/dist/lib/context-help.js +5 -0
  202. package/dist/lib/context-help.js.map +1 -1
  203. package/dist/lib/db/health.d.ts.map +1 -1
  204. package/dist/lib/db/health.js +13 -4
  205. package/dist/lib/db/health.js.map +1 -1
  206. package/dist/lib/mode.d.ts +18 -4
  207. package/dist/lib/mode.d.ts.map +1 -1
  208. package/dist/lib/mode.js +13 -6
  209. package/dist/lib/mode.js.map +1 -1
  210. package/dist/tui/hooks/useApi.d.ts +14 -7
  211. package/dist/tui/hooks/useApi.d.ts.map +1 -1
  212. package/dist/tui/hooks/useApi.js.map +1 -1
  213. package/dist/tui/screens/Dashboard.d.ts.map +1 -1
  214. package/dist/tui/screens/Dashboard.js +2 -3
  215. package/dist/tui/screens/Dashboard.js.map +1 -1
  216. package/dist/types/index.d.ts +59 -12
  217. package/dist/types/index.d.ts.map +1 -1
  218. package/package.json +1 -1
  219. package/dist/commands/superadmin.d.ts +0 -3
  220. package/dist/commands/superadmin.d.ts.map +0 -1
  221. package/dist/commands/superadmin.js.map +0 -1
@@ -11,14 +11,14 @@
11
11
  import { HttpClient } from './http.js';
12
12
  const TENANT_BASE = '/v1/policies';
13
13
  const ADMIN_BASE = '/v1/superadmin/policies';
14
- function basePath(tenantId) {
15
- return tenantId ? ADMIN_BASE : TENANT_BASE;
14
+ function basePath(tenantId, asSuperadmin) {
15
+ return tenantId || asSuperadmin ? ADMIN_BASE : TENANT_BASE;
16
16
  }
17
17
  export class PoliciesClient extends HttpClient {
18
18
  async list(options) {
19
19
  return this.request({
20
20
  method: 'GET',
21
- path: basePath(options?.tenantId),
21
+ path: basePath(options?.tenantId, options?.asSuperadmin),
22
22
  query: {
23
23
  tenantId: options?.tenantId,
24
24
  enabled: options?.enabled,
@@ -29,10 +29,10 @@ export class PoliciesClient extends HttpClient {
29
29
  },
30
30
  });
31
31
  }
32
- async getById(id, tenantId) {
32
+ async getById(id, tenantId, opts) {
33
33
  return this.request({
34
34
  method: 'GET',
35
- path: `${basePath(tenantId)}/${id}`,
35
+ path: `${basePath(tenantId, opts?.asSuperadmin)}/${id}`,
36
36
  query: tenantId ? { tenantId } : undefined,
37
37
  });
38
38
  }
@@ -42,30 +42,30 @@ export class PoliciesClient extends HttpClient {
42
42
  const tenantId = data.tenantId;
43
43
  return this.request({
44
44
  method: 'POST',
45
- path: basePath(tenantId),
45
+ path: basePath(tenantId, data.asSuperadmin),
46
46
  query: tenantId ? { tenantId } : undefined,
47
47
  body: data,
48
48
  });
49
49
  }
50
- async update(id, data, tenantId) {
50
+ async update(id, data, tenantId, opts) {
51
51
  return this.request({
52
52
  method: 'PATCH',
53
- path: `${basePath(tenantId)}/${id}`,
53
+ path: `${basePath(tenantId, opts?.asSuperadmin)}/${id}`,
54
54
  query: tenantId ? { tenantId } : undefined,
55
55
  body: data,
56
56
  });
57
57
  }
58
- async deleteById(id, tenantId) {
58
+ async deleteById(id, tenantId, opts) {
59
59
  await this.request({
60
60
  method: 'DELETE',
61
- path: `${basePath(tenantId)}/${id}`,
61
+ path: `${basePath(tenantId, opts?.asSuperadmin)}/${id}`,
62
62
  query: tenantId ? { tenantId } : undefined,
63
63
  });
64
64
  }
65
- async toggle(id, enabled, tenantId) {
65
+ async toggle(id, enabled, tenantId, opts) {
66
66
  return this.request({
67
67
  method: 'POST',
68
- path: `${basePath(tenantId)}/${id}/toggle`,
68
+ path: `${basePath(tenantId, opts?.asSuperadmin)}/${id}/toggle`,
69
69
  query: tenantId ? { tenantId } : undefined,
70
70
  body: { enabled },
71
71
  });
@@ -77,40 +77,40 @@ export class PoliciesClient extends HttpClient {
77
77
  body: policy,
78
78
  });
79
79
  }
80
- async getAttachments(policyId, tenantId) {
80
+ async getAttachments(policyId, tenantId, opts) {
81
81
  return this.request({
82
82
  method: 'GET',
83
- path: `${basePath(tenantId)}/${policyId}/attachments`,
83
+ path: `${basePath(tenantId, opts?.asSuperadmin)}/${policyId}/attachments`,
84
84
  query: tenantId ? { tenantId } : undefined,
85
85
  });
86
86
  }
87
- async attachToUser(policyId, userId, tenantId) {
87
+ async attachToUser(policyId, userId, tenantId, opts) {
88
88
  return this.request({
89
89
  method: 'POST',
90
- path: `${basePath(tenantId)}/${policyId}/attach/user`,
90
+ path: `${basePath(tenantId, opts?.asSuperadmin)}/${policyId}/attach/user`,
91
91
  query: tenantId ? { tenantId } : undefined,
92
92
  body: { userId },
93
93
  });
94
94
  }
95
- async attachToRole(policyId, roleId, tenantId) {
95
+ async attachToRole(policyId, roleId, tenantId, opts) {
96
96
  return this.request({
97
97
  method: 'POST',
98
- path: `${basePath(tenantId)}/${policyId}/attach/role`,
98
+ path: `${basePath(tenantId, opts?.asSuperadmin)}/${policyId}/attach/role`,
99
99
  query: tenantId ? { tenantId } : undefined,
100
100
  body: { roleId },
101
101
  });
102
102
  }
103
- async detachFromUser(policyId, userId, tenantId) {
103
+ async detachFromUser(policyId, userId, tenantId, opts) {
104
104
  return this.request({
105
105
  method: 'DELETE',
106
- path: `${basePath(tenantId)}/${policyId}/attach/user/${userId}`,
106
+ path: `${basePath(tenantId, opts?.asSuperadmin)}/${policyId}/attach/user/${userId}`,
107
107
  query: tenantId ? { tenantId } : undefined,
108
108
  });
109
109
  }
110
- async detachFromRole(policyId, roleId, tenantId) {
110
+ async detachFromRole(policyId, roleId, tenantId, opts) {
111
111
  return this.request({
112
112
  method: 'DELETE',
113
- path: `${basePath(tenantId)}/${policyId}/attach/role/${roleId}`,
113
+ path: `${basePath(tenantId, opts?.asSuperadmin)}/${policyId}/attach/role/${roleId}`,
114
114
  query: tenantId ? { tenantId } : undefined,
115
115
  });
116
116
  }
@@ -1 +1 @@
1
- {"version":3,"file":"policies.js","sourceRoot":"","sources":["../../../src/lib/client/policies.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAiBvC,MAAM,WAAW,GAAG,cAAc,CAAC;AACnC,MAAM,UAAU,GAAG,yBAAyB,CAAC;AAE7C,SAAS,QAAQ,CAAC,QAAiB;IACjC,OAAO,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;AAC7C,CAAC;AAED,MAAM,OAAO,cAAe,SAAQ,UAAU;IAC5C,KAAK,CAAC,IAAI,CAAC,OAOV;QACC,OAAO,IAAI,CAAC,OAAO,CAAqB;YACtC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;YACjC,KAAK,EAAE;gBACL,QAAQ,EAAE,OAAO,EAAE,QAAQ;gBAC3B,OAAO,EAAE,OAAO,EAAE,OAAO;gBACzB,MAAM,EAAE,OAAO,EAAE,MAAM;gBACvB,MAAM,EAAE,OAAO,EAAE,MAAM;gBACvB,IAAI,EAAE,OAAO,EAAE,IAAI;gBACnB,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,GAAG;aACnC;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU,EAAE,QAAiB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAS;YAC1B,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;YACnC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAuB;QAClC,wEAAwE;QACxE,uEAAuE;QACvE,MAAM,QAAQ,GAAI,IAA8B,CAAC,QAAQ,CAAC;QAC1D,OAAO,IAAI,CAAC,OAAO,CAAS;YAC1B,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC;YACxB,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;YAC1C,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,IAAuB,EAAE,QAAiB;QACjE,OAAO,IAAI,CAAC,OAAO,CAAS;YAC1B,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;YACnC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;YAC1C,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,QAAiB;QAC5C,MAAM,IAAI,CAAC,OAAO,CAAU;YAC1B,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;YACnC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,OAAgB,EAAE,QAAiB;QAC1D,OAAO,IAAI,CAAC,OAAO,CAAS;YAC1B,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS;YAC1C,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;YAC1C,IAAI,EAAE,EAAE,OAAO,EAAE;SAClB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAyB;QACtC,OAAO,IAAI,CAAC,OAAO,CAAyB;YAC1C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,uBAAuB;YAC7B,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,QAAiB;QACtD,OAAO,IAAI,CAAC,OAAO,CAA4B;YAC7C,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,cAAc;YACrD,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,MAAc,EAAE,QAAiB;QACpE,OAAO,IAAI,CAAC,OAAO,CAAkB;YACnC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,cAAc;YACrD,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;YAC1C,IAAI,EAAE,EAAE,MAAM,EAAE;SACjB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,MAAc,EAAE,QAAiB;QACpE,OAAO,IAAI,CAAC,OAAO,CAAkB;YACnC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,cAAc;YACrD,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;YAC1C,IAAI,EAAE,EAAE,MAAM,EAAE;SACjB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,MAAc,EAAE,QAAiB;QACtE,OAAO,IAAI,CAAC,OAAO,CAAkB;YACnC,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,gBAAgB,MAAM,EAAE;YAC/D,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,MAAc,EAAE,QAAiB;QACtE,OAAO,IAAI,CAAC,OAAO,CAAkB;YACnC,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,gBAAgB,MAAM,EAAE;YAC/D,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAc;QAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAyB;YAC1D,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,aAAa,MAAM,WAAW;SACrC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,QAAQ,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAc;QAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAyB;YAC1D,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,aAAa,MAAM,WAAW;SACrC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,QAAQ,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA0B;QACnC,OAAO,IAAI,CAAC,OAAO,CAAmB;YACpC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,UAAU;IAC/C,KAAK,CAAC,IAAI,CAAC,QAAiB;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAsB;YACvC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,iBAAiB;YACvB,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,WAAqB;QAClC,OAAO,IAAI,CAAC,OAAO,CAA8B;YAC/C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,0BAA0B;YAChC,IAAI,EAAE,EAAE,WAAW,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"policies.js","sourceRoot":"","sources":["../../../src/lib/client/policies.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,19 @@
1
1
  /**
2
2
  * IP Quarantine management client
3
3
  *
4
- * Routing: if `tenantId` is provided we hit `/v1/superadmin/quarantine/*`
5
- * (cross-tenant; requires superadmin role). Otherwise we hit `/v1/quarantine/*`
6
- * (tenant-scoped; tenant is derived from the JWT).
4
+ * Routing:
5
+ * - `asSuperadmin: true` `/v1/superadmin/quarantine/*` (cross-tenant;
6
+ * used under `znvault superadmin quarantine`). Optional `tenantId`
7
+ * filters to a specific tenant; omitting it targets the system
8
+ * (null-tenant) scope.
9
+ * - otherwise → `/v1/quarantine/*` (tenant-scoped; tenant derived from
10
+ * the JWT).
11
+ *
12
+ * Pre-v4.0.1 the routing used `tenantId` truthiness as the discriminator;
13
+ * that broke `znvault superadmin quarantine list` (no `--tenant`) because
14
+ * the request fell through to `/v1/quarantine`, which the server rejects
15
+ * for superadmin principals with "Superadmins must use /v1/superadmin/*
16
+ * routes".
7
17
  */
8
18
  import { HttpClient } from './http.js';
9
19
  import type { IpQuarantine, IpQuarantineStats, IpQuarantineConfig, IpFailureHistory, PaginatedResponse } from '../../types/index.js';
@@ -13,27 +23,33 @@ export interface ListQuarantineOptions {
13
23
  includeExpired?: boolean;
14
24
  limit?: number;
15
25
  offset?: number;
26
+ asSuperadmin?: boolean;
16
27
  }
17
28
  export interface ReleaseResult {
18
29
  success: boolean;
19
30
  message: string;
20
31
  releasedCount?: number;
21
32
  }
33
+ export interface QuarantineScope {
34
+ asSuperadmin?: boolean;
35
+ tenantId?: string;
36
+ }
22
37
  export declare class QuarantineClient extends HttpClient {
23
38
  list(options?: ListQuarantineOptions): Promise<PaginatedResponse<IpQuarantine>>;
24
- getById(id: string, tenantId?: string): Promise<IpQuarantine>;
25
- release(id: string, reason: string, tenantId?: string): Promise<ReleaseResult>;
26
- releaseIp(ip: string, reason: string, tenantId?: string): Promise<ReleaseResult>;
39
+ getById(id: string, scope?: QuarantineScope): Promise<IpQuarantine>;
40
+ release(id: string, reason: string, scope?: QuarantineScope): Promise<ReleaseResult>;
41
+ releaseIp(ip: string, reason: string, scope?: QuarantineScope): Promise<ReleaseResult>;
27
42
  getHistory(ip: string, options?: {
28
43
  limit?: number;
29
44
  tenantId?: string;
45
+ asSuperadmin?: boolean;
30
46
  }): Promise<{
31
47
  ip: string;
32
48
  failures: IpFailureHistory[];
33
49
  }>;
34
- getStats(tenantId?: string): Promise<IpQuarantineStats>;
35
- getConfig(tenantId?: string): Promise<IpQuarantineConfig>;
36
- updateConfig(config: Partial<Omit<IpQuarantineConfig, 'id' | 'tenantId' | 'createdAt' | 'updatedAt'>>, tenantId?: string): Promise<{
50
+ getStats(scope?: QuarantineScope): Promise<IpQuarantineStats>;
51
+ getConfig(scope?: QuarantineScope): Promise<IpQuarantineConfig>;
52
+ updateConfig(config: Partial<Omit<IpQuarantineConfig, 'id' | 'tenantId' | 'createdAt' | 'updatedAt'>>, scope?: QuarantineScope): Promise<{
37
53
  success: boolean;
38
54
  config: IpQuarantineConfig;
39
55
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"quarantine.d.ts","sourceRoot":"","sources":["../../../src/lib/client/quarantine.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD,qBAAa,gBAAiB,SAAQ,UAAU;IACxC,IAAI,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAc/E,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAQ7D,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAS9E,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAShF,UAAU,CACd,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAC9C,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAA;KAAE,CAAC;IAWlD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAQvD,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAQzD,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC,EACxF,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,kBAAkB,CAAA;KAAE,CAAC;CAQ7D"}
1
+ {"version":3,"file":"quarantine.d.ts","sourceRoot":"","sources":["../../../src/lib/client/quarantine.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAaD,qBAAa,gBAAiB,SAAQ,UAAU;IACxC,IAAI,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAc/E,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;IAQnE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC;IASpF,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC;IAStF,UAAU,CACd,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GACtE,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAA;KAAE,CAAC;IAWlD,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAQ7D,SAAS,CAAC,KAAK,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAQ/D,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC,EACxF,KAAK,CAAC,EAAE,eAAe,GACtB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,kBAAkB,CAAA;KAAE,CAAC;CAQ7D"}
@@ -2,80 +2,97 @@
2
2
  /**
3
3
  * IP Quarantine management client
4
4
  *
5
- * Routing: if `tenantId` is provided we hit `/v1/superadmin/quarantine/*`
6
- * (cross-tenant; requires superadmin role). Otherwise we hit `/v1/quarantine/*`
7
- * (tenant-scoped; tenant is derived from the JWT).
5
+ * Routing:
6
+ * - `asSuperadmin: true` `/v1/superadmin/quarantine/*` (cross-tenant;
7
+ * used under `znvault superadmin quarantine`). Optional `tenantId`
8
+ * filters to a specific tenant; omitting it targets the system
9
+ * (null-tenant) scope.
10
+ * - otherwise → `/v1/quarantine/*` (tenant-scoped; tenant derived from
11
+ * the JWT).
12
+ *
13
+ * Pre-v4.0.1 the routing used `tenantId` truthiness as the discriminator;
14
+ * that broke `znvault superadmin quarantine list` (no `--tenant`) because
15
+ * the request fell through to `/v1/quarantine`, which the server rejects
16
+ * for superadmin principals with "Superadmins must use /v1/superadmin/*
17
+ * routes".
8
18
  */
9
19
  import { HttpClient } from './http.js';
10
- function adminBase(tenantId) {
11
- return tenantId !== undefined && tenantId !== '' ? '/v1/superadmin/quarantine' : '/v1/quarantine';
20
+ function basePath(asSuperadmin) {
21
+ return asSuperadmin ? '/v1/superadmin/quarantine' : '/v1/quarantine';
22
+ }
23
+ function tenantQuery(scope) {
24
+ if (!scope?.asSuperadmin)
25
+ return undefined;
26
+ return scope.tenantId !== undefined && scope.tenantId !== ''
27
+ ? { tenantId: scope.tenantId }
28
+ : undefined;
12
29
  }
13
30
  export class QuarantineClient extends HttpClient {
14
31
  async list(options) {
15
32
  return this.request({
16
33
  method: 'GET',
17
- path: adminBase(options?.tenantId),
34
+ path: basePath(options?.asSuperadmin),
18
35
  query: {
19
36
  status: options?.status,
20
- tenantId: options?.tenantId,
37
+ tenantId: options?.asSuperadmin ? options.tenantId : undefined,
21
38
  includeExpired: options?.includeExpired,
22
39
  limit: options?.limit ?? 50,
23
40
  offset: options?.offset ?? 0,
24
41
  },
25
42
  });
26
43
  }
27
- async getById(id, tenantId) {
44
+ async getById(id, scope) {
28
45
  return this.request({
29
46
  method: 'GET',
30
- path: `${adminBase(tenantId)}/${id}`,
31
- query: tenantId ? { tenantId } : undefined,
47
+ path: `${basePath(scope?.asSuperadmin)}/${id}`,
48
+ query: tenantQuery(scope),
32
49
  });
33
50
  }
34
- async release(id, reason, tenantId) {
51
+ async release(id, reason, scope) {
35
52
  return this.request({
36
53
  method: 'POST',
37
- path: `${adminBase(tenantId)}/${id}/release`,
38
- query: tenantId ? { tenantId } : undefined,
54
+ path: `${basePath(scope?.asSuperadmin)}/${id}/release`,
55
+ query: tenantQuery(scope),
39
56
  body: { reason },
40
57
  });
41
58
  }
42
- async releaseIp(ip, reason, tenantId) {
59
+ async releaseIp(ip, reason, scope) {
43
60
  return this.request({
44
61
  method: 'POST',
45
- path: `${adminBase(tenantId)}/ip/${encodeURIComponent(ip)}/release`,
46
- query: tenantId ? { tenantId } : undefined,
62
+ path: `${basePath(scope?.asSuperadmin)}/ip/${encodeURIComponent(ip)}/release`,
63
+ query: tenantQuery(scope),
47
64
  body: { reason },
48
65
  });
49
66
  }
50
67
  async getHistory(ip, options) {
51
68
  return this.request({
52
69
  method: 'GET',
53
- path: `${adminBase(options?.tenantId)}/ip/${encodeURIComponent(ip)}/history`,
70
+ path: `${basePath(options?.asSuperadmin)}/ip/${encodeURIComponent(ip)}/history`,
54
71
  query: {
55
72
  limit: options?.limit ?? 100,
56
- tenantId: options?.tenantId,
73
+ tenantId: options?.asSuperadmin ? options.tenantId : undefined,
57
74
  },
58
75
  });
59
76
  }
60
- async getStats(tenantId) {
77
+ async getStats(scope) {
61
78
  return this.request({
62
79
  method: 'GET',
63
- path: `${adminBase(tenantId)}/stats`,
64
- query: tenantId ? { tenantId } : undefined,
80
+ path: `${basePath(scope?.asSuperadmin)}/stats`,
81
+ query: tenantQuery(scope),
65
82
  });
66
83
  }
67
- async getConfig(tenantId) {
84
+ async getConfig(scope) {
68
85
  return this.request({
69
86
  method: 'GET',
70
- path: `${adminBase(tenantId)}/config`,
71
- query: tenantId ? { tenantId } : undefined,
87
+ path: `${basePath(scope?.asSuperadmin)}/config`,
88
+ query: tenantQuery(scope),
72
89
  });
73
90
  }
74
- async updateConfig(config, tenantId) {
91
+ async updateConfig(config, scope) {
75
92
  return this.request({
76
93
  method: 'PUT',
77
- path: `${adminBase(tenantId)}/config`,
78
- query: tenantId ? { tenantId } : undefined,
94
+ path: `${basePath(scope?.asSuperadmin)}/config`,
95
+ query: tenantQuery(scope),
79
96
  body: config,
80
97
  });
81
98
  }
@@ -1 +1 @@
1
- {"version":3,"file":"quarantine.js","sourceRoot":"","sources":["../../../src/lib/client/quarantine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"quarantine.js","sourceRoot":"","sources":["../../../src/lib/client/quarantine.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,15 @@
1
1
  /**
2
2
  * User and superadmin management client
3
+ *
4
+ * Routing:
5
+ * - `asSuperadmin: true` → `/v1/superadmin/users*` (cross-tenant; used
6
+ * under `znvault superadmin user`).
7
+ * - otherwise → `/v1/users*` (tenant principal; tenant derived from JWT).
8
+ *
9
+ * The server rejects superadmin principals on `/v1/users*` with
10
+ * "Superadmins must use /v1/superadmin/* routes" — so every method that can
11
+ * be invoked from the superadmin namespace accepts an explicit
12
+ * `asSuperadmin` switch rather than relying on tenant-id truthiness.
3
13
  */
4
14
  import { HttpClient } from './http.js';
5
15
  import type { User, Superadmin } from '../../types/index.js';
@@ -9,6 +19,7 @@ export declare class UsersClient extends HttpClient {
9
19
  tenantId?: string;
10
20
  role?: string;
11
21
  status?: string;
22
+ asSuperadmin?: boolean;
12
23
  }): Promise<User[]>;
13
24
  create(data: {
14
25
  username: string;
@@ -16,16 +27,25 @@ export declare class UsersClient extends HttpClient {
16
27
  email?: string;
17
28
  tenantId?: string;
18
29
  role?: 'user' | 'admin';
30
+ asSuperadmin?: boolean;
31
+ }): Promise<User>;
32
+ getById(id: string, opts?: {
33
+ asSuperadmin?: boolean;
19
34
  }): Promise<User>;
20
- getById(id: string): Promise<User>;
21
35
  update(id: string, data: {
22
36
  email?: string;
23
37
  password?: string;
24
38
  role?: 'user' | 'admin';
25
39
  status?: 'active' | 'disabled';
40
+ }, opts?: {
41
+ asSuperadmin?: boolean;
26
42
  }): Promise<User>;
27
- deleteById(id: string): Promise<void>;
28
- unlock(id: string): Promise<MessageResponse>;
43
+ deleteById(id: string, opts?: {
44
+ asSuperadmin?: boolean;
45
+ }): Promise<void>;
46
+ unlock(id: string, opts?: {
47
+ asSuperadmin?: boolean;
48
+ }): Promise<MessageResponse>;
29
49
  /**
30
50
  * Reset a user's password.
31
51
  *
@@ -36,6 +56,13 @@ export declare class UsersClient extends HttpClient {
36
56
  resetPassword(id: string, newPassword: string, opts?: {
37
57
  asSuperadmin?: boolean;
38
58
  }): Promise<MessageResponse>;
59
+ /**
60
+ * Disable TOTP/2FA for a user.
61
+ *
62
+ * Only the tenant route (`/v1/users/:id/totp/disable`) exists today; the
63
+ * server enforces tenant scoping. Superadmins disabling TOTP across
64
+ * tenants must do so via dashboard or local-mode CLI.
65
+ */
39
66
  disableTotp(id: string): Promise<MessageResponse>;
40
67
  }
41
68
  export declare class SuperadminsClient extends HttpClient {
@@ -1 +1 @@
1
- {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../src/lib/client/users.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAqB,MAAM,sBAAsB,CAAC;AAChF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,qBAAa,WAAY,SAAQ,UAAU;IACnC,IAAI,CAAC,OAAO,CAAC,EAAE;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAcb,MAAM,CAAC,IAAI,EAAE;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;KACzB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQX,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;QAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QACxB,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;KAChC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQX,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQlD;;;;;;OAMG;IACG,aAAa,CACjB,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAChC,OAAO,CAAC,eAAe,CAAC;IAWrB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAMxD;AAED,qBAAa,iBAAkB,SAAQ,UAAU;IACzC,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAgB7B,MAAM,CAAC,IAAI,EAAE;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,UAAU,CAAC;IAQjB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQ3E,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAOlD,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAOnD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAMzD"}
1
+ {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../src/lib/client/users.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAqB,MAAM,sBAAsB,CAAC;AAChF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AASlD,qBAAa,WAAY,SAAQ,UAAU;IACnC,IAAI,CAAC,OAAO,CAAC,EAAE;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAcb,MAAM,CAAC,IAAI,EAAE;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QACxB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,GAAG,OAAO,CAAC,IAAI,CAAC;IASX,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;QAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QACxB,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;KAChC,EAAE,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9C,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC;IAQrF;;;;;;OAMG;IACG,aAAa,CACjB,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAChC,OAAO,CAAC,eAAe,CAAC;IAW3B;;;;;;OAMG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAMxD;AAED,qBAAa,iBAAkB,SAAQ,UAAU;IACzC,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAiB7B,MAAM,CAAC,IAAI,EAAE;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,UAAU,CAAC;IAQjB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQ3E,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAOlD,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAOnD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAMzD"}
@@ -1,13 +1,28 @@
1
1
  // Path: src/lib/client/users.ts
2
2
  /**
3
3
  * User and superadmin management client
4
+ *
5
+ * Routing:
6
+ * - `asSuperadmin: true` → `/v1/superadmin/users*` (cross-tenant; used
7
+ * under `znvault superadmin user`).
8
+ * - otherwise → `/v1/users*` (tenant principal; tenant derived from JWT).
9
+ *
10
+ * The server rejects superadmin principals on `/v1/users*` with
11
+ * "Superadmins must use /v1/superadmin/* routes" — so every method that can
12
+ * be invoked from the superadmin namespace accepts an explicit
13
+ * `asSuperadmin` switch rather than relying on tenant-id truthiness.
4
14
  */
5
15
  import { HttpClient } from './http.js';
16
+ const TENANT_BASE = '/v1/users';
17
+ const ADMIN_BASE = '/v1/superadmin/users';
18
+ function basePath(asSuperadmin) {
19
+ return asSuperadmin ? ADMIN_BASE : TENANT_BASE;
20
+ }
6
21
  export class UsersClient extends HttpClient {
7
22
  async list(options) {
8
23
  const response = await this.request({
9
24
  method: 'GET',
10
- path: '/v1/users',
25
+ path: basePath(options?.asSuperadmin),
11
26
  query: {
12
27
  tenantId: options?.tenantId,
13
28
  role: options?.role,
@@ -18,35 +33,36 @@ export class UsersClient extends HttpClient {
18
33
  return response.items;
19
34
  }
20
35
  async create(data) {
36
+ const { asSuperadmin, ...body } = data;
21
37
  return this.request({
22
38
  method: 'POST',
23
- path: '/v1/users',
24
- body: data,
39
+ path: basePath(asSuperadmin),
40
+ body,
25
41
  });
26
42
  }
27
- async getById(id) {
43
+ async getById(id, opts) {
28
44
  return this.request({
29
45
  method: 'GET',
30
- path: `/v1/users/${id}`,
46
+ path: `${basePath(opts?.asSuperadmin)}/${id}`,
31
47
  });
32
48
  }
33
- async update(id, data) {
49
+ async update(id, data, opts) {
34
50
  return this.request({
35
51
  method: 'PUT',
36
- path: `/v1/users/${id}`,
52
+ path: `${basePath(opts?.asSuperadmin)}/${id}`,
37
53
  body: data,
38
54
  });
39
55
  }
40
- async deleteById(id) {
56
+ async deleteById(id, opts) {
41
57
  await this.request({
42
58
  method: 'DELETE',
43
- path: `/v1/users/${id}`,
59
+ path: `${basePath(opts?.asSuperadmin)}/${id}`,
44
60
  });
45
61
  }
46
- async unlock(id) {
62
+ async unlock(id, opts) {
47
63
  return this.request({
48
64
  method: 'PUT',
49
- path: `/v1/users/${id}`,
65
+ path: `${basePath(opts?.asSuperadmin)}/${id}`,
50
66
  body: { status: 'active', failedAttempts: 0, lockedUntil: null },
51
67
  });
52
68
  }
@@ -59,25 +75,33 @@ export class UsersClient extends HttpClient {
59
75
  */
60
76
  async resetPassword(id, newPassword, opts) {
61
77
  const path = opts?.asSuperadmin
62
- ? `/v1/superadmin/users/${id}/reset-password`
63
- : `/v1/users/${id}/reset-password`;
78
+ ? `${ADMIN_BASE}/${id}/reset-password`
79
+ : `${TENANT_BASE}/${id}/reset-password`;
64
80
  return this.request({
65
81
  method: 'POST',
66
82
  path,
67
83
  body: { newPassword },
68
84
  });
69
85
  }
86
+ /**
87
+ * Disable TOTP/2FA for a user.
88
+ *
89
+ * Only the tenant route (`/v1/users/:id/totp/disable`) exists today; the
90
+ * server enforces tenant scoping. Superadmins disabling TOTP across
91
+ * tenants must do so via dashboard or local-mode CLI.
92
+ */
70
93
  async disableTotp(id) {
71
94
  return this.request({
72
95
  method: 'POST',
73
- path: `/v1/users/${id}/totp/disable`,
96
+ path: `${TENANT_BASE}/${id}/totp/disable`,
74
97
  });
75
98
  }
76
99
  }
77
100
  export class SuperadminsClient extends HttpClient {
78
101
  async list() {
79
102
  const usersClient = new UsersClient();
80
- const users = await usersClient.list({ role: 'superadmin' });
103
+ // Listing superadmin role members requires the admin namespace.
104
+ const users = await usersClient.list({ role: 'superadmin', asSuperadmin: true });
81
105
  return users.map(u => ({
82
106
  id: u.id,
83
107
  username: u.username,
@@ -1 +1 @@
1
- {"version":3,"file":"users.js","sourceRoot":"","sources":["../../../src/lib/client/users.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../../src/lib/client/users.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Helpers for context-aware command registration.
3
+ *
4
+ * In v4.0, dual-purpose command groups are registered twice:
5
+ * - At top level (tenant context) — `--tenant` option is omitted; the active
6
+ * user's JWT tenant is always used.
7
+ * - Under `znvault superadmin <group>` (superadmin context) — `--tenant` is
8
+ * accepted to target cross-tenant or system resources.
9
+ *
10
+ * Command handlers don't need to branch: when `context === 'tenant'`, the
11
+ * `--tenant` option simply isn't registered, so `options.tenant` is always
12
+ * `undefined` and existing client routing falls through to the tenant scope.
13
+ */
14
+ import type { Command } from 'commander';
15
+ export type CommandContext = 'tenant' | 'superadmin';
16
+ export interface RegisterOptions {
17
+ context?: CommandContext;
18
+ }
19
+ /**
20
+ * Add a `--tenant <id>` option to a command only if running in superadmin
21
+ * context. In tenant context this is a no-op.
22
+ *
23
+ * @param cmd The Commander command to extend.
24
+ * @param ctx The active command context.
25
+ * @param description Override description (defaults to "Tenant ID (superadmin only)").
26
+ * @param shortFlag Set to `true` to register as `-t, --tenant <id>` instead of just `--tenant <id>`.
27
+ */
28
+ export declare function addTenantOption(cmd: Command, ctx: CommandContext, description?: string, shortFlag?: boolean): Command;
29
+ /**
30
+ * Resolve the registration context from optional opts, defaulting to 'tenant'.
31
+ */
32
+ export declare function resolveContext(opts?: RegisterOptions): CommandContext;
33
+ /**
34
+ * Run a registration function with the given context active. The previous
35
+ * context is restored when `fn` returns.
36
+ */
37
+ export declare function withRegisterContext(ctx: CommandContext, fn: () => void): void;
38
+ /**
39
+ * Get the active registration context. Sub-files use this to decide whether
40
+ * to add a `--tenant` option.
41
+ */
42
+ export declare function getRegisterContext(): CommandContext;
43
+ export declare function isSuperadminContext(): boolean;
44
+ /**
45
+ * Walk up a Commander Command's parent chain to detect whether the
46
+ * currently-invoked command lives under the `superadmin` namespace. This
47
+ * is the runtime equivalent of `isSuperadminContext()` (which only returns
48
+ * the registration-time value).
49
+ *
50
+ * Handlers receive `this: Command` or `cmd: Command` from Commander; pass
51
+ * that in (or `this.parent` from an action callback) and we'll detect by
52
+ * inspecting the chain of `.name()` values.
53
+ */
54
+ interface CommandWithChain {
55
+ name(): string;
56
+ parent: CommandWithChain | null;
57
+ }
58
+ export declare function isInvokedUnderSuperadmin(cmd: CommandWithChain | null | undefined): boolean;
59
+ interface CommandLike {
60
+ option(flags: string, description?: string, ...rest: unknown[]): CommandLike;
61
+ }
62
+ export declare function applyTenantContextPatch(commandPrototype: CommandLike): void;
63
+ export {};
64
+ //# sourceMappingURL=command-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-context.d.ts","sourceRoot":"","sources":["../../src/lib/command-context.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,YAAY,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,cAAc,EACnB,WAAW,SAAwC,EACnD,SAAS,UAAQ,GAChB,OAAO,CAMT;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE,eAAe,GAAG,cAAc,CAErE;AAWD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAQ7E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,cAAc,CAEnD;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;;;;;;;;GASG;AACH,UAAU,gBAAgB;IACxB,IAAI,IAAI,MAAM,CAAC;IACf,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACjC;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAO1F;AAcD,UAAU,WAAW;IACnB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC;CAC9E;AAED,wBAAgB,uBAAuB,CAAC,gBAAgB,EAAE,WAAW,GAAG,IAAI,CAmB3E"}