@happyvertical/smrt-users 0.30.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 (150) hide show
  1. package/AGENTS.md +85 -0
  2. package/CLAUDE.md +1 -0
  3. package/LICENSE +7 -0
  4. package/README.md +459 -0
  5. package/dist/__smrt-register__.d.ts +2 -0
  6. package/dist/__smrt-register__.d.ts.map +1 -0
  7. package/dist/chunks/TerminalAuthService-DoAMQ_yn.js +5118 -0
  8. package/dist/chunks/TerminalAuthService-DoAMQ_yn.js.map +1 -0
  9. package/dist/chunks/index-DkoYIvIu.js +169 -0
  10. package/dist/chunks/index-DkoYIvIu.js.map +1 -0
  11. package/dist/collections/CliAuthRequestCollection.d.ts +19 -0
  12. package/dist/collections/CliAuthRequestCollection.d.ts.map +1 -0
  13. package/dist/collections/GroupCollection.d.ts +17 -0
  14. package/dist/collections/GroupCollection.d.ts.map +1 -0
  15. package/dist/collections/GroupMemberCollection.d.ts +43 -0
  16. package/dist/collections/GroupMemberCollection.d.ts.map +1 -0
  17. package/dist/collections/GroupRoleCollection.d.ts +33 -0
  18. package/dist/collections/GroupRoleCollection.d.ts.map +1 -0
  19. package/dist/collections/MagicLinkTokenCollection.d.ts +26 -0
  20. package/dist/collections/MagicLinkTokenCollection.d.ts.map +1 -0
  21. package/dist/collections/MembershipCollection.d.ts +38 -0
  22. package/dist/collections/MembershipCollection.d.ts.map +1 -0
  23. package/dist/collections/MembershipOverrideCollection.d.ts +55 -0
  24. package/dist/collections/MembershipOverrideCollection.d.ts.map +1 -0
  25. package/dist/collections/PermissionCollection.d.ts +34 -0
  26. package/dist/collections/PermissionCollection.d.ts.map +1 -0
  27. package/dist/collections/RoleCollection.d.ts +29 -0
  28. package/dist/collections/RoleCollection.d.ts.map +1 -0
  29. package/dist/collections/RolePermissionCollection.d.ts +33 -0
  30. package/dist/collections/RolePermissionCollection.d.ts.map +1 -0
  31. package/dist/collections/SessionCollection.d.ts +82 -0
  32. package/dist/collections/SessionCollection.d.ts.map +1 -0
  33. package/dist/collections/TenantCollection.d.ts +119 -0
  34. package/dist/collections/TenantCollection.d.ts.map +1 -0
  35. package/dist/collections/TenantPermissionOverrideCollection.d.ts +111 -0
  36. package/dist/collections/TenantPermissionOverrideCollection.d.ts.map +1 -0
  37. package/dist/collections/UserCollection.d.ts +116 -0
  38. package/dist/collections/UserCollection.d.ts.map +1 -0
  39. package/dist/collections/index.d.ts +19 -0
  40. package/dist/collections/index.d.ts.map +1 -0
  41. package/dist/index.d.ts +5 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +1482 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/manifest.json +5216 -0
  46. package/dist/models/CliAuthRequest.d.ts +25 -0
  47. package/dist/models/CliAuthRequest.d.ts.map +1 -0
  48. package/dist/models/Group.d.ts +34 -0
  49. package/dist/models/Group.d.ts.map +1 -0
  50. package/dist/models/GroupMember.d.ts +29 -0
  51. package/dist/models/GroupMember.d.ts.map +1 -0
  52. package/dist/models/GroupRole.d.ts +29 -0
  53. package/dist/models/GroupRole.d.ts.map +1 -0
  54. package/dist/models/MagicLinkToken.d.ts +22 -0
  55. package/dist/models/MagicLinkToken.d.ts.map +1 -0
  56. package/dist/models/Membership.d.ts +48 -0
  57. package/dist/models/Membership.d.ts.map +1 -0
  58. package/dist/models/MembershipOverride.d.ts +50 -0
  59. package/dist/models/MembershipOverride.d.ts.map +1 -0
  60. package/dist/models/Permission.d.ts +79 -0
  61. package/dist/models/Permission.d.ts.map +1 -0
  62. package/dist/models/Role.d.ts +67 -0
  63. package/dist/models/Role.d.ts.map +1 -0
  64. package/dist/models/RolePermission.d.ts +29 -0
  65. package/dist/models/RolePermission.d.ts.map +1 -0
  66. package/dist/models/Session.d.ts +105 -0
  67. package/dist/models/Session.d.ts.map +1 -0
  68. package/dist/models/Tenant.d.ts +138 -0
  69. package/dist/models/Tenant.d.ts.map +1 -0
  70. package/dist/models/TenantPermissionOverride.d.ts +74 -0
  71. package/dist/models/TenantPermissionOverride.d.ts.map +1 -0
  72. package/dist/models/User.d.ts +72 -0
  73. package/dist/models/User.d.ts.map +1 -0
  74. package/dist/models/index.d.ts +19 -0
  75. package/dist/models/index.d.ts.map +1 -0
  76. package/dist/playground.d.ts +2 -0
  77. package/dist/playground.d.ts.map +1 -0
  78. package/dist/playground.js +139 -0
  79. package/dist/playground.js.map +1 -0
  80. package/dist/services/MagicLinkService.d.ts +84 -0
  81. package/dist/services/MagicLinkService.d.ts.map +1 -0
  82. package/dist/services/OidcLoginService.d.ts +134 -0
  83. package/dist/services/OidcLoginService.d.ts.map +1 -0
  84. package/dist/services/PermissionCatalogService.d.ts +62 -0
  85. package/dist/services/PermissionCatalogService.d.ts.map +1 -0
  86. package/dist/services/PermissionResolver.d.ts +150 -0
  87. package/dist/services/PermissionResolver.d.ts.map +1 -0
  88. package/dist/services/PostgresPermissionPolicies.d.ts +29 -0
  89. package/dist/services/PostgresPermissionPolicies.d.ts.map +1 -0
  90. package/dist/services/SessionPermissionContext.d.ts +43 -0
  91. package/dist/services/SessionPermissionContext.d.ts.map +1 -0
  92. package/dist/services/SessionService.d.ts +139 -0
  93. package/dist/services/SessionService.d.ts.map +1 -0
  94. package/dist/services/TenantService.d.ts +135 -0
  95. package/dist/services/TenantService.d.ts.map +1 -0
  96. package/dist/services/TerminalAuthService.d.ts +189 -0
  97. package/dist/services/TerminalAuthService.d.ts.map +1 -0
  98. package/dist/services/index.d.ts +14 -0
  99. package/dist/services/index.d.ts.map +1 -0
  100. package/dist/smrt-knowledge.json +2744 -0
  101. package/dist/svelte/components/InviteUserModal.svelte +351 -0
  102. package/dist/svelte/components/InviteUserModal.svelte.d.ts +17 -0
  103. package/dist/svelte/components/InviteUserModal.svelte.d.ts.map +1 -0
  104. package/dist/svelte/components/UserAvatar.svelte +105 -0
  105. package/dist/svelte/components/UserAvatar.svelte.d.ts +10 -0
  106. package/dist/svelte/components/UserAvatar.svelte.d.ts.map +1 -0
  107. package/dist/svelte/components/UserCard.svelte +179 -0
  108. package/dist/svelte/components/UserCard.svelte.d.ts +18 -0
  109. package/dist/svelte/components/UserCard.svelte.d.ts.map +1 -0
  110. package/dist/svelte/components/UserForm.svelte +194 -0
  111. package/dist/svelte/components/UserForm.svelte.d.ts +18 -0
  112. package/dist/svelte/components/UserForm.svelte.d.ts.map +1 -0
  113. package/dist/svelte/components/UserList.svelte +107 -0
  114. package/dist/svelte/components/UserList.svelte.d.ts +20 -0
  115. package/dist/svelte/components/UserList.svelte.d.ts.map +1 -0
  116. package/dist/svelte/components/UserMenu.svelte +326 -0
  117. package/dist/svelte/components/UserMenu.svelte.d.ts +33 -0
  118. package/dist/svelte/components/UserMenu.svelte.d.ts.map +1 -0
  119. package/dist/svelte/components/__tests__/InviteUserModal.test.js +54 -0
  120. package/dist/svelte/components/__tests__/UserAvatar.test.js +31 -0
  121. package/dist/svelte/components/__tests__/UserCard.test.js +39 -0
  122. package/dist/svelte/components/__tests__/UserForm.test.js +50 -0
  123. package/dist/svelte/components/__tests__/UserList.test.js +48 -0
  124. package/dist/svelte/components/__tests__/UserMenu.test.js +38 -0
  125. package/dist/svelte/i18n.d.ts +15 -0
  126. package/dist/svelte/i18n.d.ts.map +1 -0
  127. package/dist/svelte/i18n.js +15 -0
  128. package/dist/svelte/index.d.ts +23 -0
  129. package/dist/svelte/index.d.ts.map +1 -0
  130. package/dist/svelte/index.js +27 -0
  131. package/dist/svelte/playground.d.ts +151 -0
  132. package/dist/svelte/playground.d.ts.map +1 -0
  133. package/dist/svelte/playground.js +134 -0
  134. package/dist/sveltekit/index.d.ts +379 -0
  135. package/dist/sveltekit/index.d.ts.map +1 -0
  136. package/dist/sveltekit/resource-list-handler.d.ts +127 -0
  137. package/dist/sveltekit/resource-list-handler.d.ts.map +1 -0
  138. package/dist/sveltekit/types.d.ts +31 -0
  139. package/dist/sveltekit/types.d.ts.map +1 -0
  140. package/dist/sveltekit.d.ts +2 -0
  141. package/dist/sveltekit.d.ts.map +1 -0
  142. package/dist/sveltekit.js +978 -0
  143. package/dist/sveltekit.js.map +1 -0
  144. package/dist/types/index.d.ts +61 -0
  145. package/dist/types/index.d.ts.map +1 -0
  146. package/dist/ui.d.ts +10 -0
  147. package/dist/ui.d.ts.map +1 -0
  148. package/dist/ui.js +75 -0
  149. package/dist/ui.js.map +1 -0
  150. package/package.json +97 -0
@@ -0,0 +1,2744 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "generatedAt": "2026-06-23T01:11:47.353Z",
4
+ "packageName": "@happyvertical/smrt-users",
5
+ "packageVersion": "0.30.0",
6
+ "sourceManifestPath": "dist/manifest.json",
7
+ "agentDocPath": "AGENTS.md",
8
+ "sourceHashes": {
9
+ "manifest": "130d1f4d978daf5b7a2f08fdbd4d82fccb65038058222e4ac0080dc18ff183cc",
10
+ "packageJson": "5b562b335e5f29d1b872d563007e428309255b43aba65c01140251f53d6af89e",
11
+ "agents": "7265a29482d4a39a46d84a489ee09b49eb5ecc4e71a52c94909dbd20a51f619c"
12
+ },
13
+ "exports": [
14
+ ".",
15
+ "./manifest",
16
+ "./manifest.json",
17
+ "./playground",
18
+ "./svelte",
19
+ "./sveltekit"
20
+ ],
21
+ "dependencies": {
22
+ "@happyvertical/logger": "catalog:",
23
+ "@happyvertical/smrt-config": "workspace:*",
24
+ "@happyvertical/smrt-core": "workspace:*",
25
+ "@happyvertical/smrt-profiles": "workspace:*",
26
+ "@happyvertical/smrt-tenancy": "workspace:*",
27
+ "@happyvertical/smrt-types": "workspace:*",
28
+ "@happyvertical/smrt-ui": "workspace:*",
29
+ "jose": "^6.1.3",
30
+ "@happyvertical/smrt-vitest": "workspace:*",
31
+ "@happyvertical/sql": "catalog:",
32
+ "@sveltejs/package": "^2.5.7",
33
+ "@sveltejs/vite-plugin-svelte": "^6.2.4",
34
+ "@types/node": "25.0.9",
35
+ "fast-glob": "^3.3.3",
36
+ "svelte": "^5.46.4",
37
+ "svelte-check": "^4.3.5",
38
+ "typescript": "^5.9.3",
39
+ "vite": "^7.3.1",
40
+ "vitest": "^4.0.17"
41
+ },
42
+ "smrtDependencies": [
43
+ "@happyvertical/smrt-config",
44
+ "@happyvertical/smrt-core",
45
+ "@happyvertical/smrt-profiles",
46
+ "@happyvertical/smrt-tenancy",
47
+ "@happyvertical/smrt-types",
48
+ "@happyvertical/smrt-ui",
49
+ "@happyvertical/smrt-vitest"
50
+ ],
51
+ "sdkDependencies": [
52
+ "@happyvertical/logger",
53
+ "@happyvertical/sql"
54
+ ],
55
+ "tags": [],
56
+ "risks": [],
57
+ "objects": [
58
+ {
59
+ "name": "UsersCliAuthRequestCollection",
60
+ "qualifiedName": "@happyvertical/smrt-users:UsersCliAuthRequestCollection",
61
+ "collection": "userscliauthrequests",
62
+ "tableName": "users_cli_auth_requests",
63
+ "packageName": "@happyvertical/smrt-users",
64
+ "extends": "SmrtCollection",
65
+ "fields": [],
66
+ "relationships": [],
67
+ "methods": [
68
+ "deleteExpired",
69
+ "findByDeviceCodeHash",
70
+ "findByUserCode"
71
+ ],
72
+ "surfaces": [],
73
+ "relationshipFeatures": [
74
+ "uuidColumns"
75
+ ],
76
+ "tags": [],
77
+ "risks": []
78
+ },
79
+ {
80
+ "name": "GroupCollection",
81
+ "qualifiedName": "@happyvertical/smrt-users:GroupCollection",
82
+ "collection": "groups",
83
+ "tableName": "group_collections",
84
+ "packageName": "@happyvertical/smrt-users",
85
+ "extends": "SmrtCollection",
86
+ "fields": [],
87
+ "relationships": [],
88
+ "methods": [
89
+ "findBySlug",
90
+ "findByTenant"
91
+ ],
92
+ "surfaces": [],
93
+ "relationshipFeatures": [
94
+ "uuidColumns"
95
+ ],
96
+ "tags": [],
97
+ "risks": []
98
+ },
99
+ {
100
+ "name": "GroupMemberCollection",
101
+ "qualifiedName": "@happyvertical/smrt-users:GroupMemberCollection",
102
+ "collection": "groupmembers",
103
+ "tableName": "group_member_collections",
104
+ "packageName": "@happyvertical/smrt-users",
105
+ "extends": "SmrtCollection",
106
+ "fields": [],
107
+ "relationships": [],
108
+ "methods": [
109
+ "addMember",
110
+ "findByGroup",
111
+ "findByUser",
112
+ "getGroupIds",
113
+ "getGroupIdsForTenant",
114
+ "getUserIds",
115
+ "isMember",
116
+ "removeMember"
117
+ ],
118
+ "surfaces": [],
119
+ "relationshipFeatures": [
120
+ "uuidColumns"
121
+ ],
122
+ "tags": [],
123
+ "risks": []
124
+ },
125
+ {
126
+ "name": "GroupRoleCollection",
127
+ "qualifiedName": "@happyvertical/smrt-users:GroupRoleCollection",
128
+ "collection": "grouproles",
129
+ "tableName": "group_role_collections",
130
+ "packageName": "@happyvertical/smrt-users",
131
+ "extends": "SmrtCollection",
132
+ "fields": [],
133
+ "relationships": [],
134
+ "methods": [
135
+ "addRole",
136
+ "findByGroup",
137
+ "findByRole",
138
+ "getRoleIds",
139
+ "hasRole",
140
+ "removeRole"
141
+ ],
142
+ "surfaces": [],
143
+ "relationshipFeatures": [
144
+ "uuidColumns"
145
+ ],
146
+ "tags": [],
147
+ "risks": []
148
+ },
149
+ {
150
+ "name": "UsersMagicLinkTokenCollection",
151
+ "qualifiedName": "@happyvertical/smrt-users:UsersMagicLinkTokenCollection",
152
+ "collection": "usersmagiclinktokens",
153
+ "tableName": "users_magic_link_tokens",
154
+ "packageName": "@happyvertical/smrt-users",
155
+ "extends": "SmrtCollection",
156
+ "fields": [],
157
+ "relationships": [],
158
+ "methods": [
159
+ "deleteExpired",
160
+ "findByNonce",
161
+ "markUsed"
162
+ ],
163
+ "surfaces": [],
164
+ "relationshipFeatures": [
165
+ "uuidColumns"
166
+ ],
167
+ "tags": [],
168
+ "risks": []
169
+ },
170
+ {
171
+ "name": "MembershipCollection",
172
+ "qualifiedName": "@happyvertical/smrt-users:MembershipCollection",
173
+ "collection": "memberships",
174
+ "tableName": "membership_collections",
175
+ "packageName": "@happyvertical/smrt-users",
176
+ "extends": "SmrtCollection",
177
+ "fields": [],
178
+ "relationships": [],
179
+ "methods": [
180
+ "findActiveByTenant",
181
+ "findActiveByUser",
182
+ "findByRole",
183
+ "findByStatus",
184
+ "findByTenant",
185
+ "findByUser",
186
+ "findByUserAndTenant"
187
+ ],
188
+ "surfaces": [],
189
+ "relationshipFeatures": [
190
+ "uuidColumns"
191
+ ],
192
+ "tags": [],
193
+ "risks": []
194
+ },
195
+ {
196
+ "name": "MembershipOverrideCollection",
197
+ "qualifiedName": "@happyvertical/smrt-users:MembershipOverrideCollection",
198
+ "collection": "membershipoverrides",
199
+ "tableName": "membership_override_collections",
200
+ "packageName": "@happyvertical/smrt-users",
201
+ "extends": "SmrtCollection",
202
+ "fields": [],
203
+ "relationships": [],
204
+ "methods": [
205
+ "denyPermission",
206
+ "findByMembership",
207
+ "findDenies",
208
+ "findGrants",
209
+ "getDeniedPermissionIds",
210
+ "getGrantedPermissionIds",
211
+ "grantPermission",
212
+ "removeOverride",
213
+ "setOverride"
214
+ ],
215
+ "surfaces": [],
216
+ "relationshipFeatures": [
217
+ "uuidColumns"
218
+ ],
219
+ "tags": [],
220
+ "risks": []
221
+ },
222
+ {
223
+ "name": "PermissionCollection",
224
+ "qualifiedName": "@happyvertical/smrt-users:PermissionCollection",
225
+ "collection": "permissions",
226
+ "tableName": "permission_collections",
227
+ "packageName": "@happyvertical/smrt-users",
228
+ "extends": "SmrtCollection",
229
+ "fields": [],
230
+ "relationships": [],
231
+ "methods": [
232
+ "findByCategory",
233
+ "findByIds",
234
+ "findBySlug",
235
+ "findOrCreate",
236
+ "getCategories"
237
+ ],
238
+ "surfaces": [],
239
+ "relationshipFeatures": [
240
+ "uuidColumns"
241
+ ],
242
+ "tags": [],
243
+ "risks": []
244
+ },
245
+ {
246
+ "name": "RoleCollection",
247
+ "qualifiedName": "@happyvertical/smrt-users:RoleCollection",
248
+ "collection": "roles",
249
+ "tableName": "role_collections",
250
+ "packageName": "@happyvertical/smrt-users",
251
+ "extends": "SmrtCollection",
252
+ "fields": [],
253
+ "relationships": [],
254
+ "methods": [
255
+ "findBySlug",
256
+ "findByTenant",
257
+ "findSystemRoles",
258
+ "findTenantRoles",
259
+ "seedSystemRoles"
260
+ ],
261
+ "surfaces": [],
262
+ "relationshipFeatures": [
263
+ "uuidColumns"
264
+ ],
265
+ "tags": [],
266
+ "risks": []
267
+ },
268
+ {
269
+ "name": "RolePermissionCollection",
270
+ "qualifiedName": "@happyvertical/smrt-users:RolePermissionCollection",
271
+ "collection": "rolepermissions",
272
+ "tableName": "role_permission_collections",
273
+ "packageName": "@happyvertical/smrt-users",
274
+ "extends": "SmrtCollection",
275
+ "fields": [],
276
+ "relationships": [],
277
+ "methods": [
278
+ "addPermission",
279
+ "findByPermission",
280
+ "findByRole",
281
+ "getPermissionIds",
282
+ "hasPermission",
283
+ "removePermission"
284
+ ],
285
+ "surfaces": [],
286
+ "relationshipFeatures": [
287
+ "uuidColumns"
288
+ ],
289
+ "tags": [],
290
+ "risks": []
291
+ },
292
+ {
293
+ "name": "SessionCollection",
294
+ "qualifiedName": "@happyvertical/smrt-users:SessionCollection",
295
+ "collection": "sessions",
296
+ "tableName": "session_collections",
297
+ "packageName": "@happyvertical/smrt-users",
298
+ "extends": "SmrtCollection",
299
+ "fields": [],
300
+ "relationships": [],
301
+ "methods": [
302
+ "countUserSessions",
303
+ "createSession",
304
+ "deleteExpired",
305
+ "deleteUserSessions",
306
+ "findByUser",
307
+ "findValidSession",
308
+ "getSessionData",
309
+ "revokeSession",
310
+ "revokeUserSessions",
311
+ "setSessionData",
312
+ "setSessionTenant",
313
+ "touch"
314
+ ],
315
+ "surfaces": [],
316
+ "relationshipFeatures": [
317
+ "uuidColumns"
318
+ ],
319
+ "tags": [],
320
+ "risks": []
321
+ },
322
+ {
323
+ "name": "TenantCollection",
324
+ "qualifiedName": "@happyvertical/smrt-users:TenantCollection",
325
+ "collection": "tenants",
326
+ "tableName": "tenant_collections",
327
+ "packageName": "@happyvertical/smrt-users",
328
+ "extends": "SmrtCollection",
329
+ "fields": [],
330
+ "relationships": [],
331
+ "methods": [
332
+ "create",
333
+ "createChild",
334
+ "findActive",
335
+ "findBySlug",
336
+ "findByStatus",
337
+ "findChildren",
338
+ "findParent",
339
+ "findRoots",
340
+ "getAncestors",
341
+ "getAncestorsFromRoot",
342
+ "getDescendants",
343
+ "getSiblings",
344
+ "getTree",
345
+ "isAncestorOf",
346
+ "isDescendantOf",
347
+ "makeRoot",
348
+ "moveToParent",
349
+ "validateHierarchy"
350
+ ],
351
+ "surfaces": [],
352
+ "relationshipFeatures": [
353
+ "uuidColumns"
354
+ ],
355
+ "tags": [],
356
+ "risks": []
357
+ },
358
+ {
359
+ "name": "TenantPermissionOverrideCollection",
360
+ "qualifiedName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection",
361
+ "collection": "tenantpermissionoverrides",
362
+ "tableName": "tenant_permission_override_collections",
363
+ "packageName": "@happyvertical/smrt-users",
364
+ "extends": "SmrtCollection",
365
+ "fields": [],
366
+ "relationships": [],
367
+ "methods": [
368
+ "bulkSetOverrides",
369
+ "copyOverrides",
370
+ "denyPermission",
371
+ "findByTenant",
372
+ "findDenies",
373
+ "findGrants",
374
+ "findInherits",
375
+ "getDeniedPermissionIds",
376
+ "getGrantedPermissionIds",
377
+ "getOverridesByEffect",
378
+ "getOverridesByEffectBatch",
379
+ "grantPermission",
380
+ "inheritPermission",
381
+ "removeAllOverrides",
382
+ "removeOverride",
383
+ "setOverride"
384
+ ],
385
+ "surfaces": [],
386
+ "relationshipFeatures": [
387
+ "uuidColumns"
388
+ ],
389
+ "tags": [],
390
+ "risks": []
391
+ },
392
+ {
393
+ "name": "UserCollection",
394
+ "qualifiedName": "@happyvertical/smrt-users:UserCollection",
395
+ "collection": "users",
396
+ "tableName": "user_collections",
397
+ "packageName": "@happyvertical/smrt-users",
398
+ "extends": "SmrtCollection",
399
+ "fields": [],
400
+ "relationships": [],
401
+ "methods": [
402
+ "findActive",
403
+ "findByEmail",
404
+ "findByProfile",
405
+ "findByStatus",
406
+ "findPending",
407
+ "getOrCreateForProfile",
408
+ "getOrCreateFromOidc"
409
+ ],
410
+ "surfaces": [],
411
+ "relationshipFeatures": [
412
+ "uuidColumns"
413
+ ],
414
+ "tags": [],
415
+ "risks": []
416
+ },
417
+ {
418
+ "name": "UsersCliAuthRequest",
419
+ "qualifiedName": "@happyvertical/smrt-users:UsersCliAuthRequest",
420
+ "collection": "userscliauthrequests",
421
+ "tableName": "users_cli_auth_requests",
422
+ "packageName": "@happyvertical/smrt-users",
423
+ "extends": "SmrtObject",
424
+ "fields": [
425
+ {
426
+ "name": "userCode",
427
+ "type": "text",
428
+ "required": false,
429
+ "columnType": "TEXT"
430
+ },
431
+ {
432
+ "name": "deviceCodeHash",
433
+ "type": "text",
434
+ "required": false,
435
+ "columnType": "TEXT"
436
+ },
437
+ {
438
+ "name": "status",
439
+ "type": "text",
440
+ "required": false,
441
+ "columnType": "TEXT"
442
+ },
443
+ {
444
+ "name": "userId",
445
+ "type": "text",
446
+ "required": false,
447
+ "columnType": "TEXT"
448
+ },
449
+ {
450
+ "name": "tenantId",
451
+ "type": "text",
452
+ "required": false,
453
+ "columnType": "TEXT"
454
+ },
455
+ {
456
+ "name": "sessionId",
457
+ "type": "text",
458
+ "required": false,
459
+ "columnType": "TEXT"
460
+ },
461
+ {
462
+ "name": "expiresAt",
463
+ "type": "datetime",
464
+ "required": false,
465
+ "columnType": "TIMESTAMP"
466
+ },
467
+ {
468
+ "name": "approvedAt",
469
+ "type": "datetime",
470
+ "required": false,
471
+ "columnType": "TIMESTAMP"
472
+ }
473
+ ],
474
+ "relationships": [],
475
+ "methods": [],
476
+ "surfaces": [],
477
+ "relationshipFeatures": [
478
+ "uuidColumns"
479
+ ],
480
+ "tags": [],
481
+ "risks": []
482
+ },
483
+ {
484
+ "name": "Group",
485
+ "qualifiedName": "@happyvertical/smrt-users:Group",
486
+ "collection": "groups",
487
+ "tableName": "groups",
488
+ "packageName": "@happyvertical/smrt-users",
489
+ "extends": "SmrtObject",
490
+ "fields": [
491
+ {
492
+ "name": "tenantId",
493
+ "type": "foreignKey",
494
+ "required": true,
495
+ "related": "Tenant",
496
+ "columnType": "UUID"
497
+ },
498
+ {
499
+ "name": "name",
500
+ "type": "text",
501
+ "required": false,
502
+ "columnType": "TEXT"
503
+ },
504
+ {
505
+ "name": "description",
506
+ "type": "text",
507
+ "required": false,
508
+ "columnType": "TEXT"
509
+ }
510
+ ],
511
+ "relationships": [
512
+ {
513
+ "name": "tenantId",
514
+ "type": "foreignKey",
515
+ "required": true,
516
+ "related": "Tenant",
517
+ "columnType": "UUID"
518
+ }
519
+ ],
520
+ "methods": [],
521
+ "surfaces": [
522
+ {
523
+ "kind": "api",
524
+ "name": "groups.list",
525
+ "operation": "list",
526
+ "objectName": "@happyvertical/smrt-users:Group",
527
+ "path": "/groups",
528
+ "method": "GET"
529
+ },
530
+ {
531
+ "kind": "api",
532
+ "name": "groups.get",
533
+ "operation": "get",
534
+ "objectName": "@happyvertical/smrt-users:Group",
535
+ "path": "/groups/[id]",
536
+ "method": "GET"
537
+ },
538
+ {
539
+ "kind": "cli",
540
+ "name": "group_list",
541
+ "operation": "list",
542
+ "objectName": "@happyvertical/smrt-users:Group"
543
+ },
544
+ {
545
+ "kind": "cli",
546
+ "name": "group_get",
547
+ "operation": "get",
548
+ "objectName": "@happyvertical/smrt-users:Group"
549
+ },
550
+ {
551
+ "kind": "cli",
552
+ "name": "group_create",
553
+ "operation": "create",
554
+ "objectName": "@happyvertical/smrt-users:Group"
555
+ },
556
+ {
557
+ "kind": "cli",
558
+ "name": "group_update",
559
+ "operation": "update",
560
+ "objectName": "@happyvertical/smrt-users:Group"
561
+ },
562
+ {
563
+ "kind": "cli",
564
+ "name": "group_delete",
565
+ "operation": "delete",
566
+ "objectName": "@happyvertical/smrt-users:Group"
567
+ },
568
+ {
569
+ "kind": "mcp",
570
+ "name": "group_list",
571
+ "operation": "list",
572
+ "objectName": "@happyvertical/smrt-users:Group"
573
+ },
574
+ {
575
+ "kind": "mcp",
576
+ "name": "group_get",
577
+ "operation": "get",
578
+ "objectName": "@happyvertical/smrt-users:Group"
579
+ }
580
+ ],
581
+ "relationshipFeatures": [
582
+ "foreignKey",
583
+ "uuidColumns"
584
+ ],
585
+ "tags": [],
586
+ "risks": []
587
+ },
588
+ {
589
+ "name": "GroupMember",
590
+ "qualifiedName": "@happyvertical/smrt-users:GroupMember",
591
+ "collection": "groupmembers",
592
+ "tableName": "group_members",
593
+ "packageName": "@happyvertical/smrt-users",
594
+ "extends": "SmrtObject",
595
+ "fields": [
596
+ {
597
+ "name": "groupId",
598
+ "type": "foreignKey",
599
+ "required": true,
600
+ "related": "Group",
601
+ "columnType": "UUID"
602
+ },
603
+ {
604
+ "name": "userId",
605
+ "type": "foreignKey",
606
+ "required": true,
607
+ "related": "User",
608
+ "columnType": "UUID"
609
+ }
610
+ ],
611
+ "relationships": [
612
+ {
613
+ "name": "groupId",
614
+ "type": "foreignKey",
615
+ "required": true,
616
+ "related": "Group",
617
+ "columnType": "UUID"
618
+ },
619
+ {
620
+ "name": "userId",
621
+ "type": "foreignKey",
622
+ "required": true,
623
+ "related": "User",
624
+ "columnType": "UUID"
625
+ }
626
+ ],
627
+ "methods": [],
628
+ "surfaces": [
629
+ {
630
+ "kind": "api",
631
+ "name": "groupmembers.list",
632
+ "operation": "list",
633
+ "objectName": "@happyvertical/smrt-users:GroupMember",
634
+ "path": "/groupmembers",
635
+ "method": "GET"
636
+ },
637
+ {
638
+ "kind": "api",
639
+ "name": "groupmembers.get",
640
+ "operation": "get",
641
+ "objectName": "@happyvertical/smrt-users:GroupMember",
642
+ "path": "/groupmembers/[id]",
643
+ "method": "GET"
644
+ },
645
+ {
646
+ "kind": "cli",
647
+ "name": "groupmember_list",
648
+ "operation": "list",
649
+ "objectName": "@happyvertical/smrt-users:GroupMember"
650
+ },
651
+ {
652
+ "kind": "cli",
653
+ "name": "groupmember_get",
654
+ "operation": "get",
655
+ "objectName": "@happyvertical/smrt-users:GroupMember"
656
+ },
657
+ {
658
+ "kind": "cli",
659
+ "name": "groupmember_create",
660
+ "operation": "create",
661
+ "objectName": "@happyvertical/smrt-users:GroupMember"
662
+ },
663
+ {
664
+ "kind": "cli",
665
+ "name": "groupmember_update",
666
+ "operation": "update",
667
+ "objectName": "@happyvertical/smrt-users:GroupMember"
668
+ },
669
+ {
670
+ "kind": "cli",
671
+ "name": "groupmember_delete",
672
+ "operation": "delete",
673
+ "objectName": "@happyvertical/smrt-users:GroupMember"
674
+ },
675
+ {
676
+ "kind": "mcp",
677
+ "name": "groupmember_list",
678
+ "operation": "list",
679
+ "objectName": "@happyvertical/smrt-users:GroupMember"
680
+ },
681
+ {
682
+ "kind": "mcp",
683
+ "name": "groupmember_get",
684
+ "operation": "get",
685
+ "objectName": "@happyvertical/smrt-users:GroupMember"
686
+ }
687
+ ],
688
+ "relationshipFeatures": [
689
+ "foreignKey",
690
+ "uuidColumns"
691
+ ],
692
+ "tags": [],
693
+ "risks": []
694
+ },
695
+ {
696
+ "name": "GroupRole",
697
+ "qualifiedName": "@happyvertical/smrt-users:GroupRole",
698
+ "collection": "grouproles",
699
+ "tableName": "group_roles",
700
+ "packageName": "@happyvertical/smrt-users",
701
+ "extends": "SmrtObject",
702
+ "fields": [
703
+ {
704
+ "name": "groupId",
705
+ "type": "foreignKey",
706
+ "required": true,
707
+ "related": "Group",
708
+ "columnType": "UUID"
709
+ },
710
+ {
711
+ "name": "roleId",
712
+ "type": "foreignKey",
713
+ "required": true,
714
+ "related": "Role",
715
+ "columnType": "UUID"
716
+ }
717
+ ],
718
+ "relationships": [
719
+ {
720
+ "name": "groupId",
721
+ "type": "foreignKey",
722
+ "required": true,
723
+ "related": "Group",
724
+ "columnType": "UUID"
725
+ },
726
+ {
727
+ "name": "roleId",
728
+ "type": "foreignKey",
729
+ "required": true,
730
+ "related": "Role",
731
+ "columnType": "UUID"
732
+ }
733
+ ],
734
+ "methods": [],
735
+ "surfaces": [
736
+ {
737
+ "kind": "api",
738
+ "name": "grouproles.list",
739
+ "operation": "list",
740
+ "objectName": "@happyvertical/smrt-users:GroupRole",
741
+ "path": "/grouproles",
742
+ "method": "GET"
743
+ },
744
+ {
745
+ "kind": "api",
746
+ "name": "grouproles.get",
747
+ "operation": "get",
748
+ "objectName": "@happyvertical/smrt-users:GroupRole",
749
+ "path": "/grouproles/[id]",
750
+ "method": "GET"
751
+ },
752
+ {
753
+ "kind": "cli",
754
+ "name": "grouprole_list",
755
+ "operation": "list",
756
+ "objectName": "@happyvertical/smrt-users:GroupRole"
757
+ },
758
+ {
759
+ "kind": "cli",
760
+ "name": "grouprole_get",
761
+ "operation": "get",
762
+ "objectName": "@happyvertical/smrt-users:GroupRole"
763
+ },
764
+ {
765
+ "kind": "cli",
766
+ "name": "grouprole_create",
767
+ "operation": "create",
768
+ "objectName": "@happyvertical/smrt-users:GroupRole"
769
+ },
770
+ {
771
+ "kind": "cli",
772
+ "name": "grouprole_update",
773
+ "operation": "update",
774
+ "objectName": "@happyvertical/smrt-users:GroupRole"
775
+ },
776
+ {
777
+ "kind": "cli",
778
+ "name": "grouprole_delete",
779
+ "operation": "delete",
780
+ "objectName": "@happyvertical/smrt-users:GroupRole"
781
+ },
782
+ {
783
+ "kind": "mcp",
784
+ "name": "grouprole_list",
785
+ "operation": "list",
786
+ "objectName": "@happyvertical/smrt-users:GroupRole"
787
+ },
788
+ {
789
+ "kind": "mcp",
790
+ "name": "grouprole_get",
791
+ "operation": "get",
792
+ "objectName": "@happyvertical/smrt-users:GroupRole"
793
+ }
794
+ ],
795
+ "relationshipFeatures": [
796
+ "foreignKey",
797
+ "uuidColumns"
798
+ ],
799
+ "tags": [],
800
+ "risks": []
801
+ },
802
+ {
803
+ "name": "UsersMagicLinkToken",
804
+ "qualifiedName": "@happyvertical/smrt-users:UsersMagicLinkToken",
805
+ "collection": "usersmagiclinktokens",
806
+ "tableName": "users_magic_link_tokens",
807
+ "packageName": "@happyvertical/smrt-users",
808
+ "extends": "SmrtObject",
809
+ "fields": [
810
+ {
811
+ "name": "nonce",
812
+ "type": "text",
813
+ "required": true,
814
+ "columnType": "TEXT"
815
+ },
816
+ {
817
+ "name": "email",
818
+ "type": "text",
819
+ "required": false,
820
+ "columnType": "TEXT"
821
+ },
822
+ {
823
+ "name": "used",
824
+ "type": "boolean",
825
+ "required": false,
826
+ "columnType": "BOOLEAN"
827
+ },
828
+ {
829
+ "name": "expiresAt",
830
+ "type": "datetime",
831
+ "required": false,
832
+ "columnType": "TIMESTAMP"
833
+ }
834
+ ],
835
+ "relationships": [],
836
+ "methods": [
837
+ "isExpired",
838
+ "isValid"
839
+ ],
840
+ "surfaces": [
841
+ {
842
+ "kind": "cli",
843
+ "name": "usersmagiclinktoken_list",
844
+ "operation": "list",
845
+ "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
846
+ },
847
+ {
848
+ "kind": "cli",
849
+ "name": "usersmagiclinktoken_get",
850
+ "operation": "get",
851
+ "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
852
+ },
853
+ {
854
+ "kind": "cli",
855
+ "name": "usersmagiclinktoken_create",
856
+ "operation": "create",
857
+ "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
858
+ },
859
+ {
860
+ "kind": "cli",
861
+ "name": "usersmagiclinktoken_update",
862
+ "operation": "update",
863
+ "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
864
+ },
865
+ {
866
+ "kind": "cli",
867
+ "name": "usersmagiclinktoken_delete",
868
+ "operation": "delete",
869
+ "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
870
+ }
871
+ ],
872
+ "relationshipFeatures": [
873
+ "uuidColumns"
874
+ ],
875
+ "tags": [],
876
+ "risks": []
877
+ },
878
+ {
879
+ "name": "Membership",
880
+ "qualifiedName": "@happyvertical/smrt-users:Membership",
881
+ "collection": "memberships",
882
+ "tableName": "memberships",
883
+ "packageName": "@happyvertical/smrt-users",
884
+ "extends": "SmrtObject",
885
+ "fields": [
886
+ {
887
+ "name": "userId",
888
+ "type": "foreignKey",
889
+ "required": true,
890
+ "related": "User",
891
+ "columnType": "UUID"
892
+ },
893
+ {
894
+ "name": "tenantId",
895
+ "type": "foreignKey",
896
+ "required": true,
897
+ "related": "Tenant",
898
+ "columnType": "UUID"
899
+ },
900
+ {
901
+ "name": "roleId",
902
+ "type": "foreignKey",
903
+ "required": true,
904
+ "related": "Role",
905
+ "columnType": "UUID"
906
+ },
907
+ {
908
+ "name": "status",
909
+ "type": "text",
910
+ "required": false,
911
+ "columnType": "TEXT"
912
+ }
913
+ ],
914
+ "relationships": [
915
+ {
916
+ "name": "userId",
917
+ "type": "foreignKey",
918
+ "required": true,
919
+ "related": "User",
920
+ "columnType": "UUID"
921
+ },
922
+ {
923
+ "name": "tenantId",
924
+ "type": "foreignKey",
925
+ "required": true,
926
+ "related": "Tenant",
927
+ "columnType": "UUID"
928
+ },
929
+ {
930
+ "name": "roleId",
931
+ "type": "foreignKey",
932
+ "required": true,
933
+ "related": "Role",
934
+ "columnType": "UUID"
935
+ }
936
+ ],
937
+ "methods": [
938
+ "isActive",
939
+ "isPending"
940
+ ],
941
+ "surfaces": [
942
+ {
943
+ "kind": "api",
944
+ "name": "memberships.list",
945
+ "operation": "list",
946
+ "objectName": "@happyvertical/smrt-users:Membership",
947
+ "path": "/memberships",
948
+ "method": "GET"
949
+ },
950
+ {
951
+ "kind": "api",
952
+ "name": "memberships.get",
953
+ "operation": "get",
954
+ "objectName": "@happyvertical/smrt-users:Membership",
955
+ "path": "/memberships/[id]",
956
+ "method": "GET"
957
+ },
958
+ {
959
+ "kind": "cli",
960
+ "name": "membership_list",
961
+ "operation": "list",
962
+ "objectName": "@happyvertical/smrt-users:Membership"
963
+ },
964
+ {
965
+ "kind": "cli",
966
+ "name": "membership_get",
967
+ "operation": "get",
968
+ "objectName": "@happyvertical/smrt-users:Membership"
969
+ },
970
+ {
971
+ "kind": "cli",
972
+ "name": "membership_create",
973
+ "operation": "create",
974
+ "objectName": "@happyvertical/smrt-users:Membership"
975
+ },
976
+ {
977
+ "kind": "cli",
978
+ "name": "membership_update",
979
+ "operation": "update",
980
+ "objectName": "@happyvertical/smrt-users:Membership"
981
+ },
982
+ {
983
+ "kind": "cli",
984
+ "name": "membership_delete",
985
+ "operation": "delete",
986
+ "objectName": "@happyvertical/smrt-users:Membership"
987
+ },
988
+ {
989
+ "kind": "mcp",
990
+ "name": "membership_list",
991
+ "operation": "list",
992
+ "objectName": "@happyvertical/smrt-users:Membership"
993
+ },
994
+ {
995
+ "kind": "mcp",
996
+ "name": "membership_get",
997
+ "operation": "get",
998
+ "objectName": "@happyvertical/smrt-users:Membership"
999
+ }
1000
+ ],
1001
+ "relationshipFeatures": [
1002
+ "foreignKey",
1003
+ "uuidColumns"
1004
+ ],
1005
+ "tags": [],
1006
+ "risks": []
1007
+ },
1008
+ {
1009
+ "name": "MembershipOverride",
1010
+ "qualifiedName": "@happyvertical/smrt-users:MembershipOverride",
1011
+ "collection": "membershipoverrides",
1012
+ "tableName": "membership_overrides",
1013
+ "packageName": "@happyvertical/smrt-users",
1014
+ "extends": "SmrtObject",
1015
+ "fields": [
1016
+ {
1017
+ "name": "membershipId",
1018
+ "type": "foreignKey",
1019
+ "required": true,
1020
+ "related": "Membership",
1021
+ "columnType": "UUID"
1022
+ },
1023
+ {
1024
+ "name": "permissionId",
1025
+ "type": "foreignKey",
1026
+ "required": true,
1027
+ "related": "Permission",
1028
+ "columnType": "UUID"
1029
+ },
1030
+ {
1031
+ "name": "effect",
1032
+ "type": "text",
1033
+ "required": false,
1034
+ "columnType": "TEXT"
1035
+ }
1036
+ ],
1037
+ "relationships": [
1038
+ {
1039
+ "name": "membershipId",
1040
+ "type": "foreignKey",
1041
+ "required": true,
1042
+ "related": "Membership",
1043
+ "columnType": "UUID"
1044
+ },
1045
+ {
1046
+ "name": "permissionId",
1047
+ "type": "foreignKey",
1048
+ "required": true,
1049
+ "related": "Permission",
1050
+ "columnType": "UUID"
1051
+ }
1052
+ ],
1053
+ "methods": [
1054
+ "isDeny",
1055
+ "isGrant"
1056
+ ],
1057
+ "surfaces": [
1058
+ {
1059
+ "kind": "api",
1060
+ "name": "membershipoverrides.list",
1061
+ "operation": "list",
1062
+ "objectName": "@happyvertical/smrt-users:MembershipOverride",
1063
+ "path": "/membershipoverrides",
1064
+ "method": "GET"
1065
+ },
1066
+ {
1067
+ "kind": "api",
1068
+ "name": "membershipoverrides.get",
1069
+ "operation": "get",
1070
+ "objectName": "@happyvertical/smrt-users:MembershipOverride",
1071
+ "path": "/membershipoverrides/[id]",
1072
+ "method": "GET"
1073
+ },
1074
+ {
1075
+ "kind": "cli",
1076
+ "name": "membershipoverride_list",
1077
+ "operation": "list",
1078
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
1079
+ },
1080
+ {
1081
+ "kind": "cli",
1082
+ "name": "membershipoverride_get",
1083
+ "operation": "get",
1084
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
1085
+ },
1086
+ {
1087
+ "kind": "cli",
1088
+ "name": "membershipoverride_create",
1089
+ "operation": "create",
1090
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
1091
+ },
1092
+ {
1093
+ "kind": "cli",
1094
+ "name": "membershipoverride_update",
1095
+ "operation": "update",
1096
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
1097
+ },
1098
+ {
1099
+ "kind": "cli",
1100
+ "name": "membershipoverride_delete",
1101
+ "operation": "delete",
1102
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
1103
+ },
1104
+ {
1105
+ "kind": "mcp",
1106
+ "name": "membershipoverride_list",
1107
+ "operation": "list",
1108
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
1109
+ },
1110
+ {
1111
+ "kind": "mcp",
1112
+ "name": "membershipoverride_get",
1113
+ "operation": "get",
1114
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
1115
+ }
1116
+ ],
1117
+ "relationshipFeatures": [
1118
+ "foreignKey",
1119
+ "uuidColumns"
1120
+ ],
1121
+ "tags": [],
1122
+ "risks": []
1123
+ },
1124
+ {
1125
+ "name": "Permission",
1126
+ "qualifiedName": "@happyvertical/smrt-users:Permission",
1127
+ "collection": "permissions",
1128
+ "tableName": "permissions",
1129
+ "packageName": "@happyvertical/smrt-users",
1130
+ "extends": "SmrtObject",
1131
+ "fields": [
1132
+ {
1133
+ "name": "name",
1134
+ "type": "text",
1135
+ "required": false,
1136
+ "columnType": "TEXT"
1137
+ },
1138
+ {
1139
+ "name": "description",
1140
+ "type": "text",
1141
+ "required": false,
1142
+ "columnType": "TEXT"
1143
+ },
1144
+ {
1145
+ "name": "category",
1146
+ "type": "text",
1147
+ "required": false,
1148
+ "columnType": "TEXT"
1149
+ }
1150
+ ],
1151
+ "relationships": [],
1152
+ "methods": [
1153
+ "getAction",
1154
+ "getResource",
1155
+ "isValidSlug",
1156
+ "parseSlug"
1157
+ ],
1158
+ "surfaces": [
1159
+ {
1160
+ "kind": "api",
1161
+ "name": "permissions.list",
1162
+ "operation": "list",
1163
+ "objectName": "@happyvertical/smrt-users:Permission",
1164
+ "path": "/permissions",
1165
+ "method": "GET"
1166
+ },
1167
+ {
1168
+ "kind": "api",
1169
+ "name": "permissions.get",
1170
+ "operation": "get",
1171
+ "objectName": "@happyvertical/smrt-users:Permission",
1172
+ "path": "/permissions/[id]",
1173
+ "method": "GET"
1174
+ },
1175
+ {
1176
+ "kind": "cli",
1177
+ "name": "permission_list",
1178
+ "operation": "list",
1179
+ "objectName": "@happyvertical/smrt-users:Permission"
1180
+ },
1181
+ {
1182
+ "kind": "cli",
1183
+ "name": "permission_get",
1184
+ "operation": "get",
1185
+ "objectName": "@happyvertical/smrt-users:Permission"
1186
+ },
1187
+ {
1188
+ "kind": "cli",
1189
+ "name": "permission_create",
1190
+ "operation": "create",
1191
+ "objectName": "@happyvertical/smrt-users:Permission"
1192
+ },
1193
+ {
1194
+ "kind": "cli",
1195
+ "name": "permission_update",
1196
+ "operation": "update",
1197
+ "objectName": "@happyvertical/smrt-users:Permission"
1198
+ },
1199
+ {
1200
+ "kind": "cli",
1201
+ "name": "permission_delete",
1202
+ "operation": "delete",
1203
+ "objectName": "@happyvertical/smrt-users:Permission"
1204
+ },
1205
+ {
1206
+ "kind": "mcp",
1207
+ "name": "permission_list",
1208
+ "operation": "list",
1209
+ "objectName": "@happyvertical/smrt-users:Permission"
1210
+ },
1211
+ {
1212
+ "kind": "mcp",
1213
+ "name": "permission_get",
1214
+ "operation": "get",
1215
+ "objectName": "@happyvertical/smrt-users:Permission"
1216
+ }
1217
+ ],
1218
+ "relationshipFeatures": [
1219
+ "uuidColumns"
1220
+ ],
1221
+ "tags": [],
1222
+ "risks": []
1223
+ },
1224
+ {
1225
+ "name": "Role",
1226
+ "qualifiedName": "@happyvertical/smrt-users:Role",
1227
+ "collection": "roles",
1228
+ "tableName": "roles",
1229
+ "packageName": "@happyvertical/smrt-users",
1230
+ "extends": "SmrtObject",
1231
+ "fields": [
1232
+ {
1233
+ "name": "tenantId",
1234
+ "type": "foreignKey",
1235
+ "required": false,
1236
+ "related": "Tenant",
1237
+ "columnType": "UUID"
1238
+ },
1239
+ {
1240
+ "name": "name",
1241
+ "type": "text",
1242
+ "required": false,
1243
+ "columnType": "TEXT"
1244
+ },
1245
+ {
1246
+ "name": "description",
1247
+ "type": "text",
1248
+ "required": false,
1249
+ "columnType": "TEXT"
1250
+ },
1251
+ {
1252
+ "name": "isSystem",
1253
+ "type": "boolean",
1254
+ "required": false,
1255
+ "columnType": "BOOLEAN"
1256
+ }
1257
+ ],
1258
+ "relationships": [
1259
+ {
1260
+ "name": "tenantId",
1261
+ "type": "foreignKey",
1262
+ "required": false,
1263
+ "related": "Tenant",
1264
+ "columnType": "UUID"
1265
+ }
1266
+ ],
1267
+ "methods": [
1268
+ "canDelete",
1269
+ "delete",
1270
+ "isSystemRole",
1271
+ "isTenantRole"
1272
+ ],
1273
+ "surfaces": [
1274
+ {
1275
+ "kind": "api",
1276
+ "name": "roles.list",
1277
+ "operation": "list",
1278
+ "objectName": "@happyvertical/smrt-users:Role",
1279
+ "path": "/roles",
1280
+ "method": "GET"
1281
+ },
1282
+ {
1283
+ "kind": "api",
1284
+ "name": "roles.get",
1285
+ "operation": "get",
1286
+ "objectName": "@happyvertical/smrt-users:Role",
1287
+ "path": "/roles/[id]",
1288
+ "method": "GET"
1289
+ },
1290
+ {
1291
+ "kind": "cli",
1292
+ "name": "role_list",
1293
+ "operation": "list",
1294
+ "objectName": "@happyvertical/smrt-users:Role"
1295
+ },
1296
+ {
1297
+ "kind": "cli",
1298
+ "name": "role_get",
1299
+ "operation": "get",
1300
+ "objectName": "@happyvertical/smrt-users:Role"
1301
+ },
1302
+ {
1303
+ "kind": "cli",
1304
+ "name": "role_create",
1305
+ "operation": "create",
1306
+ "objectName": "@happyvertical/smrt-users:Role"
1307
+ },
1308
+ {
1309
+ "kind": "cli",
1310
+ "name": "role_update",
1311
+ "operation": "update",
1312
+ "objectName": "@happyvertical/smrt-users:Role"
1313
+ },
1314
+ {
1315
+ "kind": "cli",
1316
+ "name": "role_delete",
1317
+ "operation": "delete",
1318
+ "objectName": "@happyvertical/smrt-users:Role"
1319
+ },
1320
+ {
1321
+ "kind": "mcp",
1322
+ "name": "role_list",
1323
+ "operation": "list",
1324
+ "objectName": "@happyvertical/smrt-users:Role"
1325
+ },
1326
+ {
1327
+ "kind": "mcp",
1328
+ "name": "role_get",
1329
+ "operation": "get",
1330
+ "objectName": "@happyvertical/smrt-users:Role"
1331
+ }
1332
+ ],
1333
+ "relationshipFeatures": [
1334
+ "foreignKey",
1335
+ "uuidColumns"
1336
+ ],
1337
+ "tags": [],
1338
+ "risks": []
1339
+ },
1340
+ {
1341
+ "name": "RolePermission",
1342
+ "qualifiedName": "@happyvertical/smrt-users:RolePermission",
1343
+ "collection": "rolepermissions",
1344
+ "tableName": "role_permissions",
1345
+ "packageName": "@happyvertical/smrt-users",
1346
+ "extends": "SmrtObject",
1347
+ "fields": [
1348
+ {
1349
+ "name": "roleId",
1350
+ "type": "foreignKey",
1351
+ "required": true,
1352
+ "related": "Role",
1353
+ "columnType": "UUID"
1354
+ },
1355
+ {
1356
+ "name": "permissionId",
1357
+ "type": "foreignKey",
1358
+ "required": true,
1359
+ "related": "Permission",
1360
+ "columnType": "UUID"
1361
+ }
1362
+ ],
1363
+ "relationships": [
1364
+ {
1365
+ "name": "roleId",
1366
+ "type": "foreignKey",
1367
+ "required": true,
1368
+ "related": "Role",
1369
+ "columnType": "UUID"
1370
+ },
1371
+ {
1372
+ "name": "permissionId",
1373
+ "type": "foreignKey",
1374
+ "required": true,
1375
+ "related": "Permission",
1376
+ "columnType": "UUID"
1377
+ }
1378
+ ],
1379
+ "methods": [],
1380
+ "surfaces": [
1381
+ {
1382
+ "kind": "api",
1383
+ "name": "rolepermissions.list",
1384
+ "operation": "list",
1385
+ "objectName": "@happyvertical/smrt-users:RolePermission",
1386
+ "path": "/rolepermissions",
1387
+ "method": "GET"
1388
+ },
1389
+ {
1390
+ "kind": "api",
1391
+ "name": "rolepermissions.get",
1392
+ "operation": "get",
1393
+ "objectName": "@happyvertical/smrt-users:RolePermission",
1394
+ "path": "/rolepermissions/[id]",
1395
+ "method": "GET"
1396
+ },
1397
+ {
1398
+ "kind": "cli",
1399
+ "name": "rolepermission_list",
1400
+ "operation": "list",
1401
+ "objectName": "@happyvertical/smrt-users:RolePermission"
1402
+ },
1403
+ {
1404
+ "kind": "cli",
1405
+ "name": "rolepermission_get",
1406
+ "operation": "get",
1407
+ "objectName": "@happyvertical/smrt-users:RolePermission"
1408
+ },
1409
+ {
1410
+ "kind": "cli",
1411
+ "name": "rolepermission_create",
1412
+ "operation": "create",
1413
+ "objectName": "@happyvertical/smrt-users:RolePermission"
1414
+ },
1415
+ {
1416
+ "kind": "cli",
1417
+ "name": "rolepermission_update",
1418
+ "operation": "update",
1419
+ "objectName": "@happyvertical/smrt-users:RolePermission"
1420
+ },
1421
+ {
1422
+ "kind": "cli",
1423
+ "name": "rolepermission_delete",
1424
+ "operation": "delete",
1425
+ "objectName": "@happyvertical/smrt-users:RolePermission"
1426
+ },
1427
+ {
1428
+ "kind": "mcp",
1429
+ "name": "rolepermission_list",
1430
+ "operation": "list",
1431
+ "objectName": "@happyvertical/smrt-users:RolePermission"
1432
+ },
1433
+ {
1434
+ "kind": "mcp",
1435
+ "name": "rolepermission_get",
1436
+ "operation": "get",
1437
+ "objectName": "@happyvertical/smrt-users:RolePermission"
1438
+ }
1439
+ ],
1440
+ "relationshipFeatures": [
1441
+ "foreignKey",
1442
+ "uuidColumns"
1443
+ ],
1444
+ "tags": [],
1445
+ "risks": []
1446
+ },
1447
+ {
1448
+ "name": "Session",
1449
+ "qualifiedName": "@happyvertical/smrt-users:Session",
1450
+ "collection": "sessions",
1451
+ "tableName": "sessions",
1452
+ "packageName": "@happyvertical/smrt-users",
1453
+ "extends": "SmrtObject",
1454
+ "fields": [
1455
+ {
1456
+ "name": "userId",
1457
+ "type": "foreignKey",
1458
+ "required": false,
1459
+ "related": "User",
1460
+ "columnType": "UUID"
1461
+ },
1462
+ {
1463
+ "name": "tenantId",
1464
+ "type": "foreignKey",
1465
+ "required": false,
1466
+ "related": "Tenant",
1467
+ "columnType": "UUID"
1468
+ },
1469
+ {
1470
+ "name": "status",
1471
+ "type": "text",
1472
+ "required": false,
1473
+ "columnType": "TEXT"
1474
+ },
1475
+ {
1476
+ "name": "expiresAt",
1477
+ "type": "datetime",
1478
+ "required": false,
1479
+ "columnType": "TIMESTAMP"
1480
+ },
1481
+ {
1482
+ "name": "userAgent",
1483
+ "type": "text",
1484
+ "required": false,
1485
+ "columnType": "TEXT"
1486
+ },
1487
+ {
1488
+ "name": "ipAddress",
1489
+ "type": "text",
1490
+ "required": false,
1491
+ "columnType": "TEXT"
1492
+ },
1493
+ {
1494
+ "name": "lastAccessedAt",
1495
+ "type": "datetime",
1496
+ "required": false,
1497
+ "columnType": "TIMESTAMP"
1498
+ },
1499
+ {
1500
+ "name": "data",
1501
+ "type": "json",
1502
+ "required": false,
1503
+ "columnType": "JSON"
1504
+ }
1505
+ ],
1506
+ "relationships": [
1507
+ {
1508
+ "name": "userId",
1509
+ "type": "foreignKey",
1510
+ "required": false,
1511
+ "related": "User",
1512
+ "columnType": "UUID"
1513
+ },
1514
+ {
1515
+ "name": "tenantId",
1516
+ "type": "foreignKey",
1517
+ "required": false,
1518
+ "related": "Tenant",
1519
+ "columnType": "UUID"
1520
+ }
1521
+ ],
1522
+ "methods": [
1523
+ "extend",
1524
+ "getData",
1525
+ "isExpired",
1526
+ "isRevoked",
1527
+ "isValid",
1528
+ "removeData",
1529
+ "revoke",
1530
+ "setData",
1531
+ "setTenant",
1532
+ "touch"
1533
+ ],
1534
+ "surfaces": [
1535
+ {
1536
+ "kind": "api",
1537
+ "name": "sessions.get",
1538
+ "operation": "get",
1539
+ "objectName": "@happyvertical/smrt-users:Session",
1540
+ "path": "/sessions/[id]",
1541
+ "method": "GET"
1542
+ },
1543
+ {
1544
+ "kind": "api",
1545
+ "name": "sessions.delete",
1546
+ "operation": "delete",
1547
+ "objectName": "@happyvertical/smrt-users:Session",
1548
+ "path": "/sessions/[id]",
1549
+ "method": "DELETE"
1550
+ },
1551
+ {
1552
+ "kind": "cli",
1553
+ "name": "session_list",
1554
+ "operation": "list",
1555
+ "objectName": "@happyvertical/smrt-users:Session"
1556
+ },
1557
+ {
1558
+ "kind": "cli",
1559
+ "name": "session_get",
1560
+ "operation": "get",
1561
+ "objectName": "@happyvertical/smrt-users:Session"
1562
+ },
1563
+ {
1564
+ "kind": "cli",
1565
+ "name": "session_create",
1566
+ "operation": "create",
1567
+ "objectName": "@happyvertical/smrt-users:Session"
1568
+ },
1569
+ {
1570
+ "kind": "cli",
1571
+ "name": "session_update",
1572
+ "operation": "update",
1573
+ "objectName": "@happyvertical/smrt-users:Session"
1574
+ },
1575
+ {
1576
+ "kind": "cli",
1577
+ "name": "session_delete",
1578
+ "operation": "delete",
1579
+ "objectName": "@happyvertical/smrt-users:Session"
1580
+ }
1581
+ ],
1582
+ "relationshipFeatures": [
1583
+ "foreignKey",
1584
+ "uuidColumns"
1585
+ ],
1586
+ "tags": [],
1587
+ "risks": []
1588
+ },
1589
+ {
1590
+ "name": "Tenant",
1591
+ "qualifiedName": "@happyvertical/smrt-users:Tenant",
1592
+ "collection": "tenants",
1593
+ "tableName": "tenants",
1594
+ "packageName": "@happyvertical/smrt-users",
1595
+ "extends": "SmrtObject",
1596
+ "fields": [
1597
+ {
1598
+ "name": "created_at",
1599
+ "type": "datetime",
1600
+ "required": false,
1601
+ "columnType": "TIMESTAMP"
1602
+ },
1603
+ {
1604
+ "name": "updated_at",
1605
+ "type": "datetime",
1606
+ "required": false,
1607
+ "columnType": "TIMESTAMP"
1608
+ },
1609
+ {
1610
+ "name": "name",
1611
+ "type": "text",
1612
+ "required": false,
1613
+ "columnType": "TEXT"
1614
+ },
1615
+ {
1616
+ "name": "status",
1617
+ "type": "text",
1618
+ "required": false,
1619
+ "columnType": "TEXT"
1620
+ },
1621
+ {
1622
+ "name": "description",
1623
+ "type": "text",
1624
+ "required": false,
1625
+ "columnType": "TEXT"
1626
+ },
1627
+ {
1628
+ "name": "parentTenantId",
1629
+ "type": "foreignKey",
1630
+ "required": false,
1631
+ "related": "Tenant",
1632
+ "columnType": "UUID"
1633
+ },
1634
+ {
1635
+ "name": "hierarchyLevel",
1636
+ "type": "integer",
1637
+ "required": false,
1638
+ "columnType": "INTEGER"
1639
+ },
1640
+ {
1641
+ "name": "hierarchyPath",
1642
+ "type": "text",
1643
+ "required": false,
1644
+ "columnType": "TEXT"
1645
+ },
1646
+ {
1647
+ "name": "cascadePermissions",
1648
+ "type": "boolean",
1649
+ "required": false,
1650
+ "columnType": "BOOLEAN"
1651
+ },
1652
+ {
1653
+ "name": "inheritPermissions",
1654
+ "type": "boolean",
1655
+ "required": false,
1656
+ "columnType": "BOOLEAN"
1657
+ }
1658
+ ],
1659
+ "relationships": [
1660
+ {
1661
+ "name": "parentTenantId",
1662
+ "type": "foreignKey",
1663
+ "required": false,
1664
+ "related": "Tenant",
1665
+ "columnType": "UUID"
1666
+ }
1667
+ ],
1668
+ "methods": [
1669
+ "acceptsInheritance",
1670
+ "canCascadeToChildren",
1671
+ "classifyConstraintError",
1672
+ "clearEmbeddings",
1673
+ "delete",
1674
+ "describe",
1675
+ "destroy",
1676
+ "do",
1677
+ "executeToolCall",
1678
+ "forget",
1679
+ "forgetScope",
1680
+ "generateEmbeddings",
1681
+ "getAiUsageSnapshot",
1682
+ "getAncestorIds",
1683
+ "getAvailableTools",
1684
+ "getEmbedding",
1685
+ "getFields",
1686
+ "getId",
1687
+ "getRelated",
1688
+ "getSavedId",
1689
+ "getSlug",
1690
+ "hasStaleEmbeddings",
1691
+ "initialize",
1692
+ "is",
1693
+ "isActive",
1694
+ "isRelatedLoaded",
1695
+ "isRoot",
1696
+ "isSaved",
1697
+ "isSuspended",
1698
+ "listAiUsage",
1699
+ "loadDataFromDb",
1700
+ "loadFromId",
1701
+ "loadFromSlug",
1702
+ "loadRelated",
1703
+ "loadRelatedMany",
1704
+ "markAsPersisted",
1705
+ "recall",
1706
+ "recallAll",
1707
+ "remember",
1708
+ "resetAiUsage",
1709
+ "save",
1710
+ "summarizeAiUsage",
1711
+ "toJSON",
1712
+ "toPlainObject",
1713
+ "toPublicJSON"
1714
+ ],
1715
+ "surfaces": [
1716
+ {
1717
+ "kind": "api",
1718
+ "name": "tenants.list",
1719
+ "operation": "list",
1720
+ "objectName": "@happyvertical/smrt-users:Tenant",
1721
+ "path": "/tenants",
1722
+ "method": "GET"
1723
+ },
1724
+ {
1725
+ "kind": "api",
1726
+ "name": "tenants.get",
1727
+ "operation": "get",
1728
+ "objectName": "@happyvertical/smrt-users:Tenant",
1729
+ "path": "/tenants/[id]",
1730
+ "method": "GET"
1731
+ },
1732
+ {
1733
+ "kind": "cli",
1734
+ "name": "tenant_list",
1735
+ "operation": "list",
1736
+ "objectName": "@happyvertical/smrt-users:Tenant"
1737
+ },
1738
+ {
1739
+ "kind": "cli",
1740
+ "name": "tenant_get",
1741
+ "operation": "get",
1742
+ "objectName": "@happyvertical/smrt-users:Tenant"
1743
+ },
1744
+ {
1745
+ "kind": "cli",
1746
+ "name": "tenant_create",
1747
+ "operation": "create",
1748
+ "objectName": "@happyvertical/smrt-users:Tenant"
1749
+ },
1750
+ {
1751
+ "kind": "cli",
1752
+ "name": "tenant_update",
1753
+ "operation": "update",
1754
+ "objectName": "@happyvertical/smrt-users:Tenant"
1755
+ },
1756
+ {
1757
+ "kind": "cli",
1758
+ "name": "tenant_delete",
1759
+ "operation": "delete",
1760
+ "objectName": "@happyvertical/smrt-users:Tenant"
1761
+ },
1762
+ {
1763
+ "kind": "mcp",
1764
+ "name": "tenant_list",
1765
+ "operation": "list",
1766
+ "objectName": "@happyvertical/smrt-users:Tenant"
1767
+ },
1768
+ {
1769
+ "kind": "mcp",
1770
+ "name": "tenant_get",
1771
+ "operation": "get",
1772
+ "objectName": "@happyvertical/smrt-users:Tenant"
1773
+ }
1774
+ ],
1775
+ "relationshipFeatures": [
1776
+ "foreignKey",
1777
+ "uuidColumns"
1778
+ ],
1779
+ "tags": [],
1780
+ "risks": []
1781
+ },
1782
+ {
1783
+ "name": "TenantPermissionOverride",
1784
+ "qualifiedName": "@happyvertical/smrt-users:TenantPermissionOverride",
1785
+ "collection": "tenantpermissionoverrides",
1786
+ "tableName": "tenant_permission_overrides",
1787
+ "packageName": "@happyvertical/smrt-users",
1788
+ "extends": "SmrtObject",
1789
+ "fields": [
1790
+ {
1791
+ "name": "tenantId",
1792
+ "type": "foreignKey",
1793
+ "required": true,
1794
+ "related": "Tenant",
1795
+ "columnType": "UUID"
1796
+ },
1797
+ {
1798
+ "name": "permissionId",
1799
+ "type": "foreignKey",
1800
+ "required": true,
1801
+ "related": "Permission",
1802
+ "columnType": "UUID"
1803
+ },
1804
+ {
1805
+ "name": "effect",
1806
+ "type": "text",
1807
+ "required": false,
1808
+ "columnType": "TEXT"
1809
+ }
1810
+ ],
1811
+ "relationships": [
1812
+ {
1813
+ "name": "tenantId",
1814
+ "type": "foreignKey",
1815
+ "required": true,
1816
+ "related": "Tenant",
1817
+ "columnType": "UUID"
1818
+ },
1819
+ {
1820
+ "name": "permissionId",
1821
+ "type": "foreignKey",
1822
+ "required": true,
1823
+ "related": "Permission",
1824
+ "columnType": "UUID"
1825
+ }
1826
+ ],
1827
+ "methods": [
1828
+ "hasExplicitEffect",
1829
+ "isDeny",
1830
+ "isGrant",
1831
+ "isInherit"
1832
+ ],
1833
+ "surfaces": [
1834
+ {
1835
+ "kind": "api",
1836
+ "name": "tenantpermissionoverrides.list",
1837
+ "operation": "list",
1838
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride",
1839
+ "path": "/tenantpermissionoverrides",
1840
+ "method": "GET"
1841
+ },
1842
+ {
1843
+ "kind": "api",
1844
+ "name": "tenantpermissionoverrides.get",
1845
+ "operation": "get",
1846
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride",
1847
+ "path": "/tenantpermissionoverrides/[id]",
1848
+ "method": "GET"
1849
+ },
1850
+ {
1851
+ "kind": "cli",
1852
+ "name": "tenantpermissionoverride_list",
1853
+ "operation": "list",
1854
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
1855
+ },
1856
+ {
1857
+ "kind": "cli",
1858
+ "name": "tenantpermissionoverride_get",
1859
+ "operation": "get",
1860
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
1861
+ },
1862
+ {
1863
+ "kind": "cli",
1864
+ "name": "tenantpermissionoverride_create",
1865
+ "operation": "create",
1866
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
1867
+ },
1868
+ {
1869
+ "kind": "cli",
1870
+ "name": "tenantpermissionoverride_update",
1871
+ "operation": "update",
1872
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
1873
+ },
1874
+ {
1875
+ "kind": "cli",
1876
+ "name": "tenantpermissionoverride_delete",
1877
+ "operation": "delete",
1878
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
1879
+ },
1880
+ {
1881
+ "kind": "mcp",
1882
+ "name": "tenantpermissionoverride_list",
1883
+ "operation": "list",
1884
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
1885
+ },
1886
+ {
1887
+ "kind": "mcp",
1888
+ "name": "tenantpermissionoverride_get",
1889
+ "operation": "get",
1890
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
1891
+ }
1892
+ ],
1893
+ "relationshipFeatures": [
1894
+ "foreignKey",
1895
+ "uuidColumns"
1896
+ ],
1897
+ "tags": [],
1898
+ "risks": []
1899
+ },
1900
+ {
1901
+ "name": "User",
1902
+ "qualifiedName": "@happyvertical/smrt-users:User",
1903
+ "collection": "users",
1904
+ "tableName": "users",
1905
+ "packageName": "@happyvertical/smrt-users",
1906
+ "extends": "SmrtObject",
1907
+ "fields": [
1908
+ {
1909
+ "name": "profileId",
1910
+ "type": "crossPackageRef",
1911
+ "required": false,
1912
+ "related": "@happyvertical/smrt-profiles:Profile",
1913
+ "columnType": "UUID"
1914
+ },
1915
+ {
1916
+ "name": "email",
1917
+ "type": "text",
1918
+ "required": false,
1919
+ "columnType": "TEXT"
1920
+ },
1921
+ {
1922
+ "name": "status",
1923
+ "type": "text",
1924
+ "required": false,
1925
+ "columnType": "TEXT"
1926
+ },
1927
+ {
1928
+ "name": "lastLoginAt",
1929
+ "type": "datetime",
1930
+ "required": false,
1931
+ "columnType": "TIMESTAMP"
1932
+ }
1933
+ ],
1934
+ "relationships": [
1935
+ {
1936
+ "name": "profileId",
1937
+ "type": "crossPackageRef",
1938
+ "required": false,
1939
+ "related": "@happyvertical/smrt-profiles:Profile",
1940
+ "columnType": "UUID"
1941
+ }
1942
+ ],
1943
+ "methods": [
1944
+ "hasValidEmail",
1945
+ "isActive",
1946
+ "isPending",
1947
+ "isSuspended",
1948
+ "recordLogin"
1949
+ ],
1950
+ "surfaces": [
1951
+ {
1952
+ "kind": "api",
1953
+ "name": "users.list",
1954
+ "operation": "list",
1955
+ "objectName": "@happyvertical/smrt-users:User",
1956
+ "path": "/users",
1957
+ "method": "GET"
1958
+ },
1959
+ {
1960
+ "kind": "api",
1961
+ "name": "users.get",
1962
+ "operation": "get",
1963
+ "objectName": "@happyvertical/smrt-users:User",
1964
+ "path": "/users/[id]",
1965
+ "method": "GET"
1966
+ },
1967
+ {
1968
+ "kind": "cli",
1969
+ "name": "user_list",
1970
+ "operation": "list",
1971
+ "objectName": "@happyvertical/smrt-users:User"
1972
+ },
1973
+ {
1974
+ "kind": "cli",
1975
+ "name": "user_get",
1976
+ "operation": "get",
1977
+ "objectName": "@happyvertical/smrt-users:User"
1978
+ },
1979
+ {
1980
+ "kind": "cli",
1981
+ "name": "user_create",
1982
+ "operation": "create",
1983
+ "objectName": "@happyvertical/smrt-users:User"
1984
+ },
1985
+ {
1986
+ "kind": "cli",
1987
+ "name": "user_update",
1988
+ "operation": "update",
1989
+ "objectName": "@happyvertical/smrt-users:User"
1990
+ },
1991
+ {
1992
+ "kind": "cli",
1993
+ "name": "user_delete",
1994
+ "operation": "delete",
1995
+ "objectName": "@happyvertical/smrt-users:User"
1996
+ },
1997
+ {
1998
+ "kind": "mcp",
1999
+ "name": "user_list",
2000
+ "operation": "list",
2001
+ "objectName": "@happyvertical/smrt-users:User"
2002
+ },
2003
+ {
2004
+ "kind": "mcp",
2005
+ "name": "user_get",
2006
+ "operation": "get",
2007
+ "objectName": "@happyvertical/smrt-users:User"
2008
+ }
2009
+ ],
2010
+ "relationshipFeatures": [
2011
+ "crossPackageRef",
2012
+ "uuidColumns"
2013
+ ],
2014
+ "tags": [],
2015
+ "risks": []
2016
+ }
2017
+ ],
2018
+ "surfaces": [
2019
+ {
2020
+ "kind": "api",
2021
+ "name": "groups.list",
2022
+ "operation": "list",
2023
+ "objectName": "@happyvertical/smrt-users:Group",
2024
+ "path": "/groups",
2025
+ "method": "GET"
2026
+ },
2027
+ {
2028
+ "kind": "api",
2029
+ "name": "groups.get",
2030
+ "operation": "get",
2031
+ "objectName": "@happyvertical/smrt-users:Group",
2032
+ "path": "/groups/[id]",
2033
+ "method": "GET"
2034
+ },
2035
+ {
2036
+ "kind": "cli",
2037
+ "name": "group_list",
2038
+ "operation": "list",
2039
+ "objectName": "@happyvertical/smrt-users:Group"
2040
+ },
2041
+ {
2042
+ "kind": "cli",
2043
+ "name": "group_get",
2044
+ "operation": "get",
2045
+ "objectName": "@happyvertical/smrt-users:Group"
2046
+ },
2047
+ {
2048
+ "kind": "cli",
2049
+ "name": "group_create",
2050
+ "operation": "create",
2051
+ "objectName": "@happyvertical/smrt-users:Group"
2052
+ },
2053
+ {
2054
+ "kind": "cli",
2055
+ "name": "group_update",
2056
+ "operation": "update",
2057
+ "objectName": "@happyvertical/smrt-users:Group"
2058
+ },
2059
+ {
2060
+ "kind": "cli",
2061
+ "name": "group_delete",
2062
+ "operation": "delete",
2063
+ "objectName": "@happyvertical/smrt-users:Group"
2064
+ },
2065
+ {
2066
+ "kind": "mcp",
2067
+ "name": "group_list",
2068
+ "operation": "list",
2069
+ "objectName": "@happyvertical/smrt-users:Group"
2070
+ },
2071
+ {
2072
+ "kind": "mcp",
2073
+ "name": "group_get",
2074
+ "operation": "get",
2075
+ "objectName": "@happyvertical/smrt-users:Group"
2076
+ },
2077
+ {
2078
+ "kind": "api",
2079
+ "name": "groupmembers.list",
2080
+ "operation": "list",
2081
+ "objectName": "@happyvertical/smrt-users:GroupMember",
2082
+ "path": "/groupmembers",
2083
+ "method": "GET"
2084
+ },
2085
+ {
2086
+ "kind": "api",
2087
+ "name": "groupmembers.get",
2088
+ "operation": "get",
2089
+ "objectName": "@happyvertical/smrt-users:GroupMember",
2090
+ "path": "/groupmembers/[id]",
2091
+ "method": "GET"
2092
+ },
2093
+ {
2094
+ "kind": "cli",
2095
+ "name": "groupmember_list",
2096
+ "operation": "list",
2097
+ "objectName": "@happyvertical/smrt-users:GroupMember"
2098
+ },
2099
+ {
2100
+ "kind": "cli",
2101
+ "name": "groupmember_get",
2102
+ "operation": "get",
2103
+ "objectName": "@happyvertical/smrt-users:GroupMember"
2104
+ },
2105
+ {
2106
+ "kind": "cli",
2107
+ "name": "groupmember_create",
2108
+ "operation": "create",
2109
+ "objectName": "@happyvertical/smrt-users:GroupMember"
2110
+ },
2111
+ {
2112
+ "kind": "cli",
2113
+ "name": "groupmember_update",
2114
+ "operation": "update",
2115
+ "objectName": "@happyvertical/smrt-users:GroupMember"
2116
+ },
2117
+ {
2118
+ "kind": "cli",
2119
+ "name": "groupmember_delete",
2120
+ "operation": "delete",
2121
+ "objectName": "@happyvertical/smrt-users:GroupMember"
2122
+ },
2123
+ {
2124
+ "kind": "mcp",
2125
+ "name": "groupmember_list",
2126
+ "operation": "list",
2127
+ "objectName": "@happyvertical/smrt-users:GroupMember"
2128
+ },
2129
+ {
2130
+ "kind": "mcp",
2131
+ "name": "groupmember_get",
2132
+ "operation": "get",
2133
+ "objectName": "@happyvertical/smrt-users:GroupMember"
2134
+ },
2135
+ {
2136
+ "kind": "api",
2137
+ "name": "grouproles.list",
2138
+ "operation": "list",
2139
+ "objectName": "@happyvertical/smrt-users:GroupRole",
2140
+ "path": "/grouproles",
2141
+ "method": "GET"
2142
+ },
2143
+ {
2144
+ "kind": "api",
2145
+ "name": "grouproles.get",
2146
+ "operation": "get",
2147
+ "objectName": "@happyvertical/smrt-users:GroupRole",
2148
+ "path": "/grouproles/[id]",
2149
+ "method": "GET"
2150
+ },
2151
+ {
2152
+ "kind": "cli",
2153
+ "name": "grouprole_list",
2154
+ "operation": "list",
2155
+ "objectName": "@happyvertical/smrt-users:GroupRole"
2156
+ },
2157
+ {
2158
+ "kind": "cli",
2159
+ "name": "grouprole_get",
2160
+ "operation": "get",
2161
+ "objectName": "@happyvertical/smrt-users:GroupRole"
2162
+ },
2163
+ {
2164
+ "kind": "cli",
2165
+ "name": "grouprole_create",
2166
+ "operation": "create",
2167
+ "objectName": "@happyvertical/smrt-users:GroupRole"
2168
+ },
2169
+ {
2170
+ "kind": "cli",
2171
+ "name": "grouprole_update",
2172
+ "operation": "update",
2173
+ "objectName": "@happyvertical/smrt-users:GroupRole"
2174
+ },
2175
+ {
2176
+ "kind": "cli",
2177
+ "name": "grouprole_delete",
2178
+ "operation": "delete",
2179
+ "objectName": "@happyvertical/smrt-users:GroupRole"
2180
+ },
2181
+ {
2182
+ "kind": "mcp",
2183
+ "name": "grouprole_list",
2184
+ "operation": "list",
2185
+ "objectName": "@happyvertical/smrt-users:GroupRole"
2186
+ },
2187
+ {
2188
+ "kind": "mcp",
2189
+ "name": "grouprole_get",
2190
+ "operation": "get",
2191
+ "objectName": "@happyvertical/smrt-users:GroupRole"
2192
+ },
2193
+ {
2194
+ "kind": "cli",
2195
+ "name": "usersmagiclinktoken_list",
2196
+ "operation": "list",
2197
+ "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
2198
+ },
2199
+ {
2200
+ "kind": "cli",
2201
+ "name": "usersmagiclinktoken_get",
2202
+ "operation": "get",
2203
+ "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
2204
+ },
2205
+ {
2206
+ "kind": "cli",
2207
+ "name": "usersmagiclinktoken_create",
2208
+ "operation": "create",
2209
+ "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
2210
+ },
2211
+ {
2212
+ "kind": "cli",
2213
+ "name": "usersmagiclinktoken_update",
2214
+ "operation": "update",
2215
+ "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
2216
+ },
2217
+ {
2218
+ "kind": "cli",
2219
+ "name": "usersmagiclinktoken_delete",
2220
+ "operation": "delete",
2221
+ "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
2222
+ },
2223
+ {
2224
+ "kind": "api",
2225
+ "name": "memberships.list",
2226
+ "operation": "list",
2227
+ "objectName": "@happyvertical/smrt-users:Membership",
2228
+ "path": "/memberships",
2229
+ "method": "GET"
2230
+ },
2231
+ {
2232
+ "kind": "api",
2233
+ "name": "memberships.get",
2234
+ "operation": "get",
2235
+ "objectName": "@happyvertical/smrt-users:Membership",
2236
+ "path": "/memberships/[id]",
2237
+ "method": "GET"
2238
+ },
2239
+ {
2240
+ "kind": "cli",
2241
+ "name": "membership_list",
2242
+ "operation": "list",
2243
+ "objectName": "@happyvertical/smrt-users:Membership"
2244
+ },
2245
+ {
2246
+ "kind": "cli",
2247
+ "name": "membership_get",
2248
+ "operation": "get",
2249
+ "objectName": "@happyvertical/smrt-users:Membership"
2250
+ },
2251
+ {
2252
+ "kind": "cli",
2253
+ "name": "membership_create",
2254
+ "operation": "create",
2255
+ "objectName": "@happyvertical/smrt-users:Membership"
2256
+ },
2257
+ {
2258
+ "kind": "cli",
2259
+ "name": "membership_update",
2260
+ "operation": "update",
2261
+ "objectName": "@happyvertical/smrt-users:Membership"
2262
+ },
2263
+ {
2264
+ "kind": "cli",
2265
+ "name": "membership_delete",
2266
+ "operation": "delete",
2267
+ "objectName": "@happyvertical/smrt-users:Membership"
2268
+ },
2269
+ {
2270
+ "kind": "mcp",
2271
+ "name": "membership_list",
2272
+ "operation": "list",
2273
+ "objectName": "@happyvertical/smrt-users:Membership"
2274
+ },
2275
+ {
2276
+ "kind": "mcp",
2277
+ "name": "membership_get",
2278
+ "operation": "get",
2279
+ "objectName": "@happyvertical/smrt-users:Membership"
2280
+ },
2281
+ {
2282
+ "kind": "api",
2283
+ "name": "membershipoverrides.list",
2284
+ "operation": "list",
2285
+ "objectName": "@happyvertical/smrt-users:MembershipOverride",
2286
+ "path": "/membershipoverrides",
2287
+ "method": "GET"
2288
+ },
2289
+ {
2290
+ "kind": "api",
2291
+ "name": "membershipoverrides.get",
2292
+ "operation": "get",
2293
+ "objectName": "@happyvertical/smrt-users:MembershipOverride",
2294
+ "path": "/membershipoverrides/[id]",
2295
+ "method": "GET"
2296
+ },
2297
+ {
2298
+ "kind": "cli",
2299
+ "name": "membershipoverride_list",
2300
+ "operation": "list",
2301
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
2302
+ },
2303
+ {
2304
+ "kind": "cli",
2305
+ "name": "membershipoverride_get",
2306
+ "operation": "get",
2307
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
2308
+ },
2309
+ {
2310
+ "kind": "cli",
2311
+ "name": "membershipoverride_create",
2312
+ "operation": "create",
2313
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
2314
+ },
2315
+ {
2316
+ "kind": "cli",
2317
+ "name": "membershipoverride_update",
2318
+ "operation": "update",
2319
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
2320
+ },
2321
+ {
2322
+ "kind": "cli",
2323
+ "name": "membershipoverride_delete",
2324
+ "operation": "delete",
2325
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
2326
+ },
2327
+ {
2328
+ "kind": "mcp",
2329
+ "name": "membershipoverride_list",
2330
+ "operation": "list",
2331
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
2332
+ },
2333
+ {
2334
+ "kind": "mcp",
2335
+ "name": "membershipoverride_get",
2336
+ "operation": "get",
2337
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
2338
+ },
2339
+ {
2340
+ "kind": "api",
2341
+ "name": "permissions.list",
2342
+ "operation": "list",
2343
+ "objectName": "@happyvertical/smrt-users:Permission",
2344
+ "path": "/permissions",
2345
+ "method": "GET"
2346
+ },
2347
+ {
2348
+ "kind": "api",
2349
+ "name": "permissions.get",
2350
+ "operation": "get",
2351
+ "objectName": "@happyvertical/smrt-users:Permission",
2352
+ "path": "/permissions/[id]",
2353
+ "method": "GET"
2354
+ },
2355
+ {
2356
+ "kind": "cli",
2357
+ "name": "permission_list",
2358
+ "operation": "list",
2359
+ "objectName": "@happyvertical/smrt-users:Permission"
2360
+ },
2361
+ {
2362
+ "kind": "cli",
2363
+ "name": "permission_get",
2364
+ "operation": "get",
2365
+ "objectName": "@happyvertical/smrt-users:Permission"
2366
+ },
2367
+ {
2368
+ "kind": "cli",
2369
+ "name": "permission_create",
2370
+ "operation": "create",
2371
+ "objectName": "@happyvertical/smrt-users:Permission"
2372
+ },
2373
+ {
2374
+ "kind": "cli",
2375
+ "name": "permission_update",
2376
+ "operation": "update",
2377
+ "objectName": "@happyvertical/smrt-users:Permission"
2378
+ },
2379
+ {
2380
+ "kind": "cli",
2381
+ "name": "permission_delete",
2382
+ "operation": "delete",
2383
+ "objectName": "@happyvertical/smrt-users:Permission"
2384
+ },
2385
+ {
2386
+ "kind": "mcp",
2387
+ "name": "permission_list",
2388
+ "operation": "list",
2389
+ "objectName": "@happyvertical/smrt-users:Permission"
2390
+ },
2391
+ {
2392
+ "kind": "mcp",
2393
+ "name": "permission_get",
2394
+ "operation": "get",
2395
+ "objectName": "@happyvertical/smrt-users:Permission"
2396
+ },
2397
+ {
2398
+ "kind": "api",
2399
+ "name": "roles.list",
2400
+ "operation": "list",
2401
+ "objectName": "@happyvertical/smrt-users:Role",
2402
+ "path": "/roles",
2403
+ "method": "GET"
2404
+ },
2405
+ {
2406
+ "kind": "api",
2407
+ "name": "roles.get",
2408
+ "operation": "get",
2409
+ "objectName": "@happyvertical/smrt-users:Role",
2410
+ "path": "/roles/[id]",
2411
+ "method": "GET"
2412
+ },
2413
+ {
2414
+ "kind": "cli",
2415
+ "name": "role_list",
2416
+ "operation": "list",
2417
+ "objectName": "@happyvertical/smrt-users:Role"
2418
+ },
2419
+ {
2420
+ "kind": "cli",
2421
+ "name": "role_get",
2422
+ "operation": "get",
2423
+ "objectName": "@happyvertical/smrt-users:Role"
2424
+ },
2425
+ {
2426
+ "kind": "cli",
2427
+ "name": "role_create",
2428
+ "operation": "create",
2429
+ "objectName": "@happyvertical/smrt-users:Role"
2430
+ },
2431
+ {
2432
+ "kind": "cli",
2433
+ "name": "role_update",
2434
+ "operation": "update",
2435
+ "objectName": "@happyvertical/smrt-users:Role"
2436
+ },
2437
+ {
2438
+ "kind": "cli",
2439
+ "name": "role_delete",
2440
+ "operation": "delete",
2441
+ "objectName": "@happyvertical/smrt-users:Role"
2442
+ },
2443
+ {
2444
+ "kind": "mcp",
2445
+ "name": "role_list",
2446
+ "operation": "list",
2447
+ "objectName": "@happyvertical/smrt-users:Role"
2448
+ },
2449
+ {
2450
+ "kind": "mcp",
2451
+ "name": "role_get",
2452
+ "operation": "get",
2453
+ "objectName": "@happyvertical/smrt-users:Role"
2454
+ },
2455
+ {
2456
+ "kind": "api",
2457
+ "name": "rolepermissions.list",
2458
+ "operation": "list",
2459
+ "objectName": "@happyvertical/smrt-users:RolePermission",
2460
+ "path": "/rolepermissions",
2461
+ "method": "GET"
2462
+ },
2463
+ {
2464
+ "kind": "api",
2465
+ "name": "rolepermissions.get",
2466
+ "operation": "get",
2467
+ "objectName": "@happyvertical/smrt-users:RolePermission",
2468
+ "path": "/rolepermissions/[id]",
2469
+ "method": "GET"
2470
+ },
2471
+ {
2472
+ "kind": "cli",
2473
+ "name": "rolepermission_list",
2474
+ "operation": "list",
2475
+ "objectName": "@happyvertical/smrt-users:RolePermission"
2476
+ },
2477
+ {
2478
+ "kind": "cli",
2479
+ "name": "rolepermission_get",
2480
+ "operation": "get",
2481
+ "objectName": "@happyvertical/smrt-users:RolePermission"
2482
+ },
2483
+ {
2484
+ "kind": "cli",
2485
+ "name": "rolepermission_create",
2486
+ "operation": "create",
2487
+ "objectName": "@happyvertical/smrt-users:RolePermission"
2488
+ },
2489
+ {
2490
+ "kind": "cli",
2491
+ "name": "rolepermission_update",
2492
+ "operation": "update",
2493
+ "objectName": "@happyvertical/smrt-users:RolePermission"
2494
+ },
2495
+ {
2496
+ "kind": "cli",
2497
+ "name": "rolepermission_delete",
2498
+ "operation": "delete",
2499
+ "objectName": "@happyvertical/smrt-users:RolePermission"
2500
+ },
2501
+ {
2502
+ "kind": "mcp",
2503
+ "name": "rolepermission_list",
2504
+ "operation": "list",
2505
+ "objectName": "@happyvertical/smrt-users:RolePermission"
2506
+ },
2507
+ {
2508
+ "kind": "mcp",
2509
+ "name": "rolepermission_get",
2510
+ "operation": "get",
2511
+ "objectName": "@happyvertical/smrt-users:RolePermission"
2512
+ },
2513
+ {
2514
+ "kind": "api",
2515
+ "name": "sessions.get",
2516
+ "operation": "get",
2517
+ "objectName": "@happyvertical/smrt-users:Session",
2518
+ "path": "/sessions/[id]",
2519
+ "method": "GET"
2520
+ },
2521
+ {
2522
+ "kind": "api",
2523
+ "name": "sessions.delete",
2524
+ "operation": "delete",
2525
+ "objectName": "@happyvertical/smrt-users:Session",
2526
+ "path": "/sessions/[id]",
2527
+ "method": "DELETE"
2528
+ },
2529
+ {
2530
+ "kind": "cli",
2531
+ "name": "session_list",
2532
+ "operation": "list",
2533
+ "objectName": "@happyvertical/smrt-users:Session"
2534
+ },
2535
+ {
2536
+ "kind": "cli",
2537
+ "name": "session_get",
2538
+ "operation": "get",
2539
+ "objectName": "@happyvertical/smrt-users:Session"
2540
+ },
2541
+ {
2542
+ "kind": "cli",
2543
+ "name": "session_create",
2544
+ "operation": "create",
2545
+ "objectName": "@happyvertical/smrt-users:Session"
2546
+ },
2547
+ {
2548
+ "kind": "cli",
2549
+ "name": "session_update",
2550
+ "operation": "update",
2551
+ "objectName": "@happyvertical/smrt-users:Session"
2552
+ },
2553
+ {
2554
+ "kind": "cli",
2555
+ "name": "session_delete",
2556
+ "operation": "delete",
2557
+ "objectName": "@happyvertical/smrt-users:Session"
2558
+ },
2559
+ {
2560
+ "kind": "api",
2561
+ "name": "tenants.list",
2562
+ "operation": "list",
2563
+ "objectName": "@happyvertical/smrt-users:Tenant",
2564
+ "path": "/tenants",
2565
+ "method": "GET"
2566
+ },
2567
+ {
2568
+ "kind": "api",
2569
+ "name": "tenants.get",
2570
+ "operation": "get",
2571
+ "objectName": "@happyvertical/smrt-users:Tenant",
2572
+ "path": "/tenants/[id]",
2573
+ "method": "GET"
2574
+ },
2575
+ {
2576
+ "kind": "cli",
2577
+ "name": "tenant_list",
2578
+ "operation": "list",
2579
+ "objectName": "@happyvertical/smrt-users:Tenant"
2580
+ },
2581
+ {
2582
+ "kind": "cli",
2583
+ "name": "tenant_get",
2584
+ "operation": "get",
2585
+ "objectName": "@happyvertical/smrt-users:Tenant"
2586
+ },
2587
+ {
2588
+ "kind": "cli",
2589
+ "name": "tenant_create",
2590
+ "operation": "create",
2591
+ "objectName": "@happyvertical/smrt-users:Tenant"
2592
+ },
2593
+ {
2594
+ "kind": "cli",
2595
+ "name": "tenant_update",
2596
+ "operation": "update",
2597
+ "objectName": "@happyvertical/smrt-users:Tenant"
2598
+ },
2599
+ {
2600
+ "kind": "cli",
2601
+ "name": "tenant_delete",
2602
+ "operation": "delete",
2603
+ "objectName": "@happyvertical/smrt-users:Tenant"
2604
+ },
2605
+ {
2606
+ "kind": "mcp",
2607
+ "name": "tenant_list",
2608
+ "operation": "list",
2609
+ "objectName": "@happyvertical/smrt-users:Tenant"
2610
+ },
2611
+ {
2612
+ "kind": "mcp",
2613
+ "name": "tenant_get",
2614
+ "operation": "get",
2615
+ "objectName": "@happyvertical/smrt-users:Tenant"
2616
+ },
2617
+ {
2618
+ "kind": "api",
2619
+ "name": "tenantpermissionoverrides.list",
2620
+ "operation": "list",
2621
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride",
2622
+ "path": "/tenantpermissionoverrides",
2623
+ "method": "GET"
2624
+ },
2625
+ {
2626
+ "kind": "api",
2627
+ "name": "tenantpermissionoverrides.get",
2628
+ "operation": "get",
2629
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride",
2630
+ "path": "/tenantpermissionoverrides/[id]",
2631
+ "method": "GET"
2632
+ },
2633
+ {
2634
+ "kind": "cli",
2635
+ "name": "tenantpermissionoverride_list",
2636
+ "operation": "list",
2637
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
2638
+ },
2639
+ {
2640
+ "kind": "cli",
2641
+ "name": "tenantpermissionoverride_get",
2642
+ "operation": "get",
2643
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
2644
+ },
2645
+ {
2646
+ "kind": "cli",
2647
+ "name": "tenantpermissionoverride_create",
2648
+ "operation": "create",
2649
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
2650
+ },
2651
+ {
2652
+ "kind": "cli",
2653
+ "name": "tenantpermissionoverride_update",
2654
+ "operation": "update",
2655
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
2656
+ },
2657
+ {
2658
+ "kind": "cli",
2659
+ "name": "tenantpermissionoverride_delete",
2660
+ "operation": "delete",
2661
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
2662
+ },
2663
+ {
2664
+ "kind": "mcp",
2665
+ "name": "tenantpermissionoverride_list",
2666
+ "operation": "list",
2667
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
2668
+ },
2669
+ {
2670
+ "kind": "mcp",
2671
+ "name": "tenantpermissionoverride_get",
2672
+ "operation": "get",
2673
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
2674
+ },
2675
+ {
2676
+ "kind": "api",
2677
+ "name": "users.list",
2678
+ "operation": "list",
2679
+ "objectName": "@happyvertical/smrt-users:User",
2680
+ "path": "/users",
2681
+ "method": "GET"
2682
+ },
2683
+ {
2684
+ "kind": "api",
2685
+ "name": "users.get",
2686
+ "operation": "get",
2687
+ "objectName": "@happyvertical/smrt-users:User",
2688
+ "path": "/users/[id]",
2689
+ "method": "GET"
2690
+ },
2691
+ {
2692
+ "kind": "cli",
2693
+ "name": "user_list",
2694
+ "operation": "list",
2695
+ "objectName": "@happyvertical/smrt-users:User"
2696
+ },
2697
+ {
2698
+ "kind": "cli",
2699
+ "name": "user_get",
2700
+ "operation": "get",
2701
+ "objectName": "@happyvertical/smrt-users:User"
2702
+ },
2703
+ {
2704
+ "kind": "cli",
2705
+ "name": "user_create",
2706
+ "operation": "create",
2707
+ "objectName": "@happyvertical/smrt-users:User"
2708
+ },
2709
+ {
2710
+ "kind": "cli",
2711
+ "name": "user_update",
2712
+ "operation": "update",
2713
+ "objectName": "@happyvertical/smrt-users:User"
2714
+ },
2715
+ {
2716
+ "kind": "cli",
2717
+ "name": "user_delete",
2718
+ "operation": "delete",
2719
+ "objectName": "@happyvertical/smrt-users:User"
2720
+ },
2721
+ {
2722
+ "kind": "mcp",
2723
+ "name": "user_list",
2724
+ "operation": "list",
2725
+ "objectName": "@happyvertical/smrt-users:User"
2726
+ },
2727
+ {
2728
+ "kind": "mcp",
2729
+ "name": "user_get",
2730
+ "operation": "get",
2731
+ "objectName": "@happyvertical/smrt-users:User"
2732
+ }
2733
+ ],
2734
+ "prompts": [],
2735
+ "relationshipsV2": {
2736
+ "foreignKeyFields": 18,
2737
+ "crossPackageRefFields": 1,
2738
+ "junctionCollections": 0,
2739
+ "hierarchicalObjects": 0,
2740
+ "polymorphicAssociations": 0,
2741
+ "uuidColumns": 47
2742
+ },
2743
+ "agentDoc": "# @happyvertical/smrt-users\n\nMulti-tenant user management with RBAC, hierarchical tenants, session handling, and SvelteKit integration.\n\n## Models (13)\n\n| Model | Key Pattern |\n|-------|-------------|\n| User | Auth identity. `profileId` is plain string (not FK) to smrt-profiles. Email auto-lowercased. |\n| Tenant | **STI** + hierarchical parent-child. `hierarchyPath` (materialized path), `hierarchyLevel`. Max depth 10. |\n| Session | Server-side. Secure UUID. TTL in **seconds** (not ms). Status auto-updates to EXPIRED on access. |\n| MagicLinkToken | Single-use email login token. Backed by `MagicLinkService`. |\n| Role | `tenantId = null` → system role (available to all tenants). `isSystem: true` blocks deletion. |\n| Permission | Slug format: `resource.action`. Parsed by PermissionResolver. |\n| Membership | User + Tenant + Role junction. UNIQUE(userId, tenantId). |\n| Group | Team within a tenant. Multiple roles via GroupRole. |\n| GroupMember, GroupRole, RolePermission | Join tables. |\n| MembershipOverride | Per-user permission grant/deny. **DENY always wins.** |\n| TenantPermissionOverride | Tenant-level cascade overrides. Effect: INHERIT/GRANT/DENY. |\n\n## Permission Resolution — 4-Level Cascade\n\nPermissionResolver evaluates in order (each level can add/remove permissions):\n\n1. **Tenant hierarchy** — walk ancestors, apply TenantPermissionOverride at each level\n2. **Membership role** — base permissions from user's role in tenant\n3. **Group roles** — permissions from all groups user belongs to **in that tenant**\n4. **Membership overrides** — final GRANT/DENY per-user (DENY takes absolute precedence)\n\n**Critical**: `getGroupIdsForTenant(userId, tenantId)` (joins with groups table to scope by tenant). Never use `getGroupIds()` — it's cross-tenant.\n\n## Hierarchical Tenants\n\n- `TenantCollection.createChild()` auto-calculates hierarchy fields, enforces depth limit\n- `moveToParent()` updates tenant + ALL descendants' paths/levels\n- `cascadePermissions` (parent pushes down) + `inheritPermissions` (child accepts) — both must be true\n- `getTree(rootId?)` returns nested structure for UI\n\n## SvelteKit Integration\n\n```typescript\n// hooks.server.ts\nexport const handle = createSessionHandler({ db, ttl: 604800, skipPaths: ['/api/public'] });\n// Populates event.locals: { user, membership, permissions: string[], tenantId, sessionId }\n\n// +page.server.ts\nawait createSessionCookie(event, userId, tenantId, { db });\nawait destroySessionCookie(event, { db });\nawait switchSessionTenant(event, tenantId, { db });\n```\n\n## Security (S5 #1400)\n\n- **Generated REST/MCP surface is READ-ONLY for every RBAC/identity model.**\n User, Tenant, Group, Membership, MembershipOverride, Role, Permission,\n RolePermission, GroupRole, GroupMember, and TenantPermissionOverride generate\n `list`/`get` only — `create`/`update`/`delete` are intentionally NOT\n generated. The merged `requireRouteAuth` gate (#1540) enforces *authentication*,\n not *authorization*, and these models are not `@TenantScoped`, so an\n auto-generated mutating route would let any authenticated user self-grant a\n role/permission, flip a tenant's cascade flags, or change another user's auth\n identity. Mutate them through the permission-gated services (`TenantService`,\n collection helpers) or consumer-owned, permission-checked handlers. A\n structural regression test (`security-audit-1400.test.ts`) enumerates the\n registry to assert no authority model exposes a mutating op. (`cli` stays\n enabled — local-operator surface, outside the network/agent threat model.)\n- **`switchTenant` is fail-closed.** `SessionService.switchTenant` /\n `switchSessionTenant` verify the session's user has an ACTIVE membership in the\n target tenant before writing `session.tenantId` (the tenant-isolation key for\n every `@TenantScoped` query). A non-member switch returns `false` without\n mutating the session; `null` clears the context and is always allowed. The\n low-level `SessionCollection.setSessionTenant` is the UNGUARDED primitive —\n never call it with an untrusted tenant id.\n- **OIDC `email_verified` is enforced.** `UserCollection.getOrCreateFromOidc`\n refuses to provision a user when the IdP explicitly returns\n `email_verified: false` (opt out with `{ allowUnverifiedEmail: true }`). An\n absent claim makes no assertion and is not enforced.\n\n## Gotchas\n\n- **seedSystemRoles() required**: call `RoleCollection.seedSystemRoles()` at app init (creates owner/admin/member/viewer)\n- **PermissionResolver casts `as any`**: collections have protected constructors — known framework limitation\n- **Session TTL in seconds**: `DEFAULT_SESSION_TTL = 7 * 24 * 60 * 60` (not milliseconds)\n- **Users are cross-tenant**: one user, many tenants via Membership. Email globally unique.\n- **Batch permission queries**: resolver fetches all permission IDs in one query, then maps to slugs (avoids N+1)\n"
2744
+ }