@portaidentity/cli 1.7.3 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +125 -105
  3. package/dist/admin/admin-date-time.d.ts +6 -0
  4. package/dist/admin/admin-date-time.d.ts.map +1 -0
  5. package/dist/admin/admin-date-time.js +33 -0
  6. package/dist/admin/admin-date-time.js.map +1 -0
  7. package/dist/admin/application-client-features.d.ts +38 -0
  8. package/dist/admin/application-client-features.d.ts.map +1 -0
  9. package/dist/admin/application-client-features.js +545 -0
  10. package/dist/admin/application-client-features.js.map +1 -0
  11. package/dist/admin/application-controller.d.ts +58 -0
  12. package/dist/admin/application-controller.d.ts.map +1 -0
  13. package/dist/admin/application-controller.js +286 -0
  14. package/dist/admin/application-controller.js.map +1 -0
  15. package/dist/admin/application-dialogs.d.ts +91 -0
  16. package/dist/admin/application-dialogs.d.ts.map +1 -0
  17. package/dist/admin/application-dialogs.js +250 -0
  18. package/dist/admin/application-dialogs.js.map +1 -0
  19. package/dist/admin/application-rbac-controller.d.ts +56 -0
  20. package/dist/admin/application-rbac-controller.d.ts.map +1 -0
  21. package/dist/admin/application-rbac-controller.js +280 -0
  22. package/dist/admin/application-rbac-controller.js.map +1 -0
  23. package/dist/admin/application-rbac-features.d.ts +51 -0
  24. package/dist/admin/application-rbac-features.d.ts.map +1 -0
  25. package/dist/admin/application-rbac-features.js +175 -0
  26. package/dist/admin/application-rbac-features.js.map +1 -0
  27. package/dist/admin/application-rbac-workspace.d.ts +62 -0
  28. package/dist/admin/application-rbac-workspace.d.ts.map +1 -0
  29. package/dist/admin/application-rbac-workspace.js +344 -0
  30. package/dist/admin/application-rbac-workspace.js.map +1 -0
  31. package/dist/admin/application-runtime.d.ts +44 -0
  32. package/dist/admin/application-runtime.d.ts.map +1 -0
  33. package/dist/admin/application-runtime.js +183 -0
  34. package/dist/admin/application-runtime.js.map +1 -0
  35. package/dist/admin/application-service.d.ts +39 -0
  36. package/dist/admin/application-service.d.ts.map +1 -0
  37. package/dist/admin/application-service.js +248 -0
  38. package/dist/admin/application-service.js.map +1 -0
  39. package/dist/admin/application-state.d.ts +109 -0
  40. package/dist/admin/application-state.d.ts.map +1 -0
  41. package/dist/admin/application-state.js +3 -0
  42. package/dist/admin/application-state.js.map +1 -0
  43. package/dist/admin/application-workspace.d.ts +77 -0
  44. package/dist/admin/application-workspace.d.ts.map +1 -0
  45. package/dist/admin/application-workspace.js +302 -0
  46. package/dist/admin/application-workspace.js.map +1 -0
  47. package/dist/admin/application.d.ts +88 -0
  48. package/dist/admin/application.d.ts.map +1 -0
  49. package/dist/admin/application.js +932 -0
  50. package/dist/admin/application.js.map +1 -0
  51. package/dist/admin/client-authentication-dialog.d.ts +77 -0
  52. package/dist/admin/client-authentication-dialog.d.ts.map +1 -0
  53. package/dist/admin/client-authentication-dialog.js +217 -0
  54. package/dist/admin/client-authentication-dialog.js.map +1 -0
  55. package/dist/admin/client-controller.d.ts +58 -0
  56. package/dist/admin/client-controller.d.ts.map +1 -0
  57. package/dist/admin/client-controller.js +462 -0
  58. package/dist/admin/client-controller.js.map +1 -0
  59. package/dist/admin/client-credential-dialogs.d.ts +36 -0
  60. package/dist/admin/client-credential-dialogs.d.ts.map +1 -0
  61. package/dist/admin/client-credential-dialogs.js +145 -0
  62. package/dist/admin/client-credential-dialogs.js.map +1 -0
  63. package/dist/admin/client-dialogs.d.ts +64 -0
  64. package/dist/admin/client-dialogs.d.ts.map +1 -0
  65. package/dist/admin/client-dialogs.js +110 -0
  66. package/dist/admin/client-dialogs.js.map +1 -0
  67. package/dist/admin/client-form-scroller.d.ts +17 -0
  68. package/dist/admin/client-form-scroller.d.ts.map +1 -0
  69. package/dist/admin/client-form-scroller.js +67 -0
  70. package/dist/admin/client-form-scroller.js.map +1 -0
  71. package/dist/admin/client-registration-dialog.d.ts +27 -0
  72. package/dist/admin/client-registration-dialog.d.ts.map +1 -0
  73. package/dist/admin/client-registration-dialog.js +195 -0
  74. package/dist/admin/client-registration-dialog.js.map +1 -0
  75. package/dist/admin/client-service.d.ts +41 -0
  76. package/dist/admin/client-service.d.ts.map +1 -0
  77. package/dist/admin/client-service.js +484 -0
  78. package/dist/admin/client-service.js.map +1 -0
  79. package/dist/admin/client-state.d.ts +157 -0
  80. package/dist/admin/client-state.d.ts.map +1 -0
  81. package/dist/admin/client-state.js +3 -0
  82. package/dist/admin/client-state.js.map +1 -0
  83. package/dist/admin/client-workspace.d.ts +88 -0
  84. package/dist/admin/client-workspace.d.ts.map +1 -0
  85. package/dist/admin/client-workspace.js +484 -0
  86. package/dist/admin/client-workspace.js.map +1 -0
  87. package/dist/admin/delete-confirmation-layout.d.ts +38 -0
  88. package/dist/admin/delete-confirmation-layout.d.ts.map +1 -0
  89. package/dist/admin/delete-confirmation-layout.js +52 -0
  90. package/dist/admin/delete-confirmation-layout.js.map +1 -0
  91. package/dist/admin/index.d.ts +64 -0
  92. package/dist/admin/index.d.ts.map +1 -0
  93. package/dist/admin/index.js +31 -0
  94. package/dist/admin/index.js.map +1 -0
  95. package/dist/admin/organization-controller.d.ts +77 -0
  96. package/dist/admin/organization-controller.d.ts.map +1 -0
  97. package/dist/admin/organization-controller.js +472 -0
  98. package/dist/admin/organization-controller.js.map +1 -0
  99. package/dist/admin/organization-dialogs.d.ts +63 -0
  100. package/dist/admin/organization-dialogs.d.ts.map +1 -0
  101. package/dist/admin/organization-dialogs.js +303 -0
  102. package/dist/admin/organization-dialogs.js.map +1 -0
  103. package/dist/admin/organization-service.d.ts +110 -0
  104. package/dist/admin/organization-service.d.ts.map +1 -0
  105. package/dist/admin/organization-service.js +548 -0
  106. package/dist/admin/organization-service.js.map +1 -0
  107. package/dist/admin/organization-workspace.d.ts +29 -0
  108. package/dist/admin/organization-workspace.d.ts.map +1 -0
  109. package/dist/admin/organization-workspace.js +421 -0
  110. package/dist/admin/organization-workspace.js.map +1 -0
  111. package/dist/admin/portability-controller.d.ts +83 -0
  112. package/dist/admin/portability-controller.d.ts.map +1 -0
  113. package/dist/admin/portability-controller.js +466 -0
  114. package/dist/admin/portability-controller.js.map +1 -0
  115. package/dist/admin/portability-service.d.ts +31 -0
  116. package/dist/admin/portability-service.d.ts.map +1 -0
  117. package/dist/admin/portability-service.js +51 -0
  118. package/dist/admin/portability-service.js.map +1 -0
  119. package/dist/admin/portability-state.d.ts +88 -0
  120. package/dist/admin/portability-state.d.ts.map +1 -0
  121. package/dist/admin/portability-state.js +3 -0
  122. package/dist/admin/portability-state.js.map +1 -0
  123. package/dist/admin/portability-workspace.d.ts +78 -0
  124. package/dist/admin/portability-workspace.d.ts.map +1 -0
  125. package/dist/admin/portability-workspace.js +337 -0
  126. package/dist/admin/portability-workspace.js.map +1 -0
  127. package/dist/admin/presentation.d.ts +46 -0
  128. package/dist/admin/presentation.d.ts.map +1 -0
  129. package/dist/admin/presentation.js +271 -0
  130. package/dist/admin/presentation.js.map +1 -0
  131. package/dist/admin/rbac-dialogs.d.ts +73 -0
  132. package/dist/admin/rbac-dialogs.d.ts.map +1 -0
  133. package/dist/admin/rbac-dialogs.js +345 -0
  134. package/dist/admin/rbac-dialogs.js.map +1 -0
  135. package/dist/admin/rbac-service.d.ts +47 -0
  136. package/dist/admin/rbac-service.d.ts.map +1 -0
  137. package/dist/admin/rbac-service.js +258 -0
  138. package/dist/admin/rbac-service.js.map +1 -0
  139. package/dist/admin/rbac-state.d.ts +129 -0
  140. package/dist/admin/rbac-state.d.ts.map +1 -0
  141. package/dist/admin/rbac-state.js +136 -0
  142. package/dist/admin/rbac-state.js.map +1 -0
  143. package/dist/admin/selectable-read-only-input.d.ts +18 -0
  144. package/dist/admin/selectable-read-only-input.d.ts.map +1 -0
  145. package/dist/admin/selectable-read-only-input.js +24 -0
  146. package/dist/admin/selectable-read-only-input.js.map +1 -0
  147. package/dist/admin/session-service.d.ts +169 -0
  148. package/dist/admin/session-service.d.ts.map +1 -0
  149. package/dist/admin/session-service.js +353 -0
  150. package/dist/admin/session-service.js.map +1 -0
  151. package/dist/admin/state.d.ts +301 -0
  152. package/dist/admin/state.d.ts.map +1 -0
  153. package/dist/admin/state.js +10 -0
  154. package/dist/admin/state.js.map +1 -0
  155. package/dist/admin/system-config-controller.d.ts +58 -0
  156. package/dist/admin/system-config-controller.d.ts.map +1 -0
  157. package/dist/admin/system-config-controller.js +218 -0
  158. package/dist/admin/system-config-controller.js.map +1 -0
  159. package/dist/admin/system-config-service.d.ts +54 -0
  160. package/dist/admin/system-config-service.d.ts.map +1 -0
  161. package/dist/admin/system-config-service.js +180 -0
  162. package/dist/admin/system-config-service.js.map +1 -0
  163. package/dist/admin/system-config-state.d.ts +77 -0
  164. package/dist/admin/system-config-state.d.ts.map +1 -0
  165. package/dist/admin/system-config-state.js +78 -0
  166. package/dist/admin/system-config-state.js.map +1 -0
  167. package/dist/admin/system-config-workspace.d.ts +47 -0
  168. package/dist/admin/system-config-workspace.d.ts.map +1 -0
  169. package/dist/admin/system-config-workspace.js +217 -0
  170. package/dist/admin/system-config-workspace.js.map +1 -0
  171. package/dist/admin/user-controller-types.d.ts +67 -0
  172. package/dist/admin/user-controller-types.d.ts.map +1 -0
  173. package/dist/admin/user-controller-types.js +3 -0
  174. package/dist/admin/user-controller-types.js.map +1 -0
  175. package/dist/admin/user-controller.d.ts +6 -0
  176. package/dist/admin/user-controller.d.ts.map +1 -0
  177. package/dist/admin/user-controller.js +674 -0
  178. package/dist/admin/user-controller.js.map +1 -0
  179. package/dist/admin/user-dialog-fields.d.ts +44 -0
  180. package/dist/admin/user-dialog-fields.d.ts.map +1 -0
  181. package/dist/admin/user-dialog-fields.js +130 -0
  182. package/dist/admin/user-dialog-fields.js.map +1 -0
  183. package/dist/admin/user-dialogs.d.ts +66 -0
  184. package/dist/admin/user-dialogs.d.ts.map +1 -0
  185. package/dist/admin/user-dialogs.js +374 -0
  186. package/dist/admin/user-dialogs.js.map +1 -0
  187. package/dist/admin/user-role-controller.d.ts +82 -0
  188. package/dist/admin/user-role-controller.d.ts.map +1 -0
  189. package/dist/admin/user-role-controller.js +337 -0
  190. package/dist/admin/user-role-controller.js.map +1 -0
  191. package/dist/admin/user-role-dialog.d.ts +94 -0
  192. package/dist/admin/user-role-dialog.d.ts.map +1 -0
  193. package/dist/admin/user-role-dialog.js +265 -0
  194. package/dist/admin/user-role-dialog.js.map +1 -0
  195. package/dist/admin/user-service-types.d.ts +100 -0
  196. package/dist/admin/user-service-types.d.ts.map +1 -0
  197. package/dist/admin/user-service-types.js +3 -0
  198. package/dist/admin/user-service-types.js.map +1 -0
  199. package/dist/admin/user-service.d.ts +14 -0
  200. package/dist/admin/user-service.d.ts.map +1 -0
  201. package/dist/admin/user-service.js +612 -0
  202. package/dist/admin/user-service.js.map +1 -0
  203. package/dist/admin/user-state.d.ts +158 -0
  204. package/dist/admin/user-state.d.ts.map +1 -0
  205. package/dist/admin/user-state.js +3 -0
  206. package/dist/admin/user-state.js.map +1 -0
  207. package/dist/admin/user-workspace.d.ts +65 -0
  208. package/dist/admin/user-workspace.d.ts.map +1 -0
  209. package/dist/admin/user-workspace.js +366 -0
  210. package/dist/admin/user-workspace.js.map +1 -0
  211. package/dist/auth/browser-flow.d.ts +27 -1
  212. package/dist/auth/browser-flow.d.ts.map +1 -1
  213. package/dist/auth/browser-flow.js +55 -33
  214. package/dist/auth/browser-flow.js.map +1 -1
  215. package/dist/auth/callback-server.d.ts.map +1 -1
  216. package/dist/auth/callback-server.js +5 -9
  217. package/dist/auth/callback-server.js.map +1 -1
  218. package/dist/auth/id-token-verifier.d.ts +39 -0
  219. package/dist/auth/id-token-verifier.d.ts.map +1 -0
  220. package/dist/auth/id-token-verifier.js +104 -0
  221. package/dist/auth/id-token-verifier.js.map +1 -0
  222. package/dist/auth/login-coordinator.d.ts +72 -0
  223. package/dist/auth/login-coordinator.d.ts.map +1 -0
  224. package/dist/auth/login-coordinator.js +190 -0
  225. package/dist/auth/login-coordinator.js.map +1 -0
  226. package/dist/auth/metadata.d.ts +2 -1
  227. package/dist/auth/metadata.d.ts.map +1 -1
  228. package/dist/auth/metadata.js +67 -6
  229. package/dist/auth/metadata.js.map +1 -1
  230. package/dist/auth/types.d.ts +14 -0
  231. package/dist/auth/types.d.ts.map +1 -1
  232. package/dist/client-factory.d.ts.map +1 -1
  233. package/dist/client-factory.js +15 -2
  234. package/dist/client-factory.js.map +1 -1
  235. package/dist/commands/admin.d.ts +22 -0
  236. package/dist/commands/admin.d.ts.map +1 -0
  237. package/dist/commands/admin.js +112 -0
  238. package/dist/commands/admin.js.map +1 -0
  239. package/dist/commands/app-claim.d.ts.map +1 -1
  240. package/dist/commands/app-claim.js +11 -4
  241. package/dist/commands/app-claim.js.map +1 -1
  242. package/dist/commands/app-module.d.ts.map +1 -1
  243. package/dist/commands/app-module.js +61 -12
  244. package/dist/commands/app-module.js.map +1 -1
  245. package/dist/commands/app-permission.d.ts.map +1 -1
  246. package/dist/commands/app-permission.js +66 -24
  247. package/dist/commands/app-permission.js.map +1 -1
  248. package/dist/commands/app-role.d.ts.map +1 -1
  249. package/dist/commands/app-role.js +48 -27
  250. package/dist/commands/app-role.js.map +1 -1
  251. package/dist/commands/app.d.ts.map +1 -1
  252. package/dist/commands/app.js +37 -25
  253. package/dist/commands/app.js.map +1 -1
  254. package/dist/commands/bulk.d.ts.map +1 -1
  255. package/dist/commands/bulk.js +9 -2
  256. package/dist/commands/bulk.js.map +1 -1
  257. package/dist/commands/client-secret.d.ts.map +1 -1
  258. package/dist/commands/client-secret.js +12 -6
  259. package/dist/commands/client-secret.js.map +1 -1
  260. package/dist/commands/client.d.ts +3 -2
  261. package/dist/commands/client.d.ts.map +1 -1
  262. package/dist/commands/client.js +87 -43
  263. package/dist/commands/client.js.map +1 -1
  264. package/dist/commands/config.d.ts +4 -0
  265. package/dist/commands/config.d.ts.map +1 -1
  266. package/dist/commands/config.js +68 -7
  267. package/dist/commands/config.js.map +1 -1
  268. package/dist/commands/export.d.ts +6 -0
  269. package/dist/commands/export.d.ts.map +1 -0
  270. package/dist/commands/export.js +182 -0
  271. package/dist/commands/export.js.map +1 -0
  272. package/dist/commands/import.d.ts +6 -0
  273. package/dist/commands/import.d.ts.map +1 -0
  274. package/dist/commands/import.js +142 -0
  275. package/dist/commands/import.js.map +1 -0
  276. package/dist/commands/keys.d.ts.map +1 -1
  277. package/dist/commands/keys.js +11 -4
  278. package/dist/commands/keys.js.map +1 -1
  279. package/dist/commands/login.d.ts.map +1 -1
  280. package/dist/commands/login.js +24 -10
  281. package/dist/commands/login.js.map +1 -1
  282. package/dist/commands/org.d.ts +2 -4
  283. package/dist/commands/org.d.ts.map +1 -1
  284. package/dist/commands/org.js +16 -76
  285. package/dist/commands/org.js.map +1 -1
  286. package/dist/commands/user-role.d.ts.map +1 -1
  287. package/dist/commands/user-role.js +19 -14
  288. package/dist/commands/user-role.js.map +1 -1
  289. package/dist/commands/user.d.ts +3 -2
  290. package/dist/commands/user.d.ts.map +1 -1
  291. package/dist/commands/user.js +47 -71
  292. package/dist/commands/user.js.map +1 -1
  293. package/dist/commands/version.d.ts +1 -1
  294. package/dist/commands/version.js +1 -1
  295. package/dist/credential-lock.d.ts +20 -0
  296. package/dist/credential-lock.d.ts.map +1 -0
  297. package/dist/credential-lock.js +130 -0
  298. package/dist/credential-lock.js.map +1 -0
  299. package/dist/credential-store.d.ts +14 -0
  300. package/dist/credential-store.d.ts.map +1 -1
  301. package/dist/credential-store.js +114 -3
  302. package/dist/credential-store.js.map +1 -1
  303. package/dist/error-handler.d.ts.map +1 -1
  304. package/dist/error-handler.js +2 -0
  305. package/dist/error-handler.js.map +1 -1
  306. package/dist/global-options.d.ts +8 -0
  307. package/dist/global-options.d.ts.map +1 -1
  308. package/dist/global-options.js +19 -8
  309. package/dist/global-options.js.map +1 -1
  310. package/dist/index.js +7 -5
  311. package/dist/index.js.map +1 -1
  312. package/dist/output.d.ts +11 -0
  313. package/dist/output.d.ts.map +1 -1
  314. package/dist/output.js +25 -6
  315. package/dist/output.js.map +1 -1
  316. package/dist/prompt.d.ts +2 -2
  317. package/dist/prompt.d.ts.map +1 -1
  318. package/dist/prompt.js +27 -7
  319. package/dist/prompt.js.map +1 -1
  320. package/package.json +7 -3
  321. package/dist/commands/gui.d.ts +0 -21
  322. package/dist/commands/gui.d.ts.map +0 -1
  323. package/dist/commands/gui.js +0 -67
  324. package/dist/commands/gui.js.map +0 -1
  325. package/dist/commands/provision.d.ts +0 -47
  326. package/dist/commands/provision.d.ts.map +0 -1
  327. package/dist/commands/provision.js +0 -444
  328. package/dist/commands/provision.js.map +0 -1
@@ -0,0 +1,258 @@
1
+ /** Validated SDK boundary for application roles, permissions, mappings, and user assignments. */
2
+ import { PortaAuthenticationError, PortaConflictError, PortaForbiddenError, PortaValidationError, } from '@portaidentity/sdk';
3
+ import { validateAdminAuthorityReduction, validateAdminPermission, validateAdminPermissionCollection, validateAdminRole, validateAdminRoleCollection, validateAdminRoleUpdate, } from './rbac-state.js';
4
+ const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
5
+ /** Maps a read exception to one fixed safe result. */
6
+ function readError(error) {
7
+ if (error instanceof PortaAuthenticationError)
8
+ return { kind: 'session-invalid' };
9
+ if (error instanceof PortaValidationError)
10
+ return { kind: 'failure', failure: 'validation' };
11
+ if (error instanceof PortaForbiddenError)
12
+ return { kind: 'failure', failure: 'unauthorized' };
13
+ if (error instanceof PortaConflictError)
14
+ return { kind: 'failure', failure: 'conflict' };
15
+ return { kind: 'failure', failure: 'unavailable' };
16
+ }
17
+ /** Maps a mutation exception without exposing its message. */
18
+ function mutationError(error) {
19
+ if (error instanceof PortaAuthenticationError)
20
+ return { kind: 'session-invalid' };
21
+ if (error instanceof PortaValidationError)
22
+ return { kind: 'failure', failure: 'validation' };
23
+ if (error instanceof PortaForbiddenError)
24
+ return { kind: 'failure', failure: 'unauthorized' };
25
+ if (error instanceof PortaConflictError)
26
+ return { kind: 'failure', failure: 'conflict' };
27
+ return { kind: 'outcome-unknown' };
28
+ }
29
+ /** Returns a cancelled result before dispatching work owned by an aborted caller. */
30
+ function isCancelled(signal) {
31
+ return signal?.aborted === true;
32
+ }
33
+ /** Validates one or more UUIDs used by collection mutations. */
34
+ function validIdentifiers(...values) {
35
+ return values.length > 0 && values.every((value) => UUID.test(value));
36
+ }
37
+ /** Converts a rejected mutation to the matching reduction result union. */
38
+ function reductionError(error) {
39
+ return mutationError(error);
40
+ }
41
+ /** Creates the small RBAC adapter over one lazy authenticated SDK domain bundle. */
42
+ export function createAdminRbacOperations(domain) {
43
+ return {
44
+ async listRoles(applicationId, signal) {
45
+ if (!UUID.test(applicationId))
46
+ return { kind: 'failure', failure: 'validation' };
47
+ if (isCancelled(signal))
48
+ return { kind: 'failure', failure: 'unavailable' };
49
+ try {
50
+ const roles = validateAdminRoleCollection(await domain().roles.list(applicationId), applicationId);
51
+ return roles
52
+ ? { kind: 'success', value: roles }
53
+ : { kind: 'failure', failure: 'invalid-response' };
54
+ }
55
+ catch (error) {
56
+ return readError(error);
57
+ }
58
+ },
59
+ async listPermissions(applicationId, signal) {
60
+ if (!UUID.test(applicationId))
61
+ return { kind: 'failure', failure: 'validation' };
62
+ if (isCancelled(signal))
63
+ return { kind: 'failure', failure: 'unavailable' };
64
+ try {
65
+ const permissions = validateAdminPermissionCollection(await domain().permissions.list(applicationId), applicationId);
66
+ return permissions
67
+ ? { kind: 'success', value: permissions }
68
+ : { kind: 'failure', failure: 'invalid-response' };
69
+ }
70
+ catch (error) {
71
+ return readError(error);
72
+ }
73
+ },
74
+ async listRolePermissions(applicationId, roleId, signal) {
75
+ if (!validIdentifiers(applicationId, roleId))
76
+ return { kind: 'failure', failure: 'validation' };
77
+ if (isCancelled(signal))
78
+ return { kind: 'failure', failure: 'unavailable' };
79
+ try {
80
+ const permissions = validateAdminPermissionCollection(await domain().roles.listPermissions(applicationId, roleId), applicationId);
81
+ return permissions
82
+ ? { kind: 'success', value: permissions }
83
+ : { kind: 'failure', failure: 'invalid-response' };
84
+ }
85
+ catch (error) {
86
+ return readError(error);
87
+ }
88
+ },
89
+ async createRole(applicationId, input, signal) {
90
+ if (!UUID.test(applicationId))
91
+ return { kind: 'failure', failure: 'validation' };
92
+ if (isCancelled(signal))
93
+ return { kind: 'cancelled' };
94
+ try {
95
+ const role = validateAdminRole(await domain().roles.create(applicationId, input), applicationId);
96
+ return role ? { kind: 'success', value: role } : { kind: 'outcome-unknown' };
97
+ }
98
+ catch (error) {
99
+ return mutationError(error);
100
+ }
101
+ },
102
+ async updateRole(applicationId, roleId, input, signal) {
103
+ if (!validIdentifiers(applicationId, roleId))
104
+ return { kind: 'failure', failure: 'validation' };
105
+ if (isCancelled(signal))
106
+ return { kind: 'cancelled' };
107
+ try {
108
+ const result = validateAdminRoleUpdate(await domain().roles.update(applicationId, roleId, input), applicationId);
109
+ return result
110
+ ? {
111
+ kind: 'success',
112
+ value: result.role,
113
+ reauthenticationRequired: result.reauthenticationRequired,
114
+ }
115
+ : { kind: 'outcome-unknown' };
116
+ }
117
+ catch (error) {
118
+ return reductionError(error);
119
+ }
120
+ },
121
+ async deleteRole(applicationId, roleId, signal) {
122
+ if (!validIdentifiers(applicationId, roleId))
123
+ return { kind: 'failure', failure: 'validation' };
124
+ if (isCancelled(signal))
125
+ return { kind: 'cancelled' };
126
+ try {
127
+ const result = validateAdminAuthorityReduction(await domain().roles.delete(applicationId, roleId));
128
+ return result ? { kind: 'success', ...result } : { kind: 'outcome-unknown' };
129
+ }
130
+ catch (error) {
131
+ return reductionError(error);
132
+ }
133
+ },
134
+ async createPermission(applicationId, input, signal) {
135
+ if (!UUID.test(applicationId))
136
+ return { kind: 'failure', failure: 'validation' };
137
+ if (isCancelled(signal))
138
+ return { kind: 'cancelled' };
139
+ try {
140
+ const permission = validateAdminPermission(await domain().permissions.create(applicationId, input), applicationId);
141
+ return permission ? { kind: 'success', value: permission } : { kind: 'outcome-unknown' };
142
+ }
143
+ catch (error) {
144
+ return mutationError(error);
145
+ }
146
+ },
147
+ async updatePermission(applicationId, permissionId, input, signal) {
148
+ if (!validIdentifiers(applicationId, permissionId))
149
+ return { kind: 'failure', failure: 'validation' };
150
+ if (isCancelled(signal))
151
+ return { kind: 'cancelled' };
152
+ try {
153
+ const permission = validateAdminPermission(await domain().permissions.update(applicationId, permissionId, input), applicationId);
154
+ return permission ? { kind: 'success', value: permission } : { kind: 'outcome-unknown' };
155
+ }
156
+ catch (error) {
157
+ return mutationError(error);
158
+ }
159
+ },
160
+ async deletePermission(applicationId, permissionId, signal) {
161
+ if (!validIdentifiers(applicationId, permissionId))
162
+ return { kind: 'failure', failure: 'validation' };
163
+ if (isCancelled(signal))
164
+ return { kind: 'cancelled' };
165
+ try {
166
+ const result = validateAdminAuthorityReduction(await domain().permissions.delete(applicationId, permissionId));
167
+ return result ? { kind: 'success', ...result } : { kind: 'outcome-unknown' };
168
+ }
169
+ catch (error) {
170
+ return reductionError(error);
171
+ }
172
+ },
173
+ async assignPermissions(applicationId, roleId, permissionIds, signal) {
174
+ if (!validIdentifiers(applicationId, roleId, ...permissionIds)) {
175
+ return { kind: 'failure', failure: 'validation' };
176
+ }
177
+ if (isCancelled(signal))
178
+ return { kind: 'cancelled' };
179
+ try {
180
+ await domain().roles.assignPermissions(applicationId, roleId, [...permissionIds]);
181
+ return { kind: 'success' };
182
+ }
183
+ catch (error) {
184
+ return mutationError(error);
185
+ }
186
+ },
187
+ async removePermissions(applicationId, roleId, permissionIds, signal) {
188
+ if (!validIdentifiers(applicationId, roleId, ...permissionIds)) {
189
+ return { kind: 'failure', failure: 'validation' };
190
+ }
191
+ if (isCancelled(signal))
192
+ return { kind: 'cancelled' };
193
+ try {
194
+ const result = validateAdminAuthorityReduction(await domain().roles.removePermissions(applicationId, roleId, [...permissionIds]));
195
+ return result ? { kind: 'success', ...result } : { kind: 'outcome-unknown' };
196
+ }
197
+ catch (error) {
198
+ return reductionError(error);
199
+ }
200
+ },
201
+ async listUserRoles(organizationId, userId, signal) {
202
+ if (!validIdentifiers(organizationId, userId))
203
+ return { kind: 'failure', failure: 'validation' };
204
+ if (isCancelled(signal))
205
+ return { kind: 'failure', failure: 'unavailable' };
206
+ try {
207
+ const rawRoles = await domain().userRoles.list(organizationId, userId);
208
+ if (!Array.isArray(rawRoles))
209
+ return { kind: 'failure', failure: 'invalid-response' };
210
+ const roles = [];
211
+ for (const rawRole of rawRoles) {
212
+ if (!rawRole ||
213
+ typeof rawRole !== 'object' ||
214
+ typeof rawRole.applicationId !== 'string') {
215
+ return { kind: 'failure', failure: 'invalid-response' };
216
+ }
217
+ const role = validateAdminRole(rawRole, rawRole.applicationId);
218
+ if (!role)
219
+ return { kind: 'failure', failure: 'invalid-response' };
220
+ roles.push(role);
221
+ }
222
+ return { kind: 'success', value: Object.freeze(roles) };
223
+ }
224
+ catch (error) {
225
+ return readError(error);
226
+ }
227
+ },
228
+ async assignUserRoles(organizationId, userId, roleIds, signal) {
229
+ if (!validIdentifiers(organizationId, userId, ...roleIds)) {
230
+ return { kind: 'failure', failure: 'validation' };
231
+ }
232
+ if (isCancelled(signal))
233
+ return { kind: 'cancelled' };
234
+ try {
235
+ await domain().userRoles.assign(organizationId, userId, [...roleIds]);
236
+ return { kind: 'success' };
237
+ }
238
+ catch (error) {
239
+ return mutationError(error);
240
+ }
241
+ },
242
+ async removeUserRoles(organizationId, userId, roleIds, signal) {
243
+ if (!validIdentifiers(organizationId, userId, ...roleIds)) {
244
+ return { kind: 'failure', failure: 'validation' };
245
+ }
246
+ if (isCancelled(signal))
247
+ return { kind: 'cancelled' };
248
+ try {
249
+ const result = validateAdminAuthorityReduction(await domain().userRoles.remove(organizationId, userId, [...roleIds]));
250
+ return result ? { kind: 'success', ...result } : { kind: 'outcome-unknown' };
251
+ }
252
+ catch (error) {
253
+ return reductionError(error);
254
+ }
255
+ },
256
+ };
257
+ }
258
+ //# sourceMappingURL=rbac-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac-service.js","sourceRoot":"","sources":["../../src/admin/rbac-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,129 @@
1
+ /** Immutable role and permission values retained by the terminal administration application. */
2
+ /** Allowlisted application role safe for terminal presentation. */
3
+ export interface AdminRole {
4
+ /** Stable role UUID. */
5
+ readonly id: string;
6
+ /** Application that owns the role. */
7
+ readonly applicationId: string;
8
+ /** Human-readable role name. */
9
+ readonly name: string;
10
+ /** Stable role key. */
11
+ readonly slug: string;
12
+ /** Optional multiline explanation. */
13
+ readonly description: string | null;
14
+ /** Creation timestamp. */
15
+ readonly createdAt: string;
16
+ /** Most recent update timestamp. */
17
+ readonly updatedAt: string;
18
+ }
19
+ /** Allowlisted application permission safe for terminal presentation. */
20
+ export interface AdminPermission {
21
+ /** Stable permission UUID. */
22
+ readonly id: string;
23
+ /** Application that owns the permission. */
24
+ readonly applicationId: string;
25
+ /** Optional application module that groups the permission. */
26
+ readonly moduleId: string | null;
27
+ /** Human-readable permission name. */
28
+ readonly name: string;
29
+ /** Exact permission claim value expected by the application. */
30
+ readonly slug: string;
31
+ /** Optional multiline explanation. */
32
+ readonly description: string | null;
33
+ /** Creation timestamp. */
34
+ readonly createdAt: string;
35
+ }
36
+ /** Fixed RBAC failure categories safe to display. */
37
+ export type AdminRbacFailureKind = 'validation' | 'unauthorized' | 'conflict' | 'unavailable' | 'invalid-response';
38
+ /** Sanitized result returned by an RBAC read. */
39
+ export type AdminRbacReadResult<T> = {
40
+ readonly kind: 'success';
41
+ readonly value: T;
42
+ } | {
43
+ readonly kind: 'session-invalid';
44
+ } | {
45
+ readonly kind: 'failure';
46
+ readonly failure: AdminRbacFailureKind;
47
+ };
48
+ /** Sanitized result returned by a mutation with no authority-reduction contract. */
49
+ export type AdminRbacMutationResult<T = void> = ({
50
+ readonly kind: 'success';
51
+ } & (T extends void ? object : {
52
+ readonly value: T;
53
+ })) | {
54
+ readonly kind: 'session-invalid';
55
+ } | {
56
+ readonly kind: 'cancelled';
57
+ } | {
58
+ readonly kind: 'outcome-unknown';
59
+ } | {
60
+ readonly kind: 'failure';
61
+ readonly failure: AdminRbacFailureKind;
62
+ };
63
+ /** Sanitized committed result returned by an authority-reducing mutation. */
64
+ export type AdminRbacReductionResult<T = void> = ({
65
+ readonly kind: 'success';
66
+ readonly reauthenticationRequired: boolean;
67
+ } & (T extends void ? object : {
68
+ readonly value: T;
69
+ })) | {
70
+ readonly kind: 'session-invalid';
71
+ } | {
72
+ readonly kind: 'cancelled';
73
+ } | {
74
+ readonly kind: 'outcome-unknown';
75
+ } | {
76
+ readonly kind: 'failure';
77
+ readonly failure: AdminRbacFailureKind;
78
+ };
79
+ /** Complete validated RBAC collection for one selected application. */
80
+ export interface AdminApplicationRbacReadyProjection {
81
+ /** Ready-state discriminator. */
82
+ readonly kind: 'ready';
83
+ /** Application that owns every retained row. */
84
+ readonly applicationId: string;
85
+ /** Complete role collection. */
86
+ readonly roles: readonly AdminRole[];
87
+ /** Complete permission collection. */
88
+ readonly permissions: readonly AdminPermission[];
89
+ /** Permissions assigned to the role currently being managed. */
90
+ readonly assignedPermissions?: readonly AdminPermission[];
91
+ /** Permissions not assigned to the role currently being managed. */
92
+ readonly availablePermissions?: readonly AdminPermission[];
93
+ }
94
+ /** Validated RBAC state that may remain visible during recovery. */
95
+ export type AdminApplicationRbacProjection = AdminApplicationRbacReadyProjection;
96
+ /** Complete Application-owned RBAC controller state. */
97
+ export type AdminApplicationRbacViewState = {
98
+ readonly kind: 'closed';
99
+ } | {
100
+ readonly kind: 'loading';
101
+ readonly previous?: AdminApplicationRbacProjection;
102
+ } | AdminApplicationRbacProjection | {
103
+ readonly kind: 'indeterminate';
104
+ readonly previous?: AdminApplicationRbacProjection;
105
+ } | {
106
+ readonly kind: 'failure';
107
+ readonly failure: AdminRbacFailureKind;
108
+ readonly previous?: AdminApplicationRbacProjection;
109
+ };
110
+ /** Validates a normalized permission claim value without importing server-only code. */
111
+ export declare function isAdminPermissionSlug(value: unknown): value is string;
112
+ /** Projects one role and verifies its application owner. */
113
+ export declare function validateAdminRole(value: unknown, applicationId: string): AdminRole | undefined;
114
+ /** Projects one permission and verifies its application owner. */
115
+ export declare function validateAdminPermission(value: unknown, applicationId: string): AdminPermission | undefined;
116
+ /** Projects a complete role collection without retaining partial or duplicate data. */
117
+ export declare function validateAdminRoleCollection(value: unknown, applicationId: string): readonly AdminRole[] | undefined;
118
+ /** Projects a complete permission collection without retaining partial or duplicate data. */
119
+ export declare function validateAdminPermissionCollection(value: unknown, applicationId: string): readonly AdminPermission[] | undefined;
120
+ /** Reads the fixed authority-reduction flag from an untrusted response. */
121
+ export declare function validateAdminAuthorityReduction(value: unknown): {
122
+ readonly reauthenticationRequired: boolean;
123
+ } | undefined;
124
+ /** Reads a role update and its fixed authority-reduction flag from an untrusted response. */
125
+ export declare function validateAdminRoleUpdate(value: unknown, applicationId: string): {
126
+ readonly role: AdminRole;
127
+ readonly reauthenticationRequired: boolean;
128
+ } | undefined;
129
+ //# sourceMappingURL=rbac-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac-state.d.ts","sourceRoot":"","sources":["../../src/admin/rbac-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /** Immutable role and permission values retained by the terminal administration application. */
2
+ const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
3
+ const ISO_TIMESTAMP = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?Z$/;
4
+ /** Returns true when text contains a terminal control other than an allowed line ending. */
5
+ function containsTerminalControl(value, allowLineEndings = false) {
6
+ for (const character of value) {
7
+ const codePoint = character.codePointAt(0) ?? 0;
8
+ if (allowLineEndings && (codePoint === 0x0a || codePoint === 0x0d))
9
+ continue;
10
+ if (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f))
11
+ return true;
12
+ }
13
+ return false;
14
+ }
15
+ /** Validates bounded terminal-safe text. */
16
+ function isText(value, maximum, minimum = 0, allowLineEndings = false) {
17
+ return (typeof value === 'string' &&
18
+ value.length >= minimum &&
19
+ value.length <= maximum &&
20
+ !containsTerminalControl(value, allowLineEndings));
21
+ }
22
+ /** Validates an ISO timestamp used for presentation. */
23
+ function isTimestamp(value) {
24
+ if (!isText(value, 40, 20) || !ISO_TIMESTAMP.test(value))
25
+ return false;
26
+ const parsed = new Date(value);
27
+ return (Number.isFinite(parsed.getTime()) && parsed.toISOString().slice(0, 19) === value.slice(0, 19));
28
+ }
29
+ /** Returns an object-shaped untrusted value. */
30
+ function objectValue(value) {
31
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
32
+ ? value
33
+ : undefined;
34
+ }
35
+ /** Validates a normalized permission claim value without importing server-only code. */
36
+ export function isAdminPermissionSlug(value) {
37
+ return isText(value, 150, 1) && value === value.trim();
38
+ }
39
+ /** Projects one role and verifies its application owner. */
40
+ export function validateAdminRole(value, applicationId) {
41
+ const candidate = objectValue(value);
42
+ if (!UUID.test(applicationId) ||
43
+ !candidate ||
44
+ !isText(candidate.id, 36, 36) ||
45
+ !UUID.test(candidate.id) ||
46
+ candidate.applicationId !== applicationId ||
47
+ !isText(candidate.name, 255, 1) ||
48
+ !isText(candidate.slug, 100, 1) ||
49
+ candidate.slug !== candidate.slug.trim() ||
50
+ !(candidate.description === null || isText(candidate.description, 1_000, 0, true)) ||
51
+ !isTimestamp(candidate.createdAt) ||
52
+ !isTimestamp(candidate.updatedAt)) {
53
+ return undefined;
54
+ }
55
+ return Object.freeze({
56
+ id: candidate.id,
57
+ applicationId,
58
+ name: candidate.name,
59
+ slug: candidate.slug,
60
+ description: candidate.description,
61
+ createdAt: candidate.createdAt,
62
+ updatedAt: candidate.updatedAt,
63
+ });
64
+ }
65
+ /** Projects one permission and verifies its application owner. */
66
+ export function validateAdminPermission(value, applicationId) {
67
+ const candidate = objectValue(value);
68
+ if (!UUID.test(applicationId) ||
69
+ !candidate ||
70
+ !isText(candidate.id, 36, 36) ||
71
+ !UUID.test(candidate.id) ||
72
+ candidate.applicationId !== applicationId ||
73
+ !(candidate.moduleId === null ||
74
+ (isText(candidate.moduleId, 36, 36) && UUID.test(candidate.moduleId))) ||
75
+ !isText(candidate.name, 255, 1) ||
76
+ !isAdminPermissionSlug(candidate.slug) ||
77
+ !(candidate.description === null || isText(candidate.description, 1_000, 0, true)) ||
78
+ !isTimestamp(candidate.createdAt)) {
79
+ return undefined;
80
+ }
81
+ return Object.freeze({
82
+ id: candidate.id,
83
+ applicationId,
84
+ moduleId: candidate.moduleId,
85
+ name: candidate.name,
86
+ slug: candidate.slug,
87
+ description: candidate.description,
88
+ createdAt: candidate.createdAt,
89
+ });
90
+ }
91
+ /** Projects a complete role collection without retaining partial or duplicate data. */
92
+ export function validateAdminRoleCollection(value, applicationId) {
93
+ if (!Array.isArray(value))
94
+ return undefined;
95
+ const roles = [];
96
+ const ids = new Set();
97
+ for (const entry of value) {
98
+ const role = validateAdminRole(entry, applicationId);
99
+ if (!role || ids.has(role.id))
100
+ return undefined;
101
+ ids.add(role.id);
102
+ roles.push(role);
103
+ }
104
+ return Object.freeze(roles);
105
+ }
106
+ /** Projects a complete permission collection without retaining partial or duplicate data. */
107
+ export function validateAdminPermissionCollection(value, applicationId) {
108
+ if (!Array.isArray(value))
109
+ return undefined;
110
+ const permissions = [];
111
+ const ids = new Set();
112
+ for (const entry of value) {
113
+ const permission = validateAdminPermission(entry, applicationId);
114
+ if (!permission || ids.has(permission.id))
115
+ return undefined;
116
+ ids.add(permission.id);
117
+ permissions.push(permission);
118
+ }
119
+ return Object.freeze(permissions);
120
+ }
121
+ /** Reads the fixed authority-reduction flag from an untrusted response. */
122
+ export function validateAdminAuthorityReduction(value) {
123
+ const candidate = objectValue(value);
124
+ return candidate && typeof candidate.reauthenticationRequired === 'boolean'
125
+ ? Object.freeze({ reauthenticationRequired: candidate.reauthenticationRequired })
126
+ : undefined;
127
+ }
128
+ /** Reads a role update and its fixed authority-reduction flag from an untrusted response. */
129
+ export function validateAdminRoleUpdate(value, applicationId) {
130
+ const candidate = objectValue(value);
131
+ const role = candidate ? validateAdminRole(candidate.role, applicationId) : undefined;
132
+ return role && typeof candidate?.reauthenticationRequired === 'boolean'
133
+ ? Object.freeze({ role, reauthenticationRequired: candidate.reauthenticationRequired })
134
+ : undefined;
135
+ }
136
+ //# sourceMappingURL=rbac-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac-state.js","sourceRoot":"","sources":["../../src/admin/rbac-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /** Selectable single-line values that must never be edited by the Admin UI. */
2
+ import { Input } from '@jsvision/ui';
3
+ import type { DispatchEvent } from '@jsvision/ui';
4
+ /**
5
+ * Presents an immutable value with the selection and clipboard behavior of a normal input.
6
+ *
7
+ * Navigation and copying remain available. Any typing, deletion, cut, or paste gesture is allowed
8
+ * to complete normally and then the original value is restored immediately.
9
+ */
10
+ export declare class SelectableReadOnlyInput extends Input {
11
+ /** Exact immutable value restored after every input event. */
12
+ protected readonly originalValue: string;
13
+ /** Creates a selectable field containing one immutable value. */
14
+ constructor(value: string);
15
+ /** Allows selection and copying while discarding every mutation. */
16
+ onEvent(event: DispatchEvent): void;
17
+ }
18
+ //# sourceMappingURL=selectable-read-only-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectable-read-only-input.d.ts","sourceRoot":"","sources":["../../src/admin/selectable-read-only-input.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,OAAO,EAAE,KAAK,EAAU,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD;;;;;GAKG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,8DAA8D;IAC9D,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAEzC,iEAAiE;IACjE,YAAY,KAAK,EAAE,MAAM,EAGxB;IAED,oEAAoE;IAC3D,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAG3C;CACF"}
@@ -0,0 +1,24 @@
1
+ /** Selectable single-line values that must never be edited by the Admin UI. */
2
+ import { Input, signal } from '@jsvision/ui';
3
+ /**
4
+ * Presents an immutable value with the selection and clipboard behavior of a normal input.
5
+ *
6
+ * Navigation and copying remain available. Any typing, deletion, cut, or paste gesture is allowed
7
+ * to complete normally and then the original value is restored immediately.
8
+ */
9
+ export class SelectableReadOnlyInput extends Input {
10
+ /** Exact immutable value restored after every input event. */
11
+ originalValue;
12
+ /** Creates a selectable field containing one immutable value. */
13
+ constructor(value) {
14
+ super({ value: signal(value), maxLength: value.length });
15
+ this.originalValue = value;
16
+ }
17
+ /** Allows selection and copying while discarding every mutation. */
18
+ onEvent(event) {
19
+ super.onEvent(event);
20
+ if (this.value.peek() !== this.originalValue)
21
+ this.value.set(this.originalValue);
22
+ }
23
+ }
24
+ //# sourceMappingURL=selectable-read-only-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectable-read-only-input.js","sourceRoot":"","sources":["../../src/admin/selectable-read-only-input.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG7C;;;;;GAKG;AACH,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD,8DAA8D;IAC3C,aAAa,CAAS;IAEzC,iEAAiE;IACjE,YAAY,KAAa;QACvB,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED,oEAAoE;IAC3D,OAAO,CAAC,KAAoB;QACnC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACnF,CAAC;CACF"}